mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2024-09-28 08:16:37 -04:00
Dynamic input rate menu values from SoapySDR
This commit is contained in:
parent
71383b4cb6
commit
091ce26ed6
126
src/AppFrame.cpp
126
src/AppFrame.cpp
@ -14,11 +14,11 @@
|
||||
#endif
|
||||
|
||||
#include <vector>
|
||||
#include "DemodulatorMgr.h"
|
||||
#include "AudioThread.h"
|
||||
#include "CubicSDR.h"
|
||||
#include "DataTree.h"
|
||||
#include "ColorTheme.h"
|
||||
#include "DemodulatorMgr.h"
|
||||
|
||||
#include <thread>
|
||||
|
||||
@ -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<SDRDeviceInfo *> *devs = wxGetApp().getDevices();
|
||||
// std::vector<SDRDeviceInfo *>::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<int, wxMenuItem *>::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<long>::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<RtAudio::DeviceInfo>::iterator devices_i;
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "TuningCanvas.h"
|
||||
#include "ModeSelectorCanvas.h"
|
||||
#include "FFTVisualDataThread.h"
|
||||
#include "SDRDeviceInfo.h"
|
||||
//#include "UITestCanvas.h"
|
||||
|
||||
#include <map>
|
||||
@ -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<int, wxMenuItem *> audioSampleRateMenuItems;
|
||||
std::map<int, wxMenuItem *> directSamplingMenuItems;
|
||||
wxMenuItem *iqSwapMenuItem;
|
||||
wxMenu *sampleRateMenu;
|
||||
std::vector<long> sampleRates;
|
||||
|
||||
std::string currentSessionFile;
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
#endif
|
||||
|
||||
#include "CubicSDR.h"
|
||||
#include <iomanip>
|
||||
|
||||
#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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
#include "wx/clipbrd.h"
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
#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();
|
||||
|
@ -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()
|
||||
};
|
||||
|
@ -80,7 +80,7 @@ SDRDeviceRange &SDRDeviceChannel::getRFRange() {
|
||||
return rangeRF;
|
||||
}
|
||||
|
||||
std::vector<long long> &SDRDeviceChannel::getSampleRates() {
|
||||
std::vector<long> &SDRDeviceChannel::getSampleRates() {
|
||||
return sampleRates;
|
||||
}
|
||||
|
||||
|
@ -68,7 +68,7 @@ public:
|
||||
SDRDeviceRange &getFreqRange();
|
||||
SDRDeviceRange &getRFRange();
|
||||
|
||||
std::vector<long long> &getSampleRates();
|
||||
std::vector<long> &getSampleRates();
|
||||
std::vector<long long> &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<long long> sampleRates;
|
||||
std::vector<long> sampleRates;
|
||||
std::vector<long long> filterBandwidths;
|
||||
};
|
||||
|
||||
|
@ -190,7 +190,9 @@ std::vector<SDRDeviceInfo *> *SDREnumerator::enumerate_devices(std::string remot
|
||||
}
|
||||
|
||||
std::vector<double> rates = device->listSampleRates(SOAPY_SDR_RX, i);
|
||||
chan->getSampleRates().assign(rates.begin(), rates.end());
|
||||
for (std::vector<double>::iterator i = rates.begin(); i != rates.end(); i++) {
|
||||
chan->getSampleRates().push_back((long)(*i));
|
||||
}
|
||||
dev->addChannel(chan);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user