From 76eca2aebfcc9c0bd6552d1133334c5046497cd0 Mon Sep 17 00:00:00 2001 From: Kevin Matz Date: Fri, 28 May 2021 14:04:55 -0400 Subject: [PATCH] return Arduino platform ESP arch support to tree --- platform/arduino/esp/sacn-receiver.cpp | 70 ++++++++++++++++++++++++++ platform/arduino/esp/sacn-receiver.h | 66 ++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 platform/arduino/esp/sacn-receiver.cpp create mode 100644 platform/arduino/esp/sacn-receiver.h diff --git a/platform/arduino/esp/sacn-receiver.cpp b/platform/arduino/esp/sacn-receiver.cpp new file mode 100644 index 0000000..9896c24 --- /dev/null +++ b/platform/arduino/esp/sacn-receiver.cpp @@ -0,0 +1,70 @@ +/* + receiver-esp.cpp + + 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. +*/ + +#include "sacn-receiver.h" + +// ESP logging module +#include +#include +static const char* TAG = "EspReceiver"; + +namespace SACN { + +EspReceiver::EspReceiver(UUID::uuid cid) + : Receiver(cid) +{ + udp.onPacket(std::bind(&EspReceiver::UdpStreamHandler, this, + std::placeholders::_1)); +} + +void EspReceiver::subscribe(const uint16_t num) { + if (universe(num)) // already subscribed + return; + ESP_LOGI(TAG, "Subscribing to universe # %d", num); + Receiver::subscribe(num); + // listen multicast; works for unicast too + udp.listenMulticast(IPv4MulticastAddress(num), + ACN_SDT_MULTICAST_PORT); +} + +void EspReceiver::unsubscribe(const uint16_t num) { + if (!universe(num)) // not subscribed + return; + ESP_LOGI(TAG, "Unubscribing from universe # %d", num); + Receiver::unsubscribe(num); + // AsyncUDP has no way to unsubscribe IGMP? +} + +void EspReceiver::UdpStreamHandler(AsyncUDPPacket udp_packet) { + // Expecting IANA registered Session Data Transport traffic + if (!udp_packet.localPort() == ACN_SDT_MULTICAST_PORT) + return; + + // wrap a PDU io stream around the AsyncUDPPacket data buffer + PDU::Stream stream(new PDU::pdu_stream(udp_packet.data(), + udp_packet.available())); + Appliance::UdpStreamHandler(stream); +} + +} // SACN diff --git a/platform/arduino/esp/sacn-receiver.h b/platform/arduino/esp/sacn-receiver.h new file mode 100644 index 0000000..065d0ea --- /dev/null +++ b/platform/arduino/esp/sacn-receiver.h @@ -0,0 +1,66 @@ +/* + receiver-esp.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 +#include +#include +#include +#include "../../../sacn/receiver.h" +#include "../../../dmx/universe.h" + + +/* + Arduino specification additions to the sACN library +*/ +namespace SACN { + // 9.3.1 Allocation of IPv4 Multicast Addresses + // Multicast addresses are from the IPv4 Local Scope. + inline IPAddress IPv4MulticastAddress(uint16_t universe) { + return IPAddress(239, 255, (universe >> 8), (universe & 0xff)); + }; + + // 9.3.2 Allocation of IPv6 Multicast Addresses + inline IPv6Address IPv6MulticastAddress(uint16_t universe) { + IPv6Address address; + address.fromString("ff18::83:00:" + + String(universe >> 8, HEX) + ":" + + String(universe & 0xff, HEX)); + return address; + }; + +class EspReceiver + : public SACN::Receiver +{ + public: + EspReceiver(UUID::uuid = UUID::uuid()); + virtual void subscribe(const uint16_t universe = 1); + virtual void unsubscribe(const uint16_t); + + private: + AsyncUDP udp; // AsyncUDP + void UdpStreamHandler(AsyncUDPPacket); // UDP packet parser callback +}; + +} // SACN