From 091ce26ed6dbc253a8fc775ef20383f9f6703106 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Tue, 20 Oct 2015 23:00:10 -0400 Subject: [PATCH] Dynamic input rate menu values from SoapySDR --- src/AppFrame.cpp | 126 +++++++++++--------------------------- src/AppFrame.h | 23 +++---- src/CubicSDR.cpp | 75 +++++++++++++++++++++++ src/CubicSDR.h | 4 ++ src/FrequencyDialog.cpp | 70 --------------------- src/FrequencyDialog.h | 4 -- src/sdr/SDRDeviceInfo.cpp | 2 +- src/sdr/SDRDeviceInfo.h | 4 +- src/sdr/SDREnumerator.cpp | 4 +- 9 files changed, 129 insertions(+), 183 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 357f1d6..04ac4df 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -14,11 +14,11 @@ #endif #include -#include "DemodulatorMgr.h" #include "AudioThread.h" #include "CubicSDR.h" #include "DataTree.h" #include "ColorTheme.h" +#include "DemodulatorMgr.h" #include @@ -269,54 +269,8 @@ AppFrame::AppFrame() : menuBar->Append(menu, wxT("&Color Scheme")); - menu = new wxMenu; - - sampleRateMenuItems[wxID_BANDWIDTH_250K] = menu->AppendRadioItem(wxID_BANDWIDTH_250K, "250k"); - sampleRateMenuItems[wxID_BANDWIDTH_1000M] = menu->AppendRadioItem(wxID_BANDWIDTH_1000M, "1.0M"); - sampleRateMenuItems[wxID_BANDWIDTH_1500M] = menu->AppendRadioItem(wxID_BANDWIDTH_1024M, "1.024M"); - sampleRateMenuItems[wxID_BANDWIDTH_1024M] = menu->AppendRadioItem(wxID_BANDWIDTH_1500M, "1.5M"); - sampleRateMenuItems[wxID_BANDWIDTH_1800M] = menu->AppendRadioItem(wxID_BANDWIDTH_1800M, "1.8M"); - sampleRateMenuItems[wxID_BANDWIDTH_1920M] = menu->AppendRadioItem(wxID_BANDWIDTH_1920M, "1.92M"); - sampleRateMenuItems[wxID_BANDWIDTH_2000M] = menu->AppendRadioItem(wxID_BANDWIDTH_2000M, "2.0M"); - sampleRateMenuItems[wxID_BANDWIDTH_2048M] = menu->AppendRadioItem(wxID_BANDWIDTH_2048M, "2.048M"); - sampleRateMenuItems[wxID_BANDWIDTH_2160M] = menu->AppendRadioItem(wxID_BANDWIDTH_2160M, "2.16M"); -// sampleRateMenuItems[wxID_BANDWIDTH_2400M] = menu->AppendRadioItem(wxID_BANDWIDTH_2400M, "2.4M"); - sampleRateMenuItems[wxID_BANDWIDTH_2500M] = menu->AppendRadioItem(wxID_BANDWIDTH_2500M, "2.5M"); - sampleRateMenuItems[wxID_BANDWIDTH_2880M] = menu->AppendRadioItem(wxID_BANDWIDTH_2880M, "2.88M"); -// sampleRateMenuItems[wxID_BANDWIDTH_3000M] = menu->AppendRadioItem(wxID_BANDWIDTH_3000M, "3.0M"); - sampleRateMenuItems[wxID_BANDWIDTH_3200M] = menu->AppendRadioItem(wxID_BANDWIDTH_3200M, "3.2M"); - sampleRateMenuItems[wxID_BANDWIDTH_MANUAL] = menu->AppendRadioItem(wxID_BANDWIDTH_MANUAL, "Manual Entry"); - - sampleRateMenuItems[wxID_BANDWIDTH_2500M]->Check(true); - - menuBar->Append(menu, wxT("&Input Bandwidth")); - -// std::vector *devs = wxGetApp().getDevices(); -// std::vector::iterator devs_i; - -// if (devs->size() > 1) { -// -// menu = new wxMenu; -// -// int p = 0; -// for (devs_i = devs->begin(); devs_i != devs->end(); devs_i++) { -// std::string devName = (*devs_i)->getName(); -// if ((*devs_i)->isAvailable()) { -// devName.append(": "); -// devName.append((*devs_i)->getProduct()); -// devName.append(" ["); -// devName.append((*devs_i)->getSerial()); -// devName.append("]"); -// } else { -// devName.append(" (In Use?)"); -// } -// -// menu->AppendRadioItem(wxID_DEVICE_ID + p, devName); //->Check(wxGetApp().getDevice() == p); -// p++; -// } -// -// menuBar->Append(menu, wxT("Input &Device")); -// } + sampleRateMenu = new wxMenu; + menuBar->Append(sampleRateMenu, wxT("&Input Bandwidth")); menu = new wxMenu; @@ -429,7 +383,9 @@ AppFrame::~AppFrame() { } -void AppFrame::initDeviceParams(std::string deviceId) { +void AppFrame::initDeviceParams(SDRDeviceInfo *devInfo) { + std::string deviceId = devInfo->getName(); + DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(deviceId); int dsMode = devConfig->getDirectSampling(); @@ -441,6 +397,33 @@ void AppFrame::initDeviceParams(std::string deviceId) { if (devConfig->getIQSwap()) { iqSwapMenuItem->Check(); } + + // Build sample rate menu from device info + sampleRates = devInfo->getRxChannel()->getSampleRates(); + + for (std::map::iterator i = sampleRateMenuItems.begin(); i != sampleRateMenuItems.end(); i++) { + sampleRateMenu->Remove(i->first); + } + + sampleRateMenuItems.erase(sampleRateMenuItems.begin(),sampleRateMenuItems.end()); + + int ofs = 0; + long sampleRate = wxGetApp().getSampleRate(); + bool checked = false; + for (vector::iterator i = sampleRates.begin(); i != sampleRates.end(); i++) { + sampleRateMenuItems[wxID_BANDWIDTH_BASE+ofs] = sampleRateMenu->AppendRadioItem(wxID_BANDWIDTH_BASE+ofs, frequencyToStr(*i)); + if (sampleRate == (*i)) { + sampleRateMenuItems[wxID_BANDWIDTH_BASE+ofs]->Check(true); + checked = true; + } + ofs++; + } + + sampleRateMenuItems[wxID_BANDWIDTH_MANUAL] = sampleRateMenu->AppendRadioItem(wxID_BANDWIDTH_MANUAL, "Manual Entry"); + + if (!checked) { + sampleRateMenuItems[wxID_BANDWIDTH_MANUAL]->Check(true); + } } @@ -547,45 +530,6 @@ void AppFrame::OnMenu(wxCommandEvent& event) { } switch (event.GetId()) { - case wxID_BANDWIDTH_250K: - wxGetApp().setSampleRate(250000); - break; - case wxID_BANDWIDTH_1000M: - wxGetApp().setSampleRate(1000000); - break; - case wxID_BANDWIDTH_1024M: - wxGetApp().setSampleRate(1024000); - break; - case wxID_BANDWIDTH_1500M: - wxGetApp().setSampleRate(1500000); - break; - case wxID_BANDWIDTH_1800M: - wxGetApp().setSampleRate(1800000); - break; - case wxID_BANDWIDTH_1920M: - wxGetApp().setSampleRate(1920000); - break; - case wxID_BANDWIDTH_2000M: - wxGetApp().setSampleRate(2000000); - break; - case wxID_BANDWIDTH_2048M: - wxGetApp().setSampleRate(2048000); - break; - case wxID_BANDWIDTH_2160M: - wxGetApp().setSampleRate(2160000); - break; - case wxID_BANDWIDTH_2500M: - wxGetApp().setSampleRate(2500000); - break; - case wxID_BANDWIDTH_2880M: - wxGetApp().setSampleRate(2880000); - break; -// case wxID_BANDWIDTH_3000M: -// wxGetApp().setSampleRate(3000000); -// break; - case wxID_BANDWIDTH_3200M: - wxGetApp().setSampleRate(3200000); - break; case wxID_BANDWIDTH_MANUAL: long bw = wxGetNumberFromUser("Set the bandwidth manually", "Sample Rate (Hz), i.e. 2560000 for 2.56M", "Manual Bandwidth Entry", wxGetApp().getSampleRate(), 250000, 25000000, this); @@ -612,6 +556,10 @@ void AppFrame::OnMenu(wxCommandEvent& event) { // iqSwapMenuItem->Check(devConfig->getIQSwap()); // } + if (event.GetId() >= wxID_BANDWIDTH_BASE && event.GetId() < wxID_BANDWIDTH_BASE+sampleRates.size()) { + wxGetApp().setSampleRate(sampleRates[event.GetId()-wxID_BANDWIDTH_BASE]); + } + if (event.GetId() >= wxID_AUDIO_BANDWIDTH_BASE) { int evId = event.GetId(); std::vector::iterator devices_i; diff --git a/src/AppFrame.h b/src/AppFrame.h index 3359d97..4ce5295 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -10,6 +10,7 @@ #include "TuningCanvas.h" #include "ModeSelectorCanvas.h" #include "FFTVisualDataThread.h" +#include "SDRDeviceInfo.h" //#include "UITestCanvas.h" #include @@ -32,27 +33,15 @@ #define wxID_THEME_HD 2105 #define wxID_THEME_RADAR 2106 -#define wxID_BANDWIDTH_250K 2150 -#define wxID_BANDWIDTH_1000M 2151 -#define wxID_BANDWIDTH_1024M 2152 -#define wxID_BANDWIDTH_1500M 2153 -#define wxID_BANDWIDTH_1800M 2154 -#define wxID_BANDWIDTH_1920M 2155 -#define wxID_BANDWIDTH_2000M 2156 -#define wxID_BANDWIDTH_2048M 2157 -#define wxID_BANDWIDTH_2160M 2158 -//#define wxID_BANDWIDTH_2400M 2159 -#define wxID_BANDWIDTH_2500M 2160 -#define wxID_BANDWIDTH_2880M 2161 -//#define wxID_BANDWIDTH_3000M 2162 -#define wxID_BANDWIDTH_3200M 2163 -#define wxID_BANDWIDTH_MANUAL 2164 +#define wxID_BANDWIDTH_BASE 2150 +#define wxID_BANDWIDTH_MANUAL 2200 #define wxID_DEVICE_ID 3500 #define wxID_AUDIO_BANDWIDTH_BASE 9000 #define wxID_AUDIO_DEVICE_MULTIPLIER 50 + // Define a new frame type class AppFrame: public wxFrame { public: @@ -60,7 +49,7 @@ public: ~AppFrame(); void OnThread(wxCommandEvent& event); void OnEventInput(wxThreadEvent& event); - void initDeviceParams(std::string deviceId); + void initDeviceParams(SDRDeviceInfo *devInfo); void saveSession(std::string fileName); bool loadSession(std::string fileName); @@ -95,6 +84,8 @@ private: std::map audioSampleRateMenuItems; std::map directSamplingMenuItems; wxMenuItem *iqSwapMenuItem; + wxMenu *sampleRateMenu; + std::vector sampleRates; std::string currentSessionFile; diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index ed4e082..7c30efd 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -13,6 +13,7 @@ #endif #include "CubicSDR.h" +#include #ifdef _OSX_APP_ #include "CoreFoundation/CoreFoundation.h" @@ -39,6 +40,78 @@ IMPLEMENT_APP(CubicSDR) } #endif + +std::string& filterChars(std::string& s, const std::string& allowed) { + s.erase(remove_if(s.begin(), s.end(), [&allowed](const char& c) { + return allowed.find(c) == std::string::npos; + }), s.end()); + return s; +} + +std::string frequencyToStr(long long freq) { + long double freqTemp; + + freqTemp = freq; + std::string suffix(""); + std::stringstream freqStr; + + if (freqTemp >= 1.0e9) { + freqTemp /= 1.0e9; + freqStr << std::setprecision(10); + suffix = std::string("GHz"); + } else if (freqTemp >= 1.0e6) { + freqTemp /= 1.0e6; + freqStr << std::setprecision(7); + suffix = std::string("MHz"); + } else if (freqTemp >= 1.0e3) { + freqTemp /= 1.0e3; + freqStr << std::setprecision(4); + suffix = std::string("KHz"); + } + + freqStr << freqTemp; + freqStr << suffix; + + return freqStr.str(); +} + +long long strToFrequency(std::string freqStr) { + std::string filterStr = filterChars(freqStr, std::string("0123456789.MKGHmkgh")); + + int numLen = filterStr.find_first_not_of("0123456789."); + + if (numLen == std::string::npos) { + numLen = freqStr.length(); + } + + std::string numPartStr = freqStr.substr(0, numLen); + std::string suffixStr = freqStr.substr(numLen); + + std::stringstream numPartStream; + numPartStream.str(numPartStr); + + long double freqTemp = 0; + + numPartStream >> freqTemp; + + if (suffixStr.length()) { + if (suffixStr.find_first_of("Gg") != std::string::npos) { + freqTemp *= 1.0e9; + } else if (suffixStr.find_first_of("Mm") != std::string::npos) { + freqTemp *= 1.0e6; + } else if (suffixStr.find_first_of("Kk") != std::string::npos) { + freqTemp *= 1.0e3; + } else if (suffixStr.find_first_of("Hh") != std::string::npos) { + // ... + } + } else if (numPartStr.find_first_of(".") != std::string::npos || freqTemp <= 3000) { + freqTemp *= 1.0e6; + } + + return (long long) freqTemp; +} + + CubicSDR::CubicSDR() : appframe(NULL), m_glContext(NULL), frequency(0), offset(0), ppm(0), snap(1), sampleRate(DEFAULT_SAMPLE_RATE), directSamplingMode(0), sdrThread(NULL), sdrPostThread(NULL), spectrumVisualThread(NULL), demodVisualThread(NULL), pipeSDRIQData(NULL), pipeIQVisualData(NULL), pipeAudioVisualData(NULL), t_SDR(NULL), t_PostSDR(NULL) { @@ -361,6 +434,8 @@ void CubicSDR::setDevice(SDRDeviceInfo *dev) { setOffset(devConfig->getOffset()); t_SDR = new std::thread(&SDRThread::threadMain, sdrThread); + + appframe->initDeviceParams(dev); } } diff --git a/src/CubicSDR.h b/src/CubicSDR.h index acfb800..14f04e9 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -32,6 +32,10 @@ #define NUM_DEMODULATORS 1 +std::string& filterChars(std::string& s, const std::string& allowed); +std::string frequencyToStr(long long freq); +long long strToFrequency(std::string freqStr); + class CubicSDR: public wxApp { public: CubicSDR(); diff --git a/src/FrequencyDialog.cpp b/src/FrequencyDialog.cpp index bed49cd..5284dd7 100644 --- a/src/FrequencyDialog.cpp +++ b/src/FrequencyDialog.cpp @@ -2,7 +2,6 @@ #include "wx/clipbrd.h" #include -#include #include "CubicSDR.h" wxBEGIN_EVENT_TABLE(FrequencyDialog, wxDialog) @@ -37,75 +36,6 @@ FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxStrin dialogText->SetSelection(-1, -1); } -std::string& FrequencyDialog::filterChars(std::string& s, const std::string& allowed) { - s.erase(remove_if(s.begin(), s.end(), [&allowed](const char& c) { - return allowed.find(c) == std::string::npos; - }), s.end()); - return s; -} - -std::string FrequencyDialog::frequencyToStr(long long freq) { - long double freqTemp; - - freqTemp = freq; - std::string suffix(""); - std::stringstream freqStr; - - if (freqTemp >= 1.0e9) { - freqTemp /= 1.0e9; - freqStr << std::setprecision(10); - suffix = std::string("GHz"); - } else if (freqTemp >= 1.0e6) { - freqTemp /= 1.0e6; - freqStr << std::setprecision(7); - suffix = std::string("MHz"); - } else if (freqTemp >= 1.0e3) { - freqTemp /= 1.0e3; - freqStr << std::setprecision(4); - suffix = std::string("KHz"); - } - - freqStr << freqTemp; - freqStr << suffix; - - return freqStr.str(); -} - -long long FrequencyDialog::strToFrequency(std::string freqStr) { - std::string filterStr = filterChars(freqStr, std::string("0123456789.MKGHmkgh")); - - int numLen = filterStr.find_first_not_of("0123456789."); - - if (numLen == std::string::npos) { - numLen = freqStr.length(); - } - - std::string numPartStr = freqStr.substr(0, numLen); - std::string suffixStr = freqStr.substr(numLen); - - std::stringstream numPartStream; - numPartStream.str(numPartStr); - - long double freqTemp = 0; - - numPartStream >> freqTemp; - - if (suffixStr.length()) { - if (suffixStr.find_first_of("Gg") != std::string::npos) { - freqTemp *= 1.0e9; - } else if (suffixStr.find_first_of("Mm") != std::string::npos) { - freqTemp *= 1.0e6; - } else if (suffixStr.find_first_of("Kk") != std::string::npos) { - freqTemp *= 1.0e3; - } else if (suffixStr.find_first_of("Hh") != std::string::npos) { - // ... - } - } else if (numPartStr.find_first_of(".") != std::string::npos || freqTemp <= 3000) { - freqTemp *= 1.0e6; - } - - return (long long) freqTemp; -} void FrequencyDialog::OnChar(wxKeyEvent& event) { int c = event.GetKeyCode(); diff --git a/src/FrequencyDialog.h b/src/FrequencyDialog.h index 4f2b931..d0c57b0 100644 --- a/src/FrequencyDialog.h +++ b/src/FrequencyDialog.h @@ -21,14 +21,10 @@ public: wxTextCtrl * dialogText; - long long strToFrequency(std::string freqStr); - std::string frequencyToStr(long long freq); - private: DemodulatorInstance *activeDemod; void OnEnter ( wxCommandEvent &event ); void OnChar ( wxKeyEvent &event ); - std::string& filterChars(std::string& s, const std::string& allowed); FrequencyDialogTarget targetMode; DECLARE_EVENT_TABLE() }; diff --git a/src/sdr/SDRDeviceInfo.cpp b/src/sdr/SDRDeviceInfo.cpp index b232051..4c966bd 100644 --- a/src/sdr/SDRDeviceInfo.cpp +++ b/src/sdr/SDRDeviceInfo.cpp @@ -80,7 +80,7 @@ SDRDeviceRange &SDRDeviceChannel::getRFRange() { return rangeRF; } -std::vector &SDRDeviceChannel::getSampleRates() { +std::vector &SDRDeviceChannel::getSampleRates() { return sampleRates; } diff --git a/src/sdr/SDRDeviceInfo.h b/src/sdr/SDRDeviceInfo.h index 638e3ee..ffedc27 100644 --- a/src/sdr/SDRDeviceInfo.h +++ b/src/sdr/SDRDeviceInfo.h @@ -68,7 +68,7 @@ public: SDRDeviceRange &getFreqRange(); SDRDeviceRange &getRFRange(); - std::vector &getSampleRates(); + std::vector &getSampleRates(); std::vector &getFilterBandwidths(); const bool& hasHardwareDC() const; @@ -82,7 +82,7 @@ private: int channel; bool fullDuplex, tx, rx, hardwareDC, hasCorr; SDRDeviceRange rangeGain, rangeLNA, rangeFull, rangeRF; - std::vector sampleRates; + std::vector sampleRates; std::vector filterBandwidths; }; diff --git a/src/sdr/SDREnumerator.cpp b/src/sdr/SDREnumerator.cpp index 94dbe9d..7b1233d 100644 --- a/src/sdr/SDREnumerator.cpp +++ b/src/sdr/SDREnumerator.cpp @@ -190,7 +190,9 @@ std::vector *SDREnumerator::enumerate_devices(std::string remot } std::vector rates = device->listSampleRates(SOAPY_SDR_RX, i); - chan->getSampleRates().assign(rates.begin(), rates.end()); + for (std::vector::iterator i = rates.begin(); i != rates.end(); i++) { + chan->getSampleRates().push_back((long)(*i)); + } dev->addChannel(chan); }