void blackboxLogInflightAdjustmentEventFloat(adjustmentFunction_e adjustmentFunction, float newFloatValue) { #ifndef BLACKBOX UNUSED(adjustmentFunction); UNUSED(newFloatValue); #else if (feature(FEATURE_BLACKBOX)) { flightLogEvent_inflightAdjustment_t eventData; eventData.adjustmentFunction = adjustmentFunction; eventData.newFloatValue = newFloatValue; eventData.floatFlag = true; blackboxLogEvent(FLIGHT_LOG_EVENT_INFLIGHT_ADJUSTMENT, (flightLogEventData_t*)&eventData); } #endif }
static void blackboxLogInflightAdjustmentEvent(adjustmentFunction_e adjustmentFunction, int32_t newValue) { #ifndef USE_BLACKBOX UNUSED(adjustmentFunction); UNUSED(newValue); #else if (blackboxConfig()->device) { flightLogEvent_inflightAdjustment_t eventData; eventData.adjustmentFunction = adjustmentFunction; eventData.newValue = newValue; eventData.floatFlag = false; blackboxLogEvent(FLIGHT_LOG_EVENT_INFLIGHT_ADJUSTMENT, (flightLogEventData_t*)&eventData); } #endif }
void calculate_Gtune(uint8_t axis) { int16_t error, diff_G, threshP; if(rcCommand[axis] || (axis != FD_YAW && (FLIGHT_MODE(ANGLE_MODE) || FLIGHT_MODE(HORIZON_MODE)))) { // Block tuning on stick input. Always allow G-Tune on YAW, Roll & Pitch only in acromode OldError[axis] = 0; time_skip[axis] = delay_cycles; // Some settle time after stick center. default 450ms } else { if (!time_skip[axis]) AvgGyro[axis] = 0; time_skip[axis]++; if (time_skip[axis] > 0) { if (axis == FD_YAW) { AvgGyro[axis] += 32 * ((int16_t)gyroADC[axis] / 32); // Chop some jitter and average } else { AvgGyro[axis] += 128 * ((int16_t)gyroADC[axis] / 128); // Chop some jitter and average } } if (time_skip[axis] == gtuneConfig()->gtune_average_cycles) { // Looptime cycles for gyro average calculation. default 16. AvgGyro[axis] /= time_skip[axis]; // AvgGyro[axis] has now very clean gyrodata time_skip[axis] = 0; if (axis == FD_YAW) { threshP = 20; error = -AvgGyro[axis]; } else { threshP = 10; error = AvgGyro[axis]; } if (gtuneConfig()->gtune_hilimP[axis] && error && OldError[axis] && error != OldError[axis]) { // Don't run when not needed or pointless to do so diff_G = ABS(error) - ABS(OldError[axis]); if ((error > 0 && OldError[axis] > 0) || (error < 0 && OldError[axis] < 0)) { if (diff_G > threshP) { if (axis == FD_YAW) { result_P64[axis] += 256 + gtuneConfig()->gtune_pwr; // YAW ends up at low limit on float PID, give it some more to work with. } else { result_P64[axis] += 64 + gtuneConfig()->gtune_pwr; // Shift balance a little on the plus side. } } else { if (diff_G < -threshP) { if (axis == FD_YAW) { result_P64[axis] -= 64 + gtuneConfig()->gtune_pwr; } else { result_P64[axis] -= 32; } } } } else { if (ABS(diff_G) > threshP && axis != FD_YAW) { result_P64[axis] -= 32; // Don't use antiwobble for YAW } } int16_t newP = constrain((result_P64[axis] >> 6), (int16_t)gtuneConfig()->gtune_lolimP[axis], (int16_t)gtuneConfig()->gtune_hilimP[axis]); #ifdef BLACKBOX if (feature(FEATURE_BLACKBOX)) { flightLogEvent_gtuneCycleResult_t eventData; eventData.gtuneAxis = axis; eventData.gtuneGyroAVG = AvgGyro[axis]; eventData.gtuneNewP = newP; // for float PID the logged P value is still mutiplyed by 10 blackboxLogEvent(FLIGHT_LOG_EVENT_GTUNE_RESULT, (flightLogEventData_t*)&eventData); } #endif pidProfile()->P8[axis] = newP; // new P value } OldError[axis] = error; }