icm20948.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. Sensor(SpiManager *spi, int8_t _activeDevice);
  23. void SetScaleFactor(float sf);
  24. void SetRange();
  25. void SetLowPassFilter();
  26. void SetSampleRate();
  27. uint8_t GetLowPassFilter(void);
  28. uint8_t GetSampleRate(void);
  29. virtual axises *GetData(void) = 0;
  30. virtual bool Read(axises *) = 0;
  31. virtual bool ReadUnit(axises *) = 0;
  32. };
  33. class SensorAccel : public Sensor {
  34. public:
  35. SensorAccel(SpiManager *spi, int8_t _activeDevice);
  36. axises *GetData(void);
  37. bool Read(axises *);
  38. bool ReadUnit(axises *);
  39. void SetRange(accel_full_scale r);
  40. void SetLowPassFilter(accel_dlp_cfg config);
  41. void SetSampleRate(accel_samplerate divider);
  42. uint8_t GetLowPassFilter(void);
  43. uint8_t GetSampleRate(void);
  44. };
  45. class SensorGyro: public Sensor {
  46. public:
  47. SensorGyro(SpiManager *spi, int8_t _activeDevice);
  48. axises *GetData(void);
  49. bool Read(axises *);
  50. bool ReadUnit(axises *);
  51. void SetRange(gyro_full_scale r);
  52. void SetLowPassFilter(gyro_dlp_cfg config);
  53. void SetSampleRate(gyro_samplerate divider);
  54. uint8_t GetLowPassFilter(void);
  55. uint8_t GetSampleRate(void);
  56. };
  57. class SensorMag: public Sensor {
  58. public:
  59. SensorMag(SpiManager *spi, int8_t _activeDevice);
  60. axises *GetData(void);
  61. bool Read(axises *);
  62. bool ReadUnit(axises *);
  63. };
  64. class Icm20948{
  65. private:
  66. uint8_t _numDevices;
  67. int8_t _activeDevice;
  68. SpiManager *_spi;
  69. McuPin_typeDef *_pinINT;
  70. bool _ak09916_enable;
  71. bool icm20948_who_am_i();
  72. void icm20948_spi_slave_enable();
  73. void icm20948_i2c_master_reset();
  74. void icm20948_i2c_master_enable();
  75. void icm20948_i2c_master_clk_frq(uint8_t config);
  76. void icm20948_clock_source(uint8_t source);
  77. void icm20948_odr_align_enable();
  78. void icm20948_gyro_calibration(void);
  79. void icm20948_accel_calibration();
  80. void icm20948_device_reset();
  81. void ak09916_init(Config_Mag_t *config);
  82. bool ak09916_who_am_i();
  83. void ak09916_operation_mode_setting(AK09916_operation_mode mode);
  84. void ak09916_soft_reset();
  85. public:
  86. SensorAccel *accSensor;
  87. SensorGyro *gyroSensor;
  88. SensorMag *magSensor;
  89. Icm20948(SpiManager *spi, icm20948_Config *config);
  90. void SetInterruptSource(interrupt_source_enum int_source);
  91. void Calibrate(void);
  92. void Read(void);
  93. void Wakeup(void);
  94. void Sleep(void);
  95. uint8_t IsSleep(void);
  96. uint8_t GetDataStatus(void);
  97. };
  98. #endif /* __ICM20948_H__ */