From 1f25ca67e8cff514b74c318f863cac6cf63dd54b Mon Sep 17 00:00:00 2001 From: Phil Taylor Date: Fri, 8 Apr 2022 14:40:05 +0100 Subject: [PATCH] Fixes to TCP server and attempt auto port detection on non-linux! --- rigcommander.cpp | 37 ++++++++------- rigcommander.h | 4 +- servermain.cpp | 5 +- servermain.h | 5 +- wfmain.cpp | 118 ++++++++++++++++++++++++++++------------------- wfmain.h | 5 +- 6 files changed, 101 insertions(+), 73 deletions(-) diff --git a/rigcommander.cpp b/rigcommander.cpp index f0380dd..8cdde8b 100644 --- a/rigcommander.cpp +++ b/rigcommander.cpp @@ -40,7 +40,7 @@ rigCommander::~rigCommander() } -void rigCommander::commSetup(unsigned char rigCivAddr, QString rigSerialPort, quint32 rigBaudRate, QString vsp) +void rigCommander::commSetup(unsigned char rigCivAddr, QString rigSerialPort, quint32 rigBaudRate, QString vsp,quint16 tcpPort) { // construct // TODO: Bring this parameter and the comm port from the UI. @@ -61,7 +61,11 @@ void rigCommander::commSetup(unsigned char rigCivAddr, QString rigSerialPort, qu comm = new commHandler(rigSerialPort, rigBaudRate); ptty = new pttyHandler(vsp); - tcp = new tcpServer(); + if (tcpPort > 0) { + tcp = new tcpServer(this); + tcp->startServer(tcpPort); + } + // data from the comm port to the program: connect(comm, SIGNAL(haveDataFromPort(QByteArray)), this, SLOT(handleNewData(QByteArray))); @@ -69,12 +73,13 @@ 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 tcp port to the rig: - connect(tcp, SIGNAL(readyRead(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(dataForComm(QByteArray)), tcp, SLOT(dataToPort(QByteArray))); + if (tcpPort > 0) { + // data from the tcp port to the rig: + connect(tcp, SIGNAL(receiveData(QByteArray)), comm, SLOT(receiveDataFromUserToRig(QByteArray))); + connect(comm, SIGNAL(haveDataFromPort(QByteArray)), tcp, SLOT(sendData(QByteArray))); + } connect(this, SIGNAL(toggleRTS(bool)), comm, SLOT(setRTS(bool))); // data from the rig to the ptty: @@ -93,7 +98,7 @@ void rigCommander::commSetup(unsigned char rigCivAddr, QString rigSerialPort, qu } -void rigCommander::commSetup(unsigned char rigCivAddr, udpPreferences prefs, audioSetup rxSetup, audioSetup txSetup, QString vsp) +void rigCommander::commSetup(unsigned char rigCivAddr, udpPreferences prefs, audioSetup rxSetup, audioSetup txSetup, QString vsp, quint16 tcpPort) { // construct // TODO: Bring this parameter and the comm port from the UI. @@ -128,19 +133,16 @@ void rigCommander::commSetup(unsigned char rigCivAddr, udpPreferences prefs, aud ptty = new pttyHandler(vsp); - tcp = new tcpServer(this); - tcp->startServer(5010); - + if (tcpPort > 0) { + tcp = new tcpServer(this); + tcp->startServer(tcpPort); + } // Data from UDP to the program connect(udp, SIGNAL(haveDataFromPort(QByteArray)), this, SLOT(handleNewData(QByteArray))); // data from the rig to the ptty: connect(udp, SIGNAL(haveDataFromPort(QByteArray)), ptty, SLOT(receiveDataFromRigToPtty(QByteArray))); - // data from the rig to tcp: - connect(udp, SIGNAL(haveDataFromPort(QByteArray)), tcp, SLOT(sendData(QByteArray))); - - // Audio from UDP connect(udp, SIGNAL(haveAudioData(audioPacket)), this, SLOT(receiveAudioData(audioPacket))); @@ -150,8 +152,11 @@ void rigCommander::commSetup(unsigned char rigCivAddr, udpPreferences prefs, aud // data from the ptty to the rig: connect(ptty, SIGNAL(haveDataFromPort(QByteArray)), udp, SLOT(receiveDataFromUserToRig(QByteArray))); - // data from the tcp port to the Rig: - connect(tcp, SIGNAL(receiveData(QByteArray)), udp, SLOT(receiveDataFromUserToRig(QByteArray))); + if (tcpPort > 0) { + // data from the tcp port to the rig: + connect(tcp, SIGNAL(receiveData(QByteArray)), udp, SLOT(receiveDataFromUserToRig(QByteArray))); + connect(udp, SIGNAL(haveDataFromPort(QByteArray)), tcp, SLOT(sendData(QByteArray))); + } connect(this, SIGNAL(haveChangeLatency(quint16)), udp, SLOT(changeLatency(quint16))); connect(this, SIGNAL(haveSetVolume(unsigned char)), udp, SLOT(setVolume(unsigned char))); diff --git a/rigcommander.h b/rigcommander.h index dc10f40..c95d8d0 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -79,8 +79,8 @@ public: public slots: void process(); - void commSetup(unsigned char rigCivAddr, QString rigSerialPort, quint32 rigBaudRate, QString vsp); - void commSetup(unsigned char rigCivAddr, udpPreferences prefs, audioSetup rxSetup, audioSetup txSetup, QString vsp); + void commSetup(unsigned char rigCivAddr, QString rigSerialPort, quint32 rigBaudRate, QString vsp, quint16 tcp); + void commSetup(unsigned char rigCivAddr, udpPreferences prefs, audioSetup rxSetup, audioSetup txSetup, QString vsp, quint16 tcp); void closeComm(); void stateUpdated(); void setRTSforPTT(bool enabled); diff --git a/servermain.cpp b/servermain.cpp index 488515f..286cec5 100644 --- a/servermain.cpp +++ b/servermain.cpp @@ -89,7 +89,7 @@ void servermain::openRig() { //qInfo(logSystem()) << "Got rig"; QMetaObject::invokeMethod(radio->rig, [=]() { - radio->rig->commSetup(radio->civAddr, radio->serialPort, radio->baudRate, QString("none")); + radio->rig->commSetup(radio->civAddr, radio->serialPort, radio->baudRate, QString("none"),prefs.tcpPort); }, Qt::QueuedConnection); } } @@ -115,8 +115,6 @@ void servermain::makeRig() connect(radio->rig, SIGNAL(haveStatusUpdate(networkStatus)), this, SLOT(receiveStatusUpdate(networkStatus))); // Rig comm setup: - //connect(this, SIGNAL(sendCommSetup(unsigned char, udpPreferences, audioSetup, audioSetup, QString)), radio->rig, SLOT(commSetup(unsigned char, udpPreferences, audioSetup, audioSetup, QString))); - //connect(this, SIGNAL(sendCommSetup(unsigned char, QString, quint32, QString)), radio->rig, SLOT(commSetup(unsigned char, QString, quint32, QString))); connect(this, SIGNAL(setRTSforPTT(bool)), radio->rig, SLOT(setRTSforPTT(bool))); connect(radio->rig, SIGNAL(haveBaudRate(quint32)), this, SLOT(receiveBaudRate(quint32))); @@ -420,6 +418,7 @@ void servermain::setDefPrefs() defPrefs.serialPortRadio = QString("auto"); defPrefs.serialPortBaud = 115200; defPrefs.localAFgain = 255; + defPrefs.tcpPort = 0; udpDefPrefs.ipAddress = QString(""); udpDefPrefs.controlLANPort = 50001; diff --git a/servermain.h b/servermain.h index c9639cc..99d3ea7 100644 --- a/servermain.h +++ b/servermain.h @@ -154,8 +154,8 @@ signals: void sayFrequency(); void sayMode(); void sayAll(); - void sendCommSetup(unsigned char rigCivAddr, QString rigSerialPort, quint32 rigBaudRate,QString vsp); - void sendCommSetup(unsigned char rigCivAddr, udpPreferences prefs, audioSetup rxSetup, audioSetup txSetup, QString vsp); + void sendCommSetup(unsigned char rigCivAddr, QString rigSerialPort, quint32 rigBaudRate,QString vsp, quint16 tcp); + void sendCommSetup(unsigned char rigCivAddr, udpPreferences prefs, audioSetup rxSetup, audioSetup txSetup, QString vsp, quint16 tcp); void sendCloseComm(); void sendChangeLatency(quint16 latency); void initServer(); @@ -242,6 +242,7 @@ private: audioSetup txAudio; rigCapabilities rigCaps; bool haveRigCaps = false; + quint16 tcpPort; } prefs; preferences defPrefs; diff --git a/wfmain.cpp b/wfmain.cpp index 3bcca57..e98fe89 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -188,13 +188,12 @@ void wfmain::openRig() ui->lanEnableBtn->setChecked(true); usingLAN = true; // We need to setup the tx/rx audio: - emit sendCommSetup(prefs.radioCIVAddr, udpPrefs, rxSetup, txSetup, prefs.virtualSerialPort); + emit sendCommSetup(prefs.radioCIVAddr, udpPrefs, rxSetup, txSetup, prefs.virtualSerialPort, prefs.tcpPort); } else { ui->serialEnableBtn->setChecked(true); if( (prefs.serialPortRadio.toLower() == QString("auto")) && (serialPortCL.isEmpty())) { findSerialPort(); - } else { if(serialPortCL.isEmpty()) { @@ -204,7 +203,7 @@ void wfmain::openRig() } } usingLAN = false; - emit sendCommSetup(prefs.radioCIVAddr, serialPortRig, prefs.serialPortBaud,prefs.virtualSerialPort); + emit sendCommSetup(prefs.radioCIVAddr, serialPortRig, prefs.serialPortBaud,prefs.virtualSerialPort, prefs.tcpPort); ui->statusBar->showMessage(QString("Connecting to rig using serial port ").append(serialPortRig), 1000); } @@ -426,8 +425,8 @@ void wfmain::makeRig() connect(rig, SIGNAL(setRadioUsage(quint8, quint8, QString, QString)), selRad, SLOT(setInUse(quint8, quint8, QString, QString))); connect(selRad, SIGNAL(selectedRadio(quint8)), rig, SLOT(setCurrentRadio(quint8))); // Rig comm setup: - connect(this, SIGNAL(sendCommSetup(unsigned char, udpPreferences, audioSetup, audioSetup, QString)), rig, SLOT(commSetup(unsigned char, udpPreferences, audioSetup, audioSetup, QString))); - connect(this, SIGNAL(sendCommSetup(unsigned char, QString, quint32,QString)), rig, SLOT(commSetup(unsigned char, QString, quint32,QString))); + connect(this, SIGNAL(sendCommSetup(unsigned char, udpPreferences, audioSetup, audioSetup, QString, quint16)), rig, SLOT(commSetup(unsigned char, udpPreferences, audioSetup, audioSetup, QString, quint16))); + connect(this, SIGNAL(sendCommSetup(unsigned char, QString, quint32,QString, quint16)), rig, SLOT(commSetup(unsigned char, QString, quint32,QString, quint16))); connect(this, SIGNAL(setRTSforPTT(bool)), rig, SLOT(setRTSforPTT(bool))); connect(rig, SIGNAL(haveBaudRate(quint32)), this, SLOT(receiveBaudRate(quint32))); @@ -477,49 +476,68 @@ void wfmain::findSerialPort() { // Find the ICOM radio connected, or, if none, fall back to OS default. // qInfo(logSystem()) << "Searching for serial port..."; - QDirIterator it73("/dev/serial/by-id", QStringList() << "*IC-7300*", QDir::Files, QDirIterator::Subdirectories); - QDirIterator it97("/dev/serial", QStringList() << "*IC-9700*A*", QDir::Files, QDirIterator::Subdirectories); - QDirIterator it785x("/dev/serial", QStringList() << "*IC-785*A*", QDir::Files, QDirIterator::Subdirectories); - QDirIterator it705("/dev/serial", QStringList() << "*IC-705*A", QDir::Files, QDirIterator::Subdirectories); - QDirIterator it7610("/dev/serial", QStringList() << "*IC-7610*A", QDir::Files, QDirIterator::Subdirectories); - QDirIterator itR8600("/dev/serial", QStringList() << "*IC-R8600*A", QDir::Files, QDirIterator::Subdirectories); + bool found = false; + // First try to find first Icom port: + foreach(const QSerialPortInfo & serialPortInfo, QSerialPortInfo::availablePorts()) + { + if (serialPortInfo.serialNumber().left(3) == "IC-") { + qInfo(logSystem()) << "Serial Port found: " << serialPortInfo.portName() << "Manufacturer:" << serialPortInfo.manufacturer() << "Product ID" << serialPortInfo.description() << "S/N" << serialPortInfo.serialNumber(); +#if defined(Q_OS_LINUX) || defined(Q_OS_MAC) + serialPortRig = (QString("/dev/") + serialPortInfo.portName()); +#else + serialPortRig = serialPortInfo.portName(); +#endif + found = true; + break; + } + } - if(!it73.filePath().isEmpty()) - { - // IC-7300 - serialPortRig = it73.filePath(); // first - } else if(!it97.filePath().isEmpty()) - { - // IC-9700 - serialPortRig = it97.filePath(); - } else if(!it785x.filePath().isEmpty()) - { - // IC-785x - serialPortRig = it785x.filePath(); - } else if(!it705.filePath().isEmpty()) - { - // IC-705 - serialPortRig = it705.filePath(); - } else if(!it7610.filePath().isEmpty()) - { - // IC-7610 - serialPortRig = it7610.filePath(); - } else if(!itR8600.filePath().isEmpty()) - { - // IC-R8600 - serialPortRig = itR8600.filePath(); - } else { - //fall back: - qInfo(logSystem()) << "Could not find Icom serial port. Falling back to OS default. Use --port to specify, or modify preferences."; + if (!found) { + QDirIterator it73("/dev/serial/by-id", QStringList() << "*IC-7300*", QDir::Files, QDirIterator::Subdirectories); + QDirIterator it97("/dev/serial", QStringList() << "*IC-9700*A*", QDir::Files, QDirIterator::Subdirectories); + QDirIterator it785x("/dev/serial", QStringList() << "*IC-785*A*", QDir::Files, QDirIterator::Subdirectories); + QDirIterator it705("/dev/serial", QStringList() << "*IC-705*A", QDir::Files, QDirIterator::Subdirectories); + QDirIterator it7610("/dev/serial", QStringList() << "*IC-7610*A", QDir::Files, QDirIterator::Subdirectories); + QDirIterator itR8600("/dev/serial", QStringList() << "*IC-R8600*A", QDir::Files, QDirIterator::Subdirectories); + + if(!it73.filePath().isEmpty()) + { + // IC-7300 + serialPortRig = it73.filePath(); // first + } else if(!it97.filePath().isEmpty()) + { + // IC-9700 + serialPortRig = it97.filePath(); + } else if(!it785x.filePath().isEmpty()) + { + // IC-785x + serialPortRig = it785x.filePath(); + } else if(!it705.filePath().isEmpty()) + { + // IC-705 + serialPortRig = it705.filePath(); + } else if(!it7610.filePath().isEmpty()) + { + // IC-7610 + serialPortRig = it7610.filePath(); + } else if(!itR8600.filePath().isEmpty()) + { + // IC-R8600 + serialPortRig = itR8600.filePath(); + } + else { + //fall back: + qInfo(logSystem()) << "Could not find Icom serial port. Falling back to OS default. Use --port to specify, or modify preferences."; #ifdef Q_OS_MAC - serialPortRig = QString("/dev/tty.SLAB_USBtoUART"); + serialPortRig = QString("/dev/tty.SLAB_USBtoUART"); #endif #ifdef Q_OS_LINUX - serialPortRig = QString("/dev/ttyUSB0"); + serialPortRig = QString("/dev/ttyUSB0"); #endif #ifdef Q_OS_WIN - serialPortRig = QString("COM1"); + serialPortRig = QString("COM1"); #endif + } } } @@ -1177,7 +1195,7 @@ void wfmain::setSerialDevicesUI() { portList.append(serialPortInfo.portName()); #if defined(Q_OS_LINUX) || defined(Q_OS_MAC) - ui->serialDeviceListCombo->addItem(QString("/dev/")+serialPortInfo.portName(), i++); + ui->serialDeviceListCombo->addItem(QString("/dev/") + serialPortInfo.portName(), i++); #else ui->serialDeviceListCombo->addItem(serialPortInfo.portName(), i++); //qInfo(logSystem()) << "Serial Port found: " << serialPortInfo.portName() << "Manufacturer:" << serialPortInfo.manufacturer() << "Product ID" << serialPortInfo.description() << "S/N" << serialPortInfo.serialNumber(); @@ -1202,18 +1220,18 @@ void wfmain::setSerialDevicesUI() #ifdef Q_OS_MAC QString vspName = QStandardPaths::standardLocations(QStandardPaths::DownloadLocation)[0] + "/rig-pty"; #else - QString vspName=QDir::homePath()+"/rig-pty"; + QString vspName = QDir::homePath() + "/rig-pty"; #endif - for (i=1;i<8;i++) { + for (i = 1; i < 8; i++) { ui->vspCombo->addItem(vspName + QString::number(i)); - if (QFile::exists(vspName+QString::number(i))) { - auto * model = qobject_cast(ui->vspCombo->model()); - auto *item = model->item(ui->vspCombo->count()-1); + if (QFile::exists(vspName + QString::number(i))) { + auto* model = qobject_cast(ui->vspCombo->model()); + auto* item = model->item(ui->vspCombo->count() - 1); item->setEnabled(false); } } - ui->vspCombo->addItem(vspName+QString::number(i)); + ui->vspCombo->addItem(vspName + QString::number(i)); ui->vspCombo->addItem(QString("None"), i++); #endif @@ -1370,6 +1388,7 @@ void wfmain::setDefPrefs() defPrefs.confirmExit = true; defPrefs.confirmPowerOff = true; defPrefs.meter2Type = meterNone; + defPrefs.tcpPort = 0; udpDefPrefs.ipAddress = QString(""); udpDefPrefs.controlLANPort = 50001; @@ -1515,6 +1534,8 @@ void wfmain::loadSettings() ui->lanEnableBtn->setChecked(prefs.enableLAN); ui->connectBtn->setEnabled(true); + prefs.tcpPort = settings->value("TcpServerPort", defPrefs.tcpPort).toInt(); + prefs.enableRigCtlD = settings->value("EnableRigCtlD", defPrefs.enableRigCtlD).toBool(); ui->enableRigctldChk->setChecked(prefs.enableRigCtlD); prefs.rigCtlPort = settings->value("RigCtlPort", defPrefs.rigCtlPort).toInt(); @@ -1966,6 +1987,7 @@ void wfmain::saveSettings() settings->beginGroup("LAN"); settings->setValue("EnableLAN", prefs.enableLAN); settings->setValue("EnableRigCtlD", prefs.enableRigCtlD); + settings->setValue("TcpServerPort", prefs.tcpPort); settings->setValue("RigCtlPort", prefs.rigCtlPort); settings->setValue("IPAddress", udpPrefs.ipAddress); settings->setValue("ControlLANPort", udpPrefs.controlLANPort); diff --git a/wfmain.h b/wfmain.h index 4832a18..6a092a4 100644 --- a/wfmain.h +++ b/wfmain.h @@ -164,8 +164,8 @@ signals: void sayFrequency(); void sayMode(); void sayAll(); - void sendCommSetup(unsigned char rigCivAddr, QString rigSerialPort, quint32 rigBaudRate,QString vsp); - void sendCommSetup(unsigned char rigCivAddr, udpPreferences prefs, audioSetup rxSetup, audioSetup txSetup, QString vsp); + void sendCommSetup(unsigned char rigCivAddr, QString rigSerialPort, quint32 rigBaudRate,QString vsp, quint16 tcp); + void sendCommSetup(unsigned char rigCivAddr, udpPreferences prefs, audioSetup rxSetup, audioSetup txSetup, QString vsp, quint16 tcp); void sendCloseComm(); void sendChangeLatency(quint16 latency); void initServer(); @@ -764,6 +764,7 @@ private: bool confirmExit; bool confirmPowerOff; meterKind meter2Type; + quint16 tcpPort; // plot scheme } prefs;