/* extended.h Copyright (c) 2020 Kevin Matz (kevin.matz@gmail.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "acn/pdu.h" #include "sacn.h" #include "uuid/uuid.h" #include /** * @brief both Discovery and Syncronization */ namespace sACN::EXTENDED { /** * @brief \cite sACN 6.3 E1.31 Synchronization Packet Framing Layer */ struct sync_header : ACN::PDU::pdu_header { uint8_t sequence_number; //!< sequence uint16_t sync_address; //!< synchronization address uint16_t reserved; //!< reserved size_t streamSize() const override { return 5; } void iStream(ACN::PDU::Stream) override; void oStream(ACN::PDU::Stream) const override; }; /** * @brief \cite sACN 6.4 E1.31 Universe Discovery Packet Framing Layer */ struct discovery_header : ACN::PDU::pdu_header { std::string source_name; //!< source descripton uint32_t reserved; //!< reserved size_t streamSize() const override { return 68; } void iStream(ACN::PDU::Stream) override; void oStream(ACN::PDU::Stream) const override; }; /** * @brief The EXTENDED::Pdu class */ class Pdu : public ACN::PDU::Pdu { public: Pdu(); void iStream(ACN::PDU::Stream) override; }; /** * \cite sACN 1.6 Universe Discovery * * This standard includes a Universe Discovery packet that sources must provide * in order to enumerate the universes upon which they are transmitting. This * allows other devices interested in network traffic to monitor which universes * are currently active, without the need to join every multicast group to * examine their individual transmissions. */ namespace DISCOVERY { /** * @brief Table 8-9: E1.31 Universe Discovery Packet Universe Discovery Layer */ struct discovery_list_header : ACN::PDU::pdu_header { uint8_t page; //!< number of the current page uint8_t last_page; //!< total pages size_t streamSize() const override { return 2; } void iStream(ACN::PDU::Stream) override; void oStream(ACN::PDU::Stream) const override; }; /** * @brief The discoveredUniverse struct */ struct discoveredUniverse { UUID::uuid source; //!< CID of source std::string description; //!< universe description uint16_t universe; //!< universe number }; /** * @brief a callback function interested in discovered universes */ using Watcher = std::function)>; /** * @brief The discovery_list_data struct */ struct discovery_list_data : ACN::PDU::pdu_data { std::vector found; //!< discovered universes size_t streamSize() const override { return 2 * found.size(); } void iStream(ACN::PDU::Stream) override; void oStream(ACN::PDU::Stream) const override; }; /** * @brief \cite sACN 3.10 E1.31 Universe Discovery Packet * * An E1.31 Universe Discovery Packet is a packet which contains a packed list * of the universes upon which a source is actively operating. It is transmitted * with the VECTOR_E131_EXTENDED_DISCOVERY vector. */ class Pdu : public ACN::PDU::Pdu { public: Pdu(); void iStream(ACN::PDU::Stream) override; }; } // DISCOVERY } // SACN::EXTENDED