Integrate more soapy device params
- Check current sample/frequency ranges when switching devices to keep them in bounds.
This commit is contained in:
parent
bf9695ecd3
commit
3bf0439c56
|
@ -195,6 +195,8 @@ AppFrame::AppFrame() :
|
|||
wxMenuBar *menuBar = new wxMenuBar;
|
||||
wxMenu *menu = new wxMenu;
|
||||
|
||||
menu->Append(wxID_SDR_DEVICES, "SDR Devices");
|
||||
menu->AppendSeparator();
|
||||
menu->Append(wxID_OPEN, "&Open Session");
|
||||
menu->Append(wxID_SAVE, "&Save Session");
|
||||
menu->Append(wxID_SAVEAS, "Save Session &As..");
|
||||
|
@ -210,7 +212,6 @@ AppFrame::AppFrame() :
|
|||
|
||||
menu = new wxMenu;
|
||||
|
||||
menu->Append(wxID_SDR_DEVICES, "SDR Devices");
|
||||
menu->Append(wxID_SET_FREQ_OFFSET, "Frequency Offset");
|
||||
menu->Append(wxID_SET_PPM, "Device PPM");
|
||||
iqSwapMenuItem = menu->AppendCheckItem(wxID_SET_SWAP_IQ, "Swap I/Q");
|
||||
|
|
|
@ -276,24 +276,56 @@ void CubicSDR::setSampleRate(long long rate_in) {
|
|||
}
|
||||
|
||||
void CubicSDR::setDevice(SDRDeviceInfo *dev) {
|
||||
|
||||
if (!sdrThread->isTerminated()) {
|
||||
sdrThread->terminate();
|
||||
if (t_SDR) {
|
||||
t_SDR->join();
|
||||
delete t_SDR;
|
||||
}
|
||||
}
|
||||
|
||||
sdrThread->setDevice(dev);
|
||||
|
||||
DeviceConfig *devConfig = config.getDevice(dev->getDeviceId());
|
||||
|
||||
setPPM(devConfig->getPPM());
|
||||
setDirectSampling(devConfig->getDirectSampling());
|
||||
setSwapIQ(devConfig->getIQSwap());
|
||||
setOffset(devConfig->getOffset());
|
||||
|
||||
t_SDR = new std::thread(&SDRThread::threadMain, sdrThread);
|
||||
SDRDeviceChannel *chan = dev->getRxChannel();
|
||||
|
||||
if (chan) {
|
||||
long long freqHigh, freqLow;
|
||||
|
||||
freqHigh = chan->getRFRange().getHigh();
|
||||
freqLow = chan->getRFRange().getLow();
|
||||
|
||||
if (frequency > freqHigh) {
|
||||
frequency = freqHigh;
|
||||
} else if (frequency < freqLow) {
|
||||
frequency = freqLow;
|
||||
}
|
||||
|
||||
int rateHigh, rateLow;
|
||||
rateLow = chan->getSampleRates()[0];
|
||||
rateHigh = chan->getSampleRates()[chan->getSampleRates().size()-1];
|
||||
|
||||
if (sampleRate > rateHigh) {
|
||||
sampleRate = rateHigh;
|
||||
} else if (sampleRate < rateLow) {
|
||||
sampleRate = rateLow;
|
||||
}
|
||||
|
||||
if (frequency < sampleRate/2) {
|
||||
frequency = sampleRate/2;
|
||||
}
|
||||
|
||||
setFrequency(frequency);
|
||||
setSampleRate(sampleRate);
|
||||
|
||||
setPPM(devConfig->getPPM());
|
||||
setDirectSampling(devConfig->getDirectSampling());
|
||||
setSwapIQ(devConfig->getIQSwap());
|
||||
setOffset(devConfig->getOffset());
|
||||
|
||||
t_SDR = new std::thread(&SDRThread::threadMain, sdrThread);
|
||||
}
|
||||
}
|
||||
|
||||
SDRDeviceInfo *CubicSDR::getDevice() {
|
||||
|
|
|
@ -1,11 +1,41 @@
|
|||
#include "SDRDeviceInfo.h"
|
||||
|
||||
SDRDeviceRange::SDRDeviceRange() {
|
||||
low = 0;
|
||||
high = 0;
|
||||
}
|
||||
|
||||
int SDRDeviceChannel::getChannel() const {
|
||||
SDRDeviceRange::SDRDeviceRange(double low, double high) {
|
||||
this->low = low;
|
||||
this->high = high;
|
||||
}
|
||||
|
||||
double SDRDeviceRange::getLow() {
|
||||
return low;
|
||||
}
|
||||
void SDRDeviceRange::setLow(double low) {
|
||||
this->low = low;
|
||||
}
|
||||
double SDRDeviceRange::getHigh() {
|
||||
return high;
|
||||
}
|
||||
void SDRDeviceRange::setHigh(double high) {
|
||||
this->high = high;
|
||||
}
|
||||
|
||||
SDRDeviceChannel::SDRDeviceChannel() {
|
||||
|
||||
}
|
||||
|
||||
SDRDeviceChannel::~SDRDeviceChannel() {
|
||||
|
||||
}
|
||||
|
||||
int SDRDeviceChannel::getChannel() {
|
||||
return channel;
|
||||
}
|
||||
|
||||
void SDRDeviceChannel::setChannel(const int channel) {
|
||||
void SDRDeviceChannel::setChannel(int channel) {
|
||||
this->channel = channel;
|
||||
}
|
||||
|
||||
|
@ -33,27 +63,27 @@ void SDRDeviceChannel::setRx(bool rx) {
|
|||
this->rx = rx;
|
||||
}
|
||||
|
||||
const SDRDeviceRange &SDRDeviceChannel::getGain() const {
|
||||
SDRDeviceRange &SDRDeviceChannel::getGain() {
|
||||
return rangeGain;
|
||||
}
|
||||
|
||||
const SDRDeviceRange &SDRDeviceChannel::getLNAGain() const {
|
||||
SDRDeviceRange &SDRDeviceChannel::getLNAGain() {
|
||||
return rangeLNA;
|
||||
}
|
||||
|
||||
const SDRDeviceRange &SDRDeviceChannel::getFreqRange() const {
|
||||
SDRDeviceRange &SDRDeviceChannel::getFreqRange() {
|
||||
return rangeFull;
|
||||
}
|
||||
|
||||
const SDRDeviceRange &SDRDeviceChannel::getRFRange() const {
|
||||
SDRDeviceRange &SDRDeviceChannel::getRFRange() {
|
||||
return rangeRF;
|
||||
}
|
||||
|
||||
const std::vector<long long> &SDRDeviceChannel::getSampleRates() const {
|
||||
std::vector<long long> &SDRDeviceChannel::getSampleRates() {
|
||||
return sampleRates;
|
||||
}
|
||||
|
||||
const std::vector<long long> &SDRDeviceChannel::getFilterBandwidths() const {
|
||||
std::vector<long long> &SDRDeviceChannel::getFilterBandwidths() {
|
||||
return filterBandwidths;
|
||||
}
|
||||
|
||||
|
@ -177,3 +207,32 @@ void SDRDeviceInfo::setStreamArgs(SoapySDR::Kwargs streamArgs) {
|
|||
SoapySDR::Kwargs SDRDeviceInfo::getStreamArgs() {
|
||||
return streamArgs;
|
||||
}
|
||||
|
||||
void SDRDeviceInfo::addChannel(SDRDeviceChannel *chan) {
|
||||
channels.push_back(chan);
|
||||
}
|
||||
|
||||
std::vector<SDRDeviceChannel *> &SDRDeviceInfo::getChannels() {
|
||||
return channels;
|
||||
}
|
||||
|
||||
SDRDeviceChannel * SDRDeviceInfo::getRxChannel() {
|
||||
std::vector<SDRDeviceChannel *>::iterator channel_i;
|
||||
for (channel_i = channels.begin(); channel_i != channels.end(); channel_i++) {
|
||||
if ((*channel_i)->isRx()) {
|
||||
return (*channel_i);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SDRDeviceChannel * SDRDeviceInfo::getTxChannel() {
|
||||
std::vector<SDRDeviceChannel *>::iterator channel_i;
|
||||
for (channel_i = channels.begin(); channel_i != channels.end(); channel_i++) {
|
||||
if ((*channel_i)->isTx()) {
|
||||
return (*channel_i);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -34,20 +34,25 @@
|
|||
|
||||
class SDRDeviceRange {
|
||||
public:
|
||||
SDRDeviceRange(float low, float high);
|
||||
SDRDeviceRange();
|
||||
SDRDeviceRange(double low, double high);
|
||||
|
||||
float getLow() const;
|
||||
void setLow(const float low);
|
||||
float getHigh() const;
|
||||
void setHigh(const float high);
|
||||
double getLow();
|
||||
void setLow(double low);
|
||||
double getHigh();
|
||||
void setHigh(double high);
|
||||
|
||||
private:
|
||||
float low, high;
|
||||
double low, high;
|
||||
};
|
||||
|
||||
class SDRDeviceChannel {
|
||||
int getChannel() const;
|
||||
void setChannel(const int channel);
|
||||
public:
|
||||
SDRDeviceChannel();
|
||||
~SDRDeviceChannel();
|
||||
|
||||
int getChannel();
|
||||
void setChannel(int channel);
|
||||
|
||||
bool isFullDuplex();
|
||||
void setFullDuplex(bool fullDuplex);
|
||||
|
@ -58,13 +63,13 @@ class SDRDeviceChannel {
|
|||
bool isRx();
|
||||
void setRx(bool rx);
|
||||
|
||||
const SDRDeviceRange &getGain() const;
|
||||
const SDRDeviceRange &getLNAGain() const;
|
||||
const SDRDeviceRange &getFreqRange() const;
|
||||
const SDRDeviceRange &getRFRange() const;
|
||||
SDRDeviceRange &getGain();
|
||||
SDRDeviceRange &getLNAGain();
|
||||
SDRDeviceRange &getFreqRange();
|
||||
SDRDeviceRange &getRFRange();
|
||||
|
||||
const std::vector<long long> &getSampleRates() const;
|
||||
const std::vector<long long> &getFilterBandwidths() const;
|
||||
std::vector<long long> &getSampleRates();
|
||||
std::vector<long long> &getFilterBandwidths();
|
||||
|
||||
private:
|
||||
int channel;
|
||||
|
@ -114,7 +119,10 @@ public:
|
|||
bool hasTimestamps() const;
|
||||
void setTimestamps(bool timestamps);
|
||||
|
||||
const std::vector<SDRDeviceChannel>& getChannels() const;
|
||||
void addChannel(SDRDeviceChannel *chan);
|
||||
std::vector<SDRDeviceChannel *> &getChannels();
|
||||
SDRDeviceChannel * getRxChannel();
|
||||
SDRDeviceChannel * getTxChannel();
|
||||
|
||||
void setDeviceArgs(SoapySDR::Kwargs deviceArgs);
|
||||
SoapySDR::Kwargs getDeviceArgs();
|
||||
|
@ -129,5 +137,5 @@ private:
|
|||
bool timestamps, available, hardwareDC;
|
||||
|
||||
SoapySDR::Kwargs deviceArgs, streamArgs;
|
||||
std::vector<SDRDeviceChannel> channels;
|
||||
std::vector<SDRDeviceChannel *> channels;
|
||||
};
|
||||
|
|
|
@ -111,6 +111,25 @@ std::vector<SDRDeviceInfo *> *SDREnumerator::enumerate_devices() {
|
|||
}
|
||||
}
|
||||
|
||||
int numChan = device->getNumChannels(SOAPY_SDR_RX);
|
||||
for (int i = 0; i < numChan; i++) {
|
||||
SDRDeviceChannel *chan = new SDRDeviceChannel();
|
||||
|
||||
SoapySDR::RangeList rfRange = device->getFrequencyRange(SOAPY_SDR_RX, i);
|
||||
double rfMin = rfRange[0].minimum();
|
||||
double rfMax = rfRange[rfRange.size()-1].maximum();
|
||||
chan->setChannel(i);
|
||||
chan->setFullDuplex(device->getFullDuplex(SOAPY_SDR_RX, i));
|
||||
chan->setRx(true);
|
||||
chan->setTx(false);
|
||||
chan->getRFRange().setLow(rfMin);
|
||||
chan->getRFRange().setHigh(rfMax);
|
||||
|
||||
std::vector<double> rates = device->listSampleRates(SOAPY_SDR_RX, i);
|
||||
chan->getSampleRates().assign(rates.begin(), rates.end());
|
||||
dev->addChannel(chan);
|
||||
}
|
||||
|
||||
if (device->hasDCOffsetMode(SOAPY_SDR_RX, 0)) {
|
||||
device->setDCOffsetMode(SOAPY_SDR_RX, 0, true);
|
||||
std::cout << "Hardware DC offset support detected; internal DC offset correction will be disabled." << std::endl;
|
||||
|
|
Loading…
Reference in New Issue