48
48
#include "io.h"
49
49
50
50
static void fix_bad_calibration_values (struct joystick_t * js , short right_stick );
51
- static void classic_ctrl_pressed_buttons (struct classic_ctrl_t * cc , short now );
51
+ static void classic_ctrl_pressed_buttons (struct classic_ctrl_t * cc , ubyte * now );
52
52
53
53
/**
54
54
* @brief Handle the handshake data from the classic controller.
@@ -81,7 +81,7 @@ int classic_ctrl_handshake(struct wiimote_t* wm, struct classic_ctrl_t* cc, ubyt
81
81
82
82
cc -> rjs = cc -> ljs ;
83
83
84
- cc -> type = 2 ;
84
+ cc -> type = CLASSIC_TYPE_WIIU ;
85
85
}
86
86
else {
87
87
if (data [offset ] == 0xFF ) {
@@ -102,9 +102,9 @@ int classic_ctrl_handshake(struct wiimote_t* wm, struct classic_ctrl_t* cc, ubyt
102
102
}
103
103
104
104
if (len > 218 && data [218 ])
105
- cc -> type = 1 ; /* classic controller pro (no analog triggers) */
105
+ cc -> type = CLASSIC_TYPE_PRO ;
106
106
else
107
- cc -> type = 0 ; /* original classic controller (analog triggers) */
107
+ cc -> type = CLASSIC_TYPE_ORIG ;
108
108
109
109
/* joystick stuff */
110
110
cc -> ljs .max .x = data [0 + offset ] / 4 == 0 ? 64 : data [0 + offset ] / 4 ;
@@ -124,6 +124,7 @@ int classic_ctrl_handshake(struct wiimote_t* wm, struct classic_ctrl_t* cc, ubyt
124
124
fix_bad_calibration_values (& cc -> ljs , 0 );
125
125
fix_bad_calibration_values (& cc -> rjs , 1 );
126
126
}
127
+
127
128
/* handshake done */
128
129
wm -> event = WIIUSE_CLASSIC_CTRL_INSERTED ;
129
130
wm -> exp .type = EXP_CLASSIC ;
@@ -162,8 +163,8 @@ void classic_ctrl_event(struct classic_ctrl_t* cc, ubyte* msg) {
162
163
for (i = 0; i < 6; ++i)
163
164
msg[i] = (msg[i] ^ 0x17) + 0x17;
164
165
*/
165
- if (cc -> type == 2 ) {
166
- classic_ctrl_pressed_buttons (cc , BIG_ENDIAN_SHORT ( * ( short * )( msg + 8 )) );
166
+ if (cc -> type == CLASSIC_TYPE_WIIU ) {
167
+ classic_ctrl_pressed_buttons (cc , msg + 8 );
167
168
168
169
/* 12-bit little endian values adjusted to 8-bit */
169
170
cc -> ljs .pos .x = (msg [0 ] >> 4 ) | (msg [1 ] << 4 );
@@ -173,11 +174,16 @@ void classic_ctrl_event(struct classic_ctrl_t* cc, ubyte* msg) {
173
174
174
175
cc -> ls_raw = cc -> btns & CLASSIC_CTRL_BUTTON_FULL_L ? 0x1F : 0 ;
175
176
cc -> rs_raw = cc -> btns & CLASSIC_CTRL_BUTTON_FULL_R ? 0x1F : 0 ;
177
+
178
+ /* Wii U pro controller specific data */
179
+ cc -> charging = !(((msg [10 ] & WII_U_PRO_CTRL_CHARGING ) >> 2 ) & 1 );
180
+ cc -> wired = !(((msg [10 ] & WII_U_PRO_CTRL_WIRED ) >> 3 ) & 1 );
181
+ cc -> battery = ((msg [10 ] & WII_U_PRO_CTRL_BATTERY ) >> 4 ) & 7 ;
176
182
}
177
183
else {
178
- classic_ctrl_pressed_buttons (cc , BIG_ENDIAN_SHORT ( * ( short * )( msg + 4 )) );
184
+ classic_ctrl_pressed_buttons (cc , msg + 4 );
179
185
180
- /* left/right buttons */
186
+ /* left/right triggers */
181
187
cc -> ls_raw = (((msg [2 ] & 0x60 ) >> 2 ) | ((msg [3 ] & 0xE0 ) >> 5 ));
182
188
cc -> rs_raw = (msg [3 ] & 0x1F );
183
189
@@ -194,6 +200,11 @@ void classic_ctrl_event(struct classic_ctrl_t* cc, ubyte* msg) {
194
200
cc -> ljs .pos .y = (msg [1 ] & 0x3F );
195
201
cc -> rjs .pos .x = ((msg [0 ] & 0xC0 ) >> 3 ) | ((msg [1 ] & 0xC0 ) >> 5 ) | ((msg [2 ] & 0x80 ) >> 7 );
196
202
cc -> rjs .pos .y = (msg [2 ] & 0x1F );
203
+
204
+ /* wipe Wii U pro controller specific data */
205
+ cc -> charging = 0 ;
206
+ cc -> wired = 0 ;
207
+ cc -> battery = 0 ;
197
208
}
198
209
199
210
#ifndef GEKKO
@@ -221,19 +232,29 @@ static void fix_bad_calibration_values(struct joystick_t* js, short right_stick)
221
232
* @param cc A pointer to a classic_ctrl_t structure.
222
233
* @param msg The message byte specified in the event packet.
223
234
*/
224
- static void classic_ctrl_pressed_buttons (struct classic_ctrl_t * cc , short now ) {
225
- /* message is inverted (0 is active, 1 is inactive) */
226
- now = ~now & CLASSIC_CTRL_BUTTON_ALL ;
235
+ static void classic_ctrl_pressed_buttons (struct classic_ctrl_t * cc , ubyte * now ) {
236
+ u32 buttons = (now [0 ] << 0x8 ) | now [1 ];
237
+
238
+ if (cc -> type == CLASSIC_TYPE_WIIU ) {
239
+ /* append Wii U Pro Controller stick buttons to top 16 bits */
240
+ buttons |= (now [2 ] << 0x10 );
241
+
242
+ /* message is inverted (0 is active, 1 is inactive) */
243
+ buttons = ~buttons & WII_U_PRO_CTRL_BUTTON_ALL ;
244
+ } else {
245
+ /* message is inverted (0 is active, 1 is inactive) */
246
+ buttons = ~buttons & CLASSIC_CTRL_BUTTON_ALL ;
247
+ }
227
248
228
249
/* preserve old btns pressed */
229
250
cc -> btns_last = cc -> btns ;
230
251
231
252
/* pressed now & were pressed, then held */
232
- cc -> btns_held = (now & cc -> btns );
253
+ cc -> btns_held = (buttons & cc -> btns );
233
254
234
255
/* were pressed or were held & not pressed now, then released */
235
- cc -> btns_released = ((cc -> btns | cc -> btns_held ) & ~now );
256
+ cc -> btns_released = ((cc -> btns | cc -> btns_held ) & ~buttons );
236
257
237
258
/* buttons pressed now */
238
- cc -> btns = now ;
259
+ cc -> btns = buttons ;
239
260
}
0 commit comments