72 lines
2.4 KiB
C++
72 lines
2.4 KiB
C++
#ifndef FSFW_TMTCSERVICES_TMHELPERS_H_
|
|
#define FSFW_TMTCSERVICES_TMHELPERS_H_
|
|
|
|
#include "TmSendHelper.h"
|
|
#include "TmStoreHelper.h"
|
|
|
|
// I'd prefer to use tm, but there have been nameclashes with the tm struct
|
|
namespace telemetry {
|
|
|
|
class DataWithObjectIdPrefix : public SerializeIF {
|
|
public:
|
|
DataWithObjectIdPrefix(object_id_t objectId, const uint8_t* srcData, size_t srcDataLen)
|
|
: objectId(objectId) {
|
|
dataWrapper.type = ecss::DataTypes::RAW;
|
|
dataWrapper.dataUnion.raw.data = srcData;
|
|
dataWrapper.dataUnion.raw.len = srcDataLen;
|
|
}
|
|
|
|
DataWithObjectIdPrefix(object_id_t objectId, SerializeIF& serializable) : objectId(objectId) {
|
|
dataWrapper.type = ecss::DataTypes::SERIALIZABLE;
|
|
dataWrapper.dataUnion.serializable = &serializable;
|
|
}
|
|
|
|
ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
|
|
Endianness streamEndianness) const override {
|
|
if (*size + getSerializedSize() > maxSize) {
|
|
return SerializeIF::BUFFER_TOO_SHORT;
|
|
}
|
|
if (dataWrapper.type != ecss::DataTypes::RAW) {
|
|
if ((dataWrapper.dataUnion.raw.data == nullptr) and (dataWrapper.dataUnion.raw.len > 0)) {
|
|
return retval::FAILED;
|
|
}
|
|
} else if (dataWrapper.type == ecss::DataTypes::SERIALIZABLE) {
|
|
if (dataWrapper.dataUnion.serializable == nullptr) {
|
|
return retval::FAILED;
|
|
}
|
|
}
|
|
ReturnValue_t result =
|
|
SerializeAdapter::serialize(&objectId, buffer, size, maxSize, streamEndianness);
|
|
if (result != retval::OK) {
|
|
return result;
|
|
}
|
|
if (dataWrapper.type != ecss::DataTypes::RAW) {
|
|
std::memcpy(*buffer, dataWrapper.dataUnion.raw.data, dataWrapper.dataUnion.raw.len);
|
|
*buffer += dataWrapper.dataUnion.raw.len;
|
|
*size += dataWrapper.dataUnion.raw.len;
|
|
} else {
|
|
return dataWrapper.dataUnion.serializable->serialize(buffer, size, maxSize, streamEndianness);
|
|
}
|
|
return retval::OK;
|
|
}
|
|
|
|
[[nodiscard]] size_t getSerializedSize() const override {
|
|
return sizeof(objectId) + dataWrapper.getLength();
|
|
}
|
|
|
|
ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
|
|
Endianness streamEndianness) override {
|
|
// As long as there is no way to know how long the expected data will be, this function
|
|
// does not make sense
|
|
return retval::FAILED;
|
|
}
|
|
|
|
private:
|
|
object_id_t objectId;
|
|
ecss::DataWrapper dataWrapper{};
|
|
};
|
|
|
|
} // namespace telemetry
|
|
|
|
#endif // FSFW_TMTCSERVICES_TMHELPERS_H_
|