diff --git a/CHANGELOG b/CHANGELOG index 298ef0d4..fc46ee02 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -81,4 +81,7 @@ now For the fsfw, this can be done by checking the processor define FSFW_CPP_OSTREAM_ENABLED from FSFWConfig.h. For mission code, developers need to replace sif:: calls by the printf counterparts, but only if the CPP stream are excluded. If this is not the case, everything should work as usual. -- \ No newline at end of file + +### PUS Parameter Service 20 + +Added PUS parameter service 20 (only custom subservices available). \ No newline at end of file diff --git a/action/ActionHelper.cpp b/action/ActionHelper.cpp index 23c9d732..e32be68b 100644 --- a/action/ActionHelper.cpp +++ b/action/ActionHelper.cpp @@ -3,6 +3,7 @@ #include "../ipc/MessageQueueSenderIF.h" #include "../objectmanager/ObjectManagerIF.h" +#include "../serviceinterface/ServiceInterface.h" ActionHelper::ActionHelper(HasActionsIF* setOwner, MessageQueueIF* useThisQueue) : @@ -86,13 +87,20 @@ ReturnValue_t ActionHelper::reportData(MessageQueueId_t reportTo, uint8_t *dataPtr; size_t maxSize = data->getSerializedSize(); if (maxSize == 0) { - //No error, there's simply nothing to report. + /* No error, there's simply nothing to report. */ return HasReturnvaluesIF::RETURN_OK; } size_t size = 0; ReturnValue_t result = ipcStore->getFreeElement(&storeAddress, maxSize, &dataPtr); if (result != HasReturnvaluesIF::RETURN_OK) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::warning << "ActionHelper::reportData: Getting free element from IPC store failed!" << + std::endl; +#else + sif::printWarning("ActionHelper::reportData: Getting free element from IPC " + "store failed!\n"); +#endif return result; } result = data->serialize(&dataPtr, &size, maxSize, @@ -101,14 +109,13 @@ ReturnValue_t ActionHelper::reportData(MessageQueueId_t reportTo, ipcStore->deleteData(storeAddress); return result; } - // We don't need to report the objectId, as we receive REQUESTED data - // before the completion success message. - // True aperiodic replies need to be reported with - // another dedicated message. + + /* We don't need to report the objectId, as we receive REQUESTED data before the completion + success message. True aperiodic replies need to be reported with another dedicated message. */ ActionMessage::setDataReply(&reply, replyId, storeAddress); - // If the sender needs to be hidden, for example to handle packet - // as unrequested reply, this will be done here. + /* If the sender needs to be hidden, for example to handle packet + as unrequested reply, this will be done here. */ if (hideSender) { result = MessageQueueSenderIF::sendMessage(reportTo, &reply); } @@ -132,6 +139,11 @@ ReturnValue_t ActionHelper::reportData(MessageQueueId_t reportTo, store_address_t storeAddress; ReturnValue_t result = ipcStore->addData(&storeAddress, data, dataSize); if (result != HasReturnvaluesIF::RETURN_OK) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::warning << "ActionHelper::reportData: Adding data to IPC store failed!" << std::endl; +#else + sif::printWarning("ActionHelper::reportData: Adding data to IPC store failed!\n"); +#endif return result; } @@ -140,14 +152,12 @@ ReturnValue_t ActionHelper::reportData(MessageQueueId_t reportTo, return result; } - // We don't need to report the objectId, as we receive REQUESTED data - // before the completion success message. - // True aperiodic replies need to be reported with - // another dedicated message. + /* We don't need to report the objectId, as we receive REQUESTED data before the completion + success message. True aperiodic replies need to be reported with another dedicated message. */ ActionMessage::setDataReply(&reply, replyId, storeAddress); - // If the sender needs to be hidden, for example to handle packet - // as unrequested reply, this will be done here. + /* If the sender needs to be hidden, for example to handle packet + as unrequested reply, this will be done here. */ if (hideSender) { result = MessageQueueSenderIF::sendMessage(reportTo, &reply); } diff --git a/action/ActionHelper.h b/action/ActionHelper.h index ae971d38..35ac41d1 100644 --- a/action/ActionHelper.h +++ b/action/ActionHelper.h @@ -101,7 +101,8 @@ public: protected: //! Increase of value of this per step static const uint8_t STEP_OFFSET = 1; - HasActionsIF* owner;//!< Pointer to the owner + //! Pointer to the owner + HasActionsIF* owner; //! Queue to be used as response sender, has to be set in ctor or with //! setQueueToUse MessageQueueIF* queueToUse; diff --git a/action/CMakeLists.txt b/action/CMakeLists.txt index a62d4044..f9ac451d 100644 --- a/action/CMakeLists.txt +++ b/action/CMakeLists.txt @@ -1,7 +1,7 @@ target_sources(${LIB_FSFW_NAME} - PRIVATE - ActionHelper.cpp - ActionMessage.cpp - CommandActionHelper.cpp - SimpleActionHelper.cpp + PRIVATE + ActionHelper.cpp + ActionMessage.cpp + CommandActionHelper.cpp + SimpleActionHelper.cpp ) \ No newline at end of file diff --git a/container/CMakeLists.txt b/container/CMakeLists.txt index 904cde55..13eced1d 100644 --- a/container/CMakeLists.txt +++ b/container/CMakeLists.txt @@ -1,5 +1,5 @@ target_sources(${LIB_FSFW_NAME} - PRIVATE - SharedRingBuffer.cpp - SimpleRingBuffer.cpp + PRIVATE + SharedRingBuffer.cpp + SimpleRingBuffer.cpp ) \ No newline at end of file diff --git a/datapool/PoolDataSetBase.cpp b/datapool/PoolDataSetBase.cpp index 01069785..2fd51966 100644 --- a/datapool/PoolDataSetBase.cpp +++ b/datapool/PoolDataSetBase.cpp @@ -1,5 +1,6 @@ #include "PoolDataSetBase.h" #include "../serviceinterface/ServiceInterfaceStream.h" +#include PoolDataSetBase::PoolDataSetBase(PoolVariableIF** registeredVariablesArray, const size_t maxFillCount): diff --git a/datapool/PoolDataSetBase.h b/datapool/PoolDataSetBase.h index 75654146..ab895455 100644 --- a/datapool/PoolDataSetBase.h +++ b/datapool/PoolDataSetBase.h @@ -39,8 +39,12 @@ public: * supply a pointer to this dataset to PoolVariable * initializations to register pool variables. */ - PoolDataSetBase(PoolVariableIF** registeredVariablesArray, - const size_t maxFillCount); + PoolDataSetBase(PoolVariableIF** registeredVariablesArray, const size_t maxFillCount); + + /* Forbidden for now */ + PoolDataSetBase(const PoolDataSetBase& otherSet) = delete; + const PoolDataSetBase& operator=(const PoolDataSetBase& otherSet) = delete; + virtual~ PoolDataSetBase(); /** @@ -63,8 +67,7 @@ public: * - @c SET_WAS_ALREADY_READ if read() is called twice without calling * commit() in between */ - virtual ReturnValue_t read( - MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING, + virtual ReturnValue_t read(MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING, uint32_t lockTimeout = 20) override; /** * @brief The commit call initializes writing back the registered variables. @@ -84,8 +87,7 @@ public: * - @c COMMITING_WITHOUT_READING if set was not read yet and * contains non write-only variables */ - virtual ReturnValue_t commit( - MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING, + virtual ReturnValue_t commit(MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING, uint32_t lockTimeout = 20) override; /** diff --git a/datapoollocal/LocalPoolDataSetBase.cpp b/datapoollocal/LocalPoolDataSetBase.cpp index 00293645..d1d95d8a 100644 --- a/datapoollocal/LocalPoolDataSetBase.cpp +++ b/datapoollocal/LocalPoolDataSetBase.cpp @@ -67,9 +67,19 @@ LocalPoolDataSetBase::LocalPoolDataSetBase( LocalPoolDataSetBase::~LocalPoolDataSetBase() { + /* We only delete objects which were created in the class constructor */ if(periodicHelper != nullptr) { delete periodicHelper; } + /* In case set was read but not comitted, we commit all variables with an invalid state */ + if(state == States::STATE_SET_WAS_READ) { + for (uint16_t count = 0; count < fillCount; count++) { + if(registeredVariables[count] != nullptr) { + registeredVariables[count]->setValid(false); + registeredVariables[count]->commit(MutexIF::TimeoutType::WAITING, 20); + } + } + } } ReturnValue_t LocalPoolDataSetBase::lockDataPool( diff --git a/datapoollocal/LocalPoolDataSetBase.h b/datapoollocal/LocalPoolDataSetBase.h index cc41b0eb..ca907431 100644 --- a/datapoollocal/LocalPoolDataSetBase.h +++ b/datapoollocal/LocalPoolDataSetBase.h @@ -97,12 +97,18 @@ public: * @brief The destructor automatically manages writing the valid * information of variables. * @details - * In case the data set was read out, but not committed(indicated by state), + * In case the data set was read out, but not committed (indicated by state), * the destructor parses all variables that are still registered to the set. * For each, the valid flag in the data pool is set to "invalid". */ ~LocalPoolDataSetBase(); + /* The copy constructor and assingment constructor are forbidden for now. + The use-cases are limited and the first step would be to implement them properly for the + base class */ + LocalPoolDataSetBase(const LocalPoolDataSetBase& otherSet) = delete; + const LocalPoolDataSetBase& operator=(const LocalPoolDataSetBase& otherSet) = delete; + void setValidityBufferGeneration(bool withValidityBuffer); sid_t getSid() const; @@ -153,6 +159,7 @@ public: bool hasChanged() const override; object_id_t getCreatorObjectId(); + protected: sid_t sid; //! This mutex is used if the data is created by one object only. diff --git a/datapoollocal/LocalPoolObjectBase.h b/datapoollocal/LocalPoolObjectBase.h index 797cf8b5..3f7fb6dd 100644 --- a/datapoollocal/LocalPoolObjectBase.h +++ b/datapoollocal/LocalPoolObjectBase.h @@ -20,12 +20,10 @@ class LocalPoolObjectBase: public PoolVariableIF, public HasReturnvaluesIF, public MarkChangedIF { public: - LocalPoolObjectBase(lp_id_t poolId, - HasLocalDataPoolIF* hkOwner, DataSetIF* dataSet, + LocalPoolObjectBase(lp_id_t poolId, HasLocalDataPoolIF* hkOwner, DataSetIF* dataSet, pool_rwm_t setReadWriteMode); - LocalPoolObjectBase(object_id_t poolOwner, lp_id_t poolId, - DataSetIF* dataSet = nullptr, + LocalPoolObjectBase(object_id_t poolOwner, lp_id_t poolId, DataSetIF* dataSet = nullptr, pool_rwm_t setReadWriteMode = pool_rwm_t::VAR_READ_WRITE); void setReadWriteMode(pool_rwm_t newReadWriteMode);