305 lines
13 KiB
C++
Executable File
305 lines
13 KiB
C++
Executable File
/**
|
|
* 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 <QtCore/QTimer>
|
|
#include <QtCore/QCoreApplication>
|
|
#include <NGLLogger/NGLLoggerBootstrap.h>
|
|
|
|
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<rti::core::int64>();
|
|
m_firingExplosionEntity.endOfFiringClearanceTime = dds::core::optional<rti::core::int64>();
|
|
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
|