From 35309337aacac2eac7d7215e526bddcf7647b8cf Mon Sep 17 00:00:00 2001 From: Thomas Vanbesien Date: Wed, 11 Mar 2026 11:02:24 +0100 Subject: Initial project setup: Qt 6.10.2 TCP client library for Alchemie XPL2 protocol - Static library (src/) with QML singleton Xpl2Client for TCP communication - Qt Quick demo app (demo/) with connection UI, command input, and response log --- src/Xpl2Client.cpp | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/Xpl2Client.cpp (limited to 'src/Xpl2Client.cpp') diff --git a/src/Xpl2Client.cpp b/src/Xpl2Client.cpp new file mode 100644 index 0000000..db53792 --- /dev/null +++ b/src/Xpl2Client.cpp @@ -0,0 +1,86 @@ +/** + * @file Xpl2Client.cpp + * @brief TCP client for the Alchemie XPL2 printhead protocol. + */ +#include "Xpl2Client.h" + +Xpl2Client::Xpl2Client(QObject *parent) : QObject(parent) { + connect(&m_socket, &QTcpSocket::connected, this, &Xpl2Client::onConnected); + connect(&m_socket, &QTcpSocket::disconnected, this, + &Xpl2Client::onDisconnected); + connect(&m_socket, &QTcpSocket::readyRead, this, &Xpl2Client::onReadyRead); + connect(&m_socket, &QAbstractSocket::errorOccurred, this, + &Xpl2Client::onErrorOccurred); +} + +QString Xpl2Client::host() const { return m_host; } + +void Xpl2Client::setHost(const QString &host) { + if (m_host == host) + return; + m_host = host; + emit hostChanged(); +} + +quint16 Xpl2Client::port() const { return m_port; } + +void Xpl2Client::setPort(quint16 port) { + if (m_port == port) + return; + m_port = port; + emit portChanged(); +} + +bool Xpl2Client::isConnected() const { + return m_socket.state() == QAbstractSocket::ConnectedState; +} + +void Xpl2Client::connectToServer() { + if (isConnected()) { + emit statusMessage(QStringLiteral("Already connected")); + return; + } + emit statusMessage( + QStringLiteral("Connecting to %1:%2…").arg(m_host).arg(m_port)); + m_socket.connectToHost(m_host, m_port); +} + +void Xpl2Client::disconnectFromServer() { + if (!isConnected()) + return; + m_socket.disconnectFromHost(); +} + +void Xpl2Client::sendCommand(const QString &command) { + if (!isConnected()) { + emit errorOccurred(QStringLiteral("Not connected")); + return; + } + QByteArray data = command.toUtf8() + '\n'; + m_socket.write(data); + emit statusMessage(QStringLiteral("Sent: %1").arg(command)); +} + +void Xpl2Client::onConnected() { + emit connectedChanged(); + emit statusMessage(QStringLiteral("Connected to %1:%2") + .arg(m_socket.peerName()) + .arg(m_socket.peerPort())); +} + +void Xpl2Client::onDisconnected() { + emit connectedChanged(); + emit statusMessage(QStringLiteral("Disconnected")); +} + +void Xpl2Client::onReadyRead() { + while (m_socket.canReadLine()) { + QString line = QString::fromUtf8(m_socket.readLine()).trimmed(); + emit responseReceived(line); + } +} + +void Xpl2Client::onErrorOccurred(QAbstractSocket::SocketError error) { + Q_UNUSED(error) + emit errorOccurred(m_socket.errorString()); +} -- cgit v1.2.3