From 0996e5319f6015c0f4bcccb6cc1c39098d735cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Wed, 2 Nov 2022 09:32:24 +0100 Subject: [PATCH] commander: add preflight check for hardfault files on SD card --- .../checks/sdcardCheck.cpp | 89 ++++++++++++++----- .../checks/sdcardCheck.hpp | 8 +- src/modules/commander/commander_params.c | 11 +++ 3 files changed, 87 insertions(+), 21 deletions(-) diff --git a/src/modules/commander/HealthAndArmingChecks/checks/sdcardCheck.cpp b/src/modules/commander/HealthAndArmingChecks/checks/sdcardCheck.cpp index e056b80061..8be0c6961b 100644 --- a/src/modules/commander/HealthAndArmingChecks/checks/sdcardCheck.cpp +++ b/src/modules/commander/HealthAndArmingChecks/checks/sdcardCheck.cpp @@ -32,6 +32,8 @@ ****************************************************************************/ #include "sdcardCheck.hpp" +#include +#include #ifdef __PX4_DARWIN #include @@ -42,38 +44,85 @@ void SdCardChecks::checkAndReport(const Context &context, Report &reporter) { - if (_param_com_arm_sdcard.get() <= 0) { - return; - } + if (_param_com_arm_sdcard.get() > 0) { - struct statfs statfs_buf; + struct statfs statfs_buf; - if (!_sdcard_detected && statfs(PX4_STORAGEDIR, &statfs_buf) == 0) { - // on NuttX we get a data block count f_blocks and byte count per block f_bsize if an SD card is inserted - _sdcard_detected = (statfs_buf.f_blocks > 0) && (statfs_buf.f_bsize > 0); - } - - if (!_sdcard_detected) { - NavModes affected_modes{NavModes::None}; - - if (_param_com_arm_sdcard.get() == 2) { - // disallow arming without sd card - affected_modes = NavModes::All; + if (!_sdcard_detected && statfs(PX4_STORAGEDIR, &statfs_buf) == 0) { + // on NuttX we get a data block count f_blocks and byte count per block f_bsize if an SD card is inserted + _sdcard_detected = (statfs_buf.f_blocks > 0) && (statfs_buf.f_bsize > 0); } + if (!_sdcard_detected) { + NavModes affected_modes{NavModes::None}; + + if (_param_com_arm_sdcard.get() == 2) { + // disallow arming without sd card + affected_modes = NavModes::All; + } + + /* EVENT + * @description + * Insert an SD Card to the autopilot and reboot the system. + * + * + * This check can be configured via COM_ARM_SDCARD parameter. + * + */ + reporter.armingCheckFailure(affected_modes, health_component_t::system, + events::ID("check_missing_fmu_sdcard"), + events::Log::Error, "Missing FMU SD Card"); + + if (reporter.mavlink_log_pub()) { + mavlink_log_critical(reporter.mavlink_log_pub(), "Preflight Fail: Missing FMU SD Card"); + } + } + } + +#ifdef __PX4_NUTTX + // Check for hardfault files + + if (!_hardfault_checked_once && _param_com_arm_hardfault_check.get()) { + _hardfault_checked_once = true; + + DIR *dp = opendir(PX4_STORAGEDIR); + + if (dp != nullptr) { + + struct dirent *result; + + while ((result = readdir(dp)) && !_hardfault_file_present) { + + // Check for pattern fault_*.log + if (strncmp("fault_", result->d_name, 6) == 0 && strcmp(result->d_name + strlen(result->d_name) - 4, ".log") == 0) { + _hardfault_file_present = true; + } + } + + closedir(dp); + } + } + + if (_hardfault_file_present && _param_com_arm_hardfault_check.get()) { /* EVENT * @description - * Insert an SD Card to the autopilot and reboot the system. + * The SD card contains crash dump files, service the vehicle before continuing to fly. * * - * This check can be configured via COM_ARM_SDCARD parameter. + * Check how to debug hardfaults on https://docs.px4.io/main/en/debug/gdb_debugging.html#hard-fault-debugging. + * When completed, remove the files 'fault_*.log' on the SD card. + * + * This check can be configured via COM_ARM_HFLT_CHK parameter. * */ - reporter.armingCheckFailure(affected_modes, health_component_t::system, events::ID("check_missing_fmu_sdcard"), - events::Log::Error, "Missing FMU SD Card"); + reporter.healthFailure(NavModes::All, health_component_t::system, + events::ID("check_hardfault_present"), + events::Log::Error, "Crash dumps present on SD card"); if (reporter.mavlink_log_pub()) { - mavlink_log_critical(reporter.mavlink_log_pub(), "Preflight Fail: Missing FMU SD Card"); + mavlink_log_critical(reporter.mavlink_log_pub(), "Preflight Fail: Crash dumps present on SD, vehicle needs service"); } } + +#endif /* __PX4_NUTTX */ } diff --git a/src/modules/commander/HealthAndArmingChecks/checks/sdcardCheck.hpp b/src/modules/commander/HealthAndArmingChecks/checks/sdcardCheck.hpp index 6870f648ad..5f46a6ff38 100644 --- a/src/modules/commander/HealthAndArmingChecks/checks/sdcardCheck.hpp +++ b/src/modules/commander/HealthAndArmingChecks/checks/sdcardCheck.hpp @@ -46,7 +46,13 @@ public: private: bool _sdcard_detected{false}; +#ifdef __PX4_NUTTX + bool _hardfault_checked_once {false}; + bool _hardfault_file_present{false}; +#endif + DEFINE_PARAMETERS_CUSTOM_PARENT(HealthAndArmingCheckBase, - (ParamInt) _param_com_arm_sdcard + (ParamInt) _param_com_arm_sdcard, + (ParamBool) _param_com_arm_hardfault_check ) }; diff --git a/src/modules/commander/commander_params.c b/src/modules/commander/commander_params.c index 74a4e85b1f..3b779a7885 100644 --- a/src/modules/commander/commander_params.c +++ b/src/modules/commander/commander_params.c @@ -1010,6 +1010,17 @@ PARAM_DEFINE_INT32(COM_ARM_ARSP_EN, 1); */ PARAM_DEFINE_INT32(COM_ARM_SDCARD, 1); +/** + * Enable FMU SD card hardfault detection check + * + * This check detects if there are hardfault files present on the + * SD card. If so, and the parameter is enabled, arming is prevented. + * + * @group Commander + * @boolean + */ +PARAM_DEFINE_INT32(COM_ARM_HFLT_CHK, 1); + /** * Enforced delay between arming and further navigation *