iNEMO inertial module: 3D accelerometer and 3D gyroscope.
Dependencies: X_NUCLEO_COMMON ST_INTERFACES
Dependents: X_NUCLEO_IKS01A3 X_NUCLEO_IKS01A3
Diff: LSM6DSOSensor.cpp
- Revision:
- 4:77faf76e3cd8
- Parent:
- 3:4274d9103f1d
diff -r 4274d9103f1d -r 77faf76e3cd8 LSM6DSOSensor.cpp --- a/LSM6DSOSensor.cpp Wed Jul 24 14:19:35 2019 +0000 +++ b/LSM6DSOSensor.cpp Thu Oct 29 12:50:52 2020 +0000 @@ -274,8 +274,8 @@ *odr = 0.0f; break; - case LSM6DSO_XL_ODR_6Hz5: - *odr = 6.5f; + case LSM6DSO_XL_ODR_1Hz6: + *odr = 1.6f; break; case LSM6DSO_XL_ODR_12Hz5: @@ -333,12 +333,200 @@ */ int LSM6DSOSensor::set_x_odr(float odr) { + return set_x_odr_with_mode(odr, LSM6DSO_ACC_HIGH_PERFORMANCE_MODE); +} + +/** + * @brief Set the LSM6DSO accelerometer sensor output data rate with operating mode + * @param odr the output data rate value to be set + * @param mode the accelerometer operating mode + * @note This function switches off the gyroscope if Ultra Low Power Mode is set + * @retval 0 in case of success, an error code otherwise + */ +int LSM6DSOSensor::set_x_odr_with_mode(float odr, LSM6DSO_ACC_Operating_Mode_t mode) +{ + int ret = 0; + + switch (mode) + { + case LSM6DSO_ACC_HIGH_PERFORMANCE_MODE: + { + /* We must uncheck Low Power and Ultra Low Power bits if they are enabled */ + lsm6dso_ctrl5_c_t val1; + lsm6dso_ctrl6_c_t val2; + + if (lsm6dso_read_reg(&_reg_ctx, LSM6DSO_CTRL5_C, (uint8_t *)&val1, 1) != 0) + { + return 1; + } + + if (val1.xl_ulp_en) + { + /* Power off the accelerometer */ + if (_x_is_enabled == 1U) + { + if (lsm6dso_xl_data_rate_set(&_reg_ctx, LSM6DSO_XL_ODR_OFF) != 0) + { + return 1; + } + } + + val1.xl_ulp_en = 0; + if (lsm6dso_write_reg(&_reg_ctx, LSM6DSO_CTRL5_C, (uint8_t *)&val1, 1) != 0) + { + return 1; + } + } + + if (lsm6dso_read_reg(&_reg_ctx, LSM6DSO_CTRL6_C, (uint8_t *)&val2, 1) != 0) + { + return 1; + } + + if (val2.xl_hm_mode) + { + val2.xl_hm_mode = 0; + if (lsm6dso_write_reg(&_reg_ctx, LSM6DSO_CTRL6_C, (uint8_t *)&val2, 1) != 0) + { + return 1; + } + } + + /* ODR should be at least 12.5Hz */ + if (odr < 12.5f) + { + odr = 12.5f; + } + break; + } + case LSM6DSO_ACC_LOW_POWER_NORMAL_MODE: + { + /* We must uncheck Ultra Low Power bit if it is enabled */ + /* and check the Low Power bit if it is unchecked */ + lsm6dso_ctrl5_c_t val1; + lsm6dso_ctrl6_c_t val2; + + if (lsm6dso_read_reg(&_reg_ctx, LSM6DSO_CTRL5_C, (uint8_t *)&val1, 1) != 0) + { + return 1; + } + + if (val1.xl_ulp_en) + { + /* Power off the accelerometer */ + if (_x_is_enabled == 1U) + { + if (lsm6dso_xl_data_rate_set(&_reg_ctx, LSM6DSO_XL_ODR_OFF) != 0) + { + return 1; + } + } + + val1.xl_ulp_en = 0; + if (lsm6dso_write_reg(&_reg_ctx, LSM6DSO_CTRL5_C, (uint8_t *)&val1, 1) != 0) + { + return 1; + } + } + + if (lsm6dso_read_reg(&_reg_ctx, LSM6DSO_CTRL6_C, (uint8_t *)&val2, 1) != 0) + { + return 1; + } + + if (!val2.xl_hm_mode) + { + val2.xl_hm_mode = 1U; + if (lsm6dso_write_reg(&_reg_ctx, LSM6DSO_CTRL6_C, (uint8_t *)&val2, 1) != 0) + { + return 1; + } + } + + /* Now we need to limit the ODR to 208 Hz if it is higher */ + if (odr > 208.0f) + { + odr = 208.0f; + } + break; + } + case LSM6DSO_ACC_ULTRA_LOW_POWER_MODE: + { + /* We must uncheck Low Power bit if it is enabled */ + /* and check the Ultra Low Power bit if it is unchecked */ + /* We must switch off gyro otherwise Ultra Low Power does not work */ + lsm6dso_ctrl5_c_t val1; + lsm6dso_ctrl6_c_t val2; + + if (lsm6dso_read_reg(&_reg_ctx, LSM6DSO_CTRL6_C, (uint8_t *)&val2, 1) != 0) + { + return 1; + } + + if (val2.xl_hm_mode) + { + val2.xl_hm_mode = 0; + if (lsm6dso_write_reg(&_reg_ctx, LSM6DSO_CTRL6_C, (uint8_t *)&val2, 1) != 0) + { + return 1; + } + } + + /* Disable Gyro */ + if (_g_is_enabled == 1U) + { + if (disable_g() != 0) + { + return 1; + } + } + + if (lsm6dso_read_reg(&_reg_ctx, LSM6DSO_CTRL5_C, (uint8_t *)&val1, 1) != 0) + { + return 1; + } + + if (!val1.xl_ulp_en) + { + /* Power off the accelerometer */ + if (_x_is_enabled == 1U) + { + if (lsm6dso_xl_data_rate_set(&_reg_ctx, LSM6DSO_XL_ODR_OFF) != 0) + { + return 1; + } + } + + val1.xl_ulp_en = 1U; + if (lsm6dso_write_reg(&_reg_ctx, LSM6DSO_CTRL5_C, (uint8_t *)&val1, 1) != 0) + { + return 1; + } + } + + /* Now we need to limit the ODR to 208 Hz if it is higher */ + if (odr > 208.0f) + { + odr = 208.0f; + } + break; + } + default: + ret = 1; + break; + } + /* Check if the component is enabled */ - if (_x_is_enabled == 1U) { - return set_x_odr_when_enabled(odr); - } else { - return set_x_odr_when_disabled(odr); + if (_x_is_enabled == 1U) + { + ret = set_x_odr_when_enabled(odr); } + else + { + ret = set_x_odr_when_disabled(odr); + } + + return ret; } /** @@ -350,16 +538,17 @@ { lsm6dso_odr_xl_t new_odr; - new_odr = (odr <= 12.5f) ? LSM6DSO_XL_ODR_12Hz5 - : (odr <= 26.0f) ? LSM6DSO_XL_ODR_26Hz - : (odr <= 52.0f) ? LSM6DSO_XL_ODR_52Hz - : (odr <= 104.0f) ? LSM6DSO_XL_ODR_104Hz - : (odr <= 208.0f) ? LSM6DSO_XL_ODR_208Hz - : (odr <= 417.0f) ? LSM6DSO_XL_ODR_417Hz - : (odr <= 833.0f) ? LSM6DSO_XL_ODR_833Hz - : (odr <= 1667.0f) ? LSM6DSO_XL_ODR_1667Hz - : (odr <= 3333.0f) ? LSM6DSO_XL_ODR_3333Hz - : LSM6DSO_XL_ODR_6667Hz; + new_odr = (odr <= 1.6f) ? LSM6DSO_XL_ODR_1Hz6 + : (odr <= 12.5f) ? LSM6DSO_XL_ODR_12Hz5 + : (odr <= 26.0f) ? LSM6DSO_XL_ODR_26Hz + : (odr <= 52.0f) ? LSM6DSO_XL_ODR_52Hz + : (odr <= 104.0f) ? LSM6DSO_XL_ODR_104Hz + : (odr <= 208.0f) ? LSM6DSO_XL_ODR_208Hz + : (odr <= 417.0f) ? LSM6DSO_XL_ODR_417Hz + : (odr <= 833.0f) ? LSM6DSO_XL_ODR_833Hz + : (odr <= 1667.0f) ? LSM6DSO_XL_ODR_1667Hz + : (odr <= 3333.0f) ? LSM6DSO_XL_ODR_3333Hz + : LSM6DSO_XL_ODR_6667Hz; /* Output data rate selection. */ if (lsm6dso_xl_data_rate_set(&_reg_ctx, new_odr) != 0) { @@ -376,16 +565,17 @@ */ int LSM6DSOSensor::set_x_odr_when_disabled(float odr) { - _x_last_odr = (odr <= 12.5f) ? LSM6DSO_XL_ODR_12Hz5 - : (odr <= 26.0f) ? LSM6DSO_XL_ODR_26Hz - : (odr <= 52.0f) ? LSM6DSO_XL_ODR_52Hz - : (odr <= 104.0f) ? LSM6DSO_XL_ODR_104Hz - : (odr <= 208.0f) ? LSM6DSO_XL_ODR_208Hz - : (odr <= 417.0f) ? LSM6DSO_XL_ODR_417Hz - : (odr <= 833.0f) ? LSM6DSO_XL_ODR_833Hz - : (odr <= 1667.0f) ? LSM6DSO_XL_ODR_1667Hz - : (odr <= 3333.0f) ? LSM6DSO_XL_ODR_3333Hz - : LSM6DSO_XL_ODR_6667Hz; + _x_last_odr = (odr <= 1.6f) ? LSM6DSO_XL_ODR_1Hz6 + : (odr <= 12.5f) ? LSM6DSO_XL_ODR_12Hz5 + : (odr <= 26.0f) ? LSM6DSO_XL_ODR_26Hz + : (odr <= 52.0f) ? LSM6DSO_XL_ODR_52Hz + : (odr <= 104.0f) ? LSM6DSO_XL_ODR_104Hz + : (odr <= 208.0f) ? LSM6DSO_XL_ODR_208Hz + : (odr <= 417.0f) ? LSM6DSO_XL_ODR_417Hz + : (odr <= 833.0f) ? LSM6DSO_XL_ODR_833Hz + : (odr <= 1667.0f) ? LSM6DSO_XL_ODR_1667Hz + : (odr <= 3333.0f) ? LSM6DSO_XL_ODR_3333Hz + : LSM6DSO_XL_ODR_6667Hz; return 0; } @@ -443,9 +633,9 @@ /* Seems like MISRA C-2012 rule 14.3a violation but only from single file statical analysis point of view because the parameter passed to the function is not known at the moment of analysis */ new_fs = (full_scale <= 2.0f) ? LSM6DSO_2g - : (full_scale <= 4.0f) ? LSM6DSO_4g - : (full_scale <= 8.0f) ? LSM6DSO_8g - : LSM6DSO_16g; + : (full_scale <= 4.0f) ? LSM6DSO_4g + : (full_scale <= 8.0f) ? LSM6DSO_8g + : LSM6DSO_16g; if (lsm6dso_xl_full_scale_set(&_reg_ctx, new_fs) != 0) { return 1; @@ -674,12 +864,83 @@ */ int LSM6DSOSensor::set_g_odr(float odr) { + return set_g_odr_with_mode(odr, LSM6DSO_GYRO_HIGH_PERFORMANCE_MODE); +} + +/** + * @brief Set the LSM6DSO gyroscope sensor output data rate with operating mode + * @param odr the output data rate value to be set + * @param mode the gyroscope operating mode + * @retval 0 in case of success, an error code otherwise + */ +int LSM6DSOSensor::set_g_odr_with_mode(float odr, LSM6DSO_GYRO_Operating_Mode_t mode) +{ + int ret = 0; + + switch (mode) + { + case LSM6DSO_GYRO_HIGH_PERFORMANCE_MODE: + { + /* We must uncheck Low Power bit if it is enabled */ + lsm6dso_ctrl7_g_t val1; + + if (lsm6dso_read_reg(&_reg_ctx, LSM6DSO_CTRL7_G, (uint8_t *)&val1, 1) != 0) + { + return 1; + } + + if (val1.g_hm_mode) + { + val1.g_hm_mode = 0; + if (lsm6dso_write_reg(&_reg_ctx, LSM6DSO_CTRL7_G, (uint8_t *)&val1, 1) != 0) + { + return 1; + } + } + break; + } + case LSM6DSO_GYRO_LOW_POWER_NORMAL_MODE: + { + /* We must check the Low Power bit if it is unchecked */ + lsm6dso_ctrl7_g_t val1; + + if (lsm6dso_read_reg(&_reg_ctx, LSM6DSO_CTRL7_G, (uint8_t *)&val1, 1) != 0) + { + return 1; + } + + if (!val1.g_hm_mode) + { + val1.g_hm_mode = 1U; + if (lsm6dso_write_reg(&_reg_ctx, LSM6DSO_CTRL7_G, (uint8_t *)&val1, 1) != 0) + { + return 1; + } + } + + /* Now we need to limit the ODR to 208 Hz if it is higher */ + if (odr > 208.0f) + { + odr = 208.0f; + } + break; + } + default: + ret = 1; + break; + } + /* Check if the component is enabled */ - if (_g_is_enabled == 1U) { - return set_g_odr_when_enabled(odr); - } else { - return set_g_odr_when_disabled(odr); + if (_g_is_enabled == 1U) + { + ret = set_g_odr_when_enabled(odr); } + else + { + ret = set_g_odr_when_disabled(odr); + } + + return ret; } /** @@ -692,15 +953,15 @@ lsm6dso_odr_g_t new_odr; new_odr = (odr <= 12.5f) ? LSM6DSO_GY_ODR_12Hz5 - : (odr <= 26.0f) ? LSM6DSO_GY_ODR_26Hz - : (odr <= 52.0f) ? LSM6DSO_GY_ODR_52Hz - : (odr <= 104.0f) ? LSM6DSO_GY_ODR_104Hz - : (odr <= 208.0f) ? LSM6DSO_GY_ODR_208Hz - : (odr <= 417.0f) ? LSM6DSO_GY_ODR_417Hz - : (odr <= 833.0f) ? LSM6DSO_GY_ODR_833Hz - : (odr <= 1667.0f) ? LSM6DSO_GY_ODR_1667Hz - : (odr <= 3333.0f) ? LSM6DSO_GY_ODR_3333Hz - : LSM6DSO_GY_ODR_6667Hz; + : (odr <= 26.0f) ? LSM6DSO_GY_ODR_26Hz + : (odr <= 52.0f) ? LSM6DSO_GY_ODR_52Hz + : (odr <= 104.0f) ? LSM6DSO_GY_ODR_104Hz + : (odr <= 208.0f) ? LSM6DSO_GY_ODR_208Hz + : (odr <= 417.0f) ? LSM6DSO_GY_ODR_417Hz + : (odr <= 833.0f) ? LSM6DSO_GY_ODR_833Hz + : (odr <= 1667.0f) ? LSM6DSO_GY_ODR_1667Hz + : (odr <= 3333.0f) ? LSM6DSO_GY_ODR_3333Hz + : LSM6DSO_GY_ODR_6667Hz; /* Output data rate selection. */ if (lsm6dso_gy_data_rate_set(&_reg_ctx, new_odr) != 0) { @@ -718,15 +979,15 @@ int LSM6DSOSensor::set_g_odr_when_disabled(float odr) { _g_last_odr = (odr <= 12.5f) ? LSM6DSO_GY_ODR_12Hz5 - : (odr <= 26.0f) ? LSM6DSO_GY_ODR_26Hz - : (odr <= 52.0f) ? LSM6DSO_GY_ODR_52Hz - : (odr <= 104.0f) ? LSM6DSO_GY_ODR_104Hz - : (odr <= 208.0f) ? LSM6DSO_GY_ODR_208Hz - : (odr <= 417.0f) ? LSM6DSO_GY_ODR_417Hz - : (odr <= 833.0f) ? LSM6DSO_GY_ODR_833Hz - : (odr <= 1667.0f) ? LSM6DSO_GY_ODR_1667Hz - : (odr <= 3333.0f) ? LSM6DSO_GY_ODR_3333Hz - : LSM6DSO_GY_ODR_6667Hz; + : (odr <= 26.0f) ? LSM6DSO_GY_ODR_26Hz + : (odr <= 52.0f) ? LSM6DSO_GY_ODR_52Hz + : (odr <= 104.0f) ? LSM6DSO_GY_ODR_104Hz + : (odr <= 208.0f) ? LSM6DSO_GY_ODR_208Hz + : (odr <= 417.0f) ? LSM6DSO_GY_ODR_417Hz + : (odr <= 833.0f) ? LSM6DSO_GY_ODR_833Hz + : (odr <= 1667.0f) ? LSM6DSO_GY_ODR_1667Hz + : (odr <= 3333.0f) ? LSM6DSO_GY_ODR_3333Hz + : LSM6DSO_GY_ODR_6667Hz; return 0; } @@ -786,10 +1047,10 @@ lsm6dso_fs_g_t new_fs; new_fs = (full_scale <= 125.0f) ? LSM6DSO_125dps - : (full_scale <= 250.0f) ? LSM6DSO_250dps - : (full_scale <= 500.0f) ? LSM6DSO_500dps - : (full_scale <= 1000.0f) ? LSM6DSO_1000dps - : LSM6DSO_2000dps; + : (full_scale <= 250.0f) ? LSM6DSO_250dps + : (full_scale <= 500.0f) ? LSM6DSO_500dps + : (full_scale <= 1000.0f) ? LSM6DSO_1000dps + : LSM6DSO_2000dps; if (lsm6dso_gy_full_scale_set(&_reg_ctx, new_fs) != 0) { return 1; @@ -947,21 +1208,21 @@ return 1; } - val1.md1_cfg.int1_ff = PROPERTY_ENABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.free_fall = PROPERTY_ENABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } break; case LSM6DSO_INT2_PIN: - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.md2_cfg.int2_ff = PROPERTY_ENABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.free_fall = PROPERTY_ENABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; } break; @@ -988,19 +1249,19 @@ return 1; } - val1.md1_cfg.int1_ff = PROPERTY_DISABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.free_fall = PROPERTY_DISABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.md2_cfg.int2_ff = PROPERTY_DISABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.free_fall = PROPERTY_DISABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; } @@ -1054,6 +1315,7 @@ int LSM6DSOSensor::enable_pedometer() { lsm6dso_pin_int1_route_t val; + lsm6dso_emb_sens_t emb_sens; /* Output Data Rate selection */ if (set_x_odr(26.0f) != 0) { @@ -1065,8 +1327,32 @@ return 1; } + /* Save current embedded features */ + if (lsm6dso_embedded_sens_get(&_reg_ctx, &emb_sens) != 0) + { + return 1; + } + + /* Turn off embedded features */ + if (lsm6dso_embedded_sens_off(&_reg_ctx) != 0) + { + return 1; + } + + /* Wait for 10 ms */ + ThisThread::sleep_for(10); + /* Enable pedometer algorithm. */ - if (lsm6dso_pedo_sens_set(&_reg_ctx, LSM6DSO_PEDO_BASE_MODE) != 0) { + emb_sens.step = PROPERTY_ENABLE; + + if (lsm6dso_pedo_sens_set(&_reg_ctx, LSM6DSO_PEDO_BASE_MODE) != 0) + { + return 1; + } + + /* Turn on embedded features */ + if (lsm6dso_embedded_sens_set(&_reg_ctx, &emb_sens) != 0) + { return 1; } @@ -1075,9 +1361,9 @@ return 1; } - val.emb_func_int1.int1_step_detector = PROPERTY_ENABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val) != 0) { + val.step_detector = PROPERTY_ENABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val) != 0) { return 1; } @@ -1091,20 +1377,30 @@ int LSM6DSOSensor::disable_pedometer() { lsm6dso_pin_int1_route_t val1; + lsm6dso_emb_sens_t emb_sens; /* Disable step detector on INT1 pin */ if (lsm6dso_pin_int1_route_get(&_reg_ctx, &val1) != 0) { return 1; } - val1.emb_func_int1.int1_step_detector = PROPERTY_DISABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.step_detector = PROPERTY_DISABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { + return 1; + } + + /* Save current embedded features */ + if (lsm6dso_embedded_sens_get(&_reg_ctx, &emb_sens) != 0) + { return 1; } /* Disable pedometer algorithm. */ - if (lsm6dso_pedo_sens_set(&_reg_ctx, LSM6DSO_PEDO_DISABLE) != 0) { + emb_sens.step = PROPERTY_DISABLE; + + if (lsm6dso_embedded_sens_set(&_reg_ctx, &emb_sens) != 0) + { return 1; } @@ -1148,6 +1444,7 @@ int ret = 0; lsm6dso_pin_int1_route_t val1; lsm6dso_pin_int2_route_t val2; + lsm6dso_emb_sens_t emb_sens; /* Output Data Rate selection */ if (set_x_odr(26.0f) != 0) { @@ -1159,8 +1456,27 @@ return 1; } - /* Enable tilt calculation. */ - if (lsm6dso_tilt_sens_set(&_reg_ctx, PROPERTY_ENABLE) != 0) { + /* Save current embedded features */ + if (lsm6dso_embedded_sens_get(&_reg_ctx, &emb_sens) != 0) + { + return 1; + } + + /* Turn off embedded features */ + if (lsm6dso_embedded_sens_off(&_reg_ctx) != 0) + { + return 1; + } + + /* Wait for 10 ms */ + ThisThread::sleep_for(10); + + /* Enable tilt algorithm. */ + emb_sens.tilt = PROPERTY_ENABLE; + + /* Turn on embedded features */ + if (lsm6dso_embedded_sens_set(&_reg_ctx, &emb_sens) != 0) + { return 1; } @@ -1171,21 +1487,21 @@ return 1; } - val1.emb_func_int1.int1_tilt = PROPERTY_ENABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.tilt = PROPERTY_ENABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } break; case LSM6DSO_INT2_PIN: - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.emb_func_int2.int2_tilt = PROPERTY_ENABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.tilt = PROPERTY_ENABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; } break; @@ -1206,30 +1522,40 @@ { lsm6dso_pin_int1_route_t val1; lsm6dso_pin_int2_route_t val2; + lsm6dso_emb_sens_t emb_sens; /* Disable tilt event on both INT1 and INT2 pins */ if (lsm6dso_pin_int1_route_get(&_reg_ctx, &val1) != 0) { return 1; } - val1.emb_func_int1.int1_tilt = PROPERTY_DISABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.tilt = PROPERTY_DISABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.emb_func_int2.int2_tilt = PROPERTY_DISABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.tilt = PROPERTY_DISABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; } - /* Disable tilt calculation. */ - if (lsm6dso_tilt_sens_set(&_reg_ctx, PROPERTY_DISABLE) != 0) { + /* Save current embedded features */ + if (lsm6dso_embedded_sens_get(&_reg_ctx, &emb_sens) != 0) + { + return 1; + } + + /* Disable tilt algorithm. */ + emb_sens.tilt = PROPERTY_DISABLE; + + if (lsm6dso_embedded_sens_set(&_reg_ctx, &emb_sens) != 0) + { return 1; } @@ -1274,21 +1600,21 @@ return 1; } - val1.md1_cfg.int1_wu = PROPERTY_ENABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.wake_up = PROPERTY_ENABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } break; case LSM6DSO_INT2_PIN: - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.md2_cfg.int2_wu = PROPERTY_ENABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.wake_up = PROPERTY_ENABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; } break; @@ -1316,19 +1642,19 @@ return 1; } - val1.md1_cfg.int1_wu = PROPERTY_DISABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.wake_up = PROPERTY_DISABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.md2_cfg.int2_wu = PROPERTY_DISABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.wake_up = PROPERTY_DISABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; } @@ -1437,21 +1763,21 @@ return 1; } - val1.md1_cfg.int1_single_tap = PROPERTY_ENABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.single_tap = PROPERTY_ENABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } break; case LSM6DSO_INT2_PIN: - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.md2_cfg.int2_single_tap = PROPERTY_ENABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.single_tap = PROPERTY_ENABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; } break; @@ -1478,19 +1804,19 @@ return 1; } - val1.md1_cfg.int1_single_tap = PROPERTY_DISABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.single_tap = PROPERTY_DISABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.md2_cfg.int2_single_tap = PROPERTY_DISABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.single_tap = PROPERTY_DISABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; } @@ -1595,21 +1921,21 @@ return 1; } - val1.md1_cfg.int1_double_tap = PROPERTY_ENABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.double_tap = PROPERTY_ENABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } break; case LSM6DSO_INT2_PIN: - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.md2_cfg.int2_double_tap = PROPERTY_ENABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.double_tap = PROPERTY_ENABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; } break; @@ -1636,19 +1962,19 @@ return 1; } - val1.md1_cfg.int1_double_tap = PROPERTY_DISABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.double_tap = PROPERTY_DISABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.md2_cfg.int2_double_tap = PROPERTY_DISABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.double_tap = PROPERTY_DISABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; } @@ -1788,21 +2114,21 @@ return 1; } - val1.md1_cfg.int1_6d = PROPERTY_ENABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.six_d = PROPERTY_ENABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } break; case LSM6DSO_INT2_PIN: - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.md2_cfg.int2_6d = PROPERTY_ENABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.six_d = PROPERTY_ENABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; } break; @@ -1829,19 +2155,19 @@ return 1; } - val1.md1_cfg.int1_6d = PROPERTY_DISABLE; - - if (lsm6dso_pin_int1_route_set(&_reg_ctx, &val1) != 0) { + val1.six_d = PROPERTY_DISABLE; + + if (lsm6dso_pin_int1_route_set(&_reg_ctx, val1) != 0) { return 1; } - if (lsm6dso_pin_int2_route_get(&_reg_ctx, &val2) != 0) { + if (lsm6dso_pin_int2_route_get(&_reg_ctx, NULL, &val2) != 0) { return 1; } - val2.md2_cfg.int2_6d = PROPERTY_DISABLE; - - if (lsm6dso_pin_int2_route_set(&_reg_ctx, &val2) != 0) { + val2.six_d = PROPERTY_DISABLE; + + if (lsm6dso_pin_int2_route_set(&_reg_ctx, NULL, val2) != 0) { return 1; }