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:
parent
16c157e840
commit
909ab19a1b
6 changed files with 57 additions and 15 deletions
|
@ -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", 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 */
|
||||
{"servo", 5, UNSIGNED, .Ipredict = PREDICT(1500), .Iencode = ENCODING(SIGNED_VB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(SIGNED_VB), CONDITION(TRICOPTER)},
|
||||
#ifdef USE_SERVOS
|
||||
/* 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
|
||||
// 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));
|
||||
#endif
|
||||
|
||||
case CONDITION(TRICOPTER):
|
||||
return (mixerConfig()->mixerMode == MIXER_TRI || mixerConfig()->mixerMode == MIXER_CUSTOM_TRI) && isFieldEnabled(FIELD_SELECT(MOTOR));
|
||||
#ifdef USE_SERVOS
|
||||
case CONDITION(SERVOS):
|
||||
return hasServos() && (FIELD_SELECT(SERVO));
|
||||
#endif
|
||||
|
||||
case CONDITION(PID):
|
||||
return isFieldEnabled(FIELD_SELECT(PID));
|
||||
|
@ -696,12 +707,18 @@ static void writeIntraframe(void)
|
|||
for (int x = 1; x < motorCount; x++) {
|
||||
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
|
||||
if (isFieldEnabled(FIELD_SELECT(RPM))) {
|
||||
|
@ -852,11 +869,20 @@ static void writeInterframe(void)
|
|||
|
||||
if (isFieldEnabled(FIELD_SELECT(MOTOR))) {
|
||||
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
|
||||
if (isFieldEnabled(FIELD_SELECT(RPM))) {
|
||||
const int motorCount = getMotorCount();
|
||||
|
@ -1195,8 +1221,9 @@ static void loadMainState(timeUs_t currentTimeUs)
|
|||
blackboxCurrent->rssi = getRssi();
|
||||
|
||||
#ifdef USE_SERVOS
|
||||
//Tail servo for tricopters
|
||||
blackboxCurrent->servo[5] = servo[5];
|
||||
for (unsigned i = 0; i < ARRAYLEN(blackboxCurrent->servo); i++) {
|
||||
blackboxCurrent->servo[i] = servo[i];
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
UNUSED(currentTimeUs);
|
||||
|
|
|
@ -43,6 +43,10 @@ typedef enum FlightLogFieldCondition {
|
|||
FLIGHT_LOG_FIELD_CONDITION_MOTOR_8_HAS_RPM,
|
||||
#endif
|
||||
|
||||
#ifdef USE_SERVOS
|
||||
FLIGHT_LOG_FIELD_CONDITION_SERVOS,
|
||||
#endif
|
||||
|
||||
FLIGHT_LOG_FIELD_CONDITION_MAG,
|
||||
FLIGHT_LOG_FIELD_CONDITION_BARO,
|
||||
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_RPM,
|
||||
FLIGHT_LOG_FIELD_SELECT_GYROUNFILT,
|
||||
FLIGHT_LOG_FIELD_SELECT_SERVO,
|
||||
FLIGHT_LOG_FIELD_SELECT_COUNT
|
||||
} FlightLogFieldSelect_e;
|
||||
|
||||
|
|
|
@ -843,6 +843,9 @@ const clivalue_t valueTable[] = {
|
|||
#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_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
|
||||
{ "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
|
||||
|
|
|
@ -121,6 +121,7 @@ extern float motor[MAX_SUPPORTED_MOTORS];
|
|||
extern float motor_disarmed[MAX_SUPPORTED_MOTORS];
|
||||
struct rxConfig_s;
|
||||
|
||||
bool hasServos(void);
|
||||
uint8_t getMotorCount(void);
|
||||
float getMotorMixRange(void);
|
||||
bool areMotorsRunning(void);
|
||||
|
|
|
@ -278,6 +278,11 @@ const mixer_t mixers[] = {
|
|||
|
||||
FAST_DATA_ZERO_INIT mixerRuntime_t mixerRuntime;
|
||||
|
||||
bool hasServos(void)
|
||||
{
|
||||
return mixers[currentMixerMode].useServo;
|
||||
}
|
||||
|
||||
uint8_t getMotorCount(void)
|
||||
{
|
||||
return mixerRuntime.motorCount;
|
||||
|
|
|
@ -362,6 +362,7 @@ boxBitmask_t rcModeActivationMask;
|
|||
void mspSerialAllocatePorts(void) {}
|
||||
uint32_t getArmingBeepTimeMicros(void) {return 0;}
|
||||
uint16_t getBatteryVoltageLatest(void) {return 0;}
|
||||
bool hasServos(void) { return false; }
|
||||
uint8_t getMotorCount(void) {return 4;}
|
||||
bool areMotorsRunning(void) { return false; }
|
||||
bool IS_RC_MODE_ACTIVE(boxId_e) {return false;}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue