summaryrefslogtreecommitdiff
path: root/src/components/transport_manager/src/usb/libusb/usb_connection.cc
diff options
context:
space:
mode:
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.cc168
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;