Skip to content

HIL Test Jig ​

This is the hardware test shape for faults that host tests cannot prove.

Nodes ​

  • Node A: device under test running Arc firmware and reporting arc::HilDeadline results.
  • Node B: physical fault injector that can pull I2C low, drop SPI CS during a transaction, and flood TWAI/CAN with priority-inversion frames.
  • Node C: ESP-NOW jammer that transmits during scheduled swarm windows to test arc::net::DistributedRcu and DeadReckoning recovery.

Script Model ​

Use arc::HilScript<N> to describe which node applies each arc::HilFault, at which tick, and for how long. Board policy implements Policy::apply(HilAction).

For nanosecond-scale closed-loop tests, use arc::hil::DigitalTwin on a simulator S3. The capture policy samples DUT PWM timing, the twin steps a fixed arc::dsp::StateSpace model, and the encoder policy emits ABI/Z-style feedback through board-owned RMT/GPIO wiring.

Pass Criteria ​

  • arc::I2cBus::init() returns a recoverable error and can be retried after the fault clears.
  • SPI transactions fail without wedging the RTOS or corrupting the next transfer.
  • CAN/TWAI priority spam is recorded but does not starve the control loop.
  • ESP-NOW loss makes remote state stale, then DeadReckoning predicts until the next valid scheduled frame arrives.

Evidence Artifact ​

The jig should emit one JSON object per line. Each required case must report "status":"pass":

json
{"case":"i2c_fault_recovery","status":"pass","node":"A"}
{"case":"spi_fault_recovery","status":"pass","node":"A"}
{"case":"can_priority_spam","status":"pass","node":"A"}
{"case":"espnow_stale_recover","status":"pass","node":"A"}

Validate the captured artifact before attaching it to a release or safety review:

bash
./tools/hil-evidence-check.py hil.jsonl
./tools/hil-evidence-check.py --format json hil.jsonl

ESP32-S3 first. ESP-IDF native. Static ownership by default.