Summary
Host polling of OW_CAMERA_GET_TELEMETRY (0x54) at 1 Hz during HISTO streaming wedges the histogram stream: all cameras stop delivering HISTO frames after a variable few seconds-to-a-minute, while FSIN keeps counting and the cameras keep running. The telemetry channel itself stays healthy throughout — only HISTO dies.
Without host polling, the same firmware streams cleanly — the firmware's own 125 ms round-robin background telemetry sweep is not the trigger. The sustained 1 Hz COMM query (604-byte response on IF 0) while IF 1 streams is.
Evidence (three runs, same rig, same day)
Data on the bench PC under openmotion-sdk\.claude\worktrees\camera-scan-off-cycle-e49e7e\bench\telem_dip_out\:
| Run |
Duration |
1 Hz host polling |
Result |
TELDIP_01 |
30 min |
yes |
All 4 cameras stopped at t = 4.6 s (abs_id 185); terminal FSYNC count 72004 (cameras ran the full 30 min). Telemetry stayed healthy the whole scan: 1789/1789 valid rows, 0 I2C errors, sweeps fresh ~7.6 s/cam. |
TELSMOKE |
90 s |
yes |
Frames stopped at t = 59.2 s — variable onset, race-like. |
WEDGETEST_NOPOLL |
150 s |
no (fw background sweep still active) |
Streamed clean to the full 150 s, 6007 frames/camera. |
Firmware-side log evidence (from the SDK pipeline): terminal fsync count 72004 names abs_id 72004 but side=right cam_id=N last delivered abs_id=185 — camera stopped delivering 71819 frames before scan end.
Why this matters
The SDK-side docstring for get_camera_telemetry() says it is "safe to poll during scans" because the query does no camera I2C at request time. That's true for camera I2C — but in practice sustained polling still kills the HISTO endpoint, so the flagship use case of the telemetry (watching camera condition during an acquisition) currently sacrifices the acquisition.
Prior related observation: on fw 1.8.1-rc.3, 8-camera streaming + concurrent host I2C passthrough killed HISTO in ~2 s (the known wedge hazard). This looks like the 4-camera variant of the same underlying contention, now reachable through the supported telemetry query alone. Suspected area: USB/main-loop contention servicing the large IF 0 TX while IF 1 has data pending.
Suggested angles
- Reproduce with dwell on response size: does a small COMM query at 1 Hz also wedge, or is the 604-B response the differentiator?
- Inspect the IF 0 TX path for blocking/starvation while IF 1 streaming has data pending.
- Consider a firmware-side gate (defer/queue telemetry responses while HISTO is enabled) or a documented safe polling cadence.
Refs: #94, PR #95, SDK PR OpenwaterHealth/openmotion-sdk#163.
Summary
Host polling of
OW_CAMERA_GET_TELEMETRY(0x54) at 1 Hz during HISTO streaming wedges the histogram stream: all cameras stop delivering HISTO frames after a variable few seconds-to-a-minute, while FSIN keeps counting and the cameras keep running. The telemetry channel itself stays healthy throughout — only HISTO dies.Without host polling, the same firmware streams cleanly — the firmware's own 125 ms round-robin background telemetry sweep is not the trigger. The sustained 1 Hz COMM query (604-byte response on IF 0) while IF 1 streams is.
1.8.2-dev.1-3-g7f8fe08(next@ PR feat: continuous camera-sensor telemetry (#94) — background sweep + OW_CAMERA_GET_TELEMETRY #95 merge)CameraTelemetryCsvLogger(SDK PR #163), 1 Hzget_camera_telemetry()polling started pre-scan and running through the scanEvidence (three runs, same rig, same day)
Data on the bench PC under
openmotion-sdk\.claude\worktrees\camera-scan-off-cycle-e49e7e\bench\telem_dip_out\:TELDIP_01TELSMOKEWEDGETEST_NOPOLLFirmware-side log evidence (from the SDK pipeline):
terminal fsync count 72004 names abs_id 72004 but side=right cam_id=N last delivered abs_id=185 — camera stopped delivering 71819 frames before scan end.Why this matters
The SDK-side docstring for
get_camera_telemetry()says it is "safe to poll during scans" because the query does no camera I2C at request time. That's true for camera I2C — but in practice sustained polling still kills the HISTO endpoint, so the flagship use case of the telemetry (watching camera condition during an acquisition) currently sacrifices the acquisition.Prior related observation: on fw 1.8.1-rc.3, 8-camera streaming + concurrent host I2C passthrough killed HISTO in ~2 s (the known wedge hazard). This looks like the 4-camera variant of the same underlying contention, now reachable through the supported telemetry query alone. Suspected area: USB/main-loop contention servicing the large IF 0 TX while IF 1 has data pending.
Suggested angles
Refs: #94, PR #95, SDK PR OpenwaterHealth/openmotion-sdk#163.