From 7495897b4a8b3ee1c643d0d45c6582a0c11660e6 Mon Sep 17 00:00:00 2001 From: Kevin Matz Date: Mon, 30 Aug 2021 10:15:39 -0400 Subject: [PATCH] rlp writing --- protocols/rlp/component.cpp | 85 +++++++++++++++++++++++++++++++++++++ protocols/rlp/component.h | 11 +++++ 2 files changed, 96 insertions(+) diff --git a/protocols/rlp/component.cpp b/protocols/rlp/component.cpp index e1eb496..6352f73 100644 --- a/protocols/rlp/component.cpp +++ b/protocols/rlp/component.cpp @@ -56,6 +56,21 @@ void Component::UdpPayloadReceiver(PDU::Stream stream) } +/** + * @brief Component::rlpSendUdp + * @param vector + * @param data + * @param ip + */ +void Component::rlpSendUdp (const uint32_t vector, + const PDU::Message< PDU::pdu_data > data, + const SDT::UDP::ipAddress& ip) const +{ + RLP::UDP::transport transport(true); + rlpSend(transport, vector, data, ip); +} + + /** * @brief Component::TcpPacketReceiver * @param stream @@ -73,6 +88,21 @@ void Component::TcpPacketReceiver(PDU::Stream stream) } +/** + * @brief Component::rlpSendTcp + * @param vector + * @param data + * @param ip + */ +void Component::rlpSendTcp (const uint32_t vector, + const PDU::Message data, + const SDT::UDP::ipAddress& ip) const +{ + RLP::TCP::transport transport(true); + rlpSend(transport, vector, data, ip); +} + + /** * @brief Component::RlpReceiver * @param root @@ -104,4 +134,59 @@ void Component::RlpRegisterVector(uint32_t vect, PDU::Handler handle) rlp_vectors_[vect].push_back(handle); } + +/** + * @brief Component::rlpSend + * @param transport + * @param vector + * @param data + * @param ip + */ +void Component::rlpSend(ACN::RLP::message_transport& transport, + const uint32_t vector, + const PDU::Message data, + const SDT::UDP::ipAddress& ip) const +{ + // rlp header + RLP::rlp_header header; + header.cid = cid(); + + // rlp pdu + auto rlp = std::shared_ptr(new RLP::Pdu()); + rlp->setVector(vector); + rlp->setHeader(&header); + rlp->setData(data.get()); + + // root block + PDU::Block block; + block.pdu->push_back(rlp); + transport.root = block; + + // create an output stream + size_t length = transport.streamSize(); + uint8_t buffer[length]; + ACN::PDU::Stream stream(new ACN::PDU::pdu_stream(buffer, length)); + + // write message + *stream << transport; + rlpSend(stream, ip); +} + + +/** + * @brief Component::rlpSend + * @param stream + * @param ip + * + * \attention Override this method in your derived class that can write + * to the network. + */ +void Component::rlpSend(const PDU::Stream stream, + const SDT::UDP::ipAddress& ip) const +{ + (void)stream; + (void)ip; +} + + }; // ACN::RLP diff --git a/protocols/rlp/component.h b/protocols/rlp/component.h index e127151..4fa8eea 100644 --- a/protocols/rlp/component.h +++ b/protocols/rlp/component.h @@ -26,6 +26,7 @@ #include "acn/component.h" #include "acn/pdu.h" #include "rlp.h" +#include "sdt/udp.h" #include #include @@ -49,14 +50,24 @@ public: // EPI 17 - ACN RLP on UDP virtual void UdpPayloadReceiver(PDU::Stream); + void rlpSendUdp(const uint32_t vector, const PDU::Message data, + const SDT::UDP::ipAddress&) const; // EPI 33 - ACN RLP Operation on TCP virtual void TcpPacketReceiver(PDU::Stream); + void rlpSendTcp(const uint32_t vector, const PDU::Message data, + const SDT::UDP::ipAddress&) const; protected: void RlpReceiver(PDU::Message); void RlpRegisterVector(uint32_t, PDU::Handler); + void rlpSend(ACN::RLP::message_transport&, const uint32_t vector, + const PDU::Message data, + const SDT::UDP::ipAddress&) const; + + virtual void rlpSend(const PDU::Stream, const SDT::UDP::ipAddress&) const; + private: std::map>> rlp_vectors_; };