diff --git a/Dockerfile b/Dockerfile index 6851869..6300c9d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM wiiuenv/devkitppc:20210917 +FROM wiiuenv/devkitppc:20210920 -COPY --from=wiiuenv/libiosuhax:20210109 /artifacts $DEVKITPRO +COPY --from=wiiuenv/libiosuhax:20211008 /artifacts $DEVKITPRO COPY --from=wiiuenv/devkitarm:20210917 $DEVKITPRO/devkitARM $DEVKITPRO/devkitARM ENV DEVKITARM=/opt/devkitpro/devkitARM diff --git a/Makefile b/Makefile index 842661b..a16b0f9 100644 --- a/Makefile +++ b/Makefile @@ -35,12 +35,10 @@ BUILD := build SOURCES := source \ source/common \ source/utils \ - source/fs + source/fs \ + source/input INCLUDES := include source -CONTENT := meta ICON := meta/icon.jpg -TV_SPLASH := meta/icon.jpg -DRC_SPLASH := meta/icon.jpg #------------------------------------------------------------------------------- # options for code generation diff --git a/source/ApplicationState.cpp b/source/ApplicationState.cpp index 997bd51..f69f8a5 100644 --- a/source/ApplicationState.cpp +++ b/source/ApplicationState.cpp @@ -1,7 +1,7 @@ #include "ApplicationState.h" -#include "WiiUScreen.h" -#include "ScreenUtils.h" -#include "StringTools.h" +#include "utils/WiiUScreen.h" +#include "utils/ScreenUtils.h" +#include "utils/StringTools.h" #include "../build/safe_payload.h" #include #include diff --git a/source/ApplicationState.h b/source/ApplicationState.h index 0176ecd..a6ce1a2 100644 --- a/source/ApplicationState.h +++ b/source/ApplicationState.h @@ -2,9 +2,9 @@ #include #include +#include #include "common/common.h" #include "InstallerService.h" -#include "Input.h" #include "Menu.h" class ApplicationState { diff --git a/source/InstallerService.cpp b/source/InstallerService.cpp index e827c1d..0242d7c 100644 --- a/source/InstallerService.cpp +++ b/source/InstallerService.cpp @@ -1,7 +1,7 @@ #include "common/common.h" #include "utils/logger.h" -#include "WiiUScreen.h" -#include "StringTools.h" +#include "utils/WiiUScreen.h" +#include "utils/StringTools.h" #include "fs/FSUtils.h" #include "common/fst_structs.h" #include "InstallerService.h" diff --git a/source/Menu.h b/source/Menu.h index ee05f89..375260f 100644 --- a/source/Menu.h +++ b/source/Menu.h @@ -4,10 +4,8 @@ #include #include #include -#include "Input.h" -#include "WiiUScreen.h" -#include "ScreenUtils.h" -#include "VPADInput.h" +#include "utils/WiiUScreen.h" +#include "utils/ScreenUtils.h" template class Menu { diff --git a/source/input/CombinedInput.h b/source/input/CombinedInput.h new file mode 100644 index 0000000..d06350b --- /dev/null +++ b/source/input/CombinedInput.h @@ -0,0 +1,20 @@ +#pragma once + +class CombinedInput : public Input { +public: + void combine(const Input &b) { + data.buttons_h |= b.data.buttons_h; + } + + void process() { + data.buttons_d |= (data.buttons_h & (~lastData.buttons_h)); + data.buttons_r |= (lastData.buttons_h & (~data.buttons_h)); + lastData.buttons_h = data.buttons_h; + } + + void reset() { + data.buttons_h = 0; + data.buttons_d = 0; + data.buttons_r = 0; + } +}; \ No newline at end of file diff --git a/source/Input.h b/source/input/Input.h similarity index 86% rename from source/Input.h rename to source/input/Input.h index acf101a..f5fc51e 100644 --- a/source/Input.h +++ b/source/input/Input.h @@ -1,66 +1,61 @@ -#pragma once - -#include -#include - -class Input { -public: - //!Constructor - Input() = default; - - //!Destructor - virtual ~Input() = default; - - void combine(const Input& b) { - data.buttons_d |= b.data.buttons_d; - data.buttons_h |= b.data.buttons_h; - data.buttons_r |= b.data.buttons_r; - } - - enum eButtons { - BUTTON_NONE = 0x0000, - VPAD_TOUCH = 0x80000000, - BUTTON_Z = 0x20000, - BUTTON_C = 0x10000, - BUTTON_A = 0x8000, - BUTTON_B = 0x4000, - BUTTON_X = 0x2000, - BUTTON_Y = 0x1000, - BUTTON_1 = BUTTON_Y, - BUTTON_2 = BUTTON_X, - BUTTON_LEFT = 0x0800, - BUTTON_RIGHT = 0x0400, - BUTTON_UP = 0x0200, - BUTTON_DOWN = 0x0100, - BUTTON_ZL = 0x0080, - BUTTON_ZR = 0x0040, - BUTTON_L = 0x0020, - BUTTON_R = 0x0010, - BUTTON_PLUS = 0x0008, - BUTTON_MINUS = 0x0004, - BUTTON_HOME = 0x0002, - BUTTON_SYNC = 0x0001, - STICK_R_LEFT = 0x04000000, - STICK_R_RIGHT = 0x02000000, - STICK_R_UP = 0x01000000, - STICK_R_DOWN = 0x00800000, - STICK_L_LEFT = 0x40000000, - STICK_L_RIGHT = 0x20000000, - STICK_L_UP = 0x10000000, - STICK_L_DOWN = 0x08000000 - }; - - typedef struct { - uint32_t buttons_h; - uint32_t buttons_d; - uint32_t buttons_r; - bool validPointer; - bool touched; - float pointerAngle; - int32_t x; - int32_t y; - } PadData; - - PadData data{}; - PadData lastData{}; -}; +#pragma once + +#include +#include + +class Input { +public: + //!Constructor + Input() = default; + + //!Destructor + virtual ~Input() = default; + + enum eButtons { + BUTTON_NONE = 0x0000, + VPAD_TOUCH = 0x80000000, + BUTTON_Z = 0x20000, + BUTTON_C = 0x10000, + BUTTON_A = 0x8000, + BUTTON_B = 0x4000, + BUTTON_X = 0x2000, + BUTTON_Y = 0x1000, + BUTTON_1 = BUTTON_Y, + BUTTON_2 = BUTTON_X, + BUTTON_LEFT = 0x0800, + BUTTON_RIGHT = 0x0400, + BUTTON_UP = 0x0200, + BUTTON_DOWN = 0x0100, + BUTTON_ZL = 0x0080, + BUTTON_ZR = 0x0040, + BUTTON_L = 0x0020, + BUTTON_R = 0x0010, + BUTTON_PLUS = 0x0008, + BUTTON_MINUS = 0x0004, + BUTTON_HOME = 0x0002, + BUTTON_SYNC = 0x0001, + STICK_R_LEFT = 0x04000000, + STICK_R_RIGHT = 0x02000000, + STICK_R_UP = 0x01000000, + STICK_R_DOWN = 0x00800000, + STICK_L_LEFT = 0x40000000, + STICK_L_RIGHT = 0x20000000, + STICK_L_UP = 0x10000000, + STICK_L_DOWN = 0x08000000 + }; + + typedef struct { + uint32_t buttons_h; + uint32_t buttons_d; + uint32_t buttons_r; + bool validPointer; + bool touched; + float pointerAngle; + int32_t x; + int32_t y; + } PadData; + + PadData data{}; + PadData lastData{}; + +}; diff --git a/source/VPADInput.h b/source/input/VPADInput.h similarity index 93% rename from source/VPADInput.h rename to source/input/VPADInput.h index 00cbcc4..c4c538f 100644 --- a/source/VPADInput.h +++ b/source/input/VPADInput.h @@ -1,58 +1,61 @@ -#pragma once -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ - -#include -#include "Input.h" - -class VPadInput : public Input { -public: - //!Constructor - VPadInput() { - } - - //!Destructor - ~VPadInput() override {} - - bool update(int32_t width, int32_t height) { - lastData = data; - - VPADReadError vpadError = VPAD_READ_NO_SAMPLES; - VPADRead(VPAD_CHAN_0, &vpad, 1, &vpadError); - - if (vpadError == VPAD_READ_SUCCESS) { - data.buttons_r = vpad.release; - data.buttons_h = vpad.hold; - data.buttons_d = vpad.trigger; - data.validPointer = !vpad.tpNormal.validity; - data.touched = vpad.tpNormal.touched; - - VPADGetTPCalibratedPoint(VPAD_CHAN_0, &tpCalib, &vpad.tpFiltered1); - - //! calculate the screen offsets - data.x = -(width >> 1) + (int32_t) (((float) tpCalib.x / 1280.0f) * (float) width); - data.y = -(height >> 1) + (int32_t) (float) height - (((float) tpCalib.y / 720.0f) * (float) height); - - return true; - } - return false; - } - -private: - VPADStatus vpad{}; - VPADTouchData tpCalib{}; +#pragma once +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ****************************************************************************/ + +#include +#include "Input.h" + +class VPadInput : public Input { +public: + //!Constructor + VPadInput() { + memset(&vpad, 0, sizeof(vpad)); + } + + //!Destructor + ~VPadInput() override = default; + + bool update(int32_t width, int32_t height) { + lastData = data; + + VPADReadError vpadError = VPAD_READ_NO_SAMPLES; + VPADRead(VPAD_CHAN_0, &vpad, 1, &vpadError); + + if (vpadError == VPAD_READ_SUCCESS) { + data.buttons_r = vpad.release; + data.buttons_h = vpad.hold; + data.buttons_d = vpad.trigger; + data.validPointer = !vpad.tpNormal.validity; + data.touched = vpad.tpNormal.touched; + + VPADGetTPCalibratedPoint(VPAD_CHAN_0, &tpCalib, &vpad.tpFiltered1); + + //! calculate the screen offsets + data.x = -(width >> 1) + (int32_t) (((float) tpCalib.x / 1280.0f) * (float) width); + data.y = -(height >> 1) + (int32_t) (float) height - (((float) tpCalib.y / 720.0f) * (float) height); + + return true; + } else { + data.buttons_h = 0; + } + return false; + } + +private: + VPADStatus vpad{}; + VPADTouchData tpCalib{}; }; \ No newline at end of file diff --git a/source/WPADInput.h b/source/input/WPADInput.h similarity index 74% rename from source/WPADInput.h rename to source/input/WPADInput.h index 6908473..5d10091 100644 --- a/source/WPADInput.h +++ b/source/input/WPADInput.h @@ -31,43 +31,43 @@ public: uint32_t remapWiiMoteButtons(uint32_t buttons) { uint32_t conv_buttons = 0; - if(buttons & WPAD_BUTTON_LEFT) + if (buttons & WPAD_BUTTON_LEFT) conv_buttons |= Input::BUTTON_LEFT; - if(buttons & WPAD_BUTTON_RIGHT) + if (buttons & WPAD_BUTTON_RIGHT) conv_buttons |= Input::BUTTON_RIGHT; - if(buttons & WPAD_BUTTON_DOWN) + if (buttons & WPAD_BUTTON_DOWN) conv_buttons |= Input::BUTTON_DOWN; - if(buttons & WPAD_BUTTON_UP) + if (buttons & WPAD_BUTTON_UP) conv_buttons |= Input::BUTTON_UP; - if(buttons & WPAD_BUTTON_PLUS) + if (buttons & WPAD_BUTTON_PLUS) conv_buttons |= Input::BUTTON_PLUS; - if(buttons & WPAD_BUTTON_2) + if (buttons & WPAD_BUTTON_2) conv_buttons |= Input::BUTTON_2; - if(buttons & WPAD_BUTTON_1) + if (buttons & WPAD_BUTTON_1) conv_buttons |= Input::BUTTON_1; - if(buttons & WPAD_BUTTON_B) + if (buttons & WPAD_BUTTON_B) conv_buttons |= Input::BUTTON_B; - if(buttons & WPAD_BUTTON_A) + if (buttons & WPAD_BUTTON_A) conv_buttons |= Input::BUTTON_A; - if(buttons & WPAD_BUTTON_MINUS) + if (buttons & WPAD_BUTTON_MINUS) conv_buttons |= Input::BUTTON_MINUS; - if(buttons & WPAD_BUTTON_Z) + if (buttons & WPAD_BUTTON_Z) conv_buttons |= Input::BUTTON_Z; - if(buttons & WPAD_BUTTON_C) + if (buttons & WPAD_BUTTON_C) conv_buttons |= Input::BUTTON_C; - if(buttons & WPAD_BUTTON_HOME) + if (buttons & WPAD_BUTTON_HOME) conv_buttons |= Input::BUTTON_HOME; return conv_buttons; @@ -76,63 +76,65 @@ public: uint32_t remapClassicButtons(uint32_t buttons) { uint32_t conv_buttons = 0; - if(buttons & WPAD_CLASSIC_BUTTON_LEFT) + if (buttons & WPAD_CLASSIC_BUTTON_LEFT) conv_buttons |= Input::BUTTON_LEFT; - if(buttons & WPAD_CLASSIC_BUTTON_RIGHT) + if (buttons & WPAD_CLASSIC_BUTTON_RIGHT) conv_buttons |= Input::BUTTON_RIGHT; - if(buttons & WPAD_CLASSIC_BUTTON_DOWN) + if (buttons & WPAD_CLASSIC_BUTTON_DOWN) conv_buttons |= Input::BUTTON_DOWN; - if(buttons & WPAD_CLASSIC_BUTTON_UP) + if (buttons & WPAD_CLASSIC_BUTTON_UP) conv_buttons |= Input::BUTTON_UP; - if(buttons & WPAD_CLASSIC_BUTTON_PLUS) + if (buttons & WPAD_CLASSIC_BUTTON_PLUS) conv_buttons |= Input::BUTTON_PLUS; - if(buttons & WPAD_CLASSIC_BUTTON_X) + if (buttons & WPAD_CLASSIC_BUTTON_X) conv_buttons |= Input::BUTTON_X; - if(buttons & WPAD_CLASSIC_BUTTON_Y) + if (buttons & WPAD_CLASSIC_BUTTON_Y) conv_buttons |= Input::BUTTON_Y; - if(buttons & WPAD_CLASSIC_BUTTON_B) + if (buttons & WPAD_CLASSIC_BUTTON_B) conv_buttons |= Input::BUTTON_B; - if(buttons & WPAD_CLASSIC_BUTTON_A) + if (buttons & WPAD_CLASSIC_BUTTON_A) conv_buttons |= Input::BUTTON_A; - if(buttons & WPAD_CLASSIC_BUTTON_MINUS) + if (buttons & WPAD_CLASSIC_BUTTON_MINUS) conv_buttons |= Input::BUTTON_MINUS; - if(buttons & WPAD_CLASSIC_BUTTON_HOME) + if (buttons & WPAD_CLASSIC_BUTTON_HOME) conv_buttons |= Input::BUTTON_HOME; - if(buttons & WPAD_CLASSIC_BUTTON_ZR) + if (buttons & WPAD_CLASSIC_BUTTON_ZR) conv_buttons |= Input::BUTTON_ZR; - if(buttons & WPAD_CLASSIC_BUTTON_ZL) + if (buttons & WPAD_CLASSIC_BUTTON_ZL) conv_buttons |= Input::BUTTON_ZL; - if(buttons & WPAD_CLASSIC_BUTTON_R) + if (buttons & WPAD_CLASSIC_BUTTON_R) conv_buttons |= Input::BUTTON_R; - if(buttons & WPAD_CLASSIC_BUTTON_L) + if (buttons & WPAD_CLASSIC_BUTTON_L) conv_buttons |= Input::BUTTON_L; return conv_buttons; } bool update(int32_t width, int32_t height) { + lastData = data; WPADExtensionType type; if (WPADProbe(channel, &type) != 0) { + data.buttons_h = 0; return false; } KPADRead(channel, &kpad, 1); - if(kpad.extensionType == WPAD_EXT_CORE || kpad.extensionType == WPAD_EXT_NUNCHUK) { + if (kpad.extensionType == WPAD_EXT_CORE || kpad.extensionType == WPAD_EXT_NUNCHUK) { data.buttons_r = remapWiiMoteButtons(kpad.release); data.buttons_h = remapWiiMoteButtons(kpad.hold); data.buttons_d = remapWiiMoteButtons(kpad.trigger); @@ -147,11 +149,11 @@ public: (kpad.pos.y >= -1.0f && kpad.pos.y <= 1.0f); //! calculate the screen offsets if pointer is valid else leave old value - if(data.validPointer) { + if (data.validPointer) { data.x = (width >> 1) * kpad.pos.x; data.y = (height >> 1) * (-kpad.pos.y); - if(kpad.angle.y > 0.0f) { + if (kpad.angle.y > 0.0f) { data.pointerAngle = (-kpad.angle.x + 1.0f) * 0.5f * 180.0f; } else { data.pointerAngle = (kpad.angle.x + 1.0f) * 0.5f * 180.0f - 180.0f; diff --git a/source/main.cpp b/source/main.cpp index 47c8546..463010f 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -7,18 +7,20 @@ #include #include #include -#include "WiiUScreen.h" +#include +#include +#include +#include "utils/WiiUScreen.h" #include "InstallerService.h" #include "ApplicationState.h" -#include "WPADInput.h" #include "../build/safe_payload.h" constexpr bool strings_equal(char const *a, char const *b) { return std::string_view(a) == b; } -static_assert(strings_equal(RPX_HASH, "cd4c1459d793a600d12afa33425f43be0cc5dfa3"), "Built with an untested root.rpx! Remove this check if you really know what you're doing."); +static_assert(strings_equal(RPX_HASH, "1736574cf6c949557aed0c817eb1927e35a9b820"), "Built with an untested root.rpx! Remove this check if you really know what you're doing."); void initIOSUHax(); @@ -30,12 +32,13 @@ bool sIosuhaxMount = false; int main_loop() { DEBUG_FUNCTION_LINE("Creating state"); ApplicationState state; + CombinedInput baseInput; VPadInput vpadInput; WPADInput wpadInputs[4] = { - WPAD_CHAN_0, - WPAD_CHAN_1, - WPAD_CHAN_2, - WPAD_CHAN_3 + WPAD_CHAN_0, + WPAD_CHAN_1, + WPAD_CHAN_2, + WPAD_CHAN_3 }; if (sFSAFd < 0 || !sIosuhaxMount) { @@ -44,12 +47,17 @@ int main_loop() { DEBUG_FUNCTION_LINE("Entering main loop"); while (WHBProcIsRunning()) { - vpadInput.update(1280, 720); - for (int i = 0; i < 4; i++) { - wpadInputs[i].update(1280, 720); - vpadInput.combine(wpadInputs[i]); + baseInput.reset(); + if (vpadInput.update(1280, 720)) { + baseInput.combine(vpadInput); } - state.update(&vpadInput); + for (auto &wpadInput: wpadInputs) { + if (wpadInput.update(1280, 720)) { + baseInput.combine(wpadInput); + } + } + baseInput.process(); + state.update(&baseInput); state.render(); } diff --git a/source/ScreenUtils.cpp b/source/utils/ScreenUtils.cpp similarity index 97% rename from source/ScreenUtils.cpp rename to source/utils/ScreenUtils.cpp index b593368..3fe9090 100644 --- a/source/ScreenUtils.cpp +++ b/source/utils/ScreenUtils.cpp @@ -1,48 +1,48 @@ -/**************************************************************************** - * Copyright (C) 2018 Maschell - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include "ScreenUtils.h" - -void ScreenUtils::printTextOnScreen(ConsoleScreenID screen, int x, int y, const char *msg) { - if (!msg) { - return; - } - if (screen != CONSOLE_SCREEN_DRC) { // Draw TV if it's not DRC exclusive. - OSScreenPutFontEx(SCREEN_TV, x, y, msg); - } - if (screen != CONSOLE_SCREEN_TV) { // Draw DRC if it's not TV exclusive. - OSScreenPutFontEx(SCREEN_DRC, x, y, msg); - } -} - -void ScreenUtils::OSScreenClear(ConsoleScreenID screen, uint32_t color) { - if (screen != CONSOLE_SCREEN_DRC) { // Clear TV if it's not DRC exclusive. - OSScreenClearBufferEx(SCREEN_TV, color); - } - if (screen != CONSOLE_SCREEN_TV) { // Clear DRC if it's not TV exclusive. - OSScreenClearBufferEx(SCREEN_DRC, color); - } -} - -void ScreenUtils::flipBuffers(ConsoleScreenID screen) { - if (screen != CONSOLE_SCREEN_DRC) { // Flip TV buffer if it's not DRC exclusive. - OSScreenFlipBuffersEx(SCREEN_TV); - } - if (screen != CONSOLE_SCREEN_TV) { // Flip DRC buffer if it's not TV exclusive. - OSScreenFlipBuffersEx(SCREEN_DRC); - } -} +/**************************************************************************** + * Copyright (C) 2018 Maschell + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ****************************************************************************/ +#include +#include "ScreenUtils.h" + +void ScreenUtils::printTextOnScreen(ConsoleScreenID screen, int x, int y, const char *msg) { + if (!msg) { + return; + } + if (screen != CONSOLE_SCREEN_DRC) { // Draw TV if it's not DRC exclusive. + OSScreenPutFontEx(SCREEN_TV, x, y, msg); + } + if (screen != CONSOLE_SCREEN_TV) { // Draw DRC if it's not TV exclusive. + OSScreenPutFontEx(SCREEN_DRC, x, y, msg); + } +} + +void ScreenUtils::OSScreenClear(ConsoleScreenID screen, uint32_t color) { + if (screen != CONSOLE_SCREEN_DRC) { // Clear TV if it's not DRC exclusive. + OSScreenClearBufferEx(SCREEN_TV, color); + } + if (screen != CONSOLE_SCREEN_TV) { // Clear DRC if it's not TV exclusive. + OSScreenClearBufferEx(SCREEN_DRC, color); + } +} + +void ScreenUtils::flipBuffers(ConsoleScreenID screen) { + if (screen != CONSOLE_SCREEN_DRC) { // Flip TV buffer if it's not DRC exclusive. + OSScreenFlipBuffersEx(SCREEN_TV); + } + if (screen != CONSOLE_SCREEN_TV) { // Flip DRC buffer if it's not TV exclusive. + OSScreenFlipBuffersEx(SCREEN_DRC); + } +} diff --git a/source/ScreenUtils.h b/source/utils/ScreenUtils.h similarity index 97% rename from source/ScreenUtils.h rename to source/utils/ScreenUtils.h index 3c1ad44..1428049 100644 --- a/source/ScreenUtils.h +++ b/source/utils/ScreenUtils.h @@ -1,55 +1,55 @@ -/**************************************************************************** - * Copyright (C) 2018-2020 Maschell - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#pragma once - -//! Defines the ID of a display usable with OSScreen. -typedef enum ConsoleScreenID { - //! Represents the TV connected to the system. - CONSOLE_SCREEN_TV = 0, - //! Represents the screen in the DRC (gamepad). - CONSOLE_SCREEN_DRC = 1, - //! Represents both screens - CONSOLE_SCREEN_BOTH = 2, -} ConsoleScreenID; - -class ScreenUtils { -public: - /** - Clears the screen for the given screens - \param screen defines on which screens should be printed - \param x defines the x position (character position) where the text should be printed - \param y defines on which line the text should be printed - \param msg C string that contains the text to be printed. - **/ - static void printTextOnScreen(ConsoleScreenID screen, int x, int y, const char *msg); - - /** - Clears the screen for the given screens - \param screen defines which screens should be cleared - **/ - static void OSScreenClear(ConsoleScreenID screen, uint32_t i); - - /** - Flips the buffer for the given screens - \param screen defines which screens should be flipped. - **/ - static void flipBuffers(ConsoleScreenID screen); - -private: - ScreenUtils() = default; - ~ScreenUtils() = default; +/**************************************************************************** + * Copyright (C) 2018-2020 Maschell + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ****************************************************************************/ +#pragma once + +//! Defines the ID of a display usable with OSScreen. +typedef enum ConsoleScreenID { + //! Represents the TV connected to the system. + CONSOLE_SCREEN_TV = 0, + //! Represents the screen in the DRC (gamepad). + CONSOLE_SCREEN_DRC = 1, + //! Represents both screens + CONSOLE_SCREEN_BOTH = 2, +} ConsoleScreenID; + +class ScreenUtils { +public: + /** + Clears the screen for the given screens + \param screen defines on which screens should be printed + \param x defines the x position (character position) where the text should be printed + \param y defines on which line the text should be printed + \param msg C string that contains the text to be printed. + **/ + static void printTextOnScreen(ConsoleScreenID screen, int x, int y, const char *msg); + + /** + Clears the screen for the given screens + \param screen defines which screens should be cleared + **/ + static void OSScreenClear(ConsoleScreenID screen, uint32_t i); + + /** + Flips the buffer for the given screens + \param screen defines which screens should be flipped. + **/ + static void flipBuffers(ConsoleScreenID screen); + +private: + ScreenUtils() = default; + ~ScreenUtils() = default; }; \ No newline at end of file diff --git a/source/StringTools.cpp b/source/utils/StringTools.cpp similarity index 100% rename from source/StringTools.cpp rename to source/utils/StringTools.cpp diff --git a/source/StringTools.h b/source/utils/StringTools.h similarity index 100% rename from source/StringTools.h rename to source/utils/StringTools.h diff --git a/source/WiiUScreen.cpp b/source/utils/WiiUScreen.cpp similarity index 96% rename from source/WiiUScreen.cpp rename to source/utils/WiiUScreen.cpp index 90d2c2c..6c3c2bc 100644 --- a/source/WiiUScreen.cpp +++ b/source/utils/WiiUScreen.cpp @@ -1,93 +1,93 @@ -#include "WiiUScreen.h" -#include "ScreenUtils.h" -#include -#include -#include - -void *WiiUScreen::sBufferTV = nullptr; -void *WiiUScreen::sBufferDRC = nullptr; -uint32_t WiiUScreen::sBufferSizeTV = 0; -uint32_t WiiUScreen::sBufferSizeDRC = 0; -bool WiiUScreen::sConsoleHasForeground = true; -uint32_t WiiUScreen::consoleColor = 0x041F60FF; -uint32_t WiiUScreen::consoleCursorY = 0; - -uint32_t WiiUScreen::ProcCallbackAcquired(void *context) { - MEMHeapHandle heap = MEMGetBaseHeapHandle(MEM_BASE_HEAP_MEM1); - if (sBufferSizeTV) { - sBufferTV = MEMAllocFromFrmHeapEx(heap, sBufferSizeTV, 4); - } - - if (sBufferSizeDRC) { - sBufferDRC = MEMAllocFromFrmHeapEx(heap, sBufferSizeDRC, 4); - } - - sConsoleHasForeground = true; - OSScreenSetBufferEx(SCREEN_TV, sBufferTV); - OSScreenSetBufferEx(SCREEN_DRC, sBufferDRC); - return 0; -} - -uint32_t WiiUScreen::ProcCallbackReleased(void *context) { - MEMHeapHandle heap = MEMGetBaseHeapHandle(MEM_BASE_HEAP_MEM1); - MEMFreeByStateToFrmHeap(heap, CONSOLE_FRAME_HEAP_TAG); - sConsoleHasForeground = FALSE; - return 0; -} - -bool WiiUScreen::Init() { - OSScreenInit(); - sBufferSizeTV = OSScreenGetBufferSizeEx(SCREEN_TV); - sBufferSizeDRC = OSScreenGetBufferSizeEx(SCREEN_DRC); - - WiiUScreen::ProcCallbackAcquired(nullptr); - OSScreenEnableEx(SCREEN_TV, 1); - OSScreenEnableEx(SCREEN_DRC, 1); - - ScreenUtils::OSScreenClear(CONSOLE_SCREEN_BOTH, WiiUScreen::consoleColor); - - ProcUIRegisterCallback(PROCUI_CALLBACK_ACQUIRE, WiiUScreen::ProcCallbackAcquired, nullptr, 100); - ProcUIRegisterCallback(PROCUI_CALLBACK_RELEASE, WiiUScreen::ProcCallbackReleased, nullptr, 100); - return true; -} - -void WiiUScreen::DeInit() { - if (sConsoleHasForeground) { - OSScreenShutdown(); - WiiUScreen::ProcCallbackReleased(nullptr); - } -} - -void WiiUScreen::drawLinef(const char *fmt, ...) { - char *buf = (char *) MEMAllocFromDefaultHeapEx(PRINTF_BUFFER_LENGTH, 4); - va_list va; - - if (!buf) { - return; - } - - va_start(va, fmt); - vsnprintf(buf, PRINTF_BUFFER_LENGTH, fmt, va); - - WiiUScreen::drawLine(buf); - - MEMFreeToDefaultHeap(buf); - va_end(va); -} - -void WiiUScreen::drawLine() { - WiiUScreen::drawLine(""); -} - -void WiiUScreen::drawLine(const char *msg) { - ScreenUtils::printTextOnScreen(CONSOLE_SCREEN_BOTH, 0, consoleCursorY++, msg); -} - -void WiiUScreen::flipBuffers() { - ScreenUtils::flipBuffers(CONSOLE_SCREEN_BOTH); -} - -void WiiUScreen::clearScreen() { - ScreenUtils::OSScreenClear(CONSOLE_SCREEN_BOTH, WiiUScreen::consoleColor); - consoleCursorY = 0; -} +#include "WiiUScreen.h" +#include "ScreenUtils.h" +#include +#include +#include + +void *WiiUScreen::sBufferTV = nullptr; +void *WiiUScreen::sBufferDRC = nullptr; +uint32_t WiiUScreen::sBufferSizeTV = 0; +uint32_t WiiUScreen::sBufferSizeDRC = 0; +bool WiiUScreen::sConsoleHasForeground = true; +uint32_t WiiUScreen::consoleColor = 0x041F60FF; +uint32_t WiiUScreen::consoleCursorY = 0; + +uint32_t WiiUScreen::ProcCallbackAcquired(void *context) { + MEMHeapHandle heap = MEMGetBaseHeapHandle(MEM_BASE_HEAP_MEM1); + if (sBufferSizeTV) { + sBufferTV = MEMAllocFromFrmHeapEx(heap, sBufferSizeTV, 4); + } + + if (sBufferSizeDRC) { + sBufferDRC = MEMAllocFromFrmHeapEx(heap, sBufferSizeDRC, 4); + } + + sConsoleHasForeground = true; + OSScreenSetBufferEx(SCREEN_TV, sBufferTV); + OSScreenSetBufferEx(SCREEN_DRC, sBufferDRC); + return 0; +} + +uint32_t WiiUScreen::ProcCallbackReleased(void *context) { + MEMHeapHandle heap = MEMGetBaseHeapHandle(MEM_BASE_HEAP_MEM1); + MEMFreeByStateToFrmHeap(heap, CONSOLE_FRAME_HEAP_TAG); + sConsoleHasForeground = FALSE; + return 0; +} + +bool WiiUScreen::Init() { + OSScreenInit(); + sBufferSizeTV = OSScreenGetBufferSizeEx(SCREEN_TV); + sBufferSizeDRC = OSScreenGetBufferSizeEx(SCREEN_DRC); + + WiiUScreen::ProcCallbackAcquired(nullptr); + OSScreenEnableEx(SCREEN_TV, 1); + OSScreenEnableEx(SCREEN_DRC, 1); + + ScreenUtils::OSScreenClear(CONSOLE_SCREEN_BOTH, WiiUScreen::consoleColor); + + ProcUIRegisterCallback(PROCUI_CALLBACK_ACQUIRE, WiiUScreen::ProcCallbackAcquired, nullptr, 100); + ProcUIRegisterCallback(PROCUI_CALLBACK_RELEASE, WiiUScreen::ProcCallbackReleased, nullptr, 100); + return true; +} + +void WiiUScreen::DeInit() { + if (sConsoleHasForeground) { + OSScreenShutdown(); + WiiUScreen::ProcCallbackReleased(nullptr); + } +} + +void WiiUScreen::drawLinef(const char *fmt, ...) { + char *buf = (char *) MEMAllocFromDefaultHeapEx(PRINTF_BUFFER_LENGTH, 4); + va_list va; + + if (!buf) { + return; + } + + va_start(va, fmt); + vsnprintf(buf, PRINTF_BUFFER_LENGTH, fmt, va); + + WiiUScreen::drawLine(buf); + + MEMFreeToDefaultHeap(buf); + va_end(va); +} + +void WiiUScreen::drawLine() { + WiiUScreen::drawLine(""); +} + +void WiiUScreen::drawLine(const char *msg) { + ScreenUtils::printTextOnScreen(CONSOLE_SCREEN_BOTH, 0, consoleCursorY++, msg); +} + +void WiiUScreen::flipBuffers() { + ScreenUtils::flipBuffers(CONSOLE_SCREEN_BOTH); +} + +void WiiUScreen::clearScreen() { + ScreenUtils::OSScreenClear(CONSOLE_SCREEN_BOTH, WiiUScreen::consoleColor); + consoleCursorY = 0; +} diff --git a/source/WiiUScreen.h b/source/utils/WiiUScreen.h similarity index 93% rename from source/WiiUScreen.h rename to source/utils/WiiUScreen.h index 69127ef..30a33c6 100644 --- a/source/WiiUScreen.h +++ b/source/utils/WiiUScreen.h @@ -1,53 +1,53 @@ -#pragma once - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include "utils/logger.h" - -#define NUM_LINES (16) -#define LINE_LENGTH (128) -#define CONSOLE_FRAME_HEAP_TAG (0x000DECAF) -#define PRINTF_BUFFER_LENGTH 2048 - -#define DEBUG_CONSOLE_LOG(FMT, ARGS...)do { \ - DEBUG_FUNCTION_LINE(FMT, ## ARGS); \ - WiiUScreen::drawLinef(FMT, ## ARGS); \ - } while (0) - - -class WiiUScreen { - -public: - static uint32_t ProcCallbackAcquired(void *context); - - static uint32_t ProcCallbackReleased(void *context); - - static bool Init(); - - static void DeInit(); - - static void drawLinef(const char *fmt, ...); - - static void drawLine(const char *fmt); - - static void drawLine(); - - static void flipBuffers(); - - static void clearScreen(); - -private: - static void *sBufferTV, *sBufferDRC; - static uint32_t sBufferSizeTV, sBufferSizeDRC; - static bool sConsoleHasForeground; - static uint32_t consoleColor; - static uint32_t consoleCursorY; +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "logger.h" + +#define NUM_LINES (16) +#define LINE_LENGTH (128) +#define CONSOLE_FRAME_HEAP_TAG (0x000DECAF) +#define PRINTF_BUFFER_LENGTH 2048 + +#define DEBUG_CONSOLE_LOG(FMT, ARGS...)do { \ + DEBUG_FUNCTION_LINE(FMT, ## ARGS); \ + WiiUScreen::drawLinef(FMT, ## ARGS); \ + } while (0) + + +class WiiUScreen { + +public: + static uint32_t ProcCallbackAcquired(void *context); + + static uint32_t ProcCallbackReleased(void *context); + + static bool Init(); + + static void DeInit(); + + static void drawLinef(const char *fmt, ...); + + static void drawLine(const char *fmt); + + static void drawLine(); + + static void flipBuffers(); + + static void clearScreen(); + +private: + static void *sBufferTV, *sBufferDRC; + static uint32_t sBufferSizeTV, sBufferSizeDRC; + static bool sConsoleHasForeground; + static uint32_t consoleColor; + static uint32_t consoleCursorY; }; \ No newline at end of file