Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Services/AreaEffectSimulation/handler_recon_area.cpp
T
berrux-dev 472f537313 Migrates AreaEffectSimulation to generated rtiddsgen API
Converts accessor calls to plain member access across aes service and plugin.
2026-09-21 02:45:07 +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 <AreaEffectSimulation/Utils/polygons.h>
#include <QtGui/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[static_cast<int>(AesType::AtReconArea)];
DEBUG_LOG(m_logger) << "s_areaCount[AesType::AtReconArea] = " << s_areaCount[static_cast<int>(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) {
case AesEffectState::EsActivated:
succ = !ifs->activateObjectNow().error();
break;
case AesEffectState::EsPrepared:
succ = ifs->trySwitchToPrepared();
break;
case AesEffectState::EsPaused:
succ = ifs->trySwitchToPaused();
break;
case AesEffectState::EsExpired:
succ = ifs->trySwitchToExpired();
break;
case AesEffectState::EsRemoved:
succ = ifs->trySwitchToRemoved();
break;
case AesEffectState::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);
}
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