From afd6ea0add35f84abd7942cdffdb414ee36881bd Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Sat, 20 Jul 2024 11:05:40 +0200 Subject: [PATCH] Final v1.0.0 cleanup --- README.md | 30 ++++++++++++---- dist/wiiu/apps/Koopair/icon.png | Bin 16084 -> 7862 bytes koopair/Makefile | 10 ++++-- koopair/README.md | 1 + koopair/data/shell.png | Bin 0 -> 5747 bytes koopair/icon.png | Bin 11327 -> 10052 bytes koopair/source/Controller.cpp | 34 +++++++++++++++++- koopair/source/Controller.hpp | 2 ++ koopair/source/Gfx.cpp | 18 ++++++++-- koopair/source/Gfx.hpp | 2 ++ koopair/source/Screen.cpp | 8 ++--- .../ControllerConfigurationsScreen.cpp | 3 +- .../screens/ControllerMappingScreen.cpp | 3 +- .../screens/ControllerOptionsScreen.cpp | 2 +- .../screens/ControllerPairingScreen.cpp | 3 +- koopair/source/screens/MainScreen.cpp | 4 +-- koopair/source/screens/SettingsScreen.cpp | 3 +- 17 files changed, 97 insertions(+), 26 deletions(-) create mode 100644 koopair/data/shell.png diff --git a/README.md b/README.md index 8f27b25..5012d3f 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ It temporarily applies patches to the IOS-PAD module responsible for Bluetooth c - Connect up to 7 controllers wirelessly via Bluetooth - Rumble support - Battery levels +- Button and stick remapping (only for Bloopair controllers) ## Supported controllers - Nintendo Switch Pro Controller @@ -22,19 +23,31 @@ To pair a DualShock 3 to the console, see the [Pairing a DualShock 3](#pairing-a ## Installation - Download and extract the latest .zip from the [releases page](https://github.com/GaryOderNichts/Bloopair/releases). - Copy the `30_bloopair.rpx` from the .zip file to the `modules/setup/` folder of your target environment on the SD Card. - This would be `wiiu/environments/tiramisu/modules/setup/` for Tiramisu. + This would be `wiiu/environments/aroma/modules/setup/` for Aroma. - Copy the `wiiu` folder from the .zip and copy it to the root of your SD Card. If you're using aroma you can delete the `Koopair.rpx` in the `wiiu/apps` folder and use the .wuhb instead. -Make sure you're using Tiramisu or Aroma. Follow https://wiiu.hacks.guide/#/ to setup Tiramisu. -More info about Tiramisu here: https://maschell.github.io/homebrew/2021/12/31/tiramisu.html +Make sure you're using Aroma or Tiramisu. Follow https://wiiu.hacks.guide/#/ to setup Aroma. ## Usage -- Once you're booted into Tiramisu and are in the Wii U menu, press the SYNC button on your console and controller. +- Once you're booted into Aroma or Tiramisu and are in the Wii U menu, press the SYNC button on your console and controller. - Wait until the Controller is connected. If a controller had been paired in the past, simply turn it on again and it should reconnect. +## Koopair +Koopair is the Bloopair companion app which comes with Bloopair. + + + + +Koopair supports: +- Testing connected controllers +- Creating mappings for buttons and sticks +- Editing controller options +- Managing configuration files +- Pairing DualShock 3 controllers + ## Pairing a DualShock 3 The DualShock 3 needs to be paired using a USB cable. After the initial pairing it can be used like any other wireless Bluetooth controller. - Open Koopair from the Wii U menu or Homebrew Launcher. Now open the "Controller Pairing" option on the menu. @@ -47,16 +60,20 @@ The DualShock 3 is now ready to use with the console. ## FAQ / Troubleshooting -### My controller doesn't pair to the console +**My controller doesn't pair to the console** Make sure Bloopair is running and both the console and the controller are in SYNC mode. Also make sure the controller is on the supported list. Wait for about a minute, and if nothing happens restart your console and redo the process. You can also try [clearing controller syncs](https://en-americas-support.nintendo.com/app/answers/detail/a_id/1705/~/how-to-clear-all-syncs). -### Will you add support for controller xyz? +**Will you add support for controller xyz?** Possibly, I've for now added support for all the controllers I currently own. Maybe I can get a few more controllers which I could add support for. Pull requests for different controllers are always welcome. +**Where are configuration files stored?** +Bloopair loads configuration files from the `wiiu/bloopair` folder on your SD Card. +This means configurations work across multiple environments. + ## To-Do - Support more controllers - Bluetooth LE support (Unlikely, only partially supported by the Bluetooth Stack) @@ -87,5 +104,6 @@ Koopair additionally requires the following packages: - wiiu-sdl2 - wiiu-sdl2_gfx - wiiu-sdl2_ttf +- wiiu-sdl2_image Run `make`. diff --git a/dist/wiiu/apps/Koopair/icon.png b/dist/wiiu/apps/Koopair/icon.png index a7a6c0583af35d9cfc65e9759465f46d6980a397..aec51511955294f3fbcc215dc2f86611fa17f9c2 100644 GIT binary patch literal 7862 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 MepQsJ`eGdXKMyQv>i_@% literal 16084 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 dZR1M=%g3)Z+aVn)55*{ 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 diff --git a/koopair/Makefile b/koopair/Makefile index e16e5bb..ce7d7ea 100644 --- a/koopair/Makefile +++ b/koopair/Makefile @@ -13,7 +13,7 @@ TOPDIR ?= $(CURDIR) # APP_SHORTNAME sets the short name of the application # APP_AUTHOR sets the author of the application #------------------------------------------------------------------------------- -APP_NAME := Bloopair Companion App +APP_NAME := Koopair APP_SHORTNAME := Koopair APP_AUTHOR := GaryOderNichts APP_VERSION := 1.0.0 @@ -56,7 +56,7 @@ CXXFLAGS := $(CFLAGS) -std=gnu++20 ASFLAGS := $(ARCH) LDFLAGS = $(ARCH) $(RPXSPECS) -Wl,-Map,$(notdir $*.map) -LIBS := -lSDL2 -lSDL2_ttf -lSDL2_gfx -lfreetype -lharfbuzz -lfreetype -lpng -lbz2 -lz -lbloopair -lwut +LIBS := -lSDL2 -lSDL2_ttf -lSDL2_gfx -lSDL2_image -lfreetype -lharfbuzz -lfreetype -lpng -lbz2 -lz -lbloopair -lwut ifeq ($(DEBUG), 1) CFLAGS += -g -DCOMMIT_HASH=\"$(BLOOPAIR_COMMIT_HASH)\" @@ -200,6 +200,12 @@ $(OFILES_SRC) : $(HFILES_BIN) @echo $(notdir $<) @$(bin2o) +#------------------------------------------------------------------------------- +%.png.o %_png.h : %.png +#------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + -include $(DEPENDS) #------------------------------------------------------------------------------- diff --git a/koopair/README.md b/koopair/README.md index cbd1c61..b72b7dd 100644 --- a/koopair/README.md +++ b/koopair/README.md @@ -6,3 +6,4 @@ Koopair additionally requires the following packages: - wiiu-sdl2 - wiiu-sdl2_gfx - wiiu-sdl2_ttf +- wiiu-sdl2_image diff --git a/koopair/data/shell.png b/koopair/data/shell.png new file mode 100644 index 0000000000000000000000000000000000000000..077f04c371d6c2255d4d9a018b4c09d4d2ae9148 GIT binary patch literal 5747 zcmeI0cTm&Mo5w$aAiehv3MxHxkP?tC#ZVLwfrK7<2}PtNG(nIepi)Hm(gmeSQ3L{^ z2?_$zh0wbgiV*to{oeh4GdDN)|NU`0&+hC#`+CpL?z6MAy9qE8Jz6R*DgXdz4fM6m z004AZ1EK(sp;c1c)IM(i?6b#u`&Af!d`Eg>F{{4 zK7|SXpn7-f)x%>lW3J~c?0W6>b8|foqwQVRmgJV245xr!kgpjkjp^bg%Y)8P-=8VL zhkU`mfdW%R_9!#C+>FA=mzY=I-aW-wf*Cp>aSZ8M&R-48sBC-2)xyGB5_c=NSI>D! z-De%pcZHH=aUT*C<6RZJqW9GOUS&FE5_3a_i>R5P{&I$8_^MQY73sLj?WjF*J_05a{AoMx_ zpkn~w_|k=51AssX0Bpbk;MOYuVE4`aWU6`@vrL$gh0Y~#@&D=n(h8`H1Ze3_pIine z7G-8)4gefH)LbSQbmY^CrNxMv<^8}L?5ni_Y{p4z*HDQ+Dc9?asQw&Wo#7rMln7eS zD&zFe8}G$evs74YzTIFAZ@1EWvbS<3ReFe+&N#hQE{ydr0<}HPIHeo=K&Z>VZo z+|Nkg^6Z=0uv38;MbxjOxgf=64+)yVQPIy$J|c9JTWWZ0(BHcYiW=Q9E_YCiHS<+mRR!n!Tw>{T!>?@iGnlCHie1#%*!s zh$uuz)O}$uU9760S12bpRju^ZUO^obaP_8dBgkpDxK#!~3|BfiVXZaLVyDr8Rkt{n zY2`YCTo1Gip`Y;?_mbqOoF788cDu3P9Uz6v$RZbY!HE!MlEJModj6h{L3ygmFFndV z9LWb1A?;P6J-;aNF+BVU6ZY5399HguROe*Rzn#gIak(eTdXb-qKLjesTo0r6y1g2^ zzs$S;^}FhWeeK&d;j14=UraL-DKLprHv|_)bqjB0TyJgGIveJYX$Wjx7)XtoyMz7> z9>#Mn?X_#bS#dWN5@9Te1MR7vCxlFXnzS2SZX@#t5Aln-bx0HdkwY1bey^`Ky^1_I(<4wrr6v~>3{b}jLFgbF$ zX3uS}WbMbhW!|z&Z; z*}+!z#ZUJ6Grhko1xuiKRsO?<&Q56npeHxb*0czj`el0*Io-g@E^bpI-d`);9~9Q# z;PiN}MmdQ6hTkyi%b56PLy%WP;ClAV%-HLhaQovnawef2Ks{ASpErwOuAZ#Fa6*{H z;hJHh#@$Xv|78HVX);*Vn6_%TX{?&OE5{T60Y4 z(e*kTn^GDPcy+Qe7W56i?EEO+4dN;Og0MdI+bTK*IagoOlMGfrp6UC9o5BrEPD44w z6e!ptBdc<#kKy}V6*-PtB$0nTu`@{=>`4n&ViSTBQv7uX^
  • &Txu0PEL$h3;szT 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 SnY<*>0+N?jk*bm~3;Qozgdzn1 literal 11327 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
    *V KPADController::GetBDA() const } CombinedInputController::CombinedInputController() : Controller(), - mName("Combined Controller") + mName("Combined Controller"), + mPreviousButtons() { } @@ -342,9 +348,35 @@ bool CombinedInputController::Combine(const std::vector& cont mButtonsHeld |= c->GetButtonsHeld(); mButtonsTriggered |= c->GetButtonsTriggered(); + if (c->GetStickL().x > 0.2f) { + if ((mPreviousButtons & BUTTON_RIGHT) == 0) { + mButtonsTriggered |= BUTTON_RIGHT; + } + mButtonsHeld |= BUTTON_RIGHT; + } else if (c->GetStickL().x < -0.2f) { + if ((mPreviousButtons & BUTTON_LEFT) == 0) { + mButtonsTriggered |= BUTTON_LEFT; + } + mButtonsHeld |= BUTTON_LEFT; + } + if (c->GetStickL().y > 0.2f) { + if ((mPreviousButtons & BUTTON_UP) == 0) { + mButtonsTriggered |= BUTTON_UP; + } + mButtonsHeld |= BUTTON_UP; + } else if (c->GetStickL().y < -0.2f) { + if ((mPreviousButtons & BUTTON_DOWN) == 0) { + mButtonsTriggered |= BUTTON_DOWN; + } + mButtonsHeld |= BUTTON_DOWN; + } + + // TODO sticks } + mPreviousButtons = mButtonsHeld; + return true; } diff --git a/koopair/source/Controller.hpp b/koopair/source/Controller.hpp index 06aabf8..416807f 100644 --- a/koopair/source/Controller.hpp +++ b/koopair/source/Controller.hpp @@ -186,4 +186,6 @@ class CombinedInputController : public Controller { private: std::string mName; + + Buttons mPreviousButtons; }; diff --git a/koopair/source/Gfx.cpp b/koopair/source/Gfx.cpp index 7c85d1d..d12a489 100644 --- a/koopair/source/Gfx.cpp +++ b/koopair/source/Gfx.cpp @@ -17,6 +17,7 @@ #include "Gfx.hpp" #include "SDL_FontCache.h" #include +#include #include #include @@ -25,6 +26,7 @@ #include #include +#include namespace { @@ -45,6 +47,8 @@ TTF_Font* iconFont = nullptr; std::map iconCache; +SDL_Texture* appIcon = nullptr; + FC_Font* GetFontForSize(int size) { if (fontMap.contains(size)) { @@ -67,6 +71,10 @@ FC_Font* GetFontForSize(int size) SDL_Texture* LoadIcon(Uint16 icon) { + if (icon == Gfx::APP_ICON) { + return appIcon; + } + if (iconCache.contains(icon)) { return iconCache[icon]; } @@ -123,17 +131,22 @@ bool Init() return false; } - if (!FC_LoadFont_RW(monospaceFont, renderer, SDL_RWFromMem((void*)ter_u32b_bdf, ter_u32b_bdf_size), 1, 32, Gfx::COLOR_BLACK, TTF_STYLE_NORMAL)) { + if (!FC_LoadFont_RW(monospaceFont, renderer, SDL_RWFromConstMem(ter_u32b_bdf, ter_u32b_bdf_size), 1, 32, Gfx::COLOR_BLACK, TTF_STYLE_NORMAL)) { FC_FreeFont(monospaceFont); return false; } // icons @256 should be large enough for our needs - iconFont = TTF_OpenFontRW(SDL_RWFromMem((void*)fa_solid_900_ttf, fa_solid_900_ttf_size), 1, 256); + iconFont = TTF_OpenFontRW(SDL_RWFromConstMem(fa_solid_900_ttf, fa_solid_900_ttf_size), 1, 256); if (!iconFont) { return false; } + appIcon = IMG_LoadTextureTyped_RW(renderer, SDL_RWFromConstMem(shell_png, shell_png_size), 1, "PNG"); + if (!appIcon) { + return false; + } + return true; } @@ -147,6 +160,7 @@ void Shutdown() SDL_DestroyTexture(value); } + SDL_DestroyTexture(appIcon); FC_FreeFont(monospaceFont); TTF_CloseFont(iconFont); TTF_Quit(); diff --git a/koopair/source/Gfx.hpp b/koopair/source/Gfx.hpp index e15123e..dc22e44 100644 --- a/koopair/source/Gfx.hpp +++ b/koopair/source/Gfx.hpp @@ -39,6 +39,8 @@ constexpr SDL_Color COLOR_BARS = { 0x00, 0x22, 0x42, 0xff }; constexpr SDL_Color COLOR_ERROR = { 0xff, 0x33, 0x33, 0xff }; constexpr SDL_Color COLOR_WIIU = { 0x00, 0x95, 0xc7, 0xff }; +constexpr uint16_t APP_ICON = 0xfffe; + enum AlignFlags { ALIGN_LEFT = 1 << 0, ALIGN_RIGHT = 1 << 1, diff --git a/koopair/source/Screen.cpp b/koopair/source/Screen.cpp index caf3c7f..649631b 100644 --- a/koopair/source/Screen.cpp +++ b/koopair/source/Screen.cpp @@ -23,12 +23,12 @@ void Screen::DrawTopBar(const char* name) Gfx::DrawRectFilled(0, 0, Gfx::SCREEN_WIDTH, 75, Gfx::COLOR_BARS); // draw top bar content - Gfx::DrawIcon(32, 75 / 2, 60, Gfx::COLOR_TEXT, 0xffff, Gfx::ALIGN_VERTICAL); - Gfx::Print(128, 75 / 2, 60, Gfx::COLOR_TEXT, "Koopair", Gfx::ALIGN_VERTICAL); + Gfx::DrawIcon(68, 75 / 2, 60, Gfx::COLOR_TEXT, Gfx::APP_ICON, Gfx::ALIGN_CENTER); + Gfx::Print(128 + 8, 75 / 2, 60, Gfx::COLOR_TEXT, "Koopair", Gfx::ALIGN_VERTICAL); #ifdef NDEBUG - Gfx::Print(Gfx::GetTextWidth(60, "Koopair") + 128 + 16, 75 / 2 + 5, 50, Gfx::COLOR_ALT_TEXT, "v" APP_VERSION, Gfx::ALIGN_VERTICAL); + Gfx::Print(Gfx::GetTextWidth(60, "Koopair") + 128 + 8 + 16, 75 / 2 + 5, 50, Gfx::COLOR_ALT_TEXT, "v" APP_VERSION, Gfx::ALIGN_VERTICAL); #else - Gfx::Print(Gfx::GetTextWidth(60, "Koopair") + 128 + 16, 75 / 2 + 5, 50, Gfx::COLOR_ALT_TEXT, "v" APP_VERSION "-" + std::string(COMMIT_HASH).substr(0, 7), Gfx::ALIGN_VERTICAL); + Gfx::Print(Gfx::GetTextWidth(60, "Koopair") + 128 + 8 + 16, 75 / 2 + 5, 50, Gfx::COLOR_ALT_TEXT, "v" APP_VERSION "-" + std::string(COMMIT_HASH).substr(0, 7), Gfx::ALIGN_VERTICAL); #endif if (name) Gfx::Print(Gfx::SCREEN_WIDTH - 32, 75 / 2, 50, Gfx::COLOR_ALT_TEXT, name, Gfx::ALIGN_VERTICAL | Gfx::ALIGN_RIGHT); diff --git a/koopair/source/screens/ControllerConfigurationsScreen.cpp b/koopair/source/screens/ControllerConfigurationsScreen.cpp index c7f30bb..8baaeca 100644 --- a/koopair/source/screens/ControllerConfigurationsScreen.cpp +++ b/koopair/source/screens/ControllerConfigurationsScreen.cpp @@ -42,8 +42,7 @@ ControllerConfigurationsScreen::~ControllerConfigurationsScreen() void ControllerConfigurationsScreen::Draw() { - // TODO - DrawTopBar("ControllerConfigurationsScreen"); + DrawTopBar("Controller Configurations"); if (!mConfigurations.empty()) { int drawIndex = 0; diff --git a/koopair/source/screens/ControllerMappingScreen.cpp b/koopair/source/screens/ControllerMappingScreen.cpp index 012a462..faf13eb 100644 --- a/koopair/source/screens/ControllerMappingScreen.cpp +++ b/koopair/source/screens/ControllerMappingScreen.cpp @@ -245,8 +245,7 @@ ControllerMappingScreen::~ControllerMappingScreen() void ControllerMappingScreen::Draw() { - // TODO - DrawTopBar("ControllerMappingScreen"); + DrawTopBar("Controller Mapping"); int drawIndex = 0; for (size_t i = mSelectionStart; i < mSelectionEnd; i++) { diff --git a/koopair/source/screens/ControllerOptionsScreen.cpp b/koopair/source/screens/ControllerOptionsScreen.cpp index b8a71ac..906bb46 100644 --- a/koopair/source/screens/ControllerOptionsScreen.cpp +++ b/koopair/source/screens/ControllerOptionsScreen.cpp @@ -82,7 +82,7 @@ ControllerOptionsScreen::~ControllerOptionsScreen() void ControllerOptionsScreen::Draw() { - DrawTopBar("ControllerOptionsScreen"); + DrawTopBar("Controller Options"); uint32_t yOff = 128; diff --git a/koopair/source/screens/ControllerPairingScreen.cpp b/koopair/source/screens/ControllerPairingScreen.cpp index d5973f8..7637b1b 100644 --- a/koopair/source/screens/ControllerPairingScreen.cpp +++ b/koopair/source/screens/ControllerPairingScreen.cpp @@ -73,8 +73,7 @@ ControllerPairingScreen::~ControllerPairingScreen() void ControllerPairingScreen::Draw() { - // TODO - DrawTopBar("ControllerPairingScreen"); + DrawTopBar("Controller Pairing"); Gfx::Print(Gfx::SCREEN_WIDTH / 2, Gfx::SCREEN_HEIGHT / 2, 60, Gfx::COLOR_TEXT, "Connect a DualShock 3 using a USB cable\nto any USB port of the system to pair it.\n" diff --git a/koopair/source/screens/MainScreen.cpp b/koopair/source/screens/MainScreen.cpp index 5663095..86730ae 100644 --- a/koopair/source/screens/MainScreen.cpp +++ b/koopair/source/screens/MainScreen.cpp @@ -26,9 +26,9 @@ namespace { -// Let's make sure to not break API for minor and patch versions +// Let's make sure to not break API for patch versions constexpr uint32_t kMinBloopairVersion = BLOOPAIR_VERSION(1, 0, 0); -constexpr uint32_t kMaxBloopairVersion = BLOOPAIR_VERSION(1, 255, 255); +constexpr uint32_t kMaxBloopairVersion = BLOOPAIR_VERSION(1, 0, 255); } diff --git a/koopair/source/screens/SettingsScreen.cpp b/koopair/source/screens/SettingsScreen.cpp index 2d0b3a2..96d4515 100644 --- a/koopair/source/screens/SettingsScreen.cpp +++ b/koopair/source/screens/SettingsScreen.cpp @@ -27,8 +27,7 @@ SettingsScreen::~SettingsScreen() void SettingsScreen::Draw() { - // TODO - DrawTopBar("SettingsScreen"); + DrawTopBar("Settings"); Gfx::Print(Gfx::SCREEN_WIDTH / 2, Gfx::SCREEN_HEIGHT / 2, 60, Gfx::COLOR_TEXT, "Nothing here yet :)", Gfx::ALIGN_CENTER);