Files
qt5-legatus-legacy/Lts/Services/AreaEffectSimulation/handler_recon_area.cpp
T
2026-08-13 18:33:10 +02:00

234 lines
7.8 KiB
C++
Executable File

/**
* Handler for all exercise objects
* $Id$
* $HeadURL$
* $Author$
* Created by Malte Diers, SLSE, 2017-04-05
*/
#include "handler_recon_area.h"
#include <Services/AreaEffectSimulation/Utils/polygons.h>
#include <QPolygonF>
namespace AreaEffectSimulation
{
HandlerReconArea::HandlerReconArea(MainHandler *mainHandler)
: HandlerBase(mainHandler, QStringLiteral("ReconArea"))
, Interface::Fts::ReconAreaModifyRequestHandler(mainHandler->dds()->fts())
, Interface::Fts::ReconAreaRemoveRequestHandler(mainHandler->dds()->fts())
{
}
bool HandlerReconArea::init()
{
QVector<Database::AesReconArea> dataVec;
// read all ReconAreas from database
if (!m_mainHandler->db()->select(dataVec))
{
ERROR_LOG(m_logger) << "Error reading data from database!";
return false;
}
// create Recon area objects
for (const Database::AesReconArea &dbData : qAsConst(dataVec))
{
ObjectReconArea *ifs(new ObjectReconArea(m_mainHandler, this));
connect(ifs, &ObjectReconArea::effectStateChanged, this, &HandlerReconArea::onEffectStateChanged);
Core::FunctionReplyObject ret = ifs->createObject(dbData);
if (ret.error())
{
delete ifs;
ERROR_LOG(m_logger) << ret();
return false;
}
m_objectMap.insert(ifs->id(), ifs);
connect(ifs, &ObjectReconArea::newAiv, this, &HandlerReconArea::newAiv);
connect(ifs, &ObjectReconArea::removeAiv, this, &HandlerReconArea::removeAiv);
}
DEBUG_LOG(m_logger) << "m_exeObjMap.size() = " << m_objectMap.size();
return true;
}
static void fillData(const ReconAreaModifyRequest &src, Database::AesReconArea &dst)
{
dst.name = QString::fromStdString(src.name());
dst.chargeTypeId = 103; // recon area dummy
dst.effectDuration = 0; // forever active
dst.position.rx() = src.area().cornerBottomLeft().lon();
dst.position.ry() = src.area().cornerBottomLeft().lat();
dst.rotationAngle = src.area().rotation();
dst.height = src.area().height();
dst.width = src.area().width();
dst.effectMarkingInTa = false;
dst.effectStart = src.effectStart().is_set() ? QDateTime::fromMSecsSinceEpoch(src.effectStart().get()) : QDateTime();
dst.participantId = src.participantId();
dst.partyId = src.partyId().is_set() ? src.partyId().get() : 0;
dst.purpose = QString::fromStdString(src.purpose());
}
void HandlerReconArea::onReconAreaModifyRequest(const rti::core::SampleIdentity &cookie,
const ReconAreaModifyRequest &request)
{
DEBUG_LOG(m_logger) << "onReconAreaModifyRequest: " << request;
Core::FunctionReplyObject ret = reconAreaModifyRequest(request);
if (ret.error())
WARNING_LOG(m_logger) << ret();
m_mainHandler->dds()->fts()->reconAreaModifyReply(cookie, ret);
}
Core::FunctionReplyObject HandlerReconArea::reconAreaCreateRequest(const ReconAreaModifyRequest &request)
{
Database::AesReconArea newData;
fillData(request, newData);
// set time contrain outside of fillData
// newData.effectStart = QDateTime::fromMSecsSinceEpoch(m_mainHandler->dds()->currentPartitionTimeMSec() + 100); // now active
ObjectReconArea *ifs(new ObjectReconArea(m_mainHandler, this));
connect(ifs, &ObjectReconArea::effectStateChanged, this, &HandlerReconArea::onEffectStateChanged);
const Core::FunctionReplyObject ret = ifs->createObject(newData);
if (ret.error())
{
delete ifs;
ifs = nullptr;
return ret;
}
m_objectMap.insert(ifs->id(), ifs);
if (ifs->isObjectInTrainingArea())
{
++s_areaCount[AesType::AtReconArea];
DEBUG_LOG(m_logger) << "s_areaCount[AesType::AtReconArea] = " << s_areaCount[AesType::AtReconArea];
}
connect(ifs, &ObjectReconArea::newAiv, this, &HandlerReconArea::newAiv);
connect(ifs, &ObjectReconArea::removeAiv, this, &HandlerReconArea::removeAiv);
return ret;
}
Core::FunctionReplyObject HandlerReconArea::reconAreaModifyRequest(const ReconAreaModifyRequest &request)
{
if (request.id() <= 0)
return reconAreaCreateRequest(request);
Core::FunctionReplyObject ret;
ObjectReconArea *ifs = getObjectFromMap(m_objectMap, request.id(), ret);
if (!ifs)
return ret;
// Todo: IsObjectModifiable() ?!?
AreaEffectSimulation::Database::AesReconArea aea(ifs->data());
fillData(request, aea);
return ifs->updateObject(aea);
}
Core::FunctionReplyObject HandlerReconArea::reconAreaModifyGeometryRequest(const ReconAreaModifyRequest &request)
{
// WARNING: request.area.cornerBottomLeft() contains center point!
Core::FunctionReplyObject ret;
ObjectReconArea *ifs = getObjectFromMap(m_objectMap, request.id(), ret);
if (!ifs)
return ret;
// Todo: IsObjectModifiable() ?!?
AreaEffectSimulation::Database::AesReconArea aea(ifs->data());
aea.position = Polygons::centerPoint2BottomLeft(QPointF(request.area().cornerBottomLeft().lon(),
request.area().cornerBottomLeft().lat()),
ifs->data().width,
ifs->data().height,
request.area().rotation());
aea.rotationAngle = request.area().rotation();
return ifs->updateObject(aea);
}
Core::FunctionReplyObject HandlerReconArea::removeObject(int id)
{
ObjectReconArea *ifs = m_objectMap.value(id);
if (ifs == nullptr)
return Core::FunctionReplyObject(id, tr_lts("dds", "Recon area with id %1 not found.")).arg(id);
return ifs->removeObject();
}
Core::FunctionReplyObject HandlerReconArea::switchTo(int id, AesEffectState effectState)
{
ObjectReconArea *ifs = m_objectMap.value(id);
if (ifs == nullptr)
return Core::FunctionReplyObject(id, tr_lts("dds", "Recon area with id %1 not found.")).arg(id);
bool succ = false;
switch (effectState.underlying()) {
case AesEffectState_def::EsActivated:
succ = !ifs->activateObjectNow().error();
break;
case AesEffectState_def::EsPrepared:
succ = ifs->trySwitchToPrepared();
break;
case AesEffectState_def::EsPaused:
succ = ifs->trySwitchToPaused();
break;
case AesEffectState_def::EsExpired:
succ = ifs->trySwitchToExpired();
break;
case AesEffectState_def::EsRemoved:
succ = ifs->trySwitchToRemoved();
break;
case AesEffectState_def::EsCreated:
succ = ifs->trySwitchToCreated();
break;
default:
break;
}
if (succ)
return Core::FunctionReplyObject();
return Core::FunctionReplyObject(id, tr_lts("dds", "Could not switch effect simulation with id %1 to state with id %2.")).arg(id).arg(effectState.underlying());
}
void HandlerReconArea::onReconAreaRemoveRequest(const rti::core::SampleIdentity &cookie,
const Core::RemoveElementRequest &request)
{
DEBUG_LOG(m_logger) << "onReconAreaRemoveRequest: " << request;
Core::FunctionReplyObject ret;
ObjectReconArea *ifs = getObjectFromMap(m_objectMap, request.id(), ret);
if (!ifs)
{
m_mainHandler->dds()->fts()->reconAreaRemoveReply(cookie, ret);
return;
}
ret = ifs->removeObject();
if (ret.error())
{
ERROR_LOG(m_logger) << ret();
}
m_mainHandler->dds()->fts()->reconAreaRemoveReply(cookie, ret);
}
Core::FunctionReplyObject HandlerReconArea::activateObjectOffset(int id, qint64 msecs)
{
ObjectReconArea *ifs = m_objectMap.value(id);
if (ifs == nullptr)
return Core::FunctionReplyObject(id, tr_lts("dds", "Recon area with id %1 not found.")).arg(id);
return ifs->setActivationOffset(msecs);
}
Core::FunctionReplyObject HandlerReconArea::modifyPartyParticipant(qint32 itemId, qint32 partyId, qint32 participantId)
{
ObjectReconArea *ifs = m_objectMap.value(itemId);
if (!ifs)
return Core::FunctionReplyObject(itemId, tr_lts("dds", "Recon area with id %1 not found.")).arg(itemId);
AreaEffectSimulation::Database::AesReconArea aea(ifs->data());
aea.partyId = partyId;
aea.participantId= participantId;
return ifs->updateObject(aea);
}
} // Namespace AreaEffectSimulation