LCOV - code coverage report
Current view: top level - SITL - SIM_Invensense_v3.h (source / functions) Hit Total Coverage
Test: lcov.info Lines: 13 13 100.0 %
Date: 2026-09-09 11:02:08 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #include "SIM_I2CDevice.h"
       2             : 
       3             : namespace SITL {
       4             : 
       5             : class InvensenseV3DevReg : public I2CRegEnum {
       6             : public:
       7             :     static const uint8_t WHOAMI        = 0x75;
       8             :     // static const uint8_t INT_CONFIG    = 0x14;
       9             :     static const uint8_t FIFO_CONFIG   = 0x16;
      10             :     static const uint8_t PWR_MGMT0     = 0x4e;
      11             :     static const uint8_t GYRO_CONFIG0  = 0x4f;
      12             :     static const uint8_t ACCEL_CONFIG0 = 0x50;
      13             :     static const uint8_t FIFO_CONFIG1  = 0x5f;
      14             :     // static const uint8_t FIFO_CONFIG2  = 0x60;
      15             :     // static const uint8_t FIFO_CONFIG3  = 0x61;
      16             :     // static const uint8_t INT_SOURCE0   = 0x65;
      17             :     static const uint8_t SIGNAL_PATH_RESET = 0x4b;
      18             :     static const uint8_t INTF_CONFIG0  = 0x4c;
      19             :     static const uint8_t FIFO_COUNTH   = 0x2e;
      20             :     static const uint8_t FIFO_DATA     = 0x30;
      21             :     // static const uint8_t BANK_SEL      = 0x76;
      22             : };
      23             : 
      24             : class InvensenseV3 : public I2CDevice, protected I2CRegisters_8Bit
      25             : {
      26             : public:
      27        2094 :     void init() override {
      28        2094 :         add_register("WHOAMI", InvensenseV3DevReg::WHOAMI, I2CRegisters::RegMode::RDONLY);
      29        2094 :         add_register("FIFO_CONFIG", InvensenseV3DevReg::FIFO_CONFIG, I2CRegisters::RegMode::RDWR);
      30        2094 :         add_register("FIFO_CONFIG1", InvensenseV3DevReg::FIFO_CONFIG1, I2CRegisters::RegMode::RDWR);
      31        2094 :         add_register("INTF_CONFIG0", InvensenseV3DevReg::INTF_CONFIG0, I2CRegisters::RegMode::RDWR);
      32        2094 :         add_register("SIGNAL_PATH_RESET", InvensenseV3DevReg::SIGNAL_PATH_RESET, I2CRegisters::RegMode::RDWR);
      33        2094 :         add_register("PWR_MGMT0", InvensenseV3DevReg::PWR_MGMT0, I2CRegisters::RegMode::RDWR);
      34        2094 :         add_register("GYRO_CONFIG0", InvensenseV3DevReg::GYRO_CONFIG0, I2CRegisters::RegMode::RDWR);
      35        2094 :         add_register("ACCDEL_CONFIG0", InvensenseV3DevReg::ACCEL_CONFIG0, I2CRegisters::RegMode::RDWR);
      36             : 
      37             :         // sample count!
      38        2094 :         add_block("FIFO_COUNTH", InvensenseV3DevReg::FIFO_COUNTH, 2, I2CRegisters::RegMode::RDONLY);
      39             : 
      40        2094 :         add_fifo("FIFO_DATA", InvensenseV3DevReg::FIFO_DATA, I2CRegisters::RegMode::RDONLY);
      41        2094 :     }
      42             : 
      43             :     void update(const class Aircraft &aircraft) override;
      44             : 
      45             :     int rdwr(I2C::i2c_rdwr_ioctl_data *&data) override;
      46             : 
      47             :     virtual float accel_scale() const = 0;
      48   536279826 :     float gyro_scale() const { return (0.0174532f / 16.4f); }
      49             : 
      50             : private:
      51             : 
      52             :     // sets the FIFO_COUNTH block based on the number of samples in FIFO_DATA
      53             :     void update_sample_count();
      54             : 
      55             :     void assert_register_values();
      56             : 
      57             :     void add_fifo(const char *name, uint8_t reg, I2CRegisters::RegMode mode);
      58             :     bool write_to_fifo(uint8_t fifo, uint8_t *value, uint8_t valuelen);
      59             : 
      60             :     int rdwr_fifo(I2C::i2c_rdwr_ioctl_data *&data);
      61             :     static const uint8_t fifo_len = 64;
      62             :     const char *fifoname[256];
      63             :     Bitmask<256> writable_fifos;
      64             :     Bitmask<256> readable_fifos;
      65             : 
      66             :     // 256 pointers-to-malloced-values:
      67             :     char *values[256];
      68             :     uint8_t value_lengths[256];
      69             : 
      70             :     // swiped from the driver:
      71             :     struct PACKED FIFOData {
      72             :         uint8_t header;
      73             :         int16_t accel[3];
      74             :         int16_t gyro[3];
      75             :         int8_t temperature;
      76             :         uint16_t timestamp;
      77             :     };
      78             : 
      79             :     // block support
      80             :     // for things that are larger than a register....
      81             :     int rdwr_block(I2C::i2c_rdwr_ioctl_data *&data);
      82             :     void add_block(const char *name, uint8_t addr, uint8_t len, I2CRegisters::RegMode mode);
      83             :     void set_block(uint8_t addr, uint8_t *value, uint8_t valuelen);
      84             : 
      85             :     const char *blockname[256];
      86             :     Bitmask<256> writable_blocks;
      87             :     Bitmask<256> readable_blocks;
      88             : 
      89             :     // 256 pointers-to-malloced-values:
      90             :     char *block_values[256];
      91             :     uint8_t block_value_lengths[256];
      92             : };
      93             : 
      94             : } // namespace SITL

Generated by: LCOV version 1.14