#include "qsacnnode.h" #include #include namespace SACN { QSacnNode::QSacnNode(QObject *parent, QUuid cid) : Appliance(UUID::uuid(cid.toString().toStdString())) , QUdpSocket(parent) , multiverse_(new MultiverseModel(this)) { fctn_ = "libESTA QSacnNode"; bind(QHostAddress::AnyIPv4, ACN_SDT_MULTICAST_PORT); connect(this, &QUdpSocket::readyRead, this, &QSacnNode::UdpPayloadReceiver); onDiscovered(std::bind(&QSacnNode::emitFound, this, std::placeholders::_1)); } void QSacnNode::subscribe(const uint16_t num) { if (Receiver::universe(num)) // already subscribed return; if (num != SACN::E131_DISCOVERY_UNIVERSE) { qDebug() << "Subscribing to universe" << QString::number(num); Receiver::subscribe(num); universes_.insert(num, new QSacnUniverse(this, Receiver::universe(num))); } joinMulticastGroup(IPv4MulticastAddress(num)); } void QSacnNode::unsubscribe(const uint16_t num) { leaveMulticastGroup(IPv4MulticastAddress(num)); if (Receiver::universe(num)) { qDebug() << "Unsubscribing from universe " << QString::number(num); delete universes_.take(num); Receiver::unsubscribe(num); } } void QSacnNode::UdpPayloadReceiver() { while (hasPendingDatagrams()) { QNetworkDatagram datagram = receiveDatagram(); // Expecting IANA registered Session Data Transport traffic if (datagram.destinationPort() != ACN_SDT_MULTICAST_PORT) return; // wrap a PDU io stream around the QNetworkDatagram data buffer PDU::Stream stream(new PDU::pdu_stream( (uint8_t*)datagram.data().constData(), datagram.data().length())); Receiver::UdpPayloadReceiver(stream); } } // wrap callback to Qt signal void QSacnNode::emitFound( std::shared_ptr univ) { qDebug() << "found universe " << QString::number(univ->universe()); emit foundUniverse(univ); } } // SACN