First Commit as a new library
Dependents: Host_Software_MAX32664GWEB_HR_wrist Host_Software_MAX32664GWEC_SpO2_HR Host_Software_MAX32664GWEB_HR_EXTENDED Host_Software_MAX32664GWEC_SpO2_HR-_EXTE ... more
Diff: bmi160.cpp
- Revision:
- 21:f7216b5dc6c0
- Parent:
- 19:8e66f58bef44
--- a/bmi160.cpp Fri May 04 13:35:59 2018 +0300 +++ b/bmi160.cpp Wed Dec 19 14:54:05 2018 +0300 @@ -34,54 +34,40 @@ #include "bmi160.h" -const struct BMI160::AccConfig BMI160::DEFAULT_ACC_CONFIG = {SENS_2G, - ACC_US_OFF, - ACC_BWP_2, +const struct BMI160::AccConfig BMI160::DEFAULT_ACC_CONFIG = {SENS_2G, + ACC_US_OFF, + ACC_BWP_2, ACC_ODR_8}; - -const struct BMI160::GyroConfig BMI160::DEFAULT_GYRO_CONFIG = {DPS_2000, - GYRO_BWP_2, + +const struct BMI160::GyroConfig BMI160::DEFAULT_GYRO_CONFIG = {DPS_2000, + GYRO_BWP_2, GYRO_ODR_8}; -///Period of internal counter -static const float SENSOR_TIME_LSB = 39e-6; - -static const float SENS_2G_LSB_PER_G = 16384.0F; -static const float SENS_4G_LSB_PER_G = 8192.0F; -static const float SENS_8G_LSB_PER_G = 4096.0F; -static const float SENS_16G_LSB_PER_G = 2048.0F; - -static const float SENS_2000_DPS_LSB_PER_DPS = 16.4F; -static const float SENS_1000_DPS_LSB_PER_DPS = 32.8F; -static const float SENS_500_DPS_LSB_PER_DPS = 65.6F; -static const float SENS_250_DPS_LSB_PER_DPS = 131.2F; -static const float SENS_125_DPS_LSB_PER_DPS = 262.4F; - //***************************************************************************** int32_t BMI160::setSensorPowerMode(Sensors sensor, PowerModes pwrMode) { int32_t rtnVal = -1; - + switch(sensor) { case MAG: rtnVal = writeRegister(CMD, (MAG_SET_PMU_MODE | pwrMode)); break; - + case GYRO: rtnVal = writeRegister(CMD, (GYR_SET_PMU_MODE | pwrMode)); break; - + case ACC: rtnVal = writeRegister(CMD, (ACC_SET_PMU_MODE | pwrMode)); break; - + default: rtnVal = -1; break; } - + return rtnVal; } @@ -90,11 +76,11 @@ int32_t BMI160::setSensorConfig(const AccConfig &config) { uint8_t data[2]; - - data[0] = ((config.us << ACC_US_POS) | (config.bwp << ACC_BWP_POS) | + + data[0] = ((config.us << ACC_US_POS) | (config.bwp << ACC_BWP_POS) | (config.odr << ACC_ODR_POS)); data[1] = config.range; - + return writeBlock(ACC_CONF, ACC_RANGE, data); } @@ -103,10 +89,10 @@ int32_t BMI160::setSensorConfig(const GyroConfig &config) { uint8_t data[2]; - + data[0] = ((config.bwp << GYRO_BWP_POS) | (config.odr << GYRO_ODR_POS)); data[1] = config.range; - + return writeBlock(GYR_CONF, GYR_RANGE, data); } @@ -116,7 +102,7 @@ { uint8_t data[2]; int32_t rtnVal = readBlock(ACC_CONF, ACC_RANGE, data); - + if(rtnVal == RTN_NO_ERROR) { config.range = static_cast<BMI160::AccRange>( @@ -128,7 +114,7 @@ config.odr = static_cast<BMI160::AccOutputDataRate>( ((data[0] & ACC_ODR_MASK) >> ACC_ODR_POS)); } - + return rtnVal; } @@ -138,7 +124,7 @@ { uint8_t data[2]; int32_t rtnVal = readBlock(GYR_CONF, GYR_RANGE, data); - + if(rtnVal == RTN_NO_ERROR) { config.range = static_cast<BMI160::GyroRange>( @@ -148,7 +134,7 @@ config.odr = static_cast<BMI160::GyroOutputDataRate>( ((data[0] & GYRO_ODR_MASK) >> GYRO_ODR_POS)); } - + return rtnVal; } @@ -158,26 +144,26 @@ { uint8_t localData[2]; int32_t rtnVal; - + switch(axis) { case X_AXIS: rtnVal = readBlock(DATA_14, DATA_15, localData); break; - + case Y_AXIS: rtnVal = readBlock(DATA_16, DATA_17, localData); break; - + case Z_AXIS: rtnVal = readBlock(DATA_18, DATA_19, localData); break; - + default: rtnVal = -1; break; } - + if(rtnVal == RTN_NO_ERROR) { data.raw = ((localData[1] << 8) | localData[0]); @@ -186,21 +172,21 @@ case SENS_2G: data.scaled = (data.raw/SENS_2G_LSB_PER_G); break; - + case SENS_4G: data.scaled = (data.raw/SENS_4G_LSB_PER_G); break; - + case SENS_8G: data.scaled = (data.raw/SENS_8G_LSB_PER_G); break; - + case SENS_16G: data.scaled = (data.raw/SENS_16G_LSB_PER_G); break; } } - + return rtnVal; } @@ -210,26 +196,26 @@ { uint8_t localData[2]; int32_t rtnVal; - + switch(axis) { case X_AXIS: rtnVal = readBlock(DATA_8, DATA_9, localData); break; - + case Y_AXIS: rtnVal = readBlock(DATA_10, DATA_11, localData); break; - + case Z_AXIS: rtnVal = readBlock(DATA_12, DATA_13, localData); break; - + default: rtnVal = -1; break; } - + if(rtnVal == RTN_NO_ERROR) { data.raw = ((localData[1] << 8) | localData[0]); @@ -238,41 +224,45 @@ case DPS_2000: data.scaled = (data.raw/SENS_2000_DPS_LSB_PER_DPS); break; - + case DPS_1000: data.scaled = (data.raw/SENS_1000_DPS_LSB_PER_DPS); break; - + case DPS_500: data.scaled = (data.raw/SENS_500_DPS_LSB_PER_DPS); break; - + case DPS_250: data.scaled = (data.raw/SENS_250_DPS_LSB_PER_DPS); break; - + case DPS_125: data.scaled = (data.raw/SENS_125_DPS_LSB_PER_DPS); break; } } - + return rtnVal; } - + -//***************************************************************************** +//***************************************************************************** int32_t BMI160::getSensorXYZ(SensorData &data, AccRange range) { uint8_t localData[6]; int32_t rtnVal = readBlock(DATA_14, DATA_19, localData); - + + if (m_use_irq == true && bmi160_irq_asserted == false) + return -1; + + bmi160_irq_asserted = false; if(rtnVal == RTN_NO_ERROR) { data.xAxis.raw = ((localData[1] << 8) | localData[0]); data.yAxis.raw = ((localData[3] << 8) | localData[2]); data.zAxis.raw = ((localData[5] << 8) | localData[4]); - + switch(range) { case SENS_2G: @@ -280,19 +270,19 @@ data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G); data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G); break; - + case SENS_4G: data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G); data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G); data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G); break; - + case SENS_8G: data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G); data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G); data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G); break; - + case SENS_16G: data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G); data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G); @@ -300,23 +290,23 @@ break; } } - + return rtnVal; } -//***************************************************************************** +//***************************************************************************** int32_t BMI160::getSensorXYZ(SensorData &data, GyroRange range) { uint8_t localData[6]; int32_t rtnVal = readBlock(DATA_8, DATA_13, localData); - + if(rtnVal == RTN_NO_ERROR) { data.xAxis.raw = ((localData[1] << 8) | localData[0]); data.yAxis.raw = ((localData[3] << 8) | localData[2]); data.zAxis.raw = ((localData[5] << 8) | localData[4]); - + switch(range) { case DPS_2000: @@ -324,25 +314,25 @@ data.yAxis.scaled = (data.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS); data.zAxis.scaled = (data.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS); break; - + case DPS_1000: data.xAxis.scaled = (data.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS); data.yAxis.scaled = (data.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS); data.zAxis.scaled = (data.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS); break; - + case DPS_500: data.xAxis.scaled = (data.xAxis.raw/SENS_500_DPS_LSB_PER_DPS); data.yAxis.scaled = (data.yAxis.raw/SENS_500_DPS_LSB_PER_DPS); data.zAxis.scaled = (data.zAxis.raw/SENS_500_DPS_LSB_PER_DPS); break; - + case DPS_250: data.xAxis.scaled = (data.xAxis.raw/SENS_250_DPS_LSB_PER_DPS); data.yAxis.scaled = (data.yAxis.raw/SENS_250_DPS_LSB_PER_DPS); data.zAxis.scaled = (data.zAxis.raw/SENS_250_DPS_LSB_PER_DPS); break; - + case DPS_125: data.xAxis.scaled = (data.xAxis.raw/SENS_125_DPS_LSB_PER_DPS); data.yAxis.scaled = (data.yAxis.raw/SENS_125_DPS_LSB_PER_DPS); @@ -350,14 +340,14 @@ break; } } - + return rtnVal; } -//***************************************************************************** -int32_t BMI160::getSensorXYZandSensorTime(SensorData &data, - SensorTime &sensorTime, +//***************************************************************************** +int32_t BMI160::getSensorXYZandSensorTime(SensorData &data, + SensorTime &sensorTime, AccRange range) { uint8_t localData[9]; @@ -367,7 +357,7 @@ data.xAxis.raw = ((localData[1] << 8) | localData[0]); data.yAxis.raw = ((localData[3] << 8) | localData[2]); data.zAxis.raw = ((localData[5] << 8) | localData[4]); - + switch(range) { case SENS_2G: @@ -375,38 +365,38 @@ data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G); data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G); break; - + case SENS_4G: data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G); data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G); data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G); break; - + case SENS_8G: data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G); data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G); data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G); break; - + case SENS_16G: data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G); data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G); data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G); break; } - - sensorTime.raw = ((localData[8] << 16) | (localData[7] << 8) | + + sensorTime.raw = ((localData[8] << 16) | (localData[7] << 8) | localData[6]); sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB); } - + return rtnVal; } -//***************************************************************************** -int32_t BMI160::getSensorXYZandSensorTime(SensorData &data, - SensorTime &sensorTime, +//***************************************************************************** +int32_t BMI160::getSensorXYZandSensorTime(SensorData &data, + SensorTime &sensorTime, GyroRange range) { uint8_t localData[16]; @@ -416,7 +406,7 @@ data.xAxis.raw = ((localData[1] << 8) | localData[0]); data.yAxis.raw = ((localData[3] << 8) | localData[2]); data.zAxis.raw = ((localData[5] << 8) | localData[4]); - + switch(range) { case DPS_2000: @@ -424,46 +414,46 @@ data.yAxis.scaled = (data.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS); data.zAxis.scaled = (data.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS); break; - + case DPS_1000: data.xAxis.scaled = (data.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS); data.yAxis.scaled = (data.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS); data.zAxis.scaled = (data.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS); break; - + case DPS_500: data.xAxis.scaled = (data.xAxis.raw/SENS_500_DPS_LSB_PER_DPS); data.yAxis.scaled = (data.yAxis.raw/SENS_500_DPS_LSB_PER_DPS); data.zAxis.scaled = (data.zAxis.raw/SENS_500_DPS_LSB_PER_DPS); break; - + case DPS_250: data.xAxis.scaled = (data.xAxis.raw/SENS_250_DPS_LSB_PER_DPS); data.yAxis.scaled = (data.yAxis.raw/SENS_250_DPS_LSB_PER_DPS); data.zAxis.scaled = (data.zAxis.raw/SENS_250_DPS_LSB_PER_DPS); break; - + case DPS_125: data.xAxis.scaled = (data.xAxis.raw/SENS_125_DPS_LSB_PER_DPS); data.yAxis.scaled = (data.yAxis.raw/SENS_125_DPS_LSB_PER_DPS); data.zAxis.scaled = (data.zAxis.raw/SENS_125_DPS_LSB_PER_DPS); break; } - - sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) | + + sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) | localData[12]); sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB); } - + return rtnVal; } -//***************************************************************************** -int32_t BMI160::getGyroAccXYZandSensorTime(SensorData &accData, - SensorData &gyroData, - SensorTime &sensorTime, - AccRange accRange, +//***************************************************************************** +int32_t BMI160::getGyroAccXYZandSensorTime(SensorData &accData, + SensorData &gyroData, + SensorTime &sensorTime, + AccRange accRange, GyroRange gyroRange) { uint8_t localData[16]; @@ -473,11 +463,11 @@ gyroData.xAxis.raw = ((localData[1] << 8) | localData[0]); gyroData.yAxis.raw = ((localData[3] << 8) | localData[2]); gyroData.zAxis.raw = ((localData[5] << 8) | localData[4]); - + accData.xAxis.raw = ((localData[7] << 8) | localData[6]); accData.yAxis.raw = ((localData[9] << 8) | localData[8]); accData.zAxis.raw = ((localData[11] << 8) | localData[10]); - + switch(gyroRange) { case DPS_2000: @@ -485,32 +475,32 @@ gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS); gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS); break; - + case DPS_1000: gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS); gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS); gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS); break; - + case DPS_500: gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_500_DPS_LSB_PER_DPS); gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_500_DPS_LSB_PER_DPS); gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_500_DPS_LSB_PER_DPS); break; - + case DPS_250: gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_250_DPS_LSB_PER_DPS); gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_250_DPS_LSB_PER_DPS); gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_250_DPS_LSB_PER_DPS); break; - + case DPS_125: gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_125_DPS_LSB_PER_DPS); gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_125_DPS_LSB_PER_DPS); gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_125_DPS_LSB_PER_DPS); break; } - + switch(accRange) { case SENS_2G: @@ -518,48 +508,82 @@ accData.yAxis.scaled = (accData.yAxis.raw/SENS_2G_LSB_PER_G); accData.zAxis.scaled = (accData.zAxis.raw/SENS_2G_LSB_PER_G); break; - + case SENS_4G: accData.xAxis.scaled = (accData.xAxis.raw/SENS_4G_LSB_PER_G); accData.yAxis.scaled = (accData.yAxis.raw/SENS_4G_LSB_PER_G); accData.zAxis.scaled = (accData.zAxis.raw/SENS_4G_LSB_PER_G); break; - + case SENS_8G: accData.xAxis.scaled = (accData.xAxis.raw/SENS_8G_LSB_PER_G); accData.yAxis.scaled = (accData.yAxis.raw/SENS_8G_LSB_PER_G); accData.zAxis.scaled = (accData.zAxis.raw/SENS_8G_LSB_PER_G); break; - + case SENS_16G: accData.xAxis.scaled = (accData.xAxis.raw/SENS_16G_LSB_PER_G); accData.yAxis.scaled = (accData.yAxis.raw/SENS_16G_LSB_PER_G); accData.zAxis.scaled = (accData.zAxis.raw/SENS_16G_LSB_PER_G); break; } - - sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) | + + sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) | localData[12]); sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB); } - + return rtnVal; } +int32_t BMI160::setSampleRate(int sample_rate) +{ + int sr_reg_val = -1; + int i; + const uint16_t odr_table[][2] = { + {25, GYRO_ODR_6}, ///<25Hz + {50, GYRO_ODR_7}, ///<50Hz + {100, GYRO_ODR_8}, ///<100Hz + {200, GYRO_ODR_9}, ///<200Hz + {400, GYRO_ODR_10}, ///<400Hz + {800, GYRO_ODR_11}, ///<800Hz + {1600, GYRO_ODR_12}, ///<1600Hz + {3200, GYRO_ODR_13}, ///<3200Hz + }; -//***************************************************************************** + int num_sr = sizeof(odr_table)/sizeof(odr_table[0]); + for (i = 0; i < num_sr; i++) { + if (sample_rate == odr_table[i][0]) { + sr_reg_val = odr_table[i][1]; + break; + } + } + + if (sr_reg_val == -1) + return -2; + + AccConfig accConfigRead; + if (getSensorConfig(accConfigRead) == BMI160::RTN_NO_ERROR) { + accConfigRead.odr = (AccOutputDataRate)sr_reg_val; + return setSensorConfig(accConfigRead) == BMI160::RTN_NO_ERROR ? 0 : -1; + } else + return -1; +} + + +//***************************************************************************** int32_t BMI160::getSensorTime(SensorTime &sensorTime) { uint8_t localData[3]; int32_t rtnVal = readBlock(SENSORTIME_0, SENSORTIME_2, localData); - + if(rtnVal == RTN_NO_ERROR) { - sensorTime.raw = ((localData[2] << 16) | (localData[1] << 8) | + sensorTime.raw = ((localData[2] << 16) | (localData[1] << 8) | localData[0]); sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB); } - + return rtnVal; } @@ -569,7 +593,7 @@ { uint8_t data[2]; uint16_t rawTemp; - + int32_t rtnVal = readBlock(TEMPERATURE_0, TEMPERATURE_1, data); if(rtnVal == RTN_NO_ERROR) { @@ -583,6 +607,117 @@ *temp = ((rawTemp/512.0F) + 23.0F); } } - + return rtnVal; } + +//*********************************************************************************** +int32_t BMI160::BMI160_DefaultInitalize(){ + + //soft reset the accelerometer + writeRegister(CMD ,SOFT_RESET); + wait(0.1); + + //Power up sensors in normal mode + if(setSensorPowerMode(BMI160::GYRO, BMI160::SUSPEND) != BMI160::RTN_NO_ERROR){ + printf("Failed to set gyroscope power mode\n"); + } + + wait(0.1); + + if(setSensorPowerMode(BMI160::ACC, BMI160::NORMAL) != BMI160::RTN_NO_ERROR){ + printf("Failed to set accelerometer power mode\n"); + } + wait(0.1); + + BMI160::AccConfig accConfig; + BMI160::AccConfig accConfigRead; + accConfig.range = BMI160::SENS_2G; + accConfig.us = BMI160::ACC_US_OFF; + accConfig.bwp = BMI160::ACC_BWP_2; + accConfig.odr = BMI160::ACC_ODR_6; + if(setSensorConfig(accConfig) == BMI160::RTN_NO_ERROR) + { + if(getSensorConfig(accConfigRead) == BMI160::RTN_NO_ERROR) + { + if((accConfig.range != accConfigRead.range) || + (accConfig.us != accConfigRead.us) || + (accConfig.bwp != accConfigRead.bwp) || + (accConfig.odr != accConfigRead.odr)) + { + printf("ACC read data desn't equal set data\n\n"); + printf("ACC Set Range = %d\n", accConfig.range); + printf("ACC Set UnderSampling = %d\n", accConfig.us); + printf("ACC Set BandWidthParam = %d\n", accConfig.bwp); + printf("ACC Set OutputDataRate = %d\n\n", accConfig.odr); + printf("ACC Read Range = %d\n", accConfigRead.range); + printf("ACC Read UnderSampling = %d\n", accConfigRead.us); + printf("ACC Read BandWidthParam = %d\n", accConfigRead.bwp); + printf("ACC Read OutputDataRate = %d\n\n", accConfigRead.odr); + } + + } + else + { + printf("Failed to read back accelerometer configuration\n"); + } + } + else + { + printf("Failed to set accelerometer configuration\n"); + } + return 0; +} + +//*********************************************************************************** +int32_t BMI160::enable_data_ready_interrupt() { + uint8_t data = 0; + uint8_t temp = 0; + int32_t result; + + result = readRegister(INT_EN_1, &data); + temp = data & ~0x10; + data = temp | ((1 << 4) & 0x10); + /* Writing data to INT ENABLE 1 Address */ + result |= writeRegister(INT_EN_1, data); + + // configure in_out ctrl + //bmi160_get_regs(BMI160_INT_OUT_CTRL_ADDR, &data, 1, dev); + result |= readRegister(INT_OUT_CTRL, &data); + data = 0x09; + result |= writeRegister(INT_OUT_CTRL,data); + + //config int latch + //bmi160_get_regs(BMI160_INT_LATCH_ADDR, &data, 1, dev); + result |= readRegister(INT_LATCH, &data); + data = 0x0F; + result |= writeRegister(INT_LATCH, data); + + //bmi160_get_regs(BMI160_INT_MAP_1_ADDR, &data, 1, dev); + result |= readRegister(INT_MAP_1, &data); + data = 0x80; + result |= writeRegister(INT_MAP_1, data); + + if(result != 0){ + printf("BMI160::%s failed.\r\n", __func__); + return -1; + } + + m_bmi160_irq->disable_irq(); + m_bmi160_irq->mode(PullUp); + m_bmi160_irq->fall(this, &BMI160::irq_handler); + m_bmi160_irq->enable_irq(); + return 0; +} + +void BMI160::irq_handler() { + bmi160_irq_asserted = true; +} + +int32_t BMI160::reset() { + if (m_use_irq) + m_bmi160_irq->disable_irq(); + bmi160_irq_asserted = false; + writeRegister(CMD, SOFT_RESET); + return 0; +}