@@ -27,10 +27,22 @@ namespace ams::controller {
27
27
SteelseriesDPad_SW,
28
28
SteelseriesDPad_W,
29
29
SteelseriesDPad_NW,
30
- SteelseriesDPad_Released = 0x0f
30
+ SteelseriesDPad_Released = 0x0f ,
31
31
};
32
-
33
- struct SteelseriesStickData {
32
+
33
+ enum SteelseriesDPadDirection2 {
34
+ SteelseriesDPad2_Released = 0x0 ,
35
+ SteelseriesDPad2_N,
36
+ SteelseriesDPad2_NE,
37
+ SteelseriesDPad2_E,
38
+ SteelseriesDPad2_SE,
39
+ SteelseriesDPad2_S,
40
+ SteelseriesDPad2_SW,
41
+ SteelseriesDPad2_W,
42
+ SteelseriesDPad2_NW,
43
+ };
44
+
45
+ struct SteelseriesStickData {
34
46
uint8_t x;
35
47
uint8_t y;
36
48
} __attribute__ ((__packed__));
@@ -51,6 +63,26 @@ namespace ams::controller {
51
63
uint8_t : 0 ;
52
64
} __attribute__ ((__packed__));
53
65
66
+ struct SteelseriesButtonData2 {
67
+ uint8_t A : 1 ;
68
+ uint8_t B : 1 ;
69
+ uint8_t : 1 ;
70
+ uint8_t X : 1 ;
71
+ uint8_t Y : 1 ;
72
+ uint8_t : 1 ;
73
+ uint8_t L1 : 1 ;
74
+ uint8_t R1 : 1 ;
75
+
76
+ uint8_t L2 : 1 ;
77
+ uint8_t R2 : 1 ;
78
+ uint8_t start : 1 ;
79
+ uint8_t select : 1 ;
80
+ uint8_t : 1 ;
81
+ uint8_t L3 : 1 ;
82
+ uint8_t R3 : 1 ;
83
+ uint8_t : 0 ;
84
+ } __attribute__ ((__packed__));
85
+
54
86
struct SteelseriesMfiButtonData {
55
87
uint8_t dpad_up;
56
88
uint8_t dpad_right;
@@ -71,23 +103,46 @@ namespace ams::controller {
71
103
72
104
struct SteelseriesMfiInputReport {
73
105
SteelseriesMfiButtonData buttons;
74
- SteelseriesStickData left_stick;
75
- SteelseriesStickData right_stick;
106
+ SteelseriesStickData left_stick;
107
+ SteelseriesStickData right_stick;
108
+ } __attribute__((packed));
109
+
110
+ struct SteelseriesInputReport0x01 {
111
+ uint8_t dpad;
112
+ SteelseriesStickData left_stick;
113
+ SteelseriesStickData right_stick;
114
+ SteelseriesButtonData buttons;
115
+ } __attribute__((packed));
116
+
117
+ struct SteelseriesInputReport0x12 {
118
+ uint8_t : 3 ;
119
+ uint8_t home : 1 ;
120
+ uint8_t : 0 ;
121
+
122
+ uint8_t _unk0[2 ];
123
+
124
+ uint8_t _unk1; // Maybe battery
125
+
76
126
} __attribute__((packed));
77
-
78
- struct SteelseriesInputReport0x01 {
79
- uint8_t dpad;
80
- SteelseriesStickData left_stick;
81
- SteelseriesStickData right_stick;
82
- SteelseriesButtonData buttons;
127
+
128
+ struct SteelseriesInputReport0xc4 {
129
+ SteelseriesStickData left_stick;
130
+ SteelseriesStickData right_stick;
131
+ uint8_t left_trigger;
132
+ uint8_t right_trigger;
133
+ SteelseriesButtonData2 buttons;
134
+ uint8_t dpad;
135
+ uint8_t _unk[2 ];
83
136
} __attribute__((packed));
84
-
85
- struct SteelseriesReportData {
137
+
138
+ struct SteelseriesReportData {
86
139
union {
87
140
struct {
88
141
uint8_t id;
89
142
union {
90
- SteelseriesInputReport0x01 input0x01;
143
+ SteelseriesInputReport0x01 input0x01;
144
+ SteelseriesInputReport0x12 input0x12;
145
+ SteelseriesInputReport0xc4 input0xc4;
91
146
};
92
147
};
93
148
@@ -98,18 +153,21 @@ namespace ams::controller {
98
153
class SteelseriesController : public EmulatedSwitchController {
99
154
100
155
public:
101
- static constexpr const HardwareID hardware_ids[] = {
156
+ static constexpr const HardwareID hardware_ids[] = {
102
157
{0x1038 , 0x1412 }, // Steelseries Free
103
- {0x0111 , 0x1420 } // Steelseries Nimbus
104
- };
158
+ {0x0111 , 0x1420 }, // Steelseries Nimbus
159
+ {0x0111 , 0x1431 } // Steelseries Stratus Duo
160
+ };
105
161
106
- SteelseriesController (const bluetooth::Address *address)
162
+ SteelseriesController (const bluetooth::Address *address)
107
163
: EmulatedSwitchController(address) { };
108
164
109
165
void UpdateControllerState (const bluetooth::HidReport *report);
110
166
111
167
private:
112
168
void HandleInputReport0x01 (const SteelseriesReportData *src);
169
+ void HandleInputReport0x12 (const SteelseriesReportData *src);
170
+ void HandleInputReport0xc4 (const SteelseriesReportData *src);
113
171
void HandleMfiInputReport (const SteelseriesReportData *src);
114
172
};
115
173
0 commit comments