/** * 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_def::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