Files
node-26/docs/UI_GUIDE.md
Logan Cusano 857325af85
CI / lint (push) Failing after 5s
CI / test (push) Successful in 19s
Build edge-node / build (push) Successful in 32s
feat: Add local system override and manual entry controls with offline systems caching
2026-07-12 23:06:05 -04:00

78 lines
5.1 KiB
Markdown

# DRB Edge Node — UI & Hardware Guide
The DRB Edge Node comes equipped with a highly versatile, dual-mode web interface designed to support both remote network management and local hardware integration.
This document details how to use both interfaces and how to configure physical hardware (like an LCD screen and buttons) to build a standalone, portable scanner unit.
---
## 1. Network Configuration Dashboard (`/`)
The primary dashboard is served at the root URL (e.g., `http://172.16.100.85/` or `http://localhost/`). It is a premium, responsive, glassmorphic web application designed for on-network control.
### Features
- **Live Status Monitoring**: View MQTT connectivity, Discord bot status, recording status, and the underlying OP25 core state.
- **Active Call Tracking**: When a transmission begins, the "Live Activity" card highlights to display the Talkgroup Name, System, and Talkgroup ID in real-time.
- **Local Audio Streaming**: Features an embedded HTML5 audio player hooked directly into the node's Icecast stream. **Note**: Icecast has a 2-5 second buffering delay by design, which is normal.
- **Network-Aware**: The audio stream dynamically routes to the host IP you are accessing it from (no broken `localhost` links when accessing from another PC).
---
## 2. Scanner Display Mode (`/scanner`)
This dedicated view is optimized for small physical displays (e.g., 3.5" or 5" Raspberry Pi Touchscreens). It mimics the high-contrast, information-dense layout of professional digital scanners like the Uniden SDS100.
### Features
- **High Visibility**: Large, bold typography over a pure black background.
- **Visual Call Alerts**: The channel display pulses blue when an active transmission is received.
- **Kiosk Ready**: Fixed layout with no scrolling required; perfect for running in `chromium-browser --kiosk` mode on boot.
### Hardware Button Mapping
To make the node operate like a real scanner, the UI listens for standard keyboard events. By wiring physical buttons to the Raspberry Pi's GPIO pins and using a script (like `gpiozero` or `python-uinput`) to emit keystrokes, you can build a fully functional portable unit.
| UI Action | Trigger Key | Description |
| :--- | :--- | :--- |
| **Volume Up** | `ArrowUp` | Increases the local Icecast stream volume by 10%. Shows a temporary on-screen overlay. |
| **Volume Down** | `ArrowDown` | Decreases volume by 10%. |
| **Toggle Hold** | `Enter` or `H` | Toggles the Hold state (Currently a UI mock, backend support planned). |
| **Play/Pause** | `P` | Pauses or resumes the audio stream. Useful for temporarily silencing the unit. |
| **Select System**| `S` | Opens the "Select Radio System" modal to switch systems locally. Arrow keys navigate, Enter selects, Escape cancels. |
| **Revert Override**| `R` | Reverts the node's override and reload the default system configuration assigned by the C2 server. |
| **Legend Modal** | Mouse Click | Clicking the "KEY LEGEND" button opens an on-screen modal reminding users of these mappings. |
---
## 3. Local System Overrides
The edge node supports running local system overrides to tune into a system locally.
### Fixed vs. Portable Nodes
Admin configurations pushed from the C2 server dictate how overrides behave:
- **Portable Nodes**: Handheld units designed to operate in the field. When a portable node changes its system locally, the C2 server simply stores the active system and **never** enforces timeouts or auto-reverts the config.
- **Fixed Nodes**: Standard base-station setups. By default, changing the system locally triggers a **24-hour timeout** on the C2 server. If an admin does not acknowledge/extend this timer, the C2 server will automatically push the original assigned configuration back to the node, force-reverting it. You can disable this timeout globally for a fixed node by toggling off "Enforce Timeout" in the C2 Node Settings.
### Offline & Manual Entry
- When the node boots online, it caches all available systems in `/configs/systems_cache.json`. When offline, pressing `S` displays this cached list to select from.
- In the `S` selection modal, operators can also use the **Manual Entry** inputs to tune to any frequency/type dynamically on the fly, creating a temporary override config even if no matching system was pre-cached.
---
## Building a Portable Unit
If you are taking the node into the field (e.g., running off a battery in the woods without internet):
1. **Hardware Requirements**:
- Raspberry Pi (3B+ or 4 recommended).
- Compatible SDR Dongle.
- Small HDMI or SPI LCD Screen.
- 3 to 5 tactile push buttons.
- External battery pack (Ensure it can supply 3A for the Pi + SDR).
2. **Software Setup**:
- Configure the OS to boot to desktop and auto-launch Chromium in kiosk mode pointing to `http://localhost/scanner`.
- Run a Python script in the background that maps GPIO button presses to keyboard events (using the `keyboard` or `uinput` library) matching the table above.
3. **Offline Operation**:
- The node will still boot and OP25 will decode the last assigned radio system, even if the MQTT broker and Discord are unreachable.
- You can listen locally through the audio jack/speakers while watching the Scanner UI!