From 7966568f17f7a962d92f9c4189a3a8ad3ce72228 Mon Sep 17 00:00:00 2001 From: Phil Taylor Date: Thu, 18 Feb 2021 09:14:41 +0000 Subject: [PATCH] Connect Civ to/from server --- rigcommander.cpp | 7 +++++++ rigcommander.h | 2 ++ udpserver.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ udpserver.h | 4 ++++ wfmain.cpp | 8 ++++++++ 5 files changed, 73 insertions(+) diff --git a/rigcommander.cpp b/rigcommander.cpp index 3cc3686..6a0c059 100644 --- a/rigcommander.cpp +++ b/rigcommander.cpp @@ -584,6 +584,7 @@ void rigCommander::setCIVAddr(unsigned char civAddr) void rigCommander::handleNewData(const QByteArray &data) { + emit haveDataForServer(data); parseData(data); } @@ -1959,6 +1960,12 @@ void rigCommander::printHex(const QByteArray &pdata, bool printVert, bool printH qDebug() << "----- End hex dump -----"; } +void rigCommander::dataFromServer(QByteArray data) +{ + qDebug() << "emit dataForComm()"; + emit dataForComm(data); +} + diff --git a/rigcommander.h b/rigcommander.h index 77b8af0..92019e1 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -109,6 +109,7 @@ public slots: void sayMode(); void sayAll(); void getDebug(); + void dataFromServer(QByteArray data); signals: void commReady(); @@ -154,6 +155,7 @@ signals: void havePTTStatus(bool pttOn); void haveATUStatus(unsigned char status); void haveChangeBufferSize(quint16 value); + void haveDataForServer(QByteArray outData); private: diff --git a/udpserver.cpp b/udpserver.cpp index 2f90d4e..983c048 100644 --- a/udpserver.cpp +++ b/udpserver.cpp @@ -101,6 +101,9 @@ void udpServer::controlReceived() QNetworkDatagram datagram = udpControl->receiveDatagram(); QByteArray r = datagram.data(); CLIENT* current = Q_NULLPTR; + if (datagram.senderPort() == 65535 || datagram.senderPort() == 0) + return; + foreach(CLIENT * client, controlClients) { if (client->ipAddress == datagram.senderAddress() && client->port == datagram.senderPort()) @@ -281,6 +284,9 @@ void udpServer::civReceived() CLIENT* current = Q_NULLPTR; + if (datagram.senderPort() == 65535 || datagram.senderPort() == 0) + return; + foreach(CLIENT * client, civClients) { if (client->ipAddress == datagram.senderAddress() && client->port == datagram.senderPort()) @@ -371,6 +377,17 @@ void udpServer::civReceived() } break; default: + if (r.length() > 21) { + // First check if we are missing any packets? + quint8 temp = r[0] - 0x15; + if ((quint8)r[16] == 0xc1 && (quint8)r[17] == temp) + { + qDebug() << "Got CIV from server: " << r.mid(21); + emit haveDataFromServer(r.mid(21)); + } + } + + break; } } @@ -383,8 +400,12 @@ void udpServer::audioReceived() QByteArray r = datagram.data(); CLIENT* current = Q_NULLPTR; + if (datagram.senderPort() == 65535 || datagram.senderPort() == 0) + return; + foreach(CLIENT * client, audioClients) { + if (client != Q_NULLPTR && client->ipAddress == datagram.senderAddress() && client->port == datagram.senderPort()) { current = client; @@ -758,3 +779,34 @@ void udpServer::sendStatus(CLIENT* c) } + +#define SEND_SIZE 17 +void udpServer::dataForServer(QByteArray d) +{ + + CLIENT* current = Q_NULLPTR; + foreach(CLIENT * client, civClients) + { + qDebug() << "Sending CIV data to " << client->ipAddress.toString(); + quint8 p[SEND_SIZE]; + memset(p, 0x0, sizeof(p)); + qToLittleEndian(client->txSeq, p + 0x06); + qToLittleEndian(client->myId, p + 0x08); + qToLittleEndian(client->remoteId, p + 0x0c); + + QByteArray t = QByteArray::fromRawData((const char*)p, sizeof(p)); + p[0x10] = (char)0xc1; + qToLittleEndian((quint16)t.length(), p + 0x11); + qToLittleEndian((quint16)sizeof(p) + t.length(), p + 0x00); + + t.append(QByteArray::fromRawData((const char*)p, sizeof(p))); + qToLittleEndian(client->connSeq, p + 0x12); + client->socket->writeDatagram(t, client->ipAddress, client->port); + client->connSeq++; + client->txSeq++; + } + + return; +} + + diff --git a/udpserver.h b/udpserver.h index 8cb66d9..ea0c6cc 100644 --- a/udpserver.h +++ b/udpserver.h @@ -31,6 +31,10 @@ public: public slots: void init(); + void dataForServer(QByteArray); + +signals: + void haveDataFromServer(QByteArray); private: diff --git a/wfmain.cpp b/wfmain.cpp index 1b0fe55..4a1b067 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -201,6 +201,8 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, QWidget *parent connect(this, SIGNAL(initServer()), udp, SLOT(init())); connect(serverThread, SIGNAL(finished()), udp, SLOT(deleteLater())); + + serverThread->start(); emit initServer(); @@ -367,6 +369,12 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, QWidget *parent // Metering connect(this, SIGNAL(getMeters(bool)), rig, SLOT(getMeters(bool))); + + // Server + connect(rig, SIGNAL(haveDataForServer(QByteArray)), udp, SLOT(dataForServer(QByteArray))); + connect(udp, SIGNAL(haveDataFromServer(QByteArray)), rig, SLOT(dataFromServer(QByteArray))); + + ui->plot->addGraph(); // primary ui->plot->addGraph(0, 0); // secondary, peaks, same axis as first? ui->waterfall->addGraph();