102 lines
3.1 KiB
C++
Executable File
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
|