diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index db8e0fb..49460b2 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -373,6 +373,10 @@ void CubicSDR::setDevice(SDRDeviceInfo *dev) { } } + for (SoapySDR::Kwargs::const_iterator i = settingArgs.begin(); i != settingArgs.end(); i++) { + sdrThread->writeSetting(i->first, i->second); + } + sdrThread->setStreamArgs(streamArgs); sdrThread->setDevice(dev); DeviceConfig *devConfig = config.getDevice(dev->getDeviceId()); @@ -599,3 +603,11 @@ float CubicSDR::getGain(std::string name) { return sdrThread->getGain(name); } +void CubicSDR::setStreamArgs(SoapySDR::Kwargs streamArgs_in) { + streamArgs = streamArgs_in; +} + +void CubicSDR::setDeviceArgs(SoapySDR::Kwargs settingArgs_in) { + settingArgs = settingArgs_in; +} + diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 1946660..4fed242 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -109,6 +109,9 @@ public: void setGain(std::string name, float gain_in); float getGain(std::string name); + void setStreamArgs(SoapySDR::Kwargs streamArgs_in); + void setDeviceArgs(SoapySDR::Kwargs settingArgs_in); + private: AppFrame *appframe; AppConfig config; @@ -140,6 +143,9 @@ private: SDRDevicesDialog *deviceSelectorDialog; + SoapySDR::Kwargs streamArgs; + SoapySDR::Kwargs settingArgs; + std::thread *t_SDR, *t_SDREnum, *t_PostSDR, *t_SpectrumVisual, *t_DemodVisual; std::atomic_bool devicesReady; std::atomic_bool deviceSelectorOpen; diff --git a/src/forms/SDRDevices/SDRDevices.cpp b/src/forms/SDRDevices/SDRDevices.cpp index 9595ff6..3839c99 100644 --- a/src/forms/SDRDevices/SDRDevices.cpp +++ b/src/forms/SDRDevices/SDRDevices.cpp @@ -93,7 +93,7 @@ void SDRDevicesDialog::OnSelectionChanged( wxTreeEvent& event ) { wxTreeItemId selId = devTree->GetSelection(); dev = getSelectedDevice(selId); - + props.erase(props.begin(), props.end()); if (dev) { m_propertyGrid->Clear(); m_propertyGrid->Append(new wxPropertyCategory("Run-time Settings")); @@ -104,7 +104,7 @@ void SDRDevicesDialog::OnSelectionChanged( wxTreeEvent& event ) { for (args_i = args.begin(); args_i != args.end(); args_i++) { SoapySDR::ArgInfo arg = (*args_i); - addArgInfoProperty(m_propertyGrid, arg); + props.push_back(addArgInfoProperty(m_propertyGrid, arg)); } if (dev->getRxChannel()) { @@ -115,7 +115,7 @@ void SDRDevicesDialog::OnSelectionChanged( wxTreeEvent& event ) { for (args_i = args.begin(); args_i != args.end(); args_i++) { SoapySDR::ArgInfo arg = (*args_i); - addArgInfoProperty(m_propertyGrid, arg); + props.push_back(addArgInfoProperty(m_propertyGrid, arg)); } } } @@ -158,6 +158,53 @@ void SDRDevicesDialog::OnUseSelected( wxMouseEvent& event ) { dev = getSelectedDevice(selId); if (dev != NULL) { + + int i = 0; + SoapySDR::ArgInfoList::const_iterator args_i; + SoapySDR::ArgInfoList args = dev->getSettingsArgInfo(); + + SoapySDR::Kwargs settingArgs; + SoapySDR::Kwargs streamArgs; + + for (args_i = args.begin(); args_i != args.end(); args_i++) { + SoapySDR::ArgInfo arg = (*args_i); + wxPGProperty *prop = props[i]; + + if (arg.type == SoapySDR::ArgInfo::STRING && arg.options.size()) { + settingArgs[arg.key] = arg.options[prop->GetChoiceSelection()]; + } else if (arg.type == SoapySDR::ArgInfo::BOOL) { + settingArgs[arg.key] = (prop->GetValueAsString()=="True")?"true":"false"; + } else { + settingArgs[arg.key] = prop->GetValueAsString(); + } + + i++; + } + + if (dev->getRxChannel()) { + args = dev->getRxChannel()->getStreamArgsInfo(); + + if (args.size()) { + for (args_i = args.begin(); args_i != args.end(); args_i++) { + SoapySDR::ArgInfo arg = (*args_i); + wxPGProperty *prop = props[i]; + + if (arg.type == SoapySDR::ArgInfo::STRING && arg.options.size()) { + streamArgs[arg.key] = arg.options[prop->GetChoiceSelection()]; + } else if (arg.type == SoapySDR::ArgInfo::BOOL) { + streamArgs[arg.key] = (prop->GetValueAsString()=="True")?"true":"false"; + } else { + streamArgs[arg.key] = prop->GetValueAsString(); + } + + i++; + } + } + } + + + wxGetApp().setDeviceArgs(settingArgs); + wxGetApp().setStreamArgs(streamArgs); wxGetApp().setDevice(dev); Close(); } diff --git a/src/forms/SDRDevices/SDRDevices.h b/src/forms/SDRDevices/SDRDevices.h index faa6fac..74441ae 100644 --- a/src/forms/SDRDevices/SDRDevices.h +++ b/src/forms/SDRDevices/SDRDevices.h @@ -30,4 +30,5 @@ private: std::map devItems; std::map::iterator devItems_i; SDRDeviceInfo *dev = NULL; + std::vector props; }; \ No newline at end of file diff --git a/src/sdr/SoapySDRThread.cpp b/src/sdr/SoapySDRThread.cpp index 7502074..8b80dc3 100644 --- a/src/sdr/SoapySDRThread.cpp +++ b/src/sdr/SoapySDRThread.cpp @@ -38,6 +38,18 @@ SDRThread::~SDRThread() { } +SoapySDR::Kwargs SDRThread::combineArgs(SoapySDR::Kwargs a, SoapySDR::Kwargs b) { + SoapySDR::Kwargs c; + SoapySDR::Kwargs::iterator i; + for (i = a.begin(); i != a.end(); i++) { + c[i->first] = i->second; + } + for (i = b.begin(); i != b.end(); i++) { + c[i->first] = i->second; + } + return c; +} + void SDRThread::init() { SDRDeviceInfo *devInfo = deviceInfo.load(); deviceConfig.store(wxGetApp().getConfig()->getDevice(devInfo->getDeviceId())); @@ -54,7 +66,7 @@ void SDRThread::init() { wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, std::string("Initializing device.")); device = SoapySDR::Device::make(args); - stream = device->setupStream(SOAPY_SDR_RX,"CF32", std::vector(), devInfo->getStreamArgs()); + stream = device->setupStream(SOAPY_SDR_RX,"CF32", std::vector(), combineArgs(devInfo->getStreamArgs(),streamArgs)); wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, std::string("Activating stream.")); device->setSampleRate(SOAPY_SDR_RX,0,sampleRate.load()); @@ -406,3 +418,6 @@ std::string SDRThread::readSetting(std::string name) { return val; } +void SDRThread::setStreamArgs(SoapySDR::Kwargs streamArgs_in) { + streamArgs = streamArgs_in; +} diff --git a/src/sdr/SoapySDRThread.h b/src/sdr/SoapySDRThread.h index 566422a..4c21103 100644 --- a/src/sdr/SoapySDRThread.h +++ b/src/sdr/SoapySDRThread.h @@ -78,9 +78,12 @@ public: void writeSetting(std::string name, std::string value); std::string readSetting(std::string name); + void setStreamArgs(SoapySDR::Kwargs streamArgs); + protected: void updateGains(); void updateSettings(); + SoapySDR::Kwargs combineArgs(SoapySDR::Kwargs a, SoapySDR::Kwargs b); SoapySDR::Stream *stream; SoapySDR::Device *device; @@ -104,4 +107,6 @@ protected: std::mutex gain_busy; std::map gainValues; std::map gainChanged; + + SoapySDR::Kwargs streamArgs; };