2022-08-09 18:51:44 +02:00
|
|
|
#include "VarLenFields.h"
|
2022-02-02 10:29:30 +01:00
|
|
|
|
2021-12-03 15:37:49 +01:00
|
|
|
#include "fsfw/serialize/SerializeAdapter.h"
|
2022-02-02 10:29:30 +01:00
|
|
|
#include "fsfw/serviceinterface.h"
|
2021-12-03 15:37:49 +01:00
|
|
|
|
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) {
|
2021-12-03 15:37:49 +01:00
|
|
|
#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;
|
2021-12-03 15:37:49 +01:00
|
|
|
#else
|
2022-02-02 10:29:30 +01:00
|
|
|
sif::printWarning("cfdp::VarLenField: Setting value failed\n");
|
2021-12-03 15:37:49 +01:00
|
|
|
#endif
|
|
|
|
#endif
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
cfdp::VarLenField::VarLenField() : width(cfdp::WidthInBytes::ONE_BYTE) { value.oneByte = 0; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
cfdp::WidthInBytes cfdp::VarLenField::getWidth() const { return width; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
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;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
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;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
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;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
default: {
|
2022-02-02 10:29:30 +01:00
|
|
|
break;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
|
|
|
this->width = widthInBytes;
|
2022-08-16 01:08:26 +02:00
|
|
|
return returnvalue::OK;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
size_t cfdp::VarLenField::getValue() const {
|
2022-02-02 10:29:30 +01:00
|
|
|
switch (width) {
|
|
|
|
case (cfdp::WidthInBytes::ONE_BYTE): {
|
|
|
|
return value.oneByte;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
case (cfdp::WidthInBytes::TWO_BYTES): {
|
|
|
|
return value.twoBytes;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
case (cfdp::WidthInBytes::FOUR_BYTES): {
|
|
|
|
return value.fourBytes;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
|
|
|
return 0;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
default: {
|
2022-08-16 01:08:26 +02:00
|
|
|
return returnvalue::FAILED;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
size_t cfdp::VarLenField::getSerializedSize() const { return width; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
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);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
case (cfdp::WidthInBytes::TWO_BYTES): {
|
|
|
|
return SerializeAdapter::deSerialize(&value.twoBytes, buffer, size, streamEndianness);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
case (cfdp::WidthInBytes::FOUR_BYTES): {
|
|
|
|
return SerializeAdapter::deSerialize(&value.fourBytes, buffer, size, streamEndianness);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
default: {
|
2022-08-16 01:08:26 +02:00
|
|
|
return returnvalue::FAILED;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
2021-12-03 15:37:49 +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
|
|
|
}
|