Skip to content

Commit 184e9ae

Browse files
authored
Merge pull request #77 from dkosmari/refactor
Added nunchuk support.
2 parents 1b16b3b + 1b3fc59 commit 184e9ae

File tree

3 files changed

+152
-136
lines changed

3 files changed

+152
-136
lines changed

include/utils/InputUtils.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ class Input {
3232
bool get(ButtonState state, Button button) const __attribute__((hot));
3333

3434
private:
35-
VPADStatus vpad_status;
36-
VPADReadError vpad_error;
37-
KPADStatus kpad[4], kpad_status;
35+
VPADStatus vpad_status = {};
36+
KPADStatus kpad_status = {};
3837
};

src/main.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ static void getWiiUSerialId() {
6666
Metadata::thisConsoleSerialId = std::string(sysProd.code_id) + sysProd.serial_id;
6767
}
6868
MCP_Close(mcpHandle);
69-
}
69+
}
7070
}
7171

7272
static Title *loadWiiUTitles(int run) {
@@ -261,7 +261,7 @@ static Title *loadWiiUTitles(int run) {
261261
titles[wiiuTitlesCount].isTitleOnUSB = isTitleOnUSB;
262262
titles[wiiuTitlesCount].listID = wiiuTitlesCount;
263263
if (loadTitleIcon(&titles[wiiuTitlesCount]) < 0)
264-
titles[wiiuTitlesCount].iconBuf = nullptr;
264+
titles[wiiuTitlesCount].iconBuf = nullptr;
265265

266266
std::string fwpath = StringUtils::stringFormat("%s/usr/title/000%x/%x/code/fw.img",
267267
titles[wiiuTitlesCount].isTitleOnUSB ? getUSB().c_str() : "storage_mlc01:",
@@ -482,7 +482,7 @@ std::vector<const char*> initMessageList;
482482
void addInitMessage(const char* newMessage) {
483483

484484
initMessageList.push_back(newMessage);
485-
485+
486486
DrawUtils::beginDraw();
487487
DrawUtils::clear(COLOR_BLACK);
488488
consolePrintPosAligned(5, 0, 1, "SaveMii v%u.%u.%u%c", VERSION_MAJOR, VERSION_MINOR, VERSION_MICRO, VERSION_FIX);
@@ -519,19 +519,19 @@ void addInitMessageWithIcon(const char* newMessage) {
519519

520520
int main() {
521521

522-
#ifdef DEBUG
522+
#ifdef DEBUG
523523
WHBLogUdpInit();
524524
WHBLogPrintf("Hello from savemii!");
525525
#endif
526526

527527
// freezes console to some users
528528
/*
529-
AXInit();
529+
AXInit();
530530
AXQuit();
531-
*/
531+
*/
532532

533533
State::init();
534-
534+
535535
if (DrawUtils::LogConsoleInit()) {
536536
OSFatal("Failed to initialize OSSCreen");
537537
}
@@ -559,7 +559,7 @@ int main() {
559559
addInitMessage("... can take several seconds on some SDs");
560560

561561
GlobalCfg::global = std::make_unique<GlobalCfg>("cfg");
562-
562+
563563
if (! GlobalCfg::global->init()) {
564564
promptError("Failed to init global config file\n Check SD card and sd:/wiiu/backups/savemiiCfg folder.");
565565
romfsExit();
@@ -576,7 +576,6 @@ int main() {
576576

577577
addInitMessage(LanguageUtils::gettext("Initializing WPAD and KAPD"));
578578

579-
WPADInit();
580579
KPADInit();
581580
WPADEnableURCC(1);
582581

@@ -620,7 +619,7 @@ int main() {
620619
ExcludesCfg::wiiExcludes = std::make_unique<ExcludesCfg>("wiiExcludes",wiititles,vWiiTitlesCount);
621620
ExcludesCfg::wiiuExcludes->init();
622621
ExcludesCfg::wiiExcludes->init();
623-
622+
624623
resetMessageList();
625624

626625
Input input{};
@@ -662,5 +661,6 @@ int main() {
662661
DrawUtils::LogConsoleFree();
663662

664663
State::shutdown();
664+
KPADShutdown();
665665
return 0;
666666
}

src/utils/InputUtils.cpp

Lines changed: 140 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1,138 +1,155 @@
11
#include <utils/InputUtils.h>
22

33
void 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

188
bool 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

Comments
 (0)