diff --git a/src/sensors_gyro.c b/src/sensors_gyro.c index f2c79b322..720b6758e 100644 --- a/src/sensors_gyro.c +++ b/src/sensors_gyro.c @@ -24,44 +24,63 @@ void gyroSetCalibrationCycles(uint16_t calibrationCyclesRequired) calibratingG = calibrationCyclesRequired; } -static void gyroCommon(uint8_t gyroMovementCalibrationThreshold) +bool isGyroCalibrationComplete(void) { - int axis; + return calibratingG == 0; +} + +bool isOnFinalGyroCalibrationCycle(void) +{ + return calibratingG == 1; +} + +bool isOnFirstGyroCalibrationCycle(void) +{ + return calibratingG == CALIBRATING_GYRO_CYCLES; +} + +static void performAcclerationCalibration(uint8_t gyroMovementCalibrationThreshold) +{ + int8_t axis; static int32_t g[3]; static stdev_t var[3]; - if (calibratingG > 0) { - for (axis = 0; axis < 3; axis++) { - // Reset g[axis] at start of calibration - if (calibratingG == CALIBRATING_GYRO_CYCLES) { - g[axis] = 0; - devClear(&var[axis]); - } - // Sum up 1000 readings - g[axis] += gyroADC[axis]; - devPush(&var[axis], gyroADC[axis]); - // Clear global variables for next reading - gyroADC[axis] = 0; - gyroZero[axis] = 0; - if (calibratingG == 1) { - float dev = devStandardDeviation(&var[axis]); - // check deviation and startover if idiot was moving the model - if (gyroMovementCalibrationThreshold && dev > gyroMovementCalibrationThreshold) { - calibratingG = CALIBRATING_GYRO_CYCLES; - devClear(&var[0]); - devClear(&var[1]); - devClear(&var[2]); - g[0] = g[1] = g[2] = 0; - continue; - } - gyroZero[axis] = (g[axis] + (CALIBRATING_GYRO_CYCLES / 2)) / CALIBRATING_GYRO_CYCLES; - blinkLedAndSoundBeeper(10, 15, 1); - } + for (axis = 0; axis < 3; axis++) { + + // Reset g[axis] at start of calibration + if (isOnFirstGyroCalibrationCycle()) { + g[axis] = 0; + devClear(&var[axis]); + } + + // Sum up CALIBRATING_GYRO_CYCLES readings + g[axis] += gyroADC[axis]; + devPush(&var[axis], gyroADC[axis]); + + // Reset global variables to prevent other code from using un-calibrated data + gyroADC[axis] = 0; + gyroZero[axis] = 0; + + if (isOnFinalGyroCalibrationCycle()) { + float dev = devStandardDeviation(&var[axis]); + // check deviation and startover if idiot was moving the model + if (gyroMovementCalibrationThreshold && dev > gyroMovementCalibrationThreshold) { + gyroSetCalibrationCycles(CALIBRATING_GYRO_CYCLES); + return; + } + gyroZero[axis] = (g[axis] + (CALIBRATING_GYRO_CYCLES / 2)) / CALIBRATING_GYRO_CYCLES; + blinkLedAndSoundBeeper(10, 15, 1); } - calibratingG--; } - for (axis = 0; axis < 3; axis++) + calibratingG--; +} + +static void applyGyroZero(void) +{ + int8_t axis; + for (axis = 0; axis < 3; axis++) { gyroADC[axis] -= gyroZero[axis]; + } } void gyroGetADC(uint8_t gyroMovementCalibrationThreshold) @@ -69,5 +88,10 @@ void gyroGetADC(uint8_t gyroMovementCalibrationThreshold) // range: +/- 8192; +/- 2000 deg/sec gyro.read(gyroADC); alignSensors(gyroADC, gyroADC, gyroAlign); - gyroCommon(gyroMovementCalibrationThreshold); + + if (!isGyroCalibrationComplete()) { + performAcclerationCalibration(gyroMovementCalibrationThreshold); + } + + applyGyroZero(); }