diff --git a/CHANGELOG.md b/CHANGELOG.md index a3098e4d..550901d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,23 @@ will consitute of a breaking change warranting a new major release: # [unreleased] +# [v6.5.1] 2023-09-12 + +- Bumped `eive-tmtc` to v5.5.0. + +# [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 ## Fixed 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 a7aefe24..3322209d 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 304 translations. + * @brief Auto-generated event translation file. Contains 306 translations. * @details - * Generated on: 2023-08-21 15:54:29 + * Generated on: 2023-09-12 10:05:17 */ #include "translateEvents.h" @@ -309,6 +309,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)) { @@ -920,6 +922,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 5ec24a70..988be097 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-08-21 15:54:29 + * Generated on: 2023-09-12 10:05:17 */ #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 b00c56b2..08626f32 100644 --- a/generators/bsp_hosted_events.csv +++ b/generators/bsp_hosted_events.csv @@ -303,3 +303,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_returnvalues.csv b/generators/bsp_hosted_returnvalues.csv index e3db4c9a..50a86ae3 100644 --- a/generators/bsp_hosted_returnvalues.csv +++ b/generators/bsp_hosted_returnvalues.csv @@ -357,6 +357,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3a02;MQI_Full;No space left for more messages;2;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h 0x3a03;MQI_NoReplyPartner;Returned if a reply method was called without partner;3;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h 0x3a04;MQI_DestinationInvalid;Returned if the target destination is invalid.;4;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h +0x3b00;SPH_ConnBroken;No description;0;SEMAPHORE_IF;fsfw/src/fsfw/osal/common/TcpTmTcServer.h 0x3b01;SPH_SemaphoreTimeout;No description;1;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h 0x3b02;SPH_SemaphoreNotOwned;No description;2;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h 0x3b03;SPH_SemaphoreInvalid;No description;3;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h @@ -372,7 +373,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3e05;HKM_DatasetNotFound;No description;5;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h 0x3f01;DLEE_StreamTooShort;No description;1;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h 0x3f02;DLEE_DecodingError;No description;2;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h -0x4100;PUS9_ConnBroken;No description;0;PUS_SERVICE_9;fsfw/src/fsfw/osal/common/TcpTmTcServer.h 0x4201;PUS11_InvalidTypeTimeWindow;No description;1;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4202;PUS11_InvalidTimeWindow;No description;2;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4203;PUS11_TimeshiftingNotPossible;No description;3;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h @@ -402,9 +402,9 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x4403;UXOS_CommandError;Command execution failed;3;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h 0x4404;UXOS_NoCommandLoadedOrPending;;4;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h 0x4406;UXOS_PcloseCallError;No description;6;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h -0x4500;HSPI_HalTimeoutRetval;No description;0;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h -0x4501;HSPI_HalBusyRetval;No description;1;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h -0x4502;HSPI_HalErrorRetval;No description;2;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h +0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h +0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h +0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h 0x4503;HSPI_Timeout;No description;3;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h 0x4504;HSPI_Busy;No description;4;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h 0x4505;HSPI_GenericError;No description;5;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.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 b00c56b2..08626f32 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -303,3 +303,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_returnvalues.csv b/generators/bsp_q7s_returnvalues.csv index 065e5392..1bc91860 100644 --- a/generators/bsp_q7s_returnvalues.csv +++ b/generators/bsp_q7s_returnvalues.csv @@ -357,6 +357,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3a02;MQI_Full;No space left for more messages;2;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h 0x3a03;MQI_NoReplyPartner;Returned if a reply method was called without partner;3;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h 0x3a04;MQI_DestinationInvalid;Returned if the target destination is invalid.;4;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h +0x3b00;SPH_ConnBroken;No description;0;SEMAPHORE_IF;fsfw/src/fsfw/osal/common/TcpTmTcServer.h 0x3b01;SPH_SemaphoreTimeout;No description;1;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h 0x3b02;SPH_SemaphoreNotOwned;No description;2;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h 0x3b03;SPH_SemaphoreInvalid;No description;3;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h @@ -372,7 +373,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3e05;HKM_DatasetNotFound;No description;5;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h 0x3f01;DLEE_StreamTooShort;No description;1;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h 0x3f02;DLEE_DecodingError;No description;2;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h -0x4100;PUS9_ConnBroken;No description;0;PUS_SERVICE_9;fsfw/src/fsfw/osal/common/TcpTmTcServer.h 0x4201;PUS11_InvalidTypeTimeWindow;No description;1;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4202;PUS11_InvalidTimeWindow;No description;2;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4203;PUS11_TimeshiftingNotPossible;No description;3;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h @@ -402,9 +402,9 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x4403;UXOS_CommandError;Command execution failed;3;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h 0x4404;UXOS_NoCommandLoadedOrPending;;4;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h 0x4406;UXOS_PcloseCallError;No description;6;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h -0x4500;HSPI_HalTimeoutRetval;No description;0;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h -0x4501;HSPI_HalBusyRetval;No description;1;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h -0x4502;HSPI_HalErrorRetval;No description;2;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h +0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h +0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h +0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h 0x4503;HSPI_Timeout;No description;3;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h 0x4504;HSPI_Busy;No description;4;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h 0x4505;HSPI_GenericError;No description;5;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.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 a7aefe24..3322209d 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 304 translations. + * @brief Auto-generated event translation file. Contains 306 translations. * @details - * Generated on: 2023-08-21 15:54:29 + * Generated on: 2023-09-12 10:05:17 */ #include "translateEvents.h" @@ -309,6 +309,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)) { @@ -920,6 +922,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 4fe7e433..390dfd87 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-08-21 15:54:29 + * Generated on: 2023-09-12 10:05:17 */ #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 a7aefe24..3322209d 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 304 translations. + * @brief Auto-generated event translation file. Contains 306 translations. * @details - * Generated on: 2023-08-21 15:54:29 + * Generated on: 2023-09-12 10:05:17 */ #include "translateEvents.h" @@ -309,6 +309,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)) { @@ -920,6 +922,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 4fe7e433..390dfd87 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-08-21 15:54:29 + * Generated on: 2023-09-12 10:05:17 */ #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/controller/ThermalController.cpp b/mission/controller/ThermalController.cpp index 5f2277a9..2729cec0 100644 --- a/mission/controller/ThermalController.cpp +++ b/mission/controller/ThermalController.cpp @@ -1372,12 +1372,13 @@ void ThermalController::ctrlPlPcduBoard() { tooHotHandler(objects::PLPCDU_HANDLER, tooHotFlags.eBandTooHotFlag); } +// ToDo: remove one of the following 2 void ThermalController::ctrlPlocMissionBoard() { ctrlCtx.thermalComponent = tcsCtrl::PLOCMISSION_BOARD; - sensors[0].first = sensorTemperatures.plocHeatspreader.isValid(); - sensors[0].second = sensorTemperatures.plocHeatspreader.value; - sensors[1].first = sensorTemperatures.plocMissionboard.isValid(); - sensors[1].second = sensorTemperatures.plocMissionboard.value; + sensors[0].first = sensorTemperatures.plocMissionboard.isValid(); + sensors[0].second = sensorTemperatures.plocMissionboard.value; + sensors[1].first = sensorTemperatures.plocHeatspreader.isValid(); + sensors[1].second = sensorTemperatures.plocHeatspreader.value; sensors[2].first = sensorTemperatures.dacHeatspreader.isValid(); sensors[2].second = sensorTemperatures.dacHeatspreader.value; numSensors = 3; diff --git a/mission/controller/acs/AcsParameters.h b/mission/controller/acs/AcsParameters.h index 0fb1daa9..a9c9ab5d 100644 --- a/mission/controller/acs/AcsParameters.h +++ b/mission/controller/acs/AcsParameters.h @@ -79,7 +79,7 @@ class AcsParameters : public HasParametersIF { float mgm13variance[3] = {pow(1.5e-8, 2), pow(1.5e-8, 2), pow(1.5e-8, 2)}; float mgm4variance[3] = {pow(1.7e-6, 2), pow(1.7e-6, 2), pow(1.7e-6, 2)}; float mgmVectorFilterWeight = 0.85; - float mgmDerivativeFilterWeight = 0.85; + float mgmDerivativeFilterWeight = 0.99; uint8_t useMgm4 = false; } mgmHandlingParameters; @@ -771,7 +771,7 @@ class AcsParameters : public HasParametersIF { -0.000889232196185857, -0.00168429567131815}}; float susBrightnessThreshold = 0.7; float susVectorFilterWeight = .85; - float susRateFilterWeight = .85; + float susRateFilterWeight = .99; } susHandlingParameters; struct GyrHandlingParameters { @@ -834,15 +834,15 @@ class AcsParameters : public HasParametersIF { double k_alignGyr = 4.0e-5; double k_parallelGyr = 3.75e-4; - double k_orthoSusMgm = 1.1e-2; - double k_alignSusMgm = 2.0e-5; - double k_parallelSusMgm = 4.4e-4; + double k_orthoSusMgm = 4.4e-3; + double k_alignSusMgm = 4.0e-5; + double k_parallelSusMgm = 3.75e-4; double sunTargetDirLeop[3] = {0, sqrt(.5), sqrt(.5)}; double sunTargetDir[3] = {0, 0, 1}; uint8_t useMekf = false; - uint8_t useGyr = true; + uint8_t useGyr = false; uint8_t dampingDuringEclipse = true; float sineLimitSunRotRate = 0.24; 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 b1fbad39..d23cc683 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit b1fbad39e311634084ee3e6a44b6de6ba2ad6407 +Subproject commit d23cc6834ad0895c230d2378b0c8d9ba4f374f8d