icm20948.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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 "SpiManager.h"
  13. #include "icm_datatypes.h"
  14. #include <stdbool.h>
  15. class Sensor{
  16. protected:
  17. int8_t _activeDevice;
  18. SpiManager *_spi;
  19. public:
  20. float _scaleFactor;
  21. axises data;
  22. int16_t offset_x;
  23. int16_t offset_y;
  24. int16_t offset_z;
  25. Sensor(SpiManager *spi, int8_t _activeDevice);
  26. void SetScaleFactor(float sf);
  27. void SetRange();
  28. void SetLowPassFilter();
  29. uint8_t SetSampleRate();
  30. uint8_t GetLowPassFilter(void);
  31. uint8_t GetSampleRate(void);
  32. uint8_t GetRange(void);
  33. uint8_t CheckLowPassInputValue(uint8_t);
  34. void Calibrate(void);
  35. uint8_t GetDataStatus(void);
  36. bool _read_without_scale_factor(axises* data);
  37. void SaveOffset(void);
  38. virtual axises *GetData(void) = 0;
  39. virtual bool Read(axises *) = 0;
  40. virtual bool ReadUnit(axises *) = 0;
  41. };
  42. class SensorAccel : public Sensor {
  43. public:
  44. SensorAccel(SpiManager *spi, int8_t _activeDevice);
  45. axises *GetData(void);
  46. bool Read(axises *);
  47. bool ReadUnit(axises *);
  48. void SetRange(accel_full_scale r);
  49. void SetLowPassFilter(accel_dlp_cfg config);
  50. uint8_t SetSampleRate(accel_samplerate divider);
  51. uint8_t CheckLowPassInputValue(uint8_t);
  52. void Calibrate(void);
  53. bool _read_without_scale_factor(axises* data);
  54. void SaveOffset(void);
  55. uint8_t GetLowPassFilter(void);
  56. uint8_t GetSampleRate(void);
  57. uint8_t GetRange(void);
  58. };
  59. class SensorGyro: public Sensor {
  60. public:
  61. SensorGyro(SpiManager *spi, int8_t _activeDevice);
  62. axises *GetData(void);
  63. bool Read(axises *);
  64. bool ReadUnit(axises *);
  65. void SetRange(gyro_full_scale r);
  66. void SetLowPassFilter(gyro_dlp_cfg config);
  67. uint8_t SetSampleRate(gyro_samplerate divider);
  68. uint8_t CheckLowPassInputValue(uint8_t);
  69. void Calibrate(void);
  70. void SaveOffset(void);
  71. uint8_t GetLowPassFilter(void);
  72. uint8_t GetSampleRate(void);
  73. uint8_t GetRange(void);
  74. };
  75. class SensorMag: public Sensor {
  76. public:
  77. SensorMag(SpiManager *spi, int8_t _activeDevice);
  78. axises *GetData(void);
  79. bool Read(axises *);
  80. bool ReadUnit(axises *);
  81. };
  82. class Icm20948{
  83. private:
  84. uint8_t _numDevices;
  85. int8_t _activeDevice;
  86. SpiManager *_spi;
  87. McuPin_typeDef *_pinINT;
  88. bool _ak09916_enable;
  89. bool _sensor_ready;
  90. bool _is_present;
  91. bool icm20948_who_am_i();
  92. void icm20948_spi_slave_enable();
  93. void icm20948_i2c_master_reset();
  94. void icm20948_i2c_master_enable();
  95. void icm20948_i2c_master_clk_frq(uint8_t config);
  96. void icm20948_clock_source(uint8_t source);
  97. void icm20948_odr_align_enable();
  98. void ak09916_init(Config_Mag_t *config);
  99. bool ak09916_who_am_i();
  100. void ak09916_operation_mode_setting(AK09916_operation_mode mode);
  101. void ak09916_soft_reset();
  102. public:
  103. SensorAccel *accSensor;
  104. SensorGyro *gyroSensor;
  105. SensorMag *magSensor;
  106. Icm20948(SpiManager *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__ */