int init() { int remained_attempts = 5; while (true) { int can_res = can.init(config_get("can_bitrate")); if (can_res >= 0) { ::lowsyslog("UAVCAN: CAN bitrate %u bps\n", unsigned(config_get("can_bitrate"))); break; } ::lowsyslog("UAVCAN: CAN init failed [%i], trying default bitrate...\n", can_res); auto descr = ::config_param(); (void)config_get_descr("can_bitrate", &descr); can_res = can.init(descr.default_); if (can_res >= 0) { ::lowsyslog("UAVCAN: CAN bitrate %u bps\n", unsigned(descr.default_)); break; } remained_attempts--; if (remained_attempts <= 0) { ::lowsyslog("UAVCAN: CAN driver init failure: %i\n", can_res); return -1; } ::usleep(100000); } (void)node_thread.start((HIGHPRIO + NORMALPRIO) / 2); return 0; }
static int print_param(const char* name, bool verbose) { static int _max_name_len; if (_max_name_len == 0) { for (int i = 0;; i++) { const char* nm = config_name_by_index(i); if (!nm) break; int len = strlen(nm); if (len > _max_name_len) _max_name_len = len; } } struct config_param par; const int res = config_get_descr(name, &par); if (res) return res; if (par.type == CONFIG_TYPE_FLOAT) { lowsyslog("%-*s = %-12f", _max_name_len, name, config_get(name)); if (verbose) { lowsyslog("[%f, %f] (%f)", par.min, par.max, par.default_); } } else { lowsyslog("%-*s = %-12i", _max_name_len, name, (int)config_get(name)); if (verbose) { lowsyslog("[%i, %i] (%i)", (int)par.min, (int)par.max, (int)par.default_); } } puts(""); return 0; }