From 8801dfa31dfec48e2002e0edb19c697372a5cea1 Mon Sep 17 00:00:00 2001 From: "Tobias.Baumgartl" Date: Wed, 12 Mar 2025 21:46:48 +0100 Subject: [PATCH 01/14] implemented event limit. TODO: adjust generator parsing and usage in src-obsw --- src/fsfw/cfdp/handler/defs.h | 10 +++++----- src/fsfw/events/Event.h | 9 +++++---- src/fsfw/tcdistribution/definitions.h | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/fsfw/cfdp/handler/defs.h b/src/fsfw/cfdp/handler/defs.h index 6a668602..e1d88247 100644 --- a/src/fsfw/cfdp/handler/defs.h +++ b/src/fsfw/cfdp/handler/defs.h @@ -19,13 +19,13 @@ struct FsfwParams { }; namespace events { -static constexpr Event PDU_SEND_ERROR = event::makeEvent(SSID, 1, severity::LOW); -static constexpr Event SERIALIZATION_ERROR = event::makeEvent(SSID, 2, severity::LOW); -static constexpr Event FILESTORE_ERROR = event::makeEvent(SSID, 3, severity::LOW); +static constexpr Event PDU_SEND_ERROR = event::makeEvent(); +static constexpr Event SERIALIZATION_ERROR = event::makeEvent(); +static constexpr Event FILESTORE_ERROR = event::makeEvent(); //! [EXPORT] : [COMMENT] P1: Transaction step ID, P2: 0 for source file name, 1 for dest file name -static constexpr Event FILENAME_TOO_LARGE_ERROR = event::makeEvent(SSID, 4, severity::LOW); +static constexpr Event FILENAME_TOO_LARGE_ERROR = event::makeEvent(); //! [EXPORT] : [COMMENT] CFDP request handling failed. P2: Returncode. -static constexpr Event HANDLING_CFDP_REQUEST_FAILED = event::makeEvent(SSID, 5, severity::LOW); +static constexpr Event HANDLING_CFDP_REQUEST_FAILED = event::makeEvent(); } // namespace events static constexpr ReturnValue_t SOURCE_TRANSACTION_PENDING = returnvalue::makeCode(CID, 0); diff --git a/src/fsfw/events/Event.h b/src/fsfw/events/Event.h index e48736bf..73a5fbbf 100644 --- a/src/fsfw/events/Event.h +++ b/src/fsfw/events/Event.h @@ -14,8 +14,6 @@ enum Severity : EventSeverity_t { INFO = 1, LOW = 2, MEDIUM = 3, HIGH = 4 }; } // namespace severity -#define MAKE_EVENT(id, severity) (((severity) << 16) + (SUBSYSTEM_ID * 100) + (id)) - typedef uint32_t Event; namespace event { @@ -24,11 +22,14 @@ constexpr EventId_t getEventId(Event event) { return (event & 0xFFFF); } constexpr EventSeverity_t getSeverity(Event event) { return ((event >> 16) & 0xFF); } -constexpr Event makeEvent(uint8_t subsystemId, UniqueEventId_t uniqueEventId, - EventSeverity_t eventSeverity) { +template +constexpr Event makeEvent() { + static_assert(uniqueEventId < 100, "The unique event ID must be smaller than 100!"); return (eventSeverity << 16) + (subsystemId * 100) + uniqueEventId; } } // namespace event +#define MAKE_EVENT(id, severity) event::makeEvent(); + #endif /* EVENTOBJECT_EVENT_H_ */ diff --git a/src/fsfw/tcdistribution/definitions.h b/src/fsfw/tcdistribution/definitions.h index 04a7a4a5..d01e5e7e 100644 --- a/src/fsfw/tcdistribution/definitions.h +++ b/src/fsfw/tcdistribution/definitions.h @@ -25,7 +25,7 @@ static constexpr ReturnValue_t INCORRECT_SECONDARY_HEADER = MAKE_RETURN_CODE(11) static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::TMTC_DISTRIBUTION; //! P1: Returnvalue, P2: 0 for TM issues, 1 for TC issues -static constexpr Event HANDLE_PACKET_FAILED = event::makeEvent(SUBSYSTEM_ID, 0, severity::LOW); +static constexpr Event HANDLE_PACKET_FAILED = event::makeEvent(); }; // namespace tmtcdistrib #endif // FSFW_TMTCPACKET_DEFINITIONS_H From 8cb1d84c58f439a92f110862c6bc495a6b719af2 Mon Sep 17 00:00:00 2001 From: "Tobias.Baumgartl" Date: Wed, 12 Mar 2025 22:18:55 +0100 Subject: [PATCH 02/14] fixed event definition for archive/mgm and pus 11 --- misc/archive/MgmRM3100Handler.h | 4 ++-- src/fsfw/pus/Service11TelecommandScheduling.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/misc/archive/MgmRM3100Handler.h b/misc/archive/MgmRM3100Handler.h index c118bcd5..ec75c5be 100644 --- a/misc/archive/MgmRM3100Handler.h +++ b/misc/archive/MgmRM3100Handler.h @@ -18,13 +18,13 @@ class MgmRM3100Handler : public DeviceHandlerBase { static const uint8_t INTERFACE_ID = CLASS_ID::MGM_RM3100; //! [EXPORT] : [COMMENT] P1: TMRC value which was set, P2: 0 - static constexpr Event tmrcSet = event::makeEvent(SUBSYSTEM_ID::MGM_RM3100, 0x00, severity::INFO); + static constexpr Event tmrcSet = event::makeEvent(); //! [EXPORT] : [COMMENT] Cycle counter set. P1: First two bytes new Cycle Count X //! P1: Second two bytes new Cycle Count Y //! P2: New cycle count Z static constexpr Event cycleCountersSet = - event::makeEvent(SUBSYSTEM_ID::MGM_RM3100, 0x01, severity::INFO); + event::makeEvent(); MgmRM3100Handler(object_id_t objectId, object_id_t deviceCommunication, CookieIF *comCookie, uint32_t transitionDelay); diff --git a/src/fsfw/pus/Service11TelecommandScheduling.h b/src/fsfw/pus/Service11TelecommandScheduling.h index fd9cf733..84d91aca 100644 --- a/src/fsfw/pus/Service11TelecommandScheduling.h +++ b/src/fsfw/pus/Service11TelecommandScheduling.h @@ -49,7 +49,7 @@ class Service11TelecommandScheduling final : public PusServiceBase { //! [EXPORT] : [COMMENT] Deletion of a TC from the map failed. //! P1: First 32 bit of request ID, P2. Last 32 bit of Request ID - static constexpr Event TC_DELETION_FAILED = event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM); + static constexpr Event TC_DELETION_FAILED = event::makeEvent(); // The types of PUS-11 subservices enum Subservice : uint8_t { From 9945f72eaff6a826c716ef3c73ace2b8baeed829 Mon Sep 17 00:00:00 2001 From: "spahr@ksat-stuttgart.de" Date: Sat, 22 Mar 2025 09:40:31 +0100 Subject: [PATCH 03/14] improve documentation for event --- src/fsfw/health/HasHealthIF.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/fsfw/health/HasHealthIF.h b/src/fsfw/health/HasHealthIF.h index 16666bbc..2234a119 100644 --- a/src/fsfw/health/HasHealthIF.h +++ b/src/fsfw/health/HasHealthIF.h @@ -27,7 +27,8 @@ class HasHealthIF { static const Event CHILD_PROBLEMS = MAKE_EVENT(8, severity::LOW); //! Assembly overwrites health information of children to keep satellite alive. static const Event OVERWRITING_HEALTH = MAKE_EVENT(9, severity::LOW); - //! Someone starts a recovery of a component (typically power-cycle). No parameters. + //! Someone starts a recovery of a component (typically power-cycle). + //! P1: Object Id of the recovering device. static const Event TRYING_RECOVERY = MAKE_EVENT(10, severity::MEDIUM); //! Recovery is ongoing. Comes twice during recovery. //! P1: 0 for the first, 1 for the second event. P2: 0 From b7699b327b3e76f79a2fb88de3b370ec0d3eb023 Mon Sep 17 00:00:00 2001 From: "spahr@ksat-stuttgart.de" Date: Sat, 22 Mar 2025 09:48:30 +0100 Subject: [PATCH 04/14] add two new events for the recovery process, to make debug and output more clear. This also makes a recovery process more clear for OPS. --- src/fsfw/devicehandlers/AssemblyBase.cpp | 4 ++-- src/fsfw/health/HasHealthIF.h | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/fsfw/devicehandlers/AssemblyBase.cpp b/src/fsfw/devicehandlers/AssemblyBase.cpp index 14575e69..5424ce39 100644 --- a/src/fsfw/devicehandlers/AssemblyBase.cpp +++ b/src/fsfw/devicehandlers/AssemblyBase.cpp @@ -235,14 +235,14 @@ bool AssemblyBase::checkAndHandleRecovery() { if (recoveryOffTimer.isBusy()) { return true; } - triggerEvent(RECOVERY_STEP, 0); + triggerEvent(RECOVERY_WAITING, recoveringDevice->first); sendHealthCommand(recoveringDevice->second.commandQueue, HEALTHY); internalState = STATE_NONE; recoveryState = RECOVERY_ONGOING; // Don't check state! return true; case RECOVERY_ONGOING: - triggerEvent(RECOVERY_STEP, 1); + triggerEvent(RECOVERY_RESTARTING, recoveringDevice->first); recoveryState = RECOVERY_ONGOING_2; recoveringDevice->second.healthChanged = false; // Device should be healthy again, so restart a transition. diff --git a/src/fsfw/health/HasHealthIF.h b/src/fsfw/health/HasHealthIF.h index 2234a119..07f9a5b4 100644 --- a/src/fsfw/health/HasHealthIF.h +++ b/src/fsfw/health/HasHealthIF.h @@ -35,6 +35,13 @@ class HasHealthIF { static const Event RECOVERY_STEP = MAKE_EVENT(11, severity::MEDIUM); //! Recovery was completed. Not necessarily successful. No parameters. static const Event RECOVERY_DONE = MAKE_EVENT(12, severity::MEDIUM); + //! Recovery is ongoing. The recovering device is currently OFF, waiting for restart. + //! P1: Object Id of the recovering device. + static const Event RECOVERY_WAITING = MAKE_EVENT(13, severity::MEDIUM); + //! Recovery is ongoing. Restarting the recovering device. + //! P1: Object Id of the recovering device. + static const Event RECOVERY_RESTARTING = MAKE_EVENT(14, severity::MEDIUM); + virtual ~HasHealthIF() {} virtual MessageQueueId_t getCommandQueue() const = 0; From 1e12753533f3516fe0e63c9ca54d381ae00c2702 Mon Sep 17 00:00:00 2001 From: "spahr@ksat-stuttgart.de" Date: Sat, 22 Mar 2025 09:49:44 +0100 Subject: [PATCH 05/14] add device object id to event --- src/fsfw/devicehandlers/AssemblyBase.cpp | 2 +- src/fsfw/health/HasHealthIF.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/fsfw/devicehandlers/AssemblyBase.cpp b/src/fsfw/devicehandlers/AssemblyBase.cpp index 5424ce39..ada7c4a8 100644 --- a/src/fsfw/devicehandlers/AssemblyBase.cpp +++ b/src/fsfw/devicehandlers/AssemblyBase.cpp @@ -250,7 +250,7 @@ bool AssemblyBase::checkAndHandleRecovery() { doStartTransition(targetMode, targetSubmode); return true; case RECOVERY_ONGOING_2: - triggerEvent(RECOVERY_DONE); + triggerEvent(RECOVERY_DONE, recoveringDevice->first); // Now we're through, but not sure if it was successful. recoveryState = RECOVERY_IDLE; return false; diff --git a/src/fsfw/health/HasHealthIF.h b/src/fsfw/health/HasHealthIF.h index 07f9a5b4..483b60c1 100644 --- a/src/fsfw/health/HasHealthIF.h +++ b/src/fsfw/health/HasHealthIF.h @@ -34,6 +34,7 @@ class HasHealthIF { //! P1: 0 for the first, 1 for the second event. P2: 0 static const Event RECOVERY_STEP = MAKE_EVENT(11, severity::MEDIUM); //! Recovery was completed. Not necessarily successful. No parameters. + //! P1: Object Id of the recovering device. static const Event RECOVERY_DONE = MAKE_EVENT(12, severity::MEDIUM); //! Recovery is ongoing. The recovering device is currently OFF, waiting for restart. //! P1: Object Id of the recovering device. From d8ac312e85fa31f3f42db8a70df95df946362aeb Mon Sep 17 00:00:00 2001 From: "spahr@ksat-stuttgart.de" Date: Sat, 22 Mar 2025 10:01:01 +0100 Subject: [PATCH 06/14] remove event because it's no longer needed. --- src/fsfw/health/HasHealthIF.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/fsfw/health/HasHealthIF.h b/src/fsfw/health/HasHealthIF.h index 483b60c1..11a1aed5 100644 --- a/src/fsfw/health/HasHealthIF.h +++ b/src/fsfw/health/HasHealthIF.h @@ -30,9 +30,6 @@ class HasHealthIF { //! Someone starts a recovery of a component (typically power-cycle). //! P1: Object Id of the recovering device. static const Event TRYING_RECOVERY = MAKE_EVENT(10, severity::MEDIUM); - //! Recovery is ongoing. Comes twice during recovery. - //! P1: 0 for the first, 1 for the second event. P2: 0 - static const Event RECOVERY_STEP = MAKE_EVENT(11, severity::MEDIUM); //! Recovery was completed. Not necessarily successful. No parameters. //! P1: Object Id of the recovering device. static const Event RECOVERY_DONE = MAKE_EVENT(12, severity::MEDIUM); From 2af6e85f8713cb02ae89bebecf52fd2483ef1ba0 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Sun, 23 Mar 2025 12:35:40 +0100 Subject: [PATCH 07/14] send hk report back to sender instead of default destination --- src/fsfw/housekeeping/PeriodicHkHelper.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsfw/housekeeping/PeriodicHkHelper.cpp b/src/fsfw/housekeeping/PeriodicHkHelper.cpp index bb8472ad..04f91f6a 100644 --- a/src/fsfw/housekeeping/PeriodicHkHelper.cpp +++ b/src/fsfw/housekeeping/PeriodicHkHelper.cpp @@ -9,7 +9,6 @@ #include "fsfw/housekeeping/HousekeepingSnapshot.h" #include "fsfw/ipc/QueueFactory.h" #include "fsfw/objectmanager/ObjectManager.h" -#include "fsfw/timemanager/CCSDSTime.h" using namespace hk; @@ -84,6 +83,7 @@ ReturnValue_t PeriodicHelper::performHkOperation() { ReturnValue_t PeriodicHelper::handleHousekeepingMessage(CommandMessage* message) { Command_t command = message->getCommand(); + MessageQueueId_t sender = message->getSender(); dp::sid_t sid = HousekeepingMessage::getStructureId(message); ReturnValue_t result = returnvalue::OK; switch (command) { @@ -113,7 +113,7 @@ ReturnValue_t PeriodicHelper::handleHousekeepingMessage(CommandMessage* message) } case (HousekeepingMessage::GENERATE_ONE_PARAMETER_REPORT): { - return generateHousekeepingPacket(HousekeepingMessage::getStructureId(message)); + return generateHousekeepingPacket(HousekeepingMessage::getStructureId(message), sender); } default: From 40be8ebef552668ffc1c64a0c5bbb21d8df2db05 Mon Sep 17 00:00:00 2001 From: Michael Demke Date: Fri, 28 Mar 2025 00:41:40 +0100 Subject: [PATCH 08/14] seems like this should set the serializables to .get().setValid(valid) instead of true --- src/fsfw/housekeeping/Dataset.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsfw/housekeeping/Dataset.h b/src/fsfw/housekeeping/Dataset.h index a1788843..d48129c3 100644 --- a/src/fsfw/housekeeping/Dataset.h +++ b/src/fsfw/housekeeping/Dataset.h @@ -91,7 +91,7 @@ class Dataset : public SerializeIF { void setChildrenValidity(bool valid) { for (auto &serializable : serializables) { - serializable.get().setValid(true); + serializable.get().setValid(valid); } } From 3afd0c8d3cf7dd820baf2449da293af50de532bd Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Tue, 1 Apr 2025 17:25:02 +0200 Subject: [PATCH 09/14] updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 195507a8..cc006de4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## Changed +- send HK one-parameter-report back to sender instead of default hk queue - Complete overhaul of HK subsystem. Replaced local data pool manager by periodic HK helper. The shared pool and the periodic HK generation are now distinct concepts. - The local HK manager was replaced by a periodic HK helper which has reduced responsibilities. From b665b2effe5af3f877c58e8c8f781c8573b64b15 Mon Sep 17 00:00:00 2001 From: "spahr@ksat-stuttgart.de" Date: Wed, 2 Apr 2025 22:13:50 +0200 Subject: [PATCH 10/14] add an adaption point which a user can use to convert a objectId of a shared power switch into a objectId of a device handler --- src/fsfw/devicehandlers/AssemblyBase.cpp | 4 ++-- src/fsfw/subsystem/SubsystemBase.cpp | 8 ++++++-- src/fsfw/subsystem/SubsystemBase.h | 6 ++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/fsfw/devicehandlers/AssemblyBase.cpp b/src/fsfw/devicehandlers/AssemblyBase.cpp index ada7c4a8..e2a5f524 100644 --- a/src/fsfw/devicehandlers/AssemblyBase.cpp +++ b/src/fsfw/devicehandlers/AssemblyBase.cpp @@ -71,7 +71,7 @@ bool AssemblyBase::handleChildrenChangedHealth() { if (iter == childrenMap.end()) { return false; } - HealthState healthState = healthHelper.healthTable->getHealth(iter->first); + HealthState healthState = healthHelper.healthTable->getHealth(convertToDeviceObjectId(iter->first)); if (healthState == HasHealthIF::NEEDS_RECOVERY) { triggerEvent(TRYING_RECOVERY, iter->first, 0); recoveryState = RECOVERY_STARTED; @@ -170,7 +170,7 @@ ReturnValue_t AssemblyBase::checkChildrenStateOff() { ReturnValue_t AssemblyBase::checkChildOff(uint32_t objectId) { ChildInfo childInfo = childrenMap.find(objectId)->second; - if (healthHelper.healthTable->isCommandable(objectId)) { + if (healthHelper.healthTable->isCommandable(convertToDeviceObjectId(objectId))) { if (childInfo.submode != SUBMODE_NONE) { return returnvalue::FAILED; } else { diff --git a/src/fsfw/subsystem/SubsystemBase.cpp b/src/fsfw/subsystem/SubsystemBase.cpp index 87fcfebf..7bedfadb 100644 --- a/src/fsfw/subsystem/SubsystemBase.cpp +++ b/src/fsfw/subsystem/SubsystemBase.cpp @@ -78,9 +78,9 @@ void SubsystemBase::executeTable(HybridIterator tableIter, Submod submodeToCommand = targetSubmode; } - if (healthHelper.healthTable->hasHealth(object)) { + if (healthHelper.healthTable->hasHealth(convertToDeviceObjectId(object))) { - switch (healthHelper.healthTable->getHealth(object)) { + switch (healthHelper.healthTable->getHealth(convertToDeviceObjectId(object))) { case NEEDS_RECOVERY: case FAULTY: case PERMANENT_FAULTY: @@ -353,3 +353,7 @@ ReturnValue_t SubsystemBase::registerChild(object_id_t childObjectId, MessageQue } return returnvalue::OK; } + +object_id_t SubsystemBase::convertToDeviceObjectId(object_id_t id) { + return id; +} \ No newline at end of file diff --git a/src/fsfw/subsystem/SubsystemBase.h b/src/fsfw/subsystem/SubsystemBase.h index 072b4ca4..5c21c5fd 100644 --- a/src/fsfw/subsystem/SubsystemBase.h +++ b/src/fsfw/subsystem/SubsystemBase.h @@ -153,6 +153,12 @@ class SubsystemBase : public SystemObject, virtual void announceMode(bool recursive) override; virtual void modeChanged(); + + /** + * @brief Provides an adaptation point for the user to change an objectId into + * a different objectId. + */ + virtual object_id_t convertToDeviceObjectId(object_id_t id); }; #endif /* FSFW_SUBSYSTEM_SUBSYSTEMBASE_H_ */ From 95520d7d0ced439d00e6a0f7f983511f02c0d69d Mon Sep 17 00:00:00 2001 From: "spahr@ksat-stuttgart.de" Date: Wed, 2 Apr 2025 22:18:31 +0200 Subject: [PATCH 11/14] Check if objectId exists in childrednmap first; this will prevent a hardfault --- src/fsfw/devicehandlers/AssemblyBase.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/fsfw/devicehandlers/AssemblyBase.cpp b/src/fsfw/devicehandlers/AssemblyBase.cpp index e2a5f524..72298384 100644 --- a/src/fsfw/devicehandlers/AssemblyBase.cpp +++ b/src/fsfw/devicehandlers/AssemblyBase.cpp @@ -264,7 +264,15 @@ void AssemblyBase::overwriteDeviceHealth(object_id_t objectId, HasHealthIF::Heal triggerEvent(OVERWRITING_HEALTH, objectId, oldHealth); internalState = STATE_OVERWRITE_HEALTH; modeHelper.setForced(true); - sendHealthCommand(childrenMap[objectId].commandQueue, EXTERNAL_CONTROL); + if(childrenMap.find(objectId) != childrenMap.end()) { + sendHealthCommand(childrenMap.at(objectId).commandQueue, EXTERNAL_CONTROL); + } else { +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::debug << std::hex << SystemObject::getObjectId() << ": invalid mode table entry" + << std::endl; +#endif + } + } void AssemblyBase::triggerModeHelperEvents(Mode_t mode, Submode_t submode) { From 297ec261ce62b9e6f3cfde9a089ef5c2f61d3d3a Mon Sep 17 00:00:00 2001 From: "spahr@ksat-stuttgart.de" Date: Fri, 4 Apr 2025 10:11:11 +0200 Subject: [PATCH 12/14] make the recovery timeout accessable to the user --- src/fsfw/devicehandlers/AssemblyBase.cpp | 6 +++++- src/fsfw/devicehandlers/AssemblyBase.h | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/fsfw/devicehandlers/AssemblyBase.cpp b/src/fsfw/devicehandlers/AssemblyBase.cpp index 72298384..33a5148c 100644 --- a/src/fsfw/devicehandlers/AssemblyBase.cpp +++ b/src/fsfw/devicehandlers/AssemblyBase.cpp @@ -227,7 +227,7 @@ bool AssemblyBase::checkAndHandleRecovery() { case RECOVERY_STARTED: // The recovery was already start in #handleChildrenChangedHealth and we just need // to wait for an off time period. - // TODO: make time period configurable + // The timeout can be defined by #setRecoveryWaitTimer recoveryState = RECOVERY_WAIT; recoveryOffTimer.resetTimer(); return true; @@ -282,3 +282,7 @@ void AssemblyBase::triggerModeHelperEvents(Mode_t mode, Submode_t submode) { triggerEvent(CHANGING_MODE, mode, submode); } } + +void AssemblyBase::setRecoveryWaitTimer(uint32_t timeoutMS) { + recoveryOffTimer.setTimeout(timeoutMS); +} diff --git a/src/fsfw/devicehandlers/AssemblyBase.h b/src/fsfw/devicehandlers/AssemblyBase.h index 5e0d826f..ac4feccd 100644 --- a/src/fsfw/devicehandlers/AssemblyBase.h +++ b/src/fsfw/devicehandlers/AssemblyBase.h @@ -206,6 +206,8 @@ class AssemblyBase : public SubsystemBase { void overwriteDeviceHealth(object_id_t objectId, HasHealthIF::HealthState oldHealth); void triggerModeHelperEvents(Mode_t mode, Submode_t submode); + + void setRecoveryWaitTimer(uint32_t timeoutMS); }; #endif /* FSFW_DEVICEHANDLERS_ASSEMBLYBASE_H_ */ From b13b5b456db7eb147482afa341cfe8d5417be11f Mon Sep 17 00:00:00 2001 From: "spahr@ksat-stuttgart.de" Date: Mon, 14 Apr 2025 00:06:34 +0200 Subject: [PATCH 13/14] Give AssemblyBase more functionality: Support one-by-one commanding for childrend instead of sending all mode messages on one shot --- src/fsfw/devicehandlers/AssemblyBase.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/fsfw/devicehandlers/AssemblyBase.cpp b/src/fsfw/devicehandlers/AssemblyBase.cpp index 33a5148c..c22bd4ee 100644 --- a/src/fsfw/devicehandlers/AssemblyBase.cpp +++ b/src/fsfw/devicehandlers/AssemblyBase.cpp @@ -92,10 +92,15 @@ void AssemblyBase::handleChildrenTransition() { if (commandsOutstanding <= 0) { switch (internalState) { case STATE_NEED_SECOND_STEP: + { internalState = STATE_SECOND_STEP; - commandChildren(targetMode, targetSubmode); + ReturnValue_t result = commandChildren(targetMode, targetSubmode); + if(result == NEED_SECOND_STEP) { + internalState = STATE_NEED_SECOND_STEP; + } return; - case STATE_OVERWRITE_HEALTH: { + } + case STATE_OVERWRITE_HEALTH: { internalState = STATE_SINGLE_STEP; ReturnValue_t result = commandChildren(mode, submode); if (result == NEED_SECOND_STEP) { From aa443e6aa67cace795b3bc997a559bfcbc7eba49 Mon Sep 17 00:00:00 2001 From: Philipp Hoffmann Date: Mon, 21 Apr 2025 17:05:58 +0200 Subject: [PATCH 14/14] Added STOP_DOWNLINK_STORE_CONTENT for Service [15,17] --- src/fsfw/tmstorage/TmStoreMessage.cpp | 5 +++++ src/fsfw/tmstorage/TmStoreMessage.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/fsfw/tmstorage/TmStoreMessage.cpp b/src/fsfw/tmstorage/TmStoreMessage.cpp index 6165df6d..c4bf1355 100644 --- a/src/fsfw/tmstorage/TmStoreMessage.cpp +++ b/src/fsfw/tmstorage/TmStoreMessage.cpp @@ -114,6 +114,11 @@ void TmStoreMessage::setDownlinkContentTimeMessage(CommandMessage* cmd, store_ad cmd->setParameter2(storeId.raw); } +void TmStoreMessage::setStopDownlinkContentMessage(CommandMessage* cmd, store_address_t storeId) { + cmd->setCommand(STOP_DOWNLINK_STORE_CONTENT); + cmd->setParameter2(storeId.raw); +} + uint32_t TmStoreMessage::getAddressLow(CommandMessage* cmd) { return cmd->getParameter(); } uint32_t TmStoreMessage::getAddressHigh(CommandMessage* cmd) { return cmd->getParameter2(); } diff --git a/src/fsfw/tmstorage/TmStoreMessage.h b/src/fsfw/tmstorage/TmStoreMessage.h index 90669335..087818f5 100644 --- a/src/fsfw/tmstorage/TmStoreMessage.h +++ b/src/fsfw/tmstorage/TmStoreMessage.h @@ -21,6 +21,7 @@ class TmStoreMessage { static void setStoreCatalogueReportMessage(CommandMessage* cmd, object_id_t objectId, store_address_t storeId); static void setDownlinkContentTimeMessage(CommandMessage* cmd, store_address_t storeId); + static void setStopDownlinkContentMessage(CommandMessage* cmd, store_address_t storeId); static void setIndexReportMessage(CommandMessage* cmd, store_address_t storeId); static ReturnValue_t setDeleteBlocksMessage(CommandMessage* cmd, uint32_t addressLow, uint32_t addressHigh); @@ -54,6 +55,7 @@ class TmStoreMessage { static const Command_t DOWNLINK_STORE_CONTENT_BLOCKS = MAKE_COMMAND_ID(12); static const Command_t REPORT_INDEX_REQUEST = MAKE_COMMAND_ID(13); static const Command_t INDEX_REPORT = MAKE_COMMAND_ID(14); + static const Command_t STOP_DOWNLINK_STORE_CONTENT = MAKE_COMMAND_ID(15); private: TmStoreMessage();