fsfw/src/fsfw/cfdp/VarLenFields.cpp

138 lines
4.0 KiB
C++
Raw Normal View History

2022-08-09 18:51:44 +02:00
#include "VarLenFields.h"
2022-02-02 10:29:30 +01:00
#include "fsfw/serialize/SerializeAdapter.h"
2022-02-02 10:29:30 +01:00
#include "fsfw/serviceinterface.h"
2022-02-02 10:29:30 +01:00
cfdp::VarLenField::VarLenField(cfdp::WidthInBytes width, size_t value) : VarLenField() {
ReturnValue_t result = this->setValue(width, value);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
#if FSFW_DISABLE_PRINTOUT == 0
#if FSFW_CPP_OSTREAM_ENABLED == 1
2022-02-02 10:29:30 +01:00
sif::warning << "cfdp::VarLenField: Setting value failed" << std::endl;
#else
2022-02-02 10:29:30 +01:00
sif::printWarning("cfdp::VarLenField: Setting value failed\n");
#endif
#endif
2022-02-02 10:29:30 +01:00
}
}
2022-02-02 10:29:30 +01:00
cfdp::VarLenField::VarLenField() : width(cfdp::WidthInBytes::ONE_BYTE) { value.oneByte = 0; }
2022-02-02 10:29:30 +01:00
cfdp::WidthInBytes cfdp::VarLenField::getWidth() const { return width; }
2022-08-03 13:34:49 +02:00
ReturnValue_t cfdp::VarLenField::setValue(cfdp::WidthInBytes widthInBytes, size_t value_) {
2022-02-02 10:29:30 +01:00
switch (widthInBytes) {
case (cfdp::WidthInBytes::ONE_BYTE): {
2022-08-03 13:34:49 +02:00
if (value_ > UINT8_MAX) {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-02-02 10:29:30 +01:00
}
2022-08-03 13:34:49 +02:00
this->value.oneByte = value_;
2022-02-02 10:29:30 +01:00
break;
}
2022-02-02 10:29:30 +01:00
case (cfdp::WidthInBytes::TWO_BYTES): {
2022-08-03 13:34:49 +02:00
if (value_ > UINT16_MAX) {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-02-02 10:29:30 +01:00
}
2022-08-03 13:34:49 +02:00
this->value.twoBytes = value_;
2022-02-02 10:29:30 +01:00
break;
}
2022-02-02 10:29:30 +01:00
case (cfdp::WidthInBytes::FOUR_BYTES): {
2022-08-03 13:34:49 +02:00
if (value_ > UINT32_MAX) {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-02-02 10:29:30 +01:00
}
2022-08-03 13:34:49 +02:00
this->value.fourBytes = value_;
2022-02-02 10:29:30 +01:00
break;
}
default: {
2022-02-02 10:29:30 +01:00
break;
}
2022-02-02 10:29:30 +01:00
}
this->width = widthInBytes;
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
}
size_t cfdp::VarLenField::getValue() const {
2022-02-02 10:29:30 +01:00
switch (width) {
case (cfdp::WidthInBytes::ONE_BYTE): {
return value.oneByte;
}
2022-02-02 10:29:30 +01:00
case (cfdp::WidthInBytes::TWO_BYTES): {
return value.twoBytes;
}
2022-02-02 10:29:30 +01:00
case (cfdp::WidthInBytes::FOUR_BYTES): {
return value.fourBytes;
}
2022-02-02 10:29:30 +01:00
}
return 0;
}
ReturnValue_t cfdp::VarLenField::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
2022-02-02 10:29:30 +01:00
Endianness streamEndianness) const {
switch (width) {
case (cfdp::WidthInBytes::ONE_BYTE): {
if (*size + 1 > maxSize) {
return BUFFER_TOO_SHORT;
}
**buffer = value.oneByte;
*size += 1;
*buffer += 1;
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2022-02-02 10:29:30 +01:00
}
case (cfdp::WidthInBytes::TWO_BYTES): {
return SerializeAdapter::serialize(&value.twoBytes, buffer, size, maxSize, streamEndianness);
}
case (cfdp::WidthInBytes::FOUR_BYTES): {
return SerializeAdapter::serialize(&value.fourBytes, buffer, size, maxSize, streamEndianness);
}
default: {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
}
2022-02-02 10:29:30 +01:00
}
}
2022-02-02 10:29:30 +01:00
size_t cfdp::VarLenField::getSerializedSize() const { return width; }
2022-08-03 13:34:49 +02:00
ReturnValue_t cfdp::VarLenField::deSerialize(cfdp::WidthInBytes width_, const uint8_t **buffer,
2022-02-02 10:29:30 +01:00
size_t *size, Endianness streamEndianness) {
2022-08-03 13:34:49 +02:00
this->width = width_;
2022-02-02 10:29:30 +01:00
return deSerialize(buffer, size, streamEndianness);
}
ReturnValue_t cfdp::VarLenField::deSerialize(const uint8_t **buffer, size_t *size,
2022-02-02 10:29:30 +01:00
Endianness streamEndianness) {
switch (width) {
case (cfdp::WidthInBytes::ONE_BYTE): {
value.oneByte = **buffer;
*size += 1;
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
}
2022-02-02 10:29:30 +01:00
case (cfdp::WidthInBytes::TWO_BYTES): {
return SerializeAdapter::deSerialize(&value.twoBytes, buffer, size, streamEndianness);
}
2022-02-02 10:29:30 +01:00
case (cfdp::WidthInBytes::FOUR_BYTES): {
return SerializeAdapter::deSerialize(&value.fourBytes, buffer, size, streamEndianness);
}
default: {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
}
2022-02-02 10:29:30 +01:00
}
}
2022-08-03 15:12:29 +02:00
bool cfdp::VarLenField::operator<(const cfdp::VarLenField &other) const {
2022-08-09 18:51:44 +02:00
if (getWidth() < other.getWidth()) {
return true;
} else if (getWidth() == other.getWidth()) {
return getValue() < other.getValue();
} else {
return false;
}
2022-08-03 15:12:29 +02:00
}
bool cfdp::VarLenField::operator==(const cfdp::VarLenField &other) const {
2022-08-09 18:51:44 +02:00
return getWidth() == other.getWidth() and getValue() == other.getValue();
2022-08-03 15:12:29 +02:00
}
2022-09-08 16:25:19 +02:00
bool cfdp::VarLenField::operator!=(const cfdp::VarLenField &other) const {
return not(*this == other);
}