aboutsummaryrefslogtreecommitdiffstats
path: root/jetting-proxy/JettingProxy.h
diff options
context:
space:
mode:
Diffstat (limited to 'jetting-proxy/JettingProxy.h')
-rw-r--r--jetting-proxy/JettingProxy.h54
1 files changed, 54 insertions, 0 deletions
diff --git a/jetting-proxy/JettingProxy.h b/jetting-proxy/JettingProxy.h
new file mode 100644
index 0000000..ec8c26d
--- /dev/null
+++ b/jetting-proxy/JettingProxy.h
@@ -0,0 +1,54 @@
+/**
+ * @file JettingProxy.h
+ * @brief Transparent TCP relay between one controller and N clients.
+ */
+#pragma once
+
+#include <QList>
+#include <QObject>
+#include <QTcpServer>
+#include <QTcpSocket>
+#include <QTimer>
+
+class JettingProxy : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit JettingProxy (quint16 controllerPortBase, quint16 clientPortBase,
+ QObject *parent = nullptr);
+ static void enableWireDebug ();
+
+private slots:
+ void onControllerConnected ();
+ void onControllerDisconnected ();
+ void onControllerDataReady ();
+ void onClientConnected ();
+ void onClientDisconnected ();
+ void onClientDataReady ();
+ /* Send KA_PING to all connected clients on all channels. */
+ void tick ();
+
+private:
+ struct Channel
+ {
+ const char *name = nullptr;
+ QTcpServer controllerServer;
+ QTcpSocket *controllerSocket = nullptr;
+ QTcpServer clientServer;
+ QList<QTcpSocket *> clientSockets;
+ };
+
+ void setupChannel (Channel &channel, const char *name,
+ quint16 controllerPort, quint16 clientPort);
+ Channel *channelForControllerServer (QTcpServer *server);
+ Channel *channelForControllerSocket (QTcpSocket *socket);
+ Channel *channelForClientSocket (QTcpSocket *socket);
+ QString logTag (const Channel &channel) const;
+
+ Channel m_command;
+ Channel m_imaging;
+ Channel m_status;
+ QTimer m_tickTimer;
+ static bool s_wireDebug;
+};