From 04d965d67a7264a1c7c211494aebda1953df7603 Mon Sep 17 00:00:00 2001 From: "info@mode42.com" Date: Fri, 7 Aug 2026 18:25:13 +0000 Subject: Initial push --- share/baycom/README.md | 15 ++ share/clients/README.md | 79 +++++++++++ share/clients/baycom-kiss.yaml | 46 ++++++ share/clients/index.yaml | 39 +++++ share/clients/kiss-serial-rs232.yaml | 55 +++++++ share/clients/kiss-serial-usb.yaml | 57 ++++++++ share/clients/pktnc2.yaml | 54 +++++++ share/clients/soft-crdop.yaml | 66 +++++++++ share/clients/tmodem.yaml | 42 ++++++ share/clients/tnc2c.yaml | 53 +++++++ share/hybbx/baycom-kiss-host.ini.example | 38 +++++ share/hybbx/crdop-host.ini.example | 17 +++ share/hybbx/pktnc2-host.ini.example | 28 ++++ share/hybbx/service-dual.ini.example | 37 +++++ share/hybbx/tnc2c-host.ini.example | 38 +++++ share/max25-bcpr/max25-bcpr.freebsd.ini.example | 34 +++++ share/max25-bcpr/max25-bcpr.ini.example | 44 ++++++ share/max25/max25-ws-proxy.service.example | 13 ++ share/max25/max25d.freebsd.bcpr.ini.example | 39 +++++ share/max25/max25d.freebsd.ini.example | 35 +++++ share/max25/max25d.freebsd.secondary.ini.example | 38 +++++ share/max25/max25d.freebsd.tmodem.ini.example | 38 +++++ share/max25/max25d.full-station.ini.example | 55 +++++++ share/max25/max25d.ini.example | 173 +++++++++++++++++++++++ share/max25/max25d.ini.host.example | 95 +++++++++++++ share/max25/max25d.main.ini.example | 27 ++++ share/max25/max25d.netdev.ini.example | 12 ++ share/max25/max25d.secondary-linux.ini.example | 46 ++++++ share/max25/max25d.service.example | 13 ++ share/max25/max25d.tmodem.ini.example | 38 +++++ share/max25/serial/README.md | 22 +++ share/max25/serial/pccom-kiss-serial.env.example | 9 ++ share/max25/serial/pktnc2-serial.env.example | 5 + share/max25/serial/tnc2c-serial.env.example | 8 ++ share/systemd/README.md | 9 ++ share/systemd/max25d.service | 32 +++++ 36 files changed, 1449 insertions(+) create mode 100644 share/baycom/README.md create mode 100644 share/clients/README.md create mode 100644 share/clients/baycom-kiss.yaml create mode 100644 share/clients/index.yaml create mode 100644 share/clients/kiss-serial-rs232.yaml create mode 100644 share/clients/kiss-serial-usb.yaml create mode 100644 share/clients/pktnc2.yaml create mode 100644 share/clients/soft-crdop.yaml create mode 100644 share/clients/tmodem.yaml create mode 100644 share/clients/tnc2c.yaml create mode 100644 share/hybbx/baycom-kiss-host.ini.example create mode 100644 share/hybbx/crdop-host.ini.example create mode 100644 share/hybbx/pktnc2-host.ini.example create mode 100644 share/hybbx/service-dual.ini.example create mode 100644 share/hybbx/tnc2c-host.ini.example create mode 100644 share/max25-bcpr/max25-bcpr.freebsd.ini.example create mode 100644 share/max25-bcpr/max25-bcpr.ini.example create mode 100644 share/max25/max25-ws-proxy.service.example create mode 100644 share/max25/max25d.freebsd.bcpr.ini.example create mode 100644 share/max25/max25d.freebsd.ini.example create mode 100644 share/max25/max25d.freebsd.secondary.ini.example create mode 100644 share/max25/max25d.freebsd.tmodem.ini.example create mode 100644 share/max25/max25d.full-station.ini.example create mode 100644 share/max25/max25d.ini.example create mode 100644 share/max25/max25d.ini.host.example create mode 100644 share/max25/max25d.main.ini.example create mode 100644 share/max25/max25d.netdev.ini.example create mode 100644 share/max25/max25d.secondary-linux.ini.example create mode 100644 share/max25/max25d.service.example create mode 100644 share/max25/max25d.tmodem.ini.example create mode 100644 share/max25/serial/README.md create mode 100644 share/max25/serial/pccom-kiss-serial.env.example create mode 100644 share/max25/serial/pktnc2-serial.env.example create mode 100644 share/max25/serial/tnc2c-serial.env.example create mode 100644 share/systemd/README.md create mode 100644 share/systemd/max25d.service (limited to 'share') diff --git a/share/baycom/README.md b/share/baycom/README.md new file mode 100644 index 0000000..d48ad85 --- /dev/null +++ b/share/baycom/README.md @@ -0,0 +1,15 @@ +# BayCom/based configuration (MAX25) + +Public mark: **BayCom/based**. Product path: **max25-bcpr** only. + +**Status: available** (default build ON). + +Device id: **`max25e0`** (forks `max25e0:bcN`). Defaults: `ipv4=127.0.0.25/8`, `ipv6=::25/128`. + +```bash +./build/bin/max25-bcprd -c stacks/max25-bcpr/share/max25-bcpr.ini.example --dry-run --once +sudo cp stacks/max25-bcpr/share/max25-bcpr.ini.example /etc/max25/max25-bcpr.ini +sudo stacks/max25-bcpr/tools/max25-bcpr-ctl -c /etc/max25/max25-bcpr.ini preflight +``` + +See [docs/BAYCOM.md](../../docs/BAYCOM.md). Freeze warning (dev): [docs/BAYCOM-FREEZES.md](../../docs/BAYCOM-FREEZES.md). diff --git a/share/clients/README.md b/share/clients/README.md new file mode 100644 index 0000000..8300ea0 --- /dev/null +++ b/share/clients/README.md @@ -0,0 +1,79 @@ +# Terminal client profiles (YAML) + +Per-modem **max25-terminal** profiles for devices that need settings beyond a BayCom/based **bcpr** or TNC env catalog. + +| Who reads this | Purpose | +|----------------|---------| +| **max25-terminal** | Connection target, default `SET DEVICE`, session IDs, UI pacing | +| **Operator** | `max25-terminal -U /run/max25/modem.sock` — device from max25d `[devices] default`, or `-d ` / F10→7 / `SET DEVICE` (id from YAML `device.id`) | +| **max25d** | **Not** loaded from here — use `max25d.ini`, `bcpr.ini`, or env files | + +## BayCom/based (bcpr) — client YAML as operator reference + +SER12 PC-COM class hardware runs via **bcpr** (`stacks/max25-bcpr/`), not a kernel driver. Configure `bcpr.ini` / max25d `[features] max25_bcpr=yes` and device **`max25e0`** (`max25e0 = max25-bcpr:bc0`). No separate client YAML is required — use max25d default or `SET DEVICE max25e0`. + +Terminal clients attach to **max25d** after `max25-bcprd` / max25d bring-up. See [docs/BAYCOM.md](../../docs/BAYCOM.md) and [docs/PLUGINS-DEVICE-MODEL.md](../../docs/PLUGINS-DEVICE-MODEL.md). + +Registry of all catalog IDs (with and without client YAML): [`index.yaml`](index.yaml). + +## Schema (`schema_version: 1`) + +```yaml +schema_version: 1 +id: tnc2c # max25d device id or catalog id +label: Human name +type: client-profile # client-profile | catalog-only + +connection: # terminal → max25d (never raw serial) + host: 127.0.0.1 + port: 7325 + unix_socket: /run/max25/modem.sock + +device: # M25/1 SET DEVICE on connect + id: tnc2c + hardware: tncs + +session: # optional defaults (SET CALLERID / CALLID / AX25_UI) + callerid: CB-0 + callid: QST + ax25_ui: true + +terminal: # HyBBX-aligned UI + pacing_baud: 2400 + line_width: 80 + payload_max: 256 + +max25d: # pointers for daemon/site config (informational) + ini_example: share/max25/max25d.ini.example + device_section: serial.tnc2c + env_file: stacks/tncs/tnc2c-serial.env + boot_wait: stacks/tncs/tnc2c-boot-wait.sh + +serial: # max25d-owned serial (client does not open) + default_device: /dev/ttyS4 + baud: 19200 + line: 8n1 + dtr_rts: true + kiss_entry: kiss_on +``` + +KISS-async and CRDOP profiles use `serial:` or `crdop:` instead of BayCom catalog fields. + +## Files + +| File | Modem / device | +|------|----------------| +| [`tnc2c.yaml`](tnc2c.yaml) | Landolt TNC2C | +| (none — use `max25e0`) | BayCom/based SER12 via max25-bcpr (PC-COM) | +| [`pktnc2.yaml`](pktnc2.yaml) | PK-TNC2 / TNC-2 (TheFirmware) +| [`kiss-serial-usb.yaml`](kiss-serial-usb.yaml) | KISS on USB (`modems.ini` catalog) | +| [`kiss-serial-rs232.yaml`](kiss-serial-rs232.yaml) | KISS on RS-232 | +| [`baycom-kiss.yaml`](baycom-kiss.yaml) | MAX25 device plugin (USB KISS) | +| [`soft-crdop.yaml`](soft-crdop.yaml) | CRDOP sound-card modem | +| [`index.yaml`](index.yaml) | Full modem database map | + +## See also + +- [docs/MAX25-CLIENT.md](../../docs/MAX25-CLIENT.md) — M25/1 protocol +- [docs/MAX25-TERMINAL.md](../../docs/MAX25-TERMINAL.md) — operator UI +- [stacks/max25-bcpr/share/max25-bcpr.ini.example](../../stacks/max25-bcpr/share/max25-bcpr.ini.example) — bcpr INI example diff --git a/share/clients/baycom-kiss.yaml b/share/clients/baycom-kiss.yaml new file mode 100644 index 0000000..b849c2a --- /dev/null +++ b/share/clients/baycom-kiss.yaml @@ -0,0 +1,46 @@ +schema_version: 1 +id: baycom-kiss +label: BayCom KISS Serial (MAX25 device) +type: client-profile +status: scaffold + +connection: + host: 127.0.0.1 + port: 7325 + unix_socket: /run/max25/modem.sock + tcp_only: false + +device: + id: baycom-kiss + hardware: modems + +session: + callerid: CB-0 + callid: QST + ax25_ui: true + +terminal: + pacing_baud: 2400 + line_width: 80 + payload_max: 256 + +max25d: + ini_example: share/max25/max25d.ini.example + devices_key: baycom-kiss + backend: kiss-raw-serial + +serial: + default_device: /dev/ttyUSB0 + baud: 9600 + line: 8n1 + dtr_rts: false + +catalog_profiles: + - share/clients/kiss-serial-usb.yaml + - share/clients/kiss-serial-rs232.yaml + +docs: + - plugins/devices/baycom-kiss/plugin.yaml + - stacks/baycom-pr/docs/GETTING-STARTED.md + +notes: Device plugin wrapper — pick USB or RS-232 catalog profile above. diff --git a/share/clients/index.yaml b/share/clients/index.yaml new file mode 100644 index 0000000..099269f --- /dev/null +++ b/share/clients/index.yaml @@ -0,0 +1,39 @@ +# MAX25 client profile registry +# Maps MAX25 device plugins to terminal client configs. +# Kernel baycom-pr / modems.ini catalog removed 2026-07-18 — SER12 product path is bcpr. + +schema_version: 1 +plugin_registry: plugins/manifest.yaml + +devices: + - id: tnc2c + label: Landolt TNC2C + hardware: tncs + client_config: share/clients/tnc2c.yaml + status: active + + - id: pktnc2 + label: PK-TNC2 / TNC-2 (TheFirmware) + hardware: tncs + client_config: share/clients/pktnc2.yaml + status: planned + + - id: baycom-kiss + label: BayCom KISS serial (USB/async) + hardware: modems + client_config: share/clients/baycom-kiss.yaml + status: active + + - id: tmodem + label: T-Modem-c1224 USB KISS half-TNC + hardware: tncs + client_config: share/clients/tmodem.yaml + status: prototype + + - id: soft-crdop + label: CRDOP sound-card modem + hardware: soft-modems + client_config: share/clients/soft-crdop.yaml + status: active + +# BayCom/based SER12: configure max25d max25e0 / max25e0:bc1 — no separate client YAML required. diff --git a/share/clients/kiss-serial-rs232.yaml b/share/clients/kiss-serial-rs232.yaml new file mode 100644 index 0000000..6a22148 --- /dev/null +++ b/share/clients/kiss-serial-rs232.yaml @@ -0,0 +1,55 @@ +schema_version: 1 +id: kiss-serial-rs232 +label: KISS modem on RS-232 serial +type: client-profile +catalog: kiss-serial-rs232 +status: active + +connection: + host: 127.0.0.1 + port: 7325 + unix_socket: /run/max25/modem.sock + tcp_only: false + +device: + id: baycom-kiss + hardware: modems + +session: + callerid: CB-0 + callid: QST + ax25_ui: true + +terminal: + pacing_baud: 2400 + line_width: 80 + payload_max: 256 + +max25d: + ini_example: share/max25/max25d.ini.example + device_section: serial.baycom-kiss + backend: kiss-raw-serial + baycom_pr: + catalog: kiss-serial-rs232 + kiss_link: /var/run/baycom-pr/kiss + +serial: + default_device: /dev/ttyS1 + baud: 9600 + line: 8n1 + dtr_rts: false + kiss_entry: none + +rf: + radio_baud: 1200 + +hybbx: + plugin: baycom + backend: kiss + +docs: + - stacks/baycom-pr/config/modems.ini + +notes: | + TNC2, OpenTracker, KISS firmware on RS-232 or USB-serial adapter. + Self-powered TNC preferred; port-powered units need adequate TXD/DTR current. diff --git a/share/clients/kiss-serial-usb.yaml b/share/clients/kiss-serial-usb.yaml new file mode 100644 index 0000000..120bb36 --- /dev/null +++ b/share/clients/kiss-serial-usb.yaml @@ -0,0 +1,57 @@ +schema_version: 1 +id: kiss-serial-usb +label: KISS modem on USB (ttyUSB / ttyACM) +type: client-profile +catalog: kiss-serial-usb +status: active + +connection: + host: 127.0.0.1 + port: 7325 + unix_socket: /run/max25/modem.sock + tcp_only: false + +device: + id: baycom-kiss + hardware: modems + +session: + callerid: CB-0 + callid: QST + ax25_ui: true + +terminal: + pacing_baud: 2400 + line_width: 80 + payload_max: 256 + +max25d: + ini_example: share/max25/max25d.ini.example + device_section: serial.baycom-kiss + backend: kiss-raw-serial + baycom_pr: + catalog: kiss-serial-usb + kiss_link: /var/run/baycom-pr/kiss + +serial: + default_device: /dev/ttyUSB0 + baud: 9600 + line: 8n1 + dtr_rts: false + kiss_entry: none + +rf: + radio_baud: 1200 + +hybbx: + plugin: baycom + backend: kiss + +docs: + - stacks/baycom-pr/config/modems.ini + - stacks/baycom-pr/docs/GETTING-STARTED.md + +notes: | + No kernel baycom_ser_fdx — async USB serial KISS. + max25d or baycom-pr kiss bridge owns the USB device; terminal uses M25/1 only. + Adapter must supply stable USB power (see stacks/baycom-pr/docs/archive/HARDWARE.md). diff --git a/share/clients/pktnc2.yaml b/share/clients/pktnc2.yaml new file mode 100644 index 0000000..bf97834 --- /dev/null +++ b/share/clients/pktnc2.yaml @@ -0,0 +1,54 @@ +schema_version: 1 +id: pktnc2 +label: PK-TNC2 / TNC-2 (TheFirmware) +type: client-profile +status: planned + +connection: + host: 127.0.0.1 + port: 7325 + unix_socket: /run/max25/modem.sock + tcp_only: false + +device: + id: pktnc2 + hardware: tncs + +session: + callerid: CB-0 + callid: QST + ax25_ui: true + +terminal: + pacing_baud: 2400 + line_width: 80 + payload_max: 256 + +max25d: + ini_example: share/max25/max25d.ini.example + device_section: serial.pktnc2 + env_file: stacks/tncs/pktnc2-serial.env + boot_wait: stacks/tncs/pktnc2-boot-wait.sh + +serial: + default_device: /dev/ttyS5 + baud: 9600 + line: 8n1 + dtr_rts: false + kiss_entry: auto + +rf: + radio_baud: 1200 + band: cb + +hybbx: + ini_example: share/hybbx/pktnc2-host.ini.example + plugin: packet_radio + profile: tnc2 + aliases: [pktnc2, pk-tnc2, tapr, thefirmware] + +docs: + - stacks/tncs/docs/TNC2C-REFERENCE.md + - plugins/devices/pktnc2/plugin.yaml + +notes: Probe serial port after hardware inventory — adjust default_device in local env. diff --git a/share/clients/soft-crdop.yaml b/share/clients/soft-crdop.yaml new file mode 100644 index 0000000..81ae5a2 --- /dev/null +++ b/share/clients/soft-crdop.yaml @@ -0,0 +1,66 @@ +schema_version: 1 +id: soft-crdop +label: MAX25-SoftModem (CRDOP) +type: client-profile +status: active + +connection: + host: 127.0.0.1 + port: 7325 + unix_socket: /run/max25/modem.sock + tcp_only: false + +device: + id: soft-crdop + hardware: soft-modems + +session: + callerid: CB-0 + callid: QST + ax25_ui: true + +terminal: + pacing_baud: 1200 + line_width: 80 + payload_max: 256 + +max25d: + ini_example: share/max25/max25d.ini.example + device_section: device.soft-crdop + ctl_start: stacks/crdop/scripts/crdopc + default_ini: stacks/crdop/share/crdop.ini.example + +softmodem: + product: MAX25-SoftModem + phase: development_and_testing + protocol: max25-softmodem + baud_primary: 1200 + baud_max: 19200 + duplex: [half, full] + ax25_packet_radio: acoustically_compatible + use_like_hardware_modem: true + audio_required: true + coupling: [line_level, acoustic] + host: 127.0.0.1 + control_port: 8515 + data_port: 8516 + listen: true + +hybbx: + ini_example: share/hybbx/crdop-host.ini.example + plugin: crdop + +docs: + - stacks/crdop/docs/INDEX.md + - stacks/crdop/README.md + - stacks/crdop/docs/SOFTMODEM.md + - stacks/crdop/ROADMAP.md + - plugins/devices/soft-crdop/plugin.yaml + +notes: | + MAX25-SoftModem (CRDOP) — MAX25-Stack STANDARD (built unless MAX25_BUILD_CRDOP=OFF). + 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 in max25d. + Good sound card REQUIRED (accurate tones; stricter at higher baud). + Open docs for DIY hardware interfaces. diff --git a/share/clients/tmodem.yaml b/share/clients/tmodem.yaml new file mode 100644 index 0000000..162b5b8 --- /dev/null +++ b/share/clients/tmodem.yaml @@ -0,0 +1,42 @@ +schema_version: 1 +id: tmodem +label: T-Modem-c1224 USB KISS half-TNC +type: client-profile +status: prototype + +connection: + host: 127.0.0.1 + port: 7325 + unix_socket: /run/max25/modem.sock + tcp_only: false + +device: + id: tmodem + hardware: tncs + +session: + callerid: CB-0 + callid: QST + ax25_ui: true + +terminal: + pacing_baud: 1200 + line_width: 80 + payload_max: 256 + +max25d: + ini_example: share/max25/max25d.tmodem.ini.example + devices_key: tmodem + backend: kiss-raw-serial + +serial: + default_device: /dev/ttyACM0 + baud: 115200 + line: 8n1 + dtr_rts: false + +docs: + - plugins/devices/tmodem/plugin.yaml + - docs/DEV/TMODEM-C1224.md + +notes: Not BayCom/based. Feature [features] tmodem=yes required. diff --git a/share/clients/tnc2c.yaml b/share/clients/tnc2c.yaml new file mode 100644 index 0000000..90c6e9c --- /dev/null +++ b/share/clients/tnc2c.yaml @@ -0,0 +1,53 @@ +schema_version: 1 +id: tnc2c +label: Landolt TNC2C +type: client-profile +status: active + +connection: + host: 127.0.0.1 + port: 7325 + unix_socket: /run/max25/modem.sock + tcp_only: false + +device: + id: tnc2c + hardware: tncs + +session: + callerid: CB-0 + callid: QST + ax25_ui: true + +terminal: + pacing_baud: 2400 + line_width: 80 + payload_max: 256 + +max25d: + ini_example: share/max25/max25d.ini.example + device_section: serial.tnc2c + env_file: stacks/tncs/tnc2c-serial.env + boot_wait: stacks/tncs/tnc2c-boot-wait.sh + health: stacks/tncs/tnc2c-health.sh + +serial: + default_device: /dev/ttyS4 + baud: 19200 + line: 8n1 + dtr_rts: true + kiss_entry: kiss_on + +rf: + modem: tcm3105 + radio_baud: 2400 + band: cb + +hybbx: + ini_example: share/hybbx/tnc2c-host.ini.example + plugin: packet_radio + profile: tnc2c + +docs: + - stacks/tncs/docs/TNC2C-OPERATIONS.md + - plugins/devices/tnc2c/plugin.yaml diff --git a/share/hybbx/baycom-kiss-host.ini.example b/share/hybbx/baycom-kiss-host.ini.example new file mode 100644 index 0000000..9fbefb9 --- /dev/null +++ b/share/hybbx/baycom-kiss-host.ini.example @@ -0,0 +1,38 @@ +; HyBBX INI — co-host / secondary RF (BayCom/based via MAX25 KISS prep) +; max25d: mode=hybbx-main | hybbx-cohost | hybbx-host +; [features] baycom=yes max25_bcpr=yes +; max25e0 = max25-bcpr:bc0 → kiss_link /tmp/max25-bcpr/kiss-bc0 +; HyBBX opens KISS after max25d prep — max25d does not hold the fd. +; Copy to hybbx.ini on RF host; circuit_host points at Main hub when split. + +[instance] +standalone = yes + +[networks] +baycom = yes +ax25 = no + +[max25] +check = yes +host = 127.0.0.1 +port = 7325 + +[circuit] +enabled = yes +; circuit_host on transport rows when linking to remote Main + +[transport.baycom1] +backend = kiss +device = /tmp/max25-bcpr/kiss-bc0 +serial_baud = 1200 +radio_baud = 1200 +txdelay = 35 +slot = 10 +persist = 128 +txtail = 2 +circuit_host = main.example.com +circuit_port = 7323 +link_id = max25-pccom-kiss +link_password = changeme +link_role = link +frequency_mhz = 27.205 diff --git a/share/hybbx/crdop-host.ini.example b/share/hybbx/crdop-host.ini.example new file mode 100644 index 0000000..f3d50c7 --- /dev/null +++ b/share/hybbx/crdop-host.ini.example @@ -0,0 +1,17 @@ +; MainAX25-Stack (MAX25-Stack) — HyBBX Secondary host (CRDOP / soft-crdop) +; Merge into HyBBX hybbx.ini on Secondary node. +; Prerequisite: crdopc running (max25-ctl start --hardware soft-modems --device soft-crdop) + +[networks] +crdop = yes + +[transport.crdop1] +enabled = yes +modem_host = 127.0.0.1 +modem_port = 8515 +mycall = CB-0 +listen = yes +circuit_host = main.example.com +circuit_port = 7323 +link_id = max25-crdop +link_password = changeme diff --git a/share/hybbx/pktnc2-host.ini.example b/share/hybbx/pktnc2-host.ini.example new file mode 100644 index 0000000..3675a87 --- /dev/null +++ b/share/hybbx/pktnc2-host.ini.example @@ -0,0 +1,28 @@ +; MainAX25-Stack (MAX25-Stack) — HyBBX Secondary host (PK-TNC2 / TNC-2) +; Prerequisite: max25d auto_start or ./scripts/max25-ctl start --hardware tncs --device pktnc2 +; Standalone HyBBX (no max25d): set kiss_entry = auto instead of none + +[networks] +ax25 = yes + +[transport.packet_radio1] +enabled = yes +tnc = tnc2 +protocol = kiss +device_type = serial +device = /dev/ttyUSB0 +baud = 9600 +serial_line = 8n1 +rts_dtr = no +kiss_entry = none +radio_baud = 1200 +radio_band = cb +radio_duplex = half +persist = 255 +circuit_host = main.example.com +circuit_port = 7323 +link_id = max25-pktnc2 +link_password = changeme + +[max25] +check = yes diff --git a/share/hybbx/service-dual.ini.example b/share/hybbx/service-dual.ini.example new file mode 100644 index 0000000..febf3c2 --- /dev/null +++ b/share/hybbx/service-dual.ini.example @@ -0,0 +1,37 @@ +; MainAX25-Stack (MAX25-Stack) — service mode dual BayCom (HyBBX) +; Prerequisite: bcpr dual max25e0:bc0/bc1 running (see docs/BAYCOM.md · stacks/max25-bcpr/) +; Merge into Secondary hybbx.ini — unique link_id per transport on Main. + +[networks] +ax25 = no +baycom = yes + +; BayCom radio A — modem.a / bcsf0 / kiss-a +[transport.baycom1] +backend = kernel +mode = ser12* +interface = bcsf0 +iobase = 0x3f8 +irq = 4 +radio_baud = 1200 +txdelay = 35 +circuit_host = main.example.com +circuit_port = 7323 +link_id = max25-baycom-a +link_password = changeme +frequency_mhz = 27.205 + +; BayCom radio B — modem.b / bcsf1 / kiss-b +[transport.baycom2] +backend = kernel +mode = ser12* +interface = bcsf1 +iobase = 0xe080 +irq = 30 +radio_baud = 1200 +txdelay = 35 +circuit_host = main.example.com +circuit_port = 7323 +link_id = max25-baycom-b +link_password = changeme +frequency_mhz = 27.205 diff --git a/share/hybbx/tnc2c-host.ini.example b/share/hybbx/tnc2c-host.ini.example new file mode 100644 index 0000000..84986e3 --- /dev/null +++ b/share/hybbx/tnc2c-host.ini.example @@ -0,0 +1,38 @@ +; MainAX25-Stack — HyBBX Secondary host (TNC2C) +; Merge into HyBBX hybbx.ini on Secondary node. +; Prerequisite: max25d auto_start or ./scripts/max25-ctl start --hardware tncs --device tnc2c +; Stack template (onboard ttyS4): stacks/tncs/hybbx-tnc2c.ini +; +; MAX25 owns serial recovery + KISS entry — HyBBX attach-only (kiss_entry = none). + +[networks] +ax25 = yes + +[transport.packet_radio1] +enabled = yes +tnc = tnc2c +protocol = kiss +device_type = serial +; Onboard UART: /dev/ttyS4 · USB host: /dev/ttyUSB0 or /dev/serial/by-id/... +device = /dev/ttyS4 +baud = 19200 +serial_line = 8n1 +rts_dtr = yes +kiss_entry = none +modem = tcm3105 +radio_baud = 2400 +clock_mhz = 4.9 +radio_band = cb +radio_duplex = half +frequency_mhz = 27.235 +txdelay = 50 +persist = 255 +slot = 10 +circuit_host = main.example.com +circuit_port = 7323 +link_id = max25-tnc2c +link_password = changeme +mycall = CB-0 + +[max25] +check = yes diff --git a/share/max25-bcpr/max25-bcpr.freebsd.ini.example b/share/max25-bcpr/max25-bcpr.freebsd.ini.example new file mode 100644 index 0000000..c16bf3a --- /dev/null +++ b/share/max25-bcpr/max25-bcpr.freebsd.ini.example @@ -0,0 +1,34 @@ +; max25-bcpr — FreeBSD AM1 / ExSys OXuPCI952 (cuau2 @ 0xd090) +; Copy: cp share/max25-bcpr/max25-bcpr.ini.example /usr/local/etc/max25/max25-bcpr.ini +; Live: dry_run=no · max25-bcpr-ctl start --ini /usr/local/etc/max25/max25-bcpr.ini + +[max25-bcpr] +dry_run = yes +state_dir = /tmp/max25-bcpr +; user = akb +; group = dialer +; ptt_wd = yes +; ptt_wd_key_ms = 14500 +; ptt_wd_pause_ms = 500 +; txd_bias = pulse + +[bc0] +enabled = yes +serial = /dev/cuau2 +iobase = 0xd090 +irq = 36 +mode = ser12* +kiss_link = /tmp/max25-bcpr/kiss-bc0 +baud = 1200 +tx_delay = 35 +tx_tail = 2 +slottime = 10 +ppersist = 40 +fulldup = no + +; [bc1] +; enabled = no +; serial = /dev/cuau3 +; iobase = 0xd080 +; irq = 36 +; kiss_link = /tmp/max25-bcpr/kiss-bc1 diff --git a/share/max25-bcpr/max25-bcpr.ini.example b/share/max25-bcpr/max25-bcpr.ini.example new file mode 100644 index 0000000..b75a91a --- /dev/null +++ b/share/max25-bcpr/max25-bcpr.ini.example @@ -0,0 +1,44 @@ +; max25-bcpr — BayCom/based PC-COM SER12 (userspace, MAX25) +; Public mark: BayCom/based. Never Konverter/converter. +; Product: BayCom/based PC-COM SER12 (userspace, MAX25). Built by default (MAX25_BUILD_MAX25_BCPR=ON). +; Hardware: TCM3105-class AFSK modem chip (bits↔tones + PTT). Not a TNC/digi/BBX. +; Host (max25-bcprd / max25d) owns HDLC, KISS, bit clock → device max25e0 (:bcN forks). +; Internal C API may still use bcpr_* symbols — product face is max25-bcpr only. +; +; Quick start (offline, after -DMAX25_BUILD_MAX25_BCPR=ON): +; max25-bcprd -c stacks/max25-bcpr/share/max25-bcpr.ini.example --dry-run --once +; Live: copy to /etc/max25/max25-bcpr.ini or ./local/max25-bcpr.ini; set dry_run=no. + +[max25-bcpr] +dry_run = yes +state_dir = /tmp/max25-bcpr +; FlexNet SER12 PTT watchdog (cal / long key): unkey ~500 ms every ~14.5 s +; ptt_wd = yes +; ptt_wd_key_ms = 14500 +; ptt_wd_pause_ms = 500 +; TXD pump: pulse = Sailer THR 0x00 (default); steady = UART break (TFPCX-class) +; txd_bias = pulse +; Software TOT (max25d [tot] syncs these on stack start; override per site if needed) +; tot = yes +; tot_max_key_sec = 25 +; tot_min_gap_ms = 1500 +; tot_max_consecutive = 3 +; tot_max_bursts = 8 + +[bc0] +enabled = yes +serial = /dev/ttyS0 +; iobase / irq — set to real values for live use +mode = ser12* +kiss_link = /tmp/max25-bcpr/kiss-bc0 +baud = 1200 +tx_delay = 35 +tx_tail = 2 +slottime = 10 +ppersist = 40 +fulldup = no + +; [bc1] +; enabled = no +; serial = /dev/ttyS1 +; kiss_link = /tmp/max25-bcpr/kiss-bc1 diff --git a/share/max25/max25-ws-proxy.service.example b/share/max25/max25-ws-proxy.service.example new file mode 100644 index 0000000..7620ac9 --- /dev/null +++ b/share/max25/max25-ws-proxy.service.example @@ -0,0 +1,13 @@ +[Unit] +Description=MAX25 WebSocket forward-proxy (M25/1 bridge) +Documentation=file:$PREFIX/share/max25/reverse-proxy/README.txt +After=network.target max25d.service +Wants=max25d.service + +[Service] +Type=simple +ExecStart=/usr/local/bin/max25-ws-proxy -c /etc/max25/web-proxy.ini +Restart=on-failure + +[Install] +WantedBy=multi-user.target diff --git a/share/max25/max25d.freebsd.bcpr.ini.example b/share/max25/max25d.freebsd.bcpr.ini.example new file mode 100644 index 0000000..5789e15 --- /dev/null +++ b/share/max25/max25d.freebsd.bcpr.ini.example @@ -0,0 +1,39 @@ +; max25d — FreeBSD + PC-COM / max25-bcpr (ExSys cuau2 default) +; Copy: cp share/max25/max25d.freebsd.bcpr.ini.example /usr/local/etc/max25/max25d.ini +; Start bcpr first: max25-bcpr-ctl start --ini /usr/local/etc/max25/max25-bcpr.ini + +[features] +baycom = no +pccom = no +max25_bcpr = yes +tmodem = no + +[daemon] +mode = standalone +hardware = tncs +device = max25e0 +; user = akb +; group = dialer + +[devices] +default = max25e0 +max25e0 = max25-bcpr:bc0 + +[network] +tcp_host = 0.0.0.0 +tcp_port = 7325 +unix_socket = /var/run/max25/modem.sock +tcp_password = + +[modem] +callerid = CB-0 +callid = QST +ax25_ui = yes + +[stack] +auto_start = yes +serial_watch = no + +[device.max25e0] +kiss_link = /tmp/max25-bcpr/kiss-bc0 +max25_bcpr_ini = /usr/local/etc/max25/max25-bcpr.ini diff --git a/share/max25/max25d.freebsd.ini.example b/share/max25/max25d.freebsd.ini.example new file mode 100644 index 0000000..4a913f9 --- /dev/null +++ b/share/max25/max25d.freebsd.ini.example @@ -0,0 +1,35 @@ +; MAX25-Stack — FreeBSD Secondary (CRDOP/OSS, modular TCP/IP service) +; Copy: cp share/max25/max25d.freebsd.ini.example /usr/local/etc/max25/max25d.ini +; Audio: pkg install sox — set capture/playback in share/crdop/crdop.freebsd.ini.example + +[daemon] +mode = standalone +hardware = soft-modems +device = soft-crdop + +[devices] +default = soft-crdop +soft-crdop = crdop:default + +[device.soft-crdop] +host = 127.0.0.1 +port = 8515 + +[modular_tcp] +enabled = yes +role = secondary +service_name = modular-tcp-server +instance_id = secondary-1 + +[network] +tcp_host = 0.0.0.0 +tcp_port = 7326 +unix_socket = /var/run/max25/modem.sock + +[modem] +callerid = CB-0 +callid = QST +ax25_ui = yes + +[stack] +auto_start = yes diff --git a/share/max25/max25d.freebsd.secondary.ini.example b/share/max25/max25d.freebsd.secondary.ini.example new file mode 100644 index 0000000..7c781fe --- /dev/null +++ b/share/max25/max25d.freebsd.secondary.ini.example @@ -0,0 +1,38 @@ +; max25d — FreeBSD Secondary (PC-COM / max25-bcpr) +; Use with Main tmodem @ :7325 — one RF backend per max25d. +; Copy: cp share/max25/max25d.freebsd.secondary.ini.example /usr/local/etc/max25/max25d-secondary.ini +; Start bcpr first: max25-bcpr-ctl start --ini /usr/local/etc/max25/max25-bcpr.ini + +[features] +baycom = no +pccom = no +max25_bcpr = yes +tmodem = no + +[daemon] +mode = standalone +hardware = tncs +device = max25e0 + +[devices] +default = max25e0 +max25e0 = max25-bcpr:bc0 + +[network] +tcp_host = 0.0.0.0 +tcp_port = 7327 +unix_socket = /var/run/max25/modem-secondary.sock +tcp_password = + +[modem] +callerid = CB-0 +callid = QST +ax25_ui = yes + +[stack] +auto_start = yes +serial_watch = no + +[device.max25e0] +kiss_link = /tmp/max25-bcpr/kiss-bc0 +max25_bcpr_ini = /usr/local/etc/max25/max25-bcpr.ini diff --git a/share/max25/max25d.freebsd.tmodem.ini.example b/share/max25/max25d.freebsd.tmodem.ini.example new file mode 100644 index 0000000..e4537e2 --- /dev/null +++ b/share/max25/max25d.freebsd.tmodem.ini.example @@ -0,0 +1,38 @@ +; max25d — FreeBSD + T-Modem-c1224 USB KISS (prototype) +; Copy: cp share/max25/max25d.freebsd.tmodem.ini.example /usr/local/etc/max25/max25d.ini +; Device: /dev/cuaU0 (callout) — adjust uhub / by-id symlink as needed. + +[features] +baycom = no +pccom = no +max25_bcpr = no +tmodem = yes + +[daemon] +mode = standalone +hardware = tncs +device = tmodem + +[devices] +default = tmodem +tmodem = /dev/cuaU0 + +[network] +tcp_host = 0.0.0.0 +tcp_port = 7325 +unix_socket = /var/run/max25/modem.sock +tcp_password = + +[modem] +callerid = CB-0 +callid = QST +ax25_ui = yes + +[stack] +auto_start = yes +serial_watch = no + +[serial.tmodem] +baud = 115200 +line = 8n1 +dtr_rts = no diff --git a/share/max25/max25d.full-station.ini.example b/share/max25/max25d.full-station.ini.example new file mode 100644 index 0000000..5a2d197 --- /dev/null +++ b/share/max25/max25d.full-station.ini.example @@ -0,0 +1,55 @@ +; DEPRECATED for new Linux sites — heterogeneous multi-id station (legacy only). +; Policy: one RF device per max25d host. Use separate Linux hosts for additional radios. +; See docs/ARCHITECTURE.md § Linux host policy — one RF device. +; +; Full heterogeneous station - TNC2C + PK-TNC2 + BayCom/based (max25e0/bcpr) + CRDOP +; Copy to /etc/max25/max25d.ini and adjust paths for your site. +; BayCom + CRDOP backends are architecturally wired; live RF may be untested. + +[daemon] +mode = standalone +hardware = tncs +device = tnc2c + +[devices] +default = tnc2c +tnc2c = /dev/ttyS4 +pktnc2 = /dev/ttyS5 +; baycom-ser12 = baycom:a ; LEGACY kernel - prefer max25e0 = max25-bcpr:bc0 +soft-crdop = crdop:default + +[network] +tcp_host = 0.0.0.0 +tcp_port = 7325 +unix_socket = /run/max25/modem.sock +tcp_password = + +[modem] +callerid = CB-0 +callid = QST +ax25_ui = yes + +[stack] +auto_start = yes + +[serial.tnc2c] +baud = 19200 +line = 8n1 +dtr_rts = yes +kiss_entry = kiss_on + +[serial.pktnc2] +baud = 9600 +line = 8n1 +dtr_rts = no +kiss_entry = auto + +[device.baycom-ser12] +kiss_link = /var/run/baycom-pr/kiss +modem = a +baycom_ini = /etc/baycom/baycom-pr.ini + +[device.soft-crdop] +host = 127.0.0.1 +port = 8515 +listen = yes diff --git a/share/max25/max25d.ini.example b/share/max25/max25d.ini.example new file mode 100644 index 0000000..fdac117 --- /dev/null +++ b/share/max25/max25d.ini.example @@ -0,0 +1,173 @@ +; MainAX25-Stack — max25d daemon (Linux only) +; Copy to /etc/max25/max25d.ini or pass MAX25D_INI= + +[features] +; PC-COM / SER12: max25-bcpr userspace (BayCom/based). Kernel baycom = legacy. +baycom = yes +pccom = yes +max25_bcpr = yes +; T-Modem-c1224 USB KISS half-TNC (Pico) — off unless stuffed +tmodem = no + +[daemon] +; Operating mode: standalone | service | hybbx-main | hybbx-cohost | hybbx-host +; HyBBX attach (release serial/KISS to hybbxd): hybbx-main | hybbx-cohost | hybbx-host +; or [hybbx] release_attach=yes on standalone +mode = standalone +; Drop to unprivileged user after stack prep (when started as root via run-max25d.sh) +; user = max25 +; group = max25 +; Default hardware when per-device hardware= is omitted +hardware = tncs +; Legacy single-device id (used when [devices] is absent) +device = tnc2c + +[devices] +; Linux host: ONE RF device per max25d (design rule). Pick one id below. +; Layout examples still under design — do not enable two backends on one host. +; Serial path, baycom:, or crdop: +default = tnc2c +tnc2c = /dev/ttyS4 +; pktnc2 = /dev/ttyS5 +; --- PC-COM / BayCom/based: max25-bcpr userspace SER12 (default product path) --- +; Uncomment ONE RF device — max25e0 for PC-COM on ttyS0 (adjust serial in max25-bcpr.ini) +; default = max25e0 +; max25e0 = max25-bcpr:bc0 +; baycom-kiss = /dev/ttyUSB0 +; pccom-kiss = /dev/ttyUSB0 +; baycom-ser12 = baycom:a ; LEGACY kernel path — avoid +; soft-crdop = crdop:default +; --- T-Modem-c1224 USB KISS half-TNC (not BayCom/based) --- +; tmodem = yes ; under [features] +; tmodem = /dev/ttyACM0 +; Acoustic bench (loopback / ALSA sniff / host daemon): +; audio-dummy = audio:loopback +; enabled = tnc2c ; optional — single id recommended + +[network] +; Terminal clients connect here (TCP). Unix socket always enabled on Linux. +tcp_host = 0.0.0.0 +tcp_port = 7325 +unix_socket = /run/max25/modem.sock +; Plain-text TCP auth for remote terminals (empty = disabled; Unix socket exempt) +tcp_password = + +[modem] +; Default IDs — terminal may override live (session scope) +callerid = CB-0 +callid = QST +; Send lines as AX.25 UI when yes (CRDOP uses native AX.25 UI display when ax25_ui=yes) +ax25_ui = yes +; Banned AX.25 source callsigns — silent RX drop (one per line in file) +; bans_file = /etc/max25/bans.txt + +[reporting] +; Client-visible error/voice telemetry in STATUS (and EVENT on decode failure). +; yes = participate in STATUS; no = always report invalid for that field. +error_transmissions = yes +voice_transmissions = yes +; Data quality: N timed passes (good/bad only; voice/noise ignored), min % good. +; Each pass lasts up to data_pass_seconds (default 20s); full cycle = 3 × 20s. +data_passes = 3 +data_quality_min = 50 +data_pass_seconds = 20 + +[stack] +; Auto-start hardware on daemon start (boot-wait / baycom-pr-ctl / crdopc per device) +auto_start = yes +; TNC serial stability: periodic probe + software recovery (power-cycle stays rescue-only) +serial_watch = yes +serial_watch_interval = 60 +serial_repair_cooldown = 20 +serial_watch_startup_grace = 45 +; max25d uses --recover-only for TNC stack prep (no power cycle on daemon start) +stack_recover_only = yes +stack_retry_interval = 120 +; After N inline repair failures (error-host), escalate to boot-wait subprocess +serial_bootwait_escalate = yes +serial_bootwait_escalate_after = 3 +serial_bootwait_escalate_cooldown = 300 + +; Software TOT (host policy for max25-bcpr / BayCom/based — not radio TOT) +; Synced into max25-bcpr.ini on stack start. Trip → stop bcpr, tot-paused, auto recover. +[tot] +enabled = yes +max_key_sec = 25 +min_gap_sec = 1.5 +max_consecutive = 3 +max_bursts = 8 +recover_sec = 300 + +; Detached operator session (CLI — not parsed from ini): +; max25d --session tmux -c /etc/max25/max25d.ini +; max25d session start --tmux +; max25d-session attach +; Env: MAX25D_SESSION=max25d MAX25D_SESSION_BACKEND=tmux|screen + +[serial] +; Legacy single-device overrides — ignored when [devices] is present. +; device = /dev/ttyS4 +; baud = 19200 +; line = 8n1 +; dtr_rts = yes +; kiss_entry = kiss_on + +[serial.tnc2c] +; Per-device serial profile (optional — defaults from stacks/tncs/tnc2c-serial.env) +; baud = 19200 +; line = 8n1 +; dtr_rts = yes +; kiss_entry = kiss_on + +[serial.pktnc2] +; pktnc2: 9600 8N1, DTR+RTS off, kiss_entry=auto +; baud = 9600 +; line = 8n1 +; dtr_rts = no +; kiss_entry = auto + +[serial.tmodem] +; T-Modem-c1224 USB CDC KISS half-TNC (not BayCom/based) +; baud = 115200 +; line = 8n1 +; dtr_rts = no + +; --- BayCom kernel (LEGACY — prefer bcpr above) --- +; baycom-ser12 = baycom:a +; [device.baycom-ser12] +; kiss_link = /var/run/baycom-pr/kiss +; modem = a +; baycom_ini = /etc/baycom/baycom-pr.ini + +; --- max25-bcpr device block (when max25e0 enabled above) --- +; [device.max25e0] +; kiss_link = /tmp/max25-bcpr/kiss-bc0 +; max25_bcpr_ini = /etc/max25/max25-bcpr.ini +; ipv4 = 127.0.0.25/8 +; ipv6 = ::25/128 +; Forks max25e0:bcN inherit ipv4/ipv6 from max25e0 unless overridden. +; Built by default (MAX25_BUILD_MAX25_BCPR=ON). See share/max25-bcpr/max25-bcpr.ini.example + +; --- HyBBX co-host / standalone attach (max25d preps, HyBBX opens KISS) --- +; [hybbx] +; release_attach = yes + +; --- USB/async BayCom KISS serial --- +; [serial.baycom-kiss] +; baud = 9600 +; line = 8n1 +; dtr_rts = no + +; --- CRDOP sound-card modem (MAX25-SoftModem) --- +; [device.soft-crdop] +; host = 127.0.0.1 +; port = 8515 +; listen = yes + +; --- Virtual IP netdev (TUN max25d0 — planned near term) --- +; Full doc: docs/NETDEV.md · interface name is always max25d0 +; [netdev] +; enabled = no +; mode = tun +; ipv4 = 127.0.0.25/8 +; ipv6 = ::25/128 diff --git a/share/max25/max25d.ini.host.example b/share/max25/max25d.ini.host.example new file mode 100644 index 0000000..fc05b9d --- /dev/null +++ b/share/max25/max25d.ini.host.example @@ -0,0 +1,95 @@ +; MainAX25-Stack — max25d Linux host (example setup) +; Copy: sudo cp share/max25/max25d.ini.host.example /etc/max25/max25d.ini +; Unified workflow: docs/PLUGINS-DEVICE-MODEL.md +; +; Example onboard-UART map (single BayCom — no dual on this layout): +; /dev/ttyS0 BayCom PC-COM (kernel-ser12) — Path B below +; /dev/ttyS4 TNC2C (packet_radio) — Path A (default) +; /dev/ttyS5 PK-TNC2 (packet_radio) — NOT BayCom +; +; Enable exactly ONE hardware path: comment out Path A [devices] when switching to B or C. + +[daemon] +mode = standalone +; Path A (default): TNC2C on ttyS4 +hardware = tncs +device = tnc2c +; Path B BayCom: hardware = modems · device = max25e0 +; Path C CRDOP: hardware = soft-modems · device = soft-crdop + +[network] +; Listen on all interfaces — remote max25-terminal over LAN +tcp_host = 0.0.0.0 +tcp_port = 7325 +; systemd RuntimeDirectory=max25 → /run/max25/modem.sock +unix_socket = /run/max25/modem.sock +; Set a password before exposing tcp_host = 0.0.0.0 on LAN +tcp_password = changeme + +[modem] +callerid = CB-0 +callid = QST +ax25_ui = yes +; Banned AX.25 source callsigns — silent RX drop (one per line in file) +; bans_file = /etc/max25/bans.txt + +[reporting] +error_transmissions = yes +voice_transmissions = yes +data_passes = 3 +data_quality_min = 50 +data_pass_seconds = 20 + +[stack] +; Starts max25-ctl stack on daemon boot (recover-only for TNC — no power cycle) +auto_start = yes +serial_watch = yes +serial_watch_interval = 60 +stack_recover_only = yes +serial_bootwait_escalate = yes +serial_bootwait_escalate_after = 3 + +; --- Path A: TNC2C (default host) --- +[devices] +default = tnc2c +tnc2c = /dev/ttyS4 + +[serial.tnc2c] +baud = 19200 +line = 8n1 +dtr_rts = yes +kiss_entry = kiss_on + +; Second TNC — not on same Linux host (use another machine): +; pktnc2 = /dev/ttyS5 +; [serial.pktnc2] +; baud = 9600 +; line = 8n1 +; dtr_rts = no +; kiss_entry = auto + +; --- Path B: BayCom PC-COM (single modem on ttyS0) --- +; Comment Path A [devices] + [serial.tnc2c] above, then uncomment: +; [devices] +; default = max25e0 +; baycom-ser12 = baycom:a +; [device.baycom-ser12] +; kiss_link = /var/run/baycom-pr/kiss +; modem = a +; baycom_ini = /etc/baycom/baycom-pr.ini +; Prep: sudo cp share/baycom/baycom-pr.pccom-ttyS0-only.ini.example /etc/baycom/baycom-pr.ini +; sudo baycom-pr-ctl -c /etc/baycom/baycom-pr.ini setup + +; --- Path C: CRDOP sound-card modem (CB profile) --- +; Comment Path A [devices] above, set [daemon] soft-modems/soft-crdop, then uncomment: +; [devices] +; default = soft-crdop +; soft-crdop = crdop:default +; [device.soft-crdop] +; host = 127.0.0.1 +; port = 8515 +; listen = yes +; Prep: cp stacks/crdop/share/crdop.ini.example ~/.config/crdop/crdop.ini (CB / 500MAX) + +; Serial env search: /etc/max25/ → local/ → share/max25/serial/ → stacks/tncs/ +; USB TNC example: tnc2c = /dev/ttyUSB0 (edit [serial.tnc2c] or tnc2c-serial.env) diff --git a/share/max25/max25d.main.ini.example b/share/max25/max25d.main.ini.example new file mode 100644 index 0000000..86dd292 --- /dev/null +++ b/share/max25/max25d.main.ini.example @@ -0,0 +1,27 @@ +; MAX25-Stack — Modular TCP/IP Servers Service — Main (central router) +; No local RF required on Main — Secondaries own CRDOP/devices. +; Typical split: Main on FreeBSD; list FreeBSD CRDOP + remote Linux Secondaries below. +; Copy: cp share/max25/max25d.main.ini.example /usr/local/etc/max25/max25d.ini + +[daemon] +mode = service +hardware = soft-modems +device = soft-crdop + +[modular_tcp] +enabled = yes +role = main +service_name = modular-tcp-server +; secondaries = 127.0.0.1:7326,linux-host.example:7327 + +[modular_tcp.secondaries] +secondary-1 = 127.0.0.1:7326 +; secondary-linux-1 = linux-host.example:7327 + +[network] +tcp_host = 0.0.0.0 +tcp_port = 7325 +unix_socket = + +[stack] +auto_start = no diff --git a/share/max25/max25d.netdev.ini.example b/share/max25/max25d.netdev.ini.example new file mode 100644 index 0000000..f8f147c --- /dev/null +++ b/share/max25/max25d.netdev.ini.example @@ -0,0 +1,12 @@ +; Defaults match [device.max25e0] ipv4/ipv6 (127.0.0.25/8, ::25/128). +; MAX25 virtual netdev (TUN) — merge into max25d.ini +; Planned: max25-tun sidecar creates interface max25d0 (fixed name) + +[netdev] +enabled = no +; interface = max25d0 ; always max25d0 — do not change +mode = tun +ipv4 = 127.0.0.25/8 +ipv6 = ::25/128 +encap = ax25-ui +m25_unix = /run/max25/modem.sock diff --git a/share/max25/max25d.secondary-linux.ini.example b/share/max25/max25d.secondary-linux.ini.example new file mode 100644 index 0000000..180e5b0 --- /dev/null +++ b/share/max25/max25d.secondary-linux.ini.example @@ -0,0 +1,46 @@ +; MAX25-Stack — Linux Secondary (hardware TNC, modular TCP/IP service) +; Use when FreeBSD hosts Main + CRDOP — this Linux host extends RF only. +; Copy: cp share/max25/max25d.secondary-linux.ini.example /etc/max25/max25d.ini +; Register instance_id + host:port in FreeBSD Main [modular_tcp.secondaries]. + +[features] +baycom = no +pccom = no + +[daemon] +mode = service +hardware = tncs +device = tnc2c + +[devices] +default = tnc2c +tnc2c = /dev/ttyS4 +; max25e0 = max25-bcpr:bc0 ; BayCom/based via bcpr +; baycom-ser12 = baycom:default ; LEGACY kernel — prefer max25e0 + +[modular_tcp] +enabled = yes +role = secondary +service_name = modular-tcp-server +instance_id = secondary-linux-1 + +[network] +tcp_host = 0.0.0.0 +tcp_port = 7327 +unix_socket = /run/max25/modem.sock + +[modem] +callerid = CB-0 +callid = QST +ax25_ui = yes + +[stack] +auto_start = yes + +; [device.baycom-ser12] ; LEGACY — prefer [device.max25e0] +kiss_link = /var/run/baycom-pr/kiss +baycom_ini = /etc/baycom/baycom-pr.ini + +; Optional TUN on Linux Secondary — interface name max25d0 only +; [netdev] +; enabled = no diff --git a/share/max25/max25d.service.example b/share/max25/max25d.service.example new file mode 100644 index 0000000..e3281fb --- /dev/null +++ b/share/max25/max25d.service.example @@ -0,0 +1,13 @@ +[Unit] +Description=MAX25 daemon (MainAX25-Stack) +After=network.target + +[Service] +Type=simple +ExecStart=/usr/local/bin/max25d -c /etc/max25/max25d.ini +Restart=on-failure +RuntimeDirectory=max25 +# Unix socket: /run/max25/modem.sock (writable when RuntimeDirectory=max25) + +[Install] +WantedBy=multi-user.target diff --git a/share/max25/max25d.tmodem.ini.example b/share/max25/max25d.tmodem.ini.example new file mode 100644 index 0000000..7302625 --- /dev/null +++ b/share/max25/max25d.tmodem.ini.example @@ -0,0 +1,38 @@ +; max25d — T-Modem-c1224 USB KISS half-TNC (prototype) +; Copy toward /etc/max25/max25d.ini or pass MAX25D_INI= +; RX before TX for any live RF test. + +[features] +baycom = no +pccom = no +max25_bcpr = no +tmodem = yes + +[daemon] +mode = standalone +hardware = tncs +device = tmodem + +[devices] +default = tmodem +tmodem = /dev/ttyACM0 + +[network] +tcp_host = 0.0.0.0 +tcp_port = 7325 +unix_socket = /run/max25/modem.sock +tcp_password = + +[modem] +callerid = CB-0 +callid = QST +ax25_ui = yes + +[stack] +auto_start = yes +serial_watch = no + +[serial.tmodem] +baud = 115200 +line = 8n1 +dtr_rts = no diff --git a/share/max25/serial/README.md b/share/max25/serial/README.md new file mode 100644 index 0000000..aa05b1c --- /dev/null +++ b/share/max25/serial/README.md @@ -0,0 +1,22 @@ +# Per-device serial env (max25d / boot-wait) + +Install copies for site-specific paths: + +```bash +sudo mkdir -p /etc/max25 +sudo cp share/max25/serial/tnc2c-serial.env.example /etc/max25/tnc2c-serial.env +# edit device path and baud +``` + +Search order (`paths.py`): `/etc/max25/` → `local/` → `share/max25/serial/` → `stacks/tncs/`. + +**Other device families** use different site config (same `[devices]` pattern in `max25d.ini`): + +| Hardware | Site config (not serial env) | +|----------|------------------------------| +| BayCom/based (`max25e0` / bcpr) | `share/baycom/baycom-pr.pccom-ttyS0-only.ini.example` → `/etc/baycom/baycom-pr.ini` | +| CRDOP (`soft-crdop`) | `stacks/crdop/share/crdop.ini.example` | + +Unified workflow: [docs/PLUGINS-DEVICE-MODEL.md](../../docs/PLUGINS-DEVICE-MODEL.md). + +Terminal client profiles (connection only): [`../clients/`](../clients/README.md). diff --git a/share/max25/serial/pccom-kiss-serial.env.example b/share/max25/serial/pccom-kiss-serial.env.example new file mode 100644 index 0000000..6fbbe00 --- /dev/null +++ b/share/max25/serial/pccom-kiss-serial.env.example @@ -0,0 +1,9 @@ +# PC-COM / USB KISS serial — copy to /etc/max25/pccom-kiss-serial.env +# Used by max25d devices pccom-kiss and baycom-kiss (kiss-raw-serial backend). +# Stable path preferred: /dev/serial/by-id/usb-... +PCCOM_KISS_DEV=/dev/ttyUSB0 +PCCOM_KISS_BAUD=9600 +PCCOM_KISS_LINE=8n1 +PCCOM_KISS_DTR_RTS=no +PCCOM_KISS_RADIO_BAUD=1200 +HYBBX_SERIAL_LINE=8n1 diff --git a/share/max25/serial/pktnc2-serial.env.example b/share/max25/serial/pktnc2-serial.env.example new file mode 100644 index 0000000..ba25cc7 --- /dev/null +++ b/share/max25/serial/pktnc2-serial.env.example @@ -0,0 +1,5 @@ +# PK-TNC2 serial — copy to /etc/max25/pktnc2-serial.env +# Example: onboard UART /dev/ttyS5 +PKTNC2_DEV=/dev/ttyS5 +PKTNC2_BAUD=9600 +PKTNC2_LINE=8n1 diff --git a/share/max25/serial/tnc2c-serial.env.example b/share/max25/serial/tnc2c-serial.env.example new file mode 100644 index 0000000..10b2576 --- /dev/null +++ b/share/max25/serial/tnc2c-serial.env.example @@ -0,0 +1,8 @@ +# TNC2C serial — copy to /etc/max25/tnc2c-serial.env +# Example: onboard UART /dev/ttyS4 +TNC2C_DEV=/dev/ttyS4 +TNC2C_BAUD=19200 +TNC2C_LINE=8n1 +TNC2C_RADIO_BAUD=2400 +TNC2C_MODEM=tcm3105 +HYBBX_SERIAL_LINE=8n1 diff --git a/share/systemd/README.md b/share/systemd/README.md new file mode 100644 index 0000000..db812b8 --- /dev/null +++ b/share/systemd/README.md @@ -0,0 +1,9 @@ +# systemd units (product) + +| Unit | Role | +|------|------| +| `max25d.service` | Product max25d (optional example) | + +Experimental orch units are **not** shipped in this freigegeben tree. + +Install example: copy to `/etc/systemd/system/`, adjust `WorkingDirectory` / `ExecStart` / `Environment` to the site PREFIX and `./local/` INI (never commit secrets). diff --git a/share/systemd/max25d.service b/share/systemd/max25d.service new file mode 100644 index 0000000..b2118a0 --- /dev/null +++ b/share/systemd/max25d.service @@ -0,0 +1,32 @@ +# max25d — example systemd unit (adjust paths to site install) +# Install: sudo cp share/systemd/max25d.service /etc/systemd/system/ +# sudo systemctl daemon-reload && sudo systemctl enable --now max25d.service +# +# Site INI — operator overrides via drop-in or EnvironmentFile under ./local/ +# (never commit secrets). + +[Unit] +Description=MAX25-Stack max25d control plane +Documentation=https://github.com/ngteq/MAX25-Stack +After=network-online.target multi-user.target +Wants=network-online.target +ConditionPathExists=/usr/local/bin/run-max25d + +[Service] +Type=simple +User=root +Group=root +WorkingDirectory=/usr/local +Environment=MAX25_INI=/etc/max25/max25d.ini +EnvironmentFile=-/etc/max25/max25d.env +ExecStart=/usr/local/bin/run-max25d -c ${MAX25_INI} +Restart=on-failure +RestartSec=5 +TimeoutStartSec=120 +KillMode=control-group +StandardOutput=journal +StandardError=journal +SyslogIdentifier=max25d + +[Install] +WantedBy=multi-user.target -- cgit v1.3.1