diff options
Diffstat (limited to 'plugins')
35 files changed, 1008 insertions, 0 deletions
diff --git a/plugins/README.md b/plugins/README.md new file mode 100644 index 0000000..9b9bd24 --- /dev/null +++ b/plugins/README.md @@ -0,0 +1,76 @@ +# MainAX25-Stack plugins + +Packet Radio / AX.25 plugin registry. HyBBX connects to a **running** stack — it does not replace these layers. + +**Unified operator workflow:** [docs/PLUGINS-DEVICE-MODEL.md](../docs/PLUGINS-DEVICE-MODEL.md) — TNC is the reference pattern; BayCom follows the same five steps and M25/1 session commands (`SET DEVICE` → `CONNECT` → `SEND`). + +## Hierarchy + +``` +Operating mode (`betriebsform/`) + └── Hardware (tncs, modems, soft-modems) + └── Device (tnc2c, max25e0, baycom-kiss, soft-crdop, …) +``` + +| Layer | Directory | Purpose | +|-------|-----------|---------| +| Operating mode | `betriebsform/` | Standalone, service, HyBBX host | +| Hardware | `hardware/` | Device family — TNCs, BayCom, soft modems | +| Device | `devices/` | Concrete profile and HyBBX INI mapping | +| Optional plugins | `external/` | ARDOP-plugin (optional third-party ARDOP host registry) | + +## Discovery + +```bash +./scripts/discover-plugins.sh # hardware + device +./scripts/discover-plugins.sh --json +``` + +Output types: `hardware`, `device` — **not** operating modes (`betriebsform/` is manifest-only). + +Registry: `manifest.yaml` + +## HyBBX mapping + +| MAX25 hardware | HyBBX plugin | INI section | +|----------------|--------------|-------------| +| `hardware/tncs` | `packet_radio` | `[transport.packet_radioN]` | +| `hardware/modems` | `baycom` | `[transport.baycomN]` | +| `hardware/soft-modems` | `crdop` | `[transport.crdopN]` | + +See [docs/HYBBX.md](../docs/HYBBX.md). + +## Active devices + +| Device | Hardware | Status | +|--------|----------|--------| +| `tnc2c` | `tncs` | active | +| `max25e0` | `modems` | active — BayCom/based SER12 via **bcpr** (`stacks/max25-bcpr/`) | +| `baycom-kiss` | `modems` | active — USB/async KISS serial | +| `soft-crdop` | `soft-modems` | active — MAX25-SoftModem (CRDOP) standard | + +## ARDOP-plugin (optional) + +| Plugin | Notes | +|--------|-------| +| **ARDOP-plugin** | Separate third-party ARDOP host registry — [external/README.md](external/README.md) | + +## Deferred / removed + +| Device | Hardware | Status | Notes | +|--------|----------|--------|-------| +| `pktnc2` | `tncs` | planned | Awaiting hardware delivery | +| `baycom-par96` | `modems` | removed | Kernel LPT path retired — use bcpr where applicable | +| `baycom-ser12` | `modems` | removed | Kernel SER12 path retired — use **`max25e0`** / bcpr | + +Terminal client profiles: [share/clients/](../share/clients/README.md) · BayCom/based SER12: [docs/BAYCOM.md](../docs/BAYCOM.md) · `stacks/max25-bcpr/`. + +## Operator quick reference (active) + +| Device | Start / bring-up | Site config | Client YAML | +|--------|------------------|-------------|-------------| +| `tnc2c` | `max25-ctl start --hardware tncs --device tnc2c` | `share/max25/serial/tnc2c-serial.env.example` | `share/clients/tnc2c.yaml` | +| `max25e0` | max25d `[features] max25_bcpr=yes` · `max25e0 = max25-bcpr:bc0` | `stacks/max25-bcpr/share/max25-bcpr.ini.example` | none (device id `max25e0`) | +| `baycom-kiss` | max25d `[devices]` + `[serial.baycom-kiss]` | serial env / max25d.ini | `share/clients/baycom-kiss.yaml` | + +BayCom/based default: **`max25e0`** via max25-bcpr (max 2: `max25e0:bc0` / `bc1`) — see [docs/BAYCOM.md](../docs/BAYCOM.md). diff --git a/plugins/betriebsform/hybbx-host/README.md b/plugins/betriebsform/hybbx-host/README.md new file mode 100644 index 0000000..21affb5 --- /dev/null +++ b/plugins/betriebsform/hybbx-host/README.md @@ -0,0 +1,22 @@ +# Operating mode: HyBBX Host + +Secondary RF host on a HyBBX **Secondary** node — or **standalone Main** cohost when `[instance] standalone=yes` and max25d `mode=hybbx-cohost`. MAX25 prepares hardware; HyBBX bridges AX.25 to Main over HBX (Secondary) or serves users locally (standalone Main). + +## Workflow + +1. MAX25 device prep (boot-wait, `max25-bcpr-ctl start`, or `crdopc`) +2. max25d releases KISS PTY (`/tmp/max25-bcpr/kiss-bc0` for BayCom/based) +3. Merge `share/hybbx/*-host.ini.example` into `hybbx.ini` +4. Start HyBBX (Secondary or standalone Main) + +## Per device + +| Device | MAX25 prep | HyBBX plugin | +|--------|------------|--------------| +| TNC2C | `tnc2c-boot-wait.sh` | `packet_radio` | +| BayCom/based SER12 | `max25-bcpr-ctl start` / max25d `max25_bcpr=yes` | `baycom` | +| CRDOP | `crdopc` running | `crdop` | + +**Co-host Main:** dual TNC + PC-COM on one host — max25d `mode=hybbx-cohost`, HyBBX `[networks] baycom=yes`. See [docs/BAYCOM.md](../../docs/BAYCOM.md). + +Contract: [docs/HYBBX.md](../../docs/HYBBX.md) diff --git a/plugins/betriebsform/hybbx-host/plugin.yaml b/plugins/betriebsform/hybbx-host/plugin.yaml new file mode 100644 index 0000000..4ff2c56 --- /dev/null +++ b/plugins/betriebsform/hybbx-host/plugin.yaml @@ -0,0 +1,27 @@ +id: hybbx-host +type: betriebsform +parent_stack: MainAX25-Stack (MAX25-Stack) +label: HyBBX Host +description: Secondary RF host — serial TNC or BayCom KISS → HBX to Main + +stack_requirements: + hybbx_secondary: true + circuit_link: required + +hybbx: + plugins: + - packet_radio + - baycom + transport_sections: + - transport.packet_radioN + - transport.baycomN + +integration: + tncs: + boot_script: stacks/tncs/tnc2c-boot-wait.sh + integration_test: stacks/tncs/tnc2c-integration-test.sh + ini_template: stacks/tncs/hybbx-tnc2c.ini + modems: + kiss_link: /tmp/max25-bcpr/kiss-bc0 + ctl: stacks/max25-bcpr/tools/max25-bcpr-ctl + plugin_doc: stacks/max25-bcpr/README.md diff --git a/plugins/betriebsform/service/README.md b/plugins/betriebsform/service/README.md new file mode 100644 index 0000000..d5befeb --- /dev/null +++ b/plugins/betriebsform/service/README.md @@ -0,0 +1,19 @@ +# Operating mode: Service + +Continuous operation with one or two radios. HyBBX Secondary, digipeater, or unattended packet service. + +## Requirements + +- BayCom/based (PC-COM): **bcpr** — real IRQ, exclusive COM lock, max 2 devices ([docs/BAYCOM.md](../../../docs/BAYCOM.md)) +- TNC path: unique serial device / no shared UART with bcpr +- No second process on the same UART while `max25-bcprd` holds the lock + +## Templates + +| Stack | Config | +|-------|--------| +| BayCom/based (bcpr) | `stacks/max25-bcpr/share/max25-bcpr.ini.example` | +| HyBBX dual BayCom | `share/hybbx/service-dual.ini.example` | +| HyBBX dual TNC | `stacks/tncs/hybbx-dual.ini` | + +One `[transport.*N]` per radio channel on HyBBX Secondary. diff --git a/plugins/betriebsform/service/plugin.yaml b/plugins/betriebsform/service/plugin.yaml new file mode 100644 index 0000000..a659ad5 --- /dev/null +++ b/plugins/betriebsform/service/plugin.yaml @@ -0,0 +1,27 @@ +id: service +type: betriebsform +parent_stack: MainAX25-Stack (MAX25-Stack) +label: Service +description: 24/7 dual-radio — HyBBX, digipeater, automation + +stack_requirements: + modems_min: 1 + modems_max: 2 + tncs_max: 2 + unique_irq_per_uart: true + staged_start: true + +lifecycle: + start: scripts/max25-ctl start --mode service + recover: stacks/baycom-pr/scripts/baycom-pr-ctl recover + +hybbx: + role: primary + multi_instance: true + kiss_paths: + - /var/run/baycom-pr/kiss-a + - /var/run/baycom-pr/kiss-b + +templates: + - stacks/baycom-pr/config/examples/baycom-pr.dual.ini + - stacks/tncs/hybbx-dual.ini diff --git a/plugins/betriebsform/standalone/README.md b/plugins/betriebsform/standalone/README.md new file mode 100644 index 0000000..fc9cb5d --- /dev/null +++ b/plugins/betriebsform/standalone/README.md @@ -0,0 +1,22 @@ +# Operating mode: Standalone + +Single-operator packet radio. One TNC or one BayCom modem online. **Default v1 path.** + +## Start + +```bash +# TNC2C +./scripts/max25-ctl start --mode standalone --hardware tncs --device tnc2c + +# BayCom/based SER12 (max25e0 via max25-bcpr) — prefer max25d +# [features] max25_bcpr=yes · max25e0 = max25-bcpr:bc0 — see docs/BAYCOM.md + +# max25d (recommended host path) +sudo max25d -c /etc/max25/max25d.ini +``` + +## HyBBX + +Optional. HyBBX opens serial or KISS **after** MAX25 prep (boot-wait, driver load). + +INI: `share/hybbx/standalone.ini.example` · Contract: [docs/HYBBX.md](../../docs/HYBBX.md) diff --git a/plugins/betriebsform/standalone/plugin.yaml b/plugins/betriebsform/standalone/plugin.yaml new file mode 100644 index 0000000..1923aa3 --- /dev/null +++ b/plugins/betriebsform/standalone/plugin.yaml @@ -0,0 +1,24 @@ +id: standalone +type: betriebsform +parent_stack: MainAX25-Stack (MAX25-Stack) +label: Standalone +description: Single operator — one radio/TNC, terminal AX.25 clients + +stack_requirements: + modems_max: 1 + tncs_max: 1 + +lifecycle: + start: scripts/max25-ctl start --mode standalone + stop: scripts/max25-ctl stop + status: scripts/max25-ctl status + +hybbx: + role: optional + note: HyBBX may run on same host; stack exposes KISS or direct serial + +clients: + - listen + - call + - tnc2c-listen.sh + - baycom-pr-ctl listen diff --git a/plugins/devices/audio-dummy/README.md b/plugins/devices/audio-dummy/README.md new file mode 100644 index 0000000..4903d60 --- /dev/null +++ b/plugins/devices/audio-dummy/README.md @@ -0,0 +1,41 @@ +# Device: audio-dummy (acoustic bench) + +**Status:** `active` — development/test device for on-host acoustic signal evaluation. + +## Purpose + +Main **dummy device** for Bell 202 AFSK without RF: + +- **loopback** — full DSP encode/decode in process (CI default) +- **alsa** — capture from sound card, sniff/decode live +- **host** — TCP to `audio-dummyd` (M25 KISS host protocol, ports 8520/8521) + +## Tools + +```bash +# Internal loopback (no hardware): +stacks/crdop/tools/max25-signal-sniffer --loopback + +# ALSA capture sniff: +stacks/crdop/tools/max25-signal-sniffer -D plughw:1,0 -t 3 + +# Calibration tones (mark 1200 Hz / space 2200 Hz): +stacks/crdop/tools/max25-signal-sniffer -D plughw:1,0 --mark -t 1 +stacks/crdop/tools/max25-signal-sniffer -D plughw:1,0 --space -t 1 +``` + +## max25d + +```ini +[devices] +audio-dummy = audio:loopback + +[device.audio-dummy] +mode = loopback ; loopback | alsa | host +; capture = plughw:1,0 +; playback = plughw:1,0 +; sample_rate = 48000 +; host_port = 8520 +``` + +Docs: [docs/CRDOP.md](../../../docs/CRDOP.md) diff --git a/plugins/devices/audio-dummy/plugin.yaml b/plugins/devices/audio-dummy/plugin.yaml new file mode 100644 index 0000000..789c92b --- /dev/null +++ b/plugins/devices/audio-dummy/plugin.yaml @@ -0,0 +1,26 @@ +id: audio-dummy +type: device +parent_stack: MainAX25-Stack (MAX25-Stack) +hardware: acoustic-bench +label: Audio Dummy (acoustic bench) +status: active + +product: + name: MAX25-Audio-Dummy + purpose: sniff_test_evaluate_acoustic_signals_on_host + protocol: m25-kiss-host + license: GPL-3.0-or-later + +note: | + Main dummy device for Bell 202 AFSK bench — loopback, ALSA sniff, or host TCP. + No RF required. Used before field tests against TNC2C/BayCom. + +runtime: + modes: [loopback, alsa, host] + sniffer: stacks/crdop/tools/max25-signal-sniffer + daemon: stacks/crdop/tools/audio-dummyd + default_spec: audio:loopback + +docs: + - docs/CRDOP.md + - stacks/crdop/docs/AUDIO-ARCHITECTURE.md diff --git a/plugins/devices/bayc-plugin/README.md b/plugins/devices/bayc-plugin/README.md new file mode 100644 index 0000000..870f0c1 --- /dev/null +++ b/plugins/devices/bayc-plugin/README.md @@ -0,0 +1,7 @@ +# bayc-plugin — BayCom/based (max25d) + +**Role:** BayCom/based device plugin under **max25d** · host face **`max25e0`**. + +Experimental orch / soft-TNC / guest-PTY work is **not** shipped in this freigegeben tree. + +Thin stub only. Do not restore experimental orch tools here. diff --git a/plugins/devices/baycom-kiss/README.md b/plugins/devices/baycom-kiss/README.md new file mode 100644 index 0000000..c834c39 --- /dev/null +++ b/plugins/devices/baycom-kiss/README.md @@ -0,0 +1,7 @@ +# Device: BayCom KISS Serial + +USB or async serial BayCom firmware TNC. Uses `kiss-serial` backend — no kernel `baycom_ser_fdx`, no **bcpr** SER12 path. + +HyBBX `[transport.baycom1]` with `backend=kiss`, `device=/dev/ttyUSB0`. + +See [docs/BAYCOM.md](../../../docs/BAYCOM.md) (KISS vs BayCom/based) and [docs/PLUGINS-DEVICE-MODEL.md](../../../docs/PLUGINS-DEVICE-MODEL.md). diff --git a/plugins/devices/baycom-kiss/plugin.yaml b/plugins/devices/baycom-kiss/plugin.yaml new file mode 100644 index 0000000..78c8a1d --- /dev/null +++ b/plugins/devices/baycom-kiss/plugin.yaml @@ -0,0 +1,31 @@ +id: baycom-kiss +type: device +parent_stack: MainAX25-Stack (MAX25-Stack) +hardware: modems +label: BayCom KISS Serial (USB/async) +status: active + +hybbx: + plugin: baycom + backend: kiss + serial_baud: 9600 + +serial: + default_device: /dev/ttyUSB0 + +runtime: + kiss_link: /var/run/baycom-pr/kiss + +ini: + - stacks/baycom-pr/config/examples/baycom-pr.usb.ini + - share/baycom/baycom-pr.kiss-usb.ini.example + +client: + - share/clients/baycom-kiss.yaml + - share/clients/kiss-serial-usb.yaml + - share/clients/kiss-serial-rs232.yaml + +docs: + - stacks/baycom-pr/docs/GETTING-STARTED.md + +notes: USB KISS path — no kernel baycom driver required. Device alias pccom-kiss uses same backend. diff --git a/plugins/devices/max25-sniffport/README.md b/plugins/devices/max25-sniffport/README.md new file mode 100644 index 0000000..d0fcaa4 --- /dev/null +++ b/plugins/devices/max25-sniffport/README.md @@ -0,0 +1,5 @@ +# max25-sniffport + +Mode-A virt-COM / sniffport experimental work is **not** shipped in this freigegeben tree. + +Thin stub only. diff --git a/plugins/devices/max25-terminal/plugin.yaml b/plugins/devices/max25-terminal/plugin.yaml new file mode 100644 index 0000000..9f1289e --- /dev/null +++ b/plugins/devices/max25-terminal/plugin.yaml @@ -0,0 +1,16 @@ +id: max25-terminal +label: MAX25 Terminal +hardware: terminal +role: client +status: active +description: Official text-only operator UI — sole MAX25 client; M25/1 to max25d +docs: + - docs/MAX25-CLIENT.md + - docs/MAX25-TERMINAL.md + - docs/PACKET-RADIO.md + - include/max25/protocol.md +binaries: + - max25-terminal + - max25-client +protocol: m25/1 +default_port: 7325 diff --git a/plugins/devices/max25-vcom/README.md b/plugins/devices/max25-vcom/README.md new file mode 100644 index 0000000..ac6485a --- /dev/null +++ b/plugins/devices/max25-vcom/README.md @@ -0,0 +1,5 @@ +# max25-vcom + +vcom-port / PTY experimental work is **not** shipped in this freigegeben tree. + +Thin stub only. diff --git a/plugins/devices/pktnc2/README.md b/plugins/devices/pktnc2/README.md new file mode 100644 index 0000000..3b9dd2e --- /dev/null +++ b/plugins/devices/pktnc2/README.md @@ -0,0 +1,16 @@ +# Device: PK-TNC2 + +**Status:** Planned — probe serial port after hardware delivery. + +PK-TNC2 / TNC-2 (TheFirmware) profile for HyBBX `packet_radio` with `tnc=tnc2`. + +## Preparation + +```bash +# After delivery: edit stacks/tncs/pktnc2-serial.env +./stacks/tncs/pktnc2-boot-wait.sh +``` + +HyBBX: `share/hybbx/pktnc2-host.ini.example` + +Reuses `tnc2c-probe` for port scan. diff --git a/plugins/devices/pktnc2/plugin.yaml b/plugins/devices/pktnc2/plugin.yaml new file mode 100644 index 0000000..0e3dc79 --- /dev/null +++ b/plugins/devices/pktnc2/plugin.yaml @@ -0,0 +1,37 @@ +id: pktnc2 +type: device +parent_stack: MainAX25-Stack (MAX25-Stack) +hardware: tncs +label: PK-TNC2 / TNC-2 (TheFirmware) +status: planned + +hybbx: + plugin: packet_radio + profile: tnc2 + aliases: [pktnc2, pk-tnc2, tapr, thefirmware] + protocol: kiss + serial_line: 8n1 + kiss_entry: auto + +serial: + default_device: /dev/ttyUSB1 + default_baud: 9600 + +rf: + radio_baud: 1200 + band: cb + +scripts: + boot_wait: stacks/tncs/pktnc2-boot-wait.sh + probe: stacks/tncs/tnc2c-probe + +ini: + - share/hybbx/pktnc2-host.ini.example + +client: + - share/clients/pktnc2.yaml + +docs: + - stacks/tncs/docs/TNC2C-REFERENCE.md + +notes: Planned device — probe serial port after hardware inventory. diff --git a/plugins/devices/soft-crdop/README.md b/plugins/devices/soft-crdop/README.md new file mode 100644 index 0000000..fe44f9d --- /dev/null +++ b/plugins/devices/soft-crdop/README.md @@ -0,0 +1,26 @@ +# Device: soft-crdop (MAX25-SoftModem / CRDOP — MAX25-SoftModem) + +**CRDOP** = stack acronym for **MAX25-SoftModem** (device id `soft-crdop`). + +**Status:** `active` — MAX25-Stack **standard subproject** (`stacks/crdop/`). + +**Canonical rule:** [docs/CRDOP.md](../../../docs/CRDOP.md) · **License:** GNU GPL v3 + +## Summary + +| Topic | Policy | +|-------|--------| +| Type | Sound-card software modem subproject | +| Compatibility | **AX.25 / KISS / TNC / modem** (software-modem domain) | +| Mission | **Hardware solutions** (primary) + pure **software** on computers | +| Audio | Kernel ALSA + MAX25 sound-proxy — **no PulseAudio** | +| Build | Default ON — `-DMAX25_BUILD_CRDOP=OFF` to skip | + +## Quick start + +```bash +./scripts/build.sh +./scripts/max25-ctl start --hardware soft-modems --device soft-crdop +``` + +See [docs/CRDOP.md](../../../docs/CRDOP.md) for full project rules. diff --git a/plugins/devices/soft-crdop/plugin.yaml b/plugins/devices/soft-crdop/plugin.yaml new file mode 100644 index 0000000..a18a524 --- /dev/null +++ b/plugins/devices/soft-crdop/plugin.yaml @@ -0,0 +1,77 @@ +id: soft-crdop +type: device +parent_stack: MainAX25-Stack (MAX25-Stack) +hardware: soft-modems +label: MAX25-SoftModem (CRDOP — CB/AR Digital Open Protocol) +status: active + +product: + name: MAX25-SoftModem + phase: development_and_testing + development: in-house + baud_primary: 1200 + baud_max: 19200 + duplex: [half, full] + ax25_packet_radio: acoustically_compatible + use_like_hardware_modem: true + protocol_primary: max25-softmodem + audio_hardware: required + +note: | + CRDOP = CB/AR Digital Open Protocol (CB = Citizens Band, AR = Amateur Radio). + MAX25-Stack STANDARD subproject (stacks/crdop/) — GNU GPLv3. + Sound-card based; kernel ALSA + MAX25 sound-proxy; no PulseAudio. + Full AX.25/KISS/TNC/modem compatibility goal. Hardware-solution-first. + Static project rule: docs/CRDOP.md + +hybbx: + plugin: crdop + transport: tcp + control_port: 8515 + data_port: 8516 + profile: cb + +modem: + protocol: max25-softmodem + duplex: half + duplex_modes: [half, full] + default_speed_baud: 1200 + max_speed_baud: 19200 + ax25_acoustic: true + packet_radio_compatible: true + audio: alsa + audio_backend: alsa-kernel + audio_path: max25-sound-proxy + no_pulseaudio: true + audio_required: true + coupling: [line_level, acoustic] + +runtime: + ctl_start: stacks/crdop/scripts/crdopc + default_ini: stacks/crdop/share/crdop.ini.example + env: + - CRDOP_INI + cmake_option_off: MAX25_BUILD_CRDOP + shipped_default: true + +ini: + - stacks/crdop/share/crdop.ini.example + - stacks/crdop/share/crdop-dual.ini.example + - stacks/crdop/share/crdop-amateur.ini.example + - share/hybbx/crdop-host.ini.example + +client: + - share/clients/soft-crdop.yaml + +license: GPL-3.0-or-later + +docs: + - docs/CRDOP.md + - stacks/crdop/docs/SOFTMODEM.md + - stacks/crdop/docs/AUDIO-ARCHITECTURE.md + - stacks/crdop/docs/CONFIG.md + - stacks/crdop/ROADMAP.md + +scripts: + build: stacks/crdop/scripts/build-crdop.sh + start: stacks/crdop/scripts/crdopc diff --git a/plugins/devices/tmodem/README.md b/plugins/devices/tmodem/README.md new file mode 100644 index 0000000..0ac2772 --- /dev/null +++ b/plugins/devices/tmodem/README.md @@ -0,0 +1,15 @@ +# Device: T-Modem-c1224 (`tmodem`) + +USB CDC **KISS half-TNC** from [T-Modem-c1224](https://github.com/ngteq/T-Modem-c1224) Pico firmware. Chip does AFSK; Pico does HDLC + bitbang. **Not** BayCom/based. **Not** softmodem. + +| Item | Value | +|------|--------| +| Device id | `tmodem` | +| Backend | `kiss-raw-serial` | +| Default path | `/dev/ttyACM0` | +| Feature | `[features] tmodem=yes` (default **no**) | +| Terminal | `max25-terminal -d tmodem` | + +HyBBX: attach to max25d only — no L1 inside HyBBX. + +See [docs/DEV/TMODEM-C1224.md](../../../docs/DEV/TMODEM-C1224.md). diff --git a/plugins/devices/tmodem/plugin.yaml b/plugins/devices/tmodem/plugin.yaml new file mode 100644 index 0000000..dd093fd --- /dev/null +++ b/plugins/devices/tmodem/plugin.yaml @@ -0,0 +1,33 @@ +id: tmodem +type: device +parent_stack: MainAX25-Stack (MAX25-Stack) +hardware: tncs +label: T-Modem-c1224 (USB KISS half-TNC) +status: prototype + +hybbx: + attach: max25d + note: HyBBX attach-only via MAX25 — no L1 in HyBBX + +serial: + default_device: /dev/ttyACM0 + default_baud: 115200 + line: 8n1 + dtr_rts: no + +runtime: + backend: kiss-raw-serial + +ini: + - share/max25/max25d.tmodem.ini.example + +client: + - share/clients/tmodem.yaml + +docs: + - docs/DEV/TMODEM-C1224.md + +notes: > + T-Modem-c1224 Pico presents USB CDC KISS (HDLC on Pico + TCM3105 chip AFSK). + Not BayCom/based. Feature gate [features] tmodem=yes (default off). + First client path: max25-terminal -d tmodem. diff --git a/plugins/devices/tnc2c/README.md b/plugins/devices/tnc2c/README.md new file mode 100644 index 0000000..4ddd19d --- /dev/null +++ b/plugins/devices/tnc2c/README.md @@ -0,0 +1,25 @@ +# Device: Landolt TNC2C + +**Status:** Active (v1). + +| Parameter | Value | +|-----------|-------| +| Serial | `/dev/ttyUSB0` or `/dev/ttyS4` (site-specific) | +| Host line | 19200 8N1, RTS+DTR | +| RF | 2400 AFSK | +| HyBBX | `tnc=tnc2c`, `protocol=kiss` | + +## Boot sequence + +DTR must be high during power-on: + +```bash +./stacks/tncs/tnc2c-boot-wait.sh +./stacks/tncs/tnc2c-integration-test.sh +``` + +HyBBX INI: `share/hybbx/tnc2c-host.ini.example` + +## Safety + +No `kiss on` or TX tests without dummy load when antenna connected. diff --git a/plugins/devices/tnc2c/plugin.yaml b/plugins/devices/tnc2c/plugin.yaml new file mode 100644 index 0000000..d822c4a --- /dev/null +++ b/plugins/devices/tnc2c/plugin.yaml @@ -0,0 +1,40 @@ +id: tnc2c +type: device +parent_stack: MainAX25-Stack (MAX25-Stack) +hardware: tncs +label: Landolt TNC2C +status: active + +hybbx: + plugin: packet_radio + profile: tnc2c + protocol: kiss + serial_line: 8n1 + rts_dtr: yes + kiss_entry: kiss_on + +serial: + default_device: /dev/ttyS4 + default_baud: 19200 + env_file: stacks/tncs/tnc2c-serial.env + +rf: + modem: tcm3105 + radio_baud: 2400 + band: cb + +scripts: + boot_wait: stacks/tncs/tnc2c-boot-wait.sh + health: stacks/tncs/tnc2c-health.sh + integration: stacks/tncs/tnc2c-integration-test.sh + +ini: + - stacks/tncs/hybbx-tnc2c.ini + - share/hybbx/tnc2c-host.ini.example + +client: + - share/clients/tnc2c.yaml + +docs: + - stacks/tncs/docs/TNC2C-OPERATIONS.md + - stacks/tncs/docs/HYBBX-TNC2C.md diff --git a/plugins/external/README.md b/plugins/external/README.md new file mode 100644 index 0000000..b035c09 --- /dev/null +++ b/plugins/external/README.md @@ -0,0 +1,28 @@ +# Optional plugins — ARDOP-plugin + +**CRDOP (MAX25-SoftModem)** is the **MAX25-Stack standard** modem — built and installed by default (`MAX25_BUILD_CRDOP=ON`). See `plugins/devices/soft-crdop/`. + +## ARDOP-plugin + +| Item | Detail | +|------|--------| +| **Plugin** | **ARDOP-plugin** — optional registry for third-party ARDOP host wire | +| **Registry** | [ardop/plugin.yaml](ardop/plugin.yaml) | +| **CRDOP coupling** | **None** — ARDOP is not enabled via `soft-crdop` or `crdop.ini` | +| **Standard alternative** | Native CRDOP / M25-KISS host (default) | + +### Using ARDOP-plugin + +1. Install and run an ARDOP-capable modem host on the operator machine (third-party software). +2. Attach HyBBX or another consumer per that ARDOP host's documentation. +3. Keep CRDOP on native M25/KISS — do not mix ARDOP wire mode into CRDOP configs. + +See [ardop/README.md](ardop/README.md). + +## MAX25 standard (not ARDOP-plugin) + +| Item | Role | +|------|------| +| **CRDOP / MAX25-SoftModem** | In-house standard — `MAX25_BUILD_CRDOP=ON` (default) | +| `stacks/crdop/` | CRDOP subproject — INI, launcher, native M25 host, docs | +| `max25d` `crdop-tcp` backend | Standard integration (native M25/KISS) | diff --git a/plugins/external/ardop/README.md b/plugins/external/ardop/README.md new file mode 100644 index 0000000..b15469d --- /dev/null +++ b/plugins/external/ardop/README.md @@ -0,0 +1,30 @@ +# ARDOP-plugin + +Optional **MAX25-Stack plugin** for operators who run **third-party ARDOP host software** alongside MAX25. + +**CRDOP (MAX25-SoftModem)** is the MAX25 standard sound-card modem — native M25/KISS on TCP :8515/:8516. ARDOP is **not** part of CRDOP and is **not** enabled via `soft-crdop` or `crdop.ini`. + +## When to use + +| Path | Use | +|------|-----| +| **CRDOP (default)** | Native MAX25-SoftModem — M25/KISS host via `crdopc` / `audio-dummyd` | +| **ARDOP-plugin** | Operator-provided ARDOP host (Winlink-class wire) — separate from CRDOP | + +## Platform + +| Host | Notes | +|------|-------| +| **Linux / KLinux** | Typical for third-party ARDOP host software | +| **FreeBSD / *BSD** | CRDOP/OSS only — ARDOP host not integrated in MAX25 | +| **macOS / Windows** | Out of scope for MAX25 daemon path | + +## Operator workflow + +1. Install and run an ARDOP-capable modem host on the operator machine (third-party software). +2. Point HyBBX or another consumer at the ARDOP host TCP ports per that software's documentation. +3. Do **not** set CRDOP or `soft-crdop` INI flags for ARDOP — CRDOP remains native M25/KISS only. + +## Metadata + +[plugin.yaml](plugin.yaml) · [../README.md](../README.md) diff --git a/plugins/external/ardop/plugin.yaml b/plugins/external/ardop/plugin.yaml new file mode 100644 index 0000000..3a25e72 --- /dev/null +++ b/plugins/external/ardop/plugin.yaml @@ -0,0 +1,32 @@ +id: ardop-plugin +type: optional +parent_stack: MainAX25-Stack (MAX25-Stack) +label: ARDOP-plugin +status: optional + +note: | + ARDOP-plugin is an optional MAX25-Stack plugin registry entry for third-party + ARDOP host wire mode. It is separate from CRDOP (MAX25-SoftModem). + MAX25 ships CRDOP as the standard sound-card modem with native M25/KISS host. + Operators who need ARDOP run external ARDOP host software independently. + +policy: + max25_standard_modem: CRDOP + crdop_code_in_max25: true + ardop_modem_binary_in_max25: false + crdop_ardop_compat: false + +standard_modem: + product: MAX25-SoftModem + device: soft-crdop + stack: stacks/crdop + protocol: max25-softmodem + +wire: + format: ardop-host-tcp + note: Third-party ARDOP host — not wired through CRDOP or soft-crdop INI + +docs: + - plugins/external/README.md + - plugins/external/ardop/README.md + - docs/CRDOP.md diff --git a/plugins/hardware/acoustic-bench/plugin.yaml b/plugins/hardware/acoustic-bench/plugin.yaml new file mode 100644 index 0000000..7df7a28 --- /dev/null +++ b/plugins/hardware/acoustic-bench/plugin.yaml @@ -0,0 +1,21 @@ +id: acoustic-bench +type: hardware +parent_stack: MainAX25-Stack (MAX25-Stack) +label: Acoustic Bench +description: | + Host-side acoustic signal bench — dummy device, sniffer, DSP loopback. + Kernel ALSA only. For CRDOP / MAX25-SoftModem development and test. + +stack_path: stacks/crdop +status: active + +devices: + - audio-dummy + +tools: + sniffer: stacks/crdop/tools/max25-signal-sniffer + dummy_daemon: stacks/crdop/tools/audio-dummyd + +docs: + - docs/CRDOP.md + - stacks/crdop/docs/AUDIO-ARCHITECTURE.md diff --git a/plugins/hardware/modems/README.md b/plugins/hardware/modems/README.md new file mode 100644 index 0000000..9988df9 --- /dev/null +++ b/plugins/hardware/modems/README.md @@ -0,0 +1,27 @@ +# Hardware: Modems + +BayCom/based SER12 — userspace **bcpr** (`stacks/max25-bcpr/`). USB/async KISS — `plugins/devices/baycom-kiss/`. + +Kernel `baycom-pr` / `baycom_ser_fdx` removed from this tree (2026-07-18). + +## HyBBX + +Optional BayCom/based path is via MAX25 (`bcpr` → KISS). See [docs/BAYCOM.md](../../docs/BAYCOM.md) and [docs/HYBBX.md](../../docs/HYBBX.md). + +| Path | Role | +|------|------| +| `stacks/max25-bcpr/` | SER12 userspace (PC-COM class) | +| `baycom-kiss` | USB/async KISS TNC firmware | + +## Quick start + +```bash +cmake -S . -B build-max25-bcpr -DMAX25_BUILD_MAX25_BCPR=ON +cmake --build build-max25-bcpr +# then: docs/BAYCOM.md (max25-bcpr-ctl / max25d [features] max25_bcpr=yes) +``` + +## Docs + +- [docs/BAYCOM.md](../../docs/BAYCOM.md) +- [stacks/max25-bcpr/README.md](../../stacks/max25-bcpr/README.md) diff --git a/plugins/hardware/modems/plugin.yaml b/plugins/hardware/modems/plugin.yaml new file mode 100644 index 0000000..ad0a194 --- /dev/null +++ b/plugins/hardware/modems/plugin.yaml @@ -0,0 +1,27 @@ +id: modems +type: hardware +parent_stack: MainAX25-Stack (MAX25-Stack) +label: Modems +description: BayCom/based SER12 via max25-bcpr (userspace; not usable by default); USB/async KISS via baycom-kiss + +stack_path: stacks/max25-bcpr +hybbx_plugin: baycom + +backends: + - max25-bcpr-ser12 + - kiss-serial + +build: + cmake_option: MAX25_BUILD_MAX25_BCPR + targets: [max25-bcprd, max25-bcpr-ctl] + +ctl: stacks/max25-bcpr/tools/max25-bcpr-ctl + +runtime: + state_dir: /tmp/max25-bcpr + config: /etc/max25/max25-bcpr.ini + kiss_default: /tmp/max25-bcpr/kiss-bc0 + +devices: + - baycom-kiss +# SER12 product devices are max25e0 / max25e0:bc1 via max25d [devices], not kernel plugins. diff --git a/plugins/hardware/soft-modems/README.md b/plugins/hardware/soft-modems/README.md new file mode 100644 index 0000000..d3cdd53 --- /dev/null +++ b/plugins/hardware/soft-modems/README.md @@ -0,0 +1,23 @@ +# Hardware: Soft Modems + +Sound-card software modems — **MAX25-SoftModem (CRDOP)** is the in-house standard. **CRDOP** = stack acronym for **MAX25-SoftModem** (device id `soft-crdop`). + +| Device | Stack | HyBBX plugin | Protocol | v1 | +|--------|-------|--------------|----------|-----| +| `soft-crdop` | `stacks/crdop` | `crdop` | MAX25-native M25/KISS host | **active** | + +## CRDOP (standard) + +**CRDOP (MAX25-SoftModem)** — MAX25-Stack standard (`stacks/crdop/`). Built by default (`MAX25_BUILD_CRDOP=ON`). Native M25 host protocol on TCP :8515/:8516. + +**ARDOP-plugin** — optional separate registry for third-party ARDOP host software — see [plugins/external/ardop/README.md](../../external/ardop/README.md). Not coupled to CRDOP. + +## Start (operator) + +```bash +./scripts/max25-ctl start --hardware soft-modems --device soft-crdop +``` + +Then attach HyBBX with `share/hybbx/crdop-host.ini.example`. + +CRDOP is acoustically AX.25-compatible at 1200 baud+; host path uses native MAX25 SoftModem TCP (M25/KISS). diff --git a/plugins/hardware/soft-modems/plugin.yaml b/plugins/hardware/soft-modems/plugin.yaml new file mode 100644 index 0000000..535a850 --- /dev/null +++ b/plugins/hardware/soft-modems/plugin.yaml @@ -0,0 +1,48 @@ +id: soft-modems +type: hardware +parent_stack: MainAX25-Stack (MAX25-Stack) +label: Soft Modems (MAX25-SoftModem / CRDOP) +description: | + MAX25-SoftModem (CRDOP) — in-house sound-card modem, MAX25-Stack STANDARD. + Development and test phase. 1200 baud+, half/full duplex. + Acoustically AX.25/Packet-Radio compatible with TNCs and BayCom modems. + Sound card IN/OUT + radio — use like a hardware modem. + Good sound card required (tone accuracy; higher baud = stricter audio). + Built and installed unless MAX25_BUILD_CRDOP=OFF. + +stack_path: stacks/crdop +hybbx_plugin: crdop +hybbx_doc: ../../docs/HYBBX.md#crdop + +status: active +phase: development_and_testing +shipped_default: true + +protocols: + - max25-softmodem + - ax25-afsk-acoustic + +requirements: + sound_card: required + baud_primary: 1200 + baud_max: 19200 + duplex: [half, full] + coupling: [line_level, acoustic] + +build: + cmake_option: MAX25_BUILD_CRDOP + default: ON + +ctl: + build: stacks/crdop/scripts/build-crdop.sh + start: stacks/crdop/scripts/crdopc + install: stacks/crdop/scripts/install-crdop.sh + +devices: + - soft-crdop + +docs: + - stacks/crdop/docs/INDEX.md + - stacks/crdop/README.md + - stacks/crdop/docs/SOFTMODEM.md + - stacks/crdop/ROADMAP.md diff --git a/plugins/hardware/terminal/plugin.yaml b/plugins/hardware/terminal/plugin.yaml new file mode 100644 index 0000000..9b9de36 --- /dev/null +++ b/plugins/hardware/terminal/plugin.yaml @@ -0,0 +1,4 @@ +id: terminal +label: MAX25 Terminal clients +stack: stacks/terminal +description: Remote operator UI — no local hardware; connects to Linux max25d diff --git a/plugins/hardware/tncs/README.md b/plugins/hardware/tncs/README.md new file mode 100644 index 0000000..b2c8fef --- /dev/null +++ b/plugins/hardware/tncs/README.md @@ -0,0 +1,25 @@ +# Hardware: TNCs + +Serial and USB Terminal Node Controllers. Merged from **TNCs-Stack** (`stacks/tncs/`). + +## HyBBX + +`packet_radio` plugin with `tnc=` profile per device. + +| Device | `tnc=` | Serial | +|--------|--------|--------| +| TNC2C | `tnc2c` | 19200 8N1, RTS/DTR | +| PK-TNC2 | `tnc2` | 9600/2400 8N1 (planned) | + +## Build & test + +```bash +./scripts/build.sh +./stacks/tncs/tnc2c-integration-test.sh # with hardware +``` + +## Docs + +- [stacks/tncs/README.md](../../stacks/tncs/README.md) +- [stacks/tncs/docs/TNC2C-OPERATIONS.md](../../stacks/tncs/docs/TNC2C-OPERATIONS.md) +- [stacks/tncs/docs/TNC2C-REFERENCE.md](../../stacks/tncs/docs/TNC2C-REFERENCE.md) diff --git a/plugins/hardware/tncs/plugin.yaml b/plugins/hardware/tncs/plugin.yaml new file mode 100644 index 0000000..cbc95de --- /dev/null +++ b/plugins/hardware/tncs/plugin.yaml @@ -0,0 +1,28 @@ +id: tncs +type: hardware +parent_stack: MainAX25-Stack (MAX25-Stack) +label: TNCs +description: Serial/USB TNC hardware group — async host protocols (KISS, hostmode, 6PACK) + +stack_path: stacks/tncs +hybbx_plugin: packet_radio +hybbx_doc: ../../docs/HYBBX.md#packet_radio + +protocols: + - kiss + - hostmode + - sixpack + +build: + makefile: stacks/tncs/Makefile + targets: [all, test, integration, health, boot-wait] + +ctl: + health: stacks/tncs/tnc2c-health.sh + boot_wait: stacks/tncs/tnc2c-boot-wait.sh + integration: stacks/tncs/tnc2c-integration-test.sh + listen: stacks/tncs/tnc2c-listen.sh + +devices: + - tnc2c + - pktnc2 diff --git a/plugins/manifest.yaml b/plugins/manifest.yaml new file mode 100644 index 0000000..c7163d6 --- /dev/null +++ b/plugins/manifest.yaml @@ -0,0 +1,91 @@ +# MainAX25-Stack (MAX25-Stack) plugin registry — auto-discovered by scripts/discover-plugins.sh +# HyBBX attaches to a running MainAX25 stack; these plugins define the contract. +schema_version: 1 +stack: max25 +name: MainAX25-Stack +alias: MAX25-Stack +version: 1.0.0 +default_betriebsform: standalone +description: MainAX25-Stack (MAX25-Stack) — Main AX.25 Packet Radio standalone stack (HyBBX-compatible) + +betriebsform: + - id: standalone + path: betriebsform/standalone + label: Standalone + description: Single operator — terminal AX.25 clients, one modem/TNC + - id: service + path: betriebsform/service + label: Service + description: 24/7 dual-radio operation (HyBBX, digipeater, automation) + - id: hybbx-host + path: betriebsform/hybbx-host + label: HyBBX Host + description: Secondary RF host — KISS/HBX link to HyBBX Main + +hardware: + - id: tncs + path: hardware/tncs + stack: stacks/tncs + hybbx_plugin: packet_radio + description: Serial/USB TNC hardware group (TNC2C, PK-TNC2, PK-232, …) + - id: modems + path: hardware/modems + stack: stacks/max25-bcpr + hybbx_plugin: baycom + description: BayCom/based SER12 via max25-bcpr (userspace); USB KISS via baycom-kiss + - id: soft-modems + path: hardware/soft-modems + stack: stacks/crdop + hybbx_plugin: crdop + description: MAX25-SoftModem (CRDOP) — in-house standard; built unless MAX25_BUILD_CRDOP=OFF + - id: acoustic-bench + path: hardware/acoustic-bench + stack: stacks/crdop + description: Acoustic bench — audio-dummy, signal sniffer, DSP loopback (dev/test) + - id: terminal + path: hardware/terminal + stack: stacks/terminal + description: MAX25 Terminal client group (remote UI to max25d) + +devices: + - id: tnc2c + path: devices/tnc2c + hardware: tncs + hybbx_profile: tnc2c + status: active + - id: pktnc2 + path: devices/pktnc2 + hardware: tncs + hybbx_profile: tnc2 + status: planned + - id: baycom-kiss + path: devices/baycom-kiss + hardware: modems + hybbx_backend: kiss + status: active + - id: bayc-plugin + path: devices/bayc-plugin + hardware: modems + hybbx_backend: max25d + status: stub + note: Thin hook only — experimental orch/soft-TNC lives in vault exbug/ (private hack/daemon); no baycom_* NIC + - id: soft-crdop + path: devices/soft-crdop + hardware: soft-modems + hybbx_plugin: crdop + status: active + note: MAX25-SoftModem (CRDOP) — standard; development/test phase; 1200–19200 baud; acoustic AX.25; sound card required + - id: audio-dummy + path: devices/audio-dummy + hardware: acoustic-bench + status: active + note: Acoustic bench dummy — loopback/ALSA sniff/M25 host; signal sniffer for on-host evaluation + - id: tmodem + path: devices/tmodem + hardware: tncs + status: prototype + note: T-Modem-c1224 USB KISS half-TNC (Pico HDLC + chip AFSK); [features] tmodem=yes; not BayCom/based + - id: max25-terminal + path: devices/max25-terminal + hardware: terminal + status: active |
