/** * Handler for all exercise objects * $Id$ * $HeadURL$ * $Author$ * Created by Hanna E. Rathje, SLSE, 2015-09-03 */ #include "handler_firing_smoke.h" #include "esc_db.h" #include "main_handler.h" #include "control_unit_handler.h" #include "handler_tab_data.h" #include "handler_order.h" #include "handler_vehicle.h" #include #include #include namespace EffectShowClient { //============================================================================= HandlerFiringSmoke::HandlerFiringSmoke(MainHandler *mainHandler, QObject *parent) : QObject(parent) , ManuallySmokeRequestHandler(mainHandler->dds()->fts()) , m_mainHandler(mainHandler) , m_logger(getLogger("HandlerFiringSmoke")) { DEBUG_LOG(m_logger) << "HandlerFiringSmoke ctor"; } //============================================================================= HandlerFiringSmoke::~HandlerFiringSmoke() {} //============================================================================= bool HandlerFiringSmoke::init() { connect(m_mainHandler->handlerOrder().get(), &HandlerOrder::startHandlerFiring, this, &HandlerFiringSmoke::onStartHandlerFiring); connect(m_mainHandler->handlerOrder().get(), &HandlerOrder::endHandlerFiring, this, &HandlerFiringSmoke::onEndHandlerFiring); connect(m_mainHandler->handlerTabData().get(), &HandlerTabData::effectShowStopped, this, &HandlerFiringSmoke::onEffectShowStopped); connect(m_mainHandler->handlerTabData().get(), &HandlerTabData::effectShowContinued, this, &HandlerFiringSmoke::onEffectShowContinued); connect(m_mainHandler->handlerControlUnit().get(), &ControlUnitHandler::safetyStatus, this, &HandlerFiringSmoke::onSafetyConfirmation); return true; } //============================================================================= void HandlerFiringSmoke::setFiringClearanceDuration() { if (m_firingSmokeEntity.firingClearanceTime().is_set()) { qint64 pre = m_firingSmokeEntity.firingClearanceTime().get(); qint64 post = pre; pre -= PRE_START_TIME; post += m_firingSmokeEntity.duration() + POST_END_TIME; m_firingSmokeEntity.firingClearanceTime().set(pre); m_firingSmokeEntity.endOfFiringClearanceTime().set(post); } else m_firingSmokeEntity.endOfFiringClearanceTime().reset(); m_mainHandler->dds()->dts()->publish(m_firingSmokeEntity); } //----------------------------------------------------------------------------- void HandlerFiringSmoke::onStartHandlerFiring(const Database::EscOrder &escOrder) { m_firingSmokeEntity.idEffectShow(escOrder.idOrder); m_firingSmokeEntity.lengthOfFogZone(escOrder.areaWidth); m_firingSmokeEntity.duration(escOrder.duration * 1000); m_firingSmokeEntity.idOrder(escOrder.id); if (escOrder.startTime > 0) m_firingSmokeEntity.firingClearanceTime().set(escOrder.startTime); else m_firingSmokeEntity.firingClearanceTime().reset(); if (m_firingSmokeEntity.lengthOfFogZone() <= 0 || m_firingSmokeEntity.duration() <= 0) { WARNING_LOG(m_logger) << "Won't start Smoke "; DEBUG_LOG(m_logger) << "areaWidth: " << escOrder.areaWidth << "duration: " << escOrder.duration; return; } setFiringClearanceDuration(); } //----------------------------------------------------------------------------- void HandlerFiringSmoke::onEndHandlerFiring(const Database::EscOrder &escOrder) { Q_UNUSED(escOrder) m_firingSmokeEntity.remainingDistance(0); m_firingSmokeEntity.remainingTime(0); m_firingSmokeEntity.carriedOutEnabled(false); m_firingSmokeEntity.directionOfFogZone(0); m_firingSmokeEntity.endOfFiringClearanceTime().reset(); m_firingSmokeEntity.idOrder(0); m_firingSmokeEntity.idEffectShow(0); m_firingSmokeEntity.firingClearanceTime().reset(); m_mainHandler->dds()->dts()->publish(m_firingSmokeEntity); } //----------------------------------------------------------------------------- void HandlerFiringSmoke::onEffectShowStopped(qint16 idEffectShow) { if (idEffectShow != m_firingSmokeEntity.idEffectShow()) { ERROR_LOG(m_logger) << "EffectShow IDs not consistent: " << idEffectShow << " / " << m_firingSmokeEntity.idEffectShow(); return; } } //----------------------------------------------------------------------------- void HandlerFiringSmoke::onEffectShowContinued(const ConvertFromTab::EffectShowContinue_t &effectShowContinue) { if (effectShowContinue.idEffectShow != m_firingSmokeEntity.idEffectShow()) { ERROR_LOG(m_logger) << "EffectShow IDs not consistent: " << effectShowContinue.idEffectShow << " / " << m_firingSmokeEntity.idEffectShow(); return; } } //----------------------------------------------------------------------------- void HandlerFiringSmoke::onSafetyConfirmation(const SafetyConfirmation_e &safetyConfirmation) { m_firingSmokeEntity.safetyConfirmation(safetyConfirmation); m_mainHandler->dds()->dts()->publish(m_firingSmokeEntity); } //----------------------------------------------------------------------------- void HandlerFiringSmoke::onStatusSmokeFiring(const StatusSmokeFiring_t &statusSmokeFiring) { m_firingSmokeEntity.remainingDistance(statusSmokeFiring.remainingDistance_m); m_firingSmokeEntity.remainingTime(statusSmokeFiring.remainingTime_s); m_firingSmokeEntity.carriedOutEnabled(statusSmokeFiring.remainingTime_s <= 0); m_mainHandler->dds()->dts()->publish(m_firingSmokeEntity); } void HandlerFiringSmoke::setSmoking() { if (m_firingSmokeEntity.idOrder() > 0) //send new order change into execution { m_mainHandler->handlerOrder()->updateOrderWithId(m_firingSmokeEntity.idOrder(), QStringLiteral(""), EffectShowManagement::OrderConfirmation_e::Execution); } } //----------------------------------------------------------------------------- void HandlerFiringSmoke::onManuallySmokeRequest(const rti::core::SampleIdentity &cookie, const ManuallySmokeRequest &request) { DEBUG_LOG(m_logger) << "onManuallySmokeRequest"; //override order! if (m_firingSmokeEntity.idOrder() == 0) { m_firingSmokeEntity.firingClearanceTime().reset(); m_firingSmokeEntity.endOfFiringClearanceTime().reset(); m_firingSmokeEntity.carriedOutEnabled(false); } m_firingSmokeEntity.lengthOfFogZone(request.lengthOfFogZone()); m_firingSmokeEntity.directionOfFogZone(request.directionOfFogZone()); m_firingSmokeEntity.remainingDistance(request.lengthOfFogZone()); m_firingSmokeEntity.duration(m_mainHandler->handlerVehicle()->burningTimeSmokeCartridge_s()); m_firingSmokeEntity.remainingTime(m_firingSmokeEntity.duration()); m_mainHandler->dds()->fts()->manuallySmokeReply(cookie, Core::FunctionReplyObject()); if (!request.pbAbort() && !request.pbCarriedOut()) m_mainHandler->handlerVehicle()->setSmokeParameter(request.lengthOfFogZone(), request.directionOfFogZone()); if (request.pbAbort()) m_mainHandler->handlerVehicle()->effectShowControl(EffectShowControl_e::Abort); } } // Namespace EffectShowClient