# MARTe2 Integrated Components A unified MARTe2 library providing real-time signal streaming and on-the-fly debugging for control applications built with [MARTe2](https://vcis.f4e.europa.eu/marte2-docs/). --- ## Overview This repository integrates two complementary capabilities: | Capability | Component | Purpose | |---|---|---| | **Signal streaming** | `UDPStreamer` DataSource | Continuously stream selected signals to a browser-based oscilloscope over UDP | | **Signal debugging** | `DebugService` Interface | On-demand signal tracing, value forcing, and conditional breakpoints — zero application code changes required | | **Sine generation** | `SineArrayGAM` | Generate continuous sine-wave arrays for testing and simulation | | **Time stamping** | `TimeArrayGAM` | Provide time-reference arrays aligned to an RT cycle | | **Log forwarding** | `TCPLogger` Interface | Forward `REPORT_ERROR` log events to TCP clients in real time | | **Integrated client** | `Common/Client/go` | Go packages for UDPS protocol and WebSocket hub | | **Debug web client** | `Client/debugger` | Browser-based debug UI communicating with `DebugService` | --- ## Repository Structure ``` MARTe_Integrated_components/ ├── Common/ │ ├── UDP/ UDPS binary protocol header (shared by all components) │ └── Client/go/ Go packages: udpsprotocol, wshub ├── Source/Components/ │ ├── DataSources/UDPStreamer/ Real-time UDP signal streaming DataSource │ ├── GAMs/SineArrayGAM/ Sine-wave array generator GAM │ ├── GAMs/TimeArrayGAM/ Time-reference array GAM │ ├── Interfaces/DebugService/ Signal tracing/forcing/breakpoint Interface │ └── Interfaces/TCPLogger/ TCP log-forwarding LoggerConsumerI ├── Test/ │ ├── GTest/ GTest harness for UDPStreamer unit tests │ ├── Integration/ Integration tests for DebugService │ ├── Components/DataSources/UDPStreamer/ UDPStreamer unit tests │ └── Configurations/ MARTe2 config files for tests and demos ├── Client/debugger/ Go web client for DebugService └── Docs/ Documentation ``` --- ## Components ### UDPStreamer DataSource Streams MARTe2 signals over UDP using the UDPS binary protocol. Clients register by sending a `CONNECT` packet; the server then sends `CONFIG` (signal metadata) and continuous `DATA` packets. Features: - Optional 16-bit quantization (configurable per signal: `QuantizedType`) - Packed high-frequency bursts (`NumberOfElements > 1` with `SamplingRate`) - Automatic packet fragmentation for payloads exceeding `MaxPayloadSize` See `Docs/UDPStreamer.md` and `Docs/Protocol.md`. ### SineArrayGAM Generates a continuous float32 sine-wave array every RT cycle. Used as a signal source for testing and demo applications. Configurable: `Frequency`, `Amplitude`, `Phase`, `SamplingRate`, `NumberOfElements`. See `Docs/SineArrayGAM.md`. ### TimeArrayGAM Generates a time-reference float64 array. Each element holds the timestamp of the corresponding sample in a packed burst, computed from the RT cycle timestamp and the configured `SamplingRate`. ### DebugService Interface Instruments a running MARTe2 application **without modifying its source code**. On `Initialise()` it patches the `ClassRegistryDatabase` to wrap all standard `MemoryMap*Broker` types. When `RealTimeApplication::ConfigureApplication()` runs afterward the application transparently uses the wrapped brokers. Capabilities accessible over TCP (port 8080 by default): - `DISCOVER` — enumerate all signals with type and alias metadata - `TRACE` — enable/disable high-speed UDP telemetry per signal (with decimation) - `FORCE` / `UNFORCE` — inject persistent values into signals on the RT path - `BREAK` — set conditional breakpoints (`>`, `<`, `==`, etc.) - `PAUSE` / `RESUME` / `STEP` — execution stepping - `TREE` / `INFO` / `LS` — live ORD navigation - `VALUE` — read current signal value on demand - `MSG` — send MARTe2 `Message` to any ORD object High-speed signal telemetry is streamed as UDP binary datagrams (port 8081). Logs are forwarded via `TcpLogger` (port 8082). See `Docs/DebugService.md`. ### TCPLogger Interface A `LoggerConsumerI` that forwards every MARTe2 `REPORT_ERROR` call to up to 8 TCP clients on a configurable port. Works as a sidecar to `DebugService`. ### StreamHub Application Headless C++ hub (`Source/Applications/StreamHub/`) that aggregates multiple UDPStreamer sources and serves them to oscilloscope clients over WebSocket (port 8090): ring buffers with wall-clock time calibration, LTTB decimation, hub-side trigger engine, per-window zoom. Clients: browser SPA (`Client/webui` + `Client/udpstreamer/static`) and native ImGui desktop client (`Client/streamhub`). Demo: `./run_streamhub.sh -w -g`; E2E test: `Test/E2E/suite/run_e2e.sh`. See `Docs/StreamHub-UserGuide.md`, `Docs/StreamHub-API.md` and `Docs/StreamHub-Developer.md`. ### UDPS Protocol The `Common/UDP/UDPSProtocol.h` header defines the shared binary wire format used by both `UDPStreamer` and `DebugService`. It is intentionally free of MARTe2-specific dependencies so it can also be used by Go clients (via `Common/Client/go/udpsprotocol`). See `Docs/Protocol.md`. --- ## Build ### Prerequisites - MARTe2 built and installed (set `MARTe2_DIR`) - MARTe2-components built and installed (set `MARTe2_Components_DIR`) - GCC toolchain, make - Go 1.21+ (for clients) ### Setup ```bash # Edit env.sh to set MARTe2_DIR and MARTe2_Components_DIR, then: source env.sh ``` ### Build all C++ components ```bash make -f Makefile.gcc core ``` ### Build and run tests ```bash make -f Makefile.gcc test source env.sh ./Build/x86-linux/Test/Integration/IntegrationTests ``` ### Build Go clients ```bash # Integrated UDPS web client cd Common/Client/go && go build ./... # Debug web client cd Client/debugger && go build ./... ``` ### Clean ```bash make -f Makefile.gcc clean ``` --- ## Quick Start ### 1. Stream signals with UDPStreamer Add to your MARTe2 config: ```text +Streamer = { Class = UDPStreamer Port = 44500 MaxPayloadSize = 1400 Signals = { Voltage = { Type = float32; Unit = "V" } } } ``` Launch the web client: ```bash cd Common/Client/go ./udpstreamer-webui --streamer 127.0.0.1:44500 --listen :8080 ``` Open `http://localhost:8080` and drag signals onto plots. ### 2. Debug a running application with DebugService Add to your MARTe2 config (as a sibling of `+App`): ```text +DebugService = { Class = DebugService ControlPort = 8080 UdpPort = 8081 LogPort = 8082 } +Logger = { Class = TcpLogger; Port = 8082 } ``` Launch the debug client: ```bash cd Client/debugger ./debugger --listen :9090 ``` Open `http://localhost:9090`, explore the object tree, trace signals, force values. --- ## Documentation | Document | Contents | |---|---| | `Docs/Protocol.md` | UDPS binary wire protocol specification | | `Docs/UDPStreamer.md` | UDPStreamer DataSource configuration reference | | `Docs/SineArrayGAM.md` | SineArrayGAM configuration reference | | `Docs/DebugService.md` | DebugService TCP API and architecture | | `Docs/Tutorial.md` | Step-by-step tutorial covering both components | | `Docs/WebUI.md` | Web client user guide | | `Docs/StreamHub-UserGuide.md` | StreamHub oscilloscope user guide (web + ImGui clients) | | `Docs/StreamHub-API.md` | StreamHub WebSocket protocol (commands, events, binary frames) | | `Docs/StreamHub-Developer.md` | StreamHub internals, threading, time base, build & E2E tests | | `ARCHITECTURE.md` | System architecture overview | --- ## License Licensed under the EUPL v1.1 (see individual source files for copyright notices).