1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-18 22:05:17 +03:00

Merge pull request #7534 from etracer65/optimize_rc_modes_processing

Optimize rc modes activation conditions processing
This commit is contained in:
Michael Keller 2019-02-06 15:38:11 +13:00 committed by GitHub
commit d4f71bba63
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 65 additions and 14 deletions

View file

@ -942,7 +942,7 @@ static void printAux(uint8_t dumpMask, const modeActivationCondition_t *modeActi
bool equalsDefault = false; bool equalsDefault = false;
if (defaultModeActivationConditions) { if (defaultModeActivationConditions) {
const modeActivationCondition_t *macDefault = &defaultModeActivationConditions[i]; const modeActivationCondition_t *macDefault = &defaultModeActivationConditions[i];
equalsDefault = !memcmp(mac, macDefault, sizeof(*mac)); equalsDefault = !isModeActivationConditionConfigured(mac, macDefault);
const box_t *box = findBoxByBoxId(macDefault->modeId); const box_t *box = findBoxByBoxId(macDefault->modeId);
const box_t *linkedTo = findBoxByBoxId(macDefault->linkedTo); const box_t *linkedTo = findBoxByBoxId(macDefault->linkedTo);
if (box) { if (box) {
@ -1028,6 +1028,7 @@ static void cliAux(char *cmdline)
} else if (validArgumentCount != 6) { } else if (validArgumentCount != 6) {
memset(mac, 0, sizeof(modeActivationCondition_t)); memset(mac, 0, sizeof(modeActivationCondition_t));
} }
analyzeModeActivationConditions();
cliPrintLinef( "aux %u %u %u %u %u %u %u", cliPrintLinef( "aux %u %u %u %u %u %u %u",
i, i,
mac->modeId, mac->modeId,

View file

@ -393,5 +393,6 @@ int32_t getRcStickDeflection(int32_t axis, uint16_t midrc) {
void rcControlsInit(void) void rcControlsInit(void)
{ {
analyzeModeActivationConditions();
isUsingSticksToArm = !isModeActivationConditionPresent(BOXARM); isUsingSticksToArm = !isModeActivationConditionPresent(BOXARM);
} }

View file

@ -47,6 +47,11 @@ static boxBitmask_t stickyModesEverDisabled;
static bool airmodeEnabled; static bool airmodeEnabled;
static int activeMacCount = 0;
static uint8_t activeMacArray[MAX_MODE_ACTIVATION_CONDITION_COUNT];
static int activeLinkedMacCount = 0;
static uint8_t activeLinkedMacArray[MAX_MODE_ACTIVATION_CONDITION_COUNT];
PG_REGISTER_ARRAY(modeActivationCondition_t, MAX_MODE_ACTIVATION_CONDITION_COUNT, modeActivationConditions, PG_MODE_ACTIVATION_PROFILE, 2); PG_REGISTER_ARRAY(modeActivationCondition_t, MAX_MODE_ACTIVATION_CONDITION_COUNT, modeActivationConditions, PG_MODE_ACTIVATION_PROFILE, 2);
bool IS_RC_MODE_ACTIVE(boxId_e boxId) bool IS_RC_MODE_ACTIVE(boxId_e boxId)
@ -108,13 +113,8 @@ void updateActivatedModes(void)
bitArraySet(&stickyModes, BOXPARALYZE); bitArraySet(&stickyModes, BOXPARALYZE);
// determine which conditions set/clear the mode // determine which conditions set/clear the mode
for (int i = 0; i < MAX_MODE_ACTIVATION_CONDITION_COUNT; i++) { for (int i = 0; i < activeMacCount; i++) {
const modeActivationCondition_t *mac = modeActivationConditions(i); const modeActivationCondition_t *mac = modeActivationConditions(activeMacArray[i]);
// Skip linked macs for now to fully determine target states
if (mac->linkedTo) {
continue;
}
if (bitArrayGet(&stickyModes, mac->modeId)) { if (bitArrayGet(&stickyModes, mac->modeId)) {
updateMasksForStickyModes(mac, &andMask, &newMask); updateMasksForStickyModes(mac, &andMask, &newMask);
@ -126,12 +126,8 @@ void updateActivatedModes(void)
bitArrayXor(&newMask, sizeof(&newMask), &newMask, &andMask); bitArrayXor(&newMask, sizeof(&newMask), &newMask, &andMask);
// Update linked modes // Update linked modes
for (int i = 0; i < MAX_MODE_ACTIVATION_CONDITION_COUNT; i++) { for (int i = 0; i < activeLinkedMacCount; i++) {
const modeActivationCondition_t *mac = modeActivationConditions(i); const modeActivationCondition_t *mac = modeActivationConditions(activeLinkedMacArray[i]);
if (!mac->linkedTo) {
continue;
}
bitArrayCopy(&newMask, mac->linkedTo, mac->modeId); bitArrayCopy(&newMask, mac->linkedTo, mac->modeId);
} }
@ -177,3 +173,32 @@ void removeModeActivationCondition(const boxId_e modeId)
} }
} }
} }
bool isModeActivationConditionConfigured(const modeActivationCondition_t *mac, const modeActivationCondition_t *emptyMac)
{
if (memcmp(mac, emptyMac, sizeof(*emptyMac))) {
return true;
} else {
return false;
}
}
// Build the list of used modeActivationConditions indices
// We can then use this to speed up processing by only evaluating used conditions
void analyzeModeActivationConditions(void)
{
modeActivationCondition_t emptyMac;
memset(&emptyMac, 0, sizeof(emptyMac));
activeMacCount = 0;
activeLinkedMacCount = 0;
for (uint8_t i = 0; i < MAX_MODE_ACTIVATION_CONDITION_COUNT; i++) {
const modeActivationCondition_t *mac = modeActivationConditions(i);
if (mac->linkedTo) {
activeLinkedMacArray[activeLinkedMacCount++] = i;
} else if (isModeActivationConditionConfigured(mac, &emptyMac)) {
activeMacArray[activeMacCount++] = i;
}
}
}

View file

@ -130,3 +130,5 @@ bool isRangeActive(uint8_t auxChannelIndex, const channelRange_t *range);
void updateActivatedModes(void); void updateActivatedModes(void);
bool isModeActivationConditionPresent(boxId_e modeId); bool isModeActivationConditionPresent(boxId_e modeId);
void removeModeActivationCondition(boxId_e modeId); void removeModeActivationCondition(boxId_e modeId);
bool isModeActivationConditionConfigured(const modeActivationCondition_t *mac, const modeActivationCondition_t *emptyMac);
void analyzeModeActivationConditions(void);

View file

@ -158,6 +158,8 @@ void targetConfiguration(void)
modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(900); modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(900);
modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(2100); modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(2100);
analyzeModeActivationConditions();
#if defined(BEEBRAIN_V2D) #if defined(BEEBRAIN_V2D)
// DSM version // DSM version
for (uint8_t rxRangeIndex = 0; rxRangeIndex < NON_AUX_CHANNEL_COUNT; rxRangeIndex++) { for (uint8_t rxRangeIndex = 0; rxRangeIndex < NON_AUX_CHANNEL_COUNT; rxRangeIndex++) {

View file

@ -74,6 +74,8 @@ void targetConfiguration(void)
modeActivationConditionsMutable(1)->range.startStep = CHANNEL_VALUE_TO_STEP(1425); modeActivationConditionsMutable(1)->range.startStep = CHANNEL_VALUE_TO_STEP(1425);
modeActivationConditionsMutable(1)->range.endStep = CHANNEL_VALUE_TO_STEP(1575); modeActivationConditionsMutable(1)->range.endStep = CHANNEL_VALUE_TO_STEP(1575);
analyzeModeActivationConditions();
failsafeConfigMutable()->failsafe_delay = 2; failsafeConfigMutable()->failsafe_delay = 2;
failsafeConfigMutable()->failsafe_off_delay = 0; failsafeConfigMutable()->failsafe_off_delay = 0;

View file

@ -285,4 +285,6 @@ bool setManufacturerId(char *newManufacturerId) { UNUSED(newManufacturerId); ret
bool persistBoardInformation(void) { return true; }; bool persistBoardInformation(void) { return true; };
void activeAdjustmentRangeReset(void) {} void activeAdjustmentRangeReset(void) {}
void analyzeModeActivationConditions(void) {}
bool isModeActivationConditionConfigured(const modeActivationCondition_t *, const modeActivationCondition_t *) { return false; }
} }

View file

@ -87,6 +87,7 @@ TEST_F(RcControlsModesTest, updateActivatedModesWithAllInputsAtMidde)
} }
// when // when
analyzeModeActivationConditions();
updateActivatedModes(); updateActivatedModes();
// then // then
@ -178,6 +179,7 @@ TEST_F(RcControlsModesTest, updateActivatedModesUsingValidAuxConfigurationAndRXV
bitArraySet(&activeBoxIds, 5); bitArraySet(&activeBoxIds, 5);
// when // when
analyzeModeActivationConditions();
updateActivatedModes(); updateActivatedModes();
// then // then

View file

@ -301,6 +301,8 @@ TEST(RCDeviceTest, TestWifiModeChangeWithDeviceUnready)
modeActivationConditionsMutable(2)->range.startStep = CHANNEL_VALUE_TO_STEP(1300); modeActivationConditionsMutable(2)->range.startStep = CHANNEL_VALUE_TO_STEP(1300);
modeActivationConditionsMutable(2)->range.endStep = CHANNEL_VALUE_TO_STEP(1600); modeActivationConditionsMutable(2)->range.endStep = CHANNEL_VALUE_TO_STEP(1600);
analyzeModeActivationConditions();
// make the binded mode inactive // make the binded mode inactive
rcData[modeActivationConditions(0)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 1800; rcData[modeActivationConditions(0)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 1800;
rcData[modeActivationConditions(1)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 900; rcData[modeActivationConditions(1)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 900;
@ -362,6 +364,8 @@ TEST(RCDeviceTest, TestWifiModeChangeWithDeviceReady)
modeActivationConditionsMutable(2)->range.startStep = CHANNEL_VALUE_TO_STEP(1900); modeActivationConditionsMutable(2)->range.startStep = CHANNEL_VALUE_TO_STEP(1900);
modeActivationConditionsMutable(2)->range.endStep = CHANNEL_VALUE_TO_STEP(2100); modeActivationConditionsMutable(2)->range.endStep = CHANNEL_VALUE_TO_STEP(2100);
analyzeModeActivationConditions();
rcData[modeActivationConditions(0)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 1700; rcData[modeActivationConditions(0)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 1700;
rcData[modeActivationConditions(1)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 2000; rcData[modeActivationConditions(1)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 2000;
rcData[modeActivationConditions(2)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 1700; rcData[modeActivationConditions(2)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 1700;
@ -422,6 +426,8 @@ TEST(RCDeviceTest, TestWifiModeChangeCombine)
modeActivationConditionsMutable(2)->range.startStep = CHANNEL_VALUE_TO_STEP(1900); modeActivationConditionsMutable(2)->range.startStep = CHANNEL_VALUE_TO_STEP(1900);
modeActivationConditionsMutable(2)->range.endStep = CHANNEL_VALUE_TO_STEP(2100); modeActivationConditionsMutable(2)->range.endStep = CHANNEL_VALUE_TO_STEP(2100);
analyzeModeActivationConditions();
// // make the binded mode inactive // // make the binded mode inactive
rcData[modeActivationConditions(0)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 1700; rcData[modeActivationConditions(0)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 1700;
rcData[modeActivationConditions(1)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 2000; rcData[modeActivationConditions(1)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 2000;

View file

@ -78,6 +78,8 @@ TEST(RxTest, TestValidFlightChannels)
modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MIN); modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MIN);
modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(1600); modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(1600);
analyzeModeActivationConditions();
// when // when
rxInit(); rxInit();
@ -113,6 +115,8 @@ TEST(RxTest, TestValidFlightChannelsHighArm)
modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(1400); modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(1400);
modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MAX); modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MAX);
analyzeModeActivationConditions();
// when // when
rxInit(); rxInit();
@ -147,6 +151,8 @@ TEST(RxTest, TestInvalidFlightChannels)
modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(1400); modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(1400);
modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MAX); modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MAX);
analyzeModeActivationConditions();
// and // and
uint16_t channelPulses[MAX_SUPPORTED_RC_CHANNEL_COUNT]; uint16_t channelPulses[MAX_SUPPORTED_RC_CHANNEL_COUNT];
memset(&channelPulses, 1500, sizeof(channelPulses)); memset(&channelPulses, 1500, sizeof(channelPulses));

View file

@ -89,6 +89,8 @@ TEST(VtxTest, PitMode)
modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(1750); modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(1750);
modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MAX); modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MAX);
analyzeModeActivationConditions();
// and // and
vtxSettingsConfigMutable()->band = 0; vtxSettingsConfigMutable()->band = 0;
vtxSettingsConfigMutable()->freq = 5800; vtxSettingsConfigMutable()->freq = 5800;