Skip to content

Commit 73749fd

Browse files
committed
[wip] Add LIS2MDL + doxygen
1 parent 4e8a1c4 commit 73749fd

File tree

8 files changed

+468
-4
lines changed

8 files changed

+468
-4
lines changed

src/components/i2c/controller.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ static const std::map<std::string, FnCreateI2CSensorDriver> I2cFactorySensor = {
173173
const char *driver_name) -> drvBase * {
174174
return new drvLis3dh(i2c, addr, mux_channel, driver_name);
175175
}},
176+
{"lis2mdl",
177+
[](TwoWire *i2c, uint16_t addr, uint32_t mux_channel,
178+
const char *driver_name) -> drvBase * {
179+
return new drvLis2mdl(i2c, addr, mux_channel, driver_name);
180+
}},
176181
{"lis3mdl",
177182
[](TwoWire *i2c, uint16_t addr, uint32_t mux_channel,
178183
const char *driver_name) -> drvBase * {

src/components/i2c/controller.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "drivers/drvIna238.h"
4141
#include "drivers/drvIna260.h"
4242
#include "drivers/drvLc709203f.h"
43+
#include "drivers/drvLis2mdl.h"
4344
#include "drivers/drvLis3dh.h"
4445
#include "drivers/drvLsm303agr.h"
4546
#include "drivers/drvLsm303dlh.h"
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/*!
2+
* @file drvLis2mdl.cpp
3+
*
4+
* Driver wrapper for the Adafruit LIS2MDL 3-axis magnetometer.
5+
*/
6+
7+
#include "drvLis2mdl.h"
8+
9+
#include <math.h>
10+
11+
namespace {
12+
constexpr uint8_t kLis2mdlDefaultAddr = 0x1E;
13+
}
14+
15+
/******************************************************************************/
16+
/*!
17+
@brief Destructor for the LIS2MDL driver wrapper.
18+
*/
19+
/******************************************************************************/
20+
drvLis2mdl::~drvLis2mdl() {
21+
if (_mag) {
22+
delete _mag;
23+
_mag = nullptr;
24+
}
25+
}
26+
27+
/******************************************************************************/
28+
/*!
29+
@brief Initializes the LIS2MDL sensor and begins I2C.
30+
@returns True if initialized successfully, False otherwise.
31+
*/
32+
/******************************************************************************/
33+
bool drvLis2mdl::begin() {
34+
WS_DEBUG_PRINTLN("[drvLis2mdl] Initialising sensor");
35+
36+
if (_mag) {
37+
delete _mag;
38+
_mag = nullptr;
39+
}
40+
41+
_mag = new Adafruit_LIS2MDL();
42+
if (!_mag) {
43+
return false;
44+
}
45+
46+
const uint8_t addr =
47+
_address == 0 ? kLis2mdlDefaultAddr : static_cast<uint8_t>(_address);
48+
if (!_mag->begin(addr, _i2c)) {
49+
WS_DEBUG_PRINTLN("[drvLis2mdl] Failed to initialise sensor");
50+
delete _mag;
51+
_mag = nullptr;
52+
return false;
53+
}
54+
55+
_mag->setDataRate(LIS2MDL_RATE_50_HZ);
56+
_mag->enableInterrupts(false);
57+
_mag->interruptsActiveHigh(false);
58+
59+
WS_DEBUG_PRINTLN("[drvLis2mdl] Sensor initialised successfully");
60+
return true;
61+
}
62+
63+
/******************************************************************************/
64+
/*!
65+
@brief Reads the LIS2MDL's magnetometer event.
66+
@param event Pointer to the magnetometer event to populate.
67+
@returns True if the event was obtained successfully.
68+
*/
69+
/******************************************************************************/
70+
bool drvLis2mdl::readMagEvent(sensors_event_t *event) {
71+
if (!_mag) {
72+
return false;
73+
}
74+
return _mag->getEvent(event);
75+
}
76+
77+
/******************************************************************************/
78+
/*!
79+
@brief Computes the vector magnitude of a magnetometer reading.
80+
@param event Magnetometer event to evaluate.
81+
@param magnitude Reference to store the computed magnitude (micro Tesla).
82+
@returns True if the magnitude was computed successfully.
83+
*/
84+
/******************************************************************************/
85+
bool drvLis2mdl::computeMagnitude(const sensors_event_t &event,
86+
float &magnitude) {
87+
magnitude =
88+
sqrtf(event.magnetic.x * event.magnetic.x +
89+
event.magnetic.y * event.magnetic.y +
90+
event.magnetic.z * event.magnetic.z);
91+
return true;
92+
}
93+
94+
/******************************************************************************/
95+
/*!
96+
@brief Gets the LIS2MDL's raw sensor event (magnitude stored in data[0]).
97+
@param rawEvent Pointer to the sensor event.
98+
@returns True if the sensor event was obtained successfully.
99+
*/
100+
/******************************************************************************/
101+
bool drvLis2mdl::getEventRaw(sensors_event_t *rawEvent) {
102+
sensors_event_t magEvent;
103+
if (!readMagEvent(&magEvent)) {
104+
return false;
105+
}
106+
107+
float magnitude = 0.0f;
108+
computeMagnitude(magEvent, magnitude);
109+
rawEvent->data[0] = magnitude;
110+
return true;
111+
}
112+
113+
/******************************************************************************/
114+
/*!
115+
@brief Gets the LIS2MDL's boolean sensor event.
116+
@param booleanEvent Pointer to the sensor event.
117+
@returns True once the placeholder value has been populated.
118+
*/
119+
/******************************************************************************/
120+
bool drvLis2mdl::getEventBoolean(sensors_event_t *booleanEvent) {
121+
// Magnetometers do not emit boolean events; reserve the field for future use.
122+
booleanEvent->data[0] = 0.0f;
123+
return true;
124+
}
125+
126+
/******************************************************************************/
127+
/*!
128+
@brief Gets the LIS2MDL's magnetometer sensor event (x,y,z in microTesla).
129+
@param magEvent Pointer to the magnetometer sensor event.
130+
@returns True if the sensor event was obtained successfully.
131+
*/
132+
/******************************************************************************/
133+
bool drvLis2mdl::getEventMagneticField(sensors_event_t *magEvent) {
134+
return readMagEvent(magEvent);
135+
}
136+
137+
/******************************************************************************/
138+
/*!
139+
@brief Registers the driver's default magnetometer sensor type.
140+
*/
141+
/******************************************************************************/
142+
void drvLis2mdl::ConfigureDefaultSensorTypes() {
143+
_default_sensor_types_count = 1;
144+
_default_sensor_types[0] =
145+
wippersnapper_sensor_SensorType_SENSOR_TYPE_MAGNETIC_FIELD;
146+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*!
2+
* @file drvLis2mdl.h
3+
*
4+
* Driver wrapper for the Adafruit LIS2MDL 3-axis magnetometer.
5+
*
6+
* Adafruit invests time and resources providing this open source code,
7+
* please support Adafruit and open-source hardware by purchasing
8+
* products from Adafruit!
9+
*
10+
* MIT license, all text here must be included in any redistribution.
11+
*/
12+
#ifndef DRV_LIS2MDL_H
13+
#define DRV_LIS2MDL_H
14+
15+
#include "Wippersnapper_V2.h"
16+
#include "drvBase.h"
17+
18+
#include <Adafruit_LIS2MDL.h>
19+
20+
/**************************************************************************/
21+
/*!
22+
@brief Class that provides a driver interface for a LIS2MDL magnetometer.
23+
*/
24+
/**************************************************************************/
25+
class drvLis2mdl : public drvBase {
26+
public:
27+
drvLis2mdl(TwoWire *i2c, uint16_t sensorAddress, uint32_t mux_channel,
28+
const char *driver_name)
29+
: drvBase(i2c, sensorAddress, mux_channel, driver_name) {}
30+
31+
/**************************************************************************/
32+
/*!
33+
@brief Destructor for the LIS2MDL driver wrapper.
34+
*/
35+
/**************************************************************************/
36+
~drvLis2mdl();
37+
38+
/**************************************************************************/
39+
/*!
40+
@brief Initializes the LIS2MDL sensor and begins I2C.
41+
@returns True if initialized successfully, False otherwise.
42+
*/
43+
/**************************************************************************/
44+
bool begin() override;
45+
46+
/**************************************************************************/
47+
/*!
48+
@brief Gets a raw magnetometer magnitude event (micro Tesla).
49+
@param rawEvent Pointer to the destination sensor event.
50+
@returns True if the event was obtained successfully.
51+
*/
52+
/**************************************************************************/
53+
bool getEventRaw(sensors_event_t *rawEvent) override;
54+
55+
/**************************************************************************/
56+
/*!
57+
@brief Placeholder boolean event implementation for compatibility.
58+
@param booleanEvent Pointer to the destination sensor event.
59+
@returns True once the placeholder event has been populated.
60+
*/
61+
/**************************************************************************/
62+
bool getEventBoolean(sensors_event_t *booleanEvent) override;
63+
64+
/**************************************************************************/
65+
/*!
66+
@brief Retrieves the LIS2MDL's magnetometer vector event.
67+
@param magEvent Pointer to the destination sensor event.
68+
@returns True if the event was obtained successfully.
69+
*/
70+
/**************************************************************************/
71+
bool getEventMagneticField(sensors_event_t *magEvent) override;
72+
73+
protected:
74+
/**************************************************************************/
75+
/*!
76+
@brief Registers the default virtual sensors exposed by the driver.
77+
*/
78+
/**************************************************************************/
79+
void ConfigureDefaultSensorTypes() override;
80+
81+
private:
82+
/**************************************************************************/
83+
/*!
84+
@brief Reads a magnetometer event from the LIS2MDL helper.
85+
@param event Pointer to the destination sensor event.
86+
@returns True if the event was obtained successfully.
87+
*/
88+
/**************************************************************************/
89+
bool readMagEvent(sensors_event_t *event);
90+
91+
/**************************************************************************/
92+
/*!
93+
@brief Computes the vector magnitude of a magnetometer reading.
94+
@param event Magnetometer event to evaluate.
95+
@param magnitude Reference to store the computed magnitude (micro Tesla).
96+
@returns True if the magnitude was computed successfully.
97+
*/
98+
/**************************************************************************/
99+
bool computeMagnitude(const sensors_event_t &event, float &magnitude);
100+
101+
Adafruit_LIS2MDL *_mag = nullptr;
102+
};
103+
104+
#endif // DRV_LIS2MDL_H

src/components/i2c/drivers/drvLsm303agr.cpp

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,16 @@ constexpr uint8_t kLsm303agrMagDefaultAddr = 0x1E; // LIS2MDL address
1414
}
1515

1616
/******************************************************************************/
17-
/*! @brief Destructor */
17+
/*!
18+
@brief Destructor for the LSM303AGR driver wrapper.
19+
*/
1820
/******************************************************************************/
1921
drvLsm303agr::~drvLsm303agr() { teardown(); }
2022

23+
/******************************************************************************/
24+
/*!
25+
@brief Releases any allocated accelerometer or magnetometer instances.
26+
*/
2127
/******************************************************************************/
2228
void drvLsm303agr::teardown() {
2329
if (_accel) {
@@ -30,6 +36,11 @@ void drvLsm303agr::teardown() {
3036
}
3137
}
3238

39+
/******************************************************************************/
40+
/*!
41+
@brief Initializes the LSM303AGR accelerometer and LIS2MDL magnetometer.
42+
@returns True if initialization succeeded, False otherwise.
43+
*/
3344
/******************************************************************************/
3445
bool drvLsm303agr::begin() {
3546
teardown();
@@ -71,6 +82,13 @@ bool drvLsm303agr::begin() {
7182
return true;
7283
}
7384

85+
/******************************************************************************/
86+
/*!
87+
@brief Computes the magnitude of the accelerometer vector.
88+
@param magnitude Reference to store the computed m/s^2 value.
89+
@returns True if the accelerometer event was retrieved successfully.
90+
*/
91+
/******************************************************************************/
7492
bool drvLsm303agr::computeAccelMagnitude(float &magnitude) {
7593
if (!_accel) {
7694
return false;
@@ -85,6 +103,13 @@ bool drvLsm303agr::computeAccelMagnitude(float &magnitude) {
85103
return true;
86104
}
87105

106+
/******************************************************************************/
107+
/*!
108+
@brief Fills the raw event with the accelerometer magnitude in data[0].
109+
@param rawEvent Pointer to the destination sensor event.
110+
@returns True if the magnitude was computed successfully.
111+
*/
112+
/******************************************************************************/
88113
bool drvLsm303agr::getEventRaw(sensors_event_t *rawEvent) {
89114
float magnitude = 0.0f;
90115
if (!computeAccelMagnitude(magnitude)) {
@@ -94,20 +119,39 @@ bool drvLsm303agr::getEventRaw(sensors_event_t *rawEvent) {
94119
return true;
95120
}
96121

122+
/******************************************************************************/
123+
/*!
124+
@brief Retrieves the 3-axis accelerometer event.
125+
@param accelEvent Pointer to the destination sensor event.
126+
@returns True if the event was populated successfully.
127+
*/
128+
/******************************************************************************/
97129
bool drvLsm303agr::getEventAccelerometer(sensors_event_t *accelEvent) {
98130
if (!_accel) {
99131
return false;
100132
}
101133
return _accel->getEvent(accelEvent);
102134
}
103135

136+
/******************************************************************************/
137+
/*!
138+
@brief Retrieves the 3-axis magnetic field event.
139+
@param magEvent Pointer to the destination sensor event.
140+
@returns True if the event was populated successfully.
141+
*/
142+
/******************************************************************************/
104143
bool drvLsm303agr::getEventMagneticField(sensors_event_t *magEvent) {
105144
if (!_mag) {
106145
return false;
107146
}
108147
return _mag->getEvent(magEvent);
109148
}
110149

150+
/******************************************************************************/
151+
/*!
152+
@brief Registers the driver's default accelerometer and magnetometer types.
153+
*/
154+
/******************************************************************************/
111155
void drvLsm303agr::ConfigureDefaultSensorTypes() {
112156
_default_sensor_types_count = 2;
113157
_default_sensor_types[0] =

0 commit comments

Comments
 (0)