iCub-main
EoProtocolMN_fun_userdef.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 Department of Robotics Brain and Cognitive Sciences - Istituto Italiano di Tecnologia
3  * Author: Marco Accame
4  * email: marco.accame@iit.it
5  * website: www.robotcub.org
6  * Permission is granted to copy, distribute, and/or modify this program
7  * under the terms of the GNU General Public License, version 2 or any
8  * later version published by the Free Software Foundation.
9  *
10  * A copy of the license can be found at
11  * http://www.robotcub.org/icub/license/gpl.txt
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16  * Public License for more details
17 */
18 
19 
20 /* @file EOProtocolMN_fun_userdef.c
21  @brief This file keeps callbacks used for MN protocol in icub-main
22  @author marco.accame@iit.it
23  @date 22 mar 2016
24 **/
25 
26 
27 // --------------------------------------------------------------------------------------------------------------------
28 // - external dependencies
29 // --------------------------------------------------------------------------------------------------------------------
30 
31 #include "EoCommon.h"
32 #include "EoError.h"
33 
34 #include <math.h>
35 #include "FeatureInterface.h"
36 
37 
38 // --------------------------------------------------------------------------------------------------------------------
39 // - declaration of extern public interface
40 // --------------------------------------------------------------------------------------------------------------------
41 
42 #include "EoProtocolMN.h"
43 
44 #include "EoBoards.h"
45 
46 // --------------------------------------------------------------------------------------------------------------------
47 // - declaration of extern hidden interface
48 // --------------------------------------------------------------------------------------------------------------------
49 // empty-section
50 
51 
52 // --------------------------------------------------------------------------------------------------------------------
53 // - #define with internal scope
54 // --------------------------------------------------------------------------------------------------------------------
55 // empty-section
56 
57 
58 
59 // --------------------------------------------------------------------------------------------------------------------
60 // - typedef with internal scope
61 // --------------------------------------------------------------------------------------------------------------------
62 
63 typedef struct
64 {
65  uint32_t sec;
66  uint32_t msec;
67  uint32_t usec;
69 
70 
71 // --------------------------------------------------------------------------------------------------------------------
72 // - declaration of static functions
73 // --------------------------------------------------------------------------------------------------------------------
74 
75 static void s_print_string(char *str, eOmn_info_type_t errortype);
76 
77 static void s_eoprot_print_mninfo_status(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd);
78 
79 static void s_process_CANPRINT(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd);
80 
81 static void s_process_category_Default(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd);
82 
83 static void s_process_category_Config(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd);
84 
85 static void s_get_timeofmessage(eOmn_info_basic_t* infobasic, timeofmessage_t *t);
86 
87 static const char * s_get_sourceofmessage(eOmn_info_basic_t* infobasic, uint8_t *address);
88 
89 // --------------------------------------------------------------------------------------------------------------------
90 // - definition (and initialisation) of static variables
91 // --------------------------------------------------------------------------------------------------------------------
92 // empty-section
93 
94 
95 // --------------------------------------------------------------------------------------------------------------------
96 // - definition (and initialisation) of extern variables
97 // --------------------------------------------------------------------------------------------------------------------
98 // empty-section
99 
100 
101 // --------------------------------------------------------------------------------------------------------------------
102 // - definition of extern public functions
103 // --------------------------------------------------------------------------------------------------------------------
104 
105 extern void eoprot_fun_ONSAY_mn(const EOnv* nv, const eOropdescriptor_t* rd)
106 {
107  feat_signal_network_onsay(eo_nv_GetIP(nv), rd->id32, rd->signature);
108 }
109 
110 
111 
112 extern void eoprot_fun_UPDT_mn_info_status(const EOnv* nv, const eOropdescriptor_t* rd)
113 { // callback used to print diagnostics sent by eth boards in full form (with strings)
114  if(eo_ropcode_sig == rd->ropcode)
115  {
116  eOmn_info_status_t* infostatus = (eOmn_info_status_t*) rd->data;
117  s_eoprot_print_mninfo_status(&infostatus->basic, infostatus->extra, nv, rd);
118  }
119 }
120 
121 
122 extern void eoprot_fun_UPDT_mn_info_status_basic(const EOnv* nv, const eOropdescriptor_t* rd)
123 { // callback used to print diagnostics sent by eth boards in compact form
124  if(eo_ropcode_sig == rd->ropcode)
125  {
126  eOmn_info_basic_t* infostatusbasic = (eOmn_info_basic_t*) rd->data;
127  s_eoprot_print_mninfo_status(infostatusbasic, NULL, nv, rd);
128  }
129 }
130 
131 
132 extern void eoprot_fun_UPDT_mn_comm_cmmnds_command_replynumof(const EOnv* nv, const eOropdescriptor_t* rd)
133 {
134  if(eo_ropcode_sig == rd->ropcode)
135  {
136  if(eobool_false == feat_signal_network_onsig(eo_nv_GetIP(nv), rd->id32, rd->signature))
137  {
138  feat_PrintError("eoprot_fun_UPDT_mn_comm_cmmnds_command_replynumof() has received an unexpected message");
139  return;
140  }
141  }
142  else
143  {
144  feat_PrintError("eoprot_fun_UPDT_mn_comm_cmmnds_command_replynumof() has received an unexpected opcode");
145  }
146 }
147 
148 
149 extern void eoprot_fun_UPDT_mn_comm_cmmnds_command_replyarray(const EOnv* nv, const eOropdescriptor_t* rd)
150 {
151  if(eo_ropcode_sig == rd->ropcode)
152  {
153  if(eobool_false == feat_signal_network_onsig(eo_nv_GetIP(nv), rd->id32, rd->signature))
154  {
155  feat_PrintError("eoprot_fun_UPDT_mn_comm_cmmnds_command_replyarray() has received an unexpected message");
156  return;
157  }
158  }
159  else
160  {
161  feat_PrintError("eoprot_fun_UPDT_mn_comm_cmmnds_command_replyarray() has received an unexpected opcode");
162  }
163 }
164 
165 extern void eoprot_fun_UPDT_mn_service_status_commandresult(const EOnv* nv, const eOropdescriptor_t* rd)
166 {
167  if(eo_ropcode_sig == rd->ropcode)
168  {
169  if(eobool_false == feat_signal_network_onsig(eo_nv_GetIP(nv), rd->id32, rd->signature))
170  {
171  feat_PrintError("eoprot_fun_UPDT_mn_service_status_commandresult() has received an unexpected message");
172  return;
173  }
174  }
175  else
176  {
177  feat_PrintError("eoprot_fun_UPDT_mn_service_status_commandresult() has received an unexpected opcode");
178  }
179 
180 }
181 
182 
183 // --------------------------------------------------------------------------------------------------------------------
184 // - definition of extern hidden functions
185 // --------------------------------------------------------------------------------------------------------------------
186 // empty-section
187 
188 
189 
190 // --------------------------------------------------------------------------------------------------------------------
191 // - definition of static functions
192 // --------------------------------------------------------------------------------------------------------------------
193 
194 static void s_eoprot_print_mninfo_status(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd)
195 {
196 #undef DROPCODES_FROM_LIST
197 #define CAN_PRINT_FULL_PARSING
198 
199  static const eOerror_code_t codecanprint = EOERRORCODE(eoerror_category_System, eoerror_value_SYS_canservices_canprint);
200  eOerror_category_t category = eoerror_code2category(infobasic->properties.code);
201 
202 #if defined(DROPCODES_FROM_LIST)
203  static const eOerror_code_t codes2drop_value[] =
204  {
205  EOERRORCODE(eoerror_category_System, eoerror_value_SYS_canservices_parsingfailure),
206  EOERRORCODE(eoerror_category_System, eoerror_value_SYS_canservices_rxmaisbug),
207  EOERRORCODE(eoerror_category_System, eoerror_value_SYS_canservices_rxfromwrongboard),
208  EOERRORCODE(eoerror_category_System, eoerror_value_SYS_transceiver_rxseqnumber_error)
209  };
210 
211  static const int codes2drop_number = sizeof(codes2drop_value) / sizeof(eOerror_code_t);
212 
213  int i;
214 
215  for(i=0; i<codes2drop_number; i++)
216  {
217  if(codes2drop_value[i] == infobasic->properties.code)
218  {
219  return;
220  }
221  }
222 #endif
223 
224  if(codecanprint == infobasic->properties.code)
225  {
226  s_process_CANPRINT(infobasic, extra, nv, rd);
227  }
228  else
229  {
230  feat_manage_diagnostic(infobasic, extra, nv, rd);
231  }
232 
233 }
234 
235 
236 static void s_process_category_Default(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd)
237 {
238  char str[512] = {0};
239  eOmn_info_type_t type;
240  uint8_t address = 0;
241  eOmn_info_extraformat_t extraf;
242  const char * str_source = NULL;
243  const char * str_code = NULL;
244  const char * str_extra = NULL;
245  uint8_t *p64 = NULL;
246  char ipinfo[20] = {0};
247  const char *boardstr = feat_GetBoardName(eo_nv_GetIP(nv));
248 
249  static const char nullverbalextra[] = "no extra info despite we are in verbal mode";
250  static const char emptyextra[] = ".";
251  timeofmessage_t tom = {0};
252  s_get_timeofmessage(infobasic, &tom);
253 
254 
255  type = EOMN_INFO_PROPERTIES_FLAGS_get_type(infobasic->properties.flags);
256  extraf = EOMN_INFO_PROPERTIES_FLAGS_get_extraformat(infobasic->properties.flags);
257  //uint16_t forfutureuse = EOMN_INFO_PROPERTIES_FLAGS_get_futureuse(infobasic->properties.flags);
258 
259  str_source = s_get_sourceofmessage(infobasic, &address);
260  str_code = eoerror_code2string(infobasic->properties.code);
261  str_extra = NULL;
262 
263  if(eomn_info_extraformat_verbal == extraf)
264  {
265  str_extra = (NULL == extra) ? (nullverbalextra) : ((const char *)extra);
266  }
267  else
268  {
269  str_extra = emptyextra;
270  }
271 
272  p64 = (uint8_t*)&(infobasic->properties.par64);
273 
274 
275  eo_common_ipv4addr_to_string(eo_nv_GetIP(nv), ipinfo, sizeof(ipinfo));
276  //int boardnum = eo_nv_GetBRD(nv)+1;
277 
278  snprintf(str, sizeof(str), " from BOARD %s (%s), src %s, adr %d, time %ds %dm %du: (code 0x%.8x, par16 0x%.4x par64 0x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x) -> %s + %s",
279  ipinfo,
280  boardstr,
281  str_source,
282  address,
283  tom.sec, tom.msec, tom.usec,
284  infobasic->properties.code,
285  infobasic->properties.par16,
286  p64[7], p64[6], p64[5], p64[4], p64[3], p64[2], p64[1], p64[0],
287  str_code,
288  str_extra
289  );
290 
291  s_print_string(str, type);
292 }
293 
294 
295 static void s_print_string(char *str, eOmn_info_type_t errortype)
296 {
297  switch(errortype)
298  {
299  case eomn_info_type_info:
300  {
301  feat_PrintInfo(str);
302  } break;
303 
304  case eomn_info_type_debug:
305  {
306  feat_PrintDebug(str);
307  } break;
308 
309  case eomn_info_type_warning:
310  {
311  feat_PrintWarning(str);
312  } break;
313 
314  case eomn_info_type_error:
315  {
316  feat_PrintError(str);
317  } break;
318 
319  case eomn_info_type_fatal:
320  {
321  feat_PrintFatal(str);
322  } break;
323 
324  default:
325  {
326  feat_PrintError(str);
327  } break;
328  }
329 
330 }
331 
332 
333 
334 static void s_process_CANPRINT(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd)
335 {
336  feat_CANprint(eo_nv_GetIP(nv), infobasic);
337 }
338 
339 
340 static void s_process_category_Config(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd)
341 {
342  char str[512] = {0};
343  eOmn_info_type_t type;
344  char ipinfo[20] = {0};
345  const char *ethboardname = feat_GetBoardName(eo_nv_GetIP(nv));
346  timeofmessage_t tom = {0};
347  eOerror_value_t value;
348  // here is the basic oscure print
349  //s_process_category_Default(infobasic, extra, nv, rd);
350 
351  // but now we do a better parsing
352 
353  type = EOMN_INFO_PROPERTIES_FLAGS_get_type(infobasic->properties.flags);
354  //int ethboardnum = eo_nv_GetBRD(nv)+1;
355  eo_common_ipv4addr_to_string(eo_nv_GetIP(nv), ipinfo, sizeof(ipinfo));
356  s_get_timeofmessage(infobasic, &tom);
357 
358  value = eoerror_code2value(infobasic->properties.code);
359 
360  switch(value)
361  {
362 
363  case eoerror_value_CFG_candiscovery_started:
364  {
365  uint16_t maskcan2 = infobasic->properties.par16;
366  uint64_t brdnum = (infobasic->properties.par64 & 0x0000ff0000000000) >> 40;
367  const char *canboardname = eoboards_type2string(brdnum);
368  uint16_t maskcan1 = (infobasic->properties.par64 & 0xffff000000000000) >> 48;
369  eObrd_protocolversion_t prot = {0};
370  eObrd_firmwareversion_t appl = {0};
371  uint64_t reqpr = (infobasic->properties.par64 & 0x000000ffff000000) >> 24;
372  uint64_t reqfw = (infobasic->properties.par64 & 0x0000000000ffffff);
373  uint8_t num =0;
374  prot.major = reqpr >> 8;
375  prot.minor = reqpr & 0xff;
376  appl.major = (reqfw >> 16) & 0xff;
377  appl.minor = (reqfw >> 8) & 0xff;
378  appl.build = reqfw & 0xff;
379  num = eo_common_hlfword_bitsetcount(maskcan1)+eo_common_hlfword_bitsetcount(maskcan2);
380 
381  snprintf(str, sizeof(str), " from BOARD %s (%s) @ %ds %dm %du: CAN discovery has started for %d %s boards on (can1map, can2map) = (0x%.4x, 0x%.4x) with target can protocol ver %d.%d and application ver %d.%d.%d.",
382  ipinfo,
383  ethboardname,
384  tom.sec, tom.msec, tom.usec,
385 
386  num, canboardname,
387  maskcan1, maskcan2,
388  prot.major, prot.minor,
389  appl.major, appl.minor, appl.build
390  );
391 
392  s_print_string(str, type);
393 
394  } break;
395 
396  case eoerror_value_CFG_candiscovery_ok:
397  {
398  uint8_t num = infobasic->properties.par16 & 0x00ff;
399  eObool_t fakesearch = (0x0000 == (infobasic->properties.par16 & 0xf000)) ? (eobool_false) : (eobool_true);
400  uint64_t brdnum = (infobasic->properties.par64 & 0x0000ff0000000000) >> 40;
401  const char *canboardname = eoboards_type2string(brdnum);
402  uint64_t searchtime = (infobasic->properties.par64 & 0xffff000000000000) >> 48;
403  eObrd_protocolversion_t prot = {0};
404  eObrd_firmwareversion_t appl = {0};
405  uint64_t reqpr = (infobasic->properties.par64 & 0x000000ffff000000) >> 24;
406  uint64_t reqfw = (infobasic->properties.par64 & 0x0000000000ffffff);
407  char strOK[80] = "OK";
408 
409  prot.major = reqpr >> 8;
410  prot.minor = reqpr & 0xff;
411  appl.major = (reqfw >> 16) & 0xff;
412  appl.minor = (reqfw >> 8) & 0xff;
413  appl.build = reqfw & 0xff;
414 
415 
416  if(eobool_true == fakesearch)
417  {
418  snprintf(strOK, sizeof(strOK), "OK but FAKE (without any control on CAN w/ get-fw-version<> message)");
419  }
420 
421  snprintf(str, sizeof(str), " from BOARD %s (%s) @ %ds %dm %du: CAN discovery is %s for %d %s boards with target can protocol ver %d.%d and application ver %d.%d.%d. Search time was %d ms",
422  ipinfo,
423  ethboardname,
424  tom.sec, tom.msec, tom.usec,
425  strOK,
426  num, canboardname,
427  prot.major, prot.minor,
428  appl.major, appl.minor, appl.build,
429  (int)searchtime
430  );
431 
432  s_print_string(str, type);
433 
434  } break;
435 
436  case eoerror_value_CFG_candiscovery_detectedboard:
437  {
438  uint64_t brdnum = (infobasic->properties.par64 & 0x0000ff0000000000) >> 40;
439  const char *canboardname = eoboards_type2string(brdnum);
440  uint64_t searchtime = (infobasic->properties.par64 & 0xffff000000000000) >> 48;
441  eObrd_protocolversion_t prot = {0};
442  eObrd_firmwareversion_t appl = {0};
443  uint64_t reqpr = (infobasic->properties.par64 & 0x000000ffff000000) >> 24;
444  uint64_t reqfw = (infobasic->properties.par64 & 0x0000000000ffffff);
445  uint8_t address;
446  const char *source = s_get_sourceofmessage(infobasic, NULL);
447  prot.major = reqpr >> 8;
448  prot.minor = reqpr & 0xff;
449  appl.major = (reqfw >> 16) & 0xff;
450  appl.minor = (reqfw >> 8) & 0xff;
451  appl.build = reqfw & 0xff;
452  address = infobasic->properties.par16 & 0x000f;
453 
454 
455  snprintf(str, sizeof(str), " from BOARD %s (%s) @ %ds %dm %du: CAN discovery has detected a %s board in %s addr %d with can protocol ver %d.%d and application ver %d.%d.%d Search time was %d ms",
456  ipinfo,
457  ethboardname,
458  tom.sec, tom.msec, tom.usec,
459 
460  canboardname,
461  source, address,
462  prot.major, prot.minor,
463  appl.major, appl.minor, appl.build,
464  (int)searchtime
465  );
466  s_print_string(str, type);
467 
468  } break;
469 
470  case eoerror_value_CFG_candiscovery_boardsmissing:
471  {
472  uint8_t numofmissing = infobasic->properties.par16 & 0x00ff;
473  const char *canboardname = eoboards_type2string(infobasic->properties.par16 >> 8);
474  uint64_t searchtime = (infobasic->properties.par64 & 0xffff000000000000) >> 48;
475  uint16_t maskofmissing = infobasic->properties.par64 & 0x000000000000ffff;
476  const char *source = s_get_sourceofmessage(infobasic, NULL);
477  uint8_t n = 1;
478  uint8_t i = 0;
479 
480  snprintf(str, sizeof(str), " from BOARD %s (%s) @ %ds %dm %du: CAN discovery after %d ms has detected %d missing %s boards in %s:",
481  ipinfo,
482  ethboardname,
483  tom.sec, tom.msec, tom.usec,
484 
485  (int)searchtime,
486  numofmissing,
487  canboardname,
488  source
489  );
490  s_print_string(str, type);
491 
492  for(i=1; i<15; i++)
493  {
494  if(eobool_true == eo_common_hlfword_bitcheck(maskofmissing, i))
495  {
496  snprintf(str, sizeof(str), "%d of %d: missing %s BOARD %s:%s:%d",
497  n, numofmissing, canboardname,
498  ipinfo, source, i
499  );
500  s_print_string(str, type);
501  n++;
502 
503  }
504  }
505 
506  } break;
507 
508  case eoerror_value_CFG_candiscovery_boardsinvalid:
509  {
510  uint8_t numofinvalid = infobasic->properties.par16 & 0x00ff;
511  const char *canboardname = eoboards_type2string(infobasic->properties.par16 >> 8);
512  uint64_t invalidmask = infobasic->properties.par64;
513  const char *source = s_get_sourceofmessage(infobasic, NULL);
514  uint8_t n = 1;
515  uint8_t i = 0;
516  const char *empty = "";
517  const char *wrongtype = "WRONG BOARD TYPE";
518  const char *wrongprot = "WRONG PROTOCOL VERSION";
519  const char *wrongappl = "WRONG APPLICATION VERSION";
520 
521  snprintf(str, sizeof(str), " from BOARD %s (%s) @ %ds %dm %du: CAN discovery has detected %d invalid %s boards in %s:",
522  ipinfo,
523  ethboardname,
524  tom.sec, tom.msec, tom.usec,
525 
526  numofinvalid,
527  canboardname,
528  source
529  );
530  s_print_string(str, type);
531 
532 
533 
534  for(i=1; i<15; i++)
535  {
536  uint64_t val = (invalidmask >> (4*i)) & 0x0f;
537  if(0 != val)
538  {
539  snprintf(str, sizeof(str), "%d of %d: wrong %s BOARD %s:%s:%d because it has: %s %s %s",
540  n, numofinvalid, canboardname,
541  ipinfo, source, i,
542  ((val & 0x1) == 0x1) ? (wrongtype) : (empty),
543  ((val & 0x2) == 0x2) ? (wrongappl) : (empty),
544  ((val & 0x4) == 0x4) ? (wrongprot) : (empty)
545  );
546  s_print_string(str, type);
547  n++;
548 
549  }
550  }
551 
552  } break;
553 
554  default:
555  {
556  s_process_category_Default(infobasic, extra, nv, rd);
557 
558  } break;
559 
560  case EOERROR_VALUE_DUMMY:
561  {
562  snprintf(str, sizeof(str), " from BOARD %s (%s) @ %ds %dm %du: unrecognised eoerror_category_Config error value:",
563  ipinfo,
564  ethboardname,
565  tom.sec, tom.msec, tom.usec
566  );
567  s_print_string(str, type);
568 
569  } break;
570 
571  }
572 
573 }
574 
575 
576 static void s_get_timeofmessage(eOmn_info_basic_t* infobasic, timeofmessage_t *t)
577 {
578  t->sec = infobasic->timestamp / 1000000;
579  t->msec = (infobasic->timestamp % 1000000) / 1000;
580  t->usec = infobasic->timestamp % 1000;
581 }
582 
583 
584 static const char * s_get_sourceofmessage(eOmn_info_basic_t* infobasic, uint8_t *address)
585 {
586  static const char * const sourcenames[] =
587  {
588  "LOCAL",
589  "CAN1",
590  "CAN2",
591  "UNKNOWN"
592  };
593 
594  eOmn_info_source_t source = EOMN_INFO_PROPERTIES_FLAGS_get_source(infobasic->properties.flags);
595 
596  if(NULL != address)
597  {
598  *address = EOMN_INFO_PROPERTIES_FLAGS_get_address(infobasic->properties.flags);
599  }
600 
601  return((source > eomn_info_source_can2) ? (sourcenames[3]) : (sourcenames[source]));
602 }
603 
604 // --------------------------------------------------------------------------------------------------------------------
605 // - end-of-file (leave a blank line after)
606 // --------------------------------------------------------------------------------------------------------------------
607 
608 
609 
static void s_print_string(char *str, eOmn_info_type_t errortype)
void eoprot_fun_ONSAY_mn(const EOnv *nv, const eOropdescriptor_t *rd)
void eoprot_fun_UPDT_mn_comm_cmmnds_command_replynumof(const EOnv *nv, const eOropdescriptor_t *rd)
static void s_process_category_Default(eOmn_info_basic_t *infobasic, uint8_t *extra, const EOnv *nv, const eOropdescriptor_t *rd)
static void s_eoprot_print_mninfo_status(eOmn_info_basic_t *infobasic, uint8_t *extra, const EOnv *nv, const eOropdescriptor_t *rd)
static void s_get_timeofmessage(eOmn_info_basic_t *infobasic, timeofmessage_t *t)
void eoprot_fun_UPDT_mn_info_status_basic(const EOnv *nv, const eOropdescriptor_t *rd)
static const char * s_get_sourceofmessage(eOmn_info_basic_t *infobasic, uint8_t *address)
void eoprot_fun_UPDT_mn_comm_cmmnds_command_replyarray(const EOnv *nv, const eOropdescriptor_t *rd)
void eoprot_fun_UPDT_mn_service_status_commandresult(const EOnv *nv, const eOropdescriptor_t *rd)
static void s_process_CANPRINT(eOmn_info_basic_t *infobasic, uint8_t *extra, const EOnv *nv, const eOropdescriptor_t *rd)
void eoprot_fun_UPDT_mn_info_status(const EOnv *nv, const eOropdescriptor_t *rd)
static void s_process_category_Config(eOmn_info_basic_t *infobasic, uint8_t *extra, const EOnv *nv, const eOropdescriptor_t *rd)
int n
eObool_t feat_signal_network_onsay(eOipv4addr_t ipv4, eOprotID32_t id32, uint32_t signature)
void feat_PrintFatal(char *string)
eObool_t feat_CANprint(eOipv4addr_t ipv4, eOmn_info_basic_t *infobasic)
void feat_manage_diagnostic(eOmn_info_basic_t *infobasic, uint8_t *extra, const EOnv *nv, const eOropdescriptor_t *rd)
void feat_PrintDebug(char *string)
const char * feat_GetBoardName(eOipv4addr_t ipv4)
void feat_PrintInfo(char *string)
void feat_PrintError(char *string)
eObool_t feat_signal_network_onsig(eOipv4addr_t ipv4, eOprotID32_t id32, uint32_t signature)
void feat_PrintWarning(char *string)