/** * @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 ( bool wireDebug READ wireDebug WRITE setWireDebug NOTIFY wireDebugChanged) 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; bool wireDebug () const; void setWireDebug (bool enabled); int controllerId () const; QString firmwareVersion () const; QString hardwareVersion () const; int printheadCount () const; Q_INVOKABLE void connectToServer (); Q_INVOKABLE void disconnectFromServer (); Q_INVOKABLE void getJcVersion (); signals: void hostChanged (); void connectedChanged (); void wireDebugChanged (); void errorOccurred (const QString &error); void statusMessage (const QString &message); void wireDebugMessage (const QString &message); void jcVersionReceived (); private slots: void onCommandSocketConnected (); void onCommandSocketDisconnected (); void onCommandSocketMessageReady (); void onCommandSocketError (QAbstractSocket::SocketError error); void onImagingSocketConnected (); void onImagingSocketDisconnected (); void onImagingSocketMessageReady (); void onImagingSocketError (QAbstractSocket::SocketError error); void onStatusSocketConnected (); void onStatusSocketDisconnected (); void onStatusSocketMessageReady (); void onStatusSocketError (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 (); 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; bool m_wireDebug = false; int m_controllerId = 0; QString m_firmwareVersion; QString m_hardwareVersion; int m_printheadCount = 0; };