1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-15 20:35:33 +03:00

Log servos in blackbox (#13944)

* Log servos in blackbox

* Add hasServos helper
This commit is contained in:
Henry Warhurst 2024-10-06 22:48:17 +02:00 committed by GitHub
parent 16c157e840
commit 909ab19a1b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 57 additions and 15 deletions

View file

@ -257,8 +257,17 @@ static const blackboxDeltaFieldDefinition_t blackboxMainFields[] = {
{"motor", 6, UNSIGNED, .Ipredict = PREDICT(MOTOR_0), .Iencode = ENCODING(SIGNED_VB), .Ppredict = PREDICT(AVERAGE_2), .Pencode = ENCODING(SIGNED_VB), CONDITION(AT_LEAST_MOTORS_7)}, {"motor", 6, UNSIGNED, .Ipredict = PREDICT(MOTOR_0), .Iencode = ENCODING(SIGNED_VB), .Ppredict = PREDICT(AVERAGE_2), .Pencode = ENCODING(SIGNED_VB), CONDITION(AT_LEAST_MOTORS_7)},
{"motor", 7, UNSIGNED, .Ipredict = PREDICT(MOTOR_0), .Iencode = ENCODING(SIGNED_VB), .Ppredict = PREDICT(AVERAGE_2), .Pencode = ENCODING(SIGNED_VB), CONDITION(AT_LEAST_MOTORS_8)}, {"motor", 7, UNSIGNED, .Ipredict = PREDICT(MOTOR_0), .Iencode = ENCODING(SIGNED_VB), .Ppredict = PREDICT(AVERAGE_2), .Pencode = ENCODING(SIGNED_VB), CONDITION(AT_LEAST_MOTORS_8)},
/* Tricopter tail servo */ #ifdef USE_SERVOS
{"servo", 5, UNSIGNED, .Ipredict = PREDICT(1500), .Iencode = ENCODING(SIGNED_VB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(SIGNED_VB), CONDITION(TRICOPTER)}, /* NOTE (ledvinap, hwarhurst): Decoding would fail if previous encoding is also TAG8_8SVB and does not have exactly 8 values. To fix it, inserting ENCODING_NULL dummy value should force end of previous group. */
{"servo", 0, UNSIGNED, .Ipredict = PREDICT(1500), .Iencode = ENCODING(TAG8_8SVB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), CONDITION(SERVOS)},
{"servo", 1, UNSIGNED, .Ipredict = PREDICT(1500), .Iencode = ENCODING(TAG8_8SVB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), CONDITION(SERVOS)},
{"servo", 2, UNSIGNED, .Ipredict = PREDICT(1500), .Iencode = ENCODING(TAG8_8SVB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), CONDITION(SERVOS)},
{"servo", 3, UNSIGNED, .Ipredict = PREDICT(1500), .Iencode = ENCODING(TAG8_8SVB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), CONDITION(SERVOS)},
{"servo", 4, UNSIGNED, .Ipredict = PREDICT(1500), .Iencode = ENCODING(TAG8_8SVB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), CONDITION(SERVOS)},
{"servo", 5, UNSIGNED, .Ipredict = PREDICT(1500), .Iencode = ENCODING(TAG8_8SVB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), CONDITION(SERVOS)},
{"servo", 6, UNSIGNED, .Ipredict = PREDICT(1500), .Iencode = ENCODING(TAG8_8SVB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), CONDITION(SERVOS)},
{"servo", 7, UNSIGNED, .Ipredict = PREDICT(1500), .Iencode = ENCODING(TAG8_8SVB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), CONDITION(SERVOS)},
#endif
#ifdef USE_DSHOT_TELEMETRY #ifdef USE_DSHOT_TELEMETRY
// eRPM / 100 // eRPM / 100
@ -476,8 +485,10 @@ static bool testBlackboxConditionUncached(FlightLogFieldCondition condition)
return (getMotorCount() >= condition - CONDITION(MOTOR_1_HAS_RPM) + 1) && useDshotTelemetry && isFieldEnabled(FIELD_SELECT(RPM)); return (getMotorCount() >= condition - CONDITION(MOTOR_1_HAS_RPM) + 1) && useDshotTelemetry && isFieldEnabled(FIELD_SELECT(RPM));
#endif #endif
case CONDITION(TRICOPTER): #ifdef USE_SERVOS
return (mixerConfig()->mixerMode == MIXER_TRI || mixerConfig()->mixerMode == MIXER_CUSTOM_TRI) && isFieldEnabled(FIELD_SELECT(MOTOR)); case CONDITION(SERVOS):
return hasServos() && (FIELD_SELECT(SERVO));
#endif
case CONDITION(PID): case CONDITION(PID):
return isFieldEnabled(FIELD_SELECT(PID)); return isFieldEnabled(FIELD_SELECT(PID));
@ -696,13 +707,19 @@ static void writeIntraframe(void)
for (int x = 1; x < motorCount; x++) { for (int x = 1; x < motorCount; x++) {
blackboxWriteSignedVB(blackboxCurrent->motor[x] - blackboxCurrent->motor[0]); blackboxWriteSignedVB(blackboxCurrent->motor[x] - blackboxCurrent->motor[0]);
} }
if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_TRICOPTER)) {
//Assume the tail spends most of its time around the center
blackboxWriteSignedVB(blackboxCurrent->servo[5] - 1500);
}
} }
#ifdef USE_SERVOS
if (testBlackboxCondition(CONDITION(SERVOS))) {
int32_t out[ARRAYLEN(servo)];
for (unsigned x = 0; x < ARRAYLEN(servo); ++x) {
out[x] = blackboxCurrent->servo[x] - 1500;
}
blackboxWriteTag8_8SVB(out, ARRAYLEN(out));
}
#endif
#ifdef USE_DSHOT_TELEMETRY #ifdef USE_DSHOT_TELEMETRY
if (isFieldEnabled(FIELD_SELECT(RPM))) { if (isFieldEnabled(FIELD_SELECT(RPM))) {
const int motorCount = getMotorCount(); const int motorCount = getMotorCount();
@ -852,11 +869,20 @@ static void writeInterframe(void)
if (isFieldEnabled(FIELD_SELECT(MOTOR))) { if (isFieldEnabled(FIELD_SELECT(MOTOR))) {
blackboxWriteMainStateArrayUsingAveragePredictor(offsetof(blackboxMainState_t, motor), getMotorCount()); blackboxWriteMainStateArrayUsingAveragePredictor(offsetof(blackboxMainState_t, motor), getMotorCount());
if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_TRICOPTER)) {
blackboxWriteSignedVB(blackboxCurrent->servo[5] - blackboxLast->servo[5]);
}
} }
#ifdef USE_SERVOS
if (testBlackboxCondition(CONDITION(SERVOS))) {
STATIC_ASSERT(ARRAYLEN(servo) <= 8, "TAG8_8SVB supports at most 8 values");
int32_t out[ARRAYLEN(servo)];
for (unsigned x = 0; x < ARRAYLEN(servo); ++x) {
out[x] = blackboxCurrent->servo[x] - blackboxLast->servo[x];
}
blackboxWriteTag8_8SVB(out, ARRAYLEN(out));
}
#endif
#ifdef USE_DSHOT_TELEMETRY #ifdef USE_DSHOT_TELEMETRY
if (isFieldEnabled(FIELD_SELECT(RPM))) { if (isFieldEnabled(FIELD_SELECT(RPM))) {
const int motorCount = getMotorCount(); const int motorCount = getMotorCount();
@ -1195,8 +1221,9 @@ static void loadMainState(timeUs_t currentTimeUs)
blackboxCurrent->rssi = getRssi(); blackboxCurrent->rssi = getRssi();
#ifdef USE_SERVOS #ifdef USE_SERVOS
//Tail servo for tricopters for (unsigned i = 0; i < ARRAYLEN(blackboxCurrent->servo); i++) {
blackboxCurrent->servo[5] = servo[5]; blackboxCurrent->servo[i] = servo[i];
}
#endif #endif
#else #else
UNUSED(currentTimeUs); UNUSED(currentTimeUs);

View file

@ -43,6 +43,10 @@ typedef enum FlightLogFieldCondition {
FLIGHT_LOG_FIELD_CONDITION_MOTOR_8_HAS_RPM, FLIGHT_LOG_FIELD_CONDITION_MOTOR_8_HAS_RPM,
#endif #endif
#ifdef USE_SERVOS
FLIGHT_LOG_FIELD_CONDITION_SERVOS,
#endif
FLIGHT_LOG_FIELD_CONDITION_MAG, FLIGHT_LOG_FIELD_CONDITION_MAG,
FLIGHT_LOG_FIELD_CONDITION_BARO, FLIGHT_LOG_FIELD_CONDITION_BARO,
FLIGHT_LOG_FIELD_CONDITION_VBAT, FLIGHT_LOG_FIELD_CONDITION_VBAT,
@ -86,6 +90,7 @@ typedef enum FlightLogFieldSelect_e { // no more than 32
FLIGHT_LOG_FIELD_SELECT_GPS, FLIGHT_LOG_FIELD_SELECT_GPS,
FLIGHT_LOG_FIELD_SELECT_RPM, FLIGHT_LOG_FIELD_SELECT_RPM,
FLIGHT_LOG_FIELD_SELECT_GYROUNFILT, FLIGHT_LOG_FIELD_SELECT_GYROUNFILT,
FLIGHT_LOG_FIELD_SELECT_SERVO,
FLIGHT_LOG_FIELD_SELECT_COUNT FLIGHT_LOG_FIELD_SELECT_COUNT
} FlightLogFieldSelect_e; } FlightLogFieldSelect_e;

View file

@ -843,6 +843,9 @@ const clivalue_t valueTable[] = {
#endif #endif
{ "blackbox_disable_debug", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_DEBUG_LOG, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_disabled_mask) }, { "blackbox_disable_debug", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_DEBUG_LOG, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_disabled_mask) },
{ "blackbox_disable_motors", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_MOTOR, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_disabled_mask) }, { "blackbox_disable_motors", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_MOTOR, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_disabled_mask) },
#ifdef USE_SERVOS
{ "blackbox_disable_servos", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_SERVO, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_disabled_mask) },
#endif
#ifdef USE_DSHOT_TELEMETRY #ifdef USE_DSHOT_TELEMETRY
{ "blackbox_disable_rpm", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_RPM, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_disabled_mask) }, { "blackbox_disable_rpm", VAR_UINT32 | MASTER_VALUE | MODE_BITSET, .config.bitpos = FLIGHT_LOG_FIELD_SELECT_RPM, PG_BLACKBOX_CONFIG, offsetof(blackboxConfig_t, fields_disabled_mask) },
#endif #endif

View file

@ -121,6 +121,7 @@ extern float motor[MAX_SUPPORTED_MOTORS];
extern float motor_disarmed[MAX_SUPPORTED_MOTORS]; extern float motor_disarmed[MAX_SUPPORTED_MOTORS];
struct rxConfig_s; struct rxConfig_s;
bool hasServos(void);
uint8_t getMotorCount(void); uint8_t getMotorCount(void);
float getMotorMixRange(void); float getMotorMixRange(void);
bool areMotorsRunning(void); bool areMotorsRunning(void);

View file

@ -278,6 +278,11 @@ const mixer_t mixers[] = {
FAST_DATA_ZERO_INIT mixerRuntime_t mixerRuntime; FAST_DATA_ZERO_INIT mixerRuntime_t mixerRuntime;
bool hasServos(void)
{
return mixers[currentMixerMode].useServo;
}
uint8_t getMotorCount(void) uint8_t getMotorCount(void)
{ {
return mixerRuntime.motorCount; return mixerRuntime.motorCount;

View file

@ -362,6 +362,7 @@ boxBitmask_t rcModeActivationMask;
void mspSerialAllocatePorts(void) {} void mspSerialAllocatePorts(void) {}
uint32_t getArmingBeepTimeMicros(void) {return 0;} uint32_t getArmingBeepTimeMicros(void) {return 0;}
uint16_t getBatteryVoltageLatest(void) {return 0;} uint16_t getBatteryVoltageLatest(void) {return 0;}
bool hasServos(void) { return false; }
uint8_t getMotorCount(void) {return 4;} uint8_t getMotorCount(void) {return 4;}
bool areMotorsRunning(void) { return false; } bool areMotorsRunning(void) { return false; }
bool IS_RC_MODE_ACTIVE(boxId_e) {return false;} bool IS_RC_MODE_ACTIVE(boxId_e) {return false;}