10#ifndef M5_UNIT_IMU_UNIT_UNIT_BMM350_HPP
11#define M5_UNIT_IMU_UNIT_UNIT_BMM350_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
27 public PeriodicMeasurementAdapter<UnitBMM350, bmm350::Data>,
29 M5_UNIT_COMPONENT_HPP_BUILDER(
UnitBMM350, 0x14);
49 explicit UnitBMM350(
const uint8_t addr = DEFAULT_ADDRESS);
56 virtual bool begin()
override;
59 virtual void update(
const bool force =
false)
override;
135 bool sleep()
override;
152 return m5::imu::Capability::Mag | m5::imu::Capability::Temp;
165 bool start_periodic_measurement();
166 bool stop_periodic_measurement();
168 bool write_register8_verified(
const uint8_t reg,
const uint8_t val);
171 bool read_registers(
const uint8_t reg, uint8_t* out,
const uint32_t len);
172 bool read_register8(
const uint8_t reg, uint8_t& out);
184 bmm350::otp_compensation_t _comp{};
185 uint32_t _pushed{}, _consumed{};
186 std::unique_ptr<m5::container::CircularBuffer<bmm350::Data>> _data{};
192constexpr uint32_t DEFAULT_STORED_SIZE{8};
197constexpr uint8_t REG_CHIP_ID{0x00};
198constexpr uint8_t REG_PMU_CMD_AGGR_SET{0x04};
199constexpr uint8_t REG_PMU_CMD{0x06};
200constexpr uint8_t REG_PMU_CMD_STATUS_0{0x07};
201constexpr uint8_t REG_INT_CTRL{0x2E};
202constexpr uint8_t REG_INT_STATUS{0x30};
203constexpr uint8_t REG_MAG_X_XLSB{0x31};
204constexpr uint8_t REG_OTP_CMD{0x50};
205constexpr uint8_t REG_OTP_DATA_MSB{0x52};
206constexpr uint8_t REG_OTP_DATA_LSB{0x53};
207constexpr uint8_t REG_OTP_STATUS{0x55};
208constexpr uint8_t REG_CMD{0x7E};
Thin contract between measurement units and consumers (e.g. AHRS)
Definition imu_data_source.hpp:27
3-axis magnetometer unit (U231, GROVE)
Definition unit_bmm350.hpp:28
virtual m5::imu::Capability imuSpec() const override
Capability of this unit.
Definition unit_bmm350.hpp:150
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_bmm350.cpp:301
config_t config() const
Gets the configuration.
Definition unit_bmm350.hpp:65
bool writeAveraging(const bmm350::Averaging avg)
Write the averaging factor (clamped to what the current rate accepts)
Definition unit_bmm350.cpp:360
virtual m5::imu::Capability readImuRaw(m5::imu::imu_raw_data_t &out) override
Read the latest raw IMU data.
Definition unit_bmm350.cpp:537
bool readDataRate(bmm350::DataRate &rate)
Read the output data rate from the device (REG_PMU_CMD_AGGR_SET bits[3:0])
Definition unit_bmm350.cpp:375
bool sleep() override
Put the chip into suspend mode (REG_PMU_CMD suspend)
Definition unit_bmm350.cpp:306
bool softReset()
Soft reset (REG_CMD CMD_SOFTRESET), then re-run the mandatory post-reset initialization (OTP download...
Definition unit_bmm350.cpp:199
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_bmm350.cpp:296
void config(const config_t &cfg)
Set the configuration.
Definition unit_bmm350.hpp:71
bool writeDataRate(const bmm350::DataRate rate)
Write the output data rate (averaging is re-clamped to the new rate)
Definition unit_bmm350.cpp:344
bool readAveraging(bmm350::Averaging &avg)
Read the averaging factor from the device (REG_PMU_CMD_AGGR_SET bits[5:4])
Definition unit_bmm350.cpp:390
virtual void update(const bool force=false) override
Update the unit.
Definition unit_bmm350.cpp:239
virtual void imuConvertParam(m5::imu::imu_convert_param_t &out) const override
Gets the conversion parameters for raw IMU data.
Definition unit_bmm350.cpp:563
UnitBMM350(const uint8_t addr=DEFAULT_ADDRESS)
Construct with the I2C address the chip will answer on.
Definition unit_bmm350.cpp:153
virtual bool begin() override
Begin the unit.
Definition unit_bmm350.cpp:162
virtual ~UnitBMM350()
Destructor.
Definition unit_bmm350.hpp:51
bool wakeup() override
Return the chip to normal mode.
Definition unit_bmm350.cpp:320
Public interface for IMU data providers.
Capability
Capability of the IMU data source (bitwise combinable)
Definition imu_types.hpp:22
Top level namespace of M5Stack.
Definition ahrs_controller.cpp:26
Raw to physical unit conversion coefficients.
Definition imu_types.hpp:69
Unified raw data (chip-native axes, no remap applied)
Definition imu_types.hpp:57
Settings for begin()
Definition unit_bmm350.hpp:38
bool start_periodic
Start periodic measurement on begin()?
Definition unit_bmm350.hpp:40
bmm350::Averaging avg
Averaging factor (clamped to what the rate accepts, see clamp_averaging())
Definition unit_bmm350.hpp:44
bmm350::DataRate rate
Output data rate.
Definition unit_bmm350.hpp:42
One measurement (12 bytes burst from REG_MAG_X_XLSB, register 0x31): 9 bytes magnetometer (X,...
Definition unit_bmm350_data.hpp:152
Per-chip OTP compensation coefficients (read out at boot from the sensor's one-time-programmable memo...
Definition unit_bmm350_data.hpp:102
BMM350 setting enums and measurement data (framework independent)
Averaging
Averaging factor (REG_PMU_CMD_AGGR_SET register 0x04, bits[5:4])
Definition unit_bmm350_data.hpp:41
DataRate
Output data rate (REG_PMU_CMD_AGGR_SET register 0x04, bits[3:0])
Definition unit_bmm350_data.hpp:25