/** * Convert from/to WLS protocol / handler incoming WLS connection * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2017-01-10 */ #pragma once #include #include #include #include "logger.h" #include "wls_participant_handler.h" #include "web_socket_handler.h" #include "wls_sfm_message.h" namespace WirelessLocationSystem { class MainHandler; class WlsHandler : public QObject { Q_OBJECT private: enum class WlsTelegramId { VersionInformation = 0, PlayerPosition = 1, PlayerState = 2, PayloadMobileToHost = 3, PayloadHostToMobile = 4 }; friend std::ostream &operator<<(std::ostream &stream, WlsHandler::WlsTelegramId ti); public: static constexpr int s_maxLenTransparentData = 80; explicit WlsHandler(QObject *parent = nullptr); ~WlsHandler(); bool init(WlsParticipantHandler *participantHandler, WebSocketHandler *wsHandler, quint16 listenPort); bool isConnected() const { return !m_tcpSockets.isEmpty(); } bool sendWlsMessage(const WlsParticipant *p, const SfmMessage_tx &msg); bool sendWlsMessage(const QByteArray &tagId, const SfmMessage_tx &msg); bool sendWlsMessage(const QByteArray &tagId, WlsTelegramId telId, const QByteArray &payload); public Q_SLOTS: void sendGpsMode(WlsParticipant *participant); private Q_SLOTS: void onIncomingConnection(); void onIncomingData(); void onSocketDisconnected(); private: QByteArray parseBuffer(const QByteArray &buffer, QTcpSocket *socket); void parseWlsTelegram(const QByteArray &baTele, QTcpSocket *socket); static bool findNextSyncStartByte(const QByteArray &buffer, int &iCurReadPos); static bool findNextSyncEndByte(const QByteArray &buffer, int &iCurReadPos); bool checkPayloadIsHex(const QByteArray &payload) const; bool handleVersionsinformation(const QList &data); bool handlePlayerPosition(const QList &data, const QDateTime ×tamp); bool handlePlayerState(const QList &data); bool handleDataPayloadMobileToHost(const QList &data); void handlePayload(WlsParticipant *participant, const SfmMsgEquipmentId *sfmTele); void handlePayload(WlsParticipant *participant, const SfmMsgRequestGpsControl_rx *sfmTele); void handlePayload(WlsParticipant *participant, const SfmMsgSfmRestart_rx *sfmTele); void handlePayload(WlsParticipant *participant, const Acknowledge_rx *sfmTele); void handlePayload(WlsParticipant *participant, const SfmMsgTetra_rx *sfmTele); bool parseDoubleCm(const QByteArray &data, double &num) const; bool parseInteger(const QByteArray &data, int &num) const; WlsParticipant *participantFromTagId(const QByteArray &tagId, bool bAskForEqIdIfNew = true); private: QTcpServer *m_tcpServer = nullptr; WlsParticipantHandler *m_participantHandler = nullptr; WebSocketHandler *m_wsHandler = nullptr; // one buffer per socket QHash m_tcpSockets; QHash m_tcpSocketByTagId; double m_wlsZOffset = 0; LOGGER_T m_logger; }; } // namespace WirelessLocationSystem