diff options
author | Mina Granic <minagranic@google.com> | 2020-06-03 19:15:08 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-06-03 19:15:08 +0000 |
commit | d6b707c3b9e188555593701fb6da73b5a310df44 (patch) | |
tree | e5b73d4073653e0c02678e8fabb19f37511308d3 /car-usb-handler | |
parent | f410eef2c383300bb5f69ada52a56535c0136f3c (diff) | |
parent | f1f94a865a6e4fd72409d6d39af3cbb96434ae89 (diff) | |
download | Car-d6b707c3b9e188555593701fb6da73b5a310df44.tar.gz |
Merge "Retry once to getProtocol and send Idetifying Information." into rvc-dev am: b73a06fc11 am: f1f94a865a
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/services/Car/+/11636953
Change-Id: I78d678a7f23abd2d5a81e5ee418ebdab27a48272
Diffstat (limited to 'car-usb-handler')
-rw-r--r-- | car-usb-handler/src/android/car/usb/handler/AoapInterface.java | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/car-usb-handler/src/android/car/usb/handler/AoapInterface.java b/car-usb-handler/src/android/car/usb/handler/AoapInterface.java index 21aa64eb03..3b7fbfeda3 100644 --- a/car-usb-handler/src/android/car/usb/handler/AoapInterface.java +++ b/car-usb-handler/src/android/car/usb/handler/AoapInterface.java @@ -22,6 +22,10 @@ import android.util.Log; import android.util.Pair; import java.io.IOException; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.HashSet; import java.util.Set; @@ -97,7 +101,7 @@ final class AoapInterface { /** * Accessory write timeout. */ - public static final int AOAP_TIMEOUT_MS = 2000; + public static final int AOAP_TIMEOUT_MS = 50; /** * Set of VID:PID pairs blacklisted through config_AoapIncompatibleDeviceIds. Only @@ -107,14 +111,30 @@ final class AoapInterface { private static final String TAG = AoapInterface.class.getSimpleName(); + @Retention(RetentionPolicy.SOURCE) + @Target({ ElementType.FIELD, ElementType.PARAMETER }) + public @interface Direction {} + + @Direction + public static final int WRITE = 1; + @Direction + public static final int READ = 2; + + public static int getProtocol(UsbDeviceConnection conn) { byte[] buffer = new byte[2]; - int len = conn.controlTransfer( - UsbConstants.USB_DIR_IN | UsbConstants.USB_TYPE_VENDOR, - ACCESSORY_GET_PROTOCOL, 0, 0, buffer, 2, AOAP_TIMEOUT_MS); - if (len != 2) { + + int len = transfer(conn, READ, ACCESSORY_GET_PROTOCOL, 0, buffer, buffer.length); + if (len == 0) { return -1; } + if (len < 0) { + Log.w(TAG, "getProtocol() failed. Retrying..."); + len = transfer(conn, READ, ACCESSORY_GET_PROTOCOL, 0, buffer, buffer.length); + if (len != buffer.length) { + return -1; + } + } return (buffer[1] << 8) | buffer[0]; } @@ -125,21 +145,22 @@ final class AoapInterface { public static void sendString(UsbDeviceConnection conn, int index, String string) throws IOException { byte[] buffer = (string + "\0").getBytes(); - int len = conn.controlTransfer( - UsbConstants.USB_DIR_OUT | UsbConstants.USB_TYPE_VENDOR, - ACCESSORY_SEND_STRING, 0, index, - buffer, buffer.length, AOAP_TIMEOUT_MS); + int len = transfer(conn, WRITE, ACCESSORY_SEND_STRING, index, buffer, + buffer.length); if (len != buffer.length) { - throw new IOException("Failed to send string " + index + ": \"" + string + "\""); + Log.w(TAG, "sendString for " + index + ":" + string + " failed. Retrying..."); + len = transfer(conn, WRITE, ACCESSORY_SEND_STRING, index, buffer, + buffer.length); + if (len != buffer.length) { + throw new IOException("Failed to send string " + index + ": \"" + string + "\""); + } } else { Log.i(TAG, "Sent string " + index + ": \"" + string + "\""); } } public static void sendAoapStart(UsbDeviceConnection conn) throws IOException { - int len = conn.controlTransfer( - UsbConstants.USB_DIR_OUT | UsbConstants.USB_TYPE_VENDOR, - ACCESSORY_START, 0, 0, null, 0, AOAP_TIMEOUT_MS); + int len = transfer(conn, WRITE, ACCESSORY_START, 0, null, 0); if (len < 0) { throw new IOException("Control transfer for accessory start failed: " + len); } @@ -181,4 +202,22 @@ final class AoapInterface { return vid == USB_ACCESSORY_VENDOR_ID && USB_ACCESSORY_MODE_PRODUCT_ID.contains(pid); } + + private static int transfer(UsbDeviceConnection conn, @Direction int direction, int string, + int index, byte[] buffer, int length) { + int directionConstant; + switch (direction) { + case READ: + directionConstant = UsbConstants.USB_DIR_IN; + break; + case WRITE: + directionConstant = UsbConstants.USB_DIR_OUT; + break; + default: + Log.w(TAG, "Unknown direction for transfer: " + direction); + return -1; + } + return conn.controlTransfer(directionConstant | UsbConstants.USB_TYPE_VENDOR, string, 0, + index, buffer, length, AOAP_TIMEOUT_MS); + } } |