Merge remote-tracking branch 'origin/master' into rigs

merge-requests/7/head
Elliott Liggett 2021-11-04 20:39:14 -07:00
commit c3bdcf2287
22 zmienionych plików z 387 dodań i 173 usunięć

6
.gitmodules vendored
Wyświetl plik

@ -1,6 +0,0 @@
[submodule "opus-tools"]
path = opus-tools
url = https://github.com/xiph/opus-tools.git
[submodule "rtaudio"]
path = rtaudio
url = https://github.com/thestk/rtaudio.git

BIN
.swp 100644

Plik binarny nie jest wyświetlany.

128
CHANGELOG
Wyświetl plik

@ -1,5 +1,133 @@
# CHANGELOG
- 20211022
Don't block until audio buffer has space
Bit of tidying
- 20211020
Tidy-up server shutdown
Trying to find cause of lockup when client disappears
- 20211006
Send TX/Freq changes multiple times with rigctld
bumped to 1.2d hopefully last testversion before 1.20
- 202109022
Remove duplicate setPriority()
Fix typo
Add keepalive for linux/mac pty
Fix alignment of rigname in taskbar
Only send RX antenna byte to rig when it has an RX antenna option in rigCaps
- 20210907
Make rigctld state work for USB connected rigs
- 20210831
added 25 kHz step for tuning
- 20210829
Experimental support for split mode in rigctld
Ignore control levels that we don't currently support
Add better detection of ci-v transceive disable
- 20210827
Add saving of meter2 state
- 20210823
Set audio thread priority in the correct place!
Now with dual meters for everyone!
- 20210820
Clear Center readout as well.
Fixed issue where the "none" selection didn't work quite right. Also
fixed the T/R meter switching to clear out invalid readings.
Set audio threads to be realtime priority
- 20210817
dual meter support/WHATSNEW
Current scale tic marks on both sides now!
More meter work, fixed some scales and added labels.
Better meter fonts
- 20210815
Fix for left over CIV client on server
Improve detection of unsupported codec.
- 20210814
Fix for Opus TX audio
txrate logging wrong
More warning removal!
More commenting in rigctld.h
Is this going to fix 8 bit audio?
Comment unused structs from rigctld
All audio codecs now work in both directions!
Update audiohandler.cpp
more 8bit fixes!
ulaw encoding test
8 bit encoding fix
Another issue with 8 bit audio
Try again to remove debugging!
Revert "Remove extra opus debugging" This reverts commit da53f5371bbeb35b10cbb831b83b74e1bdd771f9.
Remove extra opus debugging
Move opus init
Add some debugging for decoder
Use radio samplerate for opus
Remove big/little endian conversion
More Opus fixes
Update audiohandler.cpp
Try to fix Opus 2-channel
- 20210809
Add constants to make parsing (hopefully) easier

Wyświetl plik

@ -7,4 +7,13 @@ The following highlights are in this 1.x-release:
added "do not ask again" for switching off rig and exiting wfview
added opus as audio transport
dual meter support
rigctl basic split support
rigctl prevents switching off civ transceive
added 25 kHz step
as a temporary measure sending multiple TX/FREQ change commands to the rig
when we use rigctld.
people should use "fake it" in wsjtx as the split code is not reliable.
tidied up udp server function for better reliability

Wyświetl plik

@ -12,7 +12,7 @@ aboutbox::aboutbox(QWidget *parent) :
ui->logoBtn->setIcon(QIcon(":resources/wfview.png"));
ui->logoBtn->setStyleSheet("Text-align:left");
ui->topText->setText("wfview version 1.1");
ui->topText->setText("wfview version 1.2d");
QString head = QString("<html><head></head><body>");
QString copyright = QString("Copyright 2017-2021 Elliott H. Liggett, W6EL. All rights reserved. wfview source code is <a href=\"https://gitlab.com/eliggett/wfview/-/blob/master/LICENSE\">licensed</a> under the GNU GPLv3.");

Wyświetl plik

@ -451,13 +451,13 @@ qint64 audioHandler::writeData(const char* data, qint64 nBytes)
tempBuf.sent = tempBuf.sent + send;
}
else {
ringBuf->write(tempBuf);
/*
//ringBuf->write(tempBuf);
if (!ringBuf->try_write(tempBuf))
{
qDebug(logAudio()) << "outgoing audio buffer full!";
break;
} */
}
tempBuf.data.clear();
tempBuf.sent = 0;
}

Wyświetl plik

@ -48,13 +48,24 @@ meter::meter(QWidget *parent) : QWidget(parent)
}
void meter::setMeterType(meterKind type)
void meter::clearMeterOnPTTtoggle()
{
if(type == meterType)
return;
// When a meter changes type, such as the fixed S -- TxPo meter,
// there is automatic clearing. However, some meters do not switch on thier own,
// and thus we are providing this clearing method. We are careful
// not to clear meters that don't make sense to clear (such as Vd and Id)
meterType = type;
// clear average and peak vectors:
if( (meterType == meterALC) || (meterType == meterSWR)
|| (meterType == meterComp) || (meterType == meterTxMod)
|| (meterType == meterCenter ))
{
clearMeter();
}
}
void meter::clearMeter()
{
current = 0;
average = 0;
peak = 0;
@ -70,6 +81,16 @@ void meter::setMeterType(meterKind type)
update();
}
void meter::setMeterType(meterKind type)
{
if(type == meterType)
return;
meterType = type;
// clear average and peak vectors:
this->clearMeter();
}
meterKind meter::getMeterType()
{
return meterType;
@ -140,6 +161,9 @@ void meter::paintEvent(QPaintEvent *)
peakRedLevel = 100;
drawScaleComp(&painter);
break;
case meterNone:
return;
break;
default:
label = "DN";
peakRedLevel = 241;

Wyświetl plik

@ -24,6 +24,8 @@ public slots:
void updateDrawing(int num);
void setLevels(int current, int peak, int average);
void setLevel(int current);
void clearMeterOnPTTtoggle();
void clearMeter();
void setMeterType(meterKind type);
void setMeterShortString(QString);
QString getMeterShortString();
@ -47,8 +49,6 @@ private:
std::vector<unsigned char> avgLevels;
std::vector<unsigned char> peakLevels;
int peakRedLevel=0;
bool drawLabels = true;
int mXstart = 0; // Starting point for S=0.

@ -1 +0,0 @@
Subproject commit ae5d6d59e82ef40300a4dece7897499685f87184

Wyświetl plik

@ -8,6 +8,7 @@
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <errno.h>
#endif
// Copyright 2017-2021 Elliott H. Liggett & Phil Taylor
@ -72,6 +73,9 @@ void pttyHandler::openPort()
// we're good!
qInfo(logSerial()) << "Opened pseudoterminal, slave name :" << ptsname(ptfd);
// Open the slave device to keep alive.
ptKeepAlive = open(ptsname(ptfd), O_RDONLY);
ptReader = new QSocketNotifier(ptfd, QSocketNotifier::Read, this);
connect(ptReader, &QSocketNotifier::activated,
this, &pttyHandler::receiveDataIn);
@ -217,9 +221,8 @@ void pttyHandler::receiveDataIn(int fd) {
civId = (quint8)inPortData[lastFE + 2];
qInfo(logSerial()) << "pty remote CI-V changed:" << hex << (quint8)civId;
}
// filter 1A 05 01 12/27 = C-IV transceive command before forwarding on.
if (inPortData.contains(QByteArrayLiteral("\x1a\x05\x01\x12")) || inPortData.contains(QByteArrayLiteral("\x1a\x05\x01\x27")))
// filter C-IV transceive command before forwarding on.
if (inPortData.contains(rigCaps.transceiveCommand))
{
//qInfo(logSerial()) << "Filtered transceive command";
//printHex(inPortData, false, true);
@ -283,6 +286,10 @@ void pttyHandler::closePort()
{
QFile::remove(portName);
}
if (ptKeepAlive > 0) {
close(ptKeepAlive);
}
#endif
isConnected = false;
}
@ -330,4 +337,10 @@ void pttyHandler::printHex(const QByteArray& pdata, bool printVert, bool printHo
qDebug(logSerial()) << "----- End hex dump -----";
}
void pttyHandler::receiveFoundRigID(rigCapabilities rigCaps) {
this->rigCaps = rigCaps;
qInfo(logSerial) << "Received rigCapabilities for" << rigCaps.modelName;
}

Wyświetl plik

@ -9,6 +9,8 @@
#include <QSocketNotifier>
#include <QtSerialPort/QSerialPort>
#include "rigidentities.h"
// This class abstracts the comm port in a useful way and connects to
// the command creator and command parser.
@ -27,6 +29,7 @@ private slots:
void receiveDataIn(int fd); // from physical port
void receiveDataFromRigToPtty(const QByteArray& data);
void debugThis();
void receiveFoundRigID(rigCapabilities rigCaps);
signals:
void haveTextMessage(QString message); // status, debug only
@ -59,6 +62,7 @@ private:
bool rolledBack;
int ptfd; // pseudo-terminal file desc.
int ptKeepAlive=0; // Used to keep the pty alive after client disconects.
bool havePt;
QString ptDevSlave;
@ -66,8 +70,9 @@ private:
mutable QMutex mutex;
void printHex(const QByteArray& pdata, bool printVert, bool printHoriz);
bool disableTransceive = false;
QSocketNotifier *ptReader = nullptr;
QSocketNotifier *ptReader = Q_NULLPTR;
quint8 civId=0;
rigCapabilities rigCaps;
};
#endif // PTTYHANDLER_H

Wyświetl plik

@ -61,7 +61,6 @@ void rigCommander::commSetup(unsigned char rigCivAddr, QString rigSerialPort, qu
// data from the ptty to the rig:
connect(ptty, SIGNAL(haveDataFromPort(QByteArray)), comm, SLOT(receiveDataFromUserToRig(QByteArray)));
// data from the program to the comm port:
connect(this, SIGNAL(dataForComm(QByteArray)), comm, SLOT(receiveDataFromUserToRig(QByteArray)));
@ -73,7 +72,11 @@ void rigCommander::commSetup(unsigned char rigCivAddr, QString rigSerialPort, qu
connect(this, SIGNAL(getMoreDebug()), comm, SLOT(debugThis()));
connect(this, SIGNAL(getMoreDebug()), ptty, SLOT(debugThis()));
connect(this, SIGNAL(discoveredRigID(rigCapabilities)), ptty, SLOT(receiveFoundRigID(rigCapabilities)));
emit commReady();
sendState(); // Send current rig state to rigctld
}
@ -137,6 +140,8 @@ void rigCommander::commSetup(unsigned char rigCivAddr, udpPreferences prefs, aud
connect(ptty, SIGNAL(haveSerialPortError(QString, QString)), this, SLOT(handleSerialPortError(QString, QString)));
connect(this, SIGNAL(getMoreDebug()), ptty, SLOT(debugThis()));
connect(this, SIGNAL(discoveredRigID(rigCapabilities)), ptty, SLOT(receiveFoundRigID(rigCapabilities)));
emit haveAfGain(rxSetup.localAFgain);
}
@ -556,18 +561,24 @@ void rigCommander::getSpectrumMode()
prepDataAndSend(specModePayload);
}
void rigCommander::setFrequency(freqt freq)
void rigCommander::setFrequency(unsigned char vfo, freqt freq)
{
//QByteArray freqPayload = makeFreqPayload(freq);
QByteArray freqPayload = makeFreqPayload(freq);
QByteArray cmdPayload;
cmdPayload.append(freqPayload);
cmdPayload.prepend('\x00');
if (vfo == 0) {
rigState.vfoAFreq = freq;
cmdPayload.prepend('\x00');
}
else
{
rigState.vfoBFreq = freq;
cmdPayload.prepend(vfo);
cmdPayload.prepend('\x25');
}
//printHex(cmdPayload, false, true);
prepDataAndSend(cmdPayload);
rigState.vfoAFreq = freq;
}
QByteArray rigCommander::makeFreqPayload(freqt freq)
@ -1351,6 +1362,9 @@ void rigCommander::parseLevels()
emit haveSql(level);
rigState.squelch = level;
break;
case '\x09':
// CW Pitch - ignore for now
break;
case '\x0A':
// TX RF level
emit haveTxPower(level);
@ -1361,11 +1375,20 @@ void rigCommander::parseLevels()
emit haveMicGain(level);
rigState.micGain = level;
break;
case '\x0C':
// CW Keying Speed - ignore for now
break;
case '\x0D':
// Notch filder setting - ignore for now
break;
case '\x0E':
// compressor level
emit haveCompLevel(level);
rigState.compLevel = level;
break;
case '\x12':
// NB level - ignore for now
break;
case '\x15':
// monitor level
emit haveMonitorLevel(level);
@ -2883,6 +2906,8 @@ void rigCommander::determineRigCaps()
rigCaps.bands.push_back(band630m);
rigCaps.bands.push_back(band2200m);
rigCaps.modes = commonModes;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x71");
break;
case modelR8600:
rigCaps.modelName = QString("IC-R8600");
@ -2918,6 +2943,7 @@ void rigCommander::determineRigCaps()
createMode(modeNXDN_VN, 0x19, "NXDN-VN"), createMode(modeNXDN_N, 0x20, "NXDN-N"),
createMode(modeDCR, 0x21, "DCR")});
rigCaps.scopeCenterSpans.insert(rigCaps.scopeCenterSpans.end(), {createScopeCenter(cs1M, "±1M"), createScopeCenter(cs2p5M, "±2.5M")});
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x92");
break;
case model9700:
rigCaps.modelName = QString("IC-9700");
@ -2946,6 +2972,7 @@ void rigCommander::determineRigCaps()
rigCaps.modes = commonModes;
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeDV, 0x17, "DV"),
createMode(modeDD, 0x22, "DD")});
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x27");
break;
case model910h:
rigCaps.modelName = QString("IC-910H");
@ -2968,6 +2995,7 @@ void rigCommander::determineRigCaps()
rigCaps.bsr[band70cm] = 0x02;
rigCaps.bsr[band2m] = 0x01;
rigCaps.modes = commonModes;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x58");
break;
case model7600:
rigCaps.modelName = QString("IC-7600");
@ -2992,6 +3020,7 @@ void rigCommander::determineRigCaps()
rigCaps.modes = commonModes;
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modePSK, 0x12, "PSK"),
createMode(modePSK_R, 0x13, "PSK-R")});
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x97");
break;
case model7610:
rigCaps.modelName = QString("IC-7610");
@ -3023,6 +3052,7 @@ void rigCommander::determineRigCaps()
rigCaps.bands.push_back(band2200m);
rigCaps.modes = commonModes;
rigCaps.hasRXAntenna = true;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x12");
break;
case model7850:
rigCaps.modelName = QString("IC-785x");
@ -3055,6 +3085,7 @@ void rigCommander::determineRigCaps()
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modePSK, 0x12, "PSK"),
createMode(modePSK_R, 0x13, "PSK-R")});
rigCaps.hasRXAntenna = true;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x55");
break;
case model705:
rigCaps.modelName = QString("IC-705");
@ -3091,6 +3122,7 @@ void rigCommander::determineRigCaps()
rigCaps.modes = commonModes;
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeWFM, 0x06, "WFM"),
createMode(modeDV, 0x17, "DV")});
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x31");
break;
case model7000:
rigCaps.modelName = QString("IC-7000");
@ -3113,6 +3145,7 @@ void rigCommander::determineRigCaps()
rigCaps.bsr[band70cm] = 0x12;
rigCaps.bsr[bandGen] = 0x13;
rigCaps.modes = commonModes;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x92");
break;
case model7410:
rigCaps.modelName = QString("IC-7410");
@ -3134,6 +3167,7 @@ void rigCommander::determineRigCaps()
rigCaps.bands.push_back(bandGen);
rigCaps.bsr[bandGen] = 0x11;
rigCaps.modes = commonModes;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x40");
break;
case model7100:
rigCaps.modelName = QString("IC-7100");
@ -3161,6 +3195,7 @@ void rigCommander::determineRigCaps()
rigCaps.modes = commonModes;
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeWFM, 0x06, "WFM"),
createMode(modeDV, 0x17, "DV")});
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95");
break;
case model7200:
rigCaps.modelName = QString("IC-7200");
@ -3181,7 +3216,8 @@ void rigCommander::determineRigCaps()
rigCaps.bands.push_back(bandGen);
rigCaps.bsr[bandGen] = 0x11;
rigCaps.modes = commonModes;
break;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x03\x48");
break;
case model7700:
rigCaps.modelName = QString("IC-7700");
rigCaps.rigctlModel = 3062;
@ -3207,6 +3243,7 @@ void rigCommander::determineRigCaps()
rigCaps.modes = commonModes;
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modePSK, 0x12, "PSK"),
createMode(modePSK_R, 0x13, "PSK-R")});
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95");
break;
case model706:
rigCaps.modelName = QString("IC-706");
@ -3226,6 +3263,7 @@ void rigCommander::determineRigCaps()
rigCaps.bands.push_back(bandGen);
rigCaps.modes = commonModes;
rigCaps.modes.insert(rigCaps.modes.end(), createMode(modeWFM, 0x06, "WFM"));
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
break;
case model718:
rigCaps.modelName = QString("IC-718");
@ -3249,6 +3287,7 @@ void rigCommander::determineRigCaps()
createMode(modeCW, 0x03, "CW"), createMode(modeCW_R, 0x07, "CW-R"),
createMode(modeRTTY, 0x04, "RTTY"), createMode(modeRTTY_R, 0x08, "RTTY-R")
};
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
break;
case model736:
rigCaps.modelName = QString("IC-736");
@ -3288,6 +3327,7 @@ void rigCommander::determineRigCaps()
rigCaps.bands.push_back(bandGen);
rigCaps.bsr[bandGen] = 0x11;
rigCaps.modes = commonModes;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
break;
case model756proii:
rigCaps.modelName = QString("IC-756 Pro II");
@ -3307,6 +3347,7 @@ void rigCommander::determineRigCaps()
rigCaps.bands.push_back(bandGen);
rigCaps.bsr[bandGen] = 0x11;
rigCaps.modes = commonModes;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
break;
case model756proiii:
rigCaps.modelName = QString("IC-756 Pro III");
@ -3326,6 +3367,7 @@ void rigCommander::determineRigCaps()
rigCaps.bands.push_back(bandGen);
rigCaps.bsr[bandGen] = 0x11;
rigCaps.modes = commonModes;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
break;
case model9100:
rigCaps.modelName = QString("IC-9100");
@ -3374,6 +3416,7 @@ void rigCommander::determineRigCaps()
rigCaps.bands.insert(rigCaps.bands.end(), standardVU.begin(), standardVU.end());
rigCaps.bands.insert(rigCaps.bands.end(), {band23cm, band4m, band630m, band2200m, bandGen});
rigCaps.modes = commonModes;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
qInfo(logRig()) << "Found unknown rig: 0x" << QString("%1").arg(rigCaps.modelID, 2, 16);
break;
}
@ -3809,7 +3852,9 @@ void rigCommander::setAntenna(unsigned char ant, bool rx)
{
QByteArray payload("\x12");
payload.append(ant);
payload.append((unsigned char)rx); // 0x00 = use for TX and RX
if (rigCaps.hasRXAntenna) {
payload.append((unsigned char)rx); // 0x00 = use for TX and RX
}
prepDataAndSend(payload);
}

Wyświetl plik

@ -171,7 +171,7 @@ public slots:
void getScopeMode();
// Frequency, Mode, BSR:
void setFrequency(freqt freq);
void setFrequency(unsigned char vfo, freqt freq);
void getFrequency();
void setMode(unsigned char mode, unsigned char modeFilter);
void setMode(mode_info);

Wyświetl plik

@ -55,10 +55,11 @@ rigCtlD::~rigCtlD()
qInfo(logRigCtlD()) << "closing rigctld";
}
void rigCtlD::receiveFrequency(freqt freq)
{
emit setFrequency(freq);
}
//void rigCtlD::receiveFrequency(freqt freq)
//{
// emit setFrequency(0, freq);
// emit setFrequency(0, freq);
//}
void rigCtlD::receiveStateInfo(rigStateStruct* state)
{
@ -287,7 +288,7 @@ void rigCtlClient::socketReadyRead()
freqt freq;
bool ok=false;
double newFreq=0.0f;
QString vfo = "VFOA";
unsigned char vfo=0;
if (command.length() == 2)
{
newFreq = command[1].toDouble(&ok);
@ -295,13 +296,20 @@ void rigCtlClient::socketReadyRead()
else if (command.length() == 3) // Includes VFO
{
newFreq = command[2].toDouble(&ok);
vfo = command[1];
if (command[1] == "VFOB")
{
vfo = 1;
}
}
if (ok) {
freq.Hz = static_cast<int>(newFreq);
qDebug(logRigCtlD()) << QString("Set frequency: %1 (%2)").arg(freq.Hz).arg(command[1]);
emit parent->setFrequency(freq);
emit parent->setFrequency(vfo, freq);
emit parent->setFrequency(vfo, freq);
emit parent->setFrequency(vfo, freq);
emit parent->setFrequency(vfo, freq);
emit parent->setFrequency(vfo, freq);
}
}
else if (command[0] == "1" || command[0] == "dump_caps")
@ -343,12 +351,11 @@ void rigCtlClient::socketReadyRead()
{
setCommand = true;
if (rigCaps.hasPTTCommand) {
if (command[1] == "0") {
emit parent->setPTT(false);
}
else {
emit parent->setPTT(true);
}
emit parent->setPTT(bool(command[1].toInt()));
emit parent->setPTT(bool(command[1].toInt()));
emit parent->setPTT(bool(command[1].toInt()));
emit parent->setPTT(bool(command[1].toInt()));
emit parent->setPTT(bool(command[1].toInt()));
}
else
{
@ -465,21 +472,50 @@ void rigCtlClient::socketReadyRead()
}
response.append(resp);
}
else if (command[0] == "I" || command[0] == "set_split_freq")
else if (command.length() > 1 && (command[0] == "I" || command[0] == "set_split_freq"))
{
setCommand = true;
freqt freq;
bool ok = false;
double newFreq = 0.0f;
newFreq = command[1].toDouble(&ok);
if (ok) {
freq.Hz = static_cast<int>(newFreq);
qDebug(logRigCtlD()) << QString("set_split_freq: %1 (%2)").arg(freq.Hz).arg(command[1]);
emit parent->setFrequency(1, freq);
emit parent->setFrequency(1, freq);
emit parent->setFrequency(1, freq);
emit parent->setFrequency(1, freq);
emit parent->setFrequency(1, freq);
}
}
else if (command[0] == "m" || command[0] == "get_mode")
else if (command.length() > 2 && (command[0] == "X" || command[0] == "set_split_mode"))
{
setCommand = true;
}
else if (command.length() > 0 && (command[0] == "x" || command[0] == "get_split_mode"))
{
if (longReply) {
response.append(QString("Mode: %1").arg(getMode(rigState->mode, rigState->datamode)));
response.append(QString("Passband: %1").arg(getFilter(rigState->mode, rigState->filter)));
response.append(QString("TX Mode: %1").arg(getMode(rigState->mode, rigState->datamode)));
response.append(QString("TX Passband: %1").arg(getFilter(rigState->mode, rigState->filter)));
}
else {
response.append(QString("%1").arg(getMode(rigState->mode, rigState->datamode)));
response.append(QString("%1").arg(getFilter(rigState->mode, rigState->filter)));
}
}
else if (command[0] == "m" || command[0] == "get_mode")
{
if (longReply) {
response.append(QString("Mode: %1").arg(getMode(rigState->mode, rigState->datamode)));
response.append(QString("Passband: %1").arg(getFilter(rigState->mode, rigState->filter)));
}
else {
response.append(QString("%1").arg(getMode(rigState->mode, rigState->datamode)));
response.append(QString("%1").arg(getFilter(rigState->mode, rigState->filter)));
}
}
else if (command[0] == "M" || command[0] == "set_mode")
{
// Set mode
@ -506,21 +542,23 @@ void rigCtlClient::socketReadyRead()
emit parent->setMode(getMode(mode), width);
if (mode.mid(0, 3) == "PKT") {
emit parent->setDataMode(true, width);
emit parent->setDataMode(true, width);
}
else {
emit parent->setDataMode(false, width);
emit parent->setDataMode(false, width);
}
}
else if (command[0] == "s" || command[0] == "get_split_vfo")
{
if (longReply) {
response.append(QString("Split: 0"));
response.append(QString("TX VFO: VFOA"));
response.append(QString("Split: 1"));
response.append(QString("TX VFO: VFOB"));
}
else
{
response.append("0");
response.append("VFOA");
response.append("1");
response.append("VFOb");
}
}
@ -973,8 +1011,8 @@ void rigCtlClient::socketReadyRead()
}
else if (command.length() > 1 && (command[0] == 0x87 || command[0] == "set_powerstat"))
{
setCommand = true;
if (command[1] == "0")
setCommand = true;
if (command[1] == "0")
{
emit parent->sendPowerOff();
}
@ -1370,4 +1408,4 @@ int rigCtlClient::getCalibratedValue(unsigned char meter,cal_table_t cal) {
/ (cal.table[i].raw - cal.table[i - 1].raw);
return cal.table[i].val - interp;
}
}

Wyświetl plik

@ -336,7 +336,7 @@ signals:
void onStarted();
void onStopped();
void sendData(QString data);
void setFrequency(freqt freq);
void setFrequency(unsigned char vfo, freqt freq);
void setPTT(bool state);
void setMode(unsigned char mode, unsigned char modeFilter);
void setDataMode(bool dataOn, unsigned char modeFilter);
@ -369,7 +369,7 @@ public slots:
virtual void incomingConnection(qintptr socketDescriptor);
void receiveRigCaps(rigCapabilities caps);
void receiveStateInfo(rigStateStruct* state);
void receiveFrequency(freqt freq);
// void receiveFrequency(freqt freq);
private:
rigStateStruct* rigState = Q_NULLPTR;

Wyświetl plik

@ -133,6 +133,8 @@ struct rigCapabilities {
unsigned char bsr[20] = {0};
std::vector <mode_info> modes;
QByteArray transceiveCommand;
};

@ -1 +0,0 @@
Subproject commit c9bf99d414cf81d19ef0ddd00212a4a58ccd99c6

Wyświetl plik

@ -735,7 +735,7 @@ udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 audioPort, audio
rxaudio->moveToThread(rxAudioThread);
rxAudioThread->start();
rxAudioThread->start(QThread::TimeCriticalPriority);
connect(this, SIGNAL(setupRxAudio(audioSetup)), rxaudio, SLOT(init(audioSetup)));
@ -752,8 +752,8 @@ udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 audioPort, audio
txaudio->moveToThread(txAudioThread);
txAudioThread->start();
txAudioThread->start(QThread::TimeCriticalPriority);
connect(this, SIGNAL(setupTxAudio(audioSetup)), txaudio, SLOT(init(audioSetup)));
connect(txAudioThread, SIGNAL(finished()), txaudio, SLOT(deleteLater()));

Wyświetl plik

@ -67,81 +67,22 @@ udpServer::~udpServer()
{
qInfo(logUdpServer()) << "Closing udpServer";
connMutex.lock();
foreach(CLIENT * client, controlClients)
{
if (client->idleTimer != Q_NULLPTR)
{
client->idleTimer->stop();
delete client->idleTimer;
}
if (client->pingTimer != Q_NULLPTR) {
client->pingTimer->stop();
delete client->pingTimer;
}
deleteConnection(&controlClients, client);
if (client->retransmitTimer != Q_NULLPTR) {
client->retransmitTimer->stop();
delete client->retransmitTimer;
}
delete client;
controlClients.removeAll(client);
}
foreach(CLIENT * client, civClients)
{
if (client->idleTimer != Q_NULLPTR)
{
client->idleTimer->stop();
delete client->idleTimer;
}
if (client->pingTimer != Q_NULLPTR) {
client->pingTimer->stop();
delete client->pingTimer;
}
if (client->retransmitTimer != Q_NULLPTR) {
client->retransmitTimer->stop();
delete client->retransmitTimer;
}
delete client;
civClients.removeAll(client);
deleteConnection(&civClients, client);
}
foreach(CLIENT * client, audioClients)
{
if (client->idleTimer != Q_NULLPTR)
{
client->idleTimer->stop();
delete client->idleTimer;
}
if (client->pingTimer != Q_NULLPTR) {
client->pingTimer->stop();
delete client->pingTimer;
}
if (client->retransmitTimer != Q_NULLPTR) {
client->retransmitTimer->stop();
delete client->retransmitTimer;
}
delete client;
audioClients.removeAll(client);
}
if (rxAudioTimer != Q_NULLPTR) {
rxAudioTimer->stop();
delete rxAudioTimer;
rxAudioTimer = Q_NULLPTR;
}
if (rxAudioThread != Q_NULLPTR) {
rxAudioThread->quit();
rxAudioThread->wait();
}
if (txAudioThread != Q_NULLPTR) {
txAudioThread->quit();
txAudioThread->wait();
deleteConnection(&audioClients, client);
}
// Now all connections are deleted, close and delete the sockets.
if (udpControl != Q_NULLPTR) {
udpControl->close();
delete udpControl;
@ -154,10 +95,6 @@ udpServer::~udpServer()
udpAudio->close();
delete udpAudio;
}
connMutex.unlock();
}
@ -335,13 +272,11 @@ void udpServer::controlReceived()
if (current->isAuthenticated) {
qInfo(logUdpServer()) << current->ipAddress.toString() << ": User " << current->user.username << " login OK";
sendLoginResponse(current, true);
}
else {
qInfo(logUdpServer()) << current->ipAddress.toString() << ": Incorrect username/password";
sendLoginResponse(current, false);
}
sendLoginResponse(current, current->isAuthenticated);
break;
}
case (CONNINFO_SIZE):
@ -382,9 +317,10 @@ void udpServer::controlReceived()
txaudio = new audioHandler();
txAudioThread = new QThread(this);
txaudio->moveToThread(txAudioThread);
txAudioThread->start();
txAudioThread->start(QThread::TimeCriticalPriority);
connect(this, SIGNAL(setupTxAudio(audioSetup)), txaudio, SLOT(init(audioSetup)));
connect(txAudioThread, SIGNAL(finished()), txaudio, SLOT(deleteLater()));
@ -401,9 +337,12 @@ void udpServer::controlReceived()
inAudio.samplerate = current->rxSampleRate;
rxaudio = new audioHandler();
rxAudioThread = new QThread(this);
rxaudio->moveToThread(rxAudioThread);
rxAudioThread->start();
rxaudio->moveToThread(rxAudioThread);
rxAudioThread->start(QThread::TimeCriticalPriority);
connect(this, SIGNAL(setupRxAudio(audioSetup)), rxaudio, SLOT(init(audioSetup)));
connect(rxAudioThread, SIGNAL(finished()), rxaudio, SLOT(deleteLater()));
@ -1515,7 +1454,6 @@ void udpServer::sendRetransmitRequest(CLIENT* c)
it.value()++;
}
}
c->missMutex.unlock();
if (missingSeqs.length() != 0)
{
@ -1544,6 +1482,7 @@ void udpServer::sendRetransmitRequest(CLIENT* c)
udpMutex.unlock();
}
}
c->missMutex.unlock();
}

Wyświetl plik

@ -273,7 +273,7 @@ void wfmain::rigConnections()
connect(this, SIGNAL(setScopeMode(spectrumMode)), rig, SLOT(setSpectrumMode(spectrumMode)));
connect(this, SIGNAL(getScopeMode()), rig, SLOT(getScopeMode()));
connect(this, SIGNAL(setFrequency(freqt)), rig, SLOT(setFrequency(freqt)));
connect(this, SIGNAL(setFrequency(unsigned char, freqt)), rig, SLOT(setFrequency(unsigned char, freqt)));
connect(this, SIGNAL(setScopeEdge(char)), rig, SLOT(setScopeEdge(char)));
connect(this, SIGNAL(setScopeSpan(char)), rig, SLOT(setScopeSpan(char)));
//connect(this, SIGNAL(getScopeMode()), rig, SLOT(getScopeMode()));
@ -400,7 +400,7 @@ void wfmain::makeRig()
if (rigCtl != Q_NULLPTR) {
connect(rig, SIGNAL(stateInfo(rigStateStruct*)), rigCtl, SLOT(receiveStateInfo(rigStateStruct*)));
connect(this, SIGNAL(requestRigState()), rig, SLOT(sendState()));
connect(rigCtl, SIGNAL(setFrequency(freqt)), rig, SLOT(setFrequency(freqt)));
connect(rigCtl, SIGNAL(setFrequency(unsigned char, freqt)), rig, SLOT(setFrequency(unsigned char, freqt)));
connect(rigCtl, SIGNAL(setMode(unsigned char, unsigned char)), rig, SLOT(setMode(unsigned char, unsigned char)));
connect(rigCtl, SIGNAL(setDataMode(bool, unsigned char)), rig, SLOT(setDataMode(bool, unsigned char)));
connect(rigCtl, SIGNAL(setPTT(bool)), rig, SLOT(setPTT(bool)));
@ -654,6 +654,7 @@ void wfmain::setupMainUI()
ui->tuningStepCombo->addItem("9 kHz", (unsigned int) 9000); // European medium wave stepsize
ui->tuningStepCombo->addItem("10 kHz", (unsigned int) 10000);
ui->tuningStepCombo->addItem("12.5 kHz", (unsigned int) 12500);
ui->tuningStepCombo->addItem("25 kHz", (unsigned int) 25000);
ui->tuningStepCombo->addItem("100 kHz", (unsigned int) 100000);
ui->tuningStepCombo->addItem("250 kHz", (unsigned int) 250000);
ui->tuningStepCombo->addItem("1 MHz", (unsigned int) 1000000); //for 23 cm and HF
@ -684,14 +685,11 @@ void wfmain::setupMainUI()
ui->meter2selectionCombo->addItem("Center", meterCenter);
ui->meter2Widget->hide();
#ifdef QT_DEBUG
// Experimental feature:
ui->meter2selectionCombo->show();
ui->meter2selectionCombo->setCurrentIndex((int)prefs.meter2Type);
ui->secondaryMeterSelectionLabel->show();
#else
ui->meter2selectionCombo->hide();
ui->secondaryMeterSelectionLabel->hide();
#endif
// Future ideas:
//ui->meter2selectionCombo->addItem("Transmit Audio", meterTxMod);
@ -754,9 +752,10 @@ void wfmain::setupMainUI()
ui->statusBar->addPermanentWidget(connectedLed);
rigName = new QLabel(this);
rigName->setAlignment(Qt::AlignRight);
ui->statusBar->addPermanentWidget(rigName);
rigName->setText("NONE");
rigName->setFixedWidth(50);
rigName->setFixedWidth(60);
freq.MHzDouble = 0.0;
freq.Hz = 0;
@ -1241,6 +1240,7 @@ void wfmain::setDefPrefs()
defPrefs.wftheme = static_cast<int>(QCPColorGradient::gpJet);
defPrefs.confirmExit = true;
defPrefs.confirmPowerOff = true;
defPrefs.meter2Type = meterNone;
udpDefPrefs.ipAddress = QString("");
udpDefPrefs.controlLANPort = 50001;
@ -1274,7 +1274,7 @@ void wfmain::loadSettings()
setWindowState(Qt::WindowActive); // Works around QT bug to returns window+keyboard focus.
prefs.confirmExit = settings->value("ConfirmExit", defPrefs.confirmExit).toBool();
prefs.confirmPowerOff = settings->value("ConfirmPowerOff", defPrefs.confirmPowerOff).toBool();
prefs.meter2Type = static_cast<meterKind>(settings->value("Meter2Type", defPrefs.meter2Type).toInt());
settings->endGroup();
// Load color schemes:
@ -1575,6 +1575,7 @@ void wfmain::saveSettings()
settings->setValue("WFLength", prefs.wflength);
settings->setValue("ConfirmExit", prefs.confirmExit);
settings->setValue("ConfirmPowerOff", prefs.confirmPowerOff);
settings->setValue("Meter2Type", (int)prefs.meter2Type);
settings->endGroup();
// Radio and Comms: C-IV addr, port to use
@ -2012,7 +2013,7 @@ void wfmain::shortcutMinus()
f.MHzDouble = f.Hz / (double)1E6;
setUIFreq();
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmd(cmdSetFreq, f);
issueDelayedCommandUnique(cmdGetFreq);
}
@ -2026,7 +2027,7 @@ void wfmain::shortcutPlus()
f.MHzDouble = f.Hz / (double)1E6;
setUIFreq();
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmd(cmdSetFreq, f);
issueDelayedCommandUnique(cmdGetFreq);
}
@ -2040,7 +2041,7 @@ void wfmain::shortcutShiftMinus()
f.MHzDouble = f.Hz / (double)1E6;
setUIFreq();
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmd(cmdSetFreq, f);
issueDelayedCommandUnique(cmdGetFreq);
}
@ -2054,7 +2055,7 @@ void wfmain::shortcutShiftPlus()
f.MHzDouble = f.Hz / (double)1E6;
setUIFreq();
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmd(cmdSetFreq, f);
issueDelayedCommandUnique(cmdGetFreq);
}
@ -2068,7 +2069,7 @@ void wfmain::shortcutControlMinus()
f.MHzDouble = f.Hz / (double)1E6;
setUIFreq();
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmd(cmdSetFreq, f);
issueDelayedCommandUnique(cmdGetFreq);
}
@ -2082,7 +2083,7 @@ void wfmain::shortcutControlPlus()
f.MHzDouble = f.Hz / (double)1E6;
setUIFreq();
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmd(cmdSetFreq, f);
issueDelayedCommandUnique(cmdGetFreq);
}
@ -2096,7 +2097,7 @@ void wfmain::shortcutPageUp()
f.MHzDouble = f.Hz / (double)1E6;
setUIFreq();
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmd(cmdSetFreq, f);
issueDelayedCommandUnique(cmdGetFreq);
}
@ -2110,7 +2111,7 @@ void wfmain::shortcutPageDown()
f.MHzDouble = f.Hz / (double)1E6;
setUIFreq();
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmd(cmdSetFreq, f);
issueDelayedCommandUnique(cmdGetFreq);
}
@ -2351,7 +2352,7 @@ void wfmain::doCmd(commandtype cmddata)
{
lastFreqCmdTime_ms = QDateTime::currentMSecsSinceEpoch();
freqt f = (*std::static_pointer_cast<freqt>(data));
emit setFrequency(f);
emit setFrequency(0,f);
break;
}
case cmdSetMode:
@ -2407,6 +2408,7 @@ void wfmain::doCmd(commandtype cmddata)
{
bool pttrequest = (*std::static_pointer_cast<bool>(data));
emit setPTT(pttrequest);
ui->meter2Widget->clearMeterOnPTTtoggle();
if(pttrequest)
{
ui->meterSPoWidget->setMeterType(meterPower);
@ -3007,6 +3009,18 @@ void wfmain::receiveRigID(rigCapabilities rigCaps)
// recalculate command timing now that we know the rig better:
calculateTimingParameters();
initPeriodicCommands();
// Set the second meter here as I suspect we need to be connected for it to work?
for (int i = 0; i < ui->meter2selectionCombo->count(); i++)
{
if (static_cast<meterKind>(ui->meter2selectionCombo->itemData(i).toInt()) == prefs.meter2Type)
{
// I thought that setCurrentIndex() would call the activated() function for the combobox
// but it doesn't, so call it manually.
ui->meter2selectionCombo->setCurrentIndex(i);
on_meter2selectionCombo_activated(i);
}
}
}
}
@ -3029,6 +3043,7 @@ void wfmain::initPeriodicCommands()
if (rigCaps.hasRXAntenna) {
insertSlowPeriodicCommand(cmdGetAntenna, 128);
}
insertSlowPeriodicCommand(cmdGetDuplexMode, 128);
}
void wfmain::insertPeriodicCommand(cmds cmd, unsigned char priority)
@ -3222,9 +3237,9 @@ void wfmain::receiveSpectrumData(QByteArray spectrum, double startFreq, double e
void wfmain::receiveSpectrumMode(spectrumMode spectMode)
{
for(int i=0; i < ui->spectrumModeCombo->count(); i++)
for (int i = 0; i < ui->spectrumModeCombo->count(); i++)
{
if(static_cast<spectrumMode>(ui->spectrumModeCombo->itemData(i).toInt()) == spectMode)
if (static_cast<spectrumMode>(ui->spectrumModeCombo->itemData(i).toInt()) == spectMode)
{
ui->spectrumModeCombo->blockSignals(true);
ui->spectrumModeCombo->setCurrentIndex(i);
@ -3249,7 +3264,7 @@ void wfmain::handlePlotDoubleClick(QMouseEvent *me)
freqGo.Hz = roundFrequency(freqGo.Hz, tsWfScrollHz);
freqGo.MHzDouble = (float)freqGo.Hz / 1E6;
//emit setFrequency(freq);
//emit setFrequency(0,freq);
issueCmd(cmdSetFreq, freqGo);
freq = freqGo;
setUIFreq();
@ -3274,7 +3289,7 @@ void wfmain::handleWFDoubleClick(QMouseEvent *me)
freqGo.Hz = roundFrequency(freqGo.Hz, tsWfScrollHz);
freqGo.MHzDouble = (float)freqGo.Hz / 1E6;
//emit setFrequency(freq);
//emit setFrequency(0,freq);
issueCmd(cmdSetFreq, freqGo);
freq = freqGo;
setUIFreq();
@ -3329,7 +3344,7 @@ void wfmain::handleWFScroll(QWheelEvent *we)
f.MHzDouble = f.Hz / (double)1E6;
freq = f;
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmdUniquePriority(cmdSetFreq, f);
ui->freqLabel->setText(QString("%1").arg(f.MHzDouble, 0, 'f'));
//issueDelayedCommandUnique(cmdGetFreq);
@ -3746,7 +3761,7 @@ void wfmain::on_freqDial_valueChanged(int value)
ui->freqLabel->setText(QString("%1").arg(f.MHzDouble, 0, 'f'));
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmdUniquePriority(cmdSetFreq, f);
} else {
ui->freqDial->blockSignals(true);
@ -3761,7 +3776,7 @@ void wfmain::receiveBandStackReg(freqt freqGo, char mode, char filter, bool data
// read the band stack and apply by sending out commands
qInfo(logSystem()) << __func__ << "BSR received into main: Freq: " << freqGo.Hz << ", mode: " << (unsigned int)mode << ", filter: " << (unsigned int)filter << ", data mode: " << dataOn;
//emit setFrequency(freq);
//emit setFrequency(0,freq);
issueCmd(cmdSetFreq, freqGo);
setModeVal = (unsigned char) mode;
setFilterVal = (unsigned char) filter;
@ -3831,7 +3846,7 @@ void wfmain::on_band4mbtn_clicked()
f.Hz = (70.200) * 1E6;
}
issueCmd(cmdSetFreq, f);
//emit setFrequency(f);
//emit setFrequency(0,f);
issueDelayedCommandUnique(cmdGetFreq);
ui->tabWidget->setCurrentIndex(0);
}
@ -3898,7 +3913,7 @@ void wfmain::on_band60mbtn_clicked()
freqt f;
f.Hz = (5.3305) * 1E6;
issueCmd(cmdSetFreq, f);
//emit setFrequency(f);
//emit setFrequency(0,f);
issueDelayedCommandUnique(cmdGetFreq);
ui->tabWidget->setCurrentIndex(0);
}
@ -3919,7 +3934,7 @@ void wfmain::on_band630mbtn_clicked()
{
freqt f;
f.Hz = 475 * 1E3;
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmd(cmdSetFreq, f);
issueDelayedCommandUnique(cmdGetFreq);
ui->tabWidget->setCurrentIndex(0);
@ -3929,7 +3944,7 @@ void wfmain::on_band2200mbtn_clicked()
{
freqt f;
f.Hz = 136 * 1E3;
//emit setFrequency(f);
//emit setFrequency(0,f);
issueCmd(cmdSetFreq, f);
issueDelayedCommandUnique(cmdGetFreq);
ui->tabWidget->setCurrentIndex(0);
@ -5245,7 +5260,6 @@ void wfmain::on_meter2selectionCombo_activated(int index)
meterKind oldMeterType;
newMeterType = static_cast<meterKind>(ui->meter2selectionCombo->currentData().toInt());
oldMeterType = ui->meter2Widget->getMeterType();
if(newMeterType == oldMeterType)
return;
@ -5257,11 +5271,14 @@ void wfmain::on_meter2selectionCombo_activated(int index)
if(newMeterType==meterNone)
{
ui->meter2Widget->hide();
ui->meter2Widget->setMeterType(newMeterType);
} else {
ui->meter2Widget->show();
ui->meter2Widget->setMeterType(newMeterType);
insertPeriodicCommandUnique(newCmd);
}
prefs.meter2Type = newMeterType;
(void)index;
}
@ -5282,7 +5299,7 @@ void wfmain::on_enableRigctldChk_clicked(bool checked)
if (rig != Q_NULLPTR) {
// We are already connected to a rig.
connect(rig, SIGNAL(stateInfo(rigStateStruct*)), rigCtl, SLOT(receiveStateInfo(rigStateStruct*)));
connect(rigCtl, SIGNAL(setFrequency(freqt)), rig, SLOT(setFrequency(freqt)));
connect(rigCtl, SIGNAL(setFrequency(unsigned char, freqt)), rig, SLOT(setFrequency(unsigned char, freqt)));
connect(rigCtl, SIGNAL(setMode(unsigned char, unsigned char)), rig, SLOT(setMode(unsigned char, unsigned char)));
connect(rigCtl, SIGNAL(setDataMode(bool, unsigned char)), rig, SLOT(setDataMode(bool, unsigned char)));
connect(rigCtl, SIGNAL(setPTT(bool)), rig, SLOT(setPTT(bool)));

Wyświetl plik

@ -58,7 +58,7 @@ signals:
// Frequency, mode, band:
void getFrequency();
void setFrequency(freqt freq);
void setFrequency(unsigned char vfo, freqt freq);
void getMode();
void setMode(unsigned char modeIndex, unsigned char modeFilter);
void setMode(mode_info);
@ -477,6 +477,7 @@ private slots:
void on_rigctldPortTxt_editingFinished();
private:
Ui::wfmain *ui;
void closeEvent(QCloseEvent *event);
@ -703,6 +704,7 @@ private:
int wftheme;
bool confirmExit;
bool confirmPowerOff;
meterKind meter2Type;
// plot scheme
} prefs;

Wyświetl plik

@ -57,7 +57,7 @@
<ExceptionHandling>Sync</ExceptionHandling>
<ObjectFileName>release\</ObjectFileName>
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX="/usr/local";__WINDOWS_WASAPI__;GITSHORT="eb2f897";HOST="wfview.org";UNAME="build";NDEBUG;QT_NO_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX="/usr/local";__WINDOWS_WASAPI__;GITSHORT="66912e1";HOST="wfview.org";UNAME="build";NDEBUG;QT_NO_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessToFile>false</PreprocessToFile>
<ProgramDataBaseFileName></ProgramDataBaseFileName>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@ -85,7 +85,7 @@
<WarningLevel>0</WarningLevel>
</Midl>
<ResourceCompile>
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX=\"/usr/local\";__WINDOWS_WASAPI__;GITSHORT=\"eb2f897\";HOST=\"wfview.org\";UNAME=\"build\";NDEBUG;QT_NO_DEBUG;QT_MULTIMEDIA_LIB;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_SERIALPORT_LIB;QT_NETWORK_LIB;QT_CORE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX=\"/usr/local\";__WINDOWS_WASAPI__;GITSHORT=\"66912e1\";HOST=\"wfview.org\";UNAME=\"build\";NDEBUG;QT_NO_DEBUG;QT_MULTIMEDIA_LIB;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_SERIALPORT_LIB;QT_NETWORK_LIB;QT_CORE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<QtMoc><CompilerFlavor>msvc</CompilerFlavor><Include>./$(Configuration)/moc_predefs.h</Include><ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription><DynamicSource>output</DynamicSource><QtMocDir>$(Configuration)</QtMocDir><QtMocFileName>moc_%(Filename).cpp</QtMocFileName></QtMoc><QtRcc><Compression>default</Compression><ExecutionDescription>Rcc'ing %(Identity)...</ExecutionDescription><QtRccDir>$(Configuration)</QtRccDir><QtRccFileName>qrc_%(Filename).cpp</QtRccFileName></QtRcc><QtUic><ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription><QtUicDir>$(ProjectDir)</QtUicDir><QtUicFileName>ui_%(Filename).h</QtUicFileName></QtUic></ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@ -99,7 +99,7 @@
<ExceptionHandling>Sync</ExceptionHandling>
<ObjectFileName>debug\</ObjectFileName>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX="/usr/local";__WINDOWS_WASAPI__;GITSHORT="eb2f897";HOST="wfview.org";UNAME="build";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX="/usr/local";__WINDOWS_WASAPI__;GITSHORT="66912e1";HOST="wfview.org";UNAME="build";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessToFile>false</PreprocessToFile>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<SuppressStartupBanner>true</SuppressStartupBanner>
@ -124,7 +124,7 @@
<WarningLevel>0</WarningLevel>
</Midl>
<ResourceCompile>
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX=\"/usr/local\";__WINDOWS_WASAPI__;GITSHORT=\"eb2f897\";HOST=\"wfview.org\";UNAME=\"build\";QT_MULTIMEDIA_LIB;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_SERIALPORT_LIB;QT_NETWORK_LIB;QT_CORE_LIB;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX=\"/usr/local\";__WINDOWS_WASAPI__;GITSHORT=\"66912e1\";HOST=\"wfview.org\";UNAME=\"build\";QT_MULTIMEDIA_LIB;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_SERIALPORT_LIB;QT_NETWORK_LIB;QT_CORE_LIB;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<QtMoc><CompilerFlavor>msvc</CompilerFlavor><Include>./$(Configuration)/moc_predefs.h</Include><ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription><DynamicSource>output</DynamicSource><QtMocDir>$(Configuration)</QtMocDir><QtMocFileName>moc_%(Filename).cpp</QtMocFileName></QtMoc><QtRcc><Compression>default</Compression><ExecutionDescription>Rcc'ing %(Identity)...</ExecutionDescription><QtRccDir>$(Configuration)</QtRccDir><QtRccFileName>qrc_%(Filename).cpp</QtRccFileName></QtRcc><QtUic><ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription><QtUicDir>$(ProjectDir)</QtUicDir><QtUicFileName>ui_%(Filename).h</QtUicFileName></QtUic></ItemDefinitionGroup>
<ItemGroup>