diff --git a/CHANGELOG.md b/CHANGELOG.md index 84b6332d..09c74342 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,11 +25,18 @@ will consitute of a breaking change warranting a new major release: - Host build fixes +# [v6.5.0] 2023-09-12 + ## Changed +- Relaxed SUS FDIR. The devices have shown to be glitchy in orbit, but still seem to deliver + sensible raw values most of the time. Some further testing is necessary, but some changes in the + code should cause the SUS devices to remain healthy for now. - The primary and the secondary temperature sensors for the PLOC mission boards are exchanged. - ACS parameters for the SUSMGM (FLP) safe mode have been adjusted. This safe mode is now the default one. +- MGM3100 Startup Configuration: Ignore bit 1 of the CMM reply, which is sometimes set to + 1 in the reply for some reason. # [v6.4.1] 2023-08-21 diff --git a/CMakeLists.txt b/CMakeLists.txt index ff115a2c..ba4289c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ cmake_minimum_required(VERSION 3.13) set(OBSW_VERSION_MAJOR 6) -set(OBSW_VERSION_MINOR 4) +set(OBSW_VERSION_MINOR 5) set(OBSW_VERSION_REVISION 1) # set(CMAKE_VERBOSE TRUE) diff --git a/bsp_hosted/fsfwconfig/events/translateEvents.cpp b/bsp_hosted/fsfwconfig/events/translateEvents.cpp index bb81766a..e77f6162 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 305 translations. + * @brief Auto-generated event translation file. Contains 307 translations. * @details - * Generated on: 2023-09-07 16:12:51 + * Generated on: 2023-09-12 10:51:47 */ #include "translateEvents.h" @@ -310,6 +310,8 @@ const char *DUMP_NOK_CANCELLED_STRING = "DUMP_NOK_CANCELLED"; const char *DUMP_MISC_CANCELLED_STRING = "DUMP_MISC_CANCELLED"; const char *DUMP_HK_CANCELLED_STRING = "DUMP_HK_CANCELLED"; const char *DUMP_CFDP_CANCELLED_STRING = "DUMP_CFDP_CANCELLED"; +const char *TEMPERATURE_ALL_ONES_START_STRING = "TEMPERATURE_ALL_ONES_START"; +const char *TEMPERATURE_ALL_ONES_RECOVERY_STRING = "TEMPERATURE_ALL_ONES_RECOVERY"; const char *translateEvents(Event event) { switch ((event & 0xFFFF)) { @@ -923,6 +925,10 @@ const char *translateEvents(Event event) { return DUMP_HK_CANCELLED_STRING; case (14314): return DUMP_CFDP_CANCELLED_STRING; + case (14500): + return TEMPERATURE_ALL_ONES_START_STRING; + case (14501): + return TEMPERATURE_ALL_ONES_RECOVERY_STRING; default: return "UNKNOWN_EVENT"; } diff --git a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp index 8454b2ad..460dc4e7 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-09-07 16:12:51 + * Generated on: 2023-09-12 10:51:47 */ #include "translateObjects.h" diff --git a/common/config/eive/eventSubsystemIds.h b/common/config/eive/eventSubsystemIds.h index 624cd317..84ac42d5 100644 --- a/common/config/eive/eventSubsystemIds.h +++ b/common/config/eive/eventSubsystemIds.h @@ -40,6 +40,7 @@ enum : uint8_t { COM_SUBSYSTEM = 142, PERSISTENT_TM_STORE = 143, SYRLINKS_COM = 144, + SUS_HANDLER = 145, COMMON_SUBSYSTEM_ID_END }; diff --git a/generators/bsp_hosted_events.csv b/generators/bsp_hosted_events.csv index 9ac8e0b8..17669683 100644 --- a/generators/bsp_hosted_events.csv +++ b/generators/bsp_hosted_events.csv @@ -304,3 +304,5 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 14312;0x37e8;DUMP_MISC_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14313;0x37e9;DUMP_HK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14314;0x37ea;DUMP_CFDP_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14500;0x38a4;TEMPERATURE_ALL_ONES_START;MEDIUM;Detected invalid values, starting invalid message counting;mission/acs/SusHandler.h +14501;0x38a5;TEMPERATURE_ALL_ONES_RECOVERY;INFO;Detected valid values again, resetting invalid message counter. P1: Invalid message counter.;mission/acs/SusHandler.h diff --git a/generators/bsp_hosted_subsystems.csv b/generators/bsp_hosted_subsystems.csv index 83d9bdbc..c9c90629 100644 --- a/generators/bsp_hosted_subsystems.csv +++ b/generators/bsp_hosted_subsystems.csv @@ -60,3 +60,4 @@ 142;COM_SUBSYSTEM 143;PERSISTENT_TM_STORE 144;SYRLINKS_COM +145;SUS_HANDLER diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index 9ac8e0b8..17669683 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -304,3 +304,5 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 14312;0x37e8;DUMP_MISC_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14313;0x37e9;DUMP_HK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14314;0x37ea;DUMP_CFDP_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14500;0x38a4;TEMPERATURE_ALL_ONES_START;MEDIUM;Detected invalid values, starting invalid message counting;mission/acs/SusHandler.h +14501;0x38a5;TEMPERATURE_ALL_ONES_RECOVERY;INFO;Detected valid values again, resetting invalid message counter. P1: Invalid message counter.;mission/acs/SusHandler.h diff --git a/generators/bsp_q7s_subsystems.csv b/generators/bsp_q7s_subsystems.csv index 83d9bdbc..c9c90629 100644 --- a/generators/bsp_q7s_subsystems.csv +++ b/generators/bsp_q7s_subsystems.csv @@ -60,3 +60,4 @@ 142;COM_SUBSYSTEM 143;PERSISTENT_TM_STORE 144;SYRLINKS_COM +145;SUS_HANDLER diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index bb81766a..e77f6162 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 305 translations. + * @brief Auto-generated event translation file. Contains 307 translations. * @details - * Generated on: 2023-09-07 16:12:51 + * Generated on: 2023-09-12 10:51:47 */ #include "translateEvents.h" @@ -310,6 +310,8 @@ const char *DUMP_NOK_CANCELLED_STRING = "DUMP_NOK_CANCELLED"; const char *DUMP_MISC_CANCELLED_STRING = "DUMP_MISC_CANCELLED"; const char *DUMP_HK_CANCELLED_STRING = "DUMP_HK_CANCELLED"; const char *DUMP_CFDP_CANCELLED_STRING = "DUMP_CFDP_CANCELLED"; +const char *TEMPERATURE_ALL_ONES_START_STRING = "TEMPERATURE_ALL_ONES_START"; +const char *TEMPERATURE_ALL_ONES_RECOVERY_STRING = "TEMPERATURE_ALL_ONES_RECOVERY"; const char *translateEvents(Event event) { switch ((event & 0xFFFF)) { @@ -923,6 +925,10 @@ const char *translateEvents(Event event) { return DUMP_HK_CANCELLED_STRING; case (14314): return DUMP_CFDP_CANCELLED_STRING; + case (14500): + return TEMPERATURE_ALL_ONES_START_STRING; + case (14501): + return TEMPERATURE_ALL_ONES_RECOVERY_STRING; default: return "UNKNOWN_EVENT"; } diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index a9a5a786..e032a545 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-09-07 16:12:51 + * Generated on: 2023-09-12 10:51:47 */ #include "translateObjects.h" diff --git a/linux/acs/AcsBoardPolling.cpp b/linux/acs/AcsBoardPolling.cpp index 1ba55357..6919907a 100644 --- a/linux/acs/AcsBoardPolling.cpp +++ b/linux/acs/AcsBoardPolling.cpp @@ -767,6 +767,9 @@ void AcsBoardPolling::mgmRm3100Handler(MgmRm3100& mgm) { mgm.replyResult = result; return; } + // For some reason, bit 1 is sometimes set on the reply, even if it is not set for the + // command.. Ignore it for now by clearing it. + rawReply[1] &= ~(1 << 1); if (rawReply[1] != mgmRm3100::CMM_VALUE) { sif::error << "AcsBoardPolling: MGM RM3100 read back CMM invalid" << std::endl; mgm.replyResult = result; diff --git a/linux/acs/SusPolling.cpp b/linux/acs/SusPolling.cpp index 2ef02f43..a285d26d 100644 --- a/linux/acs/SusPolling.cpp +++ b/linux/acs/SusPolling.cpp @@ -170,18 +170,12 @@ ReturnValue_t SusPolling::handleSusPolling() { } MutexGuard mg(ipcLock); susDevs[idx].ownReply.tempRaw = ((rawReply[0] & 0x0f) << 8) | rawReply[1]; - // Reply is all ones. Sensor is probably off or faulty when - // it should not be. - if (susDevs[idx].ownReply.tempRaw == 0x0fff) { - susDevs[idx].replyResult = returnvalue::FAILED; - } else { - susDevs[idx].replyResult = returnvalue::OK; - for (unsigned chIdx = 0; chIdx < 6; chIdx++) { - susDevs[idx].ownReply.channelsRaw[chIdx] = - (rawReply[chIdx * 2 + 2] << 8) | rawReply[chIdx * 2 + 3]; - } - susDevs[idx].ownReply.dataWasSet = true; + susDevs[idx].replyResult = returnvalue::OK; + for (unsigned chIdx = 0; chIdx < 6; chIdx++) { + susDevs[idx].ownReply.channelsRaw[chIdx] = + (rawReply[chIdx * 2 + 2] << 8) | rawReply[chIdx * 2 + 3]; } + susDevs[idx].ownReply.dataWasSet = true; } } return OK; diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index bb81766a..e77f6162 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 305 translations. + * @brief Auto-generated event translation file. Contains 307 translations. * @details - * Generated on: 2023-09-07 16:12:51 + * Generated on: 2023-09-12 10:51:47 */ #include "translateEvents.h" @@ -310,6 +310,8 @@ const char *DUMP_NOK_CANCELLED_STRING = "DUMP_NOK_CANCELLED"; const char *DUMP_MISC_CANCELLED_STRING = "DUMP_MISC_CANCELLED"; const char *DUMP_HK_CANCELLED_STRING = "DUMP_HK_CANCELLED"; const char *DUMP_CFDP_CANCELLED_STRING = "DUMP_CFDP_CANCELLED"; +const char *TEMPERATURE_ALL_ONES_START_STRING = "TEMPERATURE_ALL_ONES_START"; +const char *TEMPERATURE_ALL_ONES_RECOVERY_STRING = "TEMPERATURE_ALL_ONES_RECOVERY"; const char *translateEvents(Event event) { switch ((event & 0xFFFF)) { @@ -923,6 +925,10 @@ const char *translateEvents(Event event) { return DUMP_HK_CANCELLED_STRING; case (14314): return DUMP_CFDP_CANCELLED_STRING; + case (14500): + return TEMPERATURE_ALL_ONES_START_STRING; + case (14501): + return TEMPERATURE_ALL_ONES_RECOVERY_STRING; default: return "UNKNOWN_EVENT"; } diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index a9a5a786..e032a545 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-09-07 16:12:51 + * Generated on: 2023-09-12 10:51:47 */ #include "translateObjects.h" diff --git a/mission/acs/SusHandler.cpp b/mission/acs/SusHandler.cpp index 6fa4d231..4b9778e5 100644 --- a/mission/acs/SusHandler.cpp +++ b/mission/acs/SusHandler.cpp @@ -20,6 +20,9 @@ void SusHandler::doStartUp() { } if (internalState == InternalState::STARTUP) { if (commandExecuted) { + if (waitingForRecovery) { + waitingForRecovery = false; + } setMode(MODE_ON); internalState = InternalState::NONE; commandExecuted = false; @@ -83,15 +86,36 @@ ReturnValue_t SusHandler::scanForReply(const uint8_t *start, size_t len, DeviceC } ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) { const auto *reply = reinterpret_cast(packet); - if (reply->dataWasSet) { - if (internalState == InternalState::STARTUP) { - commandExecuted = true; - } - PoolReadGuard pg(&dataset); - dataset.setValidity(true, true); - dataset.tempC = max1227::getTemperature(reply->tempRaw); - std::memcpy(dataset.channels.value, reply->channelsRaw, sizeof(reply->channelsRaw)); + if (!reply->dataWasSet) { + return returnvalue::OK; } + if (internalState == InternalState::STARTUP) { + commandExecuted = true; + } + PoolReadGuard pg(&dataset); + // Simple FDIR variant to make the handler more robust to invalid messages which + // appear sometimes for the SUS device: Allow invalid message up to a certain threshold + // before triggering FDIR reactions. + if (reply->tempRaw == 0xfff and not waitingForRecovery) { + if (invalidMsgCounter == 0) { + triggerEvent(TEMPERATURE_ALL_ONES_START); + } else if (invalidMsgCounter == susMax1227::MAX_INVALID_MSG_COUNT) { + triggerEvent(DeviceHandlerIF::DEVICE_WANTS_HARD_REBOOT); + waitingForRecovery = true; + } + invalidMsgCounter++; + dataset.setValidity(false, true); + dataset.tempC = thermal::INVALID_TEMPERATURE; + std::memset(dataset.channels.value, 0, sizeof(dataset.channels.value)); + return returnvalue::OK; + } + if (invalidMsgCounter > 0) { + triggerEvent(TEMPERATURE_ALL_ONES_RECOVERY, invalidMsgCounter); + invalidMsgCounter = 0; + } + dataset.setValidity(true, true); + dataset.tempC = max1227::getTemperature(reply->tempRaw); + std::memcpy(dataset.channels.value, reply->channelsRaw, sizeof(reply->channelsRaw)); return returnvalue::OK; } diff --git a/mission/acs/SusHandler.h b/mission/acs/SusHandler.h index ad7d7a17..88e2b163 100644 --- a/mission/acs/SusHandler.h +++ b/mission/acs/SusHandler.h @@ -15,7 +15,15 @@ class SusHandler : public DeviceHandlerBase { static constexpr DeviceCommandId_t REPLY = 0x77; static const uint8_t INTERFACE_ID = CLASS_ID::SUS_HANDLER; - static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::SUS_BOARD_ASS; + static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::SUS_HANDLER; + + //! [EXPORT] : [COMMENT] Detected invalid values, starting invalid message counting + static constexpr Event TEMPERATURE_ALL_ONES_START = + event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM); + //! [EXPORT] : [COMMENT] Detected valid values again, resetting invalid message counter. + //! P1: Invalid message counter. + static constexpr Event TEMPERATURE_ALL_ONES_RECOVERY = + event::makeEvent(SUBSYSTEM_ID, 1, severity::INFO); SusHandler(uint32_t objectId, uint8_t susIdx, object_id_t deviceCommunication, CookieIF *comCookie); @@ -46,6 +54,8 @@ class SusHandler : public DeviceHandlerBase { susMax1227::SusDataset dataset; acs::SusRequest request{}; uint8_t susIdx; + bool waitingForRecovery = true; + uint32_t invalidMsgCounter = 0; uint32_t transitionDelay = 1000; bool goToNormalMode = false; diff --git a/mission/acs/susMax1227Helpers.h b/mission/acs/susMax1227Helpers.h index 292db6e4..0314b834 100644 --- a/mission/acs/susMax1227Helpers.h +++ b/mission/acs/susMax1227Helpers.h @@ -8,6 +8,14 @@ namespace susMax1227 { +// This is 16 seconds for a polling frequency of 0.4 seconds. +static constexpr uint32_t MAX_INVALID_MSG_COUNT = 40; +// Using a decrement time of 32 seconds should cause faulty device incrementation to best faster +// the decrementation, so that FDIR reactions will eventuall be triggered. +// NOTE: Not used currently, we perform the strange reply check logic in the handler and trigger +// a reboot directly using the appropriate event. +static constexpr uint32_t FAULTY_COM_DECREMENT_TIME_MS = 32000; + static const DeviceCommandId_t NONE = 0x0; // Set when no command is pending static const DeviceCommandId_t WRITE_SETUP = 1; diff --git a/mission/system/acs/SusFdir.cpp b/mission/system/acs/SusFdir.cpp index 894b92cb..de8eccc7 100644 --- a/mission/system/acs/SusFdir.cpp +++ b/mission/system/acs/SusFdir.cpp @@ -1,6 +1,7 @@ #include "SusFdir.h" #include "eive/objects.h" +#include "mission/acs/susMax1227Helpers.h" SusFdir::SusFdir(object_id_t sensorId) : DeviceHandlerFailureIsolation(sensorId, objects::SUS_BOARD_ASS) {} diff --git a/tmtc b/tmtc index 5fc3d8de..68138c6e 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 5fc3d8de996e5640adb7205cd3897d499eb3da60 +Subproject commit 68138c6e798537dee7dbf6f9956af6235cd65d6d