summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorskidau <skidau@gmail.com>2015-03-09 17:07:15 +1100
committerskidau <skidau@gmail.com>2015-03-09 17:07:15 +1100
commitd7e54c36f148f46ff944d1feb712c5844bb281eb (patch)
tree4983459cc8094a502240a37f1738ab80163dd5cb /Source/Core
parentd92efc4a3e3fb78f253e10dfd14b9abf2ff5a36d (diff)
Calibrated the GCPad even if the game does not explicitly do so.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/HW/SI_DeviceGCController.cpp36
-rw-r--r--Source/Core/Core/HW/SI_DeviceGCController.h5
-rw-r--r--Source/Core/Core/State.cpp2
3 files changed, 29 insertions, 14 deletions
diff --git a/Source/Core/Core/HW/SI_DeviceGCController.cpp b/Source/Core/Core/HW/SI_DeviceGCController.cpp
index 4e923c1f21..ebb03fce54 100644
--- a/Source/Core/Core/HW/SI_DeviceGCController.cpp
+++ b/Source/Core/Core/HW/SI_DeviceGCController.cpp
@@ -26,6 +26,23 @@ CSIDevice_GCController::CSIDevice_GCController(SIDevices device, int _iDeviceNum
{
// Dunno if we need to do this, game/lib should set it?
m_Mode = 0x03;
+
+ m_Calibrated = false;
+}
+
+void CSIDevice_GCController::Calibrate()
+{
+ GCPadStatus pad_origin = GetPadStatus();
+ memset(&m_Origin, 0, sizeof(SOrigin));
+ m_Origin.uButton = pad_origin.button;
+ m_Origin.uOriginStickX = pad_origin.stickX;
+ m_Origin.uOriginStickY = pad_origin.stickY;
+ m_Origin.uSubStickStickX = pad_origin.substickX;
+ m_Origin.uSubStickStickY = pad_origin.substickY;
+ m_Origin.uTrigger_L = pad_origin.triggerLeft;
+ m_Origin.uTrigger_R = pad_origin.triggerRight;
+
+ m_Calibrated = true;
}
int CSIDevice_GCController::RunBuffer(u8* _pBuffer, int _iLength)
@@ -61,19 +78,7 @@ int CSIDevice_GCController::RunBuffer(u8* _pBuffer, int _iLength)
{
INFO_LOG(SERIALINTERFACE, "PAD - Get Origin");
- GCPadStatus pad_origin;
- memset(&m_Origin, 0, sizeof(SOrigin));
- memset(&pad_origin, 0, sizeof(GCPadStatus));
-
- pad_origin = GetPadStatus();
-
- m_Origin.uButton = pad_origin.button;
- m_Origin.uOriginStickX = pad_origin.stickX;
- m_Origin.uOriginStickY = pad_origin.stickY;
- m_Origin.uSubStickStickX = pad_origin.substickX;
- m_Origin.uSubStickStickY = pad_origin.substickY;
- m_Origin.uTrigger_L = pad_origin.triggerLeft;
- m_Origin.uTrigger_R = pad_origin.triggerRight;
+ Calibrate();
u8* pCalibration = reinterpret_cast<u8*>(&m_Origin);
for (int i = 0; i < (int)sizeof(SOrigin); i++)
@@ -87,6 +92,10 @@ int CSIDevice_GCController::RunBuffer(u8* _pBuffer, int _iLength)
case CMD_RECALIBRATE:
{
INFO_LOG(SERIALINTERFACE, "PAD - Recalibrate");
+
+ if (!m_Calibrated)
+ Calibrate();
+
u8* pCalibration = reinterpret_cast<u8*>(&m_Origin);
for (int i = 0; i < (int)sizeof(SOrigin); i++)
{
@@ -306,6 +315,7 @@ void CSIDevice_GCController::SendCommand(u32 _Cmd, u8 _Poll)
// Savestate support
void CSIDevice_GCController::DoState(PointerWrap& p)
{
+ p.Do(m_Calibrated);
p.Do(m_Origin);
p.Do(m_Mode);
p.Do(m_TButtonComboStart);
diff --git a/Source/Core/Core/HW/SI_DeviceGCController.h b/Source/Core/Core/HW/SI_DeviceGCController.h
index 9b44c2cfe5..7dcdaa4263 100644
--- a/Source/Core/Core/HW/SI_DeviceGCController.h
+++ b/Source/Core/Core/HW/SI_DeviceGCController.h
@@ -66,6 +66,8 @@ protected:
// Set on connection and (standard pad only) on button combo
SOrigin m_Origin;
+ bool m_Calibrated;
+
// PADAnalogMode
u8 m_Mode;
@@ -101,6 +103,9 @@ public:
// Savestate support
virtual void DoState(PointerWrap& p) override;
+
+private:
+ void Calibrate();
};
diff --git a/Source/Core/Core/State.cpp b/Source/Core/Core/State.cpp
index 16a86a9c15..41461fba36 100644
--- a/Source/Core/Core/State.cpp
+++ b/Source/Core/Core/State.cpp
@@ -64,7 +64,7 @@ static Common::Event g_compressAndDumpStateSyncEvent;
static std::thread g_save_thread;
// Don't forget to increase this after doing changes on the savestate system
-static const u32 STATE_VERSION = 40;
+static const u32 STATE_VERSION = 41;
enum
{