/** * Handler ShootbackTargets (L400) * $Id$ * $HeadURL$ * $Author$ * Created by N. Thoden, SLTE, 31.05.2022 */ #include "object_target_information.h" #include "../main_handler.h" #include #include //------------------------------------------------------------------------------ namespace ParticipantManagement { // // Core::GeoPosition2D Core::GeoPosition2D posFromJson(const QJsonValue &val) { const QJsonObject objElement(val.toObject()); Core::GeoPosition2D element; { const QJsonValue valLon(objElement.value(QStringLiteral("lon"))); element.lon(valLon.toDouble()); } { const QJsonValue valLat(objElement.value(QStringLiteral("lat"))); element.lat(valLat.toDouble()); } return element; } QJsonObject toJson(const Core::GeoPosition2D &element) { QJsonObject obj; obj[QStringLiteral("lon")] = element.lon(); obj[QStringLiteral("lat")] = element.lat(); return obj; } // // ShootbackArea ShootbackArea areaFromJson(const QJsonValue &val) { ShootbackArea area; // use val.toObject().value instead val[key] introduced with qt5.10 area.identifier(val.toObject().value(QStringLiteral("identifier")).toString().toStdString()); if (val.toObject().value(QStringLiteral("coords")).isArray()) { const QJsonArray &arr = val.toObject().value(QStringLiteral("coords")).toArray(); if (arr.size() > 0) area.coord1( posFromJson(arr.at(0)) ); if (arr.size() > 1) area.coord2( posFromJson(arr.at(1)) ); if (arr.size() > 2) area.coord3( posFromJson(arr.at(2)) ); if (arr.size() > 3) area.coord4( posFromJson(arr.at(3)) ); } return area; } QJsonObject toJson(const ShootbackArea &area) { QJsonObject obj; obj.insert(QStringLiteral("identifier"), QString::fromStdString(area.identifier())); QJsonArray arr; arr.push_back(toJson(area.coord1())); arr.push_back(toJson(area.coord2())); arr.push_back(toJson(area.coord3())); arr.push_back(toJson(area.coord4())); obj.insert(QStringLiteral("coords"), arr); return obj; } // // vector QJsonObject toJson(const std::vector& shootback_areas) { if (shootback_areas.size() == 0) return {}; QJsonArray arr; for (const ShootbackArea &area : shootback_areas) arr.push_back(toJson(area)); QJsonObject obj; obj.insert(QStringLiteral("shootback_areas"), arr); return obj; } std::vector vecfromJson(const QJsonValue &val) { std::vector ret; if (val.isNull()) return ret; // use val.toObject().value instead val[key] introduced with qt5.10 if (val.toObject().value(QStringLiteral("shootback_areas")).isArray()) { const QJsonArray &arr = val.toObject().value(QStringLiteral("shootback_areas")).toArray(); ret.reserve(arr.size()); for (const auto& item : arr) ret.push_back(areaFromJson(item)); } return ret; } ObjectTargetInformation::ObjectTargetInformation(MainHandler *mainHandler) : m_mainHandler(mainHandler) , m_logger(getLogger("ObjectTargetInformation")) { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } //------------------------------------------------------------------------------ ObjectTargetInformation::~ObjectTargetInformation() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; if (isValid()) m_mainHandler->dts()->removeTargetInformationByKey(m_data.id()); TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } //------------------------------------------------------------------------------ bool ObjectTargetInformation::isValid() const { return m_data.id() > 0; } //------------------------------------------------------------------------------ Core::FunctionReplyObject ObjectTargetInformation::createObject(const TargetInformation &data) { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; m_data = data; if (m_data.id() <= 0) { Database::PpmTargetInformation dbData(toDbData(data)); if (!m_mainHandler->db()->insert(dbData)) return Core::FunctionReplyObject(0, tr_lts("dds", "Error inserting TargetInformation-data into database")); m_data.id(dbData.id); DEBUG_LOG(m_logger) << "New PpmTargetInformation: " /*<< m_data.id()*/; } // Publish Data via DTS onPublishData(); TRACE_LOG(m_logger) << LOGFUNCTION << " END"; return Core::FunctionReplyObject(m_data.id()); } //------------------------------------------------------------------------------ Core::FunctionReplyObject ObjectTargetInformation::updateObject(const TargetInformation &data) { TRACE_LOG(m_logger) << LOGFUNCTION << " START, participantId=" << data.participantId() << " size =" << data.shootbackAreas().size(); Database::PpmTargetInformation dbData; dbData = toDbData(data); if (!m_mainHandler->db()->update(dbData)) return Core::FunctionReplyObject(data.id(), tr_lts("dds", "Error updating TargetInformation-data into database")); m_data = data; DEBUG_LOG(m_logger) << "Data changed for TargetInformation: " << m_data.participantId(); // Publish Data via DTS onPublishData(); TRACE_LOG(m_logger) << LOGFUNCTION << " END, id=" << data.id() << " size =" << data.shootbackAreas().size(); return Core::FunctionReplyObject(m_data.id()); } //------------------------------------------------------------------------------ Core::FunctionReplyObject ObjectTargetInformation::removeObject() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; if (!m_mainHandler->db()->removePpmTargetInformation(m_data.id())) return Core::FunctionReplyObject(m_data.id(), tr_lts("dds", "TargetInformation with id %1 can not be removed from DB")).arg(m_data.id()); if (!m_mainHandler->dts()->removeTargetInformationByKey(m_data.id())) return Core::FunctionReplyObject(m_data.id(), tr_lts("dds", "TargetInformation with id %1 can not be removed from DDS")).arg(m_data.id()); TRACE_LOG(m_logger) << LOGFUNCTION << " END"; return Core::FunctionReplyObject(m_data.id()); } //------------------------------------------------------------------------------ void ObjectTargetInformation::onPublishData() { TRACE_LOG(m_logger) << "Publish TargetInformation-data to dds (" << m_data.id() << ") ..."; if (!m_mainHandler->dts()->publish(m_data)) ERROR_LOG(m_logger) << "Error publishing TargetInformation-data to dds"; } // ------------------------------------------------------------------------------------------------------- // convert methods // ------------------------------------------------------------------------------------------------------- // ParticipantManagement::TargetInformation => Database::PpmTargetInformation Database::PpmTargetInformation ObjectTargetInformation::toDbData(const TargetInformation &ddsData) { Database::PpmTargetInformation dbData; dbData.id = ddsData.id(); dbData.participantId = ddsData.participantId(); dbData.preWarningInterval = ddsData.prewarningInterval(); dbData.preWarningEffect = static_cast(ddsData.prewarningEffect().underlying()); dbData.takeDownInterval = ddsData.takedownInterval(); dbData.takeDownEffect = static_cast(ddsData.takedownEffect().underlying()); const std::vector& shootback_areas = ddsData.shootbackAreas(); const QJsonObject &obj = toJson(shootback_areas); dbData.properties = QString::fromStdString( QJsonDocument(obj).toJson(QJsonDocument::Compact).toStdString() ); return dbData; } // ------------------------------------------------------------------------------------------------------- // Database::PpmTargetInformation => ParticipantManagement::TargetInformation TargetInformation ObjectTargetInformation::toDdsData(const Database::PpmTargetInformation &dbData) { TargetInformation ddsData; ddsData.id(dbData.id); ddsData.participantId(dbData.participantId); ddsData.prewarningInterval(dbData.preWarningInterval); ddsData.prewarningEffect(static_cast(dbData.preWarningEffect)); ddsData.takedownInterval(dbData.takeDownInterval); ddsData.takedownEffect(static_cast(dbData.takeDownEffect)); const QByteArray &propertiesBa = dbData.properties.toUtf8(); QJsonParseError parserError; const QJsonDocument doc(QJsonDocument::fromJson(propertiesBa, &parserError)); if (parserError.error != QJsonParseError::NoError) qCritical() << "Error parsing json document: " << parserError.errorString() << " '" << propertiesBa << "'"; qDebug() << "json to parse: " << doc.toJson(); QJsonObject obj(doc.object()); const std::vector &sbAreas = vecfromJson(obj); ddsData.shootbackAreas(sbAreas); return ddsData; } // ------------------------------------------------------------------------------------------------------- } // Namespace ParticipantManagement