Files
qt5-legatus-legacy/Lts/Plugins/TargetManagement/Gui/ShootbackTargetConfiguration/tgt_telegrams.cpp
T
2026-08-13 18:33:10 +02:00

267 lines
7.2 KiB
C++
Executable File

/**
* Telegrams toJSON
* $Id$
* $HeadURL$
* $Author$
* Created by Norbert Thoden, NLE, 2020-06-29
*/
#include "tgt_telegrams.h"
#include <QJsonDocument>
#include <QJsonObject>
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 <typename E>
QJsonValue enumToJson(E e)
{
static_assert(std::is_enum<E>::value, "Only useable with enumerations");
return static_cast<int>(e);
}
template <typename T>
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<Effect_def::type>(iVal))
{
case Effect_def::NearMiss:
case Effect_def::MobilityKill:
case Effect_def::WeaponKill:
val = Effect( static_cast<Effect_def::type>(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