From c1b391d08b68f022c38e8897224e736df0d08792 Mon Sep 17 00:00:00 2001 From: Ryan Hitchman Date: Fri, 9 Jan 2015 22:28:05 -0800 Subject: [PATCH 1/2] WiimoteReal: fix Linux Bluetooth connectivity on Linux >= 3.5 An uninitialized struct member "l2_bdaddr_type" was making most connect calls fail with "Invalid argument". The connection could succeed if the unitialized memory happened to have a zero byte in the appropriate location. --- Source/Core/Core/HW/WiimoteReal/IONix.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Core/Core/HW/WiimoteReal/IONix.cpp b/Source/Core/Core/HW/WiimoteReal/IONix.cpp index adcf9ab62b..67dd785a99 100644 --- a/Source/Core/Core/HW/WiimoteReal/IONix.cpp +++ b/Source/Core/Core/HW/WiimoteReal/IONix.cpp @@ -166,7 +166,7 @@ WiimoteLinux::~WiimoteLinux() // Connect to a wiimote with a known address. bool WiimoteLinux::ConnectInternal() { - sockaddr_l2 addr; + sockaddr_l2 addr = {}; addr.l2_family = AF_BLUETOOTH; addr.l2_bdaddr = m_bdaddr; addr.l2_cid = 0; @@ -176,7 +176,7 @@ bool WiimoteLinux::ConnectInternal() if ((m_cmd_sock = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)) == -1 || connect(m_cmd_sock, (sockaddr*)&addr, sizeof(addr)) < 0) { - DEBUG_LOG(WIIMOTE, "Unable to open output socket to wiimote."); + DEBUG_LOG(WIIMOTE, "Unable to open output socket to wiimote: %s", strerror(errno)); close(m_cmd_sock); m_cmd_sock = -1; return false; @@ -187,7 +187,7 @@ bool WiimoteLinux::ConnectInternal() if ((m_int_sock = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)) == -1 || connect(m_int_sock, (sockaddr*)&addr, sizeof(addr)) < 0) { - DEBUG_LOG(WIIMOTE, "Unable to open input socket from wiimote."); + DEBUG_LOG(WIIMOTE, "Unable to open input socket from wiimote: %s", strerror(errno)); close(m_int_sock); close(m_cmd_sock); m_int_sock = m_cmd_sock = -1; From 09f71b25b43434d635953d9c3e3c8666a68701e6 Mon Sep 17 00:00:00 2001 From: Ryan Hitchman Date: Fri, 9 Jan 2015 22:28:46 -0800 Subject: [PATCH 2/2] WiimoteReal: retry failed connections quickly Retry a failed connection after a short delay -- hardware sometimes needs some time to settle, or other Bluetooth programs are attempting to query the device as well (e.g. blueman-manager). --- Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp b/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp index 36b797f697..dfa201dced 100644 --- a/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp +++ b/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp @@ -530,6 +530,13 @@ void Wiimote::ThreadFunc() bool ok = ConnectInternal(); + if (!ok) + { + // try again, it might take a moment to settle + Common::SleepCurrentThread(100); + ok = ConnectInternal(); + } + SetReady(); if (!ok)