/** * @file Xpl2Client.h * @brief TCP client for the Alchemie XPL2 printhead protocol. */ #pragma once #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 (quint16 commandPort READ commandPort WRITE setCommandPort NOTIFY commandPortChanged) Q_PROPERTY (quint16 imagingPort READ imagingPort WRITE setImagingPort NOTIFY imagingPortChanged) Q_PROPERTY (quint16 statusPort READ statusPort WRITE setStatusPort NOTIFY statusPortChanged) Q_PROPERTY (bool connected READ isConnected NOTIFY connectedChanged) public: explicit Xpl2Client (QObject *parent = nullptr); QString host () const; void setHost (const QString &host); quint16 commandPort () const; void setCommandPort (quint16 port); quint16 imagingPort () const; void setImagingPort (quint16 port); quint16 statusPort () const; void setStatusPort (quint16 port); bool isConnected () const; Q_INVOKABLE void connectToServer (); Q_INVOKABLE void disconnectFromServer (); Q_INVOKABLE void sendToCommandSocket (const QString &message); Q_INVOKABLE void sendToImagingSocket (const QString &message); Q_INVOKABLE void sendToStatusSocket (const QString &message); signals: void hostChanged (); void commandPortChanged (); void imagingPortChanged (); void statusPortChanged (); void connectedChanged (); void commandSocketResponseReceived (const QString &response); void imagingSocketResponseReceived (const QString &response); void statusSocketResponseReceived (const QString &response); void errorOccurred (const QString &error); void statusMessage (const QString &message); private slots: void onCommandSocketConnected (); void onCommandSocketDisconnected (); void onCommandSocketReadyRead (); void onCommandSocketError (QAbstractSocket::SocketError error); void onImagingSocketConnected (); void onImagingSocketDisconnected (); void onImagingSocketReadyRead (); void onImagingSocketError (QAbstractSocket::SocketError error); void onStatusSocketConnected (); void onStatusSocketDisconnected (); void onStatusSocketReadyRead (); void onStatusSocketError (QAbstractSocket::SocketError error); private: void sendToSocket (QTcpSocket &socket, const QString &label, const QString &message); 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; };