Compare commits
	
		
			21 Commits
		
	
	
		
			develop
			...
			action-upd
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						60f6ef5f1f
	
				 | 
					
					
						|||
| 4ecd9eb62e | |||
| fb89d7a3b6 | |||
| 146c3471d0 | |||
| 1816c3f623 | |||
| d03d5aa74c | |||
| 26e97ddf89 | |||
| be3a57a795 | |||
| 13b97abf0d | |||
| f95c373076 | |||
| e03731bcf8 | |||
| 9fe8579377 | |||
| 2714e588d7 | |||
| e905288adc | |||
| 3805ea50a7 | |||
| 699bd694cd | |||
| c35a0a8541 | |||
| e0a072859b | |||
| 067cb7d0f8 | |||
| 2c17af4ef8 | |||
| 110fb43b9c | 
							
								
								
									
										11
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -10,8 +10,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 | 
			
		||||
 | 
			
		||||
## Fixes
 | 
			
		||||
 | 
			
		||||
- The `PusTmCreator` API only accepted 255 bytes of source data. It can now accept source
 | 
			
		||||
  data with a size limited only by the size of `size_t`.
 | 
			
		||||
- Important bugfix in CFDP PDU header format: The entity length field and the transaction sequence
 | 
			
		||||
  number fields stored the actual length of the field instead of the length minus 1 like specified
 | 
			
		||||
  in the CFDP standard.
 | 
			
		||||
- PUS Health Service: Size check for set health command.
 | 
			
		||||
                      Perform operation completion for announce health command.
 | 
			
		||||
  Perform operation completion for announce health command.
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/746
 | 
			
		||||
- Linux OSAL `getUptime` fix: Check validity of `/proc/uptime` file before reading uptime.
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/745
 | 
			
		||||
@@ -22,8 +27,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 | 
			
		||||
 | 
			
		||||
- add CFDP subsystem ID
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/742
 | 
			
		||||
- `EventManager`: Add function to print all listeners.
 | 
			
		||||
 | 
			
		||||
## Changed
 | 
			
		||||
 | 
			
		||||
- Bump ETL version to 20.35.14
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/748
 | 
			
		||||
- Renamed `PCDU_2` subsystem ID to `POWER_SWITCH_IF`.
 | 
			
		||||
@@ -32,6 +39,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/743
 | 
			
		||||
- Assert that `FixedArrayList` is larger than 0 at compile time.
 | 
			
		||||
  https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/740
 | 
			
		||||
- `EventManager`: Queue depth is configurable now
 | 
			
		||||
- `ActionHelper`: Allow execution of actions without additional data
 | 
			
		||||
 | 
			
		||||
# [v6.0.0] 2023-02-10
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +72,7 @@ set(FSFW_ETL_LIB_MAJOR_VERSION
 | 
			
		||||
    20
 | 
			
		||||
    CACHE STRING "ETL library major version requirement")
 | 
			
		||||
set(FSFW_ETL_LIB_VERSION
 | 
			
		||||
    ${FSFW_ETL_LIB_MAJOR_VERSION}.35.14
 | 
			
		||||
    ${FSFW_ETL_LIB_MAJOR_VERSION}.36.0
 | 
			
		||||
    CACHE STRING "ETL library exact version requirement")
 | 
			
		||||
set(FSFW_ETL_LINK_TARGET etl::etl)
 | 
			
		||||
 | 
			
		||||
@@ -80,7 +80,7 @@ set(FSFW_CATCH2_LIB_MAJOR_VERSION
 | 
			
		||||
    3
 | 
			
		||||
    CACHE STRING "Catch2 library major version requirement")
 | 
			
		||||
set(FSFW_CATCH2_LIB_VERSION
 | 
			
		||||
    v${FSFW_CATCH2_LIB_MAJOR_VERSION}.1.0
 | 
			
		||||
    v${FSFW_CATCH2_LIB_MAJOR_VERSION}.3.2
 | 
			
		||||
    CACHE STRING "Catch2 library exact version requirement")
 | 
			
		||||
 | 
			
		||||
# Keep this off by default for now. See PR:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								automation/Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								automation/Jenkinsfile
									
									
									
									
										vendored
									
									
								
							@@ -97,7 +97,7 @@ pipeline {
 | 
			
		||||
                        sh 'rsync -r --delete docs/sphinx/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/development'
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                dir(BUILDDIR) {
 | 
			
		||||
                dir(BUILDDIR_LINUX) {
 | 
			
		||||
                    sshagent(credentials: ['documentation-buildfix']) {
 | 
			
		||||
                        sh 'rsync -r --delete fsfw-tests_coverage/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/coverage/development'
 | 
			
		||||
                    }
 | 
			
		||||
@@ -116,7 +116,7 @@ pipeline {
 | 
			
		||||
                        sh 'rsync -r --delete docs/sphinx/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/master'
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                dir(BUILDDIR) {
 | 
			
		||||
                dir(BUILDDIR_LINUX) {
 | 
			
		||||
                    sshagent(credentials: ['documentation-buildfix']) {
 | 
			
		||||
                        sh 'rsync -r --delete fsfw-tests_coverage/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/coverage/master'
 | 
			
		||||
                    }
 | 
			
		||||
 
 | 
			
		||||
@@ -59,17 +59,24 @@ void ActionHelper::setQueueToUse(MessageQueueIF* queue) { queueToUse = queue; }
 | 
			
		||||
 | 
			
		||||
void ActionHelper::prepareExecution(MessageQueueId_t commandedBy, ActionId_t actionId,
 | 
			
		||||
                                    store_address_t dataAddress) {
 | 
			
		||||
  bool hasAdditionalData = false;
 | 
			
		||||
  const uint8_t* dataPtr = nullptr;
 | 
			
		||||
  size_t size = 0;
 | 
			
		||||
  ReturnValue_t result = ipcStore->getData(dataAddress, &dataPtr, &size);
 | 
			
		||||
  if (result != returnvalue::OK) {
 | 
			
		||||
    CommandMessage reply;
 | 
			
		||||
    ActionMessage::setStepReply(&reply, actionId, 0, result);
 | 
			
		||||
    queueToUse->sendMessage(commandedBy, &reply);
 | 
			
		||||
    return;
 | 
			
		||||
  ReturnValue_t result;
 | 
			
		||||
  if (dataAddress != store_address_t::invalid()) {
 | 
			
		||||
    hasAdditionalData = true;
 | 
			
		||||
    ReturnValue_t result = ipcStore->getData(dataAddress, &dataPtr, &size);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
      CommandMessage reply;
 | 
			
		||||
      ActionMessage::setStepReply(&reply, actionId, 0, result);
 | 
			
		||||
      queueToUse->sendMessage(commandedBy, &reply);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  result = owner->executeAction(actionId, commandedBy, dataPtr, size);
 | 
			
		||||
  ipcStore->deleteData(dataAddress);
 | 
			
		||||
  if (hasAdditionalData) {
 | 
			
		||||
    ipcStore->deleteData(dataAddress);
 | 
			
		||||
  }
 | 
			
		||||
  if (result == HasActionsIF::EXECUTION_FINISHED) {
 | 
			
		||||
    CommandMessage reply;
 | 
			
		||||
    ActionMessage::setCompletionReply(&reply, actionId, true, result);
 | 
			
		||||
 
 | 
			
		||||
@@ -16,8 +16,8 @@ class CommandActionHelper {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit CommandActionHelper(CommandsActionsIF* owner);
 | 
			
		||||
  virtual ~CommandActionHelper();
 | 
			
		||||
  ReturnValue_t commandAction(object_id_t commandTo, ActionId_t actionId, const uint8_t* data,
 | 
			
		||||
                              uint32_t size);
 | 
			
		||||
  ReturnValue_t commandAction(object_id_t commandTo, ActionId_t actionId,
 | 
			
		||||
                              const uint8_t* data = nullptr, uint32_t size = 0);
 | 
			
		||||
  ReturnValue_t commandAction(object_id_t commandTo, ActionId_t actionId, SerializeIF* data);
 | 
			
		||||
  ReturnValue_t initialize();
 | 
			
		||||
  ReturnValue_t handleReply(CommandMessage* reply);
 | 
			
		||||
 
 | 
			
		||||
@@ -51,8 +51,9 @@ class VarLenField : public SerializeIF {
 | 
			
		||||
    return os;
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overloaded above, so this is needed to uncofuse the
 | 
			
		||||
                                   // compiler
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                            Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,8 +24,8 @@ ReturnValue_t HeaderCreator::serialize(uint8_t **buffer, size_t *size, size_t ma
 | 
			
		||||
  *buffer += 1;
 | 
			
		||||
  **buffer = pduDataFieldLen & 0x00ff;
 | 
			
		||||
  *buffer += 1;
 | 
			
		||||
  **buffer = segmentationCtrl << 7 | pduConf.sourceId.getWidth() << 4 | segmentMetadataFlag << 3 |
 | 
			
		||||
             pduConf.seqNum.getWidth();
 | 
			
		||||
  **buffer = segmentationCtrl << 7 | ((pduConf.sourceId.getWidth() - 1) << 4) |
 | 
			
		||||
             segmentMetadataFlag << 3 | (pduConf.seqNum.getWidth() - 1);
 | 
			
		||||
  *buffer += 1;
 | 
			
		||||
  *size += 4;
 | 
			
		||||
  ReturnValue_t result = pduConf.sourceId.serialize(buffer, size, maxSize, streamEndianness);
 | 
			
		||||
 
 | 
			
		||||
@@ -78,11 +78,11 @@ cfdp::SegmentationControl PduHeaderReader::getSegmentationControl() const {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cfdp::WidthInBytes PduHeaderReader::getLenEntityIds() const {
 | 
			
		||||
  return static_cast<cfdp::WidthInBytes>((pointers.fixedHeader->fourthByte >> 4) & 0x07);
 | 
			
		||||
  return static_cast<cfdp::WidthInBytes>(((pointers.fixedHeader->fourthByte >> 4) & 0b111) + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cfdp::WidthInBytes PduHeaderReader::getLenSeqNum() const {
 | 
			
		||||
  return static_cast<cfdp::WidthInBytes>(pointers.fixedHeader->fourthByte & 0x07);
 | 
			
		||||
  return static_cast<cfdp::WidthInBytes>((pointers.fixedHeader->fourthByte & 0b111) + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cfdp::SegmentMetadataFlag PduHeaderReader::getSegmentMetadataFlag() const {
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,8 @@ class EntityIdTlv : public TlvIF {
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t deSerialize(cfdp::Tlv& tlv, Endianness endianness);
 | 
			
		||||
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overloaded this function, so this is needed to unconfuse
 | 
			
		||||
                                   // the compiler
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,8 @@ class FilestoreResponseTlv : public cfdp::FilestoreTlvBase {
 | 
			
		||||
   */
 | 
			
		||||
  ReturnValue_t deSerialize(const cfdp::Tlv& tlv, Endianness endianness);
 | 
			
		||||
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overloaded this function, so this is needed to unconfuse
 | 
			
		||||
                                   // the compiler
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -155,8 +155,8 @@ class FixedMap : public SerializeIF {
 | 
			
		||||
 | 
			
		||||
  uint32_t maxSize() const { return theMap.maxSize(); }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const {
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override {
 | 
			
		||||
    ReturnValue_t result =
 | 
			
		||||
        SerializeAdapter::serialize(&this->_size, buffer, size, maxSize, streamEndianness);
 | 
			
		||||
    uint32_t i = 0;
 | 
			
		||||
@@ -170,7 +170,7 @@ class FixedMap : public SerializeIF {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const {
 | 
			
		||||
  size_t getSerializedSize() const override {
 | 
			
		||||
    uint32_t printSize = sizeof(_size);
 | 
			
		||||
    uint32_t i = 0;
 | 
			
		||||
 | 
			
		||||
@@ -182,8 +182,8 @@ class FixedMap : public SerializeIF {
 | 
			
		||||
    return printSize;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    Endianness streamEndianness) {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override {
 | 
			
		||||
    ReturnValue_t result =
 | 
			
		||||
        SerializeAdapter::deSerialize(&this->_size, buffer, size, streamEndianness);
 | 
			
		||||
    if (this->_size > theMap.maxSize()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -64,8 +64,8 @@ class PoolDataSetBase : public PoolDataSetIF, public SerializeIF {
 | 
			
		||||
   * - @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,
 | 
			
		||||
                             uint32_t lockTimeout = 20) override;
 | 
			
		||||
  ReturnValue_t read(MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
 | 
			
		||||
                     uint32_t lockTimeout = 20) override;
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief	The commit call initializes writing back the registered variables.
 | 
			
		||||
   * @details
 | 
			
		||||
@@ -84,15 +84,15 @@ class PoolDataSetBase : public PoolDataSetIF, public SerializeIF {
 | 
			
		||||
   * 			- @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,
 | 
			
		||||
                               uint32_t lockTimeout = 20) override;
 | 
			
		||||
  ReturnValue_t commit(MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
 | 
			
		||||
                       uint32_t lockTimeout = 20) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Register the passed pool variable instance into the data set.
 | 
			
		||||
   * @param variable
 | 
			
		||||
   * @return
 | 
			
		||||
   */
 | 
			
		||||
  virtual ReturnValue_t registerVariable(PoolVariableIF* variable) override;
 | 
			
		||||
  ReturnValue_t registerVariable(PoolVariableIF* variable) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Provides the means to lock the underlying data structure to ensure
 | 
			
		||||
 
 | 
			
		||||
@@ -87,9 +87,9 @@ class LocalPoolVariable : public LocalPoolObjectBase {
 | 
			
		||||
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          SerializeIF::Endianness streamEndianness) const override;
 | 
			
		||||
  virtual size_t getSerializedSize() const override;
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    SerializeIF::Endianness streamEndianness) override;
 | 
			
		||||
  size_t getSerializedSize() const override;
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            SerializeIF::Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief	This is a call to read the array's values
 | 
			
		||||
 
 | 
			
		||||
@@ -98,11 +98,11 @@ class LocalPoolVector : public LocalPoolObjectBase {
 | 
			
		||||
  T& operator[](size_t i);
 | 
			
		||||
  const T& operator[](size_t i) const;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, const size_t maxSize,
 | 
			
		||||
                                  SerializeIF::Endianness streamEndiannes) const override;
 | 
			
		||||
  virtual size_t getSerializedSize() const override;
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    SerializeIF::Endianness streamEndianness) override;
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, const size_t maxSize,
 | 
			
		||||
                          SerializeIF::Endianness streamEndiannes) const override;
 | 
			
		||||
  size_t getSerializedSize() const override;
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            SerializeIF::Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief	This is a call to read the array's values
 | 
			
		||||
 
 | 
			
		||||
@@ -15,11 +15,12 @@ const LocalPool::LocalPoolConfig EventManager::poolConfig = {
 | 
			
		||||
    {fsfwconfig::FSFW_EVENTMGMT_EVENTIDMATCHERS, sizeof(EventIdRangeMatcher)},
 | 
			
		||||
    {fsfwconfig::FSFW_EVENTMGMR_RANGEMATCHERS, sizeof(ReporterRangeMatcher)}};
 | 
			
		||||
 | 
			
		||||
EventManager::EventManager(object_id_t setObjectId)
 | 
			
		||||
EventManager::EventManager(object_id_t setObjectId, uint32_t eventQueueDepth)
 | 
			
		||||
    : SystemObject(setObjectId), factoryBackend(0, poolConfig, false, true) {
 | 
			
		||||
  mutex = MutexFactory::instance()->createMutex();
 | 
			
		||||
  eventReportQueue = QueueFactory::instance()->createMessageQueue(MAX_EVENTS_PER_CYCLE,
 | 
			
		||||
                                                                  EventMessage::EVENT_MESSAGE_SIZE);
 | 
			
		||||
  auto mqArgs = MqArgs(setObjectId, static_cast<void*>(this));
 | 
			
		||||
  eventReportQueue = QueueFactory::instance()->createMessageQueue(
 | 
			
		||||
      eventQueueDepth, EventMessage::EVENT_MESSAGE_SIZE, &mqArgs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EventManager::~EventManager() {
 | 
			
		||||
@@ -47,9 +48,20 @@ ReturnValue_t EventManager::performOperation(uint8_t opCode) {
 | 
			
		||||
 | 
			
		||||
void EventManager::notifyListeners(EventMessage* message) {
 | 
			
		||||
  lockMutex();
 | 
			
		||||
  for (auto iter = listenerList.begin(); iter != listenerList.end(); ++iter) {
 | 
			
		||||
    if (iter->second.match(message)) {
 | 
			
		||||
      MessageQueueSenderIF::sendMessage(iter->first, message, message->getSender());
 | 
			
		||||
  for (auto& listener : listenerList) {
 | 
			
		||||
    if (listener.second.match(message)) {
 | 
			
		||||
      ReturnValue_t result =
 | 
			
		||||
          MessageQueueSenderIF::sendMessage(listener.first, message, message->getSender());
 | 
			
		||||
      if (result != returnvalue::OK) {
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
 | 
			
		||||
        sif::error << std::hex << "EventManager::notifyListeners: MSG to 0x" << std::setfill('0')
 | 
			
		||||
                   << std::setw(8) << listener.first << " failed with result 0x" << std::setw(4)
 | 
			
		||||
                   << result << std::setfill(' ') << std::endl;
 | 
			
		||||
#else
 | 
			
		||||
        sif::printError("Sending message to listener 0x%08x failed with result %04x\n",
 | 
			
		||||
                        listener.first, result);
 | 
			
		||||
#endif
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  unlockMutex();
 | 
			
		||||
@@ -200,4 +212,19 @@ void EventManager::printUtility(sif::OutputTypes printType, EventMessage* messag
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void EventManager::printListeners() {
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
 | 
			
		||||
  sif::info << "Event manager listener MQ IDs:" << std::setfill('0') << std::hex << std::endl;
 | 
			
		||||
  for (auto& listener : listenerList) {
 | 
			
		||||
    sif::info << "0x" << std::setw(8) << listener.first << std::endl;
 | 
			
		||||
  }
 | 
			
		||||
  sif::info << std::dec << std::setfill(' ');
 | 
			
		||||
#else
 | 
			
		||||
  sif::printInfo("Event manager listener MQ IDs:\n");
 | 
			
		||||
  for (auto& listener : listenerList) {
 | 
			
		||||
    sif::printInfo("0x%08x\n", listener.first);
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* FSFW_OBJ_EVENT_TRANSLATION == 1 */
 | 
			
		||||
 
 | 
			
		||||
@@ -21,9 +21,7 @@ extern const char* translateEvents(Event event);
 | 
			
		||||
 | 
			
		||||
class EventManager : public EventManagerIF, public ExecutableObjectIF, public SystemObject {
 | 
			
		||||
 public:
 | 
			
		||||
  static const uint16_t MAX_EVENTS_PER_CYCLE = 80;
 | 
			
		||||
 | 
			
		||||
  EventManager(object_id_t setObjectId);
 | 
			
		||||
  EventManager(object_id_t setObjectId, uint32_t eventQueueDepth);
 | 
			
		||||
  virtual ~EventManager();
 | 
			
		||||
 | 
			
		||||
  void setMutexTimeout(MutexIF::TimeoutType timeoutType, uint32_t timeoutMs);
 | 
			
		||||
@@ -44,6 +42,7 @@ class EventManager : public EventManagerIF, public ExecutableObjectIF, public Sy
 | 
			
		||||
                                          object_id_t reporterFrom = 0, object_id_t reporterTo = 0,
 | 
			
		||||
                                          bool reporterInverted = false);
 | 
			
		||||
  ReturnValue_t performOperation(uint8_t opCode);
 | 
			
		||||
  void printListeners();
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  MessageQueueIF* eventReportQueue = nullptr;
 | 
			
		||||
 
 | 
			
		||||
@@ -44,13 +44,13 @@ class Type : public SerializeIF {
 | 
			
		||||
 | 
			
		||||
  static ActualType_t getActualType(uint8_t ptc, uint8_t pfc);
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const override;
 | 
			
		||||
  ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override;
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const override;
 | 
			
		||||
  size_t getSerializedSize() const override;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                                    Endianness streamEndianness) override;
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                            Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  ActualType_t actualType;
 | 
			
		||||
 
 | 
			
		||||
@@ -54,8 +54,8 @@ class HousekeepingSnapshot : public SerializeIF {
 | 
			
		||||
  HousekeepingSnapshot(uint8_t* timeStamp, size_t timeStampSize, LocalPoolObjectBase* dataSetPtr)
 | 
			
		||||
      : timeStamp(timeStamp), timeStampSize(timeStampSize), updateData(dataSetPtr){};
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const {
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const {
 | 
			
		||||
    if (timeStamp != nullptr) {
 | 
			
		||||
      /* Endianness will always be MACHINE, so we can simply use memcpy
 | 
			
		||||
      here. */
 | 
			
		||||
@@ -70,15 +70,15 @@ class HousekeepingSnapshot : public SerializeIF {
 | 
			
		||||
    return updateData->serialize(buffer, size, maxSize, streamEndianness);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const {
 | 
			
		||||
  size_t getSerializedSize() const {
 | 
			
		||||
    if (updateData == nullptr) {
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
    return timeStampSize + updateData->getSerializedSize();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    SerializeIF::Endianness streamEndianness) override {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            SerializeIF::Endianness streamEndianness) override {
 | 
			
		||||
    if (*size < timeStampSize) {
 | 
			
		||||
      return SerializeIF::STREAM_TOO_SHORT;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -32,9 +32,9 @@ class AbsLimitMonitor : public MonitorBase<T> {
 | 
			
		||||
    return returnvalue::OK;  // We're not out of range.
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t getParameter(uint8_t domainId, uint16_t parameterId,
 | 
			
		||||
                                     ParameterWrapper *parameterWrapper,
 | 
			
		||||
                                     const ParameterWrapper *newValues, uint16_t startAtIndex) {
 | 
			
		||||
  ReturnValue_t getParameter(uint8_t domainId, uint8_t parameterId,
 | 
			
		||||
                             ParameterWrapper *parameterWrapper, const ParameterWrapper *newValues,
 | 
			
		||||
                             uint16_t startAtIndex) override {
 | 
			
		||||
    ReturnValue_t result = this->MonitorBase<T>::getParameter(
 | 
			
		||||
        domainId, parameterId, parameterWrapper, newValues, startAtIndex);
 | 
			
		||||
    // We'll reuse the DOMAIN_ID of MonitorReporter,
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ class MonitoringMessage : public CommandMessage {
 | 
			
		||||
  static const Command_t LIMIT_VIOLATION_REPORT = MAKE_COMMAND_ID(10);
 | 
			
		||||
  virtual ~MonitoringMessage();
 | 
			
		||||
  static void setLimitViolationReport(CommandMessage* message, store_address_t storeId);
 | 
			
		||||
  using CommandMessage::clear;
 | 
			
		||||
  static void clear(CommandMessage* message);
 | 
			
		||||
  static store_address_t getStoreId(const CommandMessage* message);
 | 
			
		||||
  static void setTypicalMessage(CommandMessage* message, Command_t type, store_address_t storeId);
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,8 @@ int TcpIpBase::closeSocket(socket_t socket) {
 | 
			
		||||
  return closesocket(socket);
 | 
			
		||||
#elif defined(PLATFORM_UNIX)
 | 
			
		||||
  return close(socket);
 | 
			
		||||
#else
 | 
			
		||||
  return -1;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -48,5 +50,7 @@ int TcpIpBase::getLastSocketError() {
 | 
			
		||||
  return WSAGetLastError();
 | 
			
		||||
#elif defined(PLATFORM_UNIX)
 | 
			
		||||
  return errno;
 | 
			
		||||
#else
 | 
			
		||||
  return 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,9 +16,9 @@
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
TcpTmTcBridge::TcpTmTcBridge(object_id_t objectId, object_id_t tcDestination, object_id_t tmStoreId,
 | 
			
		||||
                             object_id_t tcStoreId)
 | 
			
		||||
    : TmTcBridge("TCP TMTC Bridge", objectId, tcDestination, tmStoreId, tcStoreId) {
 | 
			
		||||
TcpTmTcBridge::TcpTmTcBridge(object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
                             uint32_t msgQueueDepth, object_id_t tmStoreId, object_id_t tcStoreId)
 | 
			
		||||
    : TmTcBridge("TCP TMTC Bridge", objectId, tcDestination, msgQueueDepth, tmStoreId, tcStoreId) {
 | 
			
		||||
  mutex = MutexFactory::instance()->createMutex();
 | 
			
		||||
  // Connection is always up, TM is requested by connecting to server and receiving packets
 | 
			
		||||
  registerCommConnect();
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ class TcpTmTcBridge : public TmTcBridge {
 | 
			
		||||
   * @param tmStoreId TM store object ID. It is recommended to the default object ID
 | 
			
		||||
   * @param tcStoreId TC store object ID. It is recommended to the default object ID
 | 
			
		||||
   */
 | 
			
		||||
  TcpTmTcBridge(object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
  TcpTmTcBridge(object_id_t objectId, object_id_t tcDestination, uint32_t msgQueueDepth,
 | 
			
		||||
                object_id_t tmStoreId = objects::TM_STORE,
 | 
			
		||||
                object_id_t tcStoreId = objects::TC_STORE);
 | 
			
		||||
  virtual ~TcpTmTcBridge();
 | 
			
		||||
 
 | 
			
		||||
@@ -20,9 +20,9 @@
 | 
			
		||||
const std::string UdpTmTcBridge::DEFAULT_SERVER_PORT = tcpip::DEFAULT_SERVER_PORT;
 | 
			
		||||
 | 
			
		||||
UdpTmTcBridge::UdpTmTcBridge(object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
                             const std::string &udpServerPort_, object_id_t tmStoreId,
 | 
			
		||||
                             object_id_t tcStoreId)
 | 
			
		||||
    : TmTcBridge("UDP TMTC Bridge", objectId, tcDestination, tmStoreId, tcStoreId) {
 | 
			
		||||
                             uint32_t msgQueueDepth, const std::string &udpServerPort_,
 | 
			
		||||
                             object_id_t tmStoreId, object_id_t tcStoreId)
 | 
			
		||||
    : TmTcBridge("UDP TMTC Bridge", objectId, tcDestination, msgQueueDepth, tmStoreId, tcStoreId) {
 | 
			
		||||
  if (udpServerPort_.empty()) {
 | 
			
		||||
    udpServerPort = DEFAULT_SERVER_PORT;
 | 
			
		||||
  } else {
 | 
			
		||||
@@ -126,10 +126,7 @@ ReturnValue_t UdpTmTcBridge::sendTm(const uint8_t *data, size_t dataLen) {
 | 
			
		||||
    tcpip::handleError(tcpip::Protocol::UDP, tcpip::ErrorSources::SENDTO_CALL);
 | 
			
		||||
  }
 | 
			
		||||
#if FSFW_CPP_OSTREAM_ENABLED == 1 && FSFW_UDP_SEND_WIRETAPPING_ENABLED == 1
 | 
			
		||||
  sif::debug << "TmTcUdpBridge::sendTm: " << bytesSent
 | 
			
		||||
             << " bytes were"
 | 
			
		||||
                " sent."
 | 
			
		||||
             << std::endl;
 | 
			
		||||
  sif::debug << "TmTcUdpBridge::sendTm: " << bytesSent << " bytes were sent" << std::endl;
 | 
			
		||||
#endif
 | 
			
		||||
  return returnvalue::OK;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ class UdpTmTcBridge : public TmTcBridge, public TcpIpBase {
 | 
			
		||||
  /* The ports chosen here should not be used by any other process. */
 | 
			
		||||
  static const std::string DEFAULT_SERVER_PORT;
 | 
			
		||||
 | 
			
		||||
  UdpTmTcBridge(object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
  UdpTmTcBridge(object_id_t objectId, object_id_t tcDestination, uint32_t msgQueueDepth,
 | 
			
		||||
                const std::string& udpServerPort = "", object_id_t tmStoreId = objects::TM_STORE,
 | 
			
		||||
                object_id_t tcStoreId = objects::TC_STORE);
 | 
			
		||||
  ~UdpTmTcBridge() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
#include <condition_variable>
 | 
			
		||||
#include <thread>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/objectmanager/ObjectManagerIF.h"
 | 
			
		||||
#include "fsfw/tasks/FixedSlotSequence.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
#include <condition_variable>
 | 
			
		||||
#include <thread>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "fsfw/objectmanager/ObjectManagerIF.h"
 | 
			
		||||
#include "fsfw/tasks/PeriodicTaskBase.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
#include <fsfw/returnvalues/returnvalue.h>
 | 
			
		||||
 | 
			
		||||
#include <thread>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
namespace tasks {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,13 +19,13 @@ class CpuUsage : public SerializeIF {
 | 
			
		||||
    float timeRunning;
 | 
			
		||||
    float percentUsage;
 | 
			
		||||
 | 
			
		||||
    virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                    Endianness streamEndianness) const override;
 | 
			
		||||
    ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                            Endianness streamEndianness) const override;
 | 
			
		||||
 | 
			
		||||
    virtual size_t getSerializedSize() const override;
 | 
			
		||||
    size_t getSerializedSize() const override;
 | 
			
		||||
 | 
			
		||||
    virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                      Endianness streamEndianness) override;
 | 
			
		||||
    ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                              Endianness streamEndianness) override;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  CpuUsage();
 | 
			
		||||
 
 | 
			
		||||
@@ -40,13 +40,15 @@ class ParameterWrapper : public SerializeIF {
 | 
			
		||||
  ParameterWrapper(Type type, uint8_t rows, uint8_t columns, const void *data);
 | 
			
		||||
  virtual ~ParameterWrapper();
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const override;
 | 
			
		||||
  ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override;
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const override;
 | 
			
		||||
  size_t getSerializedSize() const override;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                                    Endianness streamEndianness) override;
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overloaded this function, so this is needed to unconfuse
 | 
			
		||||
                                   // the compiler
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                            Endianness streamEndianness) override;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                                    Endianness streamEndianness, uint16_t startWritingAtIndex = 0);
 | 
			
		||||
 
 | 
			
		||||
@@ -24,8 +24,8 @@ class EventReport : public SerializeIF {  //!< [EXPORT] : [SUBSERVICE] 1, 2, 3,
 | 
			
		||||
        parameter1(parameter1_),
 | 
			
		||||
        parameter2(parameter2_) {}
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  SerializeIF::Endianness streamEndianness) const override {
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          SerializeIF::Endianness streamEndianness) const override {
 | 
			
		||||
    ReturnValue_t result =
 | 
			
		||||
        SerializeAdapter::serialize(&reportId, buffer, size, maxSize, streamEndianness);
 | 
			
		||||
    if (result != returnvalue::OK) {
 | 
			
		||||
@@ -46,7 +46,7 @@ class EventReport : public SerializeIF {  //!< [EXPORT] : [SUBSERVICE] 1, 2, 3,
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const override {
 | 
			
		||||
  size_t getSerializedSize() const override {
 | 
			
		||||
    uint32_t size = 0;
 | 
			
		||||
    size += SerializeAdapter::getSerializedSize(&reportId);
 | 
			
		||||
    size += SerializeAdapter::getSerializedSize(&objectId);
 | 
			
		||||
@@ -55,8 +55,8 @@ class EventReport : public SerializeIF {  //!< [EXPORT] : [SUBSERVICE] 1, 2, 3,
 | 
			
		||||
    return size;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    SerializeIF::Endianness streamEndianness) override {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            SerializeIF::Endianness streamEndianness) override {
 | 
			
		||||
    return returnvalue::FAILED;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,8 +16,10 @@ class SerialArrayListAdapter : public SerializeIF {
 | 
			
		||||
 public:
 | 
			
		||||
  SerialArrayListAdapter(ArrayList<T, count_t>* adaptee) : adaptee(adaptee) {}
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const {
 | 
			
		||||
  using SerializeIF::serialize;  // we overload this function as well, so this is needed to uncofuse
 | 
			
		||||
                                 // the compiler
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override {
 | 
			
		||||
    return serialize(adaptee, buffer, size, maxSize, streamEndianness);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -34,7 +36,7 @@ class SerialArrayListAdapter : public SerializeIF {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const { return getSerializedSize(adaptee); }
 | 
			
		||||
  size_t getSerializedSize() const override { return getSerializedSize(adaptee); }
 | 
			
		||||
 | 
			
		||||
  static uint32_t getSerializedSize(const ArrayList<T, count_t>* list) {
 | 
			
		||||
    uint32_t printSize = sizeof(count_t);
 | 
			
		||||
@@ -47,8 +49,10 @@ class SerialArrayListAdapter : public SerializeIF {
 | 
			
		||||
    return printSize;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    Endianness streamEndianness) {
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overload this function as well, so this is needed to
 | 
			
		||||
                                   // uncofuse the compiler
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override {
 | 
			
		||||
    return deSerialize(adaptee, buffer, size, streamEndianness);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -45,8 +45,10 @@ class SerialLinkedListAdapter : public SinglyLinkedList<T>, public SerializeIF {
 | 
			
		||||
  SerialLinkedListAdapter(bool printCount = false)
 | 
			
		||||
      : SinglyLinkedList<T>(), printCount(printCount) {}
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const override {
 | 
			
		||||
  using SerializeIF::serialize;  // we overloaded this function, so this is needed to unconfuse the
 | 
			
		||||
                                 // compiler
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override {
 | 
			
		||||
    if (printCount) {
 | 
			
		||||
      count_t mySize = SinglyLinkedList<T>::getSize();
 | 
			
		||||
      ReturnValue_t result =
 | 
			
		||||
@@ -68,7 +70,7 @@ class SerialLinkedListAdapter : public SinglyLinkedList<T>, public SerializeIF {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const override {
 | 
			
		||||
  size_t getSerializedSize() const override {
 | 
			
		||||
    if (printCount) {
 | 
			
		||||
      return SerialLinkedListAdapter<T>::getSerializedSize() + sizeof(count_t);
 | 
			
		||||
    } else {
 | 
			
		||||
@@ -76,6 +78,8 @@ class SerialLinkedListAdapter : public SinglyLinkedList<T>, public SerializeIF {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  using SerializeIF::deSerialize;  // we overloaded this function, so this is needed to unconfuse
 | 
			
		||||
                                   // the compiler
 | 
			
		||||
  static size_t getSerializedSize(const LinkedElement<T>* element) {
 | 
			
		||||
    size_t size = 0;
 | 
			
		||||
    while (element != nullptr) {
 | 
			
		||||
@@ -85,8 +89,8 @@ class SerialLinkedListAdapter : public SinglyLinkedList<T>, public SerializeIF {
 | 
			
		||||
    return size;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    Endianness streamEndianness) override {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override {
 | 
			
		||||
    return deSerialize(SinglyLinkedList<T>::start, buffer, size, streamEndianness);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,8 +32,8 @@ class SerializeElement : public SerializeIF, public LinkedElement<SerializeIF> {
 | 
			
		||||
 | 
			
		||||
  size_t getSerializedSize() const override { return SerializeAdapter::getSerializedSize(&entry); }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                                    Endianness streamEndianness) override {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
 | 
			
		||||
                            Endianness streamEndianness) override {
 | 
			
		||||
    return SerializeAdapter::deSerialize(&entry, buffer, size, streamEndianness);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -15,8 +15,8 @@ class ModeListEntry : public SerializeIF, public LinkedElement<ModeListEntry> {
 | 
			
		||||
  uint8_t value3 = 0;
 | 
			
		||||
  uint8_t value4 = 0;
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                                  Endianness streamEndianness) const {
 | 
			
		||||
  ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
 | 
			
		||||
                          Endianness streamEndianness) const override {
 | 
			
		||||
    ReturnValue_t result;
 | 
			
		||||
 | 
			
		||||
    result = SerializeAdapter::serialize(&value1, buffer, size, maxSize, streamEndianness);
 | 
			
		||||
@@ -40,12 +40,12 @@ class ModeListEntry : public SerializeIF, public LinkedElement<ModeListEntry> {
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual size_t getSerializedSize() const {
 | 
			
		||||
  size_t getSerializedSize() const override {
 | 
			
		||||
    return sizeof(value1) + sizeof(value2) + sizeof(value3) + sizeof(value4);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                                    Endianness streamEndianness) {
 | 
			
		||||
  ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
 | 
			
		||||
                            Endianness streamEndianness) override {
 | 
			
		||||
    ReturnValue_t result;
 | 
			
		||||
 | 
			
		||||
    result = SerializeAdapter::deSerialize(&value1, buffer, size, streamEndianness);
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ struct PusTmParams {
 | 
			
		||||
              size_t dataLen)
 | 
			
		||||
      : secHeader(service, subservice, timeStamper), adapter(data, dataLen), sourceData(&adapter) {}
 | 
			
		||||
  PusTmSecHeader secHeader;
 | 
			
		||||
  SerialBufferAdapter<uint8_t> adapter;
 | 
			
		||||
  SerialBufferAdapter<size_t> adapter;
 | 
			
		||||
  const SerializeIF* sourceData = nullptr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
#define TMTCBRIDGE_WIRETAPPING 0
 | 
			
		||||
 | 
			
		||||
TmTcBridge::TmTcBridge(const char* name, object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
                       object_id_t tmStoreId, object_id_t tcStoreId)
 | 
			
		||||
                       uint32_t msgQueueDepth, object_id_t tmStoreId, object_id_t tcStoreId)
 | 
			
		||||
    : SystemObject(objectId),
 | 
			
		||||
      name(name),
 | 
			
		||||
      tmStoreId(tmStoreId),
 | 
			
		||||
@@ -18,7 +18,7 @@ TmTcBridge::TmTcBridge(const char* name, object_id_t objectId, object_id_t tcDes
 | 
			
		||||
{
 | 
			
		||||
  auto mqArgs = MqArgs(objectId, static_cast<void*>(this));
 | 
			
		||||
  tmTcReceptionQueue = QueueFactory::instance()->createMessageQueue(
 | 
			
		||||
      TMTC_RECEPTION_QUEUE_DEPTH, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs);
 | 
			
		||||
      msgQueueDepth, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TmTcBridge::~TmTcBridge() { QueueFactory::instance()->deleteMessageQueue(tmTcReceptionQueue); }
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@ class TmTcBridge : public AcceptsTelemetryIF,
 | 
			
		||||
                   public ExecutableObjectIF,
 | 
			
		||||
                   public SystemObject {
 | 
			
		||||
 public:
 | 
			
		||||
  static constexpr uint8_t TMTC_RECEPTION_QUEUE_DEPTH = 20;
 | 
			
		||||
  static constexpr uint8_t LIMIT_STORED_DATA_SENT_PER_CYCLE = 15;
 | 
			
		||||
  static constexpr unsigned int LIMIT_DOWNLINK_PACKETS_STORED = 500;
 | 
			
		||||
 | 
			
		||||
@@ -23,7 +22,7 @@ class TmTcBridge : public AcceptsTelemetryIF,
 | 
			
		||||
  static constexpr uint8_t DEFAULT_DOWNLINK_PACKETS_STORED = 10;
 | 
			
		||||
 | 
			
		||||
  TmTcBridge(const char* name, object_id_t objectId, object_id_t tcDestination,
 | 
			
		||||
             object_id_t tmStoreId, object_id_t tcStoreId);
 | 
			
		||||
             uint32_t msgQueueDepth, object_id_t tmStoreId, object_id_t tcStoreId);
 | 
			
		||||
  ~TmTcBridge() override;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@
 | 
			
		||||
 */
 | 
			
		||||
void Factory::produceFrameworkObjects(void* args) {
 | 
			
		||||
  setStaticFrameworkObjectIds();
 | 
			
		||||
  new EventManager(objects::EVENT_MANAGER);
 | 
			
		||||
  new EventManager(objects::EVENT_MANAGER, 80);
 | 
			
		||||
  new HealthTable(objects::HEALTH_TABLE);
 | 
			
		||||
  new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -97,7 +97,7 @@ TEST_CASE("CFDP Header", "[cfdp]") {
 | 
			
		||||
      REQUIRE(creator.serialize(&serTarget, &serSize, serBuf.size(),
 | 
			
		||||
                                SerializeIF::Endianness::BIG) == returnvalue::OK);
 | 
			
		||||
      CHECK(serBuf[0] == 0x3f);
 | 
			
		||||
      CHECK(serBuf[3] == 0x99);
 | 
			
		||||
      CHECK(serBuf[3] == 0x88);
 | 
			
		||||
      REQUIRE(creator.getCrcFlag() == true);
 | 
			
		||||
      REQUIRE(creator.getDirection() == cfdp::Direction::TOWARDS_SENDER);
 | 
			
		||||
      REQUIRE(creator.getLargeFileFlag() == true);
 | 
			
		||||
@@ -127,7 +127,7 @@ TEST_CASE("CFDP Header", "[cfdp]") {
 | 
			
		||||
      REQUIRE(creator.getTransmissionMode() == cfdp::TransmissionMode::UNACKNOWLEDGED);
 | 
			
		||||
      REQUIRE(creator.getSegmentationControl() == true);
 | 
			
		||||
      // Last three bits are 2 now (length of seq number) and bit 1 to bit 3 is 4 (len entity IDs)
 | 
			
		||||
      REQUIRE(serBuf[3] == 0b11001010);
 | 
			
		||||
      REQUIRE(serBuf[3] == 0b10111001);
 | 
			
		||||
      uint32_t entityId = 0;
 | 
			
		||||
      size_t deSerSize = 0;
 | 
			
		||||
      SerializeAdapter::deSerialize(&entityId, serBuf.data() + 4, &deSerSize,
 | 
			
		||||
@@ -175,7 +175,7 @@ TEST_CASE("CFDP Header", "[cfdp]") {
 | 
			
		||||
    REQUIRE(serBuf[1] == 0);
 | 
			
		||||
    REQUIRE(serBuf[2] == 0);
 | 
			
		||||
    // Entity and Transaction Sequence number are 1 byte large
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00010001);
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00000000);
 | 
			
		||||
    // Source ID
 | 
			
		||||
    REQUIRE(serBuf[4] == 0);
 | 
			
		||||
    // Transaction Seq Number
 | 
			
		||||
@@ -220,7 +220,7 @@ TEST_CASE("CFDP Header", "[cfdp]") {
 | 
			
		||||
    REQUIRE(serBuf[1] == 0);
 | 
			
		||||
    REQUIRE(serBuf[2] == 0);
 | 
			
		||||
    // Entity and Transaction Sequence number are 1 byte large
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00010001);
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00000000);
 | 
			
		||||
    REQUIRE(serSize == 7);
 | 
			
		||||
    // Deser call not strictly necessary
 | 
			
		||||
    auto reader = PduHeaderReader(serBuf.data(), serBuf.size());
 | 
			
		||||
@@ -270,7 +270,7 @@ TEST_CASE("CFDP Header", "[cfdp]") {
 | 
			
		||||
    REQUIRE(reader.parseData() == returnvalue::OK);
 | 
			
		||||
    // Everything except version bit flipped to one now
 | 
			
		||||
    REQUIRE(serBuf[0] == 0x3f);
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b11001010);
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b10111001);
 | 
			
		||||
    REQUIRE(reader.getWholePduSize() == 14);
 | 
			
		||||
 | 
			
		||||
    REQUIRE(reader.getCrcFlag() == true);
 | 
			
		||||
 
 | 
			
		||||
@@ -68,7 +68,7 @@ TEST_CASE("File Data PDU", "[cfdp][pdu]") {
 | 
			
		||||
    // Bits 1 to 3 length of enitity IDs is 2
 | 
			
		||||
    // Bit 4: Segment metadata flag is set
 | 
			
		||||
    // Bit 5 to seven: length of transaction seq num is 2
 | 
			
		||||
    REQUIRE(fileDataBuffer[3] == 0b10101010);
 | 
			
		||||
    REQUIRE(fileDataBuffer[3] == 0b10011001);
 | 
			
		||||
    REQUIRE((fileDataBuffer[10] >> 6) &
 | 
			
		||||
            0b11 == cfdp::RecordContinuationState::CONTAINS_START_AND_END);
 | 
			
		||||
    // Segment metadata length
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ TEST_CASE("CFDP File Directive", "[cfdp][pdu]") {
 | 
			
		||||
    REQUIRE(serBuf[1] == 0);
 | 
			
		||||
    REQUIRE(serBuf[2] == 5);
 | 
			
		||||
    // Entity and Transaction Sequence number are 1 byte large
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00010001);
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00000000);
 | 
			
		||||
    // Source ID
 | 
			
		||||
    REQUIRE(serBuf[4] == 0);
 | 
			
		||||
    // Transaction Seq Number
 | 
			
		||||
@@ -82,4 +82,4 @@ TEST_CASE("CFDP File Directive", "[cfdp][pdu]") {
 | 
			
		||||
    // Invalid file directive
 | 
			
		||||
    REQUIRE(fdDeser.parseData() == cfdp::INVALID_DIRECTIVE_FIELD);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -33,8 +33,8 @@ TEST_CASE("CFDP Base", "[cfdp]") {
 | 
			
		||||
    // PDU data field length is 5 (4 + Directive code octet)
 | 
			
		||||
    REQUIRE(serBuf[1] == 0);
 | 
			
		||||
    REQUIRE(serBuf[2] == 5);
 | 
			
		||||
    // Entity and Transaction Sequence number are 1 byte large
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00010001);
 | 
			
		||||
    // Entity and Transaction Sequence number are 1 byte large, value minus one is stored
 | 
			
		||||
    REQUIRE(serBuf[3] == 0b00000000);
 | 
			
		||||
    // Source ID
 | 
			
		||||
    REQUIRE(serBuf[4] == 0);
 | 
			
		||||
    // Transaction Seq Number
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user