/** * Handler for all exercise objects * $Id$ * $HeadURL$ * $Author$ * Created by Malte Diers, SLSE, 2017-04-05 */ #include "handler_recon_area.h" #include #include 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 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