CCSDSPack
C++ Library for CCSDS Space Packet manipulation. i.e. generation, extraction, analisys and more
Loading...
Searching...
No Matches
Classes | Functions
CCSDSUtils.h File Reference
#include <CCSDSPacket.h>
#include <CCSDSManager.h>
#include <string>
#include <cstdint>
#include <vector>
Include dependency graph for CCSDSUtils.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  Config
 Parses and stores config values from custom file format. More...
 

Functions

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.
 
void printPacket (CCSDS::Packet &packet)
 Prints to console a CCSDS Packets, breaking it down to Primary header and Data field.
 
void printPackets (CCSDS::Manager &manager)
 Prints to console a series of CCSDS Packets contained in the manager.
 
std::string getBinaryString (uint32_t value, int bits)
 Converts a given value to its binary representation as a string, with spaces every 4 bits.
 
std::string getBitsSpaces (int num)
 Generates a string of spaces for formatting binary outputs.
 
void printBufferData (const std::vector< uint8_t > &buffer, int limitBytes=20)
 Prints to console the HEX data from the bytes vector.
 
void printData (CCSDS::DataField dataField)
 Prints the data field details, including the secondary header and application data.
 
void printHeader (CCSDS::Header &header)
 Prints the header fields and their binary or hexadecimal representations.
 
CCSDS::ResultBool printPrimaryHeader (CCSDS::Packet &packet)
 Prints to console the primary header of a provided CCSDS packet.
 
void printDataField (CCSDS::Packet &packet)
 Prints the data field and the CRC-16 checksum of the packet.
 
CCSDS::ResultBool writeBinaryFile (const std::vector< uint8_t > &data, const std::string &filename)
 This function takes in a buffer of data and a file name.
 
CCSDS::ResultBuffer readBinaryFile (const std::string &filename)
 Read a specified binary file and return its contents as a buffer.
 
bool fileExists (const std::string &fileName)
 filesystem check fore file existence prepared for both windows and linux.
 
bool stringEndsWith (const std::string &str, const std::string &suffix)
 Tests if str ends with suffix.
 

Function Documentation

◆ crc16()

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.

Parameters
dataA vector of bytes to compute the checksum for.
polynomialThe polynomial used for the CRC calculation (default: CCSDS CRC-16 polynomial 0x1021).
initialValueThe initial value of the CRC register (default: 0xFFFF).
finalXorValueThe final XOR value applied to the CRC result (default: 0x0000).
Returns
The computed 16-bit CRC value.

Definition at line 147 of file CCSDSUtils.cpp.

149 {
150 uint16_t crc = initialValue;
151
152 for (const auto &byte: data) {
153 crc ^= static_cast<uint16_t>(byte) << 8; // Align byte with MSB of 16-bit CRC
154 for (int i = 0; i < 8; ++i) {
155 // Process each bit
156 if (crc & 0x8000) {
157 // Check if MSB is set
158 crc = (crc << 1) ^ polynomial; // Shift and XOR with polynomial
159 } else {
160 crc = crc << 1; // Shift only
161 }
162 }
163 }
164
165 return crc ^ finalXorValue; // Apply final XOR
166}
Here is the caller graph for this function:

◆ fileExists()

bool fileExists ( const std::string &  fileName)

filesystem check fore file existence prepared for both windows and linux.

Parameters
fileNamestd::string
Returns
bool

Definition at line 226 of file CCSDSUtils.cpp.

226 {
227 auto exp = readBinaryFile(fileName);
228 if ( exp.has_value()) {
229 return true;
230 }
231 return false;
232}
CCSDS::ResultBuffer readBinaryFile(const std::string &filename)
Read a specified binary file and return its contents as a buffer.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ getBinaryString()

std::string getBinaryString ( uint32_t  value,
int  bits 
)

Converts a given value to its binary representation as a string, with spaces every 4 bits.

Parameters
valueThe 32-bit integer value to convert.
bitsThe number of significant bits to include in the binary string.
Returns
A string representing the binary value with spaces every 4 bits.

Definition at line 11 of file CCSDSUtils.cpp.

11 {
12 std::string binaryString;
13 // Calculate the minimum number of bits required to represent in groups of 4
14 const int paddedBits = ((bits + 3) / 4) * 4; // Round up to the nearest multiple of 4
15
16 for (int i = paddedBits - 1; i >= 0; --i) {
17 binaryString += ((value >> i) & 1) ? '1' : '0';
18
19 // Add a space after every 4 bits, except at the end
20 if (i % 4 == 0 && i != 0) {
21 binaryString += ' ';
22 }
23 }
24 return binaryString;
25}
Here is the caller graph for this function:

◆ getBitsSpaces()

std::string getBitsSpaces ( int  num)

Generates a string of spaces for formatting binary outputs.

Parameters
numThe number of spaces required.
Returns
A string of spaces of length num.

Definition at line 27 of file CCSDSUtils.cpp.

27 {
28 std::string spaces;
29
30 for (int i = num - 1; i >= 0; --i) {
31 spaces += ' ';
32 }
33
34 return spaces;
35}
Here is the caller graph for this function:

◆ printBufferData()

void printBufferData ( const std::vector< uint8_t > &  buffer,
int  limitBytes = 20 
)

Prints to console the HEX data from the bytes vector.

Parameters
buffer
limitBytes

Definition at line 37 of file CCSDSUtils.cpp.

37 {
38 std::cout << "[ ";
39 if (buffer.size() > limitBytes) {
40 for (size_t i= 0 ; i < static_cast<int>(limitBytes / 2); i++) {
41 std::cout << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(buffer[i]) << " ";
42 }
43 std::cout << "... ";
44 for (size_t i = buffer.size() - static_cast<int>(limitBytes / 2) ; i < buffer.size(); i++) {
45 std::cout << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(buffer[i]) << " ";
46 }
47 } else {
48 for (const unsigned char i: buffer) {
49 std::cout << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(i) << " ";
50 }
51 }
52 std::cout << "]" << std::endl;
53}
Here is the caller graph for this function:

◆ printData()

void printData ( CCSDS::DataField  dataField)

Prints the data field details, including the secondary header and application data.

Outputs information about the presence of a secondary header and the content of both the secondary header and the application data in hexadecimal format.

Returns
none.

Definition at line 55 of file CCSDSUtils.cpp.

55 {
56 const auto dataFieldHeader = dataField.getDataFieldHeaderBytes();
57 auto applicationData = dataField.getApplicationData();
58 const uint16_t maxSize = (applicationData.size() > dataFieldHeader.size())
59 ? applicationData.size()
60 : dataFieldHeader.size();
61
62 std::cout << " [CCSDS DATA] Data Field Length : " << applicationData.size() + dataFieldHeader.size() << " bytes" << std::endl;
63 std::cout << " [CCSDS DATA] Secondary Header Present : [ " << (dataField.getDataFieldHeaderFlag()
64 ? "True"
65 : "False") << " ]" << std::endl;
66 if (!dataFieldHeader.empty()) {
67 std::cout << " [CCSDS DATA] Secondary Header [Hex] : " << getBitsSpaces(
68 (maxSize - static_cast<uint16_t>(dataFieldHeader.size())) * 4);
69 printBufferData(dataFieldHeader);
70 }
71
72 std::cout << " [CCSDS DATA] Application Data [Hex] : ";
73 printBufferData(applicationData);
74 std::cout << std::endl;
75}
std::string getBitsSpaces(const int num)
Generates a string of spaces for formatting binary outputs.
void printBufferData(const std::vector< uint8_t > &buffer, const int limitBytes)
Prints to console the HEX data from the bytes vector.
std::vector< uint8_t > getDataFieldHeaderBytes()
Retrieves the secondary header data as a vector of bytes.
std::vector< uint8_t > getApplicationData()
Retrieves the application data from the data field.
bool getDataFieldHeaderFlag() const
retrieves true if a known secondary header has been set
Here is the call graph for this function:
Here is the caller graph for this function:

◆ printDataField()

void printDataField ( CCSDS::Packet packet)

Prints the data field and the CRC-16 checksum of the packet.

Outputs the content of the data field and the CRC-16 checksum in hexadecimal format to the standard output.

Returns
none.

Definition at line 138 of file CCSDSUtils.cpp.

138 {
139 auto dataField = packet.getDataField();
140
141 printData(dataField);
142 std::cout << "[ CCSDSPack ] CRC-16 [Hex] : [ " << "0x" << std::hex << packet.getCRC() << " ]";
143 std::cout << " - [Dec] : "<< std::dec << packet.getCRC() << std::endl;
144
145}
void printData(CCSDS::DataField dataField)
Prints the data field details, including the secondary header and application data.
uint16_t getCRC()
Computes and retrieves the CRC-16 checksum of the packet.
CCSDS::DataField & getDataField()
returns the CCSDS packet's DataField.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ printHeader()

void printHeader ( CCSDS::Header header)

Prints the header fields and their binary or hexadecimal representations.

Outputs all relevant header fields, including the full primary header, version number, type, data field header flag, APID, sequence flags, sequence count, and data length. Each field is displayed with appropriate formatting and spacing.

Returns
none.

Definition at line 77 of file CCSDSUtils.cpp.

77 {
78 std::cout << " [CCSDS HEADER] Full Primary Header [Hex] : [ " << getBitsSpaces(17 - 12) << "0x" << std::hex <<
79 header.getFullHeader() << " ]" << std::endl;
80 std::cout << std::endl;
81
82 std::cout << " [CCSDS HEADER] Version Number : [ " << getBitsSpaces(19 - 4) <<
83 getBinaryString(header.getVersionNumber(), 3) << " ]";
84 std::cout << " - [Dec] : "<< std::dec << static_cast<int>( header.getVersionNumber()) << std::endl;
85
86 std::cout << " [CCSDS HEADER] Type : [ " << getBitsSpaces(19 - 4) <<
87 getBinaryString(header.getType(), 1) << " ]";
88 std::cout << " - [Dec] : "<< std::dec << static_cast<int>( header.getType()) << std::endl;
89
90 std::cout << " [CCSDS HEADER] APID : [ " << getBitsSpaces(17 - 12) <<
91 getBinaryString(header.getAPID(), 11) << " ]";
92 std::cout << " - [Dec] : " << std::dec << header.getAPID() << std::endl;
93
94 std::cout << " [CCSDS HEADER] Data Field Header Flag : [ " << getBitsSpaces(19 - 4) << getBinaryString(
95 header.getDataFieldHeaderFlag(), 1) << " ]";
96 std::cout << " - : " << (header.getDataFieldHeaderFlag() ? "True" : "False") << std::endl;
97
98 std::cout << " [CCSDS HEADER] Sequence Flags : [ " << getBitsSpaces(19 - 4) <<
99 getBinaryString(header.getSequenceFlags(), 2) << " ]";
100 std::cout << " - : ";
101 switch(header.getSequenceFlags()) {
102 case 0:
103 std::cout << "CONTINUING_SEGMENT";
104 break;
105 case 1:
106 std::cout << "FIRST_SEGMENT";
107 break;
108 case 2:
109 std::cout << "LAST_SEGMENT";
110 break;
111 case 3:
112 std::cout << "UNSEGMENTED";
113 break;
114 default:
115 break;
116 }
117 std::cout << std::endl;
118
119 std::cout << " [CCSDS HEADER] Sequence Count : [ " << getBitsSpaces(0) << getBinaryString(
120 header.getSequenceCount(), 14) << " ]";
121 std::cout << " - [Dec] : "<< std::dec << header.getSequenceCount() << std::endl;
122
123 std::cout << " [CCSDS HEADER] DataLength : [ " << getBinaryString(header.getDataLength(), 16) <<
124 " ]";
125 std::cout << " - [Dec] : "<< std::dec << header.getDataLength() << std::endl;
126
127 std::cout << std::endl;
128}
std::string getBinaryString(const uint32_t value, const int bits)
Converts a given value to its binary representation as a string, with spaces every 4 bits.
uint8_t getVersionNumber() const
3 bits
Definition CCSDSHeader.h:84
uint16_t getAPID() const
11 bits
Definition CCSDSHeader.h:87
uint8_t getType() const
1 bits
Definition CCSDSHeader.h:85
uint8_t getSequenceFlags() const
2 bits
Definition CCSDSHeader.h:88
uint8_t getDataFieldHeaderFlag() const
1 bits
Definition CCSDSHeader.h:86
uint16_t getSequenceCount() const
14 bits
Definition CCSDSHeader.h:89
uint16_t getDataLength() const
16 bits
Definition CCSDSHeader.h:90
uint64_t getFullHeader()
Computes and retrieves the full header as a 64-bit value.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ printPacket()

void printPacket ( CCSDS::Packet packet)

Prints to console a CCSDS Packets, breaking it down to Primary header and Data field.

Parameters
packet

Definition at line 168 of file CCSDSUtils.cpp.

168 {
169 printPrimaryHeader(packet);
170 printDataField(packet);
171}
CCSDS::ResultBool printPrimaryHeader(CCSDS::Packet &packet)
Prints to console the primary header of a provided CCSDS packet.
void printDataField(CCSDS::Packet &packet)
Prints the data field and the CRC-16 checksum of the packet.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ printPackets()

void printPackets ( CCSDS::Manager manager)

Prints to console a series of CCSDS Packets contained in the manager.

Parameters
manager

Definition at line 173 of file CCSDSUtils.cpp.

173 {
174 std::cout << "[ CCSDS Manager ] Number of Packets : " << manager.getTotalPackets() << std::endl;
175 std::cout << "[ CCSDS Manager ] Sync Pattern Enabled : " << (manager.getSyncPatternEnable() ? "True" : "False") << std::endl;
176 std::cout << "[ CCSDS Manager ] Sync Pattern : 0x" << std::hex << manager.getSyncPattern() << std::dec << std::endl;
177
178 auto templatePacket = manager.getTemplate();
179 std::cout << "[ CCSDS Manager ] Template : " << std::endl ;
180 printPrimaryHeader(templatePacket);
181
182 int idx = 1;
183 for (auto &packet: manager.getPacketsReference()) {
184 std::cout << "__________________________________________________________________________________________________________________" << std::endl;
185 std::cout << "[ CCSDS Manager ] Printing Packet [ " << idx << " ]:" << std::endl;
186 std::cout << "[ CCSDS Manager ] Packet Length : " << packet.getFullPacketLength() << " bytes" << std::endl;
187 std::cout << "[ CCSDS Manager ] Data ";
188 printBufferData(packet.serialize(), 20);
189 printPacket(packet);
190 idx++;
191 }
192}
void printPacket(CCSDS::Packet &packet)
Prints to console a CCSDS Packets, breaking it down to Primary header and Data field.
uint32_t getSyncPattern() const
returns the currently set sync pattern.
uint16_t getTotalPackets() const
Retrieves the total number of packets managed.
Packet getTemplate()
Retrieves the packet template.
bool getSyncPatternEnable() const
returns the current settings of the sync pattern enable
Here is the call graph for this function:
Here is the caller graph for this function:

◆ printPrimaryHeader()

CCSDS::ResultBool printPrimaryHeader ( CCSDS::Packet packet)

Prints to console the primary header of a provided CCSDS packet.

Parameters
packet
Returns
ResultBool

Definition at line 131 of file CCSDSUtils.cpp.

131 {
132 CCSDS::Header header;
133 FORWARD_RESULT(header.deserialize({packet.getPrimaryHeaderBytes()}));
134 printHeader(header);
135 return true;
136}
#define FORWARD_RESULT(result)
Macro to return a result as-is (for functions returning Result<T>).
void printHeader(CCSDS::Header &header)
Prints the header fields and their binary or hexadecimal representations.
Manages the decomposition and manipulation of CCSDS primary headers.
Definition CCSDSHeader.h:80
ResultBool deserialize(const std::vector< uint8_t > &data)
Sets the header data from a 64-bit integer representation.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ readBinaryFile()

CCSDS::ResultBuffer readBinaryFile ( const std::string &  filename)

Read a specified binary file and return its contents as a buffer.

Parameters
filename
Returns
Result vector of uint8 or Error

Definition at line 208 of file CCSDSUtils.cpp.

208 {
209 RET_IF_ERR_MSG(filename.empty(),CCSDS::ErrorCode::FILE_READ_ERROR, "No filename provided");
210
211 std::ifstream in(filename, std::ios::binary | std::ios::ate);
212 RET_IF_ERR_MSG(!in,CCSDS::ErrorCode::FILE_READ_ERROR, "Failed to open file for reading");
213
214 // Get the file size using the 'ate' flag (seeks to the end automatically)
215 const std::streamsize size = in.tellg();
216 in.seekg(0, std::ios::beg);
217
218 // Read the entire file content into the vector
219 std::vector<uint8_t> data(size);
220 in.read(reinterpret_cast<char*>(data.data()), size);
221
222 RET_IF_ERR_MSG(!in,CCSDS::ErrorCode::FILE_READ_ERROR, "Failed to read the entire file");
223 return data;
224}
#define RET_IF_ERR_MSG(condition, errorCode, message)
Macro to return an error with an error message if a condition is met.
@ FILE_READ_ERROR
Reading from file failure.
Definition CCSDSResult.h:31
Here is the caller graph for this function:

◆ stringEndsWith()

bool stringEndsWith ( const std::string &  str,
const std::string &  suffix 
)

Tests if str ends with suffix.

equivalent to endsWith(str) in c++20

Parameters
strstring
suffixstring
Returns
boolean

Definition at line 234 of file CCSDSUtils.cpp.

234 {
235 return str.size() >= suffix.size() &&
236 str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0;
237}
Here is the caller graph for this function:

◆ writeBinaryFile()

CCSDS::ResultBool writeBinaryFile ( const std::vector< uint8_t > &  data,
const std::string &  filename 
)

This function takes in a buffer of data and a file name.

and writes the data in binary form to the file.

Parameters
datavector of uint8_t
filenamestring
Returns
Result boolean true if successful or error

Definition at line 194 of file CCSDSUtils.cpp.

194 {
195 RET_IF_ERR_MSG(filename.empty(),CCSDS::ErrorCode::FILE_WRITE_ERROR, "No filename provided");
196 RET_IF_ERR_MSG(data.empty(),CCSDS::ErrorCode::FILE_WRITE_ERROR, "No data provided");
197 std::ofstream out(filename, std::ios::binary);
198
199 RET_IF_ERR_MSG(!out,CCSDS::ErrorCode::FILE_WRITE_ERROR, "Failed to open file for writing");
200
201 // Write the entire vector data to the file in one go
202 out.write(reinterpret_cast<const char*>(data.data()), static_cast<std::streamsize>(data.size()));
203 RET_IF_ERR_MSG(!out,CCSDS::ErrorCode::FILE_WRITE_ERROR, "Failed to write the data to the file");
204
205 return true;
206}
@ FILE_WRITE_ERROR
Writing to file failure.
Definition CCSDSResult.h:32
Here is the caller graph for this function: