summaryrefslogtreecommitdiff
path: root/docs/MAX25-OPERATOR-RUNBOOK.md
blob: dd53b24c96420dac1977c6b5f7622c4a1ff03dfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# Operator runbook · MAX25-Stack

Day-to-day operator procedures for max25d and RF backends.

Public mark for SER12/PC-COM class: **BayCom/based**. Product path: **max25-bcpr** (available · default build ON). Never **Konverter** / **converter**.

## Canonical paths

| Component | Path / command |
|-----------|----------------|
| Daemon | **`./scripts/run-max25d.sh`** · `stacks/daemon/max25d` · `/usr/local/bin/max25d` |
| Terminal | **`./scripts/run-max25-terminal.sh`** · `/usr/local/bin/max25-terminal` · `build*/bin/…` |
| max25-bcpr-ctl | `stacks/max25-bcpr/tools/max25-bcpr-ctl` or `/usr/local/sbin/max25-bcpr-ctl` |
| TX/RX test | `scripts/tx-rx-test.sh` |
| Site INI | `/etc/max25/max25d.ini` · `/etc/max25/max25-bcpr.ini` |
| Tree INI | `local/max25d.ini` (gitignored) |
| KISS PTY | `/tmp/max25-bcpr/kiss-bc0` (from bcpr.ini `kiss_link`) |
| Unix sock | `/run/max25/modem.sock` |

**Never** `stacks/daemon/max25-terminal` (does not exist).  
**Never** trust a leftover ELF at `stacks/terminal/max25-terminal` — use the launcher or PATH (`--help` must list `-d, --device`).

## Daily workflow (BayCom/based · bcpr)

```bash
cd /home/akb/Code/10-PROJECTS/MAX25-Stack   # or your clone

# 1) daemon (owns max25-bcprd when auto_start=yes) — needs socket dir
sudo mkdir -p /run/max25
sudo ./scripts/run-max25d.sh                 # uses local/max25d.ini or /etc/max25/max25d.ini
# wait for: raw KISS open /tmp/max25-bcpr/kiss-bc0

# 2) terminal (checks socket; picks binary with -d)
./scripts/run-max25-terminal.sh -U /run/max25/modem.sock
# CONNECT (F10→6) → SEND …
```

`connect failed` ⇒ max25d not running (no `/run/max25/modem.sock`). Start step 1 first.

Manual bcpr (only when debugging without max25d):

```bash
sudo ./stacks/max25-bcpr/tools/max25-bcpr-ctl -c /etc/max25/max25-bcpr.ini preflight
sudo ./stacks/max25-bcpr/tools/max25-bcpr-ctl -c /etc/max25/max25-bcpr.ini start
sudo ./stacks/max25-bcpr/tools/max25-bcpr-ctl -c /etc/max25/max25-bcpr.ini status
```

## Device start matrix

| Device | Command |
|--------|---------|
| TNC2C | `max25-ctl start --hardware tncs --device tnc2c` |
| BayCom/based | max25d `[features] max25_bcpr=yes` · device `max25e0` — see [BAYCOM.md](BAYCOM.md) |
| CRDOP | `max25-ctl start --hardware soft-modems --device soft-crdop` |

## TX prove-out

| Path | Command |
|------|---------|
| Unified | `sudo ./scripts/tx-rx-test.sh --device modem --live --tx --tx-seconds 3 -c /etc/max25/max25-bcpr.ini` |
| max25-bcpr smoke | `sudo ./stacks/max25-bcpr/tools/max25-bcpr-ctl -c /etc/max25/max25-bcpr.ini smoke --live --tx --tx-seconds 3` |
| Terminal | `./scripts/run-max25-terminal.sh -U /run/max25/modem.sock` → CONNECT → SEND |

Details: [TX-RX-TEST.md](TX-RX-TEST.md).

### TX path matrix (Zentralnerv)

| Trigger | Host MCR (~3s) | Notes |
|---------|----------------|-------|
| Long KISS → `/tmp/max25-bcpr/kiss-bc0` (info ≈376B, slave held open) | Yes | Proven RF when LED/wattmeter watched |
| `max25-bcpr-rxtx-smoke` / `tx-rx-test` L4 `--tx --tx-seconds 3` | Yes | Requires MCR `0xe`/`0xf` for PASS |
| max25d unix/terminal `SEND` | Yes (shorter if payload ≤256B ≈2.2s) | Keep PTY open (max25d); do not recycle max25-bcprd outside max25d |
| open/write/**close** KISS without hold | No / intermittent | POLLHUP race — fixed in max25-bcprd (POLLIN before HUP) |
| Stale max25d FD after external max25-bcprd restart | No | Restart **max25d** only |

Operator RF evidence (optional, not CI): radio **TX/PTT LED** + **external** wattmeter needle.

**2026-07-19:** Operator confirmed RF on AX25WRK1 (TX LED / external wattmeter) during live prove-out.

## Recovery matrix

| Situation | First action |
|-----------|--------------|
| Echo-only TNC | `tnc2c-host-reset.sh` or serial watch |
| After crash | boot-wait escalate if enabled |
| Cold boot no `cmd:` | `tnc2c-boot-wait.sh` with DTR before power-on |
| Power cycle | rescue fallback only |
| Stale max25-bcpr KISS | restart **max25d** only (do not recycle max25-bcprd outside max25d) |

## Status matrix

| Check | Command |
|-------|---------|
| Daemon | `max25-ctl status` / `ss -ltn \| grep 7325` |
| max25-bcpr | `sudo max25-bcpr-ctl -c /etc/max25/max25-bcpr.ini status` |
| Logs | max25d stdout / site log path |

## Related

| Goal | Doc |
|------|-----|
| Linux setup | [LINUX-HOST-SETUP.md](LINUX-HOST-SETUP.md) |
| Terminal | [MAX25-TERMINAL.md](MAX25-TERMINAL.md) |
| BayCom/based | [BAYCOM.md](BAYCOM.md) |
| TNC recovery | `stacks/tncs/docs/TNC-RECOVERY.md` |
git clone -b <branch> https://cgit.mode42.com/<repo>.git
git clone -b <branch> git://cgit.mode42.com/<repo>.git

info@mode42.com