68 lines
1.8 KiB
C++
68 lines
1.8 KiB
C++
|
#include "qsacnnode.h"
|
||
|
|
||
|
#include <QDebug>
|
||
|
#include <QNetworkDatagram>
|
||
|
|
||
|
namespace SACN {
|
||
|
|
||
|
QSacnNode::QSacnNode(UUID::uuid cid)
|
||
|
: Node(cid)
|
||
|
{
|
||
|
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
|