/** * Handler for all Language HMI objects * $Id$ * $HeadURL$ * $Author$ * Created by Hanna E. Rathje, SLSE, 2015-09-03 */ #pragma once #include #include #include "dds_handler.h" #include "initialization.h" #include "logger.h" #include #include #include #include "esm_convert_from_tab.h" namespace EffectShowManagement { constexpr int MAX_EFFECT_SHOWS = 3; constexpr int CLEANUPTIME = 10*60*1000; class Initialization; class ObjectEffectShow; /** * @brief Handler for effect shows. * * (1)Fetches the gui-interactions for effect shows and triggers data base administration * accordingly.\n * (2)If an effect show was updated and an effect show actor was allocted, the Training Area Base * Proxy will be triggered to send an effect show order to the allocated effect show actor. * If needed, a retract order will be sent to the previous allocated effect show actor.\n * (3)If an effect shall be deleted and an effect show actor is allocated and the status * is < ORDER CARRIED OUT, the Training Area Base Proxy will be triggered to send a retract * order to the effect show actor.\n * (4)If the area of the area effect simulation (AES) was changed, the existing effect shows * related to the AES will be removed and new effect shows will be created related to the * new area. Effect Show Actors will not be allocated. This has to be done via Dialog by * the user.\n * (5)If the charge type, effect start, effect duration or the number of volley was changed * by the AES, the related effect shows will be updated accordingly.\n * (6)Receives the confirmation from the effect show actor via Training Area Base * Proxy for effect show order and triggers the update of the data base with the new * confirmation.\n * (7)If the confirmation indicates: ORDER CARRIED OUT the effect show will be deleted after * 1min automatically.\n * (8)If the AES changes into the state EsPaused, the Training Area Base Proxy sill be triggered * to send a STOP order to the effect show actor.\n * (9)If the AES changes into the state EsActivated and the previous start time was zero * (start button was pressed by AES), the Training Area Base Proxy will be triggered to * send a CONTINUE order to the effect show actor.\n * (10)Meteo data will be sent to the vehicle every 10 min, * if the effect show actor has indicated by the order confirmation, that the effect show * is in processing. Meteo Data will be read from "HandlerMdmData".\n */ class HandlerEffectShow : public QObject , protected Interface::Fts::EffectShowModifyRequestHandler , protected Interface::Fts::EffectShowRemoveRequestHandler , protected AreaEffectSimulation::Interface::Ftc::SetAesItemEffectorStateReplyHandler { Q_OBJECT public: explicit HandlerEffectShow(Initialization *mainHandler, QObject *parent = nullptr); ~HandlerEffectShow(); /** * @brief Updates effect shows data from the data base and distributes the data. * @return (true)Initialization was successfull */ bool init(); /** * @brief The kind of modification of the area effect simulation */ enum class KindOfModification_e : int { Added = 0, ModifiedArea, ModifiedData, Removed, Paused, Continued, None }; static QString enumToString(HandlerEffectShow::KindOfModification_e mod); void onSetAesItemEffectorStateReply(const Core::FunctionReplyObject &replyObject) override {DEBUG_LOG(m_logger) << replyObject.translated();} /** * @brief Create, update, remove & create or remove Effect Shows in relation to the changes of the Explosion Area. * @param[in] data * @param]in] kindOfModification */ void onExplosionAreaChanged(const AreaEffectSimulation::ExplosionArea &data, KindOfModification_e kindOfModification); /** * @brief Create, update, remove & create or remove Effect Shows in relation to the changes of the Explosion Cluster. * @param[in] data * @param]in] kindOfModification */ void onExplosionClusterChanged(const AreaEffectSimulation::ExplosionCluster &data, KindOfModification_e kindOfModification); /** * @brief Create, update, remove & create or remove Effect Shows in relation to the changes of the Explosion Cluster. * @param[in] data * @param]in] kindOfModification */ void onEffectClusterChanged(const AreaEffectSimulation::EffectCluster &data, KindOfModification_e kindOfModification); /** * @brief Create, update, remove & create or remove Effect Shows in relation to the changes of the Explosion Area. * @param[in] data * @param[in] kindOfModification */ void onMineAreaChanged(const AreaEffectSimulation::MineArea &data, KindOfModification_e kindOfModification); /** * @brief Updates Effect Show data with #orderConfirmation received from effect show actor via TAB service. * @param[in] orderConfirmation Order Confirmation received from effect show actor via TAB service. */ void effectShowOrderConfirmationReceived(const ConvertFromTab::OrderConfirmation_t &orderConfirmation); /** * @brief Creates a new effect show * @param[in] data Effect Show data */ void createEffectShow(const Database::EsmEffectShow &data, bool bForceUpdateDb = false); private: void onEffectShowModifyRequest(const rti::core::SampleIdentity &cookie, const EffectShow &request) override final; Core::FunctionReplyObject effectShowModifyRequest(const EffectShow &request); void onEffectShowRemoveRequest(const rti::core::SampleIdentity &cookie, const Core::RemoveElementRequest &request) override final; void createEffectShowsRelatedToMineArea(const AreaEffectSimulation::MineArea &data); void createEffectShowsRelatedToExplosionArea(const AreaEffectSimulation::ExplosionArea &data); void createEffectShowsRelatedToExplosionCluster(const AreaEffectSimulation::ExplosionCluster &data); void createEffectShowsRelatedToEffectCluster(const AreaEffectSimulation::EffectCluster &data); QVector createEffectShowDbDataRelatedToMineArea(const AreaEffectSimulation::MineArea &data); QVector createEffectShowDbDataRelatedToExplosionArea(const AreaEffectSimulation::ExplosionArea &data); QVector createEffectShowDbDataRelatedToExplosionCluster(const AreaEffectSimulation::ExplosionCluster &data); QVector createEffectShowDbDataRelatedToEffectCluster(const AreaEffectSimulation::EffectCluster &data); void removeEffectShowsRelatedToAes(int idAes, bool retract = true); void updateEffectShowsRelatedToMineArea(const AreaEffectSimulation::MineArea &data); void updateEffectShowsRelatedToExplosionArea(const AreaEffectSimulation::ExplosionArea &data); void updateEffectShowsRelatedToExplosionCluster(const AreaEffectSimulation::ExplosionCluster &data); void updateEffectShowsRelatedToEffectCluster(const AreaEffectSimulation::EffectCluster &data); void modifyEffectShowsRelatedToMineArea(const AreaEffectSimulation::MineArea &data); void modifyEffectShowsRelatedToExplosionArea(const AreaEffectSimulation::ExplosionArea &data); void modifyEffectShowsRelatedToExplosionCluster(const AreaEffectSimulation::ExplosionCluster &data); void modifyEffectShowsRelatedToEffectCluster(const AreaEffectSimulation::EffectCluster &data); void modifyEffectShows(const QVector &esmEffectShows, int aesId); void updateEffectShowOrdersRelatedToAes(int idAes); void pauseEffectShowsRelatedToAes(int idAes); void continueEffectShowsRelatedToAes(int idAes); QVector removeFromEffectShowMapByAesId(int aesId); private: Core::FunctionReplyObject removeEffectShow(ObjectEffectShow *ifs, bool bWarnWhenNotInMap = true, bool retract = true); void triggerEffectShowOrder(const ObjectEffectShow *ifs); void triggerRetractOrder(const ObjectEffectShow *ifs); void triggerEffectShowStop(const ObjectEffectShow *ifs); void triggerEffectShowContinue(const ObjectEffectShow *ifs); void triggerMeteoData(const ObjectEffectShow *ifs); private Q_SLOTS: void onSendMeteoData(); void onCleanUp(); private: QHash m_effectShowObjMap; static constexpr qint64 meteoDataSendInterval = 600000; // 10 min send time interval for meteo data QTimer *m_cleanupTimer; QTimer *m_timerMeteoData; Initialization *m_mainHandler; NGL::INGLLogger &m_logger; }; }