#pragma once #include #include "ThreadLogging.h" #include "UsbContext.h" #include "EDeviceCommandStatus.h" #include "PrettyFunctionDefines.h" namespace Incart::Usb { class UsbEndPoint : public QObject { Q_OBJECT protected: const uint32_t m_endpoint; QString m_name; UsbContext* m_usbContext; libusb_transfer* m_transfer = nullptr; std::atomic m_isTransferred; // флаг: выполняется ли какой-либо transfer в данный момент public: UsbEndPoint(const QString& name, UsbContext* usbContext, uint32_t endpoint) : //QObject(nullptr) m_endpoint(endpoint) , m_name(name) , m_usbContext(usbContext) { m_isTransferred.store(false); } virtual ~UsbEndPoint() { } // [Thread: libusb] bool allocTransfer() { // выделяем 1 раз - иначе не работает m_transfer = libusb_alloc_transfer(0); if (m_transfer == nullptr) { m_usbContext->logError(std::string(__PRETTY_FUNCTION__) + " m_transfer == nullptr"); return false; } return true; } // [Thread: libusb] int cancelTransfer() { int result = libusb_cancel_transfer(m_transfer); if ((result != LIBUSB_SUCCESS) && (result != LIBUSB_ERROR_NOT_FOUND)) { m_usbContext->logError(std::string(__PRETTY_FUNCTION__) + " libusb_cancel_transfer error: " + std::to_string(result)); } return result; } // [Thread: libusb] void deleteTransfer() { // и удаляем 1 раз libusb_free_transfer(m_transfer); m_transfer = nullptr; } // [Thread: libusb] void setIsTransferred(bool v) { m_isTransferred.store(v); } // [Thread: not only libusb] bool getIsTransferred() { return m_isTransferred.load(); } QString getName() { return m_name; } UsbContext* getUsb() { return m_usbContext; } signals: void signalAnswer(std::vector, int32_t); //void signalAnswer(QVector); }; } // namespace Incart::Usb