2021-01-25 00:55:27 +01:00
|
|
|
#ifndef FSFW_HOUSEKEEPING_HOUSEKEEPINGSNAPSHOT_H_
|
|
|
|
#define FSFW_HOUSEKEEPING_HOUSEKEEPINGSNAPSHOT_H_
|
2020-10-01 12:05:24 +02:00
|
|
|
|
|
|
|
#include "../serialize/SerialBufferAdapter.h"
|
|
|
|
#include "../serialize/SerialLinkedListAdapter.h"
|
|
|
|
#include "../datapoollocal/LocalPoolDataSetBase.h"
|
2021-01-25 00:55:27 +01:00
|
|
|
#include "../datapoollocal/LocalPoolObjectBase.h"
|
|
|
|
#include "../timemanager/CCSDSTime.h"
|
2020-10-01 12:05:24 +02:00
|
|
|
|
|
|
|
/**
|
2021-01-25 00:55:27 +01:00
|
|
|
* @brief This helper class will be used to serialize and deserialize update housekeeping packets
|
|
|
|
* into the store.
|
2020-10-01 12:05:24 +02:00
|
|
|
*/
|
2021-03-11 14:46:22 +01:00
|
|
|
class HousekeepingSnapshot:
|
|
|
|
public SerializeIF {
|
2020-10-01 12:05:24 +02:00
|
|
|
public:
|
2021-01-25 00:55:27 +01:00
|
|
|
|
2020-10-01 12:05:24 +02:00
|
|
|
/**
|
2021-01-25 00:55:27 +01:00
|
|
|
* Update packet constructor for datasets.
|
|
|
|
* @param cdsShort If a CSD short timestamp is used, a reference should be
|
|
|
|
* supplied here
|
|
|
|
* @param dataSetPtr Pointer to the dataset instance to serialize or deserialize the
|
|
|
|
* data into
|
|
|
|
*/
|
|
|
|
HousekeepingSnapshot(CCSDSTime::CDS_short* cdsShort, LocalPoolDataSetBase* dataSetPtr):
|
|
|
|
timeStamp(reinterpret_cast<uint8_t*>(cdsShort)),
|
|
|
|
timeStampSize(sizeof(CCSDSTime::CDS_short)), updateData(dataSetPtr) {};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update packet constructor for datasets.
|
|
|
|
* @param timeStamp Pointer to the buffer where the timestamp will be stored.
|
|
|
|
* @param timeStampSize Size of the timestamp
|
|
|
|
* @param dataSetPtr Pointer to the dataset instance to deserialize the data into
|
2020-10-01 12:05:24 +02:00
|
|
|
*/
|
2021-01-25 00:55:27 +01:00
|
|
|
HousekeepingSnapshot(uint8_t* timeStamp, size_t timeStampSize,
|
2020-10-01 12:05:24 +02:00
|
|
|
LocalPoolDataSetBase* dataSetPtr):
|
2020-12-03 13:00:04 +01:00
|
|
|
timeStamp(timeStamp), timeStampSize(timeStampSize),
|
|
|
|
updateData(dataSetPtr) {};
|
|
|
|
|
2021-03-11 14:46:22 +01:00
|
|
|
/**
|
|
|
|
* Update packet constructor for pool variables.
|
|
|
|
* @param timeStamp
|
|
|
|
* @param timeStampSize
|
|
|
|
* @param dataSetPtr
|
|
|
|
*/
|
|
|
|
HousekeepingSnapshot(CCSDSTime::CDS_short* cdsShort, LocalPoolObjectBase* dataSetPtr):
|
|
|
|
timeStamp(reinterpret_cast<uint8_t*>(cdsShort)),
|
|
|
|
timeStampSize(sizeof(CCSDSTime::CDS_short)), updateData(dataSetPtr) {};
|
|
|
|
|
|
|
|
|
2020-12-03 13:00:04 +01:00
|
|
|
/**
|
|
|
|
* Update packet constructor for pool variables.
|
|
|
|
* @param timeStamp
|
|
|
|
* @param timeStampSize
|
|
|
|
* @param dataSetPtr
|
|
|
|
*/
|
2021-01-25 00:55:27 +01:00
|
|
|
HousekeepingSnapshot(uint8_t* timeStamp, size_t timeStampSize,
|
2020-12-03 13:00:04 +01:00
|
|
|
LocalPoolObjectBase* dataSetPtr):
|
|
|
|
timeStamp(timeStamp), timeStampSize(timeStampSize),
|
|
|
|
updateData(dataSetPtr) {};
|
2020-10-01 12:05:24 +02:00
|
|
|
|
2021-03-11 14:46:22 +01:00
|
|
|
virtual ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
|
|
|
|
Endianness streamEndianness) const {
|
2020-10-01 12:05:24 +02:00
|
|
|
if(timeStamp != nullptr) {
|
|
|
|
/* Endianness will always be MACHINE, so we can simply use memcpy
|
|
|
|
here. */
|
|
|
|
std::memcpy(*buffer, timeStamp, timeStampSize);
|
|
|
|
*size += timeStampSize;
|
|
|
|
*buffer += timeStampSize;
|
|
|
|
}
|
2020-12-03 13:00:04 +01:00
|
|
|
if(updateData == nullptr) {
|
2020-10-01 12:05:24 +02:00
|
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
|
|
}
|
|
|
|
|
2020-12-03 13:00:04 +01:00
|
|
|
return updateData->serialize(buffer, size, maxSize, streamEndianness);
|
2020-10-01 12:05:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
virtual size_t getSerializedSize() const {
|
2020-12-03 13:00:04 +01:00
|
|
|
if(updateData == nullptr) {
|
2020-10-01 12:05:24 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2020-12-03 13:00:04 +01:00
|
|
|
return timeStampSize + updateData->getSerializedSize();
|
2020-10-01 12:05:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
virtual ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
|
|
|
|
SerializeIF::Endianness streamEndianness) override {
|
2020-12-03 13:00:04 +01:00
|
|
|
if(*size < timeStampSize) {
|
|
|
|
return SerializeIF::STREAM_TOO_SHORT;
|
|
|
|
}
|
|
|
|
|
2020-10-01 12:05:24 +02:00
|
|
|
if(timeStamp != nullptr) {
|
|
|
|
/* Endianness will always be MACHINE, so we can simply use memcpy
|
|
|
|
here. */
|
|
|
|
std::memcpy(timeStamp, *buffer, timeStampSize);
|
2020-12-03 13:00:04 +01:00
|
|
|
*size -= timeStampSize;
|
2020-10-01 12:05:24 +02:00
|
|
|
*buffer += timeStampSize;
|
|
|
|
}
|
|
|
|
|
2020-12-03 13:00:04 +01:00
|
|
|
if(updateData == nullptr) {
|
2020-10-01 12:05:24 +02:00
|
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
|
|
}
|
2020-12-03 13:00:04 +01:00
|
|
|
if(*size < updateData->getSerializedSize()) {
|
|
|
|
return SerializeIF::STREAM_TOO_SHORT;
|
|
|
|
}
|
|
|
|
|
|
|
|
return updateData->deSerialize(buffer, size, streamEndianness);
|
2020-10-01 12:05:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2020-12-03 13:00:04 +01:00
|
|
|
uint8_t* timeStamp = nullptr;
|
|
|
|
size_t timeStampSize = 0;
|
2020-10-01 12:05:24 +02:00
|
|
|
|
2020-12-03 13:00:04 +01:00
|
|
|
SerializeIF* updateData = nullptr;
|
2020-10-01 12:05:24 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2021-01-25 00:55:27 +01:00
|
|
|
#endif /* FSFW_HOUSEKEEPING_HOUSEKEEPINGSNAPSHOT_H_ */
|