31250 bench run: wedge patch holds under retry storm; window is byte-scaled
127s mash at 31250: zero wedges — but 5655 framing resyncs, duplicate replies (215% of poll slots) and AbandonCount=65 reveal the board's reply ACK-wait scales with byte time: ~5+ms at 9600 (USB beats it, zero framing) vs ~1.6ms at 31250 (USB cannot). All 65 retry exhaustions self-recovered through the patched give-up path — the strongest field proof of the latch fix yet; unpatched firmware would have wedged on the first. Verdict recorded in ANALYSIS.md: cabinets run the 9600 patched chip; 31250 stays a bench branch until the retry window is widened in firmware. Tool: before-snapshot now retries once (can lose the post-DTR boot race, as this run showed); evidence log archived. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -346,23 +346,30 @@ internal static class MashTest
|
||||
// --- helpers ---------------------------------------------------------
|
||||
async Task<Dictionary<RioStatusType, int>> SnapshotStatusAsync()
|
||||
{
|
||||
lock (gate) { statusItems.Clear(); statusCollecting = true; }
|
||||
try
|
||||
// Two attempts: the first request can lose a race with the board's
|
||||
// post-DTR boot (port open pulses DTR = board reset), or get eaten
|
||||
// by a reply collision — seen on the 31250 bench run.
|
||||
for (int attempt = 0; ; attempt++)
|
||||
{
|
||||
await link.RequestVersionAsync();
|
||||
await link.RequestCheckAsync();
|
||||
}
|
||||
catch { /* port trouble surfaces as an empty snapshot */ }
|
||||
await Task.Delay(1200);
|
||||
lock (gate) { statusItems.Clear(); statusCollecting = true; }
|
||||
try
|
||||
{
|
||||
await link.RequestVersionAsync();
|
||||
await link.RequestCheckAsync();
|
||||
}
|
||||
catch { /* port trouble surfaces as an empty snapshot */ }
|
||||
await Task.Delay(1200);
|
||||
|
||||
lock (gate)
|
||||
{
|
||||
statusCollecting = false;
|
||||
// Counters arrive one item per type; keep the last value per type.
|
||||
var map = new Dictionary<RioStatusType, int>();
|
||||
foreach (CheckStatus item in statusItems)
|
||||
map[item.Type] = item.Number;
|
||||
return map;
|
||||
lock (gate)
|
||||
{
|
||||
statusCollecting = false;
|
||||
// Counters arrive one item per type; keep the last value per type.
|
||||
var map = new Dictionary<RioStatusType, int>();
|
||||
foreach (CheckStatus item in statusItems)
|
||||
map[item.Type] = item.Number;
|
||||
if (map.Count > 0 || attempt == 1)
|
||||
return map;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user