diff options
-rw-r--r-- | src/ConfigParser.cpp | 30 | ||||
-rw-r--r-- | src/output/Lime.cpp | 48 | ||||
-rw-r--r-- | src/output/Lime.h | 8 |
3 files changed, 66 insertions, 20 deletions
diff --git a/src/ConfigParser.cpp b/src/ConfigParser.cpp index 69655b4..8c80513 100644 --- a/src/ConfigParser.cpp +++ b/src/ConfigParser.cpp @@ -307,6 +307,36 @@ static void parse_configfile( mod_settings.useSoapyOutput = true; } #endif +#if defined(HAVE_LIMESDR) + else if (output_selected == "limesdr") { + auto& outputlime_conf = mod_settings.sdr_device_config; + outputlime_conf.device = pt.Get("soapyoutput.device", ""); + outputlime_conf.masterClockRate = pt.GetInteger("soapyoutput.master_clock_rate", 0); + + outputlime_conf.txgain = pt.GetReal("soapyoutput.txgain", 0.0); + outputlime_conf.tx_antenna = pt.Get("soapyoutput.tx_antenna", ""); + outputlime_conf.lo_offset = pt.GetReal("soapyoutput.lo_offset", 0.0); + outputlime_conf.frequency = pt.GetReal("soapyoutput.frequency", 0); + std::string chan = pt.Get("soapyoutput.channel", ""); + outputlime_conf.dabMode = mod_settings.dabMode; + + if (outputlime_conf.frequency == 0 && chan == "") { + std::cerr << " soapy output enabled, but neither frequency nor channel defined.\n"; + throw std::runtime_error("Configuration error"); + } + else if (outputlime_conf.frequency == 0) { + outputlime_conf.frequency = parseChannel(chan); + } + else if (outputlime_conf.frequency != 0 && chan != "") { + std::cerr << " soapy output: cannot define both frequency and channel.\n"; + throw std::runtime_error("Configuration error"); + } + + outputlime_conf.dpdFeedbackServerPort = pt.GetInteger("soapyoutput.dpd_port", 0); + + mod_settings.useLimeOutput = true; + } +#endif #if defined(HAVE_ZEROMQ) else if (output_selected == "zmq") { mod_settings.outputName = pt.Get("zmqoutput.listen", ""); diff --git a/src/output/Lime.cpp b/src/output/Lime.cpp index 82a42be..e67e90e 100644 --- a/src/output/Lime.cpp +++ b/src/output/Lime.cpp @@ -53,22 +53,40 @@ Lime::Lime(SDRDeviceConfig& config) : etiLog.level(info) << "Lime:Creating the device with: " << m_conf.device; - /* - try { - m_device = SoapySDR::Device::make(m_conf.device); - stringstream ss; - ss << "SoapySDR driver=" << m_device->getDriverKey(); - ss << " hardware=" << m_device->getHardwareKey(); - for (const auto &it : m_device->getHardwareInfo()) { - ss << " " << it.first << "=" << it.second; - } - } - catch (const std::exception &ex) { - etiLog.level(error) << "Error making SoapySDR device: " << - ex.what(); - throw std::runtime_error("Cannot create SoapySDR output"); - } + int device_count = LMS_GetDeviceList(NULL); + if (device_count < 0) + { + etiLog.level(error) << "Error making LimeSDR device: " << LMS_GetLastErrorMessage(); + throw std::runtime_error("Cannot find LimeSDR output device"); + + } + lms_info_str_t device_list[device_count]; + if (LMS_GetDeviceList(device_list) < 0) + { + etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage(); + throw std::runtime_error("Cannot find LimeSDR output device"); + + } + unsigned int device_i=0; // If several cards, need to get device by configuration + if (LMS_Open(&m_device, device_list[device_i], NULL) < 0) + { + etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage(); + throw std::runtime_error("Cannot open LimeSDR output device"); + } + if (LMS_Reset(m_device) < 0) + { + etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage(); + throw std::runtime_error("Cannot reset LimeSDR output device"); + } + + if (LMS_Init(m_device) < 0) + { + etiLog.level(error) << "Error making LimeSDR device: %s " << LMS_GetLastErrorMessage(); + throw std::runtime_error("Cannot init LimeSDR output device"); + } + + /* m_device->setMasterClockRate(m_conf.masterClockRate); etiLog.level(info) << "SoapySDR master clock rate set to " << std::fixed << std::setprecision(4) << diff --git a/src/output/Lime.h b/src/output/Lime.h index ad594c0..1770aaf 100644 --- a/src/output/Lime.h +++ b/src/output/Lime.h @@ -3,13 +3,11 @@ Queen in Right of Canada (Communications Research Center Canada) Copyright (C) 2018 - Matthias P. Braendli, matthias.braendli@mpb.li - - http://opendigitalradio.org + Evariste F5OEO, evaristec@gmail.com + DESCRIPTION: - It is an output driver using the SoapySDR library that can output to - many devices. + It is an output driver using the LimeSDR library. */ /* |