From df57bb60284fd0eae53537dff97526a54dd0624e Mon Sep 17 00:00:00 2001
From: Andrea Milluzzo <andrea.milluzzo@skywarder.eu>
Date: Mon, 20 Apr 2020 19:17:13 +0200
Subject: [PATCH] [IMU] LSM9DS1 - headers splitted in .h and .cpp files - new
header with data structs - added includePath in sbs.conf
---
sbs.conf | 7 +-
.../sensors/LSM9DS1/LSM9DS1_AxelGyro.cpp | 332 +++++++++++++++++
src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h | 350 ++++--------------
src/shared/sensors/LSM9DS1/LSM9DS1_Data.h | 85 +++++
.../sensors/LSM9DS1/LSM9DS1_Magneto.cpp | 164 ++++++++
src/shared/sensors/LSM9DS1/LSM9DS1_Magneto.h | 319 ++++++----------
src/tests/drivers/test-lsm9ds1-fifo.cpp | 2 +-
src/tests/drivers/test-lsm9ds1.cpp | 2 +-
8 files changed, 778 insertions(+), 483 deletions(-)
create mode 100644 src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.cpp
create mode 100644 src/shared/sensors/LSM9DS1/LSM9DS1_Data.h
create mode 100644 src/shared/sensors/LSM9DS1/LSM9DS1_Magneto.cpp
diff --git a/sbs.conf b/sbs.conf
index 6fb11ea4a..7a57bd156 100644
--- a/sbs.conf
+++ b/sbs.conf
@@ -151,6 +151,11 @@ Files: src/shared/sensors/SensorManager.cpp
Type: srcfiles
Files: src/shared/drivers/gamma868/Gamma868.cpp
+[lsm9ds1]
+Type: srcfiles
+Files: src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.cpp
+ src/shared/sensors/LSM9DS1/LSM9DS1_Magneto.cpp
+
[xbee]
Type: srcfiles
Files: src/shared/drivers/Xbee/Xbee.cpp
@@ -517,7 +522,7 @@ Main: test-rls
Type: test
BoardId: stm32f407vg_skyward_tortellino
BinName: test-lsm9ds1-fifo
-Include: %shared %spi %logger
+Include: %shared %spi %logger %lsm9ds1
Defines: -DDEBUG
Main: drivers/test-lsm9ds1-fifo
diff --git a/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.cpp b/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.cpp
new file mode 100644
index 000000000..255b4134e
--- /dev/null
+++ b/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.cpp
@@ -0,0 +1,332 @@
+/* LSM9DS1 accelerometer + giroscope Driver
+ *
+ * Copyright (c) 2016,2020 Skyward Experimental Rocketry
+ * Authors: Andrea Milluzzo
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "LSM9DS1_AxelGyro.h"
+
+using miosix::GpioPin;
+using std::array;
+
+LSM9DS1_XLG::LSM9DS1_XLG(SPIBusInterface& bus, GpioPin cs,
+ AxelFSR axelRange = AxelFSR::FS_2,
+ GyroFSR gyroRange = GyroFSR::FS_245,
+ ODR odr = ODR::ODR_15, bool fifo_enabled = false,
+ unsigned int fifo_watermark = 24)
+ : fifo_enabled(fifo_enabled), fifo_watermark(fifo_watermark),
+ spislave(bus, cs, {}), axelFSR(axelRange), gyroFSR(gyroRange), odr(odr)
+{
+ // SPI config
+ spislave.config.clock_div = SPIClockDivider::DIV64;
+}
+
+LSM9DS1_XLG::LSM9DS1_XLG(SPIBusInterface& bus, GpioPin cs, SPIBusConfig config,
+ AxelFSR axelRange = AxelFSR::FS_2,
+ GyroFSR gyroRange = GyroFSR::FS_245,
+ ODR odr = ODR::ODR_15, bool fifo_enabled = false,
+ unsigned int fifo_watermark = 24)
+ : fifo_enabled(fifo_enabled), fifo_watermark(fifo_watermark),
+ spislave(bus, cs, config), axelFSR(axelRange), gyroFSR(gyroRange),
+ odr(odr)
+{
+}
+
+bool LSM9DS1_XLG::init()
+{
+ // Set FSR
+ switch (axelFSR) // DA RIGUARDARE I COEFFICIENTI: SU DS C'E'
+ // SENSITIVITY IN mg/LSB
+ {
+ case AxelFSR::FS_2:
+ axelSensitivity = 0.598f;
+ break;
+ case AxelFSR::FS_4:
+ axelSensitivity = 1.196f;
+ break;
+ case AxelFSR::FS_8:
+ axelSensitivity = 2.393f;
+ break;
+ case AxelFSR::FS_16:
+ axelSensitivity = 7.178f;
+ break;
+ default:
+ axelSensitivity = 0.598f;
+ break;
+ }
+
+ switch (gyroFSR)
+ {
+ case GyroFSR::FS_245:
+ gyroSensitivity = 8.75f;
+ break;
+ case GyroFSR::FS_500:
+ gyroSensitivity = 17.50f;
+ break;
+ case GyroFSR::FS_2000:
+ gyroSensitivity = 70.0f;
+ break;
+ default:
+ gyroSensitivity = 8.75f;
+ break;
+ }
+
+ switch (odr)
+ {
+ case ODR::PWR_DW:
+ odrHz = 0.0f;
+ break;
+ case ODR::ODR_15:
+ odrHz = 14.9f;
+ break;
+ case ODR::ODR_60:
+ odrHz = 59.5f;
+ break;
+ case ODR::ODR_119:
+ odrHz = 119.0f;
+ break;
+ case ODR::ODR_238:
+ odrHz = 238.0f;
+ break;
+ case ODR::ODR_476:
+ odrHz = 476.0f;
+ break;
+ case ODR::ODR_952:
+ odrHz = 952.0f;
+ break;
+ default:
+ odrHz = 14.9f;
+ break;
+ }
+
+ SPITransaction spi(spislave);
+
+ // Who Am I check:
+ uint8_t whoami = spi.read(regMapXLG::WHO_AM_I);
+ if (whoami != WHO_AM_I_XLG_VAL)
+ {
+ TRACE("LSM9DS1 AXEL+GYRO WAMI: %02X\n", whoami);
+ last_error = ERR_NOT_ME;
+ return false;
+ }
+
+ // common setup
+ spi.write(regMapXLG::CTRL_REG8,
+ CTRL_REG8_VAL); // addr auto-increment while reading/writing
+
+ // FIFO setup: FIFO enabled in continous mode, decimation OFF,
+ // temperature on FIFO ON.
+ if (fifo_enabled)
+ {
+
+ spi.write(
+ regMapXLG::FIFO_CTRL,
+ (FIFO_CTRL_VAL | fifo_watermark)); // FIFO continous mode + fifo
+ // watermark threshold setup
+ spi.write(regMapXLG::INT1_CTRL,
+ INT1_CTRL_VAL); // interrupt on FIFO treshold
+ spi.write(
+ regMapXLG::CTRL_REG9,
+ (CTRL_REG9_VAL | 0x02)); // DRDY_mask_bit OFF, I2C OFF, FIFO ON
+ }
+ else
+ {
+ spi.write(regMapXLG::CTRL_REG9,
+ CTRL_REG9_VAL); // DRDY_mask_bit OFF, I2C OFF, FIFO OFF
+ }
+
+ // Axel Setup: ODR, FSR defined by constructor, auto anti-aliasing BW
+ // (max), LPF2/HPF bypassed and disabled, axel output enabled by default
+ // @ startup
+ uint8_t CTRL_REG6_XL_VAL = (int)odr << 5 | (int)axelFSR << 3;
+ spi.write(regMapXLG::CTRL_REG6_XL,
+ CTRL_REG6_XL_VAL); // ODR, FSR, auto BW (max) function of ODR
+
+ // Gyro Setup : ODR, FSR defined by constructor, LPF2/HPF bypassed and
+ // disabled, gyro output enabled by default @ startup
+ uint8_t CTRL_REG1_G_VAL = (int)odr << 5 | (int)gyroFSR << 3;
+ spi.write(regMapXLG::CTRL_REG1_G, CTRL_REG1_G_VAL); // ODR,FSR
+ // spi.write(regMapXLG::ORIENT_CFG_G, ORIENT_CFG_VAL); //angular rate
+ // sign and orientation Setup <--- BOARD DEPENDENT
+
+ // Check all the registers have been written correctly
+ if (spi.read(regMapXLG::CTRL_REG8) != CTRL_REG8_VAL)
+ {
+ return false;
+ }
+ if (fifo_enabled)
+ {
+ if (spi.read(regMapXLG::FIFO_CTRL) != (FIFO_CTRL_VAL | fifo_watermark))
+ {
+ return false;
+ }
+ if (spi.read(regMapXLG::INT1_CTRL) != INT1_CTRL_VAL)
+ {
+ return false;
+ }
+ if (spi.read(regMapXLG::CTRL_REG9) != (CTRL_REG9_VAL | 0x02))
+ {
+ return false;
+ }
+ }
+ else
+ {
+ if (spi.read(regMapXLG::CTRL_REG9) != CTRL_REG9_VAL)
+ {
+ return false;
+ }
+ }
+ if (spi.read(regMapXLG::CTRL_REG6_XL) != CTRL_REG6_XL_VAL)
+ {
+ return false;
+ }
+ if (spi.read(regMapXLG::CTRL_REG1_G) != CTRL_REG1_G_VAL)
+ {
+ return false;
+ }
+
+ LSM9DS1_XLG::discardSamples(spi); // LUCA SCS MERDA (x2) <3
+
+ return true;
+}
+
+bool LSM9DS1_XLG::selfTest() { return true; }
+
+bool LSM9DS1_XLG::onSimpleUpdate()
+{
+ if (!fifo_enabled)
+ { // if FIFO disabled
+ uint8_t data[12], tempData[2];
+ // Read output axel+gyro data X,Y,Z
+ {
+ SPITransaction spi(spislave);
+ spi.read(regMapXLG::OUT_X_L_G, data, 12);
+ spi.read(regMapXLG::OUT_TEMP_L, tempData, 2);
+ }
+
+ int16_t x_gy = data[0] | data[1] << 8;
+ int16_t y_gy = data[2] | data[3] << 8;
+ int16_t z_gy = data[4] | data[5] << 8;
+
+ int16_t x_xl = data[6] | data[7] << 8;
+ int16_t y_xl = data[8] | data[9] << 8;
+ int16_t z_xl = data[10] | data[11] << 8;
+
+ int16_t temp = tempData[0] | tempData[1] << 8;
+
+ mLastAccel =
+ Vec3(x_xl * axelSensitivity / 1000, y_xl * axelSensitivity / 1000,
+ z_xl * axelSensitivity / 1000);
+
+ mLastGyro =
+ Vec3(x_gy * gyroSensitivity / 1000, y_gy * gyroSensitivity / 1000,
+ z_gy * gyroSensitivity / 1000);
+
+ mLastTemp =
+ tempZero + (temp / tempSensistivity); // 25°C + TEMP*S devo
+ // castare a float "temp"?
+ }
+ else
+ { // if FIFO enabled: do not store temperature, it can be read using
+ // "temperatureUpdate()" function at low sampling frequency
+ uint8_t buf[384]; // 2 bytes per data * 3 axes * 2 (axel+gyro) *
+ // 32(FIFO DEPTH MAX) = 384 samples
+ {
+ SPITransaction spi(spislave);
+
+ spi.read(
+ OUT_X_L_G, buf,
+ fifo_watermark *
+ 12); // format:
+ // gxl,gxh,gyl,gyh,gzl,gzh,axl,axh,ayl,ayh,azl,azh
+ // for each sample
+ }
+ // convert & store
+ for (int i = 0; i < fifo_watermark; i++)
+ {
+ int16_t x_gy = buf[i * 12] | buf[i * 12 + 1] << 8;
+ int16_t y_gy = buf[i * 12 + 2] | buf[i * 12 + 3] << 8;
+ int16_t z_gy = buf[i * 12 + 4] | buf[i * 12 + 5] << 8;
+
+ int16_t x_xl = buf[i * 12 + 6] | buf[i * 12 + 7] << 8;
+ int16_t y_xl = buf[i * 12 + 8] | buf[i * 12 + 9] << 8;
+ int16_t z_xl = buf[i * 12 + 10] | buf[i * 12 + 11] << 8;
+
+ fifo[i].gyroData = Vec3(x_gy * gyroSensitivity / 1000,
+ y_gy * gyroSensitivity / 1000,
+ z_gy * gyroSensitivity / 1000);
+ fifo[i].axelData = Vec3(x_xl * axelSensitivity / 1000,
+ y_xl * axelSensitivity / 1000,
+ z_xl * axelSensitivity / 1000);
+ }
+ }
+ return true;
+}
+
+bool LSM9DS1_XLG::temperatureUpdate()
+{
+ uint8_t tempData[2];
+ {
+ SPITransaction spi(spislave);
+ spi.read(regMapXLG::OUT_TEMP_L, tempData, 2);
+ }
+
+ int16_t temp = tempData[0] | tempData[1] << 8;
+ mLastTemp =
+ tempZero +
+ temp / tempSensistivity; // 25°C + TEMP/S devo castare a float "temp"?
+ return true;
+}
+
+void LSM9DS1_XLG::clearFIFO()
+{
+ SPITransaction spi(spislave);
+ spi.write(FIFO_CTRL, 0); // Bypass Mode
+ miosix::Thread::sleep(20); // Wait
+ spi.write(FIFO_CTRL, FIFO_CTRL_VAL | fifo_watermark); // re-enable FIFO
+ LSM9DS1_XLG::discardSamples(spi);
+}
+
+const array<lsm9ds1XLGSample, 32>& LSM9DS1_XLG::getLsm9ds1FIFO() const
+{
+ return fifo;
+}
+
+void LSM9DS1_XLG::discardSamples(SPITransaction& spi)
+{
+ //@ startup, some samples have to be discarded (datasheet)
+ if (odr != ODR::PWR_DW)
+ {
+ uint16_t toWait_ms = samplesToDiscard * 1000 / odrHz;
+ // TRACE("toWait_ms: %d", toWait_ms);
+ miosix::Thread::sleep(toWait_ms); // if FIFO is disabled, just wait
+ if (fifo_enabled)
+ {
+ // if FIFO is enabled, read first <samplesToDiscard> samples and
+ // discard them
+ for (int i = 0; i < samplesToDiscard; i++)
+ {
+ spi.read(regMapXLG::OUT_X_L_XL, 6);
+ spi.read(regMapXLG::OUT_X_L_G, 6);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h b/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h
index f1d35e83f..62801a5bf 100644
--- a/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h
+++ b/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h
@@ -24,27 +24,18 @@
#pragma once
#include <miosix.h>
+
#include <array>
-#include "../Sensor.h"
+#include "LSM9DS1_Data.h"
#include "drivers/spi/SPIDriver.h"
using miosix::GpioPin;
using std::array;
-// data Structs
-struct lsm9ds1XLGSample
-{
- uint64_t timestamp;
- Vec3 axelData;
- Vec3 gyroData;
-};
-
-struct lsm9ds1TSample
-{
- uint64_t timestamp;
- float tempData;
-};
+/**
+ * @brief descrizione classe
+ */
class LSM9DS1_XLG : public GyroSensor,
public AccelSensor,
@@ -78,11 +69,10 @@ public:
};
/**
- * @brief Creates an instance of an LSM9DS1 accelerometer + gyroscope sensor
+ * @brief Creates an instance of an LSM9DS1 accelerometer + gyroscope sensor.
*
* @param bus SPI bus the sensor is connected to
* @param cs Chip Select GPIO
- * @param config (OPTIONAL) custom SPIBusConfig
* @param axelRange accelerometer Full Scale Range (See datasheet)
* @param gyroRange gyroscope Full Scale Range (See datasheet)
* @param odr Output Data Rate (See datasheet)
@@ -91,254 +81,78 @@ public:
* interrupt generation, see datasheet).
*/
- LSM9DS1_XLG(SPIBusInterface& bus, GpioPin cs,
- AxelFSR axelRange = AxelFSR::FS_2,
- GyroFSR gyroRange = GyroFSR::FS_245, ODR odr = ODR::ODR_15,
- bool fifo_enabled = false, unsigned int fifo_watermark = 24)
- : fifo_enabled(fifo_enabled), fifo_watermark(fifo_watermark),
- spislave(bus, cs, {}), axelFSR(axelRange), gyroFSR(gyroRange), odr(odr)
- {
- // SPI config
- spislave.config.clock_div = SPIClockDivider::DIV64;
- }
+ LSM9DS1_XLG(SPIBusInterface& bus, GpioPin cs, AxelFSR axelRange,
+ GyroFSR gyroRange, ODR odr, bool fifo_enabled,
+ unsigned int fifo_watermark);
+
+ /**
+ * @brief Creates an instance of an LSM9DS1 accelerometer + gyroscope sensor.
+ *
+ * @param bus SPI bus the sensor is connected to
+ * @param cs Chip Select GPIO
+ * @param config (OPTIONAL) custom SPIBusConfig
+ * @param axelRange accelerometer Full Scale Range (See datasheet)
+ * @param gyroRange gyroscope Full Scale Range (See datasheet)
+ * @param odr Output Data Rate (See datasheet)
+ * @param fifo_enabled Fifo enabled
+ * @param fifo_watermark FIFO watermark level in range [1,32] (used for
+ * interrupt generation, see datasheet).
+ */
LSM9DS1_XLG(SPIBusInterface& bus, GpioPin cs, SPIBusConfig config,
- AxelFSR axelRange = AxelFSR::FS_2,
- GyroFSR gyroRange = GyroFSR::FS_245, ODR odr = ODR::ODR_15,
- bool fifo_enabled = false, unsigned int fifo_watermark = 24)
- : fifo_enabled(fifo_enabled), fifo_watermark(fifo_watermark),
- spislave(bus, cs, config), axelFSR(axelRange), gyroFSR(gyroRange),
- odr(odr)
- {
- }
+ AxelFSR axelRange, GyroFSR gyroRange, ODR odr,
+ bool fifo_enabled, unsigned int fifo_watermark);
- bool init() override
- {
- // Set FSR
- switch (axelFSR) // DA RIGUARDARE I COEFFICIENTI: SU DS C'E'
- // SENSITIVITY IN mg/LSB
- {
- case AxelFSR::FS_2:
- axelSensitivity = 0.598f;
- break;
- case AxelFSR::FS_4:
- axelSensitivity = 1.196f;
- break;
- case AxelFSR::FS_8:
- axelSensitivity = 2.393f;
- break;
- case AxelFSR::FS_16:
- axelSensitivity = 7.178f;
- break;
- default:
- axelSensitivity = 0.598f;
- break;
- }
-
- switch (gyroFSR)
- {
- case GyroFSR::FS_245:
- gyroSensitivity = 8.75f;
- break;
- case GyroFSR::FS_500:
- gyroSensitivity = 17.50f;
- break;
- case GyroFSR::FS_2000:
- gyroSensitivity = 70.0f;
- break;
- default:
- gyroSensitivity = 8.75f;
- break;
- }
-
- switch (odr)
- {
- case ODR::PWR_DW:
- odrHz = 0.0f;
- break;
- case ODR::ODR_15:
- odrHz = 14.9f;
- break;
- case ODR::ODR_60:
- odrHz = 59.5f;
- break;
- case ODR::ODR_119:
- odrHz = 119.0f;
- break;
- case ODR::ODR_238:
- odrHz = 238.0f;
- break;
- case ODR::ODR_476:
- odrHz = 476.0f;
- break;
- case ODR::ODR_952:
- odrHz = 952.0f;
- break;
- default:
- odrHz = 14.9f;
- break;
- }
-
- SPITransaction spi(spislave);
-
- // Who Am I check:
- uint8_t whoami = spi.read(regMapXLG::WHO_AM_I);
- if (whoami != WHO_AM_I_XLG_VAL)
- {
- TRACE("LSM9DS1 AXEL+GYRO WAMI: %02X\n", whoami);
- last_error = ERR_NOT_ME;
- return false;
- }
-
- // common setup
- spi.write(regMapXLG::CTRL_REG8, CTRL_REG8_VAL); // addr auto-increment while reading/writing
-
- // FIFO setup: FIFO enabled in continous mode, decimation OFF,
- // temperature on FIFO ON.
- if (fifo_enabled)
- {
-
- spi.write(regMapXLG::FIFO_CTRL,(FIFO_CTRL_VAL | fifo_watermark)); // FIFO continous mode + fifo watermark threshold setup
- spi.write(regMapXLG::INT1_CTRL,INT1_CTRL_VAL); // interrupt on FIFO treshold
- spi.write(regMapXLG::CTRL_REG9,(CTRL_REG9_VAL | 0x02)); // DRDY_mask_bit OFF, I2C OFF, FIFO ON
- }
- else
- {
- spi.write(regMapXLG::CTRL_REG9,CTRL_REG9_VAL); // DRDY_mask_bit OFF, I2C OFF, FIFO OFF
- }
-
- // Axel Setup: ODR, FSR defined by constructor, auto anti-aliasing BW
- // (max), LPF2/HPF bypassed and disabled, axel output enabled by default
- // @ startup
- uint8_t CTRL_REG6_XL_VAL = (int)odr << 5 | (int)axelFSR << 3;
- spi.write(regMapXLG::CTRL_REG6_XL, CTRL_REG6_XL_VAL); // ODR, FSR, auto BW (max) function of ODR
-
- // Gyro Setup : ODR, FSR defined by constructor, LPF2/HPF bypassed and
- // disabled, gyro output enabled by default @ startup
- uint8_t CTRL_REG1_G_VAL = (int)odr << 5 | (int)gyroFSR << 3;
- spi.write(regMapXLG::CTRL_REG1_G, CTRL_REG1_G_VAL); // ODR,FSR
- // spi.write(regMapXLG::ORIENT_CFG_G, ORIENT_CFG_VAL); //angular rate
- // sign and orientation Setup <--- BOARD DEPENDENT
-
- // Check all the registers have been written correctly
- if (spi.read(regMapXLG::CTRL_REG8) != CTRL_REG8_VAL) { return false; }
- if (fifo_enabled)
- {
- if (spi.read(regMapXLG::FIFO_CTRL) != (FIFO_CTRL_VAL | fifo_watermark)) { return false; }
- if (spi.read(regMapXLG::INT1_CTRL) != INT1_CTRL_VAL) { return false; }
- if (spi.read(regMapXLG::CTRL_REG9) != (CTRL_REG9_VAL | 0x02)) { return false; }
- }
- else
- {
- if (spi.read(regMapXLG::CTRL_REG9) != CTRL_REG9_VAL) { return false; }
- }
- if (spi.read(regMapXLG::CTRL_REG6_XL) != CTRL_REG6_XL_VAL) { return false; }
- if (spi.read(regMapXLG::CTRL_REG1_G) != CTRL_REG1_G_VAL) { return false; }
-
- discardSamples(spi); //LUCA SCS MERDA (x2) <3
-
- return true;
- }
-
- bool selfTest() override { return true; }
-
- bool onSimpleUpdate() override
- {
+ /**
+ * @brief initializes the LSM9DS1 Sensor (Accelerometer + Gyroscope).
+ * @return true if all setup registers of the sensor have been written
+ * correctly
+ */
- if (!fifo_enabled)
- { // if FIFO disabled
- uint8_t data[12], tempData[2];
- // Read output axel+gyro data X,Y,Z
- {
- SPITransaction spi(spislave);
- spi.read(regMapXLG::OUT_X_L_G, data, 12);
- spi.read(regMapXLG::OUT_TEMP_L, tempData, 2);
- }
-
- int16_t x_gy = data[0] | data[1] << 8;
- int16_t y_gy = data[2] | data[3] << 8;
- int16_t z_gy = data[4] | data[5] << 8;
-
- int16_t x_xl = data[6] | data[7] << 8;
- int16_t y_xl = data[8] | data[9] << 8;
- int16_t z_xl = data[10] | data[11] << 8;
-
- int16_t temp = tempData[0] | tempData[1] << 8;
-
- mLastAccel = Vec3(x_xl * axelSensitivity / 1000,
- y_xl * axelSensitivity / 1000,
- z_xl * axelSensitivity / 1000);
-
- mLastGyro = Vec3(x_gy * gyroSensitivity / 1000,
- y_gy * gyroSensitivity / 1000,
- z_gy * gyroSensitivity / 1000);
-
- mLastTemp = tempZero +
- (temp / tempSensistivity); // 25°C + TEMP*S devo
- // castare a float "temp"?
- }
- else
- { // if FIFO enabled: do not store temperature, it can be read using
- // "temperatureUpdate()" function at low sampling frequency
- uint8_t buf[384]; // 2 bytes per data * 3 axes * 2 (axel+gyro) *
- // 32(FIFO DEPTH MAX) = 384 samples
- {
- SPITransaction spi(spislave);
-
- spi.read(
- OUT_X_L_G, buf,
- fifo_watermark *
- 12); // format:
- // gxl,gxh,gyl,gyh,gzl,gzh,axl,axh,ayl,ayh,azl,azh
- // for each sample
- }
- // convert & store
- for (int i = 0; i < fifo_watermark; i++)
- {
- int16_t x_gy = buf[i * 12] | buf[i * 12 + 1] << 8;
- int16_t y_gy = buf[i * 12 + 2] | buf[i * 12 + 3] << 8;
- int16_t z_gy = buf[i * 12 + 4] | buf[i * 12 + 5] << 8;
-
- int16_t x_xl = buf[i * 12 + 6] | buf[i * 12 + 7] << 8;
- int16_t y_xl = buf[i * 12 + 8] | buf[i * 12 + 9] << 8;
- int16_t z_xl = buf[i * 12 + 10] | buf[i * 12 + 11] << 8;
-
- fifo[i].gyroData = Vec3(x_gy * gyroSensitivity / 1000,
- y_gy * gyroSensitivity / 1000,
- z_gy * gyroSensitivity / 1000);
- fifo[i].axelData = Vec3(x_xl * axelSensitivity / 1000,
- y_xl * axelSensitivity / 1000,
- z_xl * axelSensitivity / 1000);
- }
- }
- return true;
- }
-
- bool temperatureUpdate()
- {
- uint8_t tempData[2];
- {
- SPITransaction spi(spislave);
- spi.read(regMapXLG::OUT_TEMP_L, tempData, 2);
- }
-
- int16_t temp = tempData[0] | tempData[1] << 8;
- mLastTemp = tempZero + temp / tempSensistivity; // 25°C + TEMP/S devo castare a float "temp"?
- return true;
- }
-
- void clearFIFO() // FIFO clearing routine (see datasheet)
- {
- SPITransaction spi(spislave);
- spi.write(FIFO_CTRL, 0); // Bypass Mode
- miosix::Thread::sleep(20); // Wait
- spi.write(FIFO_CTRL, FIFO_CTRL_VAL | fifo_watermark); // re-enable FIFO
- discardSamples(spi);
- }
+ bool init() override;
+
+ /**
+ * @brief Run a self-test of the Sensor.
+ * @return true if sensor behave correclty
+ */
+
+ bool selfTest() override;
+
+ /**
+ * @brief Dump single reading of Axel+Gyro+Temp from the sensor through SPI.
+ * @return true if sensor sends data
+ */
+
+ bool onSimpleUpdate() override;
- const array<lsm9ds1XLGSample, 32>& getLsm9ds1FIFO() const { return fifo; }
+ /**
+ * @brief Dump single read of Temperature from the sensor through SPI.
+ * @return true if sensor sends data
+ */
+
+ bool temperatureUpdate();
+
+ /**
+ * @brief Clear the FIFO register inside the LSM9DS1 sensor.
+ */
+
+ void clearFIFO();
+
+ /**
+ * @brief get FIFO dumped after calling onSimpleUpdate() - Just on FIFO mode.
+ * @return array containing the whole FIFO
+ */
+
+ const array<lsm9ds1XLGSample, 32>& getLsm9ds1FIFO() const;
private:
+ /**
+ * @brief discard some samples from the sensor. Must be used when switching.
+ * from FIFO mode to CONTINUOUS mode (or viceversa) and during power on
+ */
+
+ void discardSamples(SPITransaction& spi);
+
bool fifo_enabled;
uint8_t fifo_watermark;
array<lsm9ds1XLGSample, 32> fifo;
@@ -356,28 +170,6 @@ private:
float tempSensistivity = 16.0f;
static const uint8_t samplesToDiscard = 8; // max possible val
- void discardSamples(SPITransaction& spi)
- {
-
- //@ startup, some samples have to be discarded (datasheet)
- if (odr != ODR::PWR_DW)
- {
- uint16_t toWait_ms = samplesToDiscard * 1000 / odrHz;
- // TRACE("toWait_ms: %d", toWait_ms);
- miosix::Thread::sleep(toWait_ms); // if FIFO is disabled, just wait
- if (fifo_enabled)
- {
- // if FIFO is enabled, read first <samplesToDiscard> samples and
- // discard them
- for (int i = 0; i < samplesToDiscard; i++)
- {
- spi.read(regMapXLG::OUT_X_L_XL, 6);
- spi.read(regMapXLG::OUT_X_L_G, 6);
- }
- }
- }
- }
-
enum regMapXLG
{
ACT_THS = 0x04,
diff --git a/src/shared/sensors/LSM9DS1/LSM9DS1_Data.h b/src/shared/sensors/LSM9DS1/LSM9DS1_Data.h
new file mode 100644
index 000000000..51e68aa98
--- /dev/null
+++ b/src/shared/sensors/LSM9DS1/LSM9DS1_Data.h
@@ -0,0 +1,85 @@
+/* LSM9DS1 accelerometer + giroscope Driver
+ *
+ * Copyright (c) 2016,2020 Skyward Experimental Rocketry
+ * Authors: Andrea Milluzzo
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#pragma once
+
+#include <miosix.h>
+#include "../Sensor.h"
+
+// data Structs
+
+//ACCELEROMETER + GYROSCOPE
+struct lsm9ds1XLGSample
+{
+ uint64_t timestamp;
+ Vec3 axelData;
+ Vec3 gyroData;
+
+ static std::string header()
+ {
+ return "timestamp,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z\n";
+ }
+
+ void print(std::ostream& os) const
+ {
+ os << timestamp << "," <<
+ axelData.getX() << "," << axelData.getY() << "," << axelData.getZ() << "," <<
+ gyroData.getX() << "," << gyroData.getY() << "," << gyroData.getZ() << "\n";
+ }
+};
+
+//TEMPERATURE
+struct lsm9ds1TSample
+{
+ uint64_t timestamp;
+ float tempData;
+
+ static std::string header()
+ {
+ return "timestamp,temp\n";
+ }
+
+ void print(std::ostream& os) const
+ {
+ os << timestamp << "," << tempData << "\n";
+ }
+};
+
+//MAGNETOMETER
+struct lsm9ds1MSample
+{
+ uint64_t timestamp;
+ Vec3 magData;
+
+ static std::string header()
+ {
+ return "timestamp,mag_x,mag_y,mag_z\n";
+ }
+
+ void print(std::ostream& os) const
+ {
+ os << timestamp << "," <<
+ magData.getX() << "," << magData.getY() << "," << magData.getZ() << "\n";
+ }
+};
diff --git a/src/shared/sensors/LSM9DS1/LSM9DS1_Magneto.cpp b/src/shared/sensors/LSM9DS1/LSM9DS1_Magneto.cpp
new file mode 100644
index 000000000..7879bc7df
--- /dev/null
+++ b/src/shared/sensors/LSM9DS1/LSM9DS1_Magneto.cpp
@@ -0,0 +1,164 @@
+/* LSM9DS1 magnetometer Driver
+ *
+ * Copyright (c) 2016,2020 Skyward Experimental Rocketry
+ * Authors: Andrea Milluzzo
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "LSM9DS1_Magneto.h"
+
+using miosix::GpioPin;
+using std::vector;
+
+LSM9DS1_M::LSM9DS1_M(SPIBusInterface& bus, GpioPin cs,
+ MagFSR magRange = MagFSR::FS_8, ODR odr = ODR::ODR_0_625)
+ : spislave(bus, cs, {}), magFSR(magRange), odr(odr)
+{
+ // SPI config
+ spislave.config.clock_div = SPIClockDivider::DIV64;
+}
+
+LSM9DS1_M::LSM9DS1_M(SPIBusInterface& bus, GpioPin cs, SPIBusConfig config,
+ MagFSR magRange = MagFSR::FS_8, ODR odr = ODR::ODR_0_625)
+ : spislave(bus, cs, config), magFSR(magRange), odr(odr)
+{
+}
+
+bool LSM9DS1_M::init()
+{
+ // Set FSR
+ switch (magFSR)
+ {
+ case MagFSR::FS_4:
+ magSensitivity = 0.14f;
+ break;
+ case MagFSR::FS_8:
+ magSensitivity = 0.29f;
+ break;
+ case MagFSR::FS_12:
+ magSensitivity = 0.43f;
+ break;
+ case MagFSR::FS_16:
+ magSensitivity = 0.58f;
+ break;
+ default:
+ magSensitivity = 0.14f;
+ break;
+ }
+
+ SPITransaction spi(spislave);
+
+ // Who Am I check:
+ uint8_t whoami = spi.read(WHO_AM_I_M); // regMapM::WHO_AM_I_M);
+
+ if (whoami != WHO_AM_I_M_VAL)
+ {
+ TRACE("LSM9DS1 MAG WAMI: 0x%02X\n", whoami);
+ last_error = ERR_NOT_ME;
+ return false;
+ }
+
+ // setup
+ uint8_t CTRL_REG1_M_VAL = 0x60 | (int)odr << 2;
+ spi.write(regMapM::CTRL_REG1_M,
+ CTRL_REG1_M_VAL); // X,Y axes in ultra-high performance mode,
+ // NO auto-temp compensation and ODR
+ // defined by constructor
+
+ uint8_t CTRL_REG2_M_VAL = (int)magFSR << 5;
+ spi.write(regMapM::CTRL_REG2_M,
+ CTRL_REG2_M_VAL); // FSR defined by constructor
+
+ spi.write(regMapM::CTRL_REG4_M,
+ CTRL_REG4_M_VAL); // Z axis in ultra-high performance mode
+ spi.write(regMapM::CTRL_REG3_M,
+ CTRL_REG3_M_VAL); // I2C disabled, SPI mode: read/write
+
+ spi.write(regMapM::INT_CFG_M, INT_CFG_M_VAL); // disable all interrupts
+
+ // check that all registers have been written correctly
+
+ if (spi.read(regMapM::CTRL_REG1_M) != CTRL_REG1_M_VAL)
+ {
+ return false;
+ }
+ if (spi.read(regMapM::CTRL_REG2_M) != CTRL_REG2_M_VAL)
+ {
+ return false;
+ }
+ if (spi.read(regMapM::CTRL_REG3_M) != CTRL_REG3_M_VAL)
+ {
+ return false;
+ }
+ if (spi.read(regMapM::CTRL_REG4_M) != CTRL_REG4_M_VAL)
+ {
+ return false;
+ }
+ if (spi.read(regMapM::INT_CFG_M) != INT_CFG_M_VAL)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+bool LSM9DS1_M::selfTest() { return true; }
+
+bool LSM9DS1_M::onSimpleUpdate()
+{
+
+ uint8_t magData[6];
+ // read output data X,Y,Z
+ {
+ SPITransaction spi(spislave);
+ // bit 1 of SPI transaction = 1 means "auto-increment address" (see
+ // DS).
+ spi.read(regMapM::OUT_X_L_M | 0x40, magData,
+ 6); // so bit 6 of the address = 1
+ }
+
+ int16_t x = magData[0] | magData[1] << 8;
+ int16_t y = magData[2] | magData[3] << 8;
+ int16_t z = magData[4] | magData[5] << 8;
+
+ // TRACE("LSM9DS1 mageto: %02X,%02X,%02X\n", x, y, z);
+
+ mLastCompass = Vec3(x * magSensitivity / 1000, y * magSensitivity / 1000,
+ z * magSensitivity / 1000);
+ return true;
+}
+
+void LSM9DS1_M::setOffset(vector<uint16_t>& offVect)
+{
+ if (offVect.size() < 3)
+ return;
+ uint8_t toStore[6];
+ for (int i = 6; i > 0; i = i - 2)
+ {
+ toStore[i - 1] = offVect.back() & 0x00FF; // LSB
+ toStore[i - 2] = offVect.back() >> 8; // MSB
+ offVect.pop_back();
+ }
+
+ SPITransaction spi(spislave);
+ // bit 1 of SPI transaction = 1 means "auto-increment address".
+ spi.write(regMapM::OFFSET_X_REG_L_M | 0x40, toStore,
+ 6); // so bit 6 of the address = 1
+}
\ No newline at end of file
diff --git a/src/shared/sensors/LSM9DS1/LSM9DS1_Magneto.h b/src/shared/sensors/LSM9DS1/LSM9DS1_Magneto.h
index 5e94c7f25..6bfdad552 100644
--- a/src/shared/sensors/LSM9DS1/LSM9DS1_Magneto.h
+++ b/src/shared/sensors/LSM9DS1/LSM9DS1_Magneto.h
@@ -24,215 +24,132 @@
#pragma once
#include <miosix.h>
+
#include <vector>
+#include "LSM9DS1_Data.h"
#include "drivers/spi/SPIDriver.h"
-#include "../Sensor.h"
using miosix::GpioPin;
using std::vector;
-// data Structs
-struct lsm9ds1MSample
-{
- uint64_t timestamp;
- Vec3 magData;
-};
+/**
+ * @brief descrizione classe
+ */
class LSM9DS1_M : public CompassSensor
{
- public:
-
- enum MagFSR
- {
- FS_4 = 0x00,
- FS_8 = 0x01,
- FS_12 = 0x02,
- FS_16 = 0x03
- };
-
- enum ODR
- {
- ODR_0_625 = 0X00,
- ODR_1_25 = 0x01,
- ODR_2_5 = 0x02,
- ODR_5 = 0x03,
- ODR_10 = 0x04,
- ODR_20 = 0x05,
- ODR_40 = 0x06,
- ODR_80 = 0x07
- };
-
- /**
- * @brief Creates an instance of an LSM9DS1 accelerometer + gyroscope sensor
- *
- * @param bus SPI bus the sensor is connected to
- * @param cs Chip Select GPIO
- * @param config (OPTIONAL) custom SPIBusConfig
- * @param magRange magnetometer Full Scale Range (See datasheet)
- * @param odr Output Data Rate (See datasheet)
- */
-
- LSM9DS1_M(
- SPIBusInterface& bus,
- GpioPin cs,
- MagFSR magRange = MagFSR::FS_8,
- ODR odr = ODR::ODR_0_625
- ): spislave(bus, cs, {}), magFSR(magRange), odr(odr){
- //SPI config
- spislave.config.clock_div=SPIClockDivider::DIV64;
- }
-
- LSM9DS1_M(
- SPIBusInterface& bus,
- GpioPin cs,
- SPIBusConfig config,
- MagFSR magRange = MagFSR::FS_8,
- ODR odr = ODR::ODR_0_625
- ): spislave(bus, cs, config), magFSR(magRange), odr(odr){
-
- }
-
- bool init() override
- {
- //Set FSR
- switch(magFSR)
- {
- case MagFSR::FS_4:
- magSensitivity = 0.14f;
- break;
- case MagFSR::FS_8:
- magSensitivity = 0.29f;
- break;
- case MagFSR::FS_12:
- magSensitivity = 0.43f;
- break;
- case MagFSR::FS_16:
- magSensitivity = 0.58f;
- break;
- default:
- magSensitivity = 0.14f;
- break;
- }
-
- SPITransaction spi(spislave);
-
- //Who Am I check:
- uint8_t whoami = spi.read(WHO_AM_I_M);//regMapM::WHO_AM_I_M);
-
- if(whoami != WHO_AM_I_M_VAL){
- TRACE("LSM9DS1 MAG WAMI: 0x%02X\n", whoami);
- last_error = ERR_NOT_ME;
- return false;
- }
-
- //setup
- uint8_t CTRL_REG1_M_VAL = 0x60 | (int)odr<<2;
- spi.write(regMapM::CTRL_REG1_M, CTRL_REG1_M_VAL); //X,Y axes in ultra-high performance mode, NO auto-temp compensation and ODR defined by constructor
-
- uint8_t CTRL_REG2_M_VAL = (int)magFSR<<5;
- spi.write(regMapM::CTRL_REG2_M, CTRL_REG2_M_VAL); //FSR defined by constructor
-
- spi.write(regMapM::CTRL_REG4_M, CTRL_REG4_M_VAL); //Z axis in ultra-high performance mode
- spi.write(regMapM::CTRL_REG3_M, CTRL_REG3_M_VAL); //I2C disabled, SPI mode: read/write
-
- spi.write(regMapM::INT_CFG_M, INT_CFG_M_VAL); //disable all interrupts
-
-
- //check that all registers have been written correctly
-
- if(spi.read(regMapM::CTRL_REG1_M) != CTRL_REG1_M_VAL) {return false;}
- if(spi.read(regMapM::CTRL_REG2_M) != CTRL_REG2_M_VAL) {return false;}
- if(spi.read(regMapM::CTRL_REG3_M) != CTRL_REG3_M_VAL) {return false;}
- if(spi.read(regMapM::CTRL_REG4_M) != CTRL_REG4_M_VAL) {return false;}
- if(spi.read(regMapM::INT_CFG_M) != INT_CFG_M_VAL) {return false;}
-
- return true;
- }
-
- bool selfTest() override
- {
- return true;
- }
-
- bool onSimpleUpdate() override
- {
- uint8_t magData[6];
- //read output data X,Y,Z
- {
- SPITransaction spi(spislave);
- //bit 1 of SPI transaction = 1 means "auto-increment address" (see DS).
- spi.read(regMapM::OUT_X_L_M | 0x40, magData, 6);//so bit 6 of the address = 1
- }
-
- int16_t x = magData[0] | magData[1] << 8;
- int16_t y = magData[2] | magData[3] << 8;
- int16_t z = magData[4] | magData[5] << 8;
-
- // TRACE("LSM9DS1 mageto: %02X,%02X,%02X\n", x, y, z);
-
- mLastCompass =
- Vec3(x * magSensitivity / 1000,
- y * magSensitivity / 1000,
- z * magSensitivity / 1000);
- return true;
- }
-
- void setOffset(vector<uint16_t>& offVect) //X,Y,Z
- {
- if(offVect.size() < 3) return;
- uint8_t toStore[6];
- for(int i=6; i > 0 ; i=i-2){
- toStore[i-1] = offVect.back() & 0x00FF; //LSB
- toStore[i-2] = offVect.back() >> 8; //MSB
- offVect.pop_back();
- }
-
- SPITransaction spi(spislave);
- //bit 1 of SPI transaction = 1 means "auto-increment address".
- spi.write(OFFSET_X_REG_L_M | 0x40, toStore, 6); //so bit 6 of the address = 1
- }
-
- private:
-
- SPISlave spislave;
-
- MagFSR magFSR;
- ODR odr;
-
- float magSensitivity;
-
- enum regMapM
- {
- OFFSET_X_REG_L_M = 0x05,
- OFFSET_X_REG_H_M = 0x06,
- OFFSET_Y_REG_L_M = 0x07,
- OFFSET_Y_REG_H_M = 0x08,
- OFFSET_Z_REG_L_M = 0x09,
- OFFSET_Z_REG_H_M = 0x0A,
- WHO_AM_I_M = 0x0F,
- CTRL_REG1_M = 0x20,
- CTRL_REG2_M = 0x21,
- CTRL_REG3_M = 0x22,
- CTRL_REG4_M = 0x23,
- CTRL_REG5_M = 0x24,
- STATUS_REG_M = 0x27,
- OUT_X_L_M = 0x28,
- OUT_X_H_M = 0x29,
- OUT_Y_L_M = 0x2A,
- OUT_Y_H_M = 0x2B,
- OUT_Z_L_M = 0x2C,
- OUT_Z_H_M = 0x2D,
- INT_CFG_M = 0x30,
- INT_SRC_M = 0x31,
- INT_THS_L_M = 0x32,
- INT_THS_H_M = 0x33
- };
-
- static const uint8_t WHO_AM_I_M_VAL = 0x3D;
- static const uint8_t CTRL_REG3_M_VAL = 0x80;
- static const uint8_t CTRL_REG4_M_VAL = 0x0C;
- static const uint8_t INT_CFG_M_VAL = 0x00;
-
-
+public:
+ enum MagFSR
+ {
+ FS_4 = 0x00,
+ FS_8 = 0x01,
+ FS_12 = 0x02,
+ FS_16 = 0x03
+ };
+
+ enum ODR
+ {
+ ODR_0_625 = 0X00,
+ ODR_1_25 = 0x01,
+ ODR_2_5 = 0x02,
+ ODR_5 = 0x03,
+ ODR_10 = 0x04,
+ ODR_20 = 0x05,
+ ODR_40 = 0x06,
+ ODR_80 = 0x07
+ };
+
+ /**
+ * @brief Creates an instance of an LSM9DS1 magnetometer sensor.
+ *
+ * @param bus SPI bus the sensor is connected to
+ * @param cs Chip Select GPIO
+ * @param magRange magnetometer Full Scale Range (See datasheet)
+ * @param odr Output Data Rate (See datasheet)
+ */
+
+ LSM9DS1_M(SPIBusInterface& bus, GpioPin cs, MagFSR magRange, ODR odr);
+
+ /**
+ * @brief Creates an instance of an LSM9DS1 magnetometer sensor.
+ *
+ * @param bus SPI bus the sensor is connected to
+ * @param cs Chip Select GPIO
+ * @param config custom SPIBusConfig
+ * @param magRange magnetometer Full Scale Range (See datasheet)
+ * @param odr Output Data Rate (See datasheet)
+ */
+
+ LSM9DS1_M(SPIBusInterface& bus, GpioPin cs, SPIBusConfig config,
+ MagFSR magRange, ODR odr);
+
+ /**
+ * @brief initializes the LSM9DS1 Sensor (Magnetometer).
+ * @return true if all setup registers of the sensor have been written
+ * correctly
+ */
+
+ bool init() override;
+
+ /**
+ * @brief Run a self-test of the Sensor.
+ * @return true if sensor behave correclty
+ */
+
+ bool selfTest() override;
+
+ /**
+ * @brief Dump single reading of Magneto from the sensor through SPI.
+ * @return true if sensor sends data
+ */
+
+ bool onSimpleUpdate() override;
+
+ /**
+ * @brief set offset of the compass sensor in case of offset errors.
+ * @param offVect offset values (X,Y,Z)
+ */
+
+ void setOffset(vector<uint16_t>& offVect);
+
+private:
+ SPISlave spislave;
+
+ MagFSR magFSR;
+ ODR odr;
+
+ float magSensitivity;
+
+ enum regMapM
+ {
+ OFFSET_X_REG_L_M = 0x05,
+ OFFSET_X_REG_H_M = 0x06,
+ OFFSET_Y_REG_L_M = 0x07,
+ OFFSET_Y_REG_H_M = 0x08,
+ OFFSET_Z_REG_L_M = 0x09,
+ OFFSET_Z_REG_H_M = 0x0A,
+ WHO_AM_I_M = 0x0F,
+ CTRL_REG1_M = 0x20,
+ CTRL_REG2_M = 0x21,
+ CTRL_REG3_M = 0x22,
+ CTRL_REG4_M = 0x23,
+ CTRL_REG5_M = 0x24,
+ STATUS_REG_M = 0x27,
+ OUT_X_L_M = 0x28,
+ OUT_X_H_M = 0x29,
+ OUT_Y_L_M = 0x2A,
+ OUT_Y_H_M = 0x2B,
+ OUT_Z_L_M = 0x2C,
+ OUT_Z_H_M = 0x2D,
+ INT_CFG_M = 0x30,
+ INT_SRC_M = 0x31,
+ INT_THS_L_M = 0x32,
+ INT_THS_H_M = 0x33
+ };
+
+ static const uint8_t WHO_AM_I_M_VAL = 0x3D;
+ static const uint8_t CTRL_REG3_M_VAL = 0x80;
+ static const uint8_t CTRL_REG4_M_VAL = 0x0C;
+ static const uint8_t INT_CFG_M_VAL = 0x00;
};
\ No newline at end of file
diff --git a/src/tests/drivers/test-lsm9ds1-fifo.cpp b/src/tests/drivers/test-lsm9ds1-fifo.cpp
index 83a65c72a..8abc4f5b1 100644
--- a/src/tests/drivers/test-lsm9ds1-fifo.cpp
+++ b/src/tests/drivers/test-lsm9ds1-fifo.cpp
@@ -26,7 +26,7 @@
#include "drivers/HardwareTimer.h"
#include "drivers/spi/SPIDriver.h"
#include "sensors/LSM9DS1/LSM9DS1_AxelGyro.h"
-#include "sensors/LSM9DS1/LSM9DSI_Magneto.h"
+#include "sensors/LSM9DS1/LSM9DS1_Magneto.h"
#include "diagnostic/CpuMeter.h"
#include "logger/Logger.h"
diff --git a/src/tests/drivers/test-lsm9ds1.cpp b/src/tests/drivers/test-lsm9ds1.cpp
index 1299f8d4e..378b8b321 100644
--- a/src/tests/drivers/test-lsm9ds1.cpp
+++ b/src/tests/drivers/test-lsm9ds1.cpp
@@ -25,7 +25,7 @@
#include "drivers/spi/SPIDriver.h"
#include "sensors/LSM9DS1/LSM9DS1_AxelGyro.h"
-#include "sensors/LSM9DS1/LSM9DSI_Magneto.h"
+#include "sensors/LSM9DS1/LSM9DS1_Magneto.h"
using namespace miosix;
--
GitLab