55 {
56 std::string appName = "ccsds_decoder";
57
58 std::unordered_map<std::string, std::string> allowed;
59 allowed.insert({"h", "help"});
60 allowed.insert({"v", "verbose"});
61 allowed.insert({"i", "input"});
62 allowed.insert({"o", "output"});
63 allowed.insert({"c", "config"});
64
65 const std::set<std::string> booleanArgs{"verbose", "help"};
66
67 std::unordered_map<std::string, std::string> args;
68 args.insert({"verbose", "false"});
69 args.insert({"help", "false"});
70
71 const auto start = std::chrono::high_resolution_clock::now();
73 std::cerr << "[ Error " << res.error().code() << " ]: "<< res.error().message() << std::endl ;
74 return res.error().code();
75 }
76
77
78
79
80 if (args["help"] == "true") {
82 return 0;
83 }
84 bool verbose{args["verbose"] == "true"};
85
86 if (args.find("input") == args.end()) {
87 std::cerr <<
"[ Error " <<
ARG_PARSE_ERROR <<
" ]: " <<
"Input file must be specified" << std::endl;
90 }
91
93 std::cerr <<
"[ Error " <<
ARG_PARSE_ERROR <<
" ]: " <<
"Input \"" << args[
"input"] <<
"\" does not exist" << std::endl;
95 }
96 const std::string input{args["input"]};
97 const std::string output{args["output"]};
98
99 if (output.empty()) {
100 std::cerr <<
"[ Error " <<
ARG_PARSE_ERROR <<
" ]: " <<
"Output file must be specified" << std::endl;
103 }
104
105 if (args.find("config") == args.end()) {
106 std::cerr <<
"[ Error " <<
ARG_PARSE_ERROR <<
" ]: " <<
"Config file must be specified" << std::endl;
109 }
110
112 std::cerr <<
"[ Error " <<
ARG_PARSE_ERROR <<
" ]: " <<
"Config \"" << args[
"config"] <<
"\" does not exist" << std::endl;
114 }
115 const std::string configFile{args["config"]};
116
117
118 customConsole(appName,
"reading CCSDS configuration file: " + configFile);
120 {
121 if (
auto res = cfg.
load(configFile); !res.has_value()) {
122 std::cerr << "[ Error " << res.error().code() << " ]: "<< res.error().message() << std::endl ;
123 return res.error().code();
124 }
125 }
126
128
129 if (cfg.
isKey(
"data_field_size")) {
130 std::uint16_t dataFieldSize;
133
134 }
135
136 if (cfg.
isKey(
"sync_pattern_enable")) {
137 bool syncPatternEnable;
140 if (syncPatternEnable && cfg.
isKey(
"sync_pattern")) {
141 std::uint32_t syncPattern;
144 }
145 }
146
147 bool validationEnable;
148 if (!cfg.
isKey(
"validation_enable")) {
149 std::cerr <<
"[ Error " <<
CONFIG_MISSING_PARAMETER <<
" ]: " <<
"Config: Missing bool field: validation_enable" << std::endl;
151 }
154
156 std::cerr << "[ Error " << res.error().code() << " ]: "<< res.error().message() << std::endl ;
157 return res.error().code();
158 }
159
160 std::vector<std::uint8_t> inputBytes;
162
164 std::cerr << "[ Error " << res.error().code() << " ]: "<< res.error().message() << std::endl ;
165 return res.error().code();
166 }else {
167 inputBytes = res.value();
169 std::cerr <<
"[ Error " <<
INVALID_INPUT_DATA <<
" ]: "<<
"Input data is too big for unsegmented packets, data "
170 << inputBytes.size() <<
" must be less than defined data packet length of " << manager.
getDataFieldSize() << std::endl ;
172 }
173 }
174 customConsole(appName,
"deserializing CCSDS packets from file");
175 if (
const auto res = manager.
load(inputBytes); !res.has_value()) {
176 std::cerr << "[ Error " << res.error().code() << " ]: "<< res.error().message() << std::endl ;
177 return res.error().code();
178 }
179 if (verbose)
customConsole(appName,
"printing loaded packets data to screen:");
181
182 customConsole(appName,
"retrieving Application data from CCSDS packets");
184 std::vector<std::uint8_t> outputData;
186 std::cerr << "[ Error " << res.error().code() << " ]: "<< res.error().message() << std::endl ;
187 return res.error().code();
188 }else {
189 outputData = res.value();
190 }
191
194 std::cerr << "[ Error " << res.error().code() << " ]: "<< res.error().message() << std::endl ;
195 return res.error().code();
196 }
197
198 const auto end = std::chrono::high_resolution_clock::now();
199 const auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
200 customConsole(appName,
"execution time: " + std::to_string(duration.count()) +
" [us]");
202 return 0;
203}
#define ASSIGN_OR_PRINT(var, result)
Macro to assign a result value or print an error message.
bool fileExists(const std::string &fileName)
filesystem check fore file existence prepared for both windows and linux.
CCSDS::ResultBuffer readBinaryFile(const std::string &filename)
Read a specified binary file and return its contents as a buffer.
CCSDS::ResultBool writeBinaryFile(const std::vector< std::uint8_t > &data, const std::string &filename)
This function takes in a buffer of data and a file name.
void printPackets(CCSDS::Manager &manager)
Prints to console a series of CCSDS Packets contained in the manager.
Manages CCSDS packets and their templates.
void setSyncPatternEnable(bool enable)
enable sync pattern utilization both in serialization, deserialization, read and write.
std::uint16_t getDataFieldSize() const
retrieves the set data field size (this includes the secondary header if present)
void setSyncPattern(std::uint32_t syncPattern)
set sync pattern that should indicate the start of a CCSDS packet.
ResultBool load(const std::vector< Packet > &packets)
Load a vector of packets.
Packet getTemplate()
Retrieves the packet template.
ResultBuffer getApplicationDataBuffer()
Retrieves the application data from the packets.
ResultBool loadTemplateConfig(const Config &cfg)
Loads a template packet from a configuration object.
void setDataFieldSize(std::uint16_t size)
Sets the size of the data field.
void setAutoValidateEnable(bool enable)
Enables or disables automatic validation of packets.
Header & getPrimaryHeader()
returns the CCSDS packet's Primary Header.
bool has_value() const
Checks if the result contains a valid value.
Parses and stores config values from custom file format.
bool isKey(const std::string &key) const
CCSDS::ResultBool load(const std::string &filename)
Load config file.
CCSDS::Result< T > get(const std::string &key) const
Get value by key and type.
void printHelpDecoder()
This is the source file that holds the execution logic of ccsds_encoder binary file.
void customConsole(const std::string &appName, const std::string &message, const std::string &logLevel="INFO")
Prints log to console adding various information about.
CCSDS::ResultBool parseArguments(int argc, char *argv[], std::unordered_map< std::string, std::string > &allowedMap, std::unordered_map< std::string, std::string > &outArgs, const std::set< std::string > &booleanArgs)
Parses the input arguments with defined values returns an unordered map with given keys and input val...
@ CONFIG_MISSING_PARAMETER
@ ARG_PARSE_ERROR
Error Parsing argument.
@ UNSEGMENTED
11 Complete packet in a single frame.