From ff23c027953f3c73c60684ea97078b18ef0993d1 Mon Sep 17 00:00:00 2001 From: ayuanx Date: Sat, 28 Nov 2009 18:00:07 +0000 Subject: [PATCH] Now "Wiimote/Nunchunk Shake" on Keyboard works(for Win only). Just press the "Shake" key. The shake involves all the three axes: X, Y, Z. So when you press the shake key, you are actually shaking not only up-down, left-right, and forward-backward at the same time. I did this becuse different games may require different directional shake, no need to seperate them to 3 keys I think. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4624 8ced0084-cf51-0410-be5f-012b33b47a6e --- .../Src/IPC_HLE/WII_IPC_HLE_Device_Error.h | 10 ++- Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp | 2 +- .../Plugins/Plugin_Wiimote/Src/FillReport.cpp | 68 +++++++------------ 3 files changed, 35 insertions(+), 45 deletions(-) diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_Error.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_Error.h index 1da68376b1..3fc2f97234 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_Error.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_Error.h @@ -34,11 +34,17 @@ public: virtual bool Open(u32 _CommandAddress, u32 _Mode) { //PanicAlert("CWII_IPC_HLE_Device_Error"); - //Memory::Write_U32(GetDeviceID(), _CommandAddress+4); - Memory::Write_U32(0, _CommandAddress+4); + Memory::Write_U32(GetDeviceID(), _CommandAddress + 4); m_Active = true; return true; } + + virtual bool Close(u32 _CommandAddress) + { + Memory::Write_U32(0, _CommandAddress + 4); + m_Active = false; + return true; + } }; #endif diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp index 1a2d110607..fea287002a 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp @@ -296,7 +296,7 @@ void UpdateEeprom() g_wm.cal_zero.y = g_Eeprom[23]; g_wm.cal_zero.z = g_Eeprom[24]; g_wm.cal_g.x = g_Eeprom[26] - g_Eeprom[22]; - g_wm.cal_g.y = g_Eeprom[27] - g_Eeprom[24]; + g_wm.cal_g.y = g_Eeprom[27] - g_Eeprom[23]; g_wm.cal_g.z = g_Eeprom[28] - g_Eeprom[24]; INFO_LOG(WIIMOTE, "UpdateEeprom: %i %i %i", diff --git a/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp b/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp index a54e7a866a..851cc529a5 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/FillReport.cpp @@ -396,37 +396,40 @@ void FillReportInfo(wm_core& _core) // For all functions u8 g_x, g_y, g_z, g_X, g_Y, g_Z; -// For the shake function, 0 = Wiimote, 1 = Nunchuck -int Shake[] = {-1, -1}; +// For the shake function, Wiimote: wm = 0, Nunchuck: wm = 1 +int Shake[] = {0, 0}; // For the tilt function, the size of this list determines how fast Y returns to its neutral value std::vector yhist(15, 0); float KbDegree; -// Single shake of Wiimote while holding it sideways (Wario Land pound ground) -void SingleShake(u8 &_y, u8 &_z, int i) +// Single shake of all three directions +void SingleShake(u8 &_x, u8 &_y, u8 &_z, int wm) { #ifdef _WIN32 - // Shake Wiimote with S, Nunchuck with D - if((i == 0 && IsKey(g_Wiimote_kbd.SHAKE)) || (i == 1 && IsKey(g_NunchuckExt.SHAKE))) + if(Shake[wm] == 1) { - _z = 0; - _y = 0; - Shake[i] = 2; + _x = 0x00; + _y = 0x00; + _z = 0x00; + Shake[wm] = -1; } - else if(Shake[i] == 2) + else if((wm == 0 && IsKey(g_Wiimote_kbd.SHAKE)) || (wm == 1 && IsKey(g_NunchuckExt.SHAKE))) { - // This works regardless of calibration, in Wario Land - _z = g_wm.cal_zero.z - 2; - _y = 0; - Shake[i] = 1; + _x = 0xFF; + _y = 0xFF; + _z = 0xFF; + Shake[wm] = 1; } - else if(Shake[i] == 1) + else { - Shake[i] = -1; + _x = g_wm.cal_zero.x; + _y = g_wm.cal_zero.y; + _z = g_wm.cal_zero.z + g_wm.cal_g.z; + Shake[wm] = 0; } #endif - //if (Shake[i] > -1) DEBUG_LOG(WIIMOTE, "Shake: %i", Shake[i]); + //if (Shake[wm] != 0) DEBUG_LOG(WIIMOTE, "Shake: %i - 0x%02x, 0x%02x, 0x%02x", Shake[wm], _x, _y, _z); } @@ -597,39 +600,20 @@ void FillReportAcc(wm_accel& _acc) //DEBUG_LOG(WIIMOTE, "X, Y, Z: %u %u %u", _acc.x, _acc.y, _acc.z); } - // The default values can change so we need to update them all the time - g_X = g_wm.cal_zero.x; - g_Y = g_wm.cal_zero.y; - g_Z = g_wm.cal_zero.z + g_wm.cal_g.z; - - // Check that Dolphin is in focus if (!IsFocus()) { - _acc.x = g_X; - _acc.y = g_y; - _acc.z = g_z; + _acc.x = g_wm.cal_zero.x; + _acc.y = g_wm.cal_zero.y; + _acc.z = g_wm.cal_zero.z + g_wm.cal_g.z; return; } - // Wiimote to Gamepad translations - - // The following functions may or may not update these values - g_x = g_X; - g_y = g_Y; - g_z = g_Z; - // Shake the Wiimote - SingleShake(g_y, g_z, 0); + SingleShake(_acc.x, _acc.y, _acc.z, 0); // Tilt Wiimote, allow the shake function to interrupt it - if (Shake[0] == -1) Tilt(g_x, g_y, g_z); - - // Write final values - _acc.x = g_x; - _acc.y = g_y; - _acc.z = g_z; - + if (Shake[0] == 0) Tilt(_acc.x, _acc.y, _acc.z); // Debugging for translating Wiimote to Keyboard (or Gamepad) /* @@ -899,7 +883,7 @@ void FillReportExtension(wm_extension& _ext) } // Shake the Wiimote - SingleShake(_ext.ay, _ext.az, 1); + SingleShake(_ext.ax, _ext.ay, _ext.az, 1); // The default joystick and button values unless we use them _ext.jx = g_nu.jx.center;