Files
qt5-legatus-legacy/Lts/Proxies/WirelessLocationSystem/wls_sfm_message_converter.cpp
T
2026-08-13 18:33:10 +02:00

107 lines
2.8 KiB
C++
Executable File

/**
* Convert SfmMessages to Wls representation and vice versa
* $Id$
* $HeadURL$
* $Author$
* Created by Christian Ehrlicher, SLSE, 2017-01-10
*/
#include "wls_sfm_message_converter.h"
#include <QByteArray>
#include <QSharedPointer>
#include <LtsUtilsCore/sfm_bytemessage_converter.h>
#include "logger.h"
namespace WirelessLocationSystem
{
namespace SfmMessageConverter
{
/**
* \brief Alloziiert auf Basis der Parameter ein SfmMessage_rx-Kindobjekt
*
* \author B. Ziegler
*
* \param id Die ID der Nachricht
*
* \return Falls möglich ein entsprechendes Kindobjekt, sonst einen Null-Pointer
*/
static SfmMessage_rx *getSpecificSfmMessage(SfmMessage::MsgId p_id)
{
switch (p_id)
{
case SfmMessage::MsgId::SfmRestartNotification:
return new SfmMsgSfmRestart_rx;
case SfmMessage::MsgId::EquipmentId:
return new SfmMsgEquipmentId;
case SfmMessage::MsgId::TacticalState:
return new SfmMsgTacticalState_rx;
case SfmMessage::MsgId::LicenseState:
return new SfmMsgLicenseState_rx;
case SfmMessage::MsgId::TetraMessage:
return new SfmMsgTetra_rx;
case SfmMessage::MsgId::Acknowledge:
return new Acknowledge_rx;
case SfmMessage::MsgId::RequestGpsControl:
return new SfmMsgRequestGpsControl_rx;
default:
break;
}
return nullptr;
}
QByteArray generateTxMessage(const SfmMessage_tx &message)
{
// Converting to LtsUtils::SfmMessage
LtsUtils::SfmMessage msg;
msg.setId(static_cast<int>(message.getId()) & 0x7FFF);
msg.setRtr(static_cast<int>(message.getId()) & 0x8000);
msg.setPayload(message.getPayload());
return LtsUtils::byteStreamFromSfmMessage(msg).toHex();
}
QSharedPointer<SfmMessage_rx> generateRxMessage(const QByteArray &data)
{
LtsUtils::SfmMessage message;
SfmMessage_rx *msg = nullptr;
try
{
message = LtsUtils::byteStreamToSfmMessage(QByteArray::fromHex(data));
}
catch (const LtsUtils::ConversionError &ex)
{
ERROR_LOG(getLogger("SfmMessageConverter")) << "Error parsing bytestream: " << data << " Exception: " << ex.what();
return QSharedPointer<SfmMessage_rx>(msg);
}
/// Erzeugen der entsprechenden Kind-Klasse from LtsUtils::SfmMessage
SfmMessage::MsgId msgId = static_cast<SfmMessage::MsgId>(message.id() | (message.rtr() << 15));
msg = getSpecificSfmMessage(msgId);
if (!msg)
{
ERROR_LOG(getLogger("SfmMessageConverter")) << "Error creating SfmMessage for message with id: " << message.id()
<< ", rtr: " << message.rtr()
<< ", combined: 0x" << QString::number(int(msgId));
}
else if (!msg->setPayload(message.payload()))
{
delete msg;
msg = nullptr;
}
return QSharedPointer<SfmMessage_rx>(msg);
}
} // namespace SfmMessageConverter
} // namespace WirelessLocationSystem