Implemented new C++ logic

This commit is contained in:
Martino Ferrari
2026-06-12 15:25:13 +02:00
parent 617b5bd712
commit f25bd7f08e
220 changed files with 39185 additions and 850 deletions
+119
View File
@@ -0,0 +1,119 @@
# StreamHub — User Guide
StreamHub turns signals streamed by MARTe2 `UDPStreamer` DataSources into a
multi-user oscilloscope. One hub process aggregates any number of sources and
serves up to 16 simultaneous clients: a browser SPA and/or the native ImGui
desktop client.
```
MARTe2 app (UDPStreamer) ──UDP 44500──▶ StreamHub ──WebSocket 8090──▶ browser / ImGui
```
## 1. Quick start (demo stack)
```bash
source env.sh
./run_streamhub.sh -w -g
```
This builds everything, starts a demo MARTe2 application with three streamers
(scalars over multicast, two array streamers), a StreamHub on port 8090, the
web UI server on port 8080 (`-w`) and the ImGui client (`-g`). Then open:
```
http://localhost:8080/?hub=localhost:8090
```
Useful flags: `-p <port>` WS port, `-n <pts>` ring size, `-s` skip rebuild,
`-h` full help (including the list of ports used).
## 2. Running against your own application
1. Add a `UDPStreamer` DataSource to your MARTe2 configuration
(see [UDPStreamer.md](UDPStreamer.md)).
2. Write a hub configuration, e.g. `hub.cfg`:
```
WSPort = 8090
Sources = {
MyApp = { Label = "MyApp" Addr = "192.168.0.10" Port = 44500 }
}
```
For multicast streamers add `MulticastGroup = "239.0.0.1"` and
`DataPort = 44503`. All keys and defaults:
[StreamHub-Developer.md](StreamHub-Developer.md) §6.
3. Run the hub and a client:
```bash
source env.sh
./Build/x86-linux/StreamHub/StreamHub.ex -cfg hub.cfg
# web UI
cd Client/webui && go build -o streamhub-webui . && ./streamhub-webui
# then browse http://localhost:8080/?hub=<hub-host>:8090
# or native client
./Client/streamhub/build/StreamHubClient -host <hub-host> -port 8090
```
Sources can also be added at runtime from either client ("Add source": label +
`host:port`, optional multicast group/data port). "Save sources" persists the
runtime list to `streamhub_sources.json` so the hub reloads it on restart.
## 3. Using the oscilloscope (web UI and ImGui)
Both clients offer the same workflow:
- **Plotting** — drag signals from the source sidebar onto a plot. Choose a
grid layout (1×1 … 4×1 / 2×2 / 1×4). Live plots scroll with wall-clock time;
pick the time window (1/5/10/30/60 s).
- **Zoom** — scroll/drag to zoom. When zoomed in, the client automatically
fetches high-resolution data from the hub for the visible window. *Back*
steps through the zoom history, *Fit* frames the data, *Reset/Live* returns
to the scrolling live view.
- **Cursors** — enable cursors A/B and drag them; the readout shows ΔT and the
value of each trace at both cursors.
- **V-scale modes** — *normal*, *digital* (booleans stacked as logic traces),
*mixed*.
- **Signal styling** — per-trace colour, line width, markers.
- **Stats** — per source: packet rate ± std, lost packets, fragments and bytes
per cycle, cycle-time min/avg/max/std and a 20-bin cycle-time histogram.
## 4. Trigger
The trigger runs **in the hub**, so a capture is identical in every connected
client and uses full-rate ring data (not the decimated live stream).
1. Pick the trigger **signal** (for array signals: a specific element), the
**edge** (rising/falling/both) and the **threshold**.
2. Pick the capture **window** (100 µs … 10 s) and the **pre-trigger**
percentage (how much of the window precedes the trigger instant).
3. Mode **normal** re-arms automatically ~200 ms after each capture
(*Stop* pauses re-arming); mode **single** captures once and waits for
*Rearm*.
4. Press **Arm**. Badge states: `IDLE → ARMED → COLLECTING → TRIGGERED`.
On capture, the trigger view shows all plotted signals relative to the trigger
instant (marker at t = 0) over `[-pre, +post]`.
## 5. Troubleshooting
| Symptom | Check |
|---------|-------|
| Source stuck in *connecting* | Streamer host/port reachable? For multicast: group/data port match the streamer, and routing allows IGMP |
| No data but source *streaming* | `getStats` rate ≈ RT cycle rate? Firewall on UDP data port? |
| Web UI loads but no signals | Did you pass `?hub=host:8090` (the SPA talks WS directly to the hub, not the web server)? |
| Trigger never fires | Threshold inside the signal's actual range? Edge direction correct? |
| Time axis jumps once at start | Normal: first-packet wall-clock calibration; it also re-anchors after a source restart |
Hub-side logs go to stdout; the demo scripts write
`/tmp/streamhub_e2e_{marte,hub}.log`.
## 6. Further reading
- [StreamHub-API.md](StreamHub-API.md) — WebSocket protocol (write your own client)
- [StreamHub-Developer.md](StreamHub-Developer.md) — internals, build, tests
- [UDPStreamer.md](UDPStreamer.md) — configuring the MARTe2 DataSource
- [Protocol.md](Protocol.md) — UDPS wire format