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"));
Wiimote_GetAttachedControllers = reinterpret_cast<TWiimote_GetAttachedControllers>
(LoadSymbol("Wiimote_GetAttachedControllers"));
Wiimote_UnPairWiimotes = reinterpret_cast<TWiimote_UnPairWiimotes>
(LoadSymbol("Wiimote_UnPairWiimotes"));
if ((Wiimote_ControlChannel != 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_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 unsigned int (__cdecl* TWiimote_UnPairWiimotes)();
typedef unsigned int (__cdecl* TWiimote_GetAttachedControllers)();
class PluginWiimote : public CPlugin {
@ -40,6 +41,7 @@ public:
TWiimote_Input Wiimote_Input;
TWiimote_InterruptChannel Wiimote_InterruptChannel;
TWiimote_Update Wiimote_Update;
TWiimote_UnPairWiimotes Wiimote_UnPairWiimotes;
TWiimote_GetAttachedControllers Wiimote_GetAttachedControllers;
private:

View File

@ -310,4 +310,7 @@ void SConfig::LoadSettingsWii()
sprintf(SectionName, "Wiimote%i", i + 1);
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_WiiKeyboard;
bool m_WiiAutoReconnect[4];
bool m_WiiAutoUnpair;
// hard coded default plugins ...
std::string m_DefaultGFXPlugin;

View File

@ -280,8 +280,17 @@ void CWII_IPC_HLE_WiiMote::ExecuteL2capCmd(u8* _pData, u32 _Size)
break;
case HID_INTERRUPT_CHANNEL:
if (number < 4)
mote->Wiimote_InterruptChannel(number, pHeader->CID, pData, DataSize);
{
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);
}
}
break;
default:

View File

@ -444,6 +444,13 @@ void DolphinApp::OnEndSession()
int DolphinApp::OnExit()
{
#ifdef _WIN32
if (SConfig::GetInstance().m_WiiAutoUnpair)
{
if (CPluginManager::GetInstance().GetWiimote())
CPluginManager::GetInstance().GetWiimote()->Wiimote_UnPairWiimotes();
}
#endif
CPluginManager::Shutdown();
SConfig::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);
// __________________________________________________________________________________________________
// 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
// Purpose: Get mask of attached pads (eg: controller 1 & 4 -> 0x9)

View File

@ -164,7 +164,7 @@ THREAD_RETURN XEventThread(void *pArg)
{
XEvent event;
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);
switch(event.type) {
case KeyPress:

View File

@ -105,12 +105,6 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle
case DLL_PROCESS_DETACH:
{
#ifdef _WIN32
if (g_Config.bUnpairRealWiimote){
WiiMoteReal::Shutdown();
WiiMoteReal::WiimotePairUp(true);
}
#endif
#if defined(HAVE_WX) && HAVE_WX
wxUninitialize();
#endif
@ -320,15 +314,7 @@ void Wiimote_Input(u16 _Key, u8 _UpDown)
*/
void Wiimote_InterruptChannel(int _number, u16 _channelID, const void* _pData, u32 _Size)
{
// Debugging
#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
// Decide where to send the message
if (WiiMoteEmu::WiiMapping[_number].Source <= 1)
WiiMoteEmu::InterruptChannel(_number, _channelID, _pData, _Size);
#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

View File

@ -87,7 +87,8 @@ Common::Event g_StartAutopairThread;
int stoprefresh = 0;
unsigned int PairUpTimer = 2000;
int PaiUpRefreshWiimote();
int PairUpRefreshWiimote(bool addwiimote);
int PairUpFindNewSlot(void);
THREAD_RETURN PairUp_ThreadFunc(void* arg);
THREAD_RETURN RunInvisibleMessageWindow_ThreadFunc(void* arg);
#endif
@ -648,8 +649,9 @@ THREAD_RETURN SafeCloseReadWiimote_ThreadFunc(void* arg)
return 0;
}
// WiiMote Pair-Up
#ifdef WIN32
// WiiMote Pair-Up, function will return amount of either new paired or unpaired devices
int WiimotePairUp(bool unpair)
{
HANDLE hRadios[256];
@ -763,6 +765,7 @@ int WiimotePairUp(bool unpair)
}
#ifdef HAVE_WIIUSE
// Listening for new installed wiimotes, and calling PaiUpRefreshWiimote() when found
LRESULT CALLBACK CallBackDeviceChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
@ -782,7 +785,7 @@ LRESULT CALLBACK CallBackDeviceChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
{
stoprefresh = 0;
PaiUpRefreshWiimote();
PairUpRefreshWiimote(true);
break;
}
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:
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;
}
@ -805,11 +808,12 @@ LRESULT CALLBACK CallBackDeviceChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
return 0;
}
// Generating a new invisible message window and listening for new messages
THREAD_RETURN RunInvisibleMessageWindow_ThreadFunc(void* arg)
{
MSG Msg;
HWND hwnd;
BOOL ret;
WNDCLASSEX 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
while(GetMessage(&Msg, 0, 0, 0) > 0)
while((ret = GetMessage(&Msg, 0, 0, 0)) != 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
if ( ret == -1) {
return 1;
}
else {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
UnregisterClass(WCEx.lpszClassName, g_hInstance);
if (g_Config.bUnpairRealWiimote)
WiiMoteReal::WiimotePairUp(true);
return (int)Msg.wParam;
}
int PaiUpRefreshWiimote()
// function gets called by windows callbacks if a wiimote was either installed or removed
int PairUpRefreshWiimote(bool addwiimote)
{
int connectslot = -1;
if (g_EmulatorState != PLUGIN_EMUSTATE_PLAY)
{
Shutdown();
@ -862,16 +870,32 @@ int PaiUpRefreshWiimote()
PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_PAUSE, 0);
while (g_EmulatorState == PLUGIN_EMUSTATE_PLAY) Sleep(50);
Shutdown();
if (addwiimote) {
connectslot = PairUpFindNewSlot();
}
Initialize();
Allocate();
PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_PAUSE, 0);
while (g_EmulatorState != PLUGIN_EMUSTATE_PLAY) Sleep(50);
if (addwiimote)
PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_KEYDOWN, (3 + connectslot));
}
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)
{
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;
}
// __________________________________________________________________________________________________
// 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
// Purpose: An L2CAP packet is passed from the Core to the Wiimote,