2017-01-02 21:07:43 -05:00
// Copyright (c) Charles J. Cliffe
// SPDX-License-Identifier: GPL-2.0+
2015-10-03 21:35:11 -04:00
# include "SDRDevices.h"
2015-10-05 02:21:08 -04:00
# include <wx/textdlg.h>
# include <wx/msgdlg.h>
2015-10-04 16:07:14 -04:00
# include "CubicSDR.h"
2017-08-23 23:27:49 +02:00
# include <algorithm>
2017-01-27 22:34:38 +01:00
# ifdef __linux__
# include "CubicSDR.xpm"
# endif
2016-11-01 22:29:58 -04:00
SDRDevicesDialog : : SDRDevicesDialog ( wxWindow * parent ) : devFrame ( parent , wxID_ANY , wxT ( CUBICSDR_INSTALL_NAME " :: SDR Devices " ) ) {
2015-10-05 02:21:08 -04:00
refresh = true ;
2016-01-13 21:59:47 -05:00
failed = false ;
2016-01-17 21:54:22 -05:00
m_refreshButton - > Disable ( ) ;
2015-10-05 02:21:08 -04:00
m_addRemoteButton - > Disable ( ) ;
m_useSelectedButton - > Disable ( ) ;
m_deviceTimer . Start ( 250 ) ;
2016-01-19 18:38:18 -05:00
selId = nullptr ;
editId = nullptr ;
2016-01-22 00:40:00 -05:00
removeId = nullptr ;
2016-01-20 00:43:31 -05:00
devAddDialog = nullptr ;
2016-01-24 10:38:14 -05:00
dev = nullptr ;
2017-01-27 22:34:38 +01:00
# ifdef __linux__
SetIcon ( wxICON ( cubicsdr ) ) ;
# elif _WIN32
SetIcon ( wxICON ( frame_icon ) ) ;
# endif
2016-01-17 21:54:22 -05:00
}
2015-10-04 16:07:14 -04:00
2016-01-27 11:20:14 +11:00
void SDRDevicesDialog : : OnClose ( wxCloseEvent & /* event */ ) {
2015-10-05 02:21:08 -04:00
wxGetApp ( ) . setDeviceSelectorClosed ( ) ;
Destroy ( ) ;
}
2015-10-04 16:07:14 -04:00
void SDRDevicesDialog : : OnDeleteItem ( wxTreeEvent & event ) {
event . Skip ( ) ;
}
2015-11-03 00:53:39 -05:00
wxPGProperty * SDRDevicesDialog : : addArgInfoProperty ( wxPropertyGrid * pg , SoapySDR : : ArgInfo arg ) {
wxPGProperty * prop = NULL ;
int intVal ;
double floatVal ;
std : : vector < std : : string > : : iterator stringIter ;
switch ( arg . type ) {
case SoapySDR : : ArgInfo : : INT :
try {
intVal = std : : stoi ( arg . value ) ;
} catch ( std : : invalid_argument e ) {
intVal = 0 ;
}
prop = pg - > Append ( new wxIntProperty ( arg . name , wxPG_LABEL , intVal ) ) ;
if ( arg . range . minimum ( ) ! = arg . range . maximum ( ) ) {
pg - > SetPropertyAttribute ( prop , wxPG_ATTR_MIN , arg . range . minimum ( ) ) ;
pg - > SetPropertyAttribute ( prop , wxPG_ATTR_MAX , arg . range . maximum ( ) ) ;
}
break ;
case SoapySDR : : ArgInfo : : FLOAT :
try {
floatVal = std : : stod ( arg . value ) ;
} catch ( std : : invalid_argument e ) {
floatVal = 0 ;
}
prop = pg - > Append ( new wxFloatProperty ( arg . name , wxPG_LABEL , floatVal ) ) ;
if ( arg . range . minimum ( ) ! = arg . range . maximum ( ) ) {
pg - > SetPropertyAttribute ( prop , wxPG_ATTR_MIN , arg . range . minimum ( ) ) ;
pg - > SetPropertyAttribute ( prop , wxPG_ATTR_MAX , arg . range . maximum ( ) ) ;
}
break ;
case SoapySDR : : ArgInfo : : BOOL :
prop = pg - > Append ( new wxBoolProperty ( arg . name , wxPG_LABEL , ( arg . value = = " true " ) ) ) ;
break ;
case SoapySDR : : ArgInfo : : STRING :
if ( arg . options . size ( ) ) {
intVal = 0 ;
prop = pg - > Append ( new wxEnumProperty ( arg . name , wxPG_LABEL ) ) ;
for ( stringIter = arg . options . begin ( ) ; stringIter ! = arg . options . end ( ) ; stringIter + + ) {
2015-11-03 19:58:42 -05:00
std : : string optName = ( * stringIter ) ;
std : : string displayName = optName ;
if ( arg . optionNames . size ( ) ) {
displayName = arg . optionNames [ intVal ] ;
}
prop - > AddChoice ( displayName ) ;
2015-11-03 00:53:39 -05:00
if ( ( * stringIter ) = = arg . value ) {
prop - > SetChoiceSelection ( intVal ) ;
}
2015-11-03 19:58:42 -05:00
2015-11-03 00:53:39 -05:00
intVal + + ;
}
} else {
prop = pg - > Append ( new wxStringProperty ( arg . name , wxPG_LABEL , arg . value ) ) ;
}
break ;
}
if ( prop ! = NULL ) {
prop - > SetHelpString ( arg . key + " : " + arg . description ) ;
}
return prop ;
}
2016-02-01 20:30:48 -05:00
void SDRDevicesDialog : : refreshDeviceProperties ( ) {
2017-08-23 23:27:49 +02:00
2016-01-18 20:46:56 -05:00
SDRDeviceInfo * selDev = getSelectedDevice ( devTree - > GetSelection ( ) ) ;
2016-01-20 00:43:31 -05:00
if ( selDev & & selDev - > isAvailable ( ) ) {
2016-01-18 20:46:56 -05:00
dev = selDev ;
selId = devTree - > GetSelection ( ) ;
DeviceConfig * devConfig = wxGetApp ( ) . getConfig ( ) - > getDevice ( dev - > getName ( ) ) ;
2015-11-03 00:53:39 -05:00
m_propertyGrid - > Clear ( ) ;
2016-02-01 20:30:48 -05:00
SoapySDR : : Device * soapyDev = dev - > getSoapyDevice ( ) ;
SoapySDR : : ArgInfoList args = soapyDev - > getSettingInfo ( ) ;
2017-08-23 23:27:49 +02:00
//A) General settings: name, offset, sample rate, agc, antennas (if > 1)
2016-01-18 20:46:56 -05:00
m_propertyGrid - > Append ( new wxPropertyCategory ( " General Settings " ) ) ;
2015-11-03 00:53:39 -05:00
2017-08-12 01:04:21 +02:00
devSettings . clear ( ) ;
2017-08-23 23:27:49 +02:00
//A-1) Name
2016-01-18 20:46:56 -05:00
devSettings [ " name " ] = m_propertyGrid - > Append ( new wxStringProperty ( " Name " , wxPG_LABEL , devConfig - > getDeviceName ( ) ) ) ;
2017-08-23 23:27:49 +02:00
//A-2) Offset
2017-09-01 18:23:53 +02:00
devSettings [ " offset " ] = m_propertyGrid - > Append ( new wxIntProperty ( " Offset (KHz) " , wxPG_LABEL , devConfig - > getOffset ( ) / 1000 ) ) ;
2017-08-23 23:49:52 +02:00
//A-3) Antennas, is there are more than 1 RX antenna, else do not expose the setting.
2017-08-23 23:27:49 +02:00
//get the saved setting
2017-08-23 23:49:52 +02:00
const std : : string & currentSetAntenna = devConfig - > getAntennaName ( ) ;
2017-08-23 23:27:49 +02:00
//compare to the list of existing antennas
SoapySDR : : ArgInfo antennasArg ;
std : : vector < std : : string > antennaOpts = selDev - > getAntennaNames ( SOAPY_SDR_RX , 0 ) ;
//only do something if there is more than 1 antenna
if ( antennaOpts . size ( ) > 1 ) {
//by default, choose the first of the list.
std : : string antennaToSelect = antennaOpts . front ( ) ;
auto found_i = std : : find ( antennaOpts . begin ( ) , antennaOpts . end ( ) , currentSetAntenna ) ;
if ( found_i ! = antennaOpts . end ( ) ) {
antennaToSelect = currentSetAntenna ;
}
2017-08-24 21:11:50 +02:00
else {
//erroneous antenna name, re-write device config with the first choice of teh list.
devConfig - > setAntennaName ( antennaToSelect ) ;
}
2017-08-23 23:27:49 +02:00
//build device settings
for ( std : : string antenna : antennaOpts ) {
antennasArg . options . push_back ( antenna ) ;
antennasArg . optionNames . push_back ( antenna ) ;
}
antennasArg . type = SoapySDR : : ArgInfo : : STRING ;
antennasArg . units = " " ;
antennasArg . name = " Antenna " ;
antennasArg . key = " antenna " ;
antennasArg . value = antennaToSelect ;
devSettings [ " antenna " ] = addArgInfoProperty ( m_propertyGrid , antennasArg ) ;
deviceArgs [ " antenna " ] = antennasArg ;
} //end if more than 1 antenna
2017-08-24 21:11:50 +02:00
else {
devConfig - > setAntennaName ( " " ) ;
}
2017-08-23 23:27:49 +02:00
2017-08-23 23:49:52 +02:00
//A-4) Sample_rate:
2017-01-21 11:26:51 +01:00
long currentSampleRate = wxGetApp ( ) . getSampleRate ( ) ;
long deviceSampleRate = devConfig - > getSampleRate ( ) ;
2016-05-11 22:37:25 -04:00
if ( ! deviceSampleRate ) {
deviceSampleRate = selDev - > getSampleRateNear ( SOAPY_SDR_RX , 0 , currentSampleRate ) ;
}
SoapySDR : : ArgInfo sampleRateArg ;
std : : vector < long > rateOpts = selDev - > getSampleRates ( SOAPY_SDR_RX , 0 ) ;
2017-08-12 01:04:21 +02:00
for ( long rate : rateOpts ) {
sampleRateArg . options . push_back ( std : : to_string ( rate ) ) ;
sampleRateArg . optionNames . push_back ( frequencyToStr ( rate ) ) ;
2016-05-11 22:37:25 -04:00
}
sampleRateArg . type = SoapySDR : : ArgInfo : : STRING ;
sampleRateArg . units = " Hz " ;
sampleRateArg . name = " Sample Rate " ;
sampleRateArg . key = " sample_rate " ;
sampleRateArg . value = std : : to_string ( deviceSampleRate ) ;
devSettings [ " sample_rate " ] = addArgInfoProperty ( m_propertyGrid , sampleRateArg ) ;
deviceArgs [ " sample_rate " ] = sampleRateArg ;
2017-08-23 23:27:49 +02:00
2016-05-11 22:37:25 -04:00
2017-08-23 23:27:49 +02:00
//B) Runtime Settings:
2017-08-12 01:04:21 +02:00
runtimeArgs . clear ( ) ;
runtimeProps . clear ( ) ;
streamProps . clear ( ) ;
2017-08-23 23:27:49 +02:00
2016-01-18 20:46:56 -05:00
if ( args . size ( ) ) {
m_propertyGrid - > Append ( new wxPropertyCategory ( " Run-time Settings " ) ) ;
2017-08-12 01:04:21 +02:00
for ( SoapySDR : : ArgInfoList : : const_iterator args_i = args . begin ( ) ; args_i ! = args . end ( ) ; args_i + + ) {
2016-01-18 20:46:56 -05:00
SoapySDR : : ArgInfo arg = ( * args_i ) ;
2017-08-12 01:04:21 +02:00
//We-reread the Device configuration, else we use the user settings.
if ( dev ) {
//Apply saved settings
DeviceConfig * devConfig = wxGetApp ( ) . getConfig ( ) - > getDevice ( dev - > getDeviceId ( ) ) ;
arg . value = devConfig - > getSetting ( arg . key , soapyDev - > readSetting ( arg . key ) ) ; //use SoapyDevice data as fallback.
}
else {
//re-read the SoapyDevice
arg . value = soapyDev - > readSetting ( arg . key ) ;
}
2016-02-01 20:30:48 -05:00
runtimeProps [ arg . key ] = addArgInfoProperty ( m_propertyGrid , arg ) ;
2016-02-03 00:05:26 -05:00
runtimeArgs [ arg . key ] = arg ;
2016-01-18 20:46:56 -05:00
}
2015-11-03 00:53:39 -05:00
}
2016-01-31 15:11:54 -05:00
if ( dev ) {
args = dev - > getSoapyDevice ( ) - > getStreamArgsInfo ( SOAPY_SDR_RX , 0 ) ;
2015-12-06 00:32:32 -05:00
DeviceConfig * devConfig = wxGetApp ( ) . getConfig ( ) - > getDevice ( dev - > getDeviceId ( ) ) ;
ConfigSettings devStreamOpts = devConfig - > getStreamOpts ( ) ;
if ( devStreamOpts . size ( ) ) {
for ( int j = 0 , jMax = args . size ( ) ; j < jMax ; j + + ) {
if ( devStreamOpts . find ( args [ j ] . key ) ! = devStreamOpts . end ( ) ) {
args [ j ] . value = devStreamOpts [ args [ j ] . key ] ;
}
}
}
2016-02-01 20:30:48 -05:00
2015-11-03 00:53:39 -05:00
if ( args . size ( ) ) {
m_propertyGrid - > Append ( new wxPropertyCategory ( " Stream Settings " ) ) ;
2016-02-01 20:30:48 -05:00
2017-08-12 01:04:21 +02:00
for ( SoapySDR : : ArgInfo arg : args ) {
2016-02-01 20:30:48 -05:00
streamProps [ arg . key ] = addArgInfoProperty ( m_propertyGrid , arg ) ;
2015-11-03 00:53:39 -05:00
}
}
}
2016-01-20 00:43:31 -05:00
if ( selDev - > isManual ( ) ) {
2016-01-22 00:40:00 -05:00
m_addRemoteButton - > SetLabel ( " Remove " ) ;
removeId = selId ;
} else {
m_addRemoteButton - > SetLabel ( " Add " ) ;
removeId = nullptr ;
2016-01-20 00:43:31 -05:00
}
} else if ( selDev & & ! selDev - > isAvailable ( ) & & selDev - > isManual ( ) ) {
m_propertyGrid - > Clear ( ) ;
2017-08-12 01:04:21 +02:00
devSettings . clear ( ) ;
runtimeArgs . clear ( ) ;
runtimeProps . clear ( ) ;
streamProps . clear ( ) ;
2016-01-22 00:40:00 -05:00
removeId = devTree - > GetSelection ( ) ;
2016-01-20 00:43:31 -05:00
dev = nullptr ;
selId = nullptr ;
editId = nullptr ;
2016-01-22 00:40:00 -05:00
m_addRemoteButton - > SetLabel ( " Remove " ) ;
} else if ( ! selDev ) {
m_addRemoteButton - > SetLabel ( " Add " ) ;
removeId = nullptr ;
2015-11-03 00:53:39 -05:00
}
2016-02-01 20:30:48 -05:00
}
void SDRDevicesDialog : : OnSelectionChanged ( wxTreeEvent & event ) {
refreshDeviceProperties ( ) ;
2015-10-04 16:07:14 -04:00
event . Skip ( ) ;
}
2016-01-27 11:20:14 +11:00
void SDRDevicesDialog : : OnAddRemote ( wxMouseEvent & /* event */ ) {
2016-01-22 00:40:00 -05:00
if ( removeId ! = nullptr ) {
SDRDeviceInfo * selDev = getSelectedDevice ( removeId ) ;
if ( selDev ) {
SDREnumerator : : removeManual ( selDev - > getDriver ( ) , selDev - > getManualParams ( ) ) ;
m_propertyGrid - > Clear ( ) ;
2017-08-12 01:04:21 +02:00
devSettings . clear ( ) ;
runtimeArgs . clear ( ) ;
runtimeProps . clear ( ) ;
streamProps . clear ( ) ;
2016-01-22 00:40:00 -05:00
dev = nullptr ;
selId = nullptr ;
editId = nullptr ;
devTree - > Delete ( removeId ) ;
removeId = nullptr ;
m_addRemoteButton - > SetLabel ( " Add " ) ;
}
return ;
}
2016-01-20 00:43:31 -05:00
devAddDialog = new SDRDeviceAddDialog ( this ) ;
devAddDialog - > ShowModal ( ) ;
2015-10-05 02:21:08 -04:00
2016-01-20 00:43:31 -05:00
if ( devAddDialog - > wasOkPressed ( ) ) {
std : : string module = devAddDialog - > getSelectedModule ( ) ;
if ( module = = " SoapyRemote " ) {
if ( ! SDREnumerator : : hasRemoteModule ( ) ) {
wxMessageDialog * info ;
info = new wxMessageDialog ( NULL , wxT ( " Install SoapyRemote module to add remote servers. \n \n https://github.com/pothosware/SoapyRemote " ) , wxT ( " SoapyRemote not found. " ) , wxOK | wxICON_ERROR ) ;
info - > ShowModal ( ) ;
return ;
}
2015-10-05 02:21:08 -04:00
2016-01-20 00:43:31 -05:00
wxString remoteAddr = devAddDialog - > getModuleParam ( ) ;
if ( ! remoteAddr . Trim ( ) . empty ( ) ) {
wxGetApp ( ) . addRemote ( remoteAddr . Trim ( ) . ToStdString ( ) ) ;
}
devTree - > Disable ( ) ;
m_addRemoteButton - > Disable ( ) ;
m_useSelectedButton - > Disable ( ) ;
refresh = true ;
} else {
std : : string mod = devAddDialog - > getSelectedModule ( ) ;
std : : string param = devAddDialog - > getModuleParam ( ) ;
SDREnumerator : : addManual ( mod , param ) ;
doRefreshDevices ( ) ;
}
2015-10-05 02:21:08 -04:00
}
2015-10-04 16:07:14 -04:00
}
2015-11-03 00:53:39 -05:00
SDRDeviceInfo * SDRDevicesDialog : : getSelectedDevice ( wxTreeItemId selId ) {
devItems_i = devItems . find ( selId ) ;
if ( devItems_i ! = devItems . end ( ) ) {
return devItems [ selId ] ;
}
return NULL ;
}
2016-02-01 20:30:48 -05:00
void SDRDevicesDialog : : OnUseSelected ( wxMouseEvent & event ) {
2015-11-03 00:53:39 -05:00
if ( dev ! = NULL ) {
2017-08-12 01:04:21 +02:00
2016-01-31 15:11:54 -05:00
SoapySDR : : ArgInfoList args = dev - > getSoapyDevice ( ) - > getSettingInfo ( ) ;
2015-11-04 02:04:52 -05:00
SoapySDR : : Kwargs settingArgs ;
SoapySDR : : Kwargs streamArgs ;
2017-08-12 01:04:21 +02:00
for ( SoapySDR : : ArgInfo arg : args ) {
2016-02-01 20:30:48 -05:00
wxPGProperty * prop = runtimeProps [ arg . key ] ;
2015-11-04 02:04:52 -05:00
if ( arg . type = = SoapySDR : : ArgInfo : : STRING & & arg . options . size ( ) ) {
2018-03-21 06:35:13 +01:00
settingArgs [ arg . key ] = getSelectedChoiceOption ( prop , arg ) ;
2015-11-04 02:04:52 -05:00
} else if ( arg . type = = SoapySDR : : ArgInfo : : BOOL ) {
settingArgs [ arg . key ] = ( prop - > GetValueAsString ( ) = = " True " ) ? " true " : " false " ;
} else {
settingArgs [ arg . key ] = prop - > GetValueAsString ( ) ;
}
}
2016-01-31 15:11:54 -05:00
if ( dev ) {
args = dev - > getSoapyDevice ( ) - > getStreamArgsInfo ( SOAPY_SDR_RX , 0 ) ;
2015-11-04 02:04:52 -05:00
if ( args . size ( ) ) {
2017-08-12 01:04:21 +02:00
for ( SoapySDR : : ArgInfoList : : const_iterator args_i = args . begin ( ) ; args_i ! = args . end ( ) ; args_i + + ) {
2015-11-04 02:04:52 -05:00
SoapySDR : : ArgInfo arg = ( * args_i ) ;
2016-02-01 20:30:48 -05:00
wxPGProperty * prop = streamProps [ arg . key ] ;
2015-11-04 02:04:52 -05:00
if ( arg . type = = SoapySDR : : ArgInfo : : STRING & & arg . options . size ( ) ) {
2018-03-21 06:35:13 +01:00
streamArgs [ arg . key ] = getSelectedChoiceOption ( prop , arg ) ;
2015-11-04 02:04:52 -05:00
} else if ( arg . type = = SoapySDR : : ArgInfo : : BOOL ) {
streamArgs [ arg . key ] = ( prop - > GetValueAsString ( ) = = " True " ) ? " true " : " false " ;
} else {
streamArgs [ arg . key ] = prop - > GetValueAsString ( ) ;
}
}
}
}
2015-12-06 00:32:32 -05:00
AppConfig * cfg = wxGetApp ( ) . getConfig ( ) ;
DeviceConfig * devConfig = cfg - > getDevice ( dev - > getDeviceId ( ) ) ;
devConfig - > setSettings ( settingArgs ) ;
devConfig - > setStreamOpts ( streamArgs ) ;
2015-11-04 02:04:52 -05:00
wxGetApp ( ) . setDeviceArgs ( settingArgs ) ;
wxGetApp ( ) . setStreamArgs ( streamArgs ) ;
2016-07-05 21:43:45 +02:00
wxGetApp ( ) . setDevice ( dev , 0 ) ;
2015-10-04 16:07:14 -04:00
Close ( ) ;
}
2016-02-01 20:30:48 -05:00
event . Skip ( ) ;
2015-10-04 16:07:14 -04:00
}
2015-10-03 21:35:11 -04:00
2015-10-05 02:21:08 -04:00
void SDRDevicesDialog : : OnTreeDoubleClick ( wxMouseEvent & event ) {
OnUseSelected ( event ) ;
}
void SDRDevicesDialog : : OnDeviceTimer ( wxTimerEvent & event ) {
if ( refresh ) {
2016-01-13 21:59:47 -05:00
if ( wxGetApp ( ) . areModulesMissing ( ) ) {
if ( ! failed ) {
wxMessageDialog * info ;
info = new wxMessageDialog ( NULL , wxT ( " \n No SoapySDR modules were found. \n \n CubicSDR requires at least one SoapySDR device support module to be installed. \n \n Please visit https://github.com/cjcliffe/CubicSDR/wiki and in the build instructions for your platform read the 'Support Modules' section for more information. " ) , wxT ( " \x28 \u256F \xB0 \u25A1 \xB0 \uFF09 \u256F \uFE35 \x20 \u253B \u2501 \u253B " ) , wxOK | wxICON_ERROR ) ;
info - > ShowModal ( ) ;
failed = true ;
}
return ;
}
2015-10-05 02:21:08 -04:00
if ( wxGetApp ( ) . areDevicesEnumerating ( ) | | ! wxGetApp ( ) . areDevicesReady ( ) ) {
std : : string msg = wxGetApp ( ) . getNotification ( ) ;
devStatusBar - > SetStatusText ( msg ) ;
devTree - > DeleteAllItems ( ) ;
devTree - > AddRoot ( msg ) ;
event . Skip ( ) ;
return ;
}
2016-01-13 21:59:47 -05:00
2015-10-05 02:21:08 -04:00
devTree - > DeleteAllItems ( ) ;
wxTreeItemId devRoot = devTree - > AddRoot ( " Devices " ) ;
wxTreeItemId localBranch = devTree - > AppendItem ( devRoot , " Local " ) ;
2015-11-11 00:16:26 -05:00
wxTreeItemId dsBranch = devTree - > AppendItem ( devRoot , " Local Net " ) ;
2015-10-05 02:21:08 -04:00
wxTreeItemId remoteBranch = devTree - > AppendItem ( devRoot , " Remote " ) ;
2016-01-20 00:43:31 -05:00
wxTreeItemId manualBranch = devTree - > AppendItem ( devRoot , " Manual " ) ;
2015-10-05 02:21:08 -04:00
devs [ " " ] = SDREnumerator : : enumerate_devices ( " " , true ) ;
if ( devs [ " " ] ! = NULL ) {
for ( devs_i = devs [ " " ] - > begin ( ) ; devs_i ! = devs [ " " ] - > end ( ) ; devs_i + + ) {
2016-01-20 01:15:12 -05:00
DeviceConfig * devConfig = nullptr ;
2016-01-20 00:43:31 -05:00
if ( ( * devs_i ) - > isManual ( ) ) {
2016-01-20 01:15:12 -05:00
std : : string devName = " Unknown " ;
if ( ( * devs_i ) - > isAvailable ( ) ) {
devConfig = wxGetApp ( ) . getConfig ( ) - > getDevice ( ( * devs_i ) - > getDeviceId ( ) ) ;
devName = devConfig - > getDeviceName ( ) ;
} else {
devName = ( * devs_i ) - > getDeviceId ( ) ;
}
devItems [ devTree - > AppendItem ( manualBranch , devName ) ] = ( * devs_i ) ;
2016-01-20 00:43:31 -05:00
} else if ( ( * devs_i ) - > isRemote ( ) ) {
2016-01-20 01:15:12 -05:00
devConfig = wxGetApp ( ) . getConfig ( ) - > getDevice ( ( * devs_i ) - > getDeviceId ( ) ) ;
2016-01-18 20:46:56 -05:00
devItems [ devTree - > AppendItem ( dsBranch , devConfig - > getDeviceName ( ) ) ] = ( * devs_i ) ;
2015-11-11 00:16:26 -05:00
} else {
2016-01-20 01:15:12 -05:00
devConfig = wxGetApp ( ) . getConfig ( ) - > getDevice ( ( * devs_i ) - > getDeviceId ( ) ) ;
2016-01-18 20:46:56 -05:00
devItems [ devTree - > AppendItem ( localBranch , devConfig - > getDeviceName ( ) ) ] = ( * devs_i ) ;
2015-11-11 00:16:26 -05:00
}
2015-10-05 02:21:08 -04:00
}
}
std : : vector < std : : string > remotes = SDREnumerator : : getRemotes ( ) ;
2017-08-12 01:04:21 +02:00
2015-10-05 02:21:08 -04:00
std : : vector < SDRDeviceInfo * > : : iterator remoteDevs_i ;
if ( remotes . size ( ) ) {
2017-08-12 01:04:21 +02:00
for ( std : : string remote : remotes ) {
devs [ remote ] = SDREnumerator : : enumerate_devices ( remote , true ) ;
DeviceConfig * devConfig = wxGetApp ( ) . getConfig ( ) - > getDevice ( remote ) ;
2016-01-18 20:46:56 -05:00
wxTreeItemId remoteNode = devTree - > AppendItem ( remoteBranch , devConfig - > getDeviceName ( ) ) ;
2015-10-05 02:21:08 -04:00
2017-08-12 01:04:21 +02:00
if ( devs [ remote ] ! = NULL ) {
for ( remoteDevs_i = devs [ remote ] - > begin ( ) ; remoteDevs_i ! = devs [ remote ] - > end ( ) ; remoteDevs_i + + ) {
2015-10-05 02:21:08 -04:00
devItems [ devTree - > AppendItem ( remoteNode , ( * remoteDevs_i ) - > getName ( ) ) ] = ( * remoteDevs_i ) ;
}
}
}
}
2016-01-17 21:54:22 -05:00
m_refreshButton - > Enable ( ) ;
2015-10-05 02:21:08 -04:00
m_addRemoteButton - > Enable ( ) ;
m_useSelectedButton - > Enable ( ) ;
devTree - > Enable ( ) ;
devTree - > ExpandAll ( ) ;
devStatusBar - > SetStatusText ( " Ready. " ) ;
refresh = false ;
}
2016-01-17 21:54:22 -05:00
}
2016-01-27 11:20:14 +11:00
void SDRDevicesDialog : : OnRefreshDevices ( wxMouseEvent & /* event */ ) {
2016-01-20 00:43:31 -05:00
doRefreshDevices ( ) ;
2016-01-18 20:46:56 -05:00
}
2018-03-21 06:35:13 +01:00
std : : string SDRDevicesDialog : : getSelectedChoiceOption ( wxPGProperty * prop , const SoapySDR : : ArgInfo & arg ) {
std : : string optionName = " " ;
int choiceIndex = prop - > GetChoiceSelection ( ) ;
if ( arg . options . size ( ) > 0 ) {
2019-01-10 21:23:26 -05:00
int choiceMax = arg . options . size ( ) ;
if ( choiceIndex > = 0 & & choiceIndex < choiceMax ) {
2018-03-21 06:35:13 +01:00
//normal selection
optionName = arg . options [ choiceIndex ] ;
2018-03-24 07:06:27 +01:00
} else {
2018-03-21 06:35:13 +01:00
//choose the first one of the list:
optionName = arg . options [ 0 ] ;
prop - > SetChoiceSelection ( 0 ) ;
}
2018-03-24 07:06:27 +01:00
}
2018-03-21 06:35:13 +01:00
return optionName ;
}
2016-01-18 20:46:56 -05:00
void SDRDevicesDialog : : OnPropGridChanged ( wxPropertyGridEvent & event ) {
2017-08-23 23:27:49 +02:00
2017-11-20 01:33:18 +01:00
if ( event . GetProperty ( ) = = devSettings [ " name " ] ) {
2016-01-18 20:46:56 -05:00
DeviceConfig * devConfig = wxGetApp ( ) . getConfig ( ) - > getDevice ( dev - > getDeviceId ( ) ) ;
wxString devName = event . GetPropertyValue ( ) . GetString ( ) ;
devConfig - > setDeviceName ( devName . ToStdString ( ) ) ;
2016-01-19 18:38:18 -05:00
if ( editId ) {
devTree - > SetItemText ( editId , devConfig - > getDeviceName ( ) ) ;
2016-01-18 20:46:56 -05:00
}
if ( devName = = " " ) {
event . GetProperty ( ) - > SetValueFromString ( devConfig - > getDeviceName ( ) ) ;
}
2016-02-01 20:30:48 -05:00
} else if ( dev & & event . GetProperty ( ) = = devSettings [ " offset " ] ) {
2016-01-18 20:46:56 -05:00
DeviceConfig * devConfig = wxGetApp ( ) . getConfig ( ) - > getDevice ( dev - > getDeviceId ( ) ) ;
2018-02-07 13:13:52 +01:00
long offset_In_KHz = event . GetPropertyValue ( ) . GetInteger ( ) ;
2016-01-18 20:46:56 -05:00
2018-02-07 13:13:52 +01:00
devConfig - > setOffset ( ( long long ) offset_In_KHz * 1000 ) ;
2017-08-23 23:27:49 +02:00
if ( dev - > isActive ( ) | | ! wxGetApp ( ) . getDevice ( ) ) {
2018-02-07 13:13:52 +01:00
wxGetApp ( ) . setOffset ( ( long long ) offset_In_KHz * 1000 ) ;
2017-08-23 23:27:49 +02:00
}
2017-08-23 23:49:52 +02:00
}
else if ( dev & & event . GetProperty ( ) = = devSettings [ " sample_rate " ] ) {
2017-08-23 23:27:49 +02:00
2016-05-11 22:37:25 -04:00
DeviceConfig * devConfig = wxGetApp ( ) . getConfig ( ) - > getDevice ( dev - > getDeviceId ( ) ) ;
std : : string strRate = deviceArgs [ " sample_rate " ] . options [ event . GetPropertyValue ( ) . GetInteger ( ) ] ;
2017-01-21 11:26:51 +01:00
long srate = 0 ;
2016-05-11 22:37:25 -04:00
try {
2017-01-21 11:26:51 +01:00
srate = std : : stol ( strRate ) ;
2016-05-11 22:37:25 -04:00
devConfig - > setSampleRate ( srate ) ;
2017-08-23 23:27:49 +02:00
if ( dev - > isActive ( ) | | ! wxGetApp ( ) . getDevice ( ) ) {
2016-05-11 22:37:25 -04:00
wxGetApp ( ) . setSampleRate ( srate ) ;
2017-08-23 23:27:49 +02:00
}
2016-05-11 22:37:25 -04:00
} catch ( std : : invalid_argument e ) {
// nop
}
2017-08-23 23:27:49 +02:00
} else if ( dev & & event . GetProperty ( ) = = devSettings [ " antenna " ] ) {
DeviceConfig * devConfig = wxGetApp ( ) . getConfig ( ) - > getDevice ( dev - > getDeviceId ( ) ) ;
std : : string strAntennaName = deviceArgs [ " antenna " ] . options [ event . GetPropertyValue ( ) . GetInteger ( ) ] ;
try {
devConfig - > setAntennaName ( strAntennaName ) ;
if ( dev - > isActive ( ) | | ! wxGetApp ( ) . getDevice ( ) ) {
wxGetApp ( ) . setAntennaName ( strAntennaName ) ;
}
}
catch ( std : : invalid_argument e ) {
// nop
}
}
2017-11-20 01:33:18 +01:00
else if ( dev ) {
2016-02-01 20:30:48 -05:00
wxPGProperty * prop = event . GetProperty ( ) ;
2017-08-12 01:04:21 +02:00
//change value of RuntimeProps
2016-02-01 20:30:48 -05:00
for ( std : : map < std : : string , wxPGProperty * > : : iterator rtp = runtimeProps . begin ( ) ; rtp ! = runtimeProps . end ( ) ; rtp + + ) {
if ( rtp - > second = = prop ) {
SoapySDR : : Device * soapyDev = dev - > getSoapyDevice ( ) ;
2016-02-02 20:05:32 -05:00
std : : string settingValue = prop - > GetValueAsString ( ) . ToStdString ( ) ;
2016-02-03 00:05:26 -05:00
SoapySDR : : ArgInfo arg = runtimeArgs [ rtp - > first ] ;
if ( arg . type = = SoapySDR : : ArgInfo : : STRING & & arg . options . size ( ) ) {
2018-03-21 06:35:13 +01:00
settingValue = getSelectedChoiceOption ( prop , arg ) ;
2016-02-03 00:05:26 -05:00
} else if ( arg . type = = SoapySDR : : ArgInfo : : BOOL ) {
settingValue = ( prop - > GetValueAsString ( ) = = " True " ) ? " true " : " false " ;
} else {
settingValue = prop - > GetValueAsString ( ) ;
}
2016-02-02 20:05:32 -05:00
soapyDev - > writeSetting ( rtp - > first , settingValue ) ;
if ( dev - > isActive ( ) ) {
wxGetApp ( ) . getSDRThread ( ) - > writeSetting ( rtp - > first , settingValue ) ;
}
2016-02-01 20:30:48 -05:00
return ;
}
}
2016-01-18 20:46:56 -05:00
}
}
2016-01-19 18:38:18 -05:00
2016-01-27 11:20:14 +11:00
void SDRDevicesDialog : : OnPropGridFocus ( wxFocusEvent & /* event */ ) {
2016-01-19 18:38:18 -05:00
editId = selId ;
}
2016-01-20 00:43:31 -05:00
void SDRDevicesDialog : : doRefreshDevices ( ) {
2016-02-02 20:05:32 -05:00
selId = nullptr ;
editId = nullptr ;
removeId = nullptr ;
dev = nullptr ;
2016-07-05 21:43:45 +02:00
wxGetApp ( ) . stopDevice ( false , 2000 ) ;
2016-01-20 00:43:31 -05:00
devTree - > DeleteAllItems ( ) ;
devTree - > Disable ( ) ;
m_propertyGrid - > Clear ( ) ;
2017-08-12 01:04:21 +02:00
devSettings . clear ( ) ;
runtimeArgs . clear ( ) ;
runtimeProps . clear ( ) ;
streamProps . clear ( ) ;
2016-01-20 00:43:31 -05:00
m_refreshButton - > Disable ( ) ;
m_addRemoteButton - > Disable ( ) ;
m_useSelectedButton - > Disable ( ) ;
wxGetApp ( ) . reEnumerateDevices ( ) ;
refresh = true ;
2016-01-22 00:40:00 -05:00
m_addRemoteButton - > SetLabel ( " Add " ) ;
2016-01-27 11:20:14 +11:00
}