-
Notifications
You must be signed in to change notification settings - Fork 2.6k
/
SI_DeviceGCAdapter.cpp
92 lines (76 loc) · 2.69 KB
/
SI_DeviceGCAdapter.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// Copyright 2008 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#include "Core/HW/SI/SI_DeviceGCAdapter.h"
#include <cstring>
#include "Common/CommonTypes.h"
#include "Common/Swap.h"
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "Core/HW/GCPad.h"
#include "Core/NetPlayProto.h"
#include "InputCommon/GCAdapter.h"
namespace SerialInterface
{
CSIDevice_GCAdapter::CSIDevice_GCAdapter(SIDevices device, int device_number)
: CSIDevice_GCController(device, device_number)
{
// Make sure PAD_GET_ORIGIN gets set due to a newly connected device.
GCAdapter::ResetDeviceType(m_device_number);
// get the correct pad number that should rumble locally when using netplay
const int pad_num = NetPlay_InGamePadToLocalPad(m_device_number);
if (pad_num < 4)
m_simulate_konga = SConfig::GetInstance().m_AdapterKonga[pad_num];
}
GCPadStatus CSIDevice_GCAdapter::GetPadStatus()
{
GCPadStatus pad_status = {};
// For netplay, the local controllers are polled in GetNetPads(), and
// the remote controllers receive their status there as well
if (!NetPlay::IsNetPlayRunning())
{
pad_status = GCAdapter::Input(m_device_number);
}
HandleMoviePadStatus(&pad_status);
// Our GCAdapter code sets PAD_GET_ORIGIN when a new device has been connected.
// Watch for this to calibrate real controllers on connection.
if (pad_status.button & PAD_GET_ORIGIN)
SetOrigin(pad_status);
return pad_status;
}
int CSIDevice_GCAdapter::RunBuffer(u8* buffer, int request_length)
{
if (!Core::WantsDeterminism())
{
// The previous check is a hack to prevent a desync due to SI devices
// being different and returning different values on RunBuffer();
// the corresponding code in GCAdapter.cpp has the same check.
// This returns an error value if there is no controller plugged
// into this port on the hardware gc adapter, exposing it to the game.
if (!GCAdapter::DeviceConnected(m_device_number))
{
u32 device = Common::swap32(SI_NONE);
memcpy(buffer, &device, sizeof(device));
return 4;
}
}
return CSIDevice_GCController::RunBuffer(buffer, request_length);
}
bool CSIDevice_GCAdapter::GetData(u32& hi, u32& low)
{
CSIDevice_GCController::GetData(hi, low);
if (m_simulate_konga)
{
hi &= CSIDevice_TaruKonga::HI_BUTTON_MASK;
}
return true;
}
void CSIDevice_GCController::Rumble(int pad_num, ControlState strength)
{
SIDevices device = SConfig::GetInstance().m_SIDevice[pad_num];
if (device == SIDEVICE_WIIU_ADAPTER)
GCAdapter::Output(pad_num, static_cast<u8>(strength));
else if (SIDevice_IsGCController(device))
Pad::Rumble(pad_num, strength);
}
} // namespace SerialInterface