From 87169e10cb7ebe732ef388552bb0c057c09767ef Mon Sep 17 00:00:00 2001 From: Thomas Vanbesien Date: Fri, 13 Mar 2026 18:20:35 +0100 Subject: Unified socket slots, --wire-debug CLI flag, fix mock TX and disconnect logging Collapse 12 per-socket slots into 4 sender()-based slots. Replace runtime wireDebug QML property with static --wire-debug CLI flag on both demo and mock server. Route MockServer::sendKaPing through sendReply so KA_PING TX shows wire bytes. Simplify sendReply to deduce command token from wire data. Fix Xpl2Client disconnect logging (logTag takes pointer, null-sender fallback). --- src/Xpl2Client.cpp | 269 ++++++++++++++++++++--------------------------------- 1 file changed, 103 insertions(+), 166 deletions(-) (limited to 'src/Xpl2Client.cpp') diff --git a/src/Xpl2Client.cpp b/src/Xpl2Client.cpp index f7b280f..ba6a1ec 100644 --- a/src/Xpl2Client.cpp +++ b/src/Xpl2Client.cpp @@ -6,34 +6,21 @@ #include +bool Xpl2Client::s_wireDebug = false; + Xpl2Client::Xpl2Client (QObject *parent) : QObject (parent) { - connect (&m_commandSocket, &QTcpSocket::connected, this, - &Xpl2Client::onCommandSocketConnected); - connect (&m_commandSocket, &QTcpSocket::disconnected, this, - &Xpl2Client::onCommandSocketDisconnected); - connect (&m_commandSocket, &QTcpSocket::readyRead, this, - &Xpl2Client::onCommandSocketMessageReady); - connect (&m_commandSocket, &QAbstractSocket::errorOccurred, this, - &Xpl2Client::onCommandSocketError); - - connect (&m_imagingSocket, &QTcpSocket::connected, this, - &Xpl2Client::onImagingSocketConnected); - connect (&m_imagingSocket, &QTcpSocket::disconnected, this, - &Xpl2Client::onImagingSocketDisconnected); - connect (&m_imagingSocket, &QTcpSocket::readyRead, this, - &Xpl2Client::onImagingSocketMessageReady); - connect (&m_imagingSocket, &QAbstractSocket::errorOccurred, this, - &Xpl2Client::onImagingSocketError); - - connect (&m_statusSocket, &QTcpSocket::connected, this, - &Xpl2Client::onStatusSocketConnected); - connect (&m_statusSocket, &QTcpSocket::disconnected, this, - &Xpl2Client::onStatusSocketDisconnected); - connect (&m_statusSocket, &QTcpSocket::readyRead, this, - &Xpl2Client::onStatusSocketMessageReady); - connect (&m_statusSocket, &QAbstractSocket::errorOccurred, this, - &Xpl2Client::onStatusSocketError); + for (auto *socket : { &m_commandSocket, &m_imagingSocket, &m_statusSocket }) + { + connect (socket, &QTcpSocket::connected, this, + &Xpl2Client::onSocketConnected); + connect (socket, &QTcpSocket::disconnected, this, + &Xpl2Client::onSocketDisconnected); + connect (socket, &QTcpSocket::readyRead, this, + &Xpl2Client::onSocketMessageReady); + connect (socket, &QAbstractSocket::errorOccurred, this, + &Xpl2Client::onSocketError); + } } /* ------------------------------------------------------------------ */ @@ -61,21 +48,6 @@ Xpl2Client::isConnected () const return m_connected; } -bool -Xpl2Client::wireDebug () const -{ - return m_wireDebug; -} - -void -Xpl2Client::setWireDebug (bool enabled) -{ - if (m_wireDebug == enabled) - return; - m_wireDebug = enabled; - emit wireDebugChanged (); -} - int Xpl2Client::controllerId () const { @@ -100,6 +72,12 @@ Xpl2Client::printheadCount () const return m_printheadCount; } +void +Xpl2Client::enableWireDebug () +{ + s_wireDebug = true; +} + /* ------------------------------------------------------------------ */ /* Connection */ /* ------------------------------------------------------------------ */ @@ -142,59 +120,55 @@ Xpl2Client::sendCommand (QTcpSocket &socket, const QByteArray &command, { if (socket.state () != QAbstractSocket::ConnectedState) { - emit errorOccurred (QStringLiteral ("Socket not connected for %1") + emit errorOccurred (QStringLiteral ("Not connected for %1") .arg (QString::fromUtf8 (command))); return; } QByteArray data = Xpl2Protocol::buildMessage (command, params); socket.write (data); - if (m_wireDebug) - emit wireDebugMessage (QStringLiteral ("TX [%1:%2] %3") - .arg (socket.peerAddress ().toString ()) - .arg (socket.peerPort ()) - .arg (QString::fromUtf8 (data).trimmed ())); + QByteArray wire; + if (s_wireDebug) + wire = " >> " + data.trimmed (); + qDebug ("%s TX %s%s", qPrintable (logTag (&socket)), command.constData (), + wire.constData ()); } void Xpl2Client::dispatchCommandMessage (const Xpl2Protocol::ParsedMessage &msg) { if (msg.command == "KA_PING") - { - handleKaPing (m_commandSocket); - return; - } - if (msg.command == "GS_JC_VERSION") - { - handleGsJcVersion (msg.params); - return; - } + handleKaPing (m_commandSocket); + else if (msg.command == "GS_JC_VERSION") + handleGsJcVersion (msg.params); + else + qWarning ("%s Unknown command: %s", qPrintable (logTag (&m_commandSocket)), + msg.command.constData ()); } void Xpl2Client::dispatchImagingMessage (const Xpl2Protocol::ParsedMessage &msg) { if (msg.command == "KA_PING") - { - handleKaPing (m_imagingSocket); - return; - } + handleKaPing (m_imagingSocket); + else + qWarning ("%s Unknown command: %s", qPrintable (logTag (&m_imagingSocket)), + msg.command.constData ()); } void Xpl2Client::dispatchStatusMessage (const Xpl2Protocol::ParsedMessage &msg) { if (msg.command == "KA_PING") - { - handleKaPing (m_statusSocket); - return; - } + handleKaPing (m_statusSocket); + else + qWarning ("%s Unknown command: %s", qPrintable (logTag (&m_statusSocket)), + msg.command.constData ()); } void Xpl2Client::handleKaPing (QTcpSocket &socket) { - qDebug () << "KA_PING received, replying"; sendCommand (socket, "KA_PING", { 1 }); } @@ -210,6 +184,16 @@ Xpl2Client::handleGsJcVersion (const QVariantList ¶ms) m_firmwareVersion = params[1].toString (); m_hardwareVersion = params[2].toString (); m_printheadCount = params[3].toInt (); + qDebug ("%s controller=%d fw=%s hw=%s phCount=%d", + qPrintable (logTag (&m_commandSocket)), m_controllerId, + qPrintable (m_firmwareVersion), qPrintable (m_hardwareVersion), + m_printheadCount); + emit statusMessage ( + QStringLiteral ("RX JC Version: controller=%1 fw=%2 hw=%3 phCount=%4") + .arg (m_controllerId) + .arg (m_firmwareVersion) + .arg (m_hardwareVersion) + .arg (m_printheadCount)); emit jcVersionReceived (); } @@ -230,137 +214,90 @@ Xpl2Client::updateConnectedState () emit connectedChanged (); } -/* ------------------------------------------------------------------ */ -/* Socket slots — command */ -/* ------------------------------------------------------------------ */ - -void -Xpl2Client::onCommandSocketConnected () -{ - emit statusMessage (QStringLiteral ("Command socket connected")); - updateConnectedState (); -} - -void -Xpl2Client::onCommandSocketDisconnected () -{ - emit statusMessage (QStringLiteral ("Command socket disconnected")); - updateConnectedState (); -} - -void -Xpl2Client::onCommandSocketMessageReady () +QString +Xpl2Client::logTag (const QTcpSocket *socket) const { - while (m_commandSocket.canReadLine ()) + const char *name = "Unknown"; + quint16 port = 0; + if (socket == &m_commandSocket) { - QByteArray raw = m_commandSocket.readLine (); - if (m_wireDebug) - emit wireDebugMessage ( - QStringLiteral ("RX [%1:%2] %3") - .arg (m_commandSocket.peerAddress ().toString ()) - .arg (m_commandSocket.peerPort ()) - .arg (QString::fromUtf8 (raw).trimmed ())); - - auto msg = Xpl2Protocol::parseMessage (raw); - if (msg.valid) - dispatchCommandMessage (msg); + name = "Command"; + port = m_commandPort; } -} - -void -Xpl2Client::onCommandSocketError (QAbstractSocket::SocketError error) -{ - Q_UNUSED (error) - emit errorOccurred ( - QStringLiteral ("Command: %1").arg (m_commandSocket.errorString ())); -} - -/* ------------------------------------------------------------------ */ -/* Socket slots — imaging */ -/* ------------------------------------------------------------------ */ - -void -Xpl2Client::onImagingSocketConnected () -{ - emit statusMessage (QStringLiteral ("Imaging socket connected")); - updateConnectedState (); -} - -void -Xpl2Client::onImagingSocketDisconnected () -{ - emit statusMessage (QStringLiteral ("Imaging socket disconnected")); - updateConnectedState (); -} - -void -Xpl2Client::onImagingSocketMessageReady () -{ - while (m_imagingSocket.canReadLine ()) + else if (socket == &m_imagingSocket) { - QByteArray raw = m_imagingSocket.readLine (); - if (m_wireDebug) - emit wireDebugMessage ( - QStringLiteral ("RX [%1:%2] %3") - .arg (m_imagingSocket.peerAddress ().toString ()) - .arg (m_imagingSocket.peerPort ()) - .arg (QString::fromUtf8 (raw).trimmed ())); - - auto msg = Xpl2Protocol::parseMessage (raw); - if (msg.valid) - dispatchImagingMessage (msg); + name = "Imaging"; + port = m_imagingPort; + } + else if (socket == &m_statusSocket) + { + name = "Status"; + port = m_statusPort; } -} -void -Xpl2Client::onImagingSocketError (QAbstractSocket::SocketError error) -{ - Q_UNUSED (error) - emit errorOccurred ( - QStringLiteral ("Imaging: %1").arg (m_imagingSocket.errorString ())); + return QStringLiteral ("[%1:%2]").arg (name).arg (port).leftJustified (15); } /* ------------------------------------------------------------------ */ -/* Socket slots — status */ +/* Socket slots */ /* ------------------------------------------------------------------ */ void -Xpl2Client::onStatusSocketConnected () +Xpl2Client::onSocketConnected () { - emit statusMessage (QStringLiteral ("Status socket connected")); + auto *socket = qobject_cast (sender ()); + qInfo ("%s Connected", qPrintable (logTag (socket))); updateConnectedState (); } void -Xpl2Client::onStatusSocketDisconnected () +Xpl2Client::onSocketDisconnected () { - emit statusMessage (QStringLiteral ("Status socket disconnected")); + auto *socket = qobject_cast (sender ()); + if (!socket) + { + /* Identify by elimination — which socket just left ConnectedState? */ + for (auto *s : { &m_commandSocket, &m_imagingSocket, &m_statusSocket }) + if (s->state () != QAbstractSocket::ConnectedState) + qInfo ("%s Disconnected", qPrintable (logTag (s))); + } + else + qInfo ("%s Disconnected", qPrintable (logTag (socket))); updateConnectedState (); } void -Xpl2Client::onStatusSocketMessageReady () +Xpl2Client::onSocketMessageReady () { - while (m_statusSocket.canReadLine ()) + auto *socket = qobject_cast (sender ()); + while (socket->canReadLine ()) { - QByteArray raw = m_statusSocket.readLine (); - if (m_wireDebug) - emit wireDebugMessage ( - QStringLiteral ("RX [%1:%2] %3") - .arg (m_statusSocket.peerAddress ().toString ()) - .arg (m_statusSocket.peerPort ()) - .arg (QString::fromUtf8 (raw).trimmed ())); - + QByteArray raw = socket->readLine (); auto msg = Xpl2Protocol::parseMessage (raw); if (msg.valid) - dispatchStatusMessage (msg); + { + QByteArray wire; + if (s_wireDebug) + wire = " << " + raw.trimmed (); + qDebug ("%s RX %s%s", qPrintable (logTag (socket)), + msg.command.constData (), wire.constData ()); + + if (socket == &m_commandSocket) + dispatchCommandMessage (msg); + else if (socket == &m_imagingSocket) + dispatchImagingMessage (msg); + else + dispatchStatusMessage (msg); + } } } void -Xpl2Client::onStatusSocketError (QAbstractSocket::SocketError error) +Xpl2Client::onSocketError (QAbstractSocket::SocketError error) { Q_UNUSED (error) - emit errorOccurred ( - QStringLiteral ("Status: %1").arg (m_statusSocket.errorString ())); + auto *socket = qobject_cast (sender ()); + emit errorOccurred (QStringLiteral ("%1 %2") + .arg (logTag (socket)) + .arg (socket->errorString ())); } -- cgit v1.2.3