diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a6ddc9d..3be10611 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,14 +20,16 @@ will consitute of a breaking change warranting a new major release: - Small SCEX fix: The temperatur check option was not passed on for commands with a user data size larger than 1. -- ACS Controller strategy is now actually written to the dataset for detumbling -- During detumble the fused rotation rate is now calculated -- Detumbling is now exited when its exit value is undercut and not its entry value +- SCEX: Properly check whether filesystem is usable for filesystem checks. +- ACS Controller strategy is now actually written to the dataset for detumbling. +- During detumble the fused rotation rate is now calculated. +- Detumbling is now exited when its exit value is undercut and not its entry value. - `EiveSystem`: Add a small delay between triggering an event for FDIR reboots and sending the command to the core controller. ## Changed +- SCEX: Only perform filesystem checks when not in OFF mode. - The `EiveSystem` now only sends reboot commands targetting the same image. - Added 200 ms delay between switching HPA/MPA/TX/X8 and DRO GPIP pin OFF. - PL PCDU ADC set is now automatically enabled for `NORMAL` mode transitions. It is automatically @@ -37,6 +39,10 @@ will consitute of a breaking change warranting a new major release: - PL PCDU for EM build. +## Added + +- SCEX: Add warning event if filesystem is unusable. + # [v6.2.0] 2023-07-26 - `eive-tmtc`: v5.3.1 diff --git a/bsp_hosted/fsfwconfig/events/translateEvents.cpp b/bsp_hosted/fsfwconfig/events/translateEvents.cpp index 2899592d..3a53a4fb 100644 --- a/bsp_hosted/fsfwconfig/events/translateEvents.cpp +++ b/bsp_hosted/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 301 translations. + * @brief Auto-generated event translation file. Contains 302 translations. * @details - * Generated on: 2023-07-26 12:51:20 + * Generated on: 2023-08-02 09:40:31 */ #include "translateEvents.h" @@ -261,6 +261,7 @@ const char *TX_OFF_STRING = "TX_OFF"; const char *MISSING_PACKET_STRING = "MISSING_PACKET"; const char *EXPERIMENT_TIMEDOUT_STRING = "EXPERIMENT_TIMEDOUT"; const char *MULTI_PACKET_COMMAND_DONE_STRING = "MULTI_PACKET_COMMAND_DONE"; +const char *FS_UNUSABLE_STRING = "FS_UNUSABLE"; const char *SET_CONFIGFILEVALUE_FAILED_STRING = "SET_CONFIGFILEVALUE_FAILED"; const char *GET_CONFIGFILEVALUE_FAILED_STRING = "GET_CONFIGFILEVALUE_FAILED"; const char *INSERT_CONFIGFILEVALUE_FAILED_STRING = "INSERT_CONFIGFILEVALUE_FAILED"; @@ -821,6 +822,8 @@ const char *translateEvents(Event event) { return EXPERIMENT_TIMEDOUT_STRING; case (13802): return MULTI_PACKET_COMMAND_DONE_STRING; + case (13803): + return FS_UNUSABLE_STRING; case (13901): return SET_CONFIGFILEVALUE_FAILED_STRING; case (13902): diff --git a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp index a0002c24..8a6f23a0 100644 --- a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp +++ b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 171 translations. - * Generated on: 2023-07-26 12:51:20 + * Generated on: 2023-08-02 09:40:31 */ #include "translateObjects.h" diff --git a/generators/bsp_hosted_events.csv b/generators/bsp_hosted_events.csv index 0cb9ba70..1c6f646d 100644 --- a/generators/bsp_hosted_events.csv +++ b/generators/bsp_hosted_events.csv @@ -255,6 +255,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 13800;0x35e8;MISSING_PACKET;LOW;No description;mission/payload/scexHelpers.h 13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;No description;mission/payload/scexHelpers.h 13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;No description;mission/payload/scexHelpers.h +13803;0x35eb;FS_UNUSABLE;LOW;No description;mission/payload/scexHelpers.h 13901;0x364d;SET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13902;0x364e;GET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index 0cb9ba70..1c6f646d 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -255,6 +255,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 13800;0x35e8;MISSING_PACKET;LOW;No description;mission/payload/scexHelpers.h 13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;No description;mission/payload/scexHelpers.h 13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;No description;mission/payload/scexHelpers.h +13803;0x35eb;FS_UNUSABLE;LOW;No description;mission/payload/scexHelpers.h 13901;0x364d;SET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13902;0x364e;GET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index 2899592d..3a53a4fb 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 301 translations. + * @brief Auto-generated event translation file. Contains 302 translations. * @details - * Generated on: 2023-07-26 12:51:20 + * Generated on: 2023-08-02 09:40:31 */ #include "translateEvents.h" @@ -261,6 +261,7 @@ const char *TX_OFF_STRING = "TX_OFF"; const char *MISSING_PACKET_STRING = "MISSING_PACKET"; const char *EXPERIMENT_TIMEDOUT_STRING = "EXPERIMENT_TIMEDOUT"; const char *MULTI_PACKET_COMMAND_DONE_STRING = "MULTI_PACKET_COMMAND_DONE"; +const char *FS_UNUSABLE_STRING = "FS_UNUSABLE"; const char *SET_CONFIGFILEVALUE_FAILED_STRING = "SET_CONFIGFILEVALUE_FAILED"; const char *GET_CONFIGFILEVALUE_FAILED_STRING = "GET_CONFIGFILEVALUE_FAILED"; const char *INSERT_CONFIGFILEVALUE_FAILED_STRING = "INSERT_CONFIGFILEVALUE_FAILED"; @@ -821,6 +822,8 @@ const char *translateEvents(Event event) { return EXPERIMENT_TIMEDOUT_STRING; case (13802): return MULTI_PACKET_COMMAND_DONE_STRING; + case (13803): + return FS_UNUSABLE_STRING; case (13901): return SET_CONFIGFILEVALUE_FAILED_STRING; case (13902): diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index fef8fb71..f4779490 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 175 translations. - * Generated on: 2023-07-26 12:51:20 + * Generated on: 2023-08-02 09:40:31 */ #include "translateObjects.h" diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index 2899592d..3a53a4fb 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 301 translations. + * @brief Auto-generated event translation file. Contains 302 translations. * @details - * Generated on: 2023-07-26 12:51:20 + * Generated on: 2023-08-02 09:40:31 */ #include "translateEvents.h" @@ -261,6 +261,7 @@ const char *TX_OFF_STRING = "TX_OFF"; const char *MISSING_PACKET_STRING = "MISSING_PACKET"; const char *EXPERIMENT_TIMEDOUT_STRING = "EXPERIMENT_TIMEDOUT"; const char *MULTI_PACKET_COMMAND_DONE_STRING = "MULTI_PACKET_COMMAND_DONE"; +const char *FS_UNUSABLE_STRING = "FS_UNUSABLE"; const char *SET_CONFIGFILEVALUE_FAILED_STRING = "SET_CONFIGFILEVALUE_FAILED"; const char *GET_CONFIGFILEVALUE_FAILED_STRING = "GET_CONFIGFILEVALUE_FAILED"; const char *INSERT_CONFIGFILEVALUE_FAILED_STRING = "INSERT_CONFIGFILEVALUE_FAILED"; @@ -821,6 +822,8 @@ const char *translateEvents(Event event) { return EXPERIMENT_TIMEDOUT_STRING; case (13802): return MULTI_PACKET_COMMAND_DONE_STRING; + case (13803): + return FS_UNUSABLE_STRING; case (13901): return SET_CONFIGFILEVALUE_FAILED_STRING; case (13902): diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index fef8fb71..f4779490 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 175 translations. - * Generated on: 2023-07-26 12:51:20 + * Generated on: 2023-08-02 09:40:31 */ #include "translateObjects.h" diff --git a/mission/payload/ScexDeviceHandler.cpp b/mission/payload/ScexDeviceHandler.cpp index f44aa78b..12c62f7a 100644 --- a/mission/payload/ScexDeviceHandler.cpp +++ b/mission/payload/ScexDeviceHandler.cpp @@ -19,11 +19,16 @@ using namespace returnvalue; ScexDeviceHandler::ScexDeviceHandler(object_id_t objectId, ScexUartReader& reader, CookieIF* cookie, SdCardMountedIF& sdcMan) - : DeviceHandlerBase(objectId, reader.getObjectId(), cookie), sdcMan(sdcMan), reader(reader) {} + : DeviceHandlerBase(objectId, reader.getObjectId(), cookie), sdcMan(sdcMan), reader(reader) { + fsUnusableEventCd.timeOut(); +} ScexDeviceHandler::~ScexDeviceHandler() {} -void ScexDeviceHandler::doStartUp() { setMode(MODE_ON); } +void ScexDeviceHandler::doStartUp() { + filesystemChecks(); + setMode(MODE_ON); +} void ScexDeviceHandler::doShutDown() { reader.reset(); @@ -215,8 +220,12 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons } fileNameSet = true; } else { - ofstream out(fileName, - ofstream::binary | ofstream::app); // append + if (!sdcMan.isSdCardUsable(std::nullopt)) { + fsUnsableEvent(); + return returnvalue::FAILED; + } + // Append to existing file. + ofstream out(fileName, ofstream::binary | ofstream::app); if (out.bad()) { sif::error << "ScexDeviceHandler::handleValidReply: Could not open file " << fileName << std::endl; @@ -280,18 +289,8 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons } void ScexDeviceHandler::performOperationHook() { - auto mntPrefix = sdcMan.getCurrentMountPrefix(); - if (mntPrefix != nullptr) { - std::filesystem::path fullFilePath = mntPrefix; - std::error_code e; - fullFilePath /= "scex"; - bool fileExists = std::filesystem::exists(fullFilePath, e); - if (not fileExists) { - bool created = std::filesystem::create_directory(fullFilePath, e); - if (not created) { - sif::error << "Could not create SCEX directory: " << e << std::endl; - } - } + if (getMode() != MODE_OFF) { + filesystemChecks(); } uint32_t remainingMillis = finishCountdown.getRemainingMillis(); if (commandActive and finishCountdown.hasTimedOut()) { @@ -319,6 +318,33 @@ ReturnValue_t ScexDeviceHandler::initializeLocalDataPool(localpool::DataPool& lo return OK; } +void ScexDeviceHandler::filesystemChecks() { + auto mntPrefix = sdcMan.getCurrentMountPrefix(); + if (mntPrefix == nullptr or !sdcMan.isSdCardUsable(std::nullopt)) { + sif::warning << "SCEX: Filesystem currently unavailable" << std::endl; + fsUnsableEvent(); + } else { + std::filesystem::path fullFilePath = mntPrefix; + std::error_code e; + fullFilePath /= "scex"; + bool fileExists = std::filesystem::exists(fullFilePath, e); + if (not fileExists) { + bool created = std::filesystem::create_directory(fullFilePath, e); + if (not created) { + sif::error << "Could not create SCEX directory: " << e << std::endl; + } + } + } +} + +void ScexDeviceHandler::fsUnsableEvent() { + if (fsUnusableEventCd.isBusy()) { + return; + } + triggerEvent(scex::FS_UNUSABLE); + fsUnusableEventCd.resetTimer(); +} + ReturnValue_t ScexDeviceHandler::generateNewScexFile(const char* cmdName) { char timeString[64]{}; auto activeSd = sdcMan.getActiveSdCard(); @@ -328,7 +354,8 @@ ReturnValue_t ScexDeviceHandler::generateNewScexFile(const char* cmdName) { std::ostringstream oss; auto prefix = sdcMan.getCurrentMountPrefix(); - if (prefix == nullptr) { + if (prefix == nullptr or !sdcMan.isSdCardUsable(std::nullopt)) { + fsUnsableEvent(); return returnvalue::FAILED; } timeval tv; diff --git a/mission/payload/ScexDeviceHandler.h b/mission/payload/ScexDeviceHandler.h index e7721ef6..ecde12a5 100644 --- a/mission/payload/ScexDeviceHandler.h +++ b/mission/payload/ScexDeviceHandler.h @@ -42,6 +42,7 @@ class ScexDeviceHandler : public DeviceHandlerBase { scex::Cmds currCmd = scex::Cmds::PING; SdCardMountedIF &sdcMan; Countdown finishCountdown = Countdown(LONG_CD); + Countdown fsUnusableEventCd = Countdown(10000); // DeviceHandlerBase private function implementation void doStartUp() override; @@ -49,12 +50,15 @@ class ScexDeviceHandler : public DeviceHandlerBase { ScexHelper helper; ScexUartReader &reader; + void fsUnsableEvent(); + void performOperationHook() override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override; ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t *id) override; ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t *commandData, size_t commandDataLen) override; void fillCommandAndReplyMap() override; + void filesystemChecks(); ReturnValue_t scanForReply(const uint8_t *start, size_t remainingSize, DeviceCommandId_t *foundId, size_t *foundLen) override; ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) override; diff --git a/mission/payload/scexHelpers.h b/mission/payload/scexHelpers.h index aa0f320b..06a8bb07 100644 --- a/mission/payload/scexHelpers.h +++ b/mission/payload/scexHelpers.h @@ -20,6 +20,7 @@ static constexpr Event EXPERIMENT_TIMEDOUT = event::makeEvent(SUBSYSTEM_ID, 1, s //! FRAM, One Cell or All cells command finished. P1: Command ID static constexpr Event MULTI_PACKET_COMMAND_DONE = event::makeEvent(SUBSYSTEM_ID, 2, severity::INFO); +static constexpr Event FS_UNUSABLE = event::makeEvent(SUBSYSTEM_ID, 3, severity::LOW); enum Cmds : DeviceCommandId_t { PING = 0b00111,