Implementation
Four workstreams and on-device spell gestures.
Implementation — what exists and what remains
Reviewed 14 November 2026. Real UART ranging, physical fixes and walking tests exist. The outstanding work is reliability and capacity acceptance, plus the future TDoA migration.
Radio and wand data path
DWM v1.7.1 was verified on both wands and all five anchors on 12 November; wand ESP 2.3.23-imu was installed and read back on 13 November. Ranging remains SS-TWR multi-poll. The current wand accepts up to five anchors, restores saved radio settings and uploads distances alongside batched IMU. Real-mode anchor lists come from saved configuration/gateway; there is no real over-the-air RSSI discovery fallback.
Verify hardware profile, DWM version/channel/IDs, applied list, multi-poll/CSMA, distinct cycles and actual rate before comparing position results.
Anchor selection and filtering
Gateway selection uses active ONLINE anchors with radio IDs, a 25 m candidate range and a greedy angular-spread heuristic for up to five anchors. A saved manual list takes precedence. The normal movement hysteresis is 3 m.
Position uses the range-domain Kalman path with LM initialization/recovery. Three ranges need a height assumption; a fixed-height override belongs only to a measured constrained setup. It is not a universal jitter fix.
Timing and capacity
Current map: 200 ms, 8 × 25 ms starts, 1 s Wi-Fi references. Start timing is approximate; a cycle may overrun. CSMA exists and was A/B tested with two wands. Adaptive rate/anchor-count control is not applied automatically.
The 13 November moving/static tests still show DF18 delivery loss, relative-heading change and range/geometry inconsistency. Investigate those separately, then validate moving accuracy and larger fleets. A successful update is not tracker acceptance.
Anchor commissioning and recovery
Current assembled anchor kits use UART TX23/RX22; source defaults 4/5 are a separate build variant. Saved radio state is restored before Wi-Fi. ESP firmware disables modem sleep and retries saved connectivity. PoE splitters supply power; management remains Wi-Fi.
Older factory-only ESP layouts need one-time USB migration to two OTA slots. A build's version constant is not a fleet inventory; DWM updates and ESP updates are separate.
TDoA migration
- Test anchor-to-anchor reception in installed mounts and validate a radio-clock synchronization method.
- Add DWM blink timestamps, identity/sequence and quality; transport these records from anchors with loss/age visibility.
- Add wand blink scheduling and gateway correlation, clock conversion and a time-difference solver.
- Compare stationary and moving error, update gaps, latency, recovery and fleet scaling against SS-TWR, preserving rollback.
Wi-Fi packet arrival, USB power and ordinary Ethernet backhaul are not precise radio-clock synchronization.
192.168.4.1. A failed saved anchor connection keeps authenticated access while retrying. Use the device-specific firmware README and docs/DEVICE_MANAGEMENT.md for the exact flow and API secret requirements.Sources: docs/UWB_TDMA_PLAN.md, docs/testing/2026-11-11-anchor-hardware-reference.md, anchor_sw/README.md. Future optical yaw correction is separate from the UWB capacity work.
On-device spell gestures implemented
Current gameplay source embeds bmi270-200hz-2026-10-29-v1, a ten-class TFLite Micro model trained from 1,224 BMI270 recordings. The wand recognizes motion locally; the gateway maps the stable key to a spell and validates Session/ownership, mana, cooldown and bans. Canonical collection-to-deployment guide.
Current hardware and capture
BMI270 SDA6/SCL7; TTP223 touch GPIO20 active HIGH. Hold for 250 ms to arm, perform 150 ms–3 s of motion, release to classify. Body frame +Y up / +Z tip, six axes, gravity retained, no magnetometer. Tracking samples are separately decimated to 100 Hz and sent in 30 Hz UDP batches.
The ten source classes are arcane_t1, fire_t1, heal_t1, heal_t2, heal_t3, ice, lightning_t1, nothing, shield and unlock. Model classes alone do not establish active spell mappings.
Collection is a separate image
wand_tinyml replaces gameplay temporarily. Buffered complete captures upload over TCP 12350, with six RAM slots per wand and durable-save acknowledgements. The checked-in testing target boots into inference; triple-tap switches to collection. Standalone inference reports use UDP 12351. Legacy sample-stream UDP/USB require their explicit matching mode.
Train once, review identity, assign on the server
- Collect a fresh 200 Hz CSV/metadata dataset with representative users, both wands and varied reject motion. Keep old BMI160/100 Hz data separate.
- Train locally; review stable semantic keys and reject flags before export. Current keys are
bmi270_200_v1_<sourceLabel>, not regenerated genericgesture_0indices. - Export the same reviewed model/metadata into
wand_swand a matching manifest; build and install while preserving device settings. - Import the matching catalog into the intended gateway, then review names and assign active spells in admin. Re-import preserves operator names/mappings and keeps rejects inactive.
Current result capacity is 12 classes; the model has 10. Renaming or reassigning a spell needs no reflash. Changed weights need a new model version and installation. Operator spine.