90 lines
2.5 KiB
C
90 lines
2.5 KiB
C
|
|
#ifndef REMOTEGUIDECLIENT_H
|
||
|
|
#define REMOTEGUIDECLIENT_H
|
||
|
|
|
||
|
|
#include <QByteArray>
|
||
|
|
#include <QJsonObject>
|
||
|
|
#include <QObject>
|
||
|
|
#include <QString>
|
||
|
|
|
||
|
|
class IVrZeroMQSubscriber;
|
||
|
|
class QUdpSocket;
|
||
|
|
class QTimer;
|
||
|
|
|
||
|
|
template<typename T>
|
||
|
|
class QFutureWatcher;
|
||
|
|
|
||
|
|
class RemoteGuideClient : public QObject
|
||
|
|
{
|
||
|
|
Q_OBJECT
|
||
|
|
|
||
|
|
public:
|
||
|
|
explicit RemoteGuideClient(int discoveryPort = 5555,
|
||
|
|
QObject* parent = nullptr);
|
||
|
|
~RemoteGuideClient() override;
|
||
|
|
|
||
|
|
bool IsConnected() const;
|
||
|
|
bool IsGuidanceRunning() const;
|
||
|
|
QString ServerAddress() const;
|
||
|
|
|
||
|
|
void SelectModel(const QString& modelType);
|
||
|
|
void StartGuidance(const QString& modelType);
|
||
|
|
void StopGuidance();
|
||
|
|
void RequestStatus();
|
||
|
|
|
||
|
|
signals:
|
||
|
|
void ConnectionStateChanged(bool connected,
|
||
|
|
const QString& message,
|
||
|
|
const QString& deviceName,
|
||
|
|
const QString& address);
|
||
|
|
void StatusReceived(const QJsonObject& status);
|
||
|
|
void GuidanceRunningChanged(bool running);
|
||
|
|
void CommandFinished(const QString& command,
|
||
|
|
bool ok,
|
||
|
|
const QString& message,
|
||
|
|
const QJsonObject& response);
|
||
|
|
|
||
|
|
private:
|
||
|
|
struct ControlReply
|
||
|
|
{
|
||
|
|
int generation = 0;
|
||
|
|
QString command;
|
||
|
|
bool transportOk = false;
|
||
|
|
QString errorMessage;
|
||
|
|
QJsonObject response;
|
||
|
|
};
|
||
|
|
|
||
|
|
void EnsureDiscoverySocket();
|
||
|
|
void SendDiscovery();
|
||
|
|
void ReadDiscoveryDatagrams();
|
||
|
|
bool ConnectToServer(const QString& address,
|
||
|
|
const QJsonObject& serverInfo);
|
||
|
|
void DisconnectServer(const QString& reason);
|
||
|
|
void SendControlCommand(const QString& command,
|
||
|
|
const QJsonObject& arguments = QJsonObject());
|
||
|
|
void HandleControlFinished();
|
||
|
|
void HandleStatusPayload(const QByteArray& payload);
|
||
|
|
void SetConnectionMessage(const QString& message);
|
||
|
|
|
||
|
|
private:
|
||
|
|
int m_discoveryPort = 5555;
|
||
|
|
QUdpSocket* m_discoverySocket = nullptr;
|
||
|
|
QTimer* m_discoveryTimer = nullptr;
|
||
|
|
QTimer* m_heartbeatTimer = nullptr;
|
||
|
|
IVrZeroMQSubscriber* m_subscriber = nullptr;
|
||
|
|
QFutureWatcher<ControlReply>* m_requestWatcher = nullptr;
|
||
|
|
|
||
|
|
QString m_serverAddress;
|
||
|
|
QString m_deviceName;
|
||
|
|
QString m_topic;
|
||
|
|
QString m_connectionMessage;
|
||
|
|
int m_controlPort = 0;
|
||
|
|
int m_publishPort = 0;
|
||
|
|
int m_generation = 0;
|
||
|
|
int m_discoveryAttempt = 0;
|
||
|
|
bool m_connected = false;
|
||
|
|
bool m_guidanceRunning = false;
|
||
|
|
bool m_requestInFlight = false;
|
||
|
|
};
|
||
|
|
|
||
|
|
#endif // REMOTEGUIDECLIENT_H
|