triton.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include "triton.h"
  2. PuckInput g_in[NSLOT];
  3. // Triton report 0x47 carries a 16-bit IMU clock in 32-us units. Unwrap it
  4. // per RF bond slot so translated modes receive the same monotonic microsecond
  5. // source clock shared with 0x42/0x45 reports.
  6. static uint16_t g_triton47LastTick[NSLOT] = {};
  7. static uint32_t g_triton47TimestampUs[NSLOT] = {};
  8. static uint8_t g_triton47TimestampValid[NSLOT] = {};
  9. uint32_t tritonTimestamp47Us(uint8_t slot, uint16_t timestamp32us)
  10. {
  11. if (slot >= NSLOT)
  12. return (uint32_t)timestamp32us * 32u;
  13. if (!g_triton47TimestampValid[slot]) {
  14. g_triton47TimestampValid[slot] = 1;
  15. g_triton47LastTick[slot] = timestamp32us;
  16. g_triton47TimestampUs[slot] = (uint32_t)timestamp32us * 32u;
  17. return g_triton47TimestampUs[slot];
  18. }
  19. uint16_t delta = (uint16_t)(timestamp32us - g_triton47LastTick[slot]);
  20. g_triton47LastTick[slot] = timestamp32us;
  21. g_triton47TimestampUs[slot] += (uint32_t)delta * 32u;
  22. return g_triton47TimestampUs[slot];
  23. }
  24. void tritonTimestamp47Reset(uint8_t slot)
  25. {
  26. if (slot >= NSLOT)
  27. return;
  28. g_triton47LastTick[slot] = 0;
  29. g_triton47TimestampUs[slot] = 0;
  30. g_triton47TimestampValid[slot] = 0;
  31. }
  32. void imuFrom45(const uint8_t *r, int16_t *ax, int16_t *ay, int16_t *az,
  33. int16_t *gx, int16_t *gy, int16_t *gz)
  34. {
  35. *ax = s16off(r, 32);
  36. *ay = s16off(r, 34);
  37. *az = s16off(r, 36);
  38. *gx = s16off(r, 38);
  39. *gy = s16off(r, 40);
  40. *gz = s16off(r, 42);
  41. }