#pragma once #include "sensors/i2c_sensor.hpp" // Address of the chip on the bus #define BMX055_MAGN_I2C_ADDR 0x10 // Registers of the chip #define BMX055_MAGN_I2C_REG_ID 0x40 #define BMX055_MAGN_I2C_REG_PWR_0 0x4B #define BMX055_MAGN_I2C_REG_MAG 0x4C #define BMX055_MAGN_I2C_REG_DATAX_LSB 0x42 #define BMX055_MAGN_I2C_REG_RHALL_LSB 0x48 #define BMX055_MAGN_I2C_REG_REPXY 0x51 #define BMX055_MAGN_I2C_REG_REPZ 0x52 #define BMX055_MAGN_I2C_REG_DIG_X1 0x5D #define BMX055_MAGN_I2C_REG_DIG_Z4 0x62 #define BMX055_MAGN_I2C_REG_DIG_Z2 0x68 // Constants #define BMX055_MAGN_CHIP_ID 0x32 #define BMX055_MAGN_FORCED (0b01 << 1) struct trim_data_t { int8_t dig_x1; int8_t dig_y1; int8_t dig_x2; int8_t dig_y2; uint16_t dig_z1; int16_t dig_z2; int16_t dig_z3; int16_t dig_z4; uint8_t dig_xy1; int8_t dig_xy2; uint16_t dig_xyz1; }; class BMX055_Magn : public I2CSensor{ uint8_t get_device_address() {return BMX055_MAGN_I2C_ADDR;} trim_data_t trim_data = {0}; public: BMX055_Magn(I2CBus *bus); int init(); void get_event(cereal::SensorEventData::Builder &event); };