diff --git a/src/main/blackbox/blackbox.c b/src/main/blackbox/blackbox.c index 09a2485a26..3378ec95f3 100644 --- a/src/main/blackbox/blackbox.c +++ b/src/main/blackbox/blackbox.c @@ -1459,6 +1459,9 @@ void blackboxLogEvent(FlightLogEvent event, flightLogEventData_t *data) blackboxWriteUnsignedVB(data->flightMode.flags); blackboxWriteUnsignedVB(data->flightMode.lastFlags); break; + case FLIGHT_LOG_EVENT_DISARM: + blackboxWriteUnsignedVB(data->disarm.reason); + break; case FLIGHT_LOG_EVENT_INFLIGHT_ADJUSTMENT: if (data->inflightAdjustment.floatFlag) { blackboxWrite(data->inflightAdjustment.adjustmentFunction + FLIGHT_LOG_EVENT_INFLIGHT_ADJUSTMENT_FUNCTION_FLOAT_VALUE_FLAG); @@ -1476,6 +1479,8 @@ void blackboxLogEvent(FlightLogEvent event, flightLogEventData_t *data) blackboxWriteString("End of log"); blackboxWrite(0); break; + default: + break; } } diff --git a/src/main/blackbox/blackbox.h b/src/main/blackbox/blackbox.h index 694343d44b..406318b5bc 100644 --- a/src/main/blackbox/blackbox.h +++ b/src/main/blackbox/blackbox.h @@ -40,8 +40,12 @@ typedef enum BlackboxMode { typedef enum FlightLogEvent { FLIGHT_LOG_EVENT_SYNC_BEEP = 0, + FLIGHT_LOG_EVENT_AUTOTUNE_CYCLE_START = 10, // UNUSED + FLIGHT_LOG_EVENT_AUTOTUNE_CYCLE_RESULT = 11, // UNUSED + FLIGHT_LOG_EVENT_AUTOTUNE_TARGETS = 12, // UNUSED FLIGHT_LOG_EVENT_INFLIGHT_ADJUSTMENT = 13, FLIGHT_LOG_EVENT_LOGGING_RESUME = 14, + FLIGHT_LOG_EVENT_DISARM = 15, FLIGHT_LOG_EVENT_FLIGHTMODE = 30, // Add new event type for flight mode status. FLIGHT_LOG_EVENT_LOG_END = 255 } FlightLogEvent; diff --git a/src/main/blackbox/blackbox_fielddefs.h b/src/main/blackbox/blackbox_fielddefs.h index 7a5f54f017..e261fc7f4d 100644 --- a/src/main/blackbox/blackbox_fielddefs.h +++ b/src/main/blackbox/blackbox_fielddefs.h @@ -113,6 +113,10 @@ typedef struct flightLogEvent_syncBeep_s { uint32_t time; } flightLogEvent_syncBeep_t; +typedef struct flightLogEvent_disarm_s { + uint32_t reason; +} flightLogEvent_disarm_t; + typedef struct flightLogEvent_flightMode_s { // New Event Data type uint32_t flags; uint32_t lastFlags; @@ -135,6 +139,7 @@ typedef struct flightLogEvent_loggingResume_s { typedef union flightLogEventData_u { flightLogEvent_syncBeep_t syncBeep; flightLogEvent_flightMode_t flightMode; // New event data + flightLogEvent_disarm_t disarm; flightLogEvent_inflightAdjustment_t inflightAdjustment; flightLogEvent_loggingResume_t loggingResume; } flightLogEventData_t; diff --git a/src/main/fc/core.c b/src/main/fc/core.c index df342e8ef8..bde4e9b103 100644 --- a/src/main/fc/core.c +++ b/src/main/fc/core.c @@ -28,6 +28,7 @@ #include "build/debug.h" #include "blackbox/blackbox.h" +#include "blackbox/blackbox_fielddefs.h" #include "cli/cli.h" @@ -422,7 +423,7 @@ void updateArmingStatus(void) } } -void disarm(void) +void disarm(flightLogDisarmReason_e reason) { if (ARMING_FLAG(ARMED)) { ENABLE_ARMING_FLAG(WAS_EVER_ARMED); @@ -436,6 +437,10 @@ void disarm(void) #endif #ifdef USE_BLACKBOX + flightLogEvent_disarm_t eventData; + eventData.reason = reason; + blackboxLogEvent(FLIGHT_LOG_EVENT_DISARM, (flightLogEventData_t*)&eventData); + if (blackboxConfig()->device && blackboxConfig()->mode != BLACKBOX_MODE_ALWAYS_ON) { // Close the log upon disarm except when logging mode is ALWAYS ON blackboxFinish(); } @@ -739,7 +744,7 @@ bool processRx(timeUs_t currentTimeUs) // in 3D mode, we need to be able to disarm by switch at any time if (featureIsEnabled(FEATURE_3D)) { if (!IS_RC_MODE_ACTIVE(BOXARM)) - disarm(); + disarm(DISARM_REASON_SWITCH); } updateRSSI(currentTimeUs); @@ -881,7 +886,7 @@ bool processRx(timeUs_t currentTimeUs) if (throttleStatus == THROTTLE_LOW) { if ((autoDisarmDelayUs > 0) && (currentTimeUs > disarmAt)) { // auto-disarm configured and delay is over - disarm(); + disarm(DISARM_REASON_THROTTLE_TIMEOUT); armedBeeperOn = false; } else { // still armed; do warning beeps while armed @@ -1093,7 +1098,7 @@ static FAST_CODE void subTaskPidController(timeUs_t currentTimeUs) runawayTakeoffTriggerUs = currentTimeUs + RUNAWAY_TAKEOFF_ACTIVATE_DELAY; } else if (currentTimeUs > runawayTakeoffTriggerUs) { setArmingDisabled(ARMING_DISABLED_RUNAWAY_TAKEOFF); - disarm(); + disarm(DISARM_REASON_RUNAWAY_TAKEOFF); } } else { runawayTakeoffTriggerUs = 0; diff --git a/src/main/fc/core.h b/src/main/fc/core.h index 2ea825d96d..c316a2c330 100644 --- a/src/main/fc/core.h +++ b/src/main/fc/core.h @@ -47,6 +47,21 @@ typedef enum { LAUNCH_CONTROL_MODE_COUNT // must be the last element } launchControlMode_e; +typedef enum { + DISARM_REASON_ARMING_DISABLED = 0, + DISARM_REASON_FAILSAFE = 1, + DISARM_REASON_THROTTLE_TIMEOUT = 2, + DISARM_REASON_STICKS = 3, + DISARM_REASON_SWITCH = 4, + DISARM_REASON_CRASH_PROTECTION = 5, + DISARM_REASON_RUNAWAY_TAKEOFF = 6, + DISARM_REASON_GPS_RESCUE = 7, + DISARM_REASON_SERIAL_COMMAND = 8, +#ifdef UNIT_TEST + DISARM_REASON_SYSTEM = 255, +#endif +} flightLogDisarmReason_e; + #ifdef USE_LAUNCH_CONTROL #define LAUNCH_CONTROL_THROTTLE_TRIGGER_MAX 90 extern const char * const osdLaunchControlModeNames[LAUNCH_CONTROL_MODE_COUNT]; @@ -59,7 +74,7 @@ void handleInflightCalibrationStickPosition(void); void resetArmingDisabled(void); -void disarm(void); +void disarm(flightLogDisarmReason_e reason); void tryArm(void); bool processRx(timeUs_t currentTimeUs); diff --git a/src/main/fc/rc_controls.c b/src/main/fc/rc_controls.c index 128972b75f..5d82cc0002 100644 --- a/src/main/fc/rc_controls.c +++ b/src/main/fc/rc_controls.c @@ -179,7 +179,7 @@ void processRcStickPositions() if (ARMING_FLAG(ARMED) && rxIsReceivingSignal() && !failsafeIsActive() ) { rcDisarmTicks++; if (rcDisarmTicks > 3) { - disarm(); + disarm(DISARM_REASON_SWITCH); } } } @@ -189,7 +189,7 @@ void processRcStickPositions() // Disarm on throttle down + yaw resetTryingToArm(); if (ARMING_FLAG(ARMED)) - disarm(); + disarm(DISARM_REASON_STICKS); else { beeper(BEEPER_DISARM_REPEAT); // sound tone while stick held repeatAfter(STICK_AUTOREPEAT_MS); // disarm tone will repeat diff --git a/src/main/flight/failsafe.c b/src/main/flight/failsafe.c index f16ac72394..71e220ffa3 100644 --- a/src/main/flight/failsafe.c +++ b/src/main/flight/failsafe.c @@ -320,7 +320,7 @@ void failsafeUpdateState(void) #endif case FAILSAFE_LANDED: setArmingDisabled(ARMING_DISABLED_FAILSAFE); // To prevent accidently rearming by an intermittent rx link - disarm(); + disarm(DISARM_REASON_FAILSAFE); failsafeState.receivingRxDataPeriod = millis() + failsafeState.receivingRxDataPeriodPreset; // set required period of valid rxData failsafeState.phase = FAILSAFE_RX_LOSS_MONITORING; reprocessState = true; diff --git a/src/main/flight/gps_rescue.c b/src/main/flight/gps_rescue.c index 59a69e39d5..80ab707f6f 100644 --- a/src/main/flight/gps_rescue.c +++ b/src/main/flight/gps_rescue.c @@ -578,7 +578,7 @@ void updateGPSRescueState(void) if (!STATE(GPS_FIX_HOME)) { setArmingDisabled(ARMING_DISABLED_ARM_SWITCH); - disarm(); + disarm(DISARM_REASON_GPS_RESCUE); } // Minimum distance detection. @@ -588,7 +588,7 @@ void updateGPSRescueState(void) // Never allow rescue mode to engage as a failsafe when too close. if (rescueState.isFailsafe) { setArmingDisabled(ARMING_DISABLED_ARM_SWITCH); - disarm(); + disarm(DISARM_REASON_GPS_RESCUE); } // When not in failsafe mode: leave it up to the sanity check setting. @@ -677,7 +677,7 @@ void updateGPSRescueState(void) if (rescueState.sensor.accMagnitude > magnitudeTrigger) { setArmingDisabled(ARMING_DISABLED_ARM_SWITCH); - disarm(); + disarm(DISARM_REASON_GPS_RESCUE); rescueState.phase = RESCUE_COMPLETE; } @@ -692,7 +692,7 @@ void updateGPSRescueState(void) break; case RESCUE_ABORT: setArmingDisabled(ARMING_DISABLED_ARM_SWITCH); - disarm(); + disarm(DISARM_REASON_GPS_RESCUE); rescueStop(); break; default: diff --git a/src/main/flight/pid.c b/src/main/flight/pid.c index 124cf4c7f8..f64660be3d 100644 --- a/src/main/flight/pid.c +++ b/src/main/flight/pid.c @@ -936,7 +936,7 @@ static void detectAndSetCrashRecovery( && fabsf(getSetpointRate(axis)) < crashSetpointThreshold) { if (crash_recovery == PID_CRASH_RECOVERY_DISARM) { setArmingDisabled(ARMING_DISABLED_CRASH_DETECTED); - disarm(); + disarm(DISARM_REASON_CRASH_PROTECTION); } else { inCrashRecoveryMode = true; crashDetectedAtUs = currentTimeUs; diff --git a/src/main/msp/msp.c b/src/main/msp/msp.c index 3e0e895cad..c153c92c56 100644 --- a/src/main/msp/msp.c +++ b/src/main/msp/msp.c @@ -2854,7 +2854,7 @@ static mspResult_e mspProcessInCommand(mspDescriptor_t srcDesc, uint8_t cmdMSP, mspArmingDisableByDescriptor(srcDesc); setArmingDisabled(ARMING_DISABLED_MSP); if (ARMING_FLAG(ARMED)) { - disarm(); + disarm(DISARM_REASON_ARMING_DISABLED); } #ifdef USE_RUNAWAY_TAKEOFF runawayTakeoffTemporaryDisable(false); diff --git a/src/main/target/COLIBRI_RACE/i2c_bst.c b/src/main/target/COLIBRI_RACE/i2c_bst.c index 70c6a8e32b..58db831c57 100644 --- a/src/main/target/COLIBRI_RACE/i2c_bst.c +++ b/src/main/target/COLIBRI_RACE/i2c_bst.c @@ -614,7 +614,7 @@ static bool bstSlaveProcessWriteCommand(uint8_t bstWriteCommand) break; case BST_DISARM: if (ARMING_FLAG(ARMED)) { - disarm(); + disarm(DISARM_REASON_SERIAL_COMMAND); } setArmingDisabled(ARMING_DISABLED_BST); break; diff --git a/src/test/unit/arming_prevention_unittest.cc b/src/test/unit/arming_prevention_unittest.cc index f0679c8f28..832adaff9a 100644 --- a/src/test/unit/arming_prevention_unittest.cc +++ b/src/test/unit/arming_prevention_unittest.cc @@ -676,7 +676,7 @@ TEST(ArmingPreventionTest, GPSRescueWithoutFixPreventsArm) rcData[AUX1] = 1000; // when - disarm(); + disarm(DISARM_REASON_SYSTEM); updateActivatedModes(); updateArmingStatus(); @@ -720,7 +720,7 @@ TEST(ArmingPreventionTest, GPSRescueWithoutFixPreventsArm) rcData[AUX1] = 1000; // when - disarm(); + disarm(DISARM_REASON_SYSTEM); updateActivatedModes(); updateArmingStatus(); @@ -790,7 +790,7 @@ TEST(ArmingPreventionTest, GPSRescueSwitchPreventsArm) rcData[AUX1] = 1000; // when - disarm(); + disarm(DISARM_REASON_SYSTEM); updateActivatedModes(); updateArmingStatus(); @@ -834,7 +834,7 @@ TEST(ArmingPreventionTest, GPSRescueSwitchPreventsArm) rcData[AUX1] = 1000; // when - disarm(); + disarm(DISARM_REASON_SYSTEM); updateActivatedModes(); updateArmingStatus(); @@ -951,7 +951,7 @@ TEST(ArmingPreventionTest, Paralyze) rcData[AUX1] = 1000; // when - disarm(); + disarm(DISARM_REASON_SYSTEM); updateActivatedModes(); updateArmingStatus(); @@ -1098,4 +1098,5 @@ extern "C" { void compassStartCalibration(void) {} bool compassIsCalibrationComplete(void) { return true; } bool isUpright(void) { return mockIsUpright; } + void blackboxLogEvent(FlightLogEvent, union flightLogEventData_u *) {}; } diff --git a/src/test/unit/flight_failsafe_unittest.cc b/src/test/unit/flight_failsafe_unittest.cc index 25048af04f..fa6f43269b 100644 --- a/src/test/unit/flight_failsafe_unittest.cc +++ b/src/test/unit/flight_failsafe_unittest.cc @@ -35,6 +35,7 @@ extern "C" { #include "fc/runtime_config.h" #include "fc/rc_modes.h" #include "fc/rc_controls.h" + #include "fc/core.h" #include "flight/failsafe.h" @@ -571,7 +572,7 @@ bool featureIsEnabled(uint32_t mask) { return (mask & testFeatureMask); } -void disarm(void) { +void disarm(flightLogDisarmReason_e) { callCounts[COUNTER_MW_DISARM]++; } diff --git a/src/test/unit/pid_unittest.cc b/src/test/unit/pid_unittest.cc index 5e8b5dc25b..fd39b1fdf3 100644 --- a/src/test/unit/pid_unittest.cc +++ b/src/test/unit/pid_unittest.cc @@ -79,7 +79,7 @@ extern "C" { float getRcDeflection(int axis) { return simulatedRcDeflection[axis]; } void beeperConfirmationBeeps(uint8_t) { } bool isLaunchControlActive(void) {return unitLaunchControlActive; } - void disarm(void) { } + void disarm(flightLogDisarmReason_e) { } float applyFFLimit(int axis, float value, float Kp, float currentPidSetpoint) { UNUSED(axis); UNUSED(Kp); diff --git a/src/test/unit/rc_controls_unittest.cc b/src/test/unit/rc_controls_unittest.cc index 60f69b8f96..9de1e68342 100644 --- a/src/test/unit/rc_controls_unittest.cc +++ b/src/test/unit/rc_controls_unittest.cc @@ -620,7 +620,7 @@ void handleInflightCalibrationStickPosition(void) {} bool featureIsEnabled(uint32_t) { return false;} bool sensors(uint32_t) { return false;} void tryArm(void) {} -void disarm(void) {} +void disarm(flightLogDisarmReason_e) {} void dashboardDisablePageCycling() {} void dashboardEnablePageCycling() {} diff --git a/src/test/unit/vtx_unittest.cc b/src/test/unit/vtx_unittest.cc index eb6523080d..0e05316d0f 100644 --- a/src/test/unit/vtx_unittest.cc +++ b/src/test/unit/vtx_unittest.cc @@ -183,4 +183,5 @@ extern "C" { void compassStartCalibration(void) {} bool compassIsCalibrationComplete(void) { return true; } bool isUpright(void) { return true; } + void blackboxLogEvent(FlightLogEvent, union flightLogEventData_u *) {}; }