diff --git a/.swo b/.swo deleted file mode 100644 index 171d631..0000000 Binary files a/.swo and /dev/null differ diff --git a/CHANGELOG b/CHANGELOG index 01363f3..dea2e59 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,22 @@ # 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() diff --git a/WHATSNEW b/WHATSNEW index bfc7df3..33042e3 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -10,3 +10,10 @@ The following highlights are in this 1.x-release: 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 diff --git a/aboutbox.cpp b/aboutbox.cpp index 5c45f42..a9222b0 100644 --- a/aboutbox.cpp +++ b/aboutbox.cpp @@ -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.2c"); + ui->topText->setText("wfview version 1.2d"); QString head = QString("
"); QString copyright = QString("Copyright 2017-2021 Elliott H. Liggett, W6EL. All rights reserved. wfview source code is licensed under the GNU GPLv3."); diff --git a/commhandler.cpp b/commhandler.cpp index 7a48d87..165c90e 100644 --- a/commhandler.cpp +++ b/commhandler.cpp @@ -45,6 +45,7 @@ commHandler::commHandler(QString portName, quint32 baudRate) baudrate = baudRate; stopbits = 1; this->portName = portName; + this->PTTviaRTS = false; setupComm(); // basic parameters openPort(); @@ -162,6 +163,25 @@ void commHandler::receiveDataIn() } } +void commHandler::setRTS(bool rtsOn) +{ + bool success = port->setRequestToSend(rtsOn); + if(!success) + { + qInfo(logSerial()) << "Error, could not set RTS on port " << portName; + } +} + +bool commHandler::rtsStatus() +{ + return port->isRequestToSend(); +} + +void commHandler::setUseRTSforPTT(bool PTTviaRTS) +{ + this->PTTviaRTS = PTTviaRTS; +} + void commHandler::openPort() { bool success; diff --git a/commhandler.h b/commhandler.h index e7e5580..c76e23f 100644 --- a/commhandler.h +++ b/commhandler.h @@ -18,9 +18,14 @@ public: commHandler(); commHandler(QString portName, quint32 baudRate); bool serialError; + bool rtsStatus(); ~commHandler(); +public slots: + void setUseRTSforPTT(bool useRTS); + void setRTS(bool rtsOn); + private slots: void receiveDataIn(); // from physical port void receiveDataFromUserToRig(const QByteArray &data); @@ -38,6 +43,7 @@ private: void openPort(); void closePort(); + void sendDataOut(const QByteArray &writeData); // out to radio void debugMe(); void hexPrint(); @@ -63,6 +69,8 @@ private: bool havePt; QString ptDevSlave; + bool PTTviaRTS = false; + bool isConnected; // port opened mutable QMutex mutex; void printHex(const QByteArray &pdata, bool printVert, bool printHoriz); diff --git a/rigcommander.cpp b/rigcommander.cpp index 78121cb..b57e285 100644 --- a/rigcommander.cpp +++ b/rigcommander.cpp @@ -63,6 +63,7 @@ void rigCommander::commSetup(unsigned char rigCivAddr, QString rigSerialPort, qu 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))); + connect(this, SIGNAL(toggleRTS(bool)), comm, SLOT(setRTS(bool))); // data from the rig to the ptty: connect(comm, SIGNAL(haveDataFromPort(QByteArray)), ptty, SLOT(receiveDataFromRigToPtty(QByteArray))); @@ -236,6 +237,9 @@ void rigCommander::findRigs() data.append(payloadSuffix); emit dataForComm(data); + // HACK for testing radios that do not respond to rig ID queries: + //this->model = model736; + //this->determineRigCaps(); return; } @@ -989,9 +993,14 @@ void rigCommander::getSatelliteMode() void rigCommander::getPTT() { - QByteArray payload; - payload.setRawData("\x1C\x00", 2); - prepDataAndSend(payload); + if(rigCaps.useRTSforPTT) + { + emit havePTTStatus(comm->rtsStatus()); + } else { + QByteArray payload; + payload.setRawData("\x1C\x00", 2); + prepDataAndSend(payload); + } } void rigCommander::getBandStackReg(char band, char regCode) @@ -1008,9 +1017,14 @@ void rigCommander::setPTT(bool pttOn) if(pttAllowed) { - QByteArray payload("\x1C\x00", 2); - payload.append((char)pttOn); - prepDataAndSend(payload); + if(rigCaps.useRTSforPTT) + { + emit toggleRTS(pttOn); + } else { + QByteArray payload("\x1C\x00", 2); + payload.append((char)pttOn); + prepDataAndSend(payload); + } rigState.ptt = pttOn; } } @@ -1359,6 +1373,17 @@ void rigCommander::parseLevels() emit haveSql(level); rigState.squelch = level; break; + case '\x07': + // Twin BPF Inner, or, IF-Shift level + if(rigCaps.hasTBPF) + emit haveTPBFInner(level); + else + emit haveIFShift(level); + break; + case '\x08': + // Twin BPF Outer + emit haveTPBFOuter(level); + break; case '\x09': // CW Pitch - ignore for now break; @@ -1466,6 +1491,27 @@ void rigCommander::parseLevels() } +void rigCommander::setIFShift(unsigned char level) +{ + QByteArray payload("\x14\x07"); + payload.append(bcdEncodeInt(level)); + prepDataAndSend(payload); +} + +void rigCommander::setTPBFInner(unsigned char level) +{ + QByteArray payload("\x14\x07"); + payload.append(bcdEncodeInt(level)); + prepDataAndSend(payload); +} + +void rigCommander::setTPBFOuter(unsigned char level) +{ + QByteArray payload("\x14\x08"); + payload.append(bcdEncodeInt(level)); + prepDataAndSend(payload); +} + void rigCommander::setTxPower(unsigned char power) { QByteArray payload("\x14\x0A"); @@ -1889,6 +1935,24 @@ void rigCommander::getAfGain() prepDataAndSend(payload); } +void rigCommander::getIFShift() +{ + QByteArray payload("\x14\x07"); + prepDataAndSend(payload); +} + +void rigCommander::getTPBFInner() +{ + QByteArray payload("\x14\x07"); + prepDataAndSend(payload); +} + +void rigCommander::getTPBFOuter() +{ + QByteArray payload("\x14\x08"); + prepDataAndSend(payload); +} + void rigCommander::getSql() { QByteArray payload("\x14\x03"); @@ -2824,6 +2888,9 @@ void rigCommander::determineRigCaps() rigCaps.hasCTCSS = false; rigCaps.hasDTCS = false; + rigCaps.hasTBPF = false; + rigCaps.hasIFShift = false; + rigCaps.spectSeqMax = 0; rigCaps.spectAmpMax = 0; rigCaps.spectLenMax = 0; @@ -2852,6 +2919,7 @@ void rigCommander::determineRigCaps() rigCaps.hasTransmit = true; rigCaps.hasPTTCommand = true; + rigCaps.useRTSforPTT = false; // Common, reasonable defaults for most supported HF rigs: rigCaps.bsr[band160m] = 0x01; @@ -2894,6 +2962,7 @@ void rigCommander::determineRigCaps() rigCaps.hasWiFi = false; rigCaps.hasATU = true; rigCaps.hasCTCSS = true; + rigCaps.hasTBPF = true; rigCaps.attenuators.push_back('\x20'); rigCaps.preamps.push_back('\x01'); rigCaps.preamps.push_back('\x02'); @@ -2922,6 +2991,7 @@ void rigCommander::determineRigCaps() rigCaps.hasCTCSS = true; rigCaps.hasDTCS = true; rigCaps.hasDV = true; + rigCaps.hasTBPF = true; rigCaps.attenuators.push_back('\x10'); rigCaps.attenuators.push_back('\x20'); rigCaps.attenuators.push_back('\x30'); @@ -2959,6 +3029,7 @@ void rigCommander::determineRigCaps() rigCaps.hasDV = true; rigCaps.hasCTCSS = true; rigCaps.hasDTCS = true; + rigCaps.hasTBPF = true; rigCaps.attenuators.push_back('\x10'); rigCaps.preamps.push_back('\x01'); rigCaps.bands = standardVU; @@ -3007,6 +3078,7 @@ void rigCommander::determineRigCaps() rigCaps.hasATU = true; rigCaps.hasCTCSS = false; rigCaps.hasDTCS = false; + rigCaps.hasTBPF = true; rigCaps.attenuators.insert(rigCaps.attenuators.end(), {0x00, 0x06, 0x12, 0x18}); rigCaps.preamps.push_back('\x01'); rigCaps.preamps.push_back('\x02'); @@ -3033,6 +3105,7 @@ void rigCommander::determineRigCaps() rigCaps.hasEthernet = true; rigCaps.hasWiFi = false; rigCaps.hasCTCSS = true; + rigCaps.hasTBPF = true; rigCaps.attenuators.insert(rigCaps.attenuators.end(), {'\x03', '\x06', '\x09', '\x12',\ '\x15', '\x18', '\x21', '\x24',\ @@ -3067,6 +3140,7 @@ void rigCommander::determineRigCaps() rigCaps.hasWiFi = false; rigCaps.hasATU = true; rigCaps.hasCTCSS = true; + rigCaps.hasTBPF = true; rigCaps.attenuators.insert(rigCaps.attenuators.end(), {'\x03', '\x06', '\x09', '\x12', '\x15', '\x18', '\x21'}); @@ -3101,6 +3175,7 @@ void rigCommander::determineRigCaps() rigCaps.hasATU = true; rigCaps.hasCTCSS = true; rigCaps.hasDTCS = true; + rigCaps.hasTBPF = true; rigCaps.attenuators.insert(rigCaps.attenuators.end(),{ '\x10' , '\x20'}); rigCaps.preamps.push_back('\x01'); rigCaps.preamps.push_back('\x02'); @@ -3133,6 +3208,7 @@ void rigCommander::determineRigCaps() rigCaps.hasATU = true; rigCaps.hasCTCSS = true; rigCaps.hasDTCS = true; + rigCaps.hasTBPF = true; rigCaps.attenuators.push_back('\x12'); rigCaps.preamps.push_back('\x01'); rigCaps.bands = standardHF; @@ -3156,6 +3232,7 @@ void rigCommander::determineRigCaps() rigCaps.hasATU = true; rigCaps.hasCTCSS = true; rigCaps.hasDTCS = true; + rigCaps.hasTBPF = true; rigCaps.attenuators.push_back('\x20'); rigCaps.preamps.push_back('\x01'); rigCaps.preamps.push_back('\x02'); @@ -3179,6 +3256,7 @@ void rigCommander::determineRigCaps() rigCaps.hasATU = true; rigCaps.hasCTCSS = true; rigCaps.hasDTCS = true; + rigCaps.hasTBPF = true; rigCaps.attenuators.push_back('\x12'); rigCaps.preamps.push_back('\x01'); rigCaps.preamps.push_back('\x02'); @@ -3207,6 +3285,7 @@ void rigCommander::determineRigCaps() rigCaps.hasATU = true; rigCaps.hasCTCSS = true; rigCaps.hasDTCS = true; + rigCaps.hasTBPF = true; rigCaps.attenuators.push_back('\x20'); rigCaps.preamps.push_back('\x01'); rigCaps.bands = standardHF; @@ -3226,6 +3305,7 @@ void rigCommander::determineRigCaps() rigCaps.hasEthernet = true; rigCaps.hasWiFi = false; rigCaps.hasCTCSS = true; + rigCaps.hasTBPF = true; rigCaps.attenuators.insert(rigCaps.attenuators.end(), {'\x06', '\x12', '\x18'}); rigCaps.preamps.push_back('\x01'); @@ -3253,6 +3333,7 @@ void rigCommander::determineRigCaps() rigCaps.hasFDcomms = false; rigCaps.hasATU = true; rigCaps.hasPTTCommand = false; + rigCaps.useRTSforPTT = true; rigCaps.hasDataModes = false; rigCaps.attenuators.push_back('\x20'); rigCaps.bands = standardHF; @@ -3273,6 +3354,8 @@ void rigCommander::determineRigCaps() rigCaps.hasFDcomms = false; rigCaps.hasATU = false; rigCaps.hasPTTCommand = false; + rigCaps.useRTSforPTT = true; + rigCaps.hasIFShift = true; rigCaps.hasDataModes = false; rigCaps.attenuators.push_back('\x20'); rigCaps.preamps.push_back('\x01'); @@ -3286,6 +3369,28 @@ void rigCommander::determineRigCaps() }; rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00"); break; + case model736: + rigCaps.modelName = QString("IC-736"); + rigCaps.rigctlModel = 3020; + rigCaps.hasSpectrum = false; + rigCaps.inputs.clear(); + rigCaps.hasLan = false; + rigCaps.hasEthernet = false; + rigCaps.hasWiFi = false; + rigCaps.hasFDcomms = false; + rigCaps.hasATU = false; + rigCaps.hasPTTCommand = false; + rigCaps.useRTSforPTT = true; + rigCaps.hasDataModes = false; + rigCaps.hasIFShift = true; // untested + rigCaps.attenuators.push_back('\x20'); + rigCaps.preamps.push_back('\x01'); + rigCaps.bands = standardHF; + rigCaps.modes = { createMode(modeLSB, 0x00, "LSB"), createMode(modeUSB, 0x01, "USB"), + createMode(modeAM, 0x02, "AM"), createMode(modeFM, 0x05, "FM"), + createMode(modeCW, 0x03, "CW"), createMode(modeCW_R, 0x07, "CW-R"), + }; + break; case model756pro: rigCaps.modelName = QString("IC-756 Pro"); rigCaps.rigctlModel = 3027; @@ -3296,6 +3401,7 @@ void rigCommander::determineRigCaps() rigCaps.hasWiFi = false; rigCaps.hasFDcomms = false; rigCaps.hasATU = true; + rigCaps.hasTBPF = true; rigCaps.preamps.push_back('\x01'); rigCaps.preamps.push_back('\x02'); rigCaps.attenuators.insert(rigCaps.attenuators.end(),{ '\x06' , '\x12', '\x18'}); @@ -3316,6 +3422,7 @@ void rigCommander::determineRigCaps() rigCaps.hasWiFi = false; rigCaps.hasFDcomms = false; rigCaps.hasATU = true; + rigCaps.hasTBPF = true; rigCaps.preamps.push_back('\x01'); rigCaps.preamps.push_back('\x02'); rigCaps.attenuators.insert(rigCaps.attenuators.end(),{ '\x06' , '\x12', '\x18'}); @@ -3336,6 +3443,7 @@ void rigCommander::determineRigCaps() rigCaps.hasWiFi = false; rigCaps.hasFDcomms = false; rigCaps.hasATU = true; + rigCaps.hasTBPF = true; rigCaps.preamps.push_back('\x01'); rigCaps.preamps.push_back('\x02'); rigCaps.attenuators.insert(rigCaps.attenuators.end(),{ '\x06' , '\x12', '\x18'}); @@ -3346,6 +3454,34 @@ void rigCommander::determineRigCaps() rigCaps.modes = commonModes; rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00"); break; + case model9100: + rigCaps.modelName = QString("IC-9100"); + rigCaps.rigctlModel = 3068; + rigCaps.hasSpectrum = false; + rigCaps.inputs.append(inputUSB); // TODO, add commands for this radio's inputs + rigCaps.inputs.append(inputACC); + rigCaps.hasLan = false; + rigCaps.hasEthernet = false; + rigCaps.hasWiFi = false; + rigCaps.hasFDcomms = false; + rigCaps.hasATU = true; + rigCaps.hasDV = true; + rigCaps.hasTBPF = true; + rigCaps.preamps.push_back('\x01'); + rigCaps.preamps.push_back('\x02'); + rigCaps.attenuators.insert(rigCaps.attenuators.end(),{ '\x20' }); + rigCaps.antennas = {0x00, 0x01}; + rigCaps.bands = standardHF; + rigCaps.bands.insert(rigCaps.bands.end(), standardVU.begin(), standardVU.end()); + rigCaps.bands.push_back(band23cm); + rigCaps.bands.push_back(bandGen); + rigCaps.bsr[band2m] = 0x11; + rigCaps.bsr[band70cm] = 0x12; + rigCaps.bsr[band23cm] = 0x13; + rigCaps.bsr[bandGen] = 0x14; + rigCaps.modes = commonModes; + rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeDV, 0x17, "DV")}); + break; default: rigCaps.modelName = QString("IC-0x%1").arg(rigCaps.modelID, 2, 16); rigCaps.hasSpectrum = false; diff --git a/rigcommander.h b/rigcommander.h index 1486028..bf02aad 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -215,6 +215,9 @@ public slots: void getRfGain(); void getAfGain(); void getSql(); + void getIFShift(); + void getTPBFInner(); + void getTPBFOuter(); void getTxLevel(); void getMicGain(); void getCompLevel(); @@ -232,6 +235,9 @@ public slots: void setSquelch(unsigned char level); void setRfGain(unsigned char level); void setAfGain(unsigned char level); + void setIFShift(unsigned char level); + void setTPBFInner(unsigned char level); + void setTPBFOuter(unsigned char level); void setTxPower(unsigned char power); void setMicGain(unsigned char gain); void setUSBGain(unsigned char gain); @@ -316,6 +322,7 @@ signals: void haveSerialPortError(const QString port, const QString errorText); void haveStatusUpdate(const QString text); void dataForComm(const QByteArray &outData); + void toggleRTS(bool rtsOn); // UDP: void haveChangeLatency(quint16 value); @@ -356,6 +363,9 @@ signals: void haveRfGain(unsigned char level); void haveAfGain(unsigned char level); void haveSql(unsigned char level); + void haveTPBFInner(unsigned char level); + void haveTPBFOuter(unsigned char level); + void haveIFShift(unsigned char level); void haveTxPower(unsigned char level); void haveMicGain(unsigned char level); void haveCompLevel(unsigned char level); diff --git a/rigidentities.cpp b/rigidentities.cpp index 7b113f7..13988b4 100644 --- a/rigidentities.cpp +++ b/rigidentities.cpp @@ -67,6 +67,9 @@ model_kind determineRadioModel(unsigned char rigID) case model756proiii: rig = model756proiii; break; + case model9100: + rig = model9100; + break; default: rig = modelUnknown; break; diff --git a/rigidentities.h b/rigidentities.h index e905730..cae1b75 100644 --- a/rigidentities.h +++ b/rigidentities.h @@ -29,10 +29,12 @@ enum model_kind { model705 = 0xA4, model706 = 0x58, model718 = 0x5E, + model736 = 0x40, model756pro = 0x5C, model756proii = 0x64, model756proiii = 0x6E, model910h = 0x60, + model9100 = 0x7C, modelUnknown = 0xFF }; @@ -116,10 +118,13 @@ struct rigCapabilities { bool hasTransmit; bool hasPTTCommand; + bool useRTSforPTT; bool hasAttenuator; bool hasPreamp; bool hasAntennaSel; bool hasDataModes; + bool hasIFShift; + bool hasTBPF; bool hasRXAntenna; diff --git a/transceiveradjustments.cpp b/transceiveradjustments.cpp index 5779f5f..c87c612 100644 --- a/transceiveradjustments.cpp +++ b/transceiveradjustments.cpp @@ -6,11 +6,100 @@ transceiverAdjustments::transceiverAdjustments(QWidget *parent) : ui(new Ui::transceiverAdjustments) { ui->setupUi(this); - // request level updates +#ifndef QT_DEBUG + ui->transmitterControlsGroupBox->setVisible(false); // no controls available so far + ui->bassRxLabel->setVisible(false); + ui->bassRxSlider->setVisible(false); + ui->trebleRxLabel->setVisible(false); + ui->trebleRxSlider->setVisible(false); + + ui->NRRxCheckBox->setVisible(false); + ui->NRRxSlider->setVisible(false); + ui->notchRxChkBox->setVisible(false); + ui->notchRxSlider->setVisible(false); + ui->NBRxChkBox->setVisible(false); + ui->NBRxSlider->setVisible(false); + ui->bandwidthGroupBox->setVisible(false); + this->window()->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + this->window()->resize(QSizePolicy::Minimum, QSizePolicy::Minimum); + +#endif } transceiverAdjustments::~transceiverAdjustments() { + rigCaps.inputs.clear(); + rigCaps.preamps.clear(); + rigCaps.attenuators.clear(); + rigCaps.antennas.clear(); + delete ui; } + +void transceiverAdjustments::on_IFShiftSlider_valueChanged(int value) +{ + if(rigCaps.hasIFShift) + { + emit setIFShift(value); + } else { + unsigned char inner = ui->TPBFInnerSlider->value(); + unsigned char outer = ui->TPBFOuterSlider->value(); + int shift = value - previousIFShift; + inner = MAX( 0, MIN(255,int (inner + shift)) ); + outer = MAX( 0, MIN(255,int (outer + shift)) ); + + ui->TPBFInnerSlider->setValue(inner); + ui->TPBFOuterSlider->setValue(outer); + previousIFShift = value; + } +} + +void transceiverAdjustments::on_TPBFInnerSlider_valueChanged(int value) +{ + emit setTPBFInner(value); +} + +void transceiverAdjustments::on_TPBFOuterSlider_valueChanged(int value) +{ + emit setTPBFOuter(value); +} + +void transceiverAdjustments::setRig(rigCapabilities rig) +{ + this->rigCaps = rig; + if(!rigCaps.hasIFShift) + updateIFShift(128); + //ui->IFShiftSlider->setVisible(rigCaps.hasIFShift); + //ui->IFShiftLabel->setVisible(rigCaps.hasIFShift); + + ui->TPBFInnerSlider->setVisible(rigCaps.hasTBPF); + ui->TPBFInnerLabel->setVisible(rigCaps.hasTBPF); + + ui->TPBFOuterSlider->setVisible(rigCaps.hasTBPF); + ui->TPBFInnerLabel->setVisible(rigCaps.hasTBPF); + + haveRigCaps = true; +} + +// These are accessed by wfmain when we receive new values from rigCommander: +void transceiverAdjustments::updateIFShift(unsigned char level) +{ + ui->IFShiftSlider->blockSignals(true); + ui->IFShiftSlider->setValue(level); + ui->IFShiftSlider->blockSignals(false); +} + +void transceiverAdjustments::updateTPBFInner(unsigned char level) +{ + ui->TPBFInnerSlider->blockSignals(true); + ui->TPBFInnerSlider->setValue(level); + ui->TPBFInnerSlider->blockSignals(false); +} + +void transceiverAdjustments::updateTPBFOuter(unsigned char level) +{ + ui->TPBFOuterSlider->blockSignals(true); + ui->TPBFOuterSlider->setValue(level); + ui->TPBFOuterSlider->blockSignals(false); +} diff --git a/transceiveradjustments.h b/transceiveradjustments.h index 2eee158..bec6a34 100644 --- a/transceiveradjustments.h +++ b/transceiveradjustments.h @@ -1,7 +1,11 @@ #ifndef TRANSCEIVERADJUSTMENTS_H #define TRANSCEIVERADJUSTMENTS_H +#include