You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 62a09f9
Browse filesBrowse the repository at this point in the historyBrowse files
feat: scale telemetry via session_info + debug frames
Rebased onto current main (post decentespresso#58 WS-OOM gate, post decentespresso#60 ADC library
swap) and restructured from the original "embed telemetry in status"
shape to deliver telemetry out-of-band, so apps that don't care about
diagnostics (on-device UI, decentespresso app, third-party scale apps)
aren't paying ~21% extra bytes on every status broadcast tick.
The collection bits — SoC die-temperature sampler, weight-stall watchdog,
ADC recovery counter widened to volatile uint32_t, reset-reason capture
at boot, StopWatch-tear-fix timer snapshot — are unchanged from review-
round-2.
Wire-protocol delivery is reorganized into three frames:
session_info one-shot, server→client on WS_EVT_CONNECT. Carries the
fields immutable for the connection (protocol_version,
firmware_version, reset_reason). Clients no longer have
to ask for these.
debug events broadcast on diagnostic-relevant change. Emitted by:
- sendWebsocketDebugStall(true) on stall onset
- sendWebsocketDebugStall(false) on stall resume
- sendWebsocketDebugAdcRecovery() on ADC power-cycle
- sendWebsocketDebugTempPeak() on new SoC max temp
Subscribers see the event the moment it happens; non-
subscribers ignore the unknown type. No periodic
broadcast — temp_peak fires at most once per warm-up
curve, stall_*/adc_recovery only on real events.
debug reply on-request snapshot per-client. Send {"command":"debug"}
(also accepted: "diag") and the server replies with the
full diagnostic set (current/peak temp, stall state +
count + last, recovery count). Per-client, not a
broadcast — no heap cost for other clients.
All event broadcasts go through the existing wsBroadcastHeapOk() gate
(PR decentespresso#58). Per-client sends don't need it (one allocation, not one-per-
client).
Net effect:
- Status frame stays at its current 16 fields (≈310 B payload). Apps
that don't care about diagnostics get back ~21% per status broadcast
— meaningful under multi-client load where allocations stack.
- Diagnostic consumers (soak tools, debug dashboards, this PR's own
thermal_load_test.sh) get *immediate* notification of stall /
recovery events instead of waiting up to 5 s for the next status.
- session_info means clients no longer have to roundtrip a status
request just to learn reset_reason after reconnect.
Also includes:
- Updated ADS1232 debug callback for the new library's field set
(rebased from old API; the old dataMin/Max/Avg/StdDev /
tareInProgress/tareTimes are gone in the upstream lib). Callback
stays dormant by default (registered but setDebugEnabled(false) is
the default in the lib).
- StopWatch read-tear fix: sendWebsocketStatus and StatusAll now read
g_timerRunning/g_timerElapsed (snapshotted once per main-loop pass)
instead of touching stopWatch directly from the AsyncTCP task.
- CLAUDE.md: "Fixing bugs you find along the way" guidance from
review round 2.
- README.md: full documentation of session_info + debug frames.
- tools/thermal_load_test.sh: 1-hour multi-protocol soak runner.
Build verified clean on esp32s3 (RAM 17.2%, Flash 45.5%).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CLAUDE.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -158,6 +158,10 @@ This document is meant to evolve with the codebase. During a session, if you (Cl
158
158
159
159
If you fix a bug whose symptom is documented in the "When something is broken" table, leave the entry in place — it's still the right "first place to look" for the next person.
160
160
161
+
## Fixing bugs you find along the way
162
+
163
+
Pre-existing bugs get fixed too — "it was already there" is not a reason to defer. When you turn up a bug while working on something else (a review flags it, you read past it, a test surfaces it), fix it as part of the same change; a pre-existing bug is no less bad than a newly introduced one, and the person touching the code is the right person to fix it. The only exception is when the fix is genuinely a large, independent effort — then call it out explicitly and agree on a separate change, rather than silently leaving it in place.
164
+
161
165
## Don't
162
166
163
167
- Don't call I²C / SPI / blocking IO from the AsyncTCP task.
0 commit comments