31#include "../../../SensorBuildOpt.h"
32#if !SENSORLIB_EXCLUDE_BMM150
47 struct bmm150_mag_data mag_data = {0, 0, 0};
48 if (bmm150_read_mag_data(&mag_data, _dev.get()) != BMM150_OK) {
67 updateInterruptStatus();
68 data.
overflow = (_dev->int_status & BMM150_INT_DATA_OVERFLOW) != 0;
75 if (!updateInterruptStatus()) {
78 return (_dev->int_status & BMM150_INT_ASSERTED_DRDY) != 0;
87 _error_code = bmm150_soft_reset(_dev.get());
88 if (_error_code != BMM150_OK) {
93 _error_code = bmm150_get_sensor_settings(&_settings, _dev.get());
94 return _error_code == BMM150_OK;
102 return bmm150_perform_self_test(BMM150_SELF_TEST_NORMAL, _dev.get()) == BMM150_OK;
112 SENSORLIB_LOG_E(
"BMM150 does not support configurable full-scale range");
123 const int odr_x100 =
static_cast<int>(odr * 100.0f + 0.5f);
124 uint8_t data_rate = 0;
127 data_rate = BMM150_DATA_RATE_02HZ;
130 data_rate = BMM150_DATA_RATE_06HZ;
133 data_rate = BMM150_DATA_RATE_08HZ;
136 data_rate = BMM150_DATA_RATE_10HZ;
139 data_rate = BMM150_DATA_RATE_15HZ;
142 data_rate = BMM150_DATA_RATE_20HZ;
145 data_rate = BMM150_DATA_RATE_25HZ;
148 data_rate = BMM150_DATA_RATE_30HZ;
155 _settings.data_rate = data_rate;
156 _error_code = bmm150_set_sensor_settings(BMM150_SEL_DATA_RATE, &_settings, _dev.get());
157 if (_error_code != BMM150_OK) {
174 _settings.pwr_mode = BMM150_POWERMODE_NORMAL;
177 _settings.pwr_mode = BMM150_POWERMODE_FORCED;
180 _settings.pwr_mode = BMM150_POWERMODE_SLEEP;
186 _error_code = bmm150_set_op_mode(&_settings, _dev.get());
187 if (_error_code != BMM150_OK) {
201 uint8_t xy_rep = BMM150_REPXY_REGULAR;
202 uint8_t z_rep = BMM150_REPZ_REGULAR;
205 xy_rep = BMM150_REPXY_HIGHACCURACY;
206 z_rep = BMM150_REPZ_HIGHACCURACY;
210 xy_rep = BMM150_REPXY_ENHANCED;
211 z_rep = BMM150_REPZ_ENHANCED;
215 xy_rep = BMM150_REPXY_REGULAR;
216 z_rep = BMM150_REPZ_REGULAR;
220 xy_rep = BMM150_REPXY_LOWPOWER;
221 z_rep = BMM150_REPZ_LOWPOWER;
228 _settings.xy_rep = xy_rep;
229 _settings.z_rep = z_rep;
230 _error_code = bmm150_set_sensor_settings(BMM150_SEL_XY_REP | BMM150_SEL_Z_REP, &_settings, _dev.get());
231 return _error_code == BMM150_OK;
260bool SensorBMM150::initImpl(uint8_t param)
268 std::memset(&_settings, 0,
sizeof(_settings));
270 _dev = std::make_unique<struct bmm150_dev>();
275 std::memset(_dev.get(), 0,
sizeof(
struct bmm150_dev));
279 _dev->intf = BMM150_I2C_INTF;
282 _dev->intf = BMM150_SPI_INTF;
293 _error_code = bmm150_init(_dev.get());
294 if (_error_code != BMM150_OK) {
298 _error_code = bmm150_get_sensor_settings(&_settings, _dev.get());
299 if (_error_code != BMM150_OK) {
328bool SensorBMM150::updateInterruptStatus()
333 return bmm150_get_interrupt_status(_dev.get()) == BMM150_OK;
@ MAGNETOMETER
Magnetometer sensor.
OperationMode
Enumeration of sensor operation modes.
MagFullScaleRange
Enumeration defining full-scale range settings for the sensor.
MagDownSampleRatio
Enumeration defining down-sample ratios for the sensor.
@ DSR_1
1x down-sample ratio
MagOverSampleRatio
Enumeration defining over-sample ratios for the sensor.
@ OSR_8
8x over-sample ratio
@ OSR_4
4x over-sample ratio
@ OSR_2
2x over-sample ratio
@ OSR_1
1x over-sample ratio
#define SENSORLIB_LOG_E(...)
bool ensureValid() const override
Ensure the communication interface is valid.
std::unique_ptr< SensorCommStatic > staticComm
std::unique_ptr< SensorHal > hal
uint16_t _oversampling_rate
bool setOutputDataRate(float odr) override
Set output data rate.
bool readData(MagnetometerData &data) override
Read one magnetometer sample.
bool isDataReady() override
Check if fresh data is ready.
bool setOperationMode(OperationMode mode) override
Set operation mode.
bool setDownsamplingRate(MagDownSampleRatio dsr) override
Set downsampling rate.
bool selfTest() override
Execute BMM150 normal self-test.
bool reset() override
Reset the sensor using external pin and software reset.
bool configMagnetometer(OperationMode mode, MagFullScaleRange range, float odr, MagOverSampleRatio osr, MagDownSampleRatio dsr=MagDownSampleRatio::DSR_1) override
Apply combined magnetometer configuration.
bool setFullScaleRange(MagFullScaleRange range) override
Set full-scale range.
bool setOversamplingRate(MagOverSampleRatio osr) override
Set oversampling level by mapping to BMM150 XY/Z repetition values.
SensorBMM150()
Construct a BMM150 driver instance.
SensorConfig _config
Current configuration.
SensorInfo _info
Sensor information.
static int8_t sensor_static_read_data(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr)
static int8_t sensor_static_write_data(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr)
static void sensor_static_delay_us(uint32_t us, void *private_data)
float microTeslaToGauss(float ut)
Converts microTesla to Gauss.
float calculateHeading(const MagnetometerData &data, float declination=0.0f)
Calculate heading (yaw) angle from magnetometer data in radians.
Structure representing magnetometer data.
float heading_degrees
heading angle (degrees)
float heading
heading angle (radians)
bool skip_data
skip data flag
SensorVector magnetic_field
magnetic field strength (Gauss)
bool overflow
data overflow flag
int16_t x
X-axis raw value.
int16_t y
Y-axis raw value.
int16_t z
Z-axis raw value.
uint32_t latency
Reporting latency in milliseconds.
float sample_rate
Sample rate in Hz.
float range
Measurement range.
SensorType type
Type of the sensor.
OperationMode mode
Operation mode.
uint8_t version
Hardware/firmware version.
uint8_t i2c_address
Default I2C address.
uint32_t uid
Unique identifier.
SensorType type
Sensor type.
const char * manufacturer
Manufacturer name.
const char * model
Model name/identifier.