Skip to content

Beta#102

Merged
TheAngryRaven merged 9 commits into
masterfrom
BETA
Jul 23, 2026
Merged

Beta#102
TheAngryRaven merged 9 commits into
masterfrom
BETA

Conversation

@TheAngryRaven

Copy link
Copy Markdown
Owner

No description provided.

…oc-52alwc

SensorEgg wireless EGT POC: passive observer, Temp1/Junction1 DOVEX columns, Temp1 race page
…poc-52alwc

Claude/sensoregg wireless poc 52alwc
@github-actions

github-actions Bot commented Jul 18, 2026

Copy link
Copy Markdown

Coverage — host-testable units

📂 Overall coverage

Metric Coverage
Lines 🟢 755/765 (98.7%)
Functions 🟢 78/78 (100.0%)
Branches 🟡 594/663 (89.6%)

📄 File coverage

File Lines Functions Branches
BirdsEye/camera_fsm.cpp 🟢 222/230 (96.5%) 🟢 20/20 (100.0%) 🟡 126/144 (87.5%)
BirdsEye/crc32.cpp 🟢 30/30 (100.0%) 🟢 4/4 (100.0%) 🟢 24/24 (100.0%)
BirdsEye/dovex_header.cpp 🟢 100/101 (99.0%) 🟢 6/6 (100.0%) 🔴 61/92 (66.3%)
BirdsEye/filename_validator.cpp 🟢 14/14 (100.0%) 🟢 1/1 (100.0%) 🟢 30/30 (100.0%)
BirdsEye/gps_status_page.cpp 🟢 25/25 (100.0%) 🟢 3/3 (100.0%) 🟢 24/24 (100.0%)
BirdsEye/gps_time.cpp 🟢 45/45 (100.0%) 🟢 6/6 (100.0%) 🟢 30/32 (93.8%)
BirdsEye/gps_validation.cpp 🟢 24/24 (100.0%) 🟢 2/2 (100.0%) 🟢 66/66 (100.0%)
BirdsEye/haversine.cpp 🟢 8/8 (100.0%) 🟢 1/1 (100.0%) ⚫ 0/0 (0.0%)
BirdsEye/insta360_protocol.cpp 🟢 140/140 (100.0%) 🟢 16/16 (100.0%) 🟡 86/98 (87.8%)
BirdsEye/lap_format.cpp 🟢 18/18 (100.0%) 🟢 1/1 (100.0%) 🟢 9/9 (100.0%)
BirdsEye/sat_bars.cpp 🟢 33/33 (100.0%) 🟢 2/2 (100.0%) 🟢 51/54 (94.4%)
BirdsEye/sd_access_policy.cpp 🟢 5/5 (100.0%) 🟢 2/2 (100.0%) 🟢 10/10 (100.0%)
BirdsEye/sd_format_page.cpp 🟢 25/25 (100.0%) 🟢 3/3 (100.0%) 🟢 25/26 (96.2%)
BirdsEye/sensoregg_protocol.cpp 🟢 39/40 (97.5%) 🟢 7/7 (100.0%) 🟢 25/26 (96.2%)
BirdsEye/tach_filter.cpp 🟢 15/15 (100.0%) 🟢 3/3 (100.0%) 🟡 7/8 (87.5%)
BirdsEye/wake_cause.cpp 🟢 12/12 (100.0%) 🟢 1/1 (100.0%) 🟢 20/20 (100.0%)

claude and others added 7 commits July 18, 2026 20:43
…lf-heal

First bench soak showed the egg flapping - ~1 s of readings then 1-30 s
of NA - with everything 'connected'. Three scanner-side causes, verified
against the Bluefruit source:

1. Bluefruit pauses scanning from report acceptance until the DEFERRED
   rx callback resumes it, and our only inline filter was RSSI - so
   every ambient desk packet above -90 dBm (phone/PC/X4) took the slow
   accepted path just to be magic-rejected in our callback, collapsing
   scan duty in bursts. Scanner.filterMSD(0xFFFF) now rejects+resumes
   foreign packets inline in Bluefruit's event handler.

2. The spec's equal 100 ms adv / 100 ms scan periods phase-lock; with a
   40 ms window the egg could park in the 60 ms deaf zone for seconds
   (an egg reboot re-rolls the phase - which is why it 'fixed' it).
   Window widened to 60 ms; the egg side moves its adv interval off
   100 ms in the companion commit.

3. A lost deferred rx callback halts the scanner silently and forever
   (resume is only called from the callback). SENSOREGG_LOOP now kicks
   stop+start after 30 s with no accepted packet - harmless when the
   egg is off, curative when the scanner wedged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vk8qn6sc87B9wFy3S7siaf
…poc-52alwc

Fix SensorEgg reception flapping: inline MSD filter, wider scan window, scanner self-heal
The Temp1 race page (big EGT + junction subtext) and the camera bench
page's egg: soak readout now render in F, converted at display time via
sensoregg_protocol::celsiusToFahrenheit() (pure unit, host-tested, NaN
propagates so a stale/invalid probe still renders '---'). DOVEX logging
is unchanged — Temp1/Junction1 stay Celsius — and a C/F display setting
will follow in a later release. sensoregg_protocol.cpp joins the sim
source list since display_pages.ino now links against it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013BCdGxqExj9ojEQgZj4f6G
…tained 5 s

Field incident (2026-07-19): a failed pull start — and, reproduced, any
engine kill before GPS acquired its time lock — left the device looking
bricked: pinned to the RPM page, buttons dead, no WDT reset. The loop was
healthy; the GPS-lock hold (which pins the UI while a session waits for a
time lock to create its log file) latched on any tach pulse (pull-cord
ignition blips included), had no engine-off release, and its only
automatic session-enders were blocked: auto-idle's 3-minute grace, then
full auto-idle suppression once the camera was recording. Cranking blips
above the 500 RPM wake threshold had also started that camera recording.

Fixes:
- camera_fsm: record start now requires RPM >= kRecordRpmThreshold (1500)
  held continuously for kRecordStartDelayMs (5 s); any dip below restarts
  the clock. Wake and the 30 s stop keep the 500/300 band. Cranking can
  clear 500 but cannot sustain 1500. New host tests: cranking-band never
  records, threshold boundary, strict-dip clock restart.
- updateGpsLockHold: the pin releases after 10 s of engine-off (session
  stays active and navigable; a restart re-latches).
- displayPage_tachometer: shows "WAITING GPS LOCK.." while pinned so the
  hold never reads as a crash.
- checkAutoIdle: may end a still-fileless session even while the camera
  records — there is no log to protect yet, and this was the only
  session-ender left when the hold was active.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013BCdGxqExj9ojEQgZj4f6G
…ork-ssd2ft

Fahrenheit temp display + pull-start/engine-kill lockup fix + 1500 RPM record gate
…dings

Field incident (2026-07-19, ~3-4 h runtime): the egg's application hung
but its radio kept rebroadcasting the last advertising payload at 10 Hz
(BLE stacks beacon the set buffer autonomously, no app involvement), so
the logger reported rf:OK with a value that never updated — a flat line
indistinguishable from real data, violating the module's own staleness
principle.

The payload's free-running uint16 sequence counter is the application's
only sign of life. New host-tested sensoregg_protocol::SeqMonitor stamps
every accepted packet and marks the reading dead when the sequence has
not changed within kStalenessMs despite packets arriving (wrap-safe;
65535->0 counts as a change; duplicate receptions of one advertising
event do not false-trigger). While hung: sensoreggEgtC/JunctionC return
NaN (DOVEX logs nan, display shows ---), tcFault is suppressed (frozen
flag = stale information), and the Temp1 page rf: field shows HUNG
instead of OK so the fix is a visible power-cycle prompt, not a silent
dropout.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013BCdGxqExj9ojEQgZj4f6G
…ork-ssd2ft

Detect zombie SensorEgg: frozen sequence counter → rf:HUNG + NaN readings
@TheAngryRaven
TheAngryRaven merged commit 6298c08 into master Jul 23, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants