Files
qt5-legatus-legacy/Lts/Proxies/TrainingAreaBase/Plugins/TetraJson/convert_from_json.cpp
T
2026-08-13 18:33:10 +02:00

200 lines
6.7 KiB
C++
Executable File

/**
* Read XDR telegrams from a directory and convert it to EtsTetraIcd structures
* $Id$
* $HeadURL$
* $Author$
* Created by Christian Ehrlicher, SLSE, 2016-04-14
*/
#include "convert_from_json.h"
#include <TrainingAreaBase/training_area_telegrams.h>
#include <QJsonDocument>
#include <QJsonObject>
#include <NGLLogger/NGLLoggerBootstrap.h>
namespace TetraRadio
{
ConvertFromJson::ConvertFromJson(const std::shared_ptr<TrainingAreaBase::RecvFromTab> &rxHandler,
const char *loggerName)
: m_rxHandler(rxHandler)
, m_bWarnedOnce(false)
, m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger(loggerName))
{}
bool ConvertFromJson::handleTelegram(const QByteArray &baJson, int &recvCounter)
{
using namespace TrainingAreaBase::TetraIcd;
if (baJson.isEmpty())
return false;
const QJsonObject obj = QJsonDocument::fromJson(baJson).object();
const QJsonValue sendCounter = obj.value(QStringLiteral("counter"));
if (!sendCounter.isUndefined())
{
if (!sendCounter.isDouble())
return false;
recvCounter = sendCounter.toInt(-1);
DEBUG_LOG(m_logger) << "Incoming telegram with Id " << obj.value(QStringLiteral("type")).toString();
if (recvCounter < 0)
return false;
}
const QJsonValue typeId = obj.value(QStringLiteral("typeId"));
if (!typeId.isDouble())
{
ERROR_LOG(m_logger) << "Can not read type id: " << baJson;
return false;
}
const QJsonObject data = obj.value(QStringLiteral("data")).toObject();
try
{
switch (typeId.toInt())
{
case Constraints<Acknowledge>::id(): // 0
{
auto ack = TrainingAreaBase::TetraIcd::Acknowledge::fromJson(data);
handleAcknowledge(ack.timeStamp, ack.ackCounter);
break;
}
case Constraints<ManipulationReport>::id(): // 2
rxData(ManipulationReport::fromJson(data));
break;
case Constraints<EquipmentOperationalState>::id(): // 7
rxData(EquipmentOperationalState::fromJson(data));
break;
case Constraints<EquipmentConfigurationReport>::id(): // 11
rxData(EquipmentConfigurationReport::fromJson(data));
break;
case Constraints<CtaDataError>::id(): // 12
rxData(CtaDataError::fromJson(data));
break;
case Constraints<RestoreRadioReadiness>::id(): // 13
rxData(RestoreRadioReadiness::fromJson(data));
break;
case Constraints<PositionReport>::id(): // 21
rxData(PositionReport::fromJson(data));
break;
case Constraints<PositionReportWithMountedEquipments>::id(): // 22
rxData(PositionReportWithMountedEquipments::fromJson(data));
break;
case Constraints<MineTriggered>::id(): // 40
rxData(MineTriggered::fromJson(data));
break;
case Constraints<DefinitionIed>::id(): // 43
rxData(DefinitionIed::fromJson(data));
break;
case Constraints<StateIed>::id(): // 44
rxData(StateIed::fromJson(data));
break;
case Constraints<DusSingleMineState>::id(): // 45
rxData(DusSingleMineState::fromJson(data));
break;
case Constraints<StateChangeDirect>::id(): // 52
rxData(StateChangeDirect::fromJson(data));
break;
case Constraints<StateChangeIndirect>::id(): // 53
rxData(StateChangeIndirect::fromJson(data));
break;
case Constraints<OperatorAction>::id(): // 55
rxData(OperatorAction::fromJson(data));
break;
case Constraints<SelectiveReammunition>::id(): // 56
rxData(SelectiveReammunition::fromJson(data));
break;
case Constraints<StateChange>::id(): // 61
rxData(StateChange::fromJson(data));
break;
case Constraints<FunctionalAreaEntry>::id(): // 63
rxData(FunctionalAreaEntry::fromJson(data));
break;
case Constraints<OpaquePayloadDataIn>::id(): // 71
rxData(OpaquePayloadDataIn::fromJson(data));
break;
case Constraints<SpecialSensorData>::id(): // 92
rxData(SpecialSensorData::fromJson(data));
break;
case Constraints<MinelayerTrailerData>::id(): // 95
rxData(MinelayerTrailerData::fromJson(data));
break;
case Constraints<MinelayerThrowerData>::id(): // 96
rxData(MinelayerThrowerData::fromJson(data));
break;
case Constraints<MinelayerTrailerPosition>::id(): // 97
rxData(MinelayerTrailerPosition::fromJson(data));
break;
case Constraints<EquipmentEvent>::id(): // 185
rxData(EquipmentEvent::fromJson(data));
break;
case Constraints<EquipmentGearAssignment>::id(): // 200
rxData(EquipmentGearAssignment::fromJson(data));
break;
case Constraints<EquipmentGearChargeState>::id(): // 202
rxData(EquipmentGearChargeState::fromJson(data));
break;
case Constraints<BiteReport>::id(): // 205
rxData(BiteReport::fromJson(data));
break;
case Constraints<EquipmentGearEvent>::id(): // 210
rxData(EquipmentGearEvent::fromJson(data));
break;
case Constraints<ParticipantSwVersions>::id(): // 213
rxData(ParticipantSwVersions::fromJson(data));
break;
case Constraints<ParticipantModeReport>::id(): // 231
rxData(ParticipantModeReport::fromJson(data));
break;
case Constraints<ParticipantConfigurationReport>::id(): // 233
rxData(ParticipantConfigurationReport::fromJson(data));
break;
case Constraints<SanitationRepair>::id(): //24
rxData(SanitationRepair::fromJson(data));
break;
case Constraints<SanitaryMaterialStockReport>::id(): //241
rxData(SanitaryMaterialStockReport::fromJson(data));
break;
case Constraints<Sanitation>::id(): //242
rxData(Sanitation::fromJson(data));
break;
case Constraints<EmergencyCall>::id(): // 1120
rxData(EmergencyCall::fromJson(data));
break;
case Constraints<ApacheLaserDesignation>::id():
rxData(ApacheLaserDesignation::fromJson(data));
break;
case Constraints<ProxyConnectionState>::id(): // 2013
handleTetraConnectionChanged(ProxyConnectionState::fromJson(data).connectedToSystem);
break;
case Constraints<ParticipantLicenseChange>::id(): // 2014
//participantLicenseChange(ParticipantLicenseChange::fromJson(data));
break;
default:
WARNING_LOG(m_logger) << "Handler for telegram Id " << typeId.toInt()
<< " not yet implemented (" << baJson << ")";
return false;
}
}
catch (const std::exception &e)
{
WARNING_LOG(m_logger) << "Could not parse json: " << e.what() << " (" << baJson << ")";
return false;
}
return true;
}
template<typename T>
void ConvertFromJson::rxData(const T &data)
{
if (!m_rxHandler)
{
if (!m_bWarnedOnce)
{
ERROR_LOG(m_logger) << "No RecvFromTab available";
m_bWarnedOnce = true;
}
return;
}
return m_rxHandler->rxData(data);
}
} // namespace TetraRadio