diff --git a/Makefile.main b/Makefile.main index 76ea8494..9a92ef3b 100644 --- a/Makefile.main +++ b/Makefile.main @@ -67,7 +67,7 @@ endif #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lcustomfat -lcustomntfs -lcustomext2fs -lpng -lturbojpeg -lm -lz -lwiiuse -lwupc -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad -lsicksaxis +LIBS := -lcustomfat -lcustomntfs -lcustomext2fs -lpng -lturbojpeg -lm -lz -lwiiuse -lwupc -lwiidrc -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad -lsicksaxis #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/out/boot.dol b/out/boot.dol index 707dd167..3ca46d13 100644 Binary files a/out/boot.dol and b/out/boot.dol differ diff --git a/portlibs/include/wiidrc/wiidrc.h b/portlibs/include/wiidrc/wiidrc.h new file mode 100644 index 00000000..937cdb89 --- /dev/null +++ b/portlibs/include/wiidrc/wiidrc.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2017 FIX94 + * + * This software may be modified and distributed under the terms + * of the MIT license. See the LICENSE file for details. + */ +#ifndef _WIIDRC_H_ +#define _WIIDRC_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +struct WiiDRCData { + s16 xAxisL; + s16 xAxisR; + s16 yAxisL; + s16 yAxisR; + u16 button; + u8 battery; + u8 extra; +}; + +#define WIIDRC_BUTTON_A 0x8000 +#define WIIDRC_BUTTON_B 0x4000 +#define WIIDRC_BUTTON_X 0x2000 +#define WIIDRC_BUTTON_Y 0x1000 +#define WIIDRC_BUTTON_LEFT 0x0800 +#define WIIDRC_BUTTON_RIGHT 0x0400 +#define WIIDRC_BUTTON_UP 0x0200 +#define WIIDRC_BUTTON_DOWN 0x0100 +#define WIIDRC_BUTTON_ZL 0x0080 +#define WIIDRC_BUTTON_ZR 0x0040 +#define WIIDRC_BUTTON_L 0x0020 +#define WIIDRC_BUTTON_R 0x0010 +#define WIIDRC_BUTTON_PLUS 0x0008 +#define WIIDRC_BUTTON_MINUS 0x0004 +#define WIIDRC_BUTTON_HOME 0x0002 +#define WIIDRC_BUTTON_SYNC 0x0001 + +#define WIIDRC_EXTRA_BUTTON_L3 0x80 +#define WIIDRC_EXTRA_BUTTON_R3 0x40 +#define WIIDRC_EXTRA_BUTTON_TV 0x20 +#define WIIDRC_EXTRA_OVERLAY_TV 0x10 +#define WIIDRC_EXTRA_OVERLAY_POWER 0x01 + +bool WiiDRC_Init(); +bool WiiDRC_Inited(); +bool WiiDRC_Recalibrate(); +bool WiiDRC_ScanPads(); +bool WiiDRC_Connected(); +bool WiiDRC_ShutdownRequested(); +const u8 *WiiDRC_GetRawI2CAddr(); +const struct WiiDRCData *WiiDRC_Data(); +u32 WiiDRC_ButtonsUp(); +u32 WiiDRC_ButtonsDown(); +u32 WiiDRC_ButtonsHeld(); +s16 WiiDRC_lStickX(); +s16 WiiDRC_lStickY(); +s16 WiiDRC_rStickX(); +s16 WiiDRC_rStickY(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/portlibs/lib/libwiidrc.a b/portlibs/lib/libwiidrc.a new file mode 100644 index 00000000..c3c0e1fa Binary files /dev/null and b/portlibs/lib/libwiidrc.a differ diff --git a/source/btnmap.h b/source/btnmap.h index 8b5aed1b..5b4e116e 100644 --- a/source/btnmap.h +++ b/source/btnmap.h @@ -47,6 +47,7 @@ #define WBTN_2_HELD (wBtn_Held(WPAD_BUTTON_2, WPAD_EXP_NONE) \ || wBtn_Held(WPAD_CLASSIC_BUTTON_X, WPAD_EXP_CLASSIC)) +/* gamecube controller */ #define GBTN_UP (PAD_BUTTON_UP) #define GBTN_DOWN (PAD_BUTTON_DOWN) #define GBTN_LEFT (PAD_BUTTON_LEFT) @@ -85,64 +86,29 @@ #define GBTN_1_HELD (gc_btnsHeld & GBTN_1) #define GBTN_2_HELD (gc_btnsHeld & GBTN_2) -#define DBTN_PS (DS3_BUTTON_PS) -#define DBTN_START (DS3_BUTTON_START) -#define DBTN_SELECT (DS3_BUTTON_SELECT) -#define DBTN_Y (DS3_BUTTON_TRIANGLE) -#define DBTN_Z (DS3_BUTTON_CIRCLE) -#define DBTN_B (DS3_BUTTON_CROSS) -#define DBTN_A (DS3_BUTTON_SQUARE) -#define DBTN_UP (DS3_BUTTON_UP) -#define DBTN_RIGHT (DS3_BUTTON_RIGHT) -#define DBTN_DOWN (DS3_BUTTON_DOWN) -#define DBTN_LEFT (DS3_BUTTON_LEFT) -#define DBTN_L1 (DS3_BUTTON_L1) -#define DBTN_L2 (DS3_BUTTON_L2) -#define DBTN_L3 (DS3_BUTTON_L3) -#define DBTN_R1 (DS3_BUTTON_R1) -#define DBTN_R2 (DS3_BUTTON_R2) -#define DBTN_R3 (DS3_BUTTON_R3) - -#define DBTN_PS_PRESSED (ds3_btnsPressed & DS3_BUTTON_PS) -#define DBTN_START_PRESSED (ds3_btnsPressed & DS3_BUTTON_START) -#define DBTN_SELECT_PRESSED (ds3_btnsPressed & DS3_BUTTON_SELECT) -#define DBTN_Y_PRESSED (ds3_btnsPressed & DS3_BUTTON_TRIANGLE) -#define DBTN_Z_PRESSED (ds3_btnsPressed & DS3_BUTTON_CIRCLE) -#define DBTN_B_PRESSED (ds3_btnsPressed & DS3_BUTTON_CROSS) -#define DBTN_A_PRESSED (ds3_btnsPressed & DS3_BUTTON_SQUARE) -#define DBTN_UP_PRESSED (ds3_btnsPressed & DS3_BUTTON_UP) -#define DBTN_RIGHT_PRESSED (ds3_btnsPressed & DS3_BUTTON_RIGHT) -#define DBTN_DOWN_PRESSED (ds3_btnsPressed & DS3_BUTTON_DOWN) -#define DBTN_LEFT_PRESSED (ds3_btnsPressed & DS3_BUTTON_LEFT) -#define DBTN_L1_PRESSED (ds3_btnsPressed & DS3_BUTTON_L1) -#define DBTN_L2_PRESSED (ds3_btnsPressed & DS3_BUTTON_L2) -#define DBTN_L3_PRESSED (ds3_btnsPressed & DS3_BUTTON_L3) -#define DBTN_R1_PRESSED (ds3_btnsPressed & DS3_BUTTON_R1) -#define DBTN_R2_PRESSED (ds3_btnsPressed & DS3_BUTTON_R2) -#define DBTN_R3_PRESSED (ds3_btnsPressed & DS3_BUTTON_R3) - -#define BTN_UP_PRESSED (WBTN_UP_PRESSED || GBTN_UP_PRESSED || DBTN_UP_PRESSED) -#define BTN_DOWN_PRESSED (WBTN_DOWN_PRESSED || GBTN_DOWN_PRESSED || DBTN_DOWN_PRESSED) -#define BTN_LEFT_PRESSED (WBTN_LEFT_PRESSED || GBTN_LEFT_PRESSED || DBTN_LEFT_PRESSED) -#define BTN_RIGHT_PRESSED (WBTN_RIGHT_PRESSED || GBTN_RIGHT_PRESSED || DBTN_RIGHT_PRESSED) -#define BTN_HOME_PRESSED (WBTN_HOME_PRESSED || GBTN_START_PRESSED || DBTN_START_PRESSED) -#define BTN_MINUS_PRESSED (WBTN_MINUS_PRESSED || GBTN_L_PRESSED || DBTN_L2_PRESSED) -#define BTN_PLUS_PRESSED (WBTN_PLUS_PRESSED || GBTN_R_PRESSED || DBTN_R2_PRESSED) -#define BTN_A_PRESSED (WBTN_A_PRESSED || GBTN_A_PRESSED || DBTN_A_PRESSED || DBTN_Z_PRESSED) -#define BTN_B_PRESSED (WBTN_B_PRESSED || GBTN_B_PRESSED || DBTN_B_PRESSED) -#define BTN_1_PRESSED (WBTN_1_PRESSED || GBTN_1_PRESSED || DBTN_L1_PRESSED) -#define BTN_2_PRESSED (WBTN_2_PRESSED || GBTN_2_PRESSED || DBTN_R1_PRESSED) +/* All controllers */ +#define BTN_UP_PRESSED (WBTN_UP_PRESSED || GBTN_UP_PRESSED) +#define BTN_DOWN_PRESSED (WBTN_DOWN_PRESSED || GBTN_DOWN_PRESSED) +#define BTN_LEFT_PRESSED (WBTN_LEFT_PRESSED || GBTN_LEFT_PRESSED) +#define BTN_RIGHT_PRESSED (WBTN_RIGHT_PRESSED || GBTN_RIGHT_PRESSED) +#define BTN_HOME_PRESSED (WBTN_HOME_PRESSED || GBTN_START_PRESSED) +#define BTN_MINUS_PRESSED (WBTN_MINUS_PRESSED || GBTN_L_PRESSED) +#define BTN_PLUS_PRESSED (WBTN_PLUS_PRESSED || GBTN_R_PRESSED) +#define BTN_A_PRESSED (WBTN_A_PRESSED || GBTN_A_PRESSED) +#define BTN_B_PRESSED (WBTN_B_PRESSED || GBTN_B_PRESSED) +#define BTN_1_PRESSED (WBTN_1_PRESSED || GBTN_1_PRESSED) +#define BTN_2_PRESSED (WBTN_2_PRESSED || GBTN_2_PRESSED) #define BTN_UP_HELD (WBTN_UP_HELD || GBTN_UP_HELD) #define BTN_DOWN_HELD (WBTN_DOWN_HELD || GBTN_DOWN_HELD) -#define BTN_LEFT_HELD (WBTN_LEFT_HELD || GBTN_LEFT_HELD ) +#define BTN_LEFT_HELD (WBTN_LEFT_HELD || GBTN_LEFT_HELD) #define BTN_RIGHT_HELD (WBTN_RIGHT_HELD || GBTN_RIGHT_HELD) #define BTN_HOME_HELD (WBTN_HOME_HELD || GBTN_START_HELD) #define BTN_MINUS_HELD (WBTN_MINUS_HELD || GBTN_L_HELD) #define BTN_PLUS_HELD (WBTN_PLUS_HELD || GBTN_R_HELD) #define BTN_A_HELD (WBTN_A_HELD || GBTN_A_HELD) -#define BTN_B_HELD (WBTN_B_HELD || GBTN_B_HELD || DBTN_B_PRESSED || DBTN_Y_PRESSED) -#define BTN_1_HELD (WBTN_1_HELD || GBTN_1_HELD) +#define BTN_B_HELD (WBTN_B_HELD || GBTN_B_HELD) +#define BTN_1_HELD (WBTN_1_HELD || GBTN_1_HELD) #define BTN_2_HELD (WBTN_2_HELD || GBTN_2_HELD) enum @@ -154,11 +120,11 @@ enum WBTN_A, }; -#define BTN_UP_REPEAT (wii_btnRepeat(WBTN_UP) || gc_btnRepeat(GBTN_UP) || ds3_btnRepeat(DBTN_UP)) -#define BTN_DOWN_REPEAT (wii_btnRepeat(WBTN_DOWN) || gc_btnRepeat(GBTN_DOWN) || ds3_btnRepeat(DBTN_DOWN)) -#define BTN_LEFT_REPEAT (wii_btnRepeat(WBTN_LEFT) || gc_btnRepeat(GBTN_LEFT) || ds3_btnRepeat(DBTN_LEFT)) -#define BTN_RIGHT_REPEAT (wii_btnRepeat(WBTN_RIGHT) || gc_btnRepeat(GBTN_RIGHT) || ds3_btnRepeat(DBTN_RIGHT)) -#define BTN_A_REPEAT (wii_btnRepeat(WBTN_A) || gc_btnRepeat(GBTN_A) || ds3_btnRepeat(DBTN_A)) +#define BTN_UP_REPEAT (wii_btnRepeat(WBTN_UP) || gc_btnRepeat(GBTN_UP)) +#define BTN_DOWN_REPEAT (wii_btnRepeat(WBTN_DOWN) || gc_btnRepeat(GBTN_DOWN)) +#define BTN_LEFT_REPEAT (wii_btnRepeat(WBTN_LEFT) || gc_btnRepeat(GBTN_LEFT)) +#define BTN_RIGHT_REPEAT (wii_btnRepeat(WBTN_RIGHT) || gc_btnRepeat(GBTN_RIGHT)) +#define BTN_A_REPEAT (wii_btnRepeat(WBTN_A) || gc_btnRepeat(GBTN_A)) #define LEFT_STICK_UP lStick_Up() #define LEFT_STICK_DOWN lStick_Down() @@ -169,8 +135,8 @@ enum #define RIGHT_STICK_DOWN rStick_Down() #define RIGHT_STICK_LEFT rStick_Left() #define RIGHT_STICK_RIGHT rStick_Right() -#define RIGHT_STICK_MOVE (RIGHT_STICK_UP || RIGHT_STICK_DOWN \ - || RIGHT_STICK_LEFT || RIGHT_STICK_RIGHT) + +#define RIGHT_STICK_MOVE (RIGHT_STICK_UP || RIGHT_STICK_DOWN || RIGHT_STICK_LEFT || RIGHT_STICK_RIGHT) #define WROLL_LEFT wRoll_Left() #define WROLL_RIGHT wRoll_Right() diff --git a/source/channel/identify.c b/source/channel/identify.c index b78ae443..605a3359 100644 --- a/source/channel/identify.c +++ b/source/channel/identify.c @@ -32,6 +32,10 @@ static inline bool apply_patch(char *name, const u8 *old, const u8 *patch, u32 s return (found > 0); } +/* ISFS_permission for WiiU WiiVC patches made by fix94 */ +static const u8 isfs_perm_wiivc_old[] = { 0x42, 0x9F, 0xD1, 0x03, 0x20, 0x00, 0xBD, 0xF0, 0x09, 0x8B, 0xE7, 0xF8, 0x20, 0x66 }; +static const u8 isfs_perm_wiivc_patch[] = { 0x42, 0x9F, 0x46, 0xC0, 0x20, 0x00, 0xBD, 0xF0, 0x09, 0x8B, 0xE7, 0xF8, 0x20, 0x66 }; + static const u8 isfs_perm_old[] = { 0x42, 0x8B, 0xD0, 0x01, 0x25, 0x66 }; static const u8 isfs_perm_patch[] = { 0x42, 0x8B, 0xE0, 0x01, 0x25, 0x66 }; static const u8 setuid_old[] = { 0xD1, 0x2A, 0x1C, 0x39 }; @@ -43,8 +47,16 @@ static const u8 hash_patch[] = { 0x20, 0x00, 0x23, 0xA2 }; static const u8 new_hash_old[] = { 0x20, 0x07, 0x4B, 0x0B }; static const u8 new_hash_patch[] = { 0x20, 0x00, 0x4B, 0x0B }; -void PatchIOS(bool patch_all) +void PatchIOS(bool patch_all, bool WiiVC) { + if(WiiVC) + { + write32(MEM_PROT, read32(MEM_PROT) & 0x0000FFFF); + apply_patch("isfs_permissions", isfs_perm_wiivc_old, isfs_perm_wiivc_patch, sizeof(isfs_perm_wiivc_patch)); + apply_patch("es_setuid", setuid_old, setuid_patch, sizeof(setuid_patch)); + apply_patch("es_identify", es_identify_old, es_identify_patch, sizeof(es_identify_patch)); + return; + } __ES_Close(); write16(MEM_PROT, 0); /* Do Patching */ diff --git a/source/channel/identify.h b/source/channel/identify.h index 3c97f245..07803860 100644 --- a/source/channel/identify.h +++ b/source/channel/identify.h @@ -6,7 +6,7 @@ extern "C" #ifndef _PATCHER_H_ #define _PATCHER_H_ -void PatchIOS(bool patch_all); +void PatchIOS(bool patch_all, bool WiiVC); #endif diff --git a/source/channel/nand.cpp b/source/channel/nand.cpp index 5c3a3962..83097433 100644 --- a/source/channel/nand.cpp +++ b/source/channel/nand.cpp @@ -79,9 +79,9 @@ void Nand::Init() bool Nand::LoadDefaultIOS(void) { - Patch_AHB(); - s32 ret = IOS_ReloadIOS(IOS_GetPreferredVersion()); - loadIOS(IOS_GetVersion(), false); + Patch_AHB();//apply a patch so the new IOS will also have AHBPROT disabled + s32 ret = IOS_ReloadIOS(IOS_GetPreferredVersion());// reload to preferred IOS. not sure what wiiflows preferred IOS is. + loadIOS(IOS_GetVersion(), false);// this basically does nothing (well very little). definetly doesn't load a IOS or shutdown anything. Init_ISFS(); return (ret == 0); } @@ -1128,7 +1128,7 @@ void Nand::Init_ISFS() { if(isfs_inited) return; - PatchIOS(IOS_GetVersion() < 222); + PatchIOS(IOS_GetVersion() < 222, isWiiVC); usleep(1000); gprintf("Init ISFS\n"); ISFS_Initialize(); diff --git a/source/channel/nand_save.cpp b/source/channel/nand_save.cpp index 90d18a28..445500c4 100644 --- a/source/channel/nand_save.cpp +++ b/source/channel/nand_save.cpp @@ -163,7 +163,7 @@ void NandSave::LoadSettings() ios_settings_t *file = (ios_settings_t*)ISFS_GetFile(ISFS_Path, &size, -1); if(file != NULL && size == sizeof(ios_settings_t)) { - gprintf("Loading IOS Settings from NAND\n"); + gprintf("Loading IOS Settings from wiiflow save\n"); cur_ios = file->cios; if(cur_ios > 0) mainIOS = cur_ios; @@ -177,7 +177,7 @@ void NandSave::LoadSettings() u8 *port = ISFS_GetFile(ISFS_Path, &size, -1); if(port != NULL && size == sizeof(u8)) { - gprintf("Using Port Settings from NAND\n"); + gprintf("Using Port Settings from wiiflow save\n"); currentPort = port[0] & 1; } if(port != NULL) @@ -191,7 +191,7 @@ void NandSave::SaveIOS() memset(&ios_settings, 0, sizeof(ios_settings_t)); ios_settings.cios = cur_ios; ios_settings.use_cios = cur_load; - gprintf("Saving IOS Settings to NAND\n"); + gprintf("Saving IOS Settings to wiiflow save\n"); WriteFile(IOS_SAVE_PATH, (u8*)&ios_settings, sizeof(ios_settings_t)); } @@ -199,7 +199,7 @@ void NandSave::SavePort(u8 port) { if(loaded == false) return; - gprintf("Saving Port Settings to NAND\n"); + gprintf("Saving Port Settings to wiiflow save\n"); WriteFile(PORT_SAVE_PATH, &port, sizeof(port)); } diff --git a/source/gui/coverflow.hpp b/source/gui/coverflow.hpp index 32395267..3a6acad3 100644 --- a/source/gui/coverflow.hpp +++ b/source/gui/coverflow.hpp @@ -8,8 +8,6 @@ #include #include "wiiuse/wpad.h" -#include - #include "video.hpp" #include "FreeTypeGX.h" #include "text.hpp" diff --git a/source/gui/gui.hpp b/source/gui/gui.hpp index b019ba88..54c4d57c 100644 --- a/source/gui/gui.hpp +++ b/source/gui/gui.hpp @@ -7,7 +7,6 @@ #include #include "wiiuse/wpad.h" #include "wupc/wupc.h" -#include "sicksaxis-wrapper/sicksaxis-wrapper.h" #include "video.hpp" #include "FreeTypeGX.h" diff --git a/source/loader/alt_ios.cpp b/source/loader/alt_ios.cpp index 56239f83..12359198 100644 --- a/source/loader/alt_ios.cpp +++ b/source/loader/alt_ios.cpp @@ -57,23 +57,22 @@ bool loadIOS(int ios, bool MountDevices) if(ios != CurIOS && IOS_GetType(ios) != IOS_TYPE_STUB) { - WDVD_Close(); gprintf("Reloading into IOS %i from %i...\n", ios, CurIOS); - ShutdownBeforeExit(); - NandHandle.Patch_AHB(); //No AHBPROT for the next IOS - ret = IOS_ReloadIOS(ios) == 0; - gprintf("AHBPROT after IOS Reload: %u\n", AHBPROT_Patched()); - NandHandle.Init_ISFS(); - WDVD_Init(); + ShutdownBeforeExit();// unmount all, close inputs and dvd drive, deinit ISFS, and close network + NandHandle.Patch_AHB(); //apply a patch so the new IOS will also have AHBPROT disabled + ret = IOS_ReloadIOS(ios) == 0;// convert ret value to true or false + gprintf("AHBPROT disabled after IOS Reload: %s\n", AHBPROT_Patched() ? "yes" : "no"); + NandHandle.Init_ISFS();// re init ISFS + WDVD_Init();// re open dvd drive } - + /* Init_ISFS() before calling IOS_GetCurrentIOSInfo() */ IOS_GetCurrentIOSInfo(); if(CurrentIOS.Type == IOS_TYPE_HERMES) load_ehc_module_ex(); else if(CurrentIOS.Type == IOS_TYPE_WANIN && CurrentIOS.Revision >= 18) load_dip_249(); DeviceHandle.SetModes(); - if(MountDevices && ios != CurIOS) + if(MountDevices && ios != CurIOS)// remount sd and USB if desired DeviceHandle.MountAll(); return ret; diff --git a/source/loader/cios.c b/source/loader/cios.c index ca219500..e011213b 100644 --- a/source/loader/cios.c +++ b/source/loader/cios.c @@ -120,6 +120,8 @@ bool IOS_D2X(u8 ios, u8 *base) u8 IOS_GetType(u8 slot) { + if(isWiiVC) + return IOS_TYPE_NORMAL_IOS; u32 TMD_Length; signed_blob *TMD_Buffer = GetTMD(slot, &TMD_Length); if(TMD_Buffer == NULL) diff --git a/source/loader/sys.c b/source/loader/sys.c index c86b3b0d..84dbac62 100644 --- a/source/loader/sys.c +++ b/source/loader/sys.c @@ -1,9 +1,7 @@ -#include #include -#include +#include #include -#include #include #include @@ -15,9 +13,9 @@ #include "gecko/gecko.hpp" #include "memory/mem2.hpp" #include "memory/memory.h" +#include "sicksaxis-wrapper/sicksaxis-wrapper.h" #include "wiiuse/wpad.h" #include "wupc/wupc.h" -#include "sicksaxis-wrapper/sicksaxis-wrapper.h" /* Variables */ bool reset = false; @@ -34,14 +32,13 @@ void __Wpad_PowerCallback() void Open_Inputs(void) { - /* Initialize Wiimote subsystem */ + /* Initialize controllers - wiiu drc is inited only once in main.cpp */ PAD_Init(); WUPC_Init(); WPAD_Init(); DS3_Init(); - //drc - /* Set POWER button callback */ + /* Set wiimote power button callback */ WPAD_SetPowerButtonCallback(__Wpad_PowerCallback); WPAD_SetDataFormat(WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR); WPAD_SetIdleTimeout(60 * 2); // idle after 2 minutes @@ -51,14 +48,13 @@ void Close_Inputs(void) { WUPC_Shutdown(); - u32 cnt; - /* Disconnect Wiimotes */ - for(cnt = 0; cnt < 4; cnt++) + for(u32 cnt = 0; cnt < 4; cnt++) WPAD_Disconnect(cnt); /* Shutdown Wiimote subsystem */ WPAD_Shutdown(); + DS3_Cleanup(); } diff --git a/source/loader/sys.h b/source/loader/sys.h index 886dba4c..2501f7e4 100644 --- a/source/loader/sys.h +++ b/source/loader/sys.h @@ -50,6 +50,7 @@ bool IsOnWiiU(void); extern void __exception_setreload(int t); extern int mainIOS; extern bool useMainIOS; +extern bool isWiiVC; extern volatile bool NANDemuView; extern volatile bool networkInit; extern u8 currentPartition; diff --git a/source/main.cpp b/source/main.cpp index 4a7c3869..04fe5740 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -22,6 +22,7 @@ #include "menu/menu.hpp" #include "memory/memory.h" +bool isWiiVC = false; bool useMainIOS = false; volatile bool NANDemuView = false; volatile bool networkInit = false; @@ -30,6 +31,8 @@ volatile bool networkInit = false; /* if not then we can skip the 20 second cycle trying to connect a USB device. */ /* this is nice for SD only users */ bool isUsingUSB() { + if(isWiiVC) + return false; /* First check if the app path exists on the SD card, if not then we're using USB */ struct stat dummy; string appPath = fmt("%s:/%s", DeviceName[SD], APPS_DIR); @@ -120,37 +123,61 @@ int main(int argc, char **argv) } } - if(IsOnWiiU()) - gprintf("vWii Mode\n"); - else - gprintf("Real Wii\n"); - /* Init video */ m_vid.init(); if(showFlashImg) m_vid.startImage(); + /* check if WiiVC */ + WiiDRC_Init(); + isWiiVC = WiiDRC_Inited(); + + if(IsOnWiiU()) + { + gprintf("WiiU\n"); + if(isWiiVC) + gprintf("WiiVC\n"); + else + gprintf("vWii Mode\n"); + } + else + gprintf("Real Wii\n"); + + gprintf("AHBPROT disabled = %s\n", AHBPROT_Patched() ? "yes" : "no"); + /* Init device partition handlers */ DeviceHandle.Init(); /* Init NAND handlers */ NandHandle.Init(); - NandHandle.LoadDefaultIOS(); /* safe reload to preferred IOS */ - - /* load and check wiiflow save for possible new IOS and Port settings */ - if(InternalSave.CheckSave()) - InternalSave.LoadSettings(); - - /* Handle (c)IOS Loading */ - if(useMainIOS && CustomIOS(IOS_GetType(mainIOS))) /* Requested */ - iosOK = loadIOS(mainIOS, false) && CustomIOS(CurrentIOS.Type); + + if(isWiiVC) + { + NandHandle.Init_ISFS(); + IOS_GetCurrentIOSInfo(); + DeviceHandle.SetModes(); + } + else + { + NandHandle.LoadDefaultIOS(); /* safe reload to preferred IOS */ + + /* load and check wiiflow save for possible new IOS and Port settings */ + if(InternalSave.CheckSave()) + InternalSave.LoadSettings(); + + /* Handle (c)IOS Loading */ + if(useMainIOS && CustomIOS(IOS_GetType(mainIOS))) /* Requested */ + iosOK = loadIOS(mainIOS, false) && CustomIOS(CurrentIOS.Type); + } /* sys inits */ Sys_Init();// set reset and power button callbacks Sys_ExitTo(EXIT_TO_HBC);// set exit to in case of failed launch - /* mount Devices */ - DeviceHandle.MountSD();// mount SD before calling isUsingUSB() duh! + /* mount SD */ + DeviceHandle.MountSD();// mount SD before calling isUsingUSB() duh! + + /* mount USB if needed */ DeviceHandle.SetMountUSB(isUsingUSB()); DeviceHandle.MountAllUSB();// only mounts any USB if isUsingUSB() @@ -159,7 +186,7 @@ int main(int argc, char **argv) m_vid.waitMessage(0.15f); /* init controllers for input */ - Open_Inputs(); + Open_Inputs();// WPAD_SetVRes() is called later in mainMenu.init() during cursor init which gets the theme pointer images /* init configs, folders, coverflow, gui and more */ if(mainMenu.init()) @@ -183,7 +210,8 @@ int main(int argc, char **argv) mainMenu.terror("errboot3", L"Could not initialize the DIP module!"); else // alls good lets start wiiflow { - writeStub();// copy return stub to memory + if(!isWiiVC) + writeStub();// copy return stub to memory if(gameid != NULL && strlen(gameid) == 6)// if argv game ID then launch it mainMenu.directlaunch(gameid); else diff --git a/source/menu/menu.cpp b/source/menu/menu.cpp index 9db90986..96ac28e7 100644 --- a/source/menu/menu.cpp +++ b/source/menu/menu.cpp @@ -25,7 +25,7 @@ #include "music/SoundHandler.hpp" #include "network/gcard.h" #include "unzip/U8Archive.h" -#include "sicksaxis-wrapper/sicksaxis-wrapper.h" + // Sounds extern const u8 click_wav[]; extern const u32 click_wav_size; @@ -409,7 +409,7 @@ bool CMenu::init() float pShadowY = m_theme.getFloat("GENERAL", "pointer_shadow_y", 3.f); bool pShadowBlur = m_theme.getBool("GENERAL", "pointer_shadow_blur", false); - for(int chan = WPAD_MAX_WIIMOTES-2; chan >= 0; chan--) + for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { m_cursor[chan].init(fmt("%s/%s", m_themeDataDir.c_str(), m_theme.getString("GENERAL", fmt("pointer%i", chan+1)).c_str()), m_vid.wide(), pShadowColor, pShadowX, pShadowY, pShadowBlur, chan); @@ -2447,6 +2447,8 @@ bool CMenu::_loadFile(u8 * &buffer, u32 &size, const char *path, const char *fil void CMenu::_load_installed_cioses() { + if(isWiiVC) + return; gprintf("Loading cIOS map\n"); _installed_cios[0] = 1; @@ -2613,7 +2615,7 @@ void CMenu::TempLoadIOS(int IOS) loadIOS(IOS, true); Sys_Init(); Open_Inputs(); - for(int chan = WPAD_MAX_WIIMOTES-2; chan >= 0; chan--) + for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) WPAD_SetVRes(chan, m_vid.width() + m_cursor[chan].width(), m_vid.height() + m_cursor[chan].height()); _netInit(); } diff --git a/source/menu/menu.hpp b/source/menu/menu.hpp index c2b0b26b..7339184d 100644 --- a/source/menu/menu.hpp +++ b/source/menu/menu.hpp @@ -26,9 +26,10 @@ #include "music/gui_sound.h" #include "music/MusicPlayer.hpp" #include "plugin/plugin.hpp" +#include "sicksaxis-wrapper/sicksaxis-wrapper.h" #include "wiiuse/wpad.h" #include "wupc/wupc.h" -#include "sicksaxis-wrapper/sicksaxis-wrapper.h" +#include "wiidrc/wiidrc.h" using namespace std; @@ -634,60 +635,54 @@ private: SZone m_gameButtonsZone; WPADData *wd[WPAD_MAX_WIIMOTES]; - void LeftStick(); - u8 pointerhidedelay[WPAD_MAX_WIIMOTES]; - u16 stickPointer_x[WPAD_MAX_WIIMOTES]; - u16 stickPointer_y[WPAD_MAX_WIIMOTES]; + u32 wii_btnsPressed[WPAD_MAX_WIIMOTES]; + u32 wii_btnsHeld[WPAD_MAX_WIIMOTES]; + u32 wupc_btnsPressed[WPAD_MAX_WIIMOTES]; + u32 wupc_btnsHeld[WPAD_MAX_WIIMOTES]; + u32 gc_btnsPressed; + u32 gc_btnsHeld; + u32 ds3_btnsPressed; + + bool wBtn_Pressed(int btn, u8 ext); + bool wBtn_PressedChan(int btn, u8 ext, int &chan); + bool wBtn_Held(int btn, u8 ext); + bool wBtn_HeldChan(int btn, u8 ext, int &chan); + u32 wiidrc_to_pad(u32 btns); + u32 ds3_to_pad(u32 btns); + + bool wii_btnRepeat(u8 btn); u8 m_wpadLeftDelay; u8 m_wpadDownDelay; u8 m_wpadRightDelay; u8 m_wpadUpDelay; u8 m_wpadADelay; //u8 m_wpadBDelay; - u8 m_dpadLeftDelay; - u8 m_dpadDownDelay; - u8 m_dpadRightDelay; - u8 m_dpadUpDelay; - u8 m_dpadADelay; - u8 m_dpadHDelay; + bool gc_btnRepeat(s64 btn); u8 m_padLeftDelay; u8 m_padDownDelay; u8 m_padRightDelay; u8 m_padUpDelay; u8 m_padADelay; //u8 m_padBDelay; - u32 ds3_btnsPressed; - u32 wii_btnsPressed[WPAD_MAX_WIIMOTES]; - u32 wii_btnsHeld[WPAD_MAX_WIIMOTES]; - bool wBtn_Pressed(int btn, u8 ext); - bool wBtn_PressedChan(int btn, u8 ext, int &chan); - bool wBtn_Held(int btn, u8 ext); - bool wBtn_HeldChan(int btn, u8 ext, int &chan); - u32 gc_btnsPressed; - u32 gc_btnsHeld; - u32 wupc_btnsPressed[WPAD_MAX_WIIMOTES]; - u32 wupc_btnsHeld[WPAD_MAX_WIIMOTES]; - bool ds3_btnRepeat(s64 btn); - bool m_show_pointer[WPAD_MAX_WIIMOTES]; + float left_stick_angle[WPAD_MAX_WIIMOTES]; float left_stick_mag[WPAD_MAX_WIIMOTES]; float right_stick_angle[WPAD_MAX_WIIMOTES]; float right_stick_mag[WPAD_MAX_WIIMOTES]; - float wmote_roll[WPAD_MAX_WIIMOTES]; s32 right_stick_skip[WPAD_MAX_WIIMOTES]; + float wmote_roll[WPAD_MAX_WIIMOTES]; s32 wmote_roll_skip[WPAD_MAX_WIIMOTES]; bool enable_wmote_roll; - time_t no_input_time; - + void SetupInput(bool reset_pos = false); void ScanInput(void); - u32 NoInputTime(void); - + void ButtonsPressed(void); void ButtonsHeld(void); + void LeftStick(); bool lStick_Up(void); bool lStick_Right(void); bool lStick_Down(void); @@ -701,12 +696,15 @@ private: bool wRoll_Left(void); bool wRoll_Right(void); - bool wii_btnRepeat(u8 btn); - bool gc_btnRepeat(s64 btn); - bool WPadIR_Valid(int chan); bool WPadIR_ANY(void); + u8 pointerhidedelay[WPAD_MAX_WIIMOTES]; + u16 stickPointer_x[WPAD_MAX_WIIMOTES]; + u16 stickPointer_y[WPAD_MAX_WIIMOTES]; + bool m_show_pointer[WPAD_MAX_WIIMOTES]; + bool ShowPointer(void); + void ShowZone(SZone zone, bool &showZone); void ShowMainZone(void); void ShowMainZone2(void); @@ -714,7 +712,6 @@ private: void ShowPrevZone(void); void ShowNextZone(void); void ShowGameZone(void); - bool ShowPointer(void); bool m_show_zone_main; bool m_show_zone_main2; bool m_show_zone_main3; @@ -722,6 +719,9 @@ private: bool m_show_zone_next; bool m_show_zone_game; + time_t no_input_time; + u32 NoInputTime(void); + volatile bool m_exit; volatile bool m_thrdStop; volatile bool m_thrdWorking; @@ -1195,7 +1195,9 @@ private: void _stopGameSoundThread(void); static void * _gameSoundThread(void *obj); - static void _load_installed_cioses(); + void _load_installed_cioses(); + map _installed_cios; + typedef map::iterator CIOSItr; struct SOption { const char id[10]; const wchar_t text[16]; }; @@ -1221,8 +1223,6 @@ private: static const SOption _hooktype[8]; static const SOption _exitTo[3]; - static map _installed_cios; - typedef map::iterator CIOSItr; static int _version[9]; static const SCFParamDesc _cfParams[]; static const int _nbCfgPages; diff --git a/source/menu/menu_game.cpp b/source/menu/menu_game.cpp index bfc793de..a7c1b73d 100644 --- a/source/menu/menu_game.cpp +++ b/source/menu/menu_game.cpp @@ -197,7 +197,7 @@ const CMenu::SOption CMenu::_debugger[3] = { { "dbgfwrite", L"OSReport" }, }; -map CMenu::_installed_cios; +//map CMenu::_installed_cios; static inline int loopNum(int i, int s) { @@ -663,69 +663,78 @@ void CMenu::_game(bool launch) (!ShowPointer() && !m_video_playing && !coverFlipped)) { _hideGame(); - MusicPlayer.Stop(); - _cleanupBanner(); - m_cfg.setInt("GENERAL", "cat_startpage", m_catStartPage); - m_gcfg2.load(fmt("%s/" GAME_SETTINGS2_FILENAME, m_settingsDir.c_str())); - /* change to current game's partition */ - switch(hdr->type) + if(isWiiVC && (hdr->type == TYPE_WII_GAME || hdr->type == TYPE_EMUCHANNEL)) { - case TYPE_CHANNEL: - case TYPE_EMUCHANNEL: - currentPartition = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 1); - break; - case TYPE_HOMEBREW: - currentPartition = m_cfg.getInt(HOMEBREW_DOMAIN, "partition", 1); - break; - case TYPE_GC_GAME: - currentPartition = m_cfg.getInt(GC_DOMAIN, "partition", 1); - break; - case TYPE_WII_GAME: - currentPartition = m_cfg.getInt(WII_DOMAIN, "partition", 1); - break; - default: - int romsPartition = m_plugin.GetRomPartition(m_plugin.GetPluginPosition(hdr->settings[0])); - if(romsPartition < 0) - romsPartition = m_cfg.getInt(PLUGIN_DOMAIN, "partition", 0); - currentPartition = romsPartition; - break; + error(_t("errgame19", L"Can't launch in Wii virtual console mode!")); + launch = false; + _showGame(); } - - /* Get Banner Title for Playlog */ - if(hdr->type == TYPE_WII_GAME || hdr->type == TYPE_CHANNEL || hdr->type == TYPE_EMUCHANNEL) + else { - NANDemuView = hdr->type == TYPE_EMUCHANNEL; - CurrentBanner.ClearBanner(); - if(hdr->type == TYPE_CHANNEL || hdr->type == TYPE_EMUCHANNEL) + MusicPlayer.Stop(); + _cleanupBanner(); + m_cfg.setInt("GENERAL", "cat_startpage", m_catStartPage); + m_gcfg2.load(fmt("%s/" GAME_SETTINGS2_FILENAME, m_settingsDir.c_str())); + /* change to current game's partition */ + switch(hdr->type) { - u64 chantitle = CoverFlow.getChanTitle(); - ChannelHandle.GetBanner(chantitle); + case TYPE_CHANNEL: + case TYPE_EMUCHANNEL: + currentPartition = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 1); + break; + case TYPE_HOMEBREW: + currentPartition = m_cfg.getInt(HOMEBREW_DOMAIN, "partition", 1); + break; + case TYPE_GC_GAME: + currentPartition = m_cfg.getInt(GC_DOMAIN, "partition", 1); + break; + case TYPE_WII_GAME: + currentPartition = m_cfg.getInt(WII_DOMAIN, "partition", 1); + break; + default: + int romsPartition = m_plugin.GetRomPartition(m_plugin.GetPluginPosition(hdr->settings[0])); + if(romsPartition < 0) + romsPartition = m_cfg.getInt(PLUGIN_DOMAIN, "partition", 0); + currentPartition = romsPartition; + break; } - else if(hdr->type == TYPE_WII_GAME) - _extractBnr(hdr); - u8 banner_title[84]; - memset(banner_title, 0, 84); - if(CurrentBanner.IsValid()) - CurrentBanner.GetName(banner_title, GetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str())); - if(Playlog_Update(hdr->id, banner_title) < 0) - Playlog_Delete(); - CurrentBanner.ClearBanner(); + + /* Get Banner Title for Playlog */ + if(hdr->type == TYPE_WII_GAME || hdr->type == TYPE_CHANNEL || hdr->type == TYPE_EMUCHANNEL) + { + NANDemuView = hdr->type == TYPE_EMUCHANNEL; + CurrentBanner.ClearBanner(); + if(hdr->type == TYPE_CHANNEL || hdr->type == TYPE_EMUCHANNEL) + { + u64 chantitle = CoverFlow.getChanTitle(); + ChannelHandle.GetBanner(chantitle); + } + else if(hdr->type == TYPE_WII_GAME) + _extractBnr(hdr); + u8 banner_title[84]; + memset(banner_title, 0, 84); + if(CurrentBanner.IsValid()) + CurrentBanner.GetName(banner_title, GetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str())); + if(Playlog_Update(hdr->id, banner_title) < 0) + Playlog_Delete(); + CurrentBanner.ClearBanner(); + } + + /* Finally boot it */ + gprintf("Launching game %s\n", hdr->id); + _launch(hdr); + + if(m_exit) + break; + + _hideWaitMessage(); + launch = false; + + for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) + WPAD_SetVRes(chan, m_vid.width() + m_cursor[chan].width(), m_vid.height() + m_cursor[chan].height()); + m_gcfg2.unload(); + _showGame(); } - - /* Finally boot it */ - gprintf("Launching game %s\n", hdr->id); - _launch(hdr); - - if(m_exit) - break; - - _hideWaitMessage(); - launch = false; - - for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) - WPAD_SetVRes(chan, m_vid.width() + m_cursor[chan].width(), m_vid.height() + m_cursor[chan].height()); - m_gcfg2.unload(); - _showGame(); } else if(!coverFlipped) { @@ -1055,6 +1064,7 @@ void CMenu::_launch(const dir_discHdr *hdr) } } /* launch plugin with args */ + gprintf("launching plugin app\n"); _launchHomebrew(plugin_file, arguments); } else if(launchHdr.type == TYPE_HOMEBREW) @@ -1066,6 +1076,7 @@ void CMenu::_launch(const dir_discHdr *hdr) { m_cfg.setString(HOMEBREW_DOMAIN, "current_item", strrchr(launchHdr.path, '/') + 1); vector arguments = _getMetaXML(bootpath); + gprintf("launching homebrew app\n"); _launchHomebrew(bootpath, arguments); } } @@ -1084,6 +1095,7 @@ void CMenu::_launchHomebrew(const char *filepath, vector arguments) Playlog_Delete(); + /* load boot.dol into memory and load app_booter.bin into memory */ bool ret = (LoadHomebrew(filepath) && LoadAppBooter(fmt("%s/app_booter.bin", m_binsDir.c_str()))); if(ret == false) { @@ -1096,7 +1108,7 @@ void CMenu::_launchHomebrew(const char *filepath, vector arguments) AddBootArgument(filepath); for(u32 i = 0; i < arguments.size(); ++i) { - gprintf("Argument: %s\n", arguments[i].c_str()); + gprintf("app argument: %s\n", arguments[i].c_str()); AddBootArgument(arguments[i].c_str()); } @@ -1455,7 +1467,7 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool disc) /* dont confuse loadIOS with _loadIOS */ int CMenu::_loadIOS(u8 gameIOS, int userIOS, string id, bool RealNAND_Channels) { - gprintf("Game ID# %s requested IOS %d. User selected %d\n", id.c_str(), gameIOS, userIOS); + gprintf("Game ID %s requested IOS %d.\nUser selected %d\n", id.c_str(), gameIOS, userIOS); if(RealNAND_Channels && IOS_GetType(mainIOS) == IOS_TYPE_STUB) { /* doesn't use cIOS so we don't check userIOS */ @@ -1560,12 +1572,10 @@ void CMenu::_launchChannel(dir_discHdr *hdr) u8 patchVidMode = min(m_gcfg2.getUInt(id, "patch_video_modes", 0), ARRAY_SIZE(CMenu::_vidModePatch) - 1u); int aspectRatio = min(m_gcfg2.getUInt(id, "aspect_ratio", 0), ARRAY_SIZE(CMenu::_AspectRatio) - 1) - 1;// -1,0,1 - //u32 returnTo = 0; - //const char *rtrn = m_cfg.getString("GENERAL", "returnto").c_str(); - //if(strlen(rtrn) == 4) - // returnTo = rtrn[0] << 24 | rtrn[1] << 16 | rtrn[2] << 8 | rtrn[3]; + u32 returnTo = 0; const char *rtrn = m_cfg.getString("GENERAL", "returnto").c_str(); - u32 returnTo = rtrn[0] << 24 | rtrn[1] << 16 | rtrn[2] << 8 | rtrn[3]; + if(strlen(rtrn) == 4) + returnTo = rtrn[0] << 24 | rtrn[1] << 16 | rtrn[2] << 8 | rtrn[3]; u8 *cheatFile = NULL; u32 cheatSize = 0; @@ -1683,7 +1693,7 @@ void CMenu::_launchChannel(dir_discHdr *hdr) setLanguage(language); ocarina_load_code(cheatFile, cheatSize); NandHandle.Patch_AHB(); /* Identify maybe uses it so keep AHBPROT disabled */ - PatchIOS(true); /* Patch for everything */ + PatchIOS(true, isWiiVC); /* Patch for everything */ Identify(gameTitle); ExternalBooter_ChannelSetup(gameTitle, use_dol); @@ -1768,8 +1778,10 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd, bool disc_cfg) int language = min(m_gcfg2.getUInt(id, "language", 0), ARRAY_SIZE(CMenu::_languages) - 1u); language = (language == 0) ? min(m_cfg.getUInt("GENERAL", "game_language", 0), ARRAY_SIZE(CMenu::_languages) - 1u) : language; + u32 returnTo = 0; const char *rtrn = m_cfg.getString("GENERAL", "returnto").c_str(); - u32 returnTo = rtrn[0] << 24 | rtrn[1] << 16 | rtrn[2] << 8 | rtrn[3]; + if(strlen(rtrn) == 4) + returnTo = rtrn[0] << 24 | rtrn[1] << 16 | rtrn[2] << 8 | rtrn[3]; int aspectRatio = min(m_gcfg2.getUInt(id, "aspect_ratio", 0), ARRAY_SIZE(CMenu::_AspectRatio) - 1u) - 1; u8 patchVidMode = min(m_gcfg2.getUInt(id, "patch_video_modes", 0), ARRAY_SIZE(CMenu::_vidModePatch) - 1u); diff --git a/source/menu/menu_input.cpp b/source/menu/menu_input.cpp index 7f938df6..b8c7c7b8 100644 --- a/source/menu/menu_input.cpp +++ b/source/menu/menu_input.cpp @@ -2,13 +2,8 @@ #include #include "menu.hpp" -#include "sicksaxis-wrapper/sicksaxis-wrapper.h" static const u32 g_repeatDelay = 25; -u64 button_time = 0; - -#define CheckTime() (ticks_to_millisecs(diff_ticks((button_time), gettick())) > 200) -#define UpdateTime() button_time = gettick() void CMenu::SetupInput(bool reset_pos) { @@ -59,6 +54,18 @@ static int CalculateRepeatSpeed(float magnitude, int current_value) void CMenu::ScanInput() { + /*for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) + { + wd[chan] = WPAD_Data(chan); + if(wd[chan]->err < 0) + { + Close_Inputs(); + Open_Inputs(); + for(int chn = WPAD_MAX_WIIMOTES-1; chn >= 0; chn--) + WPAD_SetVRes(chn, m_vid.width() + m_cursor[chn].width(), m_vid.height() + m_cursor[chn].height()); + break; + } + }*/ m_show_zone_main = false; m_show_zone_main2 = false; m_show_zone_main3 = false; @@ -69,7 +76,8 @@ void CMenu::ScanInput() WPAD_ScanPads(); PAD_ScanPads(); DS3_ScanPads(); - //drc + if(WiiDRC_Inited() && WiiDRC_Connected()) + WiiDRC_ScanPads(); ButtonsPressed(); ButtonsHeld(); @@ -82,7 +90,7 @@ void CMenu::ScanInput() left_stick_mag[chan] = 0; right_stick_angle[chan] = 0; right_stick_mag[chan] = 0; - switch(wd[chan]->exp.type) + switch(wd[chan]->exp.type)// exp = expansion { case WPAD_EXP_NUNCHUK: right_stick_mag[chan] = wd[chan]->exp.nunchuk.js.mag; @@ -108,22 +116,24 @@ void CMenu::ScanInput() } right_stick_skip[chan] = CalculateRepeatSpeed(right_stick_mag[chan], right_stick_skip[chan]); } + /* handles wii/gc rumble and mouse/cursor position and drawing */ for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { m_btnMgr.setRumble(chan, WPadIR_Valid(chan), PAD_StickX(chan) < -20 || PAD_StickX(chan) > 20 || PAD_StickY(chan) < -20 || PAD_StickY(chan) > 20, WUPC_lStickX(chan) < -160 || WUPC_lStickX(chan) > 160 || WUPC_lStickY(chan) < -160 || WUPC_lStickY(chan) > 160); m_btnMgr.setMouse(WPadIR_Valid(chan) || m_show_pointer[chan]); - if(WPadIR_Valid(chan)) + if(WPadIR_Valid(chan))// wiimote IR { m_cursor[chan].draw(wd[chan]->ir.x, wd[chan]->ir.y, wd[chan]->ir.angle); m_btnMgr.mouse(chan, wd[chan]->ir.x - m_cursor[chan].width() / 2, wd[chan]->ir.y - m_cursor[chan].height() / 2); } - else if(m_show_pointer[chan]) + else if(m_show_pointer[chan])// left stick { m_cursor[chan].draw(stickPointer_x[chan], stickPointer_y[chan], 0); m_btnMgr.mouse(chan, stickPointer_x[chan] - m_cursor[chan].width() / 2, stickPointer_y[chan] - m_cursor[chan].height() / 2); } } + /* handles display zones */ ShowMainZone(); ShowMainZone2(); ShowMainZone3(); @@ -133,42 +143,111 @@ void CMenu::ScanInput() } extern "C" { extern bool shutdown; }; +u64 button_time = 0; +#define CheckTime() (ticks_to_millisecs(diff_ticks((button_time), gettick())) > 200) +#define UpdateTime() button_time = gettick() + void CMenu::ButtonsPressed() { - gc_btnsPressed = 0; - if (CheckTime()) + + /* ds3 controller */ + if(CheckTime()) { ds3_btnsPressed = DS3_ButtonsDown(); UpdateTime(); } else ds3_btnsPressed = 0; - - if(ds3_btnsPressed & DBTN_SELECT) shutdown = 1; + + if(ds3_btnsPressed & DS3_BUTTON_SELECT) + shutdown = 1; + else + gc_btnsPressed |= ds3_to_pad(ds3_btnsPressed); + + /* wii, gc, drc, and wupc */ + gc_btnsPressed |= wiidrc_to_pad(WiiDRC_ButtonsDown()); + for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { - for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) - { - wii_btnsPressed[chan] = WPAD_ButtonsDown(chan); - gc_btnsPressed |= PAD_ButtonsDown(chan); - wupc_btnsPressed[chan] = WUPC_ButtonsDown(chan); - //drc - } + wii_btnsPressed[chan] = WPAD_ButtonsDown(chan); + gc_btnsPressed |= PAD_ButtonsDown(chan); + wupc_btnsPressed[chan] = WUPC_ButtonsDown(chan); } } void CMenu::ButtonsHeld() { + /* wii, gc, drc, and wupc controllers = no ds3 not sure why */ gc_btnsHeld = 0; + gc_btnsHeld |= wiidrc_to_pad(WiiDRC_ButtonsHeld()); for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { wii_btnsHeld[chan] = WPAD_ButtonsHeld(chan); gc_btnsHeld |= PAD_ButtonsHeld(chan); wupc_btnsHeld[chan] = WUPC_ButtonsHeld(chan); - //drc } } +/* convert wiidrc buttons to gc pad buttons */ +u32 CMenu::wiidrc_to_pad(u32 btns) { + u32 ret = 0; + + if(btns & WIIDRC_BUTTON_LEFT) + ret |= PAD_BUTTON_LEFT; + if(btns & WIIDRC_BUTTON_RIGHT) + ret |= PAD_BUTTON_RIGHT; + if(btns & WIIDRC_BUTTON_UP) + ret |= PAD_BUTTON_UP; + if(btns & WIIDRC_BUTTON_DOWN) + ret |= PAD_BUTTON_DOWN; + if(btns & WIIDRC_BUTTON_A) + ret |= PAD_BUTTON_A; + if(btns & WIIDRC_BUTTON_B) + ret |= PAD_BUTTON_B; + if(btns & WIIDRC_BUTTON_X) + ret |= PAD_BUTTON_X; + if(btns & WIIDRC_BUTTON_Y) + ret |= PAD_BUTTON_Y; + if((btns & WIIDRC_BUTTON_L) || (btns & WIIDRC_BUTTON_ZL) || (btns & WIIDRC_BUTTON_MINUS)) + ret |= PAD_TRIGGER_L; + if((btns & WIIDRC_BUTTON_R) || (btns & WIIDRC_BUTTON_ZR) || (btns & WIIDRC_BUTTON_PLUS)) + ret |= PAD_TRIGGER_R; + if(btns & WIIDRC_BUTTON_HOME) + ret |= PAD_BUTTON_START; + + return (ret&0xffff) ; +} + +/* convert ds3 buttons to gc pad buttons */ +u32 CMenu::ds3_to_pad(u32 btns) { + u32 ret = 0; + + if(btns & DS3_BUTTON_LEFT) + ret |= PAD_BUTTON_LEFT; + if(btns & DS3_BUTTON_RIGHT) + ret |= PAD_BUTTON_RIGHT; + if(btns & DS3_BUTTON_UP) + ret |= PAD_BUTTON_UP; + if(btns & DS3_BUTTON_DOWN) + ret |= PAD_BUTTON_DOWN; + if((btns & DS3_BUTTON_SQUARE) || (btns & DS3_BUTTON_CIRCLE)) + ret |= PAD_BUTTON_A; + if(btns & DS3_BUTTON_CROSS) + ret |= PAD_BUTTON_B; + if(btns & DS3_BUTTON_R1) + ret |= PAD_BUTTON_X; + if(btns & DS3_BUTTON_L1) + ret |= PAD_BUTTON_Y; + if(btns & DS3_BUTTON_L2) + ret |= PAD_TRIGGER_L; + if(btns & DS3_BUTTON_R2) + ret |= PAD_TRIGGER_R; + if(btns & DS3_BUTTON_START) + ret |= PAD_BUTTON_START; + + return (ret&0xffff) ; +} + bool CMenu::wBtn_PressedChan(int btn, u8 ext, int &chan) { return ((wii_btnsPressed[chan] & btn) && (ext == WPAD_EXP_NONE || ext == wd[chan]->exp.type)) || ((wupc_btnsPressed[chan] & btn) && (ext == WPAD_EXP_CLASSIC)); @@ -199,18 +278,22 @@ bool CMenu::wBtn_Held(int btn, u8 ext) return false; } +/* Left Stick is used to show/hide the pointer and move it */ void CMenu::LeftStick() { u8 speed = 0, pSpeed = 0; for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { - if(left_stick_mag[chan] > 0.15 || abs(PAD_StickX(chan)) > 20 || abs(PAD_StickY(chan)) > 20 || (chan == 0 && (abs(DS3_StickX()) > 20 || abs(DS3_StickY()) > 20)) || abs(WUPC_lStickX(chan)) > 160 || abs(WUPC_lStickY(chan)) > 160) + if(left_stick_mag[chan] > 0.15 || abs(PAD_StickX(chan)) > 20 || abs(PAD_StickY(chan)) > 20 || abs(WUPC_lStickX(chan)) > 160 || abs(WUPC_lStickY(chan)) > 160 + || (chan == 0 && (abs(DS3_StickX()) > 20 || abs(DS3_StickY()) > 20)) || (chan == 0 && (abs(WiiDRC_lStickX()) > 20 || abs(WiiDRC_lStickY()) > 20))) { m_show_pointer[chan] = true; if(LEFT_STICK_LEFT) { speed = (u8)(left_stick_mag[chan] * 10.00); - pSpeed = (u8)(((int)abs(PAD_StickX(chan))/10)|((int)abs(DS3_StickX()/10))|((int)abs(WUPC_lStickX(chan))/80)); + pSpeed = (u8)(((int)abs(PAD_StickX(chan))/10)|((int)abs(WUPC_lStickX(chan))/80)|((int)abs(WiiDRC_lStickX())/8)); + if(chan == 0) + pSpeed |= (int)abs(DS3_StickX()/10); if(stickPointer_x[chan] > m_cursor[chan].width()/2) stickPointer_x[chan] = stickPointer_x[chan]-speed-pSpeed; pointerhidedelay[chan] = 150; @@ -218,7 +301,9 @@ void CMenu::LeftStick() if(LEFT_STICK_DOWN) { speed = (u8)(left_stick_mag[chan] * 10.00); - pSpeed = (u8)(((int)abs(PAD_StickY(chan))/10)|((int)abs(DS3_StickY()/10))|((int)abs(WUPC_lStickY(chan))/80)); + pSpeed = (u8)(((int)abs(PAD_StickY(chan))/10)|((int)abs(WUPC_lStickY(chan))/80)|((int)abs(WiiDRC_lStickY())/8)); + if(chan == 0) + pSpeed |= (int)abs(DS3_StickY()/10); if(stickPointer_y[chan] < (m_vid.height() + (m_cursor[chan].height()/2))) stickPointer_y[chan] = stickPointer_y[chan]+speed+pSpeed; pointerhidedelay[chan] = 150; @@ -226,7 +311,9 @@ void CMenu::LeftStick() if(LEFT_STICK_RIGHT) { speed = (u8)(left_stick_mag[chan] * 10.00); - pSpeed = (u8)(((int)abs(PAD_StickX(chan))/10)|((int)abs(DS3_StickX()/10))|((int)abs(WUPC_lStickX(chan))/80)); + pSpeed = (u8)(((int)abs(PAD_StickX(chan))/10)|((int)abs(WUPC_lStickX(chan))/80)|((int)abs(WiiDRC_lStickX())/8)); + if(chan == 0) + pSpeed |= (int)abs(DS3_StickX()/10); if(stickPointer_x[chan] < (m_vid.width() + (m_cursor[chan].width()/2))) stickPointer_x[chan] = stickPointer_x[chan]+speed+pSpeed; pointerhidedelay[chan] = 150; @@ -234,7 +321,9 @@ void CMenu::LeftStick() if(LEFT_STICK_UP) { speed = (u8)(left_stick_mag[chan] * 10.00); - pSpeed = (u8)(((int)abs(PAD_StickY(chan))/10)|((int)abs(DS3_StickY()/10))|((int)abs(WUPC_lStickY(chan))/80)); + pSpeed = (u8)(((int)abs(PAD_StickY(chan))/10)|((int)abs(WUPC_lStickY(chan))/80)|((int)abs(WiiDRC_lStickY())/8)); + if(chan == 0) + pSpeed |= (int)abs(DS3_StickY()/10); if(stickPointer_y[chan] > m_cursor[chan].height()/2) stickPointer_y[chan] = stickPointer_y[chan]-speed-pSpeed; pointerhidedelay[chan] = 150; @@ -273,6 +362,9 @@ bool CMenu::WPadIR_ANY(void) return (wd[0]->ir.valid || wd[1]->ir.valid || wd[2]->ir.valid || wd[3]->ir.valid); } +/* all _btnRepeat's are used the same as right stick below */ +/* only called from menu_main and menu_game to move the coverflow up, down, left, right */ +/* btn A repeat is used in config screen, sound, and adjust coverflow */ bool CMenu::wii_btnRepeat(u8 btn) { bool b = false; @@ -414,109 +506,13 @@ bool CMenu::gc_btnRepeat(s64 btn) return b; } -bool CMenu::ds3_btnRepeat(s64 btn) -{ - bool b = false; - if(btn == DBTN_UP) - { - if(ds3_btnsPressed & DBTN_UP) - { - if(m_dpadUpDelay == 0 || m_dpadUpDelay >= g_repeatDelay) - b = true; - if(m_dpadUpDelay < g_repeatDelay) - ++m_dpadUpDelay; - } - else - { - m_dpadUpDelay = 0; - m_btnMgr.noClick(); - } - } - else if(btn == DBTN_RIGHT) - { - if(ds3_btnsPressed & DBTN_RIGHT) - { - if(m_dpadRightDelay == 0 || m_dpadRightDelay >= g_repeatDelay) - b = true; - if(m_dpadRightDelay < g_repeatDelay) - ++m_dpadRightDelay; - } - else - { - m_dpadRightDelay = 0; - m_btnMgr.noClick(); - } - } - else if(btn == DBTN_DOWN) - { - if(ds3_btnsPressed & DBTN_DOWN) - { - if(m_dpadDownDelay == 0 || m_dpadDownDelay >= g_repeatDelay) - b = true; - if(m_dpadDownDelay < g_repeatDelay) - ++m_dpadDownDelay; - } - else - { - m_dpadDownDelay = 0; - m_btnMgr.noClick(); - } - } - else if(btn == DBTN_LEFT) - { - if(ds3_btnsPressed & DBTN_LEFT) - { - if(m_dpadLeftDelay == 0 || m_dpadLeftDelay >= g_repeatDelay) - b = true; - if(m_dpadLeftDelay < g_repeatDelay) - ++m_dpadLeftDelay; - } - else - { - m_dpadLeftDelay = 0; - m_btnMgr.noClick(); - } - } - else if(btn == DBTN_A) - { - if(ds3_btnsPressed & DBTN_A) - { - m_btnMgr.noClick(true); - if(m_dpadADelay == 1 || m_dpadADelay >= g_repeatDelay) - b = true; - if(m_dpadADelay < g_repeatDelay) - ++m_dpadADelay; - } - else - { - m_dpadADelay = 1; - m_btnMgr.noClick(); - } - } - else if(btn == DBTN_START) - { - if(ds3_btnsPressed & DBTN_START) - { - m_btnMgr.noClick(true); - if(m_dpadHDelay == 0.5 || m_dpadHDelay >= g_repeatDelay) - b = true; - if(m_dpadHDelay < g_repeatDelay) - ++m_dpadHDelay; - } - else - { - m_dpadHDelay = 0.5; - m_btnMgr.noClick(); - } - } - return b; -} - bool CMenu::lStick_Up(void) { + if(WiiDRC_lStickY() > 20 || DS3_StickY() < -20) + return true; for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { - if((LEFT_STICK_ANG_UP && left_stick_mag[chan] > 0.15) || PAD_StickY(chan) > 20 || DS3_StickY() < -20 || WUPC_lStickY(chan) > 160) + if((LEFT_STICK_ANG_UP && left_stick_mag[chan] > 0.15) || PAD_StickY(chan) > 20 || WUPC_lStickY(chan) > 160) return true; } return false; @@ -524,9 +520,11 @@ bool CMenu::lStick_Up(void) bool CMenu::lStick_Right(void) { + if(WiiDRC_lStickX() > 20 || DS3_StickX() > 20) + return true; for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { - if((LEFT_STICK_ANG_RIGHT && left_stick_mag[chan] > 0.15) || PAD_StickX(chan) > 20 || DS3_StickX() > 20 || WUPC_lStickX(chan) > 160) + if((LEFT_STICK_ANG_RIGHT && left_stick_mag[chan] > 0.15) || PAD_StickX(chan) > 20 || WUPC_lStickX(chan) > 160) return true; } return false; @@ -534,9 +532,11 @@ bool CMenu::lStick_Right(void) bool CMenu::lStick_Down(void) { + if(WiiDRC_lStickY() < -20 || DS3_StickY() > 20) + return true; for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { - if((LEFT_STICK_ANG_DOWN && left_stick_mag[chan] > 0.15) || PAD_StickY(chan) < -20 || DS3_StickY() > 20 || WUPC_lStickY(chan) < -160) + if((LEFT_STICK_ANG_DOWN && left_stick_mag[chan] > 0.15) || PAD_StickY(chan) < -20 || WUPC_lStickY(chan) < -160) return true; } return false; @@ -544,16 +544,21 @@ bool CMenu::lStick_Down(void) bool CMenu::lStick_Left(void) { + if(WiiDRC_lStickX() < -20 || DS3_StickX() < -20) + return true; for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { - if((LEFT_STICK_ANG_LEFT && left_stick_mag[chan] > 0.15) || PAD_StickX(chan) < -20 || DS3_StickX() < -20 || WUPC_lStickX(chan) < -160) + if((LEFT_STICK_ANG_LEFT && left_stick_mag[chan] > 0.15) || PAD_StickX(chan) < -20 || WUPC_lStickX(chan) < -160) return true; } return false; } +/* right stick movements are only used in menu_main and menu_game to move the coverflow up, down, left, right just like the d-pad */ bool CMenu::rStick_Up(void) { + if(WiiDRC_rStickY() > 30) + return true; for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { if((RIGHT_STICK_ANG_UP && right_stick_mag[chan] > 0.15 && right_stick_skip[chan] == 0) || PAD_SubStickY(chan) > 20 || WUPC_rStickY(chan) > 160) @@ -564,6 +569,8 @@ bool CMenu::rStick_Up(void) bool CMenu::rStick_Right(void) { + if(WiiDRC_rStickX() > 30) + return true; for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { if((RIGHT_STICK_ANG_RIGHT && right_stick_mag[chan] > 0.15 && right_stick_skip[chan] == 0) || PAD_SubStickX(chan) > 20 || WUPC_rStickX(chan) > 160) @@ -574,6 +581,8 @@ bool CMenu::rStick_Right(void) bool CMenu::rStick_Down(void) { + if(WiiDRC_rStickY() < -30) + return true; for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { if((RIGHT_STICK_ANG_DOWN && right_stick_mag[chan] > 0.15 && right_stick_skip[chan] == 0) || PAD_SubStickY(chan) < -20 || WUPC_rStickY(chan) < -160) @@ -584,6 +593,8 @@ bool CMenu::rStick_Down(void) bool CMenu::rStick_Left(void) { + if(WiiDRC_rStickX() < -30) + return true; for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { if((RIGHT_STICK_ANG_LEFT && right_stick_mag[chan] > 0.15 && right_stick_skip[chan] == 0) || PAD_SubStickX(chan) < -20 || WUPC_rStickX(chan) < -160) @@ -658,13 +669,16 @@ void CMenu::ShowGameZone() ShowZone(m_gameButtonsZone, m_show_zone_game); } +/* returns the elapsed time of no controller input */ u32 CMenu::NoInputTime() { bool input_found = false; + /* showpointer() = true if any wiimote IR at screen or any controller left stick is moving pointer */ if(ShowPointer() == true || RIGHT_STICK_MOVE == true || gc_btnsPressed != 0) input_found = true; else { + /* check if any wiimote buttons are pressed or held */ for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { if(wii_btnsPressed[chan] != 0 || wii_btnsHeld[chan] != 0) diff --git a/source/menu/menu_main.cpp b/source/menu/menu_main.cpp index f212ea75..73aab10c 100644 --- a/source/menu/menu_main.cpp +++ b/source/menu/menu_main.cpp @@ -253,9 +253,10 @@ int CMenu::main(void) m_btnMgr.show(m_mem1FreeSize); m_btnMgr.show(m_mem2FreeSize); } + SetupInput(true); - gprintf("start wiiflow main screen\n"); + gprintf("wiiflow main screen ready!\n"); while(!m_exit) { /* IMPORTANT check if a disc is inserted */ diff --git a/source/menu/menu_nandemu.cpp b/source/menu/menu_nandemu.cpp index aff7cb34..d7af1ac6 100644 --- a/source/menu/menu_nandemu.cpp +++ b/source/menu/menu_nandemu.cpp @@ -103,6 +103,8 @@ void CMenu::_listEmuNands(const char *path, vector &emuNands) void CMenu::_checkEmuNandSettings(void) { + if(isWiiVC) + return; u8 i; string emuNand = m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default"); int emuPart = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0); @@ -191,6 +193,8 @@ void CMenu::_checkEmuNandSettings(void) void CMenu::_FullNandCheck(void) { + if(isWiiVC) + return; for(u8 i = 0; i < 2; i++) { int emulate_mode; diff --git a/source/menu/menu_wad.cpp b/source/menu/menu_wad.cpp index 869fd8d1..e840e02a 100644 --- a/source/menu/menu_wad.cpp +++ b/source/menu/menu_wad.cpp @@ -345,6 +345,7 @@ int getTID(const char *path, u64 *tid) void * CMenu::_pThread(void *obj) { CMenu *m = (CMenu*)obj; + m->SetupInput(); while(m->m_thrdInstalling) { m->_mainLoopCommon(); diff --git a/source/music/SoundHandler.cpp b/source/music/SoundHandler.cpp index b6c0d338..152154ce 100644 --- a/source/music/SoundHandler.cpp +++ b/source/music/SoundHandler.cpp @@ -47,12 +47,12 @@ void SoundHandler::Init() DecoderList[i] = NULL; LWP_CreateThread(&SoundThread, UpdateThread, this, SoundStack, SoundStackSize, LWP_PRIO_HIGHEST); - gprintf("SHND: Running sound thread\n"); + gprintf("Running sound thread\n"); } void SoundHandler::Cleanup() { - gprintf("SHND: Stopping sound thread\n"); + gprintf("Stopping sound thread\n"); ExitRequested = true; ThreadSignal(); @@ -60,7 +60,7 @@ void SoundHandler::Cleanup() SoundThread = LWP_THREAD_NULL; ClearDecoderList(); - gprintf("SHND: Stopped sound thread\n"); + gprintf("Stopped sound thread\n"); } void SoundHandler::AddDecoder(int voice, const char * filepath) diff --git a/source/sicksaxis-wrapper/sicksaxis-wrapper.h b/source/sicksaxis-wrapper/sicksaxis-wrapper.h index 30855088..58603ddf 100644 --- a/source/sicksaxis-wrapper/sicksaxis-wrapper.h +++ b/source/sicksaxis-wrapper/sicksaxis-wrapper.h @@ -4,7 +4,7 @@ #ifndef _DS3WRAPPER_H_ #define _DS3WRAPPER_H_ -#include +//#include struct ss_device; diff --git a/wii/wiiflow/Languages/english.ini b/wii/wiiflow/Languages/english.ini index 7093ad9c..40341d47 100644 --- a/wii/wiiflow/Languages/english.ini +++ b/wii/wiiflow/Languages/english.ini @@ -292,6 +292,7 @@ errgame15=WiiFlow locked! Unlock WiiFlow to use this feature. errgame16=Not available for plugin games! errgame17=Can not delete real NAND Channels! errgame18=No game info! +errgame19=Can't launch in Wii virtual console mode! errneek1=Cannot launch neek2o. Verify your neek2o setup errsource1=Homebrew locked! errsource2=Homebrew and multisource not allowed!