Changed mask var from 16 to 32 bits
Changed variables names
Inverse logic
Added definitions to cli settings
Added logging_fields_mask to blackbox header
This commit is contained in:
fgiudice98 2020-04-21 17:42:24 +02:00
parent 6d9e4a813a
commit d21b1fa77a
5 changed files with 67 additions and 59 deletions

View File

@ -88,15 +88,17 @@
#define DEFAULT_BLACKBOX_DEVICE BLACKBOX_DEVICE_SERIAL
#endif
PG_REGISTER_WITH_RESET_TEMPLATE(blackboxConfig_t, blackboxConfig, PG_BLACKBOX_CONFIG, 1);
PG_REGISTER_WITH_RESET_TEMPLATE(blackboxConfig_t, blackboxConfig, PG_BLACKBOX_CONFIG, 2);
PG_RESET_TEMPLATE(blackboxConfig_t, blackboxConfig,
.sample_rate = BLACKBOX_RATE_QUARTER,
.device = DEFAULT_BLACKBOX_DEVICE,
.fields = 0xffff,
.fields_mask = 0, // default log all fields
.mode = BLACKBOX_MODE_NORMAL
);
STATIC_ASSERT((sizeof(blackboxConfig()->fields_mask) * 8) >= FLIGHT_LOG_FIELD_SELECT_COUNT, too_many_flight_log_fields_selections);
#define BLACKBOX_SHUTDOWN_TIMEOUT_MILLIS 200
// Some macros to make writing FLIGHT_LOG_FIELD_* constants shorter:
@ -104,6 +106,7 @@ PG_RESET_TEMPLATE(blackboxConfig_t, blackboxConfig,
#define PREDICT(x) CONCAT(FLIGHT_LOG_FIELD_PREDICTOR_, x)
#define ENCODING(x) CONCAT(FLIGHT_LOG_FIELD_ENCODING_, x)
#define CONDITION(x) CONCAT(FLIGHT_LOG_FIELD_CONDITION_, x)
#define FIELD_SELECT(x) CONCAT(FLIGHT_LOG_FIELD_SELECT_, x)
#define UNSIGNED FLIGHT_LOG_FIELD_UNSIGNED
#define SIGNED FLIGHT_LOG_FIELD_SIGNED
@ -407,9 +410,9 @@ static bool blackboxIsOnlyLoggingIntraframes(void)
return blackboxPInterval == 0;
}
static bool isFieldSelected(SelectField field)
static bool isFieldEnabled(FlightLogFieldSelect_e field)
{
return (blackboxConfig()->fields & (1 << field)) != 0;
return (blackboxConfig()->fields_mask & (1 << field)) == 0;
}
static bool testBlackboxConditionUncached(FlightLogFieldCondition condition)
@ -426,66 +429,66 @@ static bool testBlackboxConditionUncached(FlightLogFieldCondition condition)
case CONDITION(AT_LEAST_MOTORS_6):
case CONDITION(AT_LEAST_MOTORS_7):
case CONDITION(AT_LEAST_MOTORS_8):
return (getMotorCount() >= condition - FLIGHT_LOG_FIELD_CONDITION_AT_LEAST_MOTORS_1 + 1) && isFieldSelected(SELECT_FIELD_MOTOR);
return (getMotorCount() >= condition - FLIGHT_LOG_FIELD_CONDITION_AT_LEAST_MOTORS_1 + 1) && isFieldEnabled(FIELD_SELECT(MOTOR));
case CONDITION(TRICOPTER):
return (mixerConfig()->mixerMode == MIXER_TRI || mixerConfig()->mixerMode == MIXER_CUSTOM_TRI) && isFieldSelected(SELECT_FIELD_MOTOR);
return (mixerConfig()->mixerMode == MIXER_TRI || mixerConfig()->mixerMode == MIXER_CUSTOM_TRI) && isFieldEnabled(FIELD_SELECT(MOTOR));
case CONDITION(PID):
return isFieldSelected(SELECT_FIELD_PID);
return isFieldEnabled(FIELD_SELECT(PID));
case CONDITION(NONZERO_PID_D_0):
case CONDITION(NONZERO_PID_D_1):
case CONDITION(NONZERO_PID_D_2):
return (currentPidProfile->pid[condition - FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_0].D != 0) && isFieldSelected(SELECT_FIELD_PID);
return (currentPidProfile->pid[condition - FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_0].D != 0) && isFieldEnabled(FIELD_SELECT(PID));
case CONDITION(RC_COMMANDS):
return isFieldSelected(SELECT_FIELD_RC_COMMANDS);
return isFieldEnabled(FIELD_SELECT(RC_COMMANDS));
case CONDITION(SETPOINT):
return isFieldSelected(SELECT_FIELD_SETPOINT);
return isFieldEnabled(FIELD_SELECT(SETPOINT));
case CONDITION(MAG):
#ifdef USE_MAG
return sensors(SENSOR_MAG) && isFieldSelected(SELECT_FIELD_MAG);
return sensors(SENSOR_MAG) && isFieldEnabled(FIELD_SELECT(MAG));
#else
return false;
#endif
case CONDITION(BARO):
#ifdef USE_BARO
return sensors(SENSOR_BARO) && isFieldSelected(SELECT_FIELD_ALTITUDE);
return sensors(SENSOR_BARO) && isFieldEnabled(FIELD_SELECT(ALTITUDE));
#else
return false;
#endif
case CONDITION(VBAT):
return (batteryConfig()->voltageMeterSource != VOLTAGE_METER_NONE) && isFieldSelected(SELECT_FIELD_BATTERY);
return (batteryConfig()->voltageMeterSource != VOLTAGE_METER_NONE) && isFieldEnabled(FIELD_SELECT(BATTERY));
case CONDITION(AMPERAGE_ADC):
return (batteryConfig()->currentMeterSource != CURRENT_METER_NONE) && (batteryConfig()->currentMeterSource != CURRENT_METER_VIRTUAL) && isFieldSelected(SELECT_FIELD_BATTERY);
return (batteryConfig()->currentMeterSource != CURRENT_METER_NONE) && (batteryConfig()->currentMeterSource != CURRENT_METER_VIRTUAL) && isFieldEnabled(FIELD_SELECT(BATTERY));
case CONDITION(RANGEFINDER):
#ifdef USE_RANGEFINDER
return sensors(SENSOR_RANGEFINDER) && isFieldSelected(SELECT_FIELD_ALTITUDE);
return sensors(SENSOR_RANGEFINDER) && isFieldEnabled(FIELD_SELECT(ALTITUDE));
#else
return false;
#endif
case CONDITION(RSSI):
return isRssiConfigured() && isFieldSelected(SELECT_FIELD_RSSI);
return isRssiConfigured() && isFieldEnabled(FIELD_SELECT(RSSI));
case FLIGHT_LOG_FIELD_CONDITION_NOT_LOGGING_EVERY_FRAME:
return blackboxPInterval != blackboxIInterval;
case CONDITION(GYRO):
return isFieldSelected(SELECT_FIELD_GYRO);
return isFieldEnabled(FIELD_SELECT(GYRO));
case CONDITION(ACC):
return sensors(SENSOR_ACC) && isFieldSelected(SELECT_FIELD_ACC);
return sensors(SENSOR_ACC) && isFieldEnabled(FIELD_SELECT(ACC));
case CONDITION(DEBUG):
return (debugMode != DEBUG_NONE) && isFieldSelected(SELECT_FIELD_DEBUG);
return (debugMode != DEBUG_NONE) && isFieldEnabled(FIELD_SELECT(DEBUG));
case CONDITION(NEVER):
return false;
@ -632,7 +635,7 @@ static void writeIntraframe(void)
blackboxWriteSigned16VBArray(blackboxCurrent->debug, DEBUG16_VALUE_COUNT);
}
if (isFieldSelected(SELECT_FIELD_MOTOR)) {
if (isFieldEnabled(FIELD_SELECT(MOTOR))) {
//Motors can be below minimum output when disarmed, but that doesn't happen much
blackboxWriteUnsignedVB(blackboxCurrent->motor[0] - motorOutputLow);
@ -781,7 +784,7 @@ static void writeInterframe(void)
blackboxWriteMainStateArrayUsingAveragePredictor(offsetof(blackboxMainState_t, debug), DEBUG16_VALUE_COUNT);
}
if (isFieldSelected(SELECT_FIELD_MOTOR)) {
if (isFieldEnabled(FIELD_SELECT(MOTOR))) {
blackboxWriteMainStateArrayUsingAveragePredictor(offsetof(blackboxMainState_t, motor), getMotorCount());
if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_TRICOPTER)) {
@ -1470,6 +1473,8 @@ static bool blackboxWriteSysinfo(void)
#endif // USE_RC_SMOOTHING_FILTER
BLACKBOX_PRINT_HEADER_LINE("rates_type", "%d", currentControlRateProfile->rates_type);
BLACKBOX_PRINT_HEADER_LINE("logging_fields_mask", "%d", blackboxConfig()->fields_mask);
default:
return true;
}
@ -1573,7 +1578,7 @@ STATIC_UNIT_TESTED bool blackboxShouldLogIFrame(void)
STATIC_UNIT_TESTED bool blackboxShouldLogGpsHomeFrame(void)
{
if ((GPS_home[0] != gpsHistory.GPS_home[0] || GPS_home[1] != gpsHistory.GPS_home[1]
|| (blackboxPFrameIndex == blackboxIInterval / 2 && blackboxIFrameIndex % 128 == 0)) && isFieldSelected(SELECT_FIELD_GPS)) {
|| (blackboxPFrameIndex == blackboxIInterval / 2 && blackboxIFrameIndex % 128 == 0)) && isFieldEnabled(FIELD_SELECT(GPS))) {
return true;
}
return false;
@ -1625,7 +1630,7 @@ STATIC_UNIT_TESTED void blackboxLogIteration(timeUs_t currentTimeUs)
writeInterframe();
}
#ifdef USE_GPS
if (featureIsEnabled(FEATURE_GPS) && isFieldSelected(SELECT_FIELD_GPS)) {
if (featureIsEnabled(FEATURE_GPS) && isFieldEnabled(FIELD_SELECT(GPS))) {
if (blackboxShouldLogGpsHomeFrame()) {
writeGPSHomeFrame();
writeGPSFrame(currentTimeUs);
@ -1693,7 +1698,7 @@ void blackboxUpdate(timeUs_t currentTimeUs)
if (!sendFieldDefinition('I', 'P', blackboxMainFields, blackboxMainFields + 1, ARRAYLEN(blackboxMainFields),
&blackboxMainFields[0].condition, &blackboxMainFields[1].condition)) {
#ifdef USE_GPS
if (featureIsEnabled(FEATURE_GPS) && isFieldSelected(SELECT_FIELD_GPS)) {
if (featureIsEnabled(FEATURE_GPS) && isFieldEnabled(FIELD_SELECT(GPS))) {
blackboxSetState(BLACKBOX_STATE_SEND_GPS_H_HEADER);
} else
#endif
@ -1705,7 +1710,7 @@ void blackboxUpdate(timeUs_t currentTimeUs)
blackboxReplenishHeaderBudget();
//On entry of this state, xmitState.headerIndex is 0 and xmitState.u.fieldIndex is -1
if (!sendFieldDefinition('H', 0, blackboxGpsHFields, blackboxGpsHFields + 1, ARRAYLEN(blackboxGpsHFields),
NULL, NULL) && isFieldSelected(SELECT_FIELD_GPS)) {
NULL, NULL) && isFieldEnabled(FIELD_SELECT(GPS))) {
blackboxSetState(BLACKBOX_STATE_SEND_GPS_G_HEADER);
}
break;
@ -1713,7 +1718,7 @@ void blackboxUpdate(timeUs_t currentTimeUs)
blackboxReplenishHeaderBudget();
//On entry of this state, xmitState.headerIndex is 0 and xmitState.u.fieldIndex is -1
if (!sendFieldDefinition('G', 0, blackboxGpsGFields, blackboxGpsGFields + 1, ARRAYLEN(blackboxGpsGFields),
&blackboxGpsGFields[0].condition, &blackboxGpsGFields[1].condition) && isFieldSelected(SELECT_FIELD_GPS)) {
&blackboxGpsGFields[0].condition, &blackboxGpsGFields[1].condition) && isFieldEnabled(FIELD_SELECT(GPS))) {
blackboxSetState(BLACKBOX_STATE_SEND_SLOW_HEADER);
}
break;

View File

@ -61,7 +61,7 @@ typedef enum FlightLogEvent {
typedef struct blackboxConfig_s {
uint8_t sample_rate; // sample rate
uint8_t device;
uint16_t fields;
uint32_t fields_mask; // 1 to not log that field, 0 to log that field
uint8_t mode;
} blackboxConfig_t;

View File

@ -59,21 +59,21 @@ typedef enum FlightLogFieldCondition {
FLIGHT_LOG_FIELD_CONDITION_LAST = FLIGHT_LOG_FIELD_CONDITION_NEVER
} FlightLogFieldCondition;
typedef enum SelectField { // no more than 16
SELECT_FIELD_PID = 0,
SELECT_FIELD_RC_COMMANDS,
SELECT_FIELD_SETPOINT,
SELECT_FIELD_BATTERY,
SELECT_FIELD_MAG,
SELECT_FIELD_ALTITUDE,
SELECT_FIELD_RSSI,
SELECT_FIELD_GYRO,
SELECT_FIELD_ACC,
SELECT_FIELD_DEBUG,
SELECT_FIELD_MOTOR,
SELECT_FIELD_GPS = 15
} SelectField;
typedef enum FlightLogFieldSelect_e { // no more than 32
FLIGHT_LOG_FIELD_SELECT_PID = 0,
FLIGHT_LOG_FIELD_SELECT_RC_COMMANDS,
FLIGHT_LOG_FIELD_SELECT_SETPOINT,
FLIGHT_LOG_FIELD_SELECT_BATTERY,
FLIGHT_LOG_FIELD_SELECT_MAG,
FLIGHT_LOG_FIELD_SELECT_ALTITUDE,
FLIGHT_LOG_FIELD_SELECT_RSSI,
FLIGHT_LOG_FIELD_SELECT_GYRO,
FLIGHT_LOG_FIELD_SELECT_ACC,
FLIGHT_LOG_FIELD_SELECT_DEBUG,
FLIGHT_LOG_FIELD_SELECT_MOTOR,
FLIGHT_LOG_FIELD_SELECT_GPS,
FLIGHT_LOG_FIELD_SELECT_COUNT
} FlightLogFieldSelect_e;
typedef enum FlightLogFieldPredictor {
//No prediction:

View File

@ -778,18 +778,26 @@ const clivalue_t valueTable[] = {
#ifdef USE_BLACKBOX
{ "blackbox_sample_rate", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_BLACKBOX_SAMPLE_RATE }, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, sample_rate) },
{ "blackbox_device", VAR_UINT8 | HARDWARE_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_BLACKBOX_DEVICE }, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, device) },
{ "bb_log_pids", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_PID, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "bb_log_rc", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_RC_COMMANDS, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "bb_log_setpoint", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_SETPOINT, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "bb_log_bat", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_BATTERY, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "bb_log_mag", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_MAG, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "bb_log_alt", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_ALTITUDE, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "bb_log_rssi", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_RSSI, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "bb_log_gyro", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_GYRO, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "bb_log_acc", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_ACC, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "bb_log_debug", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_DEBUG, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "bb_log_motors", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_MOTOR, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "bb_log_gps", VAR_UINT16 | MASTER_VALUE | MODE_BITSET, .config.bitpos = SELECT_FIELD_GPS, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields) },
{ "blackbox_disable_pids", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_PID, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
{ "blackbox_disable_rc", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_RC_COMMANDS, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
{ "blackbox_disable_setpoint", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_SETPOINT, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
{ "blackbox_disable_bat", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_BATTERY, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
#ifdef USE_MAG
{ "blackbox_disable_mag", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_MAG, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
#endif
#if defined(USE_BARO) || defined(USE_RANGEFINDER)
{ "blackbox_disable_alt", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_ALTITUDE, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
#endif
{ "blackbox_disable_rssi", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_RSSI, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
{ "blackbox_disable_gyro", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_GYRO, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
#if defined(USE_ACC)
{ "blackbox_disable_acc", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_ACC, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
#endif
{ "blackbox_disable_debug", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_DEBUG, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
{ "blackbox_disable_motors", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_MOTOR, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
#ifdef USE_GPS
{ "blackbox_disable_gps", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_GPS, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_mask) },
#endif
{ "blackbox_mode", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_BLACKBOX_MODE }, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, mode) },
#endif

View File

@ -1592,7 +1592,6 @@ static bool mspProcessOutCommand(int16_t cmdMSP, sbuf_t *dst)
sbufWriteU8(dst, blackboxGetRateDenom());
sbufWriteU16(dst, blackboxGetPRatio());
sbufWriteU8(dst, blackboxConfig()->sample_rate);
sbufWriteU16(dst, blackboxConfig()->fields);
#else
sbufWriteU8(dst, 0); // Blackbox not supported
sbufWriteU8(dst, 0);
@ -1600,7 +1599,6 @@ static bool mspProcessOutCommand(int16_t cmdMSP, sbuf_t *dst)
sbufWriteU8(dst, 0);
sbufWriteU16(dst, 0);
sbufWriteU8(dst, 0);
sbufWriteU16(dst, 0);
#endif
break;
@ -2783,9 +2781,6 @@ static mspResult_e mspProcessInCommand(mspDescriptor_t srcDesc, int16_t cmdMSP,
// sample_rate not specified in MSP, so calculate it from old p_ratio
blackboxConfigMutable()->sample_rate = blackboxCalculateSampleRate(pRatio);
}
if (sbufBytesRemaining(src) >= 2) {
blackboxConfigMutable()->fields = sbufReadU16(src);
}
}
break;
#endif