Transforming it into a static lib

This commit is contained in:
Maschell 2017-10-29 09:34:47 +01:00
parent 409871f29d
commit 765b9dcb1c
34 changed files with 410 additions and 475 deletions

50
.gitignore vendored
View File

@ -1,47 +1,3 @@
# Windows image file caches
Thumbs.db
ehthumbs.db
# 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
release/*
libcontrollerpatcher.cbp
libcontrollerpatcher.depend

134
Makefile Normal file
View 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
#---------------------------------------------------------------------------------------

View File

@ -7,16 +7,39 @@ Detailed information about creating config files and adding support for more con
# Where can I find config files
Configfiles for all controllers are collection in [this repository](https://github.com/Maschell/controller_patch_configs)
# Dependencies for including it in other applications
This controller_patcher is build to be used in serveral projects. It don't uses some ultra fancy external libraries. </br>
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.
- To able to log something, you need the right [logger functions](https://github.com/Maschell/hid_to_vpad/tree/master/src/utils).
## Logging usage
To able to use the logging change the "DO_LOGGING" parameter in the Makefile.
# Compiling
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
### How to "install" it
TODO!
```
ControllerPatcher::Init(NULL); //No custom configuration
ControllerPatcher::disableControllerMapping();
ControllerPatcher::startNetworkServer();
```
```
ControllerPatcher::DeInit();
ControllerPatcher::stopNetworkServer();
```
# Credits:
- Maschell
- FIX94 - huge thanks to him and his initally created gc-to-vpad. Was a motivation and base to start all this

View File

@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
****************************************************************************/
#include "./ConfigReader.hpp"
#include "./utils/CPFSUtils.hpp"
#include <fs/FSUtils.h>
#include <stdio.h>
#include <stdlib.h>
@ -29,8 +29,8 @@
#include <dirent.h>
#include "dynamic_libs/fs_functions.h"
#include "utils/logger.h"
#include <dynamic_libs/fs_functions.h>
#include <utils/logger.h>
s32 ConfigReader::numberValidFiles = 0;
ConfigReader *ConfigReader::instance = NULL;
@ -74,7 +74,7 @@ std::vector<std::string> ConfigReader::ScanFolder(std::string path){
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);
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 strBuffer = "";
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 = CPStringTools::removeCharFromString(strBuffer,'\r');
strBuffer = CPStringTools::removeCharFromString(strBuffer,' ');
strBuffer = CPStringTools::removeCharFromString(strBuffer,'\t');
strBuffer = StringTools::removeCharFromString(strBuffer,'\r');
strBuffer = StringTools::removeCharFromString(strBuffer,' ');
strBuffer = StringTools::removeCharFromString(strBuffer,'\t');
}
return strBuffer;
}

View File

@ -17,11 +17,10 @@
#ifndef _ConfigReader_H_
#define _ConfigReader_H_
#include <gctypes.h>
#include <string>
#include <vector>
#include "./ControllerPatcher.hpp"
#include "ControllerPatcherIncludes.hpp"
class ConfigReader{
friend class ControllerPatcher;

View File

@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
****************************************************************************/
#include "ControllerPatcher.hpp"
#include "ControllerPatcherIncludes.hpp"
#include <malloc.h>
#include <stdlib.h>
@ -22,12 +22,12 @@
#include <stdio.h>
#include <vector>
#include "utils/logger.h"
#include <utils/logger.h>
#include "dynamic_libs/sys_functions.h"
#include "dynamic_libs/syshid_functions.h"
#include "dynamic_libs/socket_functions.h"
#include "dynamic_libs/padscore_functions.h"
#include <dynamic_libs/sys_functions.h>
#include <dynamic_libs/syshid_functions.h>
#include <dynamic_libs/socket_functions.h>
#include <dynamic_libs/padscore_functions.h>
// This stores the holded buttons for the gamepad after the button remapping.
static u32 buttonRemapping_lastButtonsHold = 0;
@ -105,12 +105,12 @@ void ControllerPatcher::ResetConfig(){
gHIDRegisteredDevices = 0;
ControllerPatcherUtils::getNextSlotData(&slotdata);
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);
gMouseSlot = slotdata.deviceslot;
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);
u32 keyboard_slot = slotdata.deviceslot;
@ -118,36 +118,36 @@ void ControllerPatcher::ResetConfig(){
gHID_LIST_KEYBOARD = keyboard_hid;
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);
u32 gc_slot = slotdata.deviceslot;
u32 gc_hid = slotdata.hidmask;
gHID_LIST_GC = gc_hid;
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);
u32 ds3_slot = slotdata.deviceslot;
u32 ds3_hid = slotdata.hidmask;
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);
u32 ds4_slot = slotdata.deviceslot;
u32 ds4_hid = slotdata.hidmask;
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);
u32 xinput_slot = slotdata.deviceslot;
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);
u32 switch_pro_slot = slotdata.deviceslot;
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;
@ -725,6 +725,7 @@ ControllerMappingPADInfo * ControllerPatcher::getControllerMappingInfo(UControll
}
HID_Mouse_Data * ControllerPatcher::getMouseData(){
if(gHID_Mouse_Mode != HID_MOUSE_MODE_TOUCH) return NULL;
ControllerMappingPAD * CMPAD = ControllerPatcherUtils::getControllerMappingByType(UController_Type_Gamepad);
if(CMPAD == NULL){
@ -1070,3 +1071,89 @@ bool ControllerPatcher::isRumbleActivated(){
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;
}

View File

@ -27,32 +27,11 @@
#ifndef _CONTROLLER_PATCHER_H_
#define _CONTROLLER_PATCHER_H_
#include <gctypes.h>
#include <string>
#include "./patcher/ControllerPatcherDefs.h"
#include "./utils/ControllerPatcherThread.hpp"
#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
#include <dynamic_libs/vpad_functions.h>
#include <dynamic_libs/padscore_functions.h>
#include "ControllerPatcherDefs.h"
class ControllerPatcher{
public:
@ -247,6 +226,24 @@ class ControllerPatcher{
static CONTROLLER_PATCHER_RESULT_OR_ERROR setNetworkControllerActivated(bool value);
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_ */

View File

@ -27,7 +27,8 @@
#ifndef _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

View 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_ */

View File

@ -15,6 +15,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
****************************************************************************/
#include "./ConfigParser.hpp"
#include <utils/StringTools.h>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
@ -22,7 +23,7 @@
ConfigParser::ConfigParser(std::string configData){
this->content = configData;
this->contentLines = CPStringTools::StringSplit(content, "\n");
this->contentLines = StringTools::stringSplit(content, "\n");
if(contentLines.empty()){
return;
@ -30,7 +31,7 @@ ConfigParser::ConfigParser(std::string configData){
//remove the comments and make everything uppercase
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()){
contentLines[i] = comments[0];
}
@ -122,7 +123,7 @@ bool ConfigParser::Init(){
void ConfigParser::parseSingleLine(std::string line){
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(HID_DEBUG || cur_values.size() > 2){ DEBUG_FUNCTION_LINE("Not a valid key=pair line %s\n",line.c_str()); }
return;
@ -198,7 +199,7 @@ void ConfigParser::parseSingleLine(std::string line){
if(!ConfigValues::getInstance()->setIfValueIsAControllerPreset(cur_values[1],getSlot(),keyslot)){
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){
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){
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){
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");
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][1] = (vid & 0x00FF);
config_controller[slot][CONTRPS_PID][0] = (pid & 0xFF00) >> 8;
@ -291,7 +292,7 @@ s32 ConfigParser::getSlotController(std::string identify){
}else{
if(slot < gHIDMaxDevices){
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");
}else{
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){
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(HID_DEBUG || string_value.size() > 2){ DEBUG_FUNCTION_LINE("Not a valid key=pair line %s\n",value_pair.c_str()); }
return -1;

View File

@ -19,7 +19,7 @@
#include <stdlib.h>
#include <string.h>
#include "utils/logger.h"
#include <utils/logger.h>
ConfigValues *ConfigValues::instance = NULL;
@ -106,18 +106,18 @@ s32 ConfigValues::getPresetValueEx(std::string possibleString){
}
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 result = "";
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()){
result = it->second;
}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;
}

View File

@ -22,11 +22,10 @@
#include <map>
#include <stdio.h>
#include <gctypes.h>
#include "../ControllerPatcher.hpp"
#include "../ControllerPatcherIncludes.hpp"
#include "utils/logger.h"
#include <utils/logger.h>
enum PARSE_TYPE{
PARSE_CONTROLLER,

View File

@ -20,11 +20,10 @@
#include <string>
#include <vector>
#include <map>
#include <gctypes.h>
#include "../ControllerPatcher.hpp"
#include "../ControllerPatcherIncludes.hpp"
#include "utils/logger.h"
#include <utils/logger.h>
class ConfigValues
{
@ -551,14 +550,14 @@ private:
gGamePadValuesToCONTRPSString["VPAD_STICK_L_EMULATION_UP"] = CONTRPS_VPAD_STICK_L_EMULATION_UP;
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[CPStringTools::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[CPStringTools::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[CPStringTools::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[CPStringTools::strfmt("%04X%04X",HID_SWITCH_PRO_VID,HID_SWITCH_PRO_PID).c_str()] = HID_SWITCH_PRO_STRING;
deviceNames[StringTools::strfmt("%04X%04X",HID_GC_VID, HID_GC_PID).c_str()] = HID_GC_STRING;
deviceNames[StringTools::strfmt("%04X%04X",HID_KEYBOARD_VID, HID_KEYBOARD_PID).c_str()] = HID_KEYBOARD_STRING;
deviceNames[StringTools::strfmt("%04X%04X",HID_MOUSE_VID, HID_MOUSE_PID).c_str()] = HID_MOUSE_STRING;
deviceNames[StringTools::strfmt("%04X%04X",HID_DS3_VID, HID_DS3_PID).c_str()] = HID_DS3_STRING;
deviceNames[StringTools::strfmt("%04X%04X",HID_NEW_DS4_VID, HID_NEW_DS4_PID).c_str()] = HID_NEW_DS4_STRING;
deviceNames[StringTools::strfmt("%04X%04X",HID_DS4_VID, HID_DS4_PID).c_str()] = HID_DS4_STRING;
deviceNames[StringTools::strfmt("%04X%04X",HID_XINPUT_VID, HID_XINPUT_PID).c_str()] = HID_XINPUT_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);

View File

@ -1,6 +1,6 @@
#include "ControllerPatcherNet.hpp"
#include "dynamic_libs/os_functions.h"
#include "dynamic_libs/socket_functions.h"
#include <dynamic_libs/os_functions.h>
#include <dynamic_libs/socket_functions.h>
s32 ControllerPatcherNet::recvwait(s32 sock, void *buffer, s32 len) {
s32 ret;

View File

@ -1,7 +1,7 @@
#ifndef _CONTROLLERPATCHERNET_H_
#define _CONTROLLERPATCHERNET_H_
#include<gctypes.h>
#include <dynamic_libs/os_types.h>
class ControllerPatcherNet{
friend class TCPServer;

View File

@ -19,11 +19,11 @@
#include <stdio.h>
#include <string.h>
#include "utils/logger.h"
#include <utils/logger.h>
#define wiiu_errno (*__gh_errno_ptr())
ControllerPatcherThread * TCPServer::pThread = NULL;
CThread * TCPServer::pThread = NULL;
TCPServer * TCPServer::instance = NULL;
TCPServer::TCPServer(s32 port){
@ -68,7 +68,7 @@ void TCPServer::StartTCPThread(TCPServer * server){
priority = 10;
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();
}
@ -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;
return args->DoTCPThreadInternal();
}

View File

@ -18,7 +18,7 @@
#include <stdio.h>
#include <string.h>
#include "utils/logger.h"
#include <utils/logger.h>
#define MAX_UDP_SIZE 0x578

View File

@ -17,11 +17,9 @@
#ifndef _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

View File

@ -19,13 +19,13 @@
#include <stdio.h>
#include <string.h>
#include "dynamic_libs/socket_functions.h"
#include "utils/logger.h"
#include <dynamic_libs/socket_functions.h>
#include <utils/logger.h>
#define MAX_UDP_SIZE 0x578
#define wiiu_errno (*__gh_errno_ptr())
ControllerPatcherThread * UDPServer::pThread = NULL;
CThread * UDPServer::pThread = NULL;
UDPServer * UDPServer::instance = NULL;
UDPServer::UDPServer(s32 port){
@ -47,7 +47,7 @@ UDPServer::UDPServer(s32 port){
}
UDPServer::~UDPServer(){
ControllerPatcherThread * pThreadPointer = UDPServer::pThread;
CThread * pThreadPointer = UDPServer::pThread;
if(pThreadPointer != NULL){
exitThread = 1;
if(pThreadPointer != NULL){
@ -74,7 +74,7 @@ void UDPServer::StartUDPThread(UDPServer * server){
priority = 10;
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();
}
@ -88,7 +88,7 @@ bool UDPServer::cpyIncrementBufferOffset(void * target, void * source, s32 * off
return true;
}
void UDPServer::DoUDPThread(ControllerPatcherThread *thread, void *arg){
void UDPServer::DoUDPThread(CThread *thread, void *arg){
UDPServer * args = (UDPServer * )arg;
args->DoUDPThreadInternal();
}

View File

@ -17,7 +17,7 @@
#ifndef _UDPSERVER_WINDOW_H_
#define _UDPSERVER_WINDOW_H_
#include "../ControllerPatcher.hpp"
#include "../ControllerPatcherIncludes.hpp"
#define DEFAULT_UDP_PORT 8113
@ -43,7 +43,7 @@ private:
UDPServer(s32 port);
~UDPServer();
void StartUDPThread(UDPServer * server);
static void DoUDPThread(ControllerPatcherThread *thread, void *arg);
static void DoUDPThread(CThread *thread, void *arg);
void DoUDPThreadInternal();
bool cpyIncrementBufferOffset(void * target, void * source, s32 * offset, s32 typesize, s32 maximum);
@ -51,7 +51,7 @@ private:
volatile s32 exitThread = 0;
static UDPServer *instance;
static ControllerPatcherThread *pThread;
static CThread *pThread;
};
#endif //_UDPSERVER_WINDOW_H_

View File

@ -17,10 +17,10 @@
#ifndef _TCPSERVER_WINDOW_H_
#define _TCPSERVER_WINDOW_H_
#include "../ControllerPatcher.hpp"
#include "../ControllerPatcherIncludes.hpp"
#include "dynamic_libs/socket_functions.h"
#include "dynamic_libs/os_functions.h"
#include <dynamic_libs/socket_functions.h>
#include <dynamic_libs/os_functions.h>
#define WIIU_CP_TCP_HANDSHAKE WIIU_CP_TCP_HANDSHAKE_VERSION_3
@ -72,7 +72,7 @@ private:
void ErrorHandling();
void StartTCPThread(TCPServer * server);
static void DoTCPThread(ControllerPatcherThread *thread, void *arg);
static void DoTCPThread(CThread *thread, void *arg);
void DoTCPThreadInternal();
static void DetachConnectedNetworkController();
static void AttachDetach(s32 attach);
@ -87,7 +87,7 @@ private:
volatile s32 exitThread = 0;
static ControllerPatcherThread *pThread;
static CThread *pThread;
};
#endif //_TCPSERVER_WINDOW_H_

View File

@ -19,11 +19,11 @@
#include <malloc.h>
#include <stdio.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
@ -562,7 +562,7 @@ std::vector<HID_Data *> ControllerPatcherHID::getHIDDataAll(){
s32 res;
HID_Data * new_data = NULL;
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;
}
if(new_data != NULL) data_list.push_back(new_data);

View File

@ -29,10 +29,10 @@
#include <vector>
#include "dynamic_libs/syshid_functions.h"
#include "dynamic_libs/vpad_functions.h"
#include <dynamic_libs/syshid_functions.h>
#include <dynamic_libs/vpad_functions.h>
#include "../ControllerPatcher.hpp"
#include "../ControllerPatcherIncludes.hpp"
#define SWAP16(x) ((x>>8) | ((x&0xFF)<<8))
#define SWAP8(x) ((x>>4) | ((x&0xF)<<4))

View File

@ -18,7 +18,7 @@
#include <math.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){
for(s32 i = 0;i< gHIDMaxDevices;i++){

View File

@ -27,12 +27,10 @@
#ifndef _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 "dynamic_libs/padscore_functions.h"
#include "../ControllerPatcher.hpp"
#include "../ControllerPatcherIncludes.hpp"
class ControllerPatcherUtils{
//give the other classes access to the private functions.

View File

@ -14,8 +14,8 @@
* You should have received a copy of the GNU General Public License
* 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")));
@ -62,7 +62,6 @@ wpad_connect_callback_t gKPADConnectCallback[4] __attribute__((section(".data"))
wpad_extension_callback_t gExtensionCallback[4] __attribute__((section(".data")));
wpad_sampling_callback_t gSamplingCallback __attribute__((section(".data"))) = 0;
u8 gCallbackCooldown __attribute__((section(".data"))) = 0;
u8 gAppStatus __attribute__((section(".data"))) = 0;
u8 gNetworkControllerActivated __attribute__((section(".data"))) = 1;
u8 gGlobalRumbleActivated __attribute__((section(".data"))) = 0;

View File

@ -17,9 +17,9 @@
#ifndef CP_RETAINS_VARS_H_
#define CP_RETAINS_VARS_H_
#include "dynamic_libs/syshid_functions.h"
#include "dynamic_libs/padscore_functions.h"
#include "../patcher/ControllerPatcherDefs.h"
#include <dynamic_libs/syshid_functions.h>
#include <dynamic_libs/padscore_functions.h>
#include "../ControllerPatcherDefs.h"
extern ControllerMapping gControllerMapping;
@ -67,7 +67,6 @@ extern wpad_extension_callback_t gExtensionCallback[4];
extern wpad_sampling_callback_t gSamplingCallback;
extern u8 gCallbackCooldown;
extern u8 gGlobalRumbleActivated;
extern u8 gAppStatus;
extern u8 gNetworkControllerActivated;
extern u32 gUDPClientip;

View File

@ -18,9 +18,9 @@
#ifndef _PAD_CONST_H_
#define _PAD_CONST_H_
#include <gctypes.h>
#include <string>
#include "../patcher/ControllerPatcherDefs.h"
#include "../ControllerPatcherDefs.h"
extern const u8 DEF_R_STICK;
extern const u8 DEF_L_STICK;

View File

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

View File

@ -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_ */

View File

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

View File

@ -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_ */

View File

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