234 lines
7.8 KiB
C++
Executable File
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
|