etm-powersync-plugins/sma/speedwirediscovery.h
2021-12-18 09:19:25 +01:00

76 lines
2.4 KiB
C++

#ifndef SPEEDWIREDISCOVERY_H
#define SPEEDWIREDISCOVERY_H
#include <QTimer>
#include <QObject>
#include <QUdpSocket>
#include <network/networkdevicediscovery.h>
#include "speedwireinterface.h"
class SpeedwireDiscovery : public QObject
{
Q_OBJECT
public:
typedef struct SpeedwireDiscoveryResult {
QHostAddress address;
NetworkDeviceInfo networkDeviceInfo;
SpeedwireInterface::DeviceType deviceType = SpeedwireInterface::DeviceTypeUnknown;
quint16 modelId = 0;
quint32 serialNumber = 0;
} SpeedwireDiscoveryResult;
explicit SpeedwireDiscovery(NetworkDeviceDiscovery *networkDeviceDiscovery, QObject *parent = nullptr);
~SpeedwireDiscovery();
bool initialize();
bool initialized() const;
bool startDiscovery();
bool discoveryRunning() const;
QList<SpeedwireDiscoveryResult> discoveryResult() const;
signals:
void discoveryFinished();
private:
NetworkDeviceDiscovery *m_networkDeviceDiscovery = nullptr;
QUdpSocket *m_multicastSocket = nullptr;
QUdpSocket *m_unicastSocket = nullptr;
QHostAddress m_multicastAddress = QHostAddress("239.12.255.254");
quint16 m_port = 9522;
bool m_initialized = false;
// Discovery
QTimer m_discoveryTimer;
bool m_discoveryRunning = false;
NetworkDeviceInfos m_networkDeviceInfos;
QHash<QHostAddress, SpeedwireDiscoveryResult> m_results;
// Static discovery datagrams for speedwire
QByteArray m_discoveryDatagramMulticast = QByteArray::fromHex("534d4100000402a0ffffffff0000002000000000");
QByteArray m_discoveryResponseDatagram = QByteArray::fromHex("534d4100000402A000000001000200000001");
QByteArray m_discoveryDatagramUnicast = QByteArray::fromHex("534d4100000402a00000000100260010606509a0ffffffffffff00007d0052be283a000000000000018000020000000000000000000000000000");
void startMulticastDiscovery();
void sendUnicastDiscoveryRequest(const QHostAddress &targetHostAddress);
private slots:
void readPendingDatagramsMulticast();
void readPendingDatagramsUnicast();
void onSocketError(QAbstractSocket::SocketError error);
void onSocketStateChanged(QAbstractSocket::SocketState socketState);
void processDatagram(const QHostAddress &senderAddress, quint16 senderPort, const QByteArray &datagram);
void sendDiscoveryRequest();
void onDiscoveryProcessFinished();
};
#endif // SPEEDWIREDISCOVERY_H