2021-06-02 09:32:04 -04:00
|
|
|
#include "qsacnnode.h"
|
|
|
|
|
|
|
|
#include <QDebug>
|
|
|
|
#include <QNetworkDatagram>
|
2021-07-30 14:40:03 -04:00
|
|
|
#include <QNetworkInterface>
|
2021-06-02 09:32:04 -04:00
|
|
|
|
|
|
|
|
2021-07-30 14:40:03 -04:00
|
|
|
/**
|
|
|
|
* @brief QSacnNode::QSacnNode
|
|
|
|
* @param parent
|
|
|
|
* @param cid
|
|
|
|
*/
|
2021-06-21 10:18:36 -04:00
|
|
|
QSacnNode::QSacnNode(QObject *parent, QUuid cid)
|
2021-08-25 10:57:31 -04:00
|
|
|
: Component(UUID::uuid(cid.toString().toStdString()))
|
2021-06-21 10:18:36 -04:00
|
|
|
, QUdpSocket(parent)
|
2021-06-02 09:32:04 -04:00
|
|
|
{
|
2021-08-24 18:10:20 -04:00
|
|
|
fctn_ = "OpenLCP QSacnNode";
|
2021-07-30 13:57:27 -04:00
|
|
|
|
2021-08-28 09:01:33 -04:00
|
|
|
bind(QHostAddress::AnyIPv4, sACN::ACN_SDT_MULTICAST_PORT);
|
2021-06-02 09:32:04 -04:00
|
|
|
|
|
|
|
connect(this, &QUdpSocket::readyRead,
|
2021-08-06 12:14:29 -04:00
|
|
|
this, &QSacnNode::udpReceive);
|
2021-06-02 09:32:04 -04:00
|
|
|
|
|
|
|
onDiscovered(std::bind(&QSacnNode::emitFound, this,
|
|
|
|
std::placeholders::_1));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-07-30 14:40:03 -04:00
|
|
|
/**
|
|
|
|
* @brief QSacnNode::subscribe
|
|
|
|
* @param num
|
|
|
|
*/
|
2021-06-02 09:32:04 -04:00
|
|
|
void QSacnNode::subscribe(const uint16_t num)
|
|
|
|
{
|
2021-06-20 09:12:14 -04:00
|
|
|
if (Receiver::universe(num)) // already subscribed
|
2021-06-02 09:32:04 -04:00
|
|
|
return;
|
2021-08-28 09:01:33 -04:00
|
|
|
if (num != sACN::E131_DISCOVERY_UNIVERSE) {
|
2021-06-30 13:04:17 -04:00
|
|
|
qDebug() << "Subscribing to universe" << QString::number(num);
|
|
|
|
Receiver::subscribe(num);
|
2021-07-30 13:57:27 -04:00
|
|
|
universes_.insert(num, new QSacnUniverse(this, Receiver::universe(num)));
|
2021-06-30 13:04:17 -04:00
|
|
|
}
|
2021-07-30 14:40:03 -04:00
|
|
|
for (QNetworkInterface &iface : QNetworkInterface::allInterfaces())
|
|
|
|
joinMulticastGroup(IPv4MulticastAddress(num), iface);
|
2021-06-02 09:32:04 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-07-30 14:40:03 -04:00
|
|
|
/**
|
|
|
|
* @brief QSacnNode::unsubscribe
|
|
|
|
* @param num
|
|
|
|
*/
|
2021-06-02 09:32:04 -04:00
|
|
|
void QSacnNode::unsubscribe(const uint16_t num)
|
|
|
|
{
|
2021-07-30 14:40:03 -04:00
|
|
|
for (QNetworkInterface &iface : QNetworkInterface::allInterfaces())
|
|
|
|
leaveMulticastGroup(IPv4MulticastAddress(num), iface);
|
|
|
|
|
2021-06-30 13:04:17 -04:00
|
|
|
if (Receiver::universe(num)) {
|
|
|
|
qDebug() << "Unsubscribing from universe " << QString::number(num);
|
2021-07-30 13:57:27 -04:00
|
|
|
delete universes_.take(num);
|
2021-06-30 13:04:17 -04:00
|
|
|
Receiver::unsubscribe(num);
|
|
|
|
}
|
2021-06-02 09:32:04 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-07-30 14:40:03 -04:00
|
|
|
/**
|
|
|
|
* @brief QSacnNode::UdpPayloadReceiver
|
|
|
|
*/
|
2021-08-06 12:14:29 -04:00
|
|
|
void QSacnNode::udpReceive()
|
2021-06-02 09:32:04 -04:00
|
|
|
{
|
|
|
|
while (hasPendingDatagrams()) {
|
|
|
|
QNetworkDatagram datagram = receiveDatagram();
|
|
|
|
// Expecting IANA registered Session Data Transport traffic
|
2021-08-28 09:01:33 -04:00
|
|
|
if (datagram.destinationPort() != sACN::ACN_SDT_MULTICAST_PORT)
|
2021-06-02 09:32:04 -04:00
|
|
|
return;
|
|
|
|
|
|
|
|
// wrap a PDU io stream around the QNetworkDatagram data buffer
|
2021-08-17 16:20:32 -04:00
|
|
|
ACN::PDU::Stream stream(new ACN::PDU::pdu_stream(
|
2021-08-06 12:11:44 -04:00
|
|
|
(uint8_t*)datagram.data().constData(),
|
|
|
|
datagram.data().length()));
|
2021-08-06 12:14:29 -04:00
|
|
|
UdpPayloadReceiver(stream);
|
2021-06-02 09:32:04 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-07-30 14:40:03 -04:00
|
|
|
/**
|
|
|
|
* @brief QSacnNode::emitFound
|
|
|
|
* @param univ
|
|
|
|
*
|
|
|
|
* wrap data change callback to a Qt signal
|
|
|
|
*/
|
2021-06-02 09:32:04 -04:00
|
|
|
void QSacnNode::emitFound(
|
2021-08-28 09:01:33 -04:00
|
|
|
std::shared_ptr<sACN::EXTENDED::DISCOVERY::discoveredUniverse> univ)
|
2021-06-02 09:32:04 -04:00
|
|
|
{
|
2021-08-17 16:20:32 -04:00
|
|
|
qDebug() << "found universe " << QString::number(univ->universe);
|
2021-06-02 09:32:04 -04:00
|
|
|
emit foundUniverse(univ);
|
|
|
|
}
|
|
|
|
|