diff options
Diffstat (limited to 'src/components/transport_manager/src/usb/libusb/usb_connection.cc')
-rw-r--r-- | src/components/transport_manager/src/usb/libusb/usb_connection.cc | 168 |
1 files changed, 98 insertions, 70 deletions
diff --git a/src/components/transport_manager/src/usb/libusb/usb_connection.cc b/src/components/transport_manager/src/usb/libusb/usb_connection.cc index b8096514bc..409209b2b2 100644 --- a/src/components/transport_manager/src/usb/libusb/usb_connection.cc +++ b/src/components/transport_manager/src/usb/libusb/usb_connection.cc @@ -48,32 +48,30 @@ namespace transport_adapter { CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") - UsbConnection::UsbConnection(const DeviceUID& device_uid, const ApplicationHandle& app_handle, TransportAdapterController* controller, const UsbHandlerSptr usb_handler, PlatformUsbDevice* device) - : device_uid_(device_uid), - app_handle_(app_handle), - controller_(controller), - usb_handler_(usb_handler), - libusb_device_(device->GetLibusbDevice()), - device_handle_(device->GetLibusbHandle()), - in_endpoint_(0), - in_endpoint_max_packet_size_(0), - out_endpoint_(0), - out_endpoint_max_packet_size_(0), - in_buffer_(NULL), - in_transfer_(NULL), - out_transfer_(0), - out_messages_(), - current_out_message_(), - bytes_sent_(0), - disconnecting_(false), - waiting_in_transfer_cancel_(false), - waiting_out_transfer_cancel_(false) { -} + : device_uid_(device_uid) + , app_handle_(app_handle) + , controller_(controller) + , usb_handler_(usb_handler) + , libusb_device_(device->GetLibusbDevice()) + , device_handle_(device->GetLibusbHandle()) + , in_endpoint_(0) + , in_endpoint_max_packet_size_(0) + , out_endpoint_(0) + , out_endpoint_max_packet_size_(0) + , in_buffer_(NULL) + , in_transfer_(NULL) + , out_transfer_(0) + , out_messages_() + , current_out_message_() + , bytes_sent_(0) + , disconnecting_(false) + , waiting_in_transfer_cancel_(false) + , waiting_out_transfer_cancel_(false) {} UsbConnection::~UsbConnection() { LOG4CXX_TRACE(logger_, "enter with this" << this); @@ -94,22 +92,30 @@ void OutTransferCallback(libusb_transfer* transfer) { bool UsbConnection::PostInTransfer() { LOG4CXX_TRACE(logger_, "enter"); - libusb_fill_bulk_transfer(in_transfer_, device_handle_, in_endpoint_, - in_buffer_, in_endpoint_max_packet_size_, - InTransferCallback, this, 0); + libusb_fill_bulk_transfer(in_transfer_, + device_handle_, + in_endpoint_, + in_buffer_, + in_endpoint_max_packet_size_, + InTransferCallback, + this, + 0); const int libusb_ret = libusb_submit_transfer(in_transfer_); if (LIBUSB_SUCCESS != libusb_ret) { - LOG4CXX_ERROR(logger_, "libusb_submit_transfer failed: " - << libusb_error_name(libusb_ret)); - LOG4CXX_TRACE(logger_, - "exit with FALSE. Condition: LIBUSB_SUCCESS != libusb_submit_transfer"); + LOG4CXX_ERROR( + logger_, + "libusb_submit_transfer failed: " << libusb_error_name(libusb_ret)); + LOG4CXX_TRACE( + logger_, + "exit with FALSE. Condition: LIBUSB_SUCCESS != libusb_submit_transfer"); return false; } LOG4CXX_TRACE(logger_, "exit with TRUE"); return true; } -std::string hex_data(const unsigned char* const buffer, const int actual_length) { +std::string hex_data(const unsigned char* const buffer, + const int actual_length) { std::ostringstream hexdata; for (int i = 0; i < actual_length; ++i) { hexdata << " " << std::hex << std::setw(2) << std::setfill('0') @@ -122,23 +128,26 @@ void UsbConnection::OnInTransfer(libusb_transfer* transfer) { LOG4CXX_TRACE(logger_, "enter with Libusb_transfer*: " << transfer); if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { LOG4CXX_DEBUG(logger_, - "USB incoming transfer, size:" << transfer->actual_length - << ", data:" << hex_data(transfer->buffer, transfer->actual_length)); + "USB incoming transfer, size:" + << transfer->actual_length << ", data:" + << hex_data(transfer->buffer, transfer->actual_length)); ::protocol_handler::RawMessagePtr data(new protocol_handler::RawMessage( - 0, 0, in_buffer_, transfer->actual_length)); + 0, 0, in_buffer_, transfer->actual_length)); controller_->DataReceiveDone(device_uid_, app_handle_, data); } else { - LOG4CXX_ERROR(logger_, "USB incoming transfer failed: " - << libusb_error_name(transfer->status)); - controller_->DataReceiveFailed(device_uid_, app_handle_, - DataReceiveError()); + LOG4CXX_ERROR(logger_, + "USB incoming transfer failed: " + << libusb_error_name(transfer->status)); + controller_->DataReceiveFailed( + device_uid_, app_handle_, DataReceiveError()); } if (disconnecting_) { waiting_in_transfer_cancel_ = false; } else { if (!PostInTransfer()) { - LOG4CXX_ERROR(logger_, "USB incoming transfer failed with " - << "LIBUSB_TRANSFER_NO_DEVICE. Abort connection."); + LOG4CXX_ERROR(logger_, + "USB incoming transfer failed with " + << "LIBUSB_TRANSFER_NO_DEVICE. Abort connection."); AbortConnection(); } } @@ -166,17 +175,24 @@ bool UsbConnection::PostOutTransfer() { LOG4CXX_TRACE(logger_, "exit with FALSE. Condition: 0 == out_transfer_"); return false; } - libusb_fill_bulk_transfer(out_transfer_, device_handle_, out_endpoint_, + libusb_fill_bulk_transfer(out_transfer_, + device_handle_, + out_endpoint_, current_out_message_->data() + bytes_sent_, current_out_message_->data_size() - bytes_sent_, - OutTransferCallback, this, 0); + OutTransferCallback, + this, + 0); const int libusb_ret = libusb_submit_transfer(out_transfer_); if (LIBUSB_SUCCESS != libusb_ret) { - LOG4CXX_ERROR(logger_, "libusb_submit_transfer failed: " - << libusb_error_name(libusb_ret) << ". Abort connection."); + LOG4CXX_ERROR( + logger_, + "libusb_submit_transfer failed: " << libusb_error_name(libusb_ret) + << ". Abort connection."); AbortConnection(); - LOG4CXX_TRACE(logger_, "exit with FALSE. Condition: " - << "LIBUSB_SUCCESS != libusb_fill_bulk_transfer"); + LOG4CXX_TRACE(logger_, + "exit with FALSE. Condition: " + << "LIBUSB_SUCCESS != libusb_fill_bulk_transfer"); return false; } LOG4CXX_TRACE(logger_, "exit with TRUE"); @@ -189,16 +205,18 @@ void UsbConnection::OnOutTransfer(libusb_transfer* transfer) { if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { bytes_sent_ += transfer->actual_length; if (bytes_sent_ == current_out_message_->data_size()) { - LOG4CXX_DEBUG(logger_, "USB out transfer, data sent: " - << current_out_message_.get()); + LOG4CXX_DEBUG( + logger_, + "USB out transfer, data sent: " << current_out_message_.get()); controller_->DataSendDone(device_uid_, app_handle_, current_out_message_); PopOutMessage(); } } else { - LOG4CXX_ERROR(logger_, "USB out transfer failed: " - << libusb_error_name(transfer->status)); - controller_->DataSendFailed(device_uid_, app_handle_, current_out_message_, - DataSendError()); + LOG4CXX_ERROR( + logger_, + "USB out transfer failed: " << libusb_error_name(transfer->status)); + controller_->DataSendFailed( + device_uid_, app_handle_, current_out_message_, DataSendError()); PopOutMessage(); } if (!current_out_message_.valid()) { @@ -209,11 +227,13 @@ void UsbConnection::OnOutTransfer(libusb_transfer* transfer) { LOG4CXX_TRACE(logger_, "exit"); } -TransportAdapter::Error UsbConnection::SendData(::protocol_handler::RawMessagePtr message) { +TransportAdapter::Error UsbConnection::SendData( + ::protocol_handler::RawMessagePtr message) { LOG4CXX_TRACE(logger_, "enter with RawMessagePtr: " << message.get()); if (disconnecting_) { - LOG4CXX_TRACE(logger_, "exit with TransportAdapter::BAD_STATE. Condition: " - << "disconnecting_"); + LOG4CXX_TRACE(logger_, + "exit with TransportAdapter::BAD_STATE. Condition: " + << "disconnecting_"); return TransportAdapter::BAD_STATE; } sync_primitives::AutoLock locker(out_messages_mutex_); @@ -222,9 +242,11 @@ TransportAdapter::Error UsbConnection::SendData(::protocol_handler::RawMessagePt } else { current_out_message_ = message; if (!PostOutTransfer()) { - controller_->DataSendFailed(device_uid_, app_handle_, message, - DataSendError()); - LOG4CXX_TRACE(logger_, "exit with TransportAdapter::FAIL. Condition: !PostOutTransfer()"); + controller_->DataSendFailed( + device_uid_, app_handle_, message, DataSendError()); + LOG4CXX_TRACE( + logger_, + "exit with TransportAdapter::FAIL. Condition: !PostOutTransfer()"); return TransportAdapter::FAIL; } } @@ -240,19 +262,22 @@ void UsbConnection::Finalise() { disconnecting_ = true; if (out_transfer_) { waiting_out_transfer_cancel_ = true; - if ( LIBUSB_SUCCESS != libusb_cancel_transfer(out_transfer_)) { + if (LIBUSB_SUCCESS != libusb_cancel_transfer(out_transfer_)) { waiting_out_transfer_cancel_ = false; } } if (in_transfer_) { waiting_in_transfer_cancel_ = true; - if ( LIBUSB_SUCCESS != libusb_cancel_transfer(in_transfer_)) { + if (LIBUSB_SUCCESS != libusb_cancel_transfer(in_transfer_)) { waiting_in_transfer_cancel_ = false; } } - for (std::list<protocol_handler::RawMessagePtr>::iterator it = out_messages_.begin(); - it != out_messages_.end(); it = out_messages_.erase(it)) { - controller_->DataSendFailed(device_uid_, app_handle_, *it, DataSendError()); + for (std::list<protocol_handler::RawMessagePtr>::iterator it = + out_messages_.begin(); + it != out_messages_.end(); + it = out_messages_.erase(it)) { + controller_->DataSendFailed( + device_uid_, app_handle_, *it, DataSendError()); } } while (waiting_in_transfer_cancel_ || waiting_out_transfer_cancel_) { @@ -263,7 +288,8 @@ void UsbConnection::Finalise() { void UsbConnection::AbortConnection() { LOG4CXX_TRACE(logger_, "enter"); - controller_->ConnectionAborted(device_uid_, app_handle_, CommunicationError()); + controller_->ConnectionAborted( + device_uid_, app_handle_, CommunicationError()); Disconnect(); LOG4CXX_TRACE(logger_, "exit"); } @@ -292,8 +318,8 @@ bool UsbConnection::Init() { controller_->ConnectDone(device_uid_, app_handle_); if (!PostInTransfer()) { LOG4CXX_ERROR(logger_, "PostInTransfer failed. Call ConnectionAborted"); - controller_->ConnectionAborted(device_uid_, app_handle_, - CommunicationError()); + controller_->ConnectionAborted( + device_uid_, app_handle_, CommunicationError()); LOG4CXX_TRACE(logger_, "exit with FALSE. Condition: !PostInTransfer()"); return false; } @@ -306,11 +332,13 @@ bool UsbConnection::FindEndpoints() { LOG4CXX_TRACE(logger_, "enter"); struct libusb_config_descriptor* config; const int libusb_ret = - libusb_get_active_config_descriptor(libusb_device_, &config); + libusb_get_active_config_descriptor(libusb_device_, &config); if (LIBUSB_SUCCESS != libusb_ret) { - LOG4CXX_ERROR(logger_, "libusb_get_active_config_descriptor failed: " - << libusb_error_name(libusb_ret)); - LOG4CXX_TRACE(logger_, "exit with FALSE. Condition: LIBUSB_SUCCESS != libusb_ret"); + LOG4CXX_ERROR(logger_, + "libusb_get_active_config_descriptor failed: " + << libusb_error_name(libusb_ret)); + LOG4CXX_TRACE(logger_, + "exit with FALSE. Condition: LIBUSB_SUCCESS != libusb_ret"); return false; } @@ -323,10 +351,10 @@ bool UsbConnection::FindEndpoints() { const libusb_interface_descriptor& iface_desc = interface.altsetting[i]; for (int i = 0; i < iface_desc.bNumEndpoints; ++i) { const libusb_endpoint_descriptor& endpoint_desc = - iface_desc.endpoint[i]; + iface_desc.endpoint[i]; const uint8_t endpoint_dir = - endpoint_desc.bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK; + endpoint_desc.bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK; if (find_in_endpoint && endpoint_dir == LIBUSB_ENDPOINT_IN) { in_endpoint_ = endpoint_desc.bEndpointAddress; in_endpoint_max_packet_size_ = endpoint_desc.wMaxPacketSize; |