aboutsummaryrefslogtreecommitdiffstats
path: root/src/Xpl2Client.h
blob: 7ce70aee55498bebeadb31b588d204e97aa1dc8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/**
 * @file   Xpl2Client.h
 * @brief  TCP client for the Alchemie XPL2 printhead protocol.
 */
#pragma once

#include <QObject>
#include <QQmlEngine>
#include <QTcpSocket>

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;
};