2021-07-02 01:03:35 +02:00
|
|
|
#include "ccsds.h"
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
#include <cmath>
|
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
|
|
namespace ccsds
|
|
|
|
|
{
|
|
|
|
|
CCSDSHeader::CCSDSHeader()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CCSDSHeader::CCSDSHeader(uint8_t *rawi)
|
|
|
|
|
{
|
|
|
|
|
std::memcpy(raw, rawi, 6);
|
2023-03-20 16:46:57 +01:00
|
|
|
version = rawi[0] >> 5;
|
|
|
|
|
type = (rawi[0] >> 4) % 2;
|
|
|
|
|
secondary_header_flag = (rawi[0] >> 3) % 2;
|
|
|
|
|
apid = (rawi[0] % (int)pow(2, 3)) << 8 | rawi[1];
|
|
|
|
|
sequence_flag = rawi[2] >> 6;
|
|
|
|
|
packet_sequence_count = (rawi[2] % (int)pow(2, 6)) << 8 | rawi[3];
|
|
|
|
|
packet_length = rawi[4] << 8 | rawi[5];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CCSDSHeader::encodeHDR()
|
|
|
|
|
{
|
2023-05-08 23:59:31 +02:00
|
|
|
raw[0] = (version & 0b111) << 5 | (type & 0b1) << 4 | (secondary_header_flag & 0b1) << 3 | ((apid >> 8) & 0b111);
|
2023-03-20 16:46:57 +01:00
|
|
|
raw[1] = apid & 0xFF;
|
2023-05-08 23:59:31 +02:00
|
|
|
raw[2] = (sequence_flag & 0b11) << 6 | ((packet_sequence_count >> 8) & 0b111111);
|
2023-03-20 16:46:57 +01:00
|
|
|
raw[3] = packet_sequence_count & 0xFF;
|
|
|
|
|
raw[4] = packet_length >> 8;
|
|
|
|
|
raw[5] = packet_length & 0xFF;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CCSDSPacket::encodeHDR()
|
|
|
|
|
{
|
|
|
|
|
header.packet_length = payload.size() - 1;
|
|
|
|
|
header.encodeHDR();
|
2021-07-02 01:03:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Parse CCSDS header
|
|
|
|
|
CCSDSHeader parseCCSDSHeader(uint8_t *header)
|
|
|
|
|
{
|
2023-03-20 16:46:57 +01:00
|
|
|
return CCSDSHeader(header);
|
2021-07-02 01:03:35 +02:00
|
|
|
}
|
2023-04-16 00:30:39 +02:00
|
|
|
|
|
|
|
|
CCSDSHeader::CCSDSHeader(const CCSDSHeader &v) noexcept
|
|
|
|
|
{
|
|
|
|
|
memcpy(raw, v.raw, 6);
|
|
|
|
|
version = v.version;
|
|
|
|
|
type = v.type;
|
|
|
|
|
secondary_header_flag = v.secondary_header_flag;
|
|
|
|
|
apid = v.apid;
|
|
|
|
|
sequence_flag = v.sequence_flag;
|
|
|
|
|
packet_sequence_count = v.packet_sequence_count;
|
|
|
|
|
packet_length = v.packet_length;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CCSDSHeader &CCSDSHeader::operator=(const CCSDSHeader &v) noexcept
|
|
|
|
|
{
|
|
|
|
|
if (this != &v)
|
|
|
|
|
{
|
|
|
|
|
memcpy(raw, v.raw, 6);
|
|
|
|
|
version = v.version;
|
|
|
|
|
type = v.type;
|
|
|
|
|
secondary_header_flag = v.secondary_header_flag;
|
|
|
|
|
apid = v.apid;
|
|
|
|
|
sequence_flag = v.sequence_flag;
|
|
|
|
|
packet_sequence_count = v.packet_sequence_count;
|
|
|
|
|
packet_length = v.packet_length;
|
|
|
|
|
}
|
|
|
|
|
return *this;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
CCSDSPacket::CCSDSPacket(const CCSDSPacket &v) noexcept
|
|
|
|
|
{
|
|
|
|
|
header = v.header;
|
|
|
|
|
payload = v.payload;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CCSDSPacket &CCSDSPacket::operator=(const CCSDSPacket &v) noexcept
|
|
|
|
|
{
|
|
|
|
|
if (this != &v)
|
|
|
|
|
{
|
|
|
|
|
header = v.header;
|
|
|
|
|
payload = v.payload;
|
|
|
|
|
}
|
|
|
|
|
return *this;
|
|
|
|
|
};
|
2021-07-02 01:03:35 +02:00
|
|
|
} // namespace proba
|