diff --git a/.clangd b/.clangd index f916abe6..8fefd21c 100644 --- a/.clangd +++ b/.clangd @@ -1,5 +1,6 @@ CompileFlags: + CompilationDatabase: . # clang do not understand this flags Remove: - -mlongcalls diff --git a/lib/Espfc/src/Device/Baro/BaroBMP085.cpp b/lib/Espfc/src/Device/Baro/BaroBMP085.cpp index 41dcb326..6afca468 100644 --- a/lib/Espfc/src/Device/Baro/BaroBMP085.cpp +++ b/lib/Espfc/src/Device/Baro/BaroBMP085.cpp @@ -107,7 +107,8 @@ int BaroBMP085::getDelay(BaroDeviceMode mode) const { switch (mode) { - case BARO_MODE_TEMP: return 4550; // temp + case BARO_MODE_TEMP: + return 4550; // temp default: // return 4550; // press_0 // return 7550; // press_1 @@ -119,8 +120,10 @@ int BaroBMP085::getDelay(BaroDeviceMode mode) const bool BaroBMP085::testConnection() { uint8_t whoami = 0; - _bus->readByte(_addr, BMP085_WHOAMI_REG, &whoami); - return whoami == BMP085_WHOAMI_ID; + if (_bus->readByte(_addr, BMP085_WHOAMI_REG, &whoami) != 1) return false; + setChipId(whoami); + if (whoami != BMP085_WHOAMI_ID) return false; + return true; } } // namespace Espfc::Device::Baro diff --git a/lib/Espfc/src/Device/Baro/BaroBMP280.cpp b/lib/Espfc/src/Device/Baro/BaroBMP280.cpp index a8f3e173..15767251 100644 --- a/lib/Espfc/src/Device/Baro/BaroBMP280.cpp +++ b/lib/Espfc/src/Device/Baro/BaroBMP280.cpp @@ -118,7 +118,8 @@ int BaroBMP280::getDelay(BaroDeviceMode mode) const { switch (mode) { - case BARO_MODE_TEMP: return 0; + case BARO_MODE_TEMP: + return 0; default: // return 5500; // if sapling X1 // return 7500; // if sampling X2 @@ -132,7 +133,9 @@ bool BaroBMP280::testConnection() { uint8_t whoami = 0; if (_bus->read(_addr, BMP280_WHOAMI_REG, 1, &whoami) != 1) return false; - return whoami == BMP280_WHOAMI_ID; + setChipId(whoami); + if (whoami != BMP280_WHOAMI_ID) return false; + return true; } void BaroBMP280::readMesurment() diff --git a/lib/Espfc/src/Device/Baro/BaroSPL06.cpp b/lib/Espfc/src/Device/Baro/BaroSPL06.cpp index dd9ca7be..47c0fb42 100644 --- a/lib/Espfc/src/Device/Baro/BaroSPL06.cpp +++ b/lib/Espfc/src/Device/Baro/BaroSPL06.cpp @@ -164,7 +164,8 @@ int BaroSPL06::getDelay(BaroDeviceMode mode) const { switch (mode) { - case BARO_MODE_TEMP: return 0; + case BARO_MODE_TEMP: + return 0; default: // return 5500; // if sapling X1 // return 7500; // if sampling X2 @@ -176,7 +177,9 @@ bool BaroSPL06::testConnection() { uint8_t whoami = 0; if (_bus->read(_addr, SPL06_WHOAMI_REG, 1, &whoami) != 1) return false; - return whoami == SPL06_WHOAMI_ID; + setChipId(whoami); + if (whoami != SPL06_WHOAMI_ID) return false; + return true; } void BaroSPL06::readMesurment() diff --git a/lib/Espfc/src/Device/BusAwareDevice.hpp b/lib/Espfc/src/Device/BusAwareDevice.hpp index 3f957dfc..7a722e82 100644 --- a/lib/Espfc/src/Device/BusAwareDevice.hpp +++ b/lib/Espfc/src/Device/BusAwareDevice.hpp @@ -1,6 +1,7 @@ #pragma once #include "Device/BusDevice.hpp" +#include namespace Espfc::Device { @@ -23,9 +24,20 @@ class BusAwareDevice return _addr; } + std::optional getChipId() const + { + return _chipId; + } + protected: - BusDevice* _bus; - uint8_t _addr; + void setChipId(uint8_t chipId) + { + _chipId = chipId; + } + + BusDevice* _bus = nullptr; + uint8_t _addr = 0; + std::optional _chipId = {}; }; } // namespace Espfc::Device diff --git a/lib/Espfc/src/Device/Gyro/GyroBMI160.cpp b/lib/Espfc/src/Device/Gyro/GyroBMI160.cpp index e3f631e6..96cc5bce 100644 --- a/lib/Espfc/src/Device/Gyro/GyroBMI160.cpp +++ b/lib/Espfc/src/Device/Gyro/GyroBMI160.cpp @@ -229,6 +229,7 @@ bool GyroBMI160::testConnection() { uint8_t whoami = 0; if (_bus->readByte(_addr, BMI160_RA_CHIP_ID, &whoami) != 1) return false; + setChipId(whoami); return whoami == BMI160_CHIP_ID_DEFAULT_VALUE; } diff --git a/lib/Espfc/src/Device/Gyro/GyroICM20602.cpp b/lib/Espfc/src/Device/Gyro/GyroICM20602.cpp index 613c7bec..ee8236b5 100644 --- a/lib/Espfc/src/Device/Gyro/GyroICM20602.cpp +++ b/lib/Espfc/src/Device/Gyro/GyroICM20602.cpp @@ -1,7 +1,7 @@ #include "GyroICM20602.hpp" -#define MPU6050_RA_WHO_AM_I 0x75 -#define ICM20602_RA_ACCEL2_CONFIG 0x1D +#define MPU6050_RA_WHO_AM_I 0x75 +#define ICM20602_RA_ACCEL2_CONFIG 0x1D #define ICM20602_WHOAMI_DEFAULT_VALUE 0x12 namespace Espfc::Device::Gyro { @@ -20,7 +20,8 @@ void GyroICM20602::setDLPFMode(uint8_t mode) bool GyroICM20602::testConnection() { uint8_t whoami = 0; - _bus->readByte(_addr, MPU6050_RA_WHO_AM_I, &whoami); + if (_bus->readByte(_addr, MPU6050_RA_WHO_AM_I, &whoami) != 1) return false; + setChipId(whoami); return whoami == ICM20602_WHOAMI_DEFAULT_VALUE; } diff --git a/lib/Espfc/src/Device/Gyro/GyroICM20602.hpp b/lib/Espfc/src/Device/Gyro/GyroICM20602.hpp index a169b339..c52ae117 100644 --- a/lib/Espfc/src/Device/Gyro/GyroICM20602.hpp +++ b/lib/Espfc/src/Device/Gyro/GyroICM20602.hpp @@ -4,14 +4,14 @@ namespace Espfc::Device::Gyro { -class GyroICM20602: public GyroMPU6050 +class GyroICM20602 : public GyroMPU6050 { - public: - GyroDeviceType getType() const override; +public: + GyroDeviceType getType() const override; - void setDLPFMode(uint8_t mode) override; + void setDLPFMode(uint8_t mode) override; - bool testConnection() override; + bool testConnection() override; }; } // namespace Espfc::Device::Gyro diff --git a/lib/Espfc/src/Device/Gyro/GyroICM42688.cpp b/lib/Espfc/src/Device/Gyro/GyroICM42688.cpp index dbe9fcb7..54b7ce6e 100644 --- a/lib/Espfc/src/Device/Gyro/GyroICM42688.cpp +++ b/lib/Espfc/src/Device/Gyro/GyroICM42688.cpp @@ -3,19 +3,19 @@ #include "Hal/Time.hpp" #include "Utils/MemoryHelper.h" -#define ICM42688_REG_WHO_AM_I 0x75 -#define ICM42688_REG_DEVICE_CONFIG 0x11 -#define ICM42688_REG_PWR_MGMT0 0x4E -#define ICM42688_REG_GYRO_CONFIG0 0x4F -#define ICM42688_REG_ACCEL_CONFIG0 0x50 -#define ICM42688_REG_ACCEL_DATA_X1 0x1F -#define ICM42688_REG_GYRO_DATA_X1 0x25 - -#define ICM42688_WHO_AM_I_VALUE 0x47 -#define ICM42688_SOFT_RESET 0x01 -#define ICM42688_PWR_GYRO_ACCEL_LN 0x0F -#define ICM42688_GYRO_2000DPS_8KHZ 0x03 -#define ICM42688_ACCEL_16G_8KHZ 0x03 +#define ICM42688_REG_WHO_AM_I 0x75 +#define ICM42688_REG_DEVICE_CONFIG 0x11 +#define ICM42688_REG_PWR_MGMT0 0x4E +#define ICM42688_REG_GYRO_CONFIG0 0x4F +#define ICM42688_REG_ACCEL_CONFIG0 0x50 +#define ICM42688_REG_ACCEL_DATA_X1 0x1F +#define ICM42688_REG_GYRO_DATA_X1 0x25 + +#define ICM42688_WHO_AM_I_VALUE 0x47 +#define ICM42688_SOFT_RESET 0x01 +#define ICM42688_PWR_GYRO_ACCEL_LN 0x0F +#define ICM42688_GYRO_2000DPS_8KHZ 0x03 +#define ICM42688_ACCEL_16G_8KHZ 0x03 namespace Espfc::Device::Gyro { @@ -85,6 +85,7 @@ bool GyroICM42688::testConnection() { uint8_t whoami = 0; if (_bus->readByte(_addr, ICM42688_REG_WHO_AM_I, &whoami) != 1) return false; + setChipId(whoami); return whoami == ICM42688_WHO_AM_I_VALUE; } diff --git a/lib/Espfc/src/Device/Gyro/GyroLSM6DSO.cpp b/lib/Espfc/src/Device/Gyro/GyroLSM6DSO.cpp index 3043efca..c749f3a6 100644 --- a/lib/Espfc/src/Device/Gyro/GyroLSM6DSO.cpp +++ b/lib/Espfc/src/Device/Gyro/GyroLSM6DSO.cpp @@ -4,93 +4,101 @@ #include "Utils/MemoryHelper.h" // https://github.com/arduino-libraries/Arduino_LSM6DSOX/blob/master/src/LSM6DSOX.cpp -#define LSM6DSOX_ADDRESS_FIRST 0x6A -#define LSM6DSOX_ADDRESS_SECOND 0x6b +#define LSM6DSOX_ADDRESS_FIRST 0x6A +#define LSM6DSOX_ADDRESS_SECOND 0x6b // registers -#define LSM6DSO_REG_WHO_AM_I 0x0F -#define LSM6DSO_REG_CTRL1_XL 0x10 -#define LSM6DSO_REG_CTRL2_G 0x11 -#define LSM6DSO_REG_CTRL3_C 0x12 -#define LSM6DSO_REG_CTRL4_C 0x13 -#define LSM6DSO_REG_CTRL5_C 0x14 -#define LSM6DSO_REG_CTRL6_C 0x15 -#define LSM6DSO_REG_CTRL7_G 0x16 -#define LSM6DSO_REG_CTRL8_XL 0x17 -#define LSM6DSO_REG_CTRL9_XL 0x18 -#define LSM6DSO_REG_CTRL10_C 0x19 -#define LSM6DSO_REG_STATUS 0x1E -#define LSM6DSO_REG_OUTX_L_G 0x22 -#define LSM6DSO_REG_OUTX_L_XL 0x28 +#define LSM6DSO_REG_WHO_AM_I 0x0F +#define LSM6DSO_REG_CTRL1_XL 0x10 +#define LSM6DSO_REG_CTRL2_G 0x11 +#define LSM6DSO_REG_CTRL3_C 0x12 +#define LSM6DSO_REG_CTRL4_C 0x13 +#define LSM6DSO_REG_CTRL5_C 0x14 +#define LSM6DSO_REG_CTRL6_C 0x15 +#define LSM6DSO_REG_CTRL7_G 0x16 +#define LSM6DSO_REG_CTRL8_XL 0x17 +#define LSM6DSO_REG_CTRL9_XL 0x18 +#define LSM6DSO_REG_CTRL10_C 0x19 +#define LSM6DSO_REG_STATUS 0x1E +#define LSM6DSO_REG_OUTX_L_G 0x22 +#define LSM6DSO_REG_OUTX_L_XL 0x28 // values -#define LSM6DSO_VAL_INT1_CTRL 0x02 // enable gyro data ready interrupt pin 1 -#define LSM6DSO_VAL_INT2_CTRL 0x02 // enable gyro data ready interrupt pin 2 -#define LSM6DSO_VAL_CTRL1_XL_ODR833 0x07 // accelerometer 833hz output data rate (gyro/8) -#define LSM6DSO_VAL_CTRL1_XL_ODR1667 0x08 // accelerometer 1666hz output data rate (gyro/4) -#define LSM6DSO_VAL_CTRL1_XL_ODR3332 0x09 // accelerometer 3332hz output data rate (gyro/2) -#define LSM6DSO_VAL_CTRL1_XL_ODR3333 0x0A // accelerometer 6664hz output data rate (gyro/1) -#define LSM6DSO_VAL_CTRL1_XL_8G 0x03 // accelerometer 8G scale -#define LSM6DSO_VAL_CTRL1_XL_16G 0x01 // accelerometer 16G scale -#define LSM6DSO_VAL_CTRL1_XL_LPF1 0x00 // accelerometer output from LPF1 -#define LSM6DSO_VAL_CTRL1_XL_LPF2 0x01 // accelerometer output from LPF2 -#define LSM6DSO_VAL_CTRL2_G_ODR6664 0x0A // gyro 6664hz output data rate -#define LSM6DSO_VAL_CTRL2_G_ODR3332 0x09 // gyro 3332hz output data rate -#define LSM6DSO_VAL_CTRL2_G_2000DPS 0x03 // gyro 2000dps scale -#define LSM6DSO_VAL_CTRL3_C_BDU 0x40 // (bit 6) output registers are not updated until MSB and LSB have been read (prevents MSB from being updated while burst reading LSB/MSB) -#define LSM6DSO_VAL_CTRL3_C_H_LACTIVE 0x00 // (bit 5) interrupt pins active high -#define LSM6DSO_VAL_CTRL3_C_PP_OD 0x00 // (bit 4) interrupt pins push/pull -#define LSM6DSO_VAL_CTRL3_C_SIM 0x00 // (bit 3) SPI 4-wire interface mode -#define LSM6DSO_VAL_CTRL3_C_IF_INC 0x04 // (bit 2) auto-increment address for burst reads -#define LSM6DSO_VAL_CTRL4_C_I2C_DISABLE 0x04 // (bit 2) disable I2C interface -#define LSM6DSO_VAL_CTRL4_C_LPF1_SEL_G 0x02 // (bit 1) enable gyro LPF1 -#define LSM6DSO_VAL_CTRL6_C_XL_HM_MODE 0x00 // (bit 4) enable accelerometer high performance mode -#define LSM6DSO_VAL_CTRL6_C_FTYPE_335HZ 0x00 // (bits 2:0) gyro LPF1 cutoff 335.5hz -#define LSM6DSO_VAL_CTRL6_C_FTYPE_232HZ 0x01 // (bits 2:0) gyro LPF1 cutoff 232.0hz -#define LSM6DSO_VAL_CTRL6_C_FTYPE_171HZ 0x02 // (bits 2:0) gyro LPF1 cutoff 171.1hz -#define LSM6DSO_VAL_CTRL6_C_FTYPE_609HZ 0x03 // (bits 2:0) gyro LPF1 cutoff 609.0hz -#define LSM6DSO_VAL_CTRL9_XL_I3C_DISABLE 0x02 // (bit 1) disable I3C interface +#define LSM6DSO_VAL_INT1_CTRL 0x02 // enable gyro data ready interrupt pin 1 +#define LSM6DSO_VAL_INT2_CTRL 0x02 // enable gyro data ready interrupt pin 2 +#define LSM6DSO_VAL_CTRL1_XL_ODR833 0x07 // accelerometer 833hz output data rate (gyro/8) +#define LSM6DSO_VAL_CTRL1_XL_ODR1667 0x08 // accelerometer 1666hz output data rate (gyro/4) +#define LSM6DSO_VAL_CTRL1_XL_ODR3332 0x09 // accelerometer 3332hz output data rate (gyro/2) +#define LSM6DSO_VAL_CTRL1_XL_ODR3333 0x0A // accelerometer 6664hz output data rate (gyro/1) +#define LSM6DSO_VAL_CTRL1_XL_8G 0x03 // accelerometer 8G scale +#define LSM6DSO_VAL_CTRL1_XL_16G 0x01 // accelerometer 16G scale +#define LSM6DSO_VAL_CTRL1_XL_LPF1 0x00 // accelerometer output from LPF1 +#define LSM6DSO_VAL_CTRL1_XL_LPF2 0x01 // accelerometer output from LPF2 +#define LSM6DSO_VAL_CTRL2_G_ODR6664 0x0A // gyro 6664hz output data rate +#define LSM6DSO_VAL_CTRL2_G_ODR3332 0x09 // gyro 3332hz output data rate +#define LSM6DSO_VAL_CTRL2_G_2000DPS 0x03 // gyro 2000dps scale +#define LSM6DSO_VAL_CTRL3_C_BDU \ + 0x40 // (bit 6) output registers are not updated until MSB and LSB have been read (prevents MSB from being updated + // while burst reading LSB/MSB) +#define LSM6DSO_VAL_CTRL3_C_H_LACTIVE 0x00 // (bit 5) interrupt pins active high +#define LSM6DSO_VAL_CTRL3_C_PP_OD 0x00 // (bit 4) interrupt pins push/pull +#define LSM6DSO_VAL_CTRL3_C_SIM 0x00 // (bit 3) SPI 4-wire interface mode +#define LSM6DSO_VAL_CTRL3_C_IF_INC 0x04 // (bit 2) auto-increment address for burst reads +#define LSM6DSO_VAL_CTRL4_C_I2C_DISABLE 0x04 // (bit 2) disable I2C interface +#define LSM6DSO_VAL_CTRL4_C_LPF1_SEL_G 0x02 // (bit 1) enable gyro LPF1 +#define LSM6DSO_VAL_CTRL6_C_XL_HM_MODE 0x00 // (bit 4) enable accelerometer high performance mode +#define LSM6DSO_VAL_CTRL6_C_FTYPE_335HZ 0x00 // (bits 2:0) gyro LPF1 cutoff 335.5hz +#define LSM6DSO_VAL_CTRL6_C_FTYPE_232HZ 0x01 // (bits 2:0) gyro LPF1 cutoff 232.0hz +#define LSM6DSO_VAL_CTRL6_C_FTYPE_171HZ 0x02 // (bits 2:0) gyro LPF1 cutoff 171.1hz +#define LSM6DSO_VAL_CTRL6_C_FTYPE_609HZ 0x03 // (bits 2:0) gyro LPF1 cutoff 609.0hz +#define LSM6DSO_VAL_CTRL9_XL_I3C_DISABLE 0x02 // (bit 1) disable I3C interface // masks -#define LSM6DSO_MASK_CTRL3_C 0x7C // 0b01111100 +#define LSM6DSO_MASK_CTRL3_C 0x7C // 0b01111100 #define LSM6DSO_MASK_CTRL3_C_RESET 0x01 // 0b00000001 -#define LSM6DSO_MASK_CTRL4_C 0x06 // 0b00000110 -#define LSM6DSO_MASK_CTRL6_C 0x17 // 0b00010111 -#define LSM6DSO_MASK_CTRL9_XL 0x02 // 0b00000010 +#define LSM6DSO_MASK_CTRL4_C 0x06 // 0b00000110 +#define LSM6DSO_MASK_CTRL6_C 0x17 // 0b00010111 +#define LSM6DSO_MASK_CTRL9_XL 0x02 // 0b00000010 namespace Espfc::Device::Gyro { -int GyroLSM6DSO::begin(BusDevice * bus) +int GyroLSM6DSO::begin(BusDevice* bus) { return begin(bus, LSM6DSOX_ADDRESS_FIRST) ? 1 : begin(bus, LSM6DSOX_ADDRESS_SECOND) ? 1 : 0; } -int GyroLSM6DSO::begin(BusDevice * bus, uint8_t addr) +int GyroLSM6DSO::begin(BusDevice* bus, uint8_t addr) { setBus(bus, addr); - if(!testConnection()) return 0; + if (!testConnection()) return 0; // reset device _bus->writeMask(_addr, LSM6DSO_REG_CTRL3_C, LSM6DSO_MASK_CTRL3_C_RESET, 1); delay(100); // Accel, 833hz ODR, 16G scale, use LPF1 output - _bus->writeByte(_addr, LSM6DSO_REG_CTRL1_XL, (LSM6DSO_VAL_CTRL1_XL_ODR833 << 4) | (LSM6DSO_VAL_CTRL1_XL_16G << 2) | (LSM6DSO_VAL_CTRL1_XL_LPF1 << 1)); + _bus->writeByte(_addr, LSM6DSO_REG_CTRL1_XL, + (LSM6DSO_VAL_CTRL1_XL_ODR833 << 4) | (LSM6DSO_VAL_CTRL1_XL_16G << 2) | + (LSM6DSO_VAL_CTRL1_XL_LPF1 << 1)); delay(1); // Gyro, 6664hz ODR, 2000dps scale _bus->writeByte(_addr, LSM6DSO_REG_CTRL2_G, (LSM6DSO_VAL_CTRL2_G_ODR6664 << 4) | (LSM6DSO_VAL_CTRL2_G_2000DPS << 2)); delay(1); - // latch LSB/MSB during reads; set interrupt pins active high; set interrupt pins push/pull; set 4-wire SPI; enable auto-increment burst reads - _bus->writeMask(_addr, LSM6DSO_REG_CTRL3_C, LSM6DSO_MASK_CTRL3_C, (LSM6DSO_VAL_CTRL3_C_BDU | LSM6DSO_VAL_CTRL3_C_H_LACTIVE | LSM6DSO_VAL_CTRL3_C_PP_OD | LSM6DSO_VAL_CTRL3_C_SIM | LSM6DSO_VAL_CTRL3_C_IF_INC)); + // latch LSB/MSB during reads; set interrupt pins active high; set interrupt pins push/pull; set 4-wire SPI; enable + // auto-increment burst reads + _bus->writeMask(_addr, LSM6DSO_REG_CTRL3_C, LSM6DSO_MASK_CTRL3_C, + (LSM6DSO_VAL_CTRL3_C_BDU | LSM6DSO_VAL_CTRL3_C_H_LACTIVE | LSM6DSO_VAL_CTRL3_C_PP_OD | + LSM6DSO_VAL_CTRL3_C_SIM | LSM6DSO_VAL_CTRL3_C_IF_INC)); // enable accelerometer high performane mode; set gyro LPF1 cutoff to 335.5hz _bus->writeMask(_addr, LSM6DSO_REG_CTRL4_C, LSM6DSO_MASK_CTRL4_C, (LSM6DSO_VAL_CTRL4_C_LPF1_SEL_G)); // enable gyro LPF1 - _bus->writeMask(_addr, LSM6DSO_REG_CTRL6_C, LSM6DSO_MASK_CTRL6_C, (LSM6DSO_VAL_CTRL6_C_XL_HM_MODE | LSM6DSO_VAL_CTRL6_C_FTYPE_335HZ)); + _bus->writeMask(_addr, LSM6DSO_REG_CTRL6_C, LSM6DSO_MASK_CTRL6_C, + (LSM6DSO_VAL_CTRL6_C_XL_HM_MODE | LSM6DSO_VAL_CTRL6_C_FTYPE_335HZ)); // disable I3C interface _bus->writeMask(_addr, LSM6DSO_REG_CTRL9_XL, LSM6DSO_MASK_CTRL9_XL, LSM6DSO_VAL_CTRL9_XL_I3C_DISABLE); @@ -129,23 +137,20 @@ int GyroLSM6DSO::readAccel(VectorInt16& v) return 1; } -void GyroLSM6DSO::setDLPFMode(uint8_t mode) -{ -} +void GyroLSM6DSO::setDLPFMode(uint8_t mode) {} int GyroLSM6DSO::getRate() const { return 6664; } -void GyroLSM6DSO::setRate(int rate) -{ -} +void GyroLSM6DSO::setRate(int rate) {} bool GyroLSM6DSO::testConnection() { uint8_t whoami = 0; if (_bus->readByte(_addr, LSM6DSO_REG_WHO_AM_I, &whoami) != 1) return false; + setChipId(whoami); return whoami == 0x6C || whoami == 0x69; } diff --git a/lib/Espfc/src/Device/Gyro/GyroLSM6DSO.hpp b/lib/Espfc/src/Device/Gyro/GyroLSM6DSO.hpp index 7cfead00..329ae557 100644 --- a/lib/Espfc/src/Device/Gyro/GyroLSM6DSO.hpp +++ b/lib/Espfc/src/Device/Gyro/GyroLSM6DSO.hpp @@ -5,24 +5,24 @@ namespace Espfc::Device::Gyro { -class GyroLSM6DSO: public GyroDevice +class GyroLSM6DSO : public GyroDevice { - public: - int begin(BusDevice * bus) override; - int begin(BusDevice * bus, uint8_t addr) override; +public: + int begin(BusDevice* bus) override; + int begin(BusDevice* bus, uint8_t addr) override; - GyroDeviceType getType() const override; + GyroDeviceType getType() const override; - int readGyro(VectorInt16& v) override; - int readAccel(VectorInt16& v) override; + int readGyro(VectorInt16& v) override; + int readAccel(VectorInt16& v) override; - void setDLPFMode(uint8_t mode) override; + void setDLPFMode(uint8_t mode) override; - int getRate() const override; + int getRate() const override; - void setRate(int rate) override; + void setRate(int rate) override; - bool testConnection() override; + bool testConnection() override; }; } // namespace Espfc::Device::Gyro diff --git a/lib/Espfc/src/Device/Gyro/GyroMPU6050.cpp b/lib/Espfc/src/Device/Gyro/GyroMPU6050.cpp index ca9e5e71..c5ed3855 100644 --- a/lib/Espfc/src/Device/Gyro/GyroMPU6050.cpp +++ b/lib/Espfc/src/Device/Gyro/GyroMPU6050.cpp @@ -210,7 +210,8 @@ int GyroMPU6050::getRate() const switch (_dlpf) { case GYRO_DLPF_256: - case GYRO_DLPF_EX: return 8000; + case GYRO_DLPF_EX: + return 8000; } return 1000; } @@ -231,6 +232,7 @@ bool GyroMPU6050::testConnection() { uint8_t whoami = 0; if (_bus->readByte(_addr, MPU6050_RA_WHO_AM_I, &whoami) != 1) return false; + setChipId(whoami); return whoami == 0x68 || whoami == 0x72; } diff --git a/lib/Espfc/src/Device/Gyro/GyroMPU6500.cpp b/lib/Espfc/src/Device/Gyro/GyroMPU6500.cpp index 7d8a5665..2f3be86a 100644 --- a/lib/Espfc/src/Device/Gyro/GyroMPU6500.cpp +++ b/lib/Espfc/src/Device/Gyro/GyroMPU6500.cpp @@ -1,9 +1,9 @@ #include "GyroMPU6500.hpp" -#define MPU6050_RA_WHO_AM_I 0x75 -#define MPU6500_ACCEL_CONF2 0x1D +#define MPU6050_RA_WHO_AM_I 0x75 +#define MPU6500_ACCEL_CONF2 0x1D #define MPU6500_WHOAMI_DEFAULT_VALUE 0x70 -#define MPU6500_WHOAMI_ALT_VALUE 0x75 +#define MPU6500_WHOAMI_ALT_VALUE 0x75 namespace Espfc::Device::Gyro { @@ -21,8 +21,9 @@ void GyroMPU6500::setDLPFMode(uint8_t mode) bool GyroMPU6500::testConnection() { uint8_t whoami = 0; - uint8_t len = _bus->readByte(_addr, MPU6050_RA_WHO_AM_I, &whoami); - return len == 1 && (whoami == MPU6500_WHOAMI_DEFAULT_VALUE || whoami == MPU6500_WHOAMI_ALT_VALUE); + if (_bus->readByte(_addr, MPU6050_RA_WHO_AM_I, &whoami) != 1) return false; + setChipId(whoami); + return whoami == MPU6500_WHOAMI_DEFAULT_VALUE || whoami == MPU6500_WHOAMI_ALT_VALUE; } } // namespace Espfc::Device::Gyro diff --git a/lib/Espfc/src/Device/Gyro/GyroMPU6500.hpp b/lib/Espfc/src/Device/Gyro/GyroMPU6500.hpp index 1bf2258e..ee1d335c 100644 --- a/lib/Espfc/src/Device/Gyro/GyroMPU6500.hpp +++ b/lib/Espfc/src/Device/Gyro/GyroMPU6500.hpp @@ -4,14 +4,14 @@ namespace Espfc::Device::Gyro { -class GyroMPU6500: public GyroMPU6050 +class GyroMPU6500 : public GyroMPU6050 { - public: - GyroDeviceType getType() const override; +public: + GyroDeviceType getType() const override; - void setDLPFMode(uint8_t mode) override; + void setDLPFMode(uint8_t mode) override; - bool testConnection() override; + bool testConnection() override; }; } // namespace Espfc::Device::Gyro diff --git a/lib/Espfc/src/Device/Gyro/GyroMPU9250.cpp b/lib/Espfc/src/Device/Gyro/GyroMPU9250.cpp index c0eb3b07..fb25be28 100644 --- a/lib/Espfc/src/Device/Gyro/GyroMPU9250.cpp +++ b/lib/Espfc/src/Device/Gyro/GyroMPU9250.cpp @@ -1,9 +1,9 @@ #include "GyroMPU9250.hpp" -#define MPU6050_RA_WHO_AM_I 0x75 -#define MPU9250_ACCEL_CONF2 0x1D +#define MPU6050_RA_WHO_AM_I 0x75 +#define MPU9250_ACCEL_CONF2 0x1D #define MPU9250_WHOAMI_DEFAULT_VALUE 0x71 -#define MPU9250_WHOAMI_ALT_VALUE 0x73 +#define MPU9250_WHOAMI_ALT_VALUE 0x73 namespace Espfc::Device::Gyro { @@ -21,8 +21,9 @@ void GyroMPU9250::setDLPFMode(uint8_t mode) bool GyroMPU9250::testConnection() { uint8_t whoami = 0; - uint8_t len = _bus->readByte(_addr, MPU6050_RA_WHO_AM_I, &whoami); - return len == 1 && (whoami == MPU9250_WHOAMI_DEFAULT_VALUE || whoami == MPU9250_WHOAMI_ALT_VALUE); + if (_bus->readByte(_addr, MPU6050_RA_WHO_AM_I, &whoami) != 1) return false; + setChipId(whoami); + return whoami == MPU9250_WHOAMI_DEFAULT_VALUE || whoami == MPU9250_WHOAMI_ALT_VALUE; } } // namespace Espfc::Device::Gyro diff --git a/lib/Espfc/src/Device/Gyro/GyroMPU9250.hpp b/lib/Espfc/src/Device/Gyro/GyroMPU9250.hpp index 74224786..865d5905 100644 --- a/lib/Espfc/src/Device/Gyro/GyroMPU9250.hpp +++ b/lib/Espfc/src/Device/Gyro/GyroMPU9250.hpp @@ -4,14 +4,14 @@ namespace Espfc::Device::Gyro { -class GyroMPU9250: public GyroMPU6050 +class GyroMPU9250 : public GyroMPU6050 { - public: - GyroDeviceType getType() const override; +public: + GyroDeviceType getType() const override; - void setDLPFMode(uint8_t mode) override; + void setDLPFMode(uint8_t mode) override; - bool testConnection() override; + bool testConnection() override; }; } // namespace Espfc::Device::Gyro diff --git a/lib/Espfc/src/Device/Mag/MagAK8963.cpp b/lib/Espfc/src/Device/Mag/MagAK8963.cpp index 502ec772..40ab4ff8 100644 --- a/lib/Espfc/src/Device/Mag/MagAK8963.cpp +++ b/lib/Espfc/src/Device/Mag/MagAK8963.cpp @@ -92,6 +92,7 @@ MagDeviceType MagAK8963::getType() const bool MagAK8963::testConnection() { if (_bus->read(_addr, AK8963_WHO_AM_I, 1, _buffer) != 1) return false; + setChipId(_buffer[0]); return _buffer[0] == 0x48; } diff --git a/lib/Espfc/src/Device/Mag/MagHMC5883L.cpp b/lib/Espfc/src/Device/Mag/MagHMC5883L.cpp index 6232b20f..793e2863 100644 --- a/lib/Espfc/src/Device/Mag/MagHMC5883L.cpp +++ b/lib/Espfc/src/Device/Mag/MagHMC5883L.cpp @@ -158,6 +158,7 @@ bool MagHMC5883L::testConnection() { uint8_t buffer[3] = {}; if (_bus->read(_addr, HMC5883L_RA_ID_A, 3, buffer) != 3) return false; + setChipId(buffer[0]); return buffer[0] == 'H' && buffer[1] == '4' && buffer[2] == '3'; } diff --git a/lib/Espfc/src/Device/Mag/MagQMC5883L.cpp b/lib/Espfc/src/Device/Mag/MagQMC5883L.cpp index e8f433fc..4f2718a6 100644 --- a/lib/Espfc/src/Device/Mag/MagQMC5883L.cpp +++ b/lib/Espfc/src/Device/Mag/MagQMC5883L.cpp @@ -103,7 +103,7 @@ bool MagQMC5883L::testConnection() { uint8_t buffer[1] = {}; if (_bus->read(_addr, QMC5883L_RA_CHIPID, 1, buffer) != 1) return false; - + setChipId(buffer[0]); return buffer[0] == 0xFF; } diff --git a/lib/Espfc/src/Device/Mag/MagQMC5883P.cpp b/lib/Espfc/src/Device/Mag/MagQMC5883P.cpp index cef07b11..e7311edc 100644 --- a/lib/Espfc/src/Device/Mag/MagQMC5883P.cpp +++ b/lib/Espfc/src/Device/Mag/MagQMC5883P.cpp @@ -98,10 +98,18 @@ const VectorFloat MagQMC5883P::convert(const VectorInt16& v) const float lsbPerGauss = 3750.0f; switch (_currentRange) { - case QMC5883P_RANGE_30G: lsbPerGauss = 1000.0f; break; - case QMC5883P_RANGE_12G: lsbPerGauss = 2500.0f; break; - case QMC5883P_RANGE_8G: lsbPerGauss = 3750.0f; break; - case QMC5883P_RANGE_2G: lsbPerGauss = 15000.0f; break; + case QMC5883P_RANGE_30G: + lsbPerGauss = 1000.0f; + break; + case QMC5883P_RANGE_12G: + lsbPerGauss = 2500.0f; + break; + case QMC5883P_RANGE_8G: + lsbPerGauss = 3750.0f; + break; + case QMC5883P_RANGE_2G: + lsbPerGauss = 15000.0f; + break; } return static_cast(v) * (1.0f / lsbPerGauss); @@ -111,11 +119,15 @@ int MagQMC5883P::getRate() const { switch (_currentOdr) { - case QMC5883P_ODR_10HZ: return 10; - case QMC5883P_ODR_50HZ: return 50; - case QMC5883P_ODR_200HZ: return 200; + case QMC5883P_ODR_10HZ: + return 10; + case QMC5883P_ODR_50HZ: + return 50; + case QMC5883P_ODR_200HZ: + return 200; case QMC5883P_ODR_100HZ: - default: return 100; + default: + return 100; } } @@ -136,10 +148,13 @@ bool MagQMC5883P::testConnection() uint8_t chipId = 0; for (uint8_t attempt = 0; attempt < 3; attempt++) { - if (_bus->read(_addr, QMC5883P_REG_CHIPID, 1, &chipId) == 1 && chipId == QMC5883P_CHIP_ID) + if (_bus->read(_addr, QMC5883P_REG_CHIPID, 1, &chipId) != 1) { - return true; + delay(2); + continue; } + setChipId(chipId); + if (chipId == QMC5883P_CHIP_ID) return true; delay(2); } diff --git a/lib/Espfc/src/Hardware.h b/lib/Espfc/src/Hardware.h index 184f8b40..a08c2b06 100644 --- a/lib/Espfc/src/Hardware.h +++ b/lib/Espfc/src/Hardware.h @@ -29,7 +29,8 @@ class Hardware { typename Dev::DeviceType type = dev.getType(); bool status = dev.begin(&bus, cs); - _model.logger.info().log("SPI").log(Dev::getName(type)).logln(status ? "Y" : ""); + auto& logger = _model.logger.info(); + logger.log("SPI").log(Dev::getName(type)).loghex(dev.getChipId().value_or(0xff)).logln(status ? "Y" : ""); return status; } #endif @@ -40,7 +41,8 @@ class Hardware { typename Dev::DeviceType type = dev.getType(); bool status = dev.begin(&bus); - _model.logger.info().log("I2C").log(Dev::getName(type)).logln(status ? "Y" : ""); + auto& logger = _model.logger.info(); + logger.log("I2C").log(Dev::getName(type)).loghex(dev.getChipId().value_or(0xff)).logln(status ? "Y" : ""); return status; } #endif @@ -50,7 +52,8 @@ class Hardware { typename Dev::DeviceType type = dev.getType(); bool status = dev.begin(&bus); - _model.logger.info().log("SLV").log(Dev::getName(type)).logln(status ? "Y" : ""); + auto& logger = _model.logger.info(); + logger.log("SLV").log(Dev::getName(type)).loghex(dev.getChipId().value_or(0xff)).logln(status ? "Y" : ""); return status; } diff --git a/test/test_gyro/test_gyro_icm42688.cpp b/test/test_gyro/test_gyro_icm42688.cpp index 0a252904..8e57f5d6 100644 --- a/test/test_gyro/test_gyro_icm42688.cpp +++ b/test/test_gyro/test_gyro_icm42688.cpp @@ -1,12 +1,16 @@ #include #include +#include "Device/Baro/BaroBMP280.hpp" #include "Device/Gyro/GyroICM42688.hpp" #include "Device/GyroDevice.hpp" +#include "Device/Mag/MagHMC5883L.hpp" #include using namespace Espfc; using namespace Espfc::Device; using namespace Espfc::Device::Gyro; +using namespace Espfc::Device::Mag; +using namespace Espfc::Device::Baro; class MockBusDevice : public BusDevice { @@ -14,11 +18,13 @@ class MockBusDevice : public BusDevice uint8_t readRegs[256] = {}; // registers ret uint8_t writeRegs[256] = {}; // registers captured by write int writeCalls = 0; + bool failRead = false; BusType getType() const override { return BUS_SPI; } int8_t read(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t* data) override { + if (failRead) return 0; for (uint8_t i = 0; i < length; i++) data[i] = readRegs[(regAddr + i) & 0xFF]; return length; } @@ -52,6 +58,92 @@ void test_whoami_mismatch() GyroICM42688 dev; dev.setBus(&bus, 0); TEST_ASSERT_FALSE(dev.testConnection()); + + const auto chipId = dev.getChipId(); + TEST_ASSERT_TRUE(chipId.has_value()); + TEST_ASSERT_EQUAL_HEX8(0x12, chipId.value()); +} + +void test_chip_id_is_empty_before_connection() +{ + GyroICM42688 dev; + TEST_ASSERT_FALSE(dev.getChipId().has_value()); +} + +void test_chip_id_cached_on_success() +{ + MockBusDevice bus; + bus.readRegs[0x75] = 0x47; + GyroICM42688 dev; + dev.setBus(&bus, 0); + + TEST_ASSERT_TRUE(dev.testConnection()); + + const auto chipId = dev.getChipId(); + TEST_ASSERT_TRUE(chipId.has_value()); + TEST_ASSERT_EQUAL_HEX8(0x47, chipId.value()); +} + +void test_chip_id_updated_on_mismatch() +{ + MockBusDevice bus; + bus.readRegs[0x75] = 0x47; + GyroICM42688 dev; + dev.setBus(&bus, 0); + + TEST_ASSERT_TRUE(dev.testConnection()); + bus.readRegs[0x75] = 0x12; + TEST_ASSERT_FALSE(dev.testConnection()); + + const auto chipId = dev.getChipId(); + TEST_ASSERT_TRUE(chipId.has_value()); + TEST_ASSERT_EQUAL_HEX8(0x12, chipId.value()); +} + +void test_chip_id_preserved_on_read_failure() +{ + MockBusDevice bus; + bus.readRegs[0x75] = 0x47; + GyroICM42688 dev; + dev.setBus(&bus, 0); + + TEST_ASSERT_TRUE(dev.testConnection()); + bus.failRead = true; + TEST_ASSERT_FALSE(dev.testConnection()); + + const auto chipId = dev.getChipId(); + TEST_ASSERT_TRUE(chipId.has_value()); + TEST_ASSERT_EQUAL_HEX8(0x47, chipId.value()); +} + +void test_mag_hmc5883l_uses_first_id_byte() +{ + MockBusDevice bus; + bus.readRegs[0x0A] = 'H'; + bus.readRegs[0x0B] = '4'; + bus.readRegs[0x0C] = '3'; + MagHMC5883L dev; + dev.setBus(&bus, 0x1E); + + TEST_ASSERT_TRUE(dev.testConnection()); + + const auto chipId = dev.getChipId(); + TEST_ASSERT_TRUE(chipId.has_value()); + TEST_ASSERT_EQUAL_HEX8('H', chipId.value()); +} + +void test_baro_bmp280_caches_whoami() +{ + MockBusDevice bus; + bus.readRegs[0xD0] = 0x58; + BaroBMP280 dev; + dev.setBus(&bus, 0x76); + + TEST_ASSERT_TRUE(dev.testConnection()); + + const auto chipId = dev.getChipId(); + TEST_ASSERT_TRUE(chipId.has_value()); + TEST_ASSERT_EQUAL_HEX8(0x58, chipId.value()); } void test_begin_aborts_on_failed_connection() @@ -126,6 +218,12 @@ int main(int argc, char** argv) UNITY_BEGIN(); RUN_TEST(test_whoami_match); RUN_TEST(test_whoami_mismatch); + RUN_TEST(test_chip_id_is_empty_before_connection); + RUN_TEST(test_chip_id_cached_on_success); + RUN_TEST(test_chip_id_updated_on_mismatch); + RUN_TEST(test_chip_id_preserved_on_read_failure); + RUN_TEST(test_mag_hmc5883l_uses_first_id_byte); + RUN_TEST(test_baro_bmp280_caches_whoami); RUN_TEST(test_begin_aborts_on_failed_connection); RUN_TEST(test_read_gyro_decoding); RUN_TEST(test_read_accel_decoding);