iCub-main
Loading...
Searching...
No Matches
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
63typedef struct
64{
65 uint32_t sec;
66 uint32_t msec;
67 uint32_t usec;
69
70
71// --------------------------------------------------------------------------------------------------------------------
72// - declaration of static functions
73// --------------------------------------------------------------------------------------------------------------------
74
75static void s_print_string(char *str, eOmn_info_type_t errortype);
76
77static void s_eoprot_print_mninfo_status(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd);
78
79static void s_process_CANPRINT(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd);
80
81static void s_process_category_Default(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd);
82
83static void s_process_category_Config(eOmn_info_basic_t* infobasic, uint8_t * extra, const EOnv* nv, const eOropdescriptor_t* rd);
84
85static void s_get_timeofmessage(eOmn_info_basic_t* infobasic, timeofmessage_t *t);
86
87static 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
105extern 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
112extern 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
122extern 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
132extern 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
149extern 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
165extern 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
194static 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
236static 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
295static 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 {
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
334static 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
340static 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
576static 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
584static 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)
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)
const char * feat_GetBoardName(eOipv4addr_t ipv4)
void feat_PrintWarning(char *string)