diff --git a/src/fsfw/introspection/EnumIF.h b/src/fsfw/introspection/EnumIF.h index 64040415..07f54258 100644 --- a/src/fsfw/introspection/EnumIF.h +++ b/src/fsfw/introspection/EnumIF.h @@ -1,10 +1,11 @@ #pragma once -#include #include +#include class EnumIF { public: + virtual ~EnumIF() {} virtual int64_t getValue() const = 0; virtual bool isValid() const = 0; virtual size_t getSize() const = 0; diff --git a/src/fsfw/modes/HasModesIF.h b/src/fsfw/modes/HasModesIF.h index 0ebe77d8..56adc1e1 100644 --- a/src/fsfw/modes/HasModesIF.h +++ b/src/fsfw/modes/HasModesIF.h @@ -6,6 +6,7 @@ #include "../events/Event.h" #include "../returnvalues/HasReturnvaluesIF.h" #include "ModeHelper.h" +#include "ModeDefinitionHelper.h" #include "ModeMessage.h" class HasModesIF { @@ -48,6 +49,7 @@ class HasModesIF { virtual ~HasModesIF() {} virtual MessageQueueId_t getCommandQueue() const = 0; + virtual ModeDefinitionHelper getModeDefinitionHelper()= 0; virtual void getMode(Mode_t *mode, Submode_t *submode) = 0; protected: diff --git a/src/fsfw/modes/ModeDefinitionHelper.h b/src/fsfw/modes/ModeDefinitionHelper.h new file mode 100644 index 00000000..2548dff5 --- /dev/null +++ b/src/fsfw/modes/ModeDefinitionHelper.h @@ -0,0 +1,33 @@ +#pragma once + +#include + +class ModeDefinitionHelper { + public: +#ifdef FSFW_INTROSPECTION + ModeDefinitionHelper(EnumIF *mode, EnumIF *submode) : mode(mode), submode(submode) {} +#else + ModeDefinitionHelper(void *mode, void *submode) {}; +#endif + template + static ModeDefinitionHelper create() { +#ifdef FSFW_INTROSPECTION + EnumIF *mode = new Mode(); + EnumIF *submode = new Submode(); + return ModeDefinitionHelper(mode, submode); +#else + return ModeDefinitionHelper(nullptr, nullptr); +#endif + } + + void free() { +#ifdef FSFW_INTROSPECTION + delete mode; + delete submode; +#endif + } +#ifdef FSFW_INTROSPECTION + EnumIF *mode; + EnumIF *submode; +#endif +}; \ No newline at end of file diff --git a/src/fsfw/modes/ModeHelper.cpp b/src/fsfw/modes/ModeHelper.cpp index 2ea392ab..ea5926c8 100644 --- a/src/fsfw/modes/ModeHelper.cpp +++ b/src/fsfw/modes/ModeHelper.cpp @@ -106,3 +106,33 @@ bool ModeHelper::isTimedOut() { return countdown.hasTimedOut(); } bool ModeHelper::isForced() { return forced; } void ModeHelper::setForced(bool forced) { this->forced = forced; } + +#ifdef FSFW_INTROSPECTION + std::vector> ModeHelper::getModes() const override { + std::vector> modeVector; + auto modeDefinitionHelper = owner->getModeDefinitionHelper(); + EnumIF *mode = modeDefinitionHelper.mode; + for (size_t i = 0; i < mode->getSize(); i++) { + modeVector.push_back( + std::pair(mode->getElements()[i], mode->getDescriptions()[i])); + } + modeDefinitionHelper.free(); + return modeVector; + } + + std::vector> ModeHelper::getSubmodes(Mode_t mode) const override { + auto modeDefinitionHelper = owner->getModeDefinitionHelper(); + EnumIF *submode = modeDefinitionHelper.submode; + std::vector> submodeVector; + for (size_t i = 0; i < submode->getSize(); i++) { + uint32_t ignored; + if (owner->checkModeCommand(mode, submode->getElements()[i], &ignored) == + HasReturnvaluesIF::RETURN_OK) { + submodeVector.push_back(std::pair(submode->getElements()[i], + submode->getDescriptions()[i])); + } + } + modeDefinitionHelper.free(); + return submodeVector; + } +#endif \ No newline at end of file diff --git a/src/fsfw/modes/ModeHelper.h b/src/fsfw/modes/ModeHelper.h index 4d0479db..63583366 100644 --- a/src/fsfw/modes/ModeHelper.h +++ b/src/fsfw/modes/ModeHelper.h @@ -39,6 +39,12 @@ class ModeHelper { void setForced(bool forced); + #ifdef FSFW_INTROSPECTION + std::vector> getModes() const; + + std::vector> getSubmodes(Mode_t mode) const; +#endif + protected: HasModesIF *owner; MessageQueueId_t parentQueueId = MessageQueueIF::NO_QUEUE;