aboutsummaryrefslogtreecommitdiffstats
path: root/src/Xpl2Client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Xpl2Client.cpp')
-rw-r--r--src/Xpl2Client.cpp221
1 files changed, 158 insertions, 63 deletions
diff --git a/src/Xpl2Client.cpp b/src/Xpl2Client.cpp
index b29ac30..f7b280f 100644
--- a/src/Xpl2Client.cpp
+++ b/src/Xpl2Client.cpp
@@ -4,6 +4,8 @@
*/
#include "Xpl2Client.h"
+#include <QDebug>
+
Xpl2Client::Xpl2Client (QObject *parent) : QObject (parent)
{
connect (&m_commandSocket, &QTcpSocket::connected, this,
@@ -11,7 +13,7 @@ Xpl2Client::Xpl2Client (QObject *parent) : QObject (parent)
connect (&m_commandSocket, &QTcpSocket::disconnected, this,
&Xpl2Client::onCommandSocketDisconnected);
connect (&m_commandSocket, &QTcpSocket::readyRead, this,
- &Xpl2Client::onCommandSocketReadyRead);
+ &Xpl2Client::onCommandSocketMessageReady);
connect (&m_commandSocket, &QAbstractSocket::errorOccurred, this,
&Xpl2Client::onCommandSocketError);
@@ -20,7 +22,7 @@ Xpl2Client::Xpl2Client (QObject *parent) : QObject (parent)
connect (&m_imagingSocket, &QTcpSocket::disconnected, this,
&Xpl2Client::onImagingSocketDisconnected);
connect (&m_imagingSocket, &QTcpSocket::readyRead, this,
- &Xpl2Client::onImagingSocketReadyRead);
+ &Xpl2Client::onImagingSocketMessageReady);
connect (&m_imagingSocket, &QAbstractSocket::errorOccurred, this,
&Xpl2Client::onImagingSocketError);
@@ -29,11 +31,15 @@ Xpl2Client::Xpl2Client (QObject *parent) : QObject (parent)
connect (&m_statusSocket, &QTcpSocket::disconnected, this,
&Xpl2Client::onStatusSocketDisconnected);
connect (&m_statusSocket, &QTcpSocket::readyRead, this,
- &Xpl2Client::onStatusSocketReadyRead);
+ &Xpl2Client::onStatusSocketMessageReady);
connect (&m_statusSocket, &QAbstractSocket::errorOccurred, this,
&Xpl2Client::onStatusSocketError);
}
+/* ------------------------------------------------------------------ */
+/* Properties */
+/* ------------------------------------------------------------------ */
+
QString
Xpl2Client::host () const
{
@@ -49,57 +55,55 @@ Xpl2Client::setHost (const QString &host)
emit hostChanged ();
}
-quint16
-Xpl2Client::commandPort () const
+bool
+Xpl2Client::isConnected () const
{
- return m_commandPort;
+ return m_connected;
}
-void
-Xpl2Client::setCommandPort (quint16 port)
+bool
+Xpl2Client::wireDebug () const
{
- if (m_commandPort == port)
- return;
- m_commandPort = port;
- emit commandPortChanged ();
+ return m_wireDebug;
}
-quint16
-Xpl2Client::imagingPort () const
+void
+Xpl2Client::setWireDebug (bool enabled)
{
- return m_imagingPort;
+ if (m_wireDebug == enabled)
+ return;
+ m_wireDebug = enabled;
+ emit wireDebugChanged ();
}
-void
-Xpl2Client::setImagingPort (quint16 port)
+int
+Xpl2Client::controllerId () const
{
- if (m_imagingPort == port)
- return;
- m_imagingPort = port;
- emit imagingPortChanged ();
+ return m_controllerId;
}
-quint16
-Xpl2Client::statusPort () const
+QString
+Xpl2Client::firmwareVersion () const
{
- return m_statusPort;
+ return m_firmwareVersion;
}
-void
-Xpl2Client::setStatusPort (quint16 port)
+QString
+Xpl2Client::hardwareVersion () const
{
- if (m_statusPort == port)
- return;
- m_statusPort = port;
- emit statusPortChanged ();
+ return m_hardwareVersion;
}
-bool
-Xpl2Client::isConnected () const
+int
+Xpl2Client::printheadCount () const
{
- return m_connected;
+ return m_printheadCount;
}
+/* ------------------------------------------------------------------ */
+/* Connection */
+/* ------------------------------------------------------------------ */
+
void
Xpl2Client::connectToServer ()
{
@@ -108,11 +112,7 @@ Xpl2Client::connectToServer ()
emit statusMessage (QStringLiteral ("Already connected"));
return;
}
- emit statusMessage (QStringLiteral ("Connecting to %1 (ports %2/%3/%4)…")
- .arg (m_host)
- .arg (m_commandPort)
- .arg (m_imagingPort)
- .arg (m_statusPort));
+ emit statusMessage (QStringLiteral ("Connecting to %1…").arg (m_host));
m_commandSocket.connectToHost (m_host, m_commandPort);
m_imagingSocket.connectToHost (m_host, m_imagingPort);
m_statusSocket.connectToHost (m_host, m_statusPort);
@@ -127,38 +127,96 @@ Xpl2Client::disconnectFromServer ()
}
void
-Xpl2Client::sendToCommandSocket (const QString &message)
+Xpl2Client::getJcVersion ()
+{
+ sendCommand (m_commandSocket, "GS_JC_VERSION");
+}
+
+/* ------------------------------------------------------------------ */
+/* Send / dispatch */
+/* ------------------------------------------------------------------ */
+
+void
+Xpl2Client::sendCommand (QTcpSocket &socket, const QByteArray &command,
+ const QVariantList &params)
+{
+ if (socket.state () != QAbstractSocket::ConnectedState)
+ {
+ emit errorOccurred (QStringLiteral ("Socket 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 ()));
+}
+
+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;
+ }
+}
+
+void
+Xpl2Client::dispatchImagingMessage (const Xpl2Protocol::ParsedMessage &msg)
{
- sendToSocket (m_commandSocket, QStringLiteral ("Command"), message);
+ if (msg.command == "KA_PING")
+ {
+ handleKaPing (m_imagingSocket);
+ return;
+ }
}
void
-Xpl2Client::sendToImagingSocket (const QString &message)
+Xpl2Client::dispatchStatusMessage (const Xpl2Protocol::ParsedMessage &msg)
{
- sendToSocket (m_imagingSocket, QStringLiteral ("Imaging"), message);
+ if (msg.command == "KA_PING")
+ {
+ handleKaPing (m_statusSocket);
+ return;
+ }
}
void
-Xpl2Client::sendToStatusSocket (const QString &message)
+Xpl2Client::handleKaPing (QTcpSocket &socket)
{
- sendToSocket (m_statusSocket, QStringLiteral ("Status"), message);
+ qDebug () << "KA_PING received, replying";
+ sendCommand (socket, "KA_PING", { 1 });
}
void
-Xpl2Client::sendToSocket (QTcpSocket &socket, const QString &label,
- const QString &message)
+Xpl2Client::handleGsJcVersion (const QVariantList &params)
{
- if (socket.state () != QAbstractSocket::ConnectedState)
+ if (params.size () < 4)
{
- emit errorOccurred (
- QStringLiteral ("%1 socket not connected").arg (label));
+ qWarning () << "GS_JC_VERSION: expected 4 params, got" << params.size ();
return;
}
- QByteArray data = message.toUtf8 () + '\n';
- socket.write (data);
- emit statusMessage (QStringLiteral ("Sent [%1]: %2").arg (label, message));
+ m_controllerId = params[0].toInt ();
+ m_firmwareVersion = params[1].toString ();
+ m_hardwareVersion = params[2].toString ();
+ m_printheadCount = params[3].toInt ();
+ emit jcVersionReceived ();
}
+/* ------------------------------------------------------------------ */
+/* Internal */
+/* ------------------------------------------------------------------ */
+
void
Xpl2Client::updateConnectedState ()
{
@@ -172,6 +230,10 @@ Xpl2Client::updateConnectedState ()
emit connectedChanged ();
}
+/* ------------------------------------------------------------------ */
+/* Socket slots — command */
+/* ------------------------------------------------------------------ */
+
void
Xpl2Client::onCommandSocketConnected ()
{
@@ -187,13 +249,21 @@ Xpl2Client::onCommandSocketDisconnected ()
}
void
-Xpl2Client::onCommandSocketReadyRead ()
+Xpl2Client::onCommandSocketMessageReady ()
{
while (m_commandSocket.canReadLine ())
{
- QString line
- = QString::fromUtf8 (m_commandSocket.readLine ()).trimmed ();
- emit commandSocketResponseReceived (line);
+ 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);
}
}
@@ -205,6 +275,10 @@ Xpl2Client::onCommandSocketError (QAbstractSocket::SocketError error)
QStringLiteral ("Command: %1").arg (m_commandSocket.errorString ()));
}
+/* ------------------------------------------------------------------ */
+/* Socket slots — imaging */
+/* ------------------------------------------------------------------ */
+
void
Xpl2Client::onImagingSocketConnected ()
{
@@ -220,13 +294,21 @@ Xpl2Client::onImagingSocketDisconnected ()
}
void
-Xpl2Client::onImagingSocketReadyRead ()
+Xpl2Client::onImagingSocketMessageReady ()
{
while (m_imagingSocket.canReadLine ())
{
- QString line
- = QString::fromUtf8 (m_imagingSocket.readLine ()).trimmed ();
- emit imagingSocketResponseReceived (line);
+ 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);
}
}
@@ -238,6 +320,10 @@ Xpl2Client::onImagingSocketError (QAbstractSocket::SocketError error)
QStringLiteral ("Imaging: %1").arg (m_imagingSocket.errorString ()));
}
+/* ------------------------------------------------------------------ */
+/* Socket slots — status */
+/* ------------------------------------------------------------------ */
+
void
Xpl2Client::onStatusSocketConnected ()
{
@@ -253,12 +339,21 @@ Xpl2Client::onStatusSocketDisconnected ()
}
void
-Xpl2Client::onStatusSocketReadyRead ()
+Xpl2Client::onStatusSocketMessageReady ()
{
while (m_statusSocket.canReadLine ())
{
- QString line = QString::fromUtf8 (m_statusSocket.readLine ()).trimmed ();
- emit statusSocketResponseReceived (line);
+ 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 ()));
+
+ auto msg = Xpl2Protocol::parseMessage (raw);
+ if (msg.valid)
+ dispatchStatusMessage (msg);
}
}