Updated to 20 rcvrs and fixed a bug with sending the sequence
This commit is contained in:
parent
bcc2f661ec
commit
9f9d2f18f8
@ -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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
3434
Source/bin/settings.ini.worked
Normal file
3434
Source/bin/settings.ini.worked
Normal file
File diff suppressed because it is too large
Load Diff
@ -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)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
|
||||
|
||||
@ -120,6 +120,7 @@ void DataIO::stop() {
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
if(m_pSoundCardOut) {
|
||||
SleeperThread::msleep(100);
|
||||
m_pSoundCardOut->Stop();
|
||||
delete m_pSoundCardOut;
|
||||
}
|
||||
|
||||
@ -1,271 +1,302 @@
|
||||
/**
|
||||
* @file cusdr_discoverer.cpp
|
||||
* @brief HPSDR device discoverer class
|
||||
* @author Hermann von Hasseln, DL3HVH
|
||||
* @version 0.1
|
||||
* @date 2012-05-19
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright 2012 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
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this program; if not, write to the
|
||||
* Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#define LOG_DISCOVERER
|
||||
|
||||
#include "cusdr_discoverer.h"
|
||||
#include "Util/cusdr_buttons.h"
|
||||
|
||||
|
||||
//#include <QComboBox>
|
||||
//#include <QDialogButtonBox>
|
||||
//#include <QLabel>
|
||||
//#include <QPushButton>
|
||||
//#include <QVBoxLayout>
|
||||
//#include <QCheckBox>
|
||||
//#include <QSlider>
|
||||
//#include <QSpinBox>
|
||||
|
||||
/**
|
||||
* @file cusdr_discoverer.cpp
|
||||
* @brief HPSDR device discoverer class
|
||||
* @author Hermann von Hasseln, DL3HVH
|
||||
* @version 0.1
|
||||
* @date 2012-05-19
|
||||
*/
|
||||
|
||||
|
||||
//#define btn_height 18
|
||||
//#define btn_width 74
|
||||
|
||||
Discoverer::Discoverer(THPSDRParameter *ioData)
|
||||
: QObject()
|
||||
, set(Settings::instance())
|
||||
, io(ioData)
|
||||
{
|
||||
m_deviceCards = set->getMetisCardsList();
|
||||
}
|
||||
|
||||
Discoverer::~Discoverer() {
|
||||
}
|
||||
|
||||
void Discoverer::initHPSDRDevice() {
|
||||
|
||||
m_searchTime.start();
|
||||
|
||||
int deviceNo = 0;
|
||||
while (deviceNo == 0) {
|
||||
|
||||
deviceNo = findHPSDRDevices();
|
||||
|
||||
if (deviceNo > 1) {
|
||||
|
||||
set->setHPSDRDeviceNumber(deviceNo);
|
||||
break;
|
||||
}
|
||||
|
||||
if (deviceNo > 0) {
|
||||
|
||||
set->setHPSDRDeviceNumber(deviceNo);
|
||||
break;
|
||||
}
|
||||
|
||||
if (m_searchTime.elapsed() > 1000) {
|
||||
|
||||
set->setHPSDRDeviceNumber(0);
|
||||
break;
|
||||
}
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "no device found - trying again...";
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
io->devicefound.wakeAll();
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
|
||||
int Discoverer::findHPSDRDevices() {
|
||||
|
||||
int devicesFound = 0;
|
||||
|
||||
m_findDatagram.resize(63);
|
||||
m_findDatagram[0] = (char)0xEF;
|
||||
m_findDatagram[1] = (char)0xFE;
|
||||
m_findDatagram[2] = (char)0x02;
|
||||
for (int i = 3; i < 63; i++)
|
||||
m_findDatagram[i] = (char)0x00;
|
||||
|
||||
QUdpSocket socket;
|
||||
|
||||
CHECKED_CONNECT(
|
||||
&socket,
|
||||
SIGNAL(error(QAbstractSocket::SocketError)),
|
||||
this,
|
||||
SLOT(displayDiscoverySocketError(QAbstractSocket::SocketError)));
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "using " << qPrintable(QHostAddress(set->getHPSDRDeviceLocalAddr()).toString()) << " for discovery.";
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
// clear comboBox entries in the network dialogue
|
||||
set->clearNetworkIOComboBoxEntry();
|
||||
|
||||
#if defined(Q_OS_WIN32)
|
||||
|
||||
if (socket.bind(
|
||||
QHostAddress(set->getHPSDRDeviceLocalAddr()), 0,
|
||||
QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress))
|
||||
//QUdpSocket::ReuseAddressHint))
|
||||
{
|
||||
set->setMetisPort(this, socket.localPort());
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery_socket bound successfully to port " << socket.localPort();
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
else {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery_socket bind failed.";
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
socket.close();
|
||||
return 0;
|
||||
}
|
||||
#elif defined(Q_OS_LINUX)
|
||||
|
||||
if (socket.bind(
|
||||
QHostAddress(set->getHPSDRDeviceLocalAddr()),
|
||||
QUdpSocket::DefaultForPlatform))
|
||||
{
|
||||
CHECKED_CONNECT(
|
||||
&socket,
|
||||
SIGNAL(error(QAbstractSocket::SocketError)),
|
||||
this,
|
||||
SLOT(displayDiscoverySocketError(QAbstractSocket::SocketError)));
|
||||
|
||||
set->setMetisPort(this, socket.localPort());
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery_socket bound successfully to port " << socket.localPort();
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
else {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery_socket bind failed.";
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
socket.close();
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (socket.writeDatagram(m_findDatagram, QHostAddress::Broadcast, DEVICE_PORT) == 63) {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery data sent.";
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
else {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery data not sent.";
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
|
||||
|
||||
// wait a little
|
||||
//SleeperThread::msleep(30);
|
||||
SleeperThread::msleep(500);
|
||||
|
||||
while (socket.hasPendingDatagrams()) {
|
||||
|
||||
TNetworkDevicecard mc;
|
||||
quint16 port;
|
||||
|
||||
m_deviceDatagram.resize(socket.pendingDatagramSize());
|
||||
socket.readDatagram(m_deviceDatagram.data(), m_deviceDatagram.size(), &mc.ip_address, &port);
|
||||
|
||||
if (m_deviceDatagram[0] == (char)0xEF && m_deviceDatagram[1] == (char)0xFE) {
|
||||
|
||||
if (m_deviceDatagram[2] == (char)0x02) {
|
||||
|
||||
sprintf(mc.mac_address, "%02X:%02X:%02X:%02X:%02X:%02X",
|
||||
m_deviceDatagram[3] & 0xFF, m_deviceDatagram[4] & 0xFF, m_deviceDatagram[5] & 0xFF,
|
||||
m_deviceDatagram[6] & 0xFF, m_deviceDatagram[7] & 0xFF, m_deviceDatagram[8] & 0xFF);
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "Device found at " << qPrintable(mc.ip_address.toString()) << ":" << port << "; Mac addr: [" << mc.mac_address << "]";
|
||||
DISCOVERER_DEBUG << "Device code version: " << qPrintable(QString::number(m_deviceDatagram.at(9), 16));
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
int no = m_deviceDatagram.at(10);
|
||||
QString str;
|
||||
if (no == 0)
|
||||
str = "Metis";
|
||||
else if (no == 1)
|
||||
str = "Hermes";
|
||||
else if (no == 2)
|
||||
str = "Griffin";
|
||||
else if (no == 4)
|
||||
str = "Angelia";
|
||||
|
||||
mc.boardID = no;
|
||||
mc.boardName = str;
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "Device board ID: " << no;
|
||||
DISCOVERER_DEBUG << "Device is: " << qPrintable(str);
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
m_deviceCards.append(mc);
|
||||
|
||||
str += " (";
|
||||
str += mc.ip_address.toString();
|
||||
str += ")";
|
||||
|
||||
set->addNetworkIOComboBoxEntry(str);
|
||||
devicesFound++;
|
||||
}
|
||||
else if (m_deviceDatagram[2] == (char)0x03) {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "Device already sending data!";
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
set->setMetisCardList(m_deviceCards);
|
||||
|
||||
if (devicesFound == 1) {
|
||||
|
||||
set->setCurrentHPSDRDevice(m_deviceCards.at(0));
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "Device selected: " << qPrintable(m_deviceCards.at(0).ip_address.toString());
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
|
||||
socket.close();
|
||||
return devicesFound;
|
||||
}
|
||||
|
||||
void Discoverer::displayDiscoverySocketError(QAbstractSocket::SocketError error) {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery socket error: " << error;
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
|
||||
void Discoverer::clear() {
|
||||
|
||||
//m_metisDeviceComboBox->clear();
|
||||
m_deviceCards.clear();
|
||||
}
|
||||
/*
|
||||
*
|
||||
* Copyright 2012 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
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this program; if not, write to the
|
||||
* Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#define LOG_DISCOVERER
|
||||
|
||||
#include "cusdr_discoverer.h"
|
||||
#include "Util/cusdr_buttons.h"
|
||||
|
||||
|
||||
//#include <QComboBox>
|
||||
//#include <QDialogButtonBox>
|
||||
//#include <QLabel>
|
||||
//#include <QPushButton>
|
||||
//#include <QVBoxLayout>
|
||||
//#include <QCheckBox>
|
||||
//#include <QSlider>
|
||||
//#include <QSpinBox>
|
||||
|
||||
|
||||
|
||||
//#define btn_height 18
|
||||
//#define btn_width 74
|
||||
|
||||
Discoverer::Discoverer(THPSDRParameter *ioData)
|
||||
: QObject()
|
||||
, set(Settings::instance())
|
||||
, io(ioData)
|
||||
{
|
||||
m_deviceCards = set->getMetisCardsList();
|
||||
}
|
||||
|
||||
Discoverer::~Discoverer() {
|
||||
}
|
||||
|
||||
TNetworkDevicecard mc;
|
||||
|
||||
void Discoverer::initHPSDRDevice() {
|
||||
|
||||
m_searchTime.start();
|
||||
|
||||
int deviceNo = 0;
|
||||
while (deviceNo == 0) {
|
||||
|
||||
deviceNo = findHPSDRDevices();
|
||||
|
||||
if (deviceNo > 1) {
|
||||
|
||||
set->setHPSDRDeviceNumber(deviceNo);
|
||||
break;
|
||||
}
|
||||
|
||||
if (deviceNo > 0) {
|
||||
|
||||
set->setHPSDRDeviceNumber(deviceNo);
|
||||
break;
|
||||
}
|
||||
|
||||
if (m_searchTime.elapsed() > 1000) {
|
||||
|
||||
set->setHPSDRDeviceNumber(0);
|
||||
break;
|
||||
}
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "no device found - trying again...";
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
io->devicefound.wakeAll();
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
|
||||
int Discoverer::findHPSDRDevices() {
|
||||
|
||||
int devicesFound = 0;
|
||||
|
||||
m_findDatagram.resize(63);
|
||||
m_findDatagram[0] = (char)0xEF;
|
||||
m_findDatagram[1] = (char)0xFE;
|
||||
m_findDatagram[2] = (char)0x02;
|
||||
for (int i = 3; i < 63; i++)
|
||||
m_findDatagram[i] = (char)0x00;
|
||||
|
||||
QUdpSocket socket;
|
||||
|
||||
CHECKED_CONNECT(
|
||||
&socket,
|
||||
SIGNAL(error(QAbstractSocket::SocketError)),
|
||||
this,
|
||||
SLOT(displayDiscoverySocketError(QAbstractSocket::SocketError)));
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "using " << qPrintable(QHostAddress(set->getHPSDRDeviceLocalAddr()).toString()) << " for discovery.";
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
// clear comboBox entries in the network dialogue
|
||||
set->clearNetworkIOComboBoxEntry();
|
||||
|
||||
#if defined(Q_OS_WIN32)
|
||||
|
||||
if (socket.bind(
|
||||
QHostAddress(set->getHPSDRDeviceLocalAddr()), 0,
|
||||
QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress))
|
||||
//QUdpSocket::ReuseAddressHint))
|
||||
{
|
||||
set->setMetisPort(this, socket.localPort());
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery_socket bound successfully to port " << socket.localPort();
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
else {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery_socket bind failed.";
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
socket.close();
|
||||
return 0;
|
||||
}
|
||||
#elif defined(Q_OS_LINUX)
|
||||
|
||||
if (socket.bind(
|
||||
QHostAddress(set->getHPSDRDeviceLocalAddr()),
|
||||
QUdpSocket::DefaultForPlatform))
|
||||
{
|
||||
CHECKED_CONNECT(
|
||||
&socket,
|
||||
SIGNAL(error(QAbstractSocket::SocketError)),
|
||||
this,
|
||||
SLOT(displayDiscoverySocketError(QAbstractSocket::SocketError)));
|
||||
|
||||
set->setMetisPort(this, socket.localPort());
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery_socket bound successfully to port " << socket.localPort();
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
else {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery_socket bind failed.";
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
socket.close();
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (socket.writeDatagram(m_findDatagram, QHostAddress::Broadcast, DEVICE_PORT) == 63) {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery data sent.";
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
else {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery data not sent.";
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
|
||||
|
||||
// wait a little
|
||||
//SleeperThread::msleep(30);
|
||||
SleeperThread::msleep(500);
|
||||
|
||||
while (socket.hasPendingDatagrams()) {
|
||||
|
||||
quint16 port;
|
||||
|
||||
m_deviceDatagram.resize(socket.pendingDatagramSize());
|
||||
socket.readDatagram(m_deviceDatagram.data(), m_deviceDatagram.size(), &mc.ip_address, &port);
|
||||
|
||||
if (m_deviceDatagram[0] == (char)0xEF && m_deviceDatagram[1] == (char)0xFE) {
|
||||
|
||||
if (m_deviceDatagram[2] == (char)0x02) {
|
||||
|
||||
sprintf(mc.mac_address, "%02X:%02X:%02X:%02X:%02X:%02X",
|
||||
m_deviceDatagram[3] & 0xFF, m_deviceDatagram[4] & 0xFF, m_deviceDatagram[5] & 0xFF,
|
||||
m_deviceDatagram[6] & 0xFF, m_deviceDatagram[7] & 0xFF, m_deviceDatagram[8] & 0xFF);
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "Device found at " << qPrintable(mc.ip_address.toString()) << ":" << port << "; Mac addr: [" << mc.mac_address << "]";
|
||||
DISCOVERER_DEBUG << "Device code version: " << qPrintable(QString::number(m_deviceDatagram.at(9), 16));
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
int no = m_deviceDatagram.at(10);
|
||||
QString str;
|
||||
if (no == 0)
|
||||
str = "Metis";
|
||||
else if (no == 1)
|
||||
str = "Hermes";
|
||||
else if (no == 2)
|
||||
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;
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "Device board ID: " << no;
|
||||
DISCOVERER_DEBUG << "Device is: " << qPrintable(str);
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
m_deviceCards.append(mc);
|
||||
|
||||
str += " (";
|
||||
str += mc.ip_address.toString();
|
||||
str += ")";
|
||||
|
||||
set->addNetworkIOComboBoxEntry(str);
|
||||
devicesFound++;
|
||||
}
|
||||
else if (m_deviceDatagram[2] == (char)0x03) {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "Device already sending data - trying to shut down...";
|
||||
io->networkIOMutex.unlock();
|
||||
|
||||
shutdownHPSDRDevice();
|
||||
clear();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
set->setMetisCardList(m_deviceCards);
|
||||
|
||||
if (devicesFound == 1) {
|
||||
|
||||
set->setCurrentHPSDRDevice(m_deviceCards.at(0));
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "Device selected: " << qPrintable(m_deviceCards.at(0).ip_address.toString());
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
|
||||
socket.close();
|
||||
return devicesFound;
|
||||
}
|
||||
|
||||
void Discoverer::displayDiscoverySocketError(QAbstractSocket::SocketError error) {
|
||||
|
||||
io->networkIOMutex.lock();
|
||||
DISCOVERER_DEBUG << "discovery socket error: " << error;
|
||||
io->networkIOMutex.unlock();
|
||||
}
|
||||
|
||||
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.";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -58,6 +58,7 @@ public:
|
||||
|
||||
int findHPSDRDevices();
|
||||
void clear();
|
||||
void shutdownHPSDRDevice();
|
||||
|
||||
public slots:
|
||||
void initHPSDRDevice();
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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_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);
|
||||
}
|
||||
m_fftMultiplier = mult;
|
||||
int idx = (int)(myLog(m_fftMultiplier, 2));
|
||||
|
||||
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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -30,6 +30,7 @@
|
||||
#define CUSDR_PAINTER_H
|
||||
|
||||
#include <QPainter>
|
||||
#include <cmath>
|
||||
|
||||
class QHPainter : public QPainter {
|
||||
|
||||
@ -102,4 +103,4 @@ public:
|
||||
const QBrush& brush);
|
||||
};
|
||||
|
||||
#endif // CUSDR_PAINTER_H
|
||||
#endif // CUSDR_PAINTER_H
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -298,6 +302,39 @@ inline QList<THamBandFrequencies> getHamBandFrequencies() {
|
||||
hamBandFreq.hamBand = (HamBand) cm33;
|
||||
hamBandFreq.bandString = "33cm";
|
||||
hamBandFreq.region = (IARURegion) region1;
|
||||
|
||||
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;
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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));
|
||||
|
||||
|
||||
@ -89,6 +89,10 @@ private:
|
||||
AeroButton *band125cmBtn;
|
||||
AeroButton *band70cmBtn;
|
||||
AeroButton *band33cmBtn;
|
||||
AeroButton *band23cmBtn;
|
||||
AeroButton *band13cmBtn;
|
||||
AeroButton *band10cmBtn;
|
||||
AeroButton *band5cmBtn;
|
||||
AeroButton *bandGenBtn;
|
||||
//AeroButton *bandxxBtn;
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
|
||||
|
||||
@ -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,35 +91,51 @@ 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;
|
||||
|
||||
int err;
|
||||
FILE* wisdomFile;
|
||||
|
||||
qDebug() << "Init::\tcurrent path: " << qPrintable(currentDir.absolutePath());
|
||||
|
||||
if (currentDir.exists("wisdom")) {
|
||||
if (currentDir.exists("fftwf_wisdom")) {
|
||||
|
||||
qDebug() << "wisdom exists !";
|
||||
return;
|
||||
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() << "Init::\tfound fftwf_wisdom but could not open.";
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
qDebug() << "wisdom does not exist - planning FFT...";
|
||||
|
||||
/*const char* wisdom_file = "wisdom";
|
||||
if (!fftw_import_wisdom_from_file(wisdom_file)) {
|
||||
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;
|
||||
|
||||
QString str = "Planning FFT size %1";
|
||||
@ -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,12 +159,22 @@ 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.";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
@ -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();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user