blob: 53b1f930e4dc8537f6f5eb36793538f7bcf6b211 (
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
|
# CRDOP FEC and duplex — implementation spec
**Principle:** *Send more often with shorter frames rather than one long payload.*
**Related:** [ROADMAP.md](../ROADMAP.md) FEC section · [docs/CRDOP.md](../../../docs/CRDOP.md)
**Status:** MAX25-Stack **v1.0.0** / dev track `CUR999` — L1 optional FEC **planned**; operator-layer strategy **active now**.
---
## Layer model
| Layer | Mechanism | v1.0.0 |
|-------|-----------|--------|
| **L3 Application** | Short beacons, staggered intervals | HyBBX / `max25d.ini` |
| **L2 AX.25** | UI = no ARQ; I-frames optional ARQ via host | `ax25_codec.py` |
| **L1 Modem** | CRC-16-CCITT mandatory; optional repeat/FEC blocks | `hdlc_codec.py` — CRC done |
| **PHY** | Bell 202 AFSK (P0) | `afsk_*` |
---
## Half-duplex (CB default)
| Parameter | Value | INI / host |
|-----------|-------|------------|
| Duplex | half | `[modem] duplex = half` |
| CSMA persist | 255 | KISS `0x02` / CB profile |
| Extra TX delay | 150 ms class | `extra_delay_ms` / `EXTRADELAY` |
| Max UI info | **≤128 bytes** recommended | Application |
| PTT | explicit | No VOX on CB |
### Retransmission strategy (no L2 ARQ on UI)
1. Prefer **N small identical beacons** over one large burst.
2. Stagger dual-radio sites (`ax25_auto_interval` + offset).
3. Optional L1: **2–3 repeats** of same short codeword vs one RS block >256 B.
---
## Full-duplex
| Parameter | Value |
|-----------|-------|
| `duplex` | `full` |
| `EXTRADELAY` | `0` |
| FEC | Stronger codes allowed when bandwidth permits |
| Audio | Full-duplex sound card; echo control required |
---
## Reference protocols (not on-air targets)
| Protocol | Lesson for CRDOP |
|----------|------------------|
| **FX.25** | RS wrapper around AX.25; bit-stuffing hurts naive FEC |
| **IL2P** | No bit-stuffing; packet-sync scramble — reference for future L2 |
| **VARA DSP** | Multi-stage FEC — PHY reference only |
---
## Planned L1 FEC (post P0 on-air)
| Requirement | Target |
|-------------|--------|
| Block size | ≤64 B payload + CRC per repeat unit |
| Latency | <300 ms added on 1200 bd half-duplex |
| Compatibility | Plain AX.25 receivers must not break (FX.25-style optional path) |
| Test | AWGN + FM clip simulator before on-air |
### INI keys (future)
```ini
[fec]
enabled = no # default off v1.0.0
repeat_count = 0 # 0 = no repeat; 2–3 for CB marginal
profile = half # half | full
```
---
## CB 1200 parameters (normative operator)
| Parameter | Value |
|-----------|-------|
| Baud | 1200 |
| Modulation | Bell 202 (1200/2200 Hz) |
| Frame | AX.25 UI |
| persist | 255 |
| Beacon | 300 s + stagger (site INI) |
---
## Implementation checklist
- [x] CRC-16 in `hdlc_codec.py`
- [x] Duplex INI keys in `crdop.ini.example`
- [ ] `fec.enabled` INI + launcher
- [ ] Offline BER vs frame-length simulator
- [ ] Document measured CB SNR thresholds (field)
|