Docs: record E0-threshold bench PASS (E0000105) + corrected counter semantics

The display observation recalibrates the counters: $3184 = give-up
cycles (once per exhausted retry sequence, not per retransmit), $3185 =
teardowns of any reply cycle needing at least one retransmission — the
counter behind a lone E0000001. Also recorded in the error-handling
inventory: 5 retransmits per cycle, reply-await arms only after the
complete frame, NAK forces exactly one counted retransmit, late ACKs
cannot rescue a cycle. (Previous commit's doc edits had silently missed
their anchors; applied properly this time.)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-19 15:40:57 -05:00
co-authored by Claude Fable 5
parent b5e2ad35af
commit 4ac688dfa5
3 changed files with 47 additions and 23 deletions
+17 -10
View File
@@ -7,15 +7,22 @@ namespace RioSerialMonitor;
/// E0-threshold firmware verification (rio-firmware `--e0thresh` images).
///
/// Two phases against a DTR-reset board (counters zeroed, display F0000000):
/// - Phase A (gate hold): analog requests whose reply we ACK only after the
/// first retransmit — each event increments the board's retransmit
/// counter ($3184) by a small sub-threshold amount, calling the display
/// renderer every time. The _e0t5 gate must keep the display F0000000;
/// stock firmware paints E0... at the first retry.
/// - Phase B (flip): analog requests we never ACK — the board runs the full
/// retry cycle (observed: 5 retransmits) and gives up ($3185++, RESTART
/// $FE). The counters cross the threshold and the display must flip to
/// the E0 readout, which the tool predicts from observed traffic.
/// - Phase A (gate hold): analog requests answered NAK-then-ACK — NAKing
/// the COMPLETED reply frame forces exactly one immediate retransmit,
/// ACKing that retransmit ends the cycle. Each event increments the
/// teardown counter $3185, invoking the display renderer sub-threshold.
/// The _e0t5 gate must keep the display F0000000; stock firmware paints
/// E0... at the first event. (Responses must follow the complete frame:
/// the board arms its reply-await only when the frame finishes sending,
/// and once the first retry timeout lapses the cycle runs blind.)
/// - Phase B (flip): analog requests we never ACK — the board runs the
/// full retry cycle (5 retransmits), gives up ($3184++, RESTART $FE)
/// and tears down ($3185++). $3185 crosses the threshold; the display
/// must flip to the E0 readout the tool predicts from observed traffic.
///
/// Bench 2026-07-19 (9600 e0t5 chip): PASS — display held F0000000 through
/// the handshake and all four phase-A teardowns, flipped exactly at the
/// 5th teardown to E0000105 ($3187=00, $3184=01, $3185=05).
///
/// dotnet run --project tools/RioSerialMonitor -- --e0test [port]
/// [--baud rate] [--hold n] [--flip n]
@@ -111,7 +118,7 @@ internal static class E0Test
{
buffer.Add(tmp[i]);
// Frame tracking: respond only once the FULL reply
// frame is on the wire the board arms its
// frame is on the wire the board arms its
// reply-await when the frame finishes sending; a
// response mid-frame is ignored.
if (frameCountdown > 0)