libDM_no_dep_mmc5983ma 0.0
libDM_no_dep_mmc5983ma is a library called libDM_no_dep_mmc5983ma (add description here)
Loading...
Searching...
No Matches
libDM_mmc5983ma.hpp
1#ifndef mmc5983ma_hpp
2#define mmc5983ma_hpp
3
4// Warning: A lot of registers are not readable!! So we have to store a local copy of what each
5// register should contain
6
7// NOLINTBEGIN(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)
8
9#include "libDM_abstract_sensor_protocol.hpp"
10#include "libDM_abstract_mag.hpp"
11#include "libDM_mmc5983ma_regs_enums.hpp"
12#include <map>
13
14class MMC5983MA_SPI : public ABSTRACT_SENSOR_SPI, public ABSTRACT_MAG
15{
16public:
17 MMC5983MA_SPI(uint32_t spiClockSpeed,
18 uint8_t spiSS,
19 SPIClass* spiObj,
20 SPI_CONF spiConfAtEndTransaction) :
21 ABSTRACT_SENSOR_SPI(spiSS,
22 spiObj,
23 SPI_CONF(spiClockSpeed, MSBFIRST, SPI_MODE0),
24 spiConfAtEndTransaction),
25 ABSTRACT_MAG(){};
26
27 virtual ~MMC5983MA_SPI() = default;
28 // Copy constructor
29 MMC5983MA_SPI(const MMC5983MA_SPI& other) = default;
30 // Copy assignment operator
31 MMC5983MA_SPI& operator=(const MMC5983MA_SPI& other) = default;
32 // Move constructor
33 MMC5983MA_SPI(MMC5983MA_SPI&& other) noexcept = default;
34 // Move assignment operator
35 MMC5983MA_SPI& operator=(MMC5983MA_SPI&& other) noexcept = default;
36
37 // ~~~~~~ Redefined virtual methods ~~~~~~ //
38 bool begin() override;
39 void readTemp() override;
40 void readMag() override;
41 uint8_t whoAmI() override;
42
43 // ~~~~~~~~~ Mmc specific methods ~~~~~~~~ //
49 void setMagOdrBw(MMC5983MA_ENUM::ODR magFreq, MMC5983MA_ENUM::BW magBw);
50
55 void setPeriodicSetTime(MMC5983MA_ENUM::PERIODIC_SET_TIME time);
56
61 void setPeriodicSetState(bool state);
62
67 void setAutoSetResetState(bool state);
68
72 void softResetSensor();
73
77 void setCurrent();
78
82 void resetCurrent();
83
88
93
99 void activateAxis(bool activeX, bool activeYZ);
100
108 void updateBridgeOffset();
109
117 void setMeasCheckStates(bool magCheck, bool tempCheck);
118
119private:
120 using ABSTRACT_SENSOR_SPI::readRegister;
121 using ABSTRACT_SENSOR_SPI::readRegisterBurst;
122 using ABSTRACT_SENSOR_SPI::writeRegister;
123 using ABSTRACT_SENSOR_SPI::writeRegisterWithMask;
124
125 // Internal values
126 MMC5983MA_ENUM::ODR mMagFreq = MMC5983MA_ENUM::ODR::_100HZ;
127 MMC5983MA_ENUM::BW mMagBW = MMC5983MA_ENUM::BW::_100HZ;
128 MMC5983MA_ENUM::PERIODIC_SET_TIME mMagPeriodicSetTime = MMC5983MA_ENUM::PERIODIC_SET_TIME::_1;
129 float mBridgeOffset[3] = {0.F, 0.F, 0.F};
130 struct
131 {
132 bool temp = true;
133 bool mag = true;
134 } mChecks;
135
136 uint32_t mUsTimeOutMeasReading = 100U; // [ns] 100us timeout for meas reading
137 // NOLINTBEGIN(altera-struct-pack-align)
138 struct
139 {
140 float tempLow = -75.F;
141 float tempHigh = 125.F;
142 float tempRange = 255.F;
143 float tempSlope = (tempHigh - tempLow) / tempRange;
144 float magLow = -8.F;
145 float magHigh = 8.F;
146 float magRange = 262144.F; // 18bits
147 float magSlope = (magHigh - magLow) / magRange;
148 } mConversions;
149 // NOLINTEND(altera-struct-pack-align)
150
154
155 // ~~~~~~~~~~~ Private methods ~~~~~~~~~~~ //
156 bool tryStart();
157 void powerOnSensors(); // activate mag
158 void fillOutputStruct(const int32_t rawMag[3], int16_t rawTemp, uint32_t timestamp);
159 void setContinuousModeState(bool state);
160 MMC5983MA_ENUM::STATUS getMeasuresStatus();
161
162 // ~~~~~~~~~~~ Association maps ~~~~~~~~~~ //
163 std::map<MMC5983MA_ENUM::ODR, uint8_t> enum_odr_to_mag_odr_map = {
164 {MMC5983MA_ENUM::ODR::_1000HZ, regVal.CONTROL_2.MEAS_FREQ_1000HZ},
165 {MMC5983MA_ENUM::ODR::_200HZ, regVal.CONTROL_2.MEAS_FREQ_200HZ},
166 {MMC5983MA_ENUM::ODR::_100HZ, regVal.CONTROL_2.MEAS_FREQ_100HZ},
167 {MMC5983MA_ENUM::ODR::_50HZ, regVal.CONTROL_2.MEAS_FREQ_50HZ},
168 {MMC5983MA_ENUM::ODR::_20HZ, regVal.CONTROL_2.MEAS_FREQ_20HZ},
169 {MMC5983MA_ENUM::ODR::_10HZ, regVal.CONTROL_2.MEAS_FREQ_10HZ},
170 {MMC5983MA_ENUM::ODR::_1HZ, regVal.CONTROL_2.MEAS_FREQ_1HZ},
171 {MMC5983MA_ENUM::ODR::_OFF, regVal.CONTROL_2.DISABLE_CONTINUOUS_MEAS}};
172
173 std::map<MMC5983MA_ENUM::PERIODIC_SET_TIME, uint8_t> enum_periodic_set_to_mag_periodic_map = {
174 {MMC5983MA_ENUM::PERIODIC_SET_TIME::_2000, regVal.CONTROL_2.PERIODIC_SET_2000},
175 {MMC5983MA_ENUM::PERIODIC_SET_TIME::_1000, regVal.CONTROL_2.PERIODIC_SET_1000},
176 {MMC5983MA_ENUM::PERIODIC_SET_TIME::_500, regVal.CONTROL_2.PERIODIC_SET_500},
177 {MMC5983MA_ENUM::PERIODIC_SET_TIME::_250, regVal.CONTROL_2.PERIODIC_SET_250},
178 {MMC5983MA_ENUM::PERIODIC_SET_TIME::_100, regVal.CONTROL_2.PERIODIC_SET_250},
179 {MMC5983MA_ENUM::PERIODIC_SET_TIME::_75, regVal.CONTROL_2.PERIODIC_SET_75},
180 {MMC5983MA_ENUM::PERIODIC_SET_TIME::_25, regVal.CONTROL_2.PERIODIC_SET_25},
181 {MMC5983MA_ENUM::PERIODIC_SET_TIME::_1, regVal.CONTROL_2.PERIODIC_SET_1},
182 {MMC5983MA_ENUM::PERIODIC_SET_TIME::_OFF, regVal.CONTROL_2.DISABLE_PERIODIC_SET}};
183
184 std::map<MMC5983MA_ENUM::BW, uint8_t> enum_bw_to_mag_bw_map = {
185 {MMC5983MA_ENUM::BW::_800HZ, regVal.CONTROL_1.BW_800HZ},
186 {MMC5983MA_ENUM::BW::_400HZ, regVal.CONTROL_1.BW_400HZ},
187 {MMC5983MA_ENUM::BW::_200HZ, regVal.CONTROL_1.BW_200HZ},
188 {MMC5983MA_ENUM::BW::_100HZ, regVal.CONTROL_1.BW_100HZ}};
189
190 // ~~~~~~~~~~~~~~ Class name ~~~~~~~~~~~~~ //
191 String mClassName = "MMC5983MA_SPI";
192};
193
194// NOLINTEND(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)
195
196#endif
Definition libDM_mmc5983ma.hpp:15
void setPeriodicSetTime(MMC5983MA_ENUM::PERIODIC_SET_TIME time)
Sets the periodic set time for the MMC5983MA sensor.
Definition libDM_mmc5983ma.cpp:181
void activateAxis(bool activeX, bool activeYZ)
Activates or deactivates the specified axes.
Definition libDM_mmc5983ma.cpp:74
void resetCurrent()
Manually reset current degaussing.
Definition libDM_mmc5983ma.cpp:298
void softResetSensor()
Performs a soft reset of the sensor.
Definition libDM_mmc5983ma.cpp:62
void askForOneMagMeasure()
Asks for one magnetic measurement.
Definition libDM_mmc5983ma.cpp:314
void setMagOdrBw(MMC5983MA_ENUM::ODR magFreq, MMC5983MA_ENUM::BW magBw)
Sets the magnetometer output data rate (ODR) and bandwidth (BW).
Definition libDM_mmc5983ma.cpp:104
void setCurrent()
Manually apply set current degaussing.
Definition libDM_mmc5983ma.cpp:282
void setPeriodicSetState(bool state)
Will enable or disable the periodic set feature of the MMC5983MA sensor.
Definition libDM_mmc5983ma.cpp:203
void setMeasCheckStates(bool magCheck, bool tempCheck)
Sets the measurement check states for the magnetometer and temperature sensor.
Definition libDM_mmc5983ma.cpp:232
void updateBridgeOffset()
Updates the bridge offset.
Definition libDM_mmc5983ma.cpp:243
void askForOneTempMeasure()
Asks for one temperature measurement.
Definition libDM_mmc5983ma.cpp:331
void setAutoSetResetState(bool state)
Enable the automatic set/reset feauture of the MMC5983MA sensor.
Definition libDM_mmc5983ma.cpp:138
Definition libDM_mmc5983ma_regs_enums.hpp:165
Definition libDM_mmc5983ma_regs_enums.hpp:58
Definition libDM_mmc5983ma_regs_enums.hpp:81