Updated to 20 rcvrs and fixed a bug with sending the sequence
This commit is contained in:
@@ -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
|
This is originally cuSDR written by Hermann, DL3HVH
|
||||||
https://plus.google.com/107168125384405552048/posts
|
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)
|
Using the Hermes-Lite (with some minor protocol changes)
|
||||||
I can do 16 rcvrs @ 96Khz and 9 @ 192Khz:
|
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.
|
I have only compiled and used this on linux.
|
||||||
|
|
||||||
|
To make for Hermes-Lite edit Makefile and add -DHL
|
||||||
|
|||||||
+1504
-437
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,3 @@
|
|||||||
[General]
|
[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)
|
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\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)
|
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)
|
||||||
|
|||||||
@@ -2848,6 +2848,10 @@ void DataProcessor::processInputBuffer(const QByteArray &buffer) {
|
|||||||
case 14: m_maxSamples = 512-74; break;
|
case 14: m_maxSamples = 512-74; break;
|
||||||
case 15: m_maxSamples = 512-44; break;
|
case 15: m_maxSamples = 512-44; break;
|
||||||
case 16: m_maxSamples = 512-14; 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
|
// 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 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 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
|
||||||
|
// 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.
|
// RRK, workaround for gige timing bug, make sure all rx freq's are sent on init.
|
||||||
if (firstTimeRxInit) {
|
if (firstTimeRxInit) {
|
||||||
@@ -3550,10 +3555,12 @@ void DataProcessor::writeData() {
|
|||||||
|
|
||||||
if (m_setNetworkDeviceHeader) {
|
if (m_setNetworkDeviceHeader) {
|
||||||
|
|
||||||
|
//RRK updated for 4byte int and network order
|
||||||
|
quint32 outseq = qFromBigEndian(m_sendSequence);
|
||||||
m_outDatagram.resize(0);
|
m_outDatagram.resize(0);
|
||||||
m_outDatagram += m_deviceSendDataSignature;
|
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 += seq;
|
||||||
m_outDatagram += de->io.audioDatagram;
|
m_outDatagram += de->io.audioDatagram;
|
||||||
|
|||||||
@@ -420,8 +420,10 @@ private:
|
|||||||
unsigned short m_offset;
|
unsigned short m_offset;
|
||||||
unsigned short m_length;
|
unsigned short m_length;
|
||||||
|
|
||||||
long m_sendSequence;
|
//RRK long m_sendSequence;
|
||||||
long m_oldSendSequence;
|
//RRK long m_oldSendSequence;
|
||||||
|
quint32 m_sendSequence;
|
||||||
|
quint32 m_oldSendSequence;
|
||||||
|
|
||||||
volatile bool m_stopped;
|
volatile bool m_stopped;
|
||||||
|
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ void DataIO::stop() {
|
|||||||
io->networkIOMutex.unlock();
|
io->networkIOMutex.unlock();
|
||||||
|
|
||||||
if(m_pSoundCardOut) {
|
if(m_pSoundCardOut) {
|
||||||
|
SleeperThread::msleep(100);
|
||||||
m_pSoundCardOut->Stop();
|
m_pSoundCardOut->Stop();
|
||||||
delete m_pSoundCardOut;
|
delete m_pSoundCardOut;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ Discoverer::Discoverer(THPSDRParameter *ioData)
|
|||||||
Discoverer::~Discoverer() {
|
Discoverer::~Discoverer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TNetworkDevicecard mc;
|
||||||
|
|
||||||
void Discoverer::initHPSDRDevice() {
|
void Discoverer::initHPSDRDevice() {
|
||||||
|
|
||||||
m_searchTime.start();
|
m_searchTime.start();
|
||||||
@@ -188,7 +190,6 @@ int Discoverer::findHPSDRDevices() {
|
|||||||
|
|
||||||
while (socket.hasPendingDatagrams()) {
|
while (socket.hasPendingDatagrams()) {
|
||||||
|
|
||||||
TNetworkDevicecard mc;
|
|
||||||
quint16 port;
|
quint16 port;
|
||||||
|
|
||||||
m_deviceDatagram.resize(socket.pendingDatagramSize());
|
m_deviceDatagram.resize(socket.pendingDatagramSize());
|
||||||
@@ -217,6 +218,11 @@ int Discoverer::findHPSDRDevices() {
|
|||||||
str = "Griffin";
|
str = "Griffin";
|
||||||
else if (no == 4)
|
else if (no == 4)
|
||||||
str = "Angelia";
|
str = "Angelia";
|
||||||
|
else if (no == 5)
|
||||||
|
str = "Orion";
|
||||||
|
else if (no == 6) {
|
||||||
|
str = "Hermes-Lite";
|
||||||
|
}
|
||||||
|
|
||||||
mc.boardID = no;
|
mc.boardID = no;
|
||||||
mc.boardName = str;
|
mc.boardName = str;
|
||||||
@@ -237,8 +243,11 @@ int Discoverer::findHPSDRDevices() {
|
|||||||
else if (m_deviceDatagram[2] == (char)0x03) {
|
else if (m_deviceDatagram[2] == (char)0x03) {
|
||||||
|
|
||||||
io->networkIOMutex.lock();
|
io->networkIOMutex.lock();
|
||||||
DISCOVERER_DEBUG << "Device already sending data!";
|
DISCOVERER_DEBUG << "Device already sending data - trying to shut down...";
|
||||||
io->networkIOMutex.unlock();
|
io->networkIOMutex.unlock();
|
||||||
|
|
||||||
|
shutdownHPSDRDevice();
|
||||||
|
clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,3 +278,25 @@ void Discoverer::clear() {
|
|||||||
//m_metisDeviceComboBox->clear();
|
//m_metisDeviceComboBox->clear();
|
||||||
m_deviceCards.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.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ public:
|
|||||||
|
|
||||||
int findHPSDRDevices();
|
int findHPSDRDevices();
|
||||||
void clear();
|
void clear();
|
||||||
|
void shutdownHPSDRDevice();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void initHPSDRDevice();
|
void initHPSDRDevice();
|
||||||
|
|||||||
@@ -321,7 +321,7 @@ void Receiver::dspProcessing() {
|
|||||||
//io.mutex.unlock();
|
//io.mutex.unlock();
|
||||||
|
|
||||||
// spectrum
|
// spectrum
|
||||||
qtdsp->getSpectrum(newSpectrum, set->getFFTMultiplicator());
|
qtdsp->getSpectrum(newSpectrum, set->getFFTMultiplicator(m_receiver));
|
||||||
if (highResTimer->getElapsedTimeInMicroSec() >= getDisplayDelay()) {
|
if (highResTimer->getElapsedTimeInMicroSec() >= getDisplayDelay()) {
|
||||||
|
|
||||||
emit spectrumBufferChanged(m_receiver, newSpectrum);
|
emit spectrumBufferChanged(m_receiver, newSpectrum);
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ QAudioDeviceInfo DeviceInfo;
|
|||||||
if (-1 == OutDevIndx) m_OutDeviceInfo = QAudioDeviceInfo::defaultOutputDevice();
|
if (-1 == OutDevIndx) m_OutDeviceInfo = QAudioDeviceInfo::defaultOutputDevice();
|
||||||
else m_OutDeviceInfo = m_OutDevices.at(OutDevIndx);
|
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)) {
|
foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) {
|
||||||
qDebug() << "l:" << deviceInfo.deviceName();
|
qDebug() << "l:" << deviceInfo.deviceName();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -760,7 +760,7 @@ void QGLReceiverPanel::drawPanadapter() {
|
|||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // remove big red overload indicator
|
#if 0 //RRK remove big red overload indicator
|
||||||
if (m_adcStatus == 2) {
|
if (m_adcStatus == 2) {
|
||||||
|
|
||||||
glBegin(GL_TRIANGLE_STRIP);
|
glBegin(GL_TRIANGLE_STRIP);
|
||||||
@@ -1774,7 +1774,21 @@ void QGLReceiverPanel::drawVFOControl() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FFT size
|
// 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";
|
str = "FFT: %1";
|
||||||
//float res;
|
//float res;
|
||||||
@@ -1797,6 +1811,10 @@ void QGLReceiverPanel::drawVFOControl() {
|
|||||||
case 8:
|
case 8:
|
||||||
s = "32k";
|
s = "32k";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
s = "64k";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
x1 = m_panRect.right() - m_fonts.smallFontMetrics->width(str) - 5;
|
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;
|
deltaSampleSize = m_spectrumSize - m_sampleSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_receiver == 0) {
|
if (set->getFFTAutoStatus(m_receiver)) {
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
if (m_sampleSize < 2048) {
|
if (m_sampleSize < 2048) {
|
||||||
|
|
||||||
if (m_fftMult == 1) {
|
if (m_fftMult == 1) {
|
||||||
|
|
||||||
GRAPHICS_DEBUG << "set sample size to 8192";
|
GRAPHICS_DEBUG << "set sample size to 8192";
|
||||||
set->setSampleSize(this, 0, 8192);
|
set->setSampleSize(this, m_receiver, 8192);
|
||||||
m_dBmPanLogGain += 6.0;
|
//m_dBmPanLogGain += 3.0103;
|
||||||
|
m_dBmPanLogGain += 6;
|
||||||
m_fftMult = 2;
|
m_fftMult = 2;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -3782,8 +3803,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
|
|||||||
else if (m_fftMult == 2) {
|
else if (m_fftMult == 2) {
|
||||||
|
|
||||||
GRAPHICS_DEBUG << "set sample size to 16384";
|
GRAPHICS_DEBUG << "set sample size to 16384";
|
||||||
set->setSampleSize(this, 0, 16384);
|
set->setSampleSize(this, m_receiver, 16384);
|
||||||
m_dBmPanLogGain += 6.0;
|
//m_dBmPanLogGain += 3.0103;
|
||||||
|
m_dBmPanLogGain += 6;
|
||||||
m_fftMult = 4;
|
m_fftMult = 4;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -3791,10 +3813,21 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
|
|||||||
else if (m_fftMult == 4) {
|
else if (m_fftMult == 4) {
|
||||||
|
|
||||||
GRAPHICS_DEBUG << "set sample size to 32768";
|
GRAPHICS_DEBUG << "set sample size to 32768";
|
||||||
set->setSampleSize(this, 0, 32768);
|
set->setSampleSize(this, m_receiver, 32768);
|
||||||
m_dBmPanLogGain += 6.0;
|
//m_dBmPanLogGain += 3.0103;
|
||||||
|
m_dBmPanLogGain += 6;
|
||||||
m_fftMult = 8;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3803,8 +3836,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
|
|||||||
if (m_fftMult == 2) {
|
if (m_fftMult == 2) {
|
||||||
|
|
||||||
GRAPHICS_DEBUG << "set sample size to 4096";
|
GRAPHICS_DEBUG << "set sample size to 4096";
|
||||||
set->setSampleSize(this, 0, 4096);
|
set->setSampleSize(this, m_receiver, 4096);
|
||||||
m_dBmPanLogGain -= 6.0;
|
//m_dBmPanLogGain -= 3.0103;
|
||||||
|
m_dBmPanLogGain -= 6;
|
||||||
m_fftMult = 1;
|
m_fftMult = 1;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -3812,8 +3846,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
|
|||||||
else if (m_fftMult == 4) {
|
else if (m_fftMult == 4) {
|
||||||
|
|
||||||
GRAPHICS_DEBUG << "set sample size to 8192";
|
GRAPHICS_DEBUG << "set sample size to 8192";
|
||||||
set->setSampleSize(this, 0, 8192);
|
set->setSampleSize(this, m_receiver, 8192);
|
||||||
m_dBmPanLogGain -= 6.0;
|
//m_dBmPanLogGain -= 3.0103;
|
||||||
|
m_dBmPanLogGain -= 6;
|
||||||
m_fftMult = 2;
|
m_fftMult = 2;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -3821,10 +3856,21 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
|
|||||||
else if (m_fftMult == 8) {
|
else if (m_fftMult == 8) {
|
||||||
|
|
||||||
GRAPHICS_DEBUG << "set sample size to 16384";
|
GRAPHICS_DEBUG << "set sample size to 16384";
|
||||||
set->setSampleSize(this, 0, 16384);
|
set->setSampleSize(this, m_receiver, 16384);
|
||||||
m_dBmPanLogGain -= 6.0;
|
//m_dBmPanLogGain -= 3.0103;
|
||||||
|
m_dBmPanLogGain -= 6;
|
||||||
m_fftMult = 4;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ void Demodulation::DoSAM(CPX &in, CPX &out ) {
|
|||||||
|
|
||||||
if ((delay0.im) == 0.0 && (delay0.re == 0.0)) {
|
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));
|
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;
|
m_phase += m_pll_frequency + m_alpha * difference;
|
||||||
|
|
||||||
while (m_phase >= TWOPI)
|
while (m_phase >= TWOPI)
|
||||||
m_phase -= TWOPI;
|
m_phase -= (float)TWOPI;
|
||||||
|
|
||||||
while (m_phase < 0)
|
while (m_phase < 0)
|
||||||
m_phase += TWOPI;
|
m_phase += (float)TWOPI;
|
||||||
|
|
||||||
m_lockcurrent = 0.999 * m_lockcurrent + 0.001 * qAbs(delay0.re);
|
m_lockcurrent = 0.999 * m_lockcurrent + 0.001 * qAbs(delay0.re);
|
||||||
m_lockprevious = m_lockcurrent;
|
m_lockprevious = m_lockcurrent;
|
||||||
@@ -167,7 +167,7 @@ void Demodulation::DoFMN(CPX &in, CPX &out ) {
|
|||||||
|
|
||||||
if ((delay0.im) == 0.0 && (delay0.re == 0.0)) {
|
if ((delay0.im) == 0.0 && (delay0.re == 0.0)) {
|
||||||
|
|
||||||
delay0.re = 0.000000000001;
|
delay0.re = 0.000000000001f;
|
||||||
}
|
}
|
||||||
difference = qAtan2(delay0.im, delay0.re);
|
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;
|
m_phase += m_pll_frequency + m_alpha * difference;
|
||||||
|
|
||||||
while (m_phase >= TWOPI)
|
while (m_phase >= TWOPI)
|
||||||
m_phase -= TWOPI;
|
m_phase -= (float)TWOPI;
|
||||||
while (m_phase < 0)
|
while (m_phase < 0)
|
||||||
m_phase += TWOPI;
|
m_phase += (float)TWOPI;
|
||||||
|
|
||||||
m_afc = 0.99 * m_afc + 0.01 * m_pll_frequency;
|
m_afc = 0.99 * m_afc + 0.01 * m_pll_frequency;
|
||||||
out[i].re = (m_pll_frequency - m_afc) * m_cvt;
|
out[i].re = (m_pll_frequency - m_afc) * m_cvt;
|
||||||
|
|||||||
@@ -33,6 +33,11 @@
|
|||||||
|
|
||||||
#include "qtdsp_dspEngine.h"
|
#include "qtdsp_dspEngine.h"
|
||||||
|
|
||||||
|
double myLog(double x, double base) {
|
||||||
|
|
||||||
|
return log(x) / log(base);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QDSPEngine::QDSPEngine(QObject *parent, int rx, int size)
|
QDSPEngine::QDSPEngine(QObject *parent, int rx, int size)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
@@ -41,18 +46,18 @@ QDSPEngine::QDSPEngine(QObject *parent, int rx, int size)
|
|||||||
, m_rx(rx)
|
, m_rx(rx)
|
||||||
, m_size(size)
|
, m_size(size)
|
||||||
, m_samplerate(set->getSampleRate())
|
, m_samplerate(set->getSampleRate())
|
||||||
, m_fftMultiplcator(1)
|
, m_fftMultiplier(1)
|
||||||
, m_volume(0.0f)
|
, m_volume(0.0f)
|
||||||
{
|
{
|
||||||
qRegisterMetaType<QVector<cpx> >();
|
qRegisterMetaType<QVector<cpx> >();
|
||||||
qRegisterMetaType<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);
|
filter = new QFilter(this, m_size, 2, 12);//8);
|
||||||
wpagc = new QWPAGC(this, m_size);
|
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);
|
set->setSystemMessage(str.arg(m_rx), 0);
|
||||||
|
|
||||||
if (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";
|
str = "Initializing DSP engine for rx %1: 32k FFT ...please wait";
|
||||||
set->setSystemMessage(str.arg(m_rx), 0);
|
set->setSystemMessage(str.arg(m_rx), 0);
|
||||||
spectrum8 = new PowerSpectrum(this, m_size*16);
|
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;
|
m_spectrumSize = m_size*4;
|
||||||
@@ -116,8 +135,13 @@ QDSPEngine::~QDSPEngine() {
|
|||||||
if (wpagc)
|
if (wpagc)
|
||||||
delete wpagc;
|
delete wpagc;
|
||||||
|
|
||||||
if (spectrum)
|
//if (spectrum)
|
||||||
delete spectrum;
|
// delete spectrum;
|
||||||
|
|
||||||
|
if (!powerSpectraList.empty()) {
|
||||||
|
|
||||||
|
powerSpectraList.clear();
|
||||||
|
}
|
||||||
|
|
||||||
if (signalmeter)
|
if (signalmeter)
|
||||||
delete signalmeter;
|
delete signalmeter;
|
||||||
@@ -175,7 +199,7 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) {
|
|||||||
|
|
||||||
m_mutex.lock();
|
m_mutex.lock();
|
||||||
|
|
||||||
switch (m_fftMultiplcator) {
|
/*switch (m_fftMultiplcator) {
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
spectrum->ProcessSpectrum(in, size*2, 1);
|
spectrum->ProcessSpectrum(in, size*2, 1);
|
||||||
@@ -192,7 +216,14 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) {
|
|||||||
case 8:
|
case 8:
|
||||||
spectrum8->ProcessSpectrum(in, size*16, 15);
|
spectrum8->ProcessSpectrum(in, size*16, 15);
|
||||||
break;
|
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)
|
if (m_NcoFreq != 0)
|
||||||
ProcessFrequencyShift(in, in, size);
|
ProcessFrequencyShift(in, in, size);
|
||||||
@@ -214,36 +245,10 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) {
|
|||||||
|
|
||||||
int QDSPEngine::getSpectrum(qVectorFloat &buffer, int mult) {
|
int QDSPEngine::getSpectrum(qVectorFloat &buffer, int mult) {
|
||||||
|
|
||||||
if (m_rx == 0) {
|
m_fftMultiplier = mult;
|
||||||
|
int idx = (int)(myLog(m_fftMultiplier, 2));
|
||||||
|
|
||||||
m_fftMultiplcator = mult;
|
return powerSpectraList.at(idx)->spectrumResult(buffer, m_size * m_fftMultiplier * 2 - 2048);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float QDSPEngine::getSMeterInstValue() {
|
float QDSPEngine::getSMeterInstValue() {
|
||||||
@@ -354,9 +359,7 @@ void QDSPEngine::setNCOFrequency(int rx, long ncoFreq) {
|
|||||||
|
|
||||||
void QDSPEngine::setSampleSize(int rx, int size) {
|
void QDSPEngine::setSampleSize(int rx, int size) {
|
||||||
|
|
||||||
Q_UNUSED(rx)
|
if (m_rx == rx) {
|
||||||
|
|
||||||
if (m_rx == 0) {
|
|
||||||
|
|
||||||
m_mutex.lock();
|
m_mutex.lock();
|
||||||
m_spectrumSize = size;
|
m_spectrumSize = size;
|
||||||
|
|||||||
@@ -72,9 +72,13 @@ public:
|
|||||||
PowerSpectrum* spectrum2;
|
PowerSpectrum* spectrum2;
|
||||||
PowerSpectrum* spectrum4;
|
PowerSpectrum* spectrum4;
|
||||||
PowerSpectrum* spectrum8;
|
PowerSpectrum* spectrum8;
|
||||||
|
PowerSpectrum* spectrum16;
|
||||||
|
|
||||||
SignalMeter* signalmeter;
|
SignalMeter* signalmeter;
|
||||||
Demodulation* demod;
|
Demodulation* demod;
|
||||||
|
|
||||||
|
QList<PowerSpectrum* > powerSpectraList;
|
||||||
|
|
||||||
void processDSP(CPX &in, CPX &out, int size);
|
void processDSP(CPX &in, CPX &out, int size);
|
||||||
|
|
||||||
int getSpectrum(qVectorFloat &buffer, int mult);
|
int getSpectrum(qVectorFloat &buffer, int mult);
|
||||||
@@ -108,7 +112,7 @@ private:
|
|||||||
int m_size;
|
int m_size;
|
||||||
int m_spectrumSize;
|
int m_spectrumSize;
|
||||||
int m_samplerate;
|
int m_samplerate;
|
||||||
int m_fftMultiplcator;
|
int m_fftMultiplier;
|
||||||
|
|
||||||
float m_volume;
|
float m_volume;
|
||||||
qreal m_NcoFreq;
|
qreal m_NcoFreq;
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ void QFilter::Normalize(CPX &in, CPX &out, int size) {
|
|||||||
|
|
||||||
void QFilter::Decimate(CPX &in, CPX &out, int downrate) {
|
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(out, 0, newsize * sizeof(CPX));
|
||||||
//memset(tmp, 0, m_size * sizeof(CPX));
|
//memset(tmp, 0, m_size * sizeof(CPX));
|
||||||
|
|||||||
@@ -189,8 +189,8 @@ void QHPainter::drawShadowText (qreal x, qreal y,
|
|||||||
shadowImage.shadowBlur(radius, shadowColor);
|
shadowImage.shadowBlur(radius, shadowColor);
|
||||||
|
|
||||||
// Compose Text and Shadow
|
// Compose Text and Shadow
|
||||||
int addSizeX = (offset.x() > radius) ? (abs(offset.x()) - radius) : 0;
|
int addSizeX = (offset.x() > radius) ? (fabs(offset.x()) - radius) : 0;
|
||||||
int addSizeY = (offset.y() > radius) ? (abs(offset.y()) - radius) : 0;
|
int addSizeY = (offset.y() > radius) ? (fabs(offset.y()) - radius) : 0;
|
||||||
QSize finalSize = shadowImage.size() + QSize(addSizeX, addSizeY);
|
QSize finalSize = shadowImage.size() + QSize(addSizeX, addSizeY);
|
||||||
|
|
||||||
QPointF shadowTopLeft(QPointF((finalSize.width() - shadowImage.width()) / 2.0,
|
QPointF shadowTopLeft(QPointF((finalSize.width() - shadowImage.width()) / 2.0,
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#define CUSDR_PAINTER_H
|
#define CUSDR_PAINTER_H
|
||||||
|
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
class QHPainter : public QPainter {
|
class QHPainter : public QPainter {
|
||||||
|
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ void AlexAntennaWidget::createAntennasGroup() {
|
|||||||
|
|
||||||
// band label
|
// band label
|
||||||
QStringList bandNames;
|
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;
|
QList<QLabel *> bandLabelList;
|
||||||
|
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ void ExtCtrlWidget::createReceivePinsGroup() {
|
|||||||
|
|
||||||
// band label
|
// band label
|
||||||
QStringList bandNames;
|
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;
|
QList<QLabel *> bandLabelList;
|
||||||
|
|
||||||
@@ -212,7 +212,7 @@ void ExtCtrlWidget::createTransmitPinsGroup() {
|
|||||||
|
|
||||||
// band label
|
// band label
|
||||||
QStringList bandNames;
|
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;
|
QList<QLabel *> bandLabelList;
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,11 @@ typedef enum _hamBand {
|
|||||||
cm125, // 14
|
cm125, // 14
|
||||||
cm70, // 15
|
cm70, // 15
|
||||||
cm33, // 16
|
cm33, // 16
|
||||||
gen // 17
|
cm23, // 17
|
||||||
|
cm13, // 18
|
||||||
|
cm10, // 19
|
||||||
|
cm5, // 21
|
||||||
|
gen // 22
|
||||||
|
|
||||||
} HamBand;
|
} HamBand;
|
||||||
|
|
||||||
@@ -301,6 +305,39 @@ inline QList<THamBandFrequencies> getHamBandFrequencies() {
|
|||||||
|
|
||||||
hamBandFreqList << hamBandFreq;
|
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.frequencyLo = 0;
|
||||||
hamBandFreq.frequencyHi = 61440000;
|
hamBandFreq.frequencyHi = 61440000;
|
||||||
hamBandFreq.hamBand = (HamBand) gen;
|
hamBandFreq.hamBand = (HamBand) gen;
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ public slots:
|
|||||||
void suspendSignal(QObject *sender);
|
void suspendSignal(QObject *sender);
|
||||||
void startPlaybackSignal(QObject *sender);
|
void startPlaybackSignal(QObject *sender);
|
||||||
void showSettingsDialogSignal(QObject *sender);
|
void showSettingsDialogSignal(QObject *sender);
|
||||||
|
void showWarningDialog(const QString &msg);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setSystemState(
|
void setSystemState(
|
||||||
@@ -333,7 +334,6 @@ private slots:
|
|||||||
void showStatusBarMessage(const QString &msg, int time);
|
void showStatusBarMessage(const QString &msg, int time);
|
||||||
void clearStatusBarMessage();
|
void clearStatusBarMessage();
|
||||||
void showNetworkIODialog();
|
void showNetworkIODialog();
|
||||||
void showWarningDialog(const QString &msg);
|
|
||||||
|
|
||||||
void addNetworkIOComboBoxEntry(QString str);
|
void addNetworkIOComboBoxEntry(QString str);
|
||||||
void clearNetworkIOComboBoxEntry();
|
void clearNetworkIOComboBoxEntry();
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ RadioPopupWidget::RadioPopupWidget(QWidget *parent, int rx)
|
|||||||
CHECKED_CONNECT(stickyBtn, SIGNAL(clicked()), this, SLOT(setSticky()));
|
CHECKED_CONNECT(stickyBtn, SIGNAL(clicked()), this, SLOT(setSticky()));
|
||||||
|
|
||||||
createOptionsBtnGroup();
|
createOptionsBtnGroup();
|
||||||
|
createFFTOptionsGroup();
|
||||||
createBandBtnGroup();
|
createBandBtnGroup();
|
||||||
createModeBtnGroup();
|
createModeBtnGroup();
|
||||||
createAgcBtnGroup();
|
createAgcBtnGroup();
|
||||||
@@ -150,6 +151,8 @@ RadioPopupWidget::RadioPopupWidget(QWidget *parent, int rx)
|
|||||||
mainLayout->addSpacing(16);
|
mainLayout->addSpacing(16);
|
||||||
//mainLayout->addStretch();
|
//mainLayout->addStretch();
|
||||||
mainLayout->addLayout(optionsVBox);
|
mainLayout->addLayout(optionsVBox);
|
||||||
|
mainLayout->addSpacing(8);
|
||||||
|
mainLayout->addLayout(fftOptionsVBox);
|
||||||
mainLayout->addSpacing(16);
|
mainLayout->addSpacing(16);
|
||||||
mainLayout->addLayout(bandVBox);
|
mainLayout->addLayout(bandVBox);
|
||||||
mainLayout->addSpacing(8);
|
mainLayout->addSpacing(8);
|
||||||
@@ -535,6 +538,62 @@ void RadioPopupWidget::createOptionsBtnGroup() {
|
|||||||
optionsVBox->addLayout(hbox5);
|
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() {
|
void RadioPopupWidget::createBandBtnGroup() {
|
||||||
|
|
||||||
band2200mBtn = new AeroButton("2200m", this);
|
band2200mBtn = new AeroButton("2200m", this);
|
||||||
@@ -605,6 +664,22 @@ void RadioPopupWidget::createBandBtnGroup() {
|
|||||||
bandBtnList.append(band33cmBtn);
|
bandBtnList.append(band33cmBtn);
|
||||||
CHECKED_CONNECT(band33cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
|
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);
|
bandGenBtn = new AeroButton("Gen", this);
|
||||||
bandBtnList.append(bandGenBtn);
|
bandBtnList.append(bandGenBtn);
|
||||||
CHECKED_CONNECT(bandGenBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
|
CHECKED_CONNECT(bandGenBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
|
||||||
@@ -637,22 +712,30 @@ void RadioPopupWidget::createBandBtnGroup() {
|
|||||||
hbox2->addWidget(band12mBtn);
|
hbox2->addWidget(band12mBtn);
|
||||||
hbox2->addWidget(band10mBtn);
|
hbox2->addWidget(band10mBtn);
|
||||||
hbox2->addWidget(band6mBtn);
|
hbox2->addWidget(band6mBtn);
|
||||||
hbox2->addWidget(bandGenBtn);
|
hbox2->addWidget(band2mBtn);
|
||||||
|
|
||||||
QHBoxLayout *hbox3 = new QHBoxLayout();
|
QHBoxLayout *hbox3 = new QHBoxLayout();
|
||||||
hbox3->setContentsMargins(0, 0, 0, 0);
|
hbox3->setContentsMargins(0, 0, 0, 0);
|
||||||
hbox3->setSpacing(0);
|
hbox3->setSpacing(0);
|
||||||
hbox3->addWidget(band2mBtn);
|
|
||||||
hbox3->addWidget(band125cmBtn);
|
hbox3->addWidget(band125cmBtn);
|
||||||
hbox3->addWidget(band70cmBtn);
|
hbox3->addWidget(band70cmBtn);
|
||||||
hbox3->addWidget(band12mBtn);
|
|
||||||
hbox3->addWidget(band33cmBtn);
|
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 = new QVBoxLayout;
|
||||||
bandVBox->setSpacing(1);
|
bandVBox->setSpacing(1);
|
||||||
bandVBox->addLayout(hbox1);
|
bandVBox->addLayout(hbox1);
|
||||||
bandVBox->addLayout(hbox2);
|
bandVBox->addLayout(hbox2);
|
||||||
bandVBox->addLayout(hbox3);
|
bandVBox->addLayout(hbox3);
|
||||||
|
bandVBox->addLayout(hbox4);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1198,6 +1281,18 @@ void RadioPopupWidget::bandChangedByBtn() {
|
|||||||
if (str == "33 cm")
|
if (str == "33 cm")
|
||||||
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm33));
|
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm33));
|
||||||
else
|
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")
|
if (str == "Gen")
|
||||||
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(gen));
|
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(gen));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ private:
|
|||||||
WaterfallColorMode m_waterfallColorMode;
|
WaterfallColorMode m_waterfallColorMode;
|
||||||
|
|
||||||
QVBoxLayout* optionsVBox;
|
QVBoxLayout* optionsVBox;
|
||||||
|
QVBoxLayout* fftOptionsVBox;
|
||||||
QVBoxLayout* bandVBox;
|
QVBoxLayout* bandVBox;
|
||||||
QVBoxLayout* modeVBox;
|
QVBoxLayout* modeVBox;
|
||||||
QVBoxLayout* agcVBox;
|
QVBoxLayout* agcVBox;
|
||||||
@@ -130,6 +131,15 @@ private:
|
|||||||
AeroButton* m_WaterfallSimpleBtn;
|
AeroButton* m_WaterfallSimpleBtn;
|
||||||
AeroButton* m_WaterfallEnhancedBtn;
|
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* band2200mBtn;
|
||||||
AeroButton* band630mBtn;
|
AeroButton* band630mBtn;
|
||||||
AeroButton* band160mBtn;
|
AeroButton* band160mBtn;
|
||||||
@@ -147,6 +157,10 @@ private:
|
|||||||
AeroButton* band125cmBtn;
|
AeroButton* band125cmBtn;
|
||||||
AeroButton* band70cmBtn;
|
AeroButton* band70cmBtn;
|
||||||
AeroButton* band33cmBtn;
|
AeroButton* band33cmBtn;
|
||||||
|
AeroButton* band23cmBtn;
|
||||||
|
AeroButton* band13cmBtn;
|
||||||
|
AeroButton* band10cmBtn;
|
||||||
|
AeroButton* band5cmBtn;
|
||||||
AeroButton* bandGenBtn;
|
AeroButton* bandGenBtn;
|
||||||
//AeroButton* bandxxBtn;
|
//AeroButton* bandxxBtn;
|
||||||
|
|
||||||
@@ -272,6 +286,7 @@ private slots:
|
|||||||
|
|
||||||
void setSticky();
|
void setSticky();
|
||||||
void createOptionsBtnGroup();
|
void createOptionsBtnGroup();
|
||||||
|
void createFFTOptionsGroup();
|
||||||
void createBandBtnGroup();
|
void createBandBtnGroup();
|
||||||
void createModeBtnGroup();
|
void createModeBtnGroup();
|
||||||
void createAgcBtnGroup();
|
void createAgcBtnGroup();
|
||||||
|
|||||||
@@ -345,40 +345,60 @@ void RadioWidget::createBandBtnGroup() {
|
|||||||
|
|
||||||
band2mBtn = new AeroButton("2 m", this);
|
band2mBtn = new AeroButton("2 m", this);
|
||||||
band2mBtn->setRoundness(0);
|
band2mBtn->setRoundness(0);
|
||||||
//band6mBtn->setGlass(false);
|
|
||||||
band2mBtn->setFixedSize(btn_widths, btn_height);
|
band2mBtn->setFixedSize(btn_widths, btn_height);
|
||||||
band2mBtn->setStyleSheet(set->getMiniButtonStyle());
|
band2mBtn->setStyleSheet(set->getMiniButtonStyle());
|
||||||
//band6mBtn->setTextColor(QColor(200, 200, 200));
|
|
||||||
bandBtnList.append(band2mBtn);
|
bandBtnList.append(band2mBtn);
|
||||||
CHECKED_CONNECT(band2mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
|
CHECKED_CONNECT(band2mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
|
||||||
|
|
||||||
band125cmBtn = new AeroButton("125 cm", this);
|
band125cmBtn = new AeroButton("125 cm", this);
|
||||||
band125cmBtn->setRoundness(0);
|
band125cmBtn->setRoundness(0);
|
||||||
//band6mBtn->setGlass(false);
|
|
||||||
band125cmBtn->setFixedSize(btn_widths, btn_height);
|
band125cmBtn->setFixedSize(btn_widths, btn_height);
|
||||||
band125cmBtn->setStyleSheet(set->getMiniButtonStyle());
|
band125cmBtn->setStyleSheet(set->getMiniButtonStyle());
|
||||||
//band6mBtn->setTextColor(QColor(200, 200, 200));
|
|
||||||
bandBtnList.append(band125cmBtn);
|
bandBtnList.append(band125cmBtn);
|
||||||
CHECKED_CONNECT(band125cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
|
CHECKED_CONNECT(band125cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
|
||||||
|
|
||||||
band70cmBtn = new AeroButton("70 cm", this);
|
band70cmBtn = new AeroButton("70 cm", this);
|
||||||
band70cmBtn->setRoundness(0);
|
band70cmBtn->setRoundness(0);
|
||||||
//band6mBtn->setGlass(false);
|
|
||||||
band70cmBtn->setFixedSize(btn_widths, btn_height);
|
band70cmBtn->setFixedSize(btn_widths, btn_height);
|
||||||
band70cmBtn->setStyleSheet(set->getMiniButtonStyle());
|
band70cmBtn->setStyleSheet(set->getMiniButtonStyle());
|
||||||
//band6mBtn->setTextColor(QColor(200, 200, 200));
|
|
||||||
bandBtnList.append(band70cmBtn);
|
bandBtnList.append(band70cmBtn);
|
||||||
CHECKED_CONNECT(band70cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
|
CHECKED_CONNECT(band70cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
|
||||||
|
|
||||||
band33cmBtn = new AeroButton("33 cm", this);
|
band33cmBtn = new AeroButton("33 cm", this);
|
||||||
band33cmBtn->setRoundness(0);
|
band33cmBtn->setRoundness(0);
|
||||||
//band6mBtn->setGlass(false);
|
|
||||||
band33cmBtn->setFixedSize(btn_widths, btn_height);
|
band33cmBtn->setFixedSize(btn_widths, btn_height);
|
||||||
band33cmBtn->setStyleSheet(set->getMiniButtonStyle());
|
band33cmBtn->setStyleSheet(set->getMiniButtonStyle());
|
||||||
//band6mBtn->setTextColor(QColor(200, 200, 200));
|
|
||||||
bandBtnList.append(band33cmBtn);
|
bandBtnList.append(band33cmBtn);
|
||||||
CHECKED_CONNECT(band33cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
|
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 = new AeroButton("Gen", this);
|
||||||
bandGenBtn->setRoundness(0);
|
bandGenBtn->setRoundness(0);
|
||||||
//bandGenBtn->setGlass(false);
|
//bandGenBtn->setGlass(false);
|
||||||
@@ -418,11 +438,15 @@ void RadioWidget::createBandBtnGroup() {
|
|||||||
layout->addWidget(band12mBtn, 1, 4);
|
layout->addWidget(band12mBtn, 1, 4);
|
||||||
layout->addWidget(band10mBtn, 1, 5);
|
layout->addWidget(band10mBtn, 1, 5);
|
||||||
layout->addWidget(band6mBtn, 2, 0);
|
layout->addWidget(band6mBtn, 2, 0);
|
||||||
layout->addWidget(band2mBtn, 2, 0);
|
layout->addWidget(band2mBtn, 2, 1);
|
||||||
layout->addWidget(band125cmBtn, 2, 0);
|
layout->addWidget(band125cmBtn, 2, 2);
|
||||||
layout->addWidget(band70cmBtn, 2, 0);
|
layout->addWidget(band70cmBtn, 2, 3);
|
||||||
layout->addWidget(band33cmBtn, 2, 0);
|
layout->addWidget(band33cmBtn, 2, 4);
|
||||||
layout->addWidget(bandGenBtn, 2, 1);
|
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);
|
//layout->addWidget(bandxxBtn, 2, 3);
|
||||||
|
|
||||||
QHBoxLayout *hbox1 = new QHBoxLayout();
|
QHBoxLayout *hbox1 = new QHBoxLayout();
|
||||||
@@ -1229,6 +1253,18 @@ void RadioWidget::bandChangedByBtn() {
|
|||||||
if (str == "33 cm")
|
if (str == "33 cm")
|
||||||
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm33));
|
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm33));
|
||||||
else
|
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")
|
if (str == "Gen")
|
||||||
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(gen));
|
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(gen));
|
||||||
|
|
||||||
|
|||||||
@@ -89,6 +89,10 @@ private:
|
|||||||
AeroButton *band125cmBtn;
|
AeroButton *band125cmBtn;
|
||||||
AeroButton *band70cmBtn;
|
AeroButton *band70cmBtn;
|
||||||
AeroButton *band33cmBtn;
|
AeroButton *band33cmBtn;
|
||||||
|
AeroButton *band23cmBtn;
|
||||||
|
AeroButton *band13cmBtn;
|
||||||
|
AeroButton *band10cmBtn;
|
||||||
|
AeroButton *band5cmBtn;
|
||||||
AeroButton *bandGenBtn;
|
AeroButton *bandGenBtn;
|
||||||
//AeroButton *bandxxBtn;
|
//AeroButton *bandxxBtn;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
* 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
|
* 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";
|
settingsFilename = "settings.ini";
|
||||||
settings = new QSettings(QCoreApplication::applicationDirPath() + "/" + settingsFilename, QSettings::IniFormat);
|
settings = new QSettings(QCoreApplication::applicationDirPath() + "/" + settingsFilename, QSettings::IniFormat);
|
||||||
|
|
||||||
m_titleString = "cudaSDR BETA ";
|
m_titleString = "cudaSDR BETA";
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
m_titleString = "cudaSDR Debug BETA ";
|
m_titleString = "cudaSDR Debug BETA ";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_versionString = "v0.3.2.13";
|
m_versionString = "v0.3.2.13+";
|
||||||
|
|
||||||
qDebug() << qPrintable(m_titleString);
|
qDebug() << qPrintable(m_titleString);
|
||||||
|
|
||||||
@@ -97,6 +97,7 @@ Settings::Settings(QObject *parent)
|
|||||||
|
|
||||||
m_receiverDataList[i].agcHangThreshold = 0.0;
|
m_receiverDataList[i].agcHangThreshold = 0.0;
|
||||||
m_receiverDataList[i].peakHold = false;
|
m_receiverDataList[i].peakHold = false;
|
||||||
|
m_receiverDataList[i].fftFactor = 1;
|
||||||
|
|
||||||
for (int j = 0; j < MAX_BANDS; j++) {
|
for (int j = 0; j < MAX_BANDS; j++) {
|
||||||
|
|
||||||
@@ -155,7 +156,7 @@ Settings::Settings(QObject *parent)
|
|||||||
m_defaultFilterList = getDefaultFilterFrequencies();
|
m_defaultFilterList = getDefaultFilterFrequencies();
|
||||||
|
|
||||||
m_transmitter.txAllowed = false;
|
m_transmitter.txAllowed = false;
|
||||||
m_fft = 1;
|
//m_fft = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings::~Settings() {
|
Settings::~Settings() {
|
||||||
@@ -908,6 +909,14 @@ int Settings::loadSettings() {
|
|||||||
else
|
else
|
||||||
m_receiverDataList[i].clickVFO = false;
|
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 = m_rxStringList.at(i);
|
||||||
cstr.append("/lastCenterFrequency2200m");
|
cstr.append("/lastCenterFrequency2200m");
|
||||||
value = settings->value(cstr, 135700).toDouble();
|
value = settings->value(cstr, 135700).toDouble();
|
||||||
@@ -1106,12 +1115,61 @@ int Settings::loadSettings() {
|
|||||||
if ((value < 902000000) || (value > 928000000)) value = 902000000;
|
if ((value < 902000000) || (value > 928000000)) value = 902000000;
|
||||||
m_receiverDataList[i].lastCenterFrequencyList << value;
|
m_receiverDataList[i].lastCenterFrequencyList << value;
|
||||||
|
|
||||||
|
//RRK TODO FIX
|
||||||
cstr = m_rxStringList.at(i);
|
cstr = m_rxStringList.at(i);
|
||||||
cstr.append("/lastVfoFrequency33cm");
|
cstr.append("/lastVfoFrequency33cm");
|
||||||
value = settings->value(cstr, 902000000).toDouble();
|
value = settings->value(cstr, 902000000).toDouble();
|
||||||
if ((value < 902000000) || (value > 928000000)) value = 902000000;
|
if ((value < 902000000) || (value > 928000000)) value = 902000000;
|
||||||
m_receiverDataList[i].lastVfoFrequencyList << value;
|
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 = m_rxStringList.at(i);
|
||||||
cstr.append("/lastCenterFrequencyGen");
|
cstr.append("/lastCenterFrequencyGen");
|
||||||
value = settings->value(cstr, 1800000).toDouble();
|
value = settings->value(cstr, 1800000).toDouble();
|
||||||
@@ -1892,6 +1950,13 @@ int Settings::saveSettings() {
|
|||||||
else
|
else
|
||||||
settings->setValue(str, "off");
|
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
|
// center frequencies
|
||||||
for (int j = 0; j < MAX_BANDS; j++) {
|
for (int j = 0; j < MAX_BANDS; j++) {
|
||||||
|
|
||||||
@@ -3820,7 +3885,7 @@ void Settings::setSampleSize(QObject* sender, int rx, int size) {
|
|||||||
|
|
||||||
Q_UNUSED (sender)
|
Q_UNUSED (sender)
|
||||||
|
|
||||||
if (rx == 0) {
|
/*if (rx == 0) {
|
||||||
|
|
||||||
SETTINGS_DEBUG << "set sample size to: " << size;
|
SETTINGS_DEBUG << "set sample size to: " << size;
|
||||||
switch (size) {
|
switch (size) {
|
||||||
@@ -3840,10 +3905,61 @@ void Settings::setSampleSize(QObject* sender, int rx, int size) {
|
|||||||
case 32768:
|
case 32768:
|
||||||
m_fft = 8;
|
m_fft = 8;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 65536:
|
||||||
|
m_fft = 16;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 131072:
|
||||||
|
m_fft = 32;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 262144:
|
||||||
|
m_fft = 64;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
emit sampleSizeChanged(0, size);
|
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:
|
// Alex configuration:
|
||||||
@@ -4589,6 +4705,11 @@ bool Settings::getHairCrossStatus(int rx) {
|
|||||||
return m_receiverDataList[rx].hairCross;
|
return m_receiverDataList[rx].hairCross;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Settings::getFFTAutoStatus(int rx) {
|
||||||
|
|
||||||
|
return m_receiverDataList[rx].fftAuto;
|
||||||
|
}
|
||||||
|
|
||||||
void Settings::setWaterfallTime(int rx, int value) {
|
void Settings::setWaterfallTime(int rx, int value) {
|
||||||
|
|
||||||
Q_UNUSED(rx)
|
Q_UNUSED(rx)
|
||||||
|
|||||||
@@ -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
|
* 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
|
* it under the terms of the GNU Library General Public License version 2 as
|
||||||
@@ -29,7 +29,6 @@
|
|||||||
|
|
||||||
//#define DEBUG
|
//#define DEBUG
|
||||||
|
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QErrorMessage>
|
#include <QErrorMessage>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
@@ -39,6 +38,7 @@
|
|||||||
#include <QAudioOutput>
|
#include <QAudioOutput>
|
||||||
|
|
||||||
#include "cusdr_hamDatabase.h"
|
#include "cusdr_hamDatabase.h"
|
||||||
|
#include "fftw3.h"
|
||||||
|
|
||||||
// test for OpenCL
|
// test for OpenCL
|
||||||
//#include "CL/qclcontext.h"
|
//#include "CL/qclcontext.h"
|
||||||
@@ -69,19 +69,38 @@
|
|||||||
//#define AGCOFFSET 33.0
|
//#define AGCOFFSET 33.0
|
||||||
|
|
||||||
#define MAXFREQUENCY 961440000
|
#define MAXFREQUENCY 961440000
|
||||||
//#define MAXHPFREQUENCY 61440000
|
#ifdef HL
|
||||||
#define MAXHPFREQUENCY 30720000
|
#define MAXHPFREQUENCY 30720000
|
||||||
|
#else
|
||||||
|
#define MAXHPFREQUENCY 61440000
|
||||||
|
#endif
|
||||||
#define MINDBM -180
|
#define MINDBM -180
|
||||||
#define MAXDBM 10
|
#define MAXDBM 10
|
||||||
#define MINDISTDBM -150
|
#define MINDISTDBM -150
|
||||||
#define MAXDISTDBM 150
|
#define MAXDISTDBM 150
|
||||||
#define MAX_FFTSIZE 262144
|
#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
|
// receiver settings
|
||||||
|
|
||||||
#define MAX_RECEIVERS 16
|
#define MAX_RECEIVERS 20
|
||||||
#define MAX_BANDS 18
|
#define MAX_BANDS 22
|
||||||
#define BUFFER_SIZE 1024
|
#define BUFFER_SIZE 1024
|
||||||
#define SAMPLE_BUFFER_SIZE 4096
|
#define SAMPLE_BUFFER_SIZE 4096
|
||||||
#define BANDSCOPE_BUFFER_SIZE 4096
|
#define BANDSCOPE_BUFFER_SIZE 4096
|
||||||
@@ -507,6 +526,7 @@ typedef struct _receiver {
|
|||||||
bool panGrid;
|
bool panGrid;
|
||||||
bool peakHold;
|
bool peakHold;
|
||||||
bool clickVFO;
|
bool clickVFO;
|
||||||
|
bool fftAuto;
|
||||||
|
|
||||||
long ctrFrequency;
|
long ctrFrequency;
|
||||||
long vfoFrequency;
|
long vfoFrequency;
|
||||||
@@ -535,6 +555,7 @@ typedef struct _receiver {
|
|||||||
int waterfallOffsetLo;
|
int waterfallOffsetLo;
|
||||||
int waterfallOffsetHi;
|
int waterfallOffsetHi;
|
||||||
int averagingCnt;
|
int averagingCnt;
|
||||||
|
int fftFactor;
|
||||||
|
|
||||||
} TReceiver;
|
} TReceiver;
|
||||||
|
|
||||||
@@ -1035,6 +1056,7 @@ public:
|
|||||||
bool getPanLockedStatus(int rx);
|
bool getPanLockedStatus(int rx);
|
||||||
bool getClickVFOStatus(int rx);
|
bool getClickVFOStatus(int rx);
|
||||||
bool getHairCrossStatus(int rx);
|
bool getHairCrossStatus(int rx);
|
||||||
|
bool getFFTAutoStatus(int rx);
|
||||||
|
|
||||||
int getMercurySpeed() { return m_mercurySpeed; }
|
int getMercurySpeed() { return m_mercurySpeed; }
|
||||||
int getOutputSampleIncrement() { return m_outputSampleIncrement; }
|
int getOutputSampleIncrement() { return m_outputSampleIncrement; }
|
||||||
@@ -1102,8 +1124,7 @@ public:
|
|||||||
|
|
||||||
bool getSpectrumAveraging(int rx);
|
bool getSpectrumAveraging(int rx);
|
||||||
int getSpectrumAveragingCnt(int rx);
|
int getSpectrumAveragingCnt(int rx);
|
||||||
|
int getFFTMultiplicator(int rx);// { return m_fft; }
|
||||||
int getFFTMultiplicator() { return m_fft; }
|
|
||||||
|
|
||||||
QMutex debugMutex;
|
QMutex debugMutex;
|
||||||
|
|
||||||
@@ -1482,7 +1503,7 @@ private:
|
|||||||
int m_chirpFilterLowerFrequency;
|
int m_chirpFilterLowerFrequency;
|
||||||
int m_chirpFilterUpperFrequency;
|
int m_chirpFilterUpperFrequency;
|
||||||
|
|
||||||
int m_fft;
|
//int m_fft;
|
||||||
|
|
||||||
/*bool m_cudaPresence;
|
/*bool m_cudaPresence;
|
||||||
int m_cuda_devices;
|
int m_cuda_devices;
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ void TransmitPAWidget::createGainGroup() {
|
|||||||
|
|
||||||
// band label
|
// band label
|
||||||
QStringList bandNames;
|
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;
|
QList<QLabel *> bandLabelList;
|
||||||
|
|
||||||
|
|||||||
+141
-24
@@ -32,6 +32,9 @@
|
|||||||
#include "Util/cusdr_cpuUsage.h"
|
#include "Util/cusdr_cpuUsage.h"
|
||||||
#elif defined(Q_OS_LINUX)
|
#elif defined(Q_OS_LINUX)
|
||||||
#include "Util/cusdr_cpuUsage_unix.h"
|
#include "Util/cusdr_cpuUsage_unix.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#define fopen_s(pFile,filename,mode) ((*(pFile))=fopen((filename), (mode)))==NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "fftw3.h"
|
#include "fftw3.h"
|
||||||
@@ -88,34 +91,50 @@ void cuSDRMessageHandler(QtMsgType type, const QMessageLogContext &context, cons
|
|||||||
ts << txt << endl << flush;
|
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() {
|
void runFFTWWisdom() {
|
||||||
|
|
||||||
QString directory = QDir::currentPath();
|
QString directory = QDir::currentPath();
|
||||||
|
|
||||||
QDir currentDir = QDir(directory);
|
QDir currentDir = QDir(directory);
|
||||||
qDebug() << currentDir;
|
|
||||||
|
|
||||||
if (currentDir.exists("wisdom")) {
|
int err;
|
||||||
|
FILE* wisdomFile;
|
||||||
|
|
||||||
qDebug() << "wisdom exists !";
|
qDebug() << "Init::\tcurrent path: " << qPrintable(currentDir.absolutePath());
|
||||||
return;
|
|
||||||
|
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 {
|
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;
|
int size = 64;
|
||||||
|
|
||||||
@@ -127,7 +146,7 @@ void runFFTWWisdom() {
|
|||||||
|
|
||||||
while (size <= MAX_FFTSIZE) {
|
while (size <= MAX_FFTSIZE) {
|
||||||
|
|
||||||
qDebug() << str.arg(size);
|
qDebug() << qPrintable(str.arg(size));
|
||||||
cpxbuf = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * size);
|
cpxbuf = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * size);
|
||||||
|
|
||||||
plan_fwd = fftwf_plan_dft_1d(size , cpxbuf, cpxbuf, FFTW_FORWARD, FFTW_PATIENT);
|
plan_fwd = fftwf_plan_dft_1d(size , cpxbuf, cpxbuf, FFTW_FORWARD, FFTW_PATIENT);
|
||||||
@@ -140,11 +159,21 @@ void runFFTWWisdom() {
|
|||||||
|
|
||||||
size *= 2;
|
size *= 2;
|
||||||
}
|
}
|
||||||
fftw_export_wisdom_to_file(wisdom_file);
|
//FILE* wis = fopen (fname.c_str(), "w");
|
||||||
}*/
|
//if (wis) {
|
||||||
//QProcess process;
|
|
||||||
//process.start("fftwf-wisdom.exe");
|
err = fopen_s(&wisdomFile, "fftwf_wisdom", "w");
|
||||||
//process.waitForFinished();
|
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);
|
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();
|
//app.processEvents();
|
||||||
|
|
||||||
mainWindow.show();
|
mainWindow.show();
|
||||||
|
|||||||
Reference in New Issue
Block a user