/** * Websocket interface to the training area proxy * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2017-01-11 */ #pragma once #include #include #include #include #include #include namespace HighLevelArchitecture { class MainHandler; class WebSocketWrapper; class WebSocketHandler : public QObject { Q_OBJECT public: explicit WebSocketHandler(int exerciseId, MainHandler *mainHandler, QObject *parent = nullptr); ~WebSocketHandler(); bool init(quint16 listenPort); bool isConnected() const { return !m_webSockets.isEmpty(); } template bool sendTelegram(const T *data, int exerciseId) { if (!isConnected() || !data || m_webSockets.isEmpty()) return false; return sendTelegramInternal(data, TrainingAreaBase::TetraIcd::Constraints::type(), exerciseId); } Q_SIGNALS: void initRequest(const TrainingAreaBase::TetraIcd::Init &request); void biteRequest(const TrainingAreaBase::TetraIcd::DemandBite &request); void vulnerabilityStateRequest(const TrainingAreaBase::TetraIcd::DemandVulnerabilityStateChange &request); public Q_SLOTS: void sendHlaConnectionState(); void sendParticipantConnectionStates(); void onExternalEquipmentNumberAdded(int equipNo); void onExternalEquipmentNumberRemoved(int equipNo); private: void sendDataCommunicationState(int equipNo, bool bIsAvailable); bool sendTelegramInternal(const TrainingAreaBase::TetraIcd::TrainingAreaTelegram *data, const QString &type, int exerciseId); private Q_SLOTS: void onNewConnection(); void onWebSocketDisconnected(); void onTextMessageReceived(const QByteArray &baJson); private: QWebSocketServer *m_webSocketServer; QVector> m_webSockets; MainHandler *m_mainHandler; int m_exerciseId; LOGGER_T m_logger; }; class WebSocketWrapper : public QObject { Q_OBJECT public: explicit WebSocketWrapper(QWebSocket *ws); ~WebSocketWrapper(); bool sendTextMessage(const QString &msg, int exerciseId); void setExerciseId(int exerciseId); int exerciseId() const { return m_exerciseId; } QWebSocket *webSocket() const { return m_webSocket; } Q_SIGNALS: void textMessageReceived(const QByteArray &data); private Q_SLOTS: void onTextMessageReceived(const QString &data); private: QWebSocket *m_webSocket; int m_exerciseId; }; } // namespace HighLevelArchitecture