101 lines
3.2 KiB
C
Raw Normal View History

2026-07-30 12:06:02 +08:00
#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, const QString& password = QString());
void StartGuidance(const QString& modelType, const QString& password = QString());
void StopGuidance(const QString& password = QString());
2026-07-30 12:06:02 +08:00
void RequestStatus();
void Login(const QString& password);
void SetMaintenanceMode(bool enabled, const QString& password = QString());
void RecordChock(bool chockOn, const QString& password = QString());
void RequestPanelConfig();
void RequestSessions(int limit = 50, const QString& password = QString());
void RequestSessionSamples(const QString& sessionUuid,
const QString& password = QString());
QString SessionPassword() const;
void SetSessionPassword(const QString& password);
void ClearSessionPassword();
2026-07-30 12:06:02 +08:00
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;
QString m_password;
2026-07-30 12:06:02 +08:00
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