223 static constexpr uint8_t FLASH_CNT = 0x00;
224 static constexpr uint8_t XGYRO_OUT = 0x04;
225 static constexpr uint8_t YGYRO_OUT = 0x06;
226 static constexpr uint8_t ZGYRO_OUT = 0x08;
227 static constexpr uint8_t XACCL_OUT = 0x0A;
228 static constexpr uint8_t YACCL_OUT = 0x0C;
229 static constexpr uint8_t ZACCL_OUT = 0x0E;
230 static constexpr uint8_t XMAGN_OUT = 0x10;
231 static constexpr uint8_t YMAGN_OUT = 0x12;
232 static constexpr uint8_t ZMAGN_OUT = 0x14;
233 static constexpr uint8_t BARO_OUT =
235 static constexpr uint8_t TEMP_OUT = 0x18;
236 static constexpr uint8_t XGYRO_OFF =
238 static constexpr uint8_t YGYRO_OFF =
240 static constexpr uint8_t ZGYRO_OFF =
242 static constexpr uint8_t XACCL_OFF =
244 static constexpr uint8_t YACCL_OFF =
246 static constexpr uint8_t ZACCL_OFF =
248 static constexpr uint8_t XMAGN_HIC =
250 static constexpr uint8_t YMAGN_HIC =
252 static constexpr uint8_t ZMAGN_HIC =
254 static constexpr uint8_t XMAGN_SIC =
256 static constexpr uint8_t YMAGN_SIC =
258 static constexpr uint8_t ZMAGN_SIC =
260 static constexpr uint8_t GPIO_CTRL = 0x32;
261 static constexpr uint8_t MSC_CTRL = 0x34;
262 static constexpr uint8_t SMPL_PRD =
264 static constexpr uint8_t SENS_AVG = 0x38;
265 static constexpr uint8_t SEQ_CNT = 0x3A;
266 static constexpr uint8_t DIAG_STAT = 0x3C;
267 static constexpr uint8_t GLOB_CMD = 0x3E;
268 static constexpr uint8_t ALM_MAG1 = 0x40;
269 static constexpr uint8_t ALM_MAG2 = 0x42;
270 static constexpr uint8_t ALM_SMPL1 = 0x44;
271 static constexpr uint8_t ALM_SMPL2 = 0x46;
272 static constexpr uint8_t ALM_CTRL = 0x48;
273 static constexpr uint8_t LOT_ID1 = 0x52;
274 static constexpr uint8_t LOT_ID2 = 0x54;
275 static constexpr uint8_t PROD_ID = 0x56;
276 static constexpr uint8_t SERIAL_NUM = 0x58;
279 static constexpr double rad_to_deg = 57.2957795;
280 static constexpr double deg_to_rad = 0.0174532;
281 static constexpr double grav = 9.81;
285 double gyro_rate_x = 0.0;
286 double gyro_rate_y = 0.0;
287 double gyro_rate_z = 0.0;
294 bool SwitchToStandardSPI();
296 bool SwitchToAutoSPI();
298 uint16_t ReadRegister(uint8_t reg);
300 void WriteRegister(uint8_t reg, uint16_t val);
310 double m_gyro_rate_x = 0.0;
311 double m_gyro_rate_y = 0.0;
312 double m_gyro_rate_z = 0.0;
313 double m_accel_x = 0.0;
314 double m_accel_y = 0.0;
315 double m_accel_z = 0.0;
316 double m_mag_x = 0.0;
317 double m_mag_y = 0.0;
318 double m_mag_z = 0.0;
324 double m_dt, m_alpha = 0.0;
325 double m_compAngleX, m_compAngleY, m_accelAngleX, m_accelAngleY = 0.0;
328 OffsetData* m_offset_buffer =
nullptr;
330 double m_gyro_rate_offset_x = 0.0;
331 double m_gyro_rate_offset_y = 0.0;
332 double m_gyro_rate_offset_z = 0.0;
335 void InitOffsetBuffer(
int size);
339 int m_accum_count = 0;
342 double m_integ_gyro_angle_x = 0.0;
343 double m_integ_gyro_angle_y = 0.0;
344 double m_integ_gyro_angle_z = 0.0;
347 double FormatFastConverge(
double compAngle,
double accAngle);
349 double FormatRange0to2PI(
double compAngle);
351 double FormatAccelRange(
double accelAngle,
double accelZ);
353 double CompFilterProcess(
double compAngle,
double accelAngle,
double omega);
356 volatile bool m_thread_active =
false;
357 volatile bool m_first_run =
true;
358 volatile bool m_thread_idle =
false;
359 volatile bool m_start_up_mode =
true;
361 bool m_auto_configured =
false;
364 SPI* m_spi =
nullptr;
365 DigitalInput* m_auto_interrupt =
nullptr;
366 bool m_connected{
false};
368 std::thread m_acquire_task;
382 struct NonMovableMutexWrapper {
384 NonMovableMutexWrapper() =
default;
386 NonMovableMutexWrapper(
const NonMovableMutexWrapper&) =
delete;
387 NonMovableMutexWrapper&
operator=(
const NonMovableMutexWrapper&) =
delete;
389 NonMovableMutexWrapper(NonMovableMutexWrapper&&) {}
390 NonMovableMutexWrapper&
operator=(NonMovableMutexWrapper&&) {
394 void lock() { mutex.lock(); }
396 void unlock() { mutex.unlock(); }
398 bool try_lock() noexcept {
return mutex.try_lock(); }
401 mutable NonMovableMutexWrapper m_mutex;
404 static constexpr uint16_t adiscrc[256] = {
405 0x0000, 0x17CE, 0x0FDF, 0x1811, 0x1FBE, 0x0870, 0x1061, 0x07AF, 0x1F3F,
406 0x08F1, 0x10E0, 0x072E, 0x0081, 0x174F, 0x0F5E, 0x1890, 0x1E3D, 0x09F3,
407 0x11E2, 0x062C, 0x0183, 0x164D, 0x0E5C, 0x1992, 0x0102, 0x16CC, 0x0EDD,
408 0x1913, 0x1EBC, 0x0972, 0x1163, 0x06AD, 0x1C39, 0x0BF7, 0x13E6, 0x0428,
409 0x0387, 0x1449, 0x0C58, 0x1B96, 0x0306, 0x14C8, 0x0CD9, 0x1B17, 0x1CB8,
410 0x0B76, 0x1367, 0x04A9, 0x0204, 0x15CA, 0x0DDB, 0x1A15, 0x1DBA, 0x0A74,
411 0x1265, 0x05AB, 0x1D3B, 0x0AF5, 0x12E4, 0x052A, 0x0285, 0x154B, 0x0D5A,
412 0x1A94, 0x1831, 0x0FFF, 0x17EE, 0x0020, 0x078F, 0x1041, 0x0850, 0x1F9E,
413 0x070E, 0x10C0, 0x08D1, 0x1F1F, 0x18B0, 0x0F7E, 0x176F, 0x00A1, 0x060C,
414 0x11C2, 0x09D3, 0x1E1D, 0x19B2, 0x0E7C, 0x166D, 0x01A3, 0x1933, 0x0EFD,
415 0x16EC, 0x0122, 0x068D, 0x1143, 0x0952, 0x1E9C, 0x0408, 0x13C6, 0x0BD7,
416 0x1C19, 0x1BB6, 0x0C78, 0x1469, 0x03A7, 0x1B37, 0x0CF9, 0x14E8, 0x0326,
417 0x0489, 0x1347, 0x0B56, 0x1C98, 0x1A35, 0x0DFB, 0x15EA, 0x0224, 0x058B,
418 0x1245, 0x0A54, 0x1D9A, 0x050A, 0x12C4, 0x0AD5, 0x1D1B, 0x1AB4, 0x0D7A,
419 0x156B, 0x02A5, 0x1021, 0x07EF, 0x1FFE, 0x0830, 0x0F9F, 0x1851, 0x0040,
420 0x178E, 0x0F1E, 0x18D0, 0x00C1, 0x170F, 0x10A0, 0x076E, 0x1F7F, 0x08B1,
421 0x0E1C, 0x19D2, 0x01C3, 0x160D, 0x11A2, 0x066C, 0x1E7D, 0x09B3, 0x1123,
422 0x06ED, 0x1EFC, 0x0932, 0x0E9D, 0x1953, 0x0142, 0x168C, 0x0C18, 0x1BD6,
423 0x03C7, 0x1409, 0x13A6, 0x0468, 0x1C79, 0x0BB7, 0x1327, 0x04E9, 0x1CF8,
424 0x0B36, 0x0C99, 0x1B57, 0x0346, 0x1488, 0x1225, 0x05EB, 0x1DFA, 0x0A34,
425 0x0D9B, 0x1A55, 0x0244, 0x158A, 0x0D1A, 0x1AD4, 0x02C5, 0x150B, 0x12A4,
426 0x056A, 0x1D7B, 0x0AB5, 0x0810, 0x1FDE, 0x07CF, 0x1001, 0x17AE, 0x0060,
427 0x1871, 0x0FBF, 0x172F, 0x00E1, 0x18F0, 0x0F3E, 0x0891, 0x1F5F, 0x074E,
428 0x1080, 0x162D, 0x01E3, 0x19F2, 0x0E3C, 0x0993, 0x1E5D, 0x064C, 0x1182,
429 0x0912, 0x1EDC, 0x06CD, 0x1103, 0x16AC, 0x0162, 0x1973, 0x0EBD, 0x1429,
430 0x03E7, 0x1BF6, 0x0C38, 0x0B97, 0x1C59, 0x0448, 0x1386, 0x0B16, 0x1CD8,
431 0x04C9, 0x1307, 0x14A8, 0x0366, 0x1B77, 0x0CB9, 0x0A14, 0x1DDA, 0x05CB,
432 0x1205, 0x15AA, 0x0264, 0x1A75, 0x0DBB, 0x152B, 0x02E5, 0x1AF4, 0x0D3A,
433 0x0A95, 0x1D5B, 0x054A, 0x1284};
Use DMA SPI to read rate, acceleration, and magnetometer data from the ADIS16448 IMU and return the r...
Definition: ADIS16448_IMU.h:57
units::tesla_t GetMagneticFieldZ() const
units::meters_per_second_squared_t GetAccelZ() const
Returns the acceleration in the Z axis.
units::degree_t GetYFilteredAccelAngle() const
units::degree_t GetGyroAngleX() const
Returns the accumulated gyro angle in the X axis.
units::degree_t GetXFilteredAccelAngle() const
units::degree_t GetYComplementaryAngle() const
units::celsius_t GetTemperature() const
units::degree_t GetAngle() const
Returns the yaw axis angle in degrees (CCW positive).
units::tesla_t GetMagneticFieldY() const
units::degree_t GetXComplementaryAngle() const
int SetYawAxis(IMUAxis yaw_axis)
int ConfigCalTime(CalibrationTime new_cal_time)
Configures the calibration time used for the next calibrate.
ADIS16448_IMU(IMUAxis yaw_axis, SPI::Port port, CalibrationTime cal_time)
IMU constructor on the specified MXP port and orientation.
IMUAxis
Definition: ADIS16448_IMU.h:75
@ kY
Definition: ADIS16448_IMU.h:75
@ kX
Definition: ADIS16448_IMU.h:75
@ kZ
Definition: ADIS16448_IMU.h:75
void Reset()
Reset the gyro.
int ConfigDecRate(uint16_t DecimationRate)
CalibrationTime
Definition: ADIS16448_IMU.h:60
units::pounds_per_square_inch_t GetBarometricPressure() const
void Calibrate()
Initialize the IMU.
units::degrees_per_second_t GetGyroRateX() const
Returns the angular rate in the X axis.
~ADIS16448_IMU() override
units::degrees_per_second_t GetGyroRateY() const
Returns the angular rate in the Y axis.
units::degrees_per_second_t GetRate() const
Returns the yaw axis angular rate in degrees per second (CCW positive).
units::meters_per_second_squared_t GetAccelY() const
Returns the acceleration in the Y axis.
int GetPort() const
Get the SPI port number.
void InitSendable(wpi::SendableBuilder &builder) override
Initializes this Sendable object.
units::degree_t GetGyroAngleY() const
Returns the accumulated gyro angle in the Y axis.
units::degree_t GetGyroAngleZ() const
Returns the accumulated gyro angle in the Z axis.
units::meters_per_second_squared_t GetAccelX() const
Returns the acceleration in the X axis.
IMUAxis GetYawAxis() const
ADIS16448_IMU & operator=(ADIS16448_IMU &&)=default
ADIS16448_IMU(ADIS16448_IMU &&)=default
ADIS16448_IMU()
IMU constructor on onboard MXP CS0, Z-up orientation, and complementary AHRS computation.
units::tesla_t GetMagneticFieldX() const
units::degrees_per_second_t GetGyroRateZ() const
Returns the angular rate in the Z axis.
Class to write to digital outputs.
Definition: DigitalOutput.h:25
C++ wrapper around a HAL simulator boolean value handle.
Definition: SimDevice.h:610
A move-only C++ wrapper around a HAL simulator device handle.
Definition: SimDevice.h:644
C++ wrapper around a HAL simulator double value handle.
Definition: SimDevice.h:535
Definition: SendableBuilder.h:18
A helper class for use with objects that add themselves to SendableRegistry.
Definition: SendableHelper.h:19
Interface for Sendable objects.
Definition: Sendable.h:16
Definition: AprilTagPoseEstimator.h:15
::std::mutex mutex
Definition: mutex.h:17