Record simultaneous radio2 receiver tests

This commit is contained in:
mikecarper committed 2026-10-22 10:45:11 -07:00
1 parent 2c762540ab
commit 00ff933543
4 files changed
+7110

No files matched your search

+1
View File
@@ -11,6 +11,7 @@ Completed validation reports, experiments, and test guides are collected here. O
## Radio and RF
- [V3/V4/T096 radio2 with two fixed witnesses, matched SF7/BW62.5 at preamble 32, 2026-10-22](radio2_simultaneous_receivers_2026-10-22.md)
- [SolarXiao Room Server power profiles and history build/host validation, 2026-10-21](solarxiao_room_2026-10-21.md)
- [SolarXiao three power profiles build/host validation, 2026-10-21](solarxiao_basic_2026-10-21.md)
- [SolarXiao automatic detection and Base support build/host validation, 2026-10-21](solarxiao_auto_2026-10-21.md)
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,339 @@
<!-- meshcore-hosted-doc-link:start -->
<p class="meshcore-hosted-doc-link"><a href="https://mikecarper.github.io/MeshCore/test-results/radio2_simultaneous_receivers_2026-10-22/">View this page on MeshCore Docs</a>.</p>
<!-- meshcore-hosted-doc-link:end -->
# Simultaneous radio2 receiver comparison, 2026-10-22
The matched-PHY five-receiver test **passed**: **915.000 and 916.000 MHz, both
SF7 / BW 62.5 kHz / CR4/5 (RadioLib value 5) / preamble 32**. Every applicable
packet arrived, and all six radios passed final preservation and session
checks. The preceding mixed-PHY
915/916 campaign stopped cleanly at a case boundary under user steering;
its measurements remain a separate cohort. Historical 910.525 results are
not current test frequencies and are not merged into either 915 cohort.
## Latest campaign: three scanners and two fixed witnesses
One Xiao S3 sender sent **one fresh 40-packet case**, with **20 primary and
20 secondary** packets at preamble 32. Five receivers listen to the same
physical packets concurrently. This is not separate unicast delivery to each
receiver. No earlier packet is resent or replaced by this new measurement.
| Role | Board | Source | Applicable packets per case |
| --- | --- | --- | --- |
| Scanning receiver | Heltec V3 | `9b70827d` | 20 primary + 20 secondary |
| Scanning receiver | Heltec V4.3 OLED | `9b70827d` | 20 primary + 20 secondary |
| Scanning receiver | Heltec T096 | `4773ac42` | 20 primary + 20 secondary |
| Fixed primary witness | Tag | `08650f64` | 20 primary; secondary not applicable |
| Fixed secondary witness | SenseCAP Indicator | `08650f64` | 20 secondary; primary not applicable |
| Sender | Xiao S3 WIO | `ebb59d48` | One direct TX per planned packet |
All six nodes matched their bound identity and full firmware version. The
controller rejected a recorded saved baseline other than 915.000 MHz before
opening hardware. V3 and V4 used normal firmware. The older T096 lacked the
later shared RX fixes.
Board hardware and firmware both differ, so this comparison cannot isolate
either as a cause.
Primary is **915.000 MHz / BW 62.5 kHz / SF7 / CR5**; secondary is
**916.000 MHz / BW 62.5 kHz / SF7 / CR5**, both at **preamble 32**.
Sender power is **2 dBm**. The three
scanners enable radio2; each fixed witness disables scanning and stays on its
assigned tuple. Receiver power saving and RXPS are off. All five USB receive
collectors operate concurrently. The seeded shuffled profile order uses
minimum gaps after the prior physical TX_DONE confirmation; retuning can
lengthen a gap. There are no RF retries or replacement packets.
Both profiles now have the same 2.048 ms symbol duration. Scanner-derived
visit policy and receive ownership still apply; matched SF/BW/preamble does
not assert identical measured visits or an acquisition guarantee. This new
cohort cannot be treated as another preamble-only row of the mixed-PHY test.
The migration **passed on all six radios**: saved primary readback was
915.000 MHz / BW 62.5 kHz / SF7 / CR5, and each physical-apply command returned
ACK 00. This confirms configuration acceptance, not an RF frequency
measurement. The migration explicitly saved **preamble 32**; earlier effective
32-symbol status did not distinguish saved auto from explicit 32. Channels,
credential hashes and all other compared saved settings were retained.
No test datagrams were requested by migration.
The new baseline was taken after migration. Cleanup must retain 915.000 and
must not restore 910.525 on these radios, while preserving the other compared
settings. This frequency change prevents treating earlier 910.525 data and
the new 915.000 cases as one preamble-only comparison.
Each 92-byte DEV application payload contains `MCHILGR1`, the sender public
key, a common group digest, a fresh 16-byte nonce and a global ordinal. The
digest binds all six role-ordered public keys, witness profile assignments,
the campaign nonce and exact preamble/PHY/packet plan. Keys, raw identities
and payload bytes are excluded from this report. Each ordinal requires one
local acceptance and exactly one physical direct TX, without a flood.
Receivers independently match exact application bytes, their owned local
channel slot, DEV type and direct route. Logical profile comes from the
sender ledger, not an RX-origin field in the Companion response. Queue drain,
duplicates, wrong-profile witness receipts, receiver transmissions and core
health are checked separately from application delivery.
## Latest matched-PHY results
Test: **COMPLETE, VALID, PASS**. The single RF case and all six final
preservation/session proofs passed, with no reported errors.
| Preamble | V3 P / S | V4.3 P / S | T096 P / S | Tag primary / 20 | Indicator secondary / 20 | Evidence status |
| --- | --- | --- | --- | --- | --- | --- |
| 32, both SF7/BW62.5 | 20 / 20 | 20 / 20 | 20 / 20 | 20 | 20 | Complete, valid; finite delivery PASS |
Packet labels are one-based within each profile: `P01`-`P20`, `S01`-`S20`.
All applicable missing sets are empty. Each scanner received the same 40
packets and each fixed witness received its assigned 20. The case has no
reported evidence or collection errors. All 40 requests were accepted once,
with 40 confirmed direct transmissions, zero floods and zero retries. All five
collectors completed, with zero duplicates, wrong-profile receipts or receiver
transmissions; every before/after core error flag was zero.
Every applicable pair has Jaccard 1.000. The
fixed witnesses have no common applicable frequency; their opposite-profile
entries remain not applicable, not a 40-packet expectation.
Masks use V3, V4.3, T096, Tag, Indicator order. The opposite-frequency witness
is `NA`, never a miss. Complete primary reception is `1|1|1|1|NA`; complete
secondary reception is `1|1|1|NA|1`. An owned wrong-profile witness receipt is
a confound. The observed masks are `1|1|1|1|NA` for all 20 primary packets
and `1|1|1|NA|1` for all 20 secondary packets: 40 all-applicable receptions
and no fixed-witness/scanner discrepancy. A fixed-witness receipt with a scanner miss confirms delivery at
that witness, not a cause of the scanner miss. No applicable receipt does not
prove no RF transmission. Correlated loss alone does not assign a cause.
A valid completed measurement can still fail delivery. A campaign pass
requires every applicable packet plus all evidence and preservation gates.
This finite 20-per-profile result is not a permanent-fix or zero-loss
guarantee. The preceding mixed-PHY 32-symbol case at the same 915/916 MHz had
scanner misses; this case changes the secondary SF/BW, airtime and derived
scan timing. Run time, order and ambient traffic were not controlled between
the cases. Their difference therefore does not isolate a causal setting or
explain a particular earlier missing nonce. The new packets were not retries.
## Latest completion and evidence
Migration and its original six-node saved baseline: **PASS**. All six final
readbacks retained primary 915.000 and passed preservation of the other
compared settings, permissions, leases, channels, credentials and PINs. All
six final session proofs passed. V4 MQTT reconnected with status `(ok)`;
this check did not independently prove a fresh publish acknowledgement.
No production firmware was changed. USB collection remains active, so these
rates are not a repeated measurement of earlier USB-quiet experiments.
The current controller proactively revalidates strict binary mode, public
identity, full version, core health and uptime after 45 seconds of idle time,
only outside RF. It performs final proofs on all six sessions before close
and retains outer-finally errors. These are host measurement changes, not
firmware or watchdog changes. A graceful stop marker replaces signals during
an active CLI operation.
The matched-PHY controller SHA-256 is
`187ab7de2464d1496ddee5235899d115270953e4ae38beaa1b0e1791823b0bb1`;
its comparison core SHA-256 is
`6920179844efe720542368d2ea257d94c18c8c49c063efb18a60ccf6b8204b31`.
The completed matched-PHY raw receipt SHA-256 is
`46ef6da2dabe8ba48f7acb8e8b5aec2370c8b41397787ac78020e044d50c918e`;
its sanitized export SHA-256 is
`3bcc79cc02722c8438340c5fad49b9c9c7921f2b4e8b433669e748388a04a94f`.
Machine-readable evidence is the
[matched-PHY report](radio2_simultaneous_receivers_2026-10-22.safe.json).
The separate saved-frequency migration source SHA-256 is
`a763aec8d1bd692c524f5dee773b3d1663e1eac0cc26308568e8d38153fb7cf0`.
The completed migration receipt SHA-256 is
`c523274d78c9dd3aa7511cb91ef0330866684f7f12bfc54d94967787f0d22257`;
the passed six-node baseline SHA-256 is
`bb6685fa03182395e7a697d4b7b843c023b59d7f12feebe074f2c7de76d26f78`.
## Previous 915/916 cohort: different SF/BW profiles
This cohort uses primary 915.000 / BW 62.5 / SF7 and secondary 916.000 /
BW 125 / SF9, with matched preambles varied across cases. All three executed
cases, at 32, 64 and 128 symbols, completed as valid controlled comparisons.
The user requested a graceful stop after 128; no active case was interrupted.
Preamble 256 was not run. The original four-case experiment is incomplete by
user steering, not a setup failure. Every executed case had 40 accepted and
40 confirmed direct transmissions, zero floods, retries, duplicates,
wrong-profile receipts, receiver transmissions or evidence errors. All five
collectors completed and all before/after core error flags were zero.
| Preamble | V3 P / S | V4.3 P / S | T096 P / S | Tag primary / 20 | Indicator secondary / 20 | Evidence status |
| --- | --- | --- | --- | --- | --- | --- |
| 32 | 19 / 20 | 20 / 20 | 20 / 18 | 20 | 20 | Valid; scanner delivery FAIL |
| 64 | 20 / 20 | 20 / 20 | 20 / 20 | 20 | 20 | Valid; all applicable delivery PASS |
| 128 | 20 / 20 | 20 / 20 | 20 / 20 | 20 | 20 | Valid; all applicable delivery PASS |
| 256 | NOT RUN | NOT RUN | NOT RUN | NOT RUN | NOT RUN | Skipped by user steering |
Packet labels are one-based within each profile: `P01`-`P20`, `S01`-`S20`.
At 32, V3 missed **P04** and T096 missed **S02 and S15**;
V4.3 received all 40. Both witnesses received all 20 applicable packets.
Thus each of the three scanner misses had a same-packet fixed-witness
receipt. This proves delivery at that witness, not a cause of the scanner
miss. All applicable receivers received the other 37 packets.
At both 64 and 128, all three scanners received 40/40 and both witnesses received their
20/20 applicable packets. There was no extraneous receiver TX or core/evidence
error. This is a finite sample pass, not proof of a permanent fix or a
guarantee that longer preambles prevent loss.
Masks use role order V3, V4.3, T096, Tag, Indicator, with `NA` for the opposite
frequency witness. For example, complete primary reception is
`1|1|1|1|NA`; complete secondary reception is `1|1|1|NA|1`. `NA` is never a
miss. An owned wrong-profile witness receipt is retained as a confound.
| Preamble | Applicable reception mask | Packet count |
| --- | --- | --- |
| 32 | `1\|1\|1\|1\|NA` | 19 primary |
| 32 | `0\|1\|1\|1\|NA` | 1 primary |
| 32 | `1\|1\|1\|NA\|1` | 18 secondary |
| 32 | `1\|1\|0\|NA\|1` | 2 secondary |
| 64 | `1\|1\|1\|1\|NA` | 20 primary |
| 64 | `1\|1\|1\|NA\|1` | 20 secondary |
| 128 | `1\|1\|1\|1\|NA` | 20 primary |
| 128 | `1\|1\|1\|NA\|1` | 20 secondary |
The 32-symbol witness classifications are 37 all-applicable receptions and
three fixed-witness-received/scanner-missed packets: P04 at V3, S02 and S15
at T096. At both 64 and 128 they are 40 all-applicable receptions. The fixed
witnesses missed no applicable packets in any executed case. The 256-symbol
case was not run.
| Same-packet observation | Supported interpretation |
| --- | --- |
| Fixed witness receives; scanner misses | Delivered at that witness; scanner missed the same packet |
| All applicable receivers receive | Exact shared application delivery to those receivers |
| Scanner receives; fixed witness misses | Witness missed a packet received elsewhere |
| No applicable receiver receives | No local receipt; does not prove no RF transmission |
| Opposite-frequency witness receives | Confound requiring investigation; not clean applicable delivery |
The raw and sanitized closed receipts agree on these counts. Correlated loss
alone does not assign a receive-path cause.
A valid completed measurement can still fail delivery. A campaign pass
requires all applicable packets and all evidence/restoration gates.
Changing the matched preamble also changes the scanner's derived primary
visit duration. At these tuples the primary symbol is 2.048 ms and the
secondary symbol is 4.096 ms. The nominal idle primary visit is the larger of 9.421 ms and
`2.048 * preamble - 18.842 - 2 * guarded_switch_ms`; secondary visit is
18.842 ms. This is a **preamble-plus-derived-dwell comparison**, not an
isolated preamble-only experiment. The actual guarded switch term remains
part of the per-board runtime timing state (`RadioProfiles::listenUs`).
Actual visits can be extended by receive ownership; the formula is not a
timestamped account of an individual packet's reception or miss.
The mixed-PHY private controller/core SHA-256 digests are
`e092276f44f06d714c49befc78ae6a9738efe3cc369ede4a0b4fbe731794455b`
and `3c002da26512ba9324e491adb7fa8595944e921ee5bd841cec6fe8271ab5a504`.
All six nodes' restoration and final session proofs **passed**, with no
reported errors. The planned-four-case aggregate completion/validity fields
remain false because 256 was skipped; each of the three executed cases has
its own completed/valid flags true. The raw receipt SHA-256 is
`5d120a579863ffaf8ba9c29d7463f2d546e82a0ffdd012f599b0208e9908f00a`;
its sanitized export SHA-256 is
`d03d8f65bc974d56c8c49fdddcdd988496b7eca29f5bc401a7ce1196bf00036e`.
Machine-readable evidence is the separate
[mixed-PHY report](radio2_simultaneous_mixed_phy_2026-10-22.safe.json).
## Appendix: earlier three-receiver measurements
These historical runs used V3/V4 `9b70827d`, T096 `4773ac42` and sender
`ebb59d48`, with the old primary **910.525 MHz / BW 62.5 kHz / SF7 / CR5**
and secondary **916.000 MHz / BW 125 kHz / SF9 / CR5**. They used 2 dBm,
matched preambles, power saving/RXPS off and three active USB collectors.
Every scanner case below sent 40 distinct packets once. These are not results
for the new 915.000 MHz primary.
| Preamble | V3 P / S | V4.3 P / S | T096 P / S | Shared scanner masks |
| --- | --- | --- | --- | --- |
| 32 | 16 / 18 | 16 / 18 | 16 / 18 | 000=5, 001=1, 110=1, 111=33 |
| 64 | 20 / 16 | 20 / 16 | 20 / 16 | 000=4, 111=36 |
| 128 | 20 / 16 | 20 / 16 | 20 / 15 | 000=4, 110=1, 111=35 |
| 256 | NOT RUN | NOT RUN | NOT RUN | User-directed stop before RF |
These three-bit masks use V3, V4.3, T096 order; omitted masks have zero count.
All three measured cases were valid controlled comparisons with failed
all-packets delivery. Scanner receipt sets and misses are retained:
- Preamble 32: V3/V4 missed P08, P09, P14, P15 and S15, S19. T096 missed
P08, P09, P14, P17 and S15, S19. The five common misses were P08, P09,
P14, S15, S19. 33 packets were received by all three scanners, and 35 by
at least one.
- Preamble 64: all three missed S01, S07, S10, S12; all primary packets arrived.
- Preamble 128: V3/V4 missed S05, S06, S14, S19. T096 also missed S17.
All primary packets arrived.
V3/V4 receive sets matched exactly in each earlier case. At preamble 32,
their Jaccard with T096 was 15/17 primary, 18/18 secondary and 33/35 overall.
At 64 all pairs had Jaccard 1. At 128 their Jaccard with T096 was 20/20
primary, 15/16 secondary and 35/36 overall. Empty-union Jaccard is undefined.
These correlations do not establish a loss cause or a preamble remedy.
The preamble-32 window lasted 130.650 seconds. All collectors drained,
reported zero duplicates and core flags 0; no receiver transmitted. Physical
RX deltas were V3 117, V4.3 112, T096 113, each including 34 owned packets;
other RX deltas were 83, 78 and 79, with RX error deltas 1, 3 and 1. These
background totals do not identify why a particular nonce was missed.
The fresh fixed-secondary control delivered **20/20 to all three**, with
zero duplicates, errors or receiver transmissions, over 65.075 seconds.
The later fresh fixed-primary follow-up also delivered 20/20 to all three
with no duplicates and complete drains, but an unaccounted T096 flood TX
made that controlled comparison **INVALID**, not a clean control pass.
Neither control resent a scanner packet or erased its misses.
## Appendix: failed attempts and restoration history
- The preamble-32/fixed-secondary attempt retained a sender cleanup failure:
restoring the original 22 dBm was rejected as radio busy, leaving test power
2 dBm. All receivers restored and V4 MQTT status recovered. The subsequent
fixed-primary follow-up restored all original settings, including sender
22 dBm; that later preservation pass does not erase the failed cleanup.
- The first longer-preamble setup stopped at T096 RXPS-off's exact radio-busy
rejection under a five-second/ten-attempt configuration bound. It sent zero
RF and restored all settings. A new attempt changed only safe exact-busy
configuration retry to 30 seconds/40 attempts; no RF resend was introduced.
- After the 64/128 measurements, the user-directed stop before 256 interrupted
a CLI operation and original cleanup failed to clear the owned V3 channel.
A separate fresh session verified its exact owned name/key digest, cleared
only that record and proved full settings, channels, PIN and credentials
preserved, without RF. The original cleanup failure remains retained.
- Initial RAK4631 witness inventory failed binary framing before identity
qualification. Its failed baseline was retained; the qualified Tag replaced
it in the five-receiver plan.
- The first five-receiver setup sent zero RF: V3 timed out on the first
radio2-off setter after 85.74 seconds since prior I/O. V3's watch getter was
unsupported, so the cause is **UNRESOLVED**, not confirmed idle expiry.
All six nodes restored successfully. A separate final session-exit 4 KiB
tail guard then failed; that failure is also retained.
- The next five-receiver attempt was stopped immediately when the user
prohibited 910.525 MHz. It is **PARTIAL**, not a completed four-case result.
It made **25 physical transmissions**; this is not a 40-packet completed
case, and unsent packets must not be reported as receive misses. All five
receivers restored, but the sender cleanup failed because of framing.
Detailed partial receive sets are retained privately and are excluded from
the completed matched-PHY result.
No result is transferred from it into the new 915.000 matrix. The following
migration recovered the interrupted state and passed preservation of the
compared settings, with the intentional saved 915.000/32-symbol setting.
The stopped old-frequency five-receiver attempt's private controller/core
SHA-256 digests were
`7e3dba8ca3c3387e601111714f46741bdd933b6f041f8213aadad8eef69d3cc1`
and `ba0a116f90a17825d1718aef9e4138a27002fdd2ff2127be46815280245ceab2`.
Private failed/measured receipt SHA-256 digests, without raw identifiers:
| Receipt | SHA-256 |
| --- | --- |
| Preamble 32 and fixed-secondary | `c5e7cec34c376c718e936f4a86b21b197bbb2dc4b02dbdc7e079617f2d229511` |
| Fixed-primary original failed comparison | `ffe5a65c17df98b444eb690f9208090637724dc7906b2fb97aedc5f2bc63ee44` |
| First five-receiver setup, zero RF | `b3613de719584be3c033c31a8a973c30c88e22146d9060293aa1ec7fb574a1c9` |
| Stopped old-frequency five-receiver partial, 25 TX | `87026d5c9938ae855983f529906aca09bafa9975e01ce0176d9eef82391eed2f` |
Other detailed earlier attempt/recovery records are retained privately.
Earlier failures and causal limits also remain in the
[ESP32 BLE, radio2 and sleep report](esp32_ble_radio2_sleep_2026-10-21.md).
File diff suppressed because it is too large. Load diff