fsfw/src/fsfw/tmtcservices/tmHelpers.h

72 lines
2.4 KiB
C
Raw Normal View History

2022-07-21 13:48:58 +02:00
#ifndef FSFW_TMTCSERVICES_TMHELPERS_H_
#define FSFW_TMTCSERVICES_TMHELPERS_H_
2022-07-20 22:21:15 +02:00
#include "TmSendHelper.h"
#include "TmStoreHelper.h"
2022-07-21 18:21:10 +02:00
// I'd prefer to use tm, but there have been nameclashes with the tm struct
namespace telemetry {
2022-07-20 22:21:15 +02:00
2022-07-25 10:24:43 +02:00
class DataWithObjectIdPrefix : public SerializeIF {
2022-07-20 22:21:15 +02:00
public:
2022-07-25 10:24:43 +02:00
DataWithObjectIdPrefix(object_id_t objectId, const uint8_t* srcData, size_t srcDataLen)
2022-07-26 13:59:09 +02:00
: objectId(objectId) {
2022-08-30 12:04:15 +02:00
dataWrapper.type = util::DataTypes::RAW;
2022-07-26 13:59:09 +02:00
dataWrapper.dataUnion.raw.data = srcData;
dataWrapper.dataUnion.raw.len = srcDataLen;
}
DataWithObjectIdPrefix(object_id_t objectId, SerializeIF& serializable) : objectId(objectId) {
2022-08-30 12:04:15 +02:00
dataWrapper.type = util::DataTypes::SERIALIZABLE;
2022-07-26 13:59:09 +02:00
dataWrapper.dataUnion.serializable = &serializable;
}
2022-07-20 22:21:15 +02:00
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;
}
2022-08-30 12:04:15 +02:00
if (dataWrapper.type != util::DataTypes::RAW) {
2022-07-26 13:59:09 +02:00
if ((dataWrapper.dataUnion.raw.data == nullptr) and (dataWrapper.dataUnion.raw.len > 0)) {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-07-26 13:59:09 +02:00
}
2022-08-30 12:04:15 +02:00
} else if (dataWrapper.type == util::DataTypes::SERIALIZABLE) {
2022-07-26 13:59:09 +02:00
if (dataWrapper.dataUnion.serializable == nullptr) {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-07-26 13:59:09 +02:00
}
}
2022-07-20 22:21:15 +02:00
ReturnValue_t result =
SerializeAdapter::serialize(&objectId, buffer, size, maxSize, streamEndianness);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-07-20 22:21:15 +02:00
return result;
}
2022-08-30 12:04:15 +02:00
if (dataWrapper.type != util::DataTypes::RAW) {
2022-07-26 13:59:09 +02:00
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);
}
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2022-07-20 22:21:15 +02:00
}
2022-07-26 13:59:09 +02:00
[[nodiscard]] size_t getSerializedSize() const override {
return sizeof(objectId) + dataWrapper.getLength();
}
2022-07-20 22:21:15 +02:00
ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
Endianness streamEndianness) override {
2022-07-26 13:59:09 +02:00
// As long as there is no way to know how long the expected data will be, this function
// does not make sense
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-07-20 22:21:15 +02:00
}
private:
object_id_t objectId;
2022-08-30 12:04:15 +02:00
util::DataWrapper dataWrapper{};
2022-07-20 22:21:15 +02:00
};
2022-07-21 18:21:10 +02:00
} // namespace telemetry
2022-07-20 22:21:15 +02:00
2022-07-21 13:48:58 +02:00
#endif // FSFW_TMTCSERVICES_TMHELPERS_H_