diff options
| -rw-r--r-- | demo/Main.qml | 45 | ||||
| -rw-r--r-- | src/Xpl2Client.cpp | 184 | ||||
| -rw-r--r-- | src/Xpl2Client.h | 33 |
3 files changed, 216 insertions, 46 deletions
diff --git a/demo/Main.qml b/demo/Main.qml index fe9f885..d234eae 100644 --- a/demo/Main.qml +++ b/demo/Main.qml @@ -14,6 +14,13 @@ ApplicationWindow { width: 800 Connections { + function onCommandSocketResponseReceived(response: string) { + debugConsole.appendLog("Command: " + response); + responseModel.append({ + text: "[Command] " + response + }); + } + function onConnectedChanged() { debugConsole.appendLog(Xpl2Client.connected ? "Connected" : "Disconnected"); @@ -23,10 +30,10 @@ ApplicationWindow { debugConsole.appendLog("ERROR: " + error); } - function onResponseReceived(response: string) { - debugConsole.appendLog("Received: " + response); + function onImagingSocketResponseReceived(response: string) { + debugConsole.appendLog("Imaging: " + response); responseModel.append({ - text: response + text: "[Imaging] " + response }); } @@ -34,6 +41,13 @@ ApplicationWindow { debugConsole.appendLog(message); } + function onStatusSocketResponseReceived(response: string) { + debugConsole.appendLog("Status: " + response); + responseModel.append({ + text: "[Status] " + response + }); + } + target: Xpl2Client } @@ -141,20 +155,26 @@ ApplicationWindow { } } - // --- Send Command --- + // --- Send Message --- GroupBox { Layout.fillWidth: true enabled: Xpl2Client.connected - title: "Command" + title: "Send" RowLayout { anchors.fill: parent + ComboBox { + id: portCombo + + model: ["Command", "Imaging", "Status"] + } + TextField { id: cmdField Layout.fillWidth: true - placeholderText: "Enter command…" + placeholderText: "Enter message…" onAccepted: sendBtn.clicked() } @@ -165,10 +185,15 @@ ApplicationWindow { text: "Send" onClicked: { - if (cmdField.text.length > 0) { - Xpl2Client.sendCommand(cmdField.text); - cmdField.text = ""; - } + if (cmdField.text.length === 0) + return; + if (portCombo.currentIndex === 0) + Xpl2Client.sendToCommandSocket(cmdField.text); + else if (portCombo.currentIndex === 1) + Xpl2Client.sendToImagingSocket(cmdField.text); + else + Xpl2Client.sendToStatusSocket(cmdField.text); + cmdField.text = ""; } } } diff --git a/src/Xpl2Client.cpp b/src/Xpl2Client.cpp index 8ed032f..b29ac30 100644 --- a/src/Xpl2Client.cpp +++ b/src/Xpl2Client.cpp @@ -6,12 +6,32 @@ 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); + connect (&m_commandSocket, &QTcpSocket::connected, this, + &Xpl2Client::onCommandSocketConnected); + connect (&m_commandSocket, &QTcpSocket::disconnected, this, + &Xpl2Client::onCommandSocketDisconnected); + connect (&m_commandSocket, &QTcpSocket::readyRead, this, + &Xpl2Client::onCommandSocketReadyRead); + connect (&m_commandSocket, &QAbstractSocket::errorOccurred, this, + &Xpl2Client::onCommandSocketError); + + connect (&m_imagingSocket, &QTcpSocket::connected, this, + &Xpl2Client::onImagingSocketConnected); + connect (&m_imagingSocket, &QTcpSocket::disconnected, this, + &Xpl2Client::onImagingSocketDisconnected); + connect (&m_imagingSocket, &QTcpSocket::readyRead, this, + &Xpl2Client::onImagingSocketReadyRead); + connect (&m_imagingSocket, &QAbstractSocket::errorOccurred, this, + &Xpl2Client::onImagingSocketError); + + connect (&m_statusSocket, &QTcpSocket::connected, this, + &Xpl2Client::onStatusSocketConnected); + connect (&m_statusSocket, &QTcpSocket::disconnected, this, + &Xpl2Client::onStatusSocketDisconnected); + connect (&m_statusSocket, &QTcpSocket::readyRead, this, + &Xpl2Client::onStatusSocketReadyRead); + connect (&m_statusSocket, &QAbstractSocket::errorOccurred, this, + &Xpl2Client::onStatusSocketError); } QString @@ -77,69 +97,175 @@ Xpl2Client::setStatusPort (quint16 port) bool Xpl2Client::isConnected () const { - return m_socket.state () == QAbstractSocket::ConnectedState; + return m_connected; } void Xpl2Client::connectToServer () { - if (isConnected ()) + if (m_connected) { emit statusMessage (QStringLiteral ("Already connected")); return; } - emit statusMessage (QStringLiteral ("Connecting to %1:%2…") + emit statusMessage (QStringLiteral ("Connecting to %1 (ports %2/%3/%4)…") .arg (m_host) - .arg (m_commandPort)); - m_socket.connectToHost (m_host, m_commandPort); + .arg (m_commandPort) + .arg (m_imagingPort) + .arg (m_statusPort)); + m_commandSocket.connectToHost (m_host, m_commandPort); + m_imagingSocket.connectToHost (m_host, m_imagingPort); + m_statusSocket.connectToHost (m_host, m_statusPort); } void Xpl2Client::disconnectFromServer () { - if (!isConnected ()) - return; - m_socket.disconnectFromHost (); + m_commandSocket.disconnectFromHost (); + m_imagingSocket.disconnectFromHost (); + m_statusSocket.disconnectFromHost (); +} + +void +Xpl2Client::sendToCommandSocket (const QString &message) +{ + sendToSocket (m_commandSocket, QStringLiteral ("Command"), message); +} + +void +Xpl2Client::sendToImagingSocket (const QString &message) +{ + sendToSocket (m_imagingSocket, QStringLiteral ("Imaging"), message); +} + +void +Xpl2Client::sendToStatusSocket (const QString &message) +{ + sendToSocket (m_statusSocket, QStringLiteral ("Status"), message); } void -Xpl2Client::sendCommand (const QString &command) +Xpl2Client::sendToSocket (QTcpSocket &socket, const QString &label, + const QString &message) { - if (!isConnected ()) + if (socket.state () != QAbstractSocket::ConnectedState) { - emit errorOccurred (QStringLiteral ("Not connected")); + emit errorOccurred ( + QStringLiteral ("%1 socket not connected").arg (label)); return; } - QByteArray data = command.toUtf8 () + '\n'; - m_socket.write (data); - emit statusMessage (QStringLiteral ("Sent: %1").arg (command)); + QByteArray data = message.toUtf8 () + '\n'; + socket.write (data); + emit statusMessage (QStringLiteral ("Sent [%1]: %2").arg (label, message)); } void -Xpl2Client::onConnected () +Xpl2Client::updateConnectedState () { + bool allConnected + = m_commandSocket.state () == QAbstractSocket::ConnectedState + && m_imagingSocket.state () == QAbstractSocket::ConnectedState + && m_statusSocket.state () == QAbstractSocket::ConnectedState; + if (m_connected == allConnected) + return; + m_connected = allConnected; emit connectedChanged (); } void -Xpl2Client::onDisconnected () +Xpl2Client::onCommandSocketConnected () { - emit connectedChanged (); + emit statusMessage (QStringLiteral ("Command socket connected")); + updateConnectedState (); +} + +void +Xpl2Client::onCommandSocketDisconnected () +{ + emit statusMessage (QStringLiteral ("Command socket disconnected")); + updateConnectedState (); +} + +void +Xpl2Client::onCommandSocketReadyRead () +{ + while (m_commandSocket.canReadLine ()) + { + QString line + = QString::fromUtf8 (m_commandSocket.readLine ()).trimmed (); + emit commandSocketResponseReceived (line); + } +} + +void +Xpl2Client::onCommandSocketError (QAbstractSocket::SocketError error) +{ + Q_UNUSED (error) + emit errorOccurred ( + QStringLiteral ("Command: %1").arg (m_commandSocket.errorString ())); +} + +void +Xpl2Client::onImagingSocketConnected () +{ + emit statusMessage (QStringLiteral ("Imaging socket connected")); + updateConnectedState (); +} + +void +Xpl2Client::onImagingSocketDisconnected () +{ + emit statusMessage (QStringLiteral ("Imaging socket disconnected")); + updateConnectedState (); +} + +void +Xpl2Client::onImagingSocketReadyRead () +{ + while (m_imagingSocket.canReadLine ()) + { + QString line + = QString::fromUtf8 (m_imagingSocket.readLine ()).trimmed (); + emit imagingSocketResponseReceived (line); + } +} + +void +Xpl2Client::onImagingSocketError (QAbstractSocket::SocketError error) +{ + Q_UNUSED (error) + emit errorOccurred ( + QStringLiteral ("Imaging: %1").arg (m_imagingSocket.errorString ())); +} + +void +Xpl2Client::onStatusSocketConnected () +{ + emit statusMessage (QStringLiteral ("Status socket connected")); + updateConnectedState (); +} + +void +Xpl2Client::onStatusSocketDisconnected () +{ + emit statusMessage (QStringLiteral ("Status socket disconnected")); + updateConnectedState (); } void -Xpl2Client::onReadyRead () +Xpl2Client::onStatusSocketReadyRead () { - while (m_socket.canReadLine ()) + while (m_statusSocket.canReadLine ()) { - QString line = QString::fromUtf8 (m_socket.readLine ()).trimmed (); - emit responseReceived (line); + QString line = QString::fromUtf8 (m_statusSocket.readLine ()).trimmed (); + emit statusSocketResponseReceived (line); } } void -Xpl2Client::onErrorOccurred (QAbstractSocket::SocketError error) +Xpl2Client::onStatusSocketError (QAbstractSocket::SocketError error) { Q_UNUSED (error) - emit errorOccurred (m_socket.errorString ()); + emit errorOccurred ( + QStringLiteral ("Status: %1").arg (m_statusSocket.errorString ())); } diff --git a/src/Xpl2Client.h b/src/Xpl2Client.h index d339bc3..7ce70ae 100644 --- a/src/Xpl2Client.h +++ b/src/Xpl2Client.h @@ -42,7 +42,9 @@ public: Q_INVOKABLE void connectToServer (); Q_INVOKABLE void disconnectFromServer (); - Q_INVOKABLE void sendCommand (const QString &command); + Q_INVOKABLE void sendToCommandSocket (const QString &message); + Q_INVOKABLE void sendToImagingSocket (const QString &message); + Q_INVOKABLE void sendToStatusSocket (const QString &message); signals: void hostChanged (); @@ -50,20 +52,37 @@ signals: void imagingPortChanged (); void statusPortChanged (); void connectedChanged (); - void responseReceived (const QString &response); + 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 onConnected (); - void onDisconnected (); - void onReadyRead (); - void onErrorOccurred (QAbstractSocket::SocketError error); + 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: - QTcpSocket m_socket; + 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; }; |
