mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-09-09 18:27:49 -04:00
SDR Device settings live refresh
This commit is contained in:
parent
48aff5baf1
commit
609a2216ad
@ -95,8 +95,7 @@ wxPGProperty *SDRDevicesDialog::addArgInfoProperty(wxPropertyGrid *pg, SoapySDR:
|
|||||||
return prop;
|
return prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRDevicesDialog::OnSelectionChanged( wxTreeEvent& event ) {
|
void SDRDevicesDialog::refreshDeviceProperties() {
|
||||||
|
|
||||||
SDRDeviceInfo *selDev = getSelectedDevice(devTree->GetSelection());
|
SDRDeviceInfo *selDev = getSelectedDevice(devTree->GetSelection());
|
||||||
if (selDev && selDev->isAvailable()) {
|
if (selDev && selDev->isAvailable()) {
|
||||||
dev = selDev;
|
dev = selDev;
|
||||||
@ -104,7 +103,8 @@ void SDRDevicesDialog::OnSelectionChanged( wxTreeEvent& event ) {
|
|||||||
DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(dev->getName());
|
DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(dev->getName());
|
||||||
m_propertyGrid->Clear();
|
m_propertyGrid->Clear();
|
||||||
|
|
||||||
SoapySDR::ArgInfoList args = dev->getSoapyDevice()->getSettingInfo();
|
SoapySDR::Device *soapyDev = dev->getSoapyDevice();
|
||||||
|
SoapySDR::ArgInfoList args = soapyDev->getSettingInfo();
|
||||||
SoapySDR::ArgInfoList::const_iterator args_i;
|
SoapySDR::ArgInfoList::const_iterator args_i;
|
||||||
|
|
||||||
m_propertyGrid->Append(new wxPropertyCategory("General Settings"));
|
m_propertyGrid->Append(new wxPropertyCategory("General Settings"));
|
||||||
@ -113,15 +113,16 @@ void SDRDevicesDialog::OnSelectionChanged( wxTreeEvent& event ) {
|
|||||||
devSettings["name"] = m_propertyGrid->Append( new wxStringProperty("Name", wxPG_LABEL, devConfig->getDeviceName()) );
|
devSettings["name"] = m_propertyGrid->Append( new wxStringProperty("Name", wxPG_LABEL, devConfig->getDeviceName()) );
|
||||||
devSettings["offset"] = m_propertyGrid->Append( new wxIntProperty("Offset (Hz)", wxPG_LABEL, devConfig->getOffset()) );
|
devSettings["offset"] = m_propertyGrid->Append( new wxIntProperty("Offset (Hz)", wxPG_LABEL, devConfig->getOffset()) );
|
||||||
|
|
||||||
props.erase(props.begin(), props.end());
|
runtimeProps.erase(runtimeProps.begin(), runtimeProps.end());
|
||||||
|
streamProps.erase(streamProps.begin(), streamProps.end());
|
||||||
|
|
||||||
if (args.size()) {
|
if (args.size()) {
|
||||||
m_propertyGrid->Append(new wxPropertyCategory("Run-time Settings"));
|
m_propertyGrid->Append(new wxPropertyCategory("Run-time Settings"));
|
||||||
|
|
||||||
|
|
||||||
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);
|
||||||
props.push_back(addArgInfoProperty(m_propertyGrid, arg));
|
arg.value = soapyDev->readSetting(arg.key);
|
||||||
|
runtimeProps[arg.key] = addArgInfoProperty(m_propertyGrid, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +144,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);
|
||||||
props.push_back(addArgInfoProperty(m_propertyGrid, arg));
|
streamProps[arg.key] = addArgInfoProperty(m_propertyGrid, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -159,7 +160,8 @@ void SDRDevicesDialog::OnSelectionChanged( wxTreeEvent& event ) {
|
|||||||
} else if (selDev && !selDev->isAvailable() && selDev->isManual()) {
|
} else if (selDev && !selDev->isAvailable() && selDev->isManual()) {
|
||||||
m_propertyGrid->Clear();
|
m_propertyGrid->Clear();
|
||||||
devSettings.erase(devSettings.begin(),devSettings.end());
|
devSettings.erase(devSettings.begin(),devSettings.end());
|
||||||
props.erase(props.begin(), props.end());
|
runtimeProps.erase(runtimeProps.begin(), runtimeProps.end());
|
||||||
|
streamProps.erase(streamProps.begin(), streamProps.end());
|
||||||
removeId = devTree->GetSelection();
|
removeId = devTree->GetSelection();
|
||||||
dev = nullptr;
|
dev = nullptr;
|
||||||
selId = nullptr;
|
selId = nullptr;
|
||||||
@ -170,6 +172,10 @@ void SDRDevicesDialog::OnSelectionChanged( wxTreeEvent& event ) {
|
|||||||
m_addRemoteButton->SetLabel("Add");
|
m_addRemoteButton->SetLabel("Add");
|
||||||
removeId = nullptr;
|
removeId = nullptr;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDRDevicesDialog::OnSelectionChanged( wxTreeEvent& event ) {
|
||||||
|
refreshDeviceProperties();
|
||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,7 +187,8 @@ void SDRDevicesDialog::OnAddRemote( wxMouseEvent& /* event */) {
|
|||||||
SDREnumerator::removeManual(selDev->getDriver(),selDev->getManualParams());
|
SDREnumerator::removeManual(selDev->getDriver(),selDev->getManualParams());
|
||||||
m_propertyGrid->Clear();
|
m_propertyGrid->Clear();
|
||||||
devSettings.erase(devSettings.begin(),devSettings.end());
|
devSettings.erase(devSettings.begin(),devSettings.end());
|
||||||
props.erase(props.begin(), props.end());
|
runtimeProps.erase(runtimeProps.begin(), runtimeProps.end());
|
||||||
|
streamProps.erase(streamProps.begin(), streamProps.end());
|
||||||
dev = nullptr;
|
dev = nullptr;
|
||||||
selId = nullptr;
|
selId = nullptr;
|
||||||
editId = nullptr;
|
editId = nullptr;
|
||||||
@ -233,9 +240,8 @@ SDRDeviceInfo *SDRDevicesDialog::getSelectedDevice(wxTreeItemId selId) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRDevicesDialog::OnUseSelected( wxMouseEvent& /* event */) {
|
void SDRDevicesDialog::OnUseSelected( wxMouseEvent& event) {
|
||||||
if (dev != NULL) {
|
if (dev != NULL) {
|
||||||
int i = 0;
|
|
||||||
SoapySDR::ArgInfoList::const_iterator args_i;
|
SoapySDR::ArgInfoList::const_iterator args_i;
|
||||||
SoapySDR::ArgInfoList args = dev->getSoapyDevice()->getSettingInfo();
|
SoapySDR::ArgInfoList args = dev->getSoapyDevice()->getSettingInfo();
|
||||||
|
|
||||||
@ -244,7 +250,7 @@ void SDRDevicesDialog::OnUseSelected( wxMouseEvent& /* 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);
|
||||||
wxPGProperty *prop = props[i];
|
wxPGProperty *prop = runtimeProps[arg.key];
|
||||||
|
|
||||||
if (arg.type == SoapySDR::ArgInfo::STRING && arg.options.size()) {
|
if (arg.type == SoapySDR::ArgInfo::STRING && arg.options.size()) {
|
||||||
settingArgs[arg.key] = arg.options[prop->GetChoiceSelection()];
|
settingArgs[arg.key] = arg.options[prop->GetChoiceSelection()];
|
||||||
@ -253,8 +259,6 @@ void SDRDevicesDialog::OnUseSelected( wxMouseEvent& /* event */) {
|
|||||||
} else {
|
} else {
|
||||||
settingArgs[arg.key] = prop->GetValueAsString();
|
settingArgs[arg.key] = prop->GetValueAsString();
|
||||||
}
|
}
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev) {
|
if (dev) {
|
||||||
@ -263,7 +267,7 @@ void SDRDevicesDialog::OnUseSelected( wxMouseEvent& /* event */) {
|
|||||||
if (args.size()) {
|
if (args.size()) {
|
||||||
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);
|
||||||
wxPGProperty *prop = props[i];
|
wxPGProperty *prop = streamProps[arg.key];
|
||||||
|
|
||||||
if (arg.type == SoapySDR::ArgInfo::STRING && arg.options.size()) {
|
if (arg.type == SoapySDR::ArgInfo::STRING && arg.options.size()) {
|
||||||
streamArgs[arg.key] = arg.options[prop->GetChoiceSelection()];
|
streamArgs[arg.key] = arg.options[prop->GetChoiceSelection()];
|
||||||
@ -272,8 +276,6 @@ void SDRDevicesDialog::OnUseSelected( wxMouseEvent& /* event */) {
|
|||||||
} else {
|
} else {
|
||||||
streamArgs[arg.key] = prop->GetValueAsString();
|
streamArgs[arg.key] = prop->GetValueAsString();
|
||||||
}
|
}
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -287,6 +289,7 @@ void SDRDevicesDialog::OnUseSelected( wxMouseEvent& /* event */) {
|
|||||||
wxGetApp().setDevice(dev);
|
wxGetApp().setDevice(dev);
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRDevicesDialog::OnTreeDoubleClick( wxMouseEvent& event ) {
|
void SDRDevicesDialog::OnTreeDoubleClick( wxMouseEvent& event ) {
|
||||||
@ -381,10 +384,6 @@ void SDRDevicesDialog::OnRefreshDevices( wxMouseEvent& /* event */) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SDRDevicesDialog::OnPropGridChanged( wxPropertyGridEvent& event ) {
|
void SDRDevicesDialog::OnPropGridChanged( wxPropertyGridEvent& event ) {
|
||||||
if (!editId) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SDRDeviceInfo *dev = getSelectedDevice(editId);
|
|
||||||
if (editId && event.GetProperty() == devSettings["name"]) {
|
if (editId && event.GetProperty() == devSettings["name"]) {
|
||||||
DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(dev->getDeviceId());
|
DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(dev->getDeviceId());
|
||||||
|
|
||||||
@ -397,13 +396,23 @@ void SDRDevicesDialog::OnPropGridChanged( wxPropertyGridEvent& event ) {
|
|||||||
if (devName == "") {
|
if (devName == "") {
|
||||||
event.GetProperty()->SetValueFromString(devConfig->getDeviceName());
|
event.GetProperty()->SetValueFromString(devConfig->getDeviceName());
|
||||||
}
|
}
|
||||||
}
|
} else if (dev && event.GetProperty() == devSettings["offset"]) {
|
||||||
if (dev && event.GetProperty() == devSettings["offset"]) {
|
|
||||||
DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(dev->getDeviceId());
|
DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(dev->getDeviceId());
|
||||||
|
|
||||||
long offset = event.GetPropertyValue().GetInteger();
|
long offset = event.GetPropertyValue().GetInteger();
|
||||||
|
|
||||||
devConfig->setOffset(offset);
|
devConfig->setOffset(offset);
|
||||||
|
} else if (editId && dev) {
|
||||||
|
wxPGProperty *prop = event.GetProperty();
|
||||||
|
|
||||||
|
for (std::map<std::string, wxPGProperty *>::iterator rtp = runtimeProps.begin(); rtp != runtimeProps.end(); rtp++) {
|
||||||
|
if (rtp->second == prop) {
|
||||||
|
SoapySDR::Device *soapyDev = dev->getSoapyDevice();
|
||||||
|
soapyDev->writeSetting(rtp->first, prop->GetValueAsString().ToStdString());
|
||||||
|
refreshDeviceProperties();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -417,7 +426,8 @@ void SDRDevicesDialog::doRefreshDevices() {
|
|||||||
devTree->DeleteAllItems();
|
devTree->DeleteAllItems();
|
||||||
devTree->Disable();
|
devTree->Disable();
|
||||||
m_propertyGrid->Clear();
|
m_propertyGrid->Clear();
|
||||||
props.erase(props.begin(),props.end());
|
runtimeProps.erase(runtimeProps.begin(), runtimeProps.end());
|
||||||
|
streamProps.erase(streamProps.begin(), streamProps.end());
|
||||||
devSettings.erase(devSettings.begin(), devSettings.end());
|
devSettings.erase(devSettings.begin(), devSettings.end());
|
||||||
m_refreshButton->Disable();
|
m_refreshButton->Disable();
|
||||||
m_addRemoteButton->Disable();
|
m_addRemoteButton->Disable();
|
||||||
|
@ -24,6 +24,7 @@ public:
|
|||||||
void OnPropGridFocus( wxFocusEvent& event );
|
void OnPropGridFocus( wxFocusEvent& event );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void refreshDeviceProperties();
|
||||||
void doRefreshDevices();
|
void doRefreshDevices();
|
||||||
|
|
||||||
SDRDeviceInfo *getSelectedDevice(wxTreeItemId selId);
|
SDRDeviceInfo *getSelectedDevice(wxTreeItemId selId);
|
||||||
@ -35,7 +36,8 @@ 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;
|
SDRDeviceInfo *dev;
|
||||||
std::vector<wxPGProperty *> props;
|
std::map<std::string, wxPGProperty *> runtimeProps;
|
||||||
|
std::map<std::string, wxPGProperty *> streamProps;
|
||||||
std::map<std::string, wxPGProperty *> devSettings;
|
std::map<std::string, wxPGProperty *> devSettings;
|
||||||
wxTreeItemId selId;
|
wxTreeItemId selId;
|
||||||
wxTreeItemId editId;
|
wxTreeItemId editId;
|
||||||
|
@ -273,64 +273,6 @@ std::vector<SDRDeviceInfo *> *SDREnumerator::enumerate_devices(std::string remot
|
|||||||
}
|
}
|
||||||
|
|
||||||
dev->setDeviceArgs(deviceArgs);
|
dev->setDeviceArgs(deviceArgs);
|
||||||
// dev->setSettingsInfo(settingsInfo);
|
|
||||||
|
|
||||||
// int numChan = device->getNumChannels(SOAPY_SDR_RX);
|
|
||||||
// for (int i = 0; i < numChan; i++) {
|
|
||||||
// SDRDeviceChannel *chan = new SDRDeviceChannel();
|
|
||||||
//
|
|
||||||
// SoapySDR::RangeList rfRange = device->getFrequencyRange(SOAPY_SDR_RX, i);
|
|
||||||
// double rfMin = rfRange[0].minimum();
|
|
||||||
// double rfMax = rfRange[rfRange.size()-1].maximum();
|
|
||||||
// chan->setChannel(i);
|
|
||||||
// chan->setFullDuplex(device->getFullDuplex(SOAPY_SDR_RX, i));
|
|
||||||
// chan->setRx(true);
|
|
||||||
// chan->setTx(false);
|
|
||||||
// chan->getRFRange().setLow(rfMin);
|
|
||||||
// chan->getRFRange().setHigh(rfMax);
|
|
||||||
//
|
|
||||||
// std::vector<std::string> freqs = device->listFrequencies(SOAPY_SDR_RX,i);
|
|
||||||
// if (std::find(freqs.begin(), freqs.end(), "CORR") != freqs.end()) {
|
|
||||||
// chan->setCORR(true);
|
|
||||||
// } else {
|
|
||||||
// chan->setCORR(false);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (device->hasDCOffsetMode(SOAPY_SDR_RX, i)) {
|
|
||||||
// chan->setHardwareDC(true);
|
|
||||||
// } else {
|
|
||||||
// chan->setHardwareDC(false);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// std::vector<double> rates = device->listSampleRates(SOAPY_SDR_RX, i);
|
|
||||||
// for (std::vector<double>::iterator i = rates.begin(); i != rates.end(); i++) {
|
|
||||||
// chan->getSampleRates().push_back((long)(*i));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// ConfigSettings devStreamOpts = cfg->getStreamOpts();
|
|
||||||
// if (devStreamOpts.size()) {
|
|
||||||
// dev->setStreamArgs(devStreamOpts);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// SoapySDR::ArgInfoList optArgs = device->getStreamArgsInfo(SOAPY_SDR_RX, i);
|
|
||||||
//
|
|
||||||
// if (devStreamOpts.size()) {
|
|
||||||
// for (int j = 0, jMax = optArgs.size(); j < jMax; j++) {
|
|
||||||
// if (devStreamOpts.find(optArgs[j].key) != devStreamOpts.end()) {
|
|
||||||
// optArgs[j].value = devStreamOpts[optArgs[j].key];
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// chan->setStreamArgsInfo(optArgs);
|
|
||||||
//
|
|
||||||
// std::vector<std::string> gainNames = device->listGains(SOAPY_SDR_RX, i);
|
|
||||||
//
|
|
||||||
// for (std::vector<std::string>::iterator gname = gainNames.begin(); gname!= gainNames.end(); gname++) {
|
|
||||||
// chan->addGain((*gname),device->getGainRange(SOAPY_SDR_RX, i, (*gname)));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// dev->addChannel(chan);
|
|
||||||
// }
|
|
||||||
|
|
||||||
SoapySDR::Device::unmake(device);
|
SoapySDR::Device::unmake(device);
|
||||||
dev->setAvailable(true);
|
dev->setAvailable(true);
|
||||||
|
@ -138,18 +138,10 @@ void SDRThread::init() {
|
|||||||
}
|
}
|
||||||
setting_value_changed.store(false);
|
setting_value_changed.store(false);
|
||||||
|
|
||||||
SoapySDR::ArgInfoList devSettings = deviceInfo.load()->getSoapyDevice()->getSettingInfo();
|
|
||||||
if (devSettings.size()) {
|
|
||||||
for (size_t j = 0; j < settingsInfo.size(); j++) {
|
|
||||||
if (settings.find(settingsInfo[j].key) != settings.end()) {
|
|
||||||
devSettings[j].value = settings[devSettings[j].key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// deviceInfo.load()->setSettingsInfo(devSettings);
|
|
||||||
|
|
||||||
setting_busy.unlock();
|
setting_busy.unlock();
|
||||||
|
|
||||||
|
updateSettings();
|
||||||
|
|
||||||
wxGetApp().sdrThreadNotify(SDRThread::SDR_THREAD_INITIALIZED, std::string("Device Initialized."));
|
wxGetApp().sdrThreadNotify(SDRThread::SDR_THREAD_INITIALIZED, std::string("Device Initialized."));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user