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

This commit is contained in:
mh 2017-12-29 11:06:36 -05:00
parent bcc2f661ec
commit 9f9d2f18f8
30 changed files with 15887 additions and 10843 deletions

View File

@ -4,7 +4,7 @@ derived from his post: http://www.ping.net.au/20140126_cuSDR64src.tar.gz
This is originally cuSDR written by Hermann, DL3HVH
https://plus.google.com/107168125384405552048/posts
I added local sound and up'd the number of receivers to 16.
I added local sound and up'd the number of receivers to 20.
Using the Hermes-Lite (with some minor protocol changes)
I can do 16 rcvrs @ 96Khz and 9 @ 192Khz:
@ -17,3 +17,4 @@ the Hermes-Lite rtl supports.
I have only compiled and used this on linux.
To make for Hermes-Lite edit Makefile and add -DHL

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,3 @@
[General]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x1\0\0\0\0\0l\0\0\0\x64\0\0\x4\xfb\0\0\x3\x66\0\0\0v\0\0\0\x90\0\0\x4\xf1\0\0\x3\\\0\0\0\0\0\0)
windowState=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\x1\0\0\0\xf5\0\0\x2\x11\xfc\x2\0\0\0\x5\xfb\0\0\0\x12\0R\0\x61\0\x64\0i\0o\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\xfb\0\0\0\x14\0S\0\x65\0r\0v\0\x65\0r\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\xfb\0\0\0\x12\0H\0P\0S\0\x44\0R\0\x43\0t\0r\0l\x1\0\0\0\xa5\0\0\x2\x11\0\0\x2\x11\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0h\0i\0r\0p\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\xfb\0\0\0\x16\0\x44\0i\0s\0p\0l\0\x61\0y\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x30\0\xff\xff\xff\0\0\x3\x84\0\0\x2\x11\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x3\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x18\0\x44\0i\0s\0p\0l\0\x61\0y\0P\0\x61\0n\0\x65\0l\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x16\0M\0\x61\0i\0n\0\x42\0u\0t\0t\0o\0n\0s\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0)
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x2\0\0\0\0\x3\x97\0\0\0\x33\0\0\f(\0\0\x6\x1\0\0\x3\x97\0\0\0X\0\0\f(\0\0\x6\x1\0\0\0\0\0\0\0\0\xf\0)
windowState=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x1\0\0\0\x1\0\0\0\xf5\0\0\x4\xdc\xfc\x2\0\0\0\x5\xfb\0\0\0\x12\0R\0\x61\0\x64\0i\0o\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\xfb\0\0\0\x14\0S\0\x65\0r\0v\0\x65\0r\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\xfb\0\0\0\x12\0H\0P\0S\0\x44\0R\0\x43\0t\0r\0l\x1\0\0\0\xb3\0\0\x4\xdc\0\0\x4\xdc\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0h\0i\0r\0p\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\xfb\0\0\0\x16\0\x44\0i\0s\0p\0l\0\x61\0y\0\x43\0t\0r\0l\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x34\0\xff\xff\xff\0\0\a\x97\0\0\x4\xdc\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0U\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x18\0\x44\0i\0s\0p\0l\0\x61\0y\0P\0\x61\0n\0\x65\0l\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x2\0\0\0\x1\0\0\0\x16\0M\0\x61\0i\0n\0\x42\0u\0t\0t\0o\0n\0s\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0)

File diff suppressed because it is too large Load Diff

View File

@ -420,8 +420,10 @@ private:
unsigned short m_offset;
unsigned short m_length;
long m_sendSequence;
long m_oldSendSequence;
//RRK long m_sendSequence;
//RRK long m_oldSendSequence;
quint32 m_sendSequence;
quint32 m_oldSendSequence;
volatile bool m_stopped;

View File

@ -120,6 +120,7 @@ void DataIO::stop() {
io->networkIOMutex.unlock();
if(m_pSoundCardOut) {
SleeperThread::msleep(100);
m_pSoundCardOut->Stop();
delete m_pSoundCardOut;
}

View File

@ -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.";
}
}
}

View File

@ -58,6 +58,7 @@ public:
int findHPSDRDevices();
void clear();
void shutdownHPSDRDevice();
public slots:
void initHPSDRDevice();

View File

@ -321,7 +321,7 @@ void Receiver::dspProcessing() {
//io.mutex.unlock();
// spectrum
qtdsp->getSpectrum(newSpectrum, set->getFFTMultiplicator());
qtdsp->getSpectrum(newSpectrum, set->getFFTMultiplicator(m_receiver));
if (highResTimer->getElapsedTimeInMicroSec() >= getDisplayDelay()) {
emit spectrumBufferChanged(m_receiver, newSpectrum);

View File

@ -149,7 +149,7 @@ QAudioDeviceInfo DeviceInfo;
if (-1 == OutDevIndx) m_OutDeviceInfo = QAudioDeviceInfo::defaultOutputDevice();
else m_OutDeviceInfo = m_OutDevices.at(OutDevIndx);
#if 0 //RRK get a list of audio devices and the default
#if 1 //RRK get a list of audio devices and the default
foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) {
qDebug() << "l:" << deviceInfo.deviceName();
}

View File

@ -760,7 +760,7 @@ void QGLReceiverPanel::drawPanadapter() {
glEnd();
}
#if 0 // remove big red overload indicator
#if 0 //RRK remove big red overload indicator
if (m_adcStatus == 2) {
glBegin(GL_TRIANGLE_STRIP);
@ -1774,7 +1774,21 @@ void QGLReceiverPanel::drawVFOControl() {
}
// FFT size
if (m_receiver == 0) {
//if (m_receiver == 0) {
if (set->getFFTAutoStatus(m_receiver)) {
}
else {
str = "sample size: %1";
x1 = m_panRect.right() - m_fonts.smallFontMetrics->width(str) - 65;
if (m_dataEngineState == QSDR::DataEngineUp) {
qglColor(QColor(0, 0, 0, 255));
m_oglTextSmall->renderText(x1+3, y1, 0.0f, str.arg(m_sampleSize));
qglColor(QColor(255, 170, 90, 200));
m_oglTextSmall->renderText(x1+1, y1-2, 1.0f, str.arg(m_sampleSize));
}
str = "FFT: %1";
//float res;
@ -1797,6 +1811,10 @@ void QGLReceiverPanel::drawVFOControl() {
case 8:
s = "32k";
break;
case 16:
s = "64k";
break;
}
x1 = m_panRect.right() - m_fonts.smallFontMetrics->width(str) - 5;
@ -3766,15 +3784,18 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
deltaSampleSize = m_spectrumSize - m_sampleSize;
}
if (m_receiver == 0) {
if (set->getFFTAutoStatus(m_receiver)) {
}
else {
if (m_sampleSize < 2048) {
if (m_fftMult == 1) {
GRAPHICS_DEBUG << "set sample size to 8192";
set->setSampleSize(this, 0, 8192);
m_dBmPanLogGain += 6.0;
set->setSampleSize(this, m_receiver, 8192);
//m_dBmPanLogGain += 3.0103;
m_dBmPanLogGain += 6;
m_fftMult = 2;
return;
@ -3782,8 +3803,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
else if (m_fftMult == 2) {
GRAPHICS_DEBUG << "set sample size to 16384";
set->setSampleSize(this, 0, 16384);
m_dBmPanLogGain += 6.0;
set->setSampleSize(this, m_receiver, 16384);
//m_dBmPanLogGain += 3.0103;
m_dBmPanLogGain += 6;
m_fftMult = 4;
return;
@ -3791,10 +3813,21 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
else if (m_fftMult == 4) {
GRAPHICS_DEBUG << "set sample size to 32768";
set->setSampleSize(this, 0, 32768);
m_dBmPanLogGain += 6.0;
set->setSampleSize(this, m_receiver, 32768);
//m_dBmPanLogGain += 3.0103;
m_dBmPanLogGain += 6;
m_fftMult = 8;
return;
}
else if (m_fftMult == 8) {
GRAPHICS_DEBUG << "set sample size to 65536";
set->setSampleSize(this, m_receiver, 65536);
//m_dBmPanLogGain += 3.0103;
m_dBmPanLogGain += 6;
m_fftMult = 16;
return;
}
}
@ -3803,8 +3836,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
if (m_fftMult == 2) {
GRAPHICS_DEBUG << "set sample size to 4096";
set->setSampleSize(this, 0, 4096);
m_dBmPanLogGain -= 6.0;
set->setSampleSize(this, m_receiver, 4096);
//m_dBmPanLogGain -= 3.0103;
m_dBmPanLogGain -= 6;
m_fftMult = 1;
return;
@ -3812,8 +3846,9 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
else if (m_fftMult == 4) {
GRAPHICS_DEBUG << "set sample size to 8192";
set->setSampleSize(this, 0, 8192);
m_dBmPanLogGain -= 6.0;
set->setSampleSize(this, m_receiver, 8192);
//m_dBmPanLogGain -= 3.0103;
m_dBmPanLogGain -= 6;
m_fftMult = 2;
return;
@ -3821,10 +3856,21 @@ void QGLReceiverPanel::computeDisplayBins(QVector<float>& buffer, QVector<float>
else if (m_fftMult == 8) {
GRAPHICS_DEBUG << "set sample size to 16384";
set->setSampleSize(this, 0, 16384);
m_dBmPanLogGain -= 6.0;
set->setSampleSize(this, m_receiver, 16384);
//m_dBmPanLogGain -= 3.0103;
m_dBmPanLogGain -= 6;
m_fftMult = 4;
return;
}
else if (m_fftMult == 16) {
GRAPHICS_DEBUG << "set sample size to 32768";
set->setSampleSize(this, m_receiver, 32768);
//m_dBmPanLogGain -= 3.0103;
m_dBmPanLogGain -= 6;
m_fftMult = 8;
return;
}
}

View File

@ -123,7 +123,7 @@ void Demodulation::DoSAM(CPX &in, CPX &out ) {
if ((delay0.im) == 0.0 && (delay0.re == 0.0)) {
delay0.re = 0.000000000001;
delay0.re = 0.000000000001f;
}
difference = sqrt(in.at(i).re * in.at(i).re + in.at(i).im * in.at(i).im) * (qAtan2(delay0.im, delay0.re));
@ -139,10 +139,10 @@ void Demodulation::DoSAM(CPX &in, CPX &out ) {
m_phase += m_pll_frequency + m_alpha * difference;
while (m_phase >= TWOPI)
m_phase -= TWOPI;
m_phase -= (float)TWOPI;
while (m_phase < 0)
m_phase += TWOPI;
m_phase += (float)TWOPI;
m_lockcurrent = 0.999 * m_lockcurrent + 0.001 * qAbs(delay0.re);
m_lockprevious = m_lockcurrent;
@ -167,7 +167,7 @@ void Demodulation::DoFMN(CPX &in, CPX &out ) {
if ((delay0.im) == 0.0 && (delay0.re == 0.0)) {
delay0.re = 0.000000000001;
delay0.re = 0.000000000001f;
}
difference = qAtan2(delay0.im, delay0.re);
@ -181,9 +181,9 @@ void Demodulation::DoFMN(CPX &in, CPX &out ) {
m_phase += m_pll_frequency + m_alpha * difference;
while (m_phase >= TWOPI)
m_phase -= TWOPI;
m_phase -= (float)TWOPI;
while (m_phase < 0)
m_phase += TWOPI;
m_phase += (float)TWOPI;
m_afc = 0.99 * m_afc + 0.01 * m_pll_frequency;
out[i].re = (m_pll_frequency - m_afc) * m_cvt;

View File

@ -33,6 +33,11 @@
#include "qtdsp_dspEngine.h"
double myLog(double x, double base) {
return log(x) / log(base);
}
QDSPEngine::QDSPEngine(QObject *parent, int rx, int size)
: QObject(parent)
@ -41,18 +46,18 @@ QDSPEngine::QDSPEngine(QObject *parent, int rx, int size)
, m_rx(rx)
, m_size(size)
, m_samplerate(set->getSampleRate())
, m_fftMultiplcator(1)
, m_fftMultiplier(1)
, m_volume(0.0f)
{
qRegisterMetaType<QVector<cpx> >();
qRegisterMetaType<CPX>();
fft = new QFFT(m_size);
fft = new QFFT(m_size); // m_size = 1024
filter = new QFilter(this, m_size, 2, 12);//8);
wpagc = new QWPAGC(this, m_size);
spectrum = new PowerSpectrum(this, m_size*2);
//spectrum = new PowerSpectrum(this, m_size*2);
QString str = "Initializing DSP engine for rx %1: 8k FFT ...please wait";
/*QString str = "Initializing DSP engine for rx %1: 8k FFT ...please wait";
set->setSystemMessage(str.arg(m_rx), 0);
if (m_rx == 0) {
@ -66,6 +71,20 @@ QDSPEngine::QDSPEngine(QObject *parent, int rx, int size)
str = "Initializing DSP engine for rx %1: 32k FFT ...please wait";
set->setSystemMessage(str.arg(m_rx), 0);
spectrum8 = new PowerSpectrum(this, m_size*16);
str = "Initializing DSP engine for rx %1: 64k FFT ...please wait";
set->setSystemMessage(str.arg(m_rx), 0);
spectrum16 = new PowerSpectrum(this, m_size*32);
}*/
int factor = 2;
while (factor <= 128) {
PowerSpectrum* spec = new PowerSpectrum(this, m_size*factor);
powerSpectraList << spec;
factor *= 2;
}
m_spectrumSize = m_size*4;
@ -116,8 +135,13 @@ QDSPEngine::~QDSPEngine() {
if (wpagc)
delete wpagc;
if (spectrum)
delete spectrum;
//if (spectrum)
// delete spectrum;
if (!powerSpectraList.empty()) {
powerSpectraList.clear();
}
if (signalmeter)
delete signalmeter;
@ -175,7 +199,7 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) {
m_mutex.lock();
switch (m_fftMultiplcator) {
/*switch (m_fftMultiplcator) {
case 1:
spectrum->ProcessSpectrum(in, size*2, 1);
@ -192,7 +216,14 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) {
case 8:
spectrum8->ProcessSpectrum(in, size*16, 15);
break;
}
case 16:
spectrum16->ProcessSpectrum(in, size*32, 31);
break;
}*/
int idx = (int)(myLog(m_fftMultiplier, 2));
powerSpectraList.at(idx)->ProcessSpectrum(in, size * m_fftMultiplier * 2, m_fftMultiplier*2-1);
if (m_NcoFreq != 0)
ProcessFrequencyShift(in, in, size);
@ -214,36 +245,10 @@ void QDSPEngine::processDSP(CPX &in, CPX &out, int size) {
int QDSPEngine::getSpectrum(qVectorFloat &buffer, int mult) {
if (m_rx == 0) {
m_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;

View File

@ -72,9 +72,13 @@ public:
PowerSpectrum* spectrum2;
PowerSpectrum* spectrum4;
PowerSpectrum* spectrum8;
PowerSpectrum* spectrum16;
SignalMeter* signalmeter;
Demodulation* demod;
QList<PowerSpectrum* > powerSpectraList;
void processDSP(CPX &in, CPX &out, int size);
int getSpectrum(qVectorFloat &buffer, int mult);
@ -108,7 +112,7 @@ private:
int m_size;
int m_spectrumSize;
int m_samplerate;
int m_fftMultiplcator;
int m_fftMultiplier;
float m_volume;
qreal m_NcoFreq;

View File

@ -211,7 +211,7 @@ void QFilter::Normalize(CPX &in, CPX &out, int size) {
void QFilter::Decimate(CPX &in, CPX &out, int downrate) {
int newsize = qRound((float) m_size/downrate);
int newsize = qRound(qreal(m_size / downrate));
//memset(out, 0, newsize * sizeof(CPX));
//memset(tmp, 0, m_size * sizeof(CPX));

View File

@ -189,8 +189,8 @@ void QHPainter::drawShadowText (qreal x, qreal y,
shadowImage.shadowBlur(radius, shadowColor);
// Compose Text and Shadow
int addSizeX = (offset.x() > radius) ? (abs(offset.x()) - radius) : 0;
int addSizeY = (offset.y() > radius) ? (abs(offset.y()) - radius) : 0;
int addSizeX = (offset.x() > radius) ? (fabs(offset.x()) - radius) : 0;
int addSizeY = (offset.y() > radius) ? (fabs(offset.y()) - radius) : 0;
QSize finalSize = shadowImage.size() + QSize(addSizeX, addSizeY);
QPointF shadowTopLeft(QPointF((finalSize.width() - shadowImage.width()) / 2.0,

View File

@ -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

View File

@ -151,7 +151,7 @@ void AlexAntennaWidget::createAntennasGroup() {
// band label
QStringList bandNames;
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "gen";
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen";
QList<QLabel *> bandLabelList;

View File

@ -138,7 +138,7 @@ void ExtCtrlWidget::createReceivePinsGroup() {
// band label
QStringList bandNames;
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm";
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen";
QList<QLabel *> bandLabelList;
@ -212,7 +212,7 @@ void ExtCtrlWidget::createTransmitPinsGroup() {
// band label
QStringList bandNames;
bandNames << "2200 m" << "630 m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm";
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen";
QList<QLabel *> bandLabelList;

View File

@ -60,7 +60,11 @@ typedef enum _hamBand {
cm125, // 14
cm70, // 15
cm33, // 16
gen // 17
cm23, // 17
cm13, // 18
cm10, // 19
cm5, // 21
gen // 22
} HamBand;
@ -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;

View File

@ -107,6 +107,7 @@ public slots:
void suspendSignal(QObject *sender);
void startPlaybackSignal(QObject *sender);
void showSettingsDialogSignal(QObject *sender);
void showWarningDialog(const QString &msg);
private:
void setSystemState(
@ -333,7 +334,6 @@ private slots:
void showStatusBarMessage(const QString &msg, int time);
void clearStatusBarMessage();
void showNetworkIODialog();
void showWarningDialog(const QString &msg);
void addNetworkIOComboBoxEntry(QString str);
void clearNetworkIOComboBoxEntry();

View File

@ -117,6 +117,7 @@ RadioPopupWidget::RadioPopupWidget(QWidget *parent, int rx)
CHECKED_CONNECT(stickyBtn, SIGNAL(clicked()), this, SLOT(setSticky()));
createOptionsBtnGroup();
createFFTOptionsGroup();
createBandBtnGroup();
createModeBtnGroup();
createAgcBtnGroup();
@ -150,6 +151,8 @@ RadioPopupWidget::RadioPopupWidget(QWidget *parent, int rx)
mainLayout->addSpacing(16);
//mainLayout->addStretch();
mainLayout->addLayout(optionsVBox);
mainLayout->addSpacing(8);
mainLayout->addLayout(fftOptionsVBox);
mainLayout->addSpacing(16);
mainLayout->addLayout(bandVBox);
mainLayout->addSpacing(8);
@ -535,6 +538,62 @@ void RadioPopupWidget::createOptionsBtnGroup() {
optionsVBox->addLayout(hbox5);
}
void RadioPopupWidget::createFFTOptionsGroup() {
m_FFTAutoBtn = new AeroButton("Auto", this);
m_FFTAutoBtn->setRoundness(10);
m_FFTAutoBtn->setFont(m_fonts.smallFont);
m_4kFFTBtn = new AeroButton("FFT 4k", this);
m_4kFFTBtn->setRoundness(10);
m_4kFFTBtn->setFont(m_fonts.smallFont);
m_8kFFTBtn = new AeroButton("FFT 8k", this);
m_8kFFTBtn->setRoundness(10);
m_8kFFTBtn->setFont(m_fonts.smallFont);
m_16kFFTBtn = new AeroButton("FFT 16k", this);
m_16kFFTBtn->setRoundness(10);
m_16kFFTBtn->setFont(m_fonts.smallFont);
m_32kFFTBtn = new AeroButton("FFT 32k", this);
m_32kFFTBtn->setRoundness(10);
m_32kFFTBtn->setFont(m_fonts.smallFont);
m_64kFFTBtn = new AeroButton("FFT 64k", this);
m_64kFFTBtn->setRoundness(10);
m_64kFFTBtn->setFont(m_fonts.smallFont);
m_128kFFTBtn = new AeroButton("FFT 128k", this);
m_128kFFTBtn->setRoundness(10);
m_128kFFTBtn->setFont(m_fonts.smallFont);
m_256kFFTBtn = new AeroButton("FFT 256k", this);
m_256kFFTBtn->setRoundness(10);
m_256kFFTBtn->setFont(m_fonts.smallFont);
QHBoxLayout* hbox1 = new QHBoxLayout();
hbox1->setContentsMargins(0, 0, 0, 0);
hbox1->setSpacing(0);
hbox1->addWidget(m_FFTAutoBtn);
hbox1->addWidget(m_4kFFTBtn);
hbox1->addWidget(m_8kFFTBtn);
hbox1->addWidget(m_16kFFTBtn);
QHBoxLayout* hbox2 = new QHBoxLayout();
hbox2->setContentsMargins(0, 0, 0, 0);
hbox2->setSpacing(0);
hbox2->addWidget(m_32kFFTBtn);
hbox2->addWidget(m_64kFFTBtn);
hbox2->addWidget(m_128kFFTBtn);
hbox2->addWidget(m_256kFFTBtn);
fftOptionsVBox = new QVBoxLayout;
fftOptionsVBox->setSpacing(1);
fftOptionsVBox->addLayout(hbox1);
fftOptionsVBox->addLayout(hbox2);
}
void RadioPopupWidget::createBandBtnGroup() {
band2200mBtn = new AeroButton("2200m", this);
@ -605,6 +664,22 @@ void RadioPopupWidget::createBandBtnGroup() {
bandBtnList.append(band33cmBtn);
CHECKED_CONNECT(band33cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band23cmBtn = new AeroButton("23 cm", this);
bandBtnList.append(band23cmBtn);
CHECKED_CONNECT(band23cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band13cmBtn = new AeroButton("13 cm", this);
bandBtnList.append(band13cmBtn);
CHECKED_CONNECT(band13cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band10cmBtn = new AeroButton("10 cm", this);
bandBtnList.append(band10cmBtn);
CHECKED_CONNECT(band10cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band5cmBtn = new AeroButton("5 cm", this);
bandBtnList.append(band5cmBtn);
CHECKED_CONNECT(band5cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
bandGenBtn = new AeroButton("Gen", this);
bandBtnList.append(bandGenBtn);
CHECKED_CONNECT(bandGenBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
@ -637,22 +712,30 @@ void RadioPopupWidget::createBandBtnGroup() {
hbox2->addWidget(band12mBtn);
hbox2->addWidget(band10mBtn);
hbox2->addWidget(band6mBtn);
hbox2->addWidget(bandGenBtn);
hbox2->addWidget(band2mBtn);
QHBoxLayout *hbox3 = new QHBoxLayout();
hbox3->setContentsMargins(0, 0, 0, 0);
hbox3->setSpacing(0);
hbox3->addWidget(band2mBtn);
hbox3->addWidget(band125cmBtn);
hbox3->addWidget(band70cmBtn);
hbox3->addWidget(band12mBtn);
hbox3->addWidget(band33cmBtn);
hbox3->addWidget(band23cmBtn);
hbox3->addWidget(band13cmBtn);
hbox3->addWidget(band10cmBtn);
hbox3->addWidget(band5cmBtn);
QHBoxLayout *hbox4 = new QHBoxLayout();
hbox4->setContentsMargins(0, 0, 0, 0);
hbox4->setSpacing(0);
hbox4->addWidget(bandGenBtn);
bandVBox = new QVBoxLayout;
bandVBox->setSpacing(1);
bandVBox->addLayout(hbox1);
bandVBox->addLayout(hbox2);
bandVBox->addLayout(hbox3);
bandVBox->addLayout(hbox4);
}
@ -1198,6 +1281,18 @@ void RadioPopupWidget::bandChangedByBtn() {
if (str == "33 cm")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm33));
else
if (str == "23 cm")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm23));
else
if (str == "13 cm")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm13));
else
if (str == "10 cm")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm10));
else
if (str == "5 cm")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(cm5));
else
if (str == "Gen")
set->setVFOFrequency(this, 2, m_receiver, m_lastVfoFrequencyList.at(gen));
}

View File

@ -93,6 +93,7 @@ private:
WaterfallColorMode m_waterfallColorMode;
QVBoxLayout* optionsVBox;
QVBoxLayout* fftOptionsVBox;
QVBoxLayout* bandVBox;
QVBoxLayout* modeVBox;
QVBoxLayout* agcVBox;
@ -130,6 +131,15 @@ private:
AeroButton* m_WaterfallSimpleBtn;
AeroButton* m_WaterfallEnhancedBtn;
AeroButton* m_FFTAutoBtn;
AeroButton* m_4kFFTBtn;
AeroButton* m_8kFFTBtn;
AeroButton* m_16kFFTBtn;
AeroButton* m_32kFFTBtn;
AeroButton* m_64kFFTBtn;
AeroButton* m_128kFFTBtn;
AeroButton* m_256kFFTBtn;
AeroButton* band2200mBtn;
AeroButton* band630mBtn;
AeroButton* band160mBtn;
@ -147,6 +157,10 @@ private:
AeroButton* band125cmBtn;
AeroButton* band70cmBtn;
AeroButton* band33cmBtn;
AeroButton* band23cmBtn;
AeroButton* band13cmBtn;
AeroButton* band10cmBtn;
AeroButton* band5cmBtn;
AeroButton* bandGenBtn;
//AeroButton* bandxxBtn;
@ -272,6 +286,7 @@ private slots:
void setSticky();
void createOptionsBtnGroup();
void createFFTOptionsGroup();
void createBandBtnGroup();
void createModeBtnGroup();
void createAgcBtnGroup();

View File

@ -345,40 +345,60 @@ void RadioWidget::createBandBtnGroup() {
band2mBtn = new AeroButton("2 m", this);
band2mBtn->setRoundness(0);
//band6mBtn->setGlass(false);
band2mBtn->setFixedSize(btn_widths, btn_height);
band2mBtn->setStyleSheet(set->getMiniButtonStyle());
//band6mBtn->setTextColor(QColor(200, 200, 200));
bandBtnList.append(band2mBtn);
CHECKED_CONNECT(band2mBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band125cmBtn = new AeroButton("125 cm", this);
band125cmBtn->setRoundness(0);
//band6mBtn->setGlass(false);
band125cmBtn->setFixedSize(btn_widths, btn_height);
band125cmBtn->setStyleSheet(set->getMiniButtonStyle());
//band6mBtn->setTextColor(QColor(200, 200, 200));
bandBtnList.append(band125cmBtn);
CHECKED_CONNECT(band125cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band70cmBtn = new AeroButton("70 cm", this);
band70cmBtn->setRoundness(0);
//band6mBtn->setGlass(false);
band70cmBtn->setFixedSize(btn_widths, btn_height);
band70cmBtn->setStyleSheet(set->getMiniButtonStyle());
//band6mBtn->setTextColor(QColor(200, 200, 200));
bandBtnList.append(band70cmBtn);
CHECKED_CONNECT(band70cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band33cmBtn = new AeroButton("33 cm", this);
band33cmBtn->setRoundness(0);
//band6mBtn->setGlass(false);
band33cmBtn->setFixedSize(btn_widths, btn_height);
band33cmBtn->setStyleSheet(set->getMiniButtonStyle());
//band6mBtn->setTextColor(QColor(200, 200, 200));
bandBtnList.append(band33cmBtn);
CHECKED_CONNECT(band33cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band23cmBtn = new AeroButton("23 cm", this);
band23cmBtn->setRoundness(0);
band23cmBtn->setFixedSize(btn_widths, btn_height);
band23cmBtn->setStyleSheet(set->getMiniButtonStyle());
bandBtnList.append(band23cmBtn);
CHECKED_CONNECT(band23cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band13cmBtn = new AeroButton("13 cm", this);
band13cmBtn->setRoundness(0);
band13cmBtn->setFixedSize(btn_widths, btn_height);
band13cmBtn->setStyleSheet(set->getMiniButtonStyle());
bandBtnList.append(band13cmBtn);
CHECKED_CONNECT(band13cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band10cmBtn = new AeroButton("10 cm", this);
band10cmBtn->setRoundness(0);
band10cmBtn->setFixedSize(btn_widths, btn_height);
band10cmBtn->setStyleSheet(set->getMiniButtonStyle());
bandBtnList.append(band10cmBtn);
CHECKED_CONNECT(band10cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
band5cmBtn = new AeroButton("5 cm", this);
band5cmBtn->setRoundness(0);
band5cmBtn->setFixedSize(btn_widths, btn_height);
band5cmBtn->setStyleSheet(set->getMiniButtonStyle());
bandBtnList.append(band5cmBtn);
CHECKED_CONNECT(band5cmBtn, SIGNAL(clicked()), this, SLOT(bandChangedByBtn()));
bandGenBtn = new AeroButton("Gen", this);
bandGenBtn->setRoundness(0);
//bandGenBtn->setGlass(false);
@ -418,11 +438,15 @@ void RadioWidget::createBandBtnGroup() {
layout->addWidget(band12mBtn, 1, 4);
layout->addWidget(band10mBtn, 1, 5);
layout->addWidget(band6mBtn, 2, 0);
layout->addWidget(band2mBtn, 2, 0);
layout->addWidget(band125cmBtn, 2, 0);
layout->addWidget(band70cmBtn, 2, 0);
layout->addWidget(band33cmBtn, 2, 0);
layout->addWidget(bandGenBtn, 2, 1);
layout->addWidget(band2mBtn, 2, 1);
layout->addWidget(band125cmBtn, 2, 2);
layout->addWidget(band70cmBtn, 2, 3);
layout->addWidget(band33cmBtn, 2, 4);
layout->addWidget(band23cmBtn, 2, 5);
layout->addWidget(band13cmBtn, 3, 0);
layout->addWidget(band10cmBtn, 3, 1);
layout->addWidget(band5cmBtn, 3, 2);
layout->addWidget(bandGenBtn, 3, 3);
//layout->addWidget(bandxxBtn, 2, 3);
QHBoxLayout *hbox1 = new QHBoxLayout();
@ -1229,6 +1253,18 @@ void RadioWidget::bandChangedByBtn() {
if (str == "33 cm")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm33));
else
if (str == "23 cm")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm23));
else
if (str == "13 cm")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm13));
else
if (str == "10 cm")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm10));
else
if (str == "5 cm")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(cm5));
else
if (str == "Gen")
set->setVFOFrequency(this, 2, m_currentRx, m_lastVfoFrequencyList.at(gen));

View File

@ -89,6 +89,10 @@ private:
AeroButton *band125cmBtn;
AeroButton *band70cmBtn;
AeroButton *band33cmBtn;
AeroButton *band23cmBtn;
AeroButton *band13cmBtn;
AeroButton *band10cmBtn;
AeroButton *band5cmBtn;
AeroButton *bandGenBtn;
//AeroButton *bandxxBtn;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -133,7 +133,7 @@ void TransmitPAWidget::createGainGroup() {
// band label
QStringList bandNames;
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "gen";
bandNames << "2200m" << "630m" << "160 m" << "80 m" << "60 m" << "40 m" << "30 m" << "20 m" << "17 m" << "15 m" << "12 m" << "10 m" << "6 m" << "2 m" << "125 cm" << "70 cm" << "33 cm" << "23 cm" << "13 cm" << "10 cm" << "5 cm" << "gen";
QList<QLabel *> bandLabelList;

View File

@ -32,6 +32,9 @@
#include "Util/cusdr_cpuUsage.h"
#elif defined(Q_OS_LINUX)
#include "Util/cusdr_cpuUsage_unix.h"
#include <unistd.h>
#include <errno.h>
#define fopen_s(pFile,filename,mode) ((*(pFile))=fopen((filename), (mode)))==NULL
#endif
#include "fftw3.h"
@ -88,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();