From 542e7ba1588d542ac69f39f94414510a81760884 Mon Sep 17 00:00:00 2001 From: mathieui Date: Fri, 22 Apr 2016 20:30:43 +0200 Subject: [PATCH] Make a generic rumble function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Call the appropriate rumble function for each SI Device, Should fix #9331. Ideally we wouldn’t have to do this, but since the way things are wired, fixing the root cause it out of the picture for now. --- Source/Core/Core/HW/SI_DeviceGCAdapter.cpp | 47 +++---------------- Source/Core/Core/HW/SI_DeviceGCAdapter.h | 1 - Source/Core/Core/HW/SI_DeviceGCController.cpp | 4 +- Source/Core/Core/HW/SI_DeviceGCController.h | 4 ++ 4 files changed, 13 insertions(+), 43 deletions(-) diff --git a/Source/Core/Core/HW/SI_DeviceGCAdapter.cpp b/Source/Core/Core/HW/SI_DeviceGCAdapter.cpp index 718091dca7..c9b766c467 100644 --- a/Source/Core/Core/HW/SI_DeviceGCAdapter.cpp +++ b/Source/Core/Core/HW/SI_DeviceGCAdapter.cpp @@ -8,6 +8,7 @@ #include "Common/MsgHandler.h" #include "Common/Logging/Log.h" #include "Core/ConfigManager.h" +#include "Core/HW/GCPad.h" #include "Core/HW/SI_DeviceGCAdapter.h" #include "InputCommon/GCAdapter.h" @@ -32,45 +33,11 @@ GCPadStatus CSIDevice_GCAdapter::GetPadStatus() return PadStatus; } -void CSIDevice_GCAdapter::SendCommand(u32 _Cmd, u8 _Poll) +void CSIDevice_GCController::Rumble(u8 numPad, ControlState strength) { - UCommand command(_Cmd); - - switch (command.Command) - { - // Costis sent it in some demos :) - case 0x00: - break; - - case CMD_WRITE: - { - unsigned int uType = command.Parameter1; // 0 = stop, 1 = rumble, 2 = stop hard - unsigned int uStrength = command.Parameter2; - - // get the correct pad number that should rumble locally when using netplay - const u8 numPAD = NetPlay_InGamePadToLocalPad(ISIDevice::m_iDeviceNumber); - - if (numPAD < 4) - { - if (uType == 1 && uStrength > 2) - GCAdapter::Output(numPAD, 1); - else - GCAdapter::Output(numPAD, 0); - } - if (!_Poll) - { - m_Mode = command.Parameter2; - INFO_LOG(SERIALINTERFACE, "PAD %i set to mode %i", ISIDevice::m_iDeviceNumber, m_Mode); - } - } - break; - - default: - { - ERROR_LOG(SERIALINTERFACE, "Unknown direct command (0x%x)", _Cmd); - PanicAlert("SI: Unknown direct command"); - } - break; - } + SIDevices device = SConfig::GetInstance().m_SIDevice[numPad]; + if (device == SIDEVICE_WIIU_ADAPTER) + GCAdapter::Output(numPad, static_cast(strength)); + else if (SIDevice_IsGCController(device)) + Pad::Rumble(numPad, strength); } - diff --git a/Source/Core/Core/HW/SI_DeviceGCAdapter.h b/Source/Core/Core/HW/SI_DeviceGCAdapter.h index 17d59e8126..16b94bf2ff 100644 --- a/Source/Core/Core/HW/SI_DeviceGCAdapter.h +++ b/Source/Core/Core/HW/SI_DeviceGCAdapter.h @@ -14,5 +14,4 @@ public: CSIDevice_GCAdapter(SIDevices device, int _iDeviceNumber); GCPadStatus GetPadStatus() override; - void SendCommand(u32 _Cmd, u8 _Poll) override; }; diff --git a/Source/Core/Core/HW/SI_DeviceGCController.cpp b/Source/Core/Core/HW/SI_DeviceGCController.cpp index b184d4ca4d..a6c25f689a 100644 --- a/Source/Core/Core/HW/SI_DeviceGCController.cpp +++ b/Source/Core/Core/HW/SI_DeviceGCController.cpp @@ -290,9 +290,9 @@ void CSIDevice_GCController::SendCommand(u32 _Cmd, u8 _Poll) if (numPAD < 4) { if (uType == 1 && uStrength > 2) - Pad::Rumble(numPAD, 1.0); + CSIDevice_GCController::Rumble(numPAD, 1.0); else - Pad::Rumble(numPAD, 0.0); + CSIDevice_GCController::Rumble(numPAD, 0.0); } if (!_Poll) diff --git a/Source/Core/Core/HW/SI_DeviceGCController.h b/Source/Core/Core/HW/SI_DeviceGCController.h index ca772131dc..836b2182db 100644 --- a/Source/Core/Core/HW/SI_DeviceGCController.h +++ b/Source/Core/Core/HW/SI_DeviceGCController.h @@ -4,6 +4,7 @@ #pragma once +#include "Core/HW/GCPad.h" #include "Core/HW/SI_Device.h" #include "InputCommon/GCPadStatus.h" @@ -107,6 +108,9 @@ public: static bool NetPlay_GetInput(u8 numPAD, GCPadStatus* status); static u8 NetPlay_InGamePadToLocalPad(u8 numPAD); + // Direct rumble to the right GC Controller + static void Rumble(u8 numPad, ControlState strength); + protected: void Calibrate(); void HandleMoviePadStatus(GCPadStatus* PadStatus);