mirror of
https://github.com/Maschell/controller_patcher.git
synced 2024-11-27 22:24:16 +01:00
Transforming it into a static lib
This commit is contained in:
parent
409871f29d
commit
765b9dcb1c
50
.gitignore
vendored
50
.gitignore
vendored
@ -1,47 +1,3 @@
|
|||||||
# Windows image file caches
|
release/*
|
||||||
Thumbs.db
|
libcontrollerpatcher.cbp
|
||||||
ehthumbs.db
|
libcontrollerpatcher.depend
|
||||||
|
|
||||||
# Folder config file
|
|
||||||
Desktop.ini
|
|
||||||
|
|
||||||
# Recycle Bin used on file shares
|
|
||||||
$RECYCLE.BIN/
|
|
||||||
|
|
||||||
# Windows Installer files
|
|
||||||
*.cab
|
|
||||||
*.msi
|
|
||||||
*.msm
|
|
||||||
*.msp
|
|
||||||
|
|
||||||
# Windows shortcuts
|
|
||||||
*.lnk
|
|
||||||
|
|
||||||
# =========================
|
|
||||||
# Operating System Files
|
|
||||||
# =========================
|
|
||||||
|
|
||||||
# OSX
|
|
||||||
# =========================
|
|
||||||
|
|
||||||
.DS_Store
|
|
||||||
.AppleDouble
|
|
||||||
.LSOverride
|
|
||||||
|
|
||||||
# Thumbnails
|
|
||||||
._*
|
|
||||||
|
|
||||||
# Files that might appear in the root of a volume
|
|
||||||
.DocumentRevisions-V100
|
|
||||||
.fseventsd
|
|
||||||
.Spotlight-V100
|
|
||||||
.TemporaryItems
|
|
||||||
.Trashes
|
|
||||||
.VolumeIcon.icns
|
|
||||||
|
|
||||||
# Directories potentially created on remote AFP share
|
|
||||||
.AppleDB
|
|
||||||
.AppleDesktop
|
|
||||||
Network Trash Folder
|
|
||||||
Temporary Items
|
|
||||||
.apdisk
|
|
134
Makefile
Normal file
134
Makefile
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
DO_LOGGING := 0
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
.SUFFIXES:
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
ifeq ($(strip $(DEVKITPPC)),)
|
||||||
|
$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC)
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(DEVKITPRO)),)
|
||||||
|
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPRO")
|
||||||
|
endif
|
||||||
|
|
||||||
|
include $(DEVKITPPC)/wii_rules
|
||||||
|
|
||||||
|
export PORTLIBS := $(DEVKITPRO)/portlibs/ppc
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# BUILD is the directory where object files & intermediate files will be placed
|
||||||
|
# SOURCES is a list of directories containing source code
|
||||||
|
# INCLUDES is a list of directories containing extra header files
|
||||||
|
# DATA is a list of directories containing binary files
|
||||||
|
# LIBDIR is where the built library will be placed
|
||||||
|
# all directories are relative to this makefile
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
BUILD ?= release
|
||||||
|
SOURCES := source \
|
||||||
|
source/utils \
|
||||||
|
source/network \
|
||||||
|
source/patcher \
|
||||||
|
source/config \
|
||||||
|
INCLUDES := include
|
||||||
|
DATA :=
|
||||||
|
LIB := lib
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# options for code generation
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
CFLAGS = -g -Os -Wall -D__wiiu__ $(MACHDEP) $(INCLUDE)
|
||||||
|
CXXFLAGS = $(CFLAGS) -D_GNU_SOURCE
|
||||||
|
|
||||||
|
ifeq ($(DO_LOGGING), 1)
|
||||||
|
CFLAGS += -D__LOGGING__
|
||||||
|
CXXFLAGS += -D__LOGGING__
|
||||||
|
endif
|
||||||
|
|
||||||
|
ASFLAGS := -g
|
||||||
|
|
||||||
|
export WIIUBIN := $(LIB)/libcontrollerpatcher.a
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# any extra libraries we wish to link with the project
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
LIBS := -ldynamiclibs -lutils
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# list of directories containing libraries, this must be the top level containing
|
||||||
|
# include and lib
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
LIBDIRS :=
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# no real need to edit anything past this point unless you need to add additional
|
||||||
|
# rules for different file extensions
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export TOPDIR ?= $(CURDIR)/..
|
||||||
|
|
||||||
|
export DEPSDIR := $(CURDIR)/$(BUILD)
|
||||||
|
|
||||||
|
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
|
||||||
|
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
|
||||||
|
|
||||||
|
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
|
||||||
|
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
|
||||||
|
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
|
||||||
|
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
|
||||||
|
|
||||||
|
|
||||||
|
export OFILES := $(addsuffix .o,$(BINFILES)) \
|
||||||
|
$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
|
||||||
|
|
||||||
|
export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
|
||||||
|
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
|
||||||
|
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
|
||||||
|
-I$(CURDIR)/$(BUILD) -I$(PORTLIBS)/include -I$(PORTLIBS)/include/libutils
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) $(PORTLIBS)/lib
|
||||||
|
|
||||||
|
.PHONY: $(BUILD) clean
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
$(BUILD):
|
||||||
|
@[ -d $@ ] || mkdir -p $@
|
||||||
|
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
clean:
|
||||||
|
@echo clean ...
|
||||||
|
@rm -fr debug release bin obj $(LIB) include
|
||||||
|
|
||||||
|
all: $(WIIUBIN)
|
||||||
|
|
||||||
|
install:
|
||||||
|
@cp $(BUILD)/lib/libcontrollerpatcher.a $(PORTLIBS)/lib
|
||||||
|
@mkdir -p $(PORTLIBS)/include/controller_patcher
|
||||||
|
@cp source/ControllerPatcher.hpp $(PORTLIBS)/include/controller_patcher
|
||||||
|
@cp source/ControllerPatcherDefs.h $(PORTLIBS)/include/controller_patcher
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
else
|
||||||
|
|
||||||
|
DEPENDS := $(OFILES:.o=.d)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# main targets
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
$(WIIUBIN) : $(OFILES) $(LIB)
|
||||||
|
@rm -f "$(WIIUBIN)"
|
||||||
|
@$(AR) rcs "$(WIIUBIN)" $(OFILES)
|
||||||
|
@echo built ... $(notdir $@)
|
||||||
|
|
||||||
|
$(LIB):
|
||||||
|
mkdir $(LIB)
|
||||||
|
|
||||||
|
-include $(DEPENDS)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
endif
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
|
33
README.md
33
README.md
@ -7,16 +7,39 @@ Detailed information about creating config files and adding support for more con
|
|||||||
# Where can I find config files
|
# Where can I find config files
|
||||||
Configfiles for all controllers are collection in [this repository](https://github.com/Maschell/controller_patch_configs)
|
Configfiles for all controllers are collection in [this repository](https://github.com/Maschell/controller_patch_configs)
|
||||||
|
|
||||||
# Dependencies for including it in other applications
|
## Logging usage
|
||||||
This controller_patcher is build to be used in serveral projects. It don't uses some ultra fancy external libraries. </br>
|
To able to use the logging change the "DO_LOGGING" parameter in the Makefile.
|
||||||
To be able to use in other projects, you will need some external data though.</br>
|
|
||||||
- At first, you need a copy of the [dynamic_libs](https://github.com/Maschell/dynamic_libs) in your src/dynamic_libs folder.
|
# Compiling
|
||||||
- To able to log something, you need the right [logger functions](https://github.com/Maschell/hid_to_vpad/tree/master/src/utils).
|
You need to install all dependencies first!
|
||||||
|
|
||||||
|
Install this static library into your portlibs folder via:
|
||||||
|
|
||||||
|
```
|
||||||
|
make && make install
|
||||||
|
```
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
- Application needs to be loaded from the [homebrew_launcher](https://github.com/dimok789/homebrew_launcher)
|
||||||
|
- [libutils](https://github.com/Maschell/libutils) for common function.
|
||||||
|
- [dynamic_libs](https://github.com/Maschell/dynamic_libs/tree/lib) for access to the functions.
|
||||||
|
|
||||||
# Example implementation
|
# Example implementation
|
||||||
|
|
||||||
### How to "install" it
|
### How to "install" it
|
||||||
TODO!
|
TODO!
|
||||||
|
|
||||||
|
```
|
||||||
|
ControllerPatcher::Init(NULL); //No custom configuration
|
||||||
|
ControllerPatcher::disableControllerMapping();
|
||||||
|
ControllerPatcher::startNetworkServer();
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
ControllerPatcher::DeInit();
|
||||||
|
ControllerPatcher::stopNetworkServer();
|
||||||
|
```
|
||||||
|
|
||||||
# Credits:
|
# Credits:
|
||||||
- Maschell
|
- Maschell
|
||||||
- FIX94 - huge thanks to him and his initally created gc-to-vpad. Was a motivation and base to start all this
|
- FIX94 - huge thanks to him and his initally created gc-to-vpad. Was a motivation and base to start all this
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "./ConfigReader.hpp"
|
#include "./ConfigReader.hpp"
|
||||||
#include "./utils/CPFSUtils.hpp"
|
#include <fs/FSUtils.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -29,8 +29,8 @@
|
|||||||
|
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|
||||||
#include "dynamic_libs/fs_functions.h"
|
#include <dynamic_libs/fs_functions.h>
|
||||||
#include "utils/logger.h"
|
#include <utils/logger.h>
|
||||||
|
|
||||||
s32 ConfigReader::numberValidFiles = 0;
|
s32 ConfigReader::numberValidFiles = 0;
|
||||||
ConfigReader *ConfigReader::instance = NULL;
|
ConfigReader *ConfigReader::instance = NULL;
|
||||||
@ -74,7 +74,7 @@ std::vector<std::string> ConfigReader::ScanFolder(std::string path){
|
|||||||
|
|
||||||
std::string newPath = path + "/" + std::string(filename);
|
std::string newPath = path + "/" + std::string(filename);
|
||||||
|
|
||||||
if(!isDir && CPStringTools::EndsWith(std::string(filename),".ini")){
|
if(!isDir && StringTools::EndsWith(std::string(filename),".ini")){
|
||||||
config_files.push_back(newPath);
|
config_files.push_back(newPath);
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Found ini: %s \n",newPath.c_str()); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Found ini: %s \n",newPath.c_str()); }
|
||||||
}
|
}
|
||||||
@ -96,11 +96,11 @@ void ConfigReader::processFileList(std::vector<std::string> path){
|
|||||||
std::string ConfigReader::loadFileToString(std::string path){
|
std::string ConfigReader::loadFileToString(std::string path){
|
||||||
std::string strBuffer = "";
|
std::string strBuffer = "";
|
||||||
u8 * buffer = NULL;
|
u8 * buffer = NULL;
|
||||||
if(CPFSUtils::LoadFileToMem(path.c_str(),&buffer,NULL) > 0){
|
if(FSUtils::LoadFileToMem(path.c_str(),&buffer,NULL) > 0){
|
||||||
strBuffer = std::string((char *)buffer);
|
strBuffer = std::string((char *)buffer);
|
||||||
strBuffer = CPStringTools::removeCharFromString(strBuffer,'\r');
|
strBuffer = StringTools::removeCharFromString(strBuffer,'\r');
|
||||||
strBuffer = CPStringTools::removeCharFromString(strBuffer,' ');
|
strBuffer = StringTools::removeCharFromString(strBuffer,' ');
|
||||||
strBuffer = CPStringTools::removeCharFromString(strBuffer,'\t');
|
strBuffer = StringTools::removeCharFromString(strBuffer,'\t');
|
||||||
}
|
}
|
||||||
return strBuffer;
|
return strBuffer;
|
||||||
}
|
}
|
@ -17,11 +17,10 @@
|
|||||||
#ifndef _ConfigReader_H_
|
#ifndef _ConfigReader_H_
|
||||||
#define _ConfigReader_H_
|
#define _ConfigReader_H_
|
||||||
|
|
||||||
#include <gctypes.h>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "./ControllerPatcher.hpp"
|
#include "ControllerPatcherIncludes.hpp"
|
||||||
|
|
||||||
class ConfigReader{
|
class ConfigReader{
|
||||||
friend class ControllerPatcher;
|
friend class ControllerPatcher;
|
@ -14,7 +14,7 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "ControllerPatcher.hpp"
|
#include "ControllerPatcherIncludes.hpp"
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
@ -22,12 +22,12 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "utils/logger.h"
|
#include <utils/logger.h>
|
||||||
|
|
||||||
#include "dynamic_libs/sys_functions.h"
|
#include <dynamic_libs/sys_functions.h>
|
||||||
#include "dynamic_libs/syshid_functions.h"
|
#include <dynamic_libs/syshid_functions.h>
|
||||||
#include "dynamic_libs/socket_functions.h"
|
#include <dynamic_libs/socket_functions.h>
|
||||||
#include "dynamic_libs/padscore_functions.h"
|
#include <dynamic_libs/padscore_functions.h>
|
||||||
|
|
||||||
// This stores the holded buttons for the gamepad after the button remapping.
|
// This stores the holded buttons for the gamepad after the button remapping.
|
||||||
static u32 buttonRemapping_lastButtonsHold = 0;
|
static u32 buttonRemapping_lastButtonsHold = 0;
|
||||||
@ -105,12 +105,12 @@ void ControllerPatcher::ResetConfig(){
|
|||||||
gHIDRegisteredDevices = 0;
|
gHIDRegisteredDevices = 0;
|
||||||
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
||||||
gGamePadSlot = slotdata.deviceslot;
|
gGamePadSlot = slotdata.deviceslot;
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register Gamepad-Config. HID-Mask %s Device-Slot: %d\n",CPStringTools::byte_to_binary(slotdata.hidmask),gGamePadSlot); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register Gamepad-Config. HID-Mask %s Device-Slot: %d\n",StringTools::byte_to_binary(slotdata.hidmask),gGamePadSlot); }
|
||||||
|
|
||||||
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
||||||
gMouseSlot = slotdata.deviceslot;
|
gMouseSlot = slotdata.deviceslot;
|
||||||
gHID_LIST_MOUSE = slotdata.hidmask;
|
gHID_LIST_MOUSE = slotdata.hidmask;
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register Mouse-Config. HID-Mask %s Device-Slot: %d\n",CPStringTools::byte_to_binary(gHID_LIST_MOUSE),gMouseSlot); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register Mouse-Config. HID-Mask %s Device-Slot: %d\n",StringTools::byte_to_binary(gHID_LIST_MOUSE),gMouseSlot); }
|
||||||
|
|
||||||
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
||||||
u32 keyboard_slot = slotdata.deviceslot;
|
u32 keyboard_slot = slotdata.deviceslot;
|
||||||
@ -118,36 +118,36 @@ void ControllerPatcher::ResetConfig(){
|
|||||||
gHID_LIST_KEYBOARD = keyboard_hid;
|
gHID_LIST_KEYBOARD = keyboard_hid;
|
||||||
gHID_SLOT_KEYBOARD = keyboard_slot;
|
gHID_SLOT_KEYBOARD = keyboard_slot;
|
||||||
|
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register Keyboard-Config. HID-Mask %s Device-Slot: %d\n",CPStringTools::byte_to_binary(gHID_LIST_KEYBOARD),gHID_SLOT_KEYBOARD); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register Keyboard-Config. HID-Mask %s Device-Slot: %d\n",StringTools::byte_to_binary(gHID_LIST_KEYBOARD),gHID_SLOT_KEYBOARD); }
|
||||||
|
|
||||||
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
||||||
u32 gc_slot = slotdata.deviceslot;
|
u32 gc_slot = slotdata.deviceslot;
|
||||||
u32 gc_hid = slotdata.hidmask;
|
u32 gc_hid = slotdata.hidmask;
|
||||||
gHID_LIST_GC = gc_hid;
|
gHID_LIST_GC = gc_hid;
|
||||||
gHID_SLOT_GC = gc_slot;
|
gHID_SLOT_GC = gc_slot;
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register GC-Adapter-Config. HID-Mask %s Device-Slot: %d\n",CPStringTools::byte_to_binary(gHID_LIST_GC),gHID_SLOT_GC); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register GC-Adapter-Config. HID-Mask %s Device-Slot: %d\n",StringTools::byte_to_binary(gHID_LIST_GC),gHID_SLOT_GC); }
|
||||||
|
|
||||||
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
||||||
u32 ds3_slot = slotdata.deviceslot;
|
u32 ds3_slot = slotdata.deviceslot;
|
||||||
u32 ds3_hid = slotdata.hidmask;
|
u32 ds3_hid = slotdata.hidmask;
|
||||||
gHID_LIST_DS3 = ds3_hid;
|
gHID_LIST_DS3 = ds3_hid;
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register DS3-Config. HID-Mask %s Device-Slot: %d\n",CPStringTools::byte_to_binary(gHID_LIST_DS3),ds3_slot); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register DS3-Config. HID-Mask %s Device-Slot: %d\n",StringTools::byte_to_binary(gHID_LIST_DS3),ds3_slot); }
|
||||||
|
|
||||||
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
||||||
u32 ds4_slot = slotdata.deviceslot;
|
u32 ds4_slot = slotdata.deviceslot;
|
||||||
u32 ds4_hid = slotdata.hidmask;
|
u32 ds4_hid = slotdata.hidmask;
|
||||||
gHID_LIST_DS4 = ds4_hid;
|
gHID_LIST_DS4 = ds4_hid;
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register DS4-Config. HID-Mask %s Device-Slot: %d\n",CPStringTools::byte_to_binary(ds4_hid),ds4_slot); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register DS4-Config. HID-Mask %s Device-Slot: %d\n",StringTools::byte_to_binary(ds4_hid),ds4_slot); }
|
||||||
|
|
||||||
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
||||||
u32 xinput_slot = slotdata.deviceslot;
|
u32 xinput_slot = slotdata.deviceslot;
|
||||||
u32 xinput_hid = slotdata.hidmask;
|
u32 xinput_hid = slotdata.hidmask;
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register XInput-Config. HID-Mask %s Device-Slot: %d\n",CPStringTools::byte_to_binary(xinput_hid),xinput_slot); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Register XInput-Config. HID-Mask %s Device-Slot: %d\n",StringTools::byte_to_binary(xinput_hid),xinput_slot); }
|
||||||
|
|
||||||
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
ControllerPatcherUtils::getNextSlotData(&slotdata);
|
||||||
u32 switch_pro_slot = slotdata.deviceslot;
|
u32 switch_pro_slot = slotdata.deviceslot;
|
||||||
gHID_LIST_SWITCH_PRO = slotdata.hidmask;
|
gHID_LIST_SWITCH_PRO = slotdata.hidmask;
|
||||||
DEBUG_FUNCTION_LINE("Register Switch-Pro-Config. HID-Mask %s Device-Slot: %d\n",CPStringTools::byte_to_binary(gHID_LIST_SWITCH_PRO),switch_pro_slot);
|
DEBUG_FUNCTION_LINE("Register Switch-Pro-Config. HID-Mask %s Device-Slot: %d\n",StringTools::byte_to_binary(gHID_LIST_SWITCH_PRO),switch_pro_slot);
|
||||||
|
|
||||||
|
|
||||||
config_controller_hidmask[gc_slot] = gHID_LIST_GC;
|
config_controller_hidmask[gc_slot] = gHID_LIST_GC;
|
||||||
@ -725,6 +725,7 @@ ControllerMappingPADInfo * ControllerPatcher::getControllerMappingInfo(UControll
|
|||||||
}
|
}
|
||||||
|
|
||||||
HID_Mouse_Data * ControllerPatcher::getMouseData(){
|
HID_Mouse_Data * ControllerPatcher::getMouseData(){
|
||||||
|
if(gHID_Mouse_Mode != HID_MOUSE_MODE_TOUCH) return NULL;
|
||||||
ControllerMappingPAD * CMPAD = ControllerPatcherUtils::getControllerMappingByType(UController_Type_Gamepad);
|
ControllerMappingPAD * CMPAD = ControllerPatcherUtils::getControllerMappingByType(UController_Type_Gamepad);
|
||||||
|
|
||||||
if(CMPAD == NULL){
|
if(CMPAD == NULL){
|
||||||
@ -1070,3 +1071,89 @@ bool ControllerPatcher::isRumbleActivated(){
|
|||||||
return gGlobalRumbleActivated;
|
return gGlobalRumbleActivated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ControllerPatcher::isButtonRemappingDone(){
|
||||||
|
return gButtonRemappingConfigDone;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ControllerPatcher::isKeyboardConnected(){
|
||||||
|
return (gHIDCurrentDevice & gHID_LIST_KEYBOARD) == gHID_LIST_KEYBOARD;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ControllerPatcher::areControllersConnected(){
|
||||||
|
return gHIDAttached > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONTROLLER_PATCHER_RESULT_OR_ERROR ControllerPatcher::sampleKeyboardData(){
|
||||||
|
if(ControllerPatcher::isKeyboardConnected()){
|
||||||
|
ControllerPatcher::doSamplingForDeviceSlot(gHID_SLOT_KEYBOARD);
|
||||||
|
}
|
||||||
|
return CONTROLLER_PATCHER_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONTROLLER_PATCHER_RESULT_OR_ERROR ControllerPatcher::resetCallbackData(){
|
||||||
|
memset(gWPADConnectCallback,0,sizeof(gWPADConnectCallback));
|
||||||
|
memset(gKPADConnectCallback,0,sizeof(gKPADConnectCallback));
|
||||||
|
memset(gExtensionCallback,0,sizeof(gExtensionCallback));
|
||||||
|
gSamplingCallback = 0;
|
||||||
|
gCallbackCooldown = 0;
|
||||||
|
return CONTROLLER_PATCHER_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CONTROLLER_PATCHER_RESULT_OR_ERROR ControllerPatcher::setKPADConnectedCallback(s32 chan, wpad_connect_callback_t callback){
|
||||||
|
if(chan >= 4){ return CONTROLLER_PATCHER_ERROR_INVALID_CHAN; }
|
||||||
|
gKPADConnectCallback[chan] = callback;
|
||||||
|
return CONTROLLER_PATCHER_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONTROLLER_PATCHER_RESULT_OR_ERROR ControllerPatcher::setKPADExtensionCallback(s32 chan, wpad_connect_callback_t callback){
|
||||||
|
if(chan >= 4){ return CONTROLLER_PATCHER_ERROR_INVALID_CHAN; }
|
||||||
|
gExtensionCallback[chan] = callback;
|
||||||
|
return CONTROLLER_PATCHER_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONTROLLER_PATCHER_RESULT_OR_ERROR ControllerPatcher::setWPADConnectCallback(s32 chan, wpad_connect_callback_t callback){
|
||||||
|
if(chan >= 4){ return CONTROLLER_PATCHER_ERROR_INVALID_CHAN; }
|
||||||
|
gWPADConnectCallback[chan] = callback;
|
||||||
|
return CONTROLLER_PATCHER_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONTROLLER_PATCHER_RESULT_OR_ERROR ControllerPatcher::handleCallbackData(bool button_pressed){
|
||||||
|
if(button_pressed && gCallbackCooldown == 0){
|
||||||
|
gCallbackCooldown = 0xFF;
|
||||||
|
|
||||||
|
/*if(HID_DEBUG){ log_printf("my_VPADRead(line %d): Pressed the TV button. Maybe we can call the callbacks.!\n",__LINE__); }
|
||||||
|
if(HID_DEBUG){ log_printf("my_VPADRead(line %d): gExtensionCallback = %08X %08X %08X %08X\n",__LINE__,gExtensionCallback[0],gExtensionCallback[1],gExtensionCallback[2],gExtensionCallback[3]); }
|
||||||
|
if(HID_DEBUG){ log_printf("my_VPADRead(line %d): gWPADConnectCallback = %08X %08X %08X %08X\n",__LINE__,gWPADConnectCallback[0],gWPADConnectCallback[1],gWPADConnectCallback[2],gWPADConnectCallback[3]); }
|
||||||
|
if(HID_DEBUG){ log_printf("my_VPADRead(line %d): gKPADConnectCallback = %08X %08X %08X %08X\n",__LINE__,gKPADConnectCallback[0],gKPADConnectCallback[1],gKPADConnectCallback[2],gKPADConnectCallback[3]); }*/
|
||||||
|
|
||||||
|
for(s32 i = 0;i<4;i++){
|
||||||
|
bool doCall = false;
|
||||||
|
if(i == 0){ doCall = ControllerPatcher::isControllerConnectedAndActive(UController_Type_Pro1); }
|
||||||
|
if(i == 1){ doCall = ControllerPatcher::isControllerConnectedAndActive(UController_Type_Pro2); }
|
||||||
|
if(i == 2){ doCall = ControllerPatcher::isControllerConnectedAndActive(UController_Type_Pro3); }
|
||||||
|
if(i == 3){ doCall = ControllerPatcher::isControllerConnectedAndActive(UController_Type_Pro4); }
|
||||||
|
if(doCall){
|
||||||
|
if(gWPADConnectCallback[i] != NULL){
|
||||||
|
log_printf("my_VPADRead(line %d): Called WPAD connect callback for pro controller in slot %d!\n",__LINE__,(i+1));
|
||||||
|
gWPADConnectCallback[i](i,0);
|
||||||
|
}
|
||||||
|
if(gKPADConnectCallback[i] != NULL){
|
||||||
|
log_printf("my_VPADRead(line %d): Called KPAD connect callback for pro controller in slot %d!\n",__LINE__,(i+1));
|
||||||
|
gKPADConnectCallback[i](i,0);
|
||||||
|
}
|
||||||
|
if(gExtensionCallback[i] != NULL){
|
||||||
|
log_printf("my_VPADRead(line %d): Called extension callback for pro controller in slot %d!\n",__LINE__,(i+1));
|
||||||
|
gExtensionCallback[i](i,WPAD_EXT_PRO_CONTROLLER);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(gCallbackCooldown > 0){
|
||||||
|
gCallbackCooldown--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CONTROLLER_PATCHER_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
@ -27,32 +27,11 @@
|
|||||||
#ifndef _CONTROLLER_PATCHER_H_
|
#ifndef _CONTROLLER_PATCHER_H_
|
||||||
#define _CONTROLLER_PATCHER_H_
|
#define _CONTROLLER_PATCHER_H_
|
||||||
|
|
||||||
#include <gctypes.h>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include <dynamic_libs/vpad_functions.h>
|
||||||
#include "./patcher/ControllerPatcherDefs.h"
|
#include <dynamic_libs/padscore_functions.h>
|
||||||
#include "./utils/ControllerPatcherThread.hpp"
|
#include "ControllerPatcherDefs.h"
|
||||||
#include "./utils/CPRetainVars.hpp"
|
|
||||||
#include "./utils/PadConst.hpp"
|
|
||||||
#include "./utils/CPStringTools.hpp"
|
|
||||||
|
|
||||||
#include "./patcher/ControllerPatcherHID.hpp"
|
|
||||||
#include "./patcher/ControllerPatcherUtils.hpp"
|
|
||||||
|
|
||||||
#include "./config/ConfigValues.hpp"
|
|
||||||
#include "./config/ConfigParser.hpp"
|
|
||||||
|
|
||||||
#include "./network/ControllerPatcherNet.hpp"
|
|
||||||
#include "./network/TCPServer.hpp"
|
|
||||||
#include "./network/UDPServer.hpp"
|
|
||||||
#include "./network/UDPClient.hpp"
|
|
||||||
#include "./ConfigReader.hpp"
|
|
||||||
|
|
||||||
#include "dynamic_libs/vpad_functions.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define HID_DEBUG 0
|
|
||||||
|
|
||||||
class ControllerPatcher{
|
class ControllerPatcher{
|
||||||
public:
|
public:
|
||||||
@ -247,6 +226,24 @@ class ControllerPatcher{
|
|||||||
static CONTROLLER_PATCHER_RESULT_OR_ERROR setNetworkControllerActivated(bool value);
|
static CONTROLLER_PATCHER_RESULT_OR_ERROR setNetworkControllerActivated(bool value);
|
||||||
|
|
||||||
static bool isRumbleActivated();
|
static bool isRumbleActivated();
|
||||||
|
|
||||||
|
static bool isButtonRemappingDone();
|
||||||
|
|
||||||
|
static bool isKeyboardConnected();
|
||||||
|
|
||||||
|
static bool areControllersConnected();
|
||||||
|
|
||||||
|
static CONTROLLER_PATCHER_RESULT_OR_ERROR sampleKeyboardData();
|
||||||
|
|
||||||
|
static CONTROLLER_PATCHER_RESULT_OR_ERROR resetCallbackData();
|
||||||
|
|
||||||
|
static CONTROLLER_PATCHER_RESULT_OR_ERROR setKPADConnectedCallback(s32 chan, wpad_connect_callback_t callback);
|
||||||
|
|
||||||
|
static CONTROLLER_PATCHER_RESULT_OR_ERROR setKPADExtensionCallback(s32 chan, wpad_connect_callback_t callback);
|
||||||
|
|
||||||
|
static CONTROLLER_PATCHER_RESULT_OR_ERROR setWPADConnectCallback(s32 chan, wpad_connect_callback_t callback);
|
||||||
|
|
||||||
|
static CONTROLLER_PATCHER_RESULT_OR_ERROR handleCallbackData(bool button_pressed);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _CONTROLLER_PATCHER_H_ */
|
#endif /* _CONTROLLER_PATCHER_H_ */
|
@ -27,7 +27,8 @@
|
|||||||
#ifndef _CONTROLLER_PATCHER_DEFS_H_
|
#ifndef _CONTROLLER_PATCHER_DEFS_H_
|
||||||
#define _CONTROLLER_PATCHER_DEFS_H_
|
#define _CONTROLLER_PATCHER_DEFS_H_
|
||||||
|
|
||||||
#include <gctypes.h>
|
#include <dynamic_libs/os_types.h>
|
||||||
|
|
||||||
|
|
||||||
#define FIRST_INSTRUCTION_IN_SAMPLING_CALLBACK 0x9421FFB8
|
#define FIRST_INSTRUCTION_IN_SAMPLING_CALLBACK 0x9421FFB8
|
||||||
|
|
45
source/ControllerPatcherIncludes.hpp
Normal file
45
source/ControllerPatcherIncludes.hpp
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* Copyright (C) 2016,2017 Maschell
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _CONTROLLER_PATCHER_INCLUDES_H_
|
||||||
|
#define _CONTROLLER_PATCHER_INCLUDES_H_
|
||||||
|
|
||||||
|
#define HID_DEBUG 0
|
||||||
|
|
||||||
|
#include <dynamic_libs/os_types.h>
|
||||||
|
|
||||||
|
#include "./ConfigReader.hpp"
|
||||||
|
#include "./ControllerPatcher.hpp"
|
||||||
|
|
||||||
|
#include <system/CThread.h>
|
||||||
|
#include "./utils/CPRetainVars.hpp"
|
||||||
|
#include "./utils/PadConst.hpp"
|
||||||
|
#include <utils/StringTools.h>
|
||||||
|
|
||||||
|
#include "./patcher/ControllerPatcherHID.hpp"
|
||||||
|
#include "./patcher/ControllerPatcherUtils.hpp"
|
||||||
|
|
||||||
|
#include "./config/ConfigValues.hpp"
|
||||||
|
#include "./config/ConfigParser.hpp"
|
||||||
|
|
||||||
|
#include "./network/ControllerPatcherNet.hpp"
|
||||||
|
#include "./network/TCPServer.hpp"
|
||||||
|
#include "./network/UDPServer.hpp"
|
||||||
|
#include "./network/UDPClient.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _CONTROLLER_PATCHER_INCLUDES_H_ */
|
@ -15,6 +15,7 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "./ConfigParser.hpp"
|
#include "./ConfigParser.hpp"
|
||||||
|
#include <utils/StringTools.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -22,7 +23,7 @@
|
|||||||
|
|
||||||
ConfigParser::ConfigParser(std::string configData){
|
ConfigParser::ConfigParser(std::string configData){
|
||||||
this->content = configData;
|
this->content = configData;
|
||||||
this->contentLines = CPStringTools::StringSplit(content, "\n");
|
this->contentLines = StringTools::stringSplit(content, "\n");
|
||||||
|
|
||||||
if(contentLines.empty()){
|
if(contentLines.empty()){
|
||||||
return;
|
return;
|
||||||
@ -30,7 +31,7 @@ ConfigParser::ConfigParser(std::string configData){
|
|||||||
|
|
||||||
//remove the comments and make everything uppercase
|
//remove the comments and make everything uppercase
|
||||||
for(u32 i = 0; i < contentLines.size(); i++){
|
for(u32 i = 0; i < contentLines.size(); i++){
|
||||||
std::vector<std::string> comments = CPStringTools::StringSplit(contentLines[i], "//");
|
std::vector<std::string> comments = StringTools::stringSplit(contentLines[i], "//");
|
||||||
if(!comments.empty()){
|
if(!comments.empty()){
|
||||||
contentLines[i] = comments[0];
|
contentLines[i] = comments[0];
|
||||||
}
|
}
|
||||||
@ -122,7 +123,7 @@ bool ConfigParser::Init(){
|
|||||||
|
|
||||||
void ConfigParser::parseSingleLine(std::string line){
|
void ConfigParser::parseSingleLine(std::string line){
|
||||||
if(line.empty()){DEBUG_FUNCTION_LINE("Can't parse line. it's empty\n"); return;}
|
if(line.empty()){DEBUG_FUNCTION_LINE("Can't parse line. it's empty\n"); return;}
|
||||||
std::vector<std::string> cur_values = CPStringTools::StringSplit(line,"=");
|
std::vector<std::string> cur_values = StringTools::stringSplit(line,"=");
|
||||||
if(cur_values.size() != 2){
|
if(cur_values.size() != 2){
|
||||||
if(HID_DEBUG || cur_values.size() > 2){ DEBUG_FUNCTION_LINE("Not a valid key=pair line %s\n",line.c_str()); }
|
if(HID_DEBUG || cur_values.size() > 2){ DEBUG_FUNCTION_LINE("Not a valid key=pair line %s\n",line.c_str()); }
|
||||||
return;
|
return;
|
||||||
@ -198,7 +199,7 @@ void ConfigParser::parseSingleLine(std::string line){
|
|||||||
|
|
||||||
if(!ConfigValues::getInstance()->setIfValueIsAControllerPreset(cur_values[1],getSlot(),keyslot)){
|
if(!ConfigValues::getInstance()->setIfValueIsAControllerPreset(cur_values[1],getSlot(),keyslot)){
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("And its no preset\n"); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("And its no preset\n"); }
|
||||||
std::vector<std::string> rightvalues = CPStringTools::StringSplit(cur_values[1],",");
|
std::vector<std::string> rightvalues = StringTools::stringSplit(cur_values[1],",");
|
||||||
|
|
||||||
if(rightvalues.size() != 2){
|
if(rightvalues.size() != 2){
|
||||||
DEBUG_FUNCTION_LINE("%d instead of 2 key=values pairs in line\n",rightvalues.size());
|
DEBUG_FUNCTION_LINE("%d instead of 2 key=values pairs in line\n",rightvalues.size());
|
||||||
@ -235,7 +236,7 @@ bool ConfigParser::resetConfig(){
|
|||||||
s32 ConfigParser::getSlotController(std::string identify){
|
s32 ConfigParser::getSlotController(std::string identify){
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Getting Controller Slot\n"); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Getting Controller Slot\n"); }
|
||||||
|
|
||||||
std::vector<std::string> values = CPStringTools::StringSplit(identify,",");
|
std::vector<std::string> values = StringTools::stringSplit(identify,",");
|
||||||
|
|
||||||
if(values.size() != 2){
|
if(values.size() != 2){
|
||||||
DEBUG_FUNCTION_LINE("You need to provide a VID and PID. e.g. \"[vid=0x451,pid=0x152]\". (%s)\n",identify.c_str());
|
DEBUG_FUNCTION_LINE("You need to provide a VID and PID. e.g. \"[vid=0x451,pid=0x152]\". (%s)\n",identify.c_str());
|
||||||
@ -274,7 +275,7 @@ s32 ConfigParser::getSlotController(std::string identify){
|
|||||||
DEBUG_FUNCTION_LINE("We don't a space for a new controller, please delete .inis\n");
|
DEBUG_FUNCTION_LINE("We don't a space for a new controller, please delete .inis\n");
|
||||||
return HID_INVALID_SLOT;
|
return HID_INVALID_SLOT;
|
||||||
}
|
}
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Got new slot! slot: %d hid %s .. Lets registrate it!\n",slot,CPStringTools::byte_to_binary(hid)); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE("Got new slot! slot: %d hid %s .. Lets registrate it!\n",slot,StringTools::byte_to_binary(hid)); }
|
||||||
config_controller[slot][CONTRPS_VID][0] = (vid & 0xFF00) >> 8;
|
config_controller[slot][CONTRPS_VID][0] = (vid & 0xFF00) >> 8;
|
||||||
config_controller[slot][CONTRPS_VID][1] = (vid & 0x00FF);
|
config_controller[slot][CONTRPS_VID][1] = (vid & 0x00FF);
|
||||||
config_controller[slot][CONTRPS_PID][0] = (pid & 0xFF00) >> 8;
|
config_controller[slot][CONTRPS_PID][0] = (pid & 0xFF00) >> 8;
|
||||||
@ -291,7 +292,7 @@ s32 ConfigParser::getSlotController(std::string identify){
|
|||||||
}else{
|
}else{
|
||||||
if(slot < gHIDMaxDevices){
|
if(slot < gHIDMaxDevices){
|
||||||
hid = config_controller_hidmask[slot];
|
hid = config_controller_hidmask[slot];
|
||||||
if(HID_DEBUG){ DEBUG_FUNCTION_LINE(">>>>>> found slot %d (hid:%s). Modifing existing data <<<<<<<<\n",slot,CPStringTools::byte_to_binary(hid)); }
|
if(HID_DEBUG){ DEBUG_FUNCTION_LINE(">>>>>> found slot %d (hid:%s). Modifing existing data <<<<<<<<\n",slot,StringTools::byte_to_binary(hid)); }
|
||||||
DEBUG_FUNCTION_LINE("We already have data of this controller, lets modify it\n");
|
DEBUG_FUNCTION_LINE("We already have data of this controller, lets modify it\n");
|
||||||
}else{
|
}else{
|
||||||
DEBUG_FUNCTION_LINE("Something really odd happend to the slots. %d is bigger then max (%d)\n",slot,gHIDMaxDevices);
|
DEBUG_FUNCTION_LINE("Something really odd happend to the slots. %d is bigger then max (%d)\n",slot,gHIDMaxDevices);
|
||||||
@ -333,7 +334,7 @@ bool ConfigParser::parseIni(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
s32 ConfigParser::getValueFromKeyValue(std::string value_pair,std::string expectedKey,std::string delimiter){
|
s32 ConfigParser::getValueFromKeyValue(std::string value_pair,std::string expectedKey,std::string delimiter){
|
||||||
std::vector<std::string> string_value = CPStringTools::StringSplit(value_pair,delimiter);
|
std::vector<std::string> string_value = StringTools::stringSplit(value_pair,delimiter);
|
||||||
if(string_value.size() != 2){
|
if(string_value.size() != 2){
|
||||||
if(HID_DEBUG || string_value.size() > 2){ DEBUG_FUNCTION_LINE("Not a valid key=pair line %s\n",value_pair.c_str()); }
|
if(HID_DEBUG || string_value.size() > 2){ DEBUG_FUNCTION_LINE("Not a valid key=pair line %s\n",value_pair.c_str()); }
|
||||||
return -1;
|
return -1;
|
@ -19,7 +19,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "utils/logger.h"
|
#include <utils/logger.h>
|
||||||
|
|
||||||
ConfigValues *ConfigValues::instance = NULL;
|
ConfigValues *ConfigValues::instance = NULL;
|
||||||
|
|
||||||
@ -106,18 +106,18 @@ s32 ConfigValues::getPresetValueEx(std::string possibleString){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ConfigValues::addDeviceNameEx(u16 vid,u16 pid,std::string value){
|
void ConfigValues::addDeviceNameEx(u16 vid,u16 pid,std::string value){
|
||||||
deviceNames[CPStringTools::strfmt("%04X%04X",vid,pid).c_str()] = value;
|
deviceNames[StringTools::strfmt("%04X%04X",vid,pid).c_str()] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ConfigValues::getStringByVIDPIDEx(u16 vid,u16 pid){
|
std::string ConfigValues::getStringByVIDPIDEx(u16 vid,u16 pid){
|
||||||
std::string result = "";
|
std::string result = "";
|
||||||
std::map<std::string,std::string>::iterator it;
|
std::map<std::string,std::string>::iterator it;
|
||||||
|
|
||||||
it = deviceNames.find(CPStringTools::strfmt("%04X%04X",vid,pid));
|
it = deviceNames.find(StringTools::strfmt("%04X%04X",vid,pid));
|
||||||
if (it != deviceNames.end()){
|
if (it != deviceNames.end()){
|
||||||
result = it->second;
|
result = it->second;
|
||||||
}else{
|
}else{
|
||||||
result = CPStringTools::strfmt("VID: 0x%04X\nPID: 0x%04X",vid,pid);
|
result = StringTools::strfmt("VID: 0x%04X\nPID: 0x%04X",vid,pid);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
@ -22,11 +22,10 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <gctypes.h>
|
|
||||||
|
|
||||||
#include "../ControllerPatcher.hpp"
|
#include "../ControllerPatcherIncludes.hpp"
|
||||||
|
|
||||||
#include "utils/logger.h"
|
#include <utils/logger.h>
|
||||||
|
|
||||||
enum PARSE_TYPE{
|
enum PARSE_TYPE{
|
||||||
PARSE_CONTROLLER,
|
PARSE_CONTROLLER,
|
@ -20,11 +20,10 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <gctypes.h>
|
|
||||||
|
|
||||||
#include "../ControllerPatcher.hpp"
|
#include "../ControllerPatcherIncludes.hpp"
|
||||||
|
|
||||||
#include "utils/logger.h"
|
#include <utils/logger.h>
|
||||||
|
|
||||||
class ConfigValues
|
class ConfigValues
|
||||||
{
|
{
|
||||||
@ -551,14 +550,14 @@ private:
|
|||||||
gGamePadValuesToCONTRPSString["VPAD_STICK_L_EMULATION_UP"] = CONTRPS_VPAD_STICK_L_EMULATION_UP;
|
gGamePadValuesToCONTRPSString["VPAD_STICK_L_EMULATION_UP"] = CONTRPS_VPAD_STICK_L_EMULATION_UP;
|
||||||
gGamePadValuesToCONTRPSString["VPAD_STICK_L_EMULATION_DOWN"] = CONTRPS_VPAD_STICK_L_EMULATION_DOWN;
|
gGamePadValuesToCONTRPSString["VPAD_STICK_L_EMULATION_DOWN"] = CONTRPS_VPAD_STICK_L_EMULATION_DOWN;
|
||||||
|
|
||||||
deviceNames[CPStringTools::strfmt("%04X%04X",HID_GC_VID, HID_GC_PID).c_str()] = HID_GC_STRING;
|
deviceNames[StringTools::strfmt("%04X%04X",HID_GC_VID, HID_GC_PID).c_str()] = HID_GC_STRING;
|
||||||
deviceNames[CPStringTools::strfmt("%04X%04X",HID_KEYBOARD_VID, HID_KEYBOARD_PID).c_str()] = HID_KEYBOARD_STRING;
|
deviceNames[StringTools::strfmt("%04X%04X",HID_KEYBOARD_VID, HID_KEYBOARD_PID).c_str()] = HID_KEYBOARD_STRING;
|
||||||
deviceNames[CPStringTools::strfmt("%04X%04X",HID_MOUSE_VID, HID_MOUSE_PID).c_str()] = HID_MOUSE_STRING;
|
deviceNames[StringTools::strfmt("%04X%04X",HID_MOUSE_VID, HID_MOUSE_PID).c_str()] = HID_MOUSE_STRING;
|
||||||
deviceNames[CPStringTools::strfmt("%04X%04X",HID_DS3_VID, HID_DS3_PID).c_str()] = HID_DS3_STRING;
|
deviceNames[StringTools::strfmt("%04X%04X",HID_DS3_VID, HID_DS3_PID).c_str()] = HID_DS3_STRING;
|
||||||
deviceNames[CPStringTools::strfmt("%04X%04X",HID_NEW_DS4_VID, HID_NEW_DS4_PID).c_str()] = HID_NEW_DS4_STRING;
|
deviceNames[StringTools::strfmt("%04X%04X",HID_NEW_DS4_VID, HID_NEW_DS4_PID).c_str()] = HID_NEW_DS4_STRING;
|
||||||
deviceNames[CPStringTools::strfmt("%04X%04X",HID_DS4_VID, HID_DS4_PID).c_str()] = HID_DS4_STRING;
|
deviceNames[StringTools::strfmt("%04X%04X",HID_DS4_VID, HID_DS4_PID).c_str()] = HID_DS4_STRING;
|
||||||
deviceNames[CPStringTools::strfmt("%04X%04X",HID_XINPUT_VID, HID_XINPUT_PID).c_str()] = HID_XINPUT_STRING;
|
deviceNames[StringTools::strfmt("%04X%04X",HID_XINPUT_VID, HID_XINPUT_PID).c_str()] = HID_XINPUT_STRING;
|
||||||
deviceNames[CPStringTools::strfmt("%04X%04X",HID_SWITCH_PRO_VID,HID_SWITCH_PRO_PID).c_str()] = HID_SWITCH_PRO_STRING;
|
deviceNames[StringTools::strfmt("%04X%04X",HID_SWITCH_PRO_VID,HID_SWITCH_PRO_PID).c_str()] = HID_SWITCH_PRO_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
const u8 * getValuesForPreset(std::map<std::string,const u8*> values,std::string possibleValue);
|
const u8 * getValuesForPreset(std::map<std::string,const u8*> values,std::string possibleValue);
|
@ -1,6 +1,6 @@
|
|||||||
#include "ControllerPatcherNet.hpp"
|
#include "ControllerPatcherNet.hpp"
|
||||||
#include "dynamic_libs/os_functions.h"
|
#include <dynamic_libs/os_functions.h>
|
||||||
#include "dynamic_libs/socket_functions.h"
|
#include <dynamic_libs/socket_functions.h>
|
||||||
|
|
||||||
s32 ControllerPatcherNet::recvwait(s32 sock, void *buffer, s32 len) {
|
s32 ControllerPatcherNet::recvwait(s32 sock, void *buffer, s32 len) {
|
||||||
s32 ret;
|
s32 ret;
|
@ -1,7 +1,7 @@
|
|||||||
#ifndef _CONTROLLERPATCHERNET_H_
|
#ifndef _CONTROLLERPATCHERNET_H_
|
||||||
#define _CONTROLLERPATCHERNET_H_
|
#define _CONTROLLERPATCHERNET_H_
|
||||||
|
|
||||||
#include<gctypes.h>
|
#include <dynamic_libs/os_types.h>
|
||||||
|
|
||||||
class ControllerPatcherNet{
|
class ControllerPatcherNet{
|
||||||
friend class TCPServer;
|
friend class TCPServer;
|
@ -19,11 +19,11 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "utils/logger.h"
|
#include <utils/logger.h>
|
||||||
|
|
||||||
#define wiiu_errno (*__gh_errno_ptr())
|
#define wiiu_errno (*__gh_errno_ptr())
|
||||||
|
|
||||||
ControllerPatcherThread * TCPServer::pThread = NULL;
|
CThread * TCPServer::pThread = NULL;
|
||||||
TCPServer * TCPServer::instance = NULL;
|
TCPServer * TCPServer::instance = NULL;
|
||||||
|
|
||||||
TCPServer::TCPServer(s32 port){
|
TCPServer::TCPServer(s32 port){
|
||||||
@ -68,7 +68,7 @@ void TCPServer::StartTCPThread(TCPServer * server){
|
|||||||
priority = 10;
|
priority = 10;
|
||||||
DEBUG_FUNCTION_LINE("This game needs higher thread priority. We set it to %d\n",priority);
|
DEBUG_FUNCTION_LINE("This game needs higher thread priority. We set it to %d\n",priority);
|
||||||
}
|
}
|
||||||
TCPServer::pThread = ControllerPatcherThread::create(TCPServer::DoTCPThread, (void*)server, ControllerPatcherThread::eAttributeAffCore2,priority);
|
TCPServer::pThread = CThread::create(TCPServer::DoTCPThread, (void*)server, CThread::eAttributeAffCore2,priority);
|
||||||
TCPServer::pThread->resumeThread();
|
TCPServer::pThread->resumeThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -367,7 +367,7 @@ void TCPServer::DoTCPThreadInternal(){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCPServer::DoTCPThread(ControllerPatcherThread *thread, void *arg){
|
void TCPServer::DoTCPThread(CThread *thread, void *arg){
|
||||||
TCPServer * args = (TCPServer * )arg;
|
TCPServer * args = (TCPServer * )arg;
|
||||||
return args->DoTCPThreadInternal();
|
return args->DoTCPThreadInternal();
|
||||||
}
|
}
|
@ -18,7 +18,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "utils/logger.h"
|
#include <utils/logger.h>
|
||||||
|
|
||||||
#define MAX_UDP_SIZE 0x578
|
#define MAX_UDP_SIZE 0x578
|
||||||
|
|
@ -17,11 +17,9 @@
|
|||||||
#ifndef _UDPCLIENT_WINDOW_H_
|
#ifndef _UDPCLIENT_WINDOW_H_
|
||||||
#define _UDPCLIENT_WINDOW_H_
|
#define _UDPCLIENT_WINDOW_H_
|
||||||
|
|
||||||
#include <gctypes.h>
|
#include "../ControllerPatcherIncludes.hpp"
|
||||||
|
|
||||||
#include "../ControllerPatcher.hpp"
|
#include <dynamic_libs/socket_functions.h>
|
||||||
|
|
||||||
#include "dynamic_libs/socket_functions.h"
|
|
||||||
|
|
||||||
#define DEFAULT_UDP_CLIENT_PORT 8114
|
#define DEFAULT_UDP_CLIENT_PORT 8114
|
||||||
|
|
@ -19,13 +19,13 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "dynamic_libs/socket_functions.h"
|
#include <dynamic_libs/socket_functions.h>
|
||||||
#include "utils/logger.h"
|
#include <utils/logger.h>
|
||||||
|
|
||||||
#define MAX_UDP_SIZE 0x578
|
#define MAX_UDP_SIZE 0x578
|
||||||
#define wiiu_errno (*__gh_errno_ptr())
|
#define wiiu_errno (*__gh_errno_ptr())
|
||||||
|
|
||||||
ControllerPatcherThread * UDPServer::pThread = NULL;
|
CThread * UDPServer::pThread = NULL;
|
||||||
UDPServer * UDPServer::instance = NULL;
|
UDPServer * UDPServer::instance = NULL;
|
||||||
|
|
||||||
UDPServer::UDPServer(s32 port){
|
UDPServer::UDPServer(s32 port){
|
||||||
@ -47,7 +47,7 @@ UDPServer::UDPServer(s32 port){
|
|||||||
}
|
}
|
||||||
|
|
||||||
UDPServer::~UDPServer(){
|
UDPServer::~UDPServer(){
|
||||||
ControllerPatcherThread * pThreadPointer = UDPServer::pThread;
|
CThread * pThreadPointer = UDPServer::pThread;
|
||||||
if(pThreadPointer != NULL){
|
if(pThreadPointer != NULL){
|
||||||
exitThread = 1;
|
exitThread = 1;
|
||||||
if(pThreadPointer != NULL){
|
if(pThreadPointer != NULL){
|
||||||
@ -74,7 +74,7 @@ void UDPServer::StartUDPThread(UDPServer * server){
|
|||||||
priority = 10;
|
priority = 10;
|
||||||
DEBUG_FUNCTION_LINE("This game needs higher thread priority. We set it to %d\n",priority);
|
DEBUG_FUNCTION_LINE("This game needs higher thread priority. We set it to %d\n",priority);
|
||||||
}
|
}
|
||||||
UDPServer::pThread = ControllerPatcherThread::create(UDPServer::DoUDPThread, (void*)server, ControllerPatcherThread::eAttributeAffCore2,priority);
|
UDPServer::pThread = CThread::create(UDPServer::DoUDPThread, (void*)server, CThread::eAttributeAffCore2,priority);
|
||||||
UDPServer::pThread->resumeThread();
|
UDPServer::pThread->resumeThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +88,7 @@ bool UDPServer::cpyIncrementBufferOffset(void * target, void * source, s32 * off
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UDPServer::DoUDPThread(ControllerPatcherThread *thread, void *arg){
|
void UDPServer::DoUDPThread(CThread *thread, void *arg){
|
||||||
UDPServer * args = (UDPServer * )arg;
|
UDPServer * args = (UDPServer * )arg;
|
||||||
args->DoUDPThreadInternal();
|
args->DoUDPThreadInternal();
|
||||||
}
|
}
|
@ -17,7 +17,7 @@
|
|||||||
#ifndef _UDPSERVER_WINDOW_H_
|
#ifndef _UDPSERVER_WINDOW_H_
|
||||||
#define _UDPSERVER_WINDOW_H_
|
#define _UDPSERVER_WINDOW_H_
|
||||||
|
|
||||||
#include "../ControllerPatcher.hpp"
|
#include "../ControllerPatcherIncludes.hpp"
|
||||||
|
|
||||||
#define DEFAULT_UDP_PORT 8113
|
#define DEFAULT_UDP_PORT 8113
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ private:
|
|||||||
UDPServer(s32 port);
|
UDPServer(s32 port);
|
||||||
~UDPServer();
|
~UDPServer();
|
||||||
void StartUDPThread(UDPServer * server);
|
void StartUDPThread(UDPServer * server);
|
||||||
static void DoUDPThread(ControllerPatcherThread *thread, void *arg);
|
static void DoUDPThread(CThread *thread, void *arg);
|
||||||
void DoUDPThreadInternal();
|
void DoUDPThreadInternal();
|
||||||
bool cpyIncrementBufferOffset(void * target, void * source, s32 * offset, s32 typesize, s32 maximum);
|
bool cpyIncrementBufferOffset(void * target, void * source, s32 * offset, s32 typesize, s32 maximum);
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ private:
|
|||||||
volatile s32 exitThread = 0;
|
volatile s32 exitThread = 0;
|
||||||
|
|
||||||
static UDPServer *instance;
|
static UDPServer *instance;
|
||||||
static ControllerPatcherThread *pThread;
|
static CThread *pThread;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //_UDPSERVER_WINDOW_H_
|
#endif //_UDPSERVER_WINDOW_H_
|
@ -17,10 +17,10 @@
|
|||||||
#ifndef _TCPSERVER_WINDOW_H_
|
#ifndef _TCPSERVER_WINDOW_H_
|
||||||
#define _TCPSERVER_WINDOW_H_
|
#define _TCPSERVER_WINDOW_H_
|
||||||
|
|
||||||
#include "../ControllerPatcher.hpp"
|
#include "../ControllerPatcherIncludes.hpp"
|
||||||
|
|
||||||
#include "dynamic_libs/socket_functions.h"
|
#include <dynamic_libs/socket_functions.h>
|
||||||
#include "dynamic_libs/os_functions.h"
|
#include <dynamic_libs/os_functions.h>
|
||||||
|
|
||||||
#define WIIU_CP_TCP_HANDSHAKE WIIU_CP_TCP_HANDSHAKE_VERSION_3
|
#define WIIU_CP_TCP_HANDSHAKE WIIU_CP_TCP_HANDSHAKE_VERSION_3
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ private:
|
|||||||
void ErrorHandling();
|
void ErrorHandling();
|
||||||
|
|
||||||
void StartTCPThread(TCPServer * server);
|
void StartTCPThread(TCPServer * server);
|
||||||
static void DoTCPThread(ControllerPatcherThread *thread, void *arg);
|
static void DoTCPThread(CThread *thread, void *arg);
|
||||||
void DoTCPThreadInternal();
|
void DoTCPThreadInternal();
|
||||||
static void DetachConnectedNetworkController();
|
static void DetachConnectedNetworkController();
|
||||||
static void AttachDetach(s32 attach);
|
static void AttachDetach(s32 attach);
|
||||||
@ -87,7 +87,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
volatile s32 exitThread = 0;
|
volatile s32 exitThread = 0;
|
||||||
static ControllerPatcherThread *pThread;
|
static CThread *pThread;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //_TCPSERVER_WINDOW_H_
|
#endif //_TCPSERVER_WINDOW_H_
|
@ -19,11 +19,11 @@
|
|||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <gctypes.h>
|
|
||||||
|
|
||||||
#include "dynamic_libs/os_functions.h"
|
|
||||||
|
|
||||||
#include "utils/logger.h"
|
#include <dynamic_libs/os_functions.h>
|
||||||
|
|
||||||
|
#include <utils/logger.h>
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
* public implementation for the network controller
|
* public implementation for the network controller
|
||||||
@ -562,7 +562,7 @@ std::vector<HID_Data *> ControllerPatcherHID::getHIDDataAll(){
|
|||||||
s32 res;
|
s32 res;
|
||||||
HID_Data * new_data = NULL;
|
HID_Data * new_data = NULL;
|
||||||
if((res = ControllerPatcherHID::getHIDData(cur_hidmask,pad,&new_data)) < 0){ // Checks if the pad is invalid.
|
if((res = ControllerPatcherHID::getHIDData(cur_hidmask,pad,&new_data)) < 0){ // Checks if the pad is invalid.
|
||||||
DEBUG_FUNCTION_LINE("error: Error getting the HID data from HID(%s) CHAN(). Error %d\n",CPStringTools::byte_to_binary(cur_hidmask),pad,res);
|
DEBUG_FUNCTION_LINE("error: Error getting the HID data from HID(%s) CHAN(). Error %d\n",StringTools::byte_to_binary(cur_hidmask),pad,res);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(new_data != NULL) data_list.push_back(new_data);
|
if(new_data != NULL) data_list.push_back(new_data);
|
@ -29,10 +29,10 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "dynamic_libs/syshid_functions.h"
|
#include <dynamic_libs/syshid_functions.h>
|
||||||
#include "dynamic_libs/vpad_functions.h"
|
#include <dynamic_libs/vpad_functions.h>
|
||||||
|
|
||||||
#include "../ControllerPatcher.hpp"
|
#include "../ControllerPatcherIncludes.hpp"
|
||||||
|
|
||||||
#define SWAP16(x) ((x>>8) | ((x&0xFF)<<8))
|
#define SWAP16(x) ((x>>8) | ((x&0xFF)<<8))
|
||||||
#define SWAP8(x) ((x>>4) | ((x&0xF)<<4))
|
#define SWAP8(x) ((x>>4) | ((x&0xF)<<4))
|
@ -18,7 +18,7 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "utils/logger.h"
|
#include <utils/logger.h>
|
||||||
|
|
||||||
CONTROLLER_PATCHER_RESULT_OR_ERROR ControllerPatcherUtils::getDataByHandle(s32 handle, my_cb_user ** data){
|
CONTROLLER_PATCHER_RESULT_OR_ERROR ControllerPatcherUtils::getDataByHandle(s32 handle, my_cb_user ** data){
|
||||||
for(s32 i = 0;i< gHIDMaxDevices;i++){
|
for(s32 i = 0;i< gHIDMaxDevices;i++){
|
@ -27,12 +27,10 @@
|
|||||||
#ifndef _CONTROLLER_PATCHER_UTIL_H_
|
#ifndef _CONTROLLER_PATCHER_UTIL_H_
|
||||||
#define _CONTROLLER_PATCHER_UTIL_H_
|
#define _CONTROLLER_PATCHER_UTIL_H_
|
||||||
|
|
||||||
#include <gctypes.h>
|
#include <dynamic_libs/vpad_functions.h>
|
||||||
|
#include <dynamic_libs/padscore_functions.h>
|
||||||
|
|
||||||
#include "dynamic_libs/vpad_functions.h"
|
#include "../ControllerPatcherIncludes.hpp"
|
||||||
#include "dynamic_libs/padscore_functions.h"
|
|
||||||
|
|
||||||
#include "../ControllerPatcher.hpp"
|
|
||||||
|
|
||||||
class ControllerPatcherUtils{
|
class ControllerPatcherUtils{
|
||||||
//give the other classes access to the private functions.
|
//give the other classes access to the private functions.
|
@ -14,8 +14,8 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include <gctypes.h>
|
|
||||||
#include "../ControllerPatcher.hpp"
|
#include "../ControllerPatcherIncludes.hpp"
|
||||||
|
|
||||||
ControllerMapping gControllerMapping __attribute__((section(".data")));
|
ControllerMapping gControllerMapping __attribute__((section(".data")));
|
||||||
|
|
||||||
@ -62,7 +62,6 @@ wpad_connect_callback_t gKPADConnectCallback[4] __attribute__((section(".data"))
|
|||||||
wpad_extension_callback_t gExtensionCallback[4] __attribute__((section(".data")));
|
wpad_extension_callback_t gExtensionCallback[4] __attribute__((section(".data")));
|
||||||
wpad_sampling_callback_t gSamplingCallback __attribute__((section(".data"))) = 0;
|
wpad_sampling_callback_t gSamplingCallback __attribute__((section(".data"))) = 0;
|
||||||
u8 gCallbackCooldown __attribute__((section(".data"))) = 0;
|
u8 gCallbackCooldown __attribute__((section(".data"))) = 0;
|
||||||
u8 gAppStatus __attribute__((section(".data"))) = 0;
|
|
||||||
u8 gNetworkControllerActivated __attribute__((section(".data"))) = 1;
|
u8 gNetworkControllerActivated __attribute__((section(".data"))) = 1;
|
||||||
|
|
||||||
u8 gGlobalRumbleActivated __attribute__((section(".data"))) = 0;
|
u8 gGlobalRumbleActivated __attribute__((section(".data"))) = 0;
|
@ -17,9 +17,9 @@
|
|||||||
#ifndef CP_RETAINS_VARS_H_
|
#ifndef CP_RETAINS_VARS_H_
|
||||||
#define CP_RETAINS_VARS_H_
|
#define CP_RETAINS_VARS_H_
|
||||||
|
|
||||||
#include "dynamic_libs/syshid_functions.h"
|
#include <dynamic_libs/syshid_functions.h>
|
||||||
#include "dynamic_libs/padscore_functions.h"
|
#include <dynamic_libs/padscore_functions.h>
|
||||||
#include "../patcher/ControllerPatcherDefs.h"
|
#include "../ControllerPatcherDefs.h"
|
||||||
|
|
||||||
extern ControllerMapping gControllerMapping;
|
extern ControllerMapping gControllerMapping;
|
||||||
|
|
||||||
@ -67,7 +67,6 @@ extern wpad_extension_callback_t gExtensionCallback[4];
|
|||||||
extern wpad_sampling_callback_t gSamplingCallback;
|
extern wpad_sampling_callback_t gSamplingCallback;
|
||||||
extern u8 gCallbackCooldown;
|
extern u8 gCallbackCooldown;
|
||||||
extern u8 gGlobalRumbleActivated;
|
extern u8 gGlobalRumbleActivated;
|
||||||
extern u8 gAppStatus;
|
|
||||||
extern u8 gNetworkControllerActivated;
|
extern u8 gNetworkControllerActivated;
|
||||||
|
|
||||||
extern u32 gUDPClientip;
|
extern u32 gUDPClientip;
|
@ -18,9 +18,9 @@
|
|||||||
#ifndef _PAD_CONST_H_
|
#ifndef _PAD_CONST_H_
|
||||||
#define _PAD_CONST_H_
|
#define _PAD_CONST_H_
|
||||||
|
|
||||||
#include <gctypes.h>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "../patcher/ControllerPatcherDefs.h"
|
#include "../ControllerPatcherDefs.h"
|
||||||
|
|
||||||
extern const u8 DEF_R_STICK;
|
extern const u8 DEF_R_STICK;
|
||||||
extern const u8 DEF_L_STICK;
|
extern const u8 DEF_L_STICK;
|
@ -1,69 +0,0 @@
|
|||||||
#include "CPFSUtils.hpp"
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
//Copy pasted from dimoks sources. Thanks!!!
|
|
||||||
s32 CPFSUtils::LoadFileToMem(const char *filepath, u8 **inbuffer, u32 *size){
|
|
||||||
//! always initialze input
|
|
||||||
*inbuffer = NULL;
|
|
||||||
if(size){
|
|
||||||
*size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
s32 iFd = open(filepath, O_RDONLY);
|
|
||||||
if (iFd < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
u32 filesize = lseek(iFd, 0, SEEK_END);
|
|
||||||
lseek(iFd, 0, SEEK_SET);
|
|
||||||
|
|
||||||
u8 *buffer = (u8 *) malloc(filesize);
|
|
||||||
if (buffer == NULL)
|
|
||||||
{
|
|
||||||
close(iFd);
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 blocksize = 0x4000;
|
|
||||||
u32 done = 0;
|
|
||||||
s32 readBytes = 0;
|
|
||||||
|
|
||||||
while(done < filesize)
|
|
||||||
{
|
|
||||||
if(done + blocksize > filesize) {
|
|
||||||
blocksize = filesize - done;
|
|
||||||
}
|
|
||||||
readBytes = read(iFd, buffer + done, blocksize);
|
|
||||||
if(readBytes <= 0)
|
|
||||||
break;
|
|
||||||
done += readBytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
close(iFd);
|
|
||||||
|
|
||||||
if (done != filesize)
|
|
||||||
{
|
|
||||||
free(buffer);
|
|
||||||
buffer = NULL;
|
|
||||||
return -3;
|
|
||||||
}
|
|
||||||
|
|
||||||
*inbuffer = buffer;
|
|
||||||
|
|
||||||
//! size is optional input
|
|
||||||
if(size){
|
|
||||||
*size = filesize;
|
|
||||||
}
|
|
||||||
|
|
||||||
return filesize;
|
|
||||||
}
|
|
||||||
|
|
||||||
//CPFSUtils
|
|
@ -1,12 +0,0 @@
|
|||||||
#ifndef _CPFS_UTILS_H_
|
|
||||||
#define _CPFS_UTILS_H_
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <gctypes.h>
|
|
||||||
|
|
||||||
class CPFSUtils{
|
|
||||||
public:
|
|
||||||
static s32 LoadFileToMem(const char *filepath, u8 **inbuffer, u32 *size);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* _CPFS_UTILS_H_ */
|
|
@ -1,82 +0,0 @@
|
|||||||
#include "CPStringTools.hpp"
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
bool CPStringTools::EndsWith(const std::string& a, const std::string& b) {
|
|
||||||
if (b.size() > a.size()) return false;
|
|
||||||
return std::equal(a.begin() + a.size() - b.size(), a.end(), b.begin());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> CPStringTools::StringSplit(const std::string & inValue, const std::string & splitter){
|
|
||||||
std::string value = inValue;
|
|
||||||
std::vector<std::string> result;
|
|
||||||
while (true) {
|
|
||||||
u32 index = value.find(splitter);
|
|
||||||
if (index == std::string::npos) {
|
|
||||||
result.push_back(value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
std::string first = value.substr(0, index);
|
|
||||||
result.push_back(first);
|
|
||||||
if (index + splitter.size() == value.length()) {
|
|
||||||
result.push_back("");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(index + splitter.size() > value.length()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
value = value.substr(index + splitter.size(), value.length());
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char * CPStringTools::byte_to_binary(s32 x){
|
|
||||||
static char b[9];
|
|
||||||
b[0] = '\0';
|
|
||||||
|
|
||||||
s32 z;
|
|
||||||
for (z = 128; z > 0; z >>= 1)
|
|
||||||
{
|
|
||||||
strcat(b, ((x & z) == z) ? "1" : "0");
|
|
||||||
}
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CPStringTools::removeCharFromString(std::string& input,char toBeRemoved){
|
|
||||||
std::string output = input;
|
|
||||||
size_t position;
|
|
||||||
while(1){
|
|
||||||
position = output.find(toBeRemoved);
|
|
||||||
if(position == std::string::npos)
|
|
||||||
break;
|
|
||||||
output.erase(position, 1);
|
|
||||||
}
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CPStringTools::strfmt(const char * format, ...){
|
|
||||||
std::string str;
|
|
||||||
char * tmp = NULL;
|
|
||||||
|
|
||||||
va_list va;
|
|
||||||
va_start(va, format);
|
|
||||||
if((vasprintf(&tmp, format, va) >= 0) && tmp)
|
|
||||||
{
|
|
||||||
str = tmp;
|
|
||||||
}
|
|
||||||
va_end(va);
|
|
||||||
|
|
||||||
if(tmp){
|
|
||||||
free(tmp);
|
|
||||||
tmp = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
//CPStringTools
|
|
@ -1,16 +0,0 @@
|
|||||||
#ifndef _CPSTRING_TOOLS_H_
|
|
||||||
#define _CPSTRING_TOOLS_H_
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <gctypes.h>
|
|
||||||
|
|
||||||
class CPStringTools{
|
|
||||||
public:
|
|
||||||
static bool EndsWith(const std::string& a, const std::string& b);
|
|
||||||
static std::vector<std::string> StringSplit(const std::string & inValue, const std::string & splitter);
|
|
||||||
static std::string removeCharFromString(std::string& input,char toBeRemoved);
|
|
||||||
static const char *byte_to_binary(s32 x);
|
|
||||||
static std::string strfmt(const char * format, ...);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* _CPSTRING_TOOLS_H_ */
|
|
@ -1,121 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* Copyright (C) 2015 Dimok
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
****************************************************************************/
|
|
||||||
#ifndef CONTROLLERPATCHERTHREAD_H_
|
|
||||||
#define CONTROLLERPATCHERTHREAD_H_
|
|
||||||
|
|
||||||
#include <gctypes.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "dynamic_libs/os_functions.h"
|
|
||||||
#include "utils/logger.h"
|
|
||||||
|
|
||||||
class ControllerPatcherThread
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef void (* Callback)(ControllerPatcherThread *thread, void *arg);
|
|
||||||
|
|
||||||
//! constructor
|
|
||||||
ControllerPatcherThread(s32 iAttr, s32 iPriority = 16, s32 iStackSize = 0x8000, ControllerPatcherThread::Callback callback = NULL, void *callbackArg = NULL)
|
|
||||||
: pThread(NULL)
|
|
||||||
, pThreadStack(NULL)
|
|
||||||
, pCallback(callback)
|
|
||||||
, pCallbackArg(callbackArg)
|
|
||||||
{
|
|
||||||
//! save attribute assignment
|
|
||||||
iAttributes = iAttr;
|
|
||||||
//! allocate the thread
|
|
||||||
pThread = (OSThread*) memalign(8, 0x1000);
|
|
||||||
//! allocate the stack
|
|
||||||
pThreadStack = (u8 *) memalign(0x20, iStackSize);
|
|
||||||
//! create the thread
|
|
||||||
if(pThread && pThreadStack)
|
|
||||||
OSCreateThread(pThread, &ControllerPatcherThread::threadCallback, 1, this, (u32)pThreadStack+iStackSize, iStackSize, iPriority, iAttributes);
|
|
||||||
}
|
|
||||||
|
|
||||||
//! destructor
|
|
||||||
virtual ~ControllerPatcherThread() {shutdownThread(); }
|
|
||||||
|
|
||||||
static ControllerPatcherThread *create(ControllerPatcherThread::Callback callback, void *callbackArg, s32 iAttr = eAttributeNone, s32 iPriority = 16, s32 iStackSize = 0x8000)
|
|
||||||
{
|
|
||||||
return ( new ControllerPatcherThread(iAttr, iPriority, iStackSize, callback, callbackArg) );
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Get thread ID
|
|
||||||
virtual void* getThread() const { return pThread; }
|
|
||||||
//! Thread entry function
|
|
||||||
virtual void executeThread(void)
|
|
||||||
{
|
|
||||||
if(pCallback)
|
|
||||||
pCallback(this, pCallbackArg);
|
|
||||||
}
|
|
||||||
//! Suspend thread
|
|
||||||
virtual void suspendThread(void) { if(isThreadSuspended()) return; if(pThread) OSSuspendThread(pThread); }
|
|
||||||
//! Resume thread
|
|
||||||
virtual void resumeThread(void) { if(!isThreadSuspended()) return; if(pThread) OSResumeThread(pThread); }
|
|
||||||
//! Set thread priority
|
|
||||||
virtual void setThreadPriority(s32 prio) { if(pThread) OSSetThreadPriority(pThread, prio); }
|
|
||||||
//! Check if thread is suspended
|
|
||||||
virtual bool isThreadSuspended(void) const { if(pThread) return OSIsThreadSuspended(pThread); return false; }
|
|
||||||
//! Check if thread is terminated
|
|
||||||
virtual bool isThreadTerminated(void) const { if(pThread) return OSIsThreadTerminated(pThread); return false; }
|
|
||||||
//! Check if thread is running
|
|
||||||
virtual bool isThreadRunning(void) const { return !isThreadSuspended() && !isThreadRunning(); }
|
|
||||||
//! Shutdown thread
|
|
||||||
virtual void shutdownThread(void)
|
|
||||||
{
|
|
||||||
//! wait for thread to finish
|
|
||||||
if(pThread && !(iAttributes & eAttributeDetach))
|
|
||||||
{
|
|
||||||
while(isThreadSuspended()){
|
|
||||||
resumeThread();
|
|
||||||
}
|
|
||||||
OSJoinThread(pThread, NULL);
|
|
||||||
}
|
|
||||||
//! free the thread stack buffer
|
|
||||||
if(pThreadStack){
|
|
||||||
free(pThreadStack);
|
|
||||||
}
|
|
||||||
if(pThread)
|
|
||||||
free(pThread);
|
|
||||||
pThread = NULL;
|
|
||||||
pThreadStack = NULL;
|
|
||||||
}
|
|
||||||
//! Thread attributes
|
|
||||||
enum eCThreadAttributes
|
|
||||||
{
|
|
||||||
eAttributeNone = 0x07,
|
|
||||||
eAttributeAffCore0 = 0x01,
|
|
||||||
eAttributeAffCore1 = 0x02,
|
|
||||||
eAttributeAffCore2 = 0x04,
|
|
||||||
eAttributeDetach = 0x08,
|
|
||||||
eAttributePinnedAff = 0x10
|
|
||||||
};
|
|
||||||
private:
|
|
||||||
static s32 threadCallback(s32 argc, void *arg)
|
|
||||||
{
|
|
||||||
//! After call to start() continue with the internal function
|
|
||||||
((ControllerPatcherThread *) arg)->executeThread();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
s32 iAttributes;
|
|
||||||
OSThread* pThread;
|
|
||||||
u8 *pThreadStack;
|
|
||||||
Callback pCallback;
|
|
||||||
void *pCallbackArg;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue
Block a user