diff --git a/Makefile.main b/Makefile.main
index 869cffcc..5ee379c6 100644
--- a/Makefile.main
+++ b/Makefile.main
@@ -57,7 +57,7 @@ ios := 249
#---------------------------------------------------------------------------------
CFLAGS = -g -ggdb -Os -Wall -Wextra $(MACHDEP) $(INCLUDE) -DHAVE_CONFIG_H
CXXFLAGS = $(CFLAGS)
-LDFLAGS = -g -ggdb $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80620000,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size
+LDFLAGS = -g -ggdb $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80620000,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size,-wrap,wiiuse_register
ifeq ($(BUILDMODE),channel)
CFLAGS += -DFULLCHANNEL
@@ -67,7 +67,7 @@ endif
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
-LIBS := -lcustomfat -lcustomntfs -lcustomext2fs -lpng -lturbojpeg -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad
+LIBS := -lcustomfat -lcustomntfs -lcustomext2fs -lpng -lturbojpeg -lm -lz -lwiiuse -lwupc -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad
#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
diff --git a/portlibs/include/wupc/wupc.h b/portlibs/include/wupc/wupc.h
new file mode 100644
index 00000000..02653964
--- /dev/null
+++ b/portlibs/include/wupc/wupc.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+ * Copyright (C) 2014 FIX94
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ ****************************************************************************/
+#ifndef _WUPC_H_
+#define _WUPC_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct WUPCData {
+ s16 xAxisL;
+ s16 xAxisR;
+ s16 yAxisL;
+ s16 yAxisR;
+ u32 button;
+};
+
+void WUPC_Init();
+void WUPC_Shutdown();
+struct WUPCData *WUPC_Data(u8 chan);
+void WUPC_Rumble(u8 chan, bool rumble);
+u32 WUPC_UpdateButtonStats();
+u32 WUPC_ButtonsUp(u8 chan);
+u32 WUPC_ButtonsDown(u8 chan);
+u32 WUPC_ButtonsHeld(u8 chan);
+s16 WUPC_lStickX(u8 chan);
+s16 WUPC_lStickY(u8 chan);
+s16 WUPC_rStickX(u8 chan);
+s16 WUPC_rStickY(u8 chan);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/portlibs/lib/libwupc.a b/portlibs/lib/libwupc.a
new file mode 100644
index 00000000..397dae2b
Binary files /dev/null and b/portlibs/lib/libwupc.a differ
diff --git a/source/gui/gui.cpp b/source/gui/gui.cpp
index 695afaec..a2268c88 100644
--- a/source/gui/gui.cpp
+++ b/source/gui/gui.cpp
@@ -197,10 +197,11 @@ void CButtonsMgr::show(s16 id, bool instant)
}
}
-void CButtonsMgr::setRumble(int chan, bool wii, bool gc)
+void CButtonsMgr::setRumble(int chan, bool wii, bool gc, bool wupc)
{
wii_rumble[chan] = wii;
gc_rumble[chan] = gc;
+ wupc_rumble[chan] = wupc;
}
void CButtonsMgr::mouse(int chan, int x, int y)
@@ -240,6 +241,7 @@ void CButtonsMgr::mouse(int chan, int x, int y)
if(m_rumbleEnabled)
{
m_rumble[chan] = 4;
+ if(wupc_rumble[chan]) WUPC_Rumble(chan, 1);
if(wii_rumble[chan]) WPAD_Rumble(chan, 1);
if(gc_rumble[chan]) PAD_ControlMotor(chan, 1);
}
@@ -341,6 +343,7 @@ void CButtonsMgr::click(s16 id)
{
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--)
{
+ WUPC_Rumble(chan, 0);
WPAD_Rumble(chan, 0);
PAD_ControlMotor(chan, 0);
@@ -393,6 +396,7 @@ void CButtonsMgr::tick(void)
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--)
if (m_rumble[chan] > 0 && --m_rumble[chan] == 0)
{
+ WUPC_Rumble(chan, 0);
WPAD_Rumble(chan, 0);
PAD_ControlMotor(chan, 0);
}
diff --git a/source/gui/gui.hpp b/source/gui/gui.hpp
index fe4a42be..154417b3 100644
--- a/source/gui/gui.hpp
+++ b/source/gui/gui.hpp
@@ -6,6 +6,7 @@
#include
#include "wiiuse/wpad.h"
+#include "wupc/wupc.h"
#include "video.hpp"
#include "FreeTypeGX.h"
@@ -60,7 +61,7 @@ public:
void noHover(bool nohover = false);
void click(s16 id = -1);
bool selected(s16 button = -1);
- void setRumble(int, bool wii = false, bool gc = false);
+ void setRumble(int, bool wii = false, bool gc = false, bool wupc = false);
void deselect(void){ for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) m_selected[chan] = -1; }
void stopSounds(void);
void setSoundVolume(int vol);
@@ -144,6 +145,7 @@ private:
u8 m_rumble[WPAD_MAX_WIIMOTES];
bool wii_rumble[WPAD_MAX_WIIMOTES];
bool gc_rumble[WPAD_MAX_WIIMOTES];
+ bool wupc_rumble[WPAD_MAX_WIIMOTES];
GuiSound *m_sndHover;
GuiSound *m_sndClick;
u8 m_soundVolume;
diff --git a/source/loader/sys.c b/source/loader/sys.c
index 99dcd026..82fcf2bc 100644
--- a/source/loader/sys.c
+++ b/source/loader/sys.c
@@ -16,6 +16,7 @@
#include "memory/mem2.hpp"
#include "memory/memory.h"
#include "wiiuse/wpad.h"
+#include "wupc/wupc.h"
/* Variables */
bool reset = false;
@@ -33,6 +34,7 @@ void Open_Inputs(void)
{
/* Initialize Wiimote subsystem */
PAD_Init();
+ WUPC_Init();
WPAD_Init();
/* Set POWER button callback */
@@ -43,6 +45,8 @@ void Open_Inputs(void)
void Close_Inputs(void)
{
+ WUPC_Shutdown();
+
u32 cnt;
/* Disconnect Wiimotes */
diff --git a/source/menu/menu.hpp b/source/menu/menu.hpp
index 7f977ad1..d87b9aff 100644
--- a/source/menu/menu.hpp
+++ b/source/menu/menu.hpp
@@ -28,6 +28,7 @@
#include "music/MusicPlayer.hpp"
#include "plugin/plugin.hpp"
#include "wiiuse/wpad.h"
+#include "wupc/wupc.h"
using namespace std;
@@ -624,6 +625,8 @@ private:
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 m_show_pointer[WPAD_MAX_WIIMOTES];
float left_stick_angle[WPAD_MAX_WIIMOTES];
diff --git a/source/menu/menu_input.cpp b/source/menu/menu_input.cpp
index 6621ec71..c1424045 100644
--- a/source/menu/menu_input.cpp
+++ b/source/menu/menu_input.cpp
@@ -60,6 +60,7 @@ void CMenu::ScanInput()
m_show_zone_prev = false;
m_show_zone_next = false;
+ WUPC_UpdateButtonStats();
WPAD_ScanPads();
PAD_ScanPads();
@@ -102,7 +103,8 @@ void CMenu::ScanInput()
}
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);
m_btnMgr.setMouse(WPadIR_Valid(chan) || m_show_pointer[chan]);
if(WPadIR_Valid(chan))
{
@@ -130,6 +132,7 @@ void CMenu::ButtonsPressed()
{
wii_btnsPressed[chan] = WPAD_ButtonsDown(chan);
gc_btnsPressed |= PAD_ButtonsDown(chan);
+ wupc_btnsPressed[chan] = WUPC_ButtonsDown(chan);
}
}
@@ -140,12 +143,14 @@ void CMenu::ButtonsHeld()
{
wii_btnsHeld[chan] = WPAD_ButtonsHeld(chan);
gc_btnsHeld |= PAD_ButtonsHeld(chan);
+ wupc_btnsHeld[chan] = WUPC_ButtonsHeld(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));
+ return ((wii_btnsPressed[chan] & btn) && (ext == WPAD_EXP_NONE || ext == wd[chan]->exp.type))
+ || ((wupc_btnsPressed[chan] & btn) && (ext == WPAD_EXP_CLASSIC));
}
bool CMenu::wBtn_Pressed(int btn, u8 ext)
@@ -160,7 +165,8 @@ bool CMenu::wBtn_Pressed(int btn, u8 ext)
bool CMenu::wBtn_HeldChan(int btn, u8 ext, int &chan)
{
- return ((wii_btnsHeld[chan] & btn) && (ext == WPAD_EXP_NONE || ext == wd[chan]->exp.type));
+ return ((wii_btnsHeld[chan] & btn) && (ext == WPAD_EXP_NONE || ext == wd[chan]->exp.type))
+ || ((wupc_btnsHeld[chan] & btn) && (ext == WPAD_EXP_CLASSIC));
}
bool CMenu::wBtn_Held(int btn, u8 ext)
@@ -178,13 +184,14 @@ 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)
+ 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)
{
m_show_pointer[chan] = true;
if(LEFT_STICK_LEFT)
{
speed = (u8)(left_stick_mag[chan] * 10.00);
- pSpeed = (u8)abs(PAD_StickX(chan))/10;
+ pSpeed = (u8)(abs(PAD_StickX(chan))/10 | abs(WUPC_lStickX(chan))/80);
if(stickPointer_x[chan] > m_cursor[chan].width()/2)
stickPointer_x[chan] = stickPointer_x[chan]-speed-pSpeed;
pointerhidedelay[chan] = 150;
@@ -192,7 +199,7 @@ void CMenu::LeftStick()
if(LEFT_STICK_DOWN)
{
speed = (u8)(left_stick_mag[chan] * 10.00);
- pSpeed = (u8)abs(PAD_StickY(chan))/10;
+ pSpeed = (u8)(abs(PAD_StickY(chan))/10 | abs(WUPC_lStickY(chan))/80);
if(stickPointer_y[chan] < (m_vid.height() + (m_cursor[chan].height()/2)))
stickPointer_y[chan] = stickPointer_y[chan]+speed+pSpeed;
pointerhidedelay[chan] = 150;
@@ -200,7 +207,7 @@ void CMenu::LeftStick()
if(LEFT_STICK_RIGHT)
{
speed = (u8)(left_stick_mag[chan] * 10.00);
- pSpeed = (u8)abs(PAD_StickX(chan))/10;
+ pSpeed = (u8)(abs(PAD_StickX(chan))/10 | abs(WUPC_lStickX(chan))/80);
if(stickPointer_x[chan] < (m_vid.width() + (m_cursor[chan].width()/2)))
stickPointer_x[chan] = stickPointer_x[chan]+speed+pSpeed;
pointerhidedelay[chan] = 150;
@@ -208,7 +215,7 @@ void CMenu::LeftStick()
if(LEFT_STICK_UP)
{
speed = (u8)(left_stick_mag[chan] * 10.00);
- pSpeed = (u8)abs(PAD_StickY(chan))/10;
+ pSpeed = (u8)(abs(PAD_StickY(chan))/10 | abs(WUPC_lStickY(chan))/80);
if(stickPointer_y[chan] > m_cursor[chan].height()/2)
stickPointer_y[chan] = stickPointer_y[chan]-speed-pSpeed;
pointerhidedelay[chan] = 150;
@@ -393,7 +400,7 @@ bool CMenu::lStick_Up(void)
{
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)
+ if((LEFT_STICK_ANG_UP && left_stick_mag[chan] > 0.15) || PAD_StickY(chan) > 20 || WUPC_lStickY(chan) > 160)
return true;
}
return false;
@@ -403,7 +410,7 @@ bool CMenu::lStick_Right(void)
{
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)
+ if((LEFT_STICK_ANG_RIGHT && left_stick_mag[chan] > 0.15) || PAD_StickX(chan) > 20 || WUPC_lStickX(chan) > 160)
return true;
}
return false;
@@ -413,7 +420,7 @@ bool CMenu::lStick_Down(void)
{
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)
+ if((LEFT_STICK_ANG_DOWN && left_stick_mag[chan] > 0.15) || PAD_StickY(chan) < -20 || WUPC_lStickY(chan) < -160)
return true;
}
return false;
@@ -423,7 +430,7 @@ bool CMenu::lStick_Left(void)
{
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)
+ if((LEFT_STICK_ANG_LEFT && left_stick_mag[chan] > 0.15) || PAD_StickX(chan) < -20 || WUPC_lStickX(chan) < -160)
return true;
}
return false;
@@ -433,7 +440,8 @@ bool CMenu::rStick_Up(void)
{
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)
+ if((RIGHT_STICK_ANG_UP && right_stick_mag[chan] > 0.15 && right_stick_skip[chan] == 0)
+ || PAD_SubStickY(chan) > 20 || WUPC_rStickY(chan) > 160)
return true;
}
return false;
@@ -443,7 +451,8 @@ bool CMenu::rStick_Right(void)
{
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)
+ if((RIGHT_STICK_ANG_RIGHT && right_stick_mag[chan] > 0.15 && right_stick_skip[chan] == 0)
+ || PAD_SubStickX(chan) > 20 || WUPC_rStickX(chan) > 160)
return true;
}
return false;
@@ -453,7 +462,8 @@ bool CMenu::rStick_Down(void)
{
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)
+ if((RIGHT_STICK_ANG_DOWN && right_stick_mag[chan] > 0.15 && right_stick_skip[chan] == 0)
+ || PAD_SubStickY(chan) < -20 || WUPC_rStickY(chan) < -160)
return true;
}
return false;
@@ -463,7 +473,8 @@ bool CMenu::rStick_Left(void)
{
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)
+ if((RIGHT_STICK_ANG_LEFT && right_stick_mag[chan] > 0.15 && right_stick_skip[chan] == 0)
+ || PAD_SubStickX(chan) < -20 || WUPC_rStickX(chan) < -160)
return true;
}
return false;
@@ -483,7 +494,7 @@ bool CMenu::wRoll_Right(void)
{
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--)
{
- if(WBTN_B_HELD && (wmote_roll[chan] > 5) && wmote_roll_skip[chan] == 0)
+ if(WBTN_B_HELD && (wmote_roll[chan] > 5) && wmote_roll_skip[chan] == 0)
return true;
}
return false;