Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Services/EffectShowClient/handler_order.cpp
T

297 lines
11 KiB
C++
Executable File

/**
* Handler for all exercise objects
* $Id$
* $HeadURL$
* $Author$
* Created by Hanna E. Rathje, SLSE, 2015-09-03
*/
#include "handler_order.h"
#include "object_order.h"
#include "esc_db.h"
#include "main_handler.h"
#include "handler_firing_explosion.h"
#include "handler_firing_smoke.h"
#include "control_unit_handler.h"
#include "handler_tab_data.h"
#include "handler_vehicle.h"
#include <QtCore/QCoreApplication>
#include <NGLLogger/NGLLoggerBootstrap.h>
namespace EffectShowClient
{
//=============================================================================
HandlerOrder::HandlerOrder(MainHandler *mainHandler,
QObject *parent)
: QObject(parent)
, OrderModifyRequestHandler(mainHandler->dds()->fts())
, m_mainHandler(mainHandler)
, m_logger(getLogger("HandlerOrder"))
{}
//=============================================================================
HandlerOrder::~HandlerOrder()
{}
//=============================================================================
bool HandlerOrder::init()
{
bool bRet = true;
// create Orders objects
auto cbOrder = [this, &bRet](const Database::EscOrder & data)
{
ObjectOrder *ifs(new ObjectOrder(m_mainHandler, this));
Core::FunctionReplyObject ret = ifs->createObject(data);
if (ret.error())
{
delete ifs;
ERROR_LOG(m_logger) << ret();
bRet = false;
return;
}
m_orderObjMap.insert(ifs->getId(), ifs);
};
if (!m_mainHandler->db()->select(cbOrder) || !bRet)
{
ERROR_LOG(m_logger) << "Error reading data from database!";
return false;
}
DEBUG_LOG(m_logger) << "m_orderObjMap.size() = " << m_orderObjMap.size();
return true;
}
//=============================================================================
void HandlerOrder::createOrder(const ConvertFromTab::EffectShowOrder_t &effectShowOrder)
{
Database::EscOrder data;
for (auto it = m_orderObjMap.begin(); it != m_orderObjMap.end(); ++it)
{
if (it.value()->getData().idOrder == effectShowOrder.idEffectShow)
data = it.value()->getData();
}
bool sendStart = ((data.orderConfirmation == static_cast<int>(EffectShowManagement::OrderConfirmation_e::FiringReadiness))
|| (data.orderConfirmation == static_cast<int>(EffectShowManagement::OrderConfirmation_e::Execution))
|| (data.orderConfirmation == static_cast<int>(EffectShowManagement::OrderConfirmation_e::InterruptExecution)));
data.typeOfOrder = 1;
data.idOrder = effectShowOrder.idEffectShow;
data.startTime = effectShowOrder.startTime * 1000; // s -> msec
data.duration = effectShowOrder.duration;
if (data.duration < 5)
data.duration = 5;
data.lowerLeftPosition = QPointF(effectShowOrder.lowerLeftPosition.lon, effectShowOrder.lowerLeftPosition.lat);
data.centerPosition = QPointF(effectShowOrder.centerPosition.lon, effectShowOrder.centerPosition.lat);
data.areaWidth = effectShowOrder.areaWidth;
data.areaDepth = effectShowOrder.areaDepth;
data.areaRotation = effectShowOrder.rotation;
data.numOfVolley = effectShowOrder.numOfVolley;
data.shotsPerVolley = effectShowOrder.shotsInTotal;
data.typeOfAmmunition = effectShowOrder.typeOfAmmunition;
//data.orderConfirmation = EffectShowManagement::OrderConfirmation_e::WaitingForAcceptance; //no reset
data.info = effectShowOrder.name;
ObjectOrder *ifs(new ObjectOrder(m_mainHandler, this));
Core::FunctionReplyObject ret = ifs->createObject(data);
if (ret.error())
{
delete ifs;
ERROR_LOG(m_logger) << ret();
return;
}
m_orderObjMap.insert(ifs->getId(), ifs);
if (data.orderConfirmation == static_cast<int>(EffectShowManagement::OrderConfirmation_e::Execution) && data.startTime == 0)
{
m_mainHandler->handlerControlUnit()->send(CommandSignal::FT_SE_CB_SICHERHEIT_WIDERRUFEN);
m_mainHandler->handlerControlUnit()->send(CommandSignal::FT_SE_CB_SALVE_UNTERBRECHEN);
m_mainHandler->handlerVehicle()->effectShowControl(EffectShowControl_e::Stop);
}
bool orignalIsTimeout = ((data.orderConfirmation == static_cast<int>(EffectShowManagement::OrderConfirmation_e::Execution)) && data.startTime > 0 && (data.startTime + data.duration < QDateTime::currentMSecsSinceEpoch())) ;
if (sendStart && !orignalIsTimeout)
emit startHandlerFiring(data);
}
//=============================================================================
void HandlerOrder::createOrder(const ConvertFromTab::RelocationOrder_t &relocationOrder)
{
Database::EscOrder data;
data.typeOfOrder = 0;
data.idOrder = relocationOrder.idRelocation;
data.startTime = relocationOrder.executionTime * 1000; // s -> msec
data.centerPosition = QPointF(relocationOrder.centerPosition.lon, relocationOrder.centerPosition.lat);
data.orderConfirmation = static_cast<int>(EffectShowManagement::OrderConfirmation_e::WaitingForAcceptance);
data.info = relocationOrder.infoText;
ObjectOrder *ifs(new ObjectOrder(m_mainHandler, this));
Core::FunctionReplyObject ret = ifs->createObject(data);
if (ret.error())
{
delete ifs;
ERROR_LOG(m_logger) << ret();
return;
}
m_orderObjMap.insert(ifs->getId(), ifs);
}
//=============================================================================
void HandlerOrder::removeOrder(const ConvertFromTab::OrderRetract_t &orderRetract)
{
for (auto it = m_orderObjMap.begin(); it != m_orderObjMap.end(); ++it)
{
if (it.value()->getData().typeOfOrder == orderRetract.orderType)
//ERROR_LOG(m_logger) << "current idorder =" ;
if (it.value()->getData().idOrder == orderRetract.id)
{
int id = it.key();
Core::FunctionReplyObject ret;
int def = it.value()->getData().orderConfirmation;
ret = it.value()->removeObject();
if (ret.error())
ERROR_LOG(m_logger) << LOGFUNCTION << ret();
else
{
if (def == static_cast<int>(EffectShowManagement::OrderConfirmation_e::Execution) ||
def == static_cast<int>(EffectShowManagement::OrderConfirmation_e::InterruptExecution) ||
def == static_cast<int>(EffectShowManagement::OrderConfirmation_e::FiringReadiness))
{
DEBUG_LOG(m_logger) << "EndFireHandler from Remove";
emit endHandlerFiring(it.value()->getData());
//Stop the current execution
m_mainHandler->handlerControlUnit()->send(CommandSignal::FT_SE_CB_SALVE_UNTERBRECHEN);
m_mainHandler->handlerControlUnit()->send(CommandSignal::FT_SE_CB_SICHERHEIT_WIDERRUFEN);
m_mainHandler->handlerVehicle()->effectShowControl(EffectShowControl_e::Abort);
m_mainHandler->handlerVehicle()->effectShowControl(EffectShowControl_e::StopTimer);
}
delete it.value();
m_orderObjMap.remove(id);
}
}
}
}
void HandlerOrder::sendOrderConfirmation(const ConvertToTab::OrderConfirmation_t &oc)
{
ERROR_LOG(m_logger) << "Send Order Confirmation to Excon " << oc.orderId << " / ";
m_mainHandler->handlerTabData()->orderConfirmation(oc);
}
//-----------------------------------------------------------------------------
void HandlerOrder::onOrderModifyRequest(const rti::core::SampleIdentity &cookie,
const OrderModifyRequest &request)
{
DEBUG_LOG(m_logger) << "Order: " << request.id << " Order: " << request.orderConfirmation;
if (request.id > 0)
{
ObjectOrder *ifs = m_orderObjMap.value(request.id);
if (ifs == nullptr)
m_mainHandler->dds()->fts()->orderModifyReply(cookie, Core::FunctionReplyObject(request.id, tr_lts("dds", "Order with id %1 not found")).arg(request.id));
else
{
ifs->setOrderConfirmation(static_cast<int>(request.orderConfirmation));
auto ret = ifs->updateObject();
if (ret.error())
{
m_mainHandler->dds()->fts()->orderModifyReply(cookie, ret);
ERROR_LOG(m_logger) << "Update Order object failed.";
return;
}
if (updateOrder(ifs, QString::fromStdString(request.answerText), request.orderConfirmation))
m_mainHandler->dds()->fts()->orderModifyReply(cookie, Core::FunctionReplyObject(request.id));
else
m_mainHandler->dds()->fts()->orderModifyReply(cookie, Core::FunctionReplyObject(request.id, tr_lts("dds", "Order with id %1 not found")).arg(request.id));
}
}
else
{
m_mainHandler->dds()->fts()->orderModifyReply(cookie, Core::FunctionReplyObject(request.id));
ERROR_LOG(m_logger) << "Illegal Order ID";
}
}
bool HandlerOrder::updateOrder(ObjectOrder *order,
const QString &answerText, EffectShowManagement::OrderConfirmation_e orderConf)
{
ConvertToTab::OrderConfirmation_t oc;
const Database::EscOrder &escOrder = order->getData();
oc.orderId = escOrder.idOrder;
oc.orderType = ConvertToTab::OrderType_e(escOrder.typeOfOrder);
oc.confirmation = orderConf;
oc.answerText = answerText;
sendOrderConfirmation(oc);
ERROR_LOG(m_logger) << "Update Order " << oc.orderId << " / ";
switch (orderConf)
{
case EffectShowManagement::OrderConfirmation_e::FiringReadiness:
emit startHandlerFiring(order->getData());
break;
case EffectShowManagement::OrderConfirmation_e::Execution:
DEBUG_LOG(m_logger) << "start execution";
m_mainHandler->handlerVehicle()->effectShowControl(EffectShowClient::EffectShowControl_e::Start);
emit effectShowStarted();
break;
case EffectShowManagement::OrderConfirmation_e::InterruptExecution:
//stop current volley
m_mainHandler->handlerVehicle()->effectShowControl(EffectShowClient::EffectShowControl_e::Stop);
//revoke safety
emit effectShowInterrupted();
break;
case EffectShowManagement::OrderConfirmation_e::Abort:
if (checkForActiveOrder(escOrder.idOrder))
{
DEBUG_LOG(m_logger) << "idOrder is " << escOrder.idOrder << " send abbort as is active";
m_mainHandler->handlerControlUnit()->send(CommandSignal::FT_SE_CB_SALVE_UNTERBRECHEN);
m_mainHandler->handlerVehicle()->effectShowControl(EffectShowControl_e::Abort);
}
Q_FALLTHROUGH();
case EffectShowManagement::OrderConfirmation_e::Nonacceptance:
case EffectShowManagement::OrderConfirmation_e::OrderCarriedOut:
case EffectShowManagement::OrderConfirmation_e::PositionReached:
{
if (orderConf == EffectShowManagement::OrderConfirmation_e::PositionReached &&
oc.orderType != ConvertToTab::OrderType_e::Relocation)
return true;
emit endHandlerFiring(order->getData());
ConvertFromTab::OrderRetract_t oct;
oct.id = escOrder.idOrder;
oct.orderType = qint8(escOrder.typeOfOrder);
removeOrder(oct);
break;
}
default:
ERROR_LOG(m_logger) << "Unhandled EffectShowManagement::OrderConfirmation in HandlerOrder::onOrderModifyRequest"; // todo
break;
}
return true;
}
void HandlerOrder::updateOrderWithId(int orderId, const QString &answerText, EffectShowManagement::OrderConfirmation_e orderConf)
{
ObjectOrder *ifs = m_orderObjMap.value(orderId);
if (ifs == nullptr)
return;
ifs->setOrderConfirmation(static_cast<int>(orderConf));
auto ret = ifs->updateObject();
if (ret.error())
ERROR_LOG(m_logger) << "Error Updating Order " << orderId << " / ";
updateOrder(ifs, answerText, orderConf);
}
bool HandlerOrder::checkForActiveOrder(int orderId)
{
DEBUG_LOG(m_logger) << "check for active Order " << orderId << " ";
if (orderId <= 0)
return false;
return ((m_mainHandler->handlerFiringExplosion()->getCurrentorderId() == orderId )||( m_mainHandler->handlerFiringSmoke()->getCurrentorderId() == orderId));
}
} // Namespace EffectShowClient