From f9af1bbe2dc0e651c0102ece10368244ac1c88e0 Mon Sep 17 00:00:00 2001 From: Michael Schaeuble Date: Mon, 29 Mar 2021 13:20:06 +0200 Subject: [PATCH] PreFlightCheck: Check if SD card is present only once and store the result statfs accesses the file-system and can be blocking for an extended period. Since the SD card check is part of the preflight checks in the main thread of commander, it could block its execution and cause various issues. The SD card is only mounted in rcS during boot so the state will not change after the first check. --- msg/vehicle_status_flags.msg | 1 + .../commander/Arming/PreFlightCheck/PreFlightCheck.cpp | 2 +- .../commander/Arming/PreFlightCheck/PreFlightCheck.hpp | 2 +- .../Arming/PreFlightCheck/checks/sdcardCheck.cpp | 10 +++++----- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/msg/vehicle_status_flags.msg b/msg/vehicle_status_flags.msg index 782a46e01e..af9ca66099 100644 --- a/msg/vehicle_status_flags.msg +++ b/msg/vehicle_status_flags.msg @@ -34,6 +34,7 @@ bool rc_input_blocked # set if RC input should be bool rc_calibration_valid # set if RC calibration is valid bool vtol_transition_failure # Set to true if vtol transition failed bool usb_connected # status of the USB power supply +bool sd_card_detected_once # set to true if the SD card was detected bool avoidance_system_required # Set to true if avoidance system is enabled via COM_OBS_AVOID parameter bool avoidance_system_valid # Status of the obstacle avoidance system diff --git a/src/modules/commander/Arming/PreFlightCheck/PreFlightCheck.cpp b/src/modules/commander/Arming/PreFlightCheck/PreFlightCheck.cpp index 027782b269..830210f6df 100644 --- a/src/modules/commander/Arming/PreFlightCheck/PreFlightCheck.cpp +++ b/src/modules/commander/Arming/PreFlightCheck/PreFlightCheck.cpp @@ -64,7 +64,7 @@ bool PreFlightCheck::preflightCheck(orb_advert_t *mavlink_log_pub, vehicle_statu bool failed = false; failed = failed || !airframeCheck(mavlink_log_pub, status); - failed = failed || !sdcardCheck(mavlink_log_pub, report_failures); + failed = failed || !sdcardCheck(mavlink_log_pub, status_flags.sd_card_detected_once, report_failures); /* ---- MAG ---- */ { diff --git a/src/modules/commander/Arming/PreFlightCheck/PreFlightCheck.hpp b/src/modules/commander/Arming/PreFlightCheck/PreFlightCheck.hpp index f7df78d659..5fb1b6647f 100644 --- a/src/modules/commander/Arming/PreFlightCheck/PreFlightCheck.hpp +++ b/src/modules/commander/Arming/PreFlightCheck/PreFlightCheck.hpp @@ -119,5 +119,5 @@ private: static bool manualControlCheck(orb_advert_t *mavlink_log_pub, const bool report_fail); static bool airframeCheck(orb_advert_t *mavlink_log_pub, const vehicle_status_s &status); static bool cpuResourceCheck(orb_advert_t *mavlink_log_pub, const bool report_fail); - static bool sdcardCheck(orb_advert_t *mavlink_log_pub, const bool report_fail); + static bool sdcardCheck(orb_advert_t *mavlink_log_pub, bool &sd_card_detected_once, const bool report_fail); }; diff --git a/src/modules/commander/Arming/PreFlightCheck/checks/sdcardCheck.cpp b/src/modules/commander/Arming/PreFlightCheck/checks/sdcardCheck.cpp index 14ae7805c9..bfcd4d5d34 100644 --- a/src/modules/commander/Arming/PreFlightCheck/checks/sdcardCheck.cpp +++ b/src/modules/commander/Arming/PreFlightCheck/checks/sdcardCheck.cpp @@ -42,7 +42,8 @@ #include #endif -bool PreFlightCheck::sdcardCheck(orb_advert_t *mavlink_log_pub, const bool report_fail) +bool PreFlightCheck::sdcardCheck(orb_advert_t *mavlink_log_pub, bool &sd_card_detected_once, + const bool report_fail) { bool success = true; @@ -50,15 +51,14 @@ bool PreFlightCheck::sdcardCheck(orb_advert_t *mavlink_log_pub, const bool repor param_get(param_find("COM_ARM_SDCARD"), ¶m_com_arm_sdcard); if (param_com_arm_sdcard > 0) { - bool sdcard_present{false}; struct statfs statfs_buf; - if (statfs(PX4_STORAGEDIR, &statfs_buf) == 0) { + if (!sd_card_detected_once && 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_present = (statfs_buf.f_blocks > 0) && (statfs_buf.f_bsize > 0); + sd_card_detected_once = (statfs_buf.f_blocks > 0) && (statfs_buf.f_bsize > 0); } - if (!sdcard_present) { + if (!sd_card_detected_once) { if (report_fail) { mavlink_log_critical(mavlink_log_pub, "Warning! Missing FMU SD Card."); }