fsfw/src/fsfw/cfdp/Fss.h

88 lines
2.4 KiB
C
Raw Normal View History

2022-08-08 18:29:32 +02:00
#ifndef FSFW_CFDP_FILESIZE_H_
#define FSFW_CFDP_FILESIZE_H_
2022-09-02 17:54:25 +02:00
#include <optional>
#include "fsfw/serialize/SerializeAdapter.h"
#include "fsfw/serialize/SerializeIF.h"
namespace cfdp {
2023-07-19 14:02:03 +02:00
/**
* Helper type for the CFDP File Size Sensitive (FSS) fields.
*/
2023-07-19 13:44:52 +02:00
struct Fss : public SerializeIF {
2022-02-02 10:29:30 +01:00
public:
2023-07-19 13:44:52 +02:00
Fss() = default;
2023-07-19 13:44:52 +02:00
explicit Fss(uint64_t fileSize, bool isLarge = false) { setFileSize(fileSize, isLarge); };
2022-09-02 14:39:53 +02:00
[[nodiscard]] uint64_t value() const { return fileSize; }
2022-02-02 10:29:30 +01:00
ReturnValue_t serialize(bool isLarge, uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) {
this->largeFile = isLarge;
return serialize(buffer, size, maxSize, streamEndianness);
}
2022-02-02 10:29:30 +01:00
ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const override {
if (not largeFile) {
uint32_t fileSizeTyped = fileSize;
return SerializeAdapter::serialize(&fileSizeTyped, buffer, size, maxSize, streamEndianness);
}
2022-02-02 10:29:30 +01:00
return SerializeAdapter::serialize(&fileSize, buffer, size, maxSize, streamEndianness);
}
2022-08-08 18:29:32 +02:00
[[nodiscard]] size_t getSerializedSize() const override {
2022-02-02 10:29:30 +01:00
if (largeFile) {
return 8;
} else {
return 4;
}
2022-02-02 10:29:30 +01:00
}
2022-02-02 10:29:30 +01:00
ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
Endianness streamEndianness) override {
if (largeFile) {
return SerializeAdapter::deSerialize(&size, buffer, size, streamEndianness);
} else {
uint32_t sizeTmp = 0;
ReturnValue_t result =
SerializeAdapter::deSerialize(&sizeTmp, buffer, size, streamEndianness);
2022-08-16 01:08:26 +02:00
if (result == returnvalue::OK) {
2022-02-02 10:29:30 +01:00
fileSize = sizeTmp;
}
return result;
}
2022-02-02 10:29:30 +01:00
}
2022-09-02 17:54:25 +02:00
ReturnValue_t setFileSize(uint64_t fileSize_, std::optional<bool> largeFile_) {
if (largeFile_) {
largeFile = largeFile_.value();
}
2022-02-02 10:29:30 +01:00
if (not largeFile and fileSize > UINT32_MAX) {
// TODO: emit warning here
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
}
2022-09-02 14:39:53 +02:00
this->fileSize = fileSize_;
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2022-02-02 10:29:30 +01:00
}
2022-08-08 18:29:32 +02:00
[[nodiscard]] bool isLargeFile() const { return largeFile; }
2022-09-02 14:39:53 +02:00
uint64_t getSize(bool *largeFile_ = nullptr) const {
if (largeFile_ != nullptr) {
*largeFile_ = this->largeFile;
}
2022-02-02 10:29:30 +01:00
return fileSize;
}
private:
uint64_t fileSize = 0;
bool largeFile = false;
};
2022-02-02 10:29:30 +01:00
} // namespace cfdp
2022-08-08 18:29:32 +02:00
#endif /* FSFW_CFDP_FILESIZE_H_ */