/** * 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.has_value()) { 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