From e9d8a8b052150f42ea00da2c07e3f78a9b7d2061 Mon Sep 17 00:00:00 2001 From: Thomas Vanbesien Date: Tue, 24 Mar 2026 17:25:03 +0100 Subject: Add JettingProxy relay, convert Xpl2Client to active connection model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Insert a transparent TCP proxy between the controller and N clients: - JettingProxy listens on 9110-9112 (controller) and 9210-9212 (clients) - Broadcasts controller frames to all clients, forwards client→controller - Independent KA_PING handling on both sides Convert Xpl2Client from passive QTcpServer listener to active QTcpSocket outbound connections with auto-retry. New QML API: host/commandPort properties, connectToProxy()/disconnectFromProxy() replacing startListening()/stopListening(). --- jetting-proxy/JettingProxy.h | 54 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 jetting-proxy/JettingProxy.h (limited to 'jetting-proxy/JettingProxy.h') 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 +#include +#include +#include +#include + +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 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; +}; -- cgit v1.2.3