/** * 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 #include #include #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(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); } /// Erzeugen der entsprechenden Kind-Klasse from LtsUtils::SfmMessage 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); } } // namespace SfmMessageConverter } // namespace WirelessLocationSystem