-added libwiidrc so now wiiflow lite can be injected in a wii u wiivc game and will run with the gamepad.

-other minor changes and notes added
This commit is contained in:
fledge68 2018-08-01 12:27:12 +00:00
parent e4d9b2e0d1
commit c13a061359
26 changed files with 450 additions and 347 deletions

View File

@ -67,7 +67,7 @@ endif
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project # 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 # list of directories containing libraries, this must be the top level containing

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 MiB

After

Width:  |  Height:  |  Size: 3.3 MiB

View File

@ -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

BIN
portlibs/lib/libwiidrc.a Normal file

Binary file not shown.

View File

@ -47,6 +47,7 @@
#define WBTN_2_HELD (wBtn_Held(WPAD_BUTTON_2, WPAD_EXP_NONE) \ #define WBTN_2_HELD (wBtn_Held(WPAD_BUTTON_2, WPAD_EXP_NONE) \
|| wBtn_Held(WPAD_CLASSIC_BUTTON_X, WPAD_EXP_CLASSIC)) || wBtn_Held(WPAD_CLASSIC_BUTTON_X, WPAD_EXP_CLASSIC))
/* gamecube controller */
#define GBTN_UP (PAD_BUTTON_UP) #define GBTN_UP (PAD_BUTTON_UP)
#define GBTN_DOWN (PAD_BUTTON_DOWN) #define GBTN_DOWN (PAD_BUTTON_DOWN)
#define GBTN_LEFT (PAD_BUTTON_LEFT) #define GBTN_LEFT (PAD_BUTTON_LEFT)
@ -85,53 +86,18 @@
#define GBTN_1_HELD (gc_btnsHeld & GBTN_1) #define GBTN_1_HELD (gc_btnsHeld & GBTN_1)
#define GBTN_2_HELD (gc_btnsHeld & GBTN_2) #define GBTN_2_HELD (gc_btnsHeld & GBTN_2)
#define DBTN_PS (DS3_BUTTON_PS) /* All controllers */
#define DBTN_START (DS3_BUTTON_START) #define BTN_UP_PRESSED (WBTN_UP_PRESSED || GBTN_UP_PRESSED)
#define DBTN_SELECT (DS3_BUTTON_SELECT) #define BTN_DOWN_PRESSED (WBTN_DOWN_PRESSED || GBTN_DOWN_PRESSED)
#define DBTN_Y (DS3_BUTTON_TRIANGLE) #define BTN_LEFT_PRESSED (WBTN_LEFT_PRESSED || GBTN_LEFT_PRESSED)
#define DBTN_Z (DS3_BUTTON_CIRCLE) #define BTN_RIGHT_PRESSED (WBTN_RIGHT_PRESSED || GBTN_RIGHT_PRESSED)
#define DBTN_B (DS3_BUTTON_CROSS) #define BTN_HOME_PRESSED (WBTN_HOME_PRESSED || GBTN_START_PRESSED)
#define DBTN_A (DS3_BUTTON_SQUARE) #define BTN_MINUS_PRESSED (WBTN_MINUS_PRESSED || GBTN_L_PRESSED)
#define DBTN_UP (DS3_BUTTON_UP) #define BTN_PLUS_PRESSED (WBTN_PLUS_PRESSED || GBTN_R_PRESSED)
#define DBTN_RIGHT (DS3_BUTTON_RIGHT) #define BTN_A_PRESSED (WBTN_A_PRESSED || GBTN_A_PRESSED)
#define DBTN_DOWN (DS3_BUTTON_DOWN) #define BTN_B_PRESSED (WBTN_B_PRESSED || GBTN_B_PRESSED)
#define DBTN_LEFT (DS3_BUTTON_LEFT) #define BTN_1_PRESSED (WBTN_1_PRESSED || GBTN_1_PRESSED)
#define DBTN_L1 (DS3_BUTTON_L1) #define BTN_2_PRESSED (WBTN_2_PRESSED || GBTN_2_PRESSED)
#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)
#define BTN_UP_HELD (WBTN_UP_HELD || GBTN_UP_HELD) #define BTN_UP_HELD (WBTN_UP_HELD || GBTN_UP_HELD)
#define BTN_DOWN_HELD (WBTN_DOWN_HELD || GBTN_DOWN_HELD) #define BTN_DOWN_HELD (WBTN_DOWN_HELD || GBTN_DOWN_HELD)
@ -141,7 +107,7 @@
#define BTN_MINUS_HELD (WBTN_MINUS_HELD || GBTN_L_HELD) #define BTN_MINUS_HELD (WBTN_MINUS_HELD || GBTN_L_HELD)
#define BTN_PLUS_HELD (WBTN_PLUS_HELD || GBTN_R_HELD) #define BTN_PLUS_HELD (WBTN_PLUS_HELD || GBTN_R_HELD)
#define BTN_A_HELD (WBTN_A_HELD || GBTN_A_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_B_HELD (WBTN_B_HELD || GBTN_B_HELD)
#define BTN_1_HELD (WBTN_1_HELD || GBTN_1_HELD) #define BTN_1_HELD (WBTN_1_HELD || GBTN_1_HELD)
#define BTN_2_HELD (WBTN_2_HELD || GBTN_2_HELD) #define BTN_2_HELD (WBTN_2_HELD || GBTN_2_HELD)
@ -154,11 +120,11 @@ enum
WBTN_A, WBTN_A,
}; };
#define BTN_UP_REPEAT (wii_btnRepeat(WBTN_UP) || gc_btnRepeat(GBTN_UP) || ds3_btnRepeat(DBTN_UP)) #define BTN_UP_REPEAT (wii_btnRepeat(WBTN_UP) || gc_btnRepeat(GBTN_UP))
#define BTN_DOWN_REPEAT (wii_btnRepeat(WBTN_DOWN) || gc_btnRepeat(GBTN_DOWN) || ds3_btnRepeat(DBTN_DOWN)) #define BTN_DOWN_REPEAT (wii_btnRepeat(WBTN_DOWN) || gc_btnRepeat(GBTN_DOWN))
#define BTN_LEFT_REPEAT (wii_btnRepeat(WBTN_LEFT) || gc_btnRepeat(GBTN_LEFT) || ds3_btnRepeat(DBTN_LEFT)) #define BTN_LEFT_REPEAT (wii_btnRepeat(WBTN_LEFT) || gc_btnRepeat(GBTN_LEFT))
#define BTN_RIGHT_REPEAT (wii_btnRepeat(WBTN_RIGHT) || gc_btnRepeat(GBTN_RIGHT) || ds3_btnRepeat(DBTN_RIGHT)) #define BTN_RIGHT_REPEAT (wii_btnRepeat(WBTN_RIGHT) || gc_btnRepeat(GBTN_RIGHT))
#define BTN_A_REPEAT (wii_btnRepeat(WBTN_A) || gc_btnRepeat(GBTN_A) || ds3_btnRepeat(DBTN_A)) #define BTN_A_REPEAT (wii_btnRepeat(WBTN_A) || gc_btnRepeat(GBTN_A))
#define LEFT_STICK_UP lStick_Up() #define LEFT_STICK_UP lStick_Up()
#define LEFT_STICK_DOWN lStick_Down() #define LEFT_STICK_DOWN lStick_Down()
@ -169,8 +135,8 @@ enum
#define RIGHT_STICK_DOWN rStick_Down() #define RIGHT_STICK_DOWN rStick_Down()
#define RIGHT_STICK_LEFT rStick_Left() #define RIGHT_STICK_LEFT rStick_Left()
#define RIGHT_STICK_RIGHT rStick_Right() #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_LEFT wRoll_Left()
#define WROLL_RIGHT wRoll_Right() #define WROLL_RIGHT wRoll_Right()

View File

@ -32,6 +32,10 @@ static inline bool apply_patch(char *name, const u8 *old, const u8 *patch, u32 s
return (found > 0); 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_old[] = { 0x42, 0x8B, 0xD0, 0x01, 0x25, 0x66 };
static const u8 isfs_perm_patch[] = { 0x42, 0x8B, 0xE0, 0x01, 0x25, 0x66 }; static const u8 isfs_perm_patch[] = { 0x42, 0x8B, 0xE0, 0x01, 0x25, 0x66 };
static const u8 setuid_old[] = { 0xD1, 0x2A, 0x1C, 0x39 }; 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_old[] = { 0x20, 0x07, 0x4B, 0x0B };
static const u8 new_hash_patch[] = { 0x20, 0x00, 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(); __ES_Close();
write16(MEM_PROT, 0); write16(MEM_PROT, 0);
/* Do Patching */ /* Do Patching */

View File

@ -6,7 +6,7 @@ extern "C"
#ifndef _PATCHER_H_ #ifndef _PATCHER_H_
#define _PATCHER_H_ #define _PATCHER_H_
void PatchIOS(bool patch_all); void PatchIOS(bool patch_all, bool WiiVC);
#endif #endif

View File

@ -79,9 +79,9 @@ void Nand::Init()
bool Nand::LoadDefaultIOS(void) bool Nand::LoadDefaultIOS(void)
{ {
Patch_AHB(); Patch_AHB();//apply a patch so the new IOS will also have AHBPROT disabled
s32 ret = IOS_ReloadIOS(IOS_GetPreferredVersion()); s32 ret = IOS_ReloadIOS(IOS_GetPreferredVersion());// reload to preferred IOS. not sure what wiiflows preferred IOS is.
loadIOS(IOS_GetVersion(), false); loadIOS(IOS_GetVersion(), false);// this basically does nothing (well very little). definetly doesn't load a IOS or shutdown anything.
Init_ISFS(); Init_ISFS();
return (ret == 0); return (ret == 0);
} }
@ -1128,7 +1128,7 @@ void Nand::Init_ISFS()
{ {
if(isfs_inited) if(isfs_inited)
return; return;
PatchIOS(IOS_GetVersion() < 222); PatchIOS(IOS_GetVersion() < 222, isWiiVC);
usleep(1000); usleep(1000);
gprintf("Init ISFS\n"); gprintf("Init ISFS\n");
ISFS_Initialize(); ISFS_Initialize();

View File

@ -163,7 +163,7 @@ void NandSave::LoadSettings()
ios_settings_t *file = (ios_settings_t*)ISFS_GetFile(ISFS_Path, &size, -1); ios_settings_t *file = (ios_settings_t*)ISFS_GetFile(ISFS_Path, &size, -1);
if(file != NULL && size == sizeof(ios_settings_t)) 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; cur_ios = file->cios;
if(cur_ios > 0) if(cur_ios > 0)
mainIOS = cur_ios; mainIOS = cur_ios;
@ -177,7 +177,7 @@ void NandSave::LoadSettings()
u8 *port = ISFS_GetFile(ISFS_Path, &size, -1); u8 *port = ISFS_GetFile(ISFS_Path, &size, -1);
if(port != NULL && size == sizeof(u8)) 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; currentPort = port[0] & 1;
} }
if(port != NULL) if(port != NULL)
@ -191,7 +191,7 @@ void NandSave::SaveIOS()
memset(&ios_settings, 0, sizeof(ios_settings_t)); memset(&ios_settings, 0, sizeof(ios_settings_t));
ios_settings.cios = cur_ios; ios_settings.cios = cur_ios;
ios_settings.use_cios = cur_load; 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)); WriteFile(IOS_SAVE_PATH, (u8*)&ios_settings, sizeof(ios_settings_t));
} }
@ -199,7 +199,7 @@ void NandSave::SavePort(u8 port)
{ {
if(loaded == false) if(loaded == false)
return; return;
gprintf("Saving Port Settings to NAND\n"); gprintf("Saving Port Settings to wiiflow save\n");
WriteFile(PORT_SAVE_PATH, &port, sizeof(port)); WriteFile(PORT_SAVE_PATH, &port, sizeof(port));
} }

View File

@ -8,8 +8,6 @@
#include <string> #include <string>
#include "wiiuse/wpad.h" #include "wiiuse/wpad.h"
#include <ogc/pad.h>
#include "video.hpp" #include "video.hpp"
#include "FreeTypeGX.h" #include "FreeTypeGX.h"
#include "text.hpp" #include "text.hpp"

View File

@ -7,7 +7,6 @@
#include <ogc/pad.h> #include <ogc/pad.h>
#include "wiiuse/wpad.h" #include "wiiuse/wpad.h"
#include "wupc/wupc.h" #include "wupc/wupc.h"
#include "sicksaxis-wrapper/sicksaxis-wrapper.h"
#include "video.hpp" #include "video.hpp"
#include "FreeTypeGX.h" #include "FreeTypeGX.h"

View File

@ -57,23 +57,22 @@ bool loadIOS(int ios, bool MountDevices)
if(ios != CurIOS && IOS_GetType(ios) != IOS_TYPE_STUB) if(ios != CurIOS && IOS_GetType(ios) != IOS_TYPE_STUB)
{ {
WDVD_Close();
gprintf("Reloading into IOS %i from %i...\n", ios, CurIOS); gprintf("Reloading into IOS %i from %i...\n", ios, CurIOS);
ShutdownBeforeExit(); ShutdownBeforeExit();// unmount all, close inputs and dvd drive, deinit ISFS, and close network
NandHandle.Patch_AHB(); //No AHBPROT for the next IOS NandHandle.Patch_AHB(); //apply a patch so the new IOS will also have AHBPROT disabled
ret = IOS_ReloadIOS(ios) == 0; ret = IOS_ReloadIOS(ios) == 0;// convert ret value to true or false
gprintf("AHBPROT after IOS Reload: %u\n", AHBPROT_Patched()); gprintf("AHBPROT disabled after IOS Reload: %s\n", AHBPROT_Patched() ? "yes" : "no");
NandHandle.Init_ISFS(); NandHandle.Init_ISFS();// re init ISFS
WDVD_Init(); WDVD_Init();// re open dvd drive
} }
/* Init_ISFS() before calling IOS_GetCurrentIOSInfo() */
IOS_GetCurrentIOSInfo(); IOS_GetCurrentIOSInfo();
if(CurrentIOS.Type == IOS_TYPE_HERMES) if(CurrentIOS.Type == IOS_TYPE_HERMES)
load_ehc_module_ex(); load_ehc_module_ex();
else if(CurrentIOS.Type == IOS_TYPE_WANIN && CurrentIOS.Revision >= 18) else if(CurrentIOS.Type == IOS_TYPE_WANIN && CurrentIOS.Revision >= 18)
load_dip_249(); load_dip_249();
DeviceHandle.SetModes(); DeviceHandle.SetModes();
if(MountDevices && ios != CurIOS) if(MountDevices && ios != CurIOS)// remount sd and USB if desired
DeviceHandle.MountAll(); DeviceHandle.MountAll();
return ret; return ret;

View File

@ -120,6 +120,8 @@ bool IOS_D2X(u8 ios, u8 *base)
u8 IOS_GetType(u8 slot) u8 IOS_GetType(u8 slot)
{ {
if(isWiiVC)
return IOS_TYPE_NORMAL_IOS;
u32 TMD_Length; u32 TMD_Length;
signed_blob *TMD_Buffer = GetTMD(slot, &TMD_Length); signed_blob *TMD_Buffer = GetTMD(slot, &TMD_Length);
if(TMD_Buffer == NULL) if(TMD_Buffer == NULL)

View File

@ -1,9 +1,7 @@
#include <ogc/machine/processor.h>
#include <ogc/lwp_threads.h> #include <ogc/lwp_threads.h>
#include <ogc/lwp_watchdog.h> #include <ogc/pad.h>
#include <stdio.h> #include <stdio.h>
#include <ogcsys.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -15,9 +13,9 @@
#include "gecko/gecko.hpp" #include "gecko/gecko.hpp"
#include "memory/mem2.hpp" #include "memory/mem2.hpp"
#include "memory/memory.h" #include "memory/memory.h"
#include "sicksaxis-wrapper/sicksaxis-wrapper.h"
#include "wiiuse/wpad.h" #include "wiiuse/wpad.h"
#include "wupc/wupc.h" #include "wupc/wupc.h"
#include "sicksaxis-wrapper/sicksaxis-wrapper.h"
/* Variables */ /* Variables */
bool reset = false; bool reset = false;
@ -34,14 +32,13 @@ void __Wpad_PowerCallback()
void Open_Inputs(void) void Open_Inputs(void)
{ {
/* Initialize Wiimote subsystem */ /* Initialize controllers - wiiu drc is inited only once in main.cpp */
PAD_Init(); PAD_Init();
WUPC_Init(); WUPC_Init();
WPAD_Init(); WPAD_Init();
DS3_Init(); DS3_Init();
//drc
/* Set POWER button callback */ /* Set wiimote power button callback */
WPAD_SetPowerButtonCallback(__Wpad_PowerCallback); WPAD_SetPowerButtonCallback(__Wpad_PowerCallback);
WPAD_SetDataFormat(WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR); WPAD_SetDataFormat(WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR);
WPAD_SetIdleTimeout(60 * 2); // idle after 2 minutes WPAD_SetIdleTimeout(60 * 2); // idle after 2 minutes
@ -51,14 +48,13 @@ void Close_Inputs(void)
{ {
WUPC_Shutdown(); WUPC_Shutdown();
u32 cnt;
/* Disconnect Wiimotes */ /* Disconnect Wiimotes */
for(cnt = 0; cnt < 4; cnt++) for(u32 cnt = 0; cnt < 4; cnt++)
WPAD_Disconnect(cnt); WPAD_Disconnect(cnt);
/* Shutdown Wiimote subsystem */ /* Shutdown Wiimote subsystem */
WPAD_Shutdown(); WPAD_Shutdown();
DS3_Cleanup(); DS3_Cleanup();
} }

View File

@ -50,6 +50,7 @@ bool IsOnWiiU(void);
extern void __exception_setreload(int t); extern void __exception_setreload(int t);
extern int mainIOS; extern int mainIOS;
extern bool useMainIOS; extern bool useMainIOS;
extern bool isWiiVC;
extern volatile bool NANDemuView; extern volatile bool NANDemuView;
extern volatile bool networkInit; extern volatile bool networkInit;
extern u8 currentPartition; extern u8 currentPartition;

View File

@ -22,6 +22,7 @@
#include "menu/menu.hpp" #include "menu/menu.hpp"
#include "memory/memory.h" #include "memory/memory.h"
bool isWiiVC = false;
bool useMainIOS = false; bool useMainIOS = false;
volatile bool NANDemuView = false; volatile bool NANDemuView = false;
volatile bool networkInit = 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. */ /* if not then we can skip the 20 second cycle trying to connect a USB device. */
/* this is nice for SD only users */ /* this is nice for SD only users */
bool isUsingUSB() { bool isUsingUSB() {
if(isWiiVC)
return false;
/* First check if the app path exists on the SD card, if not then we're using USB */ /* First check if the app path exists on the SD card, if not then we're using USB */
struct stat dummy; struct stat dummy;
string appPath = fmt("%s:/%s", DeviceName[SD], APPS_DIR); string appPath = fmt("%s:/%s", DeviceName[SD], APPS_DIR);
@ -120,21 +123,42 @@ int main(int argc, char **argv)
} }
} }
if(IsOnWiiU())
gprintf("vWii Mode\n");
else
gprintf("Real Wii\n");
/* Init video */ /* Init video */
m_vid.init(); m_vid.init();
if(showFlashImg) if(showFlashImg)
m_vid.startImage(); 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 */ /* Init device partition handlers */
DeviceHandle.Init(); DeviceHandle.Init();
/* Init NAND handlers */ /* Init NAND handlers */
NandHandle.Init(); NandHandle.Init();
if(isWiiVC)
{
NandHandle.Init_ISFS();
IOS_GetCurrentIOSInfo();
DeviceHandle.SetModes();
}
else
{
NandHandle.LoadDefaultIOS(); /* safe reload to preferred IOS */ NandHandle.LoadDefaultIOS(); /* safe reload to preferred IOS */
/* load and check wiiflow save for possible new IOS and Port settings */ /* load and check wiiflow save for possible new IOS and Port settings */
@ -144,13 +168,16 @@ int main(int argc, char **argv)
/* Handle (c)IOS Loading */ /* Handle (c)IOS Loading */
if(useMainIOS && CustomIOS(IOS_GetType(mainIOS))) /* Requested */ if(useMainIOS && CustomIOS(IOS_GetType(mainIOS))) /* Requested */
iosOK = loadIOS(mainIOS, false) && CustomIOS(CurrentIOS.Type); iosOK = loadIOS(mainIOS, false) && CustomIOS(CurrentIOS.Type);
}
/* sys inits */ /* sys inits */
Sys_Init();// set reset and power button callbacks Sys_Init();// set reset and power button callbacks
Sys_ExitTo(EXIT_TO_HBC);// set exit to in case of failed launch Sys_ExitTo(EXIT_TO_HBC);// set exit to in case of failed launch
/* mount Devices */ /* mount SD */
DeviceHandle.MountSD();// mount SD before calling isUsingUSB() duh! DeviceHandle.MountSD();// mount SD before calling isUsingUSB() duh!
/* mount USB if needed */
DeviceHandle.SetMountUSB(isUsingUSB()); DeviceHandle.SetMountUSB(isUsingUSB());
DeviceHandle.MountAllUSB();// only mounts any USB if isUsingUSB() DeviceHandle.MountAllUSB();// only mounts any USB if isUsingUSB()
@ -159,7 +186,7 @@ int main(int argc, char **argv)
m_vid.waitMessage(0.15f); m_vid.waitMessage(0.15f);
/* init controllers for input */ /* 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 */ /* init configs, folders, coverflow, gui and more */
if(mainMenu.init()) if(mainMenu.init())
@ -183,6 +210,7 @@ int main(int argc, char **argv)
mainMenu.terror("errboot3", L"Could not initialize the DIP module!"); mainMenu.terror("errboot3", L"Could not initialize the DIP module!");
else // alls good lets start wiiflow else // alls good lets start wiiflow
{ {
if(!isWiiVC)
writeStub();// copy return stub to memory writeStub();// copy return stub to memory
if(gameid != NULL && strlen(gameid) == 6)// if argv game ID then launch it if(gameid != NULL && strlen(gameid) == 6)// if argv game ID then launch it
mainMenu.directlaunch(gameid); mainMenu.directlaunch(gameid);

View File

@ -25,7 +25,7 @@
#include "music/SoundHandler.hpp" #include "music/SoundHandler.hpp"
#include "network/gcard.h" #include "network/gcard.h"
#include "unzip/U8Archive.h" #include "unzip/U8Archive.h"
#include "sicksaxis-wrapper/sicksaxis-wrapper.h"
// Sounds // Sounds
extern const u8 click_wav[]; extern const u8 click_wav[];
extern const u32 click_wav_size; extern const u32 click_wav_size;
@ -409,7 +409,7 @@ bool CMenu::init()
float pShadowY = m_theme.getFloat("GENERAL", "pointer_shadow_y", 3.f); float pShadowY = m_theme.getFloat("GENERAL", "pointer_shadow_y", 3.f);
bool pShadowBlur = m_theme.getBool("GENERAL", "pointer_shadow_blur", false); 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_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); 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() void CMenu::_load_installed_cioses()
{ {
if(isWiiVC)
return;
gprintf("Loading cIOS map\n"); gprintf("Loading cIOS map\n");
_installed_cios[0] = 1; _installed_cios[0] = 1;
@ -2613,7 +2615,7 @@ void CMenu::TempLoadIOS(int IOS)
loadIOS(IOS, true); loadIOS(IOS, true);
Sys_Init(); Sys_Init();
Open_Inputs(); 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()); WPAD_SetVRes(chan, m_vid.width() + m_cursor[chan].width(), m_vid.height() + m_cursor[chan].height());
_netInit(); _netInit();
} }

View File

@ -26,9 +26,10 @@
#include "music/gui_sound.h" #include "music/gui_sound.h"
#include "music/MusicPlayer.hpp" #include "music/MusicPlayer.hpp"
#include "plugin/plugin.hpp" #include "plugin/plugin.hpp"
#include "sicksaxis-wrapper/sicksaxis-wrapper.h"
#include "wiiuse/wpad.h" #include "wiiuse/wpad.h"
#include "wupc/wupc.h" #include "wupc/wupc.h"
#include "sicksaxis-wrapper/sicksaxis-wrapper.h" #include "wiidrc/wiidrc.h"
using namespace std; using namespace std;
@ -634,60 +635,54 @@ private:
SZone m_gameButtonsZone; SZone m_gameButtonsZone;
WPADData *wd[WPAD_MAX_WIIMOTES]; 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_wpadLeftDelay;
u8 m_wpadDownDelay; u8 m_wpadDownDelay;
u8 m_wpadRightDelay; u8 m_wpadRightDelay;
u8 m_wpadUpDelay; u8 m_wpadUpDelay;
u8 m_wpadADelay; u8 m_wpadADelay;
//u8 m_wpadBDelay; //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_padLeftDelay;
u8 m_padDownDelay; u8 m_padDownDelay;
u8 m_padRightDelay; u8 m_padRightDelay;
u8 m_padUpDelay; u8 m_padUpDelay;
u8 m_padADelay; u8 m_padADelay;
//u8 m_padBDelay; //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_angle[WPAD_MAX_WIIMOTES];
float left_stick_mag[WPAD_MAX_WIIMOTES]; float left_stick_mag[WPAD_MAX_WIIMOTES];
float right_stick_angle[WPAD_MAX_WIIMOTES]; float right_stick_angle[WPAD_MAX_WIIMOTES];
float right_stick_mag[WPAD_MAX_WIIMOTES]; float right_stick_mag[WPAD_MAX_WIIMOTES];
float wmote_roll[WPAD_MAX_WIIMOTES];
s32 right_stick_skip[WPAD_MAX_WIIMOTES]; s32 right_stick_skip[WPAD_MAX_WIIMOTES];
float wmote_roll[WPAD_MAX_WIIMOTES];
s32 wmote_roll_skip[WPAD_MAX_WIIMOTES]; s32 wmote_roll_skip[WPAD_MAX_WIIMOTES];
bool enable_wmote_roll; bool enable_wmote_roll;
time_t no_input_time;
void SetupInput(bool reset_pos = false); void SetupInput(bool reset_pos = false);
void ScanInput(void); void ScanInput(void);
u32 NoInputTime(void);
void ButtonsPressed(void); void ButtonsPressed(void);
void ButtonsHeld(void); void ButtonsHeld(void);
void LeftStick();
bool lStick_Up(void); bool lStick_Up(void);
bool lStick_Right(void); bool lStick_Right(void);
bool lStick_Down(void); bool lStick_Down(void);
@ -701,12 +696,15 @@ private:
bool wRoll_Left(void); bool wRoll_Left(void);
bool wRoll_Right(void); bool wRoll_Right(void);
bool wii_btnRepeat(u8 btn);
bool gc_btnRepeat(s64 btn);
bool WPadIR_Valid(int chan); bool WPadIR_Valid(int chan);
bool WPadIR_ANY(void); 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 ShowZone(SZone zone, bool &showZone);
void ShowMainZone(void); void ShowMainZone(void);
void ShowMainZone2(void); void ShowMainZone2(void);
@ -714,7 +712,6 @@ private:
void ShowPrevZone(void); void ShowPrevZone(void);
void ShowNextZone(void); void ShowNextZone(void);
void ShowGameZone(void); void ShowGameZone(void);
bool ShowPointer(void);
bool m_show_zone_main; bool m_show_zone_main;
bool m_show_zone_main2; bool m_show_zone_main2;
bool m_show_zone_main3; bool m_show_zone_main3;
@ -722,6 +719,9 @@ private:
bool m_show_zone_next; bool m_show_zone_next;
bool m_show_zone_game; bool m_show_zone_game;
time_t no_input_time;
u32 NoInputTime(void);
volatile bool m_exit; volatile bool m_exit;
volatile bool m_thrdStop; volatile bool m_thrdStop;
volatile bool m_thrdWorking; volatile bool m_thrdWorking;
@ -1195,7 +1195,9 @@ private:
void _stopGameSoundThread(void); void _stopGameSoundThread(void);
static void * _gameSoundThread(void *obj); static void * _gameSoundThread(void *obj);
static void _load_installed_cioses(); void _load_installed_cioses();
map<u8, u8> _installed_cios;
typedef map<u8, u8>::iterator CIOSItr;
struct SOption { const char id[10]; const wchar_t text[16]; }; struct SOption { const char id[10]; const wchar_t text[16]; };
@ -1221,8 +1223,6 @@ private:
static const SOption _hooktype[8]; static const SOption _hooktype[8];
static const SOption _exitTo[3]; static const SOption _exitTo[3];
static map<u8, u8> _installed_cios;
typedef map<u8, u8>::iterator CIOSItr;
static int _version[9]; static int _version[9];
static const SCFParamDesc _cfParams[]; static const SCFParamDesc _cfParams[];
static const int _nbCfgPages; static const int _nbCfgPages;

View File

@ -197,7 +197,7 @@ const CMenu::SOption CMenu::_debugger[3] = {
{ "dbgfwrite", L"OSReport" }, { "dbgfwrite", L"OSReport" },
}; };
map<u8, u8> CMenu::_installed_cios; //map<u8, u8> CMenu::_installed_cios;
static inline int loopNum(int i, int s) static inline int loopNum(int i, int s)
{ {
@ -663,6 +663,14 @@ void CMenu::_game(bool launch)
(!ShowPointer() && !m_video_playing && !coverFlipped)) (!ShowPointer() && !m_video_playing && !coverFlipped))
{ {
_hideGame(); _hideGame();
if(isWiiVC && (hdr->type == TYPE_WII_GAME || hdr->type == TYPE_EMUCHANNEL))
{
error(_t("errgame19", L"Can't launch in Wii virtual console mode!"));
launch = false;
_showGame();
}
else
{
MusicPlayer.Stop(); MusicPlayer.Stop();
_cleanupBanner(); _cleanupBanner();
m_cfg.setInt("GENERAL", "cat_startpage", m_catStartPage); m_cfg.setInt("GENERAL", "cat_startpage", m_catStartPage);
@ -727,6 +735,7 @@ void CMenu::_game(bool launch)
m_gcfg2.unload(); m_gcfg2.unload();
_showGame(); _showGame();
} }
}
else if(!coverFlipped) else if(!coverFlipped)
{ {
/* flip cover if mouse over */ /* flip cover if mouse over */
@ -1055,6 +1064,7 @@ void CMenu::_launch(const dir_discHdr *hdr)
} }
} }
/* launch plugin with args */ /* launch plugin with args */
gprintf("launching plugin app\n");
_launchHomebrew(plugin_file, arguments); _launchHomebrew(plugin_file, arguments);
} }
else if(launchHdr.type == TYPE_HOMEBREW) 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); m_cfg.setString(HOMEBREW_DOMAIN, "current_item", strrchr(launchHdr.path, '/') + 1);
vector<string> arguments = _getMetaXML(bootpath); vector<string> arguments = _getMetaXML(bootpath);
gprintf("launching homebrew app\n");
_launchHomebrew(bootpath, arguments); _launchHomebrew(bootpath, arguments);
} }
} }
@ -1084,6 +1095,7 @@ void CMenu::_launchHomebrew(const char *filepath, vector<string> arguments)
Playlog_Delete(); 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()))); bool ret = (LoadHomebrew(filepath) && LoadAppBooter(fmt("%s/app_booter.bin", m_binsDir.c_str())));
if(ret == false) if(ret == false)
{ {
@ -1096,7 +1108,7 @@ void CMenu::_launchHomebrew(const char *filepath, vector<string> arguments)
AddBootArgument(filepath); AddBootArgument(filepath);
for(u32 i = 0; i < arguments.size(); ++i) 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()); AddBootArgument(arguments[i].c_str());
} }
@ -1455,7 +1467,7 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool disc)
/* dont confuse loadIOS with _loadIOS */ /* dont confuse loadIOS with _loadIOS */
int CMenu::_loadIOS(u8 gameIOS, int userIOS, string id, bool RealNAND_Channels) 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) if(RealNAND_Channels && IOS_GetType(mainIOS) == IOS_TYPE_STUB)
{ {
/* doesn't use cIOS so we don't check userIOS */ /* 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); 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 int aspectRatio = min(m_gcfg2.getUInt(id, "aspect_ratio", 0), ARRAY_SIZE(CMenu::_AspectRatio) - 1) - 1;// -1,0,1
//u32 returnTo = 0; 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];
const char *rtrn = m_cfg.getString("GENERAL", "returnto").c_str(); 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; u8 *cheatFile = NULL;
u32 cheatSize = 0; u32 cheatSize = 0;
@ -1683,7 +1693,7 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
setLanguage(language); setLanguage(language);
ocarina_load_code(cheatFile, cheatSize); ocarina_load_code(cheatFile, cheatSize);
NandHandle.Patch_AHB(); /* Identify maybe uses it so keep AHBPROT disabled */ NandHandle.Patch_AHB(); /* Identify maybe uses it so keep AHBPROT disabled */
PatchIOS(true); /* Patch for everything */ PatchIOS(true, isWiiVC); /* Patch for everything */
Identify(gameTitle); Identify(gameTitle);
ExternalBooter_ChannelSetup(gameTitle, use_dol); 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); 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; 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(); 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; 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); u8 patchVidMode = min(m_gcfg2.getUInt(id, "patch_video_modes", 0), ARRAY_SIZE(CMenu::_vidModePatch) - 1u);

View File

@ -2,13 +2,8 @@
#include <ogc/lwp_watchdog.h> #include <ogc/lwp_watchdog.h>
#include "menu.hpp" #include "menu.hpp"
#include "sicksaxis-wrapper/sicksaxis-wrapper.h"
static const u32 g_repeatDelay = 25; 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) void CMenu::SetupInput(bool reset_pos)
{ {
@ -59,6 +54,18 @@ static int CalculateRepeatSpeed(float magnitude, int current_value)
void CMenu::ScanInput() 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_main = false;
m_show_zone_main2 = false; m_show_zone_main2 = false;
m_show_zone_main3 = false; m_show_zone_main3 = false;
@ -69,7 +76,8 @@ void CMenu::ScanInput()
WPAD_ScanPads(); WPAD_ScanPads();
PAD_ScanPads(); PAD_ScanPads();
DS3_ScanPads(); DS3_ScanPads();
//drc if(WiiDRC_Inited() && WiiDRC_Connected())
WiiDRC_ScanPads();
ButtonsPressed(); ButtonsPressed();
ButtonsHeld(); ButtonsHeld();
@ -82,7 +90,7 @@ void CMenu::ScanInput()
left_stick_mag[chan] = 0; left_stick_mag[chan] = 0;
right_stick_angle[chan] = 0; right_stick_angle[chan] = 0;
right_stick_mag[chan] = 0; right_stick_mag[chan] = 0;
switch(wd[chan]->exp.type) switch(wd[chan]->exp.type)// exp = expansion
{ {
case WPAD_EXP_NUNCHUK: case WPAD_EXP_NUNCHUK:
right_stick_mag[chan] = wd[chan]->exp.nunchuk.js.mag; 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]); 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--) 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, 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); 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]); 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_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); 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_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); m_btnMgr.mouse(chan, stickPointer_x[chan] - m_cursor[chan].width() / 2, stickPointer_y[chan] - m_cursor[chan].height() / 2);
} }
} }
/* handles display zones */
ShowMainZone(); ShowMainZone();
ShowMainZone2(); ShowMainZone2();
ShowMainZone3(); ShowMainZone3();
@ -133,10 +143,15 @@ void CMenu::ScanInput()
} }
extern "C" { extern bool shutdown; }; 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() void CMenu::ButtonsPressed()
{ {
gc_btnsPressed = 0; gc_btnsPressed = 0;
/* ds3 controller */
if(CheckTime()) if(CheckTime())
{ {
ds3_btnsPressed = DS3_ButtonsDown(); ds3_btnsPressed = DS3_ButtonsDown();
@ -145,30 +160,94 @@ void CMenu::ButtonsPressed()
else else
ds3_btnsPressed = 0; 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); wii_btnsPressed[chan] = WPAD_ButtonsDown(chan);
gc_btnsPressed |= PAD_ButtonsDown(chan); gc_btnsPressed |= PAD_ButtonsDown(chan);
wupc_btnsPressed[chan] = WUPC_ButtonsDown(chan); wupc_btnsPressed[chan] = WUPC_ButtonsDown(chan);
//drc
}
} }
} }
void CMenu::ButtonsHeld() void CMenu::ButtonsHeld()
{ {
/* wii, gc, drc, and wupc controllers = no ds3 not sure why */
gc_btnsHeld = 0; gc_btnsHeld = 0;
gc_btnsHeld |= wiidrc_to_pad(WiiDRC_ButtonsHeld());
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--)
{ {
wii_btnsHeld[chan] = WPAD_ButtonsHeld(chan); wii_btnsHeld[chan] = WPAD_ButtonsHeld(chan);
gc_btnsHeld |= PAD_ButtonsHeld(chan); gc_btnsHeld |= PAD_ButtonsHeld(chan);
wupc_btnsHeld[chan] = WUPC_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) 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)); 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; return false;
} }
/* Left Stick is used to show/hide the pointer and move it */
void CMenu::LeftStick() void CMenu::LeftStick()
{ {
u8 speed = 0, pSpeed = 0; u8 speed = 0, pSpeed = 0;
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) 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; m_show_pointer[chan] = true;
if(LEFT_STICK_LEFT) if(LEFT_STICK_LEFT)
{ {
speed = (u8)(left_stick_mag[chan] * 10.00); 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) if(stickPointer_x[chan] > m_cursor[chan].width()/2)
stickPointer_x[chan] = stickPointer_x[chan]-speed-pSpeed; stickPointer_x[chan] = stickPointer_x[chan]-speed-pSpeed;
pointerhidedelay[chan] = 150; pointerhidedelay[chan] = 150;
@ -218,7 +301,9 @@ void CMenu::LeftStick()
if(LEFT_STICK_DOWN) if(LEFT_STICK_DOWN)
{ {
speed = (u8)(left_stick_mag[chan] * 10.00); 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))) if(stickPointer_y[chan] < (m_vid.height() + (m_cursor[chan].height()/2)))
stickPointer_y[chan] = stickPointer_y[chan]+speed+pSpeed; stickPointer_y[chan] = stickPointer_y[chan]+speed+pSpeed;
pointerhidedelay[chan] = 150; pointerhidedelay[chan] = 150;
@ -226,7 +311,9 @@ void CMenu::LeftStick()
if(LEFT_STICK_RIGHT) if(LEFT_STICK_RIGHT)
{ {
speed = (u8)(left_stick_mag[chan] * 10.00); 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))) if(stickPointer_x[chan] < (m_vid.width() + (m_cursor[chan].width()/2)))
stickPointer_x[chan] = stickPointer_x[chan]+speed+pSpeed; stickPointer_x[chan] = stickPointer_x[chan]+speed+pSpeed;
pointerhidedelay[chan] = 150; pointerhidedelay[chan] = 150;
@ -234,7 +321,9 @@ void CMenu::LeftStick()
if(LEFT_STICK_UP) if(LEFT_STICK_UP)
{ {
speed = (u8)(left_stick_mag[chan] * 10.00); 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) if(stickPointer_y[chan] > m_cursor[chan].height()/2)
stickPointer_y[chan] = stickPointer_y[chan]-speed-pSpeed; stickPointer_y[chan] = stickPointer_y[chan]-speed-pSpeed;
pointerhidedelay[chan] = 150; 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); 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 CMenu::wii_btnRepeat(u8 btn)
{ {
bool b = false; bool b = false;
@ -414,109 +506,13 @@ bool CMenu::gc_btnRepeat(s64 btn)
return b; 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) bool CMenu::lStick_Up(void)
{ {
if(WiiDRC_lStickY() > 20 || DS3_StickY() < -20)
return true;
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) 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 true;
} }
return false; return false;
@ -524,9 +520,11 @@ bool CMenu::lStick_Up(void)
bool CMenu::lStick_Right(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--) 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 true;
} }
return false; return false;
@ -534,9 +532,11 @@ bool CMenu::lStick_Right(void)
bool CMenu::lStick_Down(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--) 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 true;
} }
return false; return false;
@ -544,16 +544,21 @@ bool CMenu::lStick_Down(void)
bool CMenu::lStick_Left(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--) 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 true;
} }
return false; 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) bool CMenu::rStick_Up(void)
{ {
if(WiiDRC_rStickY() > 30)
return true;
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) 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) 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) bool CMenu::rStick_Right(void)
{ {
if(WiiDRC_rStickX() > 30)
return true;
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) 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) 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) bool CMenu::rStick_Down(void)
{ {
if(WiiDRC_rStickY() < -30)
return true;
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) 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) 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) bool CMenu::rStick_Left(void)
{ {
if(WiiDRC_rStickX() < -30)
return true;
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) 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) 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); ShowZone(m_gameButtonsZone, m_show_zone_game);
} }
/* returns the elapsed time of no controller input */
u32 CMenu::NoInputTime() u32 CMenu::NoInputTime()
{ {
bool input_found = false; 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) if(ShowPointer() == true || RIGHT_STICK_MOVE == true || gc_btnsPressed != 0)
input_found = true; input_found = true;
else else
{ {
/* check if any wiimote buttons are pressed or held */
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--)
{ {
if(wii_btnsPressed[chan] != 0 || wii_btnsHeld[chan] != 0) if(wii_btnsPressed[chan] != 0 || wii_btnsHeld[chan] != 0)

View File

@ -253,9 +253,10 @@ int CMenu::main(void)
m_btnMgr.show(m_mem1FreeSize); m_btnMgr.show(m_mem1FreeSize);
m_btnMgr.show(m_mem2FreeSize); m_btnMgr.show(m_mem2FreeSize);
} }
SetupInput(true); SetupInput(true);
gprintf("start wiiflow main screen\n"); gprintf("wiiflow main screen ready!\n");
while(!m_exit) while(!m_exit)
{ {
/* IMPORTANT check if a disc is inserted */ /* IMPORTANT check if a disc is inserted */

View File

@ -103,6 +103,8 @@ void CMenu::_listEmuNands(const char *path, vector<string> &emuNands)
void CMenu::_checkEmuNandSettings(void) void CMenu::_checkEmuNandSettings(void)
{ {
if(isWiiVC)
return;
u8 i; u8 i;
string emuNand = m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default"); string emuNand = m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default");
int emuPart = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0); int emuPart = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0);
@ -191,6 +193,8 @@ void CMenu::_checkEmuNandSettings(void)
void CMenu::_FullNandCheck(void) void CMenu::_FullNandCheck(void)
{ {
if(isWiiVC)
return;
for(u8 i = 0; i < 2; i++) for(u8 i = 0; i < 2; i++)
{ {
int emulate_mode; int emulate_mode;

View File

@ -345,6 +345,7 @@ int getTID(const char *path, u64 *tid)
void * CMenu::_pThread(void *obj) void * CMenu::_pThread(void *obj)
{ {
CMenu *m = (CMenu*)obj; CMenu *m = (CMenu*)obj;
m->SetupInput();
while(m->m_thrdInstalling) while(m->m_thrdInstalling)
{ {
m->_mainLoopCommon(); m->_mainLoopCommon();

View File

@ -47,12 +47,12 @@ void SoundHandler::Init()
DecoderList[i] = NULL; DecoderList[i] = NULL;
LWP_CreateThread(&SoundThread, UpdateThread, this, SoundStack, SoundStackSize, LWP_PRIO_HIGHEST); LWP_CreateThread(&SoundThread, UpdateThread, this, SoundStack, SoundStackSize, LWP_PRIO_HIGHEST);
gprintf("SHND: Running sound thread\n"); gprintf("Running sound thread\n");
} }
void SoundHandler::Cleanup() void SoundHandler::Cleanup()
{ {
gprintf("SHND: Stopping sound thread\n"); gprintf("Stopping sound thread\n");
ExitRequested = true; ExitRequested = true;
ThreadSignal(); ThreadSignal();
@ -60,7 +60,7 @@ void SoundHandler::Cleanup()
SoundThread = LWP_THREAD_NULL; SoundThread = LWP_THREAD_NULL;
ClearDecoderList(); ClearDecoderList();
gprintf("SHND: Stopped sound thread\n"); gprintf("Stopped sound thread\n");
} }
void SoundHandler::AddDecoder(int voice, const char * filepath) void SoundHandler::AddDecoder(int voice, const char * filepath)

View File

@ -4,7 +4,7 @@
#ifndef _DS3WRAPPER_H_ #ifndef _DS3WRAPPER_H_
#define _DS3WRAPPER_H_ #define _DS3WRAPPER_H_
#include <gctypes.h> //#include <gctypes.h>
struct ss_device; struct ss_device;

View File

@ -292,6 +292,7 @@ errgame15=WiiFlow locked! Unlock WiiFlow to use this feature.
errgame16=Not available for plugin games! errgame16=Not available for plugin games!
errgame17=Can not delete real NAND Channels! errgame17=Can not delete real NAND Channels!
errgame18=No game info! errgame18=No game info!
errgame19=Can't launch in Wii virtual console mode!
errneek1=Cannot launch neek2o. Verify your neek2o setup errneek1=Cannot launch neek2o. Verify your neek2o setup
errsource1=Homebrew locked! errsource1=Homebrew locked!
errsource2=Homebrew and multisource not allowed! errsource2=Homebrew and multisource not allowed!