@@ -28,6 +28,8 @@ static pbdrv_imu_config_t *imu_config;
2828// Asynchronously loaded on boot. Cannot be used until loaded.
2929static pbio_imu_persistent_settings_t * persistent_settings = NULL ;
3030
31+ const float standard_gravity = 9806.65f ; // mm/s^2
32+
3133/**
3234 * Applies (newly set) settings to the driver.
3335 */
@@ -52,10 +54,16 @@ static void pbio_imu_apply_pbdrv_settings(pbio_imu_persistent_settings_t *settin
5254 * @param [in] settings The loaded settings to apply.
5355 */
5456void pbio_imu_set_default_settings (pbio_imu_persistent_settings_t * settings ) {
57+ settings -> flags = 0 ;
5558 settings -> gyro_stationary_threshold = 3.0f ;
5659 settings -> accel_stationary_threshold = 2500.0f ;
5760 settings -> heading_correction = 360.0f ;
58- settings -> flags = 0 ;
61+ settings -> gravity_x_pos = standard_gravity ;
62+ settings -> gravity_x_neg = - standard_gravity ;
63+ settings -> gravity_y_pos = standard_gravity ;
64+ settings -> gravity_y_neg = - standard_gravity ;
65+ settings -> gravity_z_pos = standard_gravity ;
66+ settings -> gravity_z_neg = - standard_gravity ;
5967 pbio_imu_apply_pbdrv_settings (settings );
6068}
6169
@@ -188,6 +196,18 @@ bool pbio_imu_is_stationary(void) {
188196 return pbdrv_imu_is_stationary (imu_dev ) && pbio_dcmotor_all_coasting ();
189197}
190198
199+ /**
200+ * Tests if the acceleration value is within a reasonable range for a stationary hub.
201+ *
202+ * @param [in] value The acceleration value to test.
203+ * @return True if the value is within 10% off from standard gravity.
204+ */
205+ static bool pbio_imu_stationary_acceleration_out_of_range (float value , bool expect_positive ) {
206+ const float expected_value = expect_positive ? standard_gravity : - standard_gravity ;
207+ const float absolute_error = value > expected_value ? value - expected_value : expected_value - value ;
208+ return absolute_error > standard_gravity / 15 ;
209+ }
210+
191211/**
192212 * Sets the IMU settings. This includes the thresholds that define when the hub
193213 * is stationary. When the measurements are steadily below these levels, the
@@ -209,17 +229,38 @@ pbio_error_t pbio_imu_set_settings(pbio_imu_persistent_settings_t *new_settings)
209229
210230 if (new_settings -> flags & PBIO_IMU_SETTINGS_FLAGS_ACCEL_STATIONARY_THRESHOLD_SET ) {
211231 persistent_settings -> accel_stationary_threshold = new_settings -> accel_stationary_threshold ;
232+ persistent_settings -> flags |= PBIO_IMU_SETTINGS_FLAGS_ACCEL_STATIONARY_THRESHOLD_SET ;
212233 }
213234
214235 if (new_settings -> flags & PBIO_IMU_SETTINGS_FLAGS_GYRO_STATIONARY_THRESHOLD_SET ) {
215236 persistent_settings -> gyro_stationary_threshold = new_settings -> gyro_stationary_threshold ;
237+ persistent_settings -> flags |= PBIO_IMU_SETTINGS_FLAGS_GYRO_STATIONARY_THRESHOLD_SET ;
216238 }
217239
218240 if (new_settings -> flags & PBIO_IMU_SETTINGS_FLAGS_GYRO_HEADING_CORRECTION_SET ) {
219241 if (new_settings -> heading_correction < 350 || new_settings -> heading_correction > 370 ) {
220242 return PBIO_ERROR_INVALID_ARG ;
221243 }
222244 persistent_settings -> heading_correction = new_settings -> heading_correction ;
245+ persistent_settings -> flags |= PBIO_IMU_SETTINGS_FLAGS_GYRO_HEADING_CORRECTION_SET ;
246+ }
247+
248+ if (new_settings -> flags & PBIO_IMU_SETTINGS_FLAGS_ACCEL_CALIBRATED ) {
249+ if (pbio_imu_stationary_acceleration_out_of_range (new_settings -> gravity_x_pos , true) ||
250+ pbio_imu_stationary_acceleration_out_of_range (new_settings -> gravity_x_neg , false) ||
251+ pbio_imu_stationary_acceleration_out_of_range (new_settings -> gravity_y_pos , true) ||
252+ pbio_imu_stationary_acceleration_out_of_range (new_settings -> gravity_y_neg , false) ||
253+ pbio_imu_stationary_acceleration_out_of_range (new_settings -> gravity_z_pos , true) ||
254+ pbio_imu_stationary_acceleration_out_of_range (new_settings -> gravity_z_neg , false)) {
255+ return PBIO_ERROR_INVALID_ARG ;
256+ }
257+ persistent_settings -> flags |= PBIO_IMU_SETTINGS_FLAGS_ACCEL_CALIBRATED ;
258+ persistent_settings -> gravity_x_pos = new_settings -> gravity_x_pos ;
259+ persistent_settings -> gravity_x_neg = new_settings -> gravity_x_neg ;
260+ persistent_settings -> gravity_y_pos = new_settings -> gravity_y_pos ;
261+ persistent_settings -> gravity_y_neg = new_settings -> gravity_y_neg ;
262+ persistent_settings -> gravity_z_pos = new_settings -> gravity_z_pos ;
263+ persistent_settings -> gravity_z_neg = new_settings -> gravity_z_neg ;
223264 }
224265
225266 // If any settings were changed, request saving.
0 commit comments