#pragma once namespace Incart::Usb { #include "libusb-1.0/no_warnings_libusb.h" #include "UsbEndPoint.h" template class UsbWriteTransfer { static_assert(std::is_base_of::value, "TSender must derive from UsbEndPoint"); public: static void callback(libusb_transfer* transfer) { int result = transfer->status; TSender* obj = static_cast(transfer->user_data); if (result == LIBUSB_TRANSFER_COMPLETED) { // obj->getUsb()->logInfo(std::string("FinishCmdOut ok :") +std::to_string(result) + " " + libusb_strerror(result) + " " + transfer->actual_length); } else { std::string errorText = obj->getName().toStdString() + " callback error : " + std::to_string(result) + " " + libusb_strerror(result); obj->getUsb()->logError(errorText); if (result == LIBUSB_TRANSFER_STALL) { obj->getUsb()->logInfo(std::string("clear halt ") + obj->getName().toStdString()); result = libusb_clear_halt(transfer->dev_handle, transfer->endpoint); if (result != LIBUSB_SUCCESS) { errorText = obj->getName().toStdString() + " libusb_clear_halt error : " + std::to_string(result) + " " + libusb_strerror(result); obj->getUsb()->logError(errorText); } else { // Пытаемся переотправить transfer result = libusb_submit_transfer(transfer); if (result != LIBUSB_SUCCESS) { errorText = obj->getName().toStdString() + " re-submitting transfer error : " + std::to_string(result) + " " + libusb_strerror(result); obj->getUsb()->logError(errorText); } } } if (result != LIBUSB_TRANSFER_CANCELLED) { obj->getUsb()->setLastTransferStatus(result); } } obj->setIsTransferred(false); // флаг завершения транзакции } }; } // namespace Incart::Usb