/** * @file Xpl2Client.h * @brief TCP client for the Alchemie XPL2 printhead protocol. */ #pragma once #include "Xpl2Protocol.h" #include #include #include class Xpl2Client : public QObject { Q_OBJECT QML_ELEMENT QML_SINGLETON Q_PROPERTY (QString host READ host WRITE setHost NOTIFY hostChanged) Q_PROPERTY (bool connected READ isConnected NOTIFY connectedChanged) Q_PROPERTY (int controllerId READ controllerId NOTIFY jcVersionReceived) Q_PROPERTY ( QString firmwareVersion READ firmwareVersion NOTIFY jcVersionReceived) Q_PROPERTY ( QString hardwareVersion READ hardwareVersion NOTIFY jcVersionReceived) Q_PROPERTY (int printheadCount READ printheadCount NOTIFY jcVersionReceived) public: explicit Xpl2Client (QObject *parent = nullptr); QString host () const; void setHost (const QString &host); bool isConnected () const; int controllerId () const; QString firmwareVersion () const; QString hardwareVersion () const; int printheadCount () const; static void enableWireDebug (); Q_INVOKABLE void connectToServer (); Q_INVOKABLE void disconnectFromServer (); Q_INVOKABLE void getJcVersion (); signals: void hostChanged (); void connectedChanged (); void errorOccurred (const QString &error); void statusMessage (const QString &message); void jcVersionReceived (); private slots: void onSocketConnected (); void onSocketDisconnected (); void onSocketMessageReady (); void onSocketError (QAbstractSocket::SocketError error); private: void sendCommand (QTcpSocket &socket, const QByteArray &command, const QVariantList ¶ms = {}); void dispatchCommandMessage (const Xpl2Protocol::ParsedMessage &msg); void dispatchImagingMessage (const Xpl2Protocol::ParsedMessage &msg); void dispatchStatusMessage (const Xpl2Protocol::ParsedMessage &msg); void handleKaPing (QTcpSocket &socket); void handleGsJcVersion (const QVariantList ¶ms); void updateConnectedState (); QString logTag (const QTcpSocket *socket) const; QTcpSocket m_commandSocket; QTcpSocket m_imagingSocket; QTcpSocket m_statusSocket; QString m_host = QStringLiteral ("127.0.0.1"); quint16 m_commandPort = 9110; quint16 m_imagingPort = 9111; quint16 m_statusPort = 9112; bool m_connected = false; static bool s_wireDebug; int m_controllerId = 0; QString m_firmwareVersion; QString m_hardwareVersion; int m_printheadCount = 0; };