118 lines
7.2 KiB
Markdown
118 lines
7.2 KiB
Markdown
# Hardware outage fixtures
|
|
|
|
These captures came from the assembled XIAO ESP32-C3 prototype. The files
|
|
contain only complete, CRC-valid `TRK1` frames.
|
|
|
|
The two forced-outage captures used a temporary validation build that made the
|
|
packet writer report failure while acquisition kept running. That injection was
|
|
removed before production firmware was built and flashed.
|
|
|
|
- `forced_outage_3s.trk` — SHA-256
|
|
`01482816cdaa668e4681c33c8baa1df331d733b9bbcbc4f448ece25e88185ad6`.
|
|
It contains 2,144 contiguous samples, sequences 0 through 2,143, with no
|
|
reported drops, overruns, or timestamp saturation.
|
|
- `forced_outage_7s.trk` — SHA-256
|
|
`2ea8a5742944bdebc13bec2ccdbceba75f0bb71e48c856b0f86285878e190cd3`.
|
|
It contains 1,840 delivered samples. The sole sequence gap is 511 to 650:
|
|
138 samples were dropped after the 512-entry queue filled, the cumulative
|
|
drop count reached 138, and the corresponding timestamp delta is exactly
|
|
1,390,000 us.
|
|
- `direct_usb_stall.trk` — SHA-256
|
|
`40f874b7eaa7f705524ecdd75f832e8a724252366633116ac015fc75dfd16558`.
|
|
This came from the direct USB driver build after leaving the enumerated USB
|
|
endpoint without a serial reader long enough to overflow the acquisition
|
|
queue. It contains 864 samples. The retained block ends at sequence 511,
|
|
delivery resumes at 1,706, and both the sole 1,194-sample gap and the device's
|
|
cumulative drop counter equal 1,194. There are no packet gaps, CRC failures,
|
|
loop overruns, trailing bytes, or timestamp-saturation flags.
|
|
|
|
The first captured sample is sequence 8 because the flashing process still
|
|
had the endpoint open long enough to drain sequences 0 through 7 before the
|
|
capture application opened. That is deliberate evidence of the remaining
|
|
distinction: USB endpoint drain is observable, but application receipt
|
|
requires the planned acknowledgement/replay layer.
|
|
- `direct_usb_3c95f3d.trk` — SHA-256
|
|
`f495486f094a758bb785e145026e3934d60b52dd5083aef7f5d896195d967869`.
|
|
This is the validated-frame output from the final exact-commit smoke capture:
|
|
1,680 contiguous samples, sequences 0 through 1,679, with zero packet/sample
|
|
gaps, resets, CRC failures, reported drops, loop overruns, trailing bytes, or
|
|
timestamp saturation.
|
|
- `direct_usb_3c95f3d.wire` — SHA-256
|
|
`3bdaeadff7962c6eac48c4ebeda285c8eb359e439d5e1728104add2009122c03`.
|
|
This is the byte-for-byte wire side of the same capture. It contains 563 bytes
|
|
of startup text before the valid frames. That text includes the literal
|
|
`TRK1`, producing one rejected candidate header as designed. Extracting all
|
|
valid frames reproduces `direct_usb_3c95f3d.trk` byte-for-byte.
|
|
- `direct_usb_73e5680.trk` — SHA-256
|
|
`fd34bb3bf8f92a64960024f1287e553c03076ff3714fe629ec629bec81ddf821`.
|
|
This exact firmware-hardening capture contains 1,184 contiguous samples,
|
|
sequences 0 through 1,183, with zero packet/sample gaps, resets, CRC failures,
|
|
reported drops, loop overruns, trailing bytes, or timestamp saturation.
|
|
- `direct_usb_73e5680.wire` — SHA-256
|
|
`82d6d17bbf0729e9bfc53f337ec9adf70bcb5e5898b039685eda5dfa19cf4eea`.
|
|
This is the byte-for-byte `--reset --wire` capture corresponding to the
|
|
validated file above. Its 3,589 skipped startup bytes and one candidate-header
|
|
rejection are deterministic, and extracting its 151 valid frames reproduces
|
|
`direct_usb_73e5680.trk` byte-for-byte.
|
|
- `ble_reconnect_483ace3.trk` — SHA-256
|
|
`c4a0d795cdf9d490acaca0144c3ad33f85bbfb2214d3f7abdfe515c4e5f25398`.
|
|
This is the resumed half of a real macOS receiver interruption against exact
|
|
firmware commit `483ace3`. It contains 2,576 contiguous samples, sequences
|
|
1,992 through 4,567, with zero packet/sample gaps, resets, CRC failures,
|
|
reported drops, loop overruns, trailing bytes, or timestamp saturation. The
|
|
final status records one disconnect and one deliberate frame replay, with
|
|
zero notification failures or invalid ACKs. It validates that the 10.24-second
|
|
queue covered the measured resubscription interval without permanent loss.
|
|
Of its 2,575 contiguous sample intervals, 1,293 differ from exactly 10 ms.
|
|
Absolute deviation has a 4 us median, 160 us p95, 170 us p99, and 780 us
|
|
maximum; cumulative error is 152 us over 25.75 seconds. This records bounded
|
|
BLE scheduling jitter without rate drift and requires timestamp-derived `dt`
|
|
in future fusion work.
|
|
- `ble_mtu_race_4bf00eb.trk` — SHA-256
|
|
`4a231b54a3c7320fd69cac869b830e94aca8f704f946881b9cdfd21991bfa41f`.
|
|
This exact-commit stress capture followed six rapid subscribe, first-fragment,
|
|
and disconnect cycles aimed at the MTU lookup race. Telemetry remained live
|
|
afterward: the capture contains 1,848 CRC-valid samples with zero packet gaps,
|
|
resets, send failures, or invalid ACKs, while status records exactly six
|
|
disconnects and six replays. The test deliberately withheld application ACKs
|
|
beyond the 10.24-second queue window, so sequences 1,024 through 4,021 were
|
|
intentionally lost; the single 2,998-sample gap, matching queue-overflow total,
|
|
demonstrates bounded buffer exhaustion rather than a suspended output task.
|
|
- `ride_20260820_090607.trk` — SHA-256
|
|
`c938934c0905748d2f8d8be61cff1ff446d8415b34850628654967398fd7d91f`.
|
|
This is the Android recorder acceptance capture after increasing the firmware
|
|
queue to 3,072 samples (30.72 seconds). Bluetooth was deliberately disabled
|
|
from the phone for five seconds and then restored. The completed capture
|
|
contains 2,578 consecutive packets and 19,984 consecutive samples, both
|
|
starting at sequence zero, with zero CRC/header errors, packet/sample gaps,
|
|
sensor failures, queue overflows, transport send failures, invalid ACKs,
|
|
loop overruns, or trailing bytes. Firmware status records one disconnect and
|
|
one replay. The Android recorder durably deduplicated that exact replay, as
|
|
recorded in `ride_20260820_090607.session.json` (SHA-256
|
|
`b16a8f0c213a14fd2760b6efba1c6288f3631e57a331c553893e281dce047888`),
|
|
and closed the session with `complete=true` and no error.
|
|
|
|
All 19,983 sample intervals are contiguous. Of those, 8,745 differ from
|
|
exactly 10 ms. Across all intervals, absolute deviation is 0 us median, 40 us
|
|
p95, 240 us p99, and 1,630 us maximum; among only the off-grid intervals it is
|
|
10 us median, 60 us p95, and 750 us p99. Cumulative error is -726 us over
|
|
199.83 seconds. The capture also has six explicitly flagged ADXL345 overruns;
|
|
timestamps are taken before both I2C reads and therefore understate delays
|
|
caused by preemption between the timestamp and physical sensor access.
|
|
|
|
The post-rename phone smoke test for application ID
|
|
`com.jsjdesigns.trikkerecorder` was verified live but not retained as a fixture.
|
|
It closed cleanly with 366 consecutive frames and 2,832 consecutive samples,
|
|
zero CRC/header errors, packet/sample gaps, drops, queue overflows, loop
|
|
overruns, or trailing bytes. The package-only rename did not change the Android
|
|
protocol or storage implementation, and the retained outage fixture above
|
|
remains the authoritative end-to-end acceptance artifact.
|
|
|
|
`tests/test_trikke_protocol.py` verifies the hashes, parses the captures in
|
|
fragmented chunks, and asserts these signatures so the hardware evidence remains
|
|
executable regression data. To inspect a file manually:
|
|
|
|
```sh
|
|
python3 tools/decode_binary.py tests/fixtures/forced_outage_3s.trk /tmp/outage.csv
|
|
```
|