diff --git a/src/fsfw/action/Action.h b/src/fsfw/action/Action.h index 121e4e11a..661983931 100644 --- a/src/fsfw/action/Action.h +++ b/src/fsfw/action/Action.h @@ -13,6 +13,8 @@ #include "../introspection/Enum.h" #endif +//TODO ActionId_t + class Action: public SerializeIF { public: #ifdef FSFW_INTROSPECTION diff --git a/src/fsfw/datapool/DataSetEntry.h b/src/fsfw/datapool/DataSetEntry.h new file mode 100644 index 000000000..41ea0e950 --- /dev/null +++ b/src/fsfw/datapool/DataSetEntry.h @@ -0,0 +1,120 @@ +#pragma once + +#include + +#include "Dataset.h" +#include +#include +#include "DatasetEntryIF.h" +// TODO: ifdef introspection stuff + + + +template +class DatasetEntry : public DatasetEntryIF { + protected: +#ifdef FSFW_INTROSPECTION + DataSetEntry(Dataset *owner, const char *name) + : name(name) +#else + DataSetEntry(Dataset *owner) +#endif + { + owner->registerDataSetEntry(this); + } + + public: +#ifdef FSFW_INTROSPECTION + static DataSetEntry createDataSetEntry(Dataset *owner, const char *name) { + return DataSetEntry(owner, name); + } +#else + static DataSetEntry createDataSetEntry(Dataset *owner) { return DataSetEntry(owner); } +#endif + + bool isValid() override { + return enumHelper::value>::isValid(&value); + } + + operator T(){ + return value; + } + + DataSetEntry& operator =(const T& newValue){ + value = newValue; + return *this; + } + +#ifdef FSFW_INTROSPECTION + Types::DataSetEntryType getType() override { + return enumHelper::value>::template getType(); + } +#endif + + T value; + + ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize, + Endianness streamEndianness) const override { + return SerializeAdapter::serialize(&value, buffer, size, maxSize, streamEndianness); + } + + size_t getSerializedSize() const override { return SerializeAdapter::getSerializedSize(&value); } + + ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size, + Endianness streamEndianness) override { + return SerializeAdapter::deSerialize(&value, buffer, size, streamEndianness); + } + +#ifdef FSFW_INTROSPECTION + double getFloating() override { return (double)value; } + int64_t getSigned() override { return (int64_t)value; } + + bool setFloating(double value) override { + if (getType() != Types::FLOATING) { + return false; + } + this->value = T(value); + return true; + } + + bool setSigned(int64_t value) override { + if ((getType() != Types::SIGNED) && (getType() != Types::ENUM)) { + return false; + } + this->value = T(value); + return true; + } + + double getMinFloating() override { + return enumHelper::value>::template getMin(); + } + int64_t getMinSigned() override { + return enumHelper::value>::template getMin(); + } + + double getMaxFloating() override { + return enumHelper::value>::template getMax(); + } + int64_t getMaxSigned() override { + return enumHelper::value>::template getMax(); + } + + std::vector getEnumValues() override { + return enumHelper::value>::getEnumValues(&value); + } + const char *const *getEnumDescriptions() override { + return enumHelper::value>::getEnumDescriptions(&value); + } + + const char *getName() override { return name; } + + private: + const char *name; +#endif +}; + +#ifdef FSFW_INTROSPECTION +#define createDataSetEntry(p1, p2) createDataSetEntry(p1, p2) +#else +#define createDataSetEntry(p1, p2) createDataSetEntry(p1) +#endif \ No newline at end of file diff --git a/src/fsfw/datapool/DatapoolHelper.cpp b/src/fsfw/datapool/DatapoolHelper.cpp index 1e5e02f14..cd0b2fa84 100644 --- a/src/fsfw/datapool/DatapoolHelper.cpp +++ b/src/fsfw/datapool/DatapoolHelper.cpp @@ -1,12 +1,10 @@ #include "DatapoolHelper.h" -#include "Dataset.h" - DatapoolHelper::DatapoolHelper() {} DatapoolHelper::~DatapoolHelper() {} -const Dataset* DatapoolHelper::getDataSet(uint8_t id) { +const Dataset* DatapoolHelper::getDataSet(DataSetId_t id) { auto iter = dataSets.find(id); if (iter == dataSets.end()) { return nullptr; @@ -16,5 +14,5 @@ const Dataset* DatapoolHelper::getDataSet(uint8_t id) { void DatapoolHelper::registerSet(Dataset* set) { auto id = set->getId(); - dataSets.insert(std::pair(id, set)); + dataSets.emplace(id, set); } \ No newline at end of file diff --git a/src/fsfw/datapool/DatapoolHelper.h b/src/fsfw/datapool/DatapoolHelper.h index 9be45797b..967c1b561 100644 --- a/src/fsfw/datapool/DatapoolHelper.h +++ b/src/fsfw/datapool/DatapoolHelper.h @@ -1,24 +1,23 @@ #pragma once +#include "Dataset.h" + #include - #include -class Dataset; - class DatapoolHelper { public: DatapoolHelper(); ~DatapoolHelper(); - const Dataset* getDataSet(uint8_t id); + const Dataset* getDataSet(DataSetId_t id); - const std::map* getDatasets() const { + const std::map* getDatasets() const { return &dataSets; } void registerSet(Dataset* set); private: - std::map dataSets; + std::map dataSets; }; diff --git a/src/fsfw/datapool/Dataset.h b/src/fsfw/datapool/Dataset.h index 3a4a6b2eb..1ecd9cfb6 100644 --- a/src/fsfw/datapool/Dataset.h +++ b/src/fsfw/datapool/Dataset.h @@ -11,6 +11,9 @@ #include "DatasetEntryIF.h" #include "HasDatapoolIF.h" + +using DataSetId_t = uint32_t; + /** * This class has a dual use * @@ -44,8 +47,8 @@ class Dataset { Dataset(uint32_t owner_id); void setEnum(EnumIF* theEnum); #else - Dataset(HasDatapoolIF* owner, uint8_t id, bool allowUserCommit); - Dataset(uint32_t owner_id, uint8_t id); + Dataset(HasDatapoolIF* owner, uint32_t id, bool allowUserCommit); + Dataset(uint32_t owner_id, uint32_t id); #endif public: ~Dataset(); @@ -156,9 +159,6 @@ class Dataset { const char* getDescription() const; #endif - /** - * returns whether the set is the actual owned set (entries should allocate actual variables) - */ bool registerEntry(DatasetEntryIF*); protected: diff --git a/src/fsfw/datapool/DatasetEntryIF.h b/src/fsfw/datapool/DatasetEntryIF.h index a08a9ca27..9835fe86c 100644 --- a/src/fsfw/datapool/DatasetEntryIF.h +++ b/src/fsfw/datapool/DatasetEntryIF.h @@ -9,10 +9,7 @@ class DatasetEntryIF { friend class Dataset; public: - /** - * @brief This is an empty virtual destructor, - * as it is required for C++ interfaces. - */ + virtual ~DatasetEntryIF() {} /** * @brief This method allows to set the valid information of the pool entry. @@ -24,7 +21,7 @@ class DatasetEntryIF { virtual bool getValid() = 0; - #ifdef FSFW_INTROSPECTION +#ifdef FSFW_INTROSPECTION virtual const char *getName() = 0; diff --git a/src/fsfw/datapool/TemplateSet.h b/src/fsfw/datapool/TemplateSet.h index 1bc9d7642..cf31e63ea 100644 --- a/src/fsfw/datapool/TemplateSet.h +++ b/src/fsfw/datapool/TemplateSet.h @@ -2,6 +2,8 @@ #include "DataSet.h" +//TODO use object_id_t + template class TemplateSet : public Dataset { public: @@ -14,10 +16,10 @@ class TemplateSet : public Dataset { TemplateSet(uint32_t owner_id, HkIDs id) : Dataset(owner_id) { setEnum(&id); } #else TemplateSet(HasDatapoolIF* owner, HkIDs id, bool allowUserCommit) - : Dataset(owner, (uint8_t)id, allowUserCommit) { + : Dataset(owner, static_cast(id), allowUserCommit) { owner->getDatapoolHelper()->registerSet(this); } - TemplateSet(uint32_t owner_id, HkIDs id) : Dataset(owner_id, (uint8_t)id) {} + TemplateSet(uint32_t owner_id, HkIDs id) : Dataset(owner_id, static_cast(id) {} #endif virtual ~TemplateSet() = default; }; \ No newline at end of file