M5Unit-IMU 0.0.2 git rev:e5b00aa
Loading...
Searching...
No Matches
unit_mag3110.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_IMU_UNIT_UNIT_MAG3110_HPP
11#define M5_UNIT_IMU_UNIT_UNIT_MAG3110_HPP
12
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <memory>
16#include "unit_mag3110_data.hpp"
18
19namespace m5 {
20namespace unit {
21
28class UnitMAG3110 : public Component,
29 public PeriodicMeasurementAdapter<UnitMAG3110, mag3110::Data>,
31 M5_UNIT_COMPONENT_HPP_BUILDER(UnitMAG3110, 0x0E);
32
33public:
38 struct config_t {
40 bool start_periodic{true};
46 mag3110::DataRate rate{mag3110::DataRate::Rate80Hz};
48 mag3110::OverSampling over_sampling{mag3110::OverSampling::X16};
49 };
50
53 explicit UnitMAG3110(const uint8_t addr = DEFAULT_ADDRESS);
55 virtual ~UnitMAG3110()
56 {
57 }
58
60 virtual bool begin() override;
63 virtual void update(const bool force = false) override;
64
69 {
70 return _cfg;
71 }
73 void config(const config_t& cfg)
74 {
75 _cfg = cfg;
76 }
78
87 bool softReset();
89
92
105 bool writeDataRate(const mag3110::DataRate rate, const mag3110::OverSampling os);
115
118
133
136
142 bool sleep() override;
150 bool wakeup() override;
152
157 virtual m5::imu::Capability imuSpec() const override
158 {
159 return m5::imu::Capability::Mag;
160 }
167 virtual void imuConvertParam(m5::imu::imu_convert_param_t& out) const override;
169
170protected:
171 bool start_periodic_measurement(const mag3110::DataRate rate, const mag3110::OverSampling os);
172 bool start_periodic_measurement();
173 bool stop_periodic_measurement();
174 bool read_measurement(mag3110::Data& d);
175
176 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitMAG3110, mag3110::Data);
177
178private:
179 config_t _cfg{};
180 // Live state, seeded from _cfg by begin() and thereafter owned by writeDataRate(); _cfg is only
181 // ever read in begin()
182 mag3110::DataRate _rate{mag3110::DataRate::Rate80Hz};
183 mag3110::OverSampling _os{mag3110::OverSampling::X16};
184 uint32_t _pushed{}, _consumed{};
185 std::unique_ptr<m5::container::CircularBuffer<mag3110::Data>> _data{};
186};
187
188namespace mag3110 {
190constexpr uint32_t DEFAULT_STORED_SIZE{4};
191
192namespace command {
194constexpr uint8_t REG_DR_STATUS{0x00}; // burst start: DR_STATUS + X/Y/Z (big-endian) = 7 bytes
195constexpr uint8_t REG_WHO_AM_I{0x07}; // = 0xC4
196constexpr uint8_t REG_CTRL_REG1{0x10}; // DR[7:5] OS[4:3] FR[2] TM[1] AC[0]
197constexpr uint8_t REG_CTRL_REG2{0x11}; // AUTO_MRST_EN[7] RAW[5] Mag_RST[4]
199} // namespace command
200} // namespace mag3110
201
202} // namespace unit
203} // namespace m5
204#endif
Thin contract between measurement units and consumers (e.g. AHRS)
Definition imu_data_source.hpp:27
NXP/Freescale MAG3110 3-axis magnetometer. No standalone GROVE unit exists; it is the magnetometer on...
Definition unit_mag3110.hpp:30
bool writeDataRate(const mag3110::DataRate rate, const mag3110::OverSampling os)
Write the output data rate and over sampling ratio.
Definition unit_mag3110.cpp:77
bool stopPeriodicMeasurement()
Mark periodic measurement as stopped (bookkeeping only; the chip stays in ACTIVE – call sleep() to dr...
Definition unit_mag3110.cpp:193
bool readDataRate(mag3110::DataRate &rate, mag3110::OverSampling &os)
Read the output data rate and over sampling ratio.
Definition unit_mag3110.cpp:103
bool softReset()
Soft reset (the MAG3110 has no reset command; returns to STANDBY via REG_CTRL_REG1),...
Definition unit_mag3110.cpp:115
virtual void update(const bool force=false) override
Update the unit.
Definition unit_mag3110.cpp:131
virtual ~UnitMAG3110()
Destructor.
Definition unit_mag3110.hpp:55
config_t config() const
Gets the configuration.
Definition unit_mag3110.hpp:68
virtual m5::imu::Capability imuSpec() const override
Capability of this unit.
Definition unit_mag3110.hpp:157
void config(const config_t &cfg)
Set the configuration.
Definition unit_mag3110.hpp:73
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_mag3110.cpp:188
virtual bool begin() override
Begin the unit.
Definition unit_mag3110.cpp:44
bool sleep() override
Enter STANDBY mode (REG_CTRL_REG1 AC cleared)
Definition unit_mag3110.cpp:198
virtual void imuConvertParam(m5::imu::imu_convert_param_t &out) const override
Gets the conversion parameters for raw IMU data.
Definition unit_mag3110.cpp:256
UnitMAG3110(const uint8_t addr=DEFAULT_ADDRESS)
Construct with the I2C address the chip will answer on.
Definition unit_mag3110.cpp:35
virtual m5::imu::Capability readImuRaw(m5::imu::imu_raw_data_t &out) override
Read the latest raw IMU data.
Definition unit_mag3110.cpp:232
bool wakeup() override
Leave STANDBY.
Definition unit_mag3110.cpp:212
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
Unit-related namespace.
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_mag3110.hpp:38
mag3110::DataRate rate
Definition unit_mag3110.hpp:46
bool start_periodic
Start periodic measurement on begin()?
Definition unit_mag3110.hpp:40
mag3110::OverSampling over_sampling
Over sampling ratio, which sets the noise floor. See mag3110::OverSampling.
Definition unit_mag3110.hpp:48
One MAG3110 sample: a 7-byte burst from DR_STATUS (0x00)
Definition unit_mag3110_data.hpp:92
MAG3110 setting enums and measurement data (framework independent)
DataRate
Output data rate select (REG_CTRL_REG1 DR[7:5])
Definition unit_mag3110_data.hpp:28
OverSampling
Over sampling ratio (REG_CTRL_REG1 OS[4:3])
Definition unit_mag3110_data.hpp:47