| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- /*
- * @file icm20948.h
- *
- * Created on: Dec 26, 2020
- * Author: mokhwasomssi
- *
- * Modified: Juraj Dudak
- * Date: 30.12.2022
- */
- #ifndef __ICM20948_H__
- #define __ICM20948_H__
- #include "IcmSpiManager.h"
- #include <stdbool.h>
- class Sensor{
- protected:
- int8_t _activeDevice;
- IcmSpiManager *_spi;
- public:
- float _scaleFactor;
- axisesI data;
- int16_t offset_x;
- int16_t offset_y;
- int16_t offset_z;
- Sensor(IcmSpiManager *spi, int8_t _activeDevice);
- void SetScaleFactor(float sf);
- void SetRange();
- void SetLowPassFilter();
- uint8_t SetSampleRate();
- uint8_t GetLowPassFilter(void);
- uint8_t GetSampleRate(void);
- uint8_t GetRange(void);
- uint8_t CheckLowPassInputValue(uint8_t);
- void Calibrate(void);
- uint8_t GetDataStatus(void);
- bool _read_without_scale_factor(axisesI* data);
- void SaveOffset(void);
- virtual axisesI *GetData(void) = 0;
- virtual bool Read(axisesI *) = 0;
- virtual bool ReadUnit(axisesF *)= 0;
- };
- class SensorAccel : public Sensor {
- public:
- SensorAccel(IcmSpiManager *spi, int8_t _activeDevice);
- axisesI *GetData(void);
- bool Read(axisesI *);
- bool ReadUnit(axisesF*);
- void SetRange(accel_full_scale r);
- void SetLowPassFilter(accel_dlp_cfg config);
- uint8_t SetSampleRate(accel_samplerate divider);
- uint8_t CheckLowPassInputValue(uint8_t);
- void Calibrate(void);
- bool _read_without_scale_factor(axisesI* data);
- void SaveOffset(void);
- uint8_t GetLowPassFilter(void);
- uint8_t GetSampleRate(void);
- uint8_t GetRange(void);
- };
- class SensorGyro: public Sensor {
- public:
- SensorGyro(IcmSpiManager *spi, int8_t _activeDevice);
- axisesI *GetData(void);
- bool Read(axisesI *);
- bool ReadUnit(axisesF*);
- void SetRange(gyro_full_scale r);
- void SetLowPassFilter(gyro_dlp_cfg config);
- uint8_t SetSampleRate(gyro_samplerate divider);
- uint8_t CheckLowPassInputValue(uint8_t);
- void Calibrate(void);
- void SaveOffset(void);
- uint8_t GetLowPassFilter(void);
- uint8_t GetSampleRate(void);
- uint8_t GetRange(void);
- };
- class SensorMag: public Sensor {
- public:
- SensorMag(IcmSpiManager *spi, int8_t _activeDevice);
- axisesI *GetData(void);
- bool Read(axisesI *);
- bool ReadUnit(axisesF*);
- };
- class Icm20948{
- private:
- uint8_t _numDevices;
- int8_t _activeDevice;
- IcmSpiManager *_spi_manager;
- McuPin_typeDef *_pinINT;
- bool _ak09916_enable;
- bool _sensor_ready;
- bool _is_present;
- bool icm20948_who_am_i();
- void icm20948_spi_slave_enable();
- void icm20948_i2c_master_reset();
- void icm20948_i2c_master_enable();
- void icm20948_i2c_master_clk_frq(uint8_t config);
- void icm20948_clock_source(uint8_t source);
- void icm20948_odr_align_enable();
- void ak09916_init(Config_Mag_t *config);
- bool ak09916_who_am_i();
- void ak09916_operation_mode_setting(AK09916_operation_mode mode);
- void ak09916_soft_reset();
- public:
- SensorAccel *accSensor;
- SensorGyro *gyroSensor;
- SensorMag *magSensor;
- Icm20948();
- Icm20948(IcmSpiManager *spi, icm20948_Config *config);
- void SetInterruptSource(interrupt_source_enum int_source);
- void Calibrate(icm20948_Config *config);
- void Read(void);
- void Wakeup(void);
- void Sleep(void);
- uint8_t IsSleep(void);
- bool IsReady(void);
- uint8_t GetDataStatus(void);
- uint8_t GetIndex(void);
- uint8_t GetIndexZeroBased(void);
- void Reset(void);
- void Stop(void);
- void Start(void);
- uint8_t IsPresent(void);
- };
- #define ASSERT_SENSOR {if (_is_present == false) {;}}
- #endif /* __ICM20948_H__ */
|