From c125ae1f00fe8d8dbafce2f262ebaa8af515ac39 Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Tue, 10 Apr 2018 16:47:42 +0200 Subject: Replace boost ptree by another INI parser --- src/ConfigParser.cpp | 173 ++++++++++++++++++++++++--------------------------- 1 file changed, 82 insertions(+), 91 deletions(-) (limited to 'src') diff --git a/src/ConfigParser.cpp b/src/ConfigParser.cpp index 62f1241..94a960d 100644 --- a/src/ConfigParser.cpp +++ b/src/ConfigParser.cpp @@ -30,8 +30,8 @@ #endif #include -#include -#include + +#include "INIReader.h" #include "ConfigParser.h" #include "Utils.h" @@ -68,23 +68,20 @@ static void parse_configfile( mod_settings_t& mod_settings) { // First read parameters from the file - using boost::property_tree::ptree; - ptree pt; + INIReader pt(configuration_file); - try { - read_ini(configuration_file, pt); - } - catch (boost::property_tree::ini_parser::ini_parser_error &e) + int line_err = pt.ParseError(); + + if (line_err) { std::cerr << "Error, cannot read configuration file '" << configuration_file.c_str() << "'" << std::endl; - std::cerr << " " << e.what() << std::endl; + std::cerr << "At line: " << line_err << std::endl; throw std::runtime_error("Cannot read configuration file"); } - // remote controller: - if (pt.get("remotecontrol.telnet", 0) == 1) { + if (pt.GetInteger("remotecontrol.telnet", 0) == 1) { try { - int telnetport = pt.get("remotecontrol.telnetport"); + int telnetport = pt.GetInteger("remotecontrol.telnetport", 0); auto telnetrc = make_shared(telnetport); rcs.add_controller(telnetrc); } @@ -94,11 +91,10 @@ static void parse_configfile( throw std::runtime_error("Configuration error"); } } - #if defined(HAVE_ZEROMQ) - if (pt.get("remotecontrol.zmqctrl", 0) == 1) { + if (pt.GetInteger("remotecontrol.zmqctrl", 0) == 1) { try { - std::string zmqCtrlEndpoint = pt.get("remotecontrol.zmqctrlendpoint", ""); + std::string zmqCtrlEndpoint = pt.Get("remotecontrol.zmqctrlendpoint", ""); auto zmqrc = make_shared(zmqCtrlEndpoint); rcs.add_controller(zmqrc); } @@ -111,28 +107,28 @@ static void parse_configfile( #endif // input params: - if (pt.get("input.loop", 0) == 1) { + if (pt.GetInteger("input.loop", 0) == 1) { mod_settings.loop = true; } - mod_settings.inputTransport = pt.get("input.transport", "file"); - mod_settings.inputMaxFramesQueued = pt.get("input.max_frames_queued", + mod_settings.inputTransport = pt.Get("input.transport", "file"); + mod_settings.inputMaxFramesQueued = pt.GetInteger("input.max_frames_queued", ZMQ_INPUT_MAX_FRAME_QUEUE); - mod_settings.edi_max_delay_ms = pt.get("input.edi_max_delay", 0.0f); + mod_settings.edi_max_delay_ms = pt.GetReal("input.edi_max_delay", 0.0f); - mod_settings.inputName = pt.get("input.source", "/dev/stdin"); + mod_settings.inputName = pt.Get("input.source", "/dev/stdin"); // log parameters: - if (pt.get("log.syslog", 0) == 1) { + if (pt.GetInteger("log.syslog", 0) == 1) { LogToSyslog* log_syslog = new LogToSyslog(); etiLog.register_backend(log_syslog); } - if (pt.get("log.filelog", 0) == 1) { + if (pt.GetInteger("log.filelog", 0) == 1) { std::string logfilename; try { - logfilename = pt.get("log.filename"); + logfilename = pt.Get("log.filename", ""); } catch (std::exception &e) { std::cerr << "Error: " << e.what() << "\n"; @@ -144,7 +140,7 @@ static void parse_configfile( etiLog.register_backend(log_file); } - auto trace_filename = pt.get("log.trace", ""); + std::string trace_filename = pt.Get("log.trace", ""); if (not trace_filename.empty()) { LogTracer* tracer = new LogTracer(trace_filename); etiLog.register_backend(tracer); @@ -152,75 +148,70 @@ static void parse_configfile( // modulator parameters: - const string gainMode_setting = pt.get("modulator.gainmode", "var"); + const string gainMode_setting = pt.Get("modulator.gainmode", "var"); mod_settings.gainMode = parse_gainmode(gainMode_setting); - mod_settings.gainmodeVariance = pt.get("modulator.normalise_variance", + mod_settings.gainmodeVariance = pt.GetReal("modulator.normalise_variance", mod_settings.gainmodeVariance); - mod_settings.dabMode = pt.get("modulator.mode", mod_settings.dabMode); - mod_settings.clockRate = pt.get("modulator.dac_clk_rate", (size_t)0); - mod_settings.digitalgain = pt.get("modulator.digital_gain", + mod_settings.dabMode = pt.GetInteger("modulator.mode", mod_settings.dabMode); + mod_settings.clockRate = pt.GetInteger("modulator.dac_clk_rate", (size_t)0); + mod_settings.digitalgain = pt.GetReal("modulator.digital_gain", mod_settings.digitalgain); - mod_settings.outputRate = pt.get("modulator.rate", mod_settings.outputRate); - mod_settings.ofdmWindowOverlap = pt.get("modulator.ofdmwindowing", + mod_settings.outputRate = pt.GetInteger("modulator.rate", mod_settings.outputRate); + mod_settings.ofdmWindowOverlap = pt.GetInteger("modulator.ofdmwindowing", mod_settings.ofdmWindowOverlap); // FIR Filter parameters: - if (pt.get("firfilter.enabled", 0) == 1) { + if (pt.GetInteger("firfilter.enabled", 0) == 1) { mod_settings.filterTapsFilename = - pt.get("firfilter.filtertapsfile", "default"); + pt.Get("firfilter.filtertapsfile", "default"); } // Poly coefficients: - if (pt.get("poly.enabled", 0) == 1) { + if (pt.GetInteger("poly.enabled", 0) == 1) { mod_settings.polyCoefFilename = - pt.get("poly.polycoeffile", "dpd/poly.coef"); + pt.Get("poly.polycoeffile", "dpd/poly.coef"); mod_settings.polyNumThreads = - pt.get("poly.num_threads", 0); + pt.GetInteger("poly.num_threads", 0); } // Crest factor reduction - if (pt.get("cfr.enabled", 0) == 1) { + if (pt.GetInteger("cfr.enabled", 0) == 1) { mod_settings.enableCfr = true; - mod_settings.cfrClip = pt.get("cfr.clip"); - mod_settings.cfrErrorClip = pt.get("cfr.error_clip"); + mod_settings.cfrClip = pt.GetReal("cfr.clip", 0.0); + mod_settings.cfrErrorClip = pt.GetReal("cfr.error_clip", 0.0); } // Output options - std::string output_selected; - try { - output_selected = pt.get("output.output"); - } - catch (std::exception &e) { - std::cerr << "Error: " << e.what() << "\n"; + std::string output_selected = pt.Get("output.output", ""); + if(output_selected == "") { + std::cerr << "Error:\n"; std::cerr << " Configuration does not specify output\n"; throw std::runtime_error("Configuration error"); } if (output_selected == "file") { - try { - mod_settings.outputName = pt.get("fileoutput.filename"); - mod_settings.fileOutputShowMetadata = - (pt.get("fileoutput.show_metadata", 0) > 0); - } - catch (std::exception &e) { - std::cerr << "Error: " << e.what() << "\n"; + mod_settings.outputName = pt.Get("fileoutput.filename", ""); + if(mod_settings.outputName == "") { + std::cerr << "Error:\n"; std::cerr << " Configuration does not specify file name for file output\n"; throw std::runtime_error("Configuration error"); } + mod_settings.fileOutputShowMetadata = + (pt.GetInteger("fileoutput.show_metadata", 0) > 0); mod_settings.useFileOutput = true; - mod_settings.fileOutputFormat = pt.get("fileoutput.format", + mod_settings.fileOutputFormat = pt.Get("fileoutput.format", mod_settings.fileOutputFormat); } #if defined(HAVE_OUTPUT_UHD) else if (output_selected == "uhd") { Output::SDRDeviceConfig sdr_device_config; - string device = pt.get("uhdoutput.device", ""); - const auto usrpType = pt.get("uhdoutput.type", ""); + string device = pt.Get("uhdoutput.device", ""); + const auto usrpType = pt.Get("uhdoutput.type", ""); if (usrpType != "") { if (not device.empty()) { device += ","; @@ -229,8 +220,8 @@ static void parse_configfile( } sdr_device_config.device = device; - sdr_device_config.subDevice = pt.get("uhdoutput.subdevice", ""); - sdr_device_config.masterClockRate = pt.get("uhdoutput.master_clock_rate", 0); + sdr_device_config.subDevice = pt.Get("uhdoutput.subdevice", ""); + sdr_device_config.masterClockRate = pt.GetInteger("uhdoutput.master_clock_rate", 0); if (sdr_device_config.device.find("master_clock_rate") != std::string::npos) { std::cerr << "Warning:" @@ -242,12 +233,12 @@ static void parse_configfile( "setting type in [uhd] device is deprecated !\n"; } - sdr_device_config.txgain = pt.get("uhdoutput.txgain", 0.0); - sdr_device_config.tx_antenna = pt.get("uhdoutput.tx_antenna", ""); - sdr_device_config.rx_antenna = pt.get("uhdoutput.rx_antenna", "RX2"); - sdr_device_config.rxgain = pt.get("uhdoutput.rxgain", 0.0); - sdr_device_config.frequency = pt.get("uhdoutput.frequency", 0); - std::string chan = pt.get("uhdoutput.channel", ""); + sdr_device_config.txgain = pt.GetReal("uhdoutput.txgain", 0.0); + sdr_device_config.tx_antenna = pt.Get("uhdoutput.tx_antenna", ""); + sdr_device_config.rx_antenna = pt.Get("uhdoutput.rx_antenna", "RX2"); + sdr_device_config.rxgain = pt.GetReal("uhdoutput.rxgain", 0.0); + sdr_device_config.frequency = pt.GetReal("uhdoutput.frequency", 0); + std::string chan = pt.Get("uhdoutput.channel", ""); sdr_device_config.dabMode = mod_settings.dabMode; if (sdr_device_config.frequency == 0 && chan == "") { @@ -262,13 +253,13 @@ static void parse_configfile( throw std::runtime_error("Configuration error"); } - sdr_device_config.lo_offset = pt.get("uhdoutput.lo_offset", 0); + sdr_device_config.lo_offset = pt.GetReal("uhdoutput.lo_offset", 0); - sdr_device_config.refclk_src = pt.get("uhdoutput.refclk_source", "internal"); - sdr_device_config.pps_src = pt.get("uhdoutput.pps_source", "none"); - sdr_device_config.pps_polarity = pt.get("uhdoutput.pps_polarity", "pos"); + sdr_device_config.refclk_src = pt.Get("uhdoutput.refclk_source", "internal"); + sdr_device_config.pps_src = pt.Get("uhdoutput.pps_source", "none"); + sdr_device_config.pps_polarity = pt.Get("uhdoutput.pps_polarity", "pos"); - std::string behave = pt.get("uhdoutput.behaviour_refclk_lock_lost", "ignore"); + std::string behave = pt.Get("uhdoutput.behaviour_refclk_lock_lost", "ignore"); if (behave == "crash") { sdr_device_config.refclk_lock_loss_behaviour = Output::CRASH; @@ -281,9 +272,9 @@ static void parse_configfile( throw std::runtime_error("Configuration error"); } - sdr_device_config.maxGPSHoldoverTime = pt.get("uhdoutput.max_gps_holdover_time", 0); + sdr_device_config.maxGPSHoldoverTime = pt.GetInteger("uhdoutput.max_gps_holdover_time", 0); - sdr_device_config.dpdFeedbackServerPort = pt.get("uhdoutput.dpd_port", 0); + sdr_device_config.dpdFeedbackServerPort = pt.GetInteger("uhdoutput.dpd_port", 0); mod_settings.sdr_device_config = sdr_device_config; mod_settings.useUHDOutput = true; @@ -292,14 +283,14 @@ static void parse_configfile( #if defined(HAVE_SOAPYSDR) else if (output_selected == "soapysdr") { auto& outputsoapy_conf = mod_settings.sdr_device_config; - outputsoapy_conf.device = pt.get("soapyoutput.device", ""); - outputsoapy_conf.masterClockRate = pt.get("soapyoutput.master_clock_rate", 0); - - outputsoapy_conf.txgain = pt.get("soapyoutput.txgain", 0.0); - outputsoapy_conf.tx_antenna = pt.get("soapyoutput.tx_antenna", ""); - outputsoapy_conf.lo_offset = pt.get("soapyoutput.lo_offset", 0.0); - outputsoapy_conf.frequency = pt.get("soapyoutput.frequency", 0); - std::string chan = pt.get("soapyoutput.channel", ""); + outputsoapy_conf.device = pt.Get("soapyoutput.device", ""); + outputsoapy_conf.masterClockRate = pt.GetInteger("soapyoutput.master_clock_rate", 0); + + outputsoapy_conf.txgain = pt.GetReal("soapyoutput.txgain", 0.0); + outputsoapy_conf.tx_antenna = pt.Get("soapyoutput.tx_antenna", ""); + outputsoapy_conf.lo_offset = pt.GetReal("soapyoutput.lo_offset", 0.0); + outputsoapy_conf.frequency = pt.GetReal("soapyoutput.frequency", 0); + std::string chan = pt.Get("soapyoutput.channel", ""); outputsoapy_conf.dabMode = mod_settings.dabMode; if (outputsoapy_conf.frequency == 0 && chan == "") { @@ -314,15 +305,15 @@ static void parse_configfile( throw std::runtime_error("Configuration error"); } - outputsoapy_conf.dpdFeedbackServerPort = pt.get("soapyoutput.dpd_port", 0); + outputsoapy_conf.dpdFeedbackServerPort = pt.GetInteger("soapyoutput.dpd_port", 0); mod_settings.useSoapyOutput = true; } #endif #if defined(HAVE_ZEROMQ) else if (output_selected == "zmq") { - mod_settings.outputName = pt.get("zmqoutput.listen"); - mod_settings.zmqOutputSocketType = pt.get("zmqoutput.socket_type"); + mod_settings.outputName = pt.Get("zmqoutput.listen", ""); + mod_settings.zmqOutputSocketType = pt.Get("zmqoutput.socket_type", ""); mod_settings.useZeroMQOutput = true; } #endif @@ -332,12 +323,12 @@ static void parse_configfile( } #if defined(HAVE_OUTPUT_UHD) - mod_settings.sdr_device_config.enableSync = (pt.get("delaymanagement.synchronous", 0) == 1); - mod_settings.sdr_device_config.muteNoTimestamps = (pt.get("delaymanagement.mutenotimestamps", 0) == 1); + mod_settings.sdr_device_config.enableSync = (pt.GetInteger("delaymanagement.synchronous", 0) == 1); + mod_settings.sdr_device_config.muteNoTimestamps = (pt.GetInteger("delaymanagement.mutenotimestamps", 0) == 1); if (mod_settings.sdr_device_config.enableSync) { - std::string delay_mgmt = pt.get("delaymanagement.management", ""); - std::string fixedoffset = pt.get("delaymanagement.fixedoffset", ""); - std::string offset_filename = pt.get("delaymanagement.dynamicoffsetfile", ""); + std::string delay_mgmt = pt.Get("delaymanagement.management", ""); + std::string fixedoffset = pt.Get("delaymanagement.fixedoffset", ""); + std::string offset_filename = pt.Get("delaymanagement.dynamicoffsetfile", ""); if (not(delay_mgmt.empty() and fixedoffset.empty() and offset_filename.empty())) { std::cerr << "Warning: you are using the old config syntax for the offset management.\n"; @@ -345,7 +336,7 @@ static void parse_configfile( } try { - mod_settings.tist_offset_s = pt.get("delaymanagement.offset"); + mod_settings.tist_offset_s = pt.GetReal("delaymanagement.offset", 0.0); } catch (std::exception &e) { std::cerr << "Error: delaymanagement: synchronous is enabled, but no offset defined!\n"; @@ -356,10 +347,10 @@ static void parse_configfile( #endif /* Read TII parameters from config file */ - mod_settings.tiiConfig.enable = pt.get("tii.enable", 0); - mod_settings.tiiConfig.comb = pt.get("tii.comb", 0); - mod_settings.tiiConfig.pattern = pt.get("tii.pattern", 0); - mod_settings.tiiConfig.old_variant = pt.get("tii.old_variant", 0); + mod_settings.tiiConfig.enable = pt.GetInteger("tii.enable", 0); + mod_settings.tiiConfig.comb = pt.GetInteger("tii.comb", 0); + mod_settings.tiiConfig.pattern = pt.GetInteger("tii.pattern", 0); + mod_settings.tiiConfig.old_variant = pt.GetInteger("tii.old_variant", 0); } -- cgit v1.2.3