1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-15 12:25:20 +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

@ -338,6 +338,16 @@ static void validateAndFixConfig(void)
}
#endif
for (int i = 0; i < MAX_MODE_ACTIVATION_CONDITION_COUNT; i++) {
const modeActivationCondition_t *mac = modeActivationConditions(i);
if (mac->linkedTo) {
if (mac->modeId == BOXARM || isModeActivationConditionLinked(mac->linkedTo)) {
removeModeActivationCondition(mac->modeId);
}
}
}
// clear features that are not supported.
// I have kept them all here in one place, some could be moved to sections of code above.

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;

View file

@ -129,6 +129,7 @@ bool airmodeIsEnabled(void);
bool isRangeActive(uint8_t auxChannelIndex, const channelRange_t *range);
void updateActivatedModes(void);
bool isModeActivationConditionPresent(boxId_e modeId);
bool isModeActivationConditionLinked(boxId_e modeId);
void removeModeActivationCondition(boxId_e modeId);
bool isModeActivationConditionConfigured(const modeActivationCondition_t *mac, const modeActivationCondition_t *emptyMac);
void analyzeModeActivationConditions(void);