SDR Device dialog property settings now functional

This commit is contained in:
Charles J. Cliffe 2015-11-04 02:04:52 -05:00
parent efbdb2d69f
commit 5346bdd50d
6 changed files with 90 additions and 4 deletions

View File

@ -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); sdrThread->setDevice(dev);
DeviceConfig *devConfig = config.getDevice(dev->getDeviceId()); DeviceConfig *devConfig = config.getDevice(dev->getDeviceId());
@ -599,3 +603,11 @@ float CubicSDR::getGain(std::string name) {
return sdrThread->getGain(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;
}

View File

@ -109,6 +109,9 @@ public:
void setGain(std::string name, float gain_in); void setGain(std::string name, float gain_in);
float getGain(std::string name); float getGain(std::string name);
void setStreamArgs(SoapySDR::Kwargs streamArgs_in);
void setDeviceArgs(SoapySDR::Kwargs settingArgs_in);
private: private:
AppFrame *appframe; AppFrame *appframe;
AppConfig config; AppConfig config;
@ -140,6 +143,9 @@ private:
SDRDevicesDialog *deviceSelectorDialog; SDRDevicesDialog *deviceSelectorDialog;
SoapySDR::Kwargs streamArgs;
SoapySDR::Kwargs settingArgs;
std::thread *t_SDR, *t_SDREnum, *t_PostSDR, *t_SpectrumVisual, *t_DemodVisual; std::thread *t_SDR, *t_SDREnum, *t_PostSDR, *t_SpectrumVisual, *t_DemodVisual;
std::atomic_bool devicesReady; std::atomic_bool devicesReady;
std::atomic_bool deviceSelectorOpen; std::atomic_bool deviceSelectorOpen;

View File

@ -93,7 +93,7 @@ void SDRDevicesDialog::OnSelectionChanged( wxTreeEvent& event ) {
wxTreeItemId selId = devTree->GetSelection(); wxTreeItemId selId = devTree->GetSelection();
dev = getSelectedDevice(selId); dev = getSelectedDevice(selId);
props.erase(props.begin(), props.end());
if (dev) { if (dev) {
m_propertyGrid->Clear(); m_propertyGrid->Clear();
m_propertyGrid->Append(new wxPropertyCategory("Run-time Settings")); 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++) { for (args_i = args.begin(); args_i != args.end(); args_i++) {
SoapySDR::ArgInfo arg = (*args_i); SoapySDR::ArgInfo arg = (*args_i);
addArgInfoProperty(m_propertyGrid, arg); props.push_back(addArgInfoProperty(m_propertyGrid, arg));
} }
if (dev->getRxChannel()) { if (dev->getRxChannel()) {
@ -115,7 +115,7 @@ void SDRDevicesDialog::OnSelectionChanged( wxTreeEvent& event ) {
for (args_i = args.begin(); args_i != args.end(); args_i++) { for (args_i = args.begin(); args_i != args.end(); args_i++) {
SoapySDR::ArgInfo arg = (*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); dev = getSelectedDevice(selId);
if (dev != NULL) { 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); wxGetApp().setDevice(dev);
Close(); Close();
} }

View File

@ -30,4 +30,5 @@ private:
std::map<wxTreeItemId, SDRDeviceInfo *> devItems; std::map<wxTreeItemId, SDRDeviceInfo *> devItems;
std::map<wxTreeItemId, SDRDeviceInfo *>::iterator devItems_i; std::map<wxTreeItemId, SDRDeviceInfo *>::iterator devItems_i;
SDRDeviceInfo *dev = NULL; SDRDeviceInfo *dev = NULL;
std::vector<wxPGProperty *> props;
}; };

View File

@ -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() { void SDRThread::init() {
SDRDeviceInfo *devInfo = deviceInfo.load(); SDRDeviceInfo *devInfo = deviceInfo.load();
deviceConfig.store(wxGetApp().getConfig()->getDevice(devInfo->getDeviceId())); deviceConfig.store(wxGetApp().getConfig()->getDevice(devInfo->getDeviceId()));
@ -54,7 +66,7 @@ void SDRThread::init() {
wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, std::string("Initializing device.")); wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, std::string("Initializing device."));
device = SoapySDR::Device::make(args); device = SoapySDR::Device::make(args);
stream = device->setupStream(SOAPY_SDR_RX,"CF32", std::vector<size_t>(), devInfo->getStreamArgs()); stream = device->setupStream(SOAPY_SDR_RX,"CF32", std::vector<size_t>(), combineArgs(devInfo->getStreamArgs(),streamArgs));
wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, std::string("Activating stream.")); wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, std::string("Activating stream."));
device->setSampleRate(SOAPY_SDR_RX,0,sampleRate.load()); device->setSampleRate(SOAPY_SDR_RX,0,sampleRate.load());
@ -406,3 +418,6 @@ std::string SDRThread::readSetting(std::string name) {
return val; return val;
} }
void SDRThread::setStreamArgs(SoapySDR::Kwargs streamArgs_in) {
streamArgs = streamArgs_in;
}

View File

@ -78,9 +78,12 @@ public:
void writeSetting(std::string name, std::string value); void writeSetting(std::string name, std::string value);
std::string readSetting(std::string name); std::string readSetting(std::string name);
void setStreamArgs(SoapySDR::Kwargs streamArgs);
protected: protected:
void updateGains(); void updateGains();
void updateSettings(); void updateSettings();
SoapySDR::Kwargs combineArgs(SoapySDR::Kwargs a, SoapySDR::Kwargs b);
SoapySDR::Stream *stream; SoapySDR::Stream *stream;
SoapySDR::Device *device; SoapySDR::Device *device;
@ -104,4 +107,6 @@ protected:
std::mutex gain_busy; std::mutex gain_busy;
std::map<std::string, float> gainValues; std::map<std::string, float> gainValues;
std::map<std::string, bool> gainChanged; std::map<std::string, bool> gainChanged;
SoapySDR::Kwargs streamArgs;
}; };