win32: Some more work on real wiimote automatic ingame pairup (automatic paired up wiimotes get connected now ingame as well, but it's not completely working yet, we're almost there tho:P) and changed the automatic unpair real wiimotes routine, so it won't get loaded via dll_detach anymore.

minor code changes and adding comments.
And issue fix 2792 with credits to Karloathian for finding and fixing it.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5750 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
snzgoo 2010-06-20 02:17:53 +00:00
parent 4ab0e4b8a0
commit 6e83fe2416
11 changed files with 95 additions and 33 deletions

View File

@ -32,6 +32,8 @@ PluginWiimote::PluginWiimote(const char *_Filename)
(LoadSymbol("Wiimote_Update")); (LoadSymbol("Wiimote_Update"));
Wiimote_GetAttachedControllers = reinterpret_cast<TWiimote_GetAttachedControllers> Wiimote_GetAttachedControllers = reinterpret_cast<TWiimote_GetAttachedControllers>
(LoadSymbol("Wiimote_GetAttachedControllers")); (LoadSymbol("Wiimote_GetAttachedControllers"));
Wiimote_UnPairWiimotes = reinterpret_cast<TWiimote_UnPairWiimotes>
(LoadSymbol("Wiimote_UnPairWiimotes"));
if ((Wiimote_ControlChannel != 0) && if ((Wiimote_ControlChannel != 0) &&
(Wiimote_Input != 0) && (Wiimote_Input != 0) &&

View File

@ -28,6 +28,7 @@ typedef void (__cdecl* TWiimote_Update)(int _number);
typedef void (__cdecl* TWiimote_Input)(u16 _Key, u8 _UpDown); typedef void (__cdecl* TWiimote_Input)(u16 _Key, u8 _UpDown);
typedef void (__cdecl* TWiimote_ControlChannel)(int _number, u16 _channelID, const void* _pData, u32 _Size); typedef void (__cdecl* TWiimote_ControlChannel)(int _number, u16 _channelID, const void* _pData, u32 _Size);
typedef void (__cdecl* TWiimote_InterruptChannel)(int _number, u16 _channelID, const void* _pData, u32 _Size); typedef void (__cdecl* TWiimote_InterruptChannel)(int _number, u16 _channelID, const void* _pData, u32 _Size);
typedef unsigned int (__cdecl* TWiimote_UnPairWiimotes)();
typedef unsigned int (__cdecl* TWiimote_GetAttachedControllers)(); typedef unsigned int (__cdecl* TWiimote_GetAttachedControllers)();
class PluginWiimote : public CPlugin { class PluginWiimote : public CPlugin {
@ -40,6 +41,7 @@ public:
TWiimote_Input Wiimote_Input; TWiimote_Input Wiimote_Input;
TWiimote_InterruptChannel Wiimote_InterruptChannel; TWiimote_InterruptChannel Wiimote_InterruptChannel;
TWiimote_Update Wiimote_Update; TWiimote_Update Wiimote_Update;
TWiimote_UnPairWiimotes Wiimote_UnPairWiimotes;
TWiimote_GetAttachedControllers Wiimote_GetAttachedControllers; TWiimote_GetAttachedControllers Wiimote_GetAttachedControllers;
private: private:

View File

@ -310,4 +310,7 @@ void SConfig::LoadSettingsWii()
sprintf(SectionName, "Wiimote%i", i + 1); sprintf(SectionName, "Wiimote%i", i + 1);
ini.Get(SectionName, "AutoReconnectRealWiimote", &m_WiiAutoReconnect[i], false); ini.Get(SectionName, "AutoReconnectRealWiimote", &m_WiiAutoReconnect[i], false);
} }
ini.Load((std::string(File::GetUserPath(D_CONFIG_IDX)) + "wiimote.ini").c_str());
ini.Get("Real", "Unpair", &m_WiiAutoUnpair, false);
} }

View File

@ -45,6 +45,7 @@ struct SConfig
bool m_WiiSDCard; bool m_WiiSDCard;
bool m_WiiKeyboard; bool m_WiiKeyboard;
bool m_WiiAutoReconnect[4]; bool m_WiiAutoReconnect[4];
bool m_WiiAutoUnpair;
// hard coded default plugins ... // hard coded default plugins ...
std::string m_DefaultGFXPlugin; std::string m_DefaultGFXPlugin;

View File

@ -280,8 +280,17 @@ void CWII_IPC_HLE_WiiMote::ExecuteL2capCmd(u8* _pData, u32 _Size)
break; break;
case HID_INTERRUPT_CHANNEL: case HID_INTERRUPT_CHANNEL:
{
if (number < 4) if (number < 4)
{
DEBUG_LOG(WIIMOTE, "Wiimote_InterruptChannel");
DEBUG_LOG(WIIMOTE, " Channel ID: %04x", pHeader->CID);
std::string Temp = ArrayToString((const u8*)pData, DataSize);
DEBUG_LOG(WIIMOTE, " Data: %s", Temp.c_str());
mote->Wiimote_InterruptChannel(number, pHeader->CID, pData, DataSize); mote->Wiimote_InterruptChannel(number, pHeader->CID, pData, DataSize);
}
}
break; break;
default: default:

View File

@ -444,6 +444,13 @@ void DolphinApp::OnEndSession()
int DolphinApp::OnExit() int DolphinApp::OnExit()
{ {
#ifdef _WIN32
if (SConfig::GetInstance().m_WiiAutoUnpair)
{
if (CPluginManager::GetInstance().GetWiimote())
CPluginManager::GetInstance().GetWiimote()->Wiimote_UnPairWiimotes();
}
#endif
CPluginManager::Shutdown(); CPluginManager::Shutdown();
SConfig::Shutdown(); SConfig::Shutdown();
LogManager::Shutdown(); LogManager::Shutdown();

View File

@ -71,6 +71,14 @@ EXPORT void CALL Wiimote_InterruptChannel(int _number, u16 _channelID, const voi
// //
EXPORT void CALL Wiimote_Update(int _number); EXPORT void CALL Wiimote_Update(int _number);
// __________________________________________________________________________________________________
// Function: Wiimote_UnPairWiimotes
// Purpose: Unpair real wiimotes to safe battery
// input: none
// output: number of unpaired wiimotes
//
EXPORT unsigned int CALL Wiimote_UnPairWiimotes();
// __________________________________________________________________________________________________ // __________________________________________________________________________________________________
// Function: PAD_GetAttachedPads // Function: PAD_GetAttachedPads
// Purpose: Get mask of attached pads (eg: controller 1 & 4 -> 0x9) // Purpose: Get mask of attached pads (eg: controller 1 & 4 -> 0x9)

View File

@ -164,7 +164,7 @@ THREAD_RETURN XEventThread(void *pArg)
{ {
XEvent event; XEvent event;
KeySym key; KeySym key;
for (int num_events = XPending(GLWin.dpy); num_events > 0; num_events--) { for (int num_events = XPending(GLWin.dpy) -1; num_events > 0; num_events--) {
XNextEvent(GLWin.dpy, &event); XNextEvent(GLWin.dpy, &event);
switch(event.type) { switch(event.type) {
case KeyPress: case KeyPress:

View File

@ -105,12 +105,6 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
{ {
#ifdef _WIN32
if (g_Config.bUnpairRealWiimote){
WiiMoteReal::Shutdown();
WiiMoteReal::WiimotePairUp(true);
}
#endif
#if defined(HAVE_WX) && HAVE_WX #if defined(HAVE_WX) && HAVE_WX
wxUninitialize(); wxUninitialize();
#endif #endif
@ -320,15 +314,7 @@ void Wiimote_Input(u16 _Key, u8 _UpDown)
*/ */
void Wiimote_InterruptChannel(int _number, u16 _channelID, const void* _pData, u32 _Size) void Wiimote_InterruptChannel(int _number, u16 _channelID, const void* _pData, u32 _Size)
{ {
// Debugging // Decide where to send the message
#if defined(_DEBUG) || defined(DEBUGFAST)
DEBUG_LOG(WIIMOTE, "Wiimote_InterruptChannel");
DEBUG_LOG(WIIMOTE, " Channel ID: %04x", _channelID);
std::string Temp = ArrayToString((const u8*)_pData, _Size);
DEBUG_LOG(WIIMOTE, " Data: %s", Temp.c_str());
#endif
// Decice where to send the message
if (WiiMoteEmu::WiiMapping[_number].Source <= 1) if (WiiMoteEmu::WiiMapping[_number].Source <= 1)
WiiMoteEmu::InterruptChannel(_number, _channelID, _pData, _Size); WiiMoteEmu::InterruptChannel(_number, _channelID, _pData, _Size);
#if HAVE_WIIUSE #if HAVE_WIIUSE
@ -425,6 +411,15 @@ unsigned int Wiimote_GetAttachedControllers()
} }
// Unpair Wiimotes, TODO: Add linux/osx un-pair function
unsigned int Wiimote_UnPairWiimotes()
{
#ifdef _WIN32
if (g_Config.bUnpairRealWiimote)
return WiiMoteReal::WiimotePairUp(true);
#endif
return 0;
}
// Supporting functions // Supporting functions

View File

@ -87,7 +87,8 @@ Common::Event g_StartAutopairThread;
int stoprefresh = 0; int stoprefresh = 0;
unsigned int PairUpTimer = 2000; unsigned int PairUpTimer = 2000;
int PaiUpRefreshWiimote(); int PairUpRefreshWiimote(bool addwiimote);
int PairUpFindNewSlot(void);
THREAD_RETURN PairUp_ThreadFunc(void* arg); THREAD_RETURN PairUp_ThreadFunc(void* arg);
THREAD_RETURN RunInvisibleMessageWindow_ThreadFunc(void* arg); THREAD_RETURN RunInvisibleMessageWindow_ThreadFunc(void* arg);
#endif #endif
@ -648,8 +649,9 @@ THREAD_RETURN SafeCloseReadWiimote_ThreadFunc(void* arg)
return 0; return 0;
} }
// WiiMote Pair-Up
#ifdef WIN32 #ifdef WIN32
// WiiMote Pair-Up, function will return amount of either new paired or unpaired devices
int WiimotePairUp(bool unpair) int WiimotePairUp(bool unpair)
{ {
HANDLE hRadios[256]; HANDLE hRadios[256];
@ -763,6 +765,7 @@ int WiimotePairUp(bool unpair)
} }
#ifdef HAVE_WIIUSE #ifdef HAVE_WIIUSE
// Listening for new installed wiimotes, and calling PaiUpRefreshWiimote() when found
LRESULT CALLBACK CallBackDeviceChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) LRESULT CALLBACK CallBackDeviceChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
switch(uMsg) switch(uMsg)
@ -782,7 +785,7 @@ LRESULT CALLBACK CallBackDeviceChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
{ {
stoprefresh = 0; stoprefresh = 0;
PaiUpRefreshWiimote(); PairUpRefreshWiimote(true);
break; break;
} }
else stoprefresh = 1; //fake arrival wait for second go else stoprefresh = 1; //fake arrival wait for second go
@ -791,7 +794,7 @@ LRESULT CALLBACK CallBackDeviceChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
case 0x8004: case 0x8004:
if (!stoprefresh) // removal event will pop up only once (it will also pop up if we add a device: fake arrival, fake removal, real arrival. if (!stoprefresh) // removal event will pop up only once (it will also pop up if we add a device: fake arrival, fake removal, real arrival.
{ {
PaiUpRefreshWiimote(); PairUpRefreshWiimote(false);
} }
break; break;
} }
@ -805,11 +808,12 @@ LRESULT CALLBACK CallBackDeviceChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
return 0; return 0;
} }
// Generating a new invisible message window and listening for new messages
THREAD_RETURN RunInvisibleMessageWindow_ThreadFunc(void* arg) THREAD_RETURN RunInvisibleMessageWindow_ThreadFunc(void* arg)
{ {
MSG Msg; MSG Msg;
HWND hwnd; HWND hwnd;
BOOL ret;
WNDCLASSEX WCEx; WNDCLASSEX WCEx;
ZeroMemory(&WCEx, sizeof(WCEx)); ZeroMemory(&WCEx, sizeof(WCEx));
@ -831,23 +835,27 @@ THREAD_RETURN RunInvisibleMessageWindow_ThreadFunc(void* arg)
wiiuse_register_system_notification(hwnd); //function moved into wiiuse to avoid ddk/wdk dependicies wiiuse_register_system_notification(hwnd); //function moved into wiiuse to avoid ddk/wdk dependicies
while(GetMessage(&Msg, 0, 0, 0) > 0) while((ret = GetMessage(&Msg, 0, 0, 0)) != 0)
{ {
if ( ret == -1) {
return 1;
}
else {
TranslateMessage(&Msg); TranslateMessage(&Msg);
DispatchMessage(&Msg); DispatchMessage(&Msg);
} }
}
UnregisterClass(WCEx.lpszClassName, g_hInstance); UnregisterClass(WCEx.lpszClassName, g_hInstance);
if (g_Config.bUnpairRealWiimote)
WiiMoteReal::WiimotePairUp(true);
return (int)Msg.wParam; return (int)Msg.wParam;
} }
// function gets called by windows callbacks if a wiimote was either installed or removed
int PaiUpRefreshWiimote() int PairUpRefreshWiimote(bool addwiimote)
{ {
int connectslot = -1;
if (g_EmulatorState != PLUGIN_EMUSTATE_PLAY) if (g_EmulatorState != PLUGIN_EMUSTATE_PLAY)
{ {
Shutdown(); Shutdown();
@ -862,16 +870,32 @@ int PaiUpRefreshWiimote()
PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_PAUSE, 0); PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_PAUSE, 0);
while (g_EmulatorState == PLUGIN_EMUSTATE_PLAY) Sleep(50); while (g_EmulatorState == PLUGIN_EMUSTATE_PLAY) Sleep(50);
Shutdown(); Shutdown();
if (addwiimote) {
connectslot = PairUpFindNewSlot();
}
Initialize(); Initialize();
Allocate(); Allocate();
PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_PAUSE, 0); PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_PAUSE, 0);
while (g_EmulatorState != PLUGIN_EMUSTATE_PLAY) Sleep(50); while (g_EmulatorState != PLUGIN_EMUSTATE_PLAY) Sleep(50);
if (addwiimote)
PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_KEYDOWN, (3 + connectslot));
} }
return 0; return 0;
} }
// returns first inactive wiimote slot to place new wiimote and set type to real wiimote
int PairUpFindNewSlot() {
for(int x=0; x<MAX_WIIMOTES; x++)
{
if (WiiMoteEmu::WiiMapping[x].Source == 0)
{
WiiMoteEmu::WiiMapping[x].Source = 2;
return x;
}
}
return -1;
}
// loop to poll and install new bluetooth devices; windows callback will take care of the rest on successful installation
THREAD_RETURN PairUp_ThreadFunc(void* arg) THREAD_RETURN PairUp_ThreadFunc(void* arg)
{ {
Sleep(100); //small pause till the callback is registered on first start Sleep(100); //small pause till the callback is registered on first start

View File

@ -156,6 +156,17 @@ void Wiimote_Input(u16 _Key, u8 _UpDown)
return; return;
} }
// __________________________________________________________________________________________________
// Function: Unpair real Wiimotes (just a dummy to be compliant)
// Purpose:
// input: None
// output: 0 Wiimotes disconnected
//
unsigned int Wiimote_UnPairWiimotes(void)
{
return 0;
}
// __________________________________________________________________________________________________ // __________________________________________________________________________________________________
// Function: Wiimote_InterruptChannel // Function: Wiimote_InterruptChannel
// Purpose: An L2CAP packet is passed from the Core to the Wiimote, // Purpose: An L2CAP packet is passed from the Core to the Wiimote,