4848#include "io.h"
4949
5050static 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 );
5252
5353/**
5454 * @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
8181
8282 cc -> rjs = cc -> ljs ;
8383
84- cc -> type = 2 ;
84+ cc -> type = CLASSIC_TYPE_WIIU ;
8585 }
8686 else {
8787 if (data [offset ] == 0xFF ) {
@@ -102,9 +102,9 @@ int classic_ctrl_handshake(struct wiimote_t* wm, struct classic_ctrl_t* cc, ubyt
102102 }
103103
104104 if (len > 218 && data [218 ])
105- cc -> type = 1 ; /* classic controller pro (no analog triggers) */
105+ cc -> type = CLASSIC_TYPE_PRO ;
106106 else
107- cc -> type = 0 ; /* original classic controller (analog triggers) */
107+ cc -> type = CLASSIC_TYPE_ORIG ;
108108
109109 /* joystick stuff */
110110 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
124124 fix_bad_calibration_values (& cc -> ljs , 0 );
125125 fix_bad_calibration_values (& cc -> rjs , 1 );
126126 }
127+
127128 /* handshake done */
128129 wm -> event = WIIUSE_CLASSIC_CTRL_INSERTED ;
129130 wm -> exp .type = EXP_CLASSIC ;
@@ -162,8 +163,8 @@ void classic_ctrl_event(struct classic_ctrl_t* cc, ubyte* msg) {
162163 for (i = 0; i < 6; ++i)
163164 msg[i] = (msg[i] ^ 0x17) + 0x17;
164165 */
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 );
167168
168169 /* 12-bit little endian values adjusted to 8-bit */
169170 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) {
173174
174175 cc -> ls_raw = cc -> btns & CLASSIC_CTRL_BUTTON_FULL_L ? 0x1F : 0 ;
175176 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 ;
176182 }
177183 else {
178- classic_ctrl_pressed_buttons (cc , BIG_ENDIAN_SHORT ( * ( short * )( msg + 4 )) );
184+ classic_ctrl_pressed_buttons (cc , msg + 4 );
179185
180- /* left/right buttons */
186+ /* left/right triggers */
181187 cc -> ls_raw = (((msg [2 ] & 0x60 ) >> 2 ) | ((msg [3 ] & 0xE0 ) >> 5 ));
182188 cc -> rs_raw = (msg [3 ] & 0x1F );
183189
@@ -194,6 +200,11 @@ void classic_ctrl_event(struct classic_ctrl_t* cc, ubyte* msg) {
194200 cc -> ljs .pos .y = (msg [1 ] & 0x3F );
195201 cc -> rjs .pos .x = ((msg [0 ] & 0xC0 ) >> 3 ) | ((msg [1 ] & 0xC0 ) >> 5 ) | ((msg [2 ] & 0x80 ) >> 7 );
196202 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 ;
197208 }
198209
199210#ifndef GEKKO
@@ -221,19 +232,29 @@ static void fix_bad_calibration_values(struct joystick_t* js, short right_stick)
221232 * @param cc A pointer to a classic_ctrl_t structure.
222233 * @param msg The message byte specified in the event packet.
223234 */
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+ }
227248
228249 /* preserve old btns pressed */
229250 cc -> btns_last = cc -> btns ;
230251
231252 /* pressed now & were pressed, then held */
232- cc -> btns_held = (now & cc -> btns );
253+ cc -> btns_held = (buttons & cc -> btns );
233254
234255 /* 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 );
236257
237258 /* buttons pressed now */
238- cc -> btns = now ;
259+ cc -> btns = buttons ;
239260}
0 commit comments