LibreVNA/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/librevnatcpdriver.h
2023-01-29 18:02:32 +01:00

108 lines
3.0 KiB
C++

#ifndef LIBREVNATCPDRIVER_H
#define LIBREVNATCPDRIVER_H
#include "librevnadriver.h"
#include <condition_variable>
#include <thread>
#include <deque>
#include <QQueue>
#include <QTimer>
#include <QUdpSocket>
#include <QTcpSocket>
#include <QDateTime>
class LibreVNATCPDriver : public LibreVNADriver
{
Q_OBJECT
public:
LibreVNATCPDriver();
/**
* @brief Returns the driver name. It must be unique across all implemented drivers and is used to identify the driver
* @return driver name
*/
virtual QString getDriverName() override;
/**
* @brief Lists all available devices by their serial numbers
* @return Serial numbers of detected devices
*/
virtual std::set<QString> GetAvailableDevices() override;
/**
* @brief Connects to a device, given by its serial number
* @param serial Serial number of device that should be connected to
* @return true if connection successful, otherwise false
*/
virtual bool connectTo(QString serial) override;
/**
* @brief Disconnects from device. Has no effect if no device was connected
*/
virtual void disconnect() override;
/**
* @brief Registers metatypes within the Qt Framework.
*
* If the device driver uses a queued signal/slot connection with custom data types, these types must be registered before emitting the signal.
* Register them within this function with qRegisterMetaType<Type>("Name");
*/
virtual void registerTypes();
private slots:
void SSDPreceived(QUdpSocket *sock);
void ReceivedData();
void ReceivedLog();
void transmissionTimeout() {
transmissionFinished(TransmissionResult::Timeout);
}
void transmissionFinished(TransmissionResult result);
private:
static constexpr int EP_Data_Out_Addr = 0x01;
static constexpr int EP_Data_In_Addr = 0x81;
static constexpr int EP_Log_In_Addr = 0x82;
virtual bool SendPacket(const Protocol::PacketInfo& packet, std::function<void(TransmissionResult)> cb = nullptr, unsigned int timeout = 500) override;
// Sockets for SSDP protocol
std::vector<QUdpSocket*> ssdpSockets;
class DetectedDevice {
public:
QString serial;
QHostAddress address;
QDateTime responseTime;
int maxAgeSeconds;
};
void addDetectedDevice(const DetectedDevice &d);
// removes entries that are too old
void pruneDetectedDevices();
std::vector<DetectedDevice> detectedDevices;
// Connection sockets
QTcpSocket dataSocket;
QTcpSocket logSocket;
QByteArray dataBuffer;
QByteArray logBuffer;
class Transmission {
public:
Protocol::PacketInfo packet;
unsigned int timeout;
std::function<void(TransmissionResult)> callback;
};
std::mutex transmissionMutex;
QQueue<Transmission> transmissionQueue;
bool startNextTransmission();
QTimer transmissionTimer;
bool transmissionActive;
std::thread *m_receiveThread;
std::mutex accessMutex;
};
#endif // LibreVNATCPDriver_H