1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-16 21:05:35 +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;
if (defaultModeActivationConditions) {
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 *linkedTo = findBoxByBoxId(macDefault->linkedTo);
if (box) {
@ -1028,6 +1028,7 @@ static void cliAux(char *cmdline)
} else if (validArgumentCount != 6) {
memset(mac, 0, sizeof(modeActivationCondition_t));
}
analyzeModeActivationConditions();
cliPrintLinef( "aux %u %u %u %u %u %u %u",
i,
mac->modeId,

View file

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

View file

@ -47,6 +47,11 @@ static boxBitmask_t stickyModesEverDisabled;
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);
bool IS_RC_MODE_ACTIVE(boxId_e boxId)
@ -108,13 +113,8 @@ void updateActivatedModes(void)
bitArraySet(&stickyModes, BOXPARALYZE);
// determine which conditions set/clear the mode
for (int i = 0; i < MAX_MODE_ACTIVATION_CONDITION_COUNT; i++) {
const modeActivationCondition_t *mac = modeActivationConditions(i);
// Skip linked macs for now to fully determine target states
if (mac->linkedTo) {
continue;
}
for (int i = 0; i < activeMacCount; i++) {
const modeActivationCondition_t *mac = modeActivationConditions(activeMacArray[i]);
if (bitArrayGet(&stickyModes, mac->modeId)) {
updateMasksForStickyModes(mac, &andMask, &newMask);
@ -126,12 +126,8 @@ void updateActivatedModes(void)
bitArrayXor(&newMask, sizeof(&newMask), &newMask, &andMask);
// Update linked modes
for (int i = 0; i < MAX_MODE_ACTIVATION_CONDITION_COUNT; i++) {
const modeActivationCondition_t *mac = modeActivationConditions(i);
if (!mac->linkedTo) {
continue;
}
for (int i = 0; i < activeLinkedMacCount; i++) {
const modeActivationCondition_t *mac = modeActivationConditions(activeLinkedMacArray[i]);
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);
bool isModeActivationConditionPresent(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.endStep = CHANNEL_VALUE_TO_STEP(2100);
analyzeModeActivationConditions();
#if defined(BEEBRAIN_V2D)
// DSM version
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.endStep = CHANNEL_VALUE_TO_STEP(1575);
analyzeModeActivationConditions();
failsafeConfigMutable()->failsafe_delay = 2;
failsafeConfigMutable()->failsafe_off_delay = 0;

View file

@ -285,4 +285,6 @@ bool setManufacturerId(char *newManufacturerId) { UNUSED(newManufacturerId); ret
bool persistBoardInformation(void) { return true; };
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
analyzeModeActivationConditions();
updateActivatedModes();
// then
@ -178,6 +179,7 @@ TEST_F(RcControlsModesTest, updateActivatedModesUsingValidAuxConfigurationAndRXV
bitArraySet(&activeBoxIds, 5);
// when
analyzeModeActivationConditions();
updateActivatedModes();
// then

View file

@ -301,6 +301,8 @@ TEST(RCDeviceTest, TestWifiModeChangeWithDeviceUnready)
modeActivationConditionsMutable(2)->range.startStep = CHANNEL_VALUE_TO_STEP(1300);
modeActivationConditionsMutable(2)->range.endStep = CHANNEL_VALUE_TO_STEP(1600);
analyzeModeActivationConditions();
// make the binded mode inactive
rcData[modeActivationConditions(0)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 1800;
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.endStep = CHANNEL_VALUE_TO_STEP(2100);
analyzeModeActivationConditions();
rcData[modeActivationConditions(0)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 1700;
rcData[modeActivationConditions(1)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 2000;
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.endStep = CHANNEL_VALUE_TO_STEP(2100);
analyzeModeActivationConditions();
// // make the binded mode inactive
rcData[modeActivationConditions(0)->auxChannelIndex + NON_AUX_CHANNEL_COUNT] = 1700;
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.endStep = CHANNEL_VALUE_TO_STEP(1600);
analyzeModeActivationConditions();
// when
rxInit();
@ -113,6 +115,8 @@ TEST(RxTest, TestValidFlightChannelsHighArm)
modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(1400);
modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MAX);
analyzeModeActivationConditions();
// when
rxInit();
@ -147,6 +151,8 @@ TEST(RxTest, TestInvalidFlightChannels)
modeActivationConditionsMutable(0)->range.startStep = CHANNEL_VALUE_TO_STEP(1400);
modeActivationConditionsMutable(0)->range.endStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MAX);
analyzeModeActivationConditions();
// and
uint16_t channelPulses[MAX_SUPPORTED_RC_CHANNEL_COUNT];
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.endStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MAX);
analyzeModeActivationConditions();
// and
vtxSettingsConfigMutable()->band = 0;
vtxSettingsConfigMutable()->freq = 5800;