diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index d958da6..f1814e7 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -487,6 +487,26 @@ void CubicSDR::setSampleRate(long long rate_in) { } } +void CubicSDR::stopDevice() { + sdrThread->setDevice(nullptr); + + if (!sdrThread->isTerminated()) { + sdrThread->terminate(); + if (t_SDR) { + t_SDR->join(); + delete t_SDR; + t_SDR = nullptr; + } + } +} + +void CubicSDR::reEnumerateDevices() { + devicesReady.store(false); + devs = nullptr; + SDREnumerator::reset(); + t_SDREnum = new std::thread(&SDREnumerator::threadMain, sdrEnum); +} + void CubicSDR::setDevice(SDRDeviceInfo *dev) { if (!sdrThread->isTerminated()) { sdrThread->terminate(); @@ -512,14 +532,6 @@ void CubicSDR::setDevice(SDRDeviceInfo *dev) { freqHigh = chan->getRFRange().getHigh(); freqLow = chan->getRFRange().getLow(); -// upconverter settings don't like this, need to handle elsewhere.. -// if (frequency > freqHigh) { -// frequency = freqHigh; -// } -// else if (frequency < freqLow) { -// frequency = freqLow; -// } - // Try for a reasonable default sample rate. if (!sampleRateInitialized.load()) { sampleRate = chan->getSampleRateNear(DEFAULT_SAMPLE_RATE); diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 83f9b76..b2789dd 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -97,6 +97,7 @@ public: std::vector *getDevices(); void setDevice(SDRDeviceInfo *dev); + void stopDevice(); SDRDeviceInfo * getDevice(); ScopeVisualProcessor *getScopeProcessor(); @@ -136,7 +137,8 @@ public: void removeRemote(std::string remoteAddr); void setDeviceSelectorClosed(); - bool isDeviceSelectorOpen(); + void reEnumerateDevices(); + bool isDeviceSelectorOpen(); void closeDeviceSelector(); void setAGCMode(bool mode); diff --git a/src/forms/SDRDevices/SDRDevices.cpp b/src/forms/SDRDevices/SDRDevices.cpp index cd0deea..b32371c 100644 --- a/src/forms/SDRDevices/SDRDevices.cpp +++ b/src/forms/SDRDevices/SDRDevices.cpp @@ -8,11 +8,11 @@ SDRDevicesDialog::SDRDevicesDialog( wxWindow* parent ): devFrame( parent ) { refresh = true; failed = false; + m_refreshButton->Disable(); m_addRemoteButton->Disable(); m_useSelectedButton->Disable(); m_deviceTimer.Start(250); - - } +} void SDRDevicesDialog::OnClose( wxCloseEvent& event ) { wxGetApp().setDeviceSelectorClosed(); @@ -284,6 +284,7 @@ void SDRDevicesDialog::OnDeviceTimer( wxTimerEvent& event ) { } } + m_refreshButton->Enable(); m_addRemoteButton->Enable(); m_useSelectedButton->Enable(); devTree->Enable(); @@ -293,4 +294,15 @@ void SDRDevicesDialog::OnDeviceTimer( wxTimerEvent& event ) { refresh = false; } +} + +void SDRDevicesDialog::OnRefreshDevices( wxMouseEvent& event ) { + wxGetApp().stopDevice(); + devTree->DeleteAllItems(); + devTree->Disable(); + m_refreshButton->Disable(); + m_addRemoteButton->Disable(); + m_useSelectedButton->Disable(); + wxGetApp().reEnumerateDevices(); + refresh = true; } \ No newline at end of file diff --git a/src/forms/SDRDevices/SDRDevices.fbp b/src/forms/SDRDevices/SDRDevices.fbp index 9d67c3f..6e2ad7a 100644 --- a/src/forms/SDRDevices/SDRDevices.fbp +++ b/src/forms/SDRDevices/SDRDevices.fbp @@ -490,6 +490,94 @@ bSizer5 wxHORIZONTAL none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Refresh + + 0 + + + 0 + + 1 + m_refreshButton + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + OnRefreshDevices + + + + + + + + + + + + + + + 5 wxALL diff --git a/src/forms/SDRDevices/SDRDevices.h b/src/forms/SDRDevices/SDRDevices.h index 9462b68..c3b99ad 100644 --- a/src/forms/SDRDevices/SDRDevices.h +++ b/src/forms/SDRDevices/SDRDevices.h @@ -18,6 +18,7 @@ public: void OnUseSelected( wxMouseEvent& event ); void OnTreeDoubleClick( wxMouseEvent& event ); void OnDeviceTimer( wxTimerEvent& event ); + void OnRefreshDevices( wxMouseEvent& event ); private: SDRDeviceInfo *getSelectedDevice(wxTreeItemId selId); diff --git a/src/forms/SDRDevices/SDRDevicesForm.cpp b/src/forms/SDRDevices/SDRDevicesForm.cpp index 8863060..1a82b2a 100644 --- a/src/forms/SDRDevices/SDRDevicesForm.cpp +++ b/src/forms/SDRDevices/SDRDevicesForm.cpp @@ -34,6 +34,9 @@ devFrame::devFrame( wxWindow* parent, wxWindowID id, const wxString& title, cons wxBoxSizer* bSizer5; bSizer5 = new wxBoxSizer( wxHORIZONTAL ); + m_refreshButton = new wxButton( m_panel4, wxID_ANY, wxT("Refresh"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer5->Add( m_refreshButton, 0, wxALL, 5 ); + m_addRemoteButton = new wxButton( m_panel4, wxID_ANY, wxT("Add Remote"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer5->Add( m_addRemoteButton, 1, wxALL, 5 ); @@ -87,6 +90,7 @@ devFrame::devFrame( wxWindow* parent, wxWindowID id, const wxString& title, cons devTree->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( devFrame::OnTreeDoubleClick ), NULL, this ); devTree->Connect( wxEVT_COMMAND_TREE_DELETE_ITEM, wxTreeEventHandler( devFrame::OnDeleteItem ), NULL, this ); devTree->Connect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( devFrame::OnSelectionChanged ), NULL, this ); + m_refreshButton->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( devFrame::OnRefreshDevices ), NULL, this ); m_addRemoteButton->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( devFrame::OnAddRemote ), NULL, this ); m_useSelectedButton->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( devFrame::OnUseSelected ), NULL, this ); this->Connect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( devFrame::OnDeviceTimer ) ); @@ -99,6 +103,7 @@ devFrame::~devFrame() devTree->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( devFrame::OnTreeDoubleClick ), NULL, this ); devTree->Disconnect( wxEVT_COMMAND_TREE_DELETE_ITEM, wxTreeEventHandler( devFrame::OnDeleteItem ), NULL, this ); devTree->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( devFrame::OnSelectionChanged ), NULL, this ); + m_refreshButton->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( devFrame::OnRefreshDevices ), NULL, this ); m_addRemoteButton->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( devFrame::OnAddRemote ), NULL, this ); m_useSelectedButton->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( devFrame::OnUseSelected ), NULL, this ); this->Disconnect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( devFrame::OnDeviceTimer ) ); diff --git a/src/forms/SDRDevices/SDRDevicesForm.h b/src/forms/SDRDevices/SDRDevicesForm.h index efaa3e1..cb9f9a1 100644 --- a/src/forms/SDRDevices/SDRDevicesForm.h +++ b/src/forms/SDRDevices/SDRDevicesForm.h @@ -45,6 +45,7 @@ class devFrame : public wxFrame wxPanel* m_panel6; wxTreeCtrl* devTree; wxPanel* m_panel4; + wxButton* m_refreshButton; wxButton* m_addRemoteButton; wxButton* m_useSelectedButton; wxPanel* m_panel61; @@ -57,6 +58,7 @@ class devFrame : public wxFrame virtual void OnTreeDoubleClick( wxMouseEvent& event ) { event.Skip(); } virtual void OnDeleteItem( wxTreeEvent& event ) { event.Skip(); } virtual void OnSelectionChanged( wxTreeEvent& event ) { event.Skip(); } + virtual void OnRefreshDevices( wxMouseEvent& event ) { event.Skip(); } virtual void OnAddRemote( wxMouseEvent& event ) { event.Skip(); } virtual void OnUseSelected( wxMouseEvent& event ) { event.Skip(); } virtual void OnDeviceTimer( wxTimerEvent& event ) { event.Skip(); } diff --git a/src/sdr/SDREnumerator.cpp b/src/sdr/SDREnumerator.cpp index 7f6b79c..cf6c3d5 100644 --- a/src/sdr/SDREnumerator.cpp +++ b/src/sdr/SDREnumerator.cpp @@ -326,3 +326,10 @@ std::vector &SDREnumerator::getRemotes() { bool SDREnumerator::hasRemoteModule() { return SDREnumerator::has_remote; } + +void SDREnumerator::reset() { + soapy_initialized = false; + factories.erase(factories.begin(), factories.end()); + modules.erase(modules.begin(), modules.end()); + devs.erase(devs.begin(), devs.end()); +} diff --git a/src/sdr/SDREnumerator.h b/src/sdr/SDREnumerator.h index e0c243d..5cefdc3 100644 --- a/src/sdr/SDREnumerator.h +++ b/src/sdr/SDREnumerator.h @@ -29,6 +29,7 @@ public: static void removeRemote(std::string remoteAddr); static std::vector &getRemotes(); static bool hasRemoteModule(); + static void reset(); protected: static bool soapy_initialized, has_remote; diff --git a/src/sdr/SoapySDRThread.cpp b/src/sdr/SoapySDRThread.cpp index 3e8ad32..0884c1c 100644 --- a/src/sdr/SoapySDRThread.cpp +++ b/src/sdr/SoapySDRThread.cpp @@ -337,7 +337,11 @@ SDRDeviceInfo *SDRThread::getDevice() { void SDRThread::setDevice(SDRDeviceInfo *dev) { deviceInfo.store(dev); - deviceConfig.store(wxGetApp().getConfig()->getDevice(dev->getDeviceId())); + if (dev) { + deviceConfig.store(wxGetApp().getConfig()->getDevice(dev->getDeviceId())); + } else { + deviceConfig.store(nullptr); + } } int SDRThread::getOptimalElementCount(long long sampleRate, int fps) {