iCub-main
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 
14 
15 using namespace Diagnostic::LowLevel;
16 
17 
18 
19 
20 /**************************************************************************************************************************/
21 /****************************************** DefaultParser ***************************************************/
22 /**************************************************************************************************************************/
23 DefaultParser::DefaultParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):m_dnginfo(dnginfo), m_entityNameProvider(entityNameProvider){;}
24 
26 {
27  char str[512] = {0};
28  uint8_t *p64 = (uint8_t*)&(m_dnginfo.param64);
29  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",
34  p64[7], p64[6], p64[5], p64[4], p64[3], p64[2], p64[1], p64[0],
35  eoerror_code2string(m_dnginfo.errorCode),
36  eoerror_code2rulesstring(m_dnginfo.errorCode),
37  m_dnginfo.extraMessage.c_str()
38  );
40  m_dnginfo.baseInfo.finalMessage.append(str);
41 
42 }
43 
45 {
46  char str[512] = {0};
47  snprintf(str, sizeof(str), "%s", m_dnginfo.baseMessage.c_str());
48  m_dnginfo.baseInfo.finalMessage.append(str);
49 }
50 
51 /**************************************************************************************************************************/
52 /****************************************** ConfigParser ***************************************************/
53 /**************************************************************************************************************************/
54 
55 ConfigParser::ConfigParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
56 
58 {
59  char str[512] = {0};
60  eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
61 
63 
64  switch(value)
65  {
66 
67  case eoerror_value_CFG_candiscovery_started:
68  {
69  uint16_t maskcan2 = m_dnginfo.param16;
70  eObrd_type_t brdnum = static_cast<eObrd_type_t>((m_dnginfo.param64 & 0x0000ff0000000000) >> 40);
71  const char *canboardname = eoboards_type2string(brdnum);
72  uint16_t maskcan1 = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
73  eObrd_protocolversion_t prot = {0};
74  eObrd_firmwareversion_t appl = {0};
75  uint64_t reqpr = (m_dnginfo.param64 & 0x000000ffff000000) >> 24;
76  uint64_t reqfw = (m_dnginfo.param64 & 0x0000000000ffffff);
77  uint8_t num =0;
78  prot.major = reqpr >> 8;
79  prot.minor = reqpr & 0xff;
80  appl.major = (reqfw >> 16) & 0xff;
81  appl.minor = (reqfw >> 8) & 0xff;
82  appl.build = reqfw & 0xff;
83  num = eo_common_hlfword_bitsetcount(maskcan1)+eo_common_hlfword_bitsetcount(maskcan2);
84 
85  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.",
86  m_dnginfo.baseMessage.c_str(),
87  num, canboardname,
88  maskcan1, maskcan2,
89  prot.major, prot.minor,
90  appl.major, appl.minor, appl.build
91  );
92  m_dnginfo.baseInfo.finalMessage.append(str);
93  } break;
94 
95  case eoerror_value_CFG_candiscovery_ok:
96  {
97  uint8_t num = m_dnginfo.param16 & 0x00ff;
98  eObool_t fakesearch = (0x0000 == (m_dnginfo.param16 & 0xf000)) ? (eobool_false) : (eobool_true);
99  uint64_t brdnum = (m_dnginfo.param64 & 0x0000ff0000000000) >> 40;
100  const char *canboardname = eoboards_type2string(static_cast<eObrd_type_t>(brdnum));
101  uint64_t searchtime = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
102  eObrd_protocolversion_t prot = {0};
103  eObrd_firmwareversion_t appl = {0};
104  uint64_t reqpr = (m_dnginfo.param64 & 0x000000ffff000000) >> 24;
105  uint64_t reqfw = (m_dnginfo.param64 & 0x0000000000ffffff);
106  char strOK[80] = "OK";
107 
108  prot.major = reqpr >> 8;
109  prot.minor = reqpr & 0xff;
110  appl.major = (reqfw >> 16) & 0xff;
111  appl.minor = (reqfw >> 8) & 0xff;
112  appl.build = reqfw & 0xff;
113 
114 
115  if(eobool_true == fakesearch)
116  {
117  snprintf(strOK, sizeof(strOK), "OK but FAKE (without any control on CAN w/ get-fw-version<> message)");
118  }
119 
120  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",
121  m_dnginfo.baseMessage.c_str(),
122  strOK,
123  num, canboardname,
124  prot.major, prot.minor,
125  appl.major, appl.minor, appl.build,
126  (int)searchtime
127  );
128  m_dnginfo.baseInfo.finalMessage.append(str);
129  } break;
130 
131  case eoerror_value_CFG_candiscovery_detectedboard:
132  {
133  uint64_t brdnum = (m_dnginfo.param64 & 0x0000ff0000000000) >> 40;
134  const char *canboardname = eoboards_type2string(static_cast<eObrd_type_t>(brdnum));
135  uint64_t searchtime = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
136  eObrd_protocolversion_t prot = {0};
137  eObrd_firmwareversion_t appl = {0};
138  uint64_t reqpr = (m_dnginfo.param64 & 0x000000ffff000000) >> 24;
139  uint64_t reqfw = (m_dnginfo.param64 & 0x0000000000ffffff);
140  uint8_t address;
141  prot.major = reqpr >> 8;
142  prot.minor = reqpr & 0xff;
143  appl.major = (reqfw >> 16) & 0xff;
144  appl.minor = (reqfw >> 8) & 0xff;
145  appl.build = reqfw & 0xff;
146  address = m_dnginfo.param16 & 0x000f;
147 
148 
149  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",
150  m_dnginfo.baseMessage.c_str(),
151  canboardname,
152  m_dnginfo.baseInfo.sourceCANPortStr.c_str(), address,
153  prot.major, prot.minor,
154  appl.major, appl.minor, appl.build,
155  (int)searchtime
156  );
157  m_dnginfo.baseInfo.finalMessage.append(str);
158  } break;
159 
160  case eoerror_value_CFG_candiscovery_boardsmissing:
161  {
162  uint8_t numofmissing = m_dnginfo.param16 & 0x00ff;
163  const char *canboardname = eoboards_type2string(static_cast<eObrd_type_t>((m_dnginfo.param16 >> 8)));
164  uint64_t searchtime = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
165  uint16_t maskofmissing = m_dnginfo.param64 & 0x000000000000ffff;
166 
167  uint8_t n = 1;
168  uint8_t i = 0;
169 
170  snprintf(str, sizeof(str), "%s %d missing %s boards for %d ms in %s:",
171  m_dnginfo.baseMessage.c_str(),
172  numofmissing,
173  canboardname,
174  (int)searchtime,
176  );
177  m_dnginfo.baseInfo.finalMessage.append(str);
178  for(i=1; i<15; i++)
179  {
180  if(eobool_true == eo_common_hlfword_bitcheck(maskofmissing, i))
181  {
182  snprintf(str, sizeof(str), "%d of %d: missing %s BOARD %s:%s:%d",
183  n, numofmissing, canboardname,
185  );
186  m_dnginfo.baseInfo.finalMessage.append(str);
187  n++;
188 
189  }
190  }
191 
192  } break;
193 
194  case eoerror_value_CFG_candiscovery_boardsinvalid:
195  {
196  uint8_t numofinvalid = m_dnginfo.param16 & 0x00ff;
197  const char *canboardname = eoboards_type2string(static_cast<eObrd_type_t>(m_dnginfo.param16 >> 8));
198  uint64_t invalidmask = m_dnginfo.param64;
199  uint8_t n = 1;
200  uint8_t i = 0;
201  const char *empty = "";
202  const char *wrongtype = "WRONG BOARD TYPE";
203  const char *wrongprot = "WRONG PROTOCOL VERSION";
204  const char *wrongappl = "WRONG APPLICATION VERSION";
205 
206  snprintf(str, sizeof(str), "%s %d invalid %s boards in %s:\n",
207  m_dnginfo.baseMessage.c_str(),
208  numofinvalid,
209  canboardname,
211  );
212  m_dnginfo.baseInfo.finalMessage.append(str);
213 
214  for(int i=1; i<15; i++)
215  {
216  uint64_t val = (invalidmask >> (4*i)) & 0x0f;
217  if(0 != val)
218  {
219  snprintf(str, sizeof(str), "\t %d of %d: wrong %s because it has: %s%s%s \n",
220  n, numofinvalid, canboardname,
221  ((val & 0x1) == 0x1) ? (wrongtype) : (empty),
222  ((val & 0x2) == 0x2) ? (wrongappl) : (empty),
223  ((val & 0x4) == 0x4) ? (wrongprot) : (empty)
224  );
225 
226  m_dnginfo.baseInfo.finalMessage.append(str);
227  n++;
228 
229  }
230  }
231 
232  } break;
233 
234  case eoerror_value_CFG_skin_ok:
235  {
236  uint16_t maskcan1 = (m_dnginfo.param64 & 0x0000ffff00000000) >> 32;
237  uint16_t maskcan2 = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
238  eObrd_protocolversion_t prot = {0};
239  eObrd_firmwareversion_t appl = {0};
240  uint64_t reqpr = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
241  uint64_t reqfw = (m_dnginfo.param64 & 0x000000000000ffff);
242  prot.major = reqpr >> 8;
243  prot.minor = reqpr & 0xff;
244  appl.major = (reqfw >> 8) & 0xff;
245  appl.minor = reqfw & 0xff;
246  uint16_t numOfpatches = m_dnginfo.param16;
247 
248  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",
249  m_dnginfo.baseMessage.c_str(),
250  numOfpatches,
251  maskcan1, maskcan2,
252  prot.major, prot.minor,
253  appl.major, appl.minor
254  );
255  m_dnginfo.baseInfo.finalMessage.append(str);
256  } break;
257 
258  case eoerror_value_CFG_skin_failed_toomanyboards:
259  case eoerror_value_CFG_inertials3_failed_toomanyboards:
260  case eoerror_value_CFG_temperatures_failed_toomanyboards:
261  {
262  uint8_t numOfReqBoards = (m_dnginfo.param16 & 0xff00) >> 8;
263  uint8_t numOfMaxBoards = m_dnginfo.param16 & 0x00ff;
264 
265  uint16_t maskcan1 = (m_dnginfo.param64 & 0x000000000000ffff);
266  uint16_t maskcan2 = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
267 
268  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)",
269  m_dnginfo.baseMessage.c_str(),
270  numOfReqBoards, numOfMaxBoards,
271  maskcan1, maskcan2
272  );
273  m_dnginfo.baseInfo.finalMessage.append(str);
274  } break;
275 
276  case eoerror_value_CFG_skin_failed_candiscovery:
277  case eoerror_value_CFG_inertials3_failed_candiscovery:
278  case eoerror_value_CFG_temperatures_failed_candiscovery:
279  {
280  uint16_t incompMaskcan2 = (m_dnginfo.param64 & 0xffff000000000000) >> 48;
281  uint16_t incompMaskcan1 = (m_dnginfo.param64 & 0x0000ffff00000000) >> 32;
282  uint16_t missMaskcan2 = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
283  uint16_t missMaskcan1 = (m_dnginfo.param64 & 0x000000000000ffff);
284  uint16_t numOfPatches = m_dnginfo.param16;
285 
286  if (eoerror_value_CFG_skin_failed_candiscovery == value)
287  {
288  snprintf(str, sizeof(str), "%s for %d skin patches. ", m_dnginfo.baseMessage.c_str(), numOfPatches);
289  m_dnginfo.baseInfo.finalMessage.append(str);
290  }
291  else
292  {
293  snprintf(str, sizeof(str), "%s. ", m_dnginfo.baseMessage.c_str());
294  m_dnginfo.baseInfo.finalMessage.append(str);
295  }
296 
297  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)",
298  missMaskcan1, missMaskcan2,
299  incompMaskcan1, incompMaskcan2
300  );
301 
302  m_dnginfo.baseInfo.finalMessage.append(str);
303  } break;
304 
305  case eoerror_value_CFG_strain_ok:
306  case eoerror_value_CFG_strain_failed_candiscovery:
307  {
308  eObrd_protocolversion_t prot = {0};
309  eObrd_firmwareversion_t appl = {0};
310  uint64_t reqpr = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
311  uint64_t reqfw = (m_dnginfo.param64 & 0x000000000000ffff);
312  prot.major = reqpr >> 8;
313  prot.minor = reqpr & 0xff;
314  appl.major = (reqfw >> 8) & 0xff;
315  appl.minor = reqfw & 0xff;
316  uint8_t strain = (m_dnginfo.param64 & 0x0000000f00000000) >> 20;
317  uint8_t address = m_dnginfo.param16 & 0x00ff;
318  uint8_t port = m_dnginfo.param16 >> 8;
319 
320  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",
321  m_dnginfo.baseMessage.c_str(),
322  address, port,
323  prot.major, prot.minor,
324  appl.major, appl.minor,
325  strain
326  );
327  m_dnginfo.baseInfo.finalMessage.append(str);
328  } break;
329 
330  case eoerror_value_CFG_mais_ok:
331  case eoerror_value_CFG_mais_failed_candiscovery:
332  case eoerror_value_CFG_psc_ok:
333  case eoerror_value_CFG_psc_failed_candiscovery:
334  case eoerror_value_CFG_pos_ok:
335  case eoerror_value_CFG_pos_failed_candiscovery:
336  {
337  eObrd_protocolversion_t prot = {0};
338  eObrd_firmwareversion_t appl = {0};
339  uint64_t reqpr = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
340  uint64_t reqfw = (m_dnginfo.param64 & 0x000000000000ffff);
341  prot.major = reqpr >> 8;
342  prot.minor = reqpr & 0xff;
343  appl.major = (reqfw >> 8) & 0xff;
344  appl.minor = reqfw & 0xff;
345  uint8_t address = m_dnginfo.param16 & 0x00ff;
346  uint8_t port = m_dnginfo.param16 >> 8;
347 
348  snprintf(str, sizeof(str), "%s on board at addr: %d and port:%d with can protocol ver %d.%d and application ver %d.%d.",
349  m_dnginfo.baseMessage.c_str(),
350  address,
351  port,
352  prot.major, prot.minor,
353  appl.major, appl.minor
354  );
355  m_dnginfo.baseInfo.finalMessage.append(str);
356  } break;
357 
358  case eoerror_value_CFG_mais_failed_verify_because_active:
359  case eoerror_value_CFG_mc_foc_ok:
360  case eoerror_value_CFG_mc_foc_failed_candiscovery_of_foc:
361  case eoerror_value_CFG_mc_foc_failed_encoders_verify:
362  case eoerror_value_CFG_mc_mc4_ok:
363  case eoerror_value_CFG_mc_mc4_failed_candiscovery_of_mc4:
364  case eoerror_value_CFG_mc_mc4_failed_mais_verify:
365  case eoerror_value_CFG_mc_mc4plus_ok:
366  case eoerror_value_CFG_mc_mc4plus_failed_encoders_verify:
367  case eoerror_value_CFG_comm_cannotloadaregularrop:
368  case eoerror_value_CFG_mc_mc4plusmais_ok:
369  case eoerror_value_CFG_mc_mc4plusmais_failed_encoders_verify:
370  case eoerror_value_CFG_mc_mc4plusmais_failed_candiscovery_of_mais:
371  case eoerror_value_CFG_services_not_verified_yet:
372  case eoerror_value_CFG_mc_not_verified_yet:
373  case eoerror_value_CFG_strain_not_verified_yet:
374  case eoerror_value_CFG_mais_not_verified_yet:
375  case eoerror_value_CFG_skin_not_verified_yet:
376  case eoerror_value_CFG_inertials3_not_verified_yet:
377  case eoerror_value_CFG_encoders_not_verified_yet:
378  case eoerror_value_CFG_mc_using_onboard_config:
379  case eoerror_value_CFG_strain_using_onboard_config:
380  case eoerror_value_CFG_mais_using_onboard_config:
381  case eoerror_value_CFG_inertials3_using_onboard_config:
382  case eoerror_value_CFG_skin_using_onboard_config:
383  case eoerror_value_CFG_inertials3_ok:
384  case eoerror_value_CFG_temperatures_not_verified_yet:
385  case eoerror_value_CFG_temperatures_ok:
386  case eoerror_value_CFG_temperatures_using_onboard_config:
387  case eoerror_value_CFG_psc_failed_verify_because_active:
388  case eoerror_value_CFG_psc_not_verified_yet:
389  case eoerror_value_CFG_psc_using_onboard_config:
390  case eoerror_value_CFG_mc_mc2pluspsc_ok:
391  case eoerror_value_CFG_mc_mc2pluspsc_failed_encoders_verify:
392  case eoerror_value_CFG_mc_mc2pluspsc_failed_candiscovery_of_pscs:
393  case eoerror_value_CFG_inertials3_failed_notsupported:
394  case eoerror_value_CFG_temperatures_failed_notsupported:
395  case eoerror_value_CFG_mais_failed_notsupported:
396  case eoerror_value_CFG_strain_failed_notsupported:
397  case eoerror_value_CFG_skin_failed_notsupported:
398  case eoerror_value_CFG_psc_failed_notsupported:
399  case eoerror_value_CFG_mc_failed_notsupported:
400  case eoerror_value_CFG_encoders_failed_notsupported:
401  case eoerror_value_CFG_pos_not_verified_yet:
402  case eoerror_value_CFG_pos_using_onboard_config:
403  case eoerror_value_CFG_pos_failed_notsupported:
404  case eoerror_value_CFG_mc_mc4plusfaps_ok:
405  case eoerror_value_CFG_mc_mc4plusfaps_failed_encoders_verify:
406  case eoerror_value_CFG_mc_mc4plusfaps_failed_candiscovery:
407  case eoerror_value_CFG_mc_mc4pluspmc_ok:
408  case eoerror_value_CFG_mc_mc4pluspmc_failed_encoders_verify:
409  case eoerror_value_CFG_mc_mc4pluspmc_failed_candiscovery_of_pmc:
410  case eoerror_value_CFG_ft_ok:
411  case eoerror_value_CFG_ft_failed_candiscovery:
412  case eoerror_value_CFG_ft_not_verified_yet:
413  case eoerror_value_CFG_ft_using_onboard_config:
414  case eoerror_value_CFG_ft_failed_notsupported:
415  case eoerror_value_CFG_ft_failed_fullscales:
416  case eoerror_value_CFG_bat_ok:
417  case eoerror_value_CFG_bat_failed_candiscovery:
418  case eoerror_value_CFG_bat_not_verified_yet:
419  case eoerror_value_CFG_bat_using_onboard_config:
420  case eoerror_value_CFG_bat_failed_notsupported:
421  {
422  printBaseInfo();
423  } break;
424 
425  // 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"},
426  case eoerror_value_CFG_encoders_ok:
427  case eoerror_value_CFG_encoders_failed_verify:
428  {
429  uint8_t numOfJoints = (m_dnginfo.param16 & 0xf000) >> 12;
430  uint8_t failmaskenc1 = m_dnginfo.param16 & 0x000f;
431  int16_t errorenc1 = m_dnginfo.param64 & 0x0000ffff;
432  uint8_t failmaskenc2 = (m_dnginfo.param16 & 0x00f0) >> 4;
433  int16_t errorenc2 = (m_dnginfo.param64 & 0xffff0000) >> 16;
434 
435  int16_t rawerror1 = errorenc1 & failmaskenc1;
436  int16_t rawerror2 = errorenc2 & failmaskenc2;
437  snprintf(str, sizeof(str), "%s", m_dnginfo.baseMessage.c_str());
438  m_dnginfo.baseInfo.finalMessage.append(str);
439 
440  for(auto i=0; i < numOfJoints; i++)
441  {
442  // 1. check if joint ith has encoder with errors
443  auto primary_enc_with_error = (failmaskenc1 & (1<<i));
444  auto secondary_enc_with_error = (failmaskenc2 & (1<<i));
445  auto primary_error_code = 0;
446  auto secondary_error_code = 0;
447  if(primary_enc_with_error)
448  {
449  primary_error_code = ( (errorenc1 & (0xf <<i)) >> 4*i);
451  snprintf(str, sizeof(str), " joint %d (%s) has error on primary encoder (code=%d). ",
452  i, m_dnginfo.baseInfo.axisName.c_str(), primary_error_code); //TODO: get a string instead of a code
453  m_dnginfo.baseInfo.finalMessage.append(str);
454  }
455 
456  if(secondary_enc_with_error)
457  {
458  secondary_error_code = ( (errorenc2 & (0xf <<i)) >> 4*i);
460  snprintf(str, sizeof(str), " joint %d (%s) has error on secodary encoder (code=%d)",
461  i, m_dnginfo.baseInfo.axisName.c_str(), secondary_error_code); //TODO: get a string instead of a code
462  m_dnginfo.baseInfo.finalMessage.append(str);
463  }
464 
465 
466  }
467 
468  } break;
469 
470  case eoerror_value_CFG_inertials3_failed_unsupportedsensor:
471  {
472  int16_t unsuppsens = m_dnginfo.param16;
473 
474  snprintf(str, sizeof(str), "%s. Number of unsupported sens is %d",
475  m_dnginfo.baseMessage.c_str(),
476  unsuppsens
477  );
478  m_dnginfo.baseInfo.finalMessage.append(str);
479  } break;
480 
481  case eoerror_value_CFG_inertials3_changed_requestedrate:
482  case eoerror_value_CFG_temperatures_changed_requestedrate:
483  case eoerror_value_CFG_psc_changed_requestedrate:
484  case eoerror_value_CFG_pos_changed_requestedrate:
485  {
486  uint8_t reqrate = (m_dnginfo.param16 & 0xff00) >> 8;
487  uint8_t assrate = m_dnginfo.param16 & 0x00ff;
488 
489  snprintf(str, sizeof(str), "%s. Requested rate %u and Assigned rate %u",
490  m_dnginfo.baseMessage.c_str(),
491  reqrate,
492  assrate
493  );
494  m_dnginfo.baseInfo.finalMessage.append(str);
495  } break;
496 
497  case eoerror_value_CFG_inertials3_failed_generic:
498  case eoerror_value_CFG_temperatures_failed_generic:
499  {
500  uint8_t numOfSens = m_dnginfo.param64;
501 
502  snprintf(str, sizeof(str), "%s for %d sensors",
503  m_dnginfo.baseMessage.c_str(),
504  numOfSens
505  );
506  m_dnginfo.baseInfo.finalMessage.append(str);
507  } break;
508 
509  case EOERROR_VALUE_DUMMY:
510  {
511  m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_Config error value.");
512 
513 
514  } break;
515 
516  default:
517  {
519 
520  }
521 
522  }//end switch
523 
524 
525 
526 }
527 
528 
529 
530 
531 /**************************************************************************************************************************/
532 /****************************************** MotionControlParser ***************************************************/
533 /**************************************************************************************************************************/
534 
535 // private class functions
536 std::string MotionControlParser::motorStatusBitsToString(eOmc_motorFaultState_t motorstatus)
537 {
538  // dimesion of the array is hard-code but it must be aligned w/ the union typedef eOmc_motorFaultState_t
539  static const std::array<std::string_view, eOmc_motorFaultState_numberof> s_motor_fault_status =
540  {
541  //B0 L
542  "ExternalFaultAsserted",
543  "UnderVoltageFailure",
544  "OverVoltageFailure",
545  "OverCurrentFailure",
546  //B0 H
547  "DHESInvalidValue",
548  "AS5045CSumError",
549  "DHESInvalidSequence",
550  "CANInvalidProtocol",
551  //B1 L
552  "CAN_BufferOverRun",
553  "SetpointExpired",
554  "CAN_TXIsPasv",
555  "CAN_RXIsPasv",
556  //B1 H
557  "CAN_IsWarnTX",
558  "CAN_IsWarnRX",
559  "OverHeatingFailure",
560  "",
561  //B2 L
562  "ADCCalFailure",
563  "I2TFailure",
564  "EMUROMFault",
565  "EMUROMCRCFault",
566  //B2 H
567  "EncoderFault",
568  "FirmwareSPITimingError",
569  "AS5045CalcError",
570  "FirmwarePWMFatalError",
571  //B3 L
572  "CAN_TXWasPasv",
573  "CAN_RXWasPasv",
574  "CAN_RTRFlagActive",
575  "CAN_WasWarn",
576  //B3 H
577  "CAN_DLCError",
578  "SiliconRevisionFault",
579  "PositionLimitUpper",
580  "PositionLimitLower"
581  };
582 
583  std::string statusstring = {};
584  statusstring.reserve(256);
585 
586  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)
587  {
588  // check bit by bit and add to ss the faulted bits
589  if(embot::core::binary::bit::check(motorstatus.bitmask, i))
590  {
591  statusstring.append(static_cast<const char*>(s_motor_fault_status.at(i).data()));
592  statusstring.append(" ");
593  }
594  }
595  return statusstring;
596 }
597 
598 MotionControlParser::MotionControlParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
599 
601 {
602  char str[512] = {0};
603  eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
605 
606  switch(value)
607  {
608 
609  case eoerror_value_MC_motor_external_fault:
610  case eoerror_value_MC_motor_qencoder_phase_disappeared:
611  {
612  snprintf(str, sizeof(str), " %s", m_dnginfo.baseMessage.c_str());
613  m_dnginfo.baseInfo.finalMessage.append(str);
614  } break;
615 
616  case eoerror_value_MC_motor_overcurrent:
617  case eoerror_value_MC_motor_i2t_limit:
618  case eoerror_value_MC_motor_hallsensors:
619  case eoerror_value_MC_motor_can_invalid_prot:
620  case eoerror_value_MC_motor_can_generic:
621  case eoerror_value_MC_motor_can_no_answer:
622  case eoerror_value_MC_axis_torque_sens:
623  case eoerror_value_MC_joint_hard_limit:
624  {
625  uint8_t joint_num = m_dnginfo.param16 & 0x00ff;
627 
628  snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d))", m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num);
629  m_dnginfo.baseInfo.finalMessage.append(str);
630  } break;
631 
632  case eoerror_value_MC_aea_abs_enc_invalid:
633  case eoerror_value_MC_aea_abs_enc_spikes:
634  case eoerror_value_MC_aea_abs_enc_timeout:
635  {
636  uint8_t joint_num = m_dnginfo.param16 & 0x00ff;
637  uint8_t enc_port = (m_dnginfo.param16 & 0xff00)>>8;
639 
640  snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d), encoderPort=%d)",
641  m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, enc_port
642  );
643  m_dnginfo.baseInfo.finalMessage.append(str);
644  } break;
645 
646 
647  case eoerror_value_MC_motor_qencoder_dirty:
648  case eoerror_value_MC_motor_qencoder_phase: //TBD: check encoder raw value
649  {
650  uint16_t joint_num = m_dnginfo.param16;
651  uint16_t enc_raw_value = m_dnginfo.param64 & 0xffff;
653 
654  snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d), Raw_quad_encoder_value=%d)",
655  m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, enc_raw_value
656  );
657  m_dnginfo.baseInfo.finalMessage.append(str);
658  } break;
659 
660  case eoerror_value_MC_generic_error: //TBD Check print
661  {
662  eOmc_motorFaultState_t motor_status;
663  uint16_t joint_num = m_dnginfo.param16;
664  motor_status.bitmask = m_dnginfo.param64 & 0xffffffff;
666  std::string motorStatusString = motorStatusBitsToString(motor_status);
667  snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d) (Errors:%s)",
668  m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, motorStatusString.c_str()
669  );
670  m_dnginfo.baseInfo.finalMessage.append(str);
671  } break;
672 
673  case eoerror_value_MC_motor_wrong_state: //TBD: check states
674  {
675  uint16_t joint_num = m_dnginfo.param16;
676  uint16_t req_state = (m_dnginfo.param64 & 0xf0)>>4;
677  uint16_t cur_state = m_dnginfo.param64 & 0x0f;
678 
680 
681 
682  snprintf(str, sizeof(str), " %s Joint=%s (NIB=%d). The requested state is %d, but the current is %d)",
683  m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, req_state, cur_state
684  );
685  m_dnginfo.baseInfo.finalMessage.append(str);
686  } break;
687 
688  case eoerror_value_MC_motor_overheating:
689  {
690  uint16_t joint_num = m_dnginfo.param16;
691  int16_t temp_raw_value = m_dnginfo.param64 & 0xffff;
692 
694 
695  snprintf(str, sizeof(str), " %s (Joint=%s (NIB=%d), Raw_temperature_value=%d)",
696  m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.axisName.c_str(), joint_num, temp_raw_value
697  );
698  m_dnginfo.baseInfo.finalMessage.append(str);
699  } break;
700 
701  case EOERROR_VALUE_DUMMY:
702  {
703  m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_MotionControl error value.");
704 
705 
706  } break;
707 
708  default:
709  {
711 
712  }
713 
714  }//end switch
715 
716 
717 
718 }
719 
720 
721 
722 
723 /**************************************************************************************************************************/
724 /****************************************** SkinParser ***************************************************/
725 /**************************************************************************************************************************/
726 
727 
728 
729 SkinParser::SkinParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
730 
732 {
733  char str[512] = {0};
734  eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
736 
737  switch (value)
738  {
739  case eoerror_value_SK_unspecified:
740  case eoerror_value_SK_obsoletecommand:
741  {
742  printBaseInfo();
743  } break;
744 
745  case eoerror_value_SK_arrayofcandataoverflow:
746  {
747  uint8_t frame_id = m_dnginfo.param16 & 0x00ff;
748  uint8_t frame_size = (m_dnginfo.param16 & 0xf000) >> 12;
749  uint64_t frame_data = m_dnginfo.param64;
750 
751  snprintf(str, sizeof(str), " %s. Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
752  m_dnginfo.baseMessage.c_str(), frame_id, frame_size, frame_data
753  );
754  m_dnginfo.baseInfo.finalMessage.append(str);
755  } break;
756 
757  case eoerror_value_SK_onoroff:
758  {
759  std::string emsboardstate = "unknown";
760  switch (m_dnginfo.param16)
761  {
762  case 0: emsboardstate = "OFF"; break;
763  case 1: emsboardstate = "ON"; break;
764  };
765 
766  snprintf(str, sizeof(str), " %s %s", m_dnginfo.baseMessage.c_str(), emsboardstate.c_str());
767  m_dnginfo.baseInfo.finalMessage.append(str);
768  } break;
769 
770  case eoerror_value_SK_unexpecteddata:
771  {
772  std::string emsboardstate = "unknown";
773  switch (m_dnginfo.param16)
774  {
775  case 0: emsboardstate = "CFG"; break;
776  case 1: emsboardstate = "RUN"; break;
777  }
778 
779  snprintf(str, sizeof(str), " %s %s", m_dnginfo.baseMessage.c_str(), emsboardstate.c_str());
780  m_dnginfo.baseInfo.finalMessage.append(str);
781  } break;
782 
783  case EOERROR_VALUE_DUMMY:
784  {
785  m_dnginfo.baseInfo.finalMessage.append(": unrecognized eoerror_category_Skin error value");
786  } break;
787 
788  default:
789  {
791 
792  } break;
793  }
794 }
795 
796 /**************************************************************************************************************************/
797 /****************************************** HwErrorParser ***************************************************/
798 /**************************************************************************************************************************/
799 
800 
801 
802 HwErrorParser::HwErrorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
803 
805 {
806  char str[512] = {0};
807  eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
809 
810  switch(value)
811  {
812 
813  case eoerror_value_HW_strain_saturation:
814  {
815  uint16_t channel = m_dnginfo.param16;
816  uint32_t lower_saturation_counts = m_dnginfo.param64 & 0xffffffff;
817  uint32_t upper_saturation_counts = (m_dnginfo.param64 & 0xffffffff00000000)>>32;
818  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",
819  m_dnginfo.baseMessage.c_str(),
820  channel,
821  lower_saturation_counts,
822  upper_saturation_counts);
823  m_dnginfo.baseInfo.finalMessage.append(str);
824  } break;
825 
826  case eoerror_value_HW_encoder_invalid_value:
827  case eoerror_value_HW_encoder_close_to_limits:
828  case eoerror_value_HW_encoder_crc:
829  case eoerror_value_HW_encoder_not_connected:
830  {
831  printBaseInfo();
832  } break;
833 
834 
835  case EOERROR_VALUE_DUMMY:
836  {
837  m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
838 
839 
840  } break;
841 
842  default:
843  {
845 
846  }
847 
848  }//end switch
849 
850 
851 
852 }
853 
854 
855 
856 /**************************************************************************************************************************/
857 /****************************************** SysErrorParser ***************************************************/
858 /**************************************************************************************************************************/
859 
860 // Private class functions
861 void SysParser::canMask2canBoardsStr(uint16_t canmask, diagstr canboardsstr)
862 {
863  for(int i=1; i<15; i++)
864  {
865  diagstr tmpstr{};
866  if ( (canmask & (1<<i)) == (1<<i))
867  {
868  snprintf(tmpstr, diagstr_lenght, "%d", i);
869  strcat(canboardsstr, tmpstr);
870  }
871  }
872 }
873 
874 void SysParser::getCanMonitorInfo(eOmn_serv_category_t &serv_category, diagstr boardsOnCan1, diagstr boardsOnCan2)
875 {
876  serv_category = (eOmn_serv_category_t)m_dnginfo.param16;
877  uint16_t boardsMaskCan1 = (m_dnginfo.param64 & 0x00000000ffff0000) >> 16;
878  uint16_t boardsMaskCan2 = (m_dnginfo.param64 & 0x000000000000ffff);
879 
880  canMask2canBoardsStr(boardsMaskCan1, boardsOnCan1);
881  canMask2canBoardsStr(boardsMaskCan2, boardsOnCan2);
882 
883 }
884 
885 void SysParser::getCanMonitorInfoWithTime(eOmn_serv_category_t &serv_category, diagstr boardsOnCan1, diagstr boardsOnCan2, uint32_t &time)
886 {
887  getCanMonitorInfo(serv_category, boardsOnCan1, boardsOnCan2);
888  time = (m_dnginfo.param64 & 0xffffffff00000000) >> 32;
889 }
890 
891 SysParser::SysParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
893 {
894  char str[512] = {0};
895  eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
897 
898  switch(value)
899  {
900 
901  case eoerror_value_SYS_runninghappily:
902  {
903  std::string appstate = "unknown";
904  switch(m_dnginfo.param16&0x000f)
905  {
906  case 0: appstate="just restarted"; break;
907  case 1: appstate="idle"; break;
908  case 2: appstate="running"; break;
909  };
910  snprintf(str, sizeof(str), " %s Application state is %s.", m_dnginfo.baseMessage.c_str(), appstate.c_str());
911  m_dnginfo.baseInfo.finalMessage.append(str);
912  }break;
913 
914  case eoerror_value_SYS_ctrloop_execoverflowRX:
915  {
916  //here the param64 contains: TX RX DO TX
917  uint16_t prev_rx = (m_dnginfo.param64 & 0x0000ffff00000000)>>32;
918  uint16_t prev_do = (m_dnginfo.param64 & 0x00000000ffff0000)>>16;
919  uint16_t prev_tx = (m_dnginfo.param64 & 0x000000000000ffff);
920  uint16_t prev_prev_tx = (m_dnginfo.param64 & 0xffff000000000000)>>48;
921  //currently we don't print the two time ago TX.
922 
923  //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);
924  snprintf(str, sizeof(str), " %s RX execution time %d[usec]. Latest previous execution times[usec] (..., Tx=%d);(RX=%d, DO=%d, TX=%d);",
925  m_dnginfo.baseMessage.c_str(), m_dnginfo.param16, prev_prev_tx, prev_rx, prev_do, prev_tx);
926  m_dnginfo.baseInfo.finalMessage.append(str);
927  }break;
928 
929  case eoerror_value_SYS_ctrloop_execoverflowDO:
930  {
931  //here the param64 contains: RX DO TX RX
932  uint16_t prev_do = (m_dnginfo.param64 & 0x0000ffff00000000)>>32;
933  uint16_t prev_tx = (m_dnginfo.param64 & 0x00000000ffff0000)>>16;
934  uint16_t prev_rx = (m_dnginfo.param64 & 0x000000000000ffff);
935  uint16_t prev_prev_rx = (m_dnginfo.param64 & 0xffff000000000000)>>48;
936  //currently we don't print the two time ago RX.
937  //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);
938  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, ...);",
939  m_dnginfo.baseMessage.c_str(), m_dnginfo.param16, "N/A", prev_prev_rx, prev_do, prev_tx, prev_rx);
940  m_dnginfo.baseInfo.finalMessage.append(str);
941  }break;
942 
943  case eoerror_value_SYS_ctrloop_execoverflowTX:
944  {
945  //here the param64 contains: DO TX RX DO
946  uint16_t prev_tx = (m_dnginfo.param64 & 0x0000ffff00000000)>>32;
947  uint16_t prev_rx = (m_dnginfo.param64 & 0x00000000ffff0000)>>16;
948  uint16_t prev_do = (m_dnginfo.param64 & 0x000000000000ffff);
949  uint8_t can1_frames = (m_dnginfo.param64 & 0x00ff000000000000) >> 48;
950  uint8_t can2_frames = (m_dnginfo.param64 & 0xff00000000000000) >> 56;
951  //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(),
952  //m_dnginfo.param16, prev_tx, prev_rx, prev_do, can1_frames, can2_frames );
953  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]",
954  m_dnginfo.baseMessage.c_str(), m_dnginfo.param16, "N/A", "N/A" , prev_tx, prev_rx, prev_do, can1_frames, can2_frames);
955  m_dnginfo.baseInfo.finalMessage.append(str);
956  }break;
957 
958  case eoerror_value_SYS_ropparsingerror:
959  {
960  snprintf(str, sizeof(str), " %s Error code is %d (eOparserResult_t).", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
961  m_dnginfo.baseInfo.finalMessage.append(str);
962  }break;
963 
964  case eoerror_value_SYS_halerror:
965  {
966  snprintf(str, sizeof(str), " %s HAL error code is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
967  m_dnginfo.baseInfo.finalMessage.append(str);
968  }break;
969 
970  case eoerror_value_SYS_osalerror:
971  {
972  snprintf(str, sizeof(str), " %s OSAL error code is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
973  m_dnginfo.baseInfo.finalMessage.append(str);
974  }break;
975 
976  case eoerror_value_SYS_ipalerror:
977  {
978  snprintf(str, sizeof(str), " %s IPAL error code is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
979  m_dnginfo.baseInfo.finalMessage.append(str);
980  }break;
981 
982  case eoerror_value_SYS_dispatcherfifooverflow:
983  {
984  snprintf(str, sizeof(str), " %s Number of lost items is %d.", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
985  m_dnginfo.baseInfo.finalMessage.append(str);
986  }break;
987 
988  case eoerror_value_SYS_canservices_txfifooverflow:
989  {
990  snprintf(str, sizeof(str), " %s CanPort=%s Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
991  m_dnginfo.baseMessage.c_str(), m_dnginfo.baseInfo.sourceCANPortStr.c_str(), (m_dnginfo.param16 & 0x0fff), ((m_dnginfo.param16 & 0xf000)>>12), m_dnginfo.param64 );
992  m_dnginfo.baseInfo.finalMessage.append(str);
993  }break;
994 
995  case eoerror_value_SYS_canservices_txbusfailure:
996  {
997  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));
998  m_dnginfo.baseInfo.finalMessage.append(str);
999  }break;
1000 
1001  case eoerror_value_SYS_canservices_formingfailure:
1002  {
1003  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));
1004  m_dnginfo.baseInfo.finalMessage.append(str);
1005  }break;
1006 
1007  case eoerror_value_SYS_canservices_parsingfailure:
1008  {
1009  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));
1010  m_dnginfo.baseInfo.finalMessage.append(str);
1011  }break;
1012 
1013  case eoerror_value_SYS_canservices_genericerror:
1014  {
1015  snprintf(str, sizeof(str), " %s error code is %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1016  m_dnginfo.baseInfo.finalMessage.append(str);
1017 
1018  }break;
1019 
1020  case eoerror_value_SYS_ctrloop_rxphaseaverage:
1021  {
1022  snprintf(str, sizeof(str), " %s %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1023  m_dnginfo.baseInfo.finalMessage.append(str);
1024 
1025  }break;
1026 
1027  case eoerror_value_SYS_ctrloop_dophaseaverage:
1028  {
1029  snprintf(str, sizeof(str), " %s %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1030  m_dnginfo.baseInfo.finalMessage.append(str);
1031 
1032  }break;
1033 
1034  case eoerror_value_SYS_ctrloop_txphaseaverage:
1035  {
1036  snprintf(str, sizeof(str), " %s %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1037  m_dnginfo.baseInfo.finalMessage.append(str);
1038 
1039  }break;
1040 
1041  case eoerror_value_SYS_ctrloop_rxphasemax:
1042  {
1043  snprintf(str, sizeof(str), " %s %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1044  m_dnginfo.baseInfo.finalMessage.append(str);
1045 
1046  }break;
1047 
1048  case eoerror_value_SYS_ctrloop_dophasemax:
1049  {
1050  snprintf(str, sizeof(str), " %s %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1051  m_dnginfo.baseInfo.finalMessage.append(str);
1052 
1053  }break;
1054  case eoerror_value_SYS_ctrloop_txphasemax:
1055  {
1056  snprintf(str, sizeof(str), " %s %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1057  m_dnginfo.baseInfo.finalMessage.append(str);
1058 
1059  }break;
1060 
1061  case eoerror_value_SYS_ctrloop_rxphasemin:
1062  {
1063  snprintf(str, sizeof(str), " %s %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1064  m_dnginfo.baseInfo.finalMessage.append(str);
1065 
1066  }break;
1067 
1068  case eoerror_value_SYS_ctrloop_dophasemin:
1069  {
1070  snprintf(str, sizeof(str), " %s %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1071  m_dnginfo.baseInfo.finalMessage.append(str);
1072 
1073  }break;
1074 
1075  case eoerror_value_SYS_ctrloop_txphasemin:
1076  {
1077  snprintf(str, sizeof(str), " %s %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param16);
1078  m_dnginfo.baseInfo.finalMessage.append(str);
1079 
1080  }break;
1081 
1082  case eoerror_value_SYS_proxy_forward_fails:
1083  {
1084  snprintf(str, sizeof(str), " %s. ROP.sign=%d, ROP.id=%d. Proxy list capacity is %d, size is %d ",
1085  m_dnginfo.baseMessage.c_str(),
1086  (int32_t)((m_dnginfo.param64&0xffffffff00000000)>>32),
1087  (int32_t)(m_dnginfo.param64&0x00000000ffffffff),
1088  ((m_dnginfo.param16&0xff00)>>8), (m_dnginfo.param16&0x00ff));
1089  m_dnginfo.baseInfo.finalMessage.append(str);
1090 
1091  }break;
1092 
1093  case eoerror_value_SYS_proxy_ropdes_notfound:
1094  {
1095  snprintf(str, sizeof(str), " %s ROP.id=%d ", m_dnginfo.baseMessage.c_str(), (int32_t)(m_dnginfo.param64&0x00000000ffffffff));
1096  m_dnginfo.baseInfo.finalMessage.append(str);
1097 
1098  }break;
1099 
1100  case eoerror_value_SYS_canservices_canprint:
1101  {
1102  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 );
1103  m_dnginfo.baseInfo.finalMessage.append(str);
1104  }break;
1105 
1106  case eoerror_value_SYS_canservices_rxmaisbug:
1107  {
1108  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 );
1109  m_dnginfo.baseInfo.finalMessage.append(str);
1110  }break;
1111 
1112  case eoerror_value_SYS_canservices_rxfromwrongboard:
1113  {
1114  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 );
1115  m_dnginfo.baseInfo.finalMessage.append(str);
1116  }break;
1117 
1118  case eoerror_value_SYS_transceiver_rxseqnumber_error:
1119  {
1120  int16_t receivedNum = m_dnginfo.param64+ m_dnginfo.param16;
1121  snprintf(str, sizeof(str), " %s Expected number is %ld, received number is %d ", m_dnginfo.baseMessage.c_str(), m_dnginfo.param64, receivedNum);
1122  m_dnginfo.baseInfo.finalMessage.append(str);
1123  }break;
1124 
1125  case eoerror_value_SYS_transceiver_rxseqnumber_restarted:
1126  {
1127  snprintf(str, sizeof(str), " %s Expected number is %ld", m_dnginfo.baseMessage.c_str(), m_dnginfo.param64);
1128  m_dnginfo.baseInfo.finalMessage.append(str);
1129  }break;
1130 
1131  case eoerror_value_SYS_canservices_board_detected:
1132  {
1133  //in param64 the fw copies the struct eObrd_typeandversions_t defined in EoBoards.h in icub=firmware repo
1150  //TODO:
1151  //checking the fw it seems this error code is no longer used.
1152  //So I cannot retrieve the board type.
1153  //For now I leave the code. When I'm sure that it is old, I'll remove it
1154  int fw_build = (m_dnginfo.param64 & 0x00000000000000ff);
1155  int fw_major = (m_dnginfo.param64 & 0x000000000000ff00) >> 8;
1156  int fw_minor = (m_dnginfo.param64 & 0x0000000000ff0000) >> 16;
1157  int proto_major = (m_dnginfo.param64 & 0x00000000ff000000) >> 24;
1158  int proto_minor = (m_dnginfo.param64 & 0x000000ff00000000) >> 32;
1159 
1160  //used in comm-v1 protocol
1161  // eObrd_typeandversions_t *brd_info_ptr = (eObrd_typeandversions_t *)&m_dnginfo.param64;
1162  // int fw_build = brd_info_ptr->firmwarebuildnumber;
1163  // int fw_major = brd_info_ptr->firmwareversion.major;
1164  // int fw_minor = brd_info_ptr->firmwareversion.minor;
1165  // int proto_major =brd_info_ptr->protocolversion.major;
1166  // int proto_minor =brd_info_ptr->protocolversion.minor;
1167 
1168  // eObrd_type_t general_brd_type = eoboards_cantype2type((eObrd_cantype_t )brd_info_ptr->boardtype);
1169 
1170  // std::string board_type_str = eoboards_type2string(general_brd_type);
1171 
1172  snprintf(str, sizeof(str), " %s on CAN port=%s with address %d. Fw ver is %d.%d.%d. Proto ver is %d.%d",
1174  fw_build, fw_major, fw_minor, proto_major, proto_minor );
1175  m_dnginfo.baseInfo.finalMessage.append(str);
1176  }break;
1177 
1178  case eoerror_value_SYS_canservices_board_wrongprotversion:
1179  {
1180  //in param64 the fw copies the struct eObrd_typeandversions_t defined in EoBoards.h in icub=firmware repo
1197  //as above
1198  int fw_build = (m_dnginfo.param64 & 0x00000000000000ff);
1199  int fw_major = (m_dnginfo.param64 & 0x000000000000ff00) >> 8;
1200  int fw_minor = (m_dnginfo.param64 & 0x0000000000ff0000) >> 16;
1201  int proto_major = (m_dnginfo.param64 & 0x00000000ff000000) >> 24;
1202  int proto_minor = (m_dnginfo.param64 & 0x000000ff00000000) >> 32;
1203  int req_proto_major = (m_dnginfo.param16 & 0xff00) >>8;
1204  int req_proto_minor = (m_dnginfo.param16 & 0x00ff);
1205 
1206 
1207  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",
1209  fw_build, fw_major, fw_minor, proto_major, proto_minor, req_proto_major, req_proto_minor );
1210  m_dnginfo.baseInfo.finalMessage.append(str);
1211  }break;
1212 
1213  case eoerror_value_SYS_canservices_board_notfound:
1214  {
1215  eObrd_type_t general_brd_type = eoboards_cantype2type((eObrd_cantype_t)m_dnginfo.param16);
1216  snprintf(str, sizeof(str), " %s The board is on CAN port=%s with address %d. Board type is %s.",
1218  m_dnginfo.baseInfo.sourceCANBoardAddr, eoboards_type2string(general_brd_type));
1219  m_dnginfo.baseInfo.finalMessage.append(str);
1220 
1221  }break;
1222 
1223  case eoerror_value_SYS_canservices_boards_lostcontact:
1224  {
1225  eOmn_serv_category_t serv_category;
1226  diagstr lostCanBoards1 = {0};
1227  diagstr lostCanBoards2 = {0};
1228  getCanMonitorInfo(serv_category, lostCanBoards1, lostCanBoards2);
1229 
1230  snprintf(str, sizeof(str), "%s Type of service category is %s. Lost can boards on (can1map, can2map) = ([ %s ], [ %s ] ).",
1231  m_dnginfo.baseMessage.c_str(),
1232  eomn_servicecategory2string(serv_category),
1233  lostCanBoards1, lostCanBoards2
1234  );
1235 
1236  m_dnginfo.baseInfo.finalMessage.append(str);
1237 
1238  } break;
1239 
1240  case eoerror_value_SYS_canservices_boards_retrievedcontact:
1241  {
1242  eOmn_serv_category_t serv_category;
1243  diagstr retrievedCanBoards1 = {0};
1244  diagstr retrievedCanBoards2 = {0};
1245  getCanMonitorInfo(serv_category, retrievedCanBoards1, retrievedCanBoards2);
1246 
1247  snprintf(str, sizeof(str), "%s Type of service category is %s. Retrieved can boards on (can1map, can2map) = ([ %s ], [ %s ] ).",
1248  m_dnginfo.baseMessage.c_str(),
1249  eomn_servicecategory2string(serv_category),
1250  retrievedCanBoards1, retrievedCanBoards2
1251  );
1252 
1253  m_dnginfo.baseInfo.finalMessage.append(str);
1254 
1255  } break;
1256 
1257  case eoerror_value_SYS_canservices_monitor_regularcontact:
1258  {
1259  eOmn_serv_category_t serv_category;
1260  diagstr foundCanBoards1 = {0};
1261  diagstr foundCanBoards2 = {0};
1262  getCanMonitorInfo(serv_category, foundCanBoards1, foundCanBoards2);
1263 
1264  snprintf(str, sizeof(str), "%s Type of service category is %s. CAN boards are on (can1map, can2map) = ([ %s ], [ %s ])",
1265  m_dnginfo.baseMessage.c_str(),
1266  eomn_servicecategory2string(serv_category),
1267  foundCanBoards1,
1268  foundCanBoards2
1269  );
1270  m_dnginfo.baseInfo.finalMessage.append(str);
1271  } break;
1272 
1273  case eoerror_value_SYS_canservices_monitor_lostcontact:
1274  {
1275  eOmn_serv_category_t serv_category;
1276  diagstr lostCanBoards1 = {0};
1277  diagstr lostCanBoards2 = {0};
1278  getCanMonitorInfo(serv_category, lostCanBoards1, lostCanBoards2);
1279 
1280  snprintf(str, sizeof(str), "%s Type of service category is %s. Lost CAN boards are on (can1map, can2map) = ([ %s ], [ %s ]).",
1281  m_dnginfo.baseMessage.c_str(),
1282  eomn_servicecategory2string(serv_category),
1283  lostCanBoards1,
1284  lostCanBoards2
1285  );
1286  m_dnginfo.baseInfo.finalMessage.append(str);
1287  } break;
1288 
1289  case eoerror_value_SYS_canservices_monitor_retrievedcontact:
1290  {
1291  eOmn_serv_category_t serv_category;
1292  uint32_t totRetrvTime;
1293  diagstr retrievedCanBoards1 = {0};
1294  diagstr retrievedCanBoards2 = {0};
1295  getCanMonitorInfoWithTime(serv_category, retrievedCanBoards1, retrievedCanBoards2, totRetrvTime);
1296 
1297 
1298  snprintf(str, sizeof(str), "%s Type of service category is %s. CAN boards are on (can1map, can2map) = ([ %s ], [ %s ]). Total retrieving time: %d [ms]",
1299  m_dnginfo.baseMessage.c_str(),
1300  eomn_servicecategory2string(serv_category),
1301  retrievedCanBoards1,
1302  retrievedCanBoards2,
1303  totRetrvTime
1304  );
1305  m_dnginfo.baseInfo.finalMessage.append(str);
1306  } break;
1307 
1308 
1309  case eoerror_value_SYS_canservices_monitor_stillnocontact:
1310  {
1311  eOmn_serv_category_t serv_category;
1312  uint32_t totDisappTime;
1313  diagstr lostCanBoards1 = {0};
1314  diagstr lostCanBoards2 = {0};
1315  getCanMonitorInfoWithTime(serv_category, lostCanBoards1, lostCanBoards2, totDisappTime);
1316 
1317  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]",
1318  m_dnginfo.baseMessage.c_str(),
1319  eomn_servicecategory2string(serv_category),
1320  lostCanBoards1,
1321  lostCanBoards2,
1322  totDisappTime
1323  );
1324  m_dnginfo.baseInfo.finalMessage.append(str);
1325  } break;
1326 
1327 
1328  case eoerror_value_SYS_unspecified:
1329  case eoerror_value_SYS_tobedecided:
1330  case eoerror_value_SYS_memory_zerorequested:
1331  case eoerror_value_SYS_memory_notinitialised:
1332  case eoerror_value_SYS_memory_missing:
1333  case eoerror_value_SYS_mutex_timeout:
1334  case eoerror_value_SYS_wrongparam:
1335  case eoerror_value_SYS_wrongusage:
1336  case eoerror_value_SYS_runtimeerror:
1337  case eoerror_value_SYS_runninginfatalerrorstate:
1338  case eoerror_value_SYS_udptxfailure:
1339  case eoerror_value_SYS_configurator_udptxfailure:
1340  case eoerror_value_SYS_runner_udptxfailure:
1341  case eoerror_value_SYS_runner_transceivererror:
1342  case eoerror_value_SYS_canservices_rxfifooverflow:
1343  case eoerror_value_SYS_proxy_forward_ok:
1344  case eoerror_value_SYS_proxy_forward_callback_fails:
1345  case eoerror_value_SYS_proxy_reply_ok:
1346  case eoerror_value_SYS_proxy_reply_fails:
1347  case eoerror_value_SYS_canservices_boards_missing:
1348  case eoerror_value_SYS_canservices_boards_searched:
1349  case eoerror_value_SYS_canservices_boards_found:
1350  case eoerror_value_SYS_transceiver_rxinvalidframe_error:
1351  {
1352  printBaseInfo();
1353  } break;
1354 
1355 
1356  case EOERROR_VALUE_DUMMY:
1357  {
1358  m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1359 
1360 
1361  } break;
1362 
1363  default:
1364  {
1366 
1367  }
1368 
1369  }//end switch
1370 
1371 
1372 
1373 }
1374 
1375 
1376 
1377 
1378 
1379 
1380 /**************************************************************************************************************************/
1381 /****************************************** EthMonitorParser *****************************************/
1382 /**************************************************************************************************************************/
1383 
1384 
1385 
1386 EthMonitorParser::EthMonitorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
1387 
1389 {
1390  char str[512] = {0};
1391  eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
1393 
1394  switch(value)
1395  {
1396 
1397  case eoerror_value_ETHMON_link_goes_up:
1398  case eoerror_value_ETHMON_link_goes_down:
1399  case eoerror_value_ETHMON_error_rxcrc:
1400  {
1401  std::string appstate = "unknown";
1402  switch(m_dnginfo.param64&0xff00000000000000)
1403  {
1404  case 0: appstate="N/A"; break;
1405  case 1: appstate="idle"; break;
1406  case 3: appstate="running"; break;
1407  };
1408 
1409  std::string ethport = "unknown";
1410  switch(m_dnginfo.param16)
1411  {
1412  case 0: ethport="ETH input (P2/P13/J4)"; break;
1413  case 1: ethport="ETH output (P3/P12/J5)"; break;
1414  case 2: ethport="internal"; break;
1415  };
1416  if(eoerror_value_ETHMON_error_rxcrc == value)
1417  snprintf(str, sizeof(str), " %s in port %s. Application state is %s. Number of erros is %ld",
1418  m_dnginfo.baseMessage.c_str(), ethport.c_str(), appstate.c_str(), (m_dnginfo.param64&0xffffffff));
1419  else
1420  snprintf(str, sizeof(str), " %s in port %s. Application state is %s.", m_dnginfo.baseMessage.c_str(), ethport.c_str(), appstate.c_str());
1421 
1422  m_dnginfo.baseInfo.finalMessage.append(str);
1423  }break;
1424 
1425  case eoerror_value_ETHMON_txseqnumbermissing:
1426  {
1427  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);
1428  m_dnginfo.baseInfo.finalMessage.append(str);
1429  }break;
1430 
1431 
1432  case eoerror_value_ETHMON_juststarted:
1433  case eoerror_value_ETHMON_justverified:
1434  {
1435  printBaseInfo();
1436  } break;
1437 
1438 
1439  case EOERROR_VALUE_DUMMY:
1440  {
1441  m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1442 
1443 
1444  } break;
1445 
1446  default:
1447  {
1449 
1450  }
1451 
1452  }//end switch
1453 }
1454 
1455 
1456 /**************************************************************************************************************************/
1457 /****************************************** InertialSensorParser ********************************************/
1458 /**************************************************************************************************************************/
1459 
1460 InertialSensorParser::InertialSensorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
1461 
1463 {
1464  char str[512] = {0};
1465  eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
1467 
1468  switch(value)
1469  {
1470 
1471  case eoerror_value_IS_arrayofinertialdataoverflow:
1472  {
1473 
1474  uint8_t frame_id = m_dnginfo.param16 & 0x0fff;
1475  uint8_t frame_size = (m_dnginfo.param16 & 0xf000) >> 12;
1476  uint64_t frame_data = m_dnginfo.param64;
1477 
1478  snprintf(str, sizeof(str), " %s. Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
1479  m_dnginfo.baseMessage.c_str(), frame_id, frame_size, frame_data
1480  );
1481  m_dnginfo.baseInfo.finalMessage.append(str);
1482  } break;
1483 
1484  case eoerror_value_IS_unknownsensor:
1485  {
1486  printBaseInfo();
1487  } break;
1488 
1489 
1490  case EOERROR_VALUE_DUMMY:
1491  {
1492  m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1493 
1494 
1495  } break;
1496 
1497  default:
1498  {
1500 
1501  }
1502 
1503  }//end switch
1504 }
1505 
1506 /**************************************************************************************************************************/
1507 /****************************************** AnalogSensorParser **********************************************/
1508 /**************************************************************************************************************************/
1509 
1510 AnalogSensorParser::AnalogSensorParser(AuxEmbeddedInfo &dnginfo, EntityNameProvider &entityNameProvider):DefaultParser(dnginfo, entityNameProvider){;}
1512 {
1513  char str[512] = {0};
1514  eOerror_value_t value = eoerror_code2value(m_dnginfo.errorCode);
1516 
1517  switch(value)
1518  {
1519 
1520  case eoerror_value_AS_arrayoftemperaturedataoverflow:
1521  {
1522 
1523  uint8_t frame_id = m_dnginfo.param16 & 0x00ff;
1524  uint8_t frame_size = (m_dnginfo.param16 & 0xf000) >> 12;
1525  uint64_t frame_data = m_dnginfo.param64;
1526 
1527  snprintf(str, sizeof(str), " %s. Frame.ID=%d, Frame.Size=%d Frame.Data=0x%lx",
1528  m_dnginfo.baseMessage.c_str(), frame_id, frame_size, frame_data
1529  );
1530  m_dnginfo.baseInfo.finalMessage.append(str);
1531  } break;
1532 
1533  case eoerror_value_AS_unknownsensor:
1534  {
1535  printBaseInfo();
1536  } break;
1537 
1538 
1539  case EOERROR_VALUE_DUMMY:
1540  {
1541  m_dnginfo.baseInfo.finalMessage.append(": unrecognised eoerror_category_HardWare error value.");
1542 
1543 
1544  } break;
1545 
1546  default:
1547  {
1549 
1550  }
1551 
1552  }//end switch
1553 }
1554 
std::string sourceBoardIpAddrStr
Diagnostic::LowLevel::EntityNameProvider & m_entityNameProvider
Diagnostic::LowLevel::AuxEmbeddedInfo & m_dnginfo
bool getAxisName(uint32_t entityId, std::string &axisName)
int n
char diagstr[diagstr_lenght]
constexpr int diagstr_lenght
degrees time
Definition: sine.m:5