#pragma once #include #include "UsbContext.h" #include "UsbEndPoint.h" #include namespace Incart::Usb { class UsbEndPointReader : public UsbEndPoint { protected: std::vector m_buffer; int32_t m_receivedBytesCount; protected: UsbEndPointReader(const QString& name, UsbContext* usbContext, uint32_t endpoint, uint32_t bufferSize) : UsbEndPoint(name, usbContext, endpoint) , m_buffer(bufferSize) { } public: bool readyData() { return (m_receivedBytesCount > 0); } void setReceivedBytesCount(int32_t count) { m_receivedBytesCount = count; } std::vector getData() { return std::vector(m_buffer.begin(), m_buffer.begin() + m_receivedBytesCount); } protected: // [Thread: libusb] void transfer(libusb_transfer_cb_fn transferCallback) { m_receivedBytesCount = 0; int32_t lastTransferStatus = m_usbContext->getLastTransferStatus(); if (lastTransferStatus != LIBUSB_TRANSFER_COMPLETED) { m_usbContext->logError(std::string(__PRETTY_FUNCTION__) + " " + m_name.toStdString() + " has error " + std::to_string(lastTransferStatus)); return; } if (getIsTransferred()) { m_usbContext->logError(std::string(__PRETTY_FUNCTION__) + " " + m_name.toStdString() + " is transfered"); m_usbContext->setLastTransferStatus(LIBUSB_ERROR_BUSY); return; } allocTransfer(); libusb_fill_bulk_transfer(m_transfer, m_usbContext->getDeviceHandle(), m_endpoint, &m_buffer[0], static_cast(m_buffer.size()), transferCallback, this, 250); int result = libusb_submit_transfer(m_transfer); if (result != LIBUSB_SUCCESS) { deleteTransfer(); m_usbContext->logError(std::string(__PRETTY_FUNCTION__) + " " + m_name.toStdString() + " transfer error: " + std::to_string(result) + " " + libusb_strerror(result)); setIsTransferred(false); m_usbContext->setLastTransferStatus(result); } else { setIsTransferred(true); } } }; } // namespace Incart::Usb