OpenLCP/platform/qt/qsacnnode.cpp

69 lines
1.8 KiB
C++

#include "qsacnnode.h"
#include <QDebug>
#include <QNetworkDatagram>
namespace SACN {
QSacnNode::QSacnNode(QUuid cid)
: Appliance(UUID::uuid(cid.toString().toStdString()))
, Node()
{
bind(QHostAddress::AnyIPv4, ACN_SDT_MULTICAST_PORT);
connect(this, &QUdpSocket::readyRead,
this, &QSacnNode::UdpStreamHandler);
onDiscovered(std::bind(&QSacnNode::emitFound, this,
std::placeholders::_1));
}
void QSacnNode::subscribe(const uint16_t num)
{
if (universe(num)) // already subscribed
return;
qDebug() << "Subscribing to universe" << QString::number(num);
Receiver::subscribe(num);
joinMulticastGroup(IPv4MulticastAddress(num));
}
void QSacnNode::unsubscribe(const uint16_t num)
{
if (!universe(num)) // not subscribed
return;
qDebug() << "Unsubscribing from universe " << QString::number(num);
leaveMulticastGroup(IPv4MulticastAddress(num));
Receiver::unsubscribe(num);
}
void QSacnNode::UdpStreamHandler()
{
while (hasPendingDatagrams()) {
qDebug() << "processing UDP datagram...";
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()));
Appliance::UdpStreamHandler(stream);
}
}
// wrap callback to Qt signal
void QSacnNode::emitFound(
std::shared_ptr<EXTENDED::DISCOVERY::DiscoveredUniverse> univ)
{
qDebug() << "found universe " << QString::number(univ->universe());
emit foundUniverse(univ);
}
} // SACN