diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 61af844..d4e11d7 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -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"); diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index c4870e5..aa11a4f 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -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() { diff --git a/src/sdr/SDRDeviceInfo.cpp b/src/sdr/SDRDeviceInfo.cpp index 5058d3f..d6e16e5 100644 --- a/src/sdr/SDRDeviceInfo.cpp +++ b/src/sdr/SDRDeviceInfo.cpp @@ -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 &SDRDeviceChannel::getSampleRates() const { +std::vector &SDRDeviceChannel::getSampleRates() { return sampleRates; } -const std::vector &SDRDeviceChannel::getFilterBandwidths() const { +std::vector &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 &SDRDeviceInfo::getChannels() { + return channels; +} + +SDRDeviceChannel * SDRDeviceInfo::getRxChannel() { + std::vector::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::iterator channel_i; + for (channel_i = channels.begin(); channel_i != channels.end(); channel_i++) { + if ((*channel_i)->isTx()) { + return (*channel_i); + } + } + return NULL; +} + diff --git a/src/sdr/SDRDeviceInfo.h b/src/sdr/SDRDeviceInfo.h index 64ac47b..7ebbcf5 100644 --- a/src/sdr/SDRDeviceInfo.h +++ b/src/sdr/SDRDeviceInfo.h @@ -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 &getSampleRates() const; - const std::vector &getFilterBandwidths() const; + std::vector &getSampleRates(); + std::vector &getFilterBandwidths(); private: int channel; @@ -114,7 +119,10 @@ public: bool hasTimestamps() const; void setTimestamps(bool timestamps); - const std::vector& getChannels() const; + void addChannel(SDRDeviceChannel *chan); + std::vector &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 channels; + std::vector channels; }; diff --git a/src/sdr/SDREnumerator.cpp b/src/sdr/SDREnumerator.cpp index 1223acd..fb72711 100644 --- a/src/sdr/SDREnumerator.cpp +++ b/src/sdr/SDREnumerator.cpp @@ -111,6 +111,25 @@ std::vector *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 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;