#include "wls_sfm_message_converter.h" #include #include #include #include "logger.h" namespace WirelessLocationSystem { namespace SfmMessageConverter { 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) { LtsUtils::SfmMessage msg; msg.setId(static_cast(message.getId()) & 0x7FFF); msg.setRtr(static_cast(message.getId()) & 0x8000); msg.setPayload(message.getPayload()); return LtsUtils::byteStreamFromSfmMessage(msg).toHex(); } QSharedPointer 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(msg); } SfmMessage::MsgId msgId = static_cast(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(msg); } } }