Don't break the blackbox stream when PIDs change in-flight
This commit is contained in:
parent
f7a9a628b6
commit
b893e457f1
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue