Diag: speed-change investigation -- authentic analog throttle CONFIRMED, harnesses + gait probes (task #50)

Decomp workflow w0odszxro settled the speed model: the pod throttle was ANALOG-
CONTINUOUS (RIO Ranger, 800 ADC counts, 0.05 deadband; sole detent = snap-to-1.0
within 0.05 @004d196c).  '5 speeds' is FALSE -- the 1-5 keys are MFD mode pages;
the 0..5 stepper is HUD/radar zoom.  BONUS: throttleState@0x4a4 is a MISNOMER --
binary census proves it is the fall-contact surface material cache (0..7, init
2=Concrete), written only at knockdown; rename pending.

Empirical rule-outs (autonomous drive-sweep harness, this commit):
 - Record density: with the clock guard + incremental heading in, a per-frame
   continuous demand sweep measures IDENTICAL to constant throttle on position
   evenness ([repljit]), render heading ([rendhdg]), and gait cadence ([gaitev]).
 - Type-3 stomps: ~0 fire in sustained sweeps (only at launch) -- not the driver.
 - The 0.05-grid keyboard publish experiment is retained env-gated OFF
   (BT_GRID_LEVER) -- the ADC was ~continuous, so the grid is NOT authentic and
   gains nothing measurable; default publish stays continuous (authentic).

New tooling: BT_DRIVE_SWEEP[0] (forced-drive triangle sweep, optional through-
zero), BT_FORCE_STEP (0.05-grid variant), BT_GAITEV (per-frame leg-clip advance
+ state-flip + demand-change stats), [t3rx] (type-3 stomp trace).

STATUS: user still reports visible speed-change glitches in interactive play;
all harness metrics saturate at baseline -- next step is probes ON the user's
interactive session (their eyes + instruments on the same run).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-14 19:47:03 -05:00
co-authored by Claude Opus 4.8
parent 93456be051
commit 2c6db6a2de
3 changed files with 108 additions and 2 deletions
+6
View File
@@ -1872,6 +1872,12 @@ void
case 3: // leg/body state + stability
{
Mech__StateUpdateRecord *record = (Mech__StateUpdateRecord *)message;
if (getenv("BT_GAITEV"))
DEBUG_STREAM << "[t3rx] legState=" << record->legState
<< " reset=" << record->legResetLatch
<< " myLegState=" << (int)legStateAlarm.GetLevel()
<< " myLegFrm=" << legAnimation.currentFrame
<< " spd=" << record->speedDemand << "\n" << std::flush;
{
// CLOCK GUARD (keyboard-skip fix): the base reader stamps lastUpdate=Now()
// on EVERY record ('HACK' per SIMULATE.cpp:276). Non-pose records carry no