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; }
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 updateActivatedModes(void) { // Disable all modes to begin with boxBitmask_t newMask; memset(&newMask, 0, sizeof(newMask)); // Unfortunately for AND logic it's not enough to simply check if any of the specified channel range conditions are valid for a mode. // We need to count the total number of conditions specified for each mode, and check that all those conditions are currently valid. uint8_t activeConditionCountPerMode[CHECKBOX_ITEM_COUNT]; memset(activeConditionCountPerMode, 0, CHECKBOX_ITEM_COUNT); for (int index = 0; index < MAX_MODE_ACTIVATION_CONDITION_COUNT; index++) { if (isRangeActive(modeActivationConditions(index)->auxChannelIndex, &modeActivationConditions(index)->range)) { // Increment the number of valid conditions for this mode activeConditionCountPerMode[modeActivationConditions(index)->modeId]++; } } // Now see which modes should be enabled for (int modeIndex = 0; modeIndex < CHECKBOX_ITEM_COUNT; modeIndex++) { // only modes with conditions specified are considered if (specifiedConditionCountPerMode[modeIndex] > 0) { // For AND logic, the specified condition count and valid condition count must be the same. // For OR logic, the valid condition count must be greater than zero. if (modeActivationOperatorConfig()->modeActivationOperator == MODE_OPERATOR_AND) { // AND the conditions if (activeConditionCountPerMode[modeIndex] == specifiedConditionCountPerMode[modeIndex]) { bitArraySet(newMask.bits, modeIndex); } } else { // OR the conditions if (activeConditionCountPerMode[modeIndex] > 0) { bitArraySet(newMask.bits, modeIndex); } } } } rcModeUpdate(&newMask); }