186 Bottle groupEthBoard = Bottle(cfgtotal.findGroup(
"ETH_BOARD"));
187 if(groupEthBoard.isNull())
189 yError() <<
"eth::parser::read() cannot find ETH_BOARD group in config files";
192 Bottle groupEthBoardProps = Bottle(groupEthBoard.findGroup(
"ETH_BOARD_PROPERTIES"));
193 if(groupEthBoardProps.isNull())
195 yError() <<
"eth::parser::read() cannot find ETH_BOARD_PROPERTIES group in config files";
198 Bottle groupEthBoardSettings = Bottle(groupEthBoard.findGroup(
"ETH_BOARD_SETTINGS"));
199 if(groupEthBoardSettings.isNull())
201 yError() <<
"eth::parser::read() cannot find ETH_BOARD_PROPERTIES group in config files";
210 if(
true == groupEthBoardProps.check(
"IpAddress"))
212 Bottle paramIPboard(groupEthBoardProps.find(
"IpAddress").asString());
214 strcpy(str, paramIPboard.toString().c_str());
215 int ip1, ip2, ip3, ip4;
216 sscanf(str,
"\"%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
221 yError() <<
"eth::parser::read() cannot find ETH_BOARD_PROPERTIES/IpAddress group in config files";
225 char ipinfo[20] = {0};
231 if(
true == groupEthBoardProps.check(
"IpPort"))
238 yWarning() <<
"eth::parser::read() cannot find ETH_BOARD_PROPERTIES/IpPort group in config files." <<
" using:" << boarddata.
properties.
ipv4addressing.port;
246 Bottle b_ETH_BOARD_PROPERTIES_Type = groupEthBoardProps.findGroup(
"Type");
247 std::string Type = b_ETH_BOARD_PROPERTIES_Type.get(1).asString();
248 const char *strType = Type.c_str();
250 if(0 == strcmp(strType,
"EMS4"))
254 else if(0 == strcmp(strType,
"MC4PLUS"))
258 else if(0 == strcmp(strType,
"MC2PLUS"))
264 eObrd_type_t brd = eobrd_unknown;
265 if(eobrd_unknown == (brd = eoboards_string2type2(strType, eobool_true)))
267 brd = eoboards_string2type2(strType, eobool_false);
274 char boardTypeString[30];
275 snprintf(boardTypeString,
sizeof(boardTypeString),
"%s", eoboards_type2string2(eoboards_ethtype2type(boarddata.
properties.
type), eobool_true));
280 if(
true == groupEthBoardProps.check(
"maxSizeRXpacket"))
292 if(
true == groupEthBoardProps.check(
"maxSizeROP"))
310 Bottle paramNameBoard(groupEthBoardSettings.find(
"Name").asString());
311 char xmlboardname[64] = {0};
312 snprintf(xmlboardname,
sizeof(xmlboardname),
"%s", paramNameBoard.toString().c_str());
320 if(0 != strlen(xmlboardname))
332 Bottle groupEthBoardSettings_RunningMode = Bottle(groupEthBoardSettings.findGroup(
"RUNNINGMODE"));
333 if(groupEthBoardSettings_RunningMode.isNull())
335 yWarning() <<
"eth::parser::read(): cannot find ETH_BOARD_PROPERTIES/RUNNINGMODE group in config files for BOARD w/ IP" << boarddata.
properties.
ipv4string <<
" and will use default values";
336 yWarning() <<
"Default values for ETH_BOARD_PROPERTIES/RUNNINGMODE group: (period, maxTimeOfRXactivity, maxTimeOfDOactivity, maxTimeOfTXactivity, TXrateOfRegularROPs) = " <<
343 if (groupEthBoardSettings_RunningMode.check(
"execution"))
345 std::string tmp = groupEthBoardSettings_RunningMode.find(
"execution").asString();
346 if (tmp ==
"besteffort")
350 else if (tmp !=
"synchronized")
353 <<
": ETH_BOARD_SETTINGS::RUNNINGMODE::execution has unknown value '" << tmp
354 <<
"', defaulting to 'synchronized'.";
358 if(
true == groupEthBoardSettings_RunningMode.check(
"period"))
360 int tmp = groupEthBoardSettings_RunningMode.find(
"period").asInt32();
364 yWarning() <<
"eth::parser::read() for BOARD" << boarddata.
properties.
ipv4string <<
"ETH_BOARD_SETTINGS::RUNNINGMODE::period can be only 1000 (so far) and it was:" << tmp;
370 if(
true == groupEthBoardSettings_RunningMode.check(
"safetygap"))
372 int tmp = groupEthBoardSettings_RunningMode.find(
"safetygap").asInt32();
376 yWarning() <<
"eth::parser::read() for BOARD" << boarddata.
properties.
ipv4string <<
": ETH_BOARD_SETTINGS::RUNNINGMODE::safetygap (" << tmp <<
") must be less than cycletime (" << boarddata.
settings.
txconfig.cycletime <<
"). Resetting to 0";
382 if(
true == groupEthBoardSettings_RunningMode.check(
"maxTimeOfRXactivity"))
384 int tmp = groupEthBoardSettings_RunningMode.find(
"maxTimeOfRXactivity").asInt32();
386 if((tmp < 5) || (tmp > 990))
388 yWarning() <<
"eth::parser::read() for BOARD" << boarddata.
properties.
ipv4string <<
"ETH_BOARD_SETTINGS::RUNNINGMODE::maxTimeOfRXactivity must be in [5, 990] (so far) and it was:" << tmp <<
"Using default value";
395 if(
true == groupEthBoardSettings_RunningMode.check(
"maxTimeOfDOactivity"))
397 int tmp = groupEthBoardSettings_RunningMode.find(
"maxTimeOfDOactivity").asInt32();
399 if((tmp < 5) || (tmp > 990))
401 yWarning() <<
"eth::parser::read() for BOARD" << boarddata.
properties.
ipv4string <<
"ETH_BOARD_SETTINGS::RUNNINGMODE::maxtimeOfDOactivity must be in [5, 990] (so far) and it was:" << tmp <<
"Using default value";
408 if(
true == groupEthBoardSettings_RunningMode.check(
"maxTimeOfTXactivity"))
410 int tmp = groupEthBoardSettings_RunningMode.find(
"maxTimeOfTXactivity").asInt32();
412 if((tmp < 5) || (tmp > 990))
414 yWarning() <<
"eth::parser::read() for BOARD" << boarddata.
properties.
ipv4string <<
"ETH_BOARD_SETTINGS::RUNNINGMODE::maxTimeOfTXactivity must be in [5, 990] (so far) and it was:" << tmp <<
"Using default value";
422 if(
true == groupEthBoardSettings_RunningMode.check(
"TXrateOfRegularROPs"))
424 int tmp = groupEthBoardSettings_RunningMode.find(
"TXrateOfRegularROPs").asInt32();
428 yWarning() <<
"eth::parser::read() for BOARD" << boarddata.
properties.
ipv4string <<
"ETH_BOARD_SETTINGS::RUNNINGMODE::TXrateOfRegularROPs must be in [1, 20] and it was:" << tmp <<
"Using value = 1";
433 yWarning() <<
"eth::parser::read() for BOARD" << boarddata.
properties.
ipv4string <<
"ETH_BOARD_SETTINGS::RUNNINGMODE::TXrateOfRegularROPs must be in [1, 20] and it was:" << tmp <<
"Using value = 20";
442 yWarning() <<
"eth::parser::read() for BOARD" << boarddata.
properties.
ipv4string <<
"In ETH_BOARD_SETTINGS::RUNNINGMODE sum(maxTimeOfRXactivity, maxTimeOfDOactivity, maxTimeOfTXactivity) != period !!! Using default values";
461 bool sigOVRFLrxdotx {
true};
462 bool sigOVRFLperiod {
false};
465 sigOVRFLrxdotx =
true;
466 sigOVRFLperiod =
false;
468 std::string to_string()
const
470 return std::string(
"IMM -> (sigOVRFLrxdotx = ") + std::to_string(sigOVRFLrxdotx) +
471 std::string(
", sigOVRFLperiod = ") + std::to_string(sigOVRFLperiod) +
478 bool sigSTATS_RXDOTXminavgmax {
false};
479 bool sigSTATS_PERIODminavgmax {
false};
480 bool sigSTATS_PERIODhistogram {
false};
484 sigSTATS_RXDOTXminavgmax = sigSTATS_PERIODminavgmax = sigSTATS_PERIODhistogram =
false;
486 std::string to_string()
const
488 return std::string(
"PER -> (sigSTATS_RXDOTXminavgmax = ") + std::to_string(sigSTATS_RXDOTXminavgmax) +
489 std::string(
", sigSTATS_PERIODminavgmax = ") + std::to_string(sigSTATS_PERIODminavgmax) +
490 std::string(
", sigSTATS_PERIODhistogram = ") + std::to_string(sigSTATS_PERIODhistogram) +
504 std::string to_string()
const
506 return std::string(
"parseLOGGING -> ") + immediate.to_string() +
", " + periodic.to_string();
510 parseLOGGING pLOG {};
516 Bottle groupEthBoardSettings_RunningMode_Logging = Bottle(groupEthBoardSettings_RunningMode.findGroup(
"LOGGING"));
517 if(groupEthBoardSettings_RunningMode_Logging.isNull())
519 yWarning() <<
"eth::parser::read(): cannot find ETH_BOARD_PROPERTIES/RUNNINGMODE/LOGGING group in config files for BOARD w/ IP" << boarddata.
properties.
ipv4string <<
" and will use default values";
520 yWarning() <<
"Default values for ETH_BOARD_PROPERTIES/RUNNINGMODE/LOGGING group: (IMMEDIATE.emitRXDOTXoverflow = true, PERIODIC.period = 0, PERIODIC.emitRXDOTXstatistics = false";
526 Bottle groupEthBoardSettings_RunningMode_Logging_Immediate = Bottle(groupEthBoardSettings_RunningMode_Logging.findGroup(
"IMMEDIATE"));
527 if(groupEthBoardSettings_RunningMode_Logging_Immediate.isNull())
534 if(
true == groupEthBoardSettings_RunningMode_Logging_Immediate.check(
"emitRXDOTXoverflow"))
536 Value& v = groupEthBoardSettings_RunningMode_Logging_Immediate.find(
"emitRXDOTXoverflow");
539 pLOG.immediate.sigOVRFLrxdotx = v.asBool();
543 if(
false == groupEthBoardSettings_RunningMode_Logging_Immediate.check(
"emitPERIODoverflow"))
550 if(groupEthBoardSettings_RunningMode_Logging_Immediate.find(
"emitPERIODoverflow").isBool())
552 pLOG.immediate.sigOVRFLperiod = groupEthBoardSettings_RunningMode_Logging_Immediate.find(
"emitPERIODoverflow").asBool();
562 Bottle groupEthBoardSettings_RunningMode_Logging_Periodic = Bottle(groupEthBoardSettings_RunningMode_Logging.findGroup(
"PERIODIC"));
563 if(groupEthBoardSettings_RunningMode_Logging_Periodic.isNull())
570 if(
false == groupEthBoardSettings_RunningMode_Logging_Periodic.check(
"period"))
577 if(
true == groupEthBoardSettings_RunningMode_Logging_Periodic.find(
"period").isFloat64())
579 double tmp = groupEthBoardSettings_RunningMode_Logging_Periodic.find(
"period").asFloat64();
580 pLOG.periodic.period = (tmp<0.0) ? (0.0) : ( (tmp < 600.0) ? tmp : 600.0 );
585 Value& v_stats = groupEthBoardSettings_RunningMode_Logging_Periodic.find(
"emitRXDOTXstatistics");
586 if (v_stats.isBool())
588 pLOG.periodic.sigSTATS_RXDOTXminavgmax = v_stats.asBool();
594 Value& v_minavgmax = groupEthBoardSettings_RunningMode_Logging_Periodic.find(
"emitRXDOTXminavgmax");
595 if (v_minavgmax.isBool())
597 pLOG.periodic.sigSTATS_RXDOTXminavgmax = v_minavgmax.asBool();
601 if(
false == groupEthBoardSettings_RunningMode_Logging_Periodic.check(
"emitPERIODminavgmax"))
608 pLOG.periodic.sigSTATS_PERIODminavgmax = groupEthBoardSettings_RunningMode_Logging_Periodic.find(
"emitPERIODminavgmax").asBool();
611 if(
false == groupEthBoardSettings_RunningMode_Logging_Periodic.check(
"emitPERIODhistogram"))
618 pLOG.periodic.sigSTATS_PERIODhistogram = groupEthBoardSettings_RunningMode_Logging_Periodic.find(
"emitPERIODhistogram").asBool();
622 yInfo() <<
"ETH_BOARD_PROPERTIES/RUNNINGMODE/LOGGING group for BOARD w/ IP" << boarddata.
properties.
ipv4string <<
" has values: " <<
623 " IMMEDIATE.emit* = " << pLOG.immediate.to_string() <<
" PERIODIC.period = " << pLOG.periodic.period <<
" PERIODIC.emit* = " << pLOG.periodic.to_string();
629 constexpr uint16_t maskRXDOTXoverflow = (0x0001 << eomn_appl_log_asynchro_exectime_rxdotx_overflow);
630 constexpr uint16_t maskRXDOTXminavgmax = (0x0001 << eomn_appl_log_periodic_exectime_rxdotx_minavgmax);
631 constexpr uint16_t maskPERIODoverflow = (0x0001 << eomn_appl_log_asynchro_exectime_period_overflow);
632 constexpr uint16_t maskPERIODminavgmax = (0x0001 << eomn_appl_log_periodic_exectime_period_minavgmax);
633 constexpr uint16_t maskPERIODhistogram = (0x0001 << eomn_appl_log_periodic_exectime_period_histogram);
638 if(
true == pLOG.immediate.sigOVRFLrxdotx) { boarddata.
settings.
txconfig.logging.flags |= maskRXDOTXoverflow; }
639 if(
true == pLOG.immediate.sigOVRFLperiod) { boarddata.
settings.
txconfig.logging.flags |= maskPERIODoverflow; }
640 if(
true == pLOG.periodic.sigSTATS_RXDOTXminavgmax) { boarddata.
settings.
txconfig.logging.flags |= maskRXDOTXminavgmax; }
641 if(
true == pLOG.periodic.sigSTATS_PERIODminavgmax) { boarddata.
settings.
txconfig.logging.flags |= maskPERIODminavgmax; }
642 if(
true == pLOG.periodic.sigSTATS_PERIODhistogram) { boarddata.
settings.
txconfig.logging.flags |= maskPERIODhistogram; }
644 boarddata.
settings.
txconfig.logging.period10ms =
static_cast<uint16_t
>(100.0*pLOG.periodic.period);
661 Bottle groupEthBoardActions = Bottle(groupEthBoard.findGroup(
"ETH_BOARD_ACTIONS"));
662 if(!groupEthBoardActions.isNull())
664 Bottle groupEthBoardActions_Monitor = Bottle(groupEthBoardActions.findGroup(
"MONITOR_ITS_PRESENCE"));
665 if(!groupEthBoardActions_Monitor.isNull())
667 Bottle groupEthBoardActions_Monitor_enabled = groupEthBoardActions_Monitor.findGroup(
"enabled");
668 std::string Ena = groupEthBoardActions_Monitor_enabled.get(1).asString();
669 const char *strEna = Ena.c_str();
671 if(0 == strcmp(strEna,
"true"))
680 if(
true == groupEthBoardActions_Monitor.check(
"timeout"))
682 double presenceTimeout = groupEthBoardActions_Monitor.find(
"timeout").asFloat64();
684 if(presenceTimeout <= 0)
690 if(presenceTimeout > 0.100)
692 presenceTimeout = 0.100;
700 if(
true == groupEthBoardActions_Monitor.check(
"periodOfMissingReport"))
702 double reportMissingPeriod = groupEthBoardActions_Monitor.find(
"periodOfMissingReport").asFloat64();
704 if(reportMissingPeriod <= 0)
706 reportMissingPeriod = 0.0;
709 if(reportMissingPeriod > 600)
711 reportMissingPeriod = 600;