/** * Handler for all exercise objects * $Id$ * $HeadURL$ * $Author$ * Created by Hanna E. Rathje, SLSE, 2015-09-03 */ #include "handler_firing_explosion.h" #include "esc_db.h" #include "main_handler.h" #include "handler_tab_data.h" #include "handler_order.h" #include "handler_vehicle.h" #include "control_unit_handler.h" #include #include #include namespace EffectShowClient { //============================================================================= HandlerFiringExplosion::HandlerFiringExplosion(MainHandler *mainHandler, QObject *parent) : QObject(parent) , ManuallyExplosionRequestHandler(mainHandler->dds()->fts()) , m_mainHandler(mainHandler) , m_logger(getLogger("HandlerFiringExplosion")) { } //============================================================================= HandlerFiringExplosion::~HandlerFiringExplosion() {} //============================================================================= bool HandlerFiringExplosion::init() { connect(m_mainHandler->handlerOrder().get(), &HandlerOrder::effectShowStarted, this, &HandlerFiringExplosion::onEffectShowStarted); connect(m_mainHandler->handlerOrder().get(), &HandlerOrder::effectShowInterrupted, this, &HandlerFiringExplosion::onEffectShowInterrupted); connect(m_mainHandler->handlerOrder().get(), &HandlerOrder::endHandlerFiring, this, &HandlerFiringExplosion::onEndHandlerFiring); connect(m_mainHandler->handlerTabData().get(), &HandlerTabData::effectShowStopped, this, &HandlerFiringExplosion::onEffectShowStopped); connect(m_mainHandler->handlerOrder().get(), &HandlerOrder::startHandlerFiring, this, &HandlerFiringExplosion::onStartHandlerFiring); connect(m_mainHandler->handlerTabData().get(), &HandlerTabData::effectShowContinued, this, &HandlerFiringExplosion::onEffectShowContinued); connect(m_mainHandler->handlerControlUnit().get(), &ControlUnitHandler::safetyStatus, this, &HandlerFiringExplosion::onSafetyConfirmation); connect(m_mainHandler->handlerVehicle().get(), &HandlerVehicle::readyForExplosionFiring, this, &HandlerFiringExplosion::onReadyForExplosionFiring); connect(m_mainHandler->handlerVehicle().get(), &HandlerVehicle::statusExplosionFiring, this, &HandlerFiringExplosion::onStatusExplosionFiring); return true; } //============================================================================= void HandlerFiringExplosion::setFiringClearanceDuration() { if (m_firingExplosionEntity.firingClearanceTime.is_set()) { qint64 pre = m_firingExplosionEntity.firingClearanceTime.get(); qint64 post = pre; pre -= PRE_START_TIME; post += m_firingExplosionEntity.duration + POST_END_TIME; //as we already start "duration" earlier m_firingExplosionEntity.firingClearanceTime.set(pre); m_firingExplosionEntity.endOfFiringClearanceTime.set(post); // m_firingExplosionEntity.firingClearanceTime.set(m_firingExplosionEntity.firingClearanceTime.get() - (2 * m_firingClearanceDuration)); } else m_firingExplosionEntity.endOfFiringClearanceTime.reset(); m_mainHandler->dds()->dts()->publish(m_firingExplosionEntity); } //----------------------------------------------------------------------------- void HandlerFiringExplosion::onStartHandlerFiring(const Database::EscOrder &escOrder) { DEBUG_LOG(m_logger) << "onStartHandlerFiring()"; DEBUG_LOG(m_logger) << "numOfVolley: " << escOrder.numOfVolley << "shotsInTotal: " << escOrder.shotsPerVolley << "duration: " << escOrder.duration; if (escOrder.numOfVolley < 0) return; //we are interrupted m_firingExplosionEntity.idEffectShow = escOrder.id; m_firingExplosionEntity.fireEnabled = false; m_firingExplosionEntity.carriedOutEnabled = false; m_firingExplosionEntity.idOrder = escOrder.idOrder; if (m_isNew) { m_firingExplosionEntity.numberOfVolley = escOrder.numOfVolley; m_firingExplosionEntity.numberOfShot = escOrder.shotsPerVolley; m_firingExplosionEntity.remainingVolleys = escOrder.numOfVolley; m_firingExplosionEntity.remainingShots = m_firingExplosionEntity.numberOfShot; DEBUG_LOG(m_logger) << "Changed number of Shots Remain: " << m_firingExplosionEntity.numberOfShot; m_isNew = false; } m_firingExplosionEntity.duration = escOrder.duration * 1000; m_firingExplosionEntity.remainingTime = escOrder.duration * 1000; //here to avoid traffic? if (escOrder.startTime > 0) m_firingExplosionEntity.firingClearanceTime.set(escOrder.startTime); else { WARNING_LOG(m_logger) << "reset clearance time"; m_firingExplosionEntity.firingClearanceTime.reset(); } if (m_firingExplosionEntity.duration <= 0 || m_firingExplosionEntity.numberOfShot <= 0 || m_firingExplosionEntity.numberOfVolley <= 0) { WARNING_LOG(m_logger) << "Won't start Explosion "; return; } setFiringClearanceDuration(); m_mainHandler->handlerVehicle()->setExplosionParameter(m_firingExplosionEntity.remainingVolleys, m_firingExplosionEntity.remainingShots, m_firingExplosionEntity.remainingTime); } //----------------------------------------------------------------------------- void HandlerFiringExplosion::onEndHandlerFiring(const Database::EscOrder &escOrder) { DEBUG_LOG(m_logger) << "onStopHandlerFiring()"; DEBUG_LOG(m_logger) << "numOfVolley: " << escOrder.numOfVolley << "shotsInTotal: " << escOrder.shotsPerVolley << "duration: " << escOrder.duration; if (escOrder.numOfVolley < 0 || escOrder.idOrder != m_firingExplosionEntity.idOrder) return; m_firingExplosionEntity.idEffectShow = 0; m_firingExplosionEntity.fireEnabled = false; m_firingExplosionEntity.isActive = false; m_firingExplosionEntity.idOrder = 0; m_firingExplosionEntity.numberOfVolley = 0; m_firingExplosionEntity.numberOfShot = 0; m_firingExplosionEntity.remainingShots = 0; m_firingExplosionEntity.remainingVolleys = 0; m_firingExplosionEntity.duration = 0; m_firingExplosionEntity.firingClearanceTime = dds::core::optional(); m_firingExplosionEntity.endOfFiringClearanceTime = dds::core::optional(); m_firingExplosionEntity.fireEnabled = false; m_firingExplosionEntity.carriedOutEnabled = false; m_firingExplosionEntity.remainingTime = 0; //here to avoid traffic? m_mainHandler->dds()->dts()->publish(m_firingExplosionEntity); m_isNew = true; //reset effect show } //----------------------------------------------------------------------------- void HandlerFiringExplosion::onEffectShowStopped(qint16 idEffectShow) { if (idEffectShow != m_firingExplosionEntity.idEffectShow) { ERROR_LOG(m_logger) << "EffectShow IDs not consistent: " << idEffectShow << " / " << m_firingExplosionEntity.idEffectShow; return; } m_firingExplosionEntity.isActive = false; } //----------------------------------------------------------------------------- void HandlerFiringExplosion::onEffectShowContinued(const ConvertFromTab::EffectShowContinue_t &effectShowContinue) { if (effectShowContinue.idEffectShow != m_firingExplosionEntity.idEffectShow) { ERROR_LOG(m_logger) << "EffectShow IDs not consistent: " << effectShowContinue.idEffectShow << " / " << m_firingExplosionEntity.idEffectShow; return; } } //----------------------------------------------------------------------------- void HandlerFiringExplosion::onSafetyConfirmation(const SafetyConfirmation_e &safetyConfirmation) { m_firingExplosionEntity.safetyConfirmation = safetyConfirmation; if (m_lastState == SafetyConfirmation_e::SafetyConfirmed && safetyConfirmation == SafetyConfirmation_e::SafetyNotConfirmed) m_mainHandler->handlerVehicle()->effectShowControl(EffectShowControl_e::StopTimer); if (m_lastState != safetyConfirmation && m_firingExplosionEntity.safetyConfirmation == EffectShowClient::SafetyConfirmation_e::SafetyNotConfirmed && m_firingExplosionEntity.isActive && !m_firingExplosionEntity.carriedOutEnabled) { if (m_firingExplosionEntity.idEffectShow > 0) m_mainHandler->handlerOrder()->updateOrderWithId(m_firingExplosionEntity.idEffectShow, QString(), EffectShowManagement::OrderConfirmation_e::InterruptExecution); onEffectShowInterrupted(); } m_lastState = safetyConfirmation; m_mainHandler->dds()->dts()->publish(m_firingExplosionEntity); } //----------------------------------------------------------------------------- void HandlerFiringExplosion::onReadyForExplosionFiring(bool ready) { m_firingExplosionEntity.fireEnabled = ready; m_mainHandler->dds()->dts()->publish(m_firingExplosionEntity); } //----------------------------------------------------------------------------- void HandlerFiringExplosion::onStatusExplosionFiring(const StatusExplosionFiring_t &statusExplosionFiring) { m_firingExplosionEntity.remainingTime = statusExplosionFiring.remainingTime_s; m_firingExplosionEntity.remainingShots = statusExplosionFiring.remainingShots; m_firingExplosionEntity.carriedOutEnabled = m_firingExplosionEntity.isActive && (m_isInterrupted || statusExplosionFiring.remainingTime_s <= 0); m_firingExplosionEntity.remainingVolleys = statusExplosionFiring.remainingVolley; m_mainHandler->dds()->dts()->publish(m_firingExplosionEntity); } void HandlerFiringExplosion::onEffectShowStarted() { DEBUG_LOG(m_logger) << "onEffectShowStarted"; m_mainHandler->handlerVehicle()->setExplosionParameter(m_firingExplosionEntity.remainingVolleys, m_firingExplosionEntity.remainingShots, m_firingExplosionEntity.remainingTime); m_isInterrupted = false; m_firingExplosionEntity.isActive = true; m_firingExplosionEntity.fireEnabled = false; m_firingExplosionEntity.carriedOutEnabled = false; m_mainHandler->dds()->dts()->publish(m_firingExplosionEntity); } bool HandlerFiringExplosion::onEffectShowInterrupted() { if (m_isInterrupted == true) return false; if (!m_firingExplosionEntity.isActive && m_isInterrupted == false) { DEBUG_LOG(m_logger) << "onEffectShowInterrupted is active so return"; return false; } DEBUG_LOG(m_logger) << "onEffectShowInterrupted"; m_mainHandler->handlerControlUnit()->send(CommandSignal::FT_SE_CB_SICHERHEIT_WIDERRUFEN); m_mainHandler->handlerVehicle()->effectShowControl(EffectShowControl_e::StopTimer); m_isInterrupted = true; m_firingExplosionEntity.isActive = true; m_firingExplosionEntity.fireEnabled = true; m_firingExplosionEntity.carriedOutEnabled = true; m_mainHandler->dds()->dts()->publish(m_firingExplosionEntity); return true; } //----------------------------------------------------------------------------- void HandlerFiringExplosion::onManuallyExplosionRequest(const rti::core::SampleIdentity &cookie, const ManuallyExplosionRequest &request) { DEBUG_LOG(m_logger) << "onManuallyExplosionRequest "; //override order! if (m_firingExplosionEntity.idEffectShow == 0) { m_firingExplosionEntity.firingClearanceTime.reset(); m_firingExplosionEntity.endOfFiringClearanceTime.reset(); m_firingExplosionEntity.fireEnabled = false; m_firingExplosionEntity.carriedOutEnabled = false; } m_isInterrupted = false; m_mainHandler->dds()->fts()->manuallyExplosionReply(cookie, Core::FunctionReplyObject()); if (request.pbInterrupt) { m_mainHandler->handlerVehicle()->effectShowControl(EffectShowControl_e::Stop); onEffectShowInterrupted(); } if (!request.pbFire && !request.pbAbort && !request.pbCarriedOut) m_mainHandler->handlerVehicle()->setExplosionParameter(request.numberOfVolley, request.numberOfShot, request.duration); if (request.pbAbort || request.pbCarriedOut) { m_firingExplosionEntity.isActive = false; m_firingExplosionEntity.carriedOutEnabled = false; if (request.pbAbort) m_mainHandler->handlerVehicle()->effectShowControl(EffectShowControl_e::Abort); // m_firingExplosionEntity.numberOfVolley(0); // m_firingExplosionEntity.numberOfShot(0); m_firingExplosionEntity.remainingShots = 0; m_firingExplosionEntity.remainingShots = 0; m_firingExplosionEntity.remainingVolleys = 0; // m_firingExplosionEntity.duration(0); m_firingExplosionEntity.remainingTime = 0; m_firingExplosionEntity.firingClearanceTime.reset(); m_firingExplosionEntity.endOfFiringClearanceTime.reset(); } else if (!request.pbInterrupt) { // m_firingExplosionEntity.idOrder(0); m_firingExplosionEntity.numberOfVolley = request.numberOfVolley; m_firingExplosionEntity.numberOfShot = request.numberOfShot; m_firingExplosionEntity.remainingShots = request.numberOfShot; m_firingExplosionEntity.remainingVolleys = request.numberOfVolley; m_firingExplosionEntity.duration = request.duration; m_firingExplosionEntity.remainingTime = request.duration; } if (request.pbFire) { m_mainHandler->handlerVehicle()->recalcEverything(); m_firingExplosionEntity.isActive = true; m_mainHandler->handlerVehicle()->effectShowControl(EffectShowControl_e::Start); } } } // Namespace EffectShowClient