Files
qt5-legatus-legacy/Lts/Proxies/Buildings/BuildingControlUnit/BSM/bsm_socket_handler.h
T
2026-08-13 18:33:10 +02:00

102 lines
3.1 KiB
C++
Executable File

/**
* @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 <QObject>
#include <QMap>
#include <QTimer>
#include <QElapsedTimer>
#include <logger.h>
#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<BsmState> 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<BsmState> &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<int, Socket *> m_sockets;
QMap<int, QByteArray> m_socketData;
QVector<OpticalShot> m_lastShots;
QElapsedTimer m_timerOC;
QTimer m_cleanupQueueTimer;
QTimer m_bsmStateTimer;
NGL::INGLLogger &m_logger;
};
} // namespace BSM
} // namespace BuildingControlUnit