bool isRangeActive(uint8_t auxChannelIndex, const channelRange_t *range) { if (!IS_RANGE_USABLE(range)) { return false; } uint16_t channelValue = constrain(rcData[auxChannelIndex + NON_AUX_CHANNEL_COUNT], CHANNEL_RANGE_MIN, CHANNEL_RANGE_MAX - 1); return (channelValue >= 900 + (range->startStep * 25) && channelValue < 900 + (range->endStep * 25)); }
bool isModeActivationConditionPresent(boxId_e modeId) { for (int index = 0; index < MAX_MODE_ACTIVATION_CONDITION_COUNT; index++) { if (modeActivationConditions(index)->modeId == modeId && IS_RANGE_USABLE(&modeActivationConditions(index)->range)) { return true; } } return false; }
bool rcModeIsActivationConditionPresent(modeActivationCondition_t *modeActivationConditions, boxId_e modeId) { uint8_t index; for (index = 0; index < MAX_MODE_ACTIVATION_CONDITION_COUNT; index++) { modeActivationCondition_t *modeActivationCondition = &modeActivationConditions[index]; if (modeActivationCondition->modeId == modeId && IS_RANGE_USABLE(&modeActivationCondition->range)) { return true; } } return false; }
void rxInit(rxConfig_t *rxConfig, modeActivationCondition_t *modeActivationConditions) { uint8_t i; uint16_t value; useRxConfig(rxConfig); rcSampleIndex = 0; for (i = 0; i < MAX_SUPPORTED_RC_CHANNEL_COUNT; i++) { rcData[i] = rxConfig->midrc; rcInvalidPulsPeriod[i] = millis() + MAX_INVALID_PULS_TIME; } rcData[THROTTLE] = (feature(FEATURE_3D)) ? rxConfig->midrc : rxConfig->rx_min_usec; // Initialize ARM switch to OFF position when arming via switch is defined for (i = 0; i < MAX_MODE_ACTIVATION_CONDITION_COUNT; i++) { modeActivationCondition_t *modeActivationCondition = &modeActivationConditions[i]; if (modeActivationCondition->modeId == BOXARM && IS_RANGE_USABLE(&modeActivationCondition->range)) { // ARM switch is defined, determine an OFF value if (modeActivationCondition->range.startStep > 0) { value = MODE_STEP_TO_CHANNEL_VALUE((modeActivationCondition->range.startStep - 1)); } else { value = MODE_STEP_TO_CHANNEL_VALUE((modeActivationCondition->range.endStep + 1)); } // Initialize ARM AUX channel to OFF value rcData[modeActivationCondition->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = value; } } #ifdef SERIAL_RX if (feature(FEATURE_RX_SERIAL)) { serialRxInit(rxConfig); } #endif if (feature(FEATURE_RX_MSP)) { rxMspInit(rxConfig, &rxRuntimeConfig, &rcReadRawFunc); } if (feature(FEATURE_RX_PPM) || feature(FEATURE_RX_PARALLEL_PWM)) { rxRefreshRate = 20000; rxPwmInit(&rxRuntimeConfig, &rcReadRawFunc); } rxRuntimeConfig.auxChannelCount = rxRuntimeConfig.channelCount - STICK_CHANNEL_COUNT; }
void updateUsedModeActivationConditionFlags(void) { memset(specifiedConditionCountPerMode, 0, CHECKBOX_ITEM_COUNT); for (int index = 0; index < MAX_MODE_ACTIVATION_CONDITION_COUNT; index++) { if (IS_RANGE_USABLE(&modeActivationConditions(index)->range)) { specifiedConditionCountPerMode[modeActivationConditions(index)->modeId]++; } } isUsingSticksToArm = !isModeActivationConditionPresent(BOXARM); #ifdef NAV isUsingNAVModes = isModeActivationConditionPresent(BOXNAVPOSHOLD) || isModeActivationConditionPresent(BOXNAVRTH) || isModeActivationConditionPresent(BOXNAVWP); #endif }
void useRcControlsConfig(modeActivationCondition_t *modeActivationConditions, escAndServoConfig_t *escAndServoConfigToUse, pidProfile_t *pidProfileToUse) { uint8_t index; escAndServoConfig = escAndServoConfigToUse; pidProfile = pidProfileToUse; isUsingSticksToArm = true; for (index = 0; index < MAX_MODE_ACTIVATION_CONDITION_COUNT; index++) { modeActivationCondition_t *modeActivationCondition = &modeActivationConditions[index]; if (modeActivationCondition->modeId == BOXARM && IS_RANGE_USABLE(&modeActivationCondition->range)) { isUsingSticksToArm = false; break; } } }