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:
parent
4ab0e4b8a0
commit
6e83fe2416
|
@ -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) &&
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue