1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-15 04:15:44 +03:00

Updated linked mode processing

Allows links and ranges in a single mode.
Code styling changes.
Add config validation for chained links (not allowed).
This commit is contained in:
Dave Huber 2019-02-21 14:45:11 -06:00
parent 3114d2e562
commit 6a67972c6c
3 changed files with 43 additions and 5 deletions

View file

@ -82,10 +82,12 @@ void updateMasksForMac(const modeActivationCondition_t *mac, boxBitmask_t *andMa
{
bool bAnd = (mac->modeLogic == MODELOGIC_AND) || bitArrayGet(andMask, mac->modeId);
bool bAct = isRangeActive(mac->auxChannelIndex, &mac->range);
if (bAnd)
if (bAnd) {
bitArraySet(andMask, mac->modeId);
if (bAnd != bAct)
}
if (bAnd != bAct) {
bitArraySet(newMask, mac->modeId);
}
}
void updateMasksForStickyModes(const modeActivationCondition_t *mac, boxBitmask_t *andMask, boxBitmask_t *newMask)
@ -104,6 +106,18 @@ void updateMasksForStickyModes(const modeActivationCondition_t *mac, boxBitmask_
}
}
void updateMasksForLinkedMac(const modeActivationCondition_t *mac, boxBitmask_t *andMask, boxBitmask_t *newMask)
{
bool bAnd = (mac->modeLogic == MODELOGIC_AND) || bitArrayGet(andMask, mac->modeId);
bool bAct = bitArrayGet(andMask, mac->linkedTo) != bitArrayGet(newMask, mac->linkedTo);
if (bAnd) {
bitArraySet(andMask, mac->modeId);
}
if (bAnd != bAct) {
bitArraySet(newMask, mac->modeId);
}
}
void updateActivatedModes(void)
{
boxBitmask_t newMask, andMask, stickyModes;
@ -123,15 +137,15 @@ void updateActivatedModes(void)
}
}
bitArrayXor(&newMask, sizeof(&newMask), &newMask, &andMask);
// Update linked modes
for (int i = 0; i < activeLinkedMacCount; i++) {
const modeActivationCondition_t *mac = modeActivationConditions(activeLinkedMacArray[i]);
bitArrayCopy(&newMask, mac->linkedTo, mac->modeId);
updateMasksForLinkedMac(mac, &andMask, &newMask);
}
bitArrayXor(&newMask, sizeof(&newMask), &newMask, &andMask);
rcModeUpdate(&newMask);
airmodeEnabled = featureIsEnabled(FEATURE_AIRMODE) || IS_RC_MODE_ACTIVE(BOXAIRMODE);
@ -150,6 +164,19 @@ bool isModeActivationConditionPresent(boxId_e modeId)
return false;
}
bool isModeActivationConditionLinked(boxId_e modeId)
{
for (int i = 0; i < MAX_MODE_ACTIVATION_CONDITION_COUNT; i++) {
const modeActivationCondition_t *mac = modeActivationConditions(i);
if (mac->modeId == modeId && mac->linkedTo != 0) {
return true;
}
}
return false;
}
void removeModeActivationCondition(const boxId_e modeId)
{
unsigned offset = 0;