131 SixAxisSensor::s_accelScale = accelScale;
132 SixAxisSensor::s_gyroScale = gyroScale;
139 if( bsp::I2CA::read<u8>(DeviceAddress,
enumValue(RegisterBank0::WHO_AM_I)) == DeviceID){
144 if(retries > 10)
return false;
151 auto pwrMgmt0 = bsp::I2CA::read<u8>(DeviceAddress,
enumValue(RegisterBank0::PWR_MGMT0));
152 bsp::I2CA::write<u8>(DeviceAddress,
enumValue(RegisterBank0::PWR_MGMT0), pwrMgmt0 | 0x0F);
155 auto gyroConfig0 = bsp::I2CA::read<u8>(DeviceAddress,
enumValue(RegisterBank0::GYRO_CONFIG0));
156 bsp::I2CA::write<u8>(DeviceAddress,
enumValue(RegisterBank0::GYRO_CONFIG0), gyroConfig0 |
enumValue(gyroOdr) | (
enumValue(gyroScale) << 5));
159 auto accelConfig0 = bsp::I2CA::read<u8>(DeviceAddress,
enumValue(RegisterBank0::ACCEL_CONFIG0));
160 bsp::I2CA::write<u8>(DeviceAddress,
enumValue(RegisterBank0::ACCEL_CONFIG0), accelConfig0 |
enumValue(accelOdr) | (
enumValue(accelScale) << 5));
163 auto gyroConfig1 = bsp::I2CA::read<u8>(DeviceAddress,
enumValue(RegisterBank0::GYRO_CONFIG1));
164 bsp::I2CA::write<u8>(DeviceAddress,
enumValue(RegisterBank0::GYRO_CONFIG1), gyroConfig1 | 0xD0);
167 auto intConfig0 = bsp::I2CA::read<u8>(DeviceAddress,
enumValue(RegisterBank0::INT_CONFIG));
168 bsp::I2CA::write<u8>(DeviceAddress,
enumValue(RegisterBank0::INT_CONFIG), intConfig0 | 0x18 | 0x03);
171 auto intConfig1 = bsp::I2CA::read<u8>(DeviceAddress,
enumValue(RegisterBank0::INT_CONFIG1));
172 bsp::I2CA::write<u8>(DeviceAddress,
enumValue(RegisterBank0::INT_CONFIG1), intConfig1 & ~0x10);
175 auto intSource0 = bsp::I2CA::read<u8>(DeviceAddress,
enumValue(RegisterBank0::INT_SOURCE0));
176 bsp::I2CA::write<u8>(DeviceAddress,
enumValue(RegisterBank0::INT_SOURCE0), intSource0 | 0x08);
179 auto intSource3 = bsp::I2CA::read<u8>(DeviceAddress,
enumValue(RegisterBank0::INT_SOURCE3));
180 bsp::I2CA::write<u8>(DeviceAddress,
enumValue(RegisterBank0::INT_SOURCE3), intSource3 | 0x01);
185 auto apexConfig5 = bsp::I2CA::read<u8>(DeviceAddress,
enumValue(RegisterBank4::APEX_CONFIG5));
186 bsp::I2CA::write<u8>(DeviceAddress,
enumValue(RegisterBank4::APEX_CONFIG5), (apexConfig5 & ~(0b111)) | 0x011);
204 auto [x, y, z] = bsp::I2CA::read<GyroData>(DeviceAddress,
enumValue(RegisterBank0::GYRO_DATA_X1));
206 return { transformGyroAxisData(x), transformGyroAxisData(y), transformGyroAxisData(z) };
219 auto [x, y, z] = bsp::I2CA::read<AccelData>(DeviceAddress,
enumValue(RegisterBank0::ACCEL_DATA_X1));
221 return { transformAccelAxisData(x), transformAccelAxisData(y), transformAccelAxisData(z) };
230 auto data = bsp::I2CA::read<ByteSwapped<i16>>(DeviceAddress,
enumValue(RegisterBank0::TEMP_DATA1));
232 return (
float(data) / 132.48F) + 25;
246 float gp = sqrt(x*x + y*y + z*z);
247 orientation.
roll = asin(y/gp) * 180 / math::Pi<float>;
248 orientation.
pitch = asin(x/gp) * 180 / math::Pi<float>;
251 if(x < 0) orientation.
pitch = - 180 - orientation.
pitch;
252 else orientation.
pitch = 180 - orientation.
pitch;
253 if(y < 0) orientation.
roll = - 180 - orientation.
roll;
254 else orientation.
roll = 180 - orientation.
roll;
257 orientation.
roll *= -1;
269 enum class RegisterBank0 :
u8 {
270 DEVICE_CONFIG = 0x11,
276 ACCEL_DATA_X1 = 0x1F,
277 ACCEL_DATA_X0 = 0x20,
278 ACCEL_DATA_Y1 = 0x21,
279 ACCEL_DATA_Y0 = 0x22,
280 ACCEL_DATA_Z1 = 0x23,
281 ACCEL_DATA_Z0 = 0x24,
302 SIGNAL_PATH_RESET = 0x4B,
307 ACCEL_CONFIG0 = 0x50,
309 GYRO_ACCEL_CONFIG0 = 0x52,
310 ACCEL_CONFIG1 = 0x53,
324 FIFO_LOST_PKT0 = 0x6C,
325 FIFO_LOST_PKT1 = 0x6D,
326 SELF_TEST_CONFIG = 0x70,
334 enum class RegisterBank1 :
u8 {
335 SENSOR_CONFIG0 = 0x03,
336 GYRO_CONFIG_STATIC2 = 0x0B,
337 GYRO_CONFIG_STATIC3 = 0x0C,
338 GYRO_CONFIG_STATIC4 = 0x0D,
339 GYRO_CONFIG_STATIC5 = 0x0E,
340 GYRO_CONFIG_STATIC6 = 0x0F,
341 GYRO_CONFIG_STATIC7 = 0x10,
342 GYRO_CONFIG_STATIC8 = 0x11,
343 GYRO_CONFIG_STATIC9 = 0x12,
344 GYRO_CONFIG_STATIC10 = 0x13,
359 enum class RegisterBank2 :
u8 {
360 ACCEL_CONFIG_STATIC2 = 0x03,
361 ACCEL_CONFIG_STATIC3 = 0x04,
362 ACCEL_CONFIG_STATIC4 = 0x05,
371 enum class RegisterBank4 :
u8 {
372 GYRO_ON_OFF_CONFIG = 0x0E,
382 ACCEL_WOM_X_THR = 0x4A,
383 ACCEL_WOM_Y_THR = 0x4B,
384 ACCEL_WOM_Z_THR = 0x4C,
401 constexpr
static inline auto DeviceAddress = 0xD2;
402 constexpr
static inline auto DeviceID = 0x42;
412 static void selectBank(
u8 bank) {
413 auto bankSelect = bsp::I2CA::read<u8>(DeviceAddress,
enumValue(RegisterBank0::REG_BANK_SEL));
414 bsp::I2CA::write<u8>(DeviceAddress,
enumValue(RegisterBank0::REG_BANK_SEL), (bankSelect & 0xF8) | bank);
422 static inline float transformGyroAxisData(
i16 data) {
423 return (
float(data) / 0xFFFF) * (2000 / (
enumValue(SixAxisSensor::s_gyroScale) + 1));
431 static inline float transformAccelAxisData(
i16 data) {
432 return (
float(data) / 0xFFFF) * (16 / (
enumValue(SixAxisSensor::s_accelScale) + 1));