From 731860bef23f802b6f15062659683c4e59aab02f Mon Sep 17 00:00:00 2001 From: jakobkg Date: Sun, 25 Feb 2018 13:40:43 +0100 Subject: [PATCH 1/2] [SDCafiine] Added support for additional controllers on the modpack selector screen By including the Padscore functions, the modpack selector now also supports the Wii U Pro Controller, Wiimote, Wii Classic Controller and Wii Classic Controller Pro. This allows users to choose modpacks without being forced to use the Gamepad. --- plugins/sdcafiine/src/main.cpp | 10 +- plugins/sdcafiine/src/modpackSelector.cpp | 189 +++++++++++++++++++--- 2 files changed, 170 insertions(+), 29 deletions(-) diff --git a/plugins/sdcafiine/src/main.cpp b/plugins/sdcafiine/src/main.cpp index 5c790ba..5a81cc9 100644 --- a/plugins/sdcafiine/src/main.cpp +++ b/plugins/sdcafiine/src/main.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -28,18 +29,19 @@ ON_APPLICATION_START(args) { InitOSFunctionPointers(); InitSocketFunctionPointers(); //For logging InitVPadFunctionPointers(); //For logging + InitPadScoreFunctionPointers(); log_init(); if(FileReplacerUtils::setGroupAndOwnerID()) { //DEBUG_FUNCTION_LINE("SUCCESS\n"); } - + DEBUG_FUNCTION_LINE("SD mounted? %d\n",args.sd_mounted); DEBUG_FUNCTION_LINE("USB mounted? %d\n",args.usb_mounted); - + gSDInitDone = args.sd_mounted; - gUSBInitDone = args.usb_mounted; + gUSBInitDone = args.usb_mounted; HandleMultiModPacks(OSGetTitleID()); @@ -53,4 +55,4 @@ ON_APPLICATION_ENDING() { ON_APP_STATUS_CHANGED(status) { gAppStatus = status; -} \ No newline at end of file +} diff --git a/plugins/sdcafiine/src/modpackSelector.cpp b/plugins/sdcafiine/src/modpackSelector.cpp index 7edcff9..7e4fab4 100644 --- a/plugins/sdcafiine/src/modpackSelector.cpp +++ b/plugins/sdcafiine/src/modpackSelector.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -20,6 +21,141 @@ #define TEXT_SEL(x, text1, text2) ((x) ? (text1) : (text2)) +enum PadButton { + PAD_BTN_A, + PAD_BTN_UP, + PAD_BTN_DOWN, + PAD_BTN_L, + PAD_BTN_R +}; + +VPADData vpad; +s32 vpadError; + +KPADData pads[4]; +s32 padErrors[4]; +u32 padTypes[4]; + +void initControllers() { + KPADInit(); +} + +void releaseControllers() { + for(int i = 0; i < 4; i++) { + padErrors[i] = WPADProbe(i, &padTypes[i]); + if(padErrors[i] == 0) { + WPADDisconnect(i); + } + } + + //Clear buffers so future launches of SDCafiine don't read old data + memset(&vpad, 0, sizeof(VPADData)); + vpadError = 0; + + memset(pads, 0, sizeof(KPADData) * 4); + memset(padErrors, 0, sizeof(s32) * 4); + memset(padTypes, 0, sizeof(u32) * 4); +} + +void pollControllers() { + VPADRead(0, &vpad, 1, &vpadError); + + for(int i = 0; i < 4; i++) { + padErrors[i] = WPADProbe(i, &padTypes[i]); + if(padErrors[i] == 0) { + KPADRead(i, &pads[i], 1); + } + } +} + +bool isButtonPressed(enum PadButton btn) { + if(vpadError == 0) { + switch (btn) { + case PAD_BTN_A: + if (vpad.btns_d & VPAD_BUTTON_A) return true; + break; + + case PAD_BTN_UP: + if (vpad.btns_d & VPAD_BUTTON_UP) return true; + break; + + case PAD_BTN_DOWN: + if (vpad.btns_d & VPAD_BUTTON_DOWN) return true; + break; + + case PAD_BTN_L: + if (vpad.btns_d & VPAD_BUTTON_L) return true; + break; + + case PAD_BTN_R: + if (vpad.btns_d & VPAD_BUTTON_R) return true; + break; + + default: + break; + } + } + + for(int i = 0; i < 4; i++) { + if(padErrors[i] == 0) { + if(pads[i].device_type < 2) { + switch(btn) { + case PAD_BTN_A: + if (pads[i].btns_d & WPAD_BUTTON_A) return true; + break; + + case PAD_BTN_UP: + if (pads[i].btns_d & WPAD_BUTTON_UP) return true; + break; + + case PAD_BTN_DOWN: + if (pads[i].btns_d & WPAD_BUTTON_DOWN) return true; + break; + + case PAD_BTN_L: + if (pads[i].btns_d & WPAD_BUTTON_1) return true; + break; + + case PAD_BTN_R: + if (pads[i].btns_d & WPAD_BUTTON_2) return true; + break; + + default: + break; + } + } + else { + switch(btn) { + case PAD_BTN_A: + if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_A) return true; + break; + + case PAD_BTN_UP: + if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_UP) return true; + break; + + case PAD_BTN_DOWN: + if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_DOWN) return true; + break; + + case PAD_BTN_L: + if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_L) return true; + break; + + case PAD_BTN_R: + if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_R) return true; + break; + + default: + break; + } + } + } + } + + return false; +} + void HandleMultiModPacks(u64 titleID/*,bool showMenu*/) { gModFolder[0] = 0; @@ -83,8 +219,7 @@ void HandleMultiModPacks(u64 titleID/*,bool showMenu*/) { int initScreen = 1; int x_offset = -2; - VPADData vpad; - s32 vpadError; + initControllers(); OSScreenInit(); u32 screen_buf0_size = OSScreenGetBufferSizeEx(0); @@ -111,30 +246,32 @@ void HandleMultiModPacks(u64 titleID/*,bool showMenu*/) { while(1){ - vpadError = -1; - VPADRead(0, &vpad, 1, &vpadError); + pollControllers(); - if(vpadError == 0) { - if(vpad.btns_d & VPAD_BUTTON_A) { - wantToExit = 1; - initScreen = 1; - } else if(vpad.btns_d & VPAD_BUTTON_DOWN) { - selected++; - initScreen = 1; - } else if(vpad.btns_d & VPAD_BUTTON_UP) { - selected--; - initScreen = 1; - } else if(vpad.btns_d & VPAD_BUTTON_L) { - selected -= per_page; - initScreen = 1; - } else if(vpad.btns_d & VPAD_BUTTON_R) { - selected += per_page; - initScreen = 1; - } - if(selected < 0) selected = 0; - if(selected >= modPackListSize) selected = modPackListSize-1; - page = selected / per_page; - } + if (isButtonPressed(PAD_BTN_A)) { + wantToExit = 1; + initScreen = 1; + } + else if (isButtonPressed(PAD_BTN_DOWN)) { + selected++; + initScreen = 1; + } + else if (isButtonPressed(PAD_BTN_UP)) { + selected--; + initScreen = 1; + } + else if (isButtonPressed(PAD_BTN_L)) { + selected -= per_page; + initScreen = 1; + } + else if (isButtonPressed(PAD_BTN_R)) { + selected += per_page; + initScreen = 1; + } + + if (selected < 0) selected = 0; + if (selected >= modPackListSize) selected = modPackListSize - 1; + page = selected / per_page; if(initScreen) { OSScreenClearBufferEx(0, 0); @@ -183,6 +320,8 @@ void HandleMultiModPacks(u64 titleID/*,bool showMenu*/) { OSScreenFlipBuffersEx(0); OSScreenFlipBuffersEx(1); + releaseControllers(); + free(screenbuffers); return; From 8737d4bc5426042ed31dd9a77279428a63482674 Mon Sep 17 00:00:00 2001 From: jakobkg Date: Mon, 26 Feb 2018 10:14:01 +0100 Subject: [PATCH 2/2] Moved controller stuff out of the modpack selector files for cleanliness --- plugins/sdcafiine/src/controllers.cpp | 129 ++++++++++++++++++++ plugins/sdcafiine/src/controllers.h | 15 +++ plugins/sdcafiine/src/modpackSelector.cpp | 138 +--------------------- 3 files changed, 145 insertions(+), 137 deletions(-) create mode 100644 plugins/sdcafiine/src/controllers.cpp create mode 100644 plugins/sdcafiine/src/controllers.h diff --git a/plugins/sdcafiine/src/controllers.cpp b/plugins/sdcafiine/src/controllers.cpp new file mode 100644 index 0000000..f288d51 --- /dev/null +++ b/plugins/sdcafiine/src/controllers.cpp @@ -0,0 +1,129 @@ +#include +#include "controllers.h" + +VPADData vpad; +s32 vpadError; + +KPADData pads[4]; +s32 padErrors[4]; +u32 padTypes[4]; + +void initControllers() { + KPADInit(); +} + +void releaseControllers() { + for(int i = 0; i < 4; i++) { + padErrors[i] = WPADProbe(i, &padTypes[i]); + if(padErrors[i] == 0) { + WPADDisconnect(i); + } + } + + //Clear buffers so future launches of SDCafiine don't read old data + memset(&vpad, 0, sizeof(VPADData)); + vpadError = 0; + + memset(pads, 0, sizeof(KPADData) * 4); + memset(padErrors, 0, sizeof(s32) * 4); + memset(padTypes, 0, sizeof(u32) * 4); +} + +void pollControllers() { + VPADRead(0, &vpad, 1, &vpadError); + + for(int i = 0; i < 4; i++) { + padErrors[i] = WPADProbe(i, &padTypes[i]); + if(padErrors[i] == 0) { + KPADRead(i, &pads[i], 1); + } + } +} + +bool isButtonPressed(enum PadButton btn) { + if(vpadError == 0) { + switch (btn) { + case PAD_BTN_A: + if (vpad.btns_d & VPAD_BUTTON_A) return true; + break; + + case PAD_BTN_UP: + if (vpad.btns_d & VPAD_BUTTON_UP) return true; + break; + + case PAD_BTN_DOWN: + if (vpad.btns_d & VPAD_BUTTON_DOWN) return true; + break; + + case PAD_BTN_L: + if (vpad.btns_d & VPAD_BUTTON_L) return true; + break; + + case PAD_BTN_R: + if (vpad.btns_d & VPAD_BUTTON_R) return true; + break; + + default: + break; + } + } + + for(int i = 0; i < 4; i++) { + if(padErrors[i] == 0) { + if(pads[i].device_type < 2) { + switch(btn) { + case PAD_BTN_A: + if (pads[i].btns_d & WPAD_BUTTON_A) return true; + break; + + case PAD_BTN_UP: + if (pads[i].btns_d & WPAD_BUTTON_UP) return true; + break; + + case PAD_BTN_DOWN: + if (pads[i].btns_d & WPAD_BUTTON_DOWN) return true; + break; + + case PAD_BTN_L: + if (pads[i].btns_d & WPAD_BUTTON_1) return true; + break; + + case PAD_BTN_R: + if (pads[i].btns_d & WPAD_BUTTON_2) return true; + break; + + default: + break; + } + } + else { + switch(btn) { + case PAD_BTN_A: + if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_A) return true; + break; + + case PAD_BTN_UP: + if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_UP) return true; + break; + + case PAD_BTN_DOWN: + if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_DOWN) return true; + break; + + case PAD_BTN_L: + if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_L) return true; + break; + + case PAD_BTN_R: + if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_R) return true; + break; + + default: + break; + } + } + } + } + + return false; +} diff --git a/plugins/sdcafiine/src/controllers.h b/plugins/sdcafiine/src/controllers.h new file mode 100644 index 0000000..18c1e86 --- /dev/null +++ b/plugins/sdcafiine/src/controllers.h @@ -0,0 +1,15 @@ +#include +#include + +enum PadButton { + PAD_BTN_A, + PAD_BTN_UP, + PAD_BTN_DOWN, + PAD_BTN_L, + PAD_BTN_R +}; + +void initControllers(); +void releaseControllers(); +void pollControllers(); +bool isButtonPressed(enum PadButton btn); diff --git a/plugins/sdcafiine/src/modpackSelector.cpp b/plugins/sdcafiine/src/modpackSelector.cpp index 7e4fab4..44dde66 100644 --- a/plugins/sdcafiine/src/modpackSelector.cpp +++ b/plugins/sdcafiine/src/modpackSelector.cpp @@ -8,10 +8,9 @@ #include #include "modpackSelector.h" #include "common/common.h" +#include "controllers.h" #include -#include -#include #include #include #include @@ -21,141 +20,6 @@ #define TEXT_SEL(x, text1, text2) ((x) ? (text1) : (text2)) -enum PadButton { - PAD_BTN_A, - PAD_BTN_UP, - PAD_BTN_DOWN, - PAD_BTN_L, - PAD_BTN_R -}; - -VPADData vpad; -s32 vpadError; - -KPADData pads[4]; -s32 padErrors[4]; -u32 padTypes[4]; - -void initControllers() { - KPADInit(); -} - -void releaseControllers() { - for(int i = 0; i < 4; i++) { - padErrors[i] = WPADProbe(i, &padTypes[i]); - if(padErrors[i] == 0) { - WPADDisconnect(i); - } - } - - //Clear buffers so future launches of SDCafiine don't read old data - memset(&vpad, 0, sizeof(VPADData)); - vpadError = 0; - - memset(pads, 0, sizeof(KPADData) * 4); - memset(padErrors, 0, sizeof(s32) * 4); - memset(padTypes, 0, sizeof(u32) * 4); -} - -void pollControllers() { - VPADRead(0, &vpad, 1, &vpadError); - - for(int i = 0; i < 4; i++) { - padErrors[i] = WPADProbe(i, &padTypes[i]); - if(padErrors[i] == 0) { - KPADRead(i, &pads[i], 1); - } - } -} - -bool isButtonPressed(enum PadButton btn) { - if(vpadError == 0) { - switch (btn) { - case PAD_BTN_A: - if (vpad.btns_d & VPAD_BUTTON_A) return true; - break; - - case PAD_BTN_UP: - if (vpad.btns_d & VPAD_BUTTON_UP) return true; - break; - - case PAD_BTN_DOWN: - if (vpad.btns_d & VPAD_BUTTON_DOWN) return true; - break; - - case PAD_BTN_L: - if (vpad.btns_d & VPAD_BUTTON_L) return true; - break; - - case PAD_BTN_R: - if (vpad.btns_d & VPAD_BUTTON_R) return true; - break; - - default: - break; - } - } - - for(int i = 0; i < 4; i++) { - if(padErrors[i] == 0) { - if(pads[i].device_type < 2) { - switch(btn) { - case PAD_BTN_A: - if (pads[i].btns_d & WPAD_BUTTON_A) return true; - break; - - case PAD_BTN_UP: - if (pads[i].btns_d & WPAD_BUTTON_UP) return true; - break; - - case PAD_BTN_DOWN: - if (pads[i].btns_d & WPAD_BUTTON_DOWN) return true; - break; - - case PAD_BTN_L: - if (pads[i].btns_d & WPAD_BUTTON_1) return true; - break; - - case PAD_BTN_R: - if (pads[i].btns_d & WPAD_BUTTON_2) return true; - break; - - default: - break; - } - } - else { - switch(btn) { - case PAD_BTN_A: - if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_A) return true; - break; - - case PAD_BTN_UP: - if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_UP) return true; - break; - - case PAD_BTN_DOWN: - if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_DOWN) return true; - break; - - case PAD_BTN_L: - if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_L) return true; - break; - - case PAD_BTN_R: - if (pads[i].classic.btns_d & WPAD_CLASSIC_BUTTON_R) return true; - break; - - default: - break; - } - } - } - } - - return false; -} - void HandleMultiModPacks(u64 titleID/*,bool showMenu*/) { gModFolder[0] = 0;