11#include < utils/InputUtils.h>
22
33void Input::read () {
4- VPADRead (VPAD_CHAN_0, &vpad_status, 1 , &vpad_error);
5- if (vpad_error != VPAD_READ_SUCCESS)
6- memset (&vpad_status, 0 , sizeof (VPADStatus));
7-
8- memset (&kpad_status, 0 , sizeof (KPADStatus));
9- WPADExtensionType controllerType;
10- for (int i = 0 ; i < 4 ; i++) {
11- if (WPADProbe ((WPADChan) i, &controllerType) == 0 ) {
12- KPADRead ((WPADChan) i, &kpad_status, 1 );
13- break ;
14- }
15- }
4+ VPADRead (VPAD_CHAN_0, &vpad_status, 1 , nullptr );
5+ KPADRead (WPAD_CHAN_0, &kpad_status, 1 );
166}
177
188bool Input::get (ButtonState state, Button button) const {
19- uint32_t vpadState = 0 ;
20- uint32_t kpadState = 0 ;
9+ uint32_t vpadState = 0 ;
10+ uint32_t kpadCoreState = 0 ;
2111 uint32_t kpadClassicState = 0 ;
22- uint32_t kpadProState = 0 ;
12+ uint32_t kpadNunchukState = 0 ;
13+ uint32_t kpadProState = 0 ;
2314
24- switch (state) {
25- case TRIGGER:
26- vpadState = vpad_status.trigger ;
27- kpadState = kpad_status.trigger ;
28- kpadClassicState = kpad_status.classic .trigger ;
29- kpadProState = kpad_status.pro .trigger ;
30- break ;
31- case HOLD:
32- vpadState = vpad_status.hold ;
33- kpadState = kpad_status.hold ;
34- kpadClassicState = kpad_status.classic .hold ;
35- kpadProState = kpad_status.pro .hold ;
36- break ;
37- case RELEASE:
38- vpadState = vpad_status.release ;
39- kpadState = kpad_status.release ;
40- kpadClassicState = kpad_status.classic .release ;
41- kpadProState = kpad_status.pro .release ;
42- break ;
43- }
44- if ((vpadState != 0 ) || (kpadState != 0 ) || (kpadClassicState != 0 ) || (kpadProState != 0 )) {
45- switch (button) {
46- case PAD_BUTTON_A:
47- if (vpadState & VPAD_BUTTON_A) return true ;
48- if (kpadState & WPAD_BUTTON_A) return true ;
49- if (kpadClassicState & WPAD_CLASSIC_BUTTON_A) return true ;
50- if (kpadProState & WPAD_PRO_BUTTON_A) return true ;
51- break ;
52- case PAD_BUTTON_B:
53- if (vpadState & VPAD_BUTTON_B) return true ;
54- if (kpadState & WPAD_BUTTON_B) return true ;
55- if (kpadClassicState & WPAD_CLASSIC_BUTTON_B) return true ;
56- if (kpadProState & WPAD_PRO_BUTTON_B) return true ;
57- break ;
58- case PAD_BUTTON_X:
59- if (vpadState & VPAD_BUTTON_X) return true ;
60- if (kpadState & WPAD_BUTTON_1) return true ;
61- if (kpadClassicState & WPAD_CLASSIC_BUTTON_X) return true ;
62- if (kpadProState & WPAD_PRO_BUTTON_X) return true ;
63- break ;
64- case PAD_BUTTON_Y:
65- if (vpadState & VPAD_BUTTON_Y) return true ;
66- if (kpadState & WPAD_BUTTON_2) return true ;
67- if (kpadClassicState & WPAD_CLASSIC_BUTTON_Y) return true ;
68- if (kpadProState & WPAD_PRO_BUTTON_Y) return true ;
69- break ;
70- case PAD_BUTTON_UP:
71- if (vpadState & VPAD_BUTTON_UP) return true ;
72- if (vpadState & VPAD_STICK_L_EMULATION_UP) return true ;
73- if (kpadState & WPAD_BUTTON_UP) return true ;
74- if (kpadClassicState & WPAD_CLASSIC_BUTTON_UP) return true ;
75- if (kpadClassicState & WPAD_CLASSIC_STICK_L_EMULATION_UP) return true ;
76- if (kpadProState & WPAD_PRO_BUTTON_UP) return true ;
77- if (kpadProState & WPAD_PRO_STICK_L_EMULATION_UP) return true ;
78- break ;
79- case PAD_BUTTON_DOWN:
80- if (vpadState & VPAD_BUTTON_DOWN) return true ;
81- if (vpadState & VPAD_STICK_L_EMULATION_DOWN) return true ;
82- if (kpadState & WPAD_BUTTON_DOWN) return true ;
83- if (kpadClassicState & WPAD_CLASSIC_BUTTON_DOWN) return true ;
84- if (kpadClassicState & WPAD_CLASSIC_STICK_L_EMULATION_DOWN) return true ;
85- if (kpadProState & WPAD_PRO_BUTTON_DOWN) return true ;
86- if (kpadProState & WPAD_PRO_STICK_L_EMULATION_DOWN) return true ;
87- break ;
88- case PAD_BUTTON_LEFT:
89- if (vpadState & VPAD_BUTTON_LEFT) return true ;
90- if (vpadState & VPAD_STICK_L_EMULATION_LEFT) return true ;
91- if (kpadState & WPAD_BUTTON_LEFT) return true ;
92- if (kpadClassicState & WPAD_CLASSIC_BUTTON_LEFT) return true ;
93- if (kpadClassicState & WPAD_CLASSIC_STICK_L_EMULATION_LEFT) return true ;
94- if (kpadProState & WPAD_PRO_BUTTON_LEFT) return true ;
95- if (kpadProState & WPAD_PRO_STICK_L_EMULATION_LEFT) return true ;
96- break ;
97- case PAD_BUTTON_RIGHT:
98- if (vpadState & VPAD_BUTTON_RIGHT) return true ;
99- if (vpadState & VPAD_STICK_L_EMULATION_RIGHT) return true ;
100- if (kpadState & WPAD_BUTTON_RIGHT) return true ;
101- if (kpadClassicState & WPAD_CLASSIC_BUTTON_RIGHT) return true ;
102- if (kpadClassicState & WPAD_CLASSIC_STICK_L_EMULATION_RIGHT) return true ;
103- if (kpadProState & WPAD_PRO_BUTTON_RIGHT) return true ;
104- if (kpadProState & WPAD_PRO_STICK_L_EMULATION_RIGHT) return true ;
105- break ;
106- case PAD_BUTTON_L:
107- if (vpadState & VPAD_BUTTON_L) return true ;
108- if (kpadClassicState & WPAD_CLASSIC_BUTTON_L) return true ;
109- if (kpadProState & WPAD_PRO_TRIGGER_L) return true ;
15+ auto examine = [state](const auto & status) -> uint32_t
16+ {
17+ switch (state) {
18+ case TRIGGER:
19+ return status.trigger ;
20+ case HOLD:
21+ return status.hold ;
22+ case RELEASE:
23+ return status.release ;
24+ default :
25+ return 0 ;
26+ }
27+ };
28+
29+ if (!vpad_status.error )
30+ vpadState = examine (vpad_status);
31+
32+ if (!kpad_status.error ) {
33+ switch (kpad_status.extensionType ) {
34+ case WPAD_EXT_CORE:
35+ kpadCoreState = examine (kpad_status);
11036 break ;
111- case PAD_BUTTON_R:
112- if (vpadState & VPAD_BUTTON_R) return true ;
113- if (kpadState & WPAD_BUTTON_PLUS) return true ;
114- if (kpadClassicState & WPAD_CLASSIC_BUTTON_R) return true ;
115- if (kpadProState & WPAD_PRO_TRIGGER_R) return true ;
37+ case WPAD_EXT_NUNCHUK:
38+ kpadCoreState = examine (kpad_status);
39+ kpadNunchukState = examine (kpad_status.nunchuk );
11640 break ;
117- case PAD_BUTTON_PLUS:
118- if (vpadState & VPAD_BUTTON_PLUS) return true ;
119- if (kpadState & WPAD_BUTTON_PLUS) return true ;
120- if (kpadClassicState & WPAD_CLASSIC_BUTTON_PLUS) return true ;
121- if (kpadProState & WPAD_PRO_BUTTON_PLUS) return true ;
41+ case WPAD_EXT_CLASSIC:
42+ kpadCoreState = examine (kpad_status);
43+ kpadClassicState = examine (kpad_status.classic );
12244 break ;
123- case PAD_BUTTON_MINUS:
124- if (vpadState & VPAD_BUTTON_MINUS) return true ;
125- if (kpadState & WPAD_BUTTON_MINUS) return true ;
126- if (kpadClassicState & WPAD_CLASSIC_BUTTON_MINUS) return true ;
127- if (kpadProState & WPAD_PRO_BUTTON_MINUS) return true ;
128- break ;
129- case PAD_BUTTON_ANY:
130- if (vpadState) return true ;
131- if (kpadState) return true ;
132- if (kpadClassicState) return true ;
133- if (kpadProState) return true ;
45+ case WPAD_EXT_PRO_CONTROLLER:
46+ kpadProState = examine (kpad_status.pro );
13447 break ;
13548 }
13649 }
50+
51+ if (!vpadState &&
52+ !kpadCoreState &&
53+ !kpadClassicState &&
54+ !kpadNunchukState &&
55+ !kpadProState)
56+ return false ;
57+
58+ switch (button) {
59+ case PAD_BUTTON_A:
60+ if (vpadState & VPAD_BUTTON_A) return true ;
61+ if (kpadCoreState & WPAD_BUTTON_A) return true ;
62+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_A) return true ;
63+ if (kpadProState & WPAD_PRO_BUTTON_A) return true ;
64+ break ;
65+ case PAD_BUTTON_B:
66+ if (vpadState & VPAD_BUTTON_B) return true ;
67+ if (kpadCoreState & WPAD_BUTTON_B) return true ;
68+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_B) return true ;
69+ if (kpadProState & WPAD_PRO_BUTTON_B) return true ;
70+ break ;
71+ case PAD_BUTTON_X:
72+ if (vpadState & VPAD_BUTTON_X) return true ;
73+ if (kpadCoreState & WPAD_BUTTON_1) return true ;
74+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_X) return true ;
75+ if (kpadProState & WPAD_PRO_BUTTON_X) return true ;
76+ break ;
77+ case PAD_BUTTON_Y:
78+ if (vpadState & VPAD_BUTTON_Y) return true ;
79+ if (kpadCoreState & WPAD_BUTTON_2) return true ;
80+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_Y) return true ;
81+ if (kpadProState & WPAD_PRO_BUTTON_Y) return true ;
82+ break ;
83+ case PAD_BUTTON_UP:
84+ if (vpadState & VPAD_BUTTON_UP) return true ;
85+ if (vpadState & VPAD_STICK_L_EMULATION_UP) return true ;
86+ if (kpadCoreState & WPAD_BUTTON_UP) return true ;
87+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_UP) return true ;
88+ if (kpadClassicState & WPAD_CLASSIC_STICK_L_EMULATION_UP) return true ;
89+ if (kpadNunchukState & WPAD_NUNCHUK_STICK_EMULATION_UP) return true ;
90+ if (kpadProState & WPAD_PRO_BUTTON_UP) return true ;
91+ if (kpadProState & WPAD_PRO_STICK_L_EMULATION_UP) return true ;
92+ break ;
93+ case PAD_BUTTON_DOWN:
94+ if (vpadState & VPAD_BUTTON_DOWN) return true ;
95+ if (vpadState & VPAD_STICK_L_EMULATION_DOWN) return true ;
96+ if (kpadCoreState & WPAD_BUTTON_DOWN) return true ;
97+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_DOWN) return true ;
98+ if (kpadClassicState & WPAD_CLASSIC_STICK_L_EMULATION_DOWN) return true ;
99+ if (kpadNunchukState & WPAD_NUNCHUK_STICK_EMULATION_DOWN) return true ;
100+ if (kpadProState & WPAD_PRO_BUTTON_DOWN) return true ;
101+ if (kpadProState & WPAD_PRO_STICK_L_EMULATION_DOWN) return true ;
102+ break ;
103+ case PAD_BUTTON_LEFT:
104+ if (vpadState & VPAD_BUTTON_LEFT) return true ;
105+ if (vpadState & VPAD_STICK_L_EMULATION_LEFT) return true ;
106+ if (kpadCoreState & WPAD_BUTTON_LEFT) return true ;
107+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_LEFT) return true ;
108+ if (kpadClassicState & WPAD_CLASSIC_STICK_L_EMULATION_LEFT) return true ;
109+ if (kpadNunchukState & WPAD_NUNCHUK_STICK_EMULATION_LEFT) return true ;
110+ if (kpadProState & WPAD_PRO_BUTTON_LEFT) return true ;
111+ if (kpadProState & WPAD_PRO_STICK_L_EMULATION_LEFT) return true ;
112+ break ;
113+ case PAD_BUTTON_RIGHT:
114+ if (vpadState & VPAD_BUTTON_RIGHT) return true ;
115+ if (vpadState & VPAD_STICK_L_EMULATION_RIGHT) return true ;
116+ if (kpadCoreState & WPAD_BUTTON_RIGHT) return true ;
117+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_RIGHT) return true ;
118+ if (kpadClassicState & WPAD_CLASSIC_STICK_L_EMULATION_RIGHT) return true ;
119+ if (kpadNunchukState & WPAD_NUNCHUK_STICK_EMULATION_RIGHT) return true ;
120+ if (kpadProState & WPAD_PRO_BUTTON_RIGHT) return true ;
121+ if (kpadProState & WPAD_PRO_STICK_L_EMULATION_RIGHT) return true ;
122+ break ;
123+ case PAD_BUTTON_L:
124+ if (vpadState & VPAD_BUTTON_L) return true ;
125+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_L) return true ;
126+ if (kpadProState & WPAD_PRO_BUTTON_L) return true ;
127+ break ;
128+ case PAD_BUTTON_R:
129+ if (vpadState & VPAD_BUTTON_R) return true ;
130+ if (kpadCoreState & WPAD_BUTTON_PLUS) return true ;
131+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_R) return true ;
132+ if (kpadProState & WPAD_PRO_BUTTON_R) return true ;
133+ break ;
134+ case PAD_BUTTON_PLUS:
135+ if (vpadState & VPAD_BUTTON_PLUS) return true ;
136+ if (kpadCoreState & WPAD_BUTTON_PLUS) return true ;
137+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_PLUS) return true ;
138+ if (kpadProState & WPAD_PRO_BUTTON_PLUS) return true ;
139+ break ;
140+ case PAD_BUTTON_MINUS:
141+ if (vpadState & VPAD_BUTTON_MINUS) return true ;
142+ if (kpadCoreState & WPAD_BUTTON_MINUS) return true ;
143+ if (kpadClassicState & WPAD_CLASSIC_BUTTON_MINUS) return true ;
144+ if (kpadProState & WPAD_PRO_BUTTON_MINUS) return true ;
145+ break ;
146+ case PAD_BUTTON_ANY:
147+ return vpadState
148+ || kpadCoreState
149+ || kpadClassicState
150+ || kpadNunchukState
151+ || kpadProState;
152+ }
153+
137154 return false ;
138- }
155+ }
0 commit comments