From d21b1fa77adaa145dde53775a59d684a85b45965 Mon Sep 17 00:00:00 2001 From: fgiudice98 Date: Tue, 21 Apr 2020 17:42:24 +0200 Subject: [PATCH] Refactor 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 --- src/main/blackbox/blackbox.c | 57 ++++++++++++++------------ src/main/blackbox/blackbox.h | 2 +- src/main/blackbox/blackbox_fielddefs.h | 30 +++++++------- src/main/cli/settings.c | 32 +++++++++------ src/main/msp/msp.c | 5 --- 5 files changed, 67 insertions(+), 59 deletions(-) diff --git a/src/main/blackbox/blackbox.c b/src/main/blackbox/blackbox.c index 6610e879e..d7613aca9 100644 --- a/src/main/blackbox/blackbox.c +++ b/src/main/blackbox/blackbox.c @@ -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; diff --git a/src/main/blackbox/blackbox.h b/src/main/blackbox/blackbox.h index d35d51faa..1118cc837 100644 --- a/src/main/blackbox/blackbox.h +++ b/src/main/blackbox/blackbox.h @@ -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; diff --git a/src/main/blackbox/blackbox_fielddefs.h b/src/main/blackbox/blackbox_fielddefs.h index 5ba22d28f..338d2b582 100644 --- a/src/main/blackbox/blackbox_fielddefs.h +++ b/src/main/blackbox/blackbox_fielddefs.h @@ -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: diff --git a/src/main/cli/settings.c b/src/main/cli/settings.c index d819bee95..95bf9167c 100644 --- a/src/main/cli/settings.c +++ b/src/main/cli/settings.c @@ -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 diff --git a/src/main/msp/msp.c b/src/main/msp/msp.c index 06cccc6ae..3c908403f 100644 --- a/src/main/msp/msp.c +++ b/src/main/msp/msp.c @@ -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