Merge pull request #3865 from leoetlino/third-party-wiimotes
Change Bluetooth device discovery on Linux to use LIAC (updated #3327)
This commit is contained in:
commit
afa202738e
|
@ -12,7 +12,6 @@
|
||||||
|
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
#include "Common/Logging/Log.h"
|
#include "Common/Logging/Log.h"
|
||||||
#include "Core/HW/WiimoteEmu/WiimoteHid.h"
|
|
||||||
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
||||||
|
|
||||||
namespace WiimoteReal
|
namespace WiimoteReal
|
||||||
|
@ -22,6 +21,7 @@ class WiimoteLinux final : public Wiimote
|
||||||
public:
|
public:
|
||||||
WiimoteLinux(bdaddr_t bdaddr);
|
WiimoteLinux(bdaddr_t bdaddr);
|
||||||
~WiimoteLinux() override;
|
~WiimoteLinux() override;
|
||||||
|
const bdaddr_t& Address() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool ConnectInternal() override;
|
bool ConnectInternal() override;
|
||||||
|
@ -82,10 +82,13 @@ void WiimoteScanner::FindWiimotes(std::vector<Wiimote*>& found_wiimotes, Wiimote
|
||||||
inquiry_info scan_infos[max_infos] = {};
|
inquiry_info scan_infos[max_infos] = {};
|
||||||
auto* scan_infos_ptr = scan_infos;
|
auto* scan_infos_ptr = scan_infos;
|
||||||
found_board = nullptr;
|
found_board = nullptr;
|
||||||
|
// Use Limited Dedicated Inquiry Access Code (LIAC) to query, since third-party Wiimotes
|
||||||
|
// cannot be discovered without it.
|
||||||
|
const u8 lap[3] = {0x00, 0x8b, 0x9e};
|
||||||
|
|
||||||
// Scan for Bluetooth devices
|
// Scan for Bluetooth devices
|
||||||
int const found_devices =
|
int const found_devices =
|
||||||
hci_inquiry(device_id, wait_len, max_infos, nullptr, &scan_infos_ptr, IREQ_CACHE_FLUSH);
|
hci_inquiry(device_id, wait_len, max_infos, lap, &scan_infos_ptr, IREQ_CACHE_FLUSH);
|
||||||
if (found_devices < 0)
|
if (found_devices < 0)
|
||||||
{
|
{
|
||||||
ERROR_LOG(WIIMOTE, "Error searching for Bluetooth devices.");
|
ERROR_LOG(WIIMOTE, "Error searching for Bluetooth devices.");
|
||||||
|
@ -112,14 +115,16 @@ void WiimoteScanner::FindWiimotes(std::vector<Wiimote*>& found_wiimotes, Wiimote
|
||||||
{
|
{
|
||||||
bool new_wiimote = true;
|
bool new_wiimote = true;
|
||||||
|
|
||||||
// TODO: do this
|
|
||||||
|
|
||||||
// Determine if this Wiimote has already been found.
|
// Determine if this Wiimote has already been found.
|
||||||
// for (int j = 0; j < MAX_WIIMOTES && new_wiimote; ++j)
|
for (int j = 0; j < MAX_BBMOTES && new_wiimote; ++j)
|
||||||
//{
|
{
|
||||||
// if (wm[j] && bacmp(&scan_infos[i].bdaddr,&wm[j]->bdaddr) == 0)
|
// compare this address with the stored addresses in our global array
|
||||||
// new_wiimote = false;
|
// static_cast is OK here, since we're only ever going to have this subclass in g_wiimotes
|
||||||
//}
|
// on Linux (and likewise, only WiimoteWindows on Windows, etc)
|
||||||
|
auto connected_wiimote = static_cast<WiimoteLinux*>(g_wiimotes[j]);
|
||||||
|
if (connected_wiimote && bacmp(&scan_infos[i].bdaddr, &connected_wiimote->Address()) == 0)
|
||||||
|
new_wiimote = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (new_wiimote)
|
if (new_wiimote)
|
||||||
{
|
{
|
||||||
|
@ -165,6 +170,11 @@ WiimoteLinux::~WiimoteLinux()
|
||||||
close(m_wakeup_pipe_r);
|
close(m_wakeup_pipe_r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const bdaddr_t& WiimoteLinux::Address() const
|
||||||
|
{
|
||||||
|
return m_bdaddr;
|
||||||
|
}
|
||||||
|
|
||||||
// Connect to a Wiimote with a known address.
|
// Connect to a Wiimote with a known address.
|
||||||
bool WiimoteLinux::ConnectInternal()
|
bool WiimoteLinux::ConnectInternal()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue