Implemented the timeout in hid_read_timeout() on Android This fixes detecting PS5 controllers connected over USB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
diff --git a/src/hidapi/android/hid.cpp b/src/hidapi/android/hid.cpp
index 9e3f7e1..4bba207 100644
--- a/src/hidapi/android/hid.cpp
+++ b/src/hidapi/android/hid.cpp
@@ -1088,7 +1088,32 @@ int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned ch
return -1; // Controller was disconnected
}
-// TODO: Implement timeout?
+static uint32_t getms()
+{
+ struct timeval now;
+
+ gettimeofday(&now, NULL);
+ return (uint32_t)(now.tv_sec * 1000 + now.tv_usec / 1000);
+}
+
+static void delayms(uint32_t ms)
+{
+ int was_error;
+
+ struct timespec elapsed, tv;
+
+ /* Set the timeout interval */
+ elapsed.tv_sec = ms / 1000;
+ elapsed.tv_nsec = (ms % 1000) * 1000000;
+ do {
+ errno = 0;
+
+ tv.tv_sec = elapsed.tv_sec;
+ tv.tv_nsec = elapsed.tv_nsec;
+ was_error = nanosleep(&tv, &elapsed);
+ } while (was_error && (errno == EINTR));
+}
+
int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *device, unsigned char *data, size_t length, int milliseconds)
{
if ( device )
@@ -1097,7 +1122,17 @@ int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *device, unsigned ch
hid_device_ref<CHIDDevice> pDevice = FindDevice( device->m_nId );
if ( pDevice )
{
- return pDevice->GetInput( data, length );
+ int nResult = pDevice->GetInput( data, length );
+ if ( nResult == 0 && milliseconds > 0 )
+ {
+ uint32_t start = getms();
+ do
+ {
+ delayms( 1 );
+ nResult = pDevice->GetInput( data, length );
+ } while ( nResult == 0 && ( getms() - start ) < milliseconds );
+ }
+ return nResult;
}
LOGV( "controller was disconnected" );
}