aboutsummaryrefslogtreecommitdiffstats
path: root/src/Xpl2Client.h
blob: 9212771b81a2477fbf794bfc29ef9a92d826969a (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
89
90
91
92
93
94
95
96
/**
 * @file   Xpl2Client.h
 * @brief  TCP client for the Alchemie XPL2 printhead protocol.
 */
#pragma once

#include "Xpl2Protocol.h"

#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 (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 &params = {});
  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 &params);
  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;
};