Correct Morse human spacing and harden speed qualification
Run Unit Tests / nrf52-companion-smoke (push) Canceled after 0s
Run Unit Tests / nrf52-sensor-smoke (push) Canceled after 0s
Run Unit Tests / esp32-sensor-smoke (push) Canceled after 0s
Run Unit Tests / management-reports (push) Canceled after 0s
Run Unit Tests / stm32-companion-smoke (push) Canceled after 0s
Run Unit Tests / bootloader-version (push) Canceled after 0s
Run Unit Tests / test (push) Canceled after 0s
Run Unit Tests / hosted-doc-links (push) Canceled after 0s
Build and deploy Docs site to GitHub Pages / github-pages (push) Canceled after 0s

This commit is contained in:
mikecarper committed 2026-10-13 05:25:07 -07:00
1 parent 378925638b
commit af08c02a00
23 files changed
+1194 -34

No files matched your search

@@ -166,3 +166,195 @@ remain in progress. Default 25 WPM, public ceiling 60 WPM, radio bandwidth,
and shipping RF filtering have not been changed. Packet control stays at
909.5 MHz / 500 kHz / SF5 / CR5; CW remains separate at 902.100 MHz by default.
Raw results remain in `out/morse-rx/` and the Pi run directory above.
## Controlled speed and human-timing follow-up
These are **conditional laboratory results**, not a promise of error-free
reception on every board or with automatic noise detection. CW stayed at
902.100 MHz, packet control at 909.5 MHz / 500 kHz / SF5 / CR5, and requested
chip TX power at -9 dBm. The Pocket / RAK pair used a volatile **HIL-only
-80 dBm receive floor** against strong received tones. Shipping images do not
contain this receive-floor setting. Earlier automatic-threshold quiet controls
produced false characters on the Pocket and T096; that remains a separate
qualification limitation.
The original 2.25 / 5.5-dot letter / word boundaries failed ordinary uneven
timing even at 25 WPM. With seeded +/-20% phase jitter, gradual -10% duration
drift, and **no extra letter or word spacing**, the first sweep passed only
2/6 messages at each of 25, 60 and 120 WPM. A short, fully retained RF trace
decoded `VW MN DOG` as `VW MNDOG` in all six directions/rate combinations.
All 20 expected marks remained present; the second word gap measured
246 / 246 ms at 25 WPM, 100 / 102 ms at 60, and 54 / 52 ms at 120. The old
word thresholds were 264, 110 and 55 ms respectively.
The receiver now uses the ordinary **2 / 5-dot gap midpoints**, without changing
mark classification, RX allocation, RF filtering or the public speed limit.
The same tight human-timing profile (seed 6789), with two repetitions of all
three mixed alphabet/digit, word and punctuation messages in both directions,
then passed strictly:
| Requested WPM | Pocket to RAK | RAK to Pocket | Total exact messages |
| --- | --- | --- | --- |
| 25 | 6/6 | 6/6 | 12/12 |
| 60 | 6/6 | 6/6 | 12/12 |
| 120 | 6/6 | 6/6 | 12/12 |
Only leading/trailing capture whitespace is removed in the physical harness;
extra internal spaces, noise characters, missing letters and `?` fail the test.
There were no cleanup errors. This establishes zero observed errors in those
36 messages under the stated laboratory conditions, not universal 100%
reliability or a 120-WPM release qualification.
The production-equivalent RF comparison uses cold-XOSC TX, 3400-us PA ramp,
RSSI window 0, two-ms sampling and ordinary OFF debounce. Compile guards and
actual PlatformIO/SCons flag tests prevent faster experimental settings or a
different receiver clock from being mislabeled as shipping RF behavior.
The lab maximum override and diagnostics still make these HIL applications,
not release images.
Requested WPM is not measured RF pace. Four strict 13-word `PARIS` trials per
rate transmitted 643 dot units, omitting the unsent final seven-unit word gap:
| Requested WPM | Host-observed duration | PARIS-equivalent pace |
| --- | --- | --- |
| 60 | 14.354-14.365 seconds | 53.7 WPM |
| 120 | 7.937-7.940 seconds | 97.2 WPM |
The pace includes CLI response and polling overhead; it is not an oscilloscope
measurement of RF edges. It also does not substitute for varied-text testing.
Latest focused verification passed 129/129 test methods. The actual HIL
scheduler / decoder matrix has 175 exact results plus one explicitly
unsupported 240-WPM / two-ms-sampling / 50%-extended-spacing case. The separate
human envelope matrix has 84 exact results plus 14 explicitly unsupported
doubled-character-spacing cases. Unsupported transcripts remain checked and
visible; they are not normalized or counted as exact-decoding passes.
Former-threshold negative controls reproduce the tight-gap failure. The
production receiver remains 4168 bytes, and compact STM32 still links at
228868/229376 flash bytes with its unchanged feature boundary.
Evidence filenames in the directories above:
- `squelch80-production-rf-human-tight-20261013.json` (before gap correction)
- `production-tight-gap-trace-20261013.json` (complete short RF traces)
- `production-tight-gap-fixed-repeat-20261013.json` (36/36 corrected messages)
- `production-pace-baseline-20261013.json` (host-inclusive PARIS pace)
The tested application-only gap-correction packages were:
| Package | SHA-256 |
| --- | --- |
| `RAK_4631_companion_radio_usb-prod-rf-gap-20261013.zip` | `26cc93db4f6a602e24a35828cca79efaef002b13b18192fe763eb5426515ec6b` |
| `Mesh_pocket_companion_radio_usb-prod-rf-gap-20261013.zip` | `9d1f76c1cc42e1d30ca5daa3d30fe30232d426d72b80278cac67d2d98c21a178` |
The T096's earlier image and measurements do not qualify its speed under this
new gap correction. No LR1110 or SX127x physical speed limit is established by
the SX1262 pair. Default 25 WPM and the public 60-WPM ceiling remain unchanged.
The next faster **production-RF** timing buckets did not meet the zero-error
criterion, even with the same HIL receive floor:
| Requested WPM | Standard timing | Tight human timing, two repeats |
| --- | --- | --- |
| 130 | 5/6 | 11/12 |
| 150 | 2/6 | 6/12 |
| 170 | 0/6 | Not repeated in this corrected sweep |
| 200 | 0/6 | Not repeated in this corrected sweep |
At 130 and 150 some failures affected the initial short mark; 150 also had
later body errors. The first RF mark currently begins before the command
reply and the remaining foreground-loop work. That is a possible delay window,
not a measured explanation of all these errors. No unproved transmitter or
mark-classifier adjustment was made to improve the reported score.
Additional boundary evidence:
- `production-gap-fixed-standard-boundary-20261013.json`
- `production-gap-fixed-human-boundary-20261013.json`
A second human-style pattern, using +/-20% jitter, gradual **+10% duration
drift** (slowing down), no extra gaps and seed 12345, passed another 6/6 mixed
messages at each of 25, 60 and 120 WPM in both directions. Across the corrected
speeding-up and slowing-down profiles, that is 18/18 messages at each rate,
54/54 overall, under the same controlled receive threshold.
The subsequent 30-second **automatic-threshold**, no-intentional-TX control
was not clean overall: the RAK captured `E E `, while the Pocket was empty.
This is evidence against an unconditional production zero-error claim; it is
not a diagnosis of the source of the quiet RSSI excursions. The current
shipping speed ceiling remains unchanged.
- `production-gap-fixed-human-slowing-20261013.json`
- `production-gap-fixed-auto-quiet-20261013.json`
Short, fully retained two-second initial-window traces sharpen the initial-mark
finding. At 130 WPM, the failed first `E` measured 18 ms, exactly twice the
nominal nine-ms unit; a successful first `E` measured 16 ms. At 150, the
corresponding failed/successful widths were 16/14 ms against an eight-ms unit.
Those widths were also common among later dots, so these recordings do **not**
show an unusually long first mark. The later learned units were 11/10 ms,
making comparable later dots classify correctly. Two-ms sample phase and the
initial untrained threshold can therefore matter near this boundary. The
trace has no transmitter deadline timestamps and does not prove that CLI work
caused the errors. These partial diagnostic captures are not complete-message
qualification failures or passes.
- `production-initial-mark-trace-20261013.json`
## Faster experimental RF comparison
The corrected fast SX1262 HIL applications use warm-XOSC TX, an 800-us PA
ramp, RSSI window 2, one-ms sampling and the experimental short OFF-confirmation
minimum. These are **not shipping RF settings**. The same -80 dBm HIL receive
floor and exact-message checks were used on the same Pocket / RAK pair.
| Requested WPM | Standard timing, two repeats | Tight human timing |
| --- | --- | --- |
| 120 | Previously all-pass; not repeated in this boundary sweep | 6/6 |
| 150 | Not tested in this boundary sweep | 5/6 |
| 200 | 12/12 | 3/6 |
| 255 | 10/12 | Not tested in this boundary sweep |
The tight human profile is again +/-20% jitter, -10% duration drift, no
added letter/word spacing and seed 6789. At 150, `DOG` became `DKG` in one
direction. At 200, three messages had real body or punctuation errors.
The shortest timing bucket therefore does not qualify as zero-error, and
neither does the higher uneven-keying speed. Integer rounding maps requested
219-255 WPM to the same five-ms dot, so 255 is not 255 measured WPM.
The fast steady-PARIS pace check gives:
| Requested WPM | Host-observed duration | PARIS-equivalent pace | Exact PARIS messages |
| --- | --- | --- | --- |
| 120 | 6.868 seconds | 112.3 WPM | 2/2 |
| 200 | 4.273-4.277 seconds | 180.5 WPM | 2/2 |
| 255 | 3.669 seconds | 210.3 WPM | 1/2 |
The failed 255 PARIS capture contained `PANIS` in place of one `PARIS`.
These rates include the same host/CLI overhead as the production-equivalent
pace measurement; pace is calculated only for the 643-unit PARIS payload,
not by applying that reference count to the other test messages.
The strongest observed all-pass points are therefore **200 requested WPM
for machine timing on the fast HIL pair**, and **120 requested WPM for the
tested uneven timing**. Their steady-PARIS references are approximately
181 and 112 WPM respectively. With production-equivalent RF timing, the
tested uneven-timing reference is approximately 97 WPM. None of these
conditional limits resolves the automatic-threshold quiet-control failure
or qualifies another board/radio family. Shipping defaults remain unchanged.
- `fast-gap-fixed-standard-max-20261013.json`
- `fast-gap-fixed-human-boundary-20261013.json`
- `fast-gap-fixed-pace-20261013.json`
| Fast HIL package | SHA-256 |
| --- | --- |
| `RAK_4631_companion_radio_usb-fast-gap-20261013.zip` | `7722ca7a0008c660217535c19e9dd17d5923fc90510f9850b2ce188a6d753951` |
| `Mesh_pocket_companion_radio_usb-fast-gap-20261013.zip` | `8d153c544f19e01d45e178105b704840f855a53cb8fda2044ba102cb19b85521` |
Final cleanup confirmed both selected radios had Morse stopped, configured
25 WPM / 902.100 MHz, default HIL timing and automatic squelch restored.
Their saved primary settings still held an earlier 919.5-MHz lab tuple; those
two test devices were explicitly changed to **909.5 / 500 / SF5 / CR5**, and
that tuple was also confirmed live. No service radio was changed. The pair
remains on the identified fast HIL applications, not shipping images.