107 lines
2.8 KiB
C++
Executable File
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
|
|
|