157 lines
4.9 KiB
C++
Executable File
157 lines
4.9 KiB
C++
Executable File
/**
|
|
* Convert Json from WLS to internal telegrams
|
|
* $Id$
|
|
* $HeadURL$
|
|
* $Author$
|
|
* Created by Christian Ehrlicher, SLSE, 2016-09-26
|
|
*/
|
|
|
|
#include "hla_handler_rx.h"
|
|
#include "hla_dispatcher.h"
|
|
|
|
#include <TrainingAreaBase/training_area_telegrams.h>
|
|
#include <QJsonDocument>
|
|
|
|
namespace HlaJson
|
|
{
|
|
|
|
HlaHandlerRx::HlaHandlerRx(const std::shared_ptr<TrainingAreaBase::RecvFromTab> &recvFromTabCb,
|
|
HlaDispatcher *dispatcher)
|
|
: m_rxHandler(recvFromTabCb)
|
|
, m_dispatcher(dispatcher)
|
|
, m_bWarnedOnce(false)
|
|
, m_logger(getLogger("HlaHandlerRx"))
|
|
{}
|
|
|
|
bool HlaHandlerRx::handleTelegram(const QByteArray &baJson)
|
|
{
|
|
using namespace TrainingAreaBase::TetraIcd;
|
|
|
|
if (baJson.isEmpty())
|
|
return false;
|
|
const QJsonObject obj = QJsonDocument::fromJson(baJson).object();
|
|
TRACE_LOG(m_logger) << "incoming telegram: " << baJson;
|
|
|
|
// 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<PositionReport>::id(): // 21
|
|
rxData(PositionReport::fromJson(data));
|
|
break;
|
|
case Constraints<ProxyConnectionState>::id(): // 2013
|
|
m_dispatcher->onHlaExternalConnectionStateChanged(ProxyConnectionState::fromJson(data).connectedToSystem);
|
|
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<MineTriggered>::id(): // 41
|
|
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<StateChange>::id(): // 61
|
|
rxData(StateChange::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<WlsParticipantsConnectionState>::id(): // 3004
|
|
{
|
|
const auto tele = WlsParticipantsConnectionState::fromJson(data);
|
|
emit participantConnectionState(tele.equipmentNumber, tele.dataCommunicationPossible);
|
|
break;
|
|
}
|
|
default:
|
|
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 HlaHandlerRx::rxData(const T &data)
|
|
{
|
|
if (!m_rxHandler)
|
|
{
|
|
if (!m_bWarnedOnce)
|
|
{
|
|
ERROR_LOG(m_logger) << "No RecvFromTab available";
|
|
m_bWarnedOnce = true;
|
|
}
|
|
return;
|
|
}
|
|
emit m_dispatcher->wlsTelegramReceived(&data);
|
|
return m_rxHandler->rxData(data);
|
|
}
|
|
|
|
} // namespace HlaJson
|