From 2e08f9a340b574448928623a4ca527cd38286ede Mon Sep 17 00:00:00 2001 From: eddy Date: Sun, 26 Jul 2026 12:50:22 +0200 Subject: [PATCH] Fix UsbSerialTransport.read() to throw IOException on error --- .../com/eddy/atomrelay/UsbSerialTransport.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 android/app/src/main/java/com/eddy/atomrelay/UsbSerialTransport.kt diff --git a/android/app/src/main/java/com/eddy/atomrelay/UsbSerialTransport.kt b/android/app/src/main/java/com/eddy/atomrelay/UsbSerialTransport.kt new file mode 100644 index 0000000..5f4988f --- /dev/null +++ b/android/app/src/main/java/com/eddy/atomrelay/UsbSerialTransport.kt @@ -0,0 +1,41 @@ +package com.eddy.atomrelay + +import android.hardware.usb.UsbConstants +import android.hardware.usb.UsbDeviceConnection +import android.hardware.usb.UsbEndpoint +import org.dkaukov.esp32.io.SerialTransport +import java.io.IOException + +class UsbSerialTransport( + private val connection: UsbDeviceConnection, + private val epOut: UsbEndpoint, + private val epIn: UsbEndpoint +) : SerialTransport { + + override fun read(buffer: ByteArray, length: Int): Int { + val n = connection.bulkTransfer(epIn, buffer, length, 5000) + if (n < 0) throw IOException("USB read failed") + return n + } + + override fun write(buffer: ByteArray, length: Int) { + val n = connection.bulkTransfer(epOut, buffer, length, 5000) + if (n < 0) throw IOException("USB write failed") + } + + override fun setControlLines(dtr: Boolean, rts: Boolean) { + connection.controlTransfer( + UsbConstants.USB_DIR_OUT or UsbConstants.USB_TYPE_CLASS or 0x01, + 0x22, + (if (dtr) 0x01 else 0x00) or (if (rts) 0x02 else 0x00), + 0, + null, + 0, + 1000 + ) + } + + override fun readBufferSize(): Int { + return epIn.maxPacketSize.coerceAtLeast(64) + } +} \ No newline at end of file