diff --git a/docs/solarxiao_power.md b/docs/solarxiao_power.md index e1549fa69..3ab6d3b21 100644 --- a/docs/solarxiao_power.md +++ b/docs/solarxiao_power.md @@ -141,7 +141,8 @@ A remotely deployed node must first receive compatible firmware before these commands can be used. Deployment still requires its installed target and bootloader compatibility to be checked when it is reachable. -See the [three-profile build and host validation](test-results/solarxiao_basic_2026-10-21.md). +See the [Room Server and late-detection history validation](test-results/solarxiao_room_2026-10-21.md) +and [three-profile validation](test-results/solarxiao_basic_2026-10-21.md). This adds no measurements beyond existing self voltage/MCU temperature and has not been installed on the remote Advanced board. diff --git a/docs/test-results/index.md b/docs/test-results/index.md index 5d8dc297e..316d5499c 100644 --- a/docs/test-results/index.md +++ b/docs/test-results/index.md @@ -11,6 +11,7 @@ Completed validation reports, experiments, and test guides are collected here. O ## Radio and RF +- [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) - [SolarXiao Advanced carrier profile build/host validation, 2026-10-21](solarxiao_advanced_2026-10-21.md) diff --git a/docs/test-results/solarxiao_room_2026-10-21.md b/docs/test-results/solarxiao_room_2026-10-21.md new file mode 100644 index 000000000..844f9f018 --- /dev/null +++ b/docs/test-results/solarxiao_room_2026-10-21.md @@ -0,0 +1,90 @@ +# SolarXiao Room Server power profiles and history, 2026-10-21 + +The canonical SolarXiao QSPI OTA Room Server builds now initialize and service +the native power interface. Both 30S and 33S support the same `auto`, `basic` +and `mppt` profiles as Repeater, including saved overrides, native telemetry +and authenticated administrator commands. Basic still supplies only existing +XIAO battery voltage and MCU temperature; no Base/Advanced measurements were +invented. + +The earlier size failure used a legacy plain Room recipe. This run qualifies +the existing `solarxiao_30S_room_server_lora_ota` and +`solarxiao_33S_room_server_lora_ota` recipes with Full and Reduced sensors. +Both fit the unchanged 757,760-byte OTAFIX application region. No features, +client capacities or flash reservations were reduced to make them fit. +Plain Room compatibility/recovery targets remain separate and unchanged. + +## Qualified source and artifacts + +Source: +[`1d2fb6a1b471f2984a5a4133854cad4b52150337`](https://github.com/mikecarper/MeshCore/commit/1d2fb6a1b471f2984a5a4133854cad4b52150337). +Version: `v1.18.0.1-halo-keymind-cascade-dev-1d2fb6a1`. + +| Target | Profile | Application bytes | EndF body hash | +| --- | --- | --- | --- | +| `solarxiao_33S_room_server_lora_ota` | Full | 524,424 | `761289FD9CEFE79B` | +| `solarxiao_33S_room_server_lora_ota` | Reduced | 494,888 | `9CA04F37C960797A` | +| `solarxiao_30S_room_server_lora_ota` | Full | 524,424 | `AB4F7D7F85872201` | +| `solarxiao_30S_room_server_lora_ota` | Reduced | 494,888 | `FBD9FAA560F5D0CE` | +| `solarxiao_33S_repeater` | Full regression | 598,824 | `DEB7475A4B4B0BBC` | +| `solarxiao_33S_repeater` | Reduced regression | 568,828 | `8CDBFB5FA2615124` | + +All six builds passed DFU/UF2, linked capability and runtime-memory +qualification. Room Full/Reduced have 156,352/157,984 internal bytes available +against 65,280 required; Repeater has 150,576/152,224 against 82,752 required. +The model now explicitly reserves 5,792 bytes for capped I2C voltage history +and allocator overhead, retaining the previous general sensor allowance. + +Independent package checks verified application version, body length/hash, +artifact hashes, three power modes, native power marker and self/history +responses. Room packages also contain persistent Room history and board +commands. The linked Room code retains posting, access control, mailbox, +board articles and persistent post history. Existing Room target IDs remain +30S `0x5bb567cd` and 33S `0xa8cb8e8b`; their hardware IDs remain +`solarxiao_30S`/`solarxiao_33S`. Repeater keeps `0x3caf966e`. + +## History correction and host checks + +History previously configured channels once before Auto's first probe. An +MPPT discovered later could therefore provide live telemetry but never gain +voltage-history storage. The shared driver now reserves history IDs 2..5 at +boot without any bus access. Only active, valid readings produce samples; +empty channels remain absent from populated history results. Late INA260 +detection, later charger input power and Basic-to-MPPT changes can supply +samples without rebooting or clearing other sensor history. This fixes both +Room and Repeater. + +Four native channels allocate 1,440 bytes; the shared 16-channel cap limits +native plus optional history to 5,760 bytes. The new budget test compiles the +real history class and binds that allocation to the RAM policy. It also checks +disabled-history/native cases and unrelated platforms. + +Passing checks include: + +- 30 SolarXiao methods: 19 carrier, 3 core power, 5 Room integration and 3 memory + tests. Native harnesses use ASan/UBSan. +- Actual Room telemetry/history methods, shared adapter and environmental + sensor methods: delayed detection/VIN, preserved history across mode changes, + environmental/guest permissions and complete LPP replies for capacities 4..184. +- Actual administrator gate, remote timestamp-zero denial of USB-only actions, + prefixed reply bounds, startup/null-persistent-FS/history propagation and loop + hooks. Canonical feature inheritance leaves legacy recovery/Companion unchanged. +- Six XIAO startup/battery checks; two pinned official Room-app compatibility + methods for login and received posts; persistent Room history integration + with 199 scenarios on each of five simulated platforms. +- All 49 existing RAM-policy methods, the build-profile suite and the nRF52 + Full/Reduced OTA profile suite. + +PlatformIO ran one process at a time. Final packages and logs are retained at +`/home/mesh/hwtest/solarxiao-room-20261021/final-firmware/` and its parent. +The [validation record](solarxiao_room_2026-10-21.safe.json) contains exact hashes. + +## Deployment scope + +This is host/build qualification, not physical Room acceptance. No device was +flashed, no Room boot/soak or RF test was run, and no LoRa firmware transfer was +performed for this image. SEA Sherwood remains unreachable and unchanged. +The matching board/storage-aware OTAFIX bootloader is required for these Room +targets; the existing bootloader/scratch layout and 30S/33S PA settings were +preserved. See the [controls guide](../solarxiao_power.md) for commands and +target selection. diff --git a/docs/test-results/solarxiao_room_2026-10-21.safe.json b/docs/test-results/solarxiao_room_2026-10-21.safe.json new file mode 100644 index 000000000..f72bcbb8f --- /dev/null +++ b/docs/test-results/solarxiao_room_2026-10-21.safe.json @@ -0,0 +1,246 @@ +{ + "passed": true, + "scope": "build and host validation only; no device flashing, physical Room/RF/I2C, boot or OTA transfer test", + "source_commit": "1d2fb6a1b471f2984a5a4133854cad4b52150337", + "version": "v1.18.0.1-halo-keymind-cascade-dev-1d2fb6a1", + "canonical_power_modes": [ + "auto", + "basic", + "mppt" + ], + "room_targets": [ + "solarxiao_30S_room_server_lora_ota", + "solarxiao_33S_room_server_lora_ota" + ], + "legacy_plain_room_targets_unchanged": true, + "history_fix": { + "reserved_native_channels": [ + 2, + 3, + 4, + 5 + ], + "reservation_performs_io": false, + "inactive_samples": "missing; empty channels omitted from populated results", + "history_allocation": "four channels at boot; total native+optional capped at16", + "bytes_per_channel": 360, + "worst_heap_allowance": 5792, + "supports_late_auto_and_vin": true, + "applies_to_repeater": true + }, + "tests": { + "solarxiao": 30, + "carrier": 19, + "power": 3, + "room_integration": 5, + "room_memory": 3, + "xiao_startup": 6, + "official_room_app_compatibility": 2, + "persistent_room_history_integration": 1, + "persistent_history_platforms": 5, + "existing_ram_suite": 49, + "build_profiles_shell": "PASS", + "nrf52_ota_profiles_shell": "PASS", + "native_sanitizers": [ + "ASan", + "UBSan" + ], + "solarxiao-tests.log_sha256": "29b79c2cda6ee59f752401e716ea9e4b2b1c3212ed1690b4e814915c70113198", + "xiao-startup-tests.log_sha256": "2714596830f7425bc12cf877f91d1b3f5f0f6e60f2faad5af761f3403bedd7ac", + "room-protocol-tests.log_sha256": "89040f336b2c44aef4e2a1d32a3278effb305bcde513cc0a388547fe81e772d5", + "room-persistent-history-tests.log_sha256": "5968336e710ac71e51dc96dacb2e243545d096034de983fe7ab8b8c9f5d575f0", + "test_build_profiles.sh.log_sha256": "297880cdf3a2b37e6c3240e94077ef0eb1b0f8d67d886d06e3bb42584cdb06bd", + "test_nrf52_ota_profiles.sh.log_sha256": "3cfe9e3674feed4052d8df18baf6fa4ef225bcae34a7bce24f85a2be03a7bef3" + }, + "platformio_concurrency": 1, + "installed_on_any_device": false, + "new_base_advanced_measurements": [], + "builds": { + "solarxiao_33S_room_server_lora_ota": { + "full": { + "package": "solarxiao_33S_room_server_lora_ota-full-ota-v1.18.0.1-halo-keymind-cascade-dev-1d2fb6a1.zip", + "package_sha256": "8cb814dd309bc219894d873b8c2876a5d89d639798545353b3e8a2107ff78823", + "application_bytes": 524424, + "application_sha256": "dcca135c14e973d997f7823509303c2c41174ba402ef36d5b961c41f5bd6366a", + "body_bytes": 524368, + "body_hash": "761289FD9CEFE79B", + "ota_target": "0xa8cb8e8b", + "hardware_id": "solarxiao_33S", + "firmware_markers": { + "native_power": true, + "three_modes": true, + "auto_identity": true, + "basic_capabilities": true, + "self_readings": true, + "history_guidance": true, + "room_history_clear": true, + "room_persistent_history": true, + "room_board": true + }, + "memory_passed": true, + "available_internal_bytes": 156352, + "required_heap_bytes": 65280, + "native_history_allowance": 5792, + "capabilities_verified": true, + "update_methods": [ + "bluetooth", + "lora" + ], + "uf2_sha256": "35f021464c6b47c1ebcd3784549c9c446ca554b63eb219de53cffa144b3b75ba" + }, + "reduced": { + "package": "solarxiao_33S_room_server_lora_ota-reduced-ota-v1.18.0.1-halo-keymind-cascade-dev-1d2fb6a1.zip", + "package_sha256": "23bb4c11f19fc6a5a595722eadb1b521d0845b6f6746580b3fd33b27b07f483a", + "application_bytes": 494888, + "application_sha256": "75d89c506ed10d4f7080c638a73daa174ce7706ccaa71c17e2d60cff34417c06", + "body_bytes": 494832, + "body_hash": "9CA04F37C960797A", + "ota_target": "0xa8cb8e8b", + "hardware_id": "solarxiao_33S", + "firmware_markers": { + "native_power": true, + "three_modes": true, + "auto_identity": true, + "basic_capabilities": true, + "self_readings": true, + "history_guidance": true, + "room_history_clear": true, + "room_persistent_history": true, + "room_board": true + }, + "memory_passed": true, + "available_internal_bytes": 157984, + "required_heap_bytes": 65280, + "native_history_allowance": 5792, + "capabilities_verified": true, + "update_methods": [ + "bluetooth", + "lora" + ], + "uf2_sha256": "37a13725b2928282d6d11b51d4505fff3bb1cf09362df2a71c8b6a7f8a9fa1c3" + } + }, + "solarxiao_30S_room_server_lora_ota": { + "full": { + "package": "solarxiao_30S_room_server_lora_ota-full-ota-v1.18.0.1-halo-keymind-cascade-dev-1d2fb6a1.zip", + "package_sha256": "57008c4e92a0eeffffbcd0eaa03c2341ee5cc558c5de1c5b002a1fd0c60df1a6", + "application_bytes": 524424, + "application_sha256": "d5c7de1a8a9092ab4881584c9906db9785416a371c27f502542e13e2da36f97c", + "body_bytes": 524368, + "body_hash": "AB4F7D7F85872201", + "ota_target": "0x5bb567cd", + "hardware_id": "solarxiao_30S", + "firmware_markers": { + "native_power": true, + "three_modes": true, + "auto_identity": true, + "basic_capabilities": true, + "self_readings": true, + "history_guidance": true, + "room_history_clear": true, + "room_persistent_history": true, + "room_board": true + }, + "memory_passed": true, + "available_internal_bytes": 156352, + "required_heap_bytes": 65280, + "native_history_allowance": 5792, + "capabilities_verified": true, + "update_methods": [ + "bluetooth", + "lora" + ], + "uf2_sha256": "7d06c5d18712cdf3b4e166dd7a8ecca72a6dcbc3f6d7d8e7d2a5d90fdfa3b5a0" + }, + "reduced": { + "package": "solarxiao_30S_room_server_lora_ota-reduced-ota-v1.18.0.1-halo-keymind-cascade-dev-1d2fb6a1.zip", + "package_sha256": "f427af2c139ccf0a41d9c92b6fb310164bb240002669db45f863149ea91a8b1b", + "application_bytes": 494888, + "application_sha256": "a5c2028204d0ad3ea66b6332141d8bf9ad4f57653629b58905f4704ef7f91f67", + "body_bytes": 494832, + "body_hash": "FBD9FAA560F5D0CE", + "ota_target": "0x5bb567cd", + "hardware_id": "solarxiao_30S", + "firmware_markers": { + "native_power": true, + "three_modes": true, + "auto_identity": true, + "basic_capabilities": true, + "self_readings": true, + "history_guidance": true, + "room_history_clear": true, + "room_persistent_history": true, + "room_board": true + }, + "memory_passed": true, + "available_internal_bytes": 157984, + "required_heap_bytes": 65280, + "native_history_allowance": 5792, + "capabilities_verified": true, + "update_methods": [ + "bluetooth", + "lora" + ], + "uf2_sha256": "ef9a335c117cecda409eee97c10c5b6212bd81c06236d3105f3cf796782591ed" + } + }, + "solarxiao_33S_repeater": { + "full": { + "package": "solarxiao_33S_repeater-full-ota-v1.18.0.1-halo-keymind-cascade-dev-1d2fb6a1.zip", + "package_sha256": "c38de466ce4924b5ac20f30901c9280a1e554c5bdf26ba90750b5ac2f6804ba9", + "application_bytes": 598824, + "application_sha256": "373367a895e5b7071f34db3f41c8a42f1cefb88383eb4e901570a3db2332317b", + "body_bytes": 598768, + "body_hash": "DEB7475A4B4B0BBC", + "ota_target": "0x3caf966e", + "hardware_id": "solarxiao_33S", + "firmware_markers": { + "native_power": true, + "three_modes": true, + "auto_identity": true, + "basic_capabilities": true, + "self_readings": true, + "history_guidance": true + }, + "memory_passed": true, + "available_internal_bytes": 150576, + "required_heap_bytes": 82752, + "native_history_allowance": 5792, + "capabilities_verified": true, + "update_methods": [ + "bluetooth", + "lora" + ], + "uf2_sha256": "c816217a7053ec5554c240ad04952e34a60fd4b5ee0e06a3834e296615e41d3c" + }, + "reduced": { + "package": "solarxiao_33S_repeater-reduced-ota-v1.18.0.1-halo-keymind-cascade-dev-1d2fb6a1.zip", + "package_sha256": "edf8d3ef2cb77005efd34acf532e16fa1b059794f97a91943de45fba5289f9f4", + "application_bytes": 568828, + "application_sha256": "857da5d5ae041e5450251e9c707c4a71740fc0548e3e54a114656426855770b6", + "body_bytes": 568772, + "body_hash": "8CDBFB5FA2615124", + "ota_target": "0x3caf966e", + "hardware_id": "solarxiao_33S", + "firmware_markers": { + "native_power": true, + "three_modes": true, + "auto_identity": true, + "basic_capabilities": true, + "self_readings": true, + "history_guidance": true + }, + "memory_passed": true, + "available_internal_bytes": 152224, + "required_heap_bytes": 82752, + "native_history_allowance": 5792, + "capabilities_verified": true, + "update_methods": [ + "bluetooth", + "lora" + ], + "uf2_sha256": "9382fb0dc3852f46f321a807937535e218637a951731f5a634eae74d5c9cc1b5" + } + } + } +}