iCub-main
Loading...
Searching...
No Matches
diagnosticInfoParsers.cpp
Go to the documentation of this file.
1/*
2 * Copyright (C) Istituto Italiano di Tecnologia (IIT)
3 * All rights reserved.
4 *
5 * This software may be modified and distributed under the terms of the
6 * BSD-3-Clause license. See the accompanying LICENSE file for details.
7 */
8
11#include "EoBoards.h"
12#include "embot_core_binary.h"
13#include "serviceParser.h"
14#include <yarp/os/Time.h>
15#include <algorithm>
16
17
18using namespace Diagnostic::LowLevel;
19
20
21
22
23/**************************************************************************************************************************/
24/****************************************** DefaultParser ***************************************************/
25/**************************************************************************************************************************/
26DefaultParser::DefaultParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):m_dnginfo(dnginfo), m_entityNameProvider(entityNameProvider){;}
27
29{
30 char str[512] = {0};
31 uint8_t *p64 = (uint8_t*)&(m_dnginfo.param64);
32 snprintf(str, sizeof(str), " src %s, adr %d,(code 0x%.8x, par16 0x%.4x par64 0x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x) -> %s %s %s",
37 p64[7], p64[6], p64[5], p64[4], p64[3], p64[2], p64[1], p64[0],
38 eoerror_code2string(m_dnginfo.errorCode),
39 eoerror_code2rulesstring(m_dnginfo.errorCode),
41 );
44
45}
46
48{
49 char str[512] = {0};
50 snprintf(str, sizeof(str), "%s", m_dnginfo.baseMessage.c_str());
52}
53
54/**************************************************************************************************************************/
55/****************************************** ConfigParser ***************************************************/
56/**************************************************************************************************************************/
57
58ConfigParser::ConfigParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
59
61{
62 char str[512] = {0};
63 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
64
66
67 switch(value)
68 {
69
70 case eoerror_value_CFG_candiscovery_started:
71 {
72 uint16_t maskcan2 = m_dnginfo.param16;
73 eObrd_type_t brdnum = static_cast<eObrd_type_t>((m_dnginfo.param64 & 0x0000ff0000000000) >> 40);
74 const char *canboardname = eoboards_type2string(brdnum);
75 uint16_t maskcan1 = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
76 eObrd_protocolversion_t prot = {0};
77 eObrd_firmwareversion_t appl = {0};
78 uint64_t reqpr = (m_dnginfo.param64 & 0x000000ffff000000) >> 24;
79 uint64_t reqfw = (m_dnginfo.param64 & 0x0000000000ffffff);
80 uint8_t num =0;
81 prot.major = reqpr >> 8;
82 prot.minor = reqpr & 0xff;
83 appl.major = (reqfw >> 16) & 0xff;
84 appl.minor = (reqfw >> 8) & 0xff;
85 appl.build = reqfw & 0xff;
86 num = eo_common_hlfword_bitsetcount(maskcan1)+eo_common_hlfword_bitsetcount(maskcan2);
87
88 snprintf(str, sizeof(str), " %s %d %s boards on (can1map, can2map) = (0x%.4x, 0x%.4x) with target can protocol ver %d.%d and application ver %d.%d.%d.",
89 m_dnginfo.baseMessage.c_str(),
90 num, canboardname,
91 maskcan1, maskcan2,
92 prot.major, prot.minor,
93 appl.major, appl.minor, appl.build
94 );
96 } break;
97
98 case eoerror_value_CFG_candiscovery_ok:
99 {
100 uint8_t num = m_dnginfo.param16 & 0x00ff;
101 eObool_t fakesearch = (0x0000 == (m_dnginfo.param16 & 0xf000)) ? (eobool_false) : (eobool_true);
102 uint64_t brdnum = (m_dnginfo.param64 & 0x0000ff0000000000) >> 40;
103 const char *canboardname = eoboards_type2string(static_cast<eObrd_type_t>(brdnum));
104 uint64_t searchtime = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
105 eObrd_protocolversion_t prot = {0};
106 eObrd_firmwareversion_t appl = {0};
107 uint64_t reqpr = (m_dnginfo.param64 & 0x000000ffff000000) >> 24;
108 uint64_t reqfw = (m_dnginfo.param64 & 0x0000000000ffffff);
109 char strOK[80] = "OK";
110
111 prot.major = reqpr >> 8;
112 prot.minor = reqpr & 0xff;
113 appl.major = (reqfw >> 16) & 0xff;
114 appl.minor = (reqfw >> 8) & 0xff;
115 appl.build = reqfw & 0xff;
116
117
118 if(eobool_true == fakesearch)
119 {
120 snprintf(strOK, sizeof(strOK), "OK but FAKE (without any control on CAN w/ get-fw-version<> message)");
121 }
122
123 snprintf(str, sizeof(str), "%s is %s for %d %s boards with target can protocol ver %d.%d and application ver %d.%d.%d. Search time was %d ms",
124 m_dnginfo.baseMessage.c_str(),
125 strOK,
126 num, canboardname,
127 prot.major, prot.minor,
128 appl.major, appl.minor, appl.build,
129 (int)searchtime
130 );
131 m_dnginfo.baseInfo.finalMessage.append(str);
132 } break;
133
134 case eoerror_value_CFG_candiscovery_detectedboard:
135 {
136 uint64_t brdnum = (m_dnginfo.param64 & 0x0000ff0000000000) >> 40;
137 const char *canboardname = eoboards_type2string(static_cast<eObrd_type_t>(brdnum));
138 uint64_t searchtime = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
139 eObrd_protocolversion_t prot = {0};
140 eObrd_firmwareversion_t appl = {0};
141 uint64_t reqpr = (m_dnginfo.param64 & 0x000000ffff000000) >> 24;
142 uint64_t reqfw = (m_dnginfo.param64 & 0x0000000000ffffff);
143 uint8_t address;
144 prot.major = reqpr >> 8;
145 prot.minor = reqpr & 0xff;
146 appl.major = (reqfw >> 16) & 0xff;
147 appl.minor = (reqfw >> 8) & 0xff;
148 appl.build = reqfw & 0xff;
149 address = m_dnginfo.param16 & 0x000f;
150
151
152 snprintf(str, sizeof(str), "%s %s board in %s addr %d with can protocol ver %d.%d and application ver %d.%d.%d Search time was %d ms",
153 m_dnginfo.baseMessage.c_str(),
154 canboardname,
155 m_dnginfo.baseInfo.sourceCANPortStr.c_str(), address,
156 prot.major, prot.minor,
157 appl.major, appl.minor, appl.build,
158 (int)searchtime
159 );
160 m_dnginfo.baseInfo.finalMessage.append(str);
161 } break;
162
163 case eoerror_value_CFG_candiscovery_boardsmissing:
164 {
165 uint8_t numofmissing = m_dnginfo.param16 & 0x00ff;
166 const char *canboardname = eoboards_type2string(static_cast<eObrd_type_t>((m_dnginfo.param16 >> 8)));
167 uint64_t searchtime = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
168 uint16_t maskofmissing = m_dnginfo.param64 & 0x000000000000ffff;
169
170 uint8_t n = 1;
171 uint8_t i = 0;
172
173 snprintf(str, sizeof(str), "%s %d missing %s boards for %d ms in %s:",
174 m_dnginfo.baseMessage.c_str(),
175 numofmissing,
176 canboardname,
177 (int)searchtime,
179 );
180 m_dnginfo.baseInfo.finalMessage.append(str);
181 for(i=1; i<15; i++)
182 {
183 if(eobool_true == eo_common_hlfword_bitcheck(maskofmissing, i))
184 {
185 snprintf(str, sizeof(str), "%d of %d: missing %s BOARD %s:%s:%d",
186 n, numofmissing, canboardname,
188 );
189 m_dnginfo.baseInfo.finalMessage.append(str);
190 n++;
191
192 }
193 }
194
195 } break;
196
197 case eoerror_value_CFG_candiscovery_boardsinvalid:
198 {
199 uint8_t numofinvalid = m_dnginfo.param16 & 0x00ff;
200 const char *canboardname = eoboards_type2string(static_cast<eObrd_type_t>(m_dnginfo.param16 >> 8));
201 uint64_t invalidmask = m_dnginfo.param64;
202 uint8_t n = 1;
203 uint8_t i = 0;
204 const char *empty = "";
205 const char *wrongtype = "WRONG BOARD TYPE";
206 const char *wrongprot = "WRONG PROTOCOL VERSION";
207 const char *wrongappl = "WRONG APPLICATION VERSION";
208
209 snprintf(str, sizeof(str), "%s %d invalid %s boards in %s:\n",
210 m_dnginfo.baseMessage.c_str(),
211 numofinvalid,
212 canboardname,
214 );
215 m_dnginfo.baseInfo.finalMessage.append(str);
216
217 for(int i=1; i<15; i++)
218 {
219 uint64_t val = (invalidmask >> (4*i)) & 0x0f;
220 if(0 != val)
221 {
222 snprintf(str, sizeof(str), "\t %d of %d: wrong %s because it has: %s%s%s \n",
223 n, numofinvalid, canboardname,
224 ((val & 0x1) == 0x1) ? (wrongtype) : (empty),
225 ((val & 0x2) == 0x2) ? (wrongappl) : (empty),
226 ((val & 0x4) == 0x4) ? (wrongprot) : (empty)
227 );
228
229 m_dnginfo.baseInfo.finalMessage.append(str);
230 n++;
231
232 }
233 }
234
235 } break;
236
237 case eoerror_value_CFG_skin_ok:
238 {
239 uint16_t maskcan1 = (m_dnginfo.param64 & 0x0000ffff00000000) >> 32;
240 uint16_t maskcan2 = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
241 eObrd_protocolversion_t prot = {0};
242 eObrd_firmwareversion_t appl = {0};
243 uint64_t reqpr = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
244 uint64_t reqfw = (m_dnginfo.param64 & 0x000000000000ffff);
245 prot.major = reqpr >> 8;
246 prot.minor = reqpr & 0xff;
247 appl.major = (reqfw >> 8) & 0xff;
248 appl.minor = reqfw & 0xff;
249 uint16_t numOfpatches = m_dnginfo.param16;
250
251 snprintf(str, sizeof(str), "%s on %d skin patches for boards on (can1map, can2map) = (0x%.4x, 0x%.4x) with target can protocol ver %d.%d and application ver %d.%d",
252 m_dnginfo.baseMessage.c_str(),
253 numOfpatches,
254 maskcan1, maskcan2,
255 prot.major, prot.minor,
256 appl.major, appl.minor
257 );
258 m_dnginfo.baseInfo.finalMessage.append(str);
259 } break;
260
261 case eoerror_value_CFG_skin_failed_toomanyboards:
262 case eoerror_value_CFG_inertials3_failed_toomanyboards:
263 case eoerror_value_CFG_temperatures_failed_toomanyboards:
264 {
265 uint8_t numOfReqBoards = (m_dnginfo.param16 & 0xff00) >> 8;
266 uint8_t numOfMaxBoards = m_dnginfo.param16 & 0x00ff;
267
268 uint16_t maskcan1 = (m_dnginfo.param64 & 0x000000000000ffff);
269 uint16_t maskcan2 = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
270
271 snprintf(str, sizeof(str), " %s for %d boards. Limit of max number of boards is %d. Boards are on (can1map, can2map) = (0x%.4x, 0x%.4x)",
272 m_dnginfo.baseMessage.c_str(),
273 numOfReqBoards, numOfMaxBoards,
274 maskcan1, maskcan2
275 );
276 m_dnginfo.baseInfo.finalMessage.append(str);
277 } break;
278
279 case eoerror_value_CFG_skin_failed_candiscovery:
280 case eoerror_value_CFG_inertials3_failed_candiscovery:
281 case eoerror_value_CFG_temperatures_failed_candiscovery:
282 {
283 uint16_t incompMaskcan2 = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
284 uint16_t incompMaskcan1 = (m_dnginfo.param64 & 0x0000ffff00000000) >> 32;
285 uint16_t missMaskcan2 = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
286 uint16_t missMaskcan1 = (m_dnginfo.param64 & 0x000000000000ffff);
287 uint16_t numOfPatches = m_dnginfo.param16;
288
289 if (eoerror_value_CFG_skin_failed_candiscovery == value)
290 {
291 snprintf(str, sizeof(str), "%s for %d skin patches. ", m_dnginfo.baseMessage.c_str(), numOfPatches);
292 m_dnginfo.baseInfo.finalMessage.append(str);
293 }
294 else
295 {
296 snprintf(str, sizeof(str), "%s. ", m_dnginfo.baseMessage.c_str());
297 m_dnginfo.baseInfo.finalMessage.append(str);
298 }
299
300 snprintf(str, sizeof(str), "Missing can boards on (can1map, can2map) = (0x%.4x, 0x%.4x) and found but incompatible can boards on (can1map, can2map) = (0x%.4x, 0x%.4x)",
301 missMaskcan1, missMaskcan2,
302 incompMaskcan1, incompMaskcan2
303 );
304
305 m_dnginfo.baseInfo.finalMessage.append(str);
306 } break;
307
308 case eoerror_value_CFG_strain_ok:
309 case eoerror_value_CFG_strain_failed_candiscovery:
310 {
311 eObrd_protocolversion_t prot = {0};
312 eObrd_firmwareversion_t appl = {0};
313 uint64_t reqpr = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
314 uint64_t reqfw = (m_dnginfo.param64 & 0x000000000000ffff);
315 prot.major = reqpr >> 8;
316 prot.minor = reqpr & 0xff;
317 appl.major = (reqfw >> 8) & 0xff;
318 appl.minor = reqfw & 0xff;
319 uint8_t strain = (m_dnginfo.param64 & 0x0000000f00000000) >> 20;
320 uint8_t address = m_dnginfo.param16 & 0x00ff;
321 uint8_t port = m_dnginfo.param16 >> 8;
322
323 snprintf(str, sizeof(str), "%s for board at addr:%d and port:%d with can protocol ver %d.%d and application ver %d.%d. Strain number is:%d",
324 m_dnginfo.baseMessage.c_str(),
325 address, port,
326 prot.major, prot.minor,
327 appl.major, appl.minor,
328 strain
329 );
330 m_dnginfo.baseInfo.finalMessage.append(str);
331 } break;
332
333 case eoerror_value_CFG_mais_ok:
334 case eoerror_value_CFG_mais_failed_candiscovery:
335 case eoerror_value_CFG_psc_ok:
336 case eoerror_value_CFG_psc_failed_candiscovery:
337 case eoerror_value_CFG_pos_ok:
338 case eoerror_value_CFG_pos_failed_candiscovery:
339 {
340 eObrd_protocolversion_t prot = {0};
341 eObrd_firmwareversion_t appl = {0};
342 uint64_t reqpr = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
343 uint64_t reqfw = (m_dnginfo.param64 & 0x000000000000ffff);
344 prot.major = reqpr >> 8;
345 prot.minor = reqpr & 0xff;
346 appl.major = (reqfw >> 8) & 0xff;
347 appl.minor = reqfw & 0xff;
348 uint8_t address = m_dnginfo.param16 & 0x00ff;
349 uint8_t port = m_dnginfo.param16 >> 8;
350
351 snprintf(str, sizeof(str), "%s on board at addr: %d and port:%d with can protocol ver %d.%d and application ver %d.%d.",
352 m_dnginfo.baseMessage.c_str(),
353 address,
354 port,
355 prot.major, prot.minor,
356 appl.major, appl.minor
357 );
358 m_dnginfo.baseInfo.finalMessage.append(str);
359 } break;
360
361 case eoerror_value_CFG_mais_failed_verify_because_active:
362 case eoerror_value_CFG_mc_foc_ok:
363 case eoerror_value_CFG_mc_foc_failed_candiscovery_of_foc:
364 case eoerror_value_CFG_mc_foc_failed_encoders_verify:
365 case eoerror_value_CFG_mc_mc4_ok:
366 case eoerror_value_CFG_mc_mc4_failed_candiscovery_of_mc4:
367 case eoerror_value_CFG_mc_mc4_failed_mais_verify:
368 case eoerror_value_CFG_mc_mc4plus_ok:
369 case eoerror_value_CFG_mc_mc4plus_failed_encoders_verify:
370 case eoerror_value_CFG_comm_cannotloadaregularrop:
371 case eoerror_value_CFG_mc_mc4plusmais_ok:
372 case eoerror_value_CFG_mc_mc4plusmais_failed_encoders_verify:
373 case eoerror_value_CFG_mc_mc4plusmais_failed_candiscovery_of_mais:
374 case eoerror_value_CFG_services_not_verified_yet:
375 case eoerror_value_CFG_mc_not_verified_yet:
376 case eoerror_value_CFG_strain_not_verified_yet:
377 case eoerror_value_CFG_mais_not_verified_yet:
378 case eoerror_value_CFG_skin_not_verified_yet:
379 case eoerror_value_CFG_inertials3_not_verified_yet:
380 case eoerror_value_CFG_encoders_not_verified_yet:
381 case eoerror_value_CFG_mc_using_onboard_config:
382 case eoerror_value_CFG_strain_using_onboard_config:
383 case eoerror_value_CFG_mais_using_onboard_config:
384 case eoerror_value_CFG_inertials3_using_onboard_config:
385 case eoerror_value_CFG_skin_using_onboard_config:
386 case eoerror_value_CFG_inertials3_ok:
387 case eoerror_value_CFG_temperatures_not_verified_yet:
388 case eoerror_value_CFG_temperatures_ok:
389 case eoerror_value_CFG_temperatures_using_onboard_config:
390 case eoerror_value_CFG_psc_failed_verify_because_active:
391 case eoerror_value_CFG_psc_not_verified_yet:
392 case eoerror_value_CFG_psc_using_onboard_config:
393 case eoerror_value_CFG_mc_mc2pluspsc_ok:
394 case eoerror_value_CFG_mc_mc2pluspsc_failed_encoders_verify:
395 case eoerror_value_CFG_mc_mc2pluspsc_failed_candiscovery_of_pscs:
396 case eoerror_value_CFG_inertials3_failed_notsupported:
397 case eoerror_value_CFG_temperatures_failed_notsupported:
398 case eoerror_value_CFG_mais_failed_notsupported:
399 case eoerror_value_CFG_strain_failed_notsupported:
400 case eoerror_value_CFG_skin_failed_notsupported:
401 case eoerror_value_CFG_psc_failed_notsupported:
402 case eoerror_value_CFG_mc_failed_notsupported:
403 case eoerror_value_CFG_encoders_failed_notsupported:
404 case eoerror_value_CFG_pos_not_verified_yet:
405 case eoerror_value_CFG_pos_using_onboard_config:
406 case eoerror_value_CFG_pos_failed_notsupported:
407 case eoerror_value_CFG_mc_mc4plusfaps_ok:
408 case eoerror_value_CFG_mc_mc4plusfaps_failed_encoders_verify:
409 case eoerror_value_CFG_mc_mc4plusfaps_failed_candiscovery:
410 case eoerror_value_CFG_mc_mc4pluspmc_ok:
411 case eoerror_value_CFG_mc_mc4pluspmc_failed_encoders_verify:
412 case eoerror_value_CFG_mc_mc4pluspmc_failed_candiscovery_of_pmc:
413 case eoerror_value_CFG_ft_ok:
414 case eoerror_value_CFG_ft_failed_candiscovery:
415 case eoerror_value_CFG_ft_not_verified_yet:
416 case eoerror_value_CFG_ft_using_onboard_config:
417 case eoerror_value_CFG_ft_failed_notsupported:
418 case eoerror_value_CFG_ft_failed_fullscales:
419 case eoerror_value_CFG_bat_ok:
420 case eoerror_value_CFG_bat_failed_candiscovery:
421 case eoerror_value_CFG_bat_not_verified_yet:
422 case eoerror_value_CFG_bat_using_onboard_config:
423 case eoerror_value_CFG_bat_failed_notsupported:
424 case eoerror_value_CFG_mc_advfoc_ok:
425 case eoerror_value_CFG_mc_advfoc_failed_candiscovery:
426 case eoerror_value_CFG_mc_advfoc_failed_encoders_verify:
427 case eoerror_value_CFG_mc_advfoc_failed_ICCdiscovery:
428 {
430 } break;
431
432 // p16&0xf000: number of joint; primary encs: failure mask in p16&0x000f and errorcodes in p64&0x0000ffff; secondary encs: failure mask in p16&0x00f0 and errorcodes in p64&0xffff0000"},
433 case eoerror_value_CFG_encoders_ok:
434 case eoerror_value_CFG_encoders_failed_verify:
435 {
436 uint8_t numOfJoints = (m_dnginfo.param16 & 0xf000) >> 12;
437 uint8_t failmaskenc1 = m_dnginfo.param16 & 0x000f;
438 int16_t errorenc1 = m_dnginfo.param64 & 0x0000ffff;
439 uint8_t failmaskenc2 = (m_dnginfo.param16 & 0x00f0) >> 4;
440 int16_t errorenc2 = (m_dnginfo.param64 & 0xffff0000) >> 16;
441
442 int16_t rawerror1 = errorenc1 & failmaskenc1;
443 int16_t rawerror2 = errorenc2 & failmaskenc2;
444 snprintf(str, sizeof(str), "%s", m_dnginfo.baseMessage.c_str());
445 m_dnginfo.baseInfo.finalMessage.append(str);
446
447 for(auto i=0; i < numOfJoints; i++)
448 {
449 // 1. check if joint ith has encoder with errors
450 auto primary_enc_with_error = (failmaskenc1 & (1<<i));
451 auto secondary_enc_with_error = (failmaskenc2 & (1<<i));
452 auto primary_error_code = 0;
453 auto secondary_error_code = 0;
454 if(primary_enc_with_error)
455 {
456 primary_error_code = ( (errorenc1 & (0xf <<i)) >> 4*i);
458 snprintf(str, sizeof(str), " joint %d (%s) has error on primary encoder (code=%d). ",
459 i, m_dnginfo.baseInfo.axisName.c_str(), primary_error_code); //TODO: get a string instead of a code
460 m_dnginfo.baseInfo.finalMessage.append(str);
461 }
462
463 if(secondary_enc_with_error)
464 {
465 secondary_error_code = ( (errorenc2 & (0xf <<i)) >> 4*i);
467 snprintf(str, sizeof(str), " joint %d (%s) has error on secodary encoder (code=%d)",
468 i, m_dnginfo.baseInfo.axisName.c_str(), secondary_error_code); //TODO: get a string instead of a code
469 m_dnginfo.baseInfo.finalMessage.append(str);
470 }
471
472
473 }
474
475 } break;
476
477 case eoerror_value_CFG_inertials3_failed_unsupportedsensor:
478 {
479 int16_t unsuppsens = m_dnginfo.param16;
480
481 snprintf(str, sizeof(str), "%s. Number of unsupported sens is %d",
482 m_dnginfo.baseMessage.c_str(),
483 unsuppsens
484 );
485 m_dnginfo.baseInfo.finalMessage.append(str);
486 } break;
487
488 case eoerror_value_CFG_inertials3_changed_requestedrate:
489 case eoerror_value_CFG_temperatures_changed_requestedrate:
490 case eoerror_value_CFG_psc_changed_requestedrate:
491 case eoerror_value_CFG_pos_changed_requestedrate:
492 {
493 uint8_t reqrate = (m_dnginfo.param16 & 0xff00) >> 8;
494 uint8_t assrate = m_dnginfo.param16 & 0x00ff;
495
496 snprintf(str, sizeof(str), "%s. Requested rate %u and Assigned rate %u",
497 m_dnginfo.baseMessage.c_str(),
498 reqrate,
499 assrate
500 );
501 m_dnginfo.baseInfo.finalMessage.append(str);
502 } break;
503
504 case eoerror_value_CFG_inertials3_failed_generic:
505 case eoerror_value_CFG_temperatures_failed_generic:
506 {
507 uint8_t numOfSens = m_dnginfo.param64;
508
509 snprintf(str, sizeof(str), "%s for %d sensors",
510 m_dnginfo.baseMessage.c_str(),
511 numOfSens
512 );
513 m_dnginfo.baseInfo.finalMessage.append(str);
514 } break;
515
516 case eoerror_value_CFG_mc_advfoc_ICCdiscovery_result:
517 {
518 const char *wrongtype = " WRONG ONBOARD BOARD TYPE";
519 const char *wrongappl = " WRONG APPLICATION VERSION";
520 const char *wrongprot = " WRONG PROTOCOL VERSION";
521 const char *empty = "";
522
523 uint8_t NoResponse = 0x10;
524 uint8_t WrongType = 0x01;
525 uint8_t WrongApp = 0x02;
526 uint8_t WrongProtocol = 0x04;
527 uint8_t WrongChannel = 0x08;
528
529 // Define bitmask and shift constants
530 constexpr uint64_t MASK_FW_BUILD = 0x00000000000000FF;
531 constexpr uint64_t MASK_FW_MINOR = 0x000000000000FF00;
532 constexpr uint64_t MASK_FW_MAJOR = 0x0000000000FF0000;
533 constexpr uint64_t MASK_PROTO_MINOR = 0x00000000FF000000;
534 constexpr uint64_t MASK_PROTO_MAJOR = 0x000000FF00000000;
535 constexpr uint64_t MASK_BOARD_TYPE = 0x0000FF0000000000;
536 constexpr uint64_t MASK_ADDRESS = 0x00FF000000000000;
537 constexpr uint64_t MASK_BUS = 0xFF00000000000000;
538
539 constexpr uint8_t SHIFT_FW_BUILD = 0;
540 constexpr uint8_t SHIFT_FW_MINOR = 8;
541 constexpr uint8_t SHIFT_FW_MAJOR = 16;
542 constexpr uint8_t SHIFT_PROTO_MINOR = 24;
543 constexpr uint8_t SHIFT_PROTO_MAJOR = 32;
544 constexpr uint8_t SHIFT_BOARD_TYPE = 40;
545 constexpr uint8_t SHIFT_ADDRESS = 48;
546 constexpr uint8_t SHIFT_BUS = 56;
547
548 // Extract values using masks and shifts
549 uint8_t fw_build = (m_dnginfo.param64 & MASK_FW_BUILD) >> SHIFT_FW_BUILD;
550 uint8_t fw_minor = (m_dnginfo.param64 & MASK_FW_MINOR) >> SHIFT_FW_MINOR;
551 uint8_t fw_major = (m_dnginfo.param64 & MASK_FW_MAJOR) >> SHIFT_FW_MAJOR;
552 uint8_t proto_minor = (m_dnginfo.param64 & MASK_PROTO_MINOR) >> SHIFT_PROTO_MINOR;
553 uint8_t proto_major = (m_dnginfo.param64 & MASK_PROTO_MAJOR) >> SHIFT_PROTO_MAJOR;
554 uint8_t board_type = (m_dnginfo.param64 & MASK_BOARD_TYPE) >> SHIFT_BOARD_TYPE;
555 uint8_t address = (m_dnginfo.param64 & MASK_ADDRESS) >> SHIFT_ADDRESS;
556 uint8_t bus = (m_dnginfo.param64 & MASK_BUS) >> SHIFT_BUS;
557
558 uint16_t invalidmask = m_dnginfo.param16;
559 eOlocation_t location = { bus, 0, address};
560 char location_str[64];
561 ServiceParser parser;
562 parser.convert(location, &location_str[0], sizeof(location_str));
563 eObrd_type_t general_brd_type = eoboards_cantype2type(static_cast<eObrd_cantype_t>(board_type));
564 std::string board_type_str = eoboards_type2string(general_brd_type);
565 uint16_t val = invalidmask & 0x0ff;
566 if(0 != val)
567 {
568 if((val & NoResponse) == NoResponse)
569 {
570 snprintf(str, sizeof(str), "%serror, the application on the other core does not respond.",
571 m_dnginfo.baseMessage.c_str()
572 );
573 m_dnginfo.baseInfo.finalMessage.append(str);
574 }
575 else if((val & WrongChannel) == WrongChannel)
576 {
577 snprintf(str, sizeof(str), "%serror, wrong port selected.",
578 m_dnginfo.baseMessage.c_str()
579 );
580 m_dnginfo.baseInfo.finalMessage.append(str);
581 }
582 else
583 {
584 snprintf(str, sizeof(str), "error on ICCdiscovery because it has:%s%s%s. ",
585 ((val & WrongType) == WrongType) ? (wrongtype) : (empty),
586 ((val & WrongApp) == WrongApp) ? (wrongappl) : (empty),
587 ((val & WrongProtocol) == WrongProtocol) ? (wrongprot) : (empty)
588 );
589 m_dnginfo.baseInfo.finalMessage.append(str);
590
591 snprintf(str, sizeof(str), "Found on other core: %s FW ver is %d.%d.%d. Protocol ver is %d.%d Port: %s. \n",
592 board_type_str.c_str(),
593 fw_major, fw_minor, fw_build, proto_major, proto_minor, location_str
594 );
595 m_dnginfo.baseInfo.finalMessage.append(str);
596 }
597 }
598 else
599 {
600 snprintf(str, sizeof(str), "%s ICCdiscovery successful. Found on other core: %s FW ver is %d.%d.%d. Protocol ver is %d.%d Port: %s. \n",
601 m_dnginfo.baseMessage.c_str(), board_type_str.c_str(),
602 fw_major, fw_minor, fw_build, proto_major, proto_minor, location_str
603 );
604
605 m_dnginfo.baseInfo.finalMessage.append(str);
606 }
607
608 } break;
609
610 case EOERROR_VALUE_DUMMY:
611 {
612 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_Config error value.");
613
614
615 } break;
616
617 default:
618 {
620
621 }
622
623 }//end switch
624
625
626
627}
628
629
630
631
632/**************************************************************************************************************************/
633/****************************************** MotionControlParser ***************************************************/
634/**************************************************************************************************************************/
635
636// private class functions
637std::string MotionControlParser::motorStatusBitsToString(eOmc_motorFaultState_t motorstatus)
638{
639 // dimesion of the array is hard-code but it must be aligned w/ the union typedef eOmc_motorFaultState_t
640 static const std::array<std::string_view, eOmc_motorFaultState_numberof> s_motor_fault_status =
641 {
642 //B0 L
643 "ExternalFaultAsserted",
644 "UnderVoltageFailure",
645 "OverVoltageFailure",
646 "OverCurrentFailure",
647 //B0 H
648 "DHESInvalidValue",
649 "AS5045CSumError",
650 "DHESInvalidSequence",
651 "CANInvalidProtocol",
652 //B1 L
653 "CAN_BufferOverRun",
654 "SetpointExpired",
655 "CAN_TXIsPasv",
656 "CAN_RXIsPasv",
657 //B1 H
658 "CAN_IsWarnTX",
659 "CAN_IsWarnRX",
660 "OverHeatingFailure",
661 "",
662 //B2 L
663 "ADCCalFailure",
664 "I2TFailure",
665 "EMUROMFault",
666 "EMUROMCRCFault",
667 //B2 H
668 "EncoderFault",
669 "FirmwareSPITimingError",
670 "AS5045CalcError",
671 "FirmwarePWMFatalError",
672 //B3 L
673 "CAN_TXWasPasv",
674 "CAN_RXWasPasv",
675 "CAN_RTRFlagActive",
676 "CAN_WasWarn",
677 //B3 H
678 "CAN_DLCError",
679 "SiliconRevisionFault",
680 "PositionLimitUpper",
681 "PositionLimitLower"
682 };
683
684 std::string statusstring = {};
685 statusstring.reserve(256);
686
687 for (uint8_t i = 0; i < eOmc_motorFaultState_numberof; i++) // important to loop over the eOmc_motorFaultState_numberof (dimension of the union typedef eOmc_motorFaultState_t)
688 {
689 // check bit by bit and add to ss the faulted bits
690 if(embot::core::binary::bit::check(motorstatus.bitmask, i))
691 {
692 statusstring.append(static_cast<const char*>(s_motor_fault_status.at(i).data()));
693 statusstring.append(" ");
694 }
695 }
696 return statusstring;
697}
698
699MotionControlParser::MotionControlParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
700
702{
703 char str[512] = {0};
704 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
706
707 switch(value)
708 {
709
710 case eoerror_value_MC_motor_external_fault:
711 case eoerror_value_MC_motor_qencoder_phase_disappeared:
712 {
713 snprintf(str, sizeof(str), " %s", m_dnginfo.baseMessage.c_str());
714 m_dnginfo.baseInfo.finalMessage.append(str);
715 } break;
716
717 case eoerror_value_MC_motor_overcurrent:
718 case eoerror_value_MC_motor_i2t_limit:
719 case eoerror_value_MC_motor_hallsensors:
720 case eoerror_value_MC_motor_can_invalid_prot:
721 case eoerror_value_MC_motor_can_generic:
722 case eoerror_value_MC_motor_can_no_answer:
723 case eoerror_value_MC_axis_torque_sens:
724 case eoerror_value_MC_joint_hard_limit:
725 {
726 uint8_t joint_num = m_dnginfo.param16 & 0x00ff;
728
729 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d))", m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num);
730 m_dnginfo.baseInfo.finalMessage.append(str);
731 } break;
732
733 case eoerror_value_MC_abs_enc_invalid:
734 case eoerror_value_MC_abs_enc_spikes:
735 case eoerror_value_MC_abs_enc_timeout:
736 {
737 std::string encoderTypeName = {};
738 uint8_t joint_num = m_dnginfo.param16 & 0x00ff;
739 uint8_t enc_port = (m_dnginfo.param16 & 0xff00)>>8;
741 m_entityNameProvider.getEncoderTypeName(joint_num, eomc_pos_atjoint, encoderTypeName);
742 std::transform(encoderTypeName.begin(), encoderTypeName.end(), encoderTypeName.begin(), ::toupper);
743
744 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d), encoderPort=%d, encoderType=%s)",
745 m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, enc_port, encoderTypeName.c_str()
746 );
747 m_dnginfo.baseInfo.finalMessage.append(str);
748 } break;
749
750
751 //case eoerror_value_MC_motor_qencoder_dirty:
752 case eoerror_value_MC_motor_qencoder_phase: //TBD: check encoder raw value
753 {
754 uint16_t joint_num = m_dnginfo.param16;
755 uint16_t enc_raw_value = m_dnginfo.param64 & 0xffff;
757
758 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d), Raw_quad_encoder_value=%d)",
759 m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, enc_raw_value
760 );
761 m_dnginfo.baseInfo.finalMessage.append(str);
762 } break;
763
764 case eoerror_value_MC_motor_qencoder_dirty:
765 {
766 uint16_t joint_num = m_dnginfo.param16;
767 uint16_t dirty_error = m_dnginfo.param64 & 0xffff;
768 uint16_t index_error = (m_dnginfo.param64 & 0xffff0000)>>16;
769 uint16_t phase_error = (m_dnginfo.param64 & 0xffff00000000)>>32;
771
772 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d), index=%d, dirty=%d, phase=%d)",
773 m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, index_error, dirty_error, phase_error
774 );
775 m_dnginfo.baseInfo.finalMessage.append(str);
776 } break;
777
778 case eoerror_value_MC_generic_error: //TBD Check print
779 {
780 eOmc_motorFaultState_t motor_status;
781 uint16_t joint_num = m_dnginfo.param16;
782 motor_status.bitmask = m_dnginfo.param64 & 0xffffffff;
784 std::string motorStatusString = motorStatusBitsToString(motor_status);
785 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d) (Errors:%s)",
786 m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, motorStatusString.c_str()
787 );
788 m_dnginfo.baseInfo.finalMessage.append(str);
789 } break;
790
791 case eoerror_value_MC_motor_wrong_state: //TBD: check states
792 {
793 uint16_t joint_num = m_dnginfo.param16;
794 uint16_t req_state = (m_dnginfo.param64 & 0xf0)>>4;
795 uint16_t cur_state = m_dnginfo.param64 & 0x0f;
796
798
799
800 snprintf(str, sizeof(str), " %s Joint=%s (NIB=%d). The requested state is %d, but the current is %d)",
801 m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, req_state, cur_state
802 );
803 m_dnginfo.baseInfo.finalMessage.append(str);
804 } break;
805
806 case eoerror_value_MC_motor_overheating:
807 {
808 uint16_t joint_num = m_dnginfo.param16;
809 int16_t temp_raw_value = m_dnginfo.param64 & 0xffff;
810
812
813 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d), Raw_temperature_value=%d)",
814 m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, temp_raw_value
815 );
816 m_dnginfo.baseInfo.finalMessage.append(str);
817 } break;
818
819 case eoerror_value_MC_ref_setpoint_timeout:
820 {
821 uint16_t joint_num = m_dnginfo.param16;
822 int16_t timeout_type = m_dnginfo.param64 & 0xff;
823
824 char* timeout_type_str = 0;
825
826 switch(timeout_type)
827 {
828 case eoerror_value_MC_ref_timeout_torque: timeout_type_str = "TORQUE"; break;
829 case eoerror_value_MC_ref_timeout_current: timeout_type_str = "CURRENT"; break;
830 case eoerror_value_MC_ref_timeout_pwm: timeout_type_str = "PWM"; break;
831 default: timeout_type_str = "UNKNOWN"; break;
832 }
833
835
836 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d)). The board isn't receiving %s reference setpoint commands and has been faulted to prevent damage.",
837 m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, timeout_type_str);
838 m_dnginfo.baseInfo.finalMessage.append(str);
839 } break;
840
841 case eoerror_value_MC_motor_tdb_not_reading:
842 {
843 uint16_t joint_num = m_dnginfo.param16;
844
846
847 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d))",
848 m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num);
849 m_dnginfo.baseInfo.finalMessage.append(str);
850 } break;
851
852 case EOERROR_VALUE_DUMMY:
853 {
854 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_MotionControl error value.");
855
856
857 } break;
858
859 default:
860 {
862
863 }
864
865 }//end switch
866
867
868
869}
870
871
872
873
874/**************************************************************************************************************************/
875/****************************************** SkinParser ***************************************************/
876/**************************************************************************************************************************/
877
878
879
880SkinParser::SkinParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
881
883{
884 char str[512] = {0};
885 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
887
888 switch (value)
889 {
890 case eoerror_value_SK_unspecified:
891 case eoerror_value_SK_obsoletecommand:
892 {
894 } break;
895
896 case eoerror_value_SK_arrayofcandataoverflow:
897 {
898 uint8_t frame_id = m_dnginfo.param16 & 0x00ff;
899 uint8_t frame_size = (m_dnginfo.param16 & 0xf000) >> 12;
900 uint64_t frame_data = m_dnginfo.param64;
901
902 snprintf(str, sizeof(str), " %s. Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
903 m_dnginfo.baseMessage.c_str(), frame_id, frame_size, frame_data
904 );
905 m_dnginfo.baseInfo.finalMessage.append(str);
906 } break;
907
908 case eoerror_value_SK_onoroff:
909 {
910 std::string emsboardstate = "unknown";
911 switch (m_dnginfo.param16)
912 {
913 case 0: emsboardstate = "OFF"; break;
914 case 1: emsboardstate = "ON"; break;
915 };
916
917 snprintf(str, sizeof(str), " %s %s", m_dnginfo.baseMessage.c_str(), emsboardstate.c_str());
918 m_dnginfo.baseInfo.finalMessage.append(str);
919 } break;
920
921 case eoerror_value_SK_unexpecteddata:
922 {
923 std::string emsboardstate = "unknown";
924 switch (m_dnginfo.param16)
925 {
926 case 0: emsboardstate = "CFG"; break;
927 case 1: emsboardstate = "RUN"; break;
928 }
929
930 snprintf(str, sizeof(str), " %s %s", m_dnginfo.baseMessage.c_str(), emsboardstate.c_str());
931 m_dnginfo.baseInfo.finalMessage.append(str);
932 } break;
933
934 case EOERROR_VALUE_DUMMY:
935 {
936 m_dnginfo.baseInfo.finalMessage.append(": unrecognized eoerror_category_Skin error value");
937 } break;
938
939 default:
940 {
942
943 } break;
944 }
945}
946
947/**************************************************************************************************************************/
948/****************************************** HwErrorParser ***************************************************/
949/**************************************************************************************************************************/
950
951
952
953HwErrorParser::HwErrorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
954
956{
957 char str[512] = {0};
958 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
960
961 switch(value)
962 {
963
964 case eoerror_value_HW_strain_saturation:
965 {
966 uint16_t channel = m_dnginfo.param16;
967 uint32_t lower_saturation_counts = m_dnginfo.param64 & 0xffffffff;
968 uint32_t upper_saturation_counts = (m_dnginfo.param64 & 0xffffffff00000000)>>32;
969 snprintf(str, sizeof(str), " %s %d is the channel involved. In the last second, the lower saturation counts is %d and the upper one is %d",
970 m_dnginfo.baseMessage.c_str(),
971 channel,
972 lower_saturation_counts,
973 upper_saturation_counts);
974 m_dnginfo.baseInfo.finalMessage.append(str);
975 } break;
976
977 case eoerror_value_HW_encoder_invalid_value:
978 case eoerror_value_HW_encoder_close_to_limits:
979 case eoerror_value_HW_encoder_crc:
980 case eoerror_value_HW_encoder_not_connected:
981 {
982 uint8_t joint_num = m_dnginfo.param16 & 0x00ff;
983 int16_t number_of_errors = m_dnginfo.param64 & 0x000000000000ffff;
985
986 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d) Number of error in 10 seconds is: %d)",
987 m_dnginfo.baseMessage.c_str(),
988 m_dnginfo.baseInfo.axisName.c_str(),
989 joint_num,
990 number_of_errors);
991 m_dnginfo.baseInfo.finalMessage.append(str);
992 } break;
993
994 case eoerror_value_HW_amo_encoder_status0:
995 {
996 uint8_t joint_num = m_dnginfo.param16 & 0x00ff;
997 uint32_t nonius_track_errors = (m_dnginfo.param64 & 0xffffffff00000000) >> 32;
998 uint32_t master_track_errors = m_dnginfo.param64 & 0x00000000ffffffff;
999 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d) Number of poor-level or clipping errors in 10 seconds for nonius track is: %d and for master track is: %d)",
1000 m_dnginfo.baseMessage.c_str(),
1001 m_dnginfo.baseInfo.axisName.c_str(),
1002 joint_num,
1003 nonius_track_errors,
1004 master_track_errors);
1005 m_dnginfo.baseInfo.finalMessage.append(str);
1006 } break;
1007
1008 case eoerror_value_HW_amo_encoder_status1:
1009 {
1010 uint8_t joint_num = m_dnginfo.param16 & 0x00ff;
1011 uint16_t internal_crc_errors = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
1012 uint16_t i2c_comm_errors = (m_dnginfo.param64 & 0x0000ffff00000000) >> 32;
1013 uint16_t nonius_period_consistency_errors = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
1014 uint16_t eccessive_input_signal_frequency_errors = (m_dnginfo.param64 & 0x000000000000ffff);
1015 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d) Number of error in 10 seconds as internal crc errors: %d, i2c communication errors: %d, nonius track period consistency errors: %d, eccessive input signal frequency errors: %d)",
1016 m_dnginfo.baseMessage.c_str(),
1017 m_dnginfo.baseInfo.axisName.c_str(),
1018 joint_num,
1019 internal_crc_errors,
1020 i2c_comm_errors,
1021 nonius_period_consistency_errors,
1022 eccessive_input_signal_frequency_errors);
1023 m_dnginfo.baseInfo.finalMessage.append(str);
1024 } break;
1025
1026 case EOERROR_VALUE_DUMMY:
1027 {
1028 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1029
1030
1031 } break;
1032
1033 default:
1034 {
1036
1037 }
1038
1039 }//end switch
1040
1041
1042
1043}
1044
1045
1046
1047/**************************************************************************************************************************/
1048/****************************************** SysErrorParser ***************************************************/
1049/**************************************************************************************************************************/
1050
1051// Private class functions
1052void SysParser::canMask2canBoardsStr(uint16_t canmask, diagstr canboardsstr)
1053{
1054 for(int i=1; i<15; i++)
1055 {
1056 diagstr tmpstr{};
1057 if ( (canmask & (1<<i)) == (1<<i))
1058 {
1059 snprintf(tmpstr, diagstr_lenght, "%d", i);
1060 strcat(canboardsstr, tmpstr);
1061 }
1062 }
1063}
1064
1065void SysParser::getCanMonitorInfo(eOmn_serv_category_t &serv_category, diagstr boardsOnCan1, diagstr boardsOnCan2)
1066{
1067 serv_category = (eOmn_serv_category_t)m_dnginfo.param16;
1068 uint16_t boardsMaskCan1 = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
1069 uint16_t boardsMaskCan2 = (m_dnginfo.param64 & 0x000000000000ffff);
1070
1071 canMask2canBoardsStr(boardsMaskCan1, boardsOnCan1);
1072 canMask2canBoardsStr(boardsMaskCan2, boardsOnCan2);
1073
1074}
1075
1076void SysParser::getCanMonitorInfoWithTime(eOmn_serv_category_t &serv_category, diagstr boardsOnCan1, diagstr boardsOnCan2, uint32_t &time)
1077{
1078 getCanMonitorInfo(serv_category, boardsOnCan1, boardsOnCan2);
1079 time = (m_dnginfo.param64 & 0xffffffff00000000) >> 32;
1080}
1081
1082SysParser::SysParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
1084{
1085 char str[512] = {0};
1086 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
1088
1089 switch(value)
1090 {
1091
1092 case eoerror_value_SYS_runninghappily:
1093 {
1094 std::string appstate = "unknown";
1095 switch(m_dnginfo.param16&0x000f)
1096 {
1097 case 0: appstate="just restarted"; break;
1098 case 1: appstate="idle"; break;
1099 case 2: appstate="running"; break;
1100 };
1101 snprintf(str, sizeof(str), " %s Application state is %s.", m_dnginfo.baseMessage.c_str(), appstate.c_str());
1102 m_dnginfo.baseInfo.finalMessage.append(str);
1103 }break;
1104
1105 case eoerror_value_SYS_ctrloop_execoverflowRX:
1106 {
1107 //here the param64 contains: TX RX DO TX
1108 uint16_t prev_rx = (m_dnginfo.param64 & 0x0000ffff00000000)>>32;
1109 uint16_t prev_do = (m_dnginfo.param64 & 0x00000000ffff0000)>>16;
1110 uint16_t prev_tx = (m_dnginfo.param64 & 0x000000000000ffff);
1111 uint16_t prev_prev_tx = (m_dnginfo.param64 & 0xffff000000000000)>>48;
1112 //currently we don't print the two time ago TX.
1113
1114 //snprintf(str, sizeof(str), " %s RX execution time %d[usec]. Latest previous execution times[usec] RX=%d, DO=%d, TX=%d", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16, prev_rx, prev_do, prev_tx);
1115 snprintf(str, sizeof(str), " %s RX execution time %d[usec]. Latest previous execution times[usec] (..., Tx=%d);(RX=%d, DO=%d, TX=%d);",
1116 m_dnginfo.baseMessage.c_str(), m_dnginfo.param16, prev_prev_tx, prev_rx, prev_do, prev_tx);
1117 m_dnginfo.baseInfo.finalMessage.append(str);
1118 }break;
1119
1120 case eoerror_value_SYS_ctrloop_execoverflowDO:
1121 {
1122 //here the param64 contains: RX DO TX RX
1123 uint16_t prev_do = (m_dnginfo.param64 & 0x0000ffff00000000)>>32;
1124 uint16_t prev_tx = (m_dnginfo.param64 & 0x00000000ffff0000)>>16;
1125 uint16_t prev_rx = (m_dnginfo.param64 & 0x000000000000ffff);
1126 uint16_t prev_prev_rx = (m_dnginfo.param64 & 0xffff000000000000)>>48;
1127 //currently we don't print the two time ago RX.
1128 //snprintf(str, sizeof(str), " %s DO execution time %d[usec]. Latest previous execution times[usec] DO=%d, TX=%d, RX=%d", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16, prev_do, prev_tx, prev_rx);
1129 snprintf(str, sizeof(str), " %s DO execution time %d[usec]. Latest previous execution times[usec] (..., Tx=%s);(RX=%d, DO=%d, TX=%d); (Rx=%d, ...);",
1130 m_dnginfo.baseMessage.c_str(), m_dnginfo.param16, "N/A", prev_prev_rx, prev_do, prev_tx, prev_rx);
1131 m_dnginfo.baseInfo.finalMessage.append(str);
1132 }break;
1133
1134 case eoerror_value_SYS_ctrloop_execoverflowTX:
1135 {
1136 //here the param64 contains: DO TX RX DO
1137 uint16_t prev_tx = (m_dnginfo.param64 & 0x0000ffff00000000)>>32;
1138 uint16_t prev_rx = (m_dnginfo.param64 & 0x00000000ffff0000)>>16;
1139 uint16_t prev_do = (m_dnginfo.param64 & 0x000000000000ffff);
1140 uint8_t can1_frames = (m_dnginfo.param64 & 0x00ff000000000000) >> 48;
1141 uint8_t can2_frames = (m_dnginfo.param64 & 0xff00000000000000) >> 56;
1142 //snprintf(str, sizeof(str), " %s TX execution time %d[usec]. Latest previous execution times[usec] TX=%d, RX=%d, DO=%d. Num of CAN frames[CAN1,CAN2]=[%u %u]", m_dnginfo.baseMessage.c_str(),
1143 //m_dnginfo.param16, prev_tx, prev_rx, prev_do, can1_frames, can2_frames );
1144 snprintf(str, sizeof(str), " %s TX execution time %d[usec]. Latest previous execution times[usec] (RX=%s, DO=%s, TX=%d); (Rx=%d, DO=%d, ...). Num of CAN frames[CAN1,CAN2]=[%u %u]",
1145 m_dnginfo.baseMessage.c_str(), m_dnginfo.param16, "N/A", "N/A" , prev_tx, prev_rx, prev_do, can1_frames, can2_frames);
1146 m_dnginfo.baseInfo.finalMessage.append(str);
1147 }break;
1148
1149 case eoerror_value_SYS_ropparsingerror:
1150 {
1151 snprintf(str, sizeof(str), " %s Error code is %d (eOparserResult_t).", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1152 m_dnginfo.baseInfo.finalMessage.append(str);
1153 }break;
1154
1155 case eoerror_value_SYS_halerror:
1156 {
1157 snprintf(str, sizeof(str), " %s HAL error code is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1158 m_dnginfo.baseInfo.finalMessage.append(str);
1159 }break;
1160
1161 case eoerror_value_SYS_osalerror:
1162 {
1163 snprintf(str, sizeof(str), " %s OSAL error code is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1164 m_dnginfo.baseInfo.finalMessage.append(str);
1165 }break;
1166
1167 case eoerror_value_SYS_ipalerror:
1168 {
1169 snprintf(str, sizeof(str), " %s IPAL error code is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1170 m_dnginfo.baseInfo.finalMessage.append(str);
1171 }break;
1172
1173 case eoerror_value_SYS_dispatcherfifooverflow:
1174 {
1175 snprintf(str, sizeof(str), " %s Number of lost items is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1176 m_dnginfo.baseInfo.finalMessage.append(str);
1177 }break;
1178
1179 case eoerror_value_SYS_canservices_txfifooverflow:
1180 {
1181 snprintf(str, sizeof(str), " %s CanPort=%s Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
1183 m_dnginfo.baseInfo.finalMessage.append(str);
1184 }break;
1185
1186 case eoerror_value_SYS_canservices_txbusfailure:
1187 {
1188 snprintf(str, sizeof(str), " %s CanPort=%s. Size of fifo is %d", m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.sourceCANPortStr.c_str(), ((m_dnginfo.param16 & 0xff00) >>8));
1189 m_dnginfo.baseInfo.finalMessage.append(str);
1190 }break;
1191
1192 case eoerror_value_SYS_canservices_formingfailure:
1193 {
1194 snprintf(str, sizeof(str), " %s CanPort=%s. Message class is %d. Message cmd is %d", m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.sourceCANPortStr.c_str(), ((m_dnginfo.param16 & 0xff00) >>8), (m_dnginfo.param16 & 0x00ff));
1195 m_dnginfo.baseInfo.finalMessage.append(str);
1196 }break;
1197
1198 case eoerror_value_SYS_canservices_parsingfailure:
1199 {
1200 snprintf(str, sizeof(str), " %s CanPort=%s. Frame.size=%d. Frame.Id=%d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.sourceCANPortStr.c_str(), ((m_dnginfo.param16 & 0xf000) >>12), (m_dnginfo.param16 & 0x0fff));
1201 m_dnginfo.baseInfo.finalMessage.append(str);
1202 }break;
1203
1204 case eoerror_value_SYS_canservices_genericerror:
1205 {
1206 snprintf(str, sizeof(str), " %s error code is %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1207 m_dnginfo.baseInfo.finalMessage.append(str);
1208
1209 }break;
1210
1211 case eoerror_value_SYS_ctrloop_rxphasemin:
1212 case eoerror_value_SYS_ctrloop_dophasemin:
1213 case eoerror_value_SYS_ctrloop_txphasemin:
1214 case eoerror_value_SYS_ctrloop_rxphaseaverage:
1215 case eoerror_value_SYS_ctrloop_dophaseaverage:
1216 case eoerror_value_SYS_ctrloop_txphaseaverage:
1217 case eoerror_value_SYS_ctrloop_rxphasemax:
1218 case eoerror_value_SYS_ctrloop_dophasemax:
1219 case eoerror_value_SYS_ctrloop_txphasemax:
1220 {
1221 snprintf(str, sizeof(str), " %s, monitored over %f sec is %d microsec", m_dnginfo.baseMessage.c_str(),
1222 0.01*static_cast<float>(m_dnginfo.param64 & 0xffff),
1224 );
1225 m_dnginfo.baseInfo.finalMessage.append(str);
1226 } break;
1227
1228 case eoerror_value_SYS_exec_time_stats:
1229 {
1230 static constexpr const char * const names[5] = { "runner.RX()", "runner.DO()", "runner.TX()", "runner.RXDOTX()", "other.ID = " };
1231 std::string actor = {};
1232 if(m_dnginfo.param16 <= 3)
1233 {
1234 actor = names[m_dnginfo.param16];
1235 }
1236 else
1237 {
1238 actor = names[4] + std::to_string(m_dnginfo.param16);
1239 }
1240
1241 snprintf(str, sizeof(str), " %s: %s -> (%d, %d, %d) us over %f sec",
1242 m_dnginfo.baseMessage.c_str(),
1243 actor.c_str(),
1244 static_cast<uint16_t>((m_dnginfo.param64 >> 48) & 0xffff), // min
1245 static_cast<uint16_t>((m_dnginfo.param64 >> 32) & 0xffff), // average
1246 static_cast<uint16_t>((m_dnginfo.param64 >> 16) & 0xffff), // max
1247 0.01*static_cast<float>(m_dnginfo.param64 & 0xffff) // period
1248 );
1249 m_dnginfo.baseInfo.finalMessage.append(str);
1250 } break;
1251
1252 case eoerror_value_SYS_ctrloop_execoverflowPERIOD:
1253 {
1254 uint16_t budget = m_dnginfo.param16;
1255 uint16_t current = static_cast<uint16_t>((m_dnginfo.param64 >> 48) & 0xffff);
1256 uint16_t rxt = static_cast<uint16_t>((m_dnginfo.param64 >> 32) & 0xffff);
1257 uint16_t dot = static_cast<uint16_t>((m_dnginfo.param64 >> 16) & 0xffff);
1258 uint16_t txt = static_cast<uint16_t>((m_dnginfo.param64 ) & 0xffff);
1259
1260 snprintf(str, sizeof(str), " %s: RXDOTX cycle budget = %d us, RXDOTX exec time = %d us, (rx, do, tx) = (%d, %d, %d) us",
1261 m_dnginfo.baseMessage.c_str(),
1262 budget,
1263 current,
1264 rxt, dot, txt
1265 );
1266 m_dnginfo.baseInfo.finalMessage.append(str);
1267 } break;
1268
1269 case eoerror_value_SYS_ctrloop_histogramPERIOD:
1270 {
1271 uint16_t w = m_dnginfo.param16;
1272 float v[8] = {0};
1273 for(uint8_t i=0; i<8; i++)
1274 {
1275 uint64_t x = (m_dnginfo.param64 >> (8*i)) & 0xff;
1276 v[i] = static_cast<float>(x)/255.0;
1277 }
1278
1279 snprintf(str, sizeof(str), " %s: RXDOTX execution histogram w/ bins = %d us wide in [0, %f) + beyond -> [%f, %f, %f, %f, %f, %f, %f) + %f",
1280 m_dnginfo.baseMessage.c_str(),
1281 w, 7.0*w,
1282 v[0], v[1], v[2], v[3], v[4], v[5], v[6],
1283 v[7]
1284 );
1285 m_dnginfo.baseInfo.finalMessage.append(str);
1286 } break;
1287
1288 case eoerror_value_SYS_proxy_forward_fails:
1289 {
1290 snprintf(str, sizeof(str), " %s. ROP.sign=%d, ROP.id=%d. Proxy list capacity is %d, size is %d ",
1291 m_dnginfo.baseMessage.c_str(),
1292 (int32_t)((m_dnginfo.param64&0xffffffff00000000)>>32),
1293 (int32_t)(m_dnginfo.param64&0x00000000ffffffff),
1294 ((m_dnginfo.param16&0xff00)>>8), (m_dnginfo.param16&0x00ff));
1295 m_dnginfo.baseInfo.finalMessage.append(str);
1296
1297 }break;
1298
1299 case eoerror_value_SYS_proxy_ropdes_notfound:
1300 {
1301 snprintf(str, sizeof(str), " %s ROP.id=%d ", m_dnginfo.baseMessage.c_str(), (int32_t)(m_dnginfo.param64&0x00000000ffffffff));
1302 m_dnginfo.baseInfo.finalMessage.append(str);
1303
1304 }break;
1305
1306 case eoerror_value_SYS_canservices_canprint:
1307 {
1308 snprintf(str, sizeof(str), " %s CanPort=%s Frame.Size=%d Frame.Data=0x%lx", m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.sourceCANPortStr.c_str(), m_dnginfo.param16, m_dnginfo.param64 );
1309 m_dnginfo.baseInfo.finalMessage.append(str);
1310 }break;
1311
1312 case eoerror_value_SYS_canservices_rxmaisbug:
1313 {
1314 snprintf(str, sizeof(str), " %s CanPort=%s Frame.Size=%d Frame.Data=0x%lx", m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.sourceCANPortStr.c_str(), m_dnginfo.param16, m_dnginfo.param64 );
1315 m_dnginfo.baseInfo.finalMessage.append(str);
1316 }break;
1317
1318 case eoerror_value_SYS_canservices_rxfromwrongboard:
1319 {
1320 snprintf(str, sizeof(str), " %s CanPort=%s Frame.Size=%d Frame.Data=0x%lx", m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.sourceCANPortStr.c_str(), m_dnginfo.param16, m_dnginfo.param64 );
1321 m_dnginfo.baseInfo.finalMessage.append(str);
1322 }break;
1323
1324 case eoerror_value_SYS_transceiver_rxseqnumber_error:
1325 {
1326 int16_t receivedNum = m_dnginfo.param64+ m_dnginfo.param16;
1327 snprintf(str, sizeof(str), " %s Expected number is %ld, received number is %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param64, receivedNum);
1328 m_dnginfo.baseInfo.finalMessage.append(str);
1329 }break;
1330
1331 case eoerror_value_SYS_transceiver_rxseqnumber_restarted:
1332 {
1333 snprintf(str, sizeof(str), " %s Expected number is %ld", m_dnginfo.baseMessage.c_str(), m_dnginfo.param64);
1334 m_dnginfo.baseInfo.finalMessage.append(str);
1335 }break;
1336
1337 case eoerror_value_SYS_canservices_board_detected:
1338 {
1339 //in param64 the fw copies the struct eObrd_typeandversions_t defined in EoBoards.h in icub=firmware repo
1356 //TODO:
1357 //checking the fw it seems this error code is no longer used.
1358 //So I cannot retrieve the board type.
1359 //For now I leave the code. When I'm sure that it is old, I'll remove it
1360 int fw_build = (m_dnginfo.param64 & 0x00000000000000ff);
1361 int fw_major = (m_dnginfo.param64 & 0x000000000000ff00) >> 8;
1362 int fw_minor = (m_dnginfo.param64 & 0x0000000000ff0000) >> 16;
1363 int proto_major = (m_dnginfo.param64 & 0x00000000ff000000) >> 24;
1364 int proto_minor = (m_dnginfo.param64 & 0x000000ff00000000) >> 32;
1365
1366 //used in comm-v1 protocol
1367 // eObrd_typeandversions_t *brd_info_ptr = (eObrd_typeandversions_t *)&m_dnginfo.param64;
1368 // int fw_build = brd_info_ptr->firmwarebuildnumber;
1369 // int fw_major = brd_info_ptr->firmwareversion.major;
1370 // int fw_minor = brd_info_ptr->firmwareversion.minor;
1371 // int proto_major =brd_info_ptr->protocolversion.major;
1372 // int proto_minor =brd_info_ptr->protocolversion.minor;
1373
1374 // eObrd_type_t general_brd_type = eoboards_cantype2type((eObrd_cantype_t )brd_info_ptr->boardtype);
1375
1376 // std::string board_type_str = eoboards_type2string(general_brd_type);
1377
1378 snprintf(str, sizeof(str), " %s on CAN port=%s with address %d. Fw ver is %d.%d.%d. Proto ver is %d.%d",
1380 fw_build, fw_major, fw_minor, proto_major, proto_minor );
1381 m_dnginfo.baseInfo.finalMessage.append(str);
1382 }break;
1383
1384 case eoerror_value_SYS_canservices_board_wrongprotversion:
1385 {
1386 //in param64 the fw copies the struct eObrd_typeandversions_t defined in EoBoards.h in icub=firmware repo
1403 //as above
1404 int fw_build = (m_dnginfo.param64 & 0x00000000000000ff);
1405 int fw_major = (m_dnginfo.param64 & 0x000000000000ff00) >> 8;
1406 int fw_minor = (m_dnginfo.param64 & 0x0000000000ff0000) >> 16;
1407 int proto_major = (m_dnginfo.param64 & 0x00000000ff000000) >> 24;
1408 int proto_minor = (m_dnginfo.param64 & 0x000000ff00000000) >> 32;
1409 int req_proto_major = (m_dnginfo.param16 & 0xff00) >>8;
1410 int req_proto_minor = (m_dnginfo.param16 & 0x00ff);
1411
1412
1413 snprintf(str, sizeof(str), " %s on CAN port=%s with address %d. Fw ver is %d.%d.%d. Proto ver is %d.%d. Required Version is %d.%d",
1415 fw_build, fw_major, fw_minor, proto_major, proto_minor, req_proto_major, req_proto_minor );
1416 m_dnginfo.baseInfo.finalMessage.append(str);
1417 }break;
1418
1419 case eoerror_value_SYS_canservices_board_notfound:
1420 {
1421 eObrd_type_t general_brd_type = eoboards_cantype2type((eObrd_cantype_t)m_dnginfo.param16);
1422 snprintf(str, sizeof(str), " %s The board is on CAN port=%s with address %d. Board type is %s.",
1424 m_dnginfo.baseInfo.sourceCANBoardAddr, eoboards_type2string(general_brd_type));
1425 m_dnginfo.baseInfo.finalMessage.append(str);
1426
1427 }break;
1428
1429 case eoerror_value_SYS_canservices_boards_lostcontact:
1430 {
1431 eOmn_serv_category_t serv_category;
1432 diagstr lostCanBoards1 = {0};
1433 diagstr lostCanBoards2 = {0};
1434 getCanMonitorInfo(serv_category, lostCanBoards1, lostCanBoards2);
1435
1436 snprintf(str, sizeof(str), "%s Type of service category is %s. Lost can boards on (can1map, can2map) = ([ %s ], [ %s ] ).",
1437 m_dnginfo.baseMessage.c_str(),
1438 eomn_servicecategory2string(serv_category),
1439 lostCanBoards1, lostCanBoards2
1440 );
1441
1442 m_dnginfo.baseInfo.finalMessage.append(str);
1443
1444 } break;
1445
1446 case eoerror_value_SYS_canservices_boards_retrievedcontact:
1447 {
1448 eOmn_serv_category_t serv_category;
1449 diagstr retrievedCanBoards1 = {0};
1450 diagstr retrievedCanBoards2 = {0};
1451 getCanMonitorInfo(serv_category, retrievedCanBoards1, retrievedCanBoards2);
1452
1453 snprintf(str, sizeof(str), "%s Type of service category is %s. Retrieved can boards on (can1map, can2map) = ([ %s ], [ %s ] ).",
1454 m_dnginfo.baseMessage.c_str(),
1455 eomn_servicecategory2string(serv_category),
1456 retrievedCanBoards1, retrievedCanBoards2
1457 );
1458
1459 m_dnginfo.baseInfo.finalMessage.append(str);
1460
1461 } break;
1462
1463 case eoerror_value_SYS_canservices_monitor_regularcontact:
1464 {
1465 eOmn_serv_category_t serv_category;
1466 diagstr foundCanBoards1 = {0};
1467 diagstr foundCanBoards2 = {0};
1468 getCanMonitorInfo(serv_category, foundCanBoards1, foundCanBoards2);
1469
1470 snprintf(str, sizeof(str), "%s Type of service category is %s. CAN boards are on (can1map, can2map) = ([ %s ], [ %s ])",
1471 m_dnginfo.baseMessage.c_str(),
1472 eomn_servicecategory2string(serv_category),
1473 foundCanBoards1,
1474 foundCanBoards2
1475 );
1476 m_dnginfo.baseInfo.finalMessage.append(str);
1477 } break;
1478
1479 case eoerror_value_SYS_canservices_monitor_lostcontact:
1480 {
1481 eOmn_serv_category_t serv_category;
1482 diagstr lostCanBoards1 = {0};
1483 diagstr lostCanBoards2 = {0};
1484 getCanMonitorInfo(serv_category, lostCanBoards1, lostCanBoards2);
1485
1486 snprintf(str, sizeof(str), "%s Type of service category is %s. Lost CAN boards are on (can1map, can2map) = ([ %s ], [ %s ]).",
1487 m_dnginfo.baseMessage.c_str(),
1488 eomn_servicecategory2string(serv_category),
1489 lostCanBoards1,
1490 lostCanBoards2
1491 );
1492 m_dnginfo.baseInfo.finalMessage.append(str);
1493 } break;
1494
1495 case eoerror_value_SYS_canservices_monitor_retrievedcontact:
1496 {
1497 eOmn_serv_category_t serv_category;
1498 uint32_t totRetrvTime;
1499 diagstr retrievedCanBoards1 = {0};
1500 diagstr retrievedCanBoards2 = {0};
1501 getCanMonitorInfoWithTime(serv_category, retrievedCanBoards1, retrievedCanBoards2, totRetrvTime);
1502
1503
1504 snprintf(str, sizeof(str), "%s Type of service category is %s. CAN boards are on (can1map, can2map) = ([ %s ], [ %s ]). Total retrieving time: %d [ms]",
1505 m_dnginfo.baseMessage.c_str(),
1506 eomn_servicecategory2string(serv_category),
1507 retrievedCanBoards1,
1508 retrievedCanBoards2,
1509 totRetrvTime
1510 );
1511 m_dnginfo.baseInfo.finalMessage.append(str);
1512 } break;
1513
1514
1515 case eoerror_value_SYS_canservices_monitor_stillnocontact:
1516 {
1517 eOmn_serv_category_t serv_category;
1518 uint32_t totDisappTime;
1519 diagstr lostCanBoards1 = {0};
1520 diagstr lostCanBoards2 = {0};
1521 getCanMonitorInfoWithTime(serv_category, lostCanBoards1, lostCanBoards2, totDisappTime);
1522
1523 snprintf(str, sizeof(str), "%s Type of service category is %s. Lost CAN boards are on (can1map, can2map) = ([ %s ] , [ %s ]). Total disappearance time: %d [ms]",
1524 m_dnginfo.baseMessage.c_str(),
1525 eomn_servicecategory2string(serv_category),
1526 lostCanBoards1,
1527 lostCanBoards2,
1528 totDisappTime
1529 );
1530 m_dnginfo.baseInfo.finalMessage.append(str);
1531 } break;
1532
1533
1534 case eoerror_value_SYS_unspecified:
1535 case eoerror_value_SYS_tobedecided:
1536 case eoerror_value_SYS_memory_zerorequested:
1537 case eoerror_value_SYS_memory_notinitialised:
1538 case eoerror_value_SYS_memory_missing:
1539 case eoerror_value_SYS_mutex_timeout:
1540 case eoerror_value_SYS_wrongparam:
1541 case eoerror_value_SYS_wrongusage:
1542 case eoerror_value_SYS_runtimeerror:
1543 case eoerror_value_SYS_runninginfatalerrorstate:
1544 case eoerror_value_SYS_udptxfailure:
1545 case eoerror_value_SYS_configurator_udptxfailure:
1546 case eoerror_value_SYS_runner_udptxfailure:
1547 case eoerror_value_SYS_runner_transceivererror:
1548 case eoerror_value_SYS_canservices_rxfifooverflow:
1549 case eoerror_value_SYS_proxy_forward_ok:
1550 case eoerror_value_SYS_proxy_forward_callback_fails:
1551 case eoerror_value_SYS_proxy_reply_ok:
1552 case eoerror_value_SYS_proxy_reply_fails:
1553 case eoerror_value_SYS_canservices_boards_missing:
1554 case eoerror_value_SYS_canservices_boards_searched:
1555 case eoerror_value_SYS_canservices_boards_found:
1556 case eoerror_value_SYS_transceiver_rxinvalidframe_error:
1557 {
1558 printBaseInfo();
1559 } break;
1560
1561
1562 case EOERROR_VALUE_DUMMY:
1563 {
1564 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1565
1566
1567 } break;
1568
1569 default:
1570 {
1572
1573 }
1574
1575 }//end switch
1576
1577
1578
1579}
1580
1581
1582
1583
1584
1585
1586/**************************************************************************************************************************/
1587/****************************************** EthMonitorParser *****************************************/
1588/**************************************************************************************************************************/
1589
1590
1591
1592EthMonitorParser::EthMonitorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
1593
1595{
1596 char str[512] = {0};
1597 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
1599
1600 switch(value)
1601 {
1602
1603 case eoerror_value_ETHMON_link_goes_up:
1604 case eoerror_value_ETHMON_link_goes_down:
1605 case eoerror_value_ETHMON_error_rxcrc:
1606 {
1607 std::string appstate = "unknown";
1608 switch(m_dnginfo.param64&0xff00000000000000)
1609 {
1610 case 0: appstate="N/A"; break;
1611 case 1: appstate="idle"; break;
1612 case 3: appstate="running"; break;
1613 };
1614
1615 std::string ethport = "unknown";
1616 switch(m_dnginfo.param16)
1617 {
1618 case 0: ethport="ETH input (P2/P13/J4/J6)"; break;
1619 case 1: ethport="ETH output (P3/P12/J5/J7)"; break;
1620 case 2: ethport="internal"; break;
1621 };
1622 if(eoerror_value_ETHMON_error_rxcrc == value)
1623 snprintf(str, sizeof(str), " %s in port %s. Application state is %s. Number of erros is %ld",
1624 m_dnginfo.baseMessage.c_str(), ethport.c_str(), appstate.c_str(), (m_dnginfo.param64&0xffffffff));
1625 else
1626 snprintf(str, sizeof(str), " %s in port %s. Application state is %s.", m_dnginfo.baseMessage.c_str(), ethport.c_str(), appstate.c_str());
1627
1628 m_dnginfo.baseInfo.finalMessage.append(str);
1629 }break;
1630
1631 case eoerror_value_ETHMON_txseqnumbermissing:
1632 {
1633 snprintf(str, sizeof(str), " %s w/ expected sequence %ld and number of detected %d", m_dnginfo.baseMessage.c_str(), m_dnginfo.param64, m_dnginfo.param16);
1634 m_dnginfo.baseInfo.finalMessage.append(str);
1635 }break;
1636
1637
1638 case eoerror_value_ETHMON_juststarted:
1639 case eoerror_value_ETHMON_justverified:
1640 {
1641 printBaseInfo();
1642 } break;
1643
1644
1645 case EOERROR_VALUE_DUMMY:
1646 {
1647 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1648
1649
1650 } break;
1651
1652 default:
1653 {
1655
1656 }
1657
1658 }//end switch
1659}
1660
1661
1662/**************************************************************************************************************************/
1663/****************************************** InertialSensorParser ********************************************/
1664/**************************************************************************************************************************/
1665
1666InertialSensorParser::InertialSensorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
1667
1669{
1670 char str[512] = {0};
1671 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
1673
1674 switch(value)
1675 {
1676
1677 case eoerror_value_IS_arrayofinertialdataoverflow:
1678 {
1679
1680 uint8_t frame_id = m_dnginfo.param16 & 0x0fff;
1681 uint8_t frame_size = (m_dnginfo.param16 & 0xf000) >> 12;
1682 uint64_t frame_data = m_dnginfo.param64;
1683
1684 snprintf(str, sizeof(str), " %s. Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
1685 m_dnginfo.baseMessage.c_str(), frame_id, frame_size, frame_data
1686 );
1687 m_dnginfo.baseInfo.finalMessage.append(str);
1688 } break;
1689
1690 case eoerror_value_IS_unknownsensor:
1691 {
1692 printBaseInfo();
1693 } break;
1694
1695
1696 case EOERROR_VALUE_DUMMY:
1697 {
1698 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1699
1700
1701 } break;
1702
1703 default:
1704 {
1706
1707 }
1708
1709 }//end switch
1710}
1711
1712/**************************************************************************************************************************/
1713/****************************************** AnalogSensorParser **********************************************/
1714/**************************************************************************************************************************/
1715
1716AnalogSensorParser::AnalogSensorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
1718{
1719 char str[512] = {0};
1720 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
1722
1723 switch(value)
1724 {
1725
1726 case eoerror_value_AS_arrayoftemperaturedataoverflow:
1727 {
1728
1729 uint8_t frame_id = m_dnginfo.param16 & 0x00ff;
1730 uint8_t frame_size = (m_dnginfo.param16 & 0xf000) >> 12;
1731 uint64_t frame_data = m_dnginfo.param64;
1732
1733 snprintf(str, sizeof(str), " %s. Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
1734 m_dnginfo.baseMessage.c_str(), frame_id, frame_size, frame_data
1735 );
1736 m_dnginfo.baseInfo.finalMessage.append(str);
1737 } break;
1738
1739 case eoerror_value_AS_unknownsensor:
1740 {
1741 printBaseInfo();
1742 } break;
1743
1744
1745 case EOERROR_VALUE_DUMMY:
1746 {
1747 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1748
1749
1750 } break;
1751
1752 default:
1753 {
1755
1756 }
1757
1758 }//end switch
1759}
1760
Diagnostic::LowLevel::EntityNameProvider & m_entityNameProvider
Diagnostic::LowLevel::AuxEmbeddedInfo & m_dnginfo
bool getEncoderTypeName(uint32_t jomoId, eOmc_position_t pos, std::string &encoderTypeName)
bool getAxisName(uint32_t entityId, std::string &axisName)
bool convert(std::string const &fromstring, eOmc_actuator_t &toactuatortype, bool &formaterror)
int n
char diagstr[diagstr_lenght]
constexpr int diagstr_lenght
degrees time
Definition sine.m:5