Initial working implementation (MVP)

This commit is contained in:
Martino Ferrari
2026-04-11 21:11:15 +02:00
parent dca378b5ef
commit 1a39b3a54e
35 changed files with 7457 additions and 147 deletions
+61
View File
@@ -0,0 +1,61 @@
# RMon Developer Guide
This guide covers the internal architecture, protocol, and extension points of the RMon system.
## Architecture Overview
RMon is built with a focus on performance, safety, and portability.
### `rmon-common`
Contains shared types used by both the agent and UI.
- **Protocol**: Defined in `src/protocol.rs`. Uses `bincode` for serialization over a length-prefixed TCP stream.
- **Data Model**: `src/signal.rs` defines `Sample`, `SignalInfo`, and `SignalId`.
### `rmon-agent`
A multi-threaded server using `tokio`.
- **Dispatcher**: Samples from all sources flow through a central `mpsc` channel to a dispatcher task.
- **Fan-out**: The dispatcher sends samples to:
1. The **Storage Engine** (binary append logs).
2. All connected **Session Handlers** via a `broadcast` channel.
- **DataSource Trait**: Abstract interface for data ingestion. New source types only need to implement the `run` and `signals` methods.
### `rmon-ui`
An immediate-mode GUI application.
- **Backend Thread**: A separate thread runs the `tokio` runtime for non-blocking network I/O.
- **Event Loop**: Communicates with the UI thread via `mpsc` channels (`UiMessage`).
- **Repaint Policy**: The UI only repaints when new data arrives or on a fixed interval (50ms) to ensure smooth real-time performance.
## Adding a New Data Source
To add a new source type (e.g., `MQTT` or `Serial`):
1. **Update Config**: Add relevant fields to `SourceConfig` and `SignalSourceConfig` in `rmon-agent/src/config.rs`.
2. **Implement `DataSource`**: Create a new file in `rmon-agent/src/sources/` and implement the trait:
```rust
#[async_trait]
pub trait DataSource: Send + 'static {
fn name(&self) -> &str;
fn signals(&self) -> Vec<SignalInfo>;
async fn run(self: Box<Self>, tx: mpsc::Sender<(SignalId, Sample)>) -> Result<()>;
}
```
3. **Register**: Add the source to `rmon-agent/src/sources/mod.rs` and update the `run_agent` loop in `rmon-agent/src/lib.rs`.
## Development Workflows
### Static Agent Build (Linux)
```bash
cargo build --release --target x86_64-unknown-linux-musl -p rmon-agent
```
### Integration Testing
The project uses automated integration tests that spin up real agent instances and verify the protocol flow.
```bash
cargo test -p rmon-agent --test agent_test
```
### Protocol Changes
If you modify `rmon-common/src/protocol.rs`:
1. Increment `PROTOCOL_VERSION` in `protocol.rs`.
2. Rebuild both the UI and the Agent.
3. The UI will automatically detect the version mismatch on handshake and refuse to connect to old agents.