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// Copyright 2025-2026 ExoSpaceLabs
2// SPDX-License-Identifier: Apache-2.0
3
4#include "CCSDSValidator.h"
5#include <CCSDSUtils.h>
6
7void CCSDS::Validator::configure(const bool validatePacketCoherence, bool validateSequenceCount, const bool validateAgainstTemplate) {
8 m_validatePacketCoherence = validatePacketCoherence;
9 m_validateAgainstTemplate = validateAgainstTemplate;
10}
11
13 m_report.clear();
14 m_report.reserve(m_reportSize);
15 m_report.assign({true, true, true, true, true, true});
16 bool result{true};
17 auto toValidate = packet;
18 toValidate.setUpdatePacketEnable(false);
19 auto toValidateHeader = toValidate.getPrimaryHeader();
20 const auto toValidateHeaderData = toValidateHeader.serialize();
21 // auto coherence checks
22 const auto dataFieldBytes = toValidate.getFullDataFieldBytes();
23 const auto dataFieldBytesSize = dataFieldBytes.size();
24
25 // test CRC therefore full data field coherence
26 if (m_validatePacketCoherence) {
27 m_report[0] = toValidateHeader.getDataLength() == dataFieldBytesSize;
28 result &= m_report[0];
29 const auto calcCRC = crc16(dataFieldBytes);
30 m_report[1] = calcCRC == toValidate.getCRC();
31 result &= m_report[1];
32 if (toValidateHeader.getSequenceFlags() == UNSEGMENTED) {
33 m_report[2] = toValidateHeader.getSequenceCount() == 0;
34 } else {
35 m_report[2] = toValidateHeader.getSequenceCount() > 0;
36 if (m_validateSegmentedCount) {
37 if (toValidateHeader.getSequenceFlags() == FIRST_SEGMENT) {
38 m_report[3] = toValidateHeader.getSequenceCount() == 1;
39 }else {
40 m_report[3] = toValidateHeader.getSequenceCount() == m_sequenceCounter;
41 }
42 m_sequenceCounter++;
43 }
44 }
45 result &= m_report[2];
46 result &= m_report[3];
47 }
48
49 if (m_validateAgainstTemplate) {
50 m_templatePacket.setUpdatePacketEnable(false);
51 auto templateHeader = m_templatePacket.getPrimaryHeader();
52 const auto templateHeaderData = templateHeader.serialize();
53 m_report[4] = templateHeaderData[0] == toValidateHeaderData[0] && templateHeaderData[1] == toValidateHeaderData[1];
54 result &= m_report[4];
55 if (templateHeader.getSequenceFlags() == UNSEGMENTED) {
56 m_report[5] = toValidateHeader.getSequenceFlags() == UNSEGMENTED;
57 } else {
58 m_report[5] = toValidateHeader.getSequenceFlags() != UNSEGMENTED;
59 }
60 result &= m_report[5];
61 }
62 return result;
63}
64
66 m_sequenceCounter = 1;
67 m_report.clear();
68 m_templatePacket = {};
69 m_templatePacket.setUpdatePacketEnable(false);
70}
uint16_t crc16(const std::vector< std::uint8_t > &data, std::uint16_t polynomial=0x1021, std::uint16_t initialValue=0xFFFF, std::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:62
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:26
@ FIRST_SEGMENT
01 First segment of a new packet.
Definition CCSDSHeader.h:24