Commit Graph
981 Commits
Author SHA1 Message Date
mikecarper a3f858f6f0 Fit V3 Full with NimBLE and bounded OTA source proofs 2026-10-19 02:47:13 -07:00
mikecarper 025eadb39f Keep compact contacts within the STM32 flash boundary 2026-10-19 02:11:47 -07:00
mikecarper 036661e7e4 Reduce contact RAM across boards and compact Full firmware 2026-10-19 01:55:25 -07:00
mikecarper 0e70110640 Fix Bluefruit role dispatch after disconnect frees connection 2026-10-19 00:06:03 -07:00
mikecarper f7b5c40c3b Fit RAK4631 Full OTA image by reusing regulator recovery code 2026-10-18 23:48:07 -07:00
mikecarper e8d1e537e4 Record T-Deck radio2 hardware timing and regression coverage
Add receive-only same-image display, SPI, modem/IQ-cache and scoped-priority experiments with checkpointed collectors. Keep rejected clock-phase correction and elevated-priority experiments out of production.

Publish sanitized timing data, Full Companion/Bluetooth/USB checks and redraw measurements with their limits. Wire the new behavioral checks into CI.
2026-10-18 23:20:50 -07:00
mikecarper a782cc8413 Speed up T-Deck radio2 retunes with guarded command reuse
Reuse the confirmed LoRa modem only inside acknowledged warm continuous-RX hops and revoke that capability before modem initialization or after failures.

Opt the tested T-Deck into IQ workaround reuse and an exact 8,888,888 Hz SPI setting. Keep the existing BUSY, packet-ownership and recovery checks; other boards retain their modem-cache default.
2026-10-18 23:20:50 -07:00
mikecarper a944b1779d Keep T-Deck radio2 scanning active during screen redraws
Render into a PSRAM canvas and release the shared SPI bus between bounded TFT strips. Service only the radio driver at cooperative checkpoints and use the buffered radio HAL, preserving packet and transmit guards.

Cover pixel parity, transaction boundaries, allocation failure, partial updates and sleep/wake behavior with native tests.
2026-10-18 23:18:55 -07:00
mikecarper ac397fd0af Cover Nano G2 regulator startup and virtual base identity 2026-10-18 23:06:58 -07:00
mikecarper 71372f686f Defer regulator ADC and flash work during Morse timing 2026-10-18 22:38:54 -07:00
mikecarper c1e7ce0959 Model regulator servicing in extracted role loop fixtures 2026-10-18 22:35:23 -07:00
mikecarper 3f062740eb Keep extracted command fixtures independent of regulator storage 2026-10-18 22:01:46 -07:00
mikecarper a886f618f1 Omit unsupported regulator vtable slots on integrated STM32WL 2026-10-18 22:00:03 -07:00
mikecarper 758004373d Keep unsupported STM32 controls out of tiny Companion images 2026-10-18 21:54:35 -07:00
mikecarper 0da54991cc Avoid unreachable regulator persistence on integrated STM32WL targets 2026-10-18 21:36:04 -07:00
mikecarper c604a1a165 Pack unchanged Reader text more tightly for Full firmware 2026-10-18 21:26:44 -07:00
mikecarper c2998ae8d9 Preserve regulator recovery through planned resets and storage failures 2026-10-18 21:17:44 -07:00
mikecarper c4a1d485ff Add saved regulator modes and battery-gated crash recovery 2026-10-18 21:10:58 -07:00
mikecarper 5df3e4ae53 Verify RP2040 capabilities against matching UF2 application 2026-10-18 20:40:06 -07:00
mikecarper 9c78ccde57 Unify optional hardware variants and add runtime R8 TFT rotation 2026-10-18 20:25:13 -07:00
mikecarper cc004521bd Keep original Tracker Full neighbor table within its RAM budget 2026-10-18 19:01:35 -07:00
mikecarper 4f746d1e3b Detect manufacturer-supported optional screens on RC32, Tracker V1 and V4 R8 2026-10-18 18:55:38 -07:00
mikecarper 3a425db6a9 Fix V4 button fixture for display presence checks 2026-10-18 18:21:52 -07:00
mikecarper b8f8a1fae1 Account for ST7789 framebuffer and scanline heap in firmware gates 2026-10-18 16:32:49 -07:00
mikecarper 1ce3f0cdd7 Make T114 screen detection the default firmware and picker choice 2026-10-18 16:20:27 -07:00
mikecarper 864d0cacff Preprocess complete CLI handlers before native fixture extraction 2026-10-18 15:49:53 -07:00
mikecarper 22ab02caf7 Fix G3 gain transitions, slot commands and radio restore 2026-10-18 14:29:19 -07:00
mikecarper 015eff4c22 Restore G3 startup tolerance and G2-compatible flash mode 2026-10-18 13:58:02 -07:00
mikecarper 5d741318f5 Preserve admin password input and clarify reconnect guidance 2026-10-18 13:45:13 -07:00
mikecarper ad4124b055 Adapt the Room HTTP fixture to the setup password service
Keep this LAN and stopped-server fixture scoped to Room HTTP, assert that setup mode cannot enter its peripheral stub, and retain the actual AP rekey regressions in the management-password suite. The broader CI job exposed the missing dependency after the new tick hook.

Validated all 43 methods consuming the affected tick paths, all 18 remaining commands in the failed CI step, and 93 additional CLI, routing and persistence regression methods.
2026-10-18 13:23:59 -07:00
mikecarper cd02e55824 Share the saved admin password across ESP32 management services
Use the committed node credential for setup WiFi, WebConfig and browser OTA. Add persistent ESP32 WiFi Companion management credentials without changing preferences layouts, revoke stale browser sessions on rotation, retain scoped save receipts, and coordinate credential changes with flash uploads. Keep external-service credentials and trusted TCP protocol compatibility independent. Update live join QR codes, failure handling and documentation.

Validated 51 native cases, 158 related host and browser methods, and serial Full V4 Companion, Station G3 Repeater, ESP32-C6 Room Server and V4 Sensor firmware builds.
2026-10-18 13:09:48 -07:00
mikecarper a6a3cb5ebc Recognize nested fail-closed preference guards in CI 2026-10-18 10:04:49 -07:00
mikecarper 6ce784bbd6 Fit all STM32 Companions with checked fractional preferences
Stage STM32 preference prefixes and checked footers in one atomic image, reject declared tails that encounter premature EOF, and share the typed CLI rollback helper. Use the proven Wio Mini code-layout flags on Wio E5 and Tiny Relay without changing features or memory boundaries. All four STM32 targets and RAK4631 Full pass at the full 1.18.0.1 release version length.
2026-10-18 09:11:51 -07:00
mikecarper 59b0ab93d0 Keep fractional timezones within constrained flash budgets
Deduplicate validation and preserve the published preference bytes and transactional saves. Correct Ikoka Handheld Companion flash bounds and document QSPI Room migration. Qualify STM32 and RAK4631 at the full 1.18.0.1 release version length.
2026-10-18 08:46:20 -07:00
mikecarper 7088096abf Merge upstream dev through 428a95c64
Integrate fractional Companion timezones and conditional Bluetooth pages while preserving the existing preference byte layout, transactional saves, and Full transport selector. Add migration, rollback, invalid-value, and UI profile regressions.
2026-10-18 08:30:50 -07:00
mikecarper 3ca724e73e Preserve native USB failures when endpoint cleanup also fails 2026-10-18 02:27:11 -07:00
mikecarper e87e8c90dd Handle Full Companion terminal setup in native USB acceptance 2026-10-18 02:06:27 -07:00
mikecarper 4b0b52e522 Mock serial ownership inspection in Ethernet opener fixtures 2026-10-18 00:56:37 -07:00
mikecarper 89dcd82089 Add guarded hardware acceptance and restoration tools 2026-10-18 00:24:03 -07:00
mikecarper 48bad8ddfb Reduce room board recovery stack use under sustained reads 2026-10-18 00:00:47 -07:00
mikecarper f88b9e65ed Expose broker acknowledgment diagnostics on Full Companion 2026-10-17 23:54:15 -07:00
mikecarper 68f45e5cf5 Fix room browser stack overflow and bound response bodies 2026-10-17 23:31:24 -07:00
mikecarper a4a0b97c3f Expand post-merge regressions and document qualification gaps 2026-10-17 21:41:47 -07:00
mikecarper 80023f79e0 Fix ESP32-C6 GPIO hold capability and add cross-platform smoke builds 2026-10-17 21:41:47 -07:00
mikecarper 040182e8ec Merge remote-tracking branch 'origin/pr-21' into codex/integrate-open-prs-17-21 2026-10-17 21:13:27 -07:00
mikecarper 69a15f0fa1 Merge remote-tracking branch 'origin/pr-20' into codex/integrate-open-prs-17-21 2026-10-17 21:13:27 -07:00
mikecarper 9a5331eecd Merge remote-tracking branch 'origin/pr-19' into codex/integrate-open-prs-17-21 2026-10-17 21:13:27 -07:00
mikecarper 24653842e8 Merge remote-tracking branch 'origin/pr-18' into codex/integrate-open-prs-17-21 2026-10-17 21:13:27 -07:00
nullrouten0andClaude Opus 5.5 618c18d385 Keep whole contact records ahead of a partial trailing record
Upstream MeshCore, and this fork up to v1.17.1.6 except ESP32 Full
builds, rewrote /contacts3 in place, one record after another. A reset
or a full volume during that save leaves whole records followed by part
of the next one. Upstream reads such a file up to the short read. Here
readableContactFile() treats any size that is not a multiple of 152
bytes as unreadable, and since 2311160a9 the bounded recovery then
deletes /contacts3. On the first boot after an upgrade, three whole
records plus one stray byte became zero contacts.

Invariant: on ESP32, RP2040 and STM32, when /contacts3 holds at least
one whole record followed by part of one, and /contacts3.bak does not
exist, the whole records load and nothing is written or deleted at
boot. The next ordinary save publishes only whole records through the
existing transaction. Unchanged: whole-record images; a backup still
wins over an incomplete primary, including a backup that is unreadable
or of unknown presence at boot, which keeps its retry at the recovery
boundary; read errors keep the bounded recovery; a file with no whole
record is still discarded; nRF52 is not touched.

selectContactFile() makes this check only after the strict checks of
both names fail, through a new partial_tail mode of
readableContactFile(). loadContacts() drops its own size check; its
whole-record loop bound already stops before the tail.

Add test_companion_contact_partial_tail.py, which runs the real load,
recovery and save paths on the uncached ESP32, RP2040 and STM32
harness and on the ESP32 Full cache harness under ASan/UBSan. On the
old code all four fail with zero contacts and /contacts3 deleted. It
catches 14 of 15 mutations of this change, including a full revert;
the other drops a guard whose value is read only when the file handle
is valid. Two cases in the uncached storage fixture used a one-byte
truncation as their unreadable image; they now use a file shorter than
one record, so they still exercise the discard path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 03:57:09 +00:00
nullrouten0andClaude Opus 5.5 a6f49e2b63 Limit wrong passwords on the room browser
POST /api/room checked the room password on every request with no failure
limit, and a browser may send a new identity token each time. Any host that
reached WebConfig could guess the room admin password, which is also the
radio and /api/login admin password, at main-loop speed.

One budget now covers all browser tokens, with /api/login's numbers: at most
five distinct wrong passwords in each thirty-second window. After that, a
request carrying a password is refused without checking it until the window
ends. Wrong passwords count in read-only rooms too. Empty passwords are never
counted or refused, so public read-only access keeps working. The last four
wrong passwords are remembered by 8-byte SHA-256 digest and not counted
again, so a tab still polling with an old or mistyped password cannot use up
the budget. Successful sign-ins do not refund failures. Radio login is
unchanged.

test_room_web_service.py gains PASSWORD_LIMIT, which runs the real
processRoomRequest: refusal after five failures from five tokens; identical
replies for wrong, guest and admin passwords while refused, with no password
check (calls to authorizeRoomLogin are counted); no lock extension from 300
refused requests; the 29999/30000 ms boundary and the first window after
boot; read-only and empty-password cases; no refund on success; repeated,
rotating and read-only stale passwords; slow distinct failures ageing out;
and a guard that the digest ring stays in bounds. It fails on the previous
processRoomRequest at the sixth guess.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 03:57:09 +00:00