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"
SDRDevicesDialog : : SDRDevicesDialog ( wxWindow * parent ) : devFrame ( parent ) {
2015-10-05 02:21:08 -04:00
refresh = true ;
2016-01-13 21:59:47 -05:00
failed = false ;
2015-10-05 02:21:08 -04:00
m_addRemoteButton - > Disable ( ) ;
m_useSelectedButton - > Disable ( ) ;
m_deviceTimer . Start ( 250 ) ;
2015-11-02 19:02:45 -05:00
2015-11-03 00:53:39 -05:00
}
2015-10-04 16:07:14 -04:00
2015-10-05 02:21:08 -04:00
void SDRDevicesDialog : : OnClose ( wxCloseEvent & event ) {
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 ;
}
2015-10-04 16:07:14 -04:00
void SDRDevicesDialog : : OnSelectionChanged ( wxTreeEvent & event ) {
2015-11-03 00:53:39 -05:00
wxTreeItemId selId = devTree - > GetSelection ( ) ;
dev = getSelectedDevice ( selId ) ;
2015-11-04 02:04:52 -05:00
props . erase ( props . begin ( ) , props . end ( ) ) ;
2015-11-03 00:53:39 -05:00
if ( dev ) {
m_propertyGrid - > Clear ( ) ;
m_propertyGrid - > Append ( new wxPropertyCategory ( " Run-time Settings " ) ) ;
SoapySDR : : ArgInfoList : : const_iterator args_i ;
SoapySDR : : ArgInfoList args = dev - > getSettingsArgInfo ( ) ;
for ( args_i = args . begin ( ) ; args_i ! = args . end ( ) ; args_i + + ) {
SoapySDR : : ArgInfo arg = ( * args_i ) ;
2015-11-04 02:04:52 -05:00
props . push_back ( addArgInfoProperty ( m_propertyGrid , arg ) ) ;
2015-11-03 00:53:39 -05:00
}
if ( dev - > getRxChannel ( ) ) {
args = dev - > getRxChannel ( ) - > getStreamArgsInfo ( ) ;
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 ] ;
}
}
}
2015-11-03 00:53:39 -05:00
if ( args . size ( ) ) {
m_propertyGrid - > Append ( new wxPropertyCategory ( " Stream Settings " ) ) ;
for ( args_i = args . begin ( ) ; args_i ! = args . end ( ) ; args_i + + ) {
SoapySDR : : ArgInfo arg = ( * args_i ) ;
2015-11-04 02:04:52 -05:00
props . push_back ( addArgInfoProperty ( m_propertyGrid , arg ) ) ;
2015-11-03 00:53:39 -05:00
}
}
}
}
2015-10-04 16:07:14 -04:00
event . Skip ( ) ;
}
void SDRDevicesDialog : : OnAddRemote ( wxMouseEvent & event ) {
2015-10-05 02:21:08 -04:00
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 ;
}
wxString remoteAddr =
wxGetTextFromUser ( " Remote Address (address[:port]) \n \n i.e. 'raspberrypi.local', '192.168.1.103:1234' \n " , " SoapySDR Remote Address " , " " , this ) ;
if ( ! remoteAddr . Trim ( ) . empty ( ) ) {
wxGetApp ( ) . addRemote ( remoteAddr . Trim ( ) . ToStdString ( ) ) ;
}
devTree - > Disable ( ) ;
m_addRemoteButton - > Disable ( ) ;
m_useSelectedButton - > Disable ( ) ;
refresh = true ;
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 ;
}
2015-10-04 16:07:14 -04:00
void SDRDevicesDialog : : OnUseSelected ( wxMouseEvent & event ) {
wxTreeItemId selId = devTree - > GetSelection ( ) ;
2015-11-03 00:53:39 -05:00
dev = getSelectedDevice ( selId ) ;
if ( dev ! = NULL ) {
2015-11-04 02:04:52 -05:00
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 + + ;
}
}
}
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 ) ;
2015-10-04 16:07:14 -04:00
wxGetApp ( ) . setDevice ( dev ) ;
Close ( ) ;
}
}
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 " ) ;
devs [ " " ] = SDREnumerator : : enumerate_devices ( " " , true ) ;
if ( devs [ " " ] ! = NULL ) {
for ( devs_i = devs [ " " ] - > begin ( ) ; devs_i ! = devs [ " " ] - > end ( ) ; devs_i + + ) {
2015-11-11 00:16:26 -05:00
if ( ( * devs_i ) - > isRemote ( ) ) {
devItems [ devTree - > AppendItem ( dsBranch , ( * devs_i ) - > getName ( ) ) ] = ( * devs_i ) ;
} else {
devItems [ devTree - > AppendItem ( localBranch , ( * devs_i ) - > getName ( ) ) ] = ( * devs_i ) ;
}
2015-10-05 02:21:08 -04:00
}
}
std : : vector < std : : string > remotes = SDREnumerator : : getRemotes ( ) ;
std : : vector < std : : string > : : iterator remotes_i ;
std : : vector < SDRDeviceInfo * > : : iterator remoteDevs_i ;
if ( remotes . size ( ) ) {
for ( remotes_i = remotes . begin ( ) ; remotes_i ! = remotes . end ( ) ; remotes_i + + ) {
devs [ * remotes_i ] = SDREnumerator : : enumerate_devices ( * remotes_i , true ) ;
wxTreeItemId remoteNode = devTree - > AppendItem ( remoteBranch , * remotes_i ) ;
if ( devs [ * remotes_i ] ! = NULL ) {
for ( remoteDevs_i = devs [ * remotes_i ] - > begin ( ) ; remoteDevs_i ! = devs [ * remotes_i ] - > end ( ) ; remoteDevs_i + + ) {
devItems [ devTree - > AppendItem ( remoteNode , ( * remoteDevs_i ) - > getName ( ) ) ] = ( * remoteDevs_i ) ;
}
}
}
}
m_addRemoteButton - > Enable ( ) ;
m_useSelectedButton - > Enable ( ) ;
devTree - > Enable ( ) ;
devTree - > ExpandAll ( ) ;
devStatusBar - > SetStatusText ( " Ready. " ) ;
refresh = false ;
}
}