icm20948.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*
  2. * @file icm20948.h
  3. *
  4. * Created on: Dec 26, 2020
  5. * Author: mokhwasomssi
  6. *
  7. * Modified: Juraj Dudak
  8. * Date: 30.12.2022
  9. */
  10. #ifndef __ICM20948_H__
  11. #define __ICM20948_H__
  12. #include "IcmSpiManager.h"
  13. #include <stdbool.h>
  14. class Sensor{
  15. protected:
  16. int8_t _activeDevice;
  17. IcmSpiManager *_spi;
  18. public:
  19. float _scaleFactor;
  20. axisesI data;
  21. int16_t offset_x;
  22. int16_t offset_y;
  23. int16_t offset_z;
  24. Sensor(IcmSpiManager *spi, int8_t _activeDevice);
  25. void SetScaleFactor(float sf);
  26. void SetRange();
  27. void SetLowPassFilter();
  28. uint8_t SetSampleRate();
  29. uint8_t GetLowPassFilter(void);
  30. uint8_t GetSampleRate(void);
  31. uint8_t GetRange(void);
  32. uint8_t CheckLowPassInputValue(uint8_t);
  33. void Calibrate(void);
  34. uint8_t GetDataStatus(void);
  35. bool _read_without_scale_factor(axisesI* data);
  36. void SaveOffset(void);
  37. virtual axisesI *GetData(void) = 0;
  38. virtual bool Read(axisesI *) = 0;
  39. virtual bool ReadUnit(axisesF *)= 0;
  40. };
  41. class SensorAccel : public Sensor {
  42. public:
  43. SensorAccel(IcmSpiManager *spi, int8_t _activeDevice);
  44. axisesI *GetData(void);
  45. bool Read(axisesI *);
  46. bool ReadUnit(axisesF*);
  47. void SetRange(accel_full_scale r);
  48. void SetLowPassFilter(accel_dlp_cfg config);
  49. uint8_t SetSampleRate(accel_samplerate divider);
  50. uint8_t CheckLowPassInputValue(uint8_t);
  51. void Calibrate(void);
  52. bool _read_without_scale_factor(axisesI* data);
  53. void SaveOffset(void);
  54. uint8_t GetLowPassFilter(void);
  55. uint8_t GetSampleRate(void);
  56. uint8_t GetRange(void);
  57. };
  58. class SensorGyro: public Sensor {
  59. public:
  60. SensorGyro(IcmSpiManager *spi, int8_t _activeDevice);
  61. axisesI *GetData(void);
  62. bool Read(axisesI *);
  63. bool ReadUnit(axisesF*);
  64. void SetRange(gyro_full_scale r);
  65. void SetLowPassFilter(gyro_dlp_cfg config);
  66. uint8_t SetSampleRate(gyro_samplerate divider);
  67. uint8_t CheckLowPassInputValue(uint8_t);
  68. void Calibrate(void);
  69. void SaveOffset(void);
  70. uint8_t GetLowPassFilter(void);
  71. uint8_t GetSampleRate(void);
  72. uint8_t GetRange(void);
  73. };
  74. class SensorMag: public Sensor {
  75. public:
  76. SensorMag(IcmSpiManager *spi, int8_t _activeDevice);
  77. axisesI *GetData(void);
  78. bool Read(axisesI *);
  79. bool ReadUnit(axisesF*);
  80. };
  81. class Icm20948{
  82. private:
  83. uint8_t _numDevices;
  84. int8_t _activeDevice;
  85. IcmSpiManager *_spi_manager;
  86. McuPin_typeDef *_pinINT;
  87. bool _ak09916_enable;
  88. bool _sensor_ready;
  89. bool _is_present;
  90. bool icm20948_who_am_i();
  91. void icm20948_spi_slave_enable();
  92. void icm20948_i2c_master_reset();
  93. void icm20948_i2c_master_enable();
  94. void icm20948_i2c_master_clk_frq(uint8_t config);
  95. void icm20948_clock_source(uint8_t source);
  96. void icm20948_odr_align_enable();
  97. void ak09916_init(Config_Mag_t *config);
  98. bool ak09916_who_am_i();
  99. void ak09916_operation_mode_setting(AK09916_operation_mode mode);
  100. void ak09916_soft_reset();
  101. public:
  102. SensorAccel *accSensor;
  103. SensorGyro *gyroSensor;
  104. SensorMag *magSensor;
  105. Icm20948();
  106. Icm20948(IcmSpiManager *spi, icm20948_Config *config);
  107. void SetInterruptSource(interrupt_source_enum int_source);
  108. void Calibrate(icm20948_Config *config);
  109. void Read(void);
  110. void Wakeup(void);
  111. void Sleep(void);
  112. uint8_t IsSleep(void);
  113. bool IsReady(void);
  114. uint8_t GetDataStatus(void);
  115. uint8_t GetIndex(void);
  116. uint8_t GetIndexZeroBased(void);
  117. void Reset(void);
  118. void Stop(void);
  119. void Start(void);
  120. uint8_t IsPresent(void);
  121. };
  122. #define ASSERT_SENSOR {if (_is_present == false) {;}}
  123. #endif /* __ICM20948_H__ */