CCSDSPack
C++ Library for CCSDS Space Packet manipulation. i.e. generation, extraction, analisys and more
Loading...
Searching...
No Matches
CCSDSValidator.cpp
Go to the documentation of this file.
1#include "CCSDSValidator.h"
2#include <CCSDSUtils.h>
3
4void CCSDS::Validator::configure(const bool validatePacketCoherence, bool validateSequenceCount, const bool validateAgainstTemplate) {
5 m_validatePacketCoherence = validatePacketCoherence;
6 m_validateAgainstTemplate = validateAgainstTemplate;
7}
8
9bool CCSDS::Validator::validate(const Packet &packet) {
10 m_report.clear();
11 m_report.reserve(m_reportSize);
12 m_report.assign({true, true, true, true, true, true});
13 bool result{true};
14 auto toValidate = packet;
15 toValidate.setUpdatePacketEnable(false);
16 auto toValidateHeader = toValidate.getPrimaryHeader();
17 const auto toValidateHeaderData = toValidateHeader.serialize();
18 // auto coherence checks
19 const auto dataFieldBytes = toValidate.getFullDataFieldBytes();
20 const auto dataFieldBytesSize = dataFieldBytes.size();
21
22 // test CRC therefore full data field coherence
23 if (m_validatePacketCoherence) {
24 m_report[0] = toValidateHeader.getDataLength() == dataFieldBytesSize;
25 result &= m_report[0];
26 const auto calcCRC = crc16(dataFieldBytes);
27 m_report[1] = calcCRC == toValidate.getCRC();
28 result &= m_report[1];
29 if (toValidateHeader.getSequenceFlags() == UNSEGMENTED) {
30 m_report[2] = toValidateHeader.getSequenceCount() == 0;
31 } else {
32 m_report[2] = toValidateHeader.getSequenceCount() > 0;
33 if (m_validateSegmentedCount) {
34 if (toValidateHeader.getSequenceFlags() == FIRST_SEGMENT) {
35 m_report[3] = toValidateHeader.getSequenceCount() == 1;
36 }else {
37 m_report[3] = toValidateHeader.getSequenceCount() == m_sequenceCounter;
38 }
39 m_sequenceCounter++;
40 }
41 }
42 result &= m_report[2];
43 result &= m_report[3];
44 }
45
46 if (m_validateAgainstTemplate) {
47 m_templatePacket.setUpdatePacketEnable(false);
48 auto templateHeader = m_templatePacket.getPrimaryHeader();
49 const auto templateHeaderData = templateHeader.serialize();
50 m_report[4] = templateHeaderData[0] == toValidateHeaderData[0] && templateHeaderData[1] == toValidateHeaderData[1];
51 result &= m_report[4];
52 if (templateHeader.getSequenceFlags() == UNSEGMENTED) {
53 m_report[5] = toValidateHeader.getSequenceFlags() == UNSEGMENTED;
54 } else {
55 m_report[5] = toValidateHeader.getSequenceFlags() != UNSEGMENTED;
56 }
57 result &= m_report[5];
58 }
59 return result;
60}
61
63 m_sequenceCounter = 1;
64 m_report.clear();
65 m_templatePacket = {};
66 m_templatePacket.setUpdatePacketEnable(false);
67}
uint16_t crc16(const std::vector< uint8_t > &data, uint16_t polynomial=0x1021, uint16_t initialValue=0xFFFF, uint16_t finalXorValue=0x0000)
Computes the CRC-16 checksum for a given data vector with configurable parameters.
Defines the Validator class for CCSDS packet validation.
Represents a CCSDS (Consultative Committee for Space Data Systems) packet.
Definition CCSDSPacket.h:60
void setUpdatePacketEnable(bool enable)
needs to be called as soon as possible, probably also from constructor.
void clear()
Clears the validator, resets counter.
bool m_validatePacketCoherence
Whether to validate packet length and CRC (default is true).
bool m_validateAgainstTemplate
Whether to validate against the template packet (default is false).
void configure(bool validatePacketCoherence, bool validateSequenceCount, bool validateAgainstTemplate)
Configures validation options.
bool validate(const Packet &packet)
Validates a given packet.
@ UNSEGMENTED
11 Complete packet in a single frame.
Definition CCSDSHeader.h:23
@ FIRST_SEGMENT
01 First segment of a new packet.
Definition CCSDSHeader.h:21