Loading [MathJax]/extensions/tex2jax.js
iCub-main
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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_motor_tdb_not_reading:
820 {
821 uint16_t joint_num = m_dnginfo.param16;
822
824
825 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d))",
826 m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num);
827 m_dnginfo.baseInfo.finalMessage.append(str);
828 } break;
829
830 case EOERROR_VALUE_DUMMY:
831 {
832 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_MotionControl error value.");
833
834
835 } break;
836
837 default:
838 {
840
841 }
842
843 }//end switch
844
845
846
847}
848
849
850
851
852/**************************************************************************************************************************/
853/****************************************** SkinParser ***************************************************/
854/**************************************************************************************************************************/
855
856
857
858SkinParser::SkinParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
859
861{
862 char str[512] = {0};
863 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
865
866 switch (value)
867 {
868 case eoerror_value_SK_unspecified:
869 case eoerror_value_SK_obsoletecommand:
870 {
872 } break;
873
874 case eoerror_value_SK_arrayofcandataoverflow:
875 {
876 uint8_t frame_id = m_dnginfo.param16 & 0x00ff;
877 uint8_t frame_size = (m_dnginfo.param16 & 0xf000) >> 12;
878 uint64_t frame_data = m_dnginfo.param64;
879
880 snprintf(str, sizeof(str), " %s. Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
881 m_dnginfo.baseMessage.c_str(), frame_id, frame_size, frame_data
882 );
883 m_dnginfo.baseInfo.finalMessage.append(str);
884 } break;
885
886 case eoerror_value_SK_onoroff:
887 {
888 std::string emsboardstate = "unknown";
889 switch (m_dnginfo.param16)
890 {
891 case 0: emsboardstate = "OFF"; break;
892 case 1: emsboardstate = "ON"; break;
893 };
894
895 snprintf(str, sizeof(str), " %s %s", m_dnginfo.baseMessage.c_str(), emsboardstate.c_str());
896 m_dnginfo.baseInfo.finalMessage.append(str);
897 } break;
898
899 case eoerror_value_SK_unexpecteddata:
900 {
901 std::string emsboardstate = "unknown";
902 switch (m_dnginfo.param16)
903 {
904 case 0: emsboardstate = "CFG"; break;
905 case 1: emsboardstate = "RUN"; break;
906 }
907
908 snprintf(str, sizeof(str), " %s %s", m_dnginfo.baseMessage.c_str(), emsboardstate.c_str());
909 m_dnginfo.baseInfo.finalMessage.append(str);
910 } break;
911
912 case EOERROR_VALUE_DUMMY:
913 {
914 m_dnginfo.baseInfo.finalMessage.append(": unrecognized eoerror_category_Skin error value");
915 } break;
916
917 default:
918 {
920
921 } break;
922 }
923}
924
925/**************************************************************************************************************************/
926/****************************************** HwErrorParser ***************************************************/
927/**************************************************************************************************************************/
928
929
930
931HwErrorParser::HwErrorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
932
934{
935 char str[512] = {0};
936 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
938
939 switch(value)
940 {
941
942 case eoerror_value_HW_strain_saturation:
943 {
944 uint16_t channel = m_dnginfo.param16;
945 uint32_t lower_saturation_counts = m_dnginfo.param64 & 0xffffffff;
946 uint32_t upper_saturation_counts = (m_dnginfo.param64 & 0xffffffff00000000)>>32;
947 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",
948 m_dnginfo.baseMessage.c_str(),
949 channel,
950 lower_saturation_counts,
951 upper_saturation_counts);
952 m_dnginfo.baseInfo.finalMessage.append(str);
953 } break;
954
955 case eoerror_value_HW_encoder_invalid_value:
956 case eoerror_value_HW_encoder_close_to_limits:
957 case eoerror_value_HW_encoder_crc:
958 case eoerror_value_HW_encoder_not_connected:
959 {
960 uint8_t joint_num = m_dnginfo.param16 & 0x00ff;
961 int16_t number_of_errors = m_dnginfo.param64 & 0x000000000000ffff;
963
964 snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d) Number of error in 10 seconds is: %d)",
965 m_dnginfo.baseMessage.c_str(),
966 m_dnginfo.baseInfo.axisName.c_str(),
967 joint_num,
968 number_of_errors);
969 m_dnginfo.baseInfo.finalMessage.append(str);
970 } break;
971
972 case eoerror_value_HW_amo_encoder_status0:
973 {
974 uint8_t joint_num = m_dnginfo.param16 & 0x00ff;
975 uint32_t nonius_track_errors = (m_dnginfo.param64 & 0xffffffff00000000) >> 32;
976 uint32_t master_track_errors = m_dnginfo.param64 & 0x00000000ffffffff;
977 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)",
978 m_dnginfo.baseMessage.c_str(),
979 m_dnginfo.baseInfo.axisName.c_str(),
980 joint_num,
981 nonius_track_errors,
982 master_track_errors);
983 m_dnginfo.baseInfo.finalMessage.append(str);
984 } break;
985
986 case eoerror_value_HW_amo_encoder_status1:
987 {
988 uint8_t joint_num = m_dnginfo.param16 & 0x00ff;
989 uint16_t internal_crc_errors = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
990 uint16_t i2c_comm_errors = (m_dnginfo.param64 & 0x0000ffff00000000) >> 32;
991 uint16_t nonius_period_consistency_errors = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
992 uint16_t eccessive_input_signal_frequency_errors = (m_dnginfo.param64 & 0x000000000000ffff);
993 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)",
994 m_dnginfo.baseMessage.c_str(),
995 m_dnginfo.baseInfo.axisName.c_str(),
996 joint_num,
997 internal_crc_errors,
998 i2c_comm_errors,
999 nonius_period_consistency_errors,
1000 eccessive_input_signal_frequency_errors);
1001 m_dnginfo.baseInfo.finalMessage.append(str);
1002 } break;
1003
1004 case EOERROR_VALUE_DUMMY:
1005 {
1006 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1007
1008
1009 } break;
1010
1011 default:
1012 {
1014
1015 }
1016
1017 }//end switch
1018
1019
1020
1021}
1022
1023
1024
1025/**************************************************************************************************************************/
1026/****************************************** SysErrorParser ***************************************************/
1027/**************************************************************************************************************************/
1028
1029// Private class functions
1030void SysParser::canMask2canBoardsStr(uint16_t canmask, diagstr canboardsstr)
1031{
1032 for(int i=1; i<15; i++)
1033 {
1034 diagstr tmpstr{};
1035 if ( (canmask & (1<<i)) == (1<<i))
1036 {
1037 snprintf(tmpstr, diagstr_lenght, "%d", i);
1038 strcat(canboardsstr, tmpstr);
1039 }
1040 }
1041}
1042
1043void SysParser::getCanMonitorInfo(eOmn_serv_category_t &serv_category, diagstr boardsOnCan1, diagstr boardsOnCan2)
1044{
1045 serv_category = (eOmn_serv_category_t)m_dnginfo.param16;
1046 uint16_t boardsMaskCan1 = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
1047 uint16_t boardsMaskCan2 = (m_dnginfo.param64 & 0x000000000000ffff);
1048
1049 canMask2canBoardsStr(boardsMaskCan1, boardsOnCan1);
1050 canMask2canBoardsStr(boardsMaskCan2, boardsOnCan2);
1051
1052}
1053
1054void SysParser::getCanMonitorInfoWithTime(eOmn_serv_category_t &serv_category, diagstr boardsOnCan1, diagstr boardsOnCan2, uint32_t &time)
1055{
1056 getCanMonitorInfo(serv_category, boardsOnCan1, boardsOnCan2);
1057 time = (m_dnginfo.param64 & 0xffffffff00000000) >> 32;
1058}
1059
1060SysParser::SysParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
1062{
1063 char str[512] = {0};
1064 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
1066
1067 switch(value)
1068 {
1069
1070 case eoerror_value_SYS_runninghappily:
1071 {
1072 std::string appstate = "unknown";
1073 switch(m_dnginfo.param16&0x000f)
1074 {
1075 case 0: appstate="just restarted"; break;
1076 case 1: appstate="idle"; break;
1077 case 2: appstate="running"; break;
1078 };
1079 snprintf(str, sizeof(str), " %s Application state is %s.", m_dnginfo.baseMessage.c_str(), appstate.c_str());
1080 m_dnginfo.baseInfo.finalMessage.append(str);
1081 }break;
1082
1083 case eoerror_value_SYS_ctrloop_execoverflowRX:
1084 {
1085 //here the param64 contains: TX RX DO TX
1086 uint16_t prev_rx = (m_dnginfo.param64 & 0x0000ffff00000000)>>32;
1087 uint16_t prev_do = (m_dnginfo.param64 & 0x00000000ffff0000)>>16;
1088 uint16_t prev_tx = (m_dnginfo.param64 & 0x000000000000ffff);
1089 uint16_t prev_prev_tx = (m_dnginfo.param64 & 0xffff000000000000)>>48;
1090 //currently we don't print the two time ago TX.
1091
1092 //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);
1093 snprintf(str, sizeof(str), " %s RX execution time %d[usec]. Latest previous execution times[usec] (..., Tx=%d);(RX=%d, DO=%d, TX=%d);",
1094 m_dnginfo.baseMessage.c_str(), m_dnginfo.param16, prev_prev_tx, prev_rx, prev_do, prev_tx);
1095 m_dnginfo.baseInfo.finalMessage.append(str);
1096 }break;
1097
1098 case eoerror_value_SYS_ctrloop_execoverflowDO:
1099 {
1100 //here the param64 contains: RX DO TX RX
1101 uint16_t prev_do = (m_dnginfo.param64 & 0x0000ffff00000000)>>32;
1102 uint16_t prev_tx = (m_dnginfo.param64 & 0x00000000ffff0000)>>16;
1103 uint16_t prev_rx = (m_dnginfo.param64 & 0x000000000000ffff);
1104 uint16_t prev_prev_rx = (m_dnginfo.param64 & 0xffff000000000000)>>48;
1105 //currently we don't print the two time ago RX.
1106 //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);
1107 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, ...);",
1108 m_dnginfo.baseMessage.c_str(), m_dnginfo.param16, "N/A", prev_prev_rx, prev_do, prev_tx, prev_rx);
1109 m_dnginfo.baseInfo.finalMessage.append(str);
1110 }break;
1111
1112 case eoerror_value_SYS_ctrloop_execoverflowTX:
1113 {
1114 //here the param64 contains: DO TX RX DO
1115 uint16_t prev_tx = (m_dnginfo.param64 & 0x0000ffff00000000)>>32;
1116 uint16_t prev_rx = (m_dnginfo.param64 & 0x00000000ffff0000)>>16;
1117 uint16_t prev_do = (m_dnginfo.param64 & 0x000000000000ffff);
1118 uint8_t can1_frames = (m_dnginfo.param64 & 0x00ff000000000000) >> 48;
1119 uint8_t can2_frames = (m_dnginfo.param64 & 0xff00000000000000) >> 56;
1120 //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(),
1121 //m_dnginfo.param16, prev_tx, prev_rx, prev_do, can1_frames, can2_frames );
1122 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]",
1123 m_dnginfo.baseMessage.c_str(), m_dnginfo.param16, "N/A", "N/A" , prev_tx, prev_rx, prev_do, can1_frames, can2_frames);
1124 m_dnginfo.baseInfo.finalMessage.append(str);
1125 }break;
1126
1127 case eoerror_value_SYS_ropparsingerror:
1128 {
1129 snprintf(str, sizeof(str), " %s Error code is %d (eOparserResult_t).", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1130 m_dnginfo.baseInfo.finalMessage.append(str);
1131 }break;
1132
1133 case eoerror_value_SYS_halerror:
1134 {
1135 snprintf(str, sizeof(str), " %s HAL error code is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1136 m_dnginfo.baseInfo.finalMessage.append(str);
1137 }break;
1138
1139 case eoerror_value_SYS_osalerror:
1140 {
1141 snprintf(str, sizeof(str), " %s OSAL error code is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1142 m_dnginfo.baseInfo.finalMessage.append(str);
1143 }break;
1144
1145 case eoerror_value_SYS_ipalerror:
1146 {
1147 snprintf(str, sizeof(str), " %s IPAL error code is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1148 m_dnginfo.baseInfo.finalMessage.append(str);
1149 }break;
1150
1151 case eoerror_value_SYS_dispatcherfifooverflow:
1152 {
1153 snprintf(str, sizeof(str), " %s Number of lost items is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1154 m_dnginfo.baseInfo.finalMessage.append(str);
1155 }break;
1156
1157 case eoerror_value_SYS_canservices_txfifooverflow:
1158 {
1159 snprintf(str, sizeof(str), " %s CanPort=%s Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
1161 m_dnginfo.baseInfo.finalMessage.append(str);
1162 }break;
1163
1164 case eoerror_value_SYS_canservices_txbusfailure:
1165 {
1166 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));
1167 m_dnginfo.baseInfo.finalMessage.append(str);
1168 }break;
1169
1170 case eoerror_value_SYS_canservices_formingfailure:
1171 {
1172 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));
1173 m_dnginfo.baseInfo.finalMessage.append(str);
1174 }break;
1175
1176 case eoerror_value_SYS_canservices_parsingfailure:
1177 {
1178 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));
1179 m_dnginfo.baseInfo.finalMessage.append(str);
1180 }break;
1181
1182 case eoerror_value_SYS_canservices_genericerror:
1183 {
1184 snprintf(str, sizeof(str), " %s error code is %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1185 m_dnginfo.baseInfo.finalMessage.append(str);
1186
1187 }break;
1188
1189 case eoerror_value_SYS_ctrloop_rxphasemin:
1190 case eoerror_value_SYS_ctrloop_dophasemin:
1191 case eoerror_value_SYS_ctrloop_txphasemin:
1192 case eoerror_value_SYS_ctrloop_rxphaseaverage:
1193 case eoerror_value_SYS_ctrloop_dophaseaverage:
1194 case eoerror_value_SYS_ctrloop_txphaseaverage:
1195 case eoerror_value_SYS_ctrloop_rxphasemax:
1196 case eoerror_value_SYS_ctrloop_dophasemax:
1197 case eoerror_value_SYS_ctrloop_txphasemax:
1198 {
1199 snprintf(str, sizeof(str), " %s, monitored over %f sec is %d microsec", m_dnginfo.baseMessage.c_str(),
1200 0.01*static_cast<float>(m_dnginfo.param64 & 0xffff),
1202 );
1203 m_dnginfo.baseInfo.finalMessage.append(str);
1204 } break;
1205
1206 case eoerror_value_SYS_exec_time_stats:
1207 {
1208 static constexpr const char * const names[5] = { "runner.RX()", "runner.DO()", "runner.TX()", "runner.RXDOTX()", "other.ID = " };
1209 std::string actor = {};
1210 if(m_dnginfo.param16 <= 3)
1211 {
1212 actor = names[m_dnginfo.param16];
1213 }
1214 else
1215 {
1216 actor = names[4] + std::to_string(m_dnginfo.param16);
1217 }
1218
1219 snprintf(str, sizeof(str), " %s: %s -> (%d, %d, %d) us over %f sec",
1220 m_dnginfo.baseMessage.c_str(),
1221 actor.c_str(),
1222 static_cast<uint16_t>((m_dnginfo.param64 >> 48) & 0xffff), // min
1223 static_cast<uint16_t>((m_dnginfo.param64 >> 32) & 0xffff), // average
1224 static_cast<uint16_t>((m_dnginfo.param64 >> 16) & 0xffff), // max
1225 0.01*static_cast<float>(m_dnginfo.param64 & 0xffff) // period
1226 );
1227 m_dnginfo.baseInfo.finalMessage.append(str);
1228 } break;
1229
1230 case eoerror_value_SYS_ctrloop_execoverflowPERIOD:
1231 {
1232 uint16_t budget = m_dnginfo.param16;
1233 uint16_t current = static_cast<uint16_t>((m_dnginfo.param64 >> 48) & 0xffff);
1234 uint16_t rxt = static_cast<uint16_t>((m_dnginfo.param64 >> 32) & 0xffff);
1235 uint16_t dot = static_cast<uint16_t>((m_dnginfo.param64 >> 16) & 0xffff);
1236 uint16_t txt = static_cast<uint16_t>((m_dnginfo.param64 ) & 0xffff);
1237
1238 snprintf(str, sizeof(str), " %s: RXDOTX cycle budget = %d us, RXDOTX exec time = %d us, (rx, do, tx) = (%d, %d, %d) us",
1239 m_dnginfo.baseMessage.c_str(),
1240 budget,
1241 current,
1242 rxt, dot, txt
1243 );
1244 m_dnginfo.baseInfo.finalMessage.append(str);
1245 } break;
1246
1247 case eoerror_value_SYS_ctrloop_histogramPERIOD:
1248 {
1249 uint16_t w = m_dnginfo.param16;
1250 float v[8] = {0};
1251 for(uint8_t i=0; i<8; i++)
1252 {
1253 uint64_t x = (m_dnginfo.param64 >> (8*i)) & 0xff;
1254 v[i] = static_cast<float>(x)/255.0;
1255 }
1256
1257 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",
1258 m_dnginfo.baseMessage.c_str(),
1259 w, 7.0*w,
1260 v[0], v[1], v[2], v[3], v[4], v[5], v[6],
1261 v[7]
1262 );
1263 m_dnginfo.baseInfo.finalMessage.append(str);
1264 } break;
1265
1266 case eoerror_value_SYS_proxy_forward_fails:
1267 {
1268 snprintf(str, sizeof(str), " %s. ROP.sign=%d, ROP.id=%d. Proxy list capacity is %d, size is %d ",
1269 m_dnginfo.baseMessage.c_str(),
1270 (int32_t)((m_dnginfo.param64&0xffffffff00000000)>>32),
1271 (int32_t)(m_dnginfo.param64&0x00000000ffffffff),
1272 ((m_dnginfo.param16&0xff00)>>8), (m_dnginfo.param16&0x00ff));
1273 m_dnginfo.baseInfo.finalMessage.append(str);
1274
1275 }break;
1276
1277 case eoerror_value_SYS_proxy_ropdes_notfound:
1278 {
1279 snprintf(str, sizeof(str), " %s ROP.id=%d ", m_dnginfo.baseMessage.c_str(), (int32_t)(m_dnginfo.param64&0x00000000ffffffff));
1280 m_dnginfo.baseInfo.finalMessage.append(str);
1281
1282 }break;
1283
1284 case eoerror_value_SYS_canservices_canprint:
1285 {
1286 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 );
1287 m_dnginfo.baseInfo.finalMessage.append(str);
1288 }break;
1289
1290 case eoerror_value_SYS_canservices_rxmaisbug:
1291 {
1292 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 );
1293 m_dnginfo.baseInfo.finalMessage.append(str);
1294 }break;
1295
1296 case eoerror_value_SYS_canservices_rxfromwrongboard:
1297 {
1298 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 );
1299 m_dnginfo.baseInfo.finalMessage.append(str);
1300 }break;
1301
1302 case eoerror_value_SYS_transceiver_rxseqnumber_error:
1303 {
1304 int16_t receivedNum = m_dnginfo.param64+ m_dnginfo.param16;
1305 snprintf(str, sizeof(str), " %s Expected number is %ld, received number is %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param64, receivedNum);
1306 m_dnginfo.baseInfo.finalMessage.append(str);
1307 }break;
1308
1309 case eoerror_value_SYS_transceiver_rxseqnumber_restarted:
1310 {
1311 snprintf(str, sizeof(str), " %s Expected number is %ld", m_dnginfo.baseMessage.c_str(), m_dnginfo.param64);
1312 m_dnginfo.baseInfo.finalMessage.append(str);
1313 }break;
1314
1315 case eoerror_value_SYS_canservices_board_detected:
1316 {
1317 //in param64 the fw copies the struct eObrd_typeandversions_t defined in EoBoards.h in icub=firmware repo
1334 //TODO:
1335 //checking the fw it seems this error code is no longer used.
1336 //So I cannot retrieve the board type.
1337 //For now I leave the code. When I'm sure that it is old, I'll remove it
1338 int fw_build = (m_dnginfo.param64 & 0x00000000000000ff);
1339 int fw_major = (m_dnginfo.param64 & 0x000000000000ff00) >> 8;
1340 int fw_minor = (m_dnginfo.param64 & 0x0000000000ff0000) >> 16;
1341 int proto_major = (m_dnginfo.param64 & 0x00000000ff000000) >> 24;
1342 int proto_minor = (m_dnginfo.param64 & 0x000000ff00000000) >> 32;
1343
1344 //used in comm-v1 protocol
1345 // eObrd_typeandversions_t *brd_info_ptr = (eObrd_typeandversions_t *)&m_dnginfo.param64;
1346 // int fw_build = brd_info_ptr->firmwarebuildnumber;
1347 // int fw_major = brd_info_ptr->firmwareversion.major;
1348 // int fw_minor = brd_info_ptr->firmwareversion.minor;
1349 // int proto_major =brd_info_ptr->protocolversion.major;
1350 // int proto_minor =brd_info_ptr->protocolversion.minor;
1351
1352 // eObrd_type_t general_brd_type = eoboards_cantype2type((eObrd_cantype_t )brd_info_ptr->boardtype);
1353
1354 // std::string board_type_str = eoboards_type2string(general_brd_type);
1355
1356 snprintf(str, sizeof(str), " %s on CAN port=%s with address %d. Fw ver is %d.%d.%d. Proto ver is %d.%d",
1358 fw_build, fw_major, fw_minor, proto_major, proto_minor );
1359 m_dnginfo.baseInfo.finalMessage.append(str);
1360 }break;
1361
1362 case eoerror_value_SYS_canservices_board_wrongprotversion:
1363 {
1364 //in param64 the fw copies the struct eObrd_typeandversions_t defined in EoBoards.h in icub=firmware repo
1381 //as above
1382 int fw_build = (m_dnginfo.param64 & 0x00000000000000ff);
1383 int fw_major = (m_dnginfo.param64 & 0x000000000000ff00) >> 8;
1384 int fw_minor = (m_dnginfo.param64 & 0x0000000000ff0000) >> 16;
1385 int proto_major = (m_dnginfo.param64 & 0x00000000ff000000) >> 24;
1386 int proto_minor = (m_dnginfo.param64 & 0x000000ff00000000) >> 32;
1387 int req_proto_major = (m_dnginfo.param16 & 0xff00) >>8;
1388 int req_proto_minor = (m_dnginfo.param16 & 0x00ff);
1389
1390
1391 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",
1393 fw_build, fw_major, fw_minor, proto_major, proto_minor, req_proto_major, req_proto_minor );
1394 m_dnginfo.baseInfo.finalMessage.append(str);
1395 }break;
1396
1397 case eoerror_value_SYS_canservices_board_notfound:
1398 {
1399 eObrd_type_t general_brd_type = eoboards_cantype2type((eObrd_cantype_t)m_dnginfo.param16);
1400 snprintf(str, sizeof(str), " %s The board is on CAN port=%s with address %d. Board type is %s.",
1402 m_dnginfo.baseInfo.sourceCANBoardAddr, eoboards_type2string(general_brd_type));
1403 m_dnginfo.baseInfo.finalMessage.append(str);
1404
1405 }break;
1406
1407 case eoerror_value_SYS_canservices_boards_lostcontact:
1408 {
1409 eOmn_serv_category_t serv_category;
1410 diagstr lostCanBoards1 = {0};
1411 diagstr lostCanBoards2 = {0};
1412 getCanMonitorInfo(serv_category, lostCanBoards1, lostCanBoards2);
1413
1414 snprintf(str, sizeof(str), "%s Type of service category is %s. Lost can boards on (can1map, can2map) = ([ %s ], [ %s ] ).",
1415 m_dnginfo.baseMessage.c_str(),
1416 eomn_servicecategory2string(serv_category),
1417 lostCanBoards1, lostCanBoards2
1418 );
1419
1420 m_dnginfo.baseInfo.finalMessage.append(str);
1421
1422 } break;
1423
1424 case eoerror_value_SYS_canservices_boards_retrievedcontact:
1425 {
1426 eOmn_serv_category_t serv_category;
1427 diagstr retrievedCanBoards1 = {0};
1428 diagstr retrievedCanBoards2 = {0};
1429 getCanMonitorInfo(serv_category, retrievedCanBoards1, retrievedCanBoards2);
1430
1431 snprintf(str, sizeof(str), "%s Type of service category is %s. Retrieved can boards on (can1map, can2map) = ([ %s ], [ %s ] ).",
1432 m_dnginfo.baseMessage.c_str(),
1433 eomn_servicecategory2string(serv_category),
1434 retrievedCanBoards1, retrievedCanBoards2
1435 );
1436
1437 m_dnginfo.baseInfo.finalMessage.append(str);
1438
1439 } break;
1440
1441 case eoerror_value_SYS_canservices_monitor_regularcontact:
1442 {
1443 eOmn_serv_category_t serv_category;
1444 diagstr foundCanBoards1 = {0};
1445 diagstr foundCanBoards2 = {0};
1446 getCanMonitorInfo(serv_category, foundCanBoards1, foundCanBoards2);
1447
1448 snprintf(str, sizeof(str), "%s Type of service category is %s. CAN boards are on (can1map, can2map) = ([ %s ], [ %s ])",
1449 m_dnginfo.baseMessage.c_str(),
1450 eomn_servicecategory2string(serv_category),
1451 foundCanBoards1,
1452 foundCanBoards2
1453 );
1454 m_dnginfo.baseInfo.finalMessage.append(str);
1455 } break;
1456
1457 case eoerror_value_SYS_canservices_monitor_lostcontact:
1458 {
1459 eOmn_serv_category_t serv_category;
1460 diagstr lostCanBoards1 = {0};
1461 diagstr lostCanBoards2 = {0};
1462 getCanMonitorInfo(serv_category, lostCanBoards1, lostCanBoards2);
1463
1464 snprintf(str, sizeof(str), "%s Type of service category is %s. Lost CAN boards are on (can1map, can2map) = ([ %s ], [ %s ]).",
1465 m_dnginfo.baseMessage.c_str(),
1466 eomn_servicecategory2string(serv_category),
1467 lostCanBoards1,
1468 lostCanBoards2
1469 );
1470 m_dnginfo.baseInfo.finalMessage.append(str);
1471 } break;
1472
1473 case eoerror_value_SYS_canservices_monitor_retrievedcontact:
1474 {
1475 eOmn_serv_category_t serv_category;
1476 uint32_t totRetrvTime;
1477 diagstr retrievedCanBoards1 = {0};
1478 diagstr retrievedCanBoards2 = {0};
1479 getCanMonitorInfoWithTime(serv_category, retrievedCanBoards1, retrievedCanBoards2, totRetrvTime);
1480
1481
1482 snprintf(str, sizeof(str), "%s Type of service category is %s. CAN boards are on (can1map, can2map) = ([ %s ], [ %s ]). Total retrieving time: %d [ms]",
1483 m_dnginfo.baseMessage.c_str(),
1484 eomn_servicecategory2string(serv_category),
1485 retrievedCanBoards1,
1486 retrievedCanBoards2,
1487 totRetrvTime
1488 );
1489 m_dnginfo.baseInfo.finalMessage.append(str);
1490 } break;
1491
1492
1493 case eoerror_value_SYS_canservices_monitor_stillnocontact:
1494 {
1495 eOmn_serv_category_t serv_category;
1496 uint32_t totDisappTime;
1497 diagstr lostCanBoards1 = {0};
1498 diagstr lostCanBoards2 = {0};
1499 getCanMonitorInfoWithTime(serv_category, lostCanBoards1, lostCanBoards2, totDisappTime);
1500
1501 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]",
1502 m_dnginfo.baseMessage.c_str(),
1503 eomn_servicecategory2string(serv_category),
1504 lostCanBoards1,
1505 lostCanBoards2,
1506 totDisappTime
1507 );
1508 m_dnginfo.baseInfo.finalMessage.append(str);
1509 } break;
1510
1511
1512 case eoerror_value_SYS_unspecified:
1513 case eoerror_value_SYS_tobedecided:
1514 case eoerror_value_SYS_memory_zerorequested:
1515 case eoerror_value_SYS_memory_notinitialised:
1516 case eoerror_value_SYS_memory_missing:
1517 case eoerror_value_SYS_mutex_timeout:
1518 case eoerror_value_SYS_wrongparam:
1519 case eoerror_value_SYS_wrongusage:
1520 case eoerror_value_SYS_runtimeerror:
1521 case eoerror_value_SYS_runninginfatalerrorstate:
1522 case eoerror_value_SYS_udptxfailure:
1523 case eoerror_value_SYS_configurator_udptxfailure:
1524 case eoerror_value_SYS_runner_udptxfailure:
1525 case eoerror_value_SYS_runner_transceivererror:
1526 case eoerror_value_SYS_canservices_rxfifooverflow:
1527 case eoerror_value_SYS_proxy_forward_ok:
1528 case eoerror_value_SYS_proxy_forward_callback_fails:
1529 case eoerror_value_SYS_proxy_reply_ok:
1530 case eoerror_value_SYS_proxy_reply_fails:
1531 case eoerror_value_SYS_canservices_boards_missing:
1532 case eoerror_value_SYS_canservices_boards_searched:
1533 case eoerror_value_SYS_canservices_boards_found:
1534 case eoerror_value_SYS_transceiver_rxinvalidframe_error:
1535 {
1536 printBaseInfo();
1537 } break;
1538
1539
1540 case EOERROR_VALUE_DUMMY:
1541 {
1542 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1543
1544
1545 } break;
1546
1547 default:
1548 {
1550
1551 }
1552
1553 }//end switch
1554
1555
1556
1557}
1558
1559
1560
1561
1562
1563
1564/**************************************************************************************************************************/
1565/****************************************** EthMonitorParser *****************************************/
1566/**************************************************************************************************************************/
1567
1568
1569
1570EthMonitorParser::EthMonitorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
1571
1573{
1574 char str[512] = {0};
1575 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
1577
1578 switch(value)
1579 {
1580
1581 case eoerror_value_ETHMON_link_goes_up:
1582 case eoerror_value_ETHMON_link_goes_down:
1583 case eoerror_value_ETHMON_error_rxcrc:
1584 {
1585 std::string appstate = "unknown";
1586 switch(m_dnginfo.param64&0xff00000000000000)
1587 {
1588 case 0: appstate="N/A"; break;
1589 case 1: appstate="idle"; break;
1590 case 3: appstate="running"; break;
1591 };
1592
1593 std::string ethport = "unknown";
1594 switch(m_dnginfo.param16)
1595 {
1596 case 0: ethport="ETH input (P2/P13/J4/J6)"; break;
1597 case 1: ethport="ETH output (P3/P12/J5/J7)"; break;
1598 case 2: ethport="internal"; break;
1599 };
1600 if(eoerror_value_ETHMON_error_rxcrc == value)
1601 snprintf(str, sizeof(str), " %s in port %s. Application state is %s. Number of erros is %ld",
1602 m_dnginfo.baseMessage.c_str(), ethport.c_str(), appstate.c_str(), (m_dnginfo.param64&0xffffffff));
1603 else
1604 snprintf(str, sizeof(str), " %s in port %s. Application state is %s.", m_dnginfo.baseMessage.c_str(), ethport.c_str(), appstate.c_str());
1605
1606 m_dnginfo.baseInfo.finalMessage.append(str);
1607 }break;
1608
1609 case eoerror_value_ETHMON_txseqnumbermissing:
1610 {
1611 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);
1612 m_dnginfo.baseInfo.finalMessage.append(str);
1613 }break;
1614
1615
1616 case eoerror_value_ETHMON_juststarted:
1617 case eoerror_value_ETHMON_justverified:
1618 {
1619 printBaseInfo();
1620 } break;
1621
1622
1623 case EOERROR_VALUE_DUMMY:
1624 {
1625 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1626
1627
1628 } break;
1629
1630 default:
1631 {
1633
1634 }
1635
1636 }//end switch
1637}
1638
1639
1640/**************************************************************************************************************************/
1641/****************************************** InertialSensorParser ********************************************/
1642/**************************************************************************************************************************/
1643
1644InertialSensorParser::InertialSensorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
1645
1647{
1648 char str[512] = {0};
1649 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
1651
1652 switch(value)
1653 {
1654
1655 case eoerror_value_IS_arrayofinertialdataoverflow:
1656 {
1657
1658 uint8_t frame_id = m_dnginfo.param16 & 0x0fff;
1659 uint8_t frame_size = (m_dnginfo.param16 & 0xf000) >> 12;
1660 uint64_t frame_data = m_dnginfo.param64;
1661
1662 snprintf(str, sizeof(str), " %s. Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
1663 m_dnginfo.baseMessage.c_str(), frame_id, frame_size, frame_data
1664 );
1665 m_dnginfo.baseInfo.finalMessage.append(str);
1666 } break;
1667
1668 case eoerror_value_IS_unknownsensor:
1669 {
1670 printBaseInfo();
1671 } break;
1672
1673
1674 case EOERROR_VALUE_DUMMY:
1675 {
1676 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1677
1678
1679 } break;
1680
1681 default:
1682 {
1684
1685 }
1686
1687 }//end switch
1688}
1689
1690/**************************************************************************************************************************/
1691/****************************************** AnalogSensorParser **********************************************/
1692/**************************************************************************************************************************/
1693
1694AnalogSensorParser::AnalogSensorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
1696{
1697 char str[512] = {0};
1698 eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
1700
1701 switch(value)
1702 {
1703
1704 case eoerror_value_AS_arrayoftemperaturedataoverflow:
1705 {
1706
1707 uint8_t frame_id = m_dnginfo.param16 & 0x00ff;
1708 uint8_t frame_size = (m_dnginfo.param16 & 0xf000) >> 12;
1709 uint64_t frame_data = m_dnginfo.param64;
1710
1711 snprintf(str, sizeof(str), " %s. Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
1712 m_dnginfo.baseMessage.c_str(), frame_id, frame_size, frame_data
1713 );
1714 m_dnginfo.baseInfo.finalMessage.append(str);
1715 } break;
1716
1717 case eoerror_value_AS_unknownsensor:
1718 {
1719 printBaseInfo();
1720 } break;
1721
1722
1723 case EOERROR_VALUE_DUMMY:
1724 {
1725 m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1726
1727
1728 } break;
1729
1730 default:
1731 {
1733
1734 }
1735
1736 }//end switch
1737}
1738
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