|
|
|
@ -37,7 +37,7 @@ void Sub::mainloop_failsafe_check()
@@ -37,7 +37,7 @@ void Sub::mainloop_failsafe_check()
|
|
|
|
|
failsafe_last_timestamp = tnow; |
|
|
|
|
if (in_failsafe) { |
|
|
|
|
in_failsafe = false; |
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_CPU,ERROR_CODE_FAILSAFE_RESOLVED); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::CPU,LogErrorCode::FAILSAFE_RESOLVED); |
|
|
|
|
} |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
@ -52,7 +52,7 @@ void Sub::mainloop_failsafe_check()
@@ -52,7 +52,7 @@ void Sub::mainloop_failsafe_check()
|
|
|
|
|
motors.output_min(); |
|
|
|
|
} |
|
|
|
|
// log an error
|
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_CPU,ERROR_CODE_FAILSAFE_OCCURRED); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::CPU,LogErrorCode::FAILSAFE_OCCURRED); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (failsafe_enabled && in_failsafe && tnow - failsafe_last_timestamp > 1000000) { |
|
|
|
@ -84,7 +84,7 @@ void Sub::failsafe_sensors_check()
@@ -84,7 +84,7 @@ void Sub::failsafe_sensors_check()
|
|
|
|
|
|
|
|
|
|
failsafe.sensor_health = true; |
|
|
|
|
gcs().send_text(MAV_SEVERITY_CRITICAL, "Depth sensor error!"); |
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_FAILSAFE_SENSORS, ERROR_CODE_BAD_DEPTH); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::FAILSAFE_SENSORS, LogErrorCode::BAD_DEPTH); |
|
|
|
|
|
|
|
|
|
if (control_mode == ALT_HOLD || control_mode == SURFACE || mode_requires_GPS(control_mode)) { |
|
|
|
|
// This should always succeed
|
|
|
|
@ -136,7 +136,7 @@ void Sub::failsafe_ekf_check()
@@ -136,7 +136,7 @@ void Sub::failsafe_ekf_check()
|
|
|
|
|
failsafe.ekf = true; |
|
|
|
|
AP_Notify::flags.ekf_bad = true; |
|
|
|
|
|
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_EKFCHECK, ERROR_CODE_EKFCHECK_BAD_VARIANCE); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::EKFCHECK, LogErrorCode::EKFCHECK_BAD_VARIANCE); |
|
|
|
|
|
|
|
|
|
if (AP_HAL::millis() > failsafe.last_ekf_warn_ms + 20000) { |
|
|
|
|
failsafe.last_ekf_warn_ms = AP_HAL::millis(); |
|
|
|
@ -151,7 +151,7 @@ void Sub::failsafe_ekf_check()
@@ -151,7 +151,7 @@ void Sub::failsafe_ekf_check()
|
|
|
|
|
// Battery failsafe handler
|
|
|
|
|
void Sub::handle_battery_failsafe(const char* type_str, const int8_t action) |
|
|
|
|
{ |
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_FAILSAFE_BATT, ERROR_CODE_FAILSAFE_OCCURRED); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::FAILSAFE_BATT, LogErrorCode::FAILSAFE_OCCURRED); |
|
|
|
|
|
|
|
|
|
switch((Failsafe_Action)action) { |
|
|
|
|
case Failsafe_Action_Surface: |
|
|
|
@ -186,7 +186,7 @@ void Sub::failsafe_pilot_input_check()
@@ -186,7 +186,7 @@ void Sub::failsafe_pilot_input_check()
|
|
|
|
|
|
|
|
|
|
failsafe.pilot_input = true; |
|
|
|
|
|
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_INPUT, ERROR_CODE_FAILSAFE_OCCURRED); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::PILOT_INPUT, LogErrorCode::FAILSAFE_OCCURRED); |
|
|
|
|
gcs().send_text(MAV_SEVERITY_CRITICAL, "Lost manual control"); |
|
|
|
|
|
|
|
|
|
set_neutral_controls(); |
|
|
|
@ -269,7 +269,7 @@ void Sub::failsafe_leak_check()
@@ -269,7 +269,7 @@ void Sub::failsafe_leak_check()
|
|
|
|
|
// Do nothing if we are dry, or if leak failsafe action is disabled
|
|
|
|
|
if (status == false || g.failsafe_leak == FS_LEAK_DISABLED) { |
|
|
|
|
if (failsafe.leak) { |
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_FAILSAFE_LEAK, ERROR_CODE_FAILSAFE_RESOLVED); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::FAILSAFE_LEAK, LogErrorCode::FAILSAFE_RESOLVED); |
|
|
|
|
} |
|
|
|
|
AP_Notify::flags.leak_detected = false; |
|
|
|
|
failsafe.leak = false; |
|
|
|
@ -294,7 +294,7 @@ void Sub::failsafe_leak_check()
@@ -294,7 +294,7 @@ void Sub::failsafe_leak_check()
|
|
|
|
|
|
|
|
|
|
failsafe.leak = true; |
|
|
|
|
|
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_FAILSAFE_LEAK, ERROR_CODE_FAILSAFE_OCCURRED); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::FAILSAFE_LEAK, LogErrorCode::FAILSAFE_OCCURRED); |
|
|
|
|
|
|
|
|
|
// Handle failsafe action
|
|
|
|
|
if (failsafe.leak && g.failsafe_leak == FS_LEAK_SURFACE && motors.armed()) { |
|
|
|
@ -317,7 +317,7 @@ void Sub::failsafe_gcs_check()
@@ -317,7 +317,7 @@ void Sub::failsafe_gcs_check()
|
|
|
|
|
if (tnow - failsafe.last_heartbeat_ms < FS_GCS_TIMEOUT_MS) { |
|
|
|
|
// Log event if we are recovering from previous gcs failsafe
|
|
|
|
|
if (failsafe.gcs) { |
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_FAILSAFE_GCS, ERROR_CODE_FAILSAFE_RESOLVED); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::FAILSAFE_GCS, LogErrorCode::FAILSAFE_RESOLVED); |
|
|
|
|
} |
|
|
|
|
failsafe.gcs = false; |
|
|
|
|
return; |
|
|
|
@ -340,7 +340,7 @@ void Sub::failsafe_gcs_check()
@@ -340,7 +340,7 @@ void Sub::failsafe_gcs_check()
|
|
|
|
|
|
|
|
|
|
// update state, log to dataflash
|
|
|
|
|
failsafe.gcs = true; |
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_FAILSAFE_GCS, ERROR_CODE_FAILSAFE_OCCURRED); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::FAILSAFE_GCS, LogErrorCode::FAILSAFE_OCCURRED); |
|
|
|
|
|
|
|
|
|
// handle failsafe action
|
|
|
|
|
if (g.failsafe_gcs == FS_GCS_DISARM) { |
|
|
|
@ -407,7 +407,7 @@ void Sub::failsafe_crash_check()
@@ -407,7 +407,7 @@ void Sub::failsafe_crash_check()
|
|
|
|
|
|
|
|
|
|
failsafe.crash = true; |
|
|
|
|
// log an error in the dataflash
|
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_CRASH_CHECK, ERROR_CODE_CRASH_CHECK_CRASH); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::CRASH_CHECK, LogErrorCode::CRASH_CHECK_CRASH); |
|
|
|
|
|
|
|
|
|
// disarm motors
|
|
|
|
|
if (g.fs_crash_check == FS_CRASH_DISARM) { |
|
|
|
@ -430,7 +430,7 @@ void Sub::failsafe_terrain_check()
@@ -430,7 +430,7 @@ void Sub::failsafe_terrain_check()
|
|
|
|
|
gcs().send_text(MAV_SEVERITY_CRITICAL,"Failsafe terrain triggered"); |
|
|
|
|
failsafe_terrain_on_event(); |
|
|
|
|
} else { |
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_FAILSAFE_TERRAIN, ERROR_CODE_ERROR_RESOLVED); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::FAILSAFE_TERRAIN, LogErrorCode::ERROR_RESOLVED); |
|
|
|
|
failsafe.terrain = false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -462,7 +462,7 @@ void Sub::failsafe_terrain_set_status(bool data_ok)
@@ -462,7 +462,7 @@ void Sub::failsafe_terrain_set_status(bool data_ok)
|
|
|
|
|
void Sub::failsafe_terrain_on_event() |
|
|
|
|
{ |
|
|
|
|
failsafe.terrain = true; |
|
|
|
|
Log_Write_Error(ERROR_SUBSYSTEM_FAILSAFE_TERRAIN, ERROR_CODE_FAILSAFE_OCCURRED); |
|
|
|
|
AP::logger().Write_Error(LogErrorSubsystem::FAILSAFE_TERRAIN, LogErrorCode::FAILSAFE_OCCURRED); |
|
|
|
|
|
|
|
|
|
// If rangefinder is enabled, we can recover from this failsafe
|
|
|
|
|
if (!rangefinder_state.enabled || !auto_terrain_recover_start()) { |
|
|
|
|