267 lines
7.2 KiB
C++
Executable File
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
|