Merge pull request #5807 from leoetlino/connect-wiimote

Move the Wiimote connect code out of Host
This commit is contained in:
Leo Lam
2017-07-27 15:02:28 +08:00
committed by GitHub
14 changed files with 44 additions and 114 deletions

View File

@ -140,10 +140,6 @@ bool Host_RendererIsFullscreen()
return false; return false;
} }
void Host_ConnectWiimote(int wm_idx, bool connect)
{
}
void Host_ShowVideoConfig(void*, const std::string&) void Host_ShowVideoConfig(void*, const std::string&)
{ {
} }

View File

@ -6,9 +6,15 @@
#include "Common/ChunkFile.h" #include "Common/ChunkFile.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/StringUtil.h"
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "Core/HW/WiimoteEmu/WiimoteEmu.h" #include "Core/HW/WiimoteEmu/WiimoteEmu.h"
#include "Core/HW/WiimoteReal/WiimoteReal.h" #include "Core/HW/WiimoteReal/WiimoteReal.h"
#include "Core/IOS/IOS.h"
#include "Core/IOS/USB/Bluetooth/BTEmu.h"
#include "Core/IOS/USB/Bluetooth/WiimoteDevice.h"
#include "Core/Movie.h" #include "Core/Movie.h"
#include "InputCommon/ControllerEmu/ControlGroup/ControlGroup.h" #include "InputCommon/ControllerEmu/ControlGroup/ControlGroup.h"
@ -81,6 +87,25 @@ void Initialize(InitializeMode init_mode)
Movie::ChangeWiiPads(); Movie::ChangeWiiPads();
} }
void Connect(unsigned int index, bool connect)
{
if (SConfig::GetInstance().m_bt_passthrough_enabled || index >= MAX_BBMOTES)
return;
const auto ios = IOS::HLE::GetIOS();
if (!ios)
return;
const auto bluetooth = std::static_pointer_cast<IOS::HLE::Device::BluetoothEmu>(
ios->GetDeviceByName("/dev/usb/oh1/57e/305"));
if (bluetooth)
bluetooth->AccessWiiMote(index | 0x100)->Activate(connect);
const char* message = connect ? "Wii Remote %i connected" : "Wii Remote %i disconnected";
Core::DisplayMessage(StringFromFormat(message, index + 1), 3000);
}
void ResetAllWiimotes() void ResetAllWiimotes()
{ {
for (int i = WIIMOTE_CHAN_0; i < MAX_BBMOTES; ++i) for (int i = WIIMOTE_CHAN_0; i < MAX_BBMOTES; ++i)

View File

@ -58,6 +58,7 @@ enum class InitializeMode
void Shutdown(); void Shutdown();
void Initialize(InitializeMode init_mode); void Initialize(InitializeMode init_mode);
void Connect(unsigned int index, bool connect);
void ResetAllWiimotes(); void ResetAllWiimotes();
void LoadConfig(); void LoadConfig();
void Resume(); void Resume();

View File

@ -948,7 +948,7 @@ void Wiimote::ConnectOnInput()
if (buttons != 0 || m_extension->IsButtonPressed()) if (buttons != 0 || m_extension->IsButtonPressed())
{ {
Host_ConnectWiimote(m_index, true); ::Wiimote::Connect(m_index, true);
// arbitrary value so it doesn't try to send multiple requests before Dolphin can react // arbitrary value so it doesn't try to send multiple requests before Dolphin can react
// if Wii Remotes are polled at 200Hz then this results in one request being sent per 500ms // if Wii Remotes are polled at 200Hz then this results in one request being sent per 500ms
m_last_connect_request_counter = 100; m_last_connect_request_counter = 100;

View File

@ -18,6 +18,7 @@
#include "Common/Thread.h" #include "Common/Thread.h"
#include "Core/ConfigManager.h" #include "Core/ConfigManager.h"
#include "Core/Core.h" #include "Core/Core.h"
#include "Core/HW/Wiimote.h"
#include "Core/HW/WiimoteCommon/WiimoteHid.h" #include "Core/HW/WiimoteCommon/WiimoteHid.h"
#include "Core/HW/WiimoteEmu/WiimoteEmu.h" #include "Core/HW/WiimoteEmu/WiimoteEmu.h"
#include "Core/HW/WiimoteReal/IOAndroid.h" #include "Core/HW/WiimoteReal/IOAndroid.h"
@ -390,7 +391,7 @@ void Wiimote::ConnectOnInput()
// check any button without checking accelerometer data // check any button without checking accelerometer data
if ((rpt[2] & 0x1F) != 0 || (rpt[3] & 0x9F) != 0) if ((rpt[2] & 0x1F) != 0 || (rpt[3] & 0x9F) != 0)
{ {
Host_ConnectWiimote(m_index, true); ::Wiimote::Connect(m_index, true);
// see WiimoteEmu::Wiimote::ConnectOnInput(), same idea here // see WiimoteEmu::Wiimote::ConnectOnInput(), same idea here
m_last_connect_request_counter = 100; m_last_connect_request_counter = 100;
} }
@ -776,6 +777,7 @@ void Pause()
void ChangeWiimoteSource(unsigned int index, int source) void ChangeWiimoteSource(unsigned int index, int source)
{ {
const int previous_source = g_wiimote_sources[index];
g_wiimote_sources[index] = source; g_wiimote_sources[index] = source;
{ {
// kill real connection (or swap to different slot) // kill real connection (or swap to different slot)
@ -795,11 +797,15 @@ void ChangeWiimoteSource(unsigned int index, int source)
} }
// reconnect to the emulator // reconnect to the emulator
Host_ConnectWiimote(index, false); Core::RunAsCPUThread([index, previous_source, source] {
if (WIIMOTE_SRC_EMU & source) if (previous_source != WIIMOTE_SRC_NONE)
Host_ConnectWiimote(index, true); ::Wiimote::Connect(index, false);
if (source & WIIMOTE_SRC_EMU)
::Wiimote::Connect(index, true);
});
} }
// Called from the Wiimote scanner thread
static bool TryToConnectWiimoteToSlot(Wiimote* wm, unsigned int i) static bool TryToConnectWiimoteToSlot(Wiimote* wm, unsigned int i)
{ {
if (WIIMOTE_SRC_REAL & g_wiimote_sources[i] && !g_wiimotes[i]) if (WIIMOTE_SRC_REAL & g_wiimote_sources[i] && !g_wiimotes[i])
@ -808,7 +814,7 @@ static bool TryToConnectWiimoteToSlot(Wiimote* wm, unsigned int i)
{ {
NOTICE_LOG(WIIMOTE, "Connected to Wiimote %i.", i + 1); NOTICE_LOG(WIIMOTE, "Connected to Wiimote %i.", i + 1);
g_wiimotes[i] = wm; g_wiimotes[i] = wm;
Host_ConnectWiimote(i, true); Core::RunAsCPUThread([i] { ::Wiimote::Connect(i, true); });
std::lock_guard<std::mutex> lk(s_known_ids_mutex); std::lock_guard<std::mutex> lk(s_known_ids_mutex);
s_known_ids.insert(wm->GetId()); s_known_ids.insert(wm->GetId());
} }
@ -884,13 +890,11 @@ void Update(int wiimote_number)
if (g_wiimotes[wiimote_number]) if (g_wiimotes[wiimote_number])
g_wiimotes[wiimote_number]->Update(); g_wiimotes[wiimote_number]->Update();
g_wiimotes_mutex.unlock();
// Wiimote::Update() may remove the Wiimote if it was disconnected. // Wiimote::Update() may remove the Wiimote if it was disconnected.
if (!g_wiimotes[wiimote_number]) if (!g_wiimotes[wiimote_number])
{ ::Wiimote::Connect(wiimote_number, false);
Host_ConnectWiimote(wiimote_number, false);
}
g_wiimotes_mutex.unlock();
} }
void ConnectOnInput(int wiimote_number) void ConnectOnInput(int wiimote_number)

View File

@ -26,7 +26,6 @@
bool Host_UINeedsControllerState(); bool Host_UINeedsControllerState();
bool Host_RendererHasFocus(); bool Host_RendererHasFocus();
bool Host_RendererIsFullscreen(); bool Host_RendererIsFullscreen();
void Host_ConnectWiimote(int wm_idx, bool connect);
void Host_Message(int Id); void Host_Message(int Id);
void Host_NotifyMapLoaded(); void Host_NotifyMapLoaded();
void Host_RefreshDSPDebuggerWindow(); void Host_RefreshDSPDebuggerWindow();

View File

@ -22,12 +22,9 @@
#include "Core/BootManager.h" #include "Core/BootManager.h"
#include "Core/ConfigManager.h" #include "Core/ConfigManager.h"
#include "Core/Core.h" #include "Core/Core.h"
#include "Core/HW/Wiimote.h"
#include "Core/Host.h" #include "Core/Host.h"
#include "Core/IOS/IOS.h" #include "Core/IOS/IOS.h"
#include "Core/IOS/STM/STM.h" #include "Core/IOS/STM/STM.h"
#include "Core/IOS/USB/Bluetooth/BTEmu.h"
#include "Core/IOS/USB/Bluetooth/WiimoteDevice.h"
#include "Core/State.h" #include "Core/State.h"
#include "UICommon/CommandLineParse.h" #include "UICommon/CommandLineParse.h"
@ -131,22 +128,6 @@ bool Host_RendererIsFullscreen()
return rendererIsFullscreen; return rendererIsFullscreen;
} }
void Host_ConnectWiimote(int wm_idx, bool connect)
{
Core::QueueHostJob([=] {
const auto ios = IOS::HLE::GetIOS();
if (!ios || SConfig::GetInstance().m_bt_passthrough_enabled)
return;
Core::RunAsCPUThread([&] {
const auto bt = std::static_pointer_cast<IOS::HLE::Device::BluetoothEmu>(
ios->GetDeviceByName("/dev/usb/oh1/57e/305"));
if (bt)
bt->AccessWiiMote(wm_idx | 0x100)->Activate(connect);
Host_UpdateMainFrame();
});
});
}
void Host_ShowVideoConfig(void*, const std::string&) void Host_ShowVideoConfig(void*, const std::string&)
{ {
} }

View File

@ -104,9 +104,6 @@ void Host_NotifyMapLoaded()
void Host_UpdateDisasmDialog() void Host_UpdateDisasmDialog()
{ {
} }
void Host_ConnectWiimote(int wm_idx, bool connect)
{
}
void Host_ShowVideoConfig(void* parent, const std::string& backend_name) void Host_ShowVideoConfig(void* parent, const std::string& backend_name)
{ {
} }

View File

@ -817,22 +817,6 @@ void CFrame::OnHostMessage(wxCommandEvent& event)
case IDM_STOPPED: case IDM_STOPPED:
OnStopped(); OnStopped();
break; break;
case IDM_FORCE_CONNECT_WIIMOTE1:
case IDM_FORCE_CONNECT_WIIMOTE2:
case IDM_FORCE_CONNECT_WIIMOTE3:
case IDM_FORCE_CONNECT_WIIMOTE4:
case IDM_FORCE_CONNECT_BALANCEBOARD:
ConnectWiimote(event.GetId() - IDM_FORCE_CONNECT_WIIMOTE1, true);
break;
case IDM_FORCE_DISCONNECT_WIIMOTE1:
case IDM_FORCE_DISCONNECT_WIIMOTE2:
case IDM_FORCE_DISCONNECT_WIIMOTE3:
case IDM_FORCE_DISCONNECT_WIIMOTE4:
case IDM_FORCE_DISCONNECT_BALANCEBOARD:
ConnectWiimote(event.GetId() - IDM_FORCE_DISCONNECT_WIIMOTE1, false);
break;
} }
} }

View File

@ -256,7 +256,6 @@ private:
void OnStopped(); void OnStopped();
void OnRenderWindowSizeRequest(int width, int height); void OnRenderWindowSizeRequest(int width, int height);
void UpdateTitle(const wxString& str); void UpdateTitle(const wxString& str);
static void ConnectWiimote(int wm_idx, bool connect);
// Event functions // Event functions
void PostEvent(wxCommandEvent& event); void PostEvent(wxCommandEvent& event);

View File

@ -1406,27 +1406,6 @@ void CFrame::OnFifoPlayer(wxCommandEvent& WXUNUSED(event))
} }
} }
void CFrame::ConnectWiimote(int wm_idx, bool connect)
{
if (Core::IsRunning() && SConfig::GetInstance().bWii &&
!SConfig::GetInstance().m_bt_passthrough_enabled)
{
Core::RunAsCPUThread([&] {
const auto ios = IOS::HLE::GetIOS();
if (!ios)
return;
const auto bt = std::static_pointer_cast<IOS::HLE::Device::BluetoothEmu>(
ios->GetDeviceByName("/dev/usb/oh1/57e/305"));
if (bt)
bt->AccessWiiMote(wm_idx | 0x100)->Activate(connect);
const char* message = connect ? "Wii Remote %i connected" : "Wii Remote %i disconnected";
Core::DisplayMessage(StringFromFormat(message, wm_idx + 1), 3000);
Host_UpdateMainFrame();
});
}
}
void CFrame::OnConnectWiimote(wxCommandEvent& event) void CFrame::OnConnectWiimote(wxCommandEvent& event)
{ {
const auto ios = IOS::HLE::GetIOS(); const auto ios = IOS::HLE::GetIOS();
@ -1435,9 +1414,9 @@ void CFrame::OnConnectWiimote(wxCommandEvent& event)
Core::RunAsCPUThread([&] { Core::RunAsCPUThread([&] {
const auto bt = std::static_pointer_cast<IOS::HLE::Device::BluetoothEmu>( const auto bt = std::static_pointer_cast<IOS::HLE::Device::BluetoothEmu>(
ios->GetDeviceByName("/dev/usb/oh1/57e/305")); ios->GetDeviceByName("/dev/usb/oh1/57e/305"));
const bool is_connected = const unsigned int wiimote_index = event.GetId() - IDM_CONNECT_WIIMOTE1;
bt && bt->AccessWiiMote((event.GetId() - IDM_CONNECT_WIIMOTE1) | 0x100)->IsConnected(); const bool is_connected = bt && bt->AccessWiiMote(wiimote_index | 0x100)->IsConnected();
ConnectWiimote(event.GetId() - IDM_CONNECT_WIIMOTE1, !is_connected); Wiimote::Connect(wiimote_index, !is_connected);
}); });
} }

View File

@ -308,18 +308,6 @@ enum
IDM_STOPPED, IDM_STOPPED,
IDM_HOST_MESSAGE, IDM_HOST_MESSAGE,
// Used for Host_ConnectWiimote()
IDM_FORCE_CONNECT_WIIMOTE1,
IDM_FORCE_CONNECT_WIIMOTE2,
IDM_FORCE_CONNECT_WIIMOTE3,
IDM_FORCE_CONNECT_WIIMOTE4,
IDM_FORCE_CONNECT_BALANCEBOARD,
IDM_FORCE_DISCONNECT_WIIMOTE1,
IDM_FORCE_DISCONNECT_WIIMOTE2,
IDM_FORCE_DISCONNECT_WIIMOTE3,
IDM_FORCE_DISCONNECT_WIIMOTE4,
IDM_FORCE_DISCONNECT_BALANCEBOARD,
IDM_MPANEL, IDM_MPANEL,
ID_STATUSBAR, ID_STATUSBAR,

View File

@ -5,7 +5,6 @@
#include <OptionParser.h> #include <OptionParser.h>
#include <cstdio> #include <cstdio>
#include <cstring> #include <cstring>
#include <mutex>
#include <string> #include <string>
#include <utility> #include <utility>
#include <wx/app.h> #include <wx/app.h>
@ -70,8 +69,6 @@ std::string wxStringTranslator(const char*);
CFrame* main_frame = nullptr; CFrame* main_frame = nullptr;
static std::mutex s_init_mutex;
bool DolphinApp::Initialize(int& c, wxChar** v) bool DolphinApp::Initialize(int& c, wxChar** v)
{ {
#if defined HAVE_X11 && HAVE_X11 #if defined HAVE_X11 && HAVE_X11
@ -122,8 +119,6 @@ bool DolphinApp::OnInit()
ParseCommandLine(); ParseCommandLine();
std::lock_guard<std::mutex> lk(s_init_mutex);
UICommon::SetUserDirectory(m_user_path.ToStdString()); UICommon::SetUserDirectory(m_user_path.ToStdString());
UICommon::CreateDirectories(); UICommon::CreateDirectories();
InitLanguageSupport(); // The language setting is loaded from the user directory InitLanguageSupport(); // The language setting is loaded from the user directory
@ -473,21 +468,6 @@ bool Host_RendererIsFullscreen()
return main_frame->RendererIsFullscreen(); return main_frame->RendererIsFullscreen();
} }
void Host_ConnectWiimote(int wm_idx, bool connect)
{
std::lock_guard<std::mutex> lk(s_init_mutex);
if (connect)
{
wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_FORCE_CONNECT_WIIMOTE1 + wm_idx);
main_frame->GetEventHandler()->AddPendingEvent(event);
}
else
{
wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_FORCE_DISCONNECT_WIIMOTE1 + wm_idx);
main_frame->GetEventHandler()->AddPendingEvent(event);
}
}
void Host_ShowVideoConfig(void* parent, const std::string& backend_name) void Host_ShowVideoConfig(void* parent, const std::string& backend_name)
{ {
wxWindow* const parent_window = static_cast<wxWindow*>(parent); wxWindow* const parent_window = static_cast<wxWindow*>(parent);

View File

@ -51,9 +51,6 @@ bool Host_RendererIsFullscreen()
{ {
return false; return false;
} }
void Host_ConnectWiimote(int, bool)
{
}
void Host_ShowVideoConfig(void*, const std::string&) void Host_ShowVideoConfig(void*, const std::string&)
{ {
} }