87 lines
2.8 KiB
C++

#ifndef PARKINGSPACEGUIDEREMOTESERVER_H
#define PARKINGSPACEGUIDEREMOTESERVER_H
#include <atomic>
#include <functional>
#include <mutex>
#include <string>
#include <QByteArray>
#include <QJsonArray>
#include <QJsonObject>
#include <QObject>
#include <QString>
#include "IVrConfig.h"
class IVrZeroMQPublisher;
class IVrZeroMQServer;
class QUdpSocket;
class ParkingSpaceGuideRemoteServer : public QObject
{
public:
using ModelHandler = std::function<bool(const QString& modelType)>;
using StartHandler = std::function<bool(const QString& modelType)>;
using StopHandler = std::function<int()>;
using StatusProvider = std::function<std::string()>;
using RunningProvider = std::function<bool()>;
using StringProvider = std::function<QString()>;
using LogHandler = std::function<void(const QString& message)>;
using PasswordHandler = std::function<bool(const QString& password)>;
using BoolHandler = std::function<bool(bool enabled)>;
using JsonObjectProvider = std::function<QJsonObject()>;
using SessionsProvider = std::function<QJsonArray(int limit)>;
using SamplesProvider = std::function<QJsonArray(const QString& sessionUuid)>;
using ModelValidator = std::function<bool(const QString& modelType)>;
struct ControlHandlers
{
ModelHandler modelHandler;
StartHandler startHandler;
StopHandler stopHandler;
StatusProvider statusProvider;
RunningProvider runningProvider;
RunningProvider activatedProvider;
StringProvider workModeProvider;
LogHandler logHandler;
PasswordHandler passwordHandler;
BoolHandler maintenanceHandler;
BoolHandler chockHandler;
JsonObjectProvider panelConfigProvider;
SessionsProvider sessionsProvider;
SamplesProvider samplesProvider;
ModelValidator modelValidator;
};
explicit ParkingSpaceGuideRemoteServer(QObject* parent = nullptr);
~ParkingSpaceGuideRemoteServer() override;
bool Start(const RemoteViewConfig& config, ControlHandlers handlers);
void Stop();
bool IsRunning() const;
bool PublishStatus(const std::string& statusJson);
QString LastError() const;
private:
QByteArray HandleControlMessage(const QByteArray& request);
void HandleDiscoveryDatagrams();
QJsonObject BuildServerInfo(const QString& command) const;
std::string DeviceId() const;
void SetError(const QString& message);
private:
RemoteViewConfig m_config;
IVrZeroMQServer* m_controlServer = nullptr;
IVrZeroMQPublisher* m_statusPublisher = nullptr;
QUdpSocket* m_discoverySocket = nullptr;
ControlHandlers m_handlers;
std::atomic<bool> m_running{false};
mutable std::mutex m_publishMutex;
mutable std::mutex m_errorMutex;
QString m_lastError;
};
#endif // PARKINGSPACEGUIDEREMOTESERVER_H