From 7e2a993211995e5bb09fa1fb032bc25c07eb4f45 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 28 Apr 2022 15:25:03 +0200 Subject: [PATCH] create rudimentary syrlinks fdir --- common/config/commonSubsystemIds.h | 1 + .../devicedefinitions/SyrlinksDefinitions.h | 6 + .../devicedefinitions/powerDefinitions.h | 2 + mission/system/CMakeLists.txt | 4 +- mission/system/{ => fdir}/AcsBoardFdir.cpp | 0 mission/system/{ => fdir}/AcsBoardFdir.h | 0 mission/system/{ => fdir}/RtdFdir.cpp | 0 mission/system/{ => fdir}/RtdFdir.h | 0 mission/system/{ => fdir}/SusFdir.cpp | 0 mission/system/{ => fdir}/SusFdir.h | 0 mission/system/fdir/SyrlinksFdir.cpp | 107 ++++++++++++++++++ mission/system/fdir/SyrlinksFdir.h | 14 +++ 12 files changed, 133 insertions(+), 1 deletion(-) rename mission/system/{ => fdir}/AcsBoardFdir.cpp (100%) rename mission/system/{ => fdir}/AcsBoardFdir.h (100%) rename mission/system/{ => fdir}/RtdFdir.cpp (100%) rename mission/system/{ => fdir}/RtdFdir.h (100%) rename mission/system/{ => fdir}/SusFdir.cpp (100%) rename mission/system/{ => fdir}/SusFdir.h (100%) create mode 100644 mission/system/fdir/SyrlinksFdir.cpp create mode 100644 mission/system/fdir/SyrlinksFdir.h diff --git a/common/config/commonSubsystemIds.h b/common/config/commonSubsystemIds.h index cd692231..c3e6c5a2 100644 --- a/common/config/commonSubsystemIds.h +++ b/common/config/commonSubsystemIds.h @@ -30,6 +30,7 @@ enum: uint8_t { PDU1_HANDLER = 133, PDU2_HANDLER = 134, ACU_HANDLER = 135, + SYRLINKS = 136, COMMON_SUBSYSTEM_ID_END }; } diff --git a/mission/devices/devicedefinitions/SyrlinksDefinitions.h b/mission/devices/devicedefinitions/SyrlinksDefinitions.h index a816dc29..7e3b6a20 100644 --- a/mission/devices/devicedefinitions/SyrlinksDefinitions.h +++ b/mission/devices/devicedefinitions/SyrlinksDefinitions.h @@ -1,8 +1,14 @@ #ifndef MISSION_DEVICES_DEVICEDEFINITIONS_SYRLINKSDEFINITIONS_H_ #define MISSION_DEVICES_DEVICEDEFINITIONS_SYRLINKSDEFINITIONS_H_ +#include + namespace syrlinks { +static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::SYRLINKS; + +static constexpr Event FDIR_REACTION_IGNORED = event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM); + static const DeviceCommandId_t NONE = 0; static const DeviceCommandId_t RESET_UNIT = 1; /** Reads out all status registers */ diff --git a/mission/devices/devicedefinitions/powerDefinitions.h b/mission/devices/devicedefinitions/powerDefinitions.h index 746bda34..1cffa835 100644 --- a/mission/devices/devicedefinitions/powerDefinitions.h +++ b/mission/devices/devicedefinitions/powerDefinitions.h @@ -15,6 +15,8 @@ static constexpr Event SWITCH_CMD_SENT = event::makeEvent(SUBSYSTEM_ID, 0, sever static constexpr Event SWITCH_HAS_CHANGED = event::makeEvent(SUBSYSTEM_ID, 1, severity::INFO); static constexpr Event SWITCHING_Q7S_DENIED = event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM); +static constexpr Event FDIR_REACTION_IGNORED = event::makeEvent(SUBSYSTEM_ID, 3, severity::MEDIUM); + } // namespace power #endif /* MISSION_DEVICES_DEVICEDEFINITIONS_POWERDEFINITIONS_H_ */ diff --git a/mission/system/CMakeLists.txt b/mission/system/CMakeLists.txt index 59418a07..24ecaafb 100644 --- a/mission/system/CMakeLists.txt +++ b/mission/system/CMakeLists.txt @@ -14,4 +14,6 @@ target_sources(${LIB_EIVE_MISSION} PRIVATE AcsBoardFdir.cpp SusFdir.cpp RtdFdir.cpp -) \ No newline at end of file +) + +add_subdirectory(fdir) diff --git a/mission/system/AcsBoardFdir.cpp b/mission/system/fdir/AcsBoardFdir.cpp similarity index 100% rename from mission/system/AcsBoardFdir.cpp rename to mission/system/fdir/AcsBoardFdir.cpp diff --git a/mission/system/AcsBoardFdir.h b/mission/system/fdir/AcsBoardFdir.h similarity index 100% rename from mission/system/AcsBoardFdir.h rename to mission/system/fdir/AcsBoardFdir.h diff --git a/mission/system/RtdFdir.cpp b/mission/system/fdir/RtdFdir.cpp similarity index 100% rename from mission/system/RtdFdir.cpp rename to mission/system/fdir/RtdFdir.cpp diff --git a/mission/system/RtdFdir.h b/mission/system/fdir/RtdFdir.h similarity index 100% rename from mission/system/RtdFdir.h rename to mission/system/fdir/RtdFdir.h diff --git a/mission/system/SusFdir.cpp b/mission/system/fdir/SusFdir.cpp similarity index 100% rename from mission/system/SusFdir.cpp rename to mission/system/fdir/SusFdir.cpp diff --git a/mission/system/SusFdir.h b/mission/system/fdir/SusFdir.h similarity index 100% rename from mission/system/SusFdir.h rename to mission/system/fdir/SusFdir.h diff --git a/mission/system/fdir/SyrlinksFdir.cpp b/mission/system/fdir/SyrlinksFdir.cpp new file mode 100644 index 00000000..2c14d904 --- /dev/null +++ b/mission/system/fdir/SyrlinksFdir.cpp @@ -0,0 +1,107 @@ +#include "SyrlinksFdir.h" + +#include "fsfw/devicehandlers/DeviceHandlerIF.h" +#include "fsfw/health/HealthTableIF.h" +#include "fsfw/modes/HasModesIF.h" +#include "fsfw/objectmanager/ObjectManager.h" +#include "fsfw/power/Fuse.h" +#include "fsfw/serviceinterface/ServiceInterfaceStream.h" +#include "fsfw/thermal/ThermalComponentIF.h" +#include "mission/devices/devicedefinitions/SyrlinksDefinitions.h" + +SyrlinksFdir::SyrlinksFdir(object_id_t syrlinksId) {} + +ReturnValue_t SyrlinksFdir::eventReceived(EventMessage* event) { + if (isFdirInActionOrAreWeFaulty(event)) { + return RETURN_OK; + } + ReturnValue_t result = RETURN_FAILED; + switch (event->getEvent()) { + case HasModesIF::MODE_TRANSITION_FAILED: + case HasModesIF::OBJECT_IN_INVALID_MODE: + case DeviceHandlerIF::DEVICE_WANTS_HARD_REBOOT: + // We'll try a recovery as long as defined in MAX_REBOOT. + // Might cause some AssemblyBase cycles, so keep number low. + // handleRecovery(event->getEvent()); + triggerEvent(syrlinks::FDIR_REACTION_IGNORED, event->getEvent(), 0); + break; + case DeviceHandlerIF::DEVICE_INTERPRETING_REPLY_FAILED: + case DeviceHandlerIF::DEVICE_READING_REPLY_FAILED: + case DeviceHandlerIF::DEVICE_UNREQUESTED_REPLY: + case DeviceHandlerIF::DEVICE_UNKNOWN_REPLY: // Some DH's generate generic reply-ids. + case DeviceHandlerIF::DEVICE_BUILDING_COMMAND_FAILED: + // These faults all mean that there were stupid replies from a device. + if (strangeReplyCount.incrementAndCheck()) { + // handleRecovery(event->getEvent()); + triggerEvent(syrlinks::FDIR_REACTION_IGNORED, event->getEvent(), 0); + } + break; + case DeviceHandlerIF::DEVICE_SENDING_COMMAND_FAILED: + case DeviceHandlerIF::DEVICE_REQUESTING_REPLY_FAILED: + // The two above should never be confirmed. + case DeviceHandlerIF::DEVICE_MISSED_REPLY: + result = sendConfirmationRequest(event); + if (result == HasReturnvaluesIF::RETURN_OK) { + break; + } + // else + if (missedReplyCount.incrementAndCheck()) { + // handleRecovery(event->getEvent()); + triggerEvent(syrlinks::FDIR_REACTION_IGNORED, event->getEvent(), 0); + } + break; + case StorageManagerIF::GET_DATA_FAILED: + case StorageManagerIF::STORE_DATA_FAILED: + // Rather strange bugs, occur in RAW mode only. Ignore. + break; + case DeviceHandlerIF::INVALID_DEVICE_COMMAND: + // Ignore, is bad configuration. We can't do anything in flight. + break; + case HasHealthIF::HEALTH_INFO: + case HasModesIF::MODE_INFO: + case HasModesIF::CHANGING_MODE: + // Do nothing, but mark as handled. + break; + //****Power***** + case PowerSwitchIF::SWITCH_WENT_OFF: + if (powerConfirmation != MessageQueueIF::NO_QUEUE) { + result = sendConfirmationRequest(event, powerConfirmation); + if (result == RETURN_OK) { + setFdirState(DEVICE_MIGHT_BE_OFF); + } + } + break; + case Fuse::FUSE_WENT_OFF: + // Not so good, because PCDU reacted. + case Fuse::POWER_ABOVE_HIGH_LIMIT: + // Better, because software detected over-current. + setFaulty(event->getEvent()); + break; + case Fuse::POWER_BELOW_LOW_LIMIT: + // Device might got stuck during boot, retry. + // handleRecovery(event->getEvent()); + triggerEvent(syrlinks::FDIR_REACTION_IGNORED, event->getEvent(), 0); + break; + //****Thermal***** + case ThermalComponentIF::COMPONENT_TEMP_LOW: + case ThermalComponentIF::COMPONENT_TEMP_HIGH: + case ThermalComponentIF::COMPONENT_TEMP_OOL_LOW: + case ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH: + // Well, the device is not really faulty, but it is required to stay off as long as possible. + setFaulty(event->getEvent()); + break; + case ThermalComponentIF::TEMP_NOT_IN_OP_RANGE: + // Ignore, is information only. + break; + //*******Default monitoring variables. Are currently not used.***** + // case DeviceHandlerIF::MONITORING_LIMIT_EXCEEDED: + // setFaulty(event->getEvent()); + // break; + // case DeviceHandlerIF::MONITORING_AMBIGUOUS: + // break; + default: + // We don't know the event, someone else should handle it. + return RETURN_FAILED; + } + return RETURN_OK; +} diff --git a/mission/system/fdir/SyrlinksFdir.h b/mission/system/fdir/SyrlinksFdir.h new file mode 100644 index 00000000..bafd8a48 --- /dev/null +++ b/mission/system/fdir/SyrlinksFdir.h @@ -0,0 +1,14 @@ +#ifndef MISSION_DEVICES_SYRLINKSFDIR_H_ +#define MISSION_DEVICES_SYRLINKSFDIR_H_ + +#include + +class SyrlinksFdir: public DeviceHandlerFailureIsolation { + public: + SyrlinksFdir(object_id_t syrlinksId); + private: + ReturnValue_t eventReceived(EventMessage* event); +}; + + +#endif /* MISSION_DEVICES_SYRLINKSFDIR_H_ */