122 lines
2.8 KiB
Markdown
122 lines
2.8 KiB
Markdown
# uopi
|
|
|
|
A web-based HMI (Human-Machine Interface) for monitoring and controlling EPICS-based scientific and industrial control systems.
|
|
|
|
uopi runs as a single portable binary. Access it from any browser — including over an SSH tunnel — with no client-side installation required.
|
|
|
|
---
|
|
|
|
## Features
|
|
|
|
- **Live data** from EPICS (Channel Access / PVAccess) and user-defined synthetic signals
|
|
- **Web-based HMI editor** — drag-and-drop widgets, resize, align, undo/redo — saved as XML
|
|
- **Rich widget library** — gauges, LEDs, bars, plots (time series, FFT, waterfall, histogram), controls
|
|
- **Multiple concurrent clients** sharing the same data subscriptions
|
|
- **Historical data** navigation via EPICS Archive Appliance integration
|
|
- **Synthetic signals** — compose, filter, and transform existing signals with a DSP pipeline or Lua scripts
|
|
- **Single binary** with embedded frontend; no runtime dependencies
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
### Prerequisites
|
|
|
|
- EPICS Base installed (for the EPICS data source; `libca` must be linkable)
|
|
- Go 1.22+
|
|
- Node.js 20+ and npm
|
|
|
|
### Build
|
|
|
|
```bash
|
|
make all
|
|
```
|
|
|
|
The binary is written to `dist/uopi`.
|
|
|
|
### Run
|
|
|
|
```bash
|
|
./dist/uopi --config uopi.toml
|
|
```
|
|
|
|
Then open `http://localhost:8080` in your browser.
|
|
|
|
**SSH tunnel example:**
|
|
|
|
```bash
|
|
ssh -L 8080:localhost:8080 user@controlhost
|
|
# then open http://localhost:8080 locally
|
|
```
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
Create `uopi.toml` (or copy and edit the example):
|
|
|
|
```toml
|
|
[server]
|
|
listen = ":8080"
|
|
storage_dir = "./interfaces" # where interface XML files are stored
|
|
|
|
[datasource.epics]
|
|
enabled = true
|
|
ca_addr_list = "" # overrides EPICS_CA_ADDR_LIST if non-empty
|
|
archive_url = "" # EPICS Archive Appliance base URL
|
|
|
|
[datasource.synthetic]
|
|
enabled = true
|
|
definitions_file = "./synthetic.json"
|
|
```
|
|
|
|
All settings can be overridden with environment variables using the prefix `UOPI_` and double underscores for nesting, e.g. `UOPI_SERVER_LISTEN=":9090"`.
|
|
|
|
---
|
|
|
|
## Development
|
|
|
|
See [`docs/TECHNICAL_SPEC.md`](docs/TECHNICAL_SPEC.md) for full architecture details.
|
|
|
|
```bash
|
|
# Backend only (with stub data source)
|
|
go run ./cmd/uopi
|
|
|
|
# Frontend dev server (proxies /api to backend at :8080)
|
|
cd web && npm install && npm run dev
|
|
|
|
# Run backend tests
|
|
go test ./...
|
|
|
|
# Run a single backend test
|
|
go test ./internal/broker/... -run TestFanOut
|
|
|
|
# Frontend type-check
|
|
cd web && npm run check
|
|
|
|
# Frontend lint
|
|
cd web && npm run lint
|
|
|
|
# Full build (frontend + backend)
|
|
make all
|
|
|
|
# Run all tests
|
|
make test
|
|
```
|
|
|
|
---
|
|
|
|
## Docs
|
|
|
|
| Document | Description |
|
|
|----------|-------------|
|
|
| [`docs/FUNCTIONAL_SPEC.md`](docs/FUNCTIONAL_SPEC.md) | User-facing feature specification |
|
|
| [`docs/TECHNICAL_SPEC.md`](docs/TECHNICAL_SPEC.md) | Technology choices, architecture, API design |
|
|
| [`docs/WORK_PLAN.md`](docs/WORK_PLAN.md) | Phased development plan with milestones |
|
|
|
|
---
|
|
|
|
## License
|
|
|
|
TBD
|