Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/src/core/ddgo_controller.h
4223 views
1
// SPDX-FileCopyrightText: 2019-2025 Connor McLaughlin <[email protected]>
2
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
3
4
#pragma once
5
6
#include "controller.h"
7
8
#include <memory>
9
10
class DDGoController final : public Controller
11
{
12
public:
13
enum class Axis : u8
14
{
15
Count
16
};
17
18
enum class Bind : u8
19
{
20
Select = 0,
21
Start = 3,
22
A = 15,
23
B = 14,
24
C = 13,
25
PowerBit0 = 12,
26
PowerBit1 = 7,
27
PowerBit2 = 5,
28
BrakeBit0 = 10,
29
BrakeBit1 = 8,
30
BrakeBit2 = 11,
31
BrakeBit3 = 9,
32
33
// We have to sneak the power/brake axes in here because otherwise we go over the limit for the
34
// input overlay, which is 32 bindings.
35
Power = 1,
36
Brake = 2,
37
38
VirtualButtonStart = 16,
39
VirtualPowerOff = VirtualButtonStart,
40
VirtualPower1,
41
VirtualPower2,
42
VirtualPower3,
43
VirtualPower4,
44
VirtualPower5,
45
VirtualBrakeReleased,
46
VirtualBrake1,
47
VirtualBrake2,
48
VirtualBrake3,
49
VirtualBrake4,
50
VirtualBrake5,
51
VirtualBrake6,
52
VirtualBrake7,
53
VirtualBrake8,
54
VirtualBrakeEmergency,
55
Count,
56
};
57
58
static const Controller::ControllerInfo INFO;
59
60
explicit DDGoController(u32 index);
61
~DDGoController() override;
62
63
static std::unique_ptr<DDGoController> Create(u32 index);
64
65
ControllerType GetType() const override;
66
67
void Reset() override;
68
bool DoState(StateWrapper& sw, bool apply_input_state) override;
69
70
float GetBindState(u32 index) const override;
71
void SetBindState(u32 index, float value) override;
72
u32 GetButtonStateBits() const override;
73
74
void ResetTransferState() override;
75
bool Transfer(const u8 data_in, u8* data_out) override;
76
77
void LoadSettings(const SettingsInterface& si, const char* section, bool initial) override;
78
79
private:
80
enum class TransferState : u8
81
{
82
Idle,
83
Ready,
84
IDMSB,
85
ButtonsLSB,
86
ButtonsMSB
87
};
88
89
static constexpr u16 BUTTON_MASK = static_cast<u16>(~((1u << 4) | (1u << 6)));
90
91
static constexpr u16 POWER_MASK =
92
static_cast<u16>((1u << static_cast<u32>(Bind::PowerBit0)) | (1u << static_cast<u32>(Bind::PowerBit1)) |
93
(1u << static_cast<u32>(Bind::PowerBit2)));
94
95
static constexpr u16 BRAKE_MASK =
96
static_cast<u16>((1u << static_cast<u32>(Bind::BrakeBit0)) | (1u << static_cast<u32>(Bind::BrakeBit1)) |
97
(1u << static_cast<u32>(Bind::BrakeBit2)) | (1u << static_cast<u32>(Bind::BrakeBit3)));
98
99
static constexpr u32 MAX_POWER_LEVEL = 5;
100
static constexpr u32 MAX_BRAKE_LEVEL = 9;
101
102
void SetPowerLevel(u32 level);
103
void UpdatePowerBits();
104
105
void SetBrakeLevel(u32 level);
106
void UpdateBrakeBits();
107
108
// buttons are active low
109
u16 m_button_state = UINT16_C(0xFFFF);
110
111
TransferState m_transfer_state = TransferState::Idle;
112
113
u8 m_power_level = 0;
114
u8 m_brake_level = MAX_BRAKE_LEVEL;
115
116
u8 m_power_transition_frames_remaining = 0;
117
u8 m_brake_transition_frames_remaining = 0;
118
119
u8 m_power_transition_frames = 10;
120
u8 m_brake_transition_frames = 10;
121
122
float m_analog_deadzone = 0.0f;
123
float m_analog_sensitivity = 1.33f;
124
};
125
126