Updated to 20 rcvrs and fixed a bug with sending the sequence

This commit is contained in:
mh
2017-12-29 11:06:36 -05:00
parent bcc2f661ec
commit 9f9d2f18f8
30 changed files with 15887 additions and 10843 deletions
+2 -1
View File
@@ -4,7 +4,7 @@ derived from his post: http://www.ping.net.au/20140126_cuSDR64src.tar.gz
This is originally cuSDR written by Hermann, DL3HVH
https://plus.google.com/107168125384405552048/posts
I added local sound and up'd the number of receivers to 16.
I added local sound and up'd the number of receivers to 20.
Using the Hermes-Lite (with some minor protocol changes)
I can do 16 rcvrs @ 96Khz and 9 @ 192Khz:
@@ -17,3 +17,4 @@ the Hermes-Lite rtl supports.
I have only compiled and used this on linux.
To make for Hermes-Lite edit Makefile and add -DHL
+1504 -437
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -1,3 +1,3 @@
[General]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x1\0\0\0\0\0l\0\0\0\x64\0\0\x4\xfb\0\0\x3\x66\0\0\0v\0\0\0\x90\0\0\x4\xf1\0\0\x3\\\0\0\0\0\0\0)
windowState=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\x1\0\0\0\xf5\0\0\x2\x11\xfc\x2\0\0\0\x5\xfb\0\0\0\x12\0R\0\x61\0\x64\0i\0o\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\xfb\0\0\0\x14\0S\0\x65\0r\0v\0\x65\0r\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\xfb\0\0\0\x12\0H\0P\0S\0\x44\0R\0\x43\0t\0r\0l\x1\0\0\0\xa5\0\0\x2\x11\0\0\x2\x11\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0h\0i\0r\0p\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\xfb\0\0\0\x16\0\x44\0i\0s\0p\0l\0\x61\0y\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\0\0\x3\x84\0\0\x2\x11\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x3\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x18\0\x44\0i\0s\0p\0l\0\x61\0y\0P\0\x61\0n\0\x65\0l\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x16\0M\0\x61\0i\0n\0\x42\0u\0t\0t\0o\0n\0s\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0)
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x2\0\0\0\0\x3\x97\0\0\0\x33\0\0\f(\0\0\x6\x1\0\0\x3\x97\0\0\0X\0\0\f(\0\0\x6\x1\0\0\0\0\0\0\0\0\xf\0)
windowState=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\x1\0\0\0\xf5\0\0\x4\xdc\xfc\x2\0\0\0\x5\xfb\0\0\0\x12\0R\0\x61\0\x64\0i\0o\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\xfb\0\0\0\x14\0S\0\x65\0r\0v\0\x65\0r\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\xfb\0\0\0\x12\0H\0P\0S\0\x44\0R\0\x43\0t\0r\0l\x1\0\0\0\xb3\0\0\x4\xdc\0\0\x4\xdc\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0h\0i\0r\0p\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\xfb\0\0\0\x16\0\x44\0i\0s\0p\0l\0\x61\0y\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\0\0\a\x97\0\0\x4\xdc\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0U\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x18\0\x44\0i\0s\0p\0l\0\x61\0y\0P\0\x61\0n\0\x65\0l\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x16\0M\0\x61\0i\0n\0\x42\0u\0t\0t\0o\0n\0s\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0)
+8 -1
View File
@@ -2848,6 +2848,10 @@ void DataProcessor::processInputBuffer(const QByteArray &buffer) {
case 14: m_maxSamples = 512-74; break;
case 15: m_maxSamples = 512-44; break;
case 16: m_maxSamples = 512-14; break;
case 17: m_maxSamples = 512-88; break;
case 18: m_maxSamples = 512-64; break;
case 19: m_maxSamples = 512-40; break;
case 20: m_maxSamples = 512-16; break;
}
// extract the samples
@@ -3376,6 +3380,7 @@ void DataProcessor::encodeCCBytes() {
// C0 = 0 0 0 1 0 0 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _7
// C0 = 0 0 1 0 0 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _8 // Was 0 0 0 1 0 0 1 x
// C0 = 0 0 1 1 0 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _16
// C0 = 0 0 1 1 0 1 0 x C1, C2, C3, C4 NCO Frequency in Hz for Receiver _16
// RRK, workaround for gige timing bug, make sure all rx freq's are sent on init.
if (firstTimeRxInit) {
@@ -3550,10 +3555,12 @@ void DataProcessor::writeData() {
if (m_setNetworkDeviceHeader) {
//RRK updated for 4byte int and network order
quint32 outseq = qFromBigEndian(m_sendSequence);
m_outDatagram.resize(0);
m_outDatagram += m_deviceSendDataSignature;
QByteArray seq(reinterpret_cast<const char*>(&m_sendSequence), sizeof(m_sendSequence));
QByteArray seq(reinterpret_cast<const char*>(&outseq), sizeof(outseq));
m_outDatagram += seq;
m_outDatagram += de->io.audioDatagram;
+4 -2
View File
@@ -420,8 +420,10 @@ private:
unsigned short m_offset;
unsigned short m_length;
long m_sendSequence;
long m_oldSendSequence;
//RRK long m_sendSequence;
//RRK long m_oldSendSequence;
quint32 m_sendSequence;
quint32 m_oldSendSequence;
volatile bool m_stopped;
+1
View File
@@ -120,6 +120,7 @@ void DataIO::stop() {
io->networkIOMutex.unlock();
if(m_pSoundCardOut) {
SleeperThread::msleep(100);
m_pSoundCardOut->Stop();
delete m_pSoundCardOut;
}
+33 -2
View File
@@ -56,6 +56,8 @@ Discoverer::Discoverer(THPSDRParameter *ioData)
Discoverer::~Discoverer() {
}
TNetworkDevicecard mc;
void Discoverer::initHPSDRDevice() {
m_searchTime.start();
@@ -188,7 +190,6 @@ int Discoverer::findHPSDRDevices() {
while (socket.hasPendingDatagrams()) {
TNetworkDevicecard mc;
quint16 port;
m_deviceDatagram.resize(socket.pendingDatagramSize());
@@ -217,6 +218,11 @@ int Discoverer::findHPSDRDevices() {
str = "Griffin";
else if (no == 4)
str = "Angelia";
else if (no == 5)
str = "Orion";
else if (no == 6) {
str = "Hermes-Lite";
}
mc.boardID = no;
mc.boardName = str;
@@ -237,8 +243,11 @@ int Discoverer::findHPSDRDevices() {
else if (m_deviceDatagram[2] == (char)0x03) {
io->networkIOMutex.lock();
DISCOVERER_DEBUG << "Device already sending data!";
DISCOVERER_DEBUG << "Device already sending data - trying to shut down...";
io->networkIOMutex.unlock();
shutdownHPSDRDevice();
clear();
}
}
@@ -269,3 +278,25 @@ void Discoverer::clear() {
//m_metisDeviceComboBox->clear();
m_deviceCards.clear();
}
void Discoverer::shutdownHPSDRDevice() {
QByteArray arr;
arr.resize(64);
arr[0] = (char)0xEF;
arr[1] = (char)0xFE;
arr[2] = (char)0x04;
arr[3] = (char)0x00;
for (int i = 4; i < 64; i++) arr[i] = 0x00;
QUdpSocket socket;
QHostAddress addr = mc.ip_address;
for (int i = 0; i < 10; i++) {
if (socket.writeDatagram(arr, addr, DEVICE_PORT) < 0) {
DISCOVERER_DEBUG << "forced shutdown socket write failed.";
}
}
}
+1
View File
@@ -58,6 +58,7 @@ public:
int findHPSDRDevices();
void clear();
void shutdownHPSDRDevice();
public slots:
void initHPSDRDevice();
+1 -1
View File
@@ -321,7 +321,7 @@ void Receiver::dspProcessing() {
//io.mutex.unlock();
// spectrum
qtdsp->getSpectrum(newSpectrum, set->getFFTMultiplicator());
qtdsp->getSpectrum(newSpectrum, set->getFFTMultiplicator(m_receiver));
if (highResTimer->getElapsedTimeInMicroSec() >= getDisplayDelay()) {
emit spectrumBufferChanged(m_receiver, newSpectrum);
+1 -1
View File
@@ -149,7 +149,7 @@ QAudioDeviceInfo DeviceInfo;
if (-1 == OutDevIndx) m_OutDeviceInfo = QAudioDeviceInfo::defaultOutputDevice();
else m_OutDeviceInfo = m_OutDevices.at(OutDevIndx);
#if 0 //RRK get a list of audio devices and the default
#if 1 //RRK get a list of audio devices and the default
foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) {
qDebug() << "l:" << deviceInfo.deviceName();
}
+61 -15
View File
@@ -760,7 +760,7 @@ void QGLReceiverPanel::drawPanadapter() {
glEnd();
}
#if 0 // remove big red overload indicator
#if 0 //RRK remove big red overload indicator
if (m_adcStatus == 2) {
glBegin(GL_TRIANGLE_STRIP);
@@ -1774,7 +1774,21 @@ void QGLReceiverPanel::drawVFOControl() {
}
// FFT size
if (m_receiver == 0) {
//if (m_receiver == 0) {
if (set->getFFTAutoStatus(m_receiver)) {
}
else {
str = "sample size: %1";
x1 = m_panRect.right() - m_fonts.smallFontMetrics->width(str) - 65;
if (m_dataEngineState == QSDR::DataEngineUp) {
qglColor(QColor(0, 0, 0, 255));
m_oglTextSmall->renderText(x1+3, y1, 0.0f, str.arg(m_sampleSize));
qglColor(QColor(255, 170, 90, 200));
m_oglTextSmall->renderText(x1+1, y1-2, 1.0f, str.arg(m_sampleSize));
}
str = "FFT: %1";
//float res;
@@ -1797,6 +1811,10 @@ void QGLReceiverPanel::drawVFOControl() {
case 8:
s = "32k";
break;
case 16:
s = "64k";
break;
}
x1 = m_panRect.right() - m_fonts.smallFontMetrics->width(str) - 5;
@@ -3766,15 +3784,18 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
deltaSampleSize = m_spectrumSize - m_sampleSize;
}
if (m_receiver == 0) {
if (set->getFFTAutoStatus(m_receiver)) {
}
else {
if (m_sampleSize < 2048) {
if (m_fftMult == 1) {
GRAPHICS_DEBUG << "set sample size to 8192";
set->setSampleSize(this, 0, 8192);
m_dBmPanLogGain += 6.0;
set->setSampleSize(this, m_receiver, 8192);
//m_dBmPanLogGain += 3.0103;
m_dBmPanLogGain += 6;
m_fftMult = 2;
return;
@@ -3782,8 +3803,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
else if (m_fftMult == 2) {
GRAPHICS_DEBUG << "set sample size to 16384";
set->setSampleSize(this, 0, 16384);
m_dBmPanLogGain += 6.0;
set->setSampleSize(this, m_receiver, 16384);
//m_dBmPanLogGain += 3.0103;
m_dBmPanLogGain += 6;
m_fftMult = 4;
return;
@@ -3791,10 +3813,21 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
else if (m_fftMult == 4) {
GRAPHICS_DEBUG << "set sample size to 32768";
set->setSampleSize(this, 0, 32768);
m_dBmPanLogGain += 6.0;
set->setSampleSize(this, m_receiver, 32768);
//m_dBmPanLogGain += 3.0103;
m_dBmPanLogGain += 6;
m_fftMult = 8;
return;
}
else if (m_fftMult == 8) {
GRAPHICS_DEBUG << "set sample size to 65536";
set->setSampleSize(this, m_receiver, 65536);
//m_dBmPanLogGain += 3.0103;
m_dBmPanLogGain += 6;
m_fftMult = 16;
return;
}
}
@@ -3803,8 +3836,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
if (m_fftMult == 2) {
GRAPHICS_DEBUG << "set sample size to 4096";
set->setSampleSize(this, 0, 4096);
m_dBmPanLogGain -= 6.0;
set->setSampleSize(this, m_receiver, 4096);
//m_dBmPanLogGain -= 3.0103;
m_dBmPanLogGain -= 6;
m_fftMult = 1;
return;
@@ -3812,8 +3846,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
else if (m_fftMult == 4) {
GRAPHICS_DEBUG << "set sample size to 8192";
set->setSampleSize(this, 0, 8192);
m_dBmPanLogGain -= 6.0;
set->setSampleSize(this, m_receiver, 8192);
//m_dBmPanLogGain -= 3.0103;
m_dBmPanLogGain -= 6;
m_fftMult = 2;
return;
@@ -3821,10 +3856,21 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
else if (m_fftMult == 8) {
GRAPHICS_DEBUG << "set sample size to 16384";
set->setSampleSize(this, 0, 16384);
m_dBmPanLogGain -= 6.0;
set->setSampleSize(this, m_receiver, 16384);
//m_dBmPanLogGain -= 3.0103;
m_dBmPanLogGain -= 6;
m_fftMult = 4;
return;
}
else if (m_fftMult == 16) {
GRAPHICS_DEBUG << "set sample size to 32768";
set->setSampleSize(this, m_receiver, 32768);
//m_dBmPanLogGain -= 3.0103;
m_dBmPanLogGain -= 6;
m_fftMult = 8;
return;
}
}
+6 -6
View File
@@ -123,7 +123,7 @@ void Demodulation::DoSAM(CPX &in, CPX &out ) {
if ((delay0.im) == 0.0 && (delay0.re == 0.0)) {
delay0.re = 0.000000000001;
delay0.re = 0.000000000001f;
}
difference = sqrt(in.at(i).re * in.at(i).re + in.at(i).im * in.at(i).im) * (qAtan2(delay0.im, delay0.re));
@@ -139,10 +139,10 @@ void Demodulation::DoSAM(CPX &in, CPX &out ) {
m_phase += m_pll_frequency + m_alpha * difference;
while (m_phase >= TWOPI)
m_phase -= TWOPI;
m_phase -= (float)TWOPI;
while (m_phase < 0)
m_phase += TWOPI;
m_phase += (float)TWOPI;
m_lockcurrent = 0.999 * m_lockcurrent + 0.001 * qAbs(delay0.re);
m_lockprevious = m_lockcurrent;
@@ -167,7 +167,7 @@ void Demodulation::DoFMN(CPX &in, CPX &out ) {
if ((delay0.im) == 0.0 && (delay0.re == 0.0)) {
delay0.re = 0.000000000001;
delay0.re = 0.000000000001f;
}
difference = qAtan2(delay0.im, delay0.re);
@@ -181,9 +181,9 @@ void Demodulation::DoFMN(CPX &in, CPX &out ) {
m_phase += m_pll_frequency + m_alpha * difference;
while (m_phase >= TWOPI)
m_phase -= TWOPI;
m_phase -= (float)TWOPI;
while (m_phase < 0)
m_phase += TWOPI;
m_phase += (float)TWOPI;
m_afc = 0.99 * m_afc + 0.01 * m_pll_frequency;
out[i].re = (m_pll_frequency - m_afc) * m_cvt;
+43 -40
View File
@@ -33,6 +33,11 @@
#include "qtdsp_dspEngine.h"
double myLog(double x, double base) {
return log(x) / log(base);
}
QDSPEngine::QDSPEngine(QObject *parent, int rx, int size)
: QObject(parent)
@@ -41,18 +46,18 @@ QDSPEngine::QDSPEngine(QObject *parent, int rx, int size)
, m_rx(rx)
, m_size(size)
, m_samplerate(set->getSampleRate())
, m_fftMultiplcator(1)
, m_fftMultiplier(1)
, m_volume(0.0f)
{
qRegisterMetaType<QVector<cpx> >();
qRegisterMetaType<CPX>();
fft = new QFFT(m_size);
fft = new QFFT(m_size); // m_size = 1024
filter = new QFilter(this, m_size, 2, 12);//8);
wpagc = new QWPAGC(this, m_size);
spectrum = new PowerSpectrum(this, m_size*2);
//spectrum = new PowerSpectrum(this, m_size*2);
QString str = "Initializing DSP engine for rx %1: 8k FFT ...please wait";
/*QString str = "Initializing DSP engine for rx %1: 8k FFT ...please wait";
set->setSystemMessage(str.arg(m_rx), 0);
if (m_rx == 0) {
@@ -66,6 +71,20 @@ QDSPEngine::QDSPEngine(QObject *parent, int rx, int size)
str = "Initializing DSP engine for rx %1: 32k FFT ...please wait";
set->setSystemMessage(str.arg(m_rx), 0);
spectrum8 = new PowerSpectrum(this, m_size*16);
str = "Initializing DSP engine for rx %1: 64k FFT ...please wait";
set->setSystemMessage(str.arg(m_rx), 0);
spectrum16 = new PowerSpectrum(this, m_size*32);
}*/
int factor = 2;
while (factor <= 128) {
PowerSpectrum* spec = new PowerSpectrum(this, m_size*factor);
powerSpectraList << spec;
factor *= 2;
}
m_spectrumSize = m_size*4;
@@ -116,8 +135,13 @@ QDSPEngine::~QDSPEngine() {
if (wpagc)
delete wpagc;
if (spectrum)
delete spectrum;
//if (spectrum)
// delete spectrum;
if (!powerSpectraList.empty()) {
powerSpectraList.clear();
}
if (signalmeter)
delete signalmeter;
@@ -175,7 +199,7 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) {
m_mutex.lock();
switch (m_fftMultiplcator) {
/*switch (m_fftMultiplcator) {
case 1:
spectrum->ProcessSpectrum(in, size*2, 1);
@@ -192,7 +216,14 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) {
case 8:
spectrum8->ProcessSpectrum(in, size*16, 15);
break;
}
case 16:
spectrum16->ProcessSpectrum(in, size*32, 31);
break;
}*/
int idx = (int)(myLog(m_fftMultiplier, 2));
powerSpectraList.at(idx)->ProcessSpectrum(in, size * m_fftMultiplier * 2, m_fftMultiplier*2-1);
if (m_NcoFreq != 0)
ProcessFrequencyShift(in, in, size);
@@ -214,36 +245,10 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) {
int QDSPEngine::getSpectrum(qVectorFloat &buffer, int mult) {
if (m_rx == 0) {
m_fftMultiplier = mult;
int idx = (int)(myLog(m_fftMultiplier, 2));
m_fftMultiplcator = mult;
switch (m_fftMultiplcator) {
case 1:
return spectrum->spectrumResult(buffer, 0);
break;
case 2:
return spectrum2->spectrumResult(buffer, 2048);
break;
case 4:
return spectrum4->spectrumResult(buffer, 6144);
break;
case 8:
return spectrum8->spectrumResult(buffer, 14336);
break;
default:
return spectrum->spectrumResult(buffer, 0);
break;
}
}
else {
return spectrum->spectrumResult(buffer, 0);
}
return powerSpectraList.at(idx)->spectrumResult(buffer, m_size * m_fftMultiplier * 2 - 2048);
}
float QDSPEngine::getSMeterInstValue() {
@@ -354,9 +359,7 @@ void QDSPEngine::setNCOFrequency(int rx, long ncoFreq) {
void QDSPEngine::setSampleSize(int rx, int size) {
Q_UNUSED(rx)
if (m_rx == 0) {
if (m_rx == rx) {
m_mutex.lock();
m_spectrumSize = size;
+5 -1
View File
@@ -72,9 +72,13 @@ public:
PowerSpectrum* spectrum2;
PowerSpectrum* spectrum4;
PowerSpectrum* spectrum8;
PowerSpectrum* spectrum16;
SignalMeter* signalmeter;
Demodulation* demod;
QList<PowerSpectrum* > powerSpectraList;
void processDSP(CPX &in, CPX &out, int size);
int getSpectrum(qVectorFloat &buffer, int mult);
@@ -108,7 +112,7 @@ private:
int m_size;
int m_spectrumSize;
int m_samplerate;
int m_fftMultiplcator;
int m_fftMultiplier;
float m_volume;
qreal m_NcoFreq;
+1 -1
View File
@@ -211,7 +211,7 @@ void QFilter::Normalize(CPX &in, CPX &out, int size) {
void QFilter::Decimate(CPX &in, CPX &out, int downrate) {
int newsize = qRound((float) m_size/downrate);
int newsize = qRound(qreal(m_size / downrate));
//memset(out, 0, newsize * sizeof(CPX));
//memset(tmp, 0, m_size * sizeof(CPX));
+2 -2
View File
@@ -189,8 +189,8 @@ void QHPainter::drawShadowText (qreal x, qreal y,
shadowImage.shadowBlur(radius, shadowColor);
// Compose Text and Shadow
int addSizeX = (offset.x() > radius) ? (abs(offset.x()) - radius) : 0;
int addSizeY = (offset.y() > radius) ? (abs(offset.y()) - radius) : 0;
int addSizeX = (offset.x() > radius) ? (fabs(offset.x()) - radius) : 0;
int addSizeY = (offset.y() > radius) ? (fabs(offset.y()) - radius) : 0;
QSize finalSize = shadowImage.size() + QSize(addSizeX, addSizeY);
QPointF shadowTopLeft(QPointF((finalSize.width() - shadowImage.width()) / 2.0,
+1
View File
@@ -30,6 +30,7 @@
#define CUSDR_PAINTER_H
#include <QPainter>
#include <cmath>
class QHPainter : public QPainter {
+1 -1
View File
@@ -151,7 +151,7 @@ void AlexAntennaWidget::createAntennasGroup() {
// band label
QStringList bandNames;
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "gen";
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen";
QList<QLabel *> bandLabelList;
+2 -2
View File
@@ -138,7 +138,7 @@ void ExtCtrlWidget::createReceivePinsGroup() {
// band label
QStringList bandNames;
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm";
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen";
QList<QLabel *> bandLabelList;
@@ -212,7 +212,7 @@ void ExtCtrlWidget::createTransmitPinsGroup() {
// band label
QStringList bandNames;
bandNames << "2200 m" << "630 m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm";
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen";
QList<QLabel *> bandLabelList;
+38 -1
View File
@@ -60,7 +60,11 @@ typedef enum _hamBand {
cm125, // 14
cm70, // 15
cm33, // 16
gen // 17
cm23, // 17
cm13, // 18
cm10, // 19
cm5, // 21
gen // 22
} HamBand;
@@ -301,6 +305,39 @@ inline QList<THamBandFrequencies> getHamBandFrequencies() {
hamBandFreqList << hamBandFreq;
//RRK TODO FIX
hamBandFreq.frequencyLo = 902000000;
hamBandFreq.frequencyHi = 928000000;
hamBandFreq.hamBand = (HamBand) cm23;
hamBandFreq.bandString = "23cm";
hamBandFreq.region = (IARURegion) region1;
hamBandFreqList << hamBandFreq;
hamBandFreq.frequencyLo = 902000000;
hamBandFreq.frequencyHi = 928000000;
hamBandFreq.hamBand = (HamBand) cm13;
hamBandFreq.bandString = "13cm";
hamBandFreq.region = (IARURegion) region1;
hamBandFreqList << hamBandFreq;
hamBandFreq.frequencyLo = 902000000;
hamBandFreq.frequencyHi = 928000000;
hamBandFreq.hamBand = (HamBand) cm10;
hamBandFreq.bandString = "10cm";
hamBandFreq.region = (IARURegion) region1;
hamBandFreqList << hamBandFreq;
hamBandFreq.frequencyLo = 902000000;
hamBandFreq.frequencyHi = 928000000;
hamBandFreq.hamBand = (HamBand) cm5;
hamBandFreq.bandString = "5cm";
hamBandFreq.region = (IARURegion) region1;
hamBandFreqList << hamBandFreq;
hamBandFreq.frequencyLo = 0;
hamBandFreq.frequencyHi = 61440000;
hamBandFreq.hamBand = (HamBand) gen;
+1 -1
View File
@@ -107,6 +107,7 @@ public slots:
void suspendSignal(QObject *sender);
void startPlaybackSignal(QObject *sender);
void showSettingsDialogSignal(QObject *sender);
void showWarningDialog(const QString &msg);
private:
void setSystemState(
@@ -333,7 +334,6 @@ private slots:
void showStatusBarMessage(const QString &msg, int time);
void clearStatusBarMessage();
void showNetworkIODialog();
void showWarningDialog(const QString &msg);
void addNetworkIOComboBoxEntry(QString str);
void clearNetworkIOComboBoxEntry();
+98 -3
View File
@@ -117,6 +117,7 @@ RadioPopupWidget::RadioPopupWidget(QWidget *parent, int rx)
CHECKED_CONNECT(stickyBtn, SIGNAL(clicked()), this, SLOT(setSticky()));
createOptionsBtnGroup();
createFFTOptionsGroup();
createBandBtnGroup();
createModeBtnGroup();
createAgcBtnGroup();
@@ -150,6 +151,8 @@ RadioPopupWidget::RadioPopupWidget(QWidget *parent, int rx)
mainLayout->addSpacing(16);
//mainLayout->addStretch();
mainLayout->addLayout(optionsVBox);
mainLayout->addSpacing(8);
mainLayout->addLayout(fftOptionsVBox);
mainLayout->addSpacing(16);
mainLayout->addLayout(bandVBox);
mainLayout->addSpacing(8);
@@ -535,6 +538,62 @@ void RadioPopupWidget::createOptionsBtnGroup() {
optionsVBox->addLayout(hbox5);
}
void RadioPopupWidget::createFFTOptionsGroup() {
m_FFTAutoBtn = new AeroButton("Auto", this);
m_FFTAutoBtn->setRoundness(10);
m_FFTAutoBtn->setFont(m_fonts.smallFont);
m_4kFFTBtn = new AeroButton("FFT 4k", this);
m_4kFFTBtn->setRoundness(10);
m_4kFFTBtn->setFont(m_fonts.smallFont);
m_8kFFTBtn = new AeroButton("FFT 8k", this);
m_8kFFTBtn->setRoundness(10);
m_8kFFTBtn->setFont(m_fonts.smallFont);
m_16kFFTBtn = new AeroButton("FFT 16k", this);
m_16kFFTBtn->setRoundness(10);
m_16kFFTBtn->setFont(m_fonts.smallFont);
m_32kFFTBtn = new AeroButton("FFT 32k", this);
m_32kFFTBtn->setRoundness(10);
m_32kFFTBtn->setFont(m_fonts.smallFont);
m_64kFFTBtn = new AeroButton("FFT 64k", this);
m_64kFFTBtn->setRoundness(10);
m_64kFFTBtn->setFont(m_fonts.smallFont);
m_128kFFTBtn = new AeroButton("FFT 128k", this);
m_128kFFTBtn->setRoundness(10);
m_128kFFTBtn->setFont(m_fonts.smallFont);
m_256kFFTBtn = new AeroButton("FFT 256k", this);
m_256kFFTBtn->setRoundness(10);
m_256kFFTBtn->setFont(m_fonts.smallFont);
QHBoxLayout* hbox1 = new QHBoxLayout();
hbox1->setContentsMargins(0, 0, 0, 0);
hbox1->setSpacing(0);
hbox1->addWidget(m_FFTAutoBtn);
hbox1->addWidget(m_4kFFTBtn);
hbox1->addWidget(m_8kFFTBtn);
hbox1->addWidget(m_16kFFTBtn);
QHBoxLayout* hbox2 = new QHBoxLayout();
hbox2->setContentsMargins(0, 0, 0, 0);
hbox2->setSpacing(0);
hbox2->addWidget(m_32kFFTBtn);
hbox2->addWidget(m_64kFFTBtn);
hbox2->addWidget(m_128kFFTBtn);
hbox2->addWidget(m_256kFFTBtn);
fftOptionsVBox = new QVBoxLayout;
fftOptionsVBox->setSpacing(1);
fftOptionsVBox->addLayout(hbox1);
fftOptionsVBox->addLayout(hbox2);
}
void RadioPopupWidget::createBandBtnGroup() {
band2200mBtn = new AeroButton("2200m", this);
@@ -605,6 +664,22 @@ void RadioPopupWidget::createBandBtnGroup() {
bandBtnList.append(band33cmBtn);
CHECKED_CONNECT(band33cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band23cmBtn = new AeroButton("23 cm", this);
bandBtnList.append(band23cmBtn);
CHECKED_CONNECT(band23cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band13cmBtn = new AeroButton("13 cm", this);
bandBtnList.append(band13cmBtn);
CHECKED_CONNECT(band13cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band10cmBtn = new AeroButton("10 cm", this);
bandBtnList.append(band10cmBtn);
CHECKED_CONNECT(band10cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band5cmBtn = new AeroButton("5 cm", this);
bandBtnList.append(band5cmBtn);
CHECKED_CONNECT(band5cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
bandGenBtn = new AeroButton("Gen", this);
bandBtnList.append(bandGenBtn);
CHECKED_CONNECT(bandGenBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
@@ -637,22 +712,30 @@ void RadioPopupWidget::createBandBtnGroup() {
hbox2->addWidget(band12mBtn);
hbox2->addWidget(band10mBtn);
hbox2->addWidget(band6mBtn);
hbox2->addWidget(bandGenBtn);
hbox2->addWidget(band2mBtn);
QHBoxLayout *hbox3 = new QHBoxLayout();
hbox3->setContentsMargins(0, 0, 0, 0);
hbox3->setSpacing(0);
hbox3->addWidget(band2mBtn);
hbox3->addWidget(band125cmBtn);
hbox3->addWidget(band70cmBtn);
hbox3->addWidget(band12mBtn);
hbox3->addWidget(band33cmBtn);
hbox3->addWidget(band23cmBtn);
hbox3->addWidget(band13cmBtn);
hbox3->addWidget(band10cmBtn);
hbox3->addWidget(band5cmBtn);
QHBoxLayout *hbox4 = new QHBoxLayout();
hbox4->setContentsMargins(0, 0, 0, 0);
hbox4->setSpacing(0);
hbox4->addWidget(bandGenBtn);
bandVBox = new QVBoxLayout;
bandVBox->setSpacing(1);
bandVBox->addLayout(hbox1);
bandVBox->addLayout(hbox2);
bandVBox->addLayout(hbox3);
bandVBox->addLayout(hbox4);
}
@@ -1198,6 +1281,18 @@ void RadioPopupWidget::bandChangedByBtn() {
if (str == "33 cm")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm33));
else
if (str == "23 cm")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm23));
else
if (str == "13 cm")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm13));
else
if (str == "10 cm")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm10));
else
if (str == "5 cm")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm5));
else
if (str == "Gen")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(gen));
}
+15
View File
@@ -93,6 +93,7 @@ private:
WaterfallColorMode m_waterfallColorMode;
QVBoxLayout* optionsVBox;
QVBoxLayout* fftOptionsVBox;
QVBoxLayout* bandVBox;
QVBoxLayout* modeVBox;
QVBoxLayout* agcVBox;
@@ -130,6 +131,15 @@ private:
AeroButton* m_WaterfallSimpleBtn;
AeroButton* m_WaterfallEnhancedBtn;
AeroButton* m_FFTAutoBtn;
AeroButton* m_4kFFTBtn;
AeroButton* m_8kFFTBtn;
AeroButton* m_16kFFTBtn;
AeroButton* m_32kFFTBtn;
AeroButton* m_64kFFTBtn;
AeroButton* m_128kFFTBtn;
AeroButton* m_256kFFTBtn;
AeroButton* band2200mBtn;
AeroButton* band630mBtn;
AeroButton* band160mBtn;
@@ -147,6 +157,10 @@ private:
AeroButton* band125cmBtn;
AeroButton* band70cmBtn;
AeroButton* band33cmBtn;
AeroButton* band23cmBtn;
AeroButton* band13cmBtn;
AeroButton* band10cmBtn;
AeroButton* band5cmBtn;
AeroButton* bandGenBtn;
//AeroButton* bandxxBtn;
@@ -272,6 +286,7 @@ private slots:
void setSticky();
void createOptionsBtnGroup();
void createFFTOptionsGroup();
void createBandBtnGroup();
void createModeBtnGroup();
void createAgcBtnGroup();
+49 -13
View File
@@ -345,40 +345,60 @@ void RadioWidget::createBandBtnGroup() {
band2mBtn = new AeroButton("2 m", this);
band2mBtn->setRoundness(0);
//band6mBtn->setGlass(false);
band2mBtn->setFixedSize(btn_widths, btn_height);
band2mBtn->setStyleSheet(set->getMiniButtonStyle());
//band6mBtn->setTextColor(QColor(200, 200, 200));
bandBtnList.append(band2mBtn);
CHECKED_CONNECT(band2mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band125cmBtn = new AeroButton("125 cm", this);
band125cmBtn->setRoundness(0);
//band6mBtn->setGlass(false);
band125cmBtn->setFixedSize(btn_widths, btn_height);
band125cmBtn->setStyleSheet(set->getMiniButtonStyle());
//band6mBtn->setTextColor(QColor(200, 200, 200));
bandBtnList.append(band125cmBtn);
CHECKED_CONNECT(band125cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band70cmBtn = new AeroButton("70 cm", this);
band70cmBtn->setRoundness(0);
//band6mBtn->setGlass(false);
band70cmBtn->setFixedSize(btn_widths, btn_height);
band70cmBtn->setStyleSheet(set->getMiniButtonStyle());
//band6mBtn->setTextColor(QColor(200, 200, 200));
bandBtnList.append(band70cmBtn);
CHECKED_CONNECT(band70cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band33cmBtn = new AeroButton("33 cm", this);
band33cmBtn->setRoundness(0);
//band6mBtn->setGlass(false);
band33cmBtn->setFixedSize(btn_widths, btn_height);
band33cmBtn->setStyleSheet(set->getMiniButtonStyle());
//band6mBtn->setTextColor(QColor(200, 200, 200));
bandBtnList.append(band33cmBtn);
CHECKED_CONNECT(band33cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band23cmBtn = new AeroButton("23 cm", this);
band23cmBtn->setRoundness(0);
band23cmBtn->setFixedSize(btn_widths, btn_height);
band23cmBtn->setStyleSheet(set->getMiniButtonStyle());
bandBtnList.append(band23cmBtn);
CHECKED_CONNECT(band23cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band13cmBtn = new AeroButton("13 cm", this);
band13cmBtn->setRoundness(0);
band13cmBtn->setFixedSize(btn_widths, btn_height);
band13cmBtn->setStyleSheet(set->getMiniButtonStyle());
bandBtnList.append(band13cmBtn);
CHECKED_CONNECT(band13cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band10cmBtn = new AeroButton("10 cm", this);
band10cmBtn->setRoundness(0);
band10cmBtn->setFixedSize(btn_widths, btn_height);
band10cmBtn->setStyleSheet(set->getMiniButtonStyle());
bandBtnList.append(band10cmBtn);
CHECKED_CONNECT(band10cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band5cmBtn = new AeroButton("5 cm", this);
band5cmBtn->setRoundness(0);
band5cmBtn->setFixedSize(btn_widths, btn_height);
band5cmBtn->setStyleSheet(set->getMiniButtonStyle());
bandBtnList.append(band5cmBtn);
CHECKED_CONNECT(band5cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
bandGenBtn = new AeroButton("Gen", this);
bandGenBtn->setRoundness(0);
//bandGenBtn->setGlass(false);
@@ -418,11 +438,15 @@ void RadioWidget::createBandBtnGroup() {
layout->addWidget(band12mBtn, 1, 4);
layout->addWidget(band10mBtn, 1, 5);
layout->addWidget(band6mBtn, 2, 0);
layout->addWidget(band2mBtn, 2, 0);
layout->addWidget(band125cmBtn, 2, 0);
layout->addWidget(band70cmBtn, 2, 0);
layout->addWidget(band33cmBtn, 2, 0);
layout->addWidget(bandGenBtn, 2, 1);
layout->addWidget(band2mBtn, 2, 1);
layout->addWidget(band125cmBtn, 2, 2);
layout->addWidget(band70cmBtn, 2, 3);
layout->addWidget(band33cmBtn, 2, 4);
layout->addWidget(band23cmBtn, 2, 5);
layout->addWidget(band13cmBtn, 3, 0);
layout->addWidget(band10cmBtn, 3, 1);
layout->addWidget(band5cmBtn, 3, 2);
layout->addWidget(bandGenBtn, 3, 3);
//layout->addWidget(bandxxBtn, 2, 3);
QHBoxLayout *hbox1 = new QHBoxLayout();
@@ -1229,6 +1253,18 @@ void RadioWidget::bandChangedByBtn() {
if (str == "33 cm")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm33));
else
if (str == "23 cm")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm23));
else
if (str == "13 cm")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm13));
else
if (str == "10 cm")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm10));
else
if (str == "5 cm")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm5));
else
if (str == "Gen")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(gen));
+4
View File
@@ -89,6 +89,10 @@ private:
AeroButton *band125cmBtn;
AeroButton *band70cmBtn;
AeroButton *band33cmBtn;
AeroButton *band23cmBtn;
AeroButton *band13cmBtn;
AeroButton *band10cmBtn;
AeroButton *band5cmBtn;
AeroButton *bandGenBtn;
//AeroButton *bandxxBtn;
+126 -5
View File
@@ -7,7 +7,7 @@
*/
/*
* Copyright 2010, 2011, 2012 Hermann von Hasseln, DL3HVH
* Copyright 2010-2015 Hermann von Hasseln, DL3HVH
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License version 2 as
@@ -72,13 +72,13 @@ Settings::Settings(QObject *parent)
settingsFilename = "settings.ini";
settings = new QSettings(QCoreApplication::applicationDirPath() + "/" + settingsFilename, QSettings::IniFormat);
m_titleString = "cudaSDR BETA ";
m_titleString = "cudaSDR BETA";
#ifdef DEBUG
m_titleString = "cudaSDR Debug BETA ";
#endif
m_versionString = "v0.3.2.13";
m_versionString = "v0.3.2.13+";
qDebug() << qPrintable(m_titleString);
@@ -97,6 +97,7 @@ Settings::Settings(QObject *parent)
m_receiverDataList[i].agcHangThreshold = 0.0;
m_receiverDataList[i].peakHold = false;
m_receiverDataList[i].fftFactor = 1;
for (int j = 0; j < MAX_BANDS; j++) {
@@ -155,7 +156,7 @@ Settings::Settings(QObject *parent)
m_defaultFilterList = getDefaultFilterFrequencies();
m_transmitter.txAllowed = false;
m_fft = 1;
//m_fft = 1;
}
Settings::~Settings() {
@@ -908,6 +909,14 @@ int Settings::loadSettings() {
else
m_receiverDataList[i].clickVFO = false;
cstr = m_rxStringList.at(i);
cstr.append("/fftAuto");
str = settings->value(cstr, "off").toString();
if (str.toLower() == "on")
m_receiverDataList[i].fftAuto = true;
else
m_receiverDataList[i].fftAuto = false;
cstr = m_rxStringList.at(i);
cstr.append("/lastCenterFrequency2200m");
value = settings->value(cstr, 135700).toDouble();
@@ -1106,12 +1115,61 @@ int Settings::loadSettings() {
if ((value < 902000000) || (value > 928000000)) value = 902000000;
m_receiverDataList[i].lastCenterFrequencyList << value;
//RRK TODO FIX
cstr = m_rxStringList.at(i);
cstr.append("/lastVfoFrequency33cm");
value = settings->value(cstr, 902000000).toDouble();
if ((value < 902000000) || (value > 928000000)) value = 902000000;
m_receiverDataList[i].lastVfoFrequencyList << value;
cstr = m_rxStringList.at(i);
cstr.append("/lastCenterFrequency23cm");
value = settings->value(cstr, 902000000).toDouble();
if ((value < 902000000) || (value > 928000000)) value = 902000000;
m_receiverDataList[i].lastCenterFrequencyList << value;
cstr = m_rxStringList.at(i);
cstr.append("/lastVfoFrequency23cm");
value = settings->value(cstr, 902000000).toDouble();
if ((value < 902000000) || (value > 928000000)) value = 902000000;
m_receiverDataList[i].lastVfoFrequencyList << value;
cstr = m_rxStringList.at(i);
cstr.append("/lastCenterFrequency13cm");
value = settings->value(cstr, 902000000).toDouble();
if ((value < 902000000) || (value > 928000000)) value = 902000000;
m_receiverDataList[i].lastCenterFrequencyList << value;
cstr = m_rxStringList.at(i);
cstr.append("/lastVfoFrequency13cm");
value = settings->value(cstr, 902000000).toDouble();
if ((value < 902000000) || (value > 928000000)) value = 902000000;
m_receiverDataList[i].lastVfoFrequencyList << value;
cstr = m_rxStringList.at(i);
cstr.append("/lastCenterFrequency10cm");
value = settings->value(cstr, 902000000).toDouble();
if ((value < 902000000) || (value > 928000000)) value = 902000000;
m_receiverDataList[i].lastCenterFrequencyList << value;
cstr = m_rxStringList.at(i);
cstr.append("/lastVfoFrequency10cm");
value = settings->value(cstr, 902000000).toDouble();
if ((value < 902000000) || (value > 928000000)) value = 902000000;
m_receiverDataList[i].lastVfoFrequencyList << value;
cstr = m_rxStringList.at(i);
cstr.append("/lastCenterFrequency5cm");
value = settings->value(cstr, 902000000).toDouble();
if ((value < 902000000) || (value > 928000000)) value = 902000000;
m_receiverDataList[i].lastCenterFrequencyList << value;
cstr = m_rxStringList.at(i);
cstr.append("/lastVfoFrequency5cm");
value = settings->value(cstr, 902000000).toDouble();
if ((value < 902000000) || (value > 928000000)) value = 902000000;
m_receiverDataList[i].lastVfoFrequencyList << value;
cstr = m_rxStringList.at(i);
cstr.append("/lastCenterFrequencyGen");
value = settings->value(cstr, 1800000).toDouble();
@@ -1892,6 +1950,13 @@ int Settings::saveSettings() {
else
settings->setValue(str, "off");
str = m_rxStringList.at(i);
str.append("/fftAuto");
if (m_receiverDataList[i].fftAuto)
settings->setValue(str, "on");
else
settings->setValue(str, "off");
// center frequencies
for (int j = 0; j < MAX_BANDS; j++) {
@@ -3820,7 +3885,7 @@ void Settings::setSampleSize(QObject* sender, int rx, int size) {
Q_UNUSED (sender)
if (rx == 0) {
/*if (rx == 0) {
SETTINGS_DEBUG << "set sample size to: " << size;
switch (size) {
@@ -3840,10 +3905,61 @@ void Settings::setSampleSize(QObject* sender, int rx, int size) {
case 32768:
m_fft = 8;
break;
case 65536:
m_fft = 16;
break;
case 131072:
m_fft = 32;
break;
case 262144:
m_fft = 64;
break;
}
emit sampleSizeChanged(0, size);
}*/
SETTINGS_DEBUG << "set sample size to: " << size << " for Rx " << rx;
switch (size) {
case 4096:
m_receiverDataList[rx].fftFactor = 1;
break;
case 8192:
m_receiverDataList[rx].fftFactor = 2;
break;
case 16384:
m_receiverDataList[rx].fftFactor = 4;
break;
case 32768:
m_receiverDataList[rx].fftFactor = 8;
break;
case 65536:
m_receiverDataList[rx].fftFactor = 16;
break;
case 131072:
m_receiverDataList[rx].fftFactor = 32;
break;
case 262144:
m_receiverDataList[rx].fftFactor = 64;
break;
}
emit sampleSizeChanged(rx, size);
}
int Settings::getFFTMultiplicator(int rx) {
return m_receiverDataList.at(rx).fftFactor;
}
// Alex configuration:
@@ -4589,6 +4705,11 @@ bool Settings::getHairCrossStatus(int rx) {
return m_receiverDataList[rx].hairCross;
}
bool Settings::getFFTAutoStatus(int rx) {
return m_receiverDataList[rx].fftAuto;
}
void Settings::setWaterfallTime(int rx, int value) {
Q_UNUSED(rx)
+29 -8
View File
@@ -7,7 +7,7 @@
*/
/*
* Copyright 2010, 2011, 2012 Hermann von Hasseln, DL3HVH
* Copyright 2010 - 2015 Hermann von Hasseln, DL3HVH
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License version 2 as
@@ -29,7 +29,6 @@
//#define DEBUG
#include <QObject>
#include <QErrorMessage>
#include <QMutex>
@@ -39,6 +38,7 @@
#include <QAudioOutput>
#include "cusdr_hamDatabase.h"
#include "fftw3.h"
// test for OpenCL
//#include "CL/qclcontext.h"
@@ -69,19 +69,38 @@
//#define AGCOFFSET 33.0
#define MAXFREQUENCY 961440000
//#define MAXHPFREQUENCY 61440000
#ifdef HL
#define MAXHPFREQUENCY 30720000
#else
#define MAXHPFREQUENCY 61440000
#endif
#define MINDBM -180
#define MAXDBM 10
#define MINDISTDBM -150
#define MAXDISTDBM 150
#define MAX_FFTSIZE 262144
// **************************************
// fftw definitions
static void my_fftw_write_char(char c, void *f) { fputc(c, (FILE *) f); }
//static void my_fftw_write_char(char c, void *f) { fputc(c, (QFILE *) f); }
#define fftw_export_wisdom_to_file(f) fftw_export_wisdom(my_fftw_write_char, (void*) (f))
#define fftwf_export_wisdom_to_file(f) fftwf_export_wisdom(my_fftw_write_char, (void*) (f))
#define fftwl_export_wisdom_to_file(f) fftwl_export_wisdom(my_fftw_write_char, (void*) (f))
static int my_fftw_read_char(void *f) { return fgetc((FILE *) f); }
#define fftw_import_wisdom_from_file(f) fftw_import_wisdom(my_fftw_read_char, (void*) (f))
#define fftwf_import_wisdom_from_file(f) fftwf_import_wisdom(my_fftw_read_char, (void*) (f))
#define fftwl_import_wisdom_from_file(f) fftwl_import_wisdom(my_fftw_read_char, (void*) (f))
// **************************************
// receiver settings
#define MAX_RECEIVERS 16
#define MAX_BANDS 18
#define MAX_RECEIVERS 20
#define MAX_BANDS 22
#define BUFFER_SIZE 1024
#define SAMPLE_BUFFER_SIZE 4096
#define BANDSCOPE_BUFFER_SIZE 4096
@@ -507,6 +526,7 @@ typedef struct _receiver {
bool panGrid;
bool peakHold;
bool clickVFO;
bool fftAuto;
long ctrFrequency;
long vfoFrequency;
@@ -535,6 +555,7 @@ typedef struct _receiver {
int waterfallOffsetLo;
int waterfallOffsetHi;
int averagingCnt;
int fftFactor;
} TReceiver;
@@ -1035,6 +1056,7 @@ public:
bool getPanLockedStatus(int rx);
bool getClickVFOStatus(int rx);
bool getHairCrossStatus(int rx);
bool getFFTAutoStatus(int rx);
int getMercurySpeed() { return m_mercurySpeed; }
int getOutputSampleIncrement() { return m_outputSampleIncrement; }
@@ -1102,8 +1124,7 @@ public:
bool getSpectrumAveraging(int rx);
int getSpectrumAveragingCnt(int rx);
int getFFTMultiplicator() { return m_fft; }
int getFFTMultiplicator(int rx);// { return m_fft; }
QMutex debugMutex;
@@ -1482,7 +1503,7 @@ private:
int m_chirpFilterLowerFrequency;
int m_chirpFilterUpperFrequency;
int m_fft;
//int m_fft;
/*bool m_cudaPresence;
int m_cuda_devices;
+1 -1
View File
@@ -133,7 +133,7 @@ void TransmitPAWidget::createGainGroup() {
// band label
QStringList bandNames;
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "gen";
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen";
QList<QLabel *> bandLabelList;
+141 -24
View File
@@ -32,6 +32,9 @@
#include "Util/cusdr_cpuUsage.h"
#elif defined(Q_OS_LINUX)
#include "Util/cusdr_cpuUsage_unix.h"
#include <unistd.h>
#include <errno.h>
#define fopen_s(pFile,filename,mode) ((*(pFile))=fopen((filename), (mode)))==NULL
#endif
#include "fftw3.h"
@@ -88,34 +91,50 @@ void cuSDRMessageHandler(QtMsgType type, const QMessageLogContext &context, cons
ts << txt << endl << flush;
}
static void my_fftw_write_char(char c, void *f) { fputc(c, (FILE *) f); }
#define fftw_export_wisdom_to_file(f) fftw_export_wisdom(my_fftw_write_char, (void*) (f))
#define fftwf_export_wisdom_to_file(f) fftwf_export_wisdom(my_fftw_write_char, (void*) (f))
#define fftwl_export_wisdom_to_file(f) fftwl_export_wisdom(my_fftw_write_char, (void*) (f))
static int my_fftw_read_char(void *f) { return fgetc((FILE *) f); }
#define fftw_import_wisdom_from_file(f) fftw_import_wisdom(my_fftw_read_char, (void*) (f))
#define fftwf_import_wisdom_from_file(f) fftwf_import_wisdom(my_fftw_read_char, (void*) (f))
#define fftwl_import_wisdom_from_file(f) fftwl_import_wisdom(my_fftw_read_char, (void*) (f))
void runFFTWWisdom() {
QString directory = QDir::currentPath();
QDir currentDir = QDir(directory);
qDebug() << currentDir;
if (currentDir.exists("wisdom")) {
int err;
FILE* wisdomFile;
qDebug() << "wisdom exists !";
return;
qDebug() << "Init::\tcurrent path: " << qPrintable(currentDir.absolutePath());
if (currentDir.exists("fftwf_wisdom")) {
qDebug() << "Init::\tfftwf_wisdom exists.";
/*errno_t err;
FILE* wisdomFile;*/
err = fopen_s(&wisdomFile, "fftwf_wisdom", "r");
if (err == 0) {
qDebug() << "Init::\tfound fftwf_wisdom - this will be quick!";
fftwf_import_wisdom_from_file(wisdomFile);
fclose(wisdomFile);
}
else {
qDebug() << "wisdom does not exist - planning FFT...";
qDebug() << "Init::\tfound fftwf_wisdom but could not open.";
return;
}
/*const char* wisdom_file = "wisdom";
if (!fftw_import_wisdom_from_file(wisdom_file)) {
}
else {
qDebug() << "Init::\tfftw_wisdom does not exist - planning FFT...";
//string fname = "F:\\Eigene Dokumente\\Visual Studio 2010\\Projects\\cuSDR64\\fftwf_wisdom";
//FILE* wis = fopen (fname.c_str(), "r");
/*if (wis) {
qDebug() << "Init::\tfound fftwf_wisdom - this will be quick!";
fftwf_import_wisdom_from_file(wis);
fclose (wis);
}
else {*/
int size = 64;
@@ -127,7 +146,7 @@ void runFFTWWisdom() {
while (size <= MAX_FFTSIZE) {
qDebug() << str.arg(size);
qDebug() << qPrintable(str.arg(size));
cpxbuf = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * size);
plan_fwd = fftwf_plan_dft_1d(size , cpxbuf, cpxbuf, FFTW_FORWARD, FFTW_PATIENT);
@@ -140,11 +159,21 @@ void runFFTWWisdom() {
size *= 2;
}
fftw_export_wisdom_to_file(wisdom_file);
}*/
//QProcess process;
//process.start("fftwf-wisdom.exe");
//process.waitForFinished();
//FILE* wis = fopen (fname.c_str(), "w");
//if (wis) {
err = fopen_s(&wisdomFile, "fftwf_wisdom", "w");
if (err == 0) {
qDebug() << "Init::\texporting fftwf_wisdom for quick measurement.";
fftwf_export_wisdom_to_file(wisdomFile);
qDebug() << "Init::\texported fftwf_wisdom.";
fclose(wisdomFile);
}
else {
qDebug() << "Init::\tcould not write fftwf_wisdom.";
}
}
}
@@ -353,6 +382,94 @@ int main(int argc, char *argv[]) {
SleeperThread::msleep(300);
//*************************************************************************
// FFTW wisdom
QString directory = QDir::currentPath();
QDir currentDir = QDir(directory);
int err;
FILE* wisdomFile;
qDebug() << "Init::\tcurrent path: " << qPrintable(currentDir.absolutePath());
if (currentDir.exists("fftwf_wisdom")) {
qDebug() << "Init::\tfftwf_wisdom exists.";
err = fopen_s(&wisdomFile, "fftwf_wisdom", "r");
if (err == 0) {
qDebug() << "Init::\tfound fftwf_wisdom - this will be quick!";
splash->showMessage(
"\n " +
Settings::instance()->getTitleStr() + " " +
Settings::instance()->getVersionStr() +
QObject::tr(": found fftwf_wisdom - loading .."),
Qt::AlignTop | Qt::AlignLeft, Qt::yellow);
fftwf_import_wisdom_from_file(wisdomFile);
fclose(wisdomFile);
}
else {
qDebug() << "Init::\tfound fftwf_wisdom but could not open.";
return -1;
}
}
else {
qDebug() << "Init::\tfftw_wisdom does not exist - planning FFT...";
QString msg = "First time FFT planning. Please be patient, this may take up to 10 min!";
mainWindow.showWarningDialog(msg);
int size = 64;
QString str = "planning FFT size %1 ...";
fftwf_complex* cpxbuf;
fftwf_plan plan_fwd;
fftwf_plan plan_rev;
while (size <= MAX_FFTSIZE) {
//while (size <= 2048) {
qDebug() << qPrintable(str.arg(size));
splash->showMessage(
"\n " +
Settings::instance()->getTitleStr() + " " +
Settings::instance()->getVersionStr() +
QObject::tr(": ") + str.arg(size),
Qt::AlignTop | Qt::AlignLeft, Qt::yellow);
cpxbuf = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * size);
plan_fwd = fftwf_plan_dft_1d(size , cpxbuf, cpxbuf, FFTW_FORWARD, FFTW_PATIENT);
fftwf_execute(plan_fwd);
fftwf_destroy_plan(plan_fwd);
plan_rev = fftwf_plan_dft_1d(size, cpxbuf, cpxbuf, FFTW_BACKWARD, FFTW_PATIENT);
fftwf_execute(plan_rev);
fftwf_destroy_plan(plan_rev);
size *= 2;
}
err = fopen_s(&wisdomFile, "fftwf_wisdom", "w");
if (err == 0) {
qDebug() << "Init::\texporting fftwf_wisdom for quick measurement.";
fftwf_export_wisdom_to_file(wisdomFile);
qDebug() << "Init::\texported fftwf_wisdom.";
fclose(wisdomFile);
}
else {
qDebug() << "Init::\tcould not write fftwf_wisdom.";
}
}
//app.processEvents();
mainWindow.show();