/** * Telegrams toJSON * $Id$ * $HeadURL$ * $Author$ * Created by Norbert Thoden, NLE, 2020-06-29 */ #include "tgt_telegrams.h" #include #include namespace TargetManagement { // // Helpers // JsonException::JsonException(const QJsonObject &obj, const QString &key) : m_obj(obj) , m_key(key) , m_what("Could not find key '" + key.toUtf8() + "' in json ('" + QJsonDocument(obj).toJson(QJsonDocument::Compact) + "')") {} template QJsonValue enumToJson(E e) { static_assert(std::is_enum::value, "Only useable with enumerations"); return static_cast(e); } template bool get(const QJsonObject &obj, const QString &key, T &val, bool bOptional = false) { if (bOptional) { try { val = T::fromJson(obj[key].toObject()); } catch (const JsonException &e) { Q_UNUSED(e); return false; } } else val = T::fromJson(obj[key].toObject()); return true; } // POD getter template <> bool get(const QJsonObject &obj, const QString &key, bool &val, bool bOptional) { const auto jVal = obj[key]; if (!jVal.isBool()) { if (bOptional) return false; throw JsonException(obj, key); } val = jVal.toBool(); return true; } template <> bool get(const QJsonObject &obj, const QString &key, int &val, bool bOptional) { const auto jVal = obj[key]; if (!jVal.isDouble()) // ToDo: Check { if (bOptional) return false; throw JsonException(obj, key); } val = jVal.toInt(); return true; } template <> bool get(const QJsonObject &obj, const QString &key, double &val, bool bOptional) { const auto jVal = obj[key]; if (!jVal.isDouble()) { if (bOptional) return false; throw JsonException(obj, key); } val = jVal.toDouble(); return true; } template <> bool get(const QJsonObject &obj, const QString &key, QString &val, bool bOptional) { const auto jVal = obj[key]; if (!jVal.isString()) { if (bOptional) return false; throw JsonException(obj, key); } val = jVal.toString(); return true; } // // enum getter // // Effect template <> bool get(const QJsonObject &obj, const QString &key, Effect &val, bool bOptional) { int iVal; get(obj, key, iVal, bOptional); switch (static_cast(iVal)) { case Effect_def::NearMiss: case Effect_def::MobilityKill: case Effect_def::WeaponKill: val = Effect( static_cast(iVal) ); return true; } throw JsonException(obj, key); } // // Structs // // ------------------------------------------------------------------ // // GeoPosition2D // QJsonObject GeoPosition2D::toJson() const { return QJsonObject({{QStringLiteral("lat"), lat}, {QStringLiteral("lon"), lon}, }); } GeoPosition2D GeoPosition2D::fromJson(const QJsonObject &obj) { GeoPosition2D ret; get(obj, QStringLiteral("lat"), ret.lat); get(obj, QStringLiteral("lon"), ret.lon); return ret; } // // ShootbackTargetData // QJsonObject ShootbackTargetData::toJson() const { return QJsonObject({{QStringLiteral("id"), id}, {QStringLiteral("targetDataId"), targetDataId}, {QStringLiteral("name"), name}, {QStringLiteral("targetParticipantEquipmentNumber"), targetParticipantEquipmentNumber}, {QStringLiteral("activateLaserDesignation"), activateLaserDesignation}, {QStringLiteral("activateLights"), activateLights}, {QStringLiteral("activatePopupAutomatic"), activatePopupAutomatic}, {QStringLiteral("hitsToKill"), hitsToKill}, {QStringLiteral("permanentInstalledTarget"), permanentInstalledTarget}, }); } ShootbackTargetData ShootbackTargetData::fromJson(const QJsonObject &obj) { ShootbackTargetData ret; get(obj, QStringLiteral("id"), ret.id); get(obj, QStringLiteral("targetDataId"), ret.targetDataId); get(obj, QStringLiteral("name"), ret.name); get(obj, QStringLiteral("targetParticipantEquipmentNumber"), ret.targetParticipantEquipmentNumber); get(obj, QStringLiteral("activateLaserDesignation"), ret.activateLaserDesignation); get(obj, QStringLiteral("activateLights"), ret.activateLights); get(obj, QStringLiteral("activatePopupAutomatic"), ret.activatePopupAutomatic); get(obj, QStringLiteral("hitsToKill"), ret.hitsToKill); get(obj, QStringLiteral("permanentInstalledTarget"), ret.permanentInstalledTarget); return ret; } // // ShootbackAreaData // QJsonObject ShootbackAreaData::toJson() const { return QJsonObject({{QStringLiteral("id"), id}, {QStringLiteral("name"), name}, {QStringLiteral("position"), position.toJson()}, {QStringLiteral("width"), width}, {QStringLiteral("height"), height}, }); } ShootbackAreaData ShootbackAreaData::fromJson(const QJsonObject &obj) { ShootbackAreaData ret; get(obj, QStringLiteral("id"), ret.id); get(obj, QStringLiteral("name"), ret.name); get(obj, QStringLiteral("position"), ret.position); get(obj, QStringLiteral("width"), ret.width); get(obj, QStringLiteral("height"), ret.height); return ret; } // // ShootbackConfigurationData // QJsonObject ShootbackConfigurationData::toJson() const { return QJsonObject({{QStringLiteral("interval1"), interval1}, {QStringLiteral("flash1"), flash1}, {QStringLiteral("effect1"), enumToJson(effect1.underlying())}, {QStringLiteral("interval2"), interval2}, {QStringLiteral("flash2"), flash2}, {QStringLiteral("effect2"), enumToJson(effect2.underlying())}, }); } ShootbackConfigurationData ShootbackConfigurationData::fromJson(const QJsonObject &obj) { ShootbackConfigurationData ret; get(obj, QStringLiteral("interval1"), ret.interval1); get(obj, QStringLiteral("flash1"), ret.flash1); get(obj, QStringLiteral("effect1"), ret.effect1); get(obj, QStringLiteral("interval2"), ret.interval2); get(obj, QStringLiteral("flash2"), ret.flash2); get(obj, QStringLiteral("effect2"), ret.effect2); return ret; } // // TargetAreaAssignmentData // QJsonObject TargetAreaAssignmentData::toJson() const { return QJsonObject({{QStringLiteral("id"), id}, {QStringLiteral("name"), name}, {QStringLiteral("areaId"), areaId}, {QStringLiteral("targetParticipantId"), targetParticipantId}, {QStringLiteral("configuration"), configuration.toJson()}, {QStringLiteral("isActive"), isActive}, }); } TargetAreaAssignmentData TargetAreaAssignmentData::fromJson(const QJsonObject &obj) { TargetAreaAssignmentData ret; get(obj, QStringLiteral("id"), ret.id); get(obj, QStringLiteral("name"), ret.name); get(obj, QStringLiteral("areaId"), ret.areaId); get(obj, QStringLiteral("targetParticipantId"), ret.targetParticipantId); get(obj, QStringLiteral("configuration"), ret.configuration); get(obj, QStringLiteral("isActive"), ret.isActive); return ret; } } // namespace TargetManagement