mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2026-06-05 07:24:47 -04:00
Can now change input device bandwidth
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
#include <deque>
|
||||
|
||||
SDRPostThread::SDRPostThread() :
|
||||
sample_rate(SRATE), iqDataOutQueue(NULL), iqDataInQueue(NULL), iqVisualQueue(NULL), terminated(false), dcFilter(NULL), num_vis_samples(2048) {
|
||||
iqDataOutQueue(NULL), iqDataInQueue(NULL), iqVisualQueue(NULL), terminated(false), dcFilter(NULL), num_vis_samples(2048) {
|
||||
}
|
||||
|
||||
SDRPostThread::~SDRPostThread() {
|
||||
@@ -90,7 +90,7 @@ void SDRPostThread::threadMain() {
|
||||
DemodulatorThreadIQData *pipeDataOut = new DemodulatorThreadIQData;
|
||||
|
||||
pipeDataOut->frequency = data_in->frequency;
|
||||
pipeDataOut->bandwidth = data_in->bandwidth;
|
||||
pipeDataOut->sampleRate = data_in->sampleRate;
|
||||
pipeDataOut->data.assign(dataOut.begin(), dataOut.end());
|
||||
iqDataOutQueue.load()->push(pipeDataOut);
|
||||
}
|
||||
@@ -98,7 +98,7 @@ void SDRPostThread::threadMain() {
|
||||
if (iqVisualQueue != NULL && iqVisualQueue.load()->empty()) {
|
||||
DemodulatorThreadIQData *visualDataOut = new DemodulatorThreadIQData;
|
||||
visualDataOut->frequency = data_in->frequency;
|
||||
visualDataOut->bandwidth = data_in->bandwidth;
|
||||
visualDataOut->sampleRate = data_in->sampleRate;
|
||||
visualDataOut->data.assign(dataOut.begin(), dataOut.begin() + num_vis_samples);
|
||||
iqVisualQueue.load()->push(visualDataOut);
|
||||
}
|
||||
@@ -131,7 +131,7 @@ void SDRPostThread::threadMain() {
|
||||
for (i = demodulators.begin(); i != demodulators.end(); i++) {
|
||||
DemodulatorInstance *demod = *i;
|
||||
if (demod->getFrequency() != data_in->frequency
|
||||
&& abs(data_in->frequency - demod->getFrequency()) > (SRATE / 2)) {
|
||||
&& abs(data_in->frequency - demod->getFrequency()) > (wxGetApp().getSampleRate() / 2)) {
|
||||
continue;
|
||||
}
|
||||
activeDemods++;
|
||||
@@ -155,7 +155,7 @@ void SDRPostThread::threadMain() {
|
||||
|
||||
// std::lock_guard < std::mutex > lock(demodDataOut->m_mutex);
|
||||
demodDataOut->frequency = data_in->frequency;
|
||||
demodDataOut->bandwidth = data_in->bandwidth;
|
||||
demodDataOut->sampleRate = data_in->sampleRate;
|
||||
demodDataOut->setRefCount(activeDemods);
|
||||
demodDataOut->data.assign(dataOut.begin(), dataOut.end());
|
||||
|
||||
@@ -165,12 +165,12 @@ void SDRPostThread::threadMain() {
|
||||
DemodulatorThreadInputQueue *demodQueue = demod->threadQueueDemod;
|
||||
|
||||
if (demod->getFrequency() != data_in->frequency
|
||||
&& abs(data_in->frequency - demod->getFrequency()) > (SRATE / 2)) {
|
||||
&& abs(data_in->frequency - demod->getFrequency()) > (wxGetApp().getSampleRate() / 2)) {
|
||||
if (demod->isActive()) {
|
||||
demod->setActive(false);
|
||||
DemodulatorThreadIQData *dummyDataOut = new DemodulatorThreadIQData;
|
||||
dummyDataOut->frequency = data_in->frequency;
|
||||
dummyDataOut->bandwidth = data_in->bandwidth;
|
||||
dummyDataOut->sampleRate = data_in->sampleRate;
|
||||
demodQueue->push(dummyDataOut);
|
||||
}
|
||||
} else if (!demod->isActive()) {
|
||||
|
||||
@@ -22,8 +22,6 @@ public:
|
||||
void terminate();
|
||||
|
||||
protected:
|
||||
uint32_t sample_rate;
|
||||
|
||||
std::atomic<SDRThreadIQDataQueue *> iqDataInQueue;
|
||||
std::atomic<DemodulatorThreadInputQueue *> iqDataOutQueue;
|
||||
std::atomic<DemodulatorThreadInputQueue *> iqVisualQueue;
|
||||
|
||||
+19
-10
@@ -6,7 +6,7 @@
|
||||
SDRThread::SDRThread(SDRThreadCommandQueue* pQueue) :
|
||||
commandQueue(pQueue), iqDataOutQueue(NULL), terminated(false), offset(0) {
|
||||
dev = NULL;
|
||||
sampleRate = SRATE;
|
||||
sampleRate = DEFAULT_SAMPLE_RATE;
|
||||
}
|
||||
|
||||
SDRThread::~SDRThread() {
|
||||
@@ -111,16 +111,15 @@ void SDRThread::threadMain() {
|
||||
signed char buf[BUF_SIZE];
|
||||
|
||||
long long frequency = DEFAULT_FREQ;
|
||||
unsigned int bandwidth = SRATE;
|
||||
|
||||
rtlsdr_open(&dev, firstDevAvailable);
|
||||
rtlsdr_set_sample_rate(dev, bandwidth);
|
||||
rtlsdr_set_center_freq(dev, frequency);
|
||||
rtlsdr_set_sample_rate(dev, sampleRate);
|
||||
rtlsdr_set_center_freq(dev, frequency - offset);
|
||||
rtlsdr_set_agc_mode(dev, 1);
|
||||
rtlsdr_set_offset_tuning(dev, 0);
|
||||
rtlsdr_reset_buffer(dev);
|
||||
|
||||
sampleRate = rtlsdr_get_sample_rate(dev);
|
||||
// sampleRate = rtlsdr_get_sample_rate(dev);
|
||||
|
||||
std::cout << "Sample Rate is: " << sampleRate << std::endl;
|
||||
|
||||
@@ -138,8 +137,10 @@ void SDRThread::threadMain() {
|
||||
if (!cmdQueue->empty()) {
|
||||
bool freq_changed = false;
|
||||
bool offset_changed = false;
|
||||
bool rate_changed = false;
|
||||
long long new_freq;
|
||||
long long new_offset;
|
||||
long long new_rate;
|
||||
|
||||
while (!cmdQueue->empty()) {
|
||||
SDRThreadCommand command;
|
||||
@@ -149,8 +150,8 @@ void SDRThread::threadMain() {
|
||||
case SDRThreadCommand::SDR_THREAD_CMD_TUNE:
|
||||
freq_changed = true;
|
||||
new_freq = command.llong_value;
|
||||
if (new_freq < SRATE / 2) {
|
||||
new_freq = SRATE / 2;
|
||||
if (new_freq < sampleRate / 2) {
|
||||
new_freq = sampleRate / 2;
|
||||
}
|
||||
std::cout << "Set frequency: " << new_freq << std::endl;
|
||||
break;
|
||||
@@ -159,6 +160,11 @@ void SDRThread::threadMain() {
|
||||
new_offset = command.llong_value;
|
||||
std::cout << "Set offset: " << new_offset << std::endl;
|
||||
break;
|
||||
case SDRThreadCommand::SDR_THREAD_CMD_SET_SAMPLERATE:
|
||||
rate_changed = true;
|
||||
new_rate = command.llong_value;
|
||||
std::cout << "Set sample rate: " << new_rate << std::endl;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -169,9 +175,12 @@ void SDRThread::threadMain() {
|
||||
freq_changed = true;
|
||||
offset = new_offset;
|
||||
}
|
||||
if (freq_changed) {
|
||||
if (rate_changed) {
|
||||
sampleRate = new_rate;
|
||||
rtlsdr_set_sample_rate(dev, new_rate);
|
||||
} else if (freq_changed) {
|
||||
frequency = new_freq;
|
||||
rtlsdr_set_center_freq(dev, frequency-offset);
|
||||
rtlsdr_set_center_freq(dev, frequency - offset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,7 +203,7 @@ void SDRThread::threadMain() {
|
||||
// std::lock_guard < std::mutex > lock(dataOut->m_mutex);
|
||||
dataOut->setRefCount(1);
|
||||
dataOut->frequency = frequency;
|
||||
dataOut->bandwidth = bandwidth;
|
||||
dataOut->sampleRate = sampleRate;
|
||||
|
||||
if (dataOut->data.capacity() < n_read) {
|
||||
dataOut->data.reserve(n_read);
|
||||
|
||||
+5
-5
@@ -17,7 +17,7 @@
|
||||
class SDRThreadCommand {
|
||||
public:
|
||||
enum SDRThreadCommandEnum {
|
||||
SDR_THREAD_CMD_NULL, SDR_THREAD_CMD_TUNE, SDR_THREAD_CMD_SET_OFFSET
|
||||
SDR_THREAD_CMD_NULL, SDR_THREAD_CMD_TUNE, SDR_THREAD_CMD_SET_OFFSET, SDR_THREAD_CMD_SET_SAMPLERATE
|
||||
};
|
||||
|
||||
SDRThreadCommand() :
|
||||
@@ -37,16 +37,16 @@ public:
|
||||
class SDRThreadIQData: public ReferenceCounter {
|
||||
public:
|
||||
long long frequency;
|
||||
unsigned int bandwidth;
|
||||
long long sampleRate;
|
||||
std::vector<signed char> data;
|
||||
|
||||
SDRThreadIQData() :
|
||||
frequency(0), bandwidth(0) {
|
||||
frequency(0), sampleRate(DEFAULT_SAMPLE_RATE) {
|
||||
|
||||
}
|
||||
|
||||
SDRThreadIQData(unsigned int bandwidth, long long frequency, std::vector<signed char> *data) :
|
||||
frequency(frequency), bandwidth(bandwidth) {
|
||||
SDRThreadIQData(long long bandwidth, long long frequency, std::vector<signed char> *data) :
|
||||
frequency(frequency), sampleRate(bandwidth) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user