diff --git a/src/main/blackbox/blackbox.c b/src/main/blackbox/blackbox.c index 2365c3913..028f54c90 100644 --- a/src/main/blackbox/blackbox.c +++ b/src/main/blackbox/blackbox.c @@ -267,6 +267,8 @@ static struct { } u; } xmitState; +static uint32_t blackboxConditionCache; + static uint32_t blackboxIteration; static uint32_t blackboxPFrameIndex, blackboxIFrameIndex; @@ -582,7 +584,7 @@ static void writeTag8_8SVB(int32_t *values, int valueCount) } } -static bool testBlackboxCondition(FlightLogFieldCondition condition) +static bool testBlackboxConditionUncached(FlightLogFieldCondition condition) { switch (condition) { case FLIGHT_LOG_FIELD_CONDITION_ALWAYS: @@ -597,19 +599,10 @@ static bool testBlackboxCondition(FlightLogFieldCondition condition) case FLIGHT_LOG_FIELD_CONDITION_AT_LEAST_MOTORS_7: case FLIGHT_LOG_FIELD_CONDITION_AT_LEAST_MOTORS_8: return motorCount >= condition - FLIGHT_LOG_FIELD_CONDITION_AT_LEAST_MOTORS_1 + 1; + case FLIGHT_LOG_FIELD_CONDITION_TRICOPTER: return masterConfig.mixerMode == MIXER_TRI; - case FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_P_0: - case FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_P_1: - case FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_P_2: - return currentProfile->pidProfile.P8[condition - FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_P_0] != 0; - - case FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_I_0: - case FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_I_1: - case FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_I_2: - return currentProfile->pidProfile.I8[condition - FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_I_0] != 0; - case FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_0: case FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_1: case FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_2: @@ -639,6 +632,23 @@ static bool testBlackboxCondition(FlightLogFieldCondition condition) } } +static void blackboxBuildConditionCache() +{ + FlightLogFieldCondition cond; + + blackboxConditionCache = 0; + + for (cond = FLIGHT_LOG_FIELD_CONDITION_FIRST; cond <= FLIGHT_LOG_FIELD_CONDITION_LAST; cond++) { + if (testBlackboxConditionUncached(cond)) + blackboxConditionCache |= 1 << cond; + } +} + +static bool testBlackboxCondition(FlightLogFieldCondition condition) +{ + return (blackboxConditionCache & (1 << condition)) != 0; +} + static void blackboxSetState(BlackboxState newState) { //Perform initial setup required for the new state @@ -908,6 +918,13 @@ void startBlackbox(void) //No need to clear the content of blackboxHistoryRing since our first frame will be an intra which overwrites it + /* + * We use conditional tests to decide whether or not certain fields should be logged. Since our headers + * must always agree with the logged data, the results of these tests must not change during logging. So + * cache those now. + */ + blackboxBuildConditionCache(); + blackboxSetState(BLACKBOX_STATE_SEND_HEADER); } } diff --git a/src/main/blackbox/blackbox_fielddefs.h b/src/main/blackbox/blackbox_fielddefs.h index 87db8ecbb..176356109 100644 --- a/src/main/blackbox/blackbox_fielddefs.h +++ b/src/main/blackbox/blackbox_fielddefs.h @@ -29,21 +29,18 @@ typedef enum FlightLogFieldCondition { FLIGHT_LOG_FIELD_CONDITION_AT_LEAST_MOTORS_8, FLIGHT_LOG_FIELD_CONDITION_TRICOPTER, - FLIGHT_LOG_FIELD_CONDITION_MAG = 20, + FLIGHT_LOG_FIELD_CONDITION_MAG, FLIGHT_LOG_FIELD_CONDITION_BARO, FLIGHT_LOG_FIELD_CONDITION_VBAT, - FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_P_0 = 40, - FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_P_1, - FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_P_2, - FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_I_0, - FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_I_1, - FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_I_2, FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_0, FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_1, FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_2, - FLIGHT_LOG_FIELD_CONDITION_NEVER = 255, + FLIGHT_LOG_FIELD_CONDITION_NEVER, + + FLIGHT_LOG_FIELD_CONDITION_FIRST = FLIGHT_LOG_FIELD_CONDITION_ALWAYS, + FLIGHT_LOG_FIELD_CONDITION_LAST = FLIGHT_LOG_FIELD_CONDITION_NEVER } FlightLogFieldCondition; typedef enum FlightLogFieldPredictor {