/** * Handler for player data * $Id$ * $HeadURL$ * $Author$ * Created by hjl, SLSE, 2017-02-20 */ #include "handler_vehicle.h" #include "main_handler.h" #include "esc_helper.h" #include "control_unit_handler.h" #include #include #include namespace EffectShowClient { //============================================================================= HandlerVehicle::HandlerVehicle(MainHandler *mainHandler, QObject *parent) : QObject(parent) , m_mainHandler(mainHandler) , m_volleyTimer(new QTimer(this)) , m_remainingTimer(new QTimer(this)) , m_logger(getLogger("HandlerVehicle")) { DEBUG_LOG(m_logger) << "HandlerVehicle ctor"; m_volleyTimer->setSingleShot(true); m_remainingTimer->setInterval(1000); m_statusExplosionFiring.remainingTime_s = -1; m_statusSmokeFiring.remainingTime_s = -1; } //============================================================================= HandlerVehicle::~HandlerVehicle() { //delete m_mainHandler; } //============================================================================= bool HandlerVehicle::init() { DEBUG_LOG(m_logger) << "HandlerVehicle::init()"; connect(m_mainHandler->handlerControlUnit().get(), &ControlUnitHandler::vehicleBattery, this, &HandlerVehicle::vehicleBattery); connect(m_mainHandler->handlerControlUnit().get(), &ControlUnitHandler::vehicleFinshedVolley, this, &HandlerVehicle::onVolleyFinished); //connect(m_mainHandler->handlerControlUnit().get(), &ControlUnitHandler::vehicleShutDown, this, &HandlerVehicle::vehicleShutDown); connect(m_mainHandler->handlerControlUnit().get(), &ControlUnitHandler::vehicleSmokeCardridgesFireStatus, this, &HandlerVehicle::vehicleSmokeCardridgesFireStatus); connect(m_mainHandler->handlerControlUnit().get(), &ControlUnitHandler::vehicleSmokeCardridgesStatus, this, &HandlerVehicle::vehicleSmokeCardridgesStatus); connect(m_mainHandler->handlerControlUnit().get(), &ControlUnitHandler::vehicleFireUnits, this, &HandlerVehicle::vehicleFireUnits); connect(m_mainHandler->handlerControlUnit().get(), &ControlUnitHandler::vehicleStoppedVolley, this, &HandlerVehicle::onVolleyStopped); connect(m_mainHandler->handlerControlUnit().get(), &ControlUnitHandler::vehicleType, this, &HandlerVehicle::vehicleType); connect(m_volleyTimer, &QTimer::timeout, this, &HandlerVehicle::onStartVolley); connect(m_remainingTimer, &QTimer::timeout, this, &HandlerVehicle::onRemainingTimerTimeOut); return true; } //============================================================================= bool HandlerVehicle::isOperational() const { return true; // TODO: Decision for operational !!!!! } //============================================================================= void HandlerVehicle::setAmmunitionParameter(int numberOfShotsMagazine) { //we send the ammunition and wait for return m_mainHandler->handlerControlUnit()->send(CommandSignal::FT_SE_CB_WERFER_MUNITION, numberOfShotsMagazine); } //============================================================================= int HandlerVehicle::burningTimeSmokeCartridge_s() const { return 80 * 1000; // TODO: } //============================================================================= void HandlerVehicle::setExplosionParameter(int numberOfVolley, int numberOfShot, qint64 duration) { DEBUG_LOG(m_logger) << "Duration: " << duration << " number of shots: " << numberOfShot << " number of volles" << numberOfVolley; m_statusExplosionFiring.remainingShots = numberOfShot; m_statusExplosionFiring.remainingTime_s = duration; m_statusExplosionFiring.remainingVolley = numberOfVolley; m_oldTime = duration; //spread shots spreadShotsInVolleys(numberOfShot, numberOfVolley); m_currentVolley = 0; m_statusExplosionFiring.shotsPerVolley = m_shotsInVolley.value(m_currentVolley); // duration is 60sec // 10 volley // 6 shots per volley emit readyForExplosionFiring(true); } void HandlerVehicle::recalcEverything() { spreadShotsInVolleys(m_statusExplosionFiring.remainingShots, m_statusExplosionFiring.remainingVolley); m_currentVolley = 0; } //============================================================================= void HandlerVehicle::setSmokeParameter(int lengthOfFogZone, int directionOfFogZone) { Q_UNUSED(directionOfFogZone); m_statusSmokeFiring.remainingDistance_m = lengthOfFogZone; m_statusSmokeFiring.remainingTime_s = burningTimeSmokeCartridge_s(); EffectShowClient::SafetyConfirmation_e sc = EffectShowClient::SafetyConfirmation_e_def::SafetyConfirmed; emit safetyConfirmation(sc); emit readyForSmokeFiring(true); effectShowControl(EffectShowControl_e::Start); } //============================================================================= void HandlerVehicle::effectShowControl(EffectShowControl_e effectShowControl) { m_remainingTimer->stop(); switch (effectShowControl) { case EffectShowControl_e::Start: { emit statusExplosionFiring(m_statusExplosionFiring); onStartVolley(); return; } case EffectShowControl_e::Stop: { emit statusExplosionFiring(m_statusExplosionFiring); //stop volley m_mainHandler->handlerControlUnit()->send(CommandSignal::FT_SE_CB_SALVE_UNTERBRECHEN); break; } case EffectShowControl_e::Continue: { emit statusExplosionFiring(m_statusExplosionFiring); onStartVolley(); break; } case EffectShowControl_e::Abort: { m_mainHandler->handlerControlUnit()->send(CommandSignal::FT_SE_CB_SALVE_UNTERBRECHEN); m_statusExplosionFiring.remainingTime_s = 0; m_statusExplosionFiring.remainingShots = 0; m_statusExplosionFiring.remainingVolley = 0; EffectShowClient::SafetyConfirmation_e sc = EffectShowClient::SafetyConfirmation_e_def::SafetyNotConfirmed; emit safetyConfirmation(sc); break; } case EffectShowControl_e::StopTimer: { m_oldTime = m_statusExplosionFiring.remainingTime_s; break; } } } //========================================================m_statusExplosionFiring===================== void HandlerVehicle::spreadShotsInVolleys(int shots, int volleys) { m_shotsInVolley.clear(); m_pauseAfterVolley.clear(); qint64 pauseTime = m_statusExplosionFiring.remainingTime_s - (shots * m_timeBetweenShots); if (volleys == 1) { m_shotsInVolley.insert(0, shots); m_pauseAfterVolley.insert(0, 0); } else { while (shots > 0) { for (int volley = 0; volley < volleys; volley++) { m_shotsInVolley.insert(volley, m_shotsInVolley.value(volley) + 1); shots--; if (shots <= 0) break; } } while (pauseTime > 0) { for (int volley = 0; volley < (volleys - 1); volley++) { m_pauseAfterVolley.insert(volley, m_pauseAfterVolley.value(volley) + 1); pauseTime--; if (pauseTime <= 0) break; } } } } void HandlerVehicle::onVolleyStopped(int shots) { DEBUG_LOG(m_logger) << "Volles Stopped after " << shots << " rounds"; //m_statusExplosionFiring.remainingTime_s = 0; //stopp timer and take current seconds m_remainingTimer->stop(); m_volleyTimer->stop(); m_statusExplosionFiring.remainingShots = m_statusExplosionFiring.remainingShots - shots; if (m_statusExplosionFiring.remainingVolley > 0 && shots > 0) { m_oldTime = m_statusExplosionFiring.remainingTime_s; m_currentVolley++; m_statusExplosionFiring.remainingVolley--; if (m_statusExplosionFiring.remainingShots > 0 && m_statusExplosionFiring.remainingVolley <= 0) { m_statusExplosionFiring.remainingVolley = 1; m_currentVolley--; } } emit statusExplosionFiring(m_statusExplosionFiring); } void HandlerVehicle::onVolleyFinished(int shots) { DEBUG_LOG(m_logger) << "Volley finished after shots: " << shots; m_remainingTimer->stop(); if (m_volleyTimer->isActive()) m_volleyTimer->stop(); m_statusExplosionFiring.remainingShots = m_statusExplosionFiring.remainingShots - shots; //calc remaining time qint64 pauseTime = 0; if (m_currentVolley > 0) pauseTime = m_pauseAfterVolley.value(m_currentVolley - 1); //m_statusExplosionFiring.remainingTime_s = m_statusExplosionFiring.remainingTime_s - (m_timeBetweenShots * (shots - 1)) - pauseTime; m_statusExplosionFiring.remainingTime_s = m_oldTime - (m_timeBetweenShots * shots) - pauseTime; DEBUG_LOG(m_logger) << "Remaining time: " << m_statusExplosionFiring.remainingTime_s; m_oldTime = m_statusExplosionFiring.remainingTime_s; if (m_statusExplosionFiring.remainingTime_s < 0 || m_statusExplosionFiring.remainingShots == 0) m_statusExplosionFiring.remainingTime_s = 0; if (m_statusExplosionFiring.remainingShots < 0) m_statusExplosionFiring.remainingShots = 0; if (m_statusExplosionFiring.remainingVolley > 0) m_statusExplosionFiring.remainingVolley--; emit statusExplosionFiring(m_statusExplosionFiring); if (m_statusExplosionFiring.remainingShots > 0 && m_statusExplosionFiring.remainingTime_s > 0) { m_volleyTimer->start(m_pauseAfterVolley.value(m_currentVolley)); m_remainingTimer->start(); } else { //finished now so revoke m_mainHandler->handlerControlUnit()->send(CommandSignal::FT_SE_CB_SICHERHEIT_WIDERRUFEN); } m_currentVolley++; } void HandlerVehicle::onStartVolley() { DEBUG_LOG(m_logger) << "Send Start Volley"; if (!m_remainingTimer->isActive()) m_remainingTimer->start(); if (m_volleyTimer->isActive()) m_volleyTimer->stop(); m_mainHandler->handlerControlUnit()->send(CommandSignal::FT_SE_CB_WERFER_STATUS, m_shotsInVolley.value(m_currentVolley)); } void HandlerVehicle::onRemainingTimerTimeOut() { m_statusExplosionFiring.remainingTime_s -= 1000; if (m_statusExplosionFiring.remainingTime_s < 0) m_statusExplosionFiring.remainingTime_s = 0; if (m_statusExplosionFiring.remainingTime_s == 0) { m_remainingTimer->stop(); if (m_volleyTimer->isActive()) m_volleyTimer->stop(); } emit statusExplosionFiring(m_statusExplosionFiring); } } // namespace EffectShowClient