195 lines
7.0 KiB
C++
Executable File
195 lines
7.0 KiB
C++
Executable File
/**
|
|
* Handler for all exercise objects
|
|
* $Id$
|
|
* $HeadURL$
|
|
* $Author$
|
|
* Created by Hanna E. Rathje, SLSE, 2015-09-03
|
|
*/
|
|
|
|
#include "handler_danger_area.h"
|
|
#include "object_danger_area.h"
|
|
|
|
#include <TrainingAreaBase/tab_dtc.h>
|
|
#include <QPolygonF>
|
|
#include <QSet>
|
|
|
|
namespace AreaEffectSimulation
|
|
{
|
|
|
|
HandlerDangerArea::HandlerDangerArea(MainHandler *mainHandler)
|
|
: HandlerBase(mainHandler, QStringLiteral("DangerArea"))
|
|
, Interface::Fts::DangerAreaModifyRequestHandler(mainHandler->dds()->fts())
|
|
, Interface::Fts::DangerAreaRemoveRequestHandler(mainHandler->dds()->fts())
|
|
{}
|
|
|
|
bool HandlerDangerArea::init()
|
|
{
|
|
QVector<Database::AesDangerArea> areaVec;
|
|
// read all DangerAreas from database
|
|
if (!m_mainHandler->db()->select(areaVec))
|
|
{
|
|
ERROR_LOG(m_logger) << "Error reading data from database!";
|
|
return false;
|
|
}
|
|
|
|
QVector<Database::AesDangerSegment> segmentVec;
|
|
// read all Danger Segments from database
|
|
if (!m_mainHandler->db()->select(segmentVec))
|
|
{
|
|
ERROR_LOG(m_logger) << "Error reading data from database!";
|
|
return false;
|
|
}
|
|
|
|
// create area mine objects
|
|
QVector<Database::AesDangerSegment> mySegments;
|
|
for (const Database::AesDangerArea &area : qAsConst(areaVec))
|
|
{
|
|
// Gather segments
|
|
mySegments.clear();
|
|
for (const Database::AesDangerSegment &mas : qAsConst(segmentVec))
|
|
{
|
|
if (mas.dangerAreaId == area.privDangerAreaId)
|
|
mySegments << mas;
|
|
}
|
|
|
|
// Create and init Object
|
|
ObjectDangerArea *ifs(new ObjectDangerArea(m_mainHandler, this));
|
|
Core::FunctionReplyObject ret = ifs->createObject(area, {}, mySegments);
|
|
if (ret.error())
|
|
{
|
|
delete ifs;
|
|
ERROR_LOG(m_logger) << ret();
|
|
return false;
|
|
}
|
|
|
|
// Push into Map
|
|
m_dangerAreaObjMap.insert(ifs->id(), ifs);
|
|
connect(ifs, &ObjectDangerArea::newAiv, this, &HandlerDangerArea::newAiv);
|
|
connect(ifs, &ObjectDangerArea::removeAiv, this, &HandlerDangerArea::removeAiv);
|
|
}
|
|
|
|
DEBUG_LOG(m_logger) << "m_dangerAreaObjMap.size() = " << m_dangerAreaObjMap.size();
|
|
|
|
return true;
|
|
}
|
|
|
|
void HandlerDangerArea::onDangerAreaModifyRequest(const rti::core::SampleIdentity &cookie,
|
|
const DangerAreaModifyRequest &request)
|
|
{
|
|
DEBUG_LOG(m_logger) << "onDangerAreaModifyRequest: " << request;
|
|
Core::FunctionReplyObject ret = dangerAreaModifyRequest(request);
|
|
if (ret.error())
|
|
WARNING_LOG(m_logger) << ret();
|
|
m_mainHandler->dds()->fts()->dangerAreaModifyReply(cookie, ret);
|
|
}
|
|
|
|
Core::FunctionReplyObject HandlerDangerArea::dangerAreaCreateRequest(const DangerAreaModifyRequest &request)
|
|
{
|
|
Database::AesDangerArea newData;
|
|
|
|
if (request.id() < 0) // is the id given as negative? set id -> used by OC-Laptop
|
|
newData.id = request.id();
|
|
newData.name = QString::fromStdString(request.name());
|
|
newData.effectStart = request.effectStart().is_set() && request.effectStart().get() > 0 ? QDateTime::fromMSecsSinceEpoch(request.effectStart().get()) : QDateTime();
|
|
newData.chargeTypeId = request.chargeTypeId();
|
|
newData.effectDuration = request.effectDuration();
|
|
newData.partyId = request.partyId().is_set() ? request.partyId().get() : 0;
|
|
newData.participantId = request.participantId().is_set() ? request.participantId().get() : 0;
|
|
newData.associatedAesId = request.associatedAesId().is_set() ? request.associatedAesId().get() : 0;
|
|
|
|
|
|
ObjectDangerArea *ifs(new ObjectDangerArea(m_mainHandler, this));
|
|
|
|
Core::FunctionReplyObject ret = ifs->createObject(newData,
|
|
request.segments(),
|
|
QVector<Database::AesDangerSegment>());
|
|
if (ret.error())
|
|
{
|
|
delete ifs;
|
|
return ret;
|
|
}
|
|
m_dangerAreaObjMap.insert(ifs->id(), ifs);
|
|
connect(ifs, &ObjectDangerArea::newAiv, this, &HandlerDangerArea::newAiv);
|
|
connect(ifs, &ObjectDangerArea::removeAiv, this, &HandlerDangerArea::removeAiv);
|
|
|
|
return ret;
|
|
}
|
|
|
|
bool HandlerDangerArea::dangerAreaRemoveRequest(const Core::RemoveElementRequest request)
|
|
{
|
|
DEBUG_LOG(m_logger) << "onDangerAreaRemoveRequest dangerArea id: " << request.id();
|
|
Core::FunctionReplyObject ret;
|
|
const rti::core::SampleIdentity cookie;
|
|
ObjectDangerArea *ifs = getObjectFromMap(m_dangerAreaObjMap, request.id(), ret);
|
|
if (!ifs)
|
|
{
|
|
return m_mainHandler->dds()->fts()->dangerAreaRemoveReply(cookie, ret);
|
|
}
|
|
|
|
ret = ifs->removeObject();
|
|
if (ret.error())
|
|
WARNING_LOG(m_logger) << ret();
|
|
|
|
return m_mainHandler->dds()->fts()->dangerAreaRemoveReply(cookie, ret);
|
|
}
|
|
|
|
bool HandlerDangerArea::getDangerAreaByAssociatedAesId(const int &id, Database::AesDangerArea *dangerArea)
|
|
{
|
|
DEBUG_LOG(m_logger)<<" [Handler getDangerAreaByAssociatedAesId] dangerArea Size: "<<m_dangerAreaObjMap.size()<<" aesId: "<<id;
|
|
for(auto obj : m_dangerAreaObjMap.toStdMap() )
|
|
{
|
|
if (obj.second->data().associatedAesId == id && obj.second->data().effectStateId != AesEffectState::EsRemoved)
|
|
{
|
|
DEBUG_LOG(m_logger)<<"[HandlerDangerArea] found ! dangerArea name: "<<obj.second->data().name<<" aesId: "<<obj.second->data().associatedAesId;
|
|
*dangerArea = obj.second->data();
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
Core::FunctionReplyObject HandlerDangerArea::dangerAreaModifyRequest(const DangerAreaModifyRequest &request)
|
|
{
|
|
Core::FunctionReplyObject ret;
|
|
if (request.id() == 0 || ((request.id() < 0) && !getObjectFromMap(m_dangerAreaObjMap, std::abs(request.id()), ret)))
|
|
return dangerAreaCreateRequest(request);
|
|
|
|
ObjectDangerArea *ifs = getObjectFromMap(m_dangerAreaObjMap, std::abs(request.id()), ret);
|
|
if (!ifs)
|
|
return ret;
|
|
|
|
Database::AesDangerArea newData(ifs->data());
|
|
if (request.id() < 0) // is the id given as negative? set id -> used by OC-Laptop
|
|
newData.id = request.id();
|
|
newData.name = QString::fromStdString(request.name());
|
|
newData.effectStart = request.effectStart().is_set() && request.effectStart().get() > 0 ? QDateTime::fromMSecsSinceEpoch(request.effectStart().get()) : QDateTime();
|
|
newData.chargeTypeId = request.chargeTypeId();
|
|
newData.effectDuration = request.effectDuration();
|
|
newData.partyId = request.partyId().is_set() ? request.partyId().get() : 0;
|
|
newData.participantId = request.participantId().is_set() ? request.participantId().get() : 0;
|
|
newData.associatedAesId = request.associatedAesId().is_set() ? request.associatedAesId().get() : 0;
|
|
|
|
return ifs->updateObject(newData, request.segments());
|
|
}
|
|
|
|
void HandlerDangerArea::onDangerAreaRemoveRequest(const rti::core::SampleIdentity &cookie,
|
|
const Core::RemoveElementRequest &request)
|
|
{
|
|
DEBUG_LOG(m_logger) << "onDangerAreaRemoveRequest" << request;
|
|
Core::FunctionReplyObject ret;
|
|
ObjectDangerArea *ifs = getObjectFromMap(m_dangerAreaObjMap, request.id(), ret);
|
|
if (!ifs)
|
|
{
|
|
m_mainHandler->dds()->fts()->dangerAreaRemoveReply(cookie, ret);
|
|
return;
|
|
}
|
|
|
|
ret = ifs->removeObject();
|
|
if (ret.error())
|
|
WARNING_LOG(m_logger) << ret();
|
|
|
|
m_mainHandler->dds()->fts()->dangerAreaRemoveReply(cookie, ret);
|
|
}
|
|
|
|
} // Namespace AreaEffectSimulation
|