/** * A single building instance * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2017-02-06 */ #pragma once #include #include #include #include #include "ism_handler.h" #include "logger.h" #include #include class QWebSocket; namespace AssetManagement { class RelayInfo; } namespace Buildings { class BuildingProcess : public QObject , protected InfrastructureManagement::Interface::Ftc::StructureElementUpdateEffectOverrideReplyHandler { Q_OBJECT public: BuildingProcess(MainHandler *mainHandler, const QString &procName, const BuildingInfo &info, const bool initBuilding, QObject *parent = nullptr); ~BuildingProcess(); void setBuildingInfo(const BuildingInfo &info); void newRelayInfos(const QMap &map); const BuildingInfo &buildingInfo() const { return m_buildingInfo; } quint16 getWebsocketPort() {return QUrl::fromEncoded(m_wsUrl.toLocal8Bit()).port();} protected: void onStructureElementUpdateEffectOverrideReply(const Core::FunctionReplyObject &replyObject) override final; public Q_SLOTS: bool start(); void shutdown(); void setHistoryState(const Buildings::HistoryState &historyState); bool setVulnerabilityState(ProjectDataManagement::VulnerabilityState state, const std::vector &roomIds); bool setContaminationState(const int &bldId, const ContaminationState &contaminationState); bool resetContaminationState(); bool setFortifyFactors(const std::vector &fortifyFactors); bool setEffectStates(const int assetId, const QByteArray &properties); bool relayState(const std::vector &relayStates); bool sendCesHitOnBuilding(const qint64 effectTimeMSec, const int chargeTypeId, const int destructiveFactor, const int penetrationFactor, const int aesId, const Core::GeoPosition &impactPosition, const QString &properties); bool sendCesHit3DonBuilding(const qint64 effectTimeMSec, const int chargeTypeId, const int destructiveFactor, const int penetrationFactor, const int aesId, const Core::GeoPosition &impactPosition, const Core::GeoPosition &detonationLocation, double detonationDistance, const QString &properties); bool switchRelay(const SwitchRelayRequest &data); bool triggerFlashlight(const TriggerBsmFlashRequest data); private Q_SLOTS: void onReadyRead(); void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); void onTextMessageReceived(const QString &message); void openWebSocket(); void closeWebSocket(); void onWebSocketError(QAbstractSocket::SocketError error); void onWebSocketConnected(); void onWebSocketDisconnected(); private: void handleBsmState(BuildingControlUnit::Json::Telegrams::BsmState *tel); void handleHitResult(BuildingControlUnit::Json::Telegrams::HitResult *tel); void handleReconnectEgcu(const QString &segment); void handleRelayState(BuildingControlUnit::Json::Telegrams::RelayState *tel); void handleEffectOverride(BuildingControlUnit::Json::Telegrams::EffectOverride *tel); void sendHitLine(const BuildingState &state); void onHitLineInfoTimeout(); void historyState(const BuildingState &state); bool writeFile(const QString &fn, const QByteArray &data); QByteArray generateBuildingConfigData() const; QByteArray generateChargesData() const; static bool isValidPos(const Core::GeoPosition &pos); private: MainHandler *m_mainHandler; BuildingInfo m_buildingInfo; QWebSocket *m_wsSocket; QTimer *m_wsReconnectTimer; QTimer *m_hitLineInfoTimer; QString m_wsUrl; QProcess m_proc; int m_hitLineId; Buildings::HistoryState m_historyState; QMap m_hitLineInfoMap; QMap m_relayInfos; QMap m_effectStates; // key = assetId, value = properties SetEffectStates QMap m_bsmStates; QHash m_effectOverridesReconnect; // [GUEZE 2011] bool m_initBuilding; LOGGER_T m_logger; }; } // namespace Buildings