blob: e3285d01f9ffce1013e83518dfbb0546801d106c [file] [log] [blame]
Austin Schuh18cb1df2023-01-28 11:13:35 -08001#ifndef FRC971_IMU_READER_IMU_H_
2#define FRC971_IMU_READER_IMU_H_
3
Ravago Jonese12b7902022-02-04 22:50:44 -08004#include "aos/events/shm_event_loop.h"
5#include "frc971/wpilib/imu_batch_generated.h"
Ravago Jonese12b7902022-02-04 22:50:44 -08006
Austin Schuh18cb1df2023-01-28 11:13:35 -08007namespace frc971::imu {
Ravago Jonese12b7902022-02-04 22:50:44 -08008
9// Reads IMU packets from the kernel driver which reads them over spi
10// from the Raspberry Pi Pico on the IMU board.
11class Imu {
12 public:
Austin Schuh18cb1df2023-01-28 11:13:35 -080013 // Constructs an IMU reader object. encoder_scalar is in meters/count.
14 Imu(aos::ShmEventLoop *event_loop, double encoder_scalar);
Ravago Jonese12b7902022-02-04 22:50:44 -080015 ~Imu();
16
17 private:
18 flatbuffers::Offset<frc971::ADIS16470DiagStat> PackDiagStat(
19 flatbuffers::FlatBufferBuilder *fbb, uint16_t value);
20 flatbuffers::Offset<frc971::IMUValues> ProcessReading(
21 flatbuffers::FlatBufferBuilder *fbb, absl::Span<uint8_t> buf);
22 double ConvertValue32(absl::Span<const uint8_t> data, double lsb_per_output);
23 double ConvertValue16(absl::Span<const uint8_t> data, double lsb_per_output);
24
25 aos::ShmEventLoop *event_loop_;
26 aos::Sender<frc971::IMUValuesBatch> imu_sender_;
27 int imu_fd_;
28
29 uint failed_checksums_ = 0;
Austin Schuh18cb1df2023-01-28 11:13:35 -080030
31 double encoder_scalar_;
Ravago Jonese12b7902022-02-04 22:50:44 -080032};
Austin Schuh18cb1df2023-01-28 11:13:35 -080033
34} // namespace frc971::imu
35
36#endif // FRC971_IMU_READER_IMU_H_