#pragma once #include "logger.h" #include #include #include #include #include #include #include #include #include #include namespace N_CoPrtCnv { class CoPrtCnvRadioTelegram; } #define MAX_BROADCAST_INDEX 65535 namespace PrtCnv { class PrtCnvDbThread; class PrtCnvBroadcastMgr final : public QObject { Q_OBJECT public: enum E_State { e_ST_UNDEFINED, e_ST_COLLECT, e_ST_SEND_NACHFORDERUNG }; PrtCnvBroadcastMgr(); bool handleRadioTelegram(const N_CoPrtCnv::CoPrtCnvRadioTelegram &a_radioTelegram); int32_t create(NGL::Settings *settings); int32_t init(); std::shared_ptr getNextBroadcastTelegramToSend(const uint16_t a_beginSearchWithBroadcastIndex, const time_t a_currentTime); void setDbThread(PrtCnvDbThread *a_dbThread); void cleanAndInit(const bool a_deleteTelegrams); void handleOverrunOfBroadcastCounter(const bool a_doRestore = false); std::shared_ptr getNextNachforderungTelegramToSend(); void dump(); void restoreAfterCrash(); uint16_t getBroadcastIndex() const; uint16_t getNextBroadcastIndex(); void addBroadcastOnlyTelegramToMap(const std::shared_ptr &a_broadcastOnlyTelegram); void incTickAndSetTrafficLoad(const bool a_isHighLoad, const bool a_isFullLoad); bool isEffectSimulationIdDeactivated(const uint16_t effectsimulationId) const; void handleNachforderungBroadcastTelegram(int identity, int broadcastIndex, int resetCounter); protected: struct EquipNoBcIndex { int equipNo = 0; int bcIndex = 0; EquipNoBcIndex() = default; EquipNoBcIndex(int e, int b) : equipNo(e), bcIndex(b) {} }; std::vector m_claimerArray; uint16_t m_ClaimWindow; uint16_t m_HighLoadFactor; uint16_t m_BroadcastLimit; NGL::Settings *m_Config; uint16_t m_ActClaimWindow; PrtCnvBroadcastMgr::E_State m_State; uint16_t m_TickCounter; PrtCnvDbThread *m_DbThread; std::map> m_BroadcastMap; std::vector> m_broadcastTelegamsToSend; std::map> m_LastTelegramMap; std::multimap> m_WirkfeldTelegramMapByKennung; std::multimap> m_WirkfeldTelegramMapByTime; std::map> m_FunktionsraumTelegramMap; std::map> m_TechnikFunktionsraumTelegramMap; uint16_t m_BroadcastIndex; bool m_IsFullLoad; uint16_t m_FinishedBroadcastIndex; uint16_t m_FirstBroadcastIndexOfBc1; void addToBroadcastMap(const std::shared_ptr &a_radioTelegram); std::shared_ptr getNachforderungsTelegram(int curBcIndex, int startBcIndex, int &nextBcIndex); int getSammeltelegramIndex(const std::shared_ptr &a_sammelTelegram, const uint16_t a_kennung) const; void moveTelegramInBroadcastMap(const std::shared_ptr &a_radioTelegram, const uint16_t a_newBroadcastIndex, const std::shared_ptr &a_attachTelegram = {}); void removeFromBroadcastMap(const std::shared_ptr &a_radioTelegram); void removeFromBroadcastMapFunc(const std::function &)> &pred); void removeDusMineDeactivationFromBroadcastMap(int dusMineId); std::shared_ptr createAccumulationTelegram(int curBcIndex, int startBcIndex, gef_telegramm_id_et telId, const QMap &bcIndex2Type, int maxIdsPerTelegram, int sizeOfSumField) const; bool removeFromDeactivatedAesArea(int aesAreaId); bool addToDeactivatedAesArea(int aesAreaId, int bcIndex); QHash m_deactivatedAesArea2bcIndex; QMap m_deactivatedBcIndex2AesArea; std::shared_ptrcreateAccuTeleDeactivatedAesAreas(int curBcIndex, int startBcIndex) const; bool removeFromDeactivatedFuncArea(int aesAreaId); bool addToDeactivatedFuncArea(int aesAreaId, int bcIndex); QHash m_deactivatedFuncArea2bcIndex; QMap m_deactivatedBcIndex2FuncArea; std::shared_ptrcreateAccuTeleDeactivatedFuncAreas(int curBcIndex, int startBcIndex) const; bool removeFromDeactivatedDusMine(int dusMineId); bool addToDeactivatedDusMine(int dusMineId, int bcIndex); QHash m_deactivatedDusMine2bcIndex; QMap m_deactivatedBcIndex2DusMine; std::shared_ptr createAccuTeleDeactivatedDusMines(int curBcIndex, int startBcIndex) const; bool removeFromActivatedDusMine(int dusMineId); void addToActivatedDusMine(int dusMineId); QSet m_activatedDusMines; std::shared_ptr createAccuTeleActivatedDusMines(int curBcIndex); bool removeFromSammeltelegram(const std::shared_ptr &a_sammelTelegram, const uint16_t a_kennung, const uint16_t a_anzahlPos, const uint8_t a_anzahlSize, bool &a_sammelTelRemoved); void replaceLastTelegramAndAddAtEnd(const std::shared_ptr &a_newRadioTelegram); std::string dumpSammeldeaktivierung(const N_CoPrtCnv::CoPrtCnvRadioTelegram *sammelTelegram); void getAllFinishedBroadcastsFromDb(const bool a_doRestore = false); void removeExpiredTelegrams(); void removeWirkfeldTelegrams(const uint16_t a_kennung); void addWirkfeldTelegram(const std::shared_ptr &a_radioTelegram, const uint16_t a_wirkfeldKennung, const gef_telegramm_id_et a_telId = GEF_BESTAETIGUNG, const uint16_t a_minenKennung = 0); bool deactivateEinzelmineFromMinensperre(const uint16_t a_wirkfeldKennung, const uint16_t a_minenKennung, const uint16_t a_broadcastIndex); std::shared_ptr getNopTelegram(const uint16_t a_from, const uint16_t a_to); void removeFromAllMaps(const std::shared_ptr &a_radioTelegram); void detachTelegram(const std::shared_ptr &a_radioTelegram); void removeFromFunktionsAndBroadcastMaps(const uint16_t a_funktionsraumKennung); void removeFromTechnikFunktionsAndBroadcastMaps(const uint16_t a_funktionsraumKennung); void removeFromWirkfeldAndBroadcastMaps(const std::multimap>::iterator &a_wirkfeldTelegramMapByKennungIterator); void reactivateDusMine(const std::shared_ptr &a_radioTelegram); void deactivateSingleMine(const std::shared_ptr &a_radioTelegram); void prepareForSendNachforderungen(); std::shared_ptr evaluateNextNachforderungToSend(); Q_SIGNALS: void areaEffectSimulationActivated(int wirkfeldKennung); void areaEffectSimulationDeactivated(int wirkfeldKennung); private: NGL::INGLLogger &m_logger; NGL::INGLLogger &m_loggerBcRequest; }; }