void processRcAdjustments(controlRateConfig_t *controlRateConfig, rxConfig_t *rxConfig) { uint8_t adjustmentIndex; uint32_t now = millis(); bool canUseRxData = rxIsReceivingSignal(); for (adjustmentIndex = 0; adjustmentIndex < MAX_SIMULTANEOUS_ADJUSTMENT_COUNT; adjustmentIndex++) { adjustmentState_t *adjustmentState = &adjustmentStates[adjustmentIndex]; if (!adjustmentState->config) { continue; } uint8_t adjustmentFunction = adjustmentState->config->adjustmentFunction; if (adjustmentFunction == ADJUSTMENT_NONE) { continue; } int32_t signedDiff = now - adjustmentState->timeoutAt; bool canResetReadyStates = signedDiff >= 0L; if (canResetReadyStates) { adjustmentState->timeoutAt = now + RESET_FREQUENCY_2HZ; MARK_ADJUSTMENT_FUNCTION_AS_READY(adjustmentIndex); } if (!canUseRxData) { continue; } uint8_t channelIndex = NON_AUX_CHANNEL_COUNT + adjustmentState->auxChannelIndex; if (adjustmentState->config->mode == ADJUSTMENT_MODE_STEP) { int delta; if (rcData[channelIndex] > rxConfig->midrc + 200) { delta = adjustmentState->config->data.stepConfig.step; } else if (rcData[channelIndex] < rxConfig->midrc - 200) { delta = 0 - adjustmentState->config->data.stepConfig.step; } else { // returning the switch to the middle immediately resets the ready state MARK_ADJUSTMENT_FUNCTION_AS_READY(adjustmentIndex); adjustmentState->timeoutAt = now + RESET_FREQUENCY_2HZ; continue; } if (IS_ADJUSTMENT_FUNCTION_BUSY(adjustmentIndex)) { continue; } applyStepAdjustment(controlRateConfig, adjustmentFunction, delta); } else if (adjustmentState->config->mode == ADJUSTMENT_MODE_SELECT) { uint16_t rangeWidth = ((2100 - 900) / adjustmentState->config->data.selectConfig.switchPositions); uint8_t position = (constrain(rcData[channelIndex], 900, 2100 - 1) - 900) / rangeWidth; applySelectAdjustment(adjustmentFunction, position); } MARK_ADJUSTMENT_FUNCTION_AS_BUSY(adjustmentIndex); } }
void processRcAdjustments(controlRateConfig_t *controlRateConfig, bool canUseRxData) { const uint32_t now = millis(); for (int adjustmentIndex = 0; adjustmentIndex < MAX_SIMULTANEOUS_ADJUSTMENT_COUNT; adjustmentIndex++) { adjustmentState_t * const adjustmentState = &adjustmentStates[adjustmentIndex]; if (!adjustmentState->config) { continue; } const uint8_t adjustmentFunction = adjustmentState->config->adjustmentFunction; if (adjustmentFunction == ADJUSTMENT_NONE) { continue; } const int32_t signedDiff = now - adjustmentState->timeoutAt; const bool canResetReadyStates = signedDiff >= 0L; if (canResetReadyStates) { adjustmentState->timeoutAt = now + RESET_FREQUENCY_2HZ; MARK_ADJUSTMENT_FUNCTION_AS_READY(adjustmentIndex); } if (!canUseRxData) { continue; } const uint8_t channelIndex = NON_AUX_CHANNEL_COUNT + adjustmentState->auxChannelIndex; if (adjustmentState->config->mode == ADJUSTMENT_MODE_STEP) { int delta; if (rcData[channelIndex] > PWM_RANGE_MIDDLE + 200) { delta = adjustmentState->config->data.stepConfig.step; } else if (rcData[channelIndex] < PWM_RANGE_MIDDLE - 200) { delta = 0 - adjustmentState->config->data.stepConfig.step; } else { // returning the switch to the middle immediately resets the ready state MARK_ADJUSTMENT_FUNCTION_AS_READY(adjustmentIndex); adjustmentState->timeoutAt = now + RESET_FREQUENCY_2HZ; continue; } if (IS_ADJUSTMENT_FUNCTION_BUSY(adjustmentIndex)) { continue; } // it is legitimate to adjust an otherwise const item here applyStepAdjustment(controlRateConfig, adjustmentFunction, delta); #ifdef USE_INFLIGHT_PROFILE_ADJUSTMENT } else if (adjustmentState->config->mode == ADJUSTMENT_MODE_SELECT) { const uint16_t rangeWidth = ((2100 - 900) / adjustmentState->config->data.selectConfig.switchPositions); const uint8_t position = (constrain(rcData[channelIndex], 900, 2100 - 1) - 900) / rangeWidth; applySelectAdjustment(adjustmentFunction, position); #endif } MARK_ADJUSTMENT_FUNCTION_AS_BUSY(adjustmentIndex); } }
void processRcAdjustments(controlRateConfig_t *controlRateConfig) { const uint32_t now = millis(); int newValue = -1; const bool canUseRxData = rxIsReceivingSignal(); for (int adjustmentIndex = 0; adjustmentIndex < MAX_SIMULTANEOUS_ADJUSTMENT_COUNT; adjustmentIndex++) { adjustmentState_t *adjustmentState = &adjustmentStates[adjustmentIndex]; if (!adjustmentState->config) { continue; } const uint8_t adjustmentFunction = adjustmentState->config->adjustmentFunction; if (adjustmentFunction == ADJUSTMENT_NONE) { continue; } if (cmp32(now, adjustmentState->timeoutAt) >= 0) { adjustmentState->timeoutAt = now + RESET_FREQUENCY_2HZ; MARK_ADJUSTMENT_FUNCTION_AS_READY(adjustmentIndex); #if defined(USE_OSD) && defined(USE_OSD_ADJUSTMENTS) adjustmentRangeValue = -1; #endif } if (!canUseRxData) { continue; } const uint8_t channelIndex = NON_AUX_CHANNEL_COUNT + adjustmentState->auxChannelIndex; if (adjustmentState->config->mode == ADJUSTMENT_MODE_STEP) { int delta; if (rcData[channelIndex] > rxConfig()->midrc + 200) { delta = adjustmentState->config->data.step; } else if (rcData[channelIndex] < rxConfig()->midrc - 200) { delta = -adjustmentState->config->data.step; } else { // returning the switch to the middle immediately resets the ready state MARK_ADJUSTMENT_FUNCTION_AS_READY(adjustmentIndex); adjustmentState->timeoutAt = now + RESET_FREQUENCY_2HZ; continue; } if (IS_ADJUSTMENT_FUNCTION_BUSY(adjustmentIndex)) { continue; } newValue = applyStepAdjustment(controlRateConfig, adjustmentFunction, delta); pidInitConfig(pidProfile); } else if (adjustmentState->config->mode == ADJUSTMENT_MODE_SELECT) { const uint16_t rangeWidth = ((2100 - 900) / adjustmentState->config->data.switchPositions); const uint8_t position = (constrain(rcData[channelIndex], 900, 2100 - 1) - 900) / rangeWidth; newValue = applySelectAdjustment(adjustmentFunction, position); } #if defined(USE_OSD) && defined(USE_OSD_ADJUSTMENTS) if (newValue != -1 && adjustmentState->config->adjustmentFunction != ADJUSTMENT_RATE_PROFILE) { // Rate profile already has an OSD element adjustmentRangeName = &adjustmentLabels[adjustmentFunction - 1][0]; adjustmentRangeValue = newValue; } #else UNUSED(newValue); #endif MARK_ADJUSTMENT_FUNCTION_AS_BUSY(adjustmentIndex); } }