/** * @RDE_HEADER@ * Handle incoming/outgoing data from/to all BSMs of one building * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2017-01-18 */ #pragma once #include #include #include #include #include #include "bsm_socket.h" #include "bsm_telegrams_base.h" #include "bsm_types.h" namespace BuildingControlUnit { namespace BSM { namespace Telegrams { class PanDirectFire; class PanObserverController; } class SocketHandler : public QObject { Q_OBJECT public: explicit SocketHandler(QObject *parent = nullptr); bool init(const BuildingBsmConfig &bsmConfig); bool triggerFlashlight(int bsmId, const QString &hostname, int numberOfFlashes, int pauseBetweenFlashesSec); bool triggerFlashlightPulse(int bsmId, const QString &hostname = QString(), int numberOfFlashes = 1, int pauseDuration = 1, int choppedConfiguration = 10, int flashDuration = 30); bool triggerFlashlights(int numberOfFlashes, int pauseDuration, int choppedConfiguration, int flashDuration); bool getBsmConfiguration(int bsmId); bool getBsmBitTimeout(int bsmId); bool getBsmTechnicalStatus(int bsmId); QVector bsmStates() const; Q_SIGNALS: void opticalShot(qint64 timeMSec, int sensorId, int originatorId, int ammunitionId, int deposition1, int deposition2); void opticalShotOC(qint64 timeMSec, int sensorId, int originatorId, int ammunitionId, DamageState damageState); void bsmStateChanged(const QVector &bsmStates); private Q_SLOTS: void onBsmStateTimerTimeOut(); void onDataAvailable(int id, const QByteArray &data); void onSocketConnected(int id); void onSocketDisconnected(int id); void onCleanupQueue(); void handleDirectFireSummray(); private: Socket *getSocketForBsm(int bsmId); Socket *getSocketForBsm(const QString &hostname); QByteArray parseBuffer(int id, const QByteArray &buffer); void parseBsmTelegram(int id, const QByteArray &baTele); bool requestVersion(int id); void handleDirectFire(int id, const Telegrams::PanDirectFire *tele); void handleObserverController(int id, const Telegrams::PanObserverController *tele); static bool findNextSyncStartByte(const QByteArray &buffer, int &iCurReadPos); static bool findNextSyncEndByte(const QByteArray &buffer, int &iCurReadPos); static QByteArray substituteData(const QByteArray &data); static QByteArray desubstituteData(const QByteArray &data); static bool isSameOpticalShot(const OpticalShot &o1, const OpticalShot &o2); private: QMap m_sockets; QMap m_socketData; QVector m_lastShots; QElapsedTimer m_timerOC; QTimer m_cleanupQueueTimer; QTimer m_bsmStateTimer; NGL::INGLLogger &m_logger; }; } // namespace BSM } // namespace BuildingControlUnit