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