NSUKit 1.4.0
板卡级统一交互接口
载入中...
搜索中...
未找到
icd_parser.cpp
浏览该文件的文档.
1//
2// Created by 56585 on 2023/8/14.
3//
4
5#include "json_icd_wrapper.h"
6
7using namespace nsukit;
8
13inline static void *CheckFeedback(char *data) {
14 StandardCmdFeedback feedback;
15 memcpy(&feedback, data, sizeof(feedback));
16 if (feedback.packHead != 0xCFCFCFCF) {
17 std::cout << "Receive instruction header is misplaced" << std::endl;
18 return nullptr;
19 }
20 if (feedback.execSucceed != 0) {
21 std::cout << "The command was sent successfully but failed to execute" << std::endl;
22 return nullptr;
23 }
24 std::cout << "Command sent successfully" << std::endl;
25 return nullptr;
26}
27
28
29bool JsonWrapper::InitICD(std::string_view path) {
30 // Get the input stream of icd.json
31 std::ifstream _in(path.data(), std::ios::binary);
32 if (!_in.is_open()) {
33 std::cout << "can not find icd file: " << path << std::endl;
34 throw std::runtime_error("can not find icd file");
35 }
36
37 // Parse json file
38 if (ICDReader.parse(_in, icdRoot)) {
39 icdCommands = &icdRoot["command"];
40 if (icdRoot.isMember("param")) {
41 icdParams = &icdRoot["param"];
42 }
43 } else {
44 std::cout << "file: " << path << "Wrong format!" << std::endl;
45 throw std::runtime_error("icd file format error");
46 }
47 _in.close();
48
49 return true;
50}
51
52
54 cs_itf = itf;
55 icd = new JsonWrapper();
56}
57
58
60 delete icd;
61}
62
63
65 icdPath = param->icd_path;
67
68 try {
70 } catch (...) {
71 return nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
72 }
73
74 return nsukitStatus_t::NSUKIT_STATUS_SUCCESS;
75}
76
77
78uint8_t ICDRegMw::get_param(nsuCSParam_t &param_name, uint8_t _default) {
79 try {
80 return icd->get_icd_param<uint8_t>(param_name);
81 } catch (std::runtime_error &e) {
82 std::cout << e.what() << std::endl;
83 return _default;
84 }
85}
86
87int8_t ICDRegMw::get_param(nsuCSParam_t &param_name, int8_t _default) {
88 try {
89 return icd->get_icd_param<int8_t>(param_name);
90 } catch (std::runtime_error &e) {
91 return _default;
92 }
93}
94
95uint16_t ICDRegMw::get_param(nsuCSParam_t &param_name, uint16_t _default) {
96 try {
97 return icd->get_icd_param<uint16_t>(param_name);
98 } catch (std::runtime_error &e) {
99 return _default;
100 }
101}
102
103int16_t ICDRegMw::get_param(nsuCSParam_t &param_name, int16_t _default) {
104 try {
105 return icd->get_icd_param<int16_t>(param_name);
106 } catch (std::runtime_error &e) {
107 return _default;
108 }
109}
110
111uint32_t ICDRegMw::get_param(nsuCSParam_t &param_name, uint32_t _default) {
112 try {
113 return icd->get_icd_param<uint32_t>(param_name);
114 } catch (std::runtime_error &e) {
115 return _default;
116 }
117}
118
119int32_t ICDRegMw::get_param(nsuCSParam_t &param_name, int32_t _default) {
120 try {
121 return icd->get_icd_param<int32_t>(param_name);
122 } catch (std::runtime_error &e) {
123 return _default;
124 }
125}
126
127double ICDRegMw::get_param(nsuCSParam_t &param_name, double _default) {
128 try {
129 return icd->get_icd_param<double>(param_name);
130 } catch (std::runtime_error &e) {
131 return _default;
132 }
133}
134
135float ICDRegMw::get_param(nsuCSParam_t &param_name, float _default) {
136 try {
137 return icd->get_icd_param<float>(param_name);
138 } catch (std::runtime_error &e) {
139 return _default;
140 }
141}
142
143std::string ICDRegMw::get_param(nsuCSParam_t &param_name, std::string _default) {
144 try {
145 return icd->get_icd_param<std::string>(param_name);
146 } catch (std::runtime_error &e) {
147 return _default;
148 }
149}
150
151
152nsukitStatus_t ICDRegMw::set_param(nsuCSParam_t &param_name, const uint8_t &value) {
153 return icd->set_icd_param(param_name, value);
154}
155
156nsukitStatus_t ICDRegMw::set_param(nsuCSParam_t &param_name, const int8_t &value) {
157 return icd->set_icd_param(param_name, value);
158}
159
160nsukitStatus_t ICDRegMw::set_param(nsuCSParam_t &param_name, const uint16_t &value) {
161 return icd->set_icd_param(param_name, value);
162}
163
164nsukitStatus_t ICDRegMw::set_param(nsuCSParam_t &param_name, const int16_t &value) {
165 return icd->set_icd_param(param_name, value);
166}
167
168nsukitStatus_t ICDRegMw::set_param(nsuCSParam_t &param_name, const uint32_t &value) {
169 return icd->set_icd_param(param_name, value);
170}
171
172nsukitStatus_t ICDRegMw::set_param(nsuCSParam_t &param_name, const int32_t &value) {
173 return icd->set_icd_param(param_name, value);
174}
175
176nsukitStatus_t ICDRegMw::set_param(nsuCSParam_t &param_name, const double &value) {
177 return icd->set_icd_param(param_name, value);
178}
179
180nsukitStatus_t ICDRegMw::set_param(nsuCSParam_t &param_name, const float &value) {
181 return icd->set_icd_param(param_name, value);
182}
183
184nsukitStatus_t ICDRegMw::set_param(nsuCSParam_t &param_name, const std::string &value) {
185 return icd->set_icd_param(param_name, value);
186}
187
188
190 auto res = nsukitStatus_t::NSUKIT_STATUS_SUCCESS;
191 CommandPack *pCommandPack;
192 try {
193 pCommandPack = FmtCommand(cname);
194 } catch (...) {
195 return nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
196 }
197
198 res |= cs_itf->send_bytes(pCommandPack->bytes, pCommandPack->length);
199
200 if (pCommandPack->recvLen > 0) {
201 char *result = new char[pCommandPack->recvLen]();
202 res |= cs_itf->recv_bytes(pCommandPack->recvLen, result);
203 if (checkFeedback) CheckFeedback(result);
204 res |= EnableParam(cname, result);
205 delete[] result;
206 }
207 DeleteCommandPack(pCommandPack);
208 return res;
209}
210
211
218CommandPack *JsonWrapper::FmtRegister(const Json::Value &reg, const Json::Value &value) {
219 if (value.isString() && StringStartWith(value.asString(), "0x")) {
220 // 对于 "0x5F5F5F5F"
221 auto _value = (uint32_t) std::stoll(value.asString(), nullptr, 16);
222 return FmtRegister(reg, _value);
223 } else if (value.isString() && StringStartWith(value.asString(), "0b")) {
224 // 对于 "0b10101011"
225 auto _value = std::stoll(value.asString().substr(2), nullptr, 2);
226 return FmtRegister(reg, _value);
227 } else if (value.isString() && reg[0].asString() == ICD_File) {
228 // 对于 file文件类型
229 return FmtFile(value.asString());
230 } else if (value.isString() && reg[0].asString() == ICD_FileLength) {
231 // 对于文件大小类型
232 return FmtFile(value.asString(), true);
233 } else if (value.isNumeric()) {
234 // 对于全体数字
235 std::string value_type = reg[0].asString();
236 if (value_type == ICD_Float) {
237 auto _value = value.asFloat();
238 return FmtRegister(reg, _value);
239 } else if (value_type == ICD_Double) {
240 auto _value = value.asDouble();
241 return FmtRegister(reg, _value);
242 } else if (value_type == ICD_Uint8) {
243 auto _value = (uint8_t) value.asUInt();
244 return FmtRegister(reg, _value);
245 } else if (value_type == ICD_Int8) {
246 auto _value = (int8_t) value.asInt();
247 return FmtRegister(reg, _value);
248 } else if (value_type == ICD_Uint16) {
249 auto _value = (uint16_t) value.asUInt();
250 return FmtRegister(reg, _value);
251 } else if (value_type == ICD_Int16) {
252 auto _value = (int16_t) value.asInt();
253 return FmtRegister(reg, _value);
254 } else if (value_type == ICD_Uint32) {
255 auto _value = (uint32_t) value.asUInt();
256 return FmtRegister(reg, _value);
257 } else if (value_type == ICD_Int32) {
258 auto _value = (int32_t) value.asInt();
259 return FmtRegister(reg, _value);
260 } else if (value_type == ICD_FileLength) {
261 auto _value = (uint32_t) value.asInt();
262 return FmtRegister(reg, _value);
263 } else {
264 std::cout << "Unrecognized value type " << value.toStyledString() << std::endl;
265 throw "Unrecognized register value type";
266 }
267 } else {
268 std::cout << "Unrecognized value type " << value.toStyledString() << std::endl;
269 throw "Unrecognized register value type";
270 }
271}
272
279CommandPack *JsonWrapper::FmtRegister(const Json::Value &reg, const std::string &value) {
280 if (StringStartWith(value, "0x")) {
281 unsigned int _value = std::stoll(value, nullptr, 16);
282 return FmtRegister(reg, _value);
283 } else if (StringStartWith(value, "0b")) {
284 unsigned short _value = std::stoll(value, nullptr, 2);
285 return FmtRegister(reg, _value);
286 } else {
287 std::cout << "Unrecognized value type " << value << std::endl;
288 throw "Unrecognized register value type";
289 }
290}
291
292
299CommandPack *JsonWrapper::FmtFile(const std::string &file_path, bool need_size) {
300 CommandPack *fileData = nullptr;
301 std::ifstream _in(file_path, std::ios::in | std::ios::binary | std::ios::ate);
302 if (_in.is_open()) {
303 fileData = new CommandPack;
304 if (need_size) {
305 fileData->length = TypeSizeMap[ICD_Uint32];
306 fileData->bytes = new char[fileData->length + 1]();
307 uint32_t fileLength = (uint32_t) _in.tellg();
308 memcpy(fileData->bytes, &fileLength, fileData->length);
309 } else {
310 fileData->length = _in.tellg();
311 fileData->bytes = new char[fileData->length + 1]();
312 _in.seekg(0, std::ios::beg);
313 _in.read(fileData->bytes, fileData->length);
314 }
315 } else {
316 std::cout << "The file path " << file_path << " is wrong" << std::endl;
317 }
318 return fileData;
319}
320
321
328CommandPack *ICDRegMw::FmtCommand(const std::string &cmd_name, const std::string &file_path) {
329 Json::Value command;
330 std::vector<CommandPack *> registerList;
331 CommandPack *regTemp;
332 nsuSize_t recv_len = 0;
333 auto resCommandPack = new CommandPack;
334 uint32_t commandLength = 0;
335
336 if (!icd->icdCommands->isMember(cmd_name)) {
337 std::cout << "Not find command: " << cmd_name << std::endl;
338 throw std::runtime_error("The instruction name does not exist in ICD");
339 }
340
341 // 生成要发送的指令
342 command = (*(icd->icdCommands))[cmd_name]["send"];
343 for (auto &reg: command) {
344 if (reg.isString() && reg.asString() == ICD_ParamFlag_File) {
345 regTemp = icd->FmtFile(file_path);
346 } else if (reg.isString() && reg.asString() == ICD_ParamFlag_FileLength) {
347 regTemp = icd->FmtFile(file_path, true);
348 } else if (reg.isString() && icd->icdParams->isMember(reg.asString())) {
349 reg = (*icd->icdParams)[reg.asString()];
350 regTemp = icd->FmtRegister(reg, reg[1]);
351 } else if (reg.isArray()) {
352 regTemp = icd->FmtRegister(reg, reg[1]);
353 } else {
354 throw std::runtime_error("Sorry, send to registers is unsupported");
355 }
356 assert(regTemp->bytes != nullptr);
357 registerList.emplace_back(regTemp);
358 commandLength += regTemp->length;
359 }
360
361 // 计算要接收的指令长度
362 command = (*(icd->icdCommands))[cmd_name]["recv"];
363 for (auto &reg: command) {
364 if (reg.isString() && reg.asString() == ICD_ParamFlag_File) {
365 throw std::runtime_error("Sorry, recv from registers is unsupported");
366 } else if (reg.isString() && reg.asString() == ICD_ParamFlag_FileLength) {
367 throw std::runtime_error("Sorry, recv from registers is unsupported");
368 } else if (reg.isString() && icd->icdParams->isMember(reg.asString())) {
369 reg = (*(icd->icdParams))[reg.asString()];
370 recv_len += TypeSizeMap[reg[0].asString()];
371 } else if (reg.isArray()) {
372 recv_len += TypeSizeMap[reg[0].asString()];
373 } else {
374 throw std::runtime_error("Sorry, recv from registers is unsupported");
375 }
376 }
377
378 // 将获取到的二进制寄存器列表拼接为一个CommandPack
379 resCommandPack->bytes = new char[commandLength + 1];
380 resCommandPack->length = commandLength;
381 resCommandPack->recvLen = recv_len;
382 char *flag = resCommandPack->bytes;
383 for (auto &reg: registerList) {
384 memcpy(flag, reg->bytes, reg->length);
385 flag += reg->length;
387 }
388 // 修改指令长度
389 memcpy(resCommandPack->bytes + 12, &commandLength, 4);
390
391 return resCommandPack;
392}
393
395 Json::Value command;
396 auto res = nsukitStatus_t::NSUKIT_STATUS_SUCCESS;
397
398 if (!icd->icdCommands->isMember(cname)) {
399 res |= nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
400 throw std::runtime_error("指令名称在icd中不存在");
401 }
402
403 // 遍历recv中的所有参数
404 command = (*(icd->icdCommands))[cname]["recv"];
405 auto ptr = (nsuCharBuf_p )buf;
406 for (auto &reg: command) {
407 if (reg.isString() && reg.asString() == ICD_ParamFlag_File) {
408 res |= nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
409 } else if (reg.isString() && reg.asString() == ICD_ParamFlag_FileLength) {
410 res |= nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
411 } else if (reg.isString() && icd->icdParams->isMember(reg.asString())) {
412 auto _pack = (*(icd->icdParams))[reg.asString()];
413 auto _width = TypeSizeMap[_pack[0].asString()];
414 res |= set_param_by_tname(reg.asString(), _pack[0].asString(), ptr);
415 ptr += _width;
416 } else if (reg.isArray()) {
417 ptr += TypeSizeMap[reg[0].asString()];
418 } else {
419 res |= nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
420 }
421 }
422 return res;
423}
424
426 if (type == ICD_Float) {
427 auto _value = *(float *)buf;
428 return icd->set_icd_param(pname, _value);
429 } else if (type == ICD_Double) {
430 auto _value = *(double *)buf;
431 return icd->set_icd_param(pname, _value);
432 } else if (type == ICD_Uint8) {
433 auto _value = *(uint8_t *)buf;
434 return icd->set_icd_param(pname, _value);
435 } else if (type == ICD_Int8) {
436 auto _value = *(int8_t *)buf;
437 return icd->set_icd_param(pname, _value);
438 } else if (type == ICD_Uint16) {
439 auto _value = *(uint16_t *)buf;
440 return icd->set_icd_param(pname, _value);
441 } else if (type == ICD_Int16) {
442 auto _value = *(int16_t *)buf;
443 return icd->set_icd_param(pname, _value);
444 } else if (type == ICD_Uint32) {
445 auto _value = *(uint32_t *)buf;
446 return icd->set_icd_param(pname, _value);
447 } else if (type == ICD_Int32) {
448 auto _value = *(int32_t *) buf;
449 return icd->set_icd_param(pname, _value);
450 }
451 return nsukitStatus_t::NSUKIT_STATUS_INVALID_VALUE;
452}
453
454
455uint32_t nsukit::GetFileSize(const std::string &file_path) {
456 uint32_t size = 0;
457 std::ifstream _in(file_path, std::ios::in | std::ios::binary | std::ios::ate);
458 if (_in.is_open()) {
459 size = _in.tellg();
460 }
461 return size;
462}
463
470bool nsukit::StringEndWith(const std::string& str, const std::string& tail) {
471 return str.compare(str.size() - tail.size(), tail.size(), tail) == 0;
472}
473
480bool nsukit::StringStartWith(const std::string& str, const std::string& head) {
481 return str.compare(0, head.size(), head) == 0;
482}
483
489 delete[] pack->bytes;
490 delete pack;
491}
virtual nsukitStatus_t recv_bytes(nsuSize_t size, nsuCharBuf_p buf)
Definition: base_itf.h:90
virtual nsukitStatus_t send_bytes(nsuBytes_t &bytes)
Definition: base_itf.h:85
uint8_t get_param(nsuCSParam_t &param_name, uint8_t _default=0) override
Definition: icd_parser.cpp:78
CommandPack * FmtCommand(const std::string &cmd_name, const std::string &file_path="")
Definition: icd_parser.cpp:328
ICDRegMw(I_BaseCmdUItf *itf)
Definition: icd_parser.cpp:53
I_BaseCmdUItf * cs_itf
Definition: icd_parser.h:67
nsukitStatus_t execute(nsuCSName_t cname) override
Definition: icd_parser.cpp:189
nsukitStatus_t set_param(nsuCSParam_t &param_name, const uint8_t &value) override
Definition: icd_parser.cpp:152
nsukitStatus_t set_param_by_tname(nsuCSParam_t pname, std::string type, nsuCharBuf_p buf)
Definition: icd_parser.cpp:425
nsukitStatus_t config(nsuInitParam_t *param) override
Definition: icd_parser.cpp:64
std::string icdPath
Definition: icd_parser.h:68
JsonWrapper * icd
Definition: icd_parser.h:69
nsukitStatus_t EnableParam(nsuCSName_t cname, nsuCharBuf_p buf)
Definition: icd_parser.cpp:394
CommandPack * FmtFile(const std::string &file_path, bool need_size=false)
Definition: icd_parser.cpp:299
Json::Reader ICDReader
Json::Value * icdParams
Json::Value * icdCommands
CommandPack * FmtRegister(const Json::Value &reg, const T &value)
nsukitStatus_t set_icd_param(nsuCSParam_t &param_name, const T &value)
T get_icd_param(nsuCSParam_t &param_name)
bool InitICD(std::string_view path)
Definition: icd_parser.cpp:29
static void * CheckFeedback(char *data)
Definition: icd_parser.cpp:13
#define ICD_Double
Definition: icd_parser.h:22
#define ICD_Int32
Definition: icd_parser.h:20
#define ICD_Float
Definition: icd_parser.h:21
#define ICD_Int8
Definition: icd_parser.h:16
#define ICD_Uint32
Definition: icd_parser.h:19
#define ICD_FileLength
Definition: icd_parser.h:24
#define ICD_ParamFlag_File
Definition: icd_parser.h:25
#define ICD_ParamFlag_FileLength
Definition: icd_parser.h:26
#define ICD_Int16
Definition: icd_parser.h:18
#define ICD_Uint16
Definition: icd_parser.h:17
#define ICD_File
Definition: icd_parser.h:23
#define ICD_Uint8
Definition: icd_parser.h:15
static std::map< std::string, int > TypeSizeMap
Definition: icd_parser.h:29
NSU_DLLEXPORT void DeleteCommandPack(CommandPack *pack)
Definition: icd_parser.cpp:488
NSU_DLLEXPORT bool StringEndWith(const std::string &str, const std::string &tail)
Definition: icd_parser.cpp:470
NSU_DLLEXPORT uint32_t GetFileSize(const std::string &file_path)
Definition: icd_parser.cpp:455
NSU_DLLEXPORT bool StringStartWith(const std::string &str, const std::string &head)
Definition: icd_parser.cpp:480
std::string icd_path
Definition: type.h:145
bool check_cs_recv
Definition: type.h:146
nsuSize_t recvLen
Definition: icd_parser.h:51
nsuSize_t length
Definition: icd_parser.h:50
nsukitStatus_t
Definition: type.h:53
DLLEXTERN typedef size_t nsuSize_t
Definition: type.h:87
DLLEXTERN typedef std::string nsuCSParam_t
Definition: type.h:91
DLLEXTERN typedef char * nsuCharBuf_p
Definition: type.h:82
DLLEXTERN typedef std::string nsuCSName_t
Definition: type.h:92