From c1320079abd1226c647b883e9dc169cbf6801472 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 16:56:23 +0000 Subject: [PATCH 001/140] Directory structure --- 3DS/.gitkeep | 0 PC/.gitkeep | 0 README.md | 1 + 3 files changed, 1 insertion(+) create mode 100644 3DS/.gitkeep create mode 100644 PC/.gitkeep diff --git a/3DS/.gitkeep b/3DS/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/PC/.gitkeep b/PC/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md index b89c863..d22d1c8 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ 3DSController ============= +A 3DS homebrew application which allows you to use your 3DS as a wireless controller for Windows. \ No newline at end of file From e7f11f1b3aed0db5d23821a06418bb859ff015bd Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 20:00:27 +0000 Subject: [PATCH 002/140] 3DS --- 3DS/.gitkeep | 0 3DS/Makefile | 170 ++++++++++++++++++++++++++++++++++++++++ 3DS/include/inet_pton.h | 5 ++ 3DS/include/settings.h | 11 +++ 3DS/include/wireless.h | 46 +++++++++++ 3DS/source/inet_pton.c | 44 +++++++++++ 3DS/source/main.c | 64 +++++++++++++++ 3DS/source/settings.c | 40 ++++++++++ 3DS/source/wireless.c | 41 ++++++++++ 9 files changed, 421 insertions(+) delete mode 100644 3DS/.gitkeep create mode 100644 3DS/Makefile create mode 100644 3DS/include/inet_pton.h create mode 100644 3DS/include/settings.h create mode 100644 3DS/include/wireless.h create mode 100644 3DS/source/inet_pton.c create mode 100644 3DS/source/main.c create mode 100644 3DS/source/settings.c create mode 100644 3DS/source/wireless.c diff --git a/3DS/.gitkeep b/3DS/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/3DS/Makefile b/3DS/Makefile new file mode 100644 index 0000000..c4c758e --- /dev/null +++ b/3DS/Makefile @@ -0,0 +1,170 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITARM)/3ds_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# +# NO_SMDH: if set to anything, no SMDH file is generated. +# APP_TITLE is the name of the app stored in the SMDH file (Optional) +# APP_DESCRIPTION is the description of the app stored in the SMDH file (Optional) +# APP_AUTHOR is the author of the app stored in the SMDH file (Optional) +# ICON is the filename of the icon (.png), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .png +# - icon.png +# - /default_icon.png +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := source +DATA := data +INCLUDES := include + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=softfp + +CFLAGS := -g -Wall -O2 -mword-relocations \ + -fomit-frame-pointer -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM11 -D_3DS + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lctru -lm + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CTRULIB) + + +#--------------------------------------------------------------------------------- +# 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 OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +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)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +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) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.png) + ifneq (,$(findstring $(TARGET).png,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).png + else + ifneq (,$(findstring icon.png,$(icons))) + export APP_ICON := $(TOPDIR)/icon.png + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).smdh $(TARGET).elf + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +ifeq ($(strip $(NO_SMDH)),) +.PHONY: all +all : $(OUTPUT).3dsx $(OUTPUT).smdh +endif +$(OUTPUT).3dsx : $(OUTPUT).elf +$(OUTPUT).elf : $(OFILES) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +# WARNING: This is not the right way to do this! TODO: Do it right! +#--------------------------------------------------------------------------------- +%.vsh.o : %.vsh +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @python $(AEMSTRO)/aemstro_as.py $< ../$(notdir $<).shbin + @bin2s ../$(notdir $<).shbin | $(PREFIX)as -o $@ + @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(notdir $<).shbin | tr . _)`.h + @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(notdir $<).shbin | tr . _)`.h + @echo "extern const u32" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(notdir $<).shbin | tr . _)`.h + @rm ../$(notdir $<).shbin + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/3DS/include/inet_pton.h b/3DS/include/inet_pton.h new file mode 100644 index 0000000..c214c2e --- /dev/null +++ b/3DS/include/inet_pton.h @@ -0,0 +1,5 @@ +#pragma once + +#define INADDRSZ 4 + +int inet_pton4(const char *src, unsigned char *dst); diff --git a/3DS/include/settings.h b/3DS/include/settings.h new file mode 100644 index 0000000..91ea376 --- /dev/null +++ b/3DS/include/settings.h @@ -0,0 +1,11 @@ +#pragma once + +#include + +struct settings { + u8 IPParts[4]; +} settings; + +extern Handle fileHandle; + +bool readSettings(void); diff --git a/3DS/include/wireless.h b/3DS/include/wireless.h new file mode 100644 index 0000000..d5e5284 --- /dev/null +++ b/3DS/include/wireless.h @@ -0,0 +1,46 @@ +#pragma once + +#include + +#include <3ds.h> + +#include +#include +#include +#include +#include + +#include "inet_pton.h" + +//#define DEFAULT_IP { 192, 168, 0, 4 } +#define DEFAULT_PORT 8888 + +enum NET_COMMANDS { + CONNECT, + KEYS, +}; + +struct packet { + unsigned char command; + + unsigned int keys; + + struct { + short x; + short y; + } cstick; + + struct { + unsigned short x; + unsigned short y; + } touch; +}; + +extern int sock; +extern struct sockaddr_in sain, saout; +extern char outBuf[sizeof(struct packet)], rcvBuf[sizeof(struct packet)]; + +bool openSocket(int port); +void sendBuf(int length); +void sendConnectionRequest(void); +void sendKeys(unsigned int keys, circlePosition cstick, touchPosition touch); diff --git a/3DS/source/inet_pton.c b/3DS/source/inet_pton.c new file mode 100644 index 0000000..b402d26 --- /dev/null +++ b/3DS/source/inet_pton.c @@ -0,0 +1,44 @@ +#include "wireless.h" + +#include "inet_pton.h" + +int inet_pton4(const char *src, unsigned char *dst) { + static const char digits[] = "0123456789"; + int saw_digit, octets, ch; + unsigned char tmp[INADDRSZ], *tp; + + saw_digit = 0; + octets = 0; + tp = tmp; + *tp = 0; + while((ch = *src++) != '\0') { + const char *pch; + + if((pch = strchr(digits, ch)) != NULL) { + unsigned int val = *tp * 10 + (unsigned int)(pch - digits); + + if(saw_digit && *tp == 0) + return (0); + if(val > 255) + return (0); + *tp = (unsigned char)val; + if(! saw_digit) { + if(++octets > 4) + return (0); + saw_digit = 1; + } + } + else if(ch == '.' && saw_digit) { + if(octets == 4) + return (0); + *++tp = 0; + saw_digit = 0; + } + else + return (0); + } + if(octets < 4) + return (0); + memcpy(dst, tmp, INADDRSZ); + return (1); +} diff --git a/3DS/source/main.c b/3DS/source/main.c new file mode 100644 index 0000000..8560ea7 --- /dev/null +++ b/3DS/source/main.c @@ -0,0 +1,64 @@ +#include +#include +#include + +#include <3ds.h> + +#include "wireless.h" +#include "settings.h" + +int main(void) { + srvInit(); + aptInit(); + hidInit(NULL); + //irrstInit(NULL); + gfxInit(); + gfxSet3D(false); + + fsInit(); + + SOC_Initialize((u32 *)memalign(0x1000, 0x100000), 0x100000); + + if(!readSettings()) goto exit; + + int port = DEFAULT_PORT; + + openSocket(port); + sendConnectionRequest(); + + while(aptMainLoop()) { + gspWaitForVBlank(); + hidScanInput(); + //irrstScanInput(); + + u32 kHeld = hidKeysHeld(); + circlePosition cstick; + //hidCstickRead(&cstick); + hidCircleRead(&cstick); + touchPosition touch; + touchRead(&touch); + + if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) break; + //if(cstick.dx || cstick.dy) break; + + sendKeys(kHeld, cstick, touch); + + gfxFlushBuffers(); + gfxSwapBuffers(); + } + + exit: + + SOC_Shutdown(); + + svcCloseHandle(fileHandle); + fsExit(); + + gfxExit(); + //irrstExit(); + hidExit(); + aptExit(); + srvExit(); + + return 0; +} diff --git a/3DS/source/settings.c b/3DS/source/settings.c new file mode 100644 index 0000000..6026b7a --- /dev/null +++ b/3DS/source/settings.c @@ -0,0 +1,40 @@ +#include <3ds.h> +#include + +#include "wireless.h" + +#include "settings.h" + +Handle fileHandle; + +bool readSettings(void) { + u8 *buffer = NULL; + u64 size; + u32 bytesRead; + + FS_archive sdmcArchive = (FS_archive){ARCH_SDMC, (FS_path){PATH_EMPTY, 1, (u8*)""}}; + FS_path filePath = FS_makePath(PATH_CHAR, "/3DSController.ini"); + + Result ret = FSUSER_OpenFileDirectly(NULL, &fileHandle, sdmcArchive, filePath, FS_OPEN_READ, FS_ATTRIBUTE_NONE); + if(ret) return false; + + ret = FSFILE_GetSize(fileHandle, &size); + if(ret) return false; + + //buffer = linearAlloc(size); + buffer = malloc(size); + if(!buffer) return false; + + ret = FSFILE_Read(fileHandle, &bytesRead, 0x0, buffer, size); + if(ret || size!=bytesRead) return false; + + ret = FSFILE_Close(fileHandle); + if(ret) return false; + + //inet_pton(AF_INET, buffer, &(saout.sin_addr)); + inet_pton4((const char *)buffer, (unsigned char *)&(saout.sin_addr)); + + free(buffer); + + return true; +} diff --git a/3DS/source/wireless.c b/3DS/source/wireless.c new file mode 100644 index 0000000..bc88dd4 --- /dev/null +++ b/3DS/source/wireless.c @@ -0,0 +1,41 @@ +#include "wireless.h" + +int sock; +struct sockaddr_in sain, saout; +char outBuf[sizeof(struct packet)], rcvBuf[sizeof(struct packet)]; + +bool openSocket(int port) { + sock = socket(AF_INET, SOCK_DGRAM, 0); + + saout.sin_family = sain.sin_family = AF_INET; + saout.sin_port = sain.sin_port = htons(port); + sain.sin_addr.s_addr = INADDR_ANY; + + bind(sock, (struct sockaddr *)&sain, sizeof(sain)); + + fcntl(sock, F_SETFL, O_NONBLOCK); + + return true; +} + +void sendBuf(int length) { + sendto(sock, outBuf, length, 0, (struct sockaddr *)&saout, sizeof(saout)); +} + +void sendConnectionRequest(void) { + outBuf[0] = CONNECT; + sendBuf(1); +} + +void sendKeys(unsigned int keys, circlePosition cstick, touchPosition touch) { + outBuf[0] = KEYS; + //memcpy(outBuf + 1, &keys, 4); + //memcpy(outBuf + 5, &cstick, 4); + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wstrict-aliasing" + memcpy(&((struct packet *)outBuf)->keys, &keys, 4); + memcpy(&((struct packet *)outBuf)->cstick, &cstick, 4); + memcpy(&((struct packet *)outBuf)->touch, &touch, 4); + sendBuf(sizeof(struct packet)); + #pragma GCC diagnostic pop +} From ec13bfbbca170b4263904ed0ec7812f9308a66ab Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 20:00:35 +0000 Subject: [PATCH 003/140] .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b9b9bd6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +3DS/build/ +3DS/*.elf +3DS/*.3dsx From deb743ae0f9b64d466b60520786a4c2bb7fa91fd Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 20:03:50 +0000 Subject: [PATCH 004/140] PC --- PC/.gitkeep | 0 PC/Makefile | 37 ++++++++ PC/include/general.h | 5 ++ PC/include/joystick.h | 17 ++++ PC/include/keys.h | 66 ++++++++++++++ PC/include/public.h | 172 +++++++++++++++++++++++++++++++++++++ PC/include/vjoyinterface.h | 73 ++++++++++++++++ PC/include/wireless.h | 47 ++++++++++ PC/lib/vJoyInterface.lib | Bin 0 -> 6720 bytes PC/source/general.c | 18 ++++ PC/source/joystick.c | 39 +++++++++ PC/source/keys.c | 34 ++++++++ PC/source/main.c | 111 ++++++++++++++++++++++++ PC/source/wireless.c | 58 +++++++++++++ PC/vJoyInterface.dll | Bin 0 -> 28160 bytes 15 files changed, 677 insertions(+) delete mode 100644 PC/.gitkeep create mode 100644 PC/Makefile create mode 100644 PC/include/general.h create mode 100644 PC/include/joystick.h create mode 100644 PC/include/keys.h create mode 100644 PC/include/public.h create mode 100644 PC/include/vjoyinterface.h create mode 100644 PC/include/wireless.h create mode 100644 PC/lib/vJoyInterface.lib create mode 100644 PC/source/general.c create mode 100644 PC/source/joystick.c create mode 100644 PC/source/keys.c create mode 100644 PC/source/main.c create mode 100644 PC/source/wireless.c create mode 100644 PC/vJoyInterface.dll diff --git a/PC/.gitkeep b/PC/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/PC/Makefile b/PC/Makefile new file mode 100644 index 0000000..d669ccf --- /dev/null +++ b/PC/Makefile @@ -0,0 +1,37 @@ +CC := gcc +ODIR := build +SDIR := source +IDIR := include +LDIR := lib +CFLAGS := -I$(IDIR) -fms-extensions -O2 -Wall +LFLAGS := -L$(LDIR) -lvJoyInterface -lws2_32 +CFILES := $(wildcard $(SDIR)/*.c) +OBJS := $(patsubst $(SDIR)/%.c, build/%.o, $(wildcard $(SDIR)/*.c)) + +PLATFORM = $(shell uname) + +ifeq ($(findstring Linux,$(PLATFORM)),Linux) + TARGET=$(shell basename $(CURDIR)) +endif + +ifeq ($(findstring Darwin,$(PLATFORM)),Darwin) + TARGET=$(shell basename $(CURDIR)) +endif + +ifeq ($(findstring MINGW,$(PLATFORM)),MINGW) + TARGET=$(shell basename $(CURDIR)).exe +endif + +$(TARGET): $(ODIR) $(OBJS) + $(CC) $(ODIR)/*.o -o $(TARGET) $(CFLAGS) $(LFLAGS) + +$(ODIR)/%.o: $(SDIR)/%.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(ODIR): + @mkdir $@ + +.PHONY: clean + +clean: + rm -f $(TARGET) $(ODIR)/*.o diff --git a/PC/include/general.h b/PC/include/general.h new file mode 100644 index 0000000..2b7622f --- /dev/null +++ b/PC/include/general.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +void error(const char *functionName); diff --git a/PC/include/joystick.h b/PC/include/joystick.h new file mode 100644 index 0000000..5518b17 --- /dev/null +++ b/PC/include/joystick.h @@ -0,0 +1,17 @@ +#pragma once + +#ifndef WINVER + #define WINVER 0x0500 +#endif + +#include + +#include "public.h" +#include "vjoyinterface.h" + +extern int ContPovNumber; +extern UINT iInterface; +extern BOOL ContinuousPOV; + +void updateJoystick(int x, int y); + diff --git a/PC/include/keys.h b/PC/include/keys.h new file mode 100644 index 0000000..abb10c0 --- /dev/null +++ b/PC/include/keys.h @@ -0,0 +1,66 @@ +#pragma once + +#include + +#define MAPVK_VK_TO_VSC 0 + +#define newpress(key) ((currentKeys & key) && !(lastKeys & key)) +#define release(key) (!(currentKeys & key) && (lastKeys & key)) + +#define handleKey(DSKey, PCKey) if(newpress(DSKey)) simulateKeyNewpress(PCKey);\ +if(release(DSKey)) simulateKeyRelease(PCKey) + +#define BIT(n) (1 << (n)) + +typedef enum { + KEY_A = BIT(0), + KEY_B = BIT(1), + KEY_SELECT = BIT(2), + KEY_START = BIT(3), + KEY_DRIGHT = BIT(4), + KEY_DLEFT = BIT(5), + KEY_DUP = BIT(6), + KEY_DDOWN = BIT(7), + KEY_R = BIT(8), + KEY_L = BIT(9), + KEY_X = BIT(10), + KEY_Y = BIT(11), + KEY_ZL = BIT(14), // (new 3DS only) + KEY_ZR = BIT(15), // (new 3DS only) + KEY_TOUCH = BIT(20), // Not actually provided by HID + KEY_CSTICK_RIGHT = BIT(24), // c-stick (new 3DS only) + KEY_CSTICK_LEFT = BIT(25), // c-stick (new 3DS only) + KEY_CSTICK_UP = BIT(26), // c-stick (new 3DS only) + KEY_CSTICK_DOWN = BIT(27), // c-stick (new 3DS only) + KEY_CPAD_RIGHT = BIT(28), // circle pad + KEY_CPAD_LEFT = BIT(29), // circle pad + KEY_CPAD_UP = BIT(30), // circle pad + KEY_CPAD_DOWN = BIT(31), // circle pad + + // Generic catch-all directions + KEY_UP = KEY_DUP | KEY_CPAD_UP, + KEY_DOWN = KEY_DDOWN | KEY_CPAD_DOWN, + KEY_LEFT = KEY_DLEFT | KEY_CPAD_LEFT, + KEY_RIGHT = KEY_DRIGHT | KEY_CPAD_RIGHT, +} KEYPAD_BITS; + +struct cstick { + short x; + short y; +}; + +struct touch { + short x; + short y; +}; + +extern unsigned int lastKeys; +extern unsigned int currentKeys; + +extern struct cstick cstick; +extern struct touch lastTouch; +extern struct touch currentTouch; + +inline unsigned int mapVirtualKey(unsigned int key); +void simulateKeyNewpress(unsigned int key); +void simulateKeyRelease(unsigned int key); diff --git a/PC/include/public.h b/PC/include/public.h new file mode 100644 index 0000000..38342a8 --- /dev/null +++ b/PC/include/public.h @@ -0,0 +1,172 @@ +#pragma once + +// Compilation directives +#define PPJOY_MODE +#undef PPJOY_MODE // Comment-out for compatibility mode + +#ifdef PPJOY_MODE +#include "PPJIoctl.h" +#endif + +#include // Definitions for controlling GUID initialization + +// Sideband comunication with vJoy Device +//{781EF630-72B2-11d2-B852-00C04FAD5101} +DEFINE_GUID(GUID_DEVINTERFACE_VJOY, 0x781EF630, 0x72B2, 0x11d2, 0xB8, 0x52, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x01); + +// +// Usage example: +// CreateFile(TEXT("\\\\.\\vJoy"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); +#ifdef PPJOY_MODE +#define DEVICENAME_STRING "PPJoyIOCTL1" +#else +#define DEVICENAME_STRING "vJoy" +#endif +#define NTDEVICE_NAME_STRING "\\Device\\"DEVICENAME_STRING +#define SYMBOLIC_NAME_STRING "\\DosDevices\\"DEVICENAME_STRING +#define DOS_FILE_NAME "\\\\.\\"DEVICENAME_STRING +#define VJOY_INTERFACE L"Device_" + +// Version parts +#define VER_X_ 0 +#define VER_H_ 2 +#define VER_M_ 0 +#define VER_L_ 4 + +#define STRINGIFY_1(x) #x +#define STRINGIFY(x) STRINGIFY_1(x) +#define PASTE(x, y) x##y +#define MAKEWIDE(x) PASTE(L,x) + +// Device Attributes +// +#define VENDOR_N_ID 0x1234 +#define PRODUCT_N_ID 0xBEAD +#define VERSION_N (VER_L_ + 0x10*VER_M_ + 0x100*VER_H_ + 0x1000*VER_X_) + +// Device Strings +// +#define VENDOR_STR_ID L"Shaul Eizikovich" +#define PRODUCT_STR_ID L"vJoy - Virtual Joystick" +#define SERIALNUMBER_STR MAKEWIDE(STRINGIFY(VER_H_)) L"." MAKEWIDE(STRINGIFY(VER_M_)) L"." MAKEWIDE(STRINGIFY(VER_L_)) + +// Function codes; +#define LOAD_POSITIONS 0x910 +#define GETATTRIB 0x911 + + +// IO Device Control codes; +#define IOCTL_VJOY_GET_ATTRIB CTL_CODE (FILE_DEVICE_UNKNOWN, GETATTRIB, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#ifndef __HIDPORT_H__ +// Copied from hidport.h +typedef struct _HID_DEVICE_ATTRIBUTES { + + ULONG Size; + // + // sizeof (struct _HID_DEVICE_ATTRIBUTES) + // + + // + // Vendor ids of this hid device + // + USHORT VendorID; + USHORT ProductID; + USHORT VersionNumber; + USHORT Reserved[11]; + +} HID_DEVICE_ATTRIBUTES, * PHID_DEVICE_ATTRIBUTES; +#endif + +// Error levels for status report +enum ERRLEVEL {INFO, WARN, ERR, FATAL, APP}; +// Status report function prototype +#ifdef WINAPI +typedef BOOL (WINAPI *StatusMessageFunc)(void * output, TCHAR * buffer, enum ERRLEVEL level); +#endif + +/////////////////////////////////////////////////////////////// + +/////////////////////// Joystick Position /////////////////////// +// +// This structure holds data that is passed to the device from +// an external application such as SmartPropoPlus. +// +// Usage example: +// JOYSTICK_POSITION iReport; +// : +// DeviceIoControl (hDevice, 100, &iReport, sizeof(HID_INPUT_REPORT), NULL, 0, &bytes, NULL) +typedef struct _JOYSTICK_POSITION +{ + BYTE bDevice; // Index of device. 1-based. + LONG wThrottle; + LONG wRudder; + LONG wAileron; + LONG wAxisX; + LONG wAxisY; + LONG wAxisZ; + LONG wAxisXRot; + LONG wAxisYRot; + LONG wAxisZRot; + LONG wSlider; + LONG wDial; + LONG wWheel; + LONG wAxisVX; + LONG wAxisVY; + LONG wAxisVZ; + LONG wAxisVBRX; + LONG wAxisVBRY; + LONG wAxisVBRZ; + LONG lButtons; // 32 buttons: 0x00000001 means button1 is pressed, 0x80000000 -> button32 is pressed + DWORD bHats; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + DWORD bHatsEx1; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + DWORD bHatsEx2; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + DWORD bHatsEx3; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch +} JOYSTICK_POSITION, *PJOYSTICK_POSITION; + +// Superset of JOYSTICK_POSITION +// Extension of JOYSTICK_POSITION with Buttons 33-128 appended to the end of the structure. +typedef struct _JOYSTICK_POSITION_V2 +{ + /// JOYSTICK_POSITION + BYTE bDevice; // Index of device. 1-based. + LONG wThrottle; + LONG wRudder; + LONG wAileron; + LONG wAxisX; + LONG wAxisY; + LONG wAxisZ; + LONG wAxisXRot; + LONG wAxisYRot; + LONG wAxisZRot; + LONG wSlider; + LONG wDial; + LONG wWheel; + LONG wAxisVX; + LONG wAxisVY; + LONG wAxisVZ; + LONG wAxisVBRX; + LONG wAxisVBRY; + LONG wAxisVBRZ; + LONG lButtons; // 32 buttons: 0x00000001 means button1 is pressed, 0x80000000 -> button32 is pressed + DWORD bHats; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + DWORD bHatsEx1; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + DWORD bHatsEx2; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + DWORD bHatsEx3; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch LONG lButtonsEx1; // Buttons 33-64 + /// JOYSTICK_POSITION_V2 Extenssion + LONG lButtonsEx1; // Buttons 33-64 + LONG lButtonsEx2; // Buttons 65-96 + LONG lButtonsEx3; // Buttons 97-128 +} JOYSTICK_POSITION_V2, *PJOYSTICK_POSITION_V2; + +// HID Descriptor definitions +#define HID_USAGE_X 0x30 +#define HID_USAGE_Y 0x31 +#define HID_USAGE_Z 0x32 +#define HID_USAGE_RX 0x33 +#define HID_USAGE_RY 0x34 +#define HID_USAGE_RZ 0x35 +#define HID_USAGE_SL0 0x36 +#define HID_USAGE_SL1 0x37 +#define HID_USAGE_WHL 0x38 +#define HID_USAGE_POV 0x39 diff --git a/PC/include/vjoyinterface.h b/PC/include/vjoyinterface.h new file mode 100644 index 0000000..4a53b8f --- /dev/null +++ b/PC/include/vjoyinterface.h @@ -0,0 +1,73 @@ +// The following ifdef block is the standard way of creating macros which make exporting +// from a DLL simpler. All files within this DLL are compiled with the VJOYINTERFACE_EXPORTS +// symbol defined on the command line. this symbol should not be defined on any project +// that uses this DLL. This way any other project whose source files include this file see +// VJOYINTERFACE_API functions as being imported from a DLL, whereas this DLL sees symbols +// defined with this macro as being exported. +#ifdef VJOYINTERFACE_EXPORTS +#define VJOYINTERFACE_API __declspec(dllexport) +#else +#define VJOYINTERFACE_API __declspec(dllimport) +#endif + +///////////////////////////// vJoy device (collection) status //////////////////////////////////////////// +#ifndef VJDSTAT +#define VJDSTAT +enum VjdStat /* Declares an enumeration data type called BOOLEAN */ +{ + VJD_STAT_OWN, // The vJoy Device is owned by this application. + VJD_STAT_FREE, // The vJoy Device is NOT owned by any application (including this one). + VJD_STAT_BUSY, // The vJoy Device is owned by another application. It cannot be acquired by this application. + VJD_STAT_MISS, // The vJoy Device is missing. It either does not exist or the driver is down. + VJD_STAT_UNKN // Unknown +}; +#endif +///////////////////////////// vJoy device (collection) Control interface ///////////////////////////////// +/* + These functions allow writing feeders and other applications that interface with vJoy + It is assumed that only one vJoy top-device (= Raw PDO) exists. + This top-level device can have up to 16 siblings (=top-level Reports/collections) + Each sibling is refered to as a "vJoy Device" and is attributed a unique Report ID (Range: 1-16). + + Naming convetion: + VJD = vJoy Device + rID = Report ID +*/ + +///// General driver data +VJOYINTERFACE_API SHORT __cdecl GetvJoyVersion(void); +VJOYINTERFACE_API BOOL __cdecl vJoyEnabled(void); +VJOYINTERFACE_API PVOID __cdecl GetvJoyProductString(void); +VJOYINTERFACE_API PVOID __cdecl GetvJoyManufacturerString(void); +VJOYINTERFACE_API PVOID __cdecl GetvJoySerialNumberString(void); + + +///// vJoy Device properties +VJOYINTERFACE_API int __cdecl GetVJDButtonNumber(UINT rID); // Get the number of buttons defined in the specified VDJ +VJOYINTERFACE_API int __cdecl GetVJDDiscPovNumber(UINT rID); // Get the number of descrete-type POV hats defined in the specified VDJ +VJOYINTERFACE_API int __cdecl GetVJDContPovNumber(UINT rID); // Get the number of descrete-type POV hats defined in the specified VDJ +VJOYINTERFACE_API BOOL __cdecl GetVJDAxisExist(UINT rID, UINT Axis); // Test if given axis defined in the specified VDJ +VJOYINTERFACE_API BOOL __cdecl GetVJDAxisMax(UINT rID, UINT Axis, LONG * Max); // Get logical Maximum value for a given axis defined in the specified VDJ +VJOYINTERFACE_API BOOL __cdecl GetVJDAxisMin(UINT rID, UINT Axis, LONG * Min); // Get logical Minimum value for a given axis defined in the specified VDJ + +///// Write access to vJoy Device - Basic +VJOYINTERFACE_API BOOL __cdecl AcquireVJD(UINT rID); // Acquire the specified vJoy Device. +VJOYINTERFACE_API VOID __cdecl RelinquishVJD(UINT rID); // Relinquish the specified vJoy Device. +VJOYINTERFACE_API BOOL __cdecl UpdateVJD(UINT rID, PVOID pData); // Update the position data of the specified vJoy Device. +VJOYINTERFACE_API enum VjdStat __cdecl GetVJDStatus(UINT rID); // Get the status of the specified vJoy Device. + +///// Write access to vJoy Device - Modifyiers +// This group of functions modify the current value of the position data +// They replace the need to create a structure of position data then call UpdateVJD + +//// Reset functions +VJOYINTERFACE_API BOOL __cdecl ResetVJD(UINT rID); // Reset all controls to predefined values in the specified VDJ +VJOYINTERFACE_API VOID __cdecl ResetAll(void); // Reset all controls to predefined values in all VDJ +VJOYINTERFACE_API BOOL __cdecl ResetButtons(UINT rID); // Reset all buttons (To 0) in the specified VDJ +VJOYINTERFACE_API BOOL __cdecl ResetPovs(UINT rID); // Reset all POV Switches (To -1) in the specified VDJ + +// Write data +VJOYINTERFACE_API BOOL __cdecl SetAxis(LONG Value, UINT rID, UINT Axis); // Write Value to a given axis defined in the specified VDJ +VJOYINTERFACE_API BOOL __cdecl SetBtn(BOOL Value, UINT rID, UCHAR nBtn); // Write Value to a given button defined in the specified VDJ +VJOYINTERFACE_API BOOL __cdecl SetDiscPov(int Value, UINT rID, UCHAR nPov); // Write Value to a given descrete POV defined in the specified VDJ +VJOYINTERFACE_API BOOL __cdecl SetContPov(DWORD Value, UINT rID, UCHAR nPov); // Write Value to a given continuous POV defined in the specified VDJ \ No newline at end of file diff --git a/PC/include/wireless.h b/PC/include/wireless.h new file mode 100644 index 0000000..ae894e3 --- /dev/null +++ b/PC/include/wireless.h @@ -0,0 +1,47 @@ +#pragma once + +#ifndef WINVER + #define WINVER 0x0500 +#endif + +#include +#include + +#define IP INADDR_ANY +#define PORT 8888 + +enum NET_COMMANDS { + CONNECT, + KEYS, +}; + +struct packet { + unsigned char command; + + unsigned int keys; + + struct { + short x; + short y; + } cstick; + + struct { + unsigned short x; + unsigned short y; + } touch; +}; + +extern SOCKET listener; +extern SOCKET client; + +extern struct sockaddr_in client_in; + +extern int sockaddr_in_sizePtr; + +extern char buffer[sizeof(struct packet)]; +extern char hostName[80]; + +void initNetwork(void); +void startListening(void); +void sendBuffer(int length); +int receiveBuffer(int length); diff --git a/PC/lib/vJoyInterface.lib b/PC/lib/vJoyInterface.lib new file mode 100644 index 0000000000000000000000000000000000000000..7752ec4c6bf40375a330f122f71d80e7cd6d2024 GIT binary patch literal 6720 zcmcIo%}*Og6n{1e5C?*>`7jA>oi-};P(E!6QbmD)0tsKT4aaVby@Zv(ruI5Y)kwYM z5Jf%bZ-}C**Gf5Yh@u>$sD~c%2lSLfPPwJ;&BuCXcWqe3tn@rPZ{E&tX5O3Myz%uP z^OeHEd}KVSKa;76>ACdW!S9+Kx5};VY~C@J7juhXWXwaW^h?dE9_-#;#%`>mW5cc7 zIWFdHQ)yQew@jN5cFjuFDwkvjZmpuM8UY~)KdoSxN^dkwzzGsu`#(_X6CcDYoQBh+=Qwq3rjH*-bSv=<*(PK#5;mnGX- z9a+P2*{T-sQ;DQ%@cm}FWb3Uija5ajtRSL|m|6wb0GqOQ-mW>r@zb%7wvJ64obt*o zX)3I9IXsWLuGq*w@LDmYVq-Z=;8OA`Uv};=y)(UqTZ^UhGj}y{d$DwW_P$LN)+?p_ z-l16pw%eS_VgWZyMcojphQ)`nS?YE6ws?3b=jPOdbKa!Gc}NhjiY)V_3*dD(!1F$U zM+tygESKT{FJk~NuzcJP@Db%LGT8hevJ2Wg!}0@`Ikedu0(jbk>=^}ki1HrgT`xcp zMjCSKuOqARNd( z3NaW0{@VtIy1Mni5s_I}_(dCU^$Q=D&$*#*;K)scCKMA*7{{N({Afn><!hMmYj zDy}Mg#A=*s*eeS&BnnPC_`+C5We$9II7Xpu?@4ji14SGWs!#Z#!B?;eXZTZun-g?j zsa?A~rZ&0!rZ!3MIl4wZ)C^pn)Y|;~sTnw4Ge!=6ynhi zY@uH1q0x@KifvehO1WCzx09op?~?0ln|D~N`v;E-_9gWI$k>3~jdYJpO>Z7BSSXZ_ zj&a~4uYQA1pCl@MM-PoO408Sp0Br0BQp09S<7|_f6xpBx9Gi4qL;7#&M?BO!z)zw^ zMHqg@-}B3fgGSI)`Ueqf6hUDYK__gS_ygb@L74Juj}k%CvVkJ#PgxNqMbLRh##uc5 z1&*cReIpWh_2wp()#LjQFGuKQ_V}(|ll@1j3416yY5%E@vj0+2Pj>&xiYU)xmCv%W z-yr@eWEpsU(+(ff{g`&|dWbmgOE%X|ExYpW{Gi@Ur-d_-O;t3SSqNFmaAyf#$lx=a z_Q$-Am|-20Qjl{-Y;z%Ee$xs><;+vpm6-BE9Z^f3ys&}2Ip@E!BZzvjj;beSUfAFs zZGzig$JMjGR^U$g&o_zl?Wp65l+p_rbbV(U?3V8luT$U=iqDn93m$ltXBsfWD576d z(Dhu{3*5?CM-*J2JlhK%c-HBZzmLDhSzlJrWfJd&3_9O*6MpI85Cd#h(_zHbCKxpb+yajm8W;f{IvHy-+fYxkw2|^ + +#include "joystick.h" + +int ContPovNumber; +UINT iInterface = 1; +BOOL ContinuousPOV = FALSE; + +void updateJoystick(int x, int y) { + BYTE id = (BYTE)iInterface; + JOYSTICK_POSITION iReport; + + iReport.bDevice = id; + + iReport.wAxisX = x; + iReport.wAxisY = y; + iReport.wAxisZ = 0; + iReport.wAxisZRot = 0; + iReport.wAxisXRot = 0; + + iReport.lButtons = 0; + + if(ContPovNumber) { + iReport.bHats = -1; // Neutral state + iReport.bHatsEx1 = -1; // Neutral state + iReport.bHatsEx2 = -1; // Neutral state + iReport.bHatsEx3 = -1; // Neutral state + } + else { + iReport.bHats = -1; // Neutral state + }; + + if(!UpdateVJD(iInterface, (PVOID)&iReport)) { + printf("vJoy device %d failed - try to enable device then press enter\n", iInterface); + getchar(); + AcquireVJD(iInterface); + ContinuousPOV = (BOOL)GetVJDContPovNumber(iInterface); + } +} diff --git a/PC/source/keys.c b/PC/source/keys.c new file mode 100644 index 0000000..ac60531 --- /dev/null +++ b/PC/source/keys.c @@ -0,0 +1,34 @@ +#include "keys.h" + +unsigned int lastKeys; +unsigned int currentKeys; + +struct cstick cstick; +struct touch lastTouch; +struct touch currentTouch; + +inline unsigned int mapVirtualKey(unsigned int key) { + return MapVirtualKey(key, MAPVK_VK_TO_VSC); +} + +void simulateKeyNewpress(unsigned int key) { + INPUT ip; + ip.type = INPUT_KEYBOARD; + ip.ki.wScan = mapVirtualKey(key); + ip.ki.time = 0; + ip.ki.dwExtraInfo = 0; + ip.ki.wVk = 0; + ip.ki.dwFlags = KEYEVENTF_SCANCODE; + SendInput(1, &ip, sizeof(INPUT)); +} + +void simulateKeyRelease(unsigned int key) { + INPUT ip; + ip.type = INPUT_KEYBOARD; + ip.ki.wScan = mapVirtualKey(key); + ip.ki.time = 0; + ip.ki.dwExtraInfo = 0; + ip.ki.wVk = 0; + ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; + SendInput(1, &ip, sizeof(INPUT)); +} diff --git a/PC/source/main.c b/PC/source/main.c new file mode 100644 index 0000000..4b2e5ac --- /dev/null +++ b/PC/source/main.c @@ -0,0 +1,111 @@ +// 3DS Controller Server + +#define VERSION 0.01 + +#include +#include + +#include "wireless.h" +#include "keys.h" +#include "general.h" +#include "joystick.h" + +int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) { + printf("3DS Controller Server %.2f\n", VERSION); + + UINT iInterface = 1; + if(!vJoyEnabled()) { + printf("vJoy failed! Buttons will still work, but control stick won't work.\n"); + } + + enum VjdStat status = GetVJDStatus(iInterface); + if((status == VJD_STAT_OWN) || ((status == VJD_STAT_FREE) && (!AcquireVJD(iInterface)))) { + printf("vJoy failed (2)! Buttons will still work, but control stick won't work.\n"); + } + + ContPovNumber = GetVJDContPovNumber(iInterface); + //int DiscPovNumber = GetVJDDiscPovNumber(iInterface); + + initNetwork(); + + printf("Running on: %s\n\n", hostName); + + startListening(); + + while(1) { + ZeroMemory(buffer, sizeof(struct packet)); + + while(receiveBuffer(sizeof(struct packet)) <= 0) { + // Waiting + } + + switch(buffer[0]) { + case CONNECT: + lastKeys = 0; + currentKeys = 0; + cstick.x = 0; + cstick.y = 0; + lastTouch.x = 0; + lastTouch.y = 0; + currentTouch.x = 0; + currentTouch.y = 0; + + buffer[0] = CONNECT; + printf("3DS Connected!\n"); + + Sleep(50); + sendBuffer(1); + + Sleep(50); + sendBuffer(1); + + Sleep(50); + sendBuffer(1); + break; + + case KEYS: + lastKeys = currentKeys; + if(currentKeys & KEY_TOUCH) lastTouch = currentTouch; + + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wstrict-aliasing" + memcpy(¤tKeys, &((struct packet *)buffer)->keys, 4); + memcpy(&cstick, &((struct packet *)buffer)->cstick, 4); + memcpy(¤tTouch, &((struct packet *)buffer)->touch, 4); + #pragma GCC diagnostic pop + + handleKey(KEY_A, 'A'); + handleKey(KEY_B, 'B'); + handleKey(KEY_SELECT, VK_BACK); + handleKey(KEY_START, VK_RETURN); + handleKey(KEY_DRIGHT, VK_RIGHT); + handleKey(KEY_DLEFT, VK_LEFT); + handleKey(KEY_DUP, VK_UP); + handleKey(KEY_DDOWN, VK_DOWN); + handleKey(KEY_R, 'R'); + handleKey(KEY_L, 'L'); + handleKey(KEY_X, 'X'); + handleKey(KEY_Y, 'Y'); + + //handleKey(KEY_TOUCH, VK_LBUTTON); + //handleKey(KEY_LID, 'I'); + + if(newpress(KEY_TOUCH)) { + lastTouch.x = currentTouch.x; + lastTouch.y = currentTouch.y; + } + + if(currentKeys & KEY_TOUCH) { + POINT p; + GetCursorPos(&p); + SetCursorPos(p.x + (currentTouch.x - lastTouch.x), p.y + (currentTouch.y - lastTouch.y)); + } + + updateJoystick((cstick.x + 128) * 128, (128 - cstick.y) * 128); + break; + } + } + + error("accept()"); + return 0; +} diff --git a/PC/source/wireless.c b/PC/source/wireless.c new file mode 100644 index 0000000..1f9d1f3 --- /dev/null +++ b/PC/source/wireless.c @@ -0,0 +1,58 @@ +#include "general.h" + +#include "wireless.h" + +SOCKET listener; +SOCKET client; + +struct sockaddr_in client_in; + +int sockaddr_in_sizePtr = (int)sizeof(struct sockaddr_in); + +char buffer[sizeof(struct packet)]; +char hostName[80]; + +void initNetwork(void) { + WSADATA wsaData; + + WSAStartup(MAKEWORD(2, 2), &wsaData); + + if(gethostname(hostName, sizeof(hostName)) == SOCKET_ERROR) { + error("gethostname()"); + } +} + +void startListening(void) { + int nret; + + listener = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + + if(listener == INVALID_SOCKET) { + error("socket()"); + } + + SOCKADDR_IN serverInfo; + + serverInfo.sin_family = AF_INET; + serverInfo.sin_addr.s_addr = IP; + serverInfo.sin_port = htons(PORT); + + u_long one = 1; + ioctlsocket(listener, FIONBIO, &one); + + nret = bind(listener, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr)); + + if(nret == SOCKET_ERROR) { + error("bind()"); + } +} + +void sendBuffer(int length) { + if(sendto(listener, buffer, length, 0, (struct sockaddr *)&client_in, sizeof(struct sockaddr_in)) != length) { + error("sendto"); + } +} + +int receiveBuffer(int length) { + return recvfrom(listener, buffer, length, 0, (struct sockaddr *)&client_in, &sockaddr_in_sizePtr); +} diff --git a/PC/vJoyInterface.dll b/PC/vJoyInterface.dll new file mode 100644 index 0000000000000000000000000000000000000000..f1e7b0a36c9b1b9a5108e7356ecc01ee9ccfcccd GIT binary patch literal 28160 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 Date: Fri, 5 Dec 2014 20:05:24 +0000 Subject: [PATCH 005/140] .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index b9b9bd6..801aa7d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ 3DS/build/ 3DS/*.elf 3DS/*.3dsx +PC/build/ +PC/*.exe \ No newline at end of file From 127a0d161a6659fe9b2ab0808c2cdad99f43ad00 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 20:26:21 +0000 Subject: [PATCH 006/140] Update README.md --- README.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d22d1c8..4540eec 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,24 @@ 3DSController ============= -A 3DS homebrew application which allows you to use your 3DS as a wireless controller for Windows. \ No newline at end of file +A 3DS homebrew application which allows you to use your 3DS as a wireless controller for Windows. + +### Setup and Usage +Firstly, if you want to be able to use the circle pad as a joystick you will need to install [vJoy](http://vjoystick.sourceforge.net/site/index.php/download-a-install). However, if you just want to use the buttons, this is not necessary. + +Copy the executable with the extension that applies to your loader: `3DSController.3dsx` for Ninjhax, `3DSController.3ds` for flashcards, or `3DSController.cia` for CFWs, into your 3DS's SD card or flashcard's micro SD card. + +Create file called `3DSController.ini` on the root of your 3DS's SD card containing the local IP address of your PC with nothing else, no new lines, etc, for example `192.168.0.4`. Refer [here](http://www.helpfulpctools.com/HowToCheckYourLocalIP.php) if you are unsure of how to find your local IP address. + +Run `3DSController.exe` on your computer. If you are prompted, make sure to allow it through your firewall. + +Start the application on your 3DS, there is no GUI, it will automatically try to connect to the IP address you put in `3DSController.ini`. + +To make sure it worked, open Notepad and press some buttons on the 3DS, they should show up. + +To return back to the Homebrew Loader, hold down Start and Select. + +### Troubleshooting +Make sure your 3DS has internet access and is on the same network as your PC, +Make sure that the `3DSController.ini` is in the root of your 3DS's SD card, +Make sure that the `3DSController.ini` has the local IP of your computer, not your public IP, +Make sure your firewall isn't blocking the application, From 517e6deeb38846b94562aa44fccb78377bc51b7e Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 20:52:57 +0000 Subject: [PATCH 007/140] Banner --- 3DS/cxi/banner.png | Bin 0 -> 4254 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 3DS/cxi/banner.png diff --git a/3DS/cxi/banner.png b/3DS/cxi/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c93804134a227f599baa7a34d8c4bde7fa8662 GIT binary patch literal 4254 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 P`v5S-Sr}GgoMZk6f1}zi literal 0 HcmV?d00001 From a8547261a116d8ae6cb2dd83bc75f97300399aa8 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 21:04:22 +0000 Subject: [PATCH 008/140] Icons --- 3DS/cxi/icon24x24.png | Bin 0 -> 3185 bytes 3DS/cxi/icon48x48.png | Bin 0 -> 3703 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 3DS/cxi/icon24x24.png create mode 100644 3DS/cxi/icon48x48.png diff --git a/3DS/cxi/icon24x24.png b/3DS/cxi/icon24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..f3c87c12836b1c303fe99e28f27d13a358f071cf GIT binary patch literal 3185 zcmV-%436`OP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Un zX+uL$X=7sm07%E3mUmQC*A|D*y?1({%`gH|hTglt0MdJtUPWP;8DJ;_4l^{dA)*2i zMMRn+NKnLp(NH8-M6nPQRImpm2q-ZaMN}+rM%Ih2ti1Q~^84egZ|$@9x%=$B&srA% zlBX}1mj+7#kjfMAgFKw+5s^`J>;QlP9$S?PR%=$HTzo3l9?ED;xoI3-JvF1F8#m>QQXW*8-Az9>Nv%ZWK* zkqtikEV84R*{M9Xh{ZXlvs2k(?iKO2Od&_ah_8qXGr62B5#JKAMv5?%E8;ie*i;TP z0{|3BY!`4?i6S-;F^L}%f`(o2L0Dz>ZZyndax(`h}FNp#{ zx{a}MR#uh~m%}m=7xWMPPlvyuufAs_KJJh5&|Nw4Oks+EF0LCZEhSCJr)Q)ySsc3I zpNIG#2mW;)20@&74xhslMTCi_jLS<9wVTK03b<)JI+ypKn)naH{-njZ7KzgM5l~}{ zfYfy=Kz{89C<+lE(fh?+|D$id_%I-TdEqLPi*x_)H~nY9rQ#)noA5c#B`Ac>67n+_ z_r%Wu$9dISw03U@r;Pdb`_%=KWKZEBGfDjQHqKX(I48#TT zN1~8;gpaI8ijWGV0cl0Lkv`-mGK$O~Z&4T&1w}_0qHIx~s8AFOwFb2wRf4KU9Y%Ga zdQmq~W2jlwM>H9&h}K8jpuNx$=mc~Yx)5D~ZbG-CFQRXwC(y4k7z_=gjj_UbVj?j~ zn6;P^%sxyT<{V}aGme?VVzKgAeXJeUAIroFu!Yzv>{0Al>=1SW`vynEso>0T?zku% z50{Utz#YMz!42UiaSM1Uye8fT?~iBWbMU43MtnE^I(`DbK#(SA6YK~fge1ZyLM5S< zaFOtU@RCR*su8V;fkZBGBe9ZrjCh$iMtn<>A?cA^NYNxAX$R>L=^W`U=_Q#=)*?HS zqsRjC4stX30{Id7jRZx)NWx2kEwMqOMxsMvNaDF9UQ$!iNpiJhu4IMe3CZh{Gg5dd zEh!f%rqp_=8mW^~BT{qH6lqgwf9X`|66qt-SEQ$8urgXQZZd3{0-1v{7i7jM2t}RZ zLSa!hQyM83DHBu-Rh#NXO`;Z4zoQONXJut%m&u07X3N&do|YY@Av7(T7cGTWN;^&) zroCIDw8Uu%XUX;@txJZM%*!p6bCl!A70I>9-IjYNPnUO-PnO>$-zoo40i~d)5U7x) zuwUV#!pu_YQro4hrA14RFTJM-E9xl*DXvvKsMxPKr=+app_HyvrF21QMwzDUsGOu+ zu6#y$T7{xwufkO+S2?TllrBqmqNmU+>Amz>RYg@#RiSFV>VWEknzmY~TE1GF+Cz1M zIzv5Pys-#cBCZ~;MXm#GGH#)6 z)ozd6)!Y-@Tijj2>R4y()XvmDLKXQ&yjjk&I!+oQOrohQ}U>eb4k~HZbSnyy9x(W?3$*y{uH6t~>7#3G*6dj`%lF|oWk4CLGP(p*(a%)BP)E2$IF@Oj zS(EuDD=h0owsbZxyFW)SXM4_Mu6ypcYf)=iYkTrk^ETy;t#evezaCm2x4vhC`i6oH z6B|7?9^ORQl)UMue3SgL{8yX9H+L5(6>KaR-{P^QrBI@fUpTVWc5B@>)Hd$6f$iqo ztG0hEVi#R4HYu(seqX{Wx%!RiH@;dd*9H0 z$NjB!N_E9`?+$Pe+^P4d?`Y6!s5po@n0fF?V_0L~w~TL_n-rRgn?4-k9U46xbhx+K zs=4`y;*ru8xJB49eKh*$jqhB)>uNP@t#6~X6(0k~gvXwKAN&3Aai8NoCm1JMf6)A) zww=;m)B$zmbj)@pc8+#Mb`75NKH1Z4+ui=7(T|5tsh+AiEql834Bs>djZ*&hXA3QVUFm(Q=>&;8Iyl!2)z2f%ZaOm)zk?4`pJM24C zcT?`ZxR-fv;r_-4=m$j)r5;v1Qhe0#v+mDrqn4wm$6Uwy9|u3aKh7F|_DjYu?mT-%DP~ zzdZD6*{hzpfVoGnQ(rI47rl{xbNDUeZQr}_casZQ@3HSIKj?nw{^;}Z!Kc(upZ)~{ znDhK<*act!000SaNLh0L01m?d01m?e$8V@)0000ObVXQnQ*UN;cVTj60B~VxZgehg zWpp4kE-)@LjOLe60004yNkl}%vkgLXZk_%F zqNWRGvbJLwTWG=?%(W-fVIFHx-94U>k8g7Vvq(4YoOT~Bowhup5=&TxqAk+3Ie*V3 z^)L&F?z|1t&aZvVs6r1etg#2ABO)`fC(9Xj@oJ6P`k^}xA8$uQ4iR4H)iOeof)}_I zd!Z)}Ndepnz0w<(fndtvR%qysM$v+1r+p5$TB8KP6v3@X^sc8OJla-$SoZf}D?>0z z(7SCH=<^@JPtivhezfTS%tT1WU@%g?0 X0Ta(L2YgS`00000NkvXXu0mjfey8@8 literal 0 HcmV?d00001 diff --git a/3DS/cxi/icon48x48.png b/3DS/cxi/icon48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..27b3224bdd707b213ca5bca1fdc2f7ff25ad76d1 GIT binary patch literal 3703 zcmV--4v6uIP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Un 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 VJjQHG;{N~u002ovPDHLkV1oM>`}_a^ literal 0 HcmV?d00001 From 0bf5355ec02e3359ec431b2e575805df9fbbfc17 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 21:04:35 +0000 Subject: [PATCH 009/140] Converted icons and banners --- 3DS/cxi/banner.bnr | Bin 0 -> 62504 bytes 3DS/cxi/icon.icn | Bin 0 -> 14016 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 3DS/cxi/banner.bnr create mode 100644 3DS/cxi/icon.icn diff --git a/3DS/cxi/banner.bnr b/3DS/cxi/banner.bnr new file mode 100644 index 0000000000000000000000000000000000000000..c37656a74d91e87106f7fe4ea6ead24302d76ead GIT binary patch literal 62504 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 literal 0 HcmV?d00001 diff --git a/3DS/cxi/icon.icn b/3DS/cxi/icon.icn new file mode 100644 index 0000000000000000000000000000000000000000..97d8f78bd93bc9e8f4f5414cbfbe0f471ecc114f GIT binary patch literal 14016 zcmeI$F%E(-6vpw-Tj<8%1@r>O#6*@(oPeed4#vc243jP%z_F*Tt&?GLX&L%|1A#J> z{$AcI(3xGU7_H7a=^(31Jl@r4ul_rd?&c4pq4=EnSM~o4ovymc=@|3S$iy6!4f0>s zdpsNYr~aw`vU|?B2B*BH{;7ZJpZe$hFMWm77xaJnKmDKnPyeU?^Z$qazs7f<`m)Z7 z5kLR|1Q0*~f$0RApGZ#;LU^oN>%8}i_uRTy8l0uWbF Date: Fri, 5 Dec 2014 21:08:00 +0000 Subject: [PATCH 010/140] Changed icon title --- 3DS/cxi/icon.icn | Bin 14016 -> 14016 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/3DS/cxi/icon.icn b/3DS/cxi/icon.icn index 97d8f78bd93bc9e8f4f5414cbfbe0f471ecc114f..78e8c12c613f3481a331314b01efe87a1009bb78 100644 GIT binary patch literal 14016 zcmeI#F%E(-6vpw-Tj<8%1=Ir=0|Sc_o`B$HG%+|h>EZz#Ic;g3oJg0)TmB^h0!n{3rj(f5X=d zLnD9y0tg_000Iag@DnKhTDlNIcx~#o8-`)^UAEmPU0kHyd%rzA*XfLg00IagfB*sr YAbO#6*@(oPeed4#vc243jP%z_F*Tt&?GLX&L%|1A#J> z{$AcI(3xGU7_H7a=^(31Jl@r4ul_rd?&c4pq4=EnSM~o4ovymc=@|3S$iy6!4f0>s zdpsNYr~aw`vU|?B2B*BH{;7ZJpZe$hFMWm77xaJnKmDKnPyeU?^Z$qazs7f<`m)Z7 z5kLR|1Q0*~f$0RApGZ#;LU^oN>%8}i_uRTy8l0uWbF Date: Fri, 5 Dec 2014 21:29:29 +0000 Subject: [PATCH 011/140] 3DS and CIA building --- 3DS/Makefile | 18 ++- 3DS/cxi/build_cia.rsf | 236 ++++++++++++++++++++++++++++++++++++++ 3DS/cxi/gw_workaround.rsf | 234 +++++++++++++++++++++++++++++++++++++ 3 files changed, 485 insertions(+), 3 deletions(-) create mode 100644 3DS/cxi/build_cia.rsf create mode 100644 3DS/cxi/gw_workaround.rsf diff --git a/3DS/Makefile b/3DS/Makefile index c4c758e..c1be438 100644 --- a/3DS/Makefile +++ b/3DS/Makefile @@ -26,7 +26,7 @@ include $(DEVKITARM)/3ds_rules # - icon.png # - /default_icon.png #--------------------------------------------------------------------------------- -TARGET := $(notdir $(CURDIR)) +TARGET := 3DSController BUILD := build SOURCES := source DATA := data @@ -125,7 +125,7 @@ $(BUILD): #--------------------------------------------------------------------------------- clean: @echo clean ... - @rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).smdh $(TARGET).elf + @rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).3ds $(OUTPUT).cia $(OUTPUT).smdh $(TARGET).elf $(OUTPUT)stripped.elf #--------------------------------------------------------------------------------- @@ -138,11 +138,23 @@ DEPENDS := $(OFILES:.o=.d) #--------------------------------------------------------------------------------- ifeq ($(strip $(NO_SMDH)),) .PHONY: all -all : $(OUTPUT).3dsx $(OUTPUT).smdh +all : $(OUTPUT).3dsx $(OUTPUT).3ds $(OUTPUT).cia $(OUTPUT).smdh endif + $(OUTPUT).3dsx : $(OUTPUT).elf + +$(OUTPUT).3ds : $(OUTPUT)stripped.elf + makerom -f cci -o $(OUTPUT).3ds -rsf "$(TOPDIR)/cxi/gw_workaround.rsf" -target d -exefslogo -elf $(OUTPUT)stripped.elf -icon "$(TOPDIR)/cxi/icon.icn" -banner "$(TOPDIR)/cxi/banner.bnr" + +$(OUTPUT).cia : $(OUTPUT)stripped.elf + makerom -f cia -o $(OUTPUT).cia -elf $(OUTPUT)stripped.elf -rsf "$(TOPDIR)/cxi/build_cia.rsf" -icon "$(TOPDIR)/cxi/icon.icn" -banner "$(TOPDIR)/cxi/banner.bnr" -exefslogo -target t + $(OUTPUT).elf : $(OFILES) +$(OUTPUT)stripped.elf : $(OUTPUT).elf + cp -f $(OUTPUT).elf $(OUTPUT)stripped.elf + @arm-none-eabi-strip $(OUTPUT)stripped.elf + #--------------------------------------------------------------------------------- # you need a rule like this for each extension you use as binary data #--------------------------------------------------------------------------------- diff --git a/3DS/cxi/build_cia.rsf b/3DS/cxi/build_cia.rsf new file mode 100644 index 0000000..8dc9258 --- /dev/null +++ b/3DS/cxi/build_cia.rsf @@ -0,0 +1,236 @@ +BasicInfo: + Title : "3DS Controller" + CompanyCode : "00" + ProductCode : "CTR-N-3DSC" + ContentType : Application # Application / SystemUpdate / Manual / Child / Trial + Logo : Nintendo # Nintendo / Licensed / Distributed / iQue / iQueForSystem + +Rom: + # Specifies the root path of the file system to include in the ROM. + # HostRoot : "$(ROMFS_ROOT)" + + +TitleInfo: + UniqueId : 0xf0fc2 # This was/is the first real homebrew app. I hope this TID range is not used by any retail game/app. + Category : Application # Application / SystemApplication / Applet / Firmware / Base / DlpChild / Demo / Contents / SystemContents / SharedContents / AddOnContents / Patch / AutoUpdateContents + +CardInfo: + MediaSize : 512MB # 128MB / 256MB / 512MB / 1GB / 2GB / 4GB / 8GB / 16GB / 32GB + MediaType : Card1 # Card1 / Card2 + CardDevice : NorFlash # NorFlash / None + + +Option: + UseOnSD : true # true if App is to be installed to SD + EnableCompress : true # Compresses exefs code + FreeProductCode : true # Removes limitations on ProductCode + EnableCrypt : false # Enables encryption for NCCH and CIA + MediaFootPadding : false # If true CCI files are created with padding + +ExeFs: # these are the program segments from the ELF, check your elf for the appropriate segment names + ReadOnly: + - .rodata + - RO + ReadWrite: + - .data + - RO + Text: + - .init + - .text + - STUP_ENTRY + +PlainRegion: # only used with SDK ELFs + # - .module_id + +AccessControlInfo: + # UseOtherVariationSaveData : true + # UseExtSaveData : true + # ExtSaveDataId: 0xffffffff + # SystemSaveDataId1: 0x220 + # SystemSaveDataId2: 0x00040010 + # OtherUserSaveDataId1: 0x220 + # OtherUserSaveDataId2: 0x330 + # OtherUserSaveDataId3: 0x440 + # UseExtendedSaveDataAccessControl: true + # AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606] + FileSystemAccess: + # - CategorySystemApplication + # - CategoryHardwareCheck + # - CategoryFileSystemTool + - Debug + # - TwlCardBackup + # - TwlNandData + # - Boss + - DirectSdmc + # - Core + # - CtrNandRo + # - CtrNandRw + # - CtrNandRoWrite + # - CategorySystemSettings + # - CardBoard + # - ExportImportIvs + # - DirectSdmcWrite + # - SwitchCleanup + # - SaveDataMove + # - Shop + # - Shell + # - CategoryHomeMenu + IoAccessControl: + # - FsMountNand + # - FsMountNandRoWrite + # - FsMountTwln + # - FsMountWnand + # - FsMountCardSpi + # - UseSdif3 + # - CreateSeed + # - UseCardSpi + + IdealProcessor : 0 + AffinityMask : 1 + + Priority : 16 + + MaxCpu : 0x9E # Default + + DisableDebug : true + EnableForceDebug : false + CanWriteSharedPage : true + CanUsePrivilegedPriority : false + CanUseNonAlphabetAndNumber : true + PermitMainFunctionArgument : true + CanShareDeviceMemory : true + RunnableOnSleep : false + SpecialMemoryArrange : true + + CoreVersion : 2 + DescVersion : 2 + + ReleaseKernelMajor : "02" + ReleaseKernelMinor : "33" + MemoryType : Application # Application / System / Base + HandleTableSize: 512 + IORegisterMapping: + - 1ff50000-1ff57fff + - 1ff70000-1ff77fff + MemoryMapping: + - 1f000000-1f5fffff:r + SystemCallAccess: + ArbitrateAddress: 34 + Break: 60 + CancelTimer: 28 + ClearEvent: 25 + ClearTimer: 29 + CloseHandle: 35 + ConnectToPort: 45 + ControlMemory: 1 + CreateAddressArbiter: 33 + CreateEvent: 23 + CreateMemoryBlock: 30 + CreateMutex: 19 + CreateSemaphore: 21 + CreateThread: 8 + CreateTimer: 26 + DuplicateHandle: 39 + ExitProcess: 3 + ExitThread: 9 + GetCurrentProcessorNumber: 17 + GetHandleInfo: 41 + GetProcessId: 53 + GetProcessIdOfThread: 54 + GetProcessIdealProcessor: 6 + GetProcessInfo: 43 + GetResourceLimit: 56 + GetResourceLimitCurrentValues: 58 + GetResourceLimitLimitValues: 57 + GetSystemInfo: 42 + GetSystemTick: 40 + GetThreadContext: 59 + GetThreadId: 55 + GetThreadIdealProcessor: 15 + GetThreadInfo: 44 + GetThreadPriority: 11 + MapMemoryBlock: 31 + OutputDebugString: 61 + QueryMemory: 2 + ReleaseMutex: 20 + ReleaseSemaphore: 22 + SendSyncRequest1: 46 + SendSyncRequest2: 47 + SendSyncRequest3: 48 + SendSyncRequest4: 49 + SendSyncRequest: 50 + SetThreadPriority: 12 + SetTimer: 27 + SignalEvent: 24 + SleepThread: 10 + UnmapMemoryBlock: 32 + WaitSynchronization1: 36 + WaitSynchronizationN: 37 + InterruptNumbers: + ServiceAccessControl: + - APT:U + - $hioFIO + - $hostio0 + - $hostio1 + - ac:u + - boss:U + - cam:u + - cecd:u + - cfg:u + - dlp:FKCL + - dlp:SRVR + - dsp::DSP + - frd:u + - fs:USER + - gsp::Gpu + - hid:USER + - http:C + - mic:u + - ndm:u + - news:u + - nwm::UDS + - ptm:u + - pxi:dev + - soc:U + - ssl:C + - y2r:u + - ldr:ro + - ir:USER + + +SystemControlInfo: + SaveDataSize: 0KB # It doesn't use any save data. + RemasterVersion: 2 + StackSize: 0x40000 + # JumpId: 0 + Dependency: + ac: 0x0004013000002402L + am: 0x0004013000001502L + boss: 0x0004013000003402L + camera: 0x0004013000001602L + cecd: 0x0004013000002602L + cfg: 0x0004013000001702L + codec: 0x0004013000001802L + csnd: 0x0004013000002702L + dlp: 0x0004013000002802L + dsp: 0x0004013000001a02L + friends: 0x0004013000003202L + gpio: 0x0004013000001b02L + gsp: 0x0004013000001c02L + hid: 0x0004013000001d02L + http: 0x0004013000002902L + i2c: 0x0004013000001e02L + ir: 0x0004013000003302L + mcu: 0x0004013000001f02L + mic: 0x0004013000002002L + ndm: 0x0004013000002b02L + news: 0x0004013000003502L + nim: 0x0004013000002c02L + nwm: 0x0004013000002d02L + pdn: 0x0004013000002102L + ps: 0x0004013000003102L + ptm: 0x0004013000002202L + ro: 0x0004013000003702L + socket: 0x0004013000002e02L + spi: 0x0004013000002302L + ssl: 0x0004013000002f02L \ No newline at end of file diff --git a/3DS/cxi/gw_workaround.rsf b/3DS/cxi/gw_workaround.rsf new file mode 100644 index 0000000..451bfc8 --- /dev/null +++ b/3DS/cxi/gw_workaround.rsf @@ -0,0 +1,234 @@ +BasicInfo: + Title : "3DS Controller" + CompanyCode : "00" + ProductCode : "CTR-N-3DSC" + ContentType : Application + Logo : Nintendo # Nintendo / Licensed / Distributed / iQue / iQueForSystem + +Rom: + # Specifies the root path of the file system to include in the ROM. + #HostRoot : "romfs" + + +TitleInfo: + UniqueId : 0xf0fc2 + Category : Application + +CardInfo: + MediaSize : 128MB # 128MB / 256MB / 512MB / 1GB / 2GB / 4GB + MediaType : Card1 # Card1 / Card2 + CardDevice : NorFlash # NorFlash(Pick this if you use savedata) / None + + +Option: + FreeProductCode : true # Removes limitations on ProductCode + MediaFootPadding : false # If true CCI files are created with padding + EnableCrypt : true # Enables encryption for NCCH and CIA + EnableCompress : true # Compresses exefs code + +ExeFs: # these are the program segments from the ELF, check your elf for the appropriate segment names + ReadOnly: + - .rodata + - RO + ReadWrite: + - .data + - RO + Text: + - .init + - .text + - STUP_ENTRY + +PlainRegion: # only used with SDK ELFs + - .module_id + +AccessControlInfo: + #UseExtSaveData : true + #ExtSaveDataId: 0xff3ff + #UseExtendedSaveDataAccessControl: true + #AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606] + +SystemControlInfo: + SaveDataSize: 128KB + RemasterVersion: 0 + StackSize: 0x40000 + +# DO NOT EDIT BELOW HERE OR PROGRAMS WILL NOT LAUNCH (most likely) + +AccessControlInfo: + FileSystemAccess: + - Debug + - DirectSdmc + - DirectSdmcWrite + + IdealProcessor : 0 + AffinityMask : 1 + + Priority : 16 + + MaxCpu : 0x9E # Default + + CoreVersion : 2 + DescVersion : 2 + + ReleaseKernelMajor : "02" + ReleaseKernelMinor : "33" + MemoryType : Application + HandleTableSize: 512 + IORegisterMapping: + - 1ff50000-1ff57fff + - 1ff70000-1ff77fff + MemoryMapping: + - 1f000000-1f5fffff:r + SystemCallAccess: + ArbitrateAddress: 34 + Break: 60 + CancelTimer: 28 + ClearEvent: 25 + ClearTimer: 29 + CloseHandle: 35 + ConnectToPort: 45 + ControlMemory: 1 + CreateAddressArbiter: 33 + CreateEvent: 23 + CreateMemoryBlock: 30 + CreateMutex: 19 + CreateSemaphore: 21 + CreateThread: 8 + CreateTimer: 26 + DuplicateHandle: 39 + ExitProcess: 3 + ExitThread: 9 + GetCurrentProcessorNumber: 17 + GetHandleInfo: 41 + GetProcessId: 53 + GetProcessIdOfThread: 54 + GetProcessIdealProcessor: 6 + GetProcessInfo: 43 + GetResourceLimit: 56 + GetResourceLimitCurrentValues: 58 + GetResourceLimitLimitValues: 57 + GetSystemInfo: 42 + GetSystemTick: 40 + GetThreadContext: 59 + GetThreadId: 55 + GetThreadIdealProcessor: 15 + GetThreadInfo: 44 + GetThreadPriority: 11 + MapMemoryBlock: 31 + OutputDebugString: 61 + QueryMemory: 2 + ReleaseMutex: 20 + ReleaseSemaphore: 22 + SendSyncRequest1: 46 + SendSyncRequest2: 47 + SendSyncRequest3: 48 + SendSyncRequest4: 49 + SendSyncRequest: 50 + SetThreadPriority: 12 + SetTimer: 27 + SignalEvent: 24 + SleepThread: 10 + UnmapMemoryBlock: 32 + WaitSynchronization1: 36 + WaitSynchronizationN: 37 + InterruptNumbers: + ServiceAccessControl: + - APT:U + - $hioFIO + - $hostio0 + - $hostio1 + - ac:u + - boss:U + - cam:u + - cecd:u + - cfg:u + - dlp:FKCL + - dlp:SRVR + - dsp::DSP + - frd:u + - fs:USER + - gsp::Gpu + - hid:USER + - http:C + - mic:u + - ndm:u + - news:u + - nwm::UDS + - ptm:u + - pxi:dev + - soc:U + - ssl:C + - y2r:u + - ldr:ro + - ir:USER + + +SystemControlInfo: + Dependency: + ac: 0x0004013000002402L + am: 0x0004013000001502L + boss: 0x0004013000003402L + camera: 0x0004013000001602L + cecd: 0x0004013000002602L + cfg: 0x0004013000001702L + codec: 0x0004013000001802L + csnd: 0x0004013000002702L + dlp: 0x0004013000002802L + dsp: 0x0004013000001a02L + friends: 0x0004013000003202L + gpio: 0x0004013000001b02L + gsp: 0x0004013000001c02L + hid: 0x0004013000001d02L + http: 0x0004013000002902L + i2c: 0x0004013000001e02L + ir: 0x0004013000003302L + mcu: 0x0004013000001f02L + mic: 0x0004013000002002L + ndm: 0x0004013000002b02L + news: 0x0004013000003502L + nim: 0x0004013000002c02L + nwm: 0x0004013000002d02L + pdn: 0x0004013000002102L + ps: 0x0004013000003102L + ptm: 0x0004013000002202L + ro: 0x0004013000003702L + socket: 0x0004013000002e02L + spi: 0x0004013000002302L + ssl: 0x0004013000002f02L +CommonHeaderKey: + D: | + jL2yO86eUQnYbXIrzgFVMm7FVze0LglZ2f5g+c42hWoEdnb5BOotaMQPBfqt + aUyAEmzQPaoi/4l4V+hTJRXQfthVRqIEx27B84l8LA6Tl5Fy9PaQaQ+4yRfP + g6ylH2l0EikrIVjy2uMlFgl0QJCrG+QGKHftxhaGCifdAwFNmiZuyJ/TmktZ + 0RCb66lYcr2h/p2G7SnpKUliS9h9KnpmG+UEgVYQUK+4SCfByUa9PxYGpT0E + nw1UcRz0gsBmdOqcgzwnAd9vVqgb42hVn6uQZyAl+j1RKiMWywZarazIR/k5 + Lmr4+groimSEa+3ajyoIho9WaWTDmFU3mkhA2tUDIQ== + Exponent: | + AQAB + Modulus: | + zwCcsyCgMkdlieCgQMVXA6X2jmb1ICjup0Q+jk/AydPkOgsx7I/MjUymFEkU + vgXBtCKtzh3NKXtFFuW51tJ60GPOabLKuG0Qm5li+UXALrWhzWuvd5vv2FZI + dTQCbrq/MFS/M02xNtwqzWiBjE/LwqIdbrDAAvX4HGy0ydaQJ1DKYeQeph5D + lAGBw2nQ4izXhhuLaU3w8VQkIJHdhxIKI5gJY/20AGkG0vHD553Mh5kBINrWp + CRYmmJS8DCYbAiQtKbkeUfzHViGTZuj6PwaY8Mv39PGO47a++pt45IUyCEs4/ + LjMS72cyfo8tU4twRGp76SFGYejYj3wGC1f/POQw== + Signature: | + BOPR0jL0BOV5Zx502BuPbOvi/hvOq5ID8Dz1MQfOjkey6FKP/6cb4f9YXpm6c + ZCHAZLo0GduKdMepiKPUq1rsbbAxkRdQdjOOusEWoxNA58x3E4373tCAhlqM2 + DvuQERrIIQ/XnYLV9C3uw4efZwhFqog1jvVyoEHpuvs8xnYtGbsKQ8FrgLwXv + pOZYy9cSgq+jqLy2D9IxiowPcbq2cRlbW9d2xlUfpq0AohyuXQhpxn7d9RUor + 9veoARRAdxRJK12EpcSoEM1LhTRYdJnSRCY3x3p6YIV3c+l1sWvaQwKt0sZ/U + 8TTDx2gb9g7r/+U9icneu/zlqUpSkexCS009Q== + Descriptor: | + AP///wAABAACAAAAAAAFGJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIAAAAAAAABBUFQ6VQAAACRo + aW9GSU8AJGhvc3RpbzAkaG9zdGlvMWFjOnUAAAAAYm9zczpVAABjYW06dQAA + AGNlY2Q6dQAAY2ZnOnUAAABkbHA6RktDTGRscDpTUlZSZHNwOjpEU1BmcmQ6 + dQAAAGZzOlVTRVIAZ3NwOjpHcHVoaWQ6VVNFUmh0dHA6QwAAbWljOnUAAABu + ZG06dQAAAG5ld3M6dQAAbndtOjpVRFNwdG06dQAAAHB4aTpkZXYAc29jOlUA + AABzc2w6QwAAAHkycjp1AAAAbGRyOnJvAABpcjpVU0VSAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAABOn/rw/7//8ec/APIA8JH/APaR/1D/gf9Y/4H/cP+B/3j/gf8B + AQD/AAIA/iECAPz///////////////////////////////////////////// + ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAA + AAADAAAAAAAAAAAAAAAAAAI= \ No newline at end of file From a359fa9815091733aa04a2b88b301a1dc61c0dfe Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 21:30:34 +0000 Subject: [PATCH 012/140] .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 801aa7d..50aebd1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ 3DS/build/ 3DS/*.elf +3DS/*stripped.elf 3DS/*.3dsx +3DS/*.3ds +3DS/*.cia PC/build/ PC/*.exe \ No newline at end of file From 5eebef1a4271a5d78ed27216d0389f4ae61516f8 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 21:42:36 +0000 Subject: [PATCH 013/140] Remove alpha in icons --- 3DS/cxi/icon.icn | Bin 14016 -> 14016 bytes 3DS/cxi/icon24x24.png | Bin 3185 -> 766 bytes 3DS/cxi/icon48x48.png | Bin 3703 -> 1438 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/3DS/cxi/icon.icn b/3DS/cxi/icon.icn index 78e8c12c613f3481a331314b01efe87a1009bb78..0dbbd45febbb3d976c731266f76b10ef12fe0294 100644 GIT binary patch literal 14016 zcmeHLKS*Oq82=6|QdqoVi+5o01PcWVv$ur-;YfB5)<6ogYoTCqo3)T!?(nh}666la zSx69W5kV1)fEGe5grpFXCZNTF7D6lpUy&k(#VagcvBli{9LM)!a{4r8a|iR2Wd7uv zZ)U#v=KFr*yU3fj#PI{Yp?74^Yx<3TrBC!bFMr{G)4cXA(CPWV#UAgQ<2AjfId1Du z_X)M}w@%x?)AP5{w4PL}^Y3i@@pMRS6jJA}&R@m<&hd{nUTsgR)%{oZU)_Io{}uo5 z%=^<*kZz-pivKG9tN5?tzl#4V{C3}CBv6Iwi{(XMYA8I!Lg0*1Hgr_X5@L|);goh8^QX3V_ zKN?2g0@v|$yxL~$r-82*S?wqw&WdOzENg?Y+02XWMNR4-J|x;p%KexOwl$E0RiLN%$c6!mm*w3p(Kl|_*K1{?nD&4V@)LPybG9d5(HY!B> ze0)7FC$VPi(d2fsQoGUF%;h9wi(1f!earpHvZuyaA}(8uU2RtNM7&<7yS1p5Y@)fG z96{6_!(L>YF=#yCYZGAXEB8&TMeOvZ`(KK&jMOuf##$#DJccN%>4zomg;KJ<6pF>U z45iPCiMUxOfZxxG&`#9FPeA@?GAkwPt(4Gv7j`kL-R&#cxH0f;z@P)}=jdZ>gxim? zPM-TvcOX;P{@l>h5SgZtXK82j<$3A8QYDD8~+sTYRuy-V6w(3};Xx-qrhsXCYvuw#cJlA%BuWM%2=4*FJ`<0U*E3TxWaH?v5dABZHZ&76|%8 zulOFRjb+Y?$UjbQM&!SoJS!dr8e^w>?0xm2w8KH58#oG_Um$}u8)p}r_5L6GgkO1E z`B-Mlmgmjb821h*pK59F5J2ZV3jJOXiNnSZK}(l)lP_^Dhb#_XsRh7z;G>OW4c@h7 z3qB&()F|cjtRxGZ*TK(MlKZP$oa+dH0sBHCUk5p3lc;e{H9a6(k1ZYkw&Z85%J)^T zVaK&2!CDh>5tDbL{UMWycxLuUI4hTW#90ddibxUkO&sIip&y)F%E69A z!lX-!Jf6i@L^eBu)w7SvKr#ybD*jpR7&6F`FG;umA>x*Gt7RK(RJ! z=SHDfOCv)z^QrnixekLyxSzb(mTjUzp63vSyaKNT$=@&rFQ!*6eU4^#&C!m$?C=2j z`gY5rZt#zYOlWlq2A_B=bGqrovt}z<)Np(2VbG2remEEt??2q`y`+4FIo9x6tJjW5 zDmdGY-{3g~XWEF96#fSw@bEnD_hI8JSn6q|bXG%jegU5odGO0kPWPtUoh6+SCf}f& znSndG-xH2xvszX|CJ>BKSPJjv$6zjpyNSCbAjcN+EBw@3htw;|b3v? delta 22 bcmX?*dmwj%gTm&SqWN5#7l>wnh?R^0bhimH diff --git a/3DS/cxi/icon24x24.png b/3DS/cxi/icon24x24.png index f3c87c12836b1c303fe99e28f27d13a358f071cf..30864154e10ca7abbb0671cff31fd4fb3c7c5fd1 100644 GIT binary patch delta 661 zcmV;G0&4y782$y283+OZ003_ls;`kDJ`(^5a7bBm000ic000ic0Tn1pfRm*PCVv7@ zNklEF@(yC1y2A&Bip%%A{l? z7Bf3pD2t&aAt@9|Stv?j{4{)L+~a5F^Zn?X`ksaEIp?0|z4vwROIdvr|5eoQ_j|n_ z1{;nRfkmg&6$%B6H~f`oI2=Z!QGbueV=x%N^7{IUg+2Z(dV71jxVU(FddlbXFvjdp z91y*~zeCS<@h>kg4-XGy+-Nk)})n`x7)9-uAs`} z@mMTYr_;gaeUU<;AU)x5n9t|KAQ%ja#bT1=a5$w>$zrh>jYgOZTZ5#-;UK*LiZYoD zX#ij?&(F`-*VpiisSU+qF@F>aNhA^ya=F~eWI_xma=BcjMv%#5YPFidU|_uA@$nH> zfx()1JWdQKIzK6#I3-jae)D2&BoB>5}4-L77*C-ZGK8%d%F$mMeB vbow`6oG-u)hp)|Yxg_CE^pAX#XtnwQGG0sV1p^Tt00000NkvXXu0mjfP;WH3 delta 3098 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 diff --git a/3DS/cxi/icon48x48.png b/3DS/cxi/icon48x48.png index 27b3224bdd707b213ca5bca1fdc2f7ff25ad76d1..e158664e07d0f722567bcfcc75b90490f21894ca 100644 GIT binary patch delta 1339 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 Date: Fri, 5 Dec 2014 21:57:07 +0000 Subject: [PATCH 014/140] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4540eec..442789f 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ To make sure it worked, open Notepad and press some buttons on the 3DS, they sho To return back to the Homebrew Loader, hold down Start and Select. ### Troubleshooting -Make sure your 3DS has internet access and is on the same network as your PC, -Make sure that the `3DSController.ini` is in the root of your 3DS's SD card, -Make sure that the `3DSController.ini` has the local IP of your computer, not your public IP, -Make sure your firewall isn't blocking the application, +- Make sure your 3DS has internet access and is on the same network as your PC, +- Make sure that the `3DSController.ini` is in the root of your 3DS's SD card, +- Make sure that the `3DSController.ini` has the local IP of your computer, not your public IP, +- Make sure your firewall isn't blocking the application, From a467a514db9899ec91daca0fbfe4dbf82c9db0f6 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 22:13:15 +0000 Subject: [PATCH 015/140] Update README.md --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 442789f..e21ef43 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ A 3DS homebrew application which allows you to use your 3DS as a wireless contro ### Setup and Usage Firstly, if you want to be able to use the circle pad as a joystick you will need to install [vJoy](http://vjoystick.sourceforge.net/site/index.php/download-a-install). However, if you just want to use the buttons, this is not necessary. -Copy the executable with the extension that applies to your loader: `3DSController.3dsx` for Ninjhax, `3DSController.3ds` for flashcards, or `3DSController.cia` for CFWs, into your 3DS's SD card or flashcard's micro SD card. +Copy the executable with the extension that applies to your loader: `3DSController.3dsx` and `3DSController.smdh` for Ninjhax, `3DSController.3ds` for flashcards, or `3DSController.cia` for CFWs, into your 3DS's SD card or flashcard's micro SD card. Create file called `3DSController.ini` on the root of your 3DS's SD card containing the local IP address of your PC with nothing else, no new lines, etc, for example `192.168.0.4`. Refer [here](http://www.helpfulpctools.com/HowToCheckYourLocalIP.php) if you are unsure of how to find your local IP address. @@ -13,9 +13,11 @@ Run `3DSController.exe` on your computer. If you are prompted, make sure to allo Start the application on your 3DS, there is no GUI, it will automatically try to connect to the IP address you put in `3DSController.ini`. -To make sure it worked, open Notepad and press some buttons on the 3DS, they should show up. +If it wasn't able to read the IP from `3DSController.ini` it will immediately exit. -To return back to the Homebrew Loader, hold down Start and Select. +Otherwise, you will just see a black screen, it should work. To make sure it works, open Notepad and press some buttons on the 3DS, they should show up. You can also test if the joystick works by going to Configure USB Game Controllers in Control Panel, it shows up as vJoy. + +If using Ninjhax press Start and Select to return to the Homebrew Loader, otherwise you can just exit with the Home button. ### Troubleshooting - Make sure your 3DS has internet access and is on the same network as your PC, From c0f572e4822e60007c0fc1f5423d24d929c3eac7 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 22:17:07 +0000 Subject: [PATCH 016/140] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e21ef43..1b77ae4 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,9 @@ ============= A 3DS homebrew application which allows you to use your 3DS as a wireless controller for Windows. +### Download +The latest release will always be downloadable from [here](https://github.com/CTurt/3DSController/releases/). + ### Setup and Usage Firstly, if you want to be able to use the circle pad as a joystick you will need to install [vJoy](http://vjoystick.sourceforge.net/site/index.php/download-a-install). However, if you just want to use the buttons, this is not necessary. From 94c195f1216ea990cf6fff7c83f6f1870a81c196 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 5 Dec 2014 22:25:47 +0000 Subject: [PATCH 017/140] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1b77ae4..f966768 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ -3DSController -============= +3DSController ![](/3DS/cxi/icon48x48.png?raw=true) +=== + A 3DS homebrew application which allows you to use your 3DS as a wireless controller for Windows. ### Download From b6699b3c34e8e968b6c1f7bc62f6fa2e7cea9e4a Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 6 Dec 2014 09:53:07 +0000 Subject: [PATCH 018/140] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f966768..fd0822a 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Otherwise, you will just see a black screen, it should work. To make sure it wor If using Ninjhax press Start and Select to return to the Homebrew Loader, otherwise you can just exit with the Home button. ### Troubleshooting -- Make sure your 3DS has internet access and is on the same network as your PC, -- Make sure that the `3DSController.ini` is in the root of your 3DS's SD card, +- Make sure your 3DS has internet access (turn on the switch on the side of the 3DS so that an orange light shows) and is on the same network as your PC, +- Make sure that the `3DSController.ini` is in the root of your 3DS's SD card (not flashcard micro SD), - Make sure that the `3DSController.ini` has the local IP of your computer, not your public IP, - Make sure your firewall isn't blocking the application, From c892c6ad60668a98776fdea1b4c699c3c23d9973 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 6 Dec 2014 12:56:58 +0000 Subject: [PATCH 019/140] smdh --- 3DS/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/3DS/Makefile b/3DS/Makefile index c1be438..060b1a0 100644 --- a/3DS/Makefile +++ b/3DS/Makefile @@ -32,6 +32,11 @@ SOURCES := source DATA := data INCLUDES := include +APP_TITLE := 3DS Controller +APP_DESCRIPTION := +APP_AUTHOR := CTurt +ICON := cxi/icon48x48.png + #--------------------------------------------------------------------------------- # options for code generation #--------------------------------------------------------------------------------- From 960dd55a8c9a4279e71d26413e2b799eec6b6438 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 6 Dec 2014 12:57:35 +0000 Subject: [PATCH 020/140] Drawing --- 3DS/include/font.h | 5 ++ 3DS/source/font.c | 148 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 3DS/include/font.h create mode 100644 3DS/source/font.c diff --git a/3DS/include/font.h b/3DS/include/font.h new file mode 100644 index 0000000..72a5e54 --- /dev/null +++ b/3DS/include/font.h @@ -0,0 +1,5 @@ +#pragma once + +inline void clearScreen(void); +void drawPixelRGB(int x, int y, u8 r, u8 g, u8 b); +void drawString(int sx, int sy, char *text, ...); diff --git a/3DS/source/font.c b/3DS/source/font.c new file mode 100644 index 0000000..3aae606 --- /dev/null +++ b/3DS/source/font.c @@ -0,0 +1,148 @@ +#include +#include +#include + +#include <3ds.h> + +#include "font.h" + +static const char fonts[] = { //Fonte 8x8 1BPP + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 //tile:0 + , 0x18, 0x18, 0x18, 0x18, 0x18, 0x0, 0x18, 0x0 //tile:1 + , 0x6c, 0x6c, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0 //tile:2 + , 0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x0 //tile:3 + , 0x18, 0x7e, 0xc0, 0x7c, 0x6, 0xfc, 0x18, 0x0 //tile:4 + , 0x0, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xc6, 0x0 //tile:5 + , 0x38, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0x76, 0x0 //tile:6 + , 0x30, 0x30, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0 //tile:7 + , 0xc, 0x18, 0x30, 0x30, 0x30, 0x18, 0xc, 0x0 //tile:8 + , 0x30, 0x18, 0xc, 0xc, 0xc, 0x18, 0x30, 0x0 //tile:9 + , 0x0, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x0, 0x0 //tile:10 + , 0x0, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x0, 0x0 //tile:11 + , 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x18, 0x30 //tile:12 + , 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x0 //tile:13 + , 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x18, 0x0 //tile:14 + , 0x6, 0xc, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x0 //tile:15 + , 0x7c, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0x7c, 0x0 //tile:16 + , 0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x0 //tile:17 + , 0x7c, 0xc6, 0x6, 0x7c, 0xc0, 0xc0, 0xfe, 0x0 //tile:18 + , 0xfc, 0x6, 0x6, 0x3c, 0x6, 0x6, 0xfc, 0x0 //tile:19 + , 0xc, 0xcc, 0xcc, 0xcc, 0xfe, 0xc, 0xc, 0x0 //tile:20 + , 0xfe, 0xc0, 0xfc, 0x6, 0x6, 0xc6, 0x7c, 0x0 //tile:21 + , 0x7c, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0x7c, 0x0 //tile:22 + , 0xfe, 0x6, 0x6, 0xc, 0x18, 0x30, 0x30, 0x0 //tile:23 + , 0x7c, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0x7c, 0x0 //tile:24 + , 0x7c, 0xc6, 0xc6, 0x7e, 0x6, 0x6, 0x7c, 0x0 //tile:25 + , 0x0, 0x18, 0x18, 0x0, 0x0, 0x18, 0x18, 0x0 //tile:26 + , 0x0, 0x18, 0x18, 0x0, 0x0, 0x18, 0x18, 0x30 //tile:27 + , 0xc, 0x18, 0x30, 0x60, 0x30, 0x18, 0xc, 0x0 //tile:28 + , 0x0, 0x0, 0x7e, 0x0, 0x7e, 0x0, 0x0, 0x0 //tile:29 + , 0x30, 0x18, 0xc, 0x6, 0xc, 0x18, 0x30, 0x0 //tile:30 + , 0x3c, 0x66, 0xc, 0x18, 0x18, 0x0, 0x18, 0x0 //tile:31 + , 0x7c, 0xc6, 0xde, 0xde, 0xde, 0xc0, 0x7e, 0x0 //tile:32 + , 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x0 //tile:33 + , 0xfc, 0xc6, 0xc6, 0xfc, 0xc6, 0xc6, 0xfc, 0x0 //tile:34 + , 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x0 //tile:35 + , 0xf8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0xf8, 0x0 //tile:36 + , 0xfe, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xfe, 0x0 //tile:37 + , 0xfe, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0x0 //tile:38 + , 0x7c, 0xc6, 0xc0, 0xc0, 0xce, 0xc6, 0x7c, 0x0 //tile:39 + , 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x0 //tile:40 + , 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x0 //tile:41 + , 0x6, 0x6, 0x6, 0x6, 0x6, 0xc6, 0x7c, 0x0 //tile:42 + , 0xc6, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0xc6, 0x0 //tile:43 + , 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0x0 //tile:44 + , 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x0 //tile:45 + , 0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x0 //tile:46 + , 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x0 //tile:47 + , 0xfc, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0x0 //tile:48 + , 0x7c, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x6 //tile:49 + , 0xfc, 0xc6, 0xc6, 0xfc, 0xd8, 0xcc, 0xc6, 0x0 //tile:50 + , 0x7c, 0xc6, 0xc0, 0x7c, 0x6, 0xc6, 0x7c, 0x0 //tile:51 + , 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0 //tile:52 + , 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0x0 //tile:53 + , 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x38, 0x0 //tile:54 + , 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0x6c, 0x0 //tile:55 + , 0xc6, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0xc6, 0x0 //tile:56 + , 0xc6, 0xc6, 0xc6, 0x7c, 0x18, 0x30, 0xe0, 0x0 //tile:57 + , 0xfe, 0x6, 0xc, 0x18, 0x30, 0x60, 0xfe, 0x0 //tile:58 + , 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x0 //tile:59 + , 0xc0, 0x60, 0x30, 0x18, 0xc, 0x6, 0x2, 0x0 //tile:60 + , 0x3c, 0xc, 0xc, 0xc, 0xc, 0xc, 0x3c, 0x0 //tile:61 + , 0x10, 0x38, 0x6c, 0xc6, 0x0, 0x0, 0x0, 0x0 //tile:62 + , 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff //tile:63 + , 0x18, 0x18, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0 //tile:64 + , 0x0, 0x0, 0x7c, 0x6, 0x7e, 0xc6, 0x7e, 0x0 //tile:65 + , 0xc0, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xfc, 0x0 //tile:66 + , 0x0, 0x0, 0x7c, 0xc6, 0xc0, 0xc6, 0x7c, 0x0 //tile:67 + , 0x6, 0x6, 0x6, 0x7e, 0xc6, 0xc6, 0x7e, 0x0 //tile:68 + , 0x0, 0x0, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x0 //tile:69 + , 0x1c, 0x36, 0x30, 0x78, 0x30, 0x30, 0x78, 0x0 //tile:70 + , 0x0, 0x0, 0x7e, 0xc6, 0xc6, 0x7e, 0x6, 0xfc //tile:71 + , 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x0 //tile:72 + , 0x18, 0x0, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x0 //tile:73 + , 0x6, 0x0, 0x6, 0x6, 0x6, 0x6, 0xc6, 0x7c //tile:74 + , 0xc0, 0xc0, 0xcc, 0xd8, 0xf8, 0xcc, 0xc6, 0x0 //tile:75 + , 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x0 //tile:76 + , 0x0, 0x0, 0xcc, 0xfe, 0xfe, 0xd6, 0xd6, 0x0 //tile:77 + , 0x0, 0x0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x0 //tile:78 + , 0x0, 0x0, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x0 //tile:79 + , 0x0, 0x0, 0xfc, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0 //tile:80 + , 0x0, 0x0, 0x7e, 0xc6, 0xc6, 0x7e, 0x6, 0x6 //tile:81 + , 0x0, 0x0, 0xfc, 0xc6, 0xc0, 0xc0, 0xc0, 0x0 //tile:82 + , 0x0, 0x0, 0x7e, 0xc0, 0x7c, 0x6, 0xfc, 0x0 //tile:83 + , 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0xe, 0x0 //tile:84 + , 0x0, 0x0, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x0 //tile:85 + , 0x0, 0x0, 0xc6, 0xc6, 0xc6, 0x7c, 0x38, 0x0 //tile:86 + , 0x0, 0x0, 0xc6, 0xc6, 0xd6, 0xfe, 0x6c, 0x0 //tile:87 + , 0x0, 0x0, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x0 //tile:88 + , 0x0, 0x0, 0xc6, 0xc6, 0xc6, 0x7e, 0x6, 0xfc //tile:89 + , 0x0, 0x0, 0xfe, 0xc, 0x38, 0x60, 0xfe, 0x0 //tile:90 + , 0xe, 0x18, 0x18, 0x70, 0x18, 0x18, 0xe, 0x0 //tile:91 + , 0x18, 0x18, 0x18, 0x0, 0x18, 0x18, 0x18, 0x0 //tile:92 + , 0x70, 0x18, 0x18, 0xe, 0x18, 0x18, 0x70, 0x0 //tile:93 + , 0x76, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 //tile:94 + , 0x0, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x0 //tile:95 +}; + +inline void clearScreen(void) { + u8 *frame = gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL); + memset(frame, 0, 320 * 240 * 3); +} + +void drawPixelRGB(int x, int y, u8 r, u8 g, u8 b) { + y = 240 - y; + x = x; + u32 v = (y + x * 240) * 3; + u8 *topLeftFB = gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL); + topLeftFB[v] = (b >> 3) + ((g & 0x1C) << 3); + topLeftFB[v+1] = ((g & 0xE0) >> 5) + (r & 0xF8); +} + +void drawString(int sx, int sy, char *text, ...) { + char str[1024]; + va_list args; + va_start(args, text); + vsnprintf(str, 1023, text, args); + va_end(args); + + int i; + for(i = 0; i < strlen(str); i++) { + int fntnum = (str[i] - 32) & 0xFF; + int y; + for(y = 0; y < 8; y++) { + int currbyte = fonts[(fntnum * 8) + y]; + //Desenha sprite de 1BPP + int x; + int mult = 0x80; + for(x = 0; x < 8; x++) { + if((currbyte & mult) == mult) { + drawPixelRGB(sx + x, sy + y, 0xFF, 0xFF, 0xFF); + drawPixelRGB(sx + x, sy + y + 1, 0, 0, 0); //Sombra + } + mult /= 2; + } + } + sx += 8; + } +} From 0de6f0fd77c73683be67ecdf7bed8059e3c0fb4c Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 6 Dec 2014 12:58:27 +0000 Subject: [PATCH 021/140] .gitignore smdh --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 50aebd1..8366875 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ 3DS/*.elf 3DS/*stripped.elf 3DS/*.3dsx +3DS/*.smdh 3DS/*.3ds 3DS/*.cia PC/build/ From 002f11646e8f85a51b3d73412ec2e0087d6777c6 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 6 Dec 2014 12:59:27 +0000 Subject: [PATCH 022/140] settings structure --- 3DS/include/settings.h | 3 ++- 3DS/source/settings.c | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/3DS/include/settings.h b/3DS/include/settings.h index 91ea376..31e9a9e 100644 --- a/3DS/include/settings.h +++ b/3DS/include/settings.h @@ -3,7 +3,8 @@ #include struct settings { - u8 IPParts[4]; + char IPString[16]; + int port; } settings; extern Handle fileHandle; diff --git a/3DS/source/settings.c b/3DS/source/settings.c index 6026b7a..2ae2258 100644 --- a/3DS/source/settings.c +++ b/3DS/source/settings.c @@ -21,7 +21,6 @@ bool readSettings(void) { ret = FSFILE_GetSize(fileHandle, &size); if(ret) return false; - //buffer = linearAlloc(size); buffer = malloc(size); if(!buffer) return false; @@ -31,9 +30,14 @@ bool readSettings(void) { ret = FSFILE_Close(fileHandle); if(ret) return false; + strncpy(settings.IPString, (char *)buffer, 15); + buffer[15] = '\0'; + //inet_pton(AF_INET, buffer, &(saout.sin_addr)); inet_pton4((const char *)buffer, (unsigned char *)&(saout.sin_addr)); + settings.port = DEFAULT_PORT; + free(buffer); return true; From 50fd42034661a9aad3f13559753328a8073472ae Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 6 Dec 2014 13:01:04 +0000 Subject: [PATCH 023/140] Text --- 3DS/source/main.c | 48 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/3DS/source/main.c b/3DS/source/main.c index 8560ea7..8537f3a 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -6,6 +6,7 @@ #include "wireless.h" #include "settings.h" +#include "font.h" int main(void) { srvInit(); @@ -15,17 +16,57 @@ int main(void) { gfxInit(); gfxSet3D(false); + clearScreen(); + drawString(10, 10, "Initing FS..."); + gfxFlushBuffers(); + gfxSwapBuffers(); + fsInit(); + clearScreen(); + drawString(10, 10, "Initing SOC..."); + gfxFlushBuffers(); + gfxSwapBuffers(); + SOC_Initialize((u32 *)memalign(0x1000, 0x100000), 0x100000); - if(!readSettings()) goto exit; + clearScreen(); + drawString(10, 10, "Reading IP..."); + gfxFlushBuffers(); + gfxSwapBuffers(); + + if(!readSettings()) { + while(aptMainLoop()) { + gspWaitForVBlank(); + hidScanInput(); + + clearScreen(); + drawString(10, 10, "Failed! Press Start and Select to exit."); + + u32 kHeld = hidKeysHeld(); + if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) goto exit; + + gfxFlushBuffers(); + gfxSwapBuffers(); + } + } - int port = DEFAULT_PORT; + clearScreen(); + drawString(10, 10, "Connecting to %s on port %d...", settings.IPString, settings.port); + gfxFlushBuffers(); + gfxSwapBuffers(); - openSocket(port); + openSocket(settings.port); sendConnectionRequest(); + clearScreen(); + gfxFlushBuffers(); + gfxSwapBuffers(); + + clearScreen(); + gfxFlushBuffers(); + gfxSwapBuffers(); + while(aptMainLoop()) { gspWaitForVBlank(); hidScanInput(); @@ -39,7 +80,6 @@ int main(void) { touchRead(&touch); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) break; - //if(cstick.dx || cstick.dy) break; sendKeys(kHeld, cstick, touch); From e25f8522678ad25c8f7b0ca4354eb168e6866c33 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 6 Dec 2014 13:14:43 +0000 Subject: [PATCH 024/140] Better error handling when vJoy not supported --- PC/include/joystick.h | 3 +-- PC/source/joystick.c | 11 ++++++++--- PC/source/main.c | 18 ++++++++++++++---- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/PC/include/joystick.h b/PC/include/joystick.h index 5518b17..37c57db 100644 --- a/PC/include/joystick.h +++ b/PC/include/joystick.h @@ -13,5 +13,4 @@ extern int ContPovNumber; extern UINT iInterface; extern BOOL ContinuousPOV; -void updateJoystick(int x, int y); - +BOOL updateJoystick(int x, int y); diff --git a/PC/source/joystick.c b/PC/source/joystick.c index 7d28ac5..3dbf6b6 100644 --- a/PC/source/joystick.c +++ b/PC/source/joystick.c @@ -1,4 +1,5 @@ #include +#include #include "joystick.h" @@ -6,7 +7,7 @@ int ContPovNumber; UINT iInterface = 1; BOOL ContinuousPOV = FALSE; -void updateJoystick(int x, int y) { +BOOL updateJoystick(int x, int y) { BYTE id = (BYTE)iInterface; JOYSTICK_POSITION iReport; @@ -31,9 +32,13 @@ void updateJoystick(int x, int y) { }; if(!UpdateVJD(iInterface, (PVOID)&iReport)) { - printf("vJoy device %d failed - try to enable device then press enter\n", iInterface); + /*printf("vJoy device %d failed - try to enable device\n", iInterface); + printf("PRESS ENTER TO CONTINUE\n"); getchar(); AcquireVJD(iInterface); - ContinuousPOV = (BOOL)GetVJDContPovNumber(iInterface); + ContinuousPOV = (BOOL)GetVJDContPovNumber(iInterface);*/ + return false; } + + return true; } diff --git a/PC/source/main.c b/PC/source/main.c index 4b2e5ac..59bf07d 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -3,6 +3,7 @@ #define VERSION 0.01 #include +#include #include #include "wireless.h" @@ -13,19 +14,28 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) { printf("3DS Controller Server %.2f\n", VERSION); + bool vJoy = true; UINT iInterface = 1; - if(!vJoyEnabled()) { - printf("vJoy failed! Buttons will still work, but control stick won't work.\n"); + + if(vJoy && !vJoyEnabled()) { + printf("vJoy failed (1)! Buttons will still work, but control stick won't work.\n"); + vJoy = false; } enum VjdStat status = GetVJDStatus(iInterface); - if((status == VJD_STAT_OWN) || ((status == VJD_STAT_FREE) && (!AcquireVJD(iInterface)))) { + if(vJoy && (status == VJD_STAT_OWN || (status == VJD_STAT_FREE && !AcquireVJD(iInterface)))) { printf("vJoy failed (2)! Buttons will still work, but control stick won't work.\n"); + vJoy = false; } ContPovNumber = GetVJDContPovNumber(iInterface); //int DiscPovNumber = GetVJDDiscPovNumber(iInterface); + if(vJoy && !updateJoystick(128 * 128, 128 * 128)) { + printf("vJoy failed (3)! Buttons will still work, but control stick won't work.\n"); + vJoy = false; + } + initNetwork(); printf("Running on: %s\n\n", hostName); @@ -101,7 +111,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) SetCursorPos(p.x + (currentTouch.x - lastTouch.x), p.y + (currentTouch.y - lastTouch.y)); } - updateJoystick((cstick.x + 128) * 128, (128 - cstick.y) * 128); + if(vJoy) updateJoystick((cstick.x + 128) * 128, (128 - cstick.y) * 128); break; } } From 61f3572ee5d9aaed57a75592ea716f7b3ba70a9e Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 6 Dec 2014 13:29:38 +0000 Subject: [PATCH 025/140] Base of custom key bindings --- PC/include/settings.h | 19 +++++++++++++++++ PC/source/main.c | 38 ++++++++++++++++++--------------- PC/source/settings.c | 30 ++++++++++++++++++++++++++ Release/3DS/3DSController.smdh | Bin 0 -> 14016 bytes 4 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 PC/include/settings.h create mode 100644 PC/source/settings.c create mode 100644 Release/3DS/3DSController.smdh diff --git a/PC/include/settings.h b/PC/include/settings.h new file mode 100644 index 0000000..cea633a --- /dev/null +++ b/PC/include/settings.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +enum analogue { + mouse, + joystick, +}; + +struct settings { + enum analogue circlePad; + enum analogue touch; + int A, B, X, Y, L, R, Left, Right, Up, Down, Start, Select, Tap; +}; + +extern struct settings settings; +extern struct settings defaultSettings; + +bool readSettings(void); diff --git a/PC/source/main.c b/PC/source/main.c index 59bf07d..fc35eaa 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -10,6 +10,7 @@ #include "keys.h" #include "general.h" #include "joystick.h" +#include "settings.h" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) { printf("3DS Controller Server %.2f\n", VERSION); @@ -18,13 +19,13 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) UINT iInterface = 1; if(vJoy && !vJoyEnabled()) { - printf("vJoy failed (1)! Buttons will still work, but control stick won't work.\n"); + printf("vJoy failed (1)! Buttons will still work, but joy stick won't work.\n"); vJoy = false; } enum VjdStat status = GetVJDStatus(iInterface); if(vJoy && (status == VJD_STAT_OWN || (status == VJD_STAT_FREE && !AcquireVJD(iInterface)))) { - printf("vJoy failed (2)! Buttons will still work, but control stick won't work.\n"); + printf("vJoy failed (2)! Buttons will still work, but joy stick won't work.\n"); vJoy = false; } @@ -32,7 +33,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) //int DiscPovNumber = GetVJDDiscPovNumber(iInterface); if(vJoy && !updateJoystick(128 * 128, 128 * 128)) { - printf("vJoy failed (3)! Buttons will still work, but control stick won't work.\n"); + printf("vJoy failed (3)! Buttons will still work, but joy stick won't work.\n"); vJoy = false; } @@ -40,6 +41,10 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) printf("Running on: %s\n\n", hostName); + if(!readSettings()) { + printf("Couldn't read settings file, using default key bindings\n"); + } + startListening(); while(1) { @@ -84,20 +89,19 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) memcpy(¤tTouch, &((struct packet *)buffer)->touch, 4); #pragma GCC diagnostic pop - handleKey(KEY_A, 'A'); - handleKey(KEY_B, 'B'); - handleKey(KEY_SELECT, VK_BACK); - handleKey(KEY_START, VK_RETURN); - handleKey(KEY_DRIGHT, VK_RIGHT); - handleKey(KEY_DLEFT, VK_LEFT); - handleKey(KEY_DUP, VK_UP); - handleKey(KEY_DDOWN, VK_DOWN); - handleKey(KEY_R, 'R'); - handleKey(KEY_L, 'L'); - handleKey(KEY_X, 'X'); - handleKey(KEY_Y, 'Y'); - - //handleKey(KEY_TOUCH, VK_LBUTTON); + handleKey(KEY_A, settings.A); + handleKey(KEY_B, settings.B); + handleKey(KEY_SELECT, settings.Select); + handleKey(KEY_START, settings.Start); + handleKey(KEY_DRIGHT, settings.Right); + handleKey(KEY_DLEFT, settings.Left); + handleKey(KEY_DUP, settings.Up); + handleKey(KEY_DDOWN, settings.Down); + handleKey(KEY_R, settings.R); + handleKey(KEY_L, settings.L); + handleKey(KEY_X, settings.X); + handleKey(KEY_Y, settings.Y); + handleKey(KEY_TOUCH, settings.Tap); //handleKey(KEY_LID, 'I'); if(newpress(KEY_TOUCH)) { diff --git a/PC/source/settings.c b/PC/source/settings.c new file mode 100644 index 0000000..32c1500 --- /dev/null +++ b/PC/source/settings.c @@ -0,0 +1,30 @@ +#include +#include +#include + +#include "settings.h" + +struct settings settings; + +struct settings defaultSettings = { + circlePad: joystick, + touch: mouse, + A: 'A', + B: 'B', + X: 'X', + Y: 'Y', + L: 'L', + R: 'R', + Left: VK_LEFT, + Right: VK_RIGHT, + Up: VK_UP, + Down: VK_DOWN, + Start: VK_RETURN, + Select: VK_BACK, + Tap: 'T', +}; + +bool readSettings(void) { + memcpy(&settings, &defaultSettings, sizeof(struct settings)); + return true; +} diff --git a/Release/3DS/3DSController.smdh b/Release/3DS/3DSController.smdh new file mode 100644 index 0000000000000000000000000000000000000000..1abd09439c4a5d0a1a530f21f405af0580f8a579 GIT binary patch literal 14016 zcmeHNF-Tic6upB(28Ta%_=7_PhYAjcT52GRwuLHWQ0t)JAmUI`TiVp2NEZniL>x-! zAd(@VgAj*6G6-e~m_e|E5C_3OWcY(ah7Nz|@Op2r&;LV=`9F%!;oS`H{r~Q}_rCk? zdH23gX5w$&0n!V212YhY*YFuW!8iDd?MM7AWAAb36})^LMNd-8Yj_W<=<9Eatke6i z$nn=|_5N%8Yy7Llpi1o;{~G@q|0)rvR=38##=pkDS`4bxuJNz&uko)EfogSY{A>Jc z{Hw*FO6?l|8vh#qDiNqwx5mH5zsA2>464+w8vos{U1$p6fl`r~OU0O7G3#cSxNNtpUg8)%w9JD zO2yx60PHV0H)c<5o*(rtQS64V19+ex;A;N-s2XKm#5LZZ09(mYk+^6V3Yo0ad4`vxkXcD^ z4DU}rAGZYWM`La7)Dm?wo?zarQ@~whDr7?A07hz{KZk3z(EoilKp`X7OdzqH#pTl0~Wn~r?J z6WMznQEr=&U`_ErS>ev4oK*rFzQFcB|y0-N$3GsID3Ui+&?C4li ze)5~|TxtG#LGzpPl~lwRtQvnT(|NZ9G9WNGEE}?-VO`REQkbMCnND z+%Ue%I)^nH@l!*zs|S_`g$Rvvy)+ggX-sw$V0lnJ1#R8BARQ4{F;G3=r9IDzs;CLD z5)4*v@LpPoPC_ZbSZMB4){P4dUJuD7KLX6=gVrZ!I{+KgB!S6a?6l{yaL8NFuun#I z+s_C(a*k-_8ksD%#A0X^V^q@J(iR#9)|3;Ik{f{HE(ncv-djGDgL0+}j7+wVr;u;XEH_RMKAi z!TrPehE4>|lNbMUBTF_?lp*hqE*h0~gdv7;@@!W=0}SE4j!q%J^d0Y%vVNmEvv{i> z@yK%}dwZ^Q%FEt+=?^?DT>IplFn0K4l5bSBWX06x*-oo{UTfA3LT@vLVJ|{)IJCrf zbwc++QixcWHEpwWy6N#ZfxSo=@0hfwt@L|s@g}3V{%_Y~%jnGIJ#FS|l^* Date: Sun, 7 Dec 2014 13:37:55 +0000 Subject: [PATCH 026/140] Circle pad and touch customisable --- PC/source/main.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/PC/source/main.c b/PC/source/main.c index fc35eaa..91d2b3b 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -110,12 +110,25 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) } if(currentKeys & KEY_TOUCH) { + if(settings.touch == mouse) { + POINT p; + GetCursorPos(&p); + SetCursorPos(p.x + (currentTouch.x - lastTouch.x), p.y + (currentTouch.y - lastTouch.y)); + } + else if(settings.touch == joystick) { + if(vJoy) updateJoystick((currentTouch.x) * 128, (240 - currentTouch.y) * 128); + } + } + + if(settings.circlePad == mouse) { POINT p; GetCursorPos(&p); - SetCursorPos(p.x + (currentTouch.x - lastTouch.x), p.y + (currentTouch.y - lastTouch.y)); + SetCursorPos(p.x + cstick.x / 64, p.y + cstick.y / 64); + } + else if(settings.circlePad == joystick) { + if(vJoy) updateJoystick((cstick.x + 128) * 128, (128 - cstick.y) * 128); } - if(vJoy) updateJoystick((cstick.x + 128) * 128, (128 - cstick.y) * 128); break; } } From 4c061c41dc8fb8953484709e44c13f5fc84f2abc Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 7 Dec 2014 13:47:50 +0000 Subject: [PATCH 027/140] Correct name of circlePad --- PC/include/keys.h | 4 ++-- PC/include/wireless.h | 2 +- PC/source/keys.c | 2 +- PC/source/main.c | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/PC/include/keys.h b/PC/include/keys.h index abb10c0..293b3b5 100644 --- a/PC/include/keys.h +++ b/PC/include/keys.h @@ -44,7 +44,7 @@ typedef enum { KEY_RIGHT = KEY_DRIGHT | KEY_CPAD_RIGHT, } KEYPAD_BITS; -struct cstick { +struct circlePad { short x; short y; }; @@ -57,7 +57,7 @@ struct touch { extern unsigned int lastKeys; extern unsigned int currentKeys; -extern struct cstick cstick; +extern struct circlePad circlePad; extern struct touch lastTouch; extern struct touch currentTouch; diff --git a/PC/include/wireless.h b/PC/include/wireless.h index ae894e3..4d30048 100644 --- a/PC/include/wireless.h +++ b/PC/include/wireless.h @@ -23,7 +23,7 @@ struct packet { struct { short x; short y; - } cstick; + } circlePad; struct { unsigned short x; diff --git a/PC/source/keys.c b/PC/source/keys.c index ac60531..8c5d258 100644 --- a/PC/source/keys.c +++ b/PC/source/keys.c @@ -3,7 +3,7 @@ unsigned int lastKeys; unsigned int currentKeys; -struct cstick cstick; +struct circlePad circlePad; struct touch lastTouch; struct touch currentTouch; diff --git a/PC/source/main.c b/PC/source/main.c index 91d2b3b..e2bb407 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -58,8 +58,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) case CONNECT: lastKeys = 0; currentKeys = 0; - cstick.x = 0; - cstick.y = 0; + circlePad.x = 0; + circlePad.y = 0; lastTouch.x = 0; lastTouch.y = 0; currentTouch.x = 0; @@ -85,7 +85,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" memcpy(¤tKeys, &((struct packet *)buffer)->keys, 4); - memcpy(&cstick, &((struct packet *)buffer)->cstick, 4); + memcpy(&circlePad, &((struct packet *)buffer)->circlePad, 4); memcpy(¤tTouch, &((struct packet *)buffer)->touch, 4); #pragma GCC diagnostic pop @@ -123,10 +123,10 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) if(settings.circlePad == mouse) { POINT p; GetCursorPos(&p); - SetCursorPos(p.x + cstick.x / 64, p.y + cstick.y / 64); + SetCursorPos(p.x + circlePad.x / 64, p.y + circlePad.y / 64); } else if(settings.circlePad == joystick) { - if(vJoy) updateJoystick((cstick.x + 128) * 128, (128 - cstick.y) * 128); + if(vJoy) updateJoystick((circlePad.x + 128) * 128, (128 - circlePad.y) * 128); } break; From 3251bc553c0d98fdc5b9700810420f4806c30b1d Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 7 Dec 2014 13:48:14 +0000 Subject: [PATCH 028/140] Settings --- PC/3DSController.ini | 15 +++++++++++++++ PC/source/settings.c | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 PC/3DSController.ini diff --git a/PC/3DSController.ini b/PC/3DSController.ini new file mode 100644 index 0000000..b61b0d8 --- /dev/null +++ b/PC/3DSController.ini @@ -0,0 +1,15 @@ +circlePad: joystick +touch: mouse +A: A +B: B +X: X +Y: Y +L: L +R: R +Left: VK_LEFT +Right: VK_RIGHT +Up: VK_UP +Down: VK_DOWN +Start: VK_RETURN +Select: VK_BACK +Tap: T \ No newline at end of file diff --git a/PC/source/settings.c b/PC/source/settings.c index 32c1500..4aee4c4 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -25,6 +25,30 @@ struct settings defaultSettings = { }; bool readSettings(void) { + FILE *f; + size_t len = 0; + char *buffer = NULL; + memcpy(&settings, &defaultSettings, sizeof(struct settings)); + + f = fopen("3DSController.ini", "rb"); + if(!f) { + return false; + } + + fseek(f, 0, SEEK_END); + len = ftell(f); + rewind(f); + + buffer = malloc(len); + if(!buffer) { + fclose(f); + return false; + } + + + + fclose(f); + return true; } From 4654c44c0b67ef3f7d84125e7a96606125c967f5 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 7 Dec 2014 15:07:13 +0000 Subject: [PATCH 029/140] Reads settings maybe --- PC/source/settings.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/PC/source/settings.c b/PC/source/settings.c index 4aee4c4..8c5c048 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -24,6 +24,23 @@ struct settings defaultSettings = { Tap: 'T', }; +static bool getSetting(char *name, char *src, char *dest) { + char *start = strstr(src, name) + strlen(name); + + if(start) { + char *end = start + strlen(start); + if(strstr(start, "\n") < end) end = strstr(start, "\n") - 1; + size_t size = (size_t)end - (size_t)start; + + strncpy(dest, start, size); + dest[size] = '\0'; + + return true; + } + + return false; +} + bool readSettings(void) { FILE *f; size_t len = 0; @@ -46,7 +63,31 @@ bool readSettings(void) { return false; } + fread(buffer, 1, len, f); + + char setting[64] = { '\0', }; + + getSetting("circlePad: ", buffer, setting); + if(strcmp(setting, "mouse") == 0) settings.circlePad = mouse; + else if(strcmp(setting, "joystick") == 0) settings.circlePad = joystick; + + getSetting("touch: ", buffer, setting); + if(strcmp(setting, "mouse") == 0) settings.touch = mouse; + else if(strcmp(setting, "joystick") == 0) settings.touch = joystick; + if(getSetting("A: ", buffer, setting)) settings.A = setting[0]; + if(getSetting("B: ", buffer, setting)) settings.B = setting[0]; + if(getSetting("X: ", buffer, setting)) settings.X = setting[0]; + if(getSetting("Y: ", buffer, setting)) settings.Y = setting[0]; + if(getSetting("L: ", buffer, setting)) settings.L = setting[0]; + if(getSetting("R: ", buffer, setting)) settings.R = setting[0]; + if(getSetting("Left: ", buffer, setting)) settings.Left = setting[0]; + if(getSetting("Right: ", buffer, setting)) settings.Right = setting[0]; + if(getSetting("Up: ", buffer, setting)) settings.Up = setting[0]; + if(getSetting("Down: ", buffer, setting)) settings.Down = setting[0]; + if(getSetting("Start: ", buffer, setting)) settings.Start = setting[0]; + if(getSetting("Select: ", buffer, setting)) settings.Select = setting[0]; + if(getSetting("Tap: ", buffer, setting)) settings.Tap = setting[0]; fclose(f); From f57da08e96a4a2f9d4923dc9c5b4682a3b9ece96 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 7 Dec 2014 15:32:49 +0000 Subject: [PATCH 030/140] Support special keys like SPACE, ENTER, ... --- PC/3DSController.ini | 14 +++++++------- PC/source/settings.c | 39 +++++++++++++++++++++++++-------------- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index b61b0d8..86784e0 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -6,10 +6,10 @@ X: X Y: Y L: L R: R -Left: VK_LEFT -Right: VK_RIGHT -Up: VK_UP -Down: VK_DOWN -Start: VK_RETURN -Select: VK_BACK -Tap: T \ No newline at end of file +Left: LEFT +Right: RIGHT +Up: UP +Down: DOWN +Start: ENTER +Select: BACKSPACE +Tap: SPACE \ No newline at end of file diff --git a/PC/source/settings.c b/PC/source/settings.c index 8c5c048..5a023c1 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -41,6 +41,17 @@ static bool getSetting(char *name, char *src, char *dest) { return false; } +static int getButton(char *string) { + if(strcmp(string, "SPACE") == 0) return VK_SPACE; + else if(strcmp(string, "ENTER") == 0) return VK_RETURN; + else if(strcmp(string, "BACKSPACE") == 0) return VK_BACK; + else if(strcmp(string, "LEFT") == 0) return VK_LEFT; + else if(strcmp(string, "RIGHT") == 0) return VK_RIGHT; + else if(strcmp(string, "UP") == 0) return VK_UP; + else if(strcmp(string, "DOWN") == 0) return VK_DOWN; + else return (int)*string; +} + bool readSettings(void) { FILE *f; size_t len = 0; @@ -65,7 +76,7 @@ bool readSettings(void) { fread(buffer, 1, len, f); - char setting[64] = { '\0', }; + char setting[64] = { '\0' }; getSetting("circlePad: ", buffer, setting); if(strcmp(setting, "mouse") == 0) settings.circlePad = mouse; @@ -75,19 +86,19 @@ bool readSettings(void) { if(strcmp(setting, "mouse") == 0) settings.touch = mouse; else if(strcmp(setting, "joystick") == 0) settings.touch = joystick; - if(getSetting("A: ", buffer, setting)) settings.A = setting[0]; - if(getSetting("B: ", buffer, setting)) settings.B = setting[0]; - if(getSetting("X: ", buffer, setting)) settings.X = setting[0]; - if(getSetting("Y: ", buffer, setting)) settings.Y = setting[0]; - if(getSetting("L: ", buffer, setting)) settings.L = setting[0]; - if(getSetting("R: ", buffer, setting)) settings.R = setting[0]; - if(getSetting("Left: ", buffer, setting)) settings.Left = setting[0]; - if(getSetting("Right: ", buffer, setting)) settings.Right = setting[0]; - if(getSetting("Up: ", buffer, setting)) settings.Up = setting[0]; - if(getSetting("Down: ", buffer, setting)) settings.Down = setting[0]; - if(getSetting("Start: ", buffer, setting)) settings.Start = setting[0]; - if(getSetting("Select: ", buffer, setting)) settings.Select = setting[0]; - if(getSetting("Tap: ", buffer, setting)) settings.Tap = setting[0]; + if(getSetting("A: ", buffer, setting)) settings.A = getButton(setting); + if(getSetting("B: ", buffer, setting)) settings.B = getButton(setting); + if(getSetting("X: ", buffer, setting)) settings.X = getButton(setting); + if(getSetting("Y: ", buffer, setting)) settings.Y = getButton(setting); + if(getSetting("L: ", buffer, setting)) settings.L = getButton(setting); + if(getSetting("R: ", buffer, setting)) settings.R = getButton(setting); + if(getSetting("Left: ", buffer, setting)) settings.Left = getButton(setting); + if(getSetting("Right: ", buffer, setting)) settings.Right = getButton(setting); + if(getSetting("Up: ", buffer, setting)) settings.Up = getButton(setting); + if(getSetting("Down: ", buffer, setting)) settings.Down = getButton(setting); + if(getSetting("Start: ", buffer, setting)) settings.Start = getButton(setting); + if(getSetting("Select: ", buffer, setting)) settings.Select = getButton(setting); + if(getSetting("Tap: ", buffer, setting)) settings.Tap = getButton(setting); fclose(f); From 23bc5d56378e39c4431aceb1c5cc49a1f4a138f2 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 7 Dec 2014 15:48:08 +0000 Subject: [PATCH 031/140] Fixed reading settings --- PC/source/main.c | 2 +- PC/source/settings.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/PC/source/main.c b/PC/source/main.c index e2bb407..a734204 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -42,7 +42,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) printf("Running on: %s\n\n", hostName); if(!readSettings()) { - printf("Couldn't read settings file, using default key bindings\n"); + printf("Couldn't read settings file, using default key bindings.\n"); } startListening(); diff --git a/PC/source/settings.c b/PC/source/settings.c index 5a023c1..70a85f8 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -29,7 +29,7 @@ static bool getSetting(char *name, char *src, char *dest) { if(start) { char *end = start + strlen(start); - if(strstr(start, "\n") < end) end = strstr(start, "\n") - 1; + if(strstr(start, "\n") - 1 < end) end = strstr(start, "\n") - 1; size_t size = (size_t)end - (size_t)start; strncpy(dest, start, size); @@ -49,7 +49,8 @@ static int getButton(char *string) { else if(strcmp(string, "RIGHT") == 0) return VK_RIGHT; else if(strcmp(string, "UP") == 0) return VK_UP; else if(strcmp(string, "DOWN") == 0) return VK_DOWN; - else return (int)*string; + + return (int)string[0]; } bool readSettings(void) { From ebfedb97f9e91cac72bac9cd165eb054a1ec12af Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 7 Dec 2014 17:22:15 +0000 Subject: [PATCH 032/140] Better moving of mouse with circle pad --- PC/source/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/source/main.c b/PC/source/main.c index a734204..1ab92c5 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -123,7 +123,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) if(settings.circlePad == mouse) { POINT p; GetCursorPos(&p); - SetCursorPos(p.x + circlePad.x / 64, p.y + circlePad.y / 64); + SetCursorPos(p.x + circlePad.x / 32, p.y - circlePad.y / 32); } else if(settings.circlePad == joystick) { if(vJoy) updateJoystick((circlePad.x + 128) * 128, (128 - circlePad.y) * 128); From 9c6741a45090f13c849dd94c300dff533a1a500e Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 7 Dec 2014 17:22:39 +0000 Subject: [PATCH 033/140] Clean up repo --- Release/3DS/3DSController.smdh | Bin 14016 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Release/3DS/3DSController.smdh diff --git a/Release/3DS/3DSController.smdh b/Release/3DS/3DSController.smdh deleted file mode 100644 index 1abd09439c4a5d0a1a530f21f405af0580f8a579..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14016 zcmeHNF-Tic6upB(28Ta%_=7_PhYAjcT52GRwuLHWQ0t)JAmUI`TiVp2NEZniL>x-! zAd(@VgAj*6G6-e~m_e|E5C_3OWcY(ah7Nz|@Op2r&;LV=`9F%!;oS`H{r~Q}_rCk? zdH23gX5w$&0n!V212YhY*YFuW!8iDd?MM7AWAAb36})^LMNd-8Yj_W<=<9Eatke6i z$nn=|_5N%8Yy7Llpi1o;{~G@q|0)rvR=38##=pkDS`4bxuJNz&uko)EfogSY{A>Jc z{Hw*FO6?l|8vh#qDiNqwx5mH5zsA2>464+w8vos{U1$p6fl`r~OU0O7G3#cSxNNtpUg8)%w9JD zO2yx60PHV0H)c<5o*(rtQS64V19+ex;A;N-s2XKm#5LZZ09(mYk+^6V3Yo0ad4`vxkXcD^ z4DU}rAGZYWM`La7)Dm?wo?zarQ@~whDr7?A07hz{KZk3z(EoilKp`X7OdzqH#pTl0~Wn~r?J z6WMznQEr=&U`_ErS>ev4oK*rFzQFcB|y0-N$3GsID3Ui+&?C4li ze)5~|TxtG#LGzpPl~lwRtQvnT(|NZ9G9WNGEE}?-VO`REQkbMCnND z+%Ue%I)^nH@l!*zs|S_`g$Rvvy)+ggX-sw$V0lnJ1#R8BARQ4{F;G3=r9IDzs;CLD z5)4*v@LpPoPC_ZbSZMB4){P4dUJuD7KLX6=gVrZ!I{+KgB!S6a?6l{yaL8NFuun#I z+s_C(a*k-_8ksD%#A0X^V^q@J(iR#9)|3;Ik{f{HE(ncv-djGDgL0+}j7+wVr;u;XEH_RMKAi z!TrPehE4>|lNbMUBTF_?lp*hqE*h0~gdv7;@@!W=0}SE4j!q%J^d0Y%vVNmEvv{i> z@yK%}dwZ^Q%FEt+=?^?DT>IplFn0K4l5bSBWX06x*-oo{UTfA3LT@vLVJ|{)IJCrf zbwc++QixcWHEpwWy6N#ZfxSo=@0hfwt@L|s@g}3V{%_Y~%jnGIJ#FS|l^* Date: Mon, 8 Dec 2014 17:34:52 +0000 Subject: [PATCH 034/140] Deal with buffers less hackily --- 3DS/include/wireless.h | 8 ++++---- 3DS/source/wireless.c | 31 ++++++++++++++++++++----------- PC/include/wireless.h | 3 ++- PC/source/wireless.c | 7 ++++--- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/3DS/include/wireless.h b/3DS/include/wireless.h index d5e5284..b3b6129 100644 --- a/3DS/include/wireless.h +++ b/3DS/include/wireless.h @@ -12,7 +12,6 @@ #include "inet_pton.h" -//#define DEFAULT_IP { 192, 168, 0, 4 } #define DEFAULT_PORT 8888 enum NET_COMMANDS { @@ -28,7 +27,7 @@ struct packet { struct { short x; short y; - } cstick; + } circlePad; struct { unsigned short x; @@ -38,9 +37,10 @@ struct packet { extern int sock; extern struct sockaddr_in sain, saout; -extern char outBuf[sizeof(struct packet)], rcvBuf[sizeof(struct packet)]; +//extern char outBuf[sizeof(struct packet)], rcvBuf[sizeof(struct packet)]; +extern struct packet outBuf, rcvBuf; bool openSocket(int port); void sendBuf(int length); void sendConnectionRequest(void); -void sendKeys(unsigned int keys, circlePosition cstick, touchPosition touch); +void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch); diff --git a/3DS/source/wireless.c b/3DS/source/wireless.c index bc88dd4..a7f21f7 100644 --- a/3DS/source/wireless.c +++ b/3DS/source/wireless.c @@ -2,7 +2,8 @@ int sock; struct sockaddr_in sain, saout; -char outBuf[sizeof(struct packet)], rcvBuf[sizeof(struct packet)]; +//char outBuf[sizeof(struct packet)], rcvBuf[sizeof(struct packet)]; +struct packet outBuf, rcvBuf; bool openSocket(int port) { sock = socket(AF_INET, SOCK_DGRAM, 0); @@ -19,23 +20,31 @@ bool openSocket(int port) { } void sendBuf(int length) { - sendto(sock, outBuf, length, 0, (struct sockaddr *)&saout, sizeof(saout)); + sendto(sock, (char *)&outBuf, length, 0, (struct sockaddr *)&saout, sizeof(saout)); } void sendConnectionRequest(void) { - outBuf[0] = CONNECT; + outBuf.command = CONNECT; sendBuf(1); } -void sendKeys(unsigned int keys, circlePosition cstick, touchPosition touch) { - outBuf[0] = KEYS; +void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch) { + //outBuf[0] = KEYS; + outBuf.command = keys; + //memcpy(outBuf + 1, &keys, 4); //memcpy(outBuf + 5, &cstick, 4); - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wstrict-aliasing" - memcpy(&((struct packet *)outBuf)->keys, &keys, 4); - memcpy(&((struct packet *)outBuf)->cstick, &cstick, 4); - memcpy(&((struct packet *)outBuf)->touch, &touch, 4); + + //#pragma GCC diagnostic push + //#pragma GCC diagnostic ignored "-Wstrict-aliasing" + //memcpy(&((struct packet *)outBuf)->keys, &keys, 4); + //memcpy(&((struct packet *)outBuf)->cstick, &cstick, 4); + //memcpy(&((struct packet *)outBuf)->touch, &touch, 4); + //sendBuf(sizeof(struct packet)); + //#pragma GCC diagnostic pop + + memcpy(&outBuf.keys, &keys, 4); + memcpy(&outBuf.circlePad, &circlePad, 4); + memcpy(&outBuf.touch, &touch, 4); sendBuf(sizeof(struct packet)); - #pragma GCC diagnostic pop } diff --git a/PC/include/wireless.h b/PC/include/wireless.h index 4d30048..dbfcdc4 100644 --- a/PC/include/wireless.h +++ b/PC/include/wireless.h @@ -38,7 +38,8 @@ extern struct sockaddr_in client_in; extern int sockaddr_in_sizePtr; -extern char buffer[sizeof(struct packet)]; +//extern char buffer[sizeof(struct packet)]; +extern struct packet buffer; extern char hostName[80]; void initNetwork(void); diff --git a/PC/source/wireless.c b/PC/source/wireless.c index 1f9d1f3..45edbba 100644 --- a/PC/source/wireless.c +++ b/PC/source/wireless.c @@ -9,7 +9,8 @@ struct sockaddr_in client_in; int sockaddr_in_sizePtr = (int)sizeof(struct sockaddr_in); -char buffer[sizeof(struct packet)]; +//char buffer[sizeof(struct packet)]; +struct packet buffer; char hostName[80]; void initNetwork(void) { @@ -48,11 +49,11 @@ void startListening(void) { } void sendBuffer(int length) { - if(sendto(listener, buffer, length, 0, (struct sockaddr *)&client_in, sizeof(struct sockaddr_in)) != length) { + if(sendto(listener, (char *)&buffer, length, 0, (struct sockaddr *)&client_in, sizeof(struct sockaddr_in)) != length) { error("sendto"); } } int receiveBuffer(int length) { - return recvfrom(listener, buffer, length, 0, (struct sockaddr *)&client_in, &sockaddr_in_sizePtr); + return recvfrom(listener, (char *)&buffer, length, 0, (struct sockaddr *)&client_in, &sockaddr_in_sizePtr); } From 30fe81cd562c17b2e10da8e5e7e57921477d3125 Mon Sep 17 00:00:00 2001 From: CTurt Date: Mon, 8 Dec 2014 17:36:43 +0000 Subject: [PATCH 035/140] Less Windowsy --- PC/source/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PC/source/main.c b/PC/source/main.c index 1ab92c5..d91a642 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -48,7 +48,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) startListening(); while(1) { - ZeroMemory(buffer, sizeof(struct packet)); + //ZeroMemory(buffer, sizeof(struct packet)); + memset(&buffer, 0, sizeof(packet)); while(receiveBuffer(sizeof(struct packet)) <= 0) { // Waiting From db8cb27e58c316f4712487a0ad3f5a78874555a0 Mon Sep 17 00:00:00 2001 From: CTurt Date: Mon, 8 Dec 2014 17:39:54 +0000 Subject: [PATCH 036/140] Update PC server --- PC/source/main.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/PC/source/main.c b/PC/source/main.c index d91a642..070be36 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -49,13 +49,13 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) while(1) { //ZeroMemory(buffer, sizeof(struct packet)); - memset(&buffer, 0, sizeof(packet)); + memset(&buffer, 0, sizeof(struct packet)); while(receiveBuffer(sizeof(struct packet)) <= 0) { // Waiting } - switch(buffer[0]) { + switch(buffer.command) { case CONNECT: lastKeys = 0; currentKeys = 0; @@ -66,7 +66,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) currentTouch.x = 0; currentTouch.y = 0; - buffer[0] = CONNECT; + buffer.command = CONNECT; printf("3DS Connected!\n"); Sleep(50); @@ -83,12 +83,16 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) lastKeys = currentKeys; if(currentKeys & KEY_TOUCH) lastTouch = currentTouch; - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wstrict-aliasing" - memcpy(¤tKeys, &((struct packet *)buffer)->keys, 4); - memcpy(&circlePad, &((struct packet *)buffer)->circlePad, 4); - memcpy(¤tTouch, &((struct packet *)buffer)->touch, 4); - #pragma GCC diagnostic pop + //#pragma GCC diagnostic push + //#pragma GCC diagnostic ignored "-Wstrict-aliasing" + //memcpy(¤tKeys, &((struct packet *)buffer)->keys, 4); + //memcpy(&circlePad, &((struct packet *)buffer)->circlePad, 4); + //memcpy(¤tTouch, &((struct packet *)buffer)->touch, 4); + //#pragma GCC diagnostic pop + memcpy(¤tKeys, &buffer.keys, 4); + memcpy(&circlePad, &buffer.circlePad, 4); + memcpy(¤tTouch, &buffer.touch, 4); + handleKey(KEY_A, settings.A); handleKey(KEY_B, settings.B); From 1775a9a406845f56be65a13b5e4b963bc5d1831b Mon Sep 17 00:00:00 2001 From: CTurt Date: Mon, 8 Dec 2014 18:27:03 +0000 Subject: [PATCH 037/140] Print IP addresses --- PC/include/wireless.h | 1 + PC/source/main.c | 7 ++++++- PC/source/wireless.c | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/PC/include/wireless.h b/PC/include/wireless.h index dbfcdc4..881c327 100644 --- a/PC/include/wireless.h +++ b/PC/include/wireless.h @@ -43,6 +43,7 @@ extern struct packet buffer; extern char hostName[80]; void initNetwork(void); +void printIPs(void); void startListening(void); void sendBuffer(int length); int receiveBuffer(int length); diff --git a/PC/source/main.c b/PC/source/main.c index 070be36..7c4da5f 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -39,7 +39,12 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) initNetwork(); - printf("Running on: %s\n\n", hostName); + printf("Running on: %s\n", hostName); + + printf("Your local IP(s):\n"); + printIPs(); + + printf("\n"); if(!readSettings()) { printf("Couldn't read settings file, using default key bindings.\n"); diff --git a/PC/source/wireless.c b/PC/source/wireless.c index 45edbba..5b72572 100644 --- a/PC/source/wireless.c +++ b/PC/source/wireless.c @@ -23,6 +23,24 @@ void initNetwork(void) { } } +void printIPs(void) { + struct hostent *phe = gethostbyname(hostName); + if(phe == 0) { + error("gethostbyname()"); + } + + int i; + for(i = 0; phe->h_addr_list[i] != 0; i++) { + struct in_addr addr; + memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr)); + printf("%s\n", inet_ntoa(addr)); + } + + if(i) { + printf("Usually you want the first one.\n"); + } +} + void startListening(void) { int nret; From 632c42f494fe340c15429154729ab1b805374b6a Mon Sep 17 00:00:00 2001 From: CTurt Date: Mon, 8 Dec 2014 18:29:08 +0000 Subject: [PATCH 038/140] Fixed key command --- 3DS/source/wireless.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3DS/source/wireless.c b/3DS/source/wireless.c index a7f21f7..ee6aec6 100644 --- a/3DS/source/wireless.c +++ b/3DS/source/wireless.c @@ -30,7 +30,7 @@ void sendConnectionRequest(void) { void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch) { //outBuf[0] = KEYS; - outBuf.command = keys; + outBuf.command = KEYS; //memcpy(outBuf + 1, &keys, 4); //memcpy(outBuf + 5, &cstick, 4); From 81a972020ccf416aaf669acca042781321fdcee9 Mon Sep 17 00:00:00 2001 From: CTurt Date: Tue, 9 Dec 2014 18:33:24 +0000 Subject: [PATCH 039/140] Remove junk --- 3DS/include/wireless.h | 1 - 3DS/source/wireless.c | 13 ------------- PC/include/wireless.h | 1 - PC/source/main.c | 7 ------- PC/source/wireless.c | 1 - 5 files changed, 23 deletions(-) diff --git a/3DS/include/wireless.h b/3DS/include/wireless.h index b3b6129..2d50893 100644 --- a/3DS/include/wireless.h +++ b/3DS/include/wireless.h @@ -37,7 +37,6 @@ struct packet { extern int sock; extern struct sockaddr_in sain, saout; -//extern char outBuf[sizeof(struct packet)], rcvBuf[sizeof(struct packet)]; extern struct packet outBuf, rcvBuf; bool openSocket(int port); diff --git a/3DS/source/wireless.c b/3DS/source/wireless.c index ee6aec6..ad93d1b 100644 --- a/3DS/source/wireless.c +++ b/3DS/source/wireless.c @@ -2,7 +2,6 @@ int sock; struct sockaddr_in sain, saout; -//char outBuf[sizeof(struct packet)], rcvBuf[sizeof(struct packet)]; struct packet outBuf, rcvBuf; bool openSocket(int port) { @@ -29,20 +28,8 @@ void sendConnectionRequest(void) { } void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch) { - //outBuf[0] = KEYS; outBuf.command = KEYS; - //memcpy(outBuf + 1, &keys, 4); - //memcpy(outBuf + 5, &cstick, 4); - - //#pragma GCC diagnostic push - //#pragma GCC diagnostic ignored "-Wstrict-aliasing" - //memcpy(&((struct packet *)outBuf)->keys, &keys, 4); - //memcpy(&((struct packet *)outBuf)->cstick, &cstick, 4); - //memcpy(&((struct packet *)outBuf)->touch, &touch, 4); - //sendBuf(sizeof(struct packet)); - //#pragma GCC diagnostic pop - memcpy(&outBuf.keys, &keys, 4); memcpy(&outBuf.circlePad, &circlePad, 4); memcpy(&outBuf.touch, &touch, 4); diff --git a/PC/include/wireless.h b/PC/include/wireless.h index 881c327..1c58c0d 100644 --- a/PC/include/wireless.h +++ b/PC/include/wireless.h @@ -38,7 +38,6 @@ extern struct sockaddr_in client_in; extern int sockaddr_in_sizePtr; -//extern char buffer[sizeof(struct packet)]; extern struct packet buffer; extern char hostName[80]; diff --git a/PC/source/main.c b/PC/source/main.c index 7c4da5f..089fb79 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -88,17 +88,10 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) lastKeys = currentKeys; if(currentKeys & KEY_TOUCH) lastTouch = currentTouch; - //#pragma GCC diagnostic push - //#pragma GCC diagnostic ignored "-Wstrict-aliasing" - //memcpy(¤tKeys, &((struct packet *)buffer)->keys, 4); - //memcpy(&circlePad, &((struct packet *)buffer)->circlePad, 4); - //memcpy(¤tTouch, &((struct packet *)buffer)->touch, 4); - //#pragma GCC diagnostic pop memcpy(¤tKeys, &buffer.keys, 4); memcpy(&circlePad, &buffer.circlePad, 4); memcpy(¤tTouch, &buffer.touch, 4); - handleKey(KEY_A, settings.A); handleKey(KEY_B, settings.B); handleKey(KEY_SELECT, settings.Select); diff --git a/PC/source/wireless.c b/PC/source/wireless.c index 5b72572..33ead36 100644 --- a/PC/source/wireless.c +++ b/PC/source/wireless.c @@ -9,7 +9,6 @@ struct sockaddr_in client_in; int sockaddr_in_sizePtr = (int)sizeof(struct sockaddr_in); -//char buffer[sizeof(struct packet)]; struct packet buffer; char hostName[80]; From 27c8df10b94894a964961f09e35d7537190b451e Mon Sep 17 00:00:00 2001 From: CTurt Date: Tue, 9 Dec 2014 18:36:06 +0000 Subject: [PATCH 040/140] Central Z axis --- PC/source/joystick.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/source/joystick.c b/PC/source/joystick.c index 3dbf6b6..cc8a6de 100644 --- a/PC/source/joystick.c +++ b/PC/source/joystick.c @@ -15,7 +15,7 @@ BOOL updateJoystick(int x, int y) { iReport.wAxisX = x; iReport.wAxisY = y; - iReport.wAxisZ = 0; + iReport.wAxisZ = 128 * 128; iReport.wAxisZRot = 0; iReport.wAxisXRot = 0; From 1e0ea5a41a0c4a9c9cc814fa5d6389d76088e0e9 Mon Sep 17 00:00:00 2001 From: Corwin Date: Wed, 10 Dec 2014 16:18:00 +0000 Subject: [PATCH 041/140] Added inputting of IP addresses -> not actually useful yet --- 3DS/include/input.h | 12 ++++++++ 3DS/source/input.c | 74 +++++++++++++++++++++++++++++++++++++++++++++ 3DS/source/main.c | 43 +++++++++++++++++++++++++- 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 3DS/include/input.h create mode 100644 3DS/source/input.c diff --git a/3DS/include/input.h b/3DS/include/input.h new file mode 100644 index 0000000..ba21997 --- /dev/null +++ b/3DS/include/input.h @@ -0,0 +1,12 @@ +#pragma once + +#include +#include +#include + +#include <3ds.h> + +#include "font.h" + + +int inputIP(void); \ No newline at end of file diff --git a/3DS/source/input.c b/3DS/source/input.c new file mode 100644 index 0000000..a097838 --- /dev/null +++ b/3DS/source/input.c @@ -0,0 +1,74 @@ +#include +#include +#include + +#include <3ds.h> + +#include "font.h" +#include "input.h" + +int inputIP(void) { + + touchPosition myTouchPosition; + + //Pass pointer to hidTouchRead function which updates values. + hidTouchRead(&myTouchPosition); + + //Read x cord + u16 posX = myTouchPosition.px; + //Read y cord + u16 posY = myTouchPosition.py; + + + //Draw Keypad + //Row One + drawString(160-20,50,"1"); //One + drawString(160,50,"2"); //Two + drawString(160+20,50,"3"); //Three + //Row Two + drawString(160-20,50+20,"4"); //Four + drawString(160,50+20,"5"); //Five + drawString(160+20,50+20,"6"); //Six + //Row Three + drawString(160-20,50+40,"7"); //Severn + drawString(160,50+40,"8"); //Eight + drawString(160+20,50+40,"9"); //Nine + //Row Four + drawString(160-10,50+60,"."); //Dot + drawString(160+10,50+60,"0"); //Zero + + + //Which number pressed + if (posY > 50+50 && posY < 50+70) { //Bottom Strip + if (posX < 160 && posX > 160-20) { //Dot + return 11; + } else if (posX < 160+20 && posX > 160) { //Zero + return 0; + } + } else if (posX < 160-10 && posX > 160-30) { //First Column + if (posY < 50+10 && posY > 50-10) { //One + return 1; + } else if (posY < 50+30 && posY > 50+10) { //Four + return 4; + } else if (posY < 50+50 && posY > 50+30) { //Severn + return 7; + } + } else if (posX < 160+10 && posX > 160-10) { // Second Column + if (posY < 50+10 && posY > 50-10) { //Two + return 2; + } else if (posY < 50+30 && posY > 50+10) { //Five + return 5; + } else if (posY < 50+50 && posY > 50+30) { //Eight + return 8; + } + } else if (posX < 160+30 && posX > 160+10) { // Third Column + if (posY < 50+10 && posY > 50-10) { //Three + return 3; + } else if (posY < 50+30 && posY > 50+10) { //Six + return 6; + } else if (posY < 50+50 && posY > 50+30) { //Nine + return 9; + } + } + return 10; +} \ No newline at end of file diff --git a/3DS/source/main.c b/3DS/source/main.c index e274522..9ebc482 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -7,6 +7,7 @@ #include "wireless.h" #include "settings.h" #include "font.h" +#include "input.h" int main(void) { srvInit(); @@ -36,12 +37,52 @@ int main(void) { gfxSwapBuffers(); if(!readSettings()) { + int ipReturn; while(aptMainLoop()) { gspWaitForVBlank(); hidScanInput(); clearScreen(); - drawString(10, 10, "Failed to read settings! Press Start and Select to exit."); + drawString(10, 10, "Failed to read settings! Input IP now!"); + + ipReturn = inputIP(); + + switch(ipReturn) { + case 0: + //Zero + break; + case 1: + //One + break; + case 2: + //Two + break; + case 3: + //Three + break; + case 4: + //Four + break; + case 5: + //Five + break; + case 6: + //Six + break; + case 7: + //Severn + break; + case 8: + //Eight + break; + case 9: + //Nine + break; + //Ten -> nothing pressed. + case 11: + //Dot + break; + } u32 kHeld = hidKeysHeld(); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) goto exit; From 33d85e4bd8bf03f3c6648dbf42de55d1a5231dab Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 10 Dec 2014 18:41:15 +0000 Subject: [PATCH 042/140] More consistent capitalisation in settings --- PC/3DSController.ini | 4 ++-- PC/source/settings.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 86784e0..744c813 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -1,5 +1,5 @@ -circlePad: joystick -touch: mouse +Circle Pad: JOYSTICK +Touch: MOUSE A: A B: B X: X diff --git a/PC/source/settings.c b/PC/source/settings.c index 70a85f8..19c930b 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -79,13 +79,13 @@ bool readSettings(void) { char setting[64] = { '\0' }; - getSetting("circlePad: ", buffer, setting); - if(strcmp(setting, "mouse") == 0) settings.circlePad = mouse; - else if(strcmp(setting, "joystick") == 0) settings.circlePad = joystick; + getSetting("Circle Pad: ", buffer, setting); + if(strcmp(setting, "MOUSE") == 0) settings.circlePad = mouse; + else if(strcmp(setting, "JOYSTICK") == 0) settings.circlePad = joystick; - getSetting("touch: ", buffer, setting); - if(strcmp(setting, "mouse") == 0) settings.touch = mouse; - else if(strcmp(setting, "joystick") == 0) settings.touch = joystick; + getSetting("Touch: ", buffer, setting); + if(strcmp(setting, "MOUSE") == 0) settings.touch = mouse; + else if(strcmp(setting, "JOYSTICK") == 0) settings.touch = joystick; if(getSetting("A: ", buffer, setting)) settings.A = getButton(setting); if(getSetting("B: ", buffer, setting)) settings.B = getButton(setting); From 248f442c339e06639cb18301de46b49c90b0c032 Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 10 Dec 2014 18:43:06 +0000 Subject: [PATCH 043/140] Allow unspecified analogue settings --- PC/source/settings.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/PC/source/settings.c b/PC/source/settings.c index 19c930b..7f9b8c1 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -79,13 +79,15 @@ bool readSettings(void) { char setting[64] = { '\0' }; - getSetting("Circle Pad: ", buffer, setting); - if(strcmp(setting, "MOUSE") == 0) settings.circlePad = mouse; - else if(strcmp(setting, "JOYSTICK") == 0) settings.circlePad = joystick; + if(getSetting("Circle Pad: ", buffer, setting)) { + if(strcmp(setting, "MOUSE") == 0) settings.circlePad = mouse; + else if(strcmp(setting, "JOYSTICK") == 0) settings.circlePad = joystick; + } - getSetting("Touch: ", buffer, setting); - if(strcmp(setting, "MOUSE") == 0) settings.touch = mouse; - else if(strcmp(setting, "JOYSTICK") == 0) settings.touch = joystick; + if(getSetting("Touch: ", buffer, setting)) { + if(strcmp(setting, "MOUSE") == 0) settings.touch = mouse; + else if(strcmp(setting, "JOYSTICK") == 0) settings.touch = joystick; + } if(getSetting("A: ", buffer, setting)) settings.A = getButton(setting); if(getSetting("B: ", buffer, setting)) settings.B = getButton(setting); From 8f7d7486063c5294bb9fbb1bd167b98ebd0d99ba Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 10 Dec 2014 18:46:17 +0000 Subject: [PATCH 044/140] Port as integer --- PC/include/wireless.h | 3 ++- PC/source/main.c | 2 ++ PC/source/wireless.c | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/PC/include/wireless.h b/PC/include/wireless.h index 1c58c0d..33b46b5 100644 --- a/PC/include/wireless.h +++ b/PC/include/wireless.h @@ -8,7 +8,6 @@ #include #define IP INADDR_ANY -#define PORT 8888 enum NET_COMMANDS { CONNECT, @@ -31,6 +30,8 @@ struct packet { } touch; }; +extern int port; + extern SOCKET listener; extern SOCKET client; diff --git a/PC/source/main.c b/PC/source/main.c index 089fb79..39c9c97 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -39,6 +39,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) initNetwork(); + printf("Port: %d\n", port); + printf("Running on: %s\n", hostName); printf("Your local IP(s):\n"); diff --git a/PC/source/wireless.c b/PC/source/wireless.c index 33ead36..ee4c66b 100644 --- a/PC/source/wireless.c +++ b/PC/source/wireless.c @@ -2,6 +2,8 @@ #include "wireless.h" +int port = 8888; + SOCKET listener; SOCKET client; @@ -53,7 +55,7 @@ void startListening(void) { serverInfo.sin_family = AF_INET; serverInfo.sin_addr.s_addr = IP; - serverInfo.sin_port = htons(PORT); + serverInfo.sin_port = htons(port); u_long one = 1; ioctlsocket(listener, FIONBIO, &one); From c70d18433f11ed1dd5f56d10077ed933d7c0980b Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 10 Dec 2014 18:52:43 +0000 Subject: [PATCH 045/140] Changeable port --- PC/3DSController.ini | 1 + PC/source/main.c | 8 ++++---- PC/source/settings.c | 10 +++++++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 744c813..b71deca 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -1,3 +1,4 @@ +Port: 8888 Circle Pad: JOYSTICK Touch: MOUSE A: A diff --git a/PC/source/main.c b/PC/source/main.c index 39c9c97..98cebc0 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -37,6 +37,10 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) vJoy = false; } + if(!readSettings()) { + printf("Couldn't read settings file, using default key bindings.\n"); + } + initNetwork(); printf("Port: %d\n", port); @@ -48,10 +52,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) printf("\n"); - if(!readSettings()) { - printf("Couldn't read settings file, using default key bindings.\n"); - } - startListening(); while(1) { diff --git a/PC/source/settings.c b/PC/source/settings.c index 7f9b8c1..e9a8c0f 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -2,6 +2,8 @@ #include #include +#include "wireless.h" + #include "settings.h" struct settings settings; @@ -25,9 +27,11 @@ struct settings defaultSettings = { }; static bool getSetting(char *name, char *src, char *dest) { - char *start = strstr(src, name) + strlen(name); + char *start = strstr(src, name); if(start) { + start += strlen(name); + char *end = start + strlen(start); if(strstr(start, "\n") - 1 < end) end = strstr(start, "\n") - 1; size_t size = (size_t)end - (size_t)start; @@ -79,6 +83,10 @@ bool readSettings(void) { char setting[64] = { '\0' }; + if(getSetting("Port: ", buffer, setting)) { + sscanf(setting, "%d", &port); + } + if(getSetting("Circle Pad: ", buffer, setting)) { if(strcmp(setting, "MOUSE") == 0) settings.circlePad = mouse; else if(strcmp(setting, "JOYSTICK") == 0) settings.circlePad = joystick; From fd112119c7a11e8ffacede31a6f9b10129073c6b Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 10 Dec 2014 19:01:40 +0000 Subject: [PATCH 046/140] IP reading, base of changeable port --- 3DS/source/settings.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/3DS/source/settings.c b/3DS/source/settings.c index 2ae2258..5c6101e 100644 --- a/3DS/source/settings.c +++ b/3DS/source/settings.c @@ -31,10 +31,16 @@ bool readSettings(void) { if(ret) return false; strncpy(settings.IPString, (char *)buffer, 15); - buffer[15] = '\0'; + settings.IPString[15] = '\0'; - //inet_pton(AF_INET, buffer, &(saout.sin_addr)); - inet_pton4((const char *)buffer, (unsigned char *)&(saout.sin_addr)); + if(strchr(settings.IPString, ':')) { + settings.IPString[strchr(settings.IPString, ':') - settings.IPString] = '\0'; + } + + // Todo, get port number and use it + + //inet_pton(AF_INET, settings.IPString, &(saout.sin_addr)); + inet_pton4(settings.IPString, (unsigned char *)&(saout.sin_addr)); settings.port = DEFAULT_PORT; From 996e41212ce86943eeb52f09bcb33749cfc77fca Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 10 Dec 2014 19:19:25 +0000 Subject: [PATCH 047/140] 3DS changeable port --- 3DS/source/main.c | 6 +++--- 3DS/source/settings.c | 14 +++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/3DS/source/main.c b/3DS/source/main.c index 8537f3a..a75406f 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -73,15 +73,15 @@ int main(void) { //irrstScanInput(); u32 kHeld = hidKeysHeld(); - circlePosition cstick; + circlePosition circlePad; //hidCstickRead(&cstick); - hidCircleRead(&cstick); + hidCircleRead(&circlePad); touchPosition touch; touchRead(&touch); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) break; - sendKeys(kHeld, cstick, touch); + sendKeys(kHeld, circlePad, touch); gfxFlushBuffers(); gfxSwapBuffers(); diff --git a/3DS/source/settings.c b/3DS/source/settings.c index 5c6101e..8d7e369 100644 --- a/3DS/source/settings.c +++ b/3DS/source/settings.c @@ -1,6 +1,8 @@ -#include <3ds.h> +#include #include +#include <3ds.h> + #include "wireless.h" #include "settings.h" @@ -33,17 +35,19 @@ bool readSettings(void) { strncpy(settings.IPString, (char *)buffer, 15); settings.IPString[15] = '\0'; + settings.port = DEFAULT_PORT; + if(strchr(settings.IPString, ':')) { settings.IPString[strchr(settings.IPString, ':') - settings.IPString] = '\0'; + + char portString[5] = { '\0' }; + strncpy(portString, strchr((char *)buffer, ':') + 1, 4); + sscanf(portString, "%d", &settings.port); } - // Todo, get port number and use it - //inet_pton(AF_INET, settings.IPString, &(saout.sin_addr)); inet_pton4(settings.IPString, (unsigned char *)&(saout.sin_addr)); - settings.port = DEFAULT_PORT; - free(buffer); return true; From fdebad5c174a3414c4c7f88d7dcda4f751bbf6ee Mon Sep 17 00:00:00 2001 From: CTurt Date: Thu, 11 Dec 2014 08:49:42 +0000 Subject: [PATCH 048/140] Target name --- PC/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PC/Makefile b/PC/Makefile index d669ccf..980624d 100644 --- a/PC/Makefile +++ b/PC/Makefile @@ -11,15 +11,15 @@ OBJS := $(patsubst $(SDIR)/%.c, build/%.o, $(wildcard $(SDIR)/*.c)) PLATFORM = $(shell uname) ifeq ($(findstring Linux,$(PLATFORM)),Linux) - TARGET=$(shell basename $(CURDIR)) + TARGET=3DSController endif ifeq ($(findstring Darwin,$(PLATFORM)),Darwin) - TARGET=$(shell basename $(CURDIR)) + TARGET=3DSController endif ifeq ($(findstring MINGW,$(PLATFORM)),MINGW) - TARGET=$(shell basename $(CURDIR)).exe + TARGET=3DSController.exe endif $(TARGET): $(ODIR) $(OBJS) From 5e17fcba98244e76076e0dba1adb26f94a761553 Mon Sep 17 00:00:00 2001 From: CTurt Date: Thu, 11 Dec 2014 08:50:12 +0000 Subject: [PATCH 049/140] More custom buttons --- PC/source/settings.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/PC/source/settings.c b/PC/source/settings.c index e9a8c0f..c8a74b3 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -47,12 +47,19 @@ static bool getSetting(char *name, char *src, char *dest) { static int getButton(char *string) { if(strcmp(string, "SPACE") == 0) return VK_SPACE; + else if(strcmp(string, "CLICK") == 0) return VK_LBUTTON; + else if(strcmp(string, "RIGHT CLICK") == 0) return VK_RBUTTON; else if(strcmp(string, "ENTER") == 0) return VK_RETURN; else if(strcmp(string, "BACKSPACE") == 0) return VK_BACK; + else if(strcmp(string, "SHIFT") == 0) return VK_SHIFT; + else if(strcmp(string, "TAB") == 0) return VK_TAB; else if(strcmp(string, "LEFT") == 0) return VK_LEFT; else if(strcmp(string, "RIGHT") == 0) return VK_RIGHT; else if(strcmp(string, "UP") == 0) return VK_UP; else if(strcmp(string, "DOWN") == 0) return VK_DOWN; + else if(strcmp(string, "PAGE UP") == 0) return VK_PRIOR; + else if(strcmp(string, "PAGE DOWN") == 0) return VK_NEXT; + else if(strcmp(string, "WINDOWS") == 0) return VK_LWIN; return (int)string[0]; } From 046e15e13c32c639e95939f1919606b49aa36079 Mon Sep 17 00:00:00 2001 From: CTurt Date: Thu, 11 Dec 2014 08:51:29 +0000 Subject: [PATCH 050/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fd0822a..474e5ed 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Firstly, if you want to be able to use the circle pad as a joystick you will nee Copy the executable with the extension that applies to your loader: `3DSController.3dsx` and `3DSController.smdh` for Ninjhax, `3DSController.3ds` for flashcards, or `3DSController.cia` for CFWs, into your 3DS's SD card or flashcard's micro SD card. -Create file called `3DSController.ini` on the root of your 3DS's SD card containing the local IP address of your PC with nothing else, no new lines, etc, for example `192.168.0.4`. Refer [here](http://www.helpfulpctools.com/HowToCheckYourLocalIP.php) if you are unsure of how to find your local IP address. +Create a file called `3DSController.ini` on the root of your 3DS's SD card containing the local IP address of your PC with nothing else, no new lines, etc, for example `192.168.0.4`. Refer [here](http://www.helpfulpctools.com/HowToCheckYourLocalIP.php) if you are unsure of how to find your local IP address. Run `3DSController.exe` on your computer. If you are prompted, make sure to allow it through your firewall. From ef13b16c0991c7ced3da394151867fdad842c83b Mon Sep 17 00:00:00 2001 From: CTurt Date: Thu, 11 Dec 2014 09:07:54 +0000 Subject: [PATCH 051/140] Version 0.2 --- PC/3DSController.ini | 4 ++++ PC/source/main.c | 4 ++-- README.md | 14 ++++++++++---- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index b71deca..47f8a34 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -1,3 +1,7 @@ +Default port is 8888, if you change this, you must change it in the 3DS's 3DSController.ini as well, +Circle Pad and Touch can be either JOYSTICK or MOUSE, +Buttons can either be a letter for example B, or a special key, like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS, + Port: 8888 Circle Pad: JOYSTICK Touch: MOUSE diff --git a/PC/source/main.c b/PC/source/main.c index 98cebc0..c4326e5 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -1,6 +1,6 @@ // 3DS Controller Server -#define VERSION 0.01 +#define VERSION 0.2 #include #include @@ -13,7 +13,7 @@ #include "settings.h" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) { - printf("3DS Controller Server %.2f\n", VERSION); + printf("3DS Controller Server %.1f\n", VERSION); bool vJoy = true; UINT iInterface = 1; diff --git a/README.md b/README.md index 474e5ed..ef2d518 100644 --- a/README.md +++ b/README.md @@ -9,22 +9,28 @@ The latest release will always be downloadable from [here](https://github.com/CT ### Setup and Usage Firstly, if you want to be able to use the circle pad as a joystick you will need to install [vJoy](http://vjoystick.sourceforge.net/site/index.php/download-a-install). However, if you just want to use the buttons, this is not necessary. -Copy the executable with the extension that applies to your loader: `3DSController.3dsx` and `3DSController.smdh` for Ninjhax, `3DSController.3ds` for flashcards, or `3DSController.cia` for CFWs, into your 3DS's SD card or flashcard's micro SD card. +Extract the archive and copy the executable in the `3DS` directory with the extension that applies to your loader: `3DSController.3dsx` and `3DSController.smdh` for Ninjhax, `3DSController.3ds` for flashcards, or `3DSController.cia` for CFWs, into your 3DS's SD card or flashcard's micro SD card. -Create a file called `3DSController.ini` on the root of your 3DS's SD card containing the local IP address of your PC with nothing else, no new lines, etc, for example `192.168.0.4`. Refer [here](http://www.helpfulpctools.com/HowToCheckYourLocalIP.php) if you are unsure of how to find your local IP address. +Create a file called `3DSController.ini` on the root of your 3DS's SD card containing the local IP address of your PC with nothing else, no new lines, etc, for example `192.168.0.4`. If you are unsure of your local IP address, run `3DSController.exe` and it will tell you. Run `3DSController.exe` on your computer. If you are prompted, make sure to allow it through your firewall. Start the application on your 3DS, there is no GUI, it will automatically try to connect to the IP address you put in `3DSController.ini`. -If it wasn't able to read the IP from `3DSController.ini` it will immediately exit. +If it wasn't able to read the IP from `3DSController.ini`, it will notify you and quit. -Otherwise, you will just see a black screen, it should work. To make sure it works, open Notepad and press some buttons on the 3DS, they should show up. You can also test if the joystick works by going to Configure USB Game Controllers in Control Panel, it shows up as vJoy. +Otherwise, you should just see a black screen, this is a good sign. To see if it works, open Notepad and press some buttons on the 3DS, they should show up. You can also test if the joystick works by going to Configure USB Game Controllers in Control Panel, it shows up as vJoy. If using Ninjhax press Start and Select to return to the Homebrew Loader, otherwise you can just exit with the Home button. +### Configuration +To change the port, add `:` followed by the desired port to your 3DS's `3DSController.ini`, for example it should contain, `192.168.0.4:8889` to use port 8889. On the PC's `3DSController.ini`, find the line that says `Port: 8888` and change it to match the port you chose for the 3DS. + +To use custom key bindings, just change the PC's `3DSController.ini` file, it should be straight forward. + ### Troubleshooting - Make sure your 3DS has internet access (turn on the switch on the side of the 3DS so that an orange light shows) and is on the same network as your PC, - Make sure that the `3DSController.ini` is in the root of your 3DS's SD card (not flashcard micro SD), - Make sure that the `3DSController.ini` has the local IP of your computer, not your public IP, - Make sure your firewall isn't blocking the application, +- Try using a different port, \ No newline at end of file From fd11a3e784d11632146c795bee3b679230b1d4aa Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 12 Dec 2014 18:05:24 +0000 Subject: [PATCH 052/140] More description --- 3DS/source/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3DS/source/main.c b/3DS/source/main.c index a75406f..e274522 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -41,7 +41,7 @@ int main(void) { hidScanInput(); clearScreen(); - drawString(10, 10, "Failed! Press Start and Select to exit."); + drawString(10, 10, "Failed to read settings! Press Start and Select to exit."); u32 kHeld = hidKeysHeld(); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) goto exit; From 8cae4956fa78bd77ab4ec721a8df69b69bcb42f8 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 12 Dec 2014 18:07:20 +0000 Subject: [PATCH 053/140] Support for unused keys --- PC/3DSController.ini | 1 + PC/source/keys.c | 4 ++++ PC/source/settings.c | 1 + 3 files changed, 6 insertions(+) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 47f8a34..2923b84 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -1,6 +1,7 @@ Default port is 8888, if you change this, you must change it in the 3DS's 3DSController.ini as well, Circle Pad and Touch can be either JOYSTICK or MOUSE, Buttons can either be a letter for example B, or a special key, like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS, +Alternatively, you can disable a key by binding it to NONE, Port: 8888 Circle Pad: JOYSTICK diff --git a/PC/source/keys.c b/PC/source/keys.c index 8c5d258..6fabc6b 100644 --- a/PC/source/keys.c +++ b/PC/source/keys.c @@ -12,6 +12,8 @@ inline unsigned int mapVirtualKey(unsigned int key) { } void simulateKeyNewpress(unsigned int key) { + if(!key) return; + INPUT ip; ip.type = INPUT_KEYBOARD; ip.ki.wScan = mapVirtualKey(key); @@ -23,6 +25,8 @@ void simulateKeyNewpress(unsigned int key) { } void simulateKeyRelease(unsigned int key) { + if(!key) return; + INPUT ip; ip.type = INPUT_KEYBOARD; ip.ki.wScan = mapVirtualKey(key); diff --git a/PC/source/settings.c b/PC/source/settings.c index c8a74b3..9da38c1 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -60,6 +60,7 @@ static int getButton(char *string) { else if(strcmp(string, "PAGE UP") == 0) return VK_PRIOR; else if(strcmp(string, "PAGE DOWN") == 0) return VK_NEXT; else if(strcmp(string, "WINDOWS") == 0) return VK_LWIN; + else if(strcmp(string, "NONE") == 0) return 0; return (int)string[0]; } From 9bea339d5d594b3dc8ca5dc886855157eb4946f0 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 12 Dec 2014 18:44:26 +0000 Subject: [PATCH 054/140] Better reading of settings --- 3DS/include/settings.h | 5 +++- 3DS/source/settings.c | 53 +++++++++++++++++++++++++++++++----------- PC/3DSController.ini | 2 +- 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/3DS/include/settings.h b/3DS/include/settings.h index 31e9a9e..f5d87df 100644 --- a/3DS/include/settings.h +++ b/3DS/include/settings.h @@ -5,7 +5,10 @@ struct settings { char IPString[16]; int port; -} settings; +}; + +extern struct settings settings; +extern struct settings defaultSettings; extern Handle fileHandle; diff --git a/3DS/source/settings.c b/3DS/source/settings.c index 8d7e369..3559889 100644 --- a/3DS/source/settings.c +++ b/3DS/source/settings.c @@ -7,10 +7,36 @@ #include "settings.h" +struct settings settings; + +struct settings defaultSettings = { + IPString: "", + port: DEFAULT_PORT, +}; + Handle fileHandle; +static bool getSetting(char *name, char *src, char *dest) { + char *start = strstr(src, name); + + if(start) { + start += strlen(name); + + char *end = start + strlen(start); + if(strstr(start, "\n") - 1 < end) end = strstr(start, "\n") - 1; + size_t size = (size_t)end - (size_t)start; + + strncpy(dest, start, size); + dest[size] = '\0'; + + return true; + } + + return false; +} + bool readSettings(void) { - u8 *buffer = NULL; + char *buffer = NULL; u64 size; u32 bytesRead; @@ -27,26 +53,27 @@ bool readSettings(void) { if(!buffer) return false; ret = FSFILE_Read(fileHandle, &bytesRead, 0x0, buffer, size); - if(ret || size!=bytesRead) return false; + if(ret || size != bytesRead) return false; ret = FSFILE_Close(fileHandle); if(ret) return false; - strncpy(settings.IPString, (char *)buffer, 15); - settings.IPString[15] = '\0'; + memcpy(&settings, &defaultSettings, sizeof(struct settings)); - settings.port = DEFAULT_PORT; + char setting[64] = { '\0' }; - if(strchr(settings.IPString, ':')) { - settings.IPString[strchr(settings.IPString, ':') - settings.IPString] = '\0'; - - char portString[5] = { '\0' }; - strncpy(portString, strchr((char *)buffer, ':') + 1, 4); - sscanf(portString, "%d", &settings.port); + if(getSetting("IP: ", buffer, settings.IPString)) { + //inet_pton(AF_INET, settings.IPString, &(saout.sin_addr)); + inet_pton4(settings.IPString, (unsigned char *)&(saout.sin_addr)); + } + else { + free(buffer); + return false; } - //inet_pton(AF_INET, settings.IPString, &(saout.sin_addr)); - inet_pton4(settings.IPString, (unsigned char *)&(saout.sin_addr)); + if(getSetting("Port: ", buffer, setting)) { + sscanf(setting, "%d", &settings.port); + } free(buffer); diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 2923b84..e8401af 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -3,7 +3,7 @@ Circle Pad and Touch can be either JOYSTICK or MOUSE, Buttons can either be a letter for example B, or a special key, like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS, Alternatively, you can disable a key by binding it to NONE, -Port: 8888 +Port: 8889 Circle Pad: JOYSTICK Touch: MOUSE A: A From bd54167950e442a6552d83ae67ce9d0834bef4c6 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 12 Dec 2014 18:50:25 +0000 Subject: [PATCH 055/140] Updated the README for the new settings format --- 3DS/3DSController.ini | 4 ++++ README.md | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 3DS/3DSController.ini diff --git a/3DS/3DSController.ini b/3DS/3DSController.ini new file mode 100644 index 0000000..4ca2d10 --- /dev/null +++ b/3DS/3DSController.ini @@ -0,0 +1,4 @@ +Change the IP to be your PC's local IP, (run 3DSController.exe to find it), + +IP: 192.168.0.4 +Port: 8888 \ No newline at end of file diff --git a/README.md b/README.md index ef2d518..cb275ce 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,11 @@ Firstly, if you want to be able to use the circle pad as a joystick you will nee Extract the archive and copy the executable in the `3DS` directory with the extension that applies to your loader: `3DSController.3dsx` and `3DSController.smdh` for Ninjhax, `3DSController.3ds` for flashcards, or `3DSController.cia` for CFWs, into your 3DS's SD card or flashcard's micro SD card. -Create a file called `3DSController.ini` on the root of your 3DS's SD card containing the local IP address of your PC with nothing else, no new lines, etc, for example `192.168.0.4`. If you are unsure of your local IP address, run `3DSController.exe` and it will tell you. +If using version 0.2, create a file called `3DSController.ini` on the root of your 3DS's SD card containing the local IP address of your PC with nothing else, no new lines, etc, for example `192.168.0.4`. + +If using version 0.3 and onwards, copy the file `3DS/3DSController.ini` to the root of your 3DS's SD card, and change the line that says `IP: 192.168.0.4` to match your computer's local IP. + +If you are unsure of your local IP address, run `3DSController.exe` and it will tell you. Run `3DSController.exe` on your computer. If you are prompted, make sure to allow it through your firewall. @@ -24,7 +28,9 @@ Otherwise, you should just see a black screen, this is a good sign. To see if it If using Ninjhax press Start and Select to return to the Homebrew Loader, otherwise you can just exit with the Home button. ### Configuration -To change the port, add `:` followed by the desired port to your 3DS's `3DSController.ini`, for example it should contain, `192.168.0.4:8889` to use port 8889. On the PC's `3DSController.ini`, find the line that says `Port: 8888` and change it to match the port you chose for the 3DS. +In version 0.2 to change the port, add `:` followed by the desired port to your 3DS's `3DSController.ini`, for example it should contain, `192.168.0.4:8889` to use port 8889. On the PC's `3DSController.ini`, find the line that says `Port: 8888` and change it to match the port you chose for the 3DS. + +In version 0.3 and onwards, find the line `Port: 8888` and change it to your desired port, do this for both the 3DS's `3DSController.ini` and the PC's `3DSController.ini`. To use custom key bindings, just change the PC's `3DSController.ini` file, it should be straight forward. From 1a9e40f766db15e9eb43da63746222c15bfffd7e Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 13 Dec 2014 19:02:29 +0000 Subject: [PATCH 056/140] More description --- PC/3DSController.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index e8401af..d8d1d00 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -2,6 +2,7 @@ Default port is 8888, if you change this, you must change it in the 3DS's 3DSCon Circle Pad and Touch can be either JOYSTICK or MOUSE, Buttons can either be a letter for example B, or a special key, like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS, Alternatively, you can disable a key by binding it to NONE, +Make sure to use a space, not a tab for seperating settings Port: 8889 Circle Pad: JOYSTICK From c9937e6d97242ff51c062154e487241f342b9619 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 13 Dec 2014 19:20:11 +0000 Subject: [PATCH 057/140] Throttling --- PC/3DSController.ini | 1 + PC/include/settings.h | 1 + PC/source/main.c | 2 ++ PC/source/settings.c | 5 +++++ 4 files changed, 9 insertions(+) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index d8d1d00..a197c95 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -4,6 +4,7 @@ Buttons can either be a letter for example B, or a special key, like SPACE, CLIC Alternatively, you can disable a key by binding it to NONE, Make sure to use a space, not a tab for seperating settings +Throttle: 20 Port: 8889 Circle Pad: JOYSTICK Touch: MOUSE diff --git a/PC/include/settings.h b/PC/include/settings.h index cea633a..a3464a6 100644 --- a/PC/include/settings.h +++ b/PC/include/settings.h @@ -8,6 +8,7 @@ enum analogue { }; struct settings { + int throttle; enum analogue circlePad; enum analogue touch; int A, B, X, Y, L, R, Left, Right, Up, Down, Start, Select, Tap; diff --git a/PC/source/main.c b/PC/source/main.c index c4326e5..9a34de7 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -60,6 +60,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) while(receiveBuffer(sizeof(struct packet)) <= 0) { // Waiting + + Sleep(settings.throttle); } switch(buffer.command) { diff --git a/PC/source/settings.c b/PC/source/settings.c index 9da38c1..1af4db3 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -9,6 +9,7 @@ struct settings settings; struct settings defaultSettings = { + throttle: 20, circlePad: joystick, touch: mouse, A: 'A', @@ -91,6 +92,10 @@ bool readSettings(void) { char setting[64] = { '\0' }; + if(getSetting("Throttle: ", buffer, setting)) { + sscanf(setting, "%d", &settings.throttle); + } + if(getSetting("Port: ", buffer, setting)) { sscanf(setting, "%d", &port); } From 9778656ef2c0d354e1cc001b23d110ecad9249a5 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 13 Dec 2014 19:26:31 +0000 Subject: [PATCH 058/140] Description of throttling --- PC/3DSController.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index a197c95..def4284 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -3,6 +3,7 @@ Circle Pad and Touch can be either JOYSTICK or MOUSE, Buttons can either be a letter for example B, or a special key, like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS, Alternatively, you can disable a key by binding it to NONE, Make sure to use a space, not a tab for seperating settings +Throttle controls the delay between checking for new packets (in milliseconds), a high number will have slightly more lag between pressing a button on the 3DS and receiving it on the PC, however will make the application use less CPU. In my experience, 20 is a reasonable throttling amount. Throttle: 20 Port: 8889 From c5d1fe07cfe09d916c762ff3c183cb95e3d328c9 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 13 Dec 2014 19:40:25 +0000 Subject: [PATCH 059/140] Configurable mouse speed --- PC/3DSController.ini | 1 + PC/include/settings.h | 1 + PC/source/main.c | 4 ++-- PC/source/settings.c | 5 +++++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index def4284..c4731c4 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -9,6 +9,7 @@ Throttle: 20 Port: 8889 Circle Pad: JOYSTICK Touch: MOUSE +Mouse Speed: 4 A: A B: B X: X diff --git a/PC/include/settings.h b/PC/include/settings.h index a3464a6..3c21488 100644 --- a/PC/include/settings.h +++ b/PC/include/settings.h @@ -11,6 +11,7 @@ struct settings { int throttle; enum analogue circlePad; enum analogue touch; + int mouseSpeed; int A, B, X, Y, L, R, Left, Right, Up, Down, Start, Select, Tap; }; diff --git a/PC/source/main.c b/PC/source/main.c index 9a34de7..165412d 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -120,7 +120,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) if(settings.touch == mouse) { POINT p; GetCursorPos(&p); - SetCursorPos(p.x + (currentTouch.x - lastTouch.x), p.y + (currentTouch.y - lastTouch.y)); + SetCursorPos(p.x + (currentTouch.x - lastTouch.x) * settings.mouseSpeed, p.y + (currentTouch.y - lastTouch.y) * settings.mouseSpeed); } else if(settings.touch == joystick) { if(vJoy) updateJoystick((currentTouch.x) * 128, (240 - currentTouch.y) * 128); @@ -130,7 +130,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) if(settings.circlePad == mouse) { POINT p; GetCursorPos(&p); - SetCursorPos(p.x + circlePad.x / 32, p.y - circlePad.y / 32); + SetCursorPos(p.x + (circlePad.x * settings.mouseSpeed) / 32, p.y - (circlePad.y * settings.mouseSpeed) / 32); } else if(settings.circlePad == joystick) { if(vJoy) updateJoystick((circlePad.x + 128) * 128, (128 - circlePad.y) * 128); diff --git a/PC/source/settings.c b/PC/source/settings.c index 1af4db3..fcccb9a 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -12,6 +12,7 @@ struct settings defaultSettings = { throttle: 20, circlePad: joystick, touch: mouse, + mouseSpeed: 4, A: 'A', B: 'B', X: 'X', @@ -110,6 +111,10 @@ bool readSettings(void) { else if(strcmp(setting, "JOYSTICK") == 0) settings.touch = joystick; } + if(getSetting("Mouse Speed: ", buffer, setting)) { + sscanf(setting, "%d", &settings.mouseSpeed); + } + if(getSetting("A: ", buffer, setting)) settings.A = getButton(setting); if(getSetting("B: ", buffer, setting)) settings.B = getButton(setting); if(getSetting("X: ", buffer, setting)) settings.X = getButton(setting); From 3a4c493835baba06eadfd1c00439d276185bb445 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 13 Dec 2014 19:41:53 +0000 Subject: [PATCH 060/140] Threshold for circle pad when moving mouse --- PC/source/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PC/source/main.c b/PC/source/main.c index 165412d..c1a7341 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -128,6 +128,9 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) } if(settings.circlePad == mouse) { + if(abs(circlePad.x) < 10) circlePad.x = 0; + if(abs(circlePad.y) < 10) circlePad.y = 0; + POINT p; GetCursorPos(&p); SetCursorPos(p.x + (circlePad.x * settings.mouseSpeed) / 32, p.y - (circlePad.y * settings.mouseSpeed) / 32); From 870210e6a20a33e0ddc2f0cb2dddb42c03ecbb02 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 13 Dec 2014 19:46:52 +0000 Subject: [PATCH 061/140] Port moved to settings struct and default to 8889 --- PC/3DSController.ini | 4 ++-- PC/include/settings.h | 1 + PC/include/wireless.h | 2 -- PC/source/main.c | 2 +- PC/source/settings.c | 9 +++++---- PC/source/wireless.c | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index c4731c4..29ce15a 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -1,12 +1,12 @@ -Default port is 8888, if you change this, you must change it in the 3DS's 3DSController.ini as well, +Default port is 8889, if you change this, you must change it in the 3DS's 3DSController.ini as well, Circle Pad and Touch can be either JOYSTICK or MOUSE, Buttons can either be a letter for example B, or a special key, like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS, Alternatively, you can disable a key by binding it to NONE, Make sure to use a space, not a tab for seperating settings Throttle controls the delay between checking for new packets (in milliseconds), a high number will have slightly more lag between pressing a button on the 3DS and receiving it on the PC, however will make the application use less CPU. In my experience, 20 is a reasonable throttling amount. -Throttle: 20 Port: 8889 +Throttle: 20 Circle Pad: JOYSTICK Touch: MOUSE Mouse Speed: 4 diff --git a/PC/include/settings.h b/PC/include/settings.h index 3c21488..c25114f 100644 --- a/PC/include/settings.h +++ b/PC/include/settings.h @@ -8,6 +8,7 @@ enum analogue { }; struct settings { + int port; int throttle; enum analogue circlePad; enum analogue touch; diff --git a/PC/include/wireless.h b/PC/include/wireless.h index 33b46b5..338ed57 100644 --- a/PC/include/wireless.h +++ b/PC/include/wireless.h @@ -30,8 +30,6 @@ struct packet { } touch; }; -extern int port; - extern SOCKET listener; extern SOCKET client; diff --git a/PC/source/main.c b/PC/source/main.c index c1a7341..30f5d40 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -43,7 +43,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) initNetwork(); - printf("Port: %d\n", port); + printf("Port: %d\n", settings.port); printf("Running on: %s\n", hostName); diff --git a/PC/source/settings.c b/PC/source/settings.c index fcccb9a..32193b1 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -9,6 +9,7 @@ struct settings settings; struct settings defaultSettings = { + port: 8889, throttle: 20, circlePad: joystick, touch: mouse, @@ -93,12 +94,12 @@ bool readSettings(void) { char setting[64] = { '\0' }; - if(getSetting("Throttle: ", buffer, setting)) { - sscanf(setting, "%d", &settings.throttle); + if(getSetting("Port: ", buffer, setting)) { + sscanf(setting, "%d", &settings.port); } - if(getSetting("Port: ", buffer, setting)) { - sscanf(setting, "%d", &port); + if(getSetting("Throttle: ", buffer, setting)) { + sscanf(setting, "%d", &settings.throttle); } if(getSetting("Circle Pad: ", buffer, setting)) { diff --git a/PC/source/wireless.c b/PC/source/wireless.c index ee4c66b..a14162e 100644 --- a/PC/source/wireless.c +++ b/PC/source/wireless.c @@ -1,8 +1,8 @@ #include "general.h" -#include "wireless.h" +#include "settings.h" -int port = 8888; +#include "wireless.h" SOCKET listener; SOCKET client; @@ -55,7 +55,7 @@ void startListening(void) { serverInfo.sin_family = AF_INET; serverInfo.sin_addr.s_addr = IP; - serverInfo.sin_port = htons(port); + serverInfo.sin_port = htons(settings.port); u_long one = 1; ioctlsocket(listener, FIONBIO, &one); From 7d19e73756f359c5fb660dc2a7d40f068b2cc351 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 13 Dec 2014 19:47:27 +0000 Subject: [PATCH 062/140] 3DS default port changed to 8889 --- 3DS/include/wireless.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3DS/include/wireless.h b/3DS/include/wireless.h index 2d50893..89c7fbb 100644 --- a/3DS/include/wireless.h +++ b/3DS/include/wireless.h @@ -12,7 +12,7 @@ #include "inet_pton.h" -#define DEFAULT_PORT 8888 +#define DEFAULT_PORT 8889 enum NET_COMMANDS { CONNECT, From 6813f9ac3ffa97325dc97d9777acab89e281b4f5 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 13 Dec 2014 19:48:28 +0000 Subject: [PATCH 063/140] 3DS default port changed to 8889 --- 3DS/3DSController.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3DS/3DSController.ini b/3DS/3DSController.ini index 4ca2d10..8d43317 100644 --- a/3DS/3DSController.ini +++ b/3DS/3DSController.ini @@ -1,4 +1,4 @@ Change the IP to be your PC's local IP, (run 3DSController.exe to find it), IP: 192.168.0.4 -Port: 8888 \ No newline at end of file +Port: 8889 \ No newline at end of file From f373be6ce953c3d1f3346d21fa55cd6c54dc6d66 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 13 Dec 2014 19:55:58 +0000 Subject: [PATCH 064/140] Corrected Y axis for using touch screen as joystick --- PC/source/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/source/main.c b/PC/source/main.c index 30f5d40..847153d 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -123,7 +123,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) SetCursorPos(p.x + (currentTouch.x - lastTouch.x) * settings.mouseSpeed, p.y + (currentTouch.y - lastTouch.y) * settings.mouseSpeed); } else if(settings.touch == joystick) { - if(vJoy) updateJoystick((currentTouch.x) * 128, (240 - currentTouch.y) * 128); + if(vJoy) updateJoystick((currentTouch.x) * 128, (currentTouch.y) * 128); } } From 490d3c76321c51de4059e3f0cc1a8d0c48daca9b Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 13 Dec 2014 21:27:32 +0000 Subject: [PATCH 065/140] Fixed CLICK and RIGHT CLICK bindings --- PC/source/keys.c | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/PC/source/keys.c b/PC/source/keys.c index 6fabc6b..50a942c 100644 --- a/PC/source/keys.c +++ b/PC/source/keys.c @@ -14,25 +14,41 @@ inline unsigned int mapVirtualKey(unsigned int key) { void simulateKeyNewpress(unsigned int key) { if(!key) return; - INPUT ip; - ip.type = INPUT_KEYBOARD; - ip.ki.wScan = mapVirtualKey(key); - ip.ki.time = 0; - ip.ki.dwExtraInfo = 0; - ip.ki.wVk = 0; - ip.ki.dwFlags = KEYEVENTF_SCANCODE; + INPUT ip = { 0 }; + + if(key == VK_LBUTTON || key == VK_RBUTTON) { + ip.type = INPUT_MOUSE; + ip.mi.dwFlags = key == VK_LBUTTON ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_RIGHTDOWN; + } + else { + ip.type = INPUT_KEYBOARD; + ip.ki.wScan = mapVirtualKey(key); + ip.ki.time = 0; + ip.ki.dwExtraInfo = 0; + ip.ki.wVk = 0; + ip.ki.dwFlags = KEYEVENTF_SCANCODE; + } + SendInput(1, &ip, sizeof(INPUT)); } void simulateKeyRelease(unsigned int key) { if(!key) return; - INPUT ip; - ip.type = INPUT_KEYBOARD; - ip.ki.wScan = mapVirtualKey(key); - ip.ki.time = 0; - ip.ki.dwExtraInfo = 0; - ip.ki.wVk = 0; - ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; + INPUT ip = { 0 }; + + if(key == VK_LBUTTON || key == VK_RBUTTON) { + ip.type = INPUT_MOUSE; + ip.mi.dwFlags = key == VK_LBUTTON ? MOUSEEVENTF_LEFTUP : MOUSEEVENTF_RIGHTUP; + } + else { + ip.type = INPUT_KEYBOARD; + ip.ki.wScan = mapVirtualKey(key); + ip.ki.time = 0; + ip.ki.dwExtraInfo = 0; + ip.ki.wVk = 0; + ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; + } + SendInput(1, &ip, sizeof(INPUT)); } From 6d383b0590b247d8881b74fd59356f3013a451f1 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 14 Dec 2014 16:47:11 +0000 Subject: [PATCH 066/140] Version 0.3 --- 3DS/source/main.c | 4 ++-- PC/source/main.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/3DS/source/main.c b/3DS/source/main.c index e274522..7c6e431 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -31,7 +31,7 @@ int main(void) { SOC_Initialize((u32 *)memalign(0x1000, 0x100000), 0x100000); clearScreen(); - drawString(10, 10, "Reading IP..."); + drawString(10, 10, "Reading settings..."); gfxFlushBuffers(); gfxSwapBuffers(); @@ -41,7 +41,7 @@ int main(void) { hidScanInput(); clearScreen(); - drawString(10, 10, "Failed to read settings! Press Start and Select to exit."); + drawString(10, 10, "Bad ini, Start and Select to exit."); u32 kHeld = hidKeysHeld(); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) goto exit; diff --git a/PC/source/main.c b/PC/source/main.c index 847153d..25e8d3b 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -1,6 +1,6 @@ // 3DS Controller Server -#define VERSION 0.2 +#define VERSION 0.3 #include #include From 3eae65d9560039ccaca538a207ba215f9f614d93 Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 10 Dec 2014 17:00:44 +0000 Subject: [PATCH 067/140] Removed --- 3DS/source/main.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/3DS/source/main.c b/3DS/source/main.c index 169136f..8ffaae3 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -37,7 +37,6 @@ int main(void) { gfxSwapBuffers(); if(!readSettings()) { - int ipReturn; while(aptMainLoop()) { gspWaitForVBlank(); hidScanInput(); @@ -46,7 +45,7 @@ int main(void) { drawString(10, 10, "Failed to read settings! Input IP now!"); - ipReturn = inputIP(); + inputIP(); u32 kHeld = hidKeysHeld(); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) goto exit; From 7428dff871a146a7543a87c3b6c0c44ee6e9fbe4 Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 10 Dec 2014 17:00:55 +0000 Subject: [PATCH 068/140] Added brewboard --- 3DS/data/keyboard.bin | Bin 0 -> 230400 bytes 3DS/include/brewboard.h | 8 ++++ 3DS/source/brewboard.c | 85 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 3DS/data/keyboard.bin create mode 100644 3DS/include/brewboard.h create mode 100644 3DS/source/brewboard.c diff --git a/3DS/data/keyboard.bin b/3DS/data/keyboard.bin new file mode 100644 index 0000000000000000000000000000000000000000..a496063be121a8d2c28d4531362d8a440a5451c9 GIT binary patch literal 230400 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 +#include +#include +//#include "textstuff.h" +#include "keyboard_bin.h" + +void gfxDrawSprite(gfxScreen_t screen, gfx3dSide_t side, u8* spriteData, u16 width, u16 height, s16 x, s16 y) { + if(!spriteData)return; + + u16 fbWidth, fbHeight; + u8* fbAdr=gfxGetFramebuffer(screen, side, &fbWidth, &fbHeight); + + if(x+width<0 || x>=fbWidth)return; + if(y+height<0 || y>=fbHeight)return; + + u16 xOffset=0, yOffset=0; + u16 widthDrawn=width, heightDrawn=height; + + if(x<0)xOffset=-x; + if(y<0)yOffset=-y; + if(x+width>=fbWidth)widthDrawn=fbWidth-x; + if(y+height>=fbHeight)heightDrawn=fbHeight-y; + widthDrawn-=xOffset; + heightDrawn-=yOffset; + + int j; + for(j=yOffset; j= 1 && tpos.px <= 312 && tpos.py >= 78 && tpos.py <= 208 && kDown & KEY_TOUCH) + chr = chars[(u16)(floor(tpos.px/26)+12*floor((tpos.py-78)/26))]; + + return chr; +} + +#ifdef TEXTSTUFF_H +void bbDisplayText(char* text) { + tsDrawWord(GFX_BOTTOM, GFX_LEFT, (char*)text, 10, 220, 0, 0, 0); +} + +char* bbHandleKeyboardBlocking(char* text) { + static char out[37]; + char chr; + u8 i; + + strncpy(out, text, 37); + i = strlen(out); + + while (aptMainLoop()) { + gspWaitForVBlank(); + hidScanInput(); + + chr = bbHandleKeyboard(out); + if (chr == '\13') + break; + else if (i > 0 && chr == '\x08') { + i--; + out[i] = '\0'; + } else if (i < 36 && chr != '\0') { + out[i] = chr; + i++; + out[i] = '\0'; + } + + tsDrawWord(GFX_BOTTOM, GFX_LEFT, (char*)out, 10, 220, 0, 0, 0); + + gfxFlushBuffers(); + gfxSwapBuffers(); + } + return (char*)out; +} +#endif \ No newline at end of file From 365556326add322f0c394c684b6adf64123115dc Mon Sep 17 00:00:00 2001 From: CTurt Date: Mon, 15 Dec 2014 20:41:12 +0000 Subject: [PATCH 069/140] Keyboard support! --- 3DS/Makefile | 1 + 3DS/include/brewboard.h | 8 ---- 3DS/include/font.h | 1 + 3DS/include/keyboard.h | 6 +++ 3DS/include/wireless.h | 36 +++++++++++------ 3DS/source/brewboard.c | 85 ----------------------------------------- 3DS/source/font.c | 9 +++++ 3DS/source/keyboard.c | 69 +++++++++++++++++++++++++++++++++ 3DS/source/main.c | 17 ++++++++- 3DS/source/wireless.c | 5 ++- PC/3DSController.ini | 2 +- PC/include/keyboard.h | 4 ++ PC/include/wireless.h | 36 +++++++++++------ PC/source/keyboard.c | 21 ++++++++++ PC/source/main.c | 18 +++++++-- 15 files changed, 194 insertions(+), 124 deletions(-) delete mode 100644 3DS/include/brewboard.h create mode 100644 3DS/include/keyboard.h delete mode 100644 3DS/source/brewboard.c create mode 100644 3DS/source/keyboard.c create mode 100644 PC/include/keyboard.h create mode 100644 PC/source/keyboard.c diff --git a/3DS/Makefile b/3DS/Makefile index 060b1a0..ee88ad4 100644 --- a/3DS/Makefile +++ b/3DS/Makefile @@ -44,6 +44,7 @@ ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=softfp CFLAGS := -g -Wall -O2 -mword-relocations \ -fomit-frame-pointer -ffast-math \ + -fms-extensions \ $(ARCH) CFLAGS += $(INCLUDE) -DARM11 -D_3DS diff --git a/3DS/include/brewboard.h b/3DS/include/brewboard.h deleted file mode 100644 index bb57601..0000000 --- a/3DS/include/brewboard.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -char* bbHandleKeyboard(); - -#ifdef TEXTSTUFF_H -void bbDisplayText(char* text); -char* bbHandleKeyboardBlocking(char* text); -#endif diff --git a/3DS/include/font.h b/3DS/include/font.h index 72a5e54..9c32536 100644 --- a/3DS/include/font.h +++ b/3DS/include/font.h @@ -2,4 +2,5 @@ inline void clearScreen(void); void drawPixelRGB(int x, int y, u8 r, u8 g, u8 b); +inline void drawBox(int x, int y, int width, int height, u8 r, u8 g, u8 b); void drawString(int sx, int sy, char *text, ...); diff --git a/3DS/include/keyboard.h b/3DS/include/keyboard.h new file mode 100644 index 0000000..45ae3de --- /dev/null +++ b/3DS/include/keyboard.h @@ -0,0 +1,6 @@ +#pragma once + +extern unsigned char keyboardActive; +extern unsigned char keyboardToggle; + +inline void drawKeyboard(void); diff --git a/3DS/include/wireless.h b/3DS/include/wireless.h index 89c7fbb..46781fc 100644 --- a/3DS/include/wireless.h +++ b/3DS/include/wireless.h @@ -20,19 +20,31 @@ enum NET_COMMANDS { }; struct packet { - unsigned char command; + struct packetHeader { + unsigned char command; + unsigned char keyboardActive; + }; - unsigned int keys; - - struct { - short x; - short y; - } circlePad; - - struct { - unsigned short x; - unsigned short y; - } touch; + union { + // CONNECT + struct connectPacket { + }; + + // KEYS + struct keysPacket { + unsigned int keys; + + struct { + short x; + short y; + } circlePad; + + struct { + unsigned short x; + unsigned short y; + } touch; + }; + }; }; extern int sock; diff --git a/3DS/source/brewboard.c b/3DS/source/brewboard.c deleted file mode 100644 index 6da96bc..0000000 --- a/3DS/source/brewboard.c +++ /dev/null @@ -1,85 +0,0 @@ -#include <3ds.h> -#include -#include -//#include "textstuff.h" -#include "keyboard_bin.h" - -void gfxDrawSprite(gfxScreen_t screen, gfx3dSide_t side, u8* spriteData, u16 width, u16 height, s16 x, s16 y) { - if(!spriteData)return; - - u16 fbWidth, fbHeight; - u8* fbAdr=gfxGetFramebuffer(screen, side, &fbWidth, &fbHeight); - - if(x+width<0 || x>=fbWidth)return; - if(y+height<0 || y>=fbHeight)return; - - u16 xOffset=0, yOffset=0; - u16 widthDrawn=width, heightDrawn=height; - - if(x<0)xOffset=-x; - if(y<0)yOffset=-y; - if(x+width>=fbWidth)widthDrawn=fbWidth-x; - if(y+height>=fbHeight)heightDrawn=fbHeight-y; - widthDrawn-=xOffset; - heightDrawn-=yOffset; - - int j; - for(j=yOffset; j= 1 && tpos.px <= 312 && tpos.py >= 78 && tpos.py <= 208 && kDown & KEY_TOUCH) - chr = chars[(u16)(floor(tpos.px/26)+12*floor((tpos.py-78)/26))]; - - return chr; -} - -#ifdef TEXTSTUFF_H -void bbDisplayText(char* text) { - tsDrawWord(GFX_BOTTOM, GFX_LEFT, (char*)text, 10, 220, 0, 0, 0); -} - -char* bbHandleKeyboardBlocking(char* text) { - static char out[37]; - char chr; - u8 i; - - strncpy(out, text, 37); - i = strlen(out); - - while (aptMainLoop()) { - gspWaitForVBlank(); - hidScanInput(); - - chr = bbHandleKeyboard(out); - if (chr == '\13') - break; - else if (i > 0 && chr == '\x08') { - i--; - out[i] = '\0'; - } else if (i < 36 && chr != '\0') { - out[i] = chr; - i++; - out[i] = '\0'; - } - - tsDrawWord(GFX_BOTTOM, GFX_LEFT, (char*)out, 10, 220, 0, 0, 0); - - gfxFlushBuffers(); - gfxSwapBuffers(); - } - return (char*)out; -} -#endif \ No newline at end of file diff --git a/3DS/source/font.c b/3DS/source/font.c index 3aae606..5b7245b 100644 --- a/3DS/source/font.c +++ b/3DS/source/font.c @@ -119,6 +119,15 @@ void drawPixelRGB(int x, int y, u8 r, u8 g, u8 b) { topLeftFB[v+1] = ((g & 0xE0) >> 5) + (r & 0xF8); } +inline void drawBox(int x, int y, int width, int height, u8 r, u8 g, u8 b) { + int lx, ly; + for(lx = x; lx < x + width; lx++) { + for(ly = y; ly < y + height; ly++) { + drawPixelRGB(lx, ly, r, g, b); + } + } +} + void drawString(int sx, int sy, char *text, ...) { char str[1024]; va_list args; diff --git a/3DS/source/keyboard.c b/3DS/source/keyboard.c new file mode 100644 index 0000000..37dc58e --- /dev/null +++ b/3DS/source/keyboard.c @@ -0,0 +1,69 @@ +#include <3ds.h> +#include +#include + +#include "keyboard_bin.h" + +#include "font.h" + +#include "keyboard.h" + +unsigned char keyboardActive = false; +unsigned char keyboardToggle = true; + +/*static inline void gfxDrawSprite(gfxScreen_t screen, gfx3dSide_t side, u8* spriteData, u16 width, u16 height, s16 x, s16 y) { + if(!spriteData)return; + + u16 fbWidth, fbHeight; + u8* fbAdr=gfxGetFramebuffer(screen, side, &fbWidth, &fbHeight); + + if(x+width<0 || x>=fbWidth)return; + if(y+height<0 || y>=fbHeight)return; + + u16 xOffset=0, yOffset=0; + u16 widthDrawn=width, heightDrawn=height; + + if(x<0)xOffset=-x; + if(y<0)yOffset=-y; + if(x+width>=fbWidth)widthDrawn=fbWidth-x; + if(y+height>=fbHeight)heightDrawn=fbHeight-y; + widthDrawn-=xOffset; + heightDrawn-=yOffset; + + int j; + for(j=yOffset; j + +#include "keys.h" + +#include "keyboard.h" + +unsigned char keyboardActive = false; +unsigned char keyboardToggle = true; + +inline char currentKeyboardKey(void) { + const char chars[60] = "!1234567890\x08QWERTYUIOP\13\13ASDFGHJKL-\13\13ZXCVBNM,.?\13\13\0\0\0 \0\0\0\0"; + + if(currentTouch.x >= 1 && currentTouch.x <= 312 && currentTouch.y >= 78 && currentTouch.y <= 208) { + int x = (int)((float)currentTouch.x * 12.0f / 320.0f); + int y = (int)((float)(currentTouch.y - 78) * 12.0f / 320.0f); + + return chars[x + y * 12]; + } + + else return 0; +} diff --git a/PC/source/main.c b/PC/source/main.c index 25e8d3b..aa20e8c 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -11,6 +11,7 @@ #include "general.h" #include "joystick.h" #include "settings.h" +#include "keyboard.h" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) { printf("3DS Controller Server %.1f\n", VERSION); @@ -55,7 +56,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) startListening(); while(1) { - //ZeroMemory(buffer, sizeof(struct packet)); memset(&buffer, 0, sizeof(struct packet)); while(receiveBuffer(sizeof(struct packet)) <= 0) { @@ -64,6 +64,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) Sleep(settings.throttle); } + keyboardActive = buffer.keyboardActive; + switch(buffer.command) { case CONNECT: lastKeys = 0; @@ -116,8 +118,18 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) lastTouch.y = currentTouch.y; } - if(currentKeys & KEY_TOUCH) { - if(settings.touch == mouse) { + if((currentKeys & KEY_TOUCH)) { + if(keyboardActive) { + if(newpress(KEY_TOUCH)) { + char letter = currentKeyboardKey(); + //printf("%d", letter); + if(letter) { + simulateKeyNewpress(letter); + simulateKeyRelease(letter); + } + } + } + else if(settings.touch == mouse) { POINT p; GetCursorPos(&p); SetCursorPos(p.x + (currentTouch.x - lastTouch.x) * settings.mouseSpeed, p.y + (currentTouch.y - lastTouch.y) * settings.mouseSpeed); From a5dbb619183a3d4566f3050cefca013285fac4d3 Mon Sep 17 00:00:00 2001 From: CTurt Date: Mon, 15 Dec 2014 20:41:38 +0000 Subject: [PATCH 070/140] Removed brewboard --- 3DS/data/keyboard.bin | Bin 230400 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 3DS/data/keyboard.bin diff --git a/3DS/data/keyboard.bin b/3DS/data/keyboard.bin deleted file mode 100644 index a496063be121a8d2c28d4531362d8a440a5451c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230400 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 Date: Mon, 15 Dec 2014 20:43:56 +0000 Subject: [PATCH 071/140] Better threshold calculation --- PC/source/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PC/source/main.c b/PC/source/main.c index aa20e8c..63ec013 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -140,8 +140,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) } if(settings.circlePad == mouse) { - if(abs(circlePad.x) < 10) circlePad.x = 0; - if(abs(circlePad.y) < 10) circlePad.y = 0; + if(abs(circlePad.x) < settings.mouseSpeed * 3) circlePad.x = 0; + if(abs(circlePad.y) < settings.mouseSpeed * 3) circlePad.y = 0; POINT p; GetCursorPos(&p); From 1e8bcda13e1c6b136fd97979a2fad8eb191e9b35 Mon Sep 17 00:00:00 2001 From: CTurt Date: Mon, 15 Dec 2014 20:44:07 +0000 Subject: [PATCH 072/140] Keyboard function proto --- PC/include/keyboard.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PC/include/keyboard.h b/PC/include/keyboard.h index e98af67..accab67 100644 --- a/PC/include/keyboard.h +++ b/PC/include/keyboard.h @@ -2,3 +2,5 @@ extern unsigned char keyboardActive; extern unsigned char keyboardToggle; + +inline char currentKeyboardKey(void); From 2fc8de0f7332944eac8f7f32590ed9ca4beafa18 Mon Sep 17 00:00:00 2001 From: CTurt Date: Mon, 15 Dec 2014 20:47:00 +0000 Subject: [PATCH 073/140] Disabled unfinished IP input, fixed vblank --- 3DS/source/main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/3DS/source/main.c b/3DS/source/main.c index 2b3b46d..091be11 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -39,19 +39,20 @@ int main(void) { if(!readSettings()) { while(aptMainLoop()) { - gspWaitForVBlank(); hidScanInput(); clearScreen(); - drawString(10, 10, "Failed to read settings! Input IP now!"); + drawString(10, 10, "Bad ini! Start and Select to quit!"); - inputIP(); + //drawString(10, 10, "Failed to read settings! Input IP now!"); + //inputIP(); u32 kHeld = hidKeysHeld(); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) goto exit; gfxFlushBuffers(); + gspWaitForVBlank(); gfxSwapBuffers(); } } From 888acd9d96c25b9d3214e648836174e6edd9d64f Mon Sep 17 00:00:00 2001 From: CTurt Date: Tue, 16 Dec 2014 16:32:45 +0000 Subject: [PATCH 074/140] Fully remove old keyboard --- 3DS/source/keyboard.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/3DS/source/keyboard.c b/3DS/source/keyboard.c index 37dc58e..d945f3b 100644 --- a/3DS/source/keyboard.c +++ b/3DS/source/keyboard.c @@ -2,8 +2,6 @@ #include #include -#include "keyboard_bin.h" - #include "font.h" #include "keyboard.h" From 329341c715c5792b62df6926a77286d07a2ea1df Mon Sep 17 00:00:00 2001 From: CTurt Date: Tue, 16 Dec 2014 17:08:53 +0000 Subject: [PATCH 075/140] Specify framebuffer in drawing commands --- 3DS/include/font.h | 12 +++++++++--- 3DS/source/font.c | 14 +++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/3DS/include/font.h b/3DS/include/font.h index 9c32536..dd30618 100644 --- a/3DS/include/font.h +++ b/3DS/include/font.h @@ -1,6 +1,12 @@ #pragma once inline void clearScreen(void); -void drawPixelRGB(int x, int y, u8 r, u8 g, u8 b); -inline void drawBox(int x, int y, int width, int height, u8 r, u8 g, u8 b); -void drawString(int sx, int sy, char *text, ...); + +#define drawPixelRGB(x, y, r, g, b) drawPixelRGBFramebuffer(0, x, y, r, g, b) +void drawPixelRGBFramebuffer(u8 *fb, int x, int y, u8 r, u8 g, u8 b); + +#define drawBox(x, y, width, height, r, g, b) drawBoxFramebuffer(0, x, y, width, height, r, g, b) +inline void drawBoxFramebuffer(u8 *fb, int x, int y, int width, int height, u8 r, u8 g, u8 b); + +#define drawString(sx, sy, text, ...) drawStringFramebuffer(0, sx, sy, text, ##__VA_ARGS__) +void drawStringFramebuffer(u8 *fb, int sx, int sy, char *text, ...); diff --git a/3DS/source/font.c b/3DS/source/font.c index 5b7245b..dbb495e 100644 --- a/3DS/source/font.c +++ b/3DS/source/font.c @@ -110,25 +110,25 @@ inline void clearScreen(void) { memset(frame, 0, 320 * 240 * 3); } -void drawPixelRGB(int x, int y, u8 r, u8 g, u8 b) { +void drawPixelRGBFramebuffer(u8 *fb, int x, int y, u8 r, u8 g, u8 b) { y = 240 - y; x = x; u32 v = (y + x * 240) * 3; - u8 *topLeftFB = gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL); + u8 *topLeftFB = fb ? fb : gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL); topLeftFB[v] = (b >> 3) + ((g & 0x1C) << 3); topLeftFB[v+1] = ((g & 0xE0) >> 5) + (r & 0xF8); } -inline void drawBox(int x, int y, int width, int height, u8 r, u8 g, u8 b) { +inline void drawBoxFramebuffer(u8 *fb, int x, int y, int width, int height, u8 r, u8 g, u8 b) { int lx, ly; for(lx = x; lx < x + width; lx++) { for(ly = y; ly < y + height; ly++) { - drawPixelRGB(lx, ly, r, g, b); + drawPixelRGBFramebuffer(fb, lx, ly, r, g, b); } } } -void drawString(int sx, int sy, char *text, ...) { +void drawStringFramebuffer(u8 *fb, int sx, int sy, char *text, ...) { char str[1024]; va_list args; va_start(args, text); @@ -146,8 +146,8 @@ void drawString(int sx, int sy, char *text, ...) { int mult = 0x80; for(x = 0; x < 8; x++) { if((currbyte & mult) == mult) { - drawPixelRGB(sx + x, sy + y, 0xFF, 0xFF, 0xFF); - drawPixelRGB(sx + x, sy + y + 1, 0, 0, 0); //Sombra + drawPixelRGBFramebuffer(fb, sx + x, sy + y, 0xFF, 0xFF, 0xFF); + drawPixelRGBFramebuffer(fb, sx + x, sy + y + 1, 0, 0, 0); //Sombra } mult /= 2; } From 09ab6019de1bf7bbfae285822ae878fc37bda6f7 Mon Sep 17 00:00:00 2001 From: CTurt Date: Tue, 16 Dec 2014 17:09:11 +0000 Subject: [PATCH 076/140] Pre-render keyboard --- 3DS/include/keyboard.h | 3 +++ 3DS/source/keyboard.c | 61 ++++++++++++++++++++++++------------------ 3DS/source/main.c | 6 ++++- 3 files changed, 43 insertions(+), 27 deletions(-) diff --git a/3DS/include/keyboard.h b/3DS/include/keyboard.h index 45ae3de..39b171c 100644 --- a/3DS/include/keyboard.h +++ b/3DS/include/keyboard.h @@ -3,4 +3,7 @@ extern unsigned char keyboardActive; extern unsigned char keyboardToggle; +extern unsigned char keyboardGfx[320 * 240 * 3]; + +void preRenderKeyboard(void); inline void drawKeyboard(void); diff --git a/3DS/source/keyboard.c b/3DS/source/keyboard.c index d945f3b..b7b349c 100644 --- a/3DS/source/keyboard.c +++ b/3DS/source/keyboard.c @@ -9,35 +9,43 @@ unsigned char keyboardActive = false; unsigned char keyboardToggle = true; -/*static inline void gfxDrawSprite(gfxScreen_t screen, gfx3dSide_t side, u8* spriteData, u16 width, u16 height, s16 x, s16 y) { - if(!spriteData)return; +unsigned char keyboardGfx[320 * 240 * 3]; - u16 fbWidth, fbHeight; - u8* fbAdr=gfxGetFramebuffer(screen, side, &fbWidth, &fbHeight); - - if(x+width<0 || x>=fbWidth)return; - if(y+height<0 || y>=fbHeight)return; - - u16 xOffset=0, yOffset=0; - u16 widthDrawn=width, heightDrawn=height; - - if(x<0)xOffset=-x; - if(y<0)yOffset=-y; - if(x+width>=fbWidth)widthDrawn=fbWidth-x; - if(y+height>=fbHeight)heightDrawn=fbHeight-y; - widthDrawn-=xOffset; - heightDrawn-=yOffset; - - int j; - for(j=yOffset; j Date: Tue, 16 Dec 2014 17:17:49 +0000 Subject: [PATCH 077/140] Rename font to drawing --- 3DS/include/{font.h => drawing.h} | 0 3DS/source/{font.c => drawing.c} | 2 +- 3DS/source/keyboard.c | 2 +- 3DS/source/main.c | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename 3DS/include/{font.h => drawing.h} (100%) rename 3DS/source/{font.c => drawing.c} (99%) diff --git a/3DS/include/font.h b/3DS/include/drawing.h similarity index 100% rename from 3DS/include/font.h rename to 3DS/include/drawing.h diff --git a/3DS/source/font.c b/3DS/source/drawing.c similarity index 99% rename from 3DS/source/font.c rename to 3DS/source/drawing.c index dbb495e..d17317b 100644 --- a/3DS/source/font.c +++ b/3DS/source/drawing.c @@ -4,7 +4,7 @@ #include <3ds.h> -#include "font.h" +#include "drawing.h" static const char fonts[] = { //Fonte 8x8 1BPP 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 //tile:0 diff --git a/3DS/source/keyboard.c b/3DS/source/keyboard.c index b7b349c..424f96b 100644 --- a/3DS/source/keyboard.c +++ b/3DS/source/keyboard.c @@ -2,7 +2,7 @@ #include #include -#include "font.h" +#include "drawing.h" #include "keyboard.h" diff --git a/3DS/source/main.c b/3DS/source/main.c index e601851..9de329f 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -6,7 +6,7 @@ #include "wireless.h" #include "settings.h" -#include "font.h" +#include "drawing.h" #include "input.h" #include "keyboard.h" From 40d5ebb1cdfd055c35299df6b6130e82410629ca Mon Sep 17 00:00:00 2001 From: CTurt Date: Tue, 16 Dec 2014 17:18:19 +0000 Subject: [PATCH 078/140] "input" conform to my standards --- 3DS/include/input.h | 11 +---- 3DS/source/input.c | 101 +++++++++++++++++++------------------------- 2 files changed, 44 insertions(+), 68 deletions(-) diff --git a/3DS/include/input.h b/3DS/include/input.h index ba21997..90ba655 100644 --- a/3DS/include/input.h +++ b/3DS/include/input.h @@ -1,12 +1,3 @@ #pragma once -#include -#include -#include - -#include <3ds.h> - -#include "font.h" - - -int inputIP(void); \ No newline at end of file +int inputIP(void); diff --git a/3DS/source/input.c b/3DS/source/input.c index a097838..e79248e 100644 --- a/3DS/source/input.c +++ b/3DS/source/input.c @@ -4,71 +4,56 @@ #include <3ds.h> -#include "font.h" +#include "drawing.h" + #include "input.h" int inputIP(void) { + touchPosition touch; + hidTouchRead(&touch); - touchPosition myTouchPosition; - - //Pass pointer to hidTouchRead function which updates values. - hidTouchRead(&myTouchPosition); - - //Read x cord - u16 posX = myTouchPosition.px; - //Read y cord - u16 posY = myTouchPosition.py; + //Draw Keypad + drawString(160-20,50, "1"); + drawString(160, 50, "2"); + drawString(160+20, 50, "3"); + drawString(160-20, 50+20, "4"); + drawString(160, 50+20, "5"); + drawString(160+20, 50+20, "6"); - //Draw Keypad - //Row One - drawString(160-20,50,"1"); //One - drawString(160,50,"2"); //Two - drawString(160+20,50,"3"); //Three - //Row Two - drawString(160-20,50+20,"4"); //Four - drawString(160,50+20,"5"); //Five - drawString(160+20,50+20,"6"); //Six - //Row Three - drawString(160-20,50+40,"7"); //Severn - drawString(160,50+40,"8"); //Eight - drawString(160+20,50+40,"9"); //Nine - //Row Four - drawString(160-10,50+60,"."); //Dot - drawString(160+10,50+60,"0"); //Zero + drawString(160-20, 50+40, "7"); + drawString(160, 50+40, "8"); + drawString(160+20, 50+40, "9"); + + drawString(160-10, 50+60, "."); + drawString(160+10, 50+60, "0"); + //Bottom Strip + if(touch.py > 50+50 && touch.py < 50+70) { + if(touch.px < 160 && touch.px > 160-20) return 11; // Dot + else if(touch.px < 160+20 && touch.px > 160) return 0; // Zero + } + + //First Column + else if(touch.px < 160-10 && touch.px > 160-30) { + if(touch.py < 50+10 && touch.py > 50-10) return 1; // One + else if(touch.py < 50+30 && touch.py > 50+10) return 4; // Four + else if(touch.py < 50+50 && touch.py > 50+30) return 7; // Seven + } - //Which number pressed - if (posY > 50+50 && posY < 50+70) { //Bottom Strip - if (posX < 160 && posX > 160-20) { //Dot - return 11; - } else if (posX < 160+20 && posX > 160) { //Zero - return 0; - } - } else if (posX < 160-10 && posX > 160-30) { //First Column - if (posY < 50+10 && posY > 50-10) { //One - return 1; - } else if (posY < 50+30 && posY > 50+10) { //Four - return 4; - } else if (posY < 50+50 && posY > 50+30) { //Severn - return 7; - } - } else if (posX < 160+10 && posX > 160-10) { // Second Column - if (posY < 50+10 && posY > 50-10) { //Two - return 2; - } else if (posY < 50+30 && posY > 50+10) { //Five - return 5; - } else if (posY < 50+50 && posY > 50+30) { //Eight - return 8; - } - } else if (posX < 160+30 && posX > 160+10) { // Third Column - if (posY < 50+10 && posY > 50-10) { //Three - return 3; - } else if (posY < 50+30 && posY > 50+10) { //Six - return 6; - } else if (posY < 50+50 && posY > 50+30) { //Nine - return 9; - } + // Second Column + else if(touch.px < 160+10 && touch.px > 160-10) { + if(touch.py < 50+10 && touch.py > 50-10) return 2; // Two + else if(touch.py < 50+30 && touch.py > 50+10) return 5; // Five + else if(touch.py < 50+50 && touch.py > 50+30) return 8; // Eight } - return 10; + + // Third Column + else if(touch.px < 160+30 && touch.px > 160+10) { + if(touch.py < 50+10 && touch.py > 50-10) return 3; // Three + else if(touch.py < 50+30 && touch.py > 50+10) return 6; // Six + else if(touch.py < 50+50 && touch.py > 50+30) return 9; // Nine + } + + return 10; } \ No newline at end of file From 0a752deda10b7a7c166f09e928014f95e46582ae Mon Sep 17 00:00:00 2001 From: CTurt Date: Tue, 16 Dec 2014 17:53:31 +0000 Subject: [PATCH 079/140] Animate keyboard --- 3DS/include/keyboard.h | 2 ++ 3DS/source/keyboard.c | 2 ++ 3DS/source/main.c | 23 +++++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/3DS/include/keyboard.h b/3DS/include/keyboard.h index 39b171c..ad0271d 100644 --- a/3DS/include/keyboard.h +++ b/3DS/include/keyboard.h @@ -1,5 +1,7 @@ #pragma once +extern const char keyboardChars[60]; + extern unsigned char keyboardActive; extern unsigned char keyboardToggle; diff --git a/3DS/source/keyboard.c b/3DS/source/keyboard.c index 424f96b..f23bbf5 100644 --- a/3DS/source/keyboard.c +++ b/3DS/source/keyboard.c @@ -6,6 +6,8 @@ #include "keyboard.h" +const char keyboardChars[60] = "!1234567890\x08QWERTYUIOP\13\13ASDFGHJKL-\13\13ZXCVBNM,.?\13\13\0\0\0 \0\0\0\0"; + unsigned char keyboardActive = false; unsigned char keyboardToggle = true; diff --git a/3DS/source/main.c b/3DS/source/main.c index 9de329f..e302e2b 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -98,6 +98,29 @@ int main(void) { if(keyboardActive) { drawKeyboard(); + + if(touch.px >= 1 && touch.px <= 312 && touch.py >= 78 && touch.py <= 208) { + int x = (int)((float)touch.px * 12.0f / 320.0f); + int y = (int)((float)(touch.py - 78) * 12.0f / 320.0f); + int width = 24; + int height = 24; + + if(keyboardChars[x + y * 12] == ' ') { + while(keyboardChars[(x - 1) + y * 12] == ' ') x--; + + width = (int)(5.0f * 320.0f / 12.0f) - 1; + } + + else if(keyboardChars[x + y * 12] == '\13') { + while(keyboardChars[(x - 1) + y * 12] == '\13') x--; + while(keyboardChars[x + (y - 1) * 12] == '\13') y--; + + width = (int)(2.0f * 320.0f / 12.0f) - 1; + height = (int)(3.0f * 320.0f / 12.0f) - 1; + } + + if(keyboardChars[x + y * 12]) drawBox((int)((float)x * 320.0f / 12.0f) + 1, (int)(78.0f + (float)y * 320.0f / 12.0f) + 1, width, height, 31, 31, 0); + } } sendKeys(kHeld, circlePad, touch); From 978b76ea389ea0bae7e74d8a53cfb3cb6808a38e Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 17 Dec 2014 18:31:18 +0000 Subject: [PATCH 080/140] Warn you if your WiFi is off --- 3DS/source/main.c | 52 ++++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/3DS/source/main.c b/3DS/source/main.c index e302e2b..b11d401 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -1,6 +1,7 @@ #include #include #include +#include #include <3ds.h> @@ -10,14 +11,36 @@ #include "input.h" #include "keyboard.h" -int main(void) { +static jmp_buf exitJmp; + +void hang(char *message) { + while(aptMainLoop()) { + hidScanInput(); + + clearScreen(); + drawString(10, 10, "%s", message); + drawString(10, 20, "Start and Select to exit"); + + u32 kHeld = hidKeysHeld(); + if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) longjmp(exitJmp, 1); + + gfxFlushBuffers(); + gspWaitForVBlank(); + gfxSwapBuffers(); + } +} + +int main(void) { srvInit(); aptInit(); hidInit(NULL); //irrstInit(NULL); + acInit(); gfxInit(); gfxSet3D(false); + if(setjmp(exitJmp)) goto exit; + preRenderKeyboard(); clearScreen(); @@ -34,29 +57,19 @@ int main(void) { SOC_Initialize((u32 *)memalign(0x1000, 0x100000), 0x100000); + u32 wifiStatus = 0; + ACU_GetWifiStatus(NULL, &wifiStatus); + if(!wifiStatus) { + hang("No WiFi! Is your wireless slider on?"); + } + clearScreen(); drawString(10, 10, "Reading settings..."); gfxFlushBuffers(); gfxSwapBuffers(); if(!readSettings()) { - while(aptMainLoop()) { - hidScanInput(); - - clearScreen(); - - drawString(10, 10, "Bad ini! Start and Select to quit!"); - - //drawString(10, 10, "Failed to read settings! Input IP now!"); - //inputIP(); - - u32 kHeld = hidKeysHeld(); - if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) goto exit; - - gfxFlushBuffers(); - gspWaitForVBlank(); - gfxSwapBuffers(); - } + hang("Could not read 3DSController.ini!"); } clearScreen(); @@ -125,7 +138,7 @@ int main(void) { sendKeys(kHeld, circlePad, touch); - if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) break; + if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) longjmp(exitJmp, 1); gfxFlushBuffers(); gspWaitForVBlank(); @@ -140,6 +153,7 @@ int main(void) { fsExit(); gfxExit(); + acExit(); //irrstExit(); hidExit(); aptExit(); From bca86553d016820a02cdb68c9602b611d622403f Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 17 Dec 2014 18:31:38 +0000 Subject: [PATCH 081/140] Support for more keys --- PC/source/keys.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/PC/source/keys.c b/PC/source/keys.c index 50a942c..1eecb2f 100644 --- a/PC/source/keys.c +++ b/PC/source/keys.c @@ -14,6 +14,8 @@ inline unsigned int mapVirtualKey(unsigned int key) { void simulateKeyNewpress(unsigned int key) { if(!key) return; + unsigned char unshift = 0; + INPUT ip = { 0 }; if(key == VK_LBUTTON || key == VK_RBUTTON) { @@ -21,6 +23,21 @@ void simulateKeyNewpress(unsigned int key) { ip.mi.dwFlags = key == VK_LBUTTON ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_RIGHTDOWN; } else { + if(key == '!') { + key = '1'; + simulateKeyNewpress(VK_SHIFT); + unshift = 1; + } + else if(key == '?') { + key = VK_DIVIDE; + simulateKeyNewpress(VK_SHIFT); + unshift = 1; + } + + else if(key == '-') key = VK_OEM_MINUS; + else if(key == ',') key = VK_OEM_COMMA; + else if(key == '\13') key = VK_RETURN; + ip.type = INPUT_KEYBOARD; ip.ki.wScan = mapVirtualKey(key); ip.ki.time = 0; @@ -30,6 +47,8 @@ void simulateKeyNewpress(unsigned int key) { } SendInput(1, &ip, sizeof(INPUT)); + + if(unshift) simulateKeyRelease(VK_SHIFT); } void simulateKeyRelease(unsigned int key) { From 482bf75169d12a50a6be5fa6f2dfecd4e4caed79 Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 17 Dec 2014 18:32:57 +0000 Subject: [PATCH 082/140] Clean up --- PC/source/main.c | 1 - 1 file changed, 1 deletion(-) diff --git a/PC/source/main.c b/PC/source/main.c index 63ec013..c9ef4eb 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -122,7 +122,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) if(keyboardActive) { if(newpress(KEY_TOUCH)) { char letter = currentKeyboardKey(); - //printf("%d", letter); if(letter) { simulateKeyNewpress(letter); simulateKeyRelease(letter); From 5549cda53a22ca8b43f61f395c39a0a9d7264a36 Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 17 Dec 2014 18:47:46 +0000 Subject: [PATCH 083/140] Support for absolute mouse movement --- PC/3DSController.ini | 2 +- PC/source/main.c | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index dae9366..f712a05 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -9,7 +9,7 @@ Port: 8889 Throttle: 20 Circle Pad: JOYSTICK Touch: MOUSE -Mouse Speed: 4 +Mouse Speed: 0 A: A B: B X: X diff --git a/PC/source/main.c b/PC/source/main.c index c9ef4eb..949494e 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -16,6 +16,12 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) { printf("3DS Controller Server %.1f\n", VERSION); + DWORD screenWidth = GetSystemMetrics(SM_CXSCREEN); + DWORD screenHeight = GetSystemMetrics(SM_CYSCREEN); + + double widthMultiplier = screenWidth / 320.0; + double heightMultiplier = screenHeight / 240.0; + bool vJoy = true; UINT iInterface = 1; @@ -129,9 +135,14 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) } } else if(settings.touch == mouse) { - POINT p; - GetCursorPos(&p); - SetCursorPos(p.x + (currentTouch.x - lastTouch.x) * settings.mouseSpeed, p.y + (currentTouch.y - lastTouch.y) * settings.mouseSpeed); + if(settings.mouseSpeed) { + POINT p; + GetCursorPos(&p); + SetCursorPos(p.x + (currentTouch.x - lastTouch.x) * settings.mouseSpeed, p.y + (currentTouch.y - lastTouch.y) * settings.mouseSpeed); + } + else { + SetCursorPos((int)((double)currentTouch.x * widthMultiplier), (int)((double)currentTouch.y * heightMultiplier)); + } } else if(settings.touch == joystick) { if(vJoy) updateJoystick((currentTouch.x) * 128, (currentTouch.y) * 128); From 6ba5ea133eba574756a583f0f97b088912f0fda7 Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 17 Dec 2014 18:51:38 +0000 Subject: [PATCH 084/140] Out with the old, in with the new --- PC/3DSController.ini | 14 ++++++++++++-- README.md | 8 ++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index f712a05..933e221 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -1,9 +1,19 @@ Default port is 8889, if you change this, you must change it in the 3DS's 3DSController.ini as well, + Circle Pad and Touch can be either JOYSTICK or MOUSE, + +Mouse Speed controls how fast the Circle Pad or Touch Screen moves the mouse. If set to 0 and using the Touch Screen, it will set to the absolute position, rather than moving relatively to last position, + Buttons can either be a letter for example B, or a special key, like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS, + Alternatively, you can disable a key by binding it to NONE, -Make sure to use a space, not a tab for seperating settings -Throttle controls the delay between checking for new packets (in milliseconds), a high number will have slightly more lag between pressing a button on the 3DS and receiving it on the PC, however will make the application use less CPU. In my experience, 20 is a reasonable throttling amount. + +Throttle controls the delay between checking for new packets (in milliseconds), a high number will have slightly more lag between pressing a button on the 3DS and receiving it on the PC, however will make the application use less CPU. In my experience, 20 is a reasonable throttling amount, + +Make sure to use a single space, not a tab for seperating settings, + + + Port: 8889 Throttle: 20 diff --git a/README.md b/README.md index cb275ce..28ec0ee 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,7 @@ Firstly, if you want to be able to use the circle pad as a joystick you will nee Extract the archive and copy the executable in the `3DS` directory with the extension that applies to your loader: `3DSController.3dsx` and `3DSController.smdh` for Ninjhax, `3DSController.3ds` for flashcards, or `3DSController.cia` for CFWs, into your 3DS's SD card or flashcard's micro SD card. -If using version 0.2, create a file called `3DSController.ini` on the root of your 3DS's SD card containing the local IP address of your PC with nothing else, no new lines, etc, for example `192.168.0.4`. - -If using version 0.3 and onwards, copy the file `3DS/3DSController.ini` to the root of your 3DS's SD card, and change the line that says `IP: 192.168.0.4` to match your computer's local IP. +Copy the file `3DS/3DSController.ini` to the root of your 3DS's SD card, and change the line that says `IP: 192.168.0.4` to match your computer's local IP. If you are unsure of your local IP address, run `3DSController.exe` and it will tell you. @@ -28,9 +26,7 @@ Otherwise, you should just see a black screen, this is a good sign. To see if it If using Ninjhax press Start and Select to return to the Homebrew Loader, otherwise you can just exit with the Home button. ### Configuration -In version 0.2 to change the port, add `:` followed by the desired port to your 3DS's `3DSController.ini`, for example it should contain, `192.168.0.4:8889` to use port 8889. On the PC's `3DSController.ini`, find the line that says `Port: 8888` and change it to match the port you chose for the 3DS. - -In version 0.3 and onwards, find the line `Port: 8888` and change it to your desired port, do this for both the 3DS's `3DSController.ini` and the PC's `3DSController.ini`. +Find the line `Port: 8888` and change it to your desired port, do this for both the 3DS's `3DSController.ini` and the PC's `3DSController.ini`. To use custom key bindings, just change the PC's `3DSController.ini` file, it should be straight forward. From eedb7d2076ced12eb036ca54e7742ebbc2f2308f Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 17 Dec 2014 18:53:08 +0000 Subject: [PATCH 085/140] Described keyboard usage --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 28ec0ee..3eb1872 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ If it wasn't able to read the IP from `3DSController.ini`, it will notify you an Otherwise, you should just see a black screen, this is a good sign. To see if it works, open Notepad and press some buttons on the 3DS, they should show up. You can also test if the joystick works by going to Configure USB Game Controllers in Control Panel, it shows up as vJoy. +If using version 0.4 or above you can press L, R and X to bring up the keyboard. Press L, R and X again to close it. + If using Ninjhax press Start and Select to return to the Homebrew Loader, otherwise you can just exit with the Home button. ### Configuration From 8f4217d2f5f6d8951b54bdac002b961bf6255a17 Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 17 Dec 2014 18:58:27 +0000 Subject: [PATCH 086/140] Fire Tap event on touch release --- PC/3DSController.ini | 2 +- PC/source/main.c | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 933e221..4c8c3d6 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -32,4 +32,4 @@ Up: UP Down: DOWN Start: ENTER Select: BACKSPACE -Tap: NONE \ No newline at end of file +Tap: SPACE \ No newline at end of file diff --git a/PC/source/main.c b/PC/source/main.c index 949494e..cabf0f9 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -116,7 +116,13 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) handleKey(KEY_L, settings.L); handleKey(KEY_X, settings.X); handleKey(KEY_Y, settings.Y); - handleKey(KEY_TOUCH, settings.Tap); + + //handleKey(KEY_TOUCH, settings.Tap); + if(release(KEY_TOUCH)) { + simulateKeyNewpress(settings.Tap); + simulateKeyRelease(settings.Tap); + } + //handleKey(KEY_LID, 'I'); if(newpress(KEY_TOUCH)) { From 6e49719da50c68d29ff845333d96b3ec68f5c333 Mon Sep 17 00:00:00 2001 From: CTurt Date: Wed, 17 Dec 2014 19:13:30 +0000 Subject: [PATCH 087/140] Version 0.4 --- PC/source/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/source/main.c b/PC/source/main.c index cabf0f9..b644768 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -1,6 +1,6 @@ // 3DS Controller Server -#define VERSION 0.3 +#define VERSION 0.4 #include #include From 82808288c077a4a25bc4d995284d9af1d93dc13a Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 19 Dec 2014 19:17:25 +0000 Subject: [PATCH 088/140] Central rotation --- PC/include/joystick.h | 2 ++ PC/source/joystick.c | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/PC/include/joystick.h b/PC/include/joystick.h index 37c57db..2efba2b 100644 --- a/PC/include/joystick.h +++ b/PC/include/joystick.h @@ -9,6 +9,8 @@ #include "public.h" #include "vjoyinterface.h" +#define JOY_MIDDLE (128 * 128) + extern int ContPovNumber; extern UINT iInterface; extern BOOL ContinuousPOV; diff --git a/PC/source/joystick.c b/PC/source/joystick.c index cc8a6de..c24c40a 100644 --- a/PC/source/joystick.c +++ b/PC/source/joystick.c @@ -15,9 +15,10 @@ BOOL updateJoystick(int x, int y) { iReport.wAxisX = x; iReport.wAxisY = y; - iReport.wAxisZ = 128 * 128; - iReport.wAxisZRot = 0; - iReport.wAxisXRot = 0; + iReport.wAxisZ = JOY_MIDDLE; + iReport.wAxisXRot = JOY_MIDDLE; + iReport.wAxisYRot = JOY_MIDDLE; + iReport.wAxisZRot = JOY_MIDDLE; iReport.lButtons = 0; From 351e9c1a331a57609561772f6cafb8efb95767bc Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 20 Dec 2014 19:21:59 +0000 Subject: [PATCH 089/140] Screenshot base --- PC/include/screenshot.h | 2 ++ PC/source/main.c | 1 + PC/source/screenshot.c | 2 ++ 3 files changed, 5 insertions(+) create mode 100644 PC/include/screenshot.h create mode 100644 PC/source/screenshot.c diff --git a/PC/include/screenshot.h b/PC/include/screenshot.h new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/PC/include/screenshot.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/PC/source/main.c b/PC/source/main.c index b644768..513dee9 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -12,6 +12,7 @@ #include "joystick.h" #include "settings.h" #include "keyboard.h" +#include "screenshot.h" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) { printf("3DS Controller Server %.1f\n", VERSION); diff --git a/PC/source/screenshot.c b/PC/source/screenshot.c new file mode 100644 index 0000000..fe4a9d7 --- /dev/null +++ b/PC/source/screenshot.c @@ -0,0 +1,2 @@ +#include "screenshot.h" + From fda4d1c022260ce85427175f8dbbb2b3cc255afa Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 21 Dec 2014 20:08:16 +0000 Subject: [PATCH 090/140] Linky --- PC/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/Makefile b/PC/Makefile index 980624d..1f5762c 100644 --- a/PC/Makefile +++ b/PC/Makefile @@ -4,7 +4,7 @@ SDIR := source IDIR := include LDIR := lib CFLAGS := -I$(IDIR) -fms-extensions -O2 -Wall -LFLAGS := -L$(LDIR) -lvJoyInterface -lws2_32 +LFLAGS := -L$(LDIR) -lvJoyInterface -lws2_32 -lGdi32 CFILES := $(wildcard $(SDIR)/*.c) OBJS := $(patsubst $(SDIR)/%.c, build/%.o, $(wildcard $(SDIR)/*.c)) From 25413ab7016016c3bf158146a3bea73c76bd66d8 Mon Sep 17 00:00:00 2001 From: CTurt Date: Mon, 22 Dec 2014 20:16:17 +0000 Subject: [PATCH 091/140] Screenshot functions maybe works --- PC/include/screenshot.h | 8 ++++++++ PC/source/main.c | 4 ++++ PC/source/screenshot.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/PC/include/screenshot.h b/PC/include/screenshot.h index 3f59c93..38f0bf5 100644 --- a/PC/include/screenshot.h +++ b/PC/include/screenshot.h @@ -1,2 +1,10 @@ #pragma once +#include + +extern HDC hDc; +extern HBITMAP hBmp; + +void initScreenshot(void); +void takeScreenshot(void); +void freeScreenshot(void); diff --git a/PC/source/main.c b/PC/source/main.c index 513dee9..d84d0f1 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -23,6 +23,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) double widthMultiplier = screenWidth / 320.0; double heightMultiplier = screenHeight / 240.0; + initScreenshot(); + bool vJoy = true; UINT iInterface = 1; @@ -172,6 +174,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) } } + freeScreenshot(); + error("accept()"); return 0; } diff --git a/PC/source/screenshot.c b/PC/source/screenshot.c index fe4a9d7..7bdffd3 100644 --- a/PC/source/screenshot.c +++ b/PC/source/screenshot.c @@ -1,2 +1,30 @@ #include "screenshot.h" +HDC hDc; +HBITMAP hBmp; + +void initScreenshot(void) { + hDc = CreateCompatibleDC(0); + hBmp = CreateCompatibleBitmap(GetDC(0), 400, 320); +} + +void takeScreenshot(void) { + //HDC hDc = CreateCompatibleDC(0); + //HBITMAP hBmp = CreateCompatibleBitmap(GetDC(0), width, height); + + SelectObject(hDc, hBmp); + + //BitBlt(hDc, 0, 0, width, height, GetDC(0), x, y, SRCCOPY); + + if(!StretchBlt(hDc, 0, 0, 400, 320, GetDC(0), 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SRCCOPY)) { + //MessageBox(hWnd, L"StretchBlt has failed", L"Failed", MB_OK); + } + + //DeleteObject(hBmp); + + //return hBmp; +} + +void freeScreenshot(void) { + DeleteObject(hBmp); +} From 9c75dd2b397f87cb96e30f71d427fd9105ccf582 Mon Sep 17 00:00:00 2001 From: CTurt Date: Thu, 25 Dec 2014 10:39:06 +0000 Subject: [PATCH 092/140] C++ support --- PC/Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/PC/Makefile b/PC/Makefile index 1f5762c..460d745 100644 --- a/PC/Makefile +++ b/PC/Makefile @@ -1,4 +1,6 @@ CC := gcc +CP := g++ +LN := g++ ODIR := build SDIR := source IDIR := include @@ -6,7 +8,9 @@ LDIR := lib CFLAGS := -I$(IDIR) -fms-extensions -O2 -Wall LFLAGS := -L$(LDIR) -lvJoyInterface -lws2_32 -lGdi32 CFILES := $(wildcard $(SDIR)/*.c) +CPPFILES := $(wildcard $(SDIR)/*.cpp) OBJS := $(patsubst $(SDIR)/%.c, build/%.o, $(wildcard $(SDIR)/*.c)) +OBJS += $(patsubst $(SDIR)/%.cpp, build/%.o, $(wildcard $(SDIR)/*.cpp)) PLATFORM = $(shell uname) @@ -23,11 +27,14 @@ ifeq ($(findstring MINGW,$(PLATFORM)),MINGW) endif $(TARGET): $(ODIR) $(OBJS) - $(CC) $(ODIR)/*.o -o $(TARGET) $(CFLAGS) $(LFLAGS) + $(LN) $(ODIR)/*.o -o $(TARGET) $(CFLAGS) $(LFLAGS) $(ODIR)/%.o: $(SDIR)/%.c $(CC) -c -o $@ $< $(CFLAGS) +$(ODIR)/%.o: $(SDIR)/%.cpp + $(CP) -c -o $@ $< $(CFLAGS) + $(ODIR): @mkdir $@ From 38470033e1fdfe74221ed32e712ddb3451ea8240 Mon Sep 17 00:00:00 2001 From: CTurt Date: Fri, 26 Dec 2014 10:39:53 +0000 Subject: [PATCH 093/140] Link to gdiplus --- PC/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/Makefile b/PC/Makefile index 460d745..88e6b19 100644 --- a/PC/Makefile +++ b/PC/Makefile @@ -6,7 +6,7 @@ SDIR := source IDIR := include LDIR := lib CFLAGS := -I$(IDIR) -fms-extensions -O2 -Wall -LFLAGS := -L$(LDIR) -lvJoyInterface -lws2_32 -lGdi32 +LFLAGS := -L$(LDIR) -lvJoyInterface -lws2_32 -lGdi32 -lgdiplus CFILES := $(wildcard $(SDIR)/*.c) CPPFILES := $(wildcard $(SDIR)/*.cpp) OBJS := $(patsubst $(SDIR)/%.c, build/%.o, $(wildcard $(SDIR)/*.c)) From f3de970d672ca4b934d964f45d401899c9ab7334 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 27 Dec 2014 10:41:25 +0000 Subject: [PATCH 094/140] Take screenshot with JPEG compression --- PC/include/screenshot.h | 16 +++++--- PC/source/screenshot.c | 30 --------------- PC/source/screenshot.cpp | 80 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 35 deletions(-) delete mode 100644 PC/source/screenshot.c create mode 100644 PC/source/screenshot.cpp diff --git a/PC/include/screenshot.h b/PC/include/screenshot.h index 38f0bf5..a530517 100644 --- a/PC/include/screenshot.h +++ b/PC/include/screenshot.h @@ -2,9 +2,15 @@ #include -extern HDC hDc; -extern HBITMAP hBmp; +#ifdef __cplusplus +extern "C" { +#endif -void initScreenshot(void); -void takeScreenshot(void); -void freeScreenshot(void); +#define SCREENSHOT_NAME "tempScreen.jpg" +#define SCREENSHOT_NAMEL L"tempScreen.jpg" + +void screenshot(const WCHAR *filename, BOOL fullscreen, int windowedX, int windowedY, ULONG quality); + +#ifdef __cplusplus +} +#endif diff --git a/PC/source/screenshot.c b/PC/source/screenshot.c deleted file mode 100644 index 7bdffd3..0000000 --- a/PC/source/screenshot.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "screenshot.h" - -HDC hDc; -HBITMAP hBmp; - -void initScreenshot(void) { - hDc = CreateCompatibleDC(0); - hBmp = CreateCompatibleBitmap(GetDC(0), 400, 320); -} - -void takeScreenshot(void) { - //HDC hDc = CreateCompatibleDC(0); - //HBITMAP hBmp = CreateCompatibleBitmap(GetDC(0), width, height); - - SelectObject(hDc, hBmp); - - //BitBlt(hDc, 0, 0, width, height, GetDC(0), x, y, SRCCOPY); - - if(!StretchBlt(hDc, 0, 0, 400, 320, GetDC(0), 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SRCCOPY)) { - //MessageBox(hWnd, L"StretchBlt has failed", L"Failed", MB_OK); - } - - //DeleteObject(hBmp); - - //return hBmp; -} - -void freeScreenshot(void) { - DeleteObject(hBmp); -} diff --git a/PC/source/screenshot.cpp b/PC/source/screenshot.cpp new file mode 100644 index 0000000..20100fa --- /dev/null +++ b/PC/source/screenshot.cpp @@ -0,0 +1,80 @@ +#include +#include + +#include "screenshot.h" + +extern "C" { + +int GetEncoderClsid(const WCHAR *format, CLSID *pClsid) { + using namespace Gdiplus; + UINT num = 0; // number of image encoders + UINT size = 0; // size of the image encoder array in bytes + + ImageCodecInfo *pImageCodecInfo = NULL; + + GetImageEncodersSize(&num, &size); + if(size == 0) + return -1; // Failure + + pImageCodecInfo = (ImageCodecInfo *)(malloc(size)); + if(pImageCodecInfo == NULL) + return -1; // Failure + + GetImageEncoders(num, size, pImageCodecInfo); + + UINT j; + for(j = 0; j < num; j++) { + if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0) { + *pClsid = pImageCodecInfo[j].Clsid; + free(pImageCodecInfo); + return j; // Success + } + } + + free(pImageCodecInfo); + return 0; +} + +void screenshot(const WCHAR *filename, BOOL fullscreen, int windowedX, int windowedY, ULONG quality) { + using namespace Gdiplus; + GdiplusStartupInput gdiplusStartupInput; + ULONG_PTR gdiplusToken; + GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); + + { + HDC scrdc, memdc; + HBITMAP membit; + scrdc = ::GetDC(0); + memdc = CreateCompatibleDC(scrdc); + membit = CreateCompatibleBitmap(scrdc, 400, 240); + HBITMAP hOldBitmap = (HBITMAP) SelectObject(memdc, membit); + + EncoderParameters encoderParams; + encoderParams.Count = 1; + encoderParams.Parameter[0].NumberOfValues = 1; + encoderParams.Parameter[0].Guid = EncoderQuality; + encoderParams.Parameter[0].Type = EncoderParameterValueTypeLong; + encoderParams.Parameter[0].Value = &quality; + + if(fullscreen) { + StretchBlt(memdc, 0, 0, 400, 240, scrdc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SRCCOPY); + } + else { + BitBlt(memdc, 0, 0, 400, 240, scrdc, windowedX, windowedY, SRCCOPY); + } + + Gdiplus::Bitmap bitmap(membit, NULL); + CLSID clsid; + GetEncoderClsid(L"image/jpeg", &clsid); + bitmap.Save(filename, &clsid, &encoderParams); + + SelectObject(memdc, hOldBitmap); + DeleteObject(memdc); + DeleteObject(membit); + ::ReleaseDC(0,scrdc); + } + + GdiplusShutdown(gdiplusToken); +} + +} From 0c6b79003b62a492c7c7251bc6c8d70bdeb6c453 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 28 Dec 2014 10:43:06 +0000 Subject: [PATCH 095/140] New screenshot names --- PC/source/main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PC/source/main.c b/PC/source/main.c index d84d0f1..a6d4e59 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -23,7 +23,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) double widthMultiplier = screenWidth / 320.0; double heightMultiplier = screenHeight / 240.0; - initScreenshot(); + screenshot(SCREENSHOT_NAMEL, TRUE, 0, 0, 18); bool vJoy = true; UINT iInterface = 1; @@ -172,10 +172,10 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) break; } + + sendScreenshot(); } - freeScreenshot(); - error("accept()"); return 0; } From 6361f04ac04a32f51749009052680b04d1a33f00 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 28 Dec 2014 11:23:48 +0000 Subject: [PATCH 096/140] Packet changes --- 3DS/include/wireless.h | 17 +++++++++++++++++ PC/include/wireless.h | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/3DS/include/wireless.h b/3DS/include/wireless.h index 46781fc..33f710c 100644 --- a/3DS/include/wireless.h +++ b/3DS/include/wireless.h @@ -12,23 +12,29 @@ #include "inet_pton.h" +#define SCREENSHOT_CHUNK 4000 + #define DEFAULT_PORT 8889 enum NET_COMMANDS { CONNECT, KEYS, + SCREENSHOT, }; +// It is deliberately set up to have an anonymous struct as well as a named struct for convenience, not a mistake! struct packet { struct packetHeader { unsigned char command; unsigned char keyboardActive; }; + struct packetHeader packetHeader; union { // CONNECT struct connectPacket { }; + struct connectPacket connectPacket; // KEYS struct keysPacket { @@ -44,6 +50,14 @@ struct packet { unsigned short y; } touch; }; + struct keysPacket keysPacket; + + // SCREENSHOT + struct screenshotPacket { + unsigned short offset; + unsigned char data[SCREENSHOT_CHUNK]; + }; + struct screenshotPacket screenshotPacket; }; }; @@ -51,7 +65,10 @@ extern int sock; extern struct sockaddr_in sain, saout; extern struct packet outBuf, rcvBuf; +extern socklen_t sockaddr_in_sizePtr; + bool openSocket(int port); void sendBuf(int length); +int receiveBuffer(int length); void sendConnectionRequest(void); void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch); diff --git a/PC/include/wireless.h b/PC/include/wireless.h index d2d7901..36444d3 100644 --- a/PC/include/wireless.h +++ b/PC/include/wireless.h @@ -7,23 +7,31 @@ #include #include +#include + +#define SCREENSHOT_CHUNK 4000 + #define IP INADDR_ANY enum NET_COMMANDS { CONNECT, KEYS, + SCREENSHOT, }; +// It is deliberately set up to have an anonymous struct as well as a named struct for convenience, not a mistake! struct packet { struct packetHeader { unsigned char command; unsigned char keyboardActive; }; + struct packetHeader packetHeader; union { // CONNECT struct connectPacket { }; + struct connectPacket connectPacket; // KEYS struct keysPacket { @@ -39,6 +47,14 @@ struct packet { unsigned short y; } touch; }; + struct keysPacket keysPacket; + + // SCREENSHOT + struct screenshotPacket { + unsigned short offset; + unsigned char data[SCREENSHOT_CHUNK]; + }; + struct screenshotPacket screenshotPacket; }; }; @@ -57,3 +73,5 @@ void printIPs(void); void startListening(void); void sendBuffer(int length); int receiveBuffer(int length); + +void sendScreenshot(void); From 4ff57a3bd643d7e3bb2e3389883b9b4a8abdd7df Mon Sep 17 00:00:00 2001 From: CTurt Date: Mon, 29 Dec 2014 11:28:16 +0000 Subject: [PATCH 097/140] Packet changes --- 3DS/source/wireless.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/3DS/source/wireless.c b/3DS/source/wireless.c index 3502203..76146e8 100644 --- a/3DS/source/wireless.c +++ b/3DS/source/wireless.c @@ -1,3 +1,5 @@ +#include + #include "keyboard.h" #include "wireless.h" @@ -6,6 +8,8 @@ int sock; struct sockaddr_in sain, saout; struct packet outBuf, rcvBuf; +socklen_t sockaddr_in_sizePtr = (int)sizeof(struct sockaddr_in); + bool openSocket(int port) { sock = socket(AF_INET, SOCK_DGRAM, 0); @@ -24,10 +28,14 @@ void sendBuf(int length) { sendto(sock, (char *)&outBuf, length, 0, (struct sockaddr *)&saout, sizeof(saout)); } +int receiveBuffer(int length) { + return recvfrom(sock, (char *)&rcvBuf, length, 0, (struct sockaddr *)&sain, &sockaddr_in_sizePtr); +} + void sendConnectionRequest(void) { outBuf.command = CONNECT; outBuf.keyboardActive = keyboardActive; - sendBuf(1); + sendBuf(offsetof(struct packet, connectPacket) + sizeof(struct connectPacket)); } void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch) { @@ -36,5 +44,5 @@ void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch) memcpy(&outBuf.keys, &keys, 4); memcpy(&outBuf.circlePad, &circlePad, 4); memcpy(&outBuf.touch, &touch, 4); - sendBuf(sizeof(struct packet)); + sendBuf(offsetof(struct packet, keysPacket) + sizeof(struct keysPacket)); } From d47ba2490f0f8f27bdeb00735de819652414fefc Mon Sep 17 00:00:00 2001 From: CTurt Date: Tue, 30 Dec 2014 11:28:50 +0000 Subject: [PATCH 098/140] Pseudo screenshot sending --- PC/source/wireless.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/PC/source/wireless.c b/PC/source/wireless.c index a14162e..7beb917 100644 --- a/PC/source/wireless.c +++ b/PC/source/wireless.c @@ -1,6 +1,9 @@ +#include + #include "general.h" #include "settings.h" +#include "screenshot.h" #include "wireless.h" @@ -76,3 +79,12 @@ void sendBuffer(int length) { int receiveBuffer(int length) { return recvfrom(listener, (char *)&buffer, length, 0, (struct sockaddr *)&client_in, &sockaddr_in_sizePtr); } + +void sendScreenshot(void) { + buffer.command = SCREENSHOT; + + //for(buffer.offset = 0; buffer.offset < screenshotSize; buffer.offset += SCREENSHOT_CHUNK) { + // memcpy(buffer.data, screenshotData + buffer.offset, SCREENSHOT_CHUNK); + // sendBuffer(SCREENSHOT_CHUNK); + //} +} From 75b84a57c4d40ba030501532eed9bf1fc6ccbd38 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 21 Mar 2015 09:52:27 +0000 Subject: [PATCH 099/140] General wireless.h update --- 3DS/include/wireless.h | 54 ++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/3DS/include/wireless.h b/3DS/include/wireless.h index 33f710c..cd99712 100644 --- a/3DS/include/wireless.h +++ b/3DS/include/wireless.h @@ -24,40 +24,48 @@ enum NET_COMMANDS { // It is deliberately set up to have an anonymous struct as well as a named struct for convenience, not a mistake! struct packet { - struct packetHeader { - unsigned char command; - unsigned char keyboardActive; + union { + struct packetHeader { + unsigned char command; + unsigned char keyboardActive; + }; + struct packetHeader packetHeader; }; - struct packetHeader packetHeader; union { // CONNECT - struct connectPacket { + union { + struct connectPacket { + }; + struct connectPacket connectPacket; }; - struct connectPacket connectPacket; // KEYS - struct keysPacket { - unsigned int keys; - - struct { - short x; - short y; - } circlePad; - - struct { - unsigned short x; - unsigned short y; - } touch; + union { + struct keysPacket { + unsigned int keys; + + struct { + short x; + short y; + } circlePad; + + struct { + unsigned short x; + unsigned short y; + } touch; + }; + struct keysPacket keysPacket; }; - struct keysPacket keysPacket; // SCREENSHOT - struct screenshotPacket { - unsigned short offset; - unsigned char data[SCREENSHOT_CHUNK]; + union { + struct screenshotPacket { + unsigned short offset; + unsigned char data[SCREENSHOT_CHUNK]; + }; + struct screenshotPacket screenshotPacket; }; - struct screenshotPacket screenshotPacket; }; }; From 850dcdf7c7740b81d2abc49783e3a3f7558a77d2 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 21 Mar 2015 09:52:39 +0000 Subject: [PATCH 100/140] Fix for latest ctrulib --- 3DS/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3DS/Makefile b/3DS/Makefile index ee88ad4..c98ab90 100644 --- a/3DS/Makefile +++ b/3DS/Makefile @@ -40,7 +40,7 @@ ICON := cxi/icon48x48.png #--------------------------------------------------------------------------------- # options for code generation #--------------------------------------------------------------------------------- -ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=softfp +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard CFLAGS := -g -Wall -O2 -mword-relocations \ -fomit-frame-pointer -ffast-math \ From da4d8ce698be631c342949a48ecfbeaa7c79a48e Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 21 Mar 2015 09:53:00 +0000 Subject: [PATCH 101/140] More ctrulib fixes --- 3DS/source/main.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/3DS/source/main.c b/3DS/source/main.c index b11d401..02f733a 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -30,14 +30,18 @@ void hang(char *message) { } } -int main(void) { - srvInit(); +int main(void) { + /*srvInit(); aptInit(); hidInit(NULL); //irrstInit(NULL); acInit(); gfxInit(); - gfxSet3D(false); + gfxSet3D(false);*/ + + gfxInitDefault(); + + consoleInit(GFX_BOTTOM, NULL); if(setjmp(exitJmp)) goto exit; @@ -138,6 +142,16 @@ int main(void) { sendKeys(kHeld, circlePad, touch); + receiveBuffer(sizeof(struct packet)); + + /*u8 *frame = gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL); + + switch(rcvBuf.command) { + case SCREENSHOT: + //drawStringFramebuffer(frame, 10, 10, "R"); + break; + }*/ + if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) longjmp(exitJmp, 1); gfxFlushBuffers(); @@ -153,11 +167,12 @@ int main(void) { fsExit(); gfxExit(); - acExit(); + + /*acExit(); //irrstExit(); hidExit(); aptExit(); - srvExit(); + srvExit();*/ return 0; } From 398d5d3f01cd78a0a9bfabad73582a60b1fb53e2 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 21 Mar 2015 09:53:22 +0000 Subject: [PATCH 102/140] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3eb1872..9dbb516 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,12 @@ 3DSController ![](/3DS/cxi/icon48x48.png?raw=true) === - A 3DS homebrew application which allows you to use your 3DS as a wireless controller for Windows. ### Download The latest release will always be downloadable from [here](https://github.com/CTurt/3DSController/releases/). ### Setup and Usage -Firstly, if you want to be able to use the circle pad as a joystick you will need to install [vJoy](http://vjoystick.sourceforge.net/site/index.php/download-a-install). However, if you just want to use the buttons, this is not necessary. +Firstly, if you want to be able to use the circle pad as a joystick you will need to install [vJoy (version 2.0.4 is preferable)](http://sourceforge.net/projects/vjoystick/files/Beta%202.x/2.0.4%20220914/vJoy_204_I220914.exe/download). However, if you just want to use the buttons, this is not necessary. Extract the archive and copy the executable in the `3DS` directory with the extension that applies to your loader: `3DSController.3dsx` and `3DSController.smdh` for Ninjhax, `3DSController.3ds` for flashcards, or `3DSController.cia` for CFWs, into your 3DS's SD card or flashcard's micro SD card. @@ -33,8 +32,9 @@ Find the line `Port: 8888` and change it to your desired port, do this for both To use custom key bindings, just change the PC's `3DSController.ini` file, it should be straight forward. ### Troubleshooting +- Make sure that you are using the 3DS and PC application from the same release, - Make sure your 3DS has internet access (turn on the switch on the side of the 3DS so that an orange light shows) and is on the same network as your PC, - Make sure that the `3DSController.ini` is in the root of your 3DS's SD card (not flashcard micro SD), - Make sure that the `3DSController.ini` has the local IP of your computer, not your public IP, - Make sure your firewall isn't blocking the application, -- Try using a different port, \ No newline at end of file +- Try using a different port (change the port for both the 3DS and PC's .ini file), \ No newline at end of file From 5d8240b4330c6f4e255c90c8742ee39429486d78 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 21 Mar 2015 09:53:38 +0000 Subject: [PATCH 103/140] Fix touch bug --- PC/source/main.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/PC/source/main.c b/PC/source/main.c index a6d4e59..d81e2cc 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -120,12 +120,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) handleKey(KEY_X, settings.X); handleKey(KEY_Y, settings.Y); - //handleKey(KEY_TOUCH, settings.Tap); - if(release(KEY_TOUCH)) { - simulateKeyNewpress(settings.Tap); - simulateKeyRelease(settings.Tap); - } - //handleKey(KEY_LID, 'I'); if(newpress(KEY_TOUCH)) { @@ -156,6 +150,9 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) else if(settings.touch == joystick) { if(vJoy) updateJoystick((currentTouch.x) * 128, (currentTouch.y) * 128); } + else { + handleKey(KEY_TOUCH, settings.Tap); + } } if(settings.circlePad == mouse) { @@ -173,7 +170,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) break; } - sendScreenshot(); + //sendScreenshot(); } error("accept()"); From 50db368be9d1f74e282237c338d3073d1d092f01 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 21 Mar 2015 09:54:11 +0000 Subject: [PATCH 104/140] More pseudo screenshot functions --- PC/source/screenshot.cpp | 2 +- PC/source/wireless.c | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/PC/source/screenshot.cpp b/PC/source/screenshot.cpp index 20100fa..029a863 100644 --- a/PC/source/screenshot.cpp +++ b/PC/source/screenshot.cpp @@ -71,7 +71,7 @@ void screenshot(const WCHAR *filename, BOOL fullscreen, int windowedX, int windo SelectObject(memdc, hOldBitmap); DeleteObject(memdc); DeleteObject(membit); - ::ReleaseDC(0,scrdc); + ::ReleaseDC(0, scrdc); } GdiplusShutdown(gdiplusToken); diff --git a/PC/source/wireless.c b/PC/source/wireless.c index 7beb917..9100878 100644 --- a/PC/source/wireless.c +++ b/PC/source/wireless.c @@ -81,10 +81,22 @@ int receiveBuffer(int length) { } void sendScreenshot(void) { + FILE *f = fopen(SCREENSHOT_NAME, "rb"); + fseek(f, 0, SEEK_END); + size_t len = ftell(f); + unsigned char *screenshotData = malloc(len); + rewind(f); + fread(screenshotData, len, 1, f); + fclose(f); + buffer.command = SCREENSHOT; - //for(buffer.offset = 0; buffer.offset < screenshotSize; buffer.offset += SCREENSHOT_CHUNK) { - // memcpy(buffer.data, screenshotData + buffer.offset, SCREENSHOT_CHUNK); - // sendBuffer(SCREENSHOT_CHUNK); - //} + while(1) { + int tl = len - buffer.offset > SCREENSHOT_CHUNK ? SCREENSHOT_CHUNK : len - buffer.offset; + memcpy(buffer.data, screenshotData + buffer.offset, tl); + sendBuffer(tl + offsetof(struct packet, screenshotPacket)); + if(tl < SCREENSHOT_CHUNK) break; + } + + free(screenshotData); } From 038af67ecf264811b34e819bc8368eba7f5e03a2 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 21 Mar 2015 11:51:08 +0000 Subject: [PATCH 105/140] 3DS init ACU service --- 3DS/source/main.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/3DS/source/main.c b/3DS/source/main.c index 02f733a..ff57fd5 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -31,17 +31,10 @@ void hang(char *message) { } int main(void) { - /*srvInit(); - aptInit(); - hidInit(NULL); - //irrstInit(NULL); acInit(); - gfxInit(); - gfxSet3D(false);*/ - gfxInitDefault(); - consoleInit(GFX_BOTTOM, NULL); + //consoleInit(GFX_BOTTOM, NULL); if(setjmp(exitJmp)) goto exit; @@ -167,12 +160,7 @@ int main(void) { fsExit(); gfxExit(); - - /*acExit(); - //irrstExit(); - hidExit(); - aptExit(); - srvExit();*/ + acExit(); return 0; } From 2e72b1b0ff27f472b09e678d2d0f43c1a5176169 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 21 Mar 2015 12:28:25 +0000 Subject: [PATCH 106/140] Support joypad key mapping --- PC/3DSController.ini | 2 +- PC/include/joystick.h | 10 ++++-- PC/include/keys.h | 20 ++++++++++-- PC/include/settings.h | 4 ++- PC/source/joystick.c | 26 +++------------ PC/source/main.c | 22 ++++++++++--- PC/source/settings.c | 76 +++++++++++++++++++++++++------------------ 7 files changed, 96 insertions(+), 64 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 4c8c3d6..4059437 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -4,7 +4,7 @@ Circle Pad and Touch can be either JOYSTICK or MOUSE, Mouse Speed controls how fast the Circle Pad or Touch Screen moves the mouse. If set to 0 and using the Touch Screen, it will set to the absolute position, rather than moving relatively to last position, -Buttons can either be a letter for example B, or a special key, like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS, +Buttons can be a letter for a keyboard key (like Q, W, E, R, T, or Y), a special keyboard key (like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS), or a joypad button (JOY1, JOY2, JOY3, to JOY8), Alternatively, you can disable a key by binding it to NONE, diff --git a/PC/include/joystick.h b/PC/include/joystick.h index 2efba2b..9f4bf31 100644 --- a/PC/include/joystick.h +++ b/PC/include/joystick.h @@ -9,10 +9,16 @@ #include "public.h" #include "vjoyinterface.h" +#define joyX iReport.wAxisX +#define joyY iReport.wAxisY +#define joyButtons iReport.lButtons + #define JOY_MIDDLE (128 * 128) extern int ContPovNumber; extern UINT iInterface; -extern BOOL ContinuousPOV; +//extern BOOL ContinuousPOV; + +extern JOYSTICK_POSITION iReport; -BOOL updateJoystick(int x, int y); +BOOL updateJoystick(void); diff --git a/PC/include/keys.h b/PC/include/keys.h index 293b3b5..40baacc 100644 --- a/PC/include/keys.h +++ b/PC/include/keys.h @@ -7,8 +7,16 @@ #define newpress(key) ((currentKeys & key) && !(lastKeys & key)) #define release(key) (!(currentKeys & key) && (lastKeys & key)) -#define handleKey(DSKey, PCKey) if(newpress(DSKey)) simulateKeyNewpress(PCKey);\ -if(release(DSKey)) simulateKeyRelease(PCKey) +#define handleKey(DSKey, PCKey) do {\ + if(PCKey.useKeyboard) {\ + if(newpress(DSKey)) simulateKeyNewpress(PCKey.virtualKey);\ + if(release(DSKey)) simulateKeyRelease(PCKey.virtualKey);\ + }\ + else {\ + if(currentKeys & DSKey) joyButtons |= PCKey.joypadButton;\ + else joyButtons &= ~PCKey.joypadButton;\ + }\ +} while(0) #define BIT(n) (1 << (n)) @@ -44,6 +52,14 @@ typedef enum { KEY_RIGHT = KEY_DRIGHT | KEY_CPAD_RIGHT, } KEYPAD_BITS; +struct keyMapping { + unsigned char useKeyboard; // 0 joypad button, 1 keyboard key + union { + unsigned char virtualKey; + unsigned char joypadButton; + }; +}; + struct circlePad { short x; short y; diff --git a/PC/include/settings.h b/PC/include/settings.h index c25114f..f909109 100644 --- a/PC/include/settings.h +++ b/PC/include/settings.h @@ -2,6 +2,8 @@ #include +#include "keys.h" + enum analogue { mouse, joystick, @@ -13,7 +15,7 @@ struct settings { enum analogue circlePad; enum analogue touch; int mouseSpeed; - int A, B, X, Y, L, R, Left, Right, Up, Down, Start, Select, Tap; + struct keyMapping A, B, X, Y, L, R, Left, Right, Up, Down, Start, Select, Tap; }; extern struct settings settings; diff --git a/PC/source/joystick.c b/PC/source/joystick.c index c24c40a..735cec2 100644 --- a/PC/source/joystick.c +++ b/PC/source/joystick.c @@ -5,33 +5,15 @@ int ContPovNumber; UINT iInterface = 1; -BOOL ContinuousPOV = FALSE; +//BOOL ContinuousPOV = FALSE; -BOOL updateJoystick(int x, int y) { +JOYSTICK_POSITION iReport; + +BOOL updateJoystick(void) { BYTE id = (BYTE)iInterface; - JOYSTICK_POSITION iReport; iReport.bDevice = id; - iReport.wAxisX = x; - iReport.wAxisY = y; - iReport.wAxisZ = JOY_MIDDLE; - iReport.wAxisXRot = JOY_MIDDLE; - iReport.wAxisYRot = JOY_MIDDLE; - iReport.wAxisZRot = JOY_MIDDLE; - - iReport.lButtons = 0; - - if(ContPovNumber) { - iReport.bHats = -1; // Neutral state - iReport.bHatsEx1 = -1; // Neutral state - iReport.bHatsEx2 = -1; // Neutral state - iReport.bHatsEx3 = -1; // Neutral state - } - else { - iReport.bHats = -1; // Neutral state - }; - if(!UpdateVJD(iInterface, (PVOID)&iReport)) { /*printf("vJoy device %d failed - try to enable device\n", iInterface); printf("PRESS ENTER TO CONTINUE\n"); diff --git a/PC/source/main.c b/PC/source/main.c index d81e2cc..6a2b055 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -23,11 +23,19 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) double widthMultiplier = screenWidth / 320.0; double heightMultiplier = screenHeight / 240.0; - screenshot(SCREENSHOT_NAMEL, TRUE, 0, 0, 18); + //screenshot(SCREENSHOT_NAMEL, TRUE, 0, 0, 18); bool vJoy = true; UINT iInterface = 1; + iReport.wAxisZ = JOY_MIDDLE; + iReport.wAxisXRot = JOY_MIDDLE; + iReport.wAxisYRot = JOY_MIDDLE; + iReport.wAxisZRot = JOY_MIDDLE; + iReport.wSlider = JOY_MIDDLE; + iReport.lButtons = 0; + iReport.bHats = -1; + if(vJoy && !vJoyEnabled()) { printf("vJoy failed (1)! Buttons will still work, but joy stick won't work.\n"); vJoy = false; @@ -42,8 +50,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) ContPovNumber = GetVJDContPovNumber(iInterface); //int DiscPovNumber = GetVJDDiscPovNumber(iInterface); - if(vJoy && !updateJoystick(128 * 128, 128 * 128)) { - printf("vJoy failed (3)! Buttons will still work, but joy stick won't work.\n"); + if(vJoy && !updateJoystick()) { + printf("vJoy failed (3)! Buttons will still work, but joystick won't work.\n"); vJoy = false; } @@ -148,7 +156,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) } } else if(settings.touch == joystick) { - if(vJoy) updateJoystick((currentTouch.x) * 128, (currentTouch.y) * 128); + joyX = (currentTouch.x) * 128; + joyY = (currentTouch.y) * 128; } else { handleKey(KEY_TOUCH, settings.Tap); @@ -164,12 +173,15 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) SetCursorPos(p.x + (circlePad.x * settings.mouseSpeed) / 32, p.y - (circlePad.y * settings.mouseSpeed) / 32); } else if(settings.circlePad == joystick) { - if(vJoy) updateJoystick((circlePad.x + 128) * 128, (128 - circlePad.y) * 128); + joyX = (circlePad.x + 128) * 128; + joyY = (128 - circlePad.y) * 128; } break; } + if(vJoy) updateJoystick(); + //sendScreenshot(); } diff --git a/PC/source/settings.c b/PC/source/settings.c index 32193b1..604d195 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -2,6 +2,7 @@ #include #include +#include "keys.h" #include "wireless.h" #include "settings.h" @@ -14,19 +15,19 @@ struct settings defaultSettings = { circlePad: joystick, touch: mouse, mouseSpeed: 4, - A: 'A', - B: 'B', - X: 'X', - Y: 'Y', - L: 'L', - R: 'R', - Left: VK_LEFT, - Right: VK_RIGHT, - Up: VK_UP, - Down: VK_DOWN, - Start: VK_RETURN, - Select: VK_BACK, - Tap: 'T', + A: { 1, {'A'} }, + B: { 1, {'B'} }, + X: { 1, {'X'} }, + Y: { 1, {'Y'} }, + L: { 1, {'L'} }, + R: { 1, {'R'} }, + Left: { 1, {VK_LEFT} }, + Right: { 1, {VK_RIGHT} }, + Up: { 1, {VK_UP} }, + Down: { 1, {VK_DOWN} }, + Start: { 1, {VK_RETURN} }, + Select: { 1, {VK_BACK} }, + Tap: { 1, {'T'} }, }; static bool getSetting(char *name, char *src, char *dest) { @@ -48,24 +49,37 @@ static bool getSetting(char *name, char *src, char *dest) { return false; } -static int getButton(char *string) { - if(strcmp(string, "SPACE") == 0) return VK_SPACE; - else if(strcmp(string, "CLICK") == 0) return VK_LBUTTON; - else if(strcmp(string, "RIGHT CLICK") == 0) return VK_RBUTTON; - else if(strcmp(string, "ENTER") == 0) return VK_RETURN; - else if(strcmp(string, "BACKSPACE") == 0) return VK_BACK; - else if(strcmp(string, "SHIFT") == 0) return VK_SHIFT; - else if(strcmp(string, "TAB") == 0) return VK_TAB; - else if(strcmp(string, "LEFT") == 0) return VK_LEFT; - else if(strcmp(string, "RIGHT") == 0) return VK_RIGHT; - else if(strcmp(string, "UP") == 0) return VK_UP; - else if(strcmp(string, "DOWN") == 0) return VK_DOWN; - else if(strcmp(string, "PAGE UP") == 0) return VK_PRIOR; - else if(strcmp(string, "PAGE DOWN") == 0) return VK_NEXT; - else if(strcmp(string, "WINDOWS") == 0) return VK_LWIN; - else if(strcmp(string, "NONE") == 0) return 0; - - return (int)string[0]; +static struct keyMapping getButton(char *string) { + struct keyMapping k = { 1, {0} }; + + if(strcmp(string, "SPACE") == 0) k.virtualKey = VK_SPACE; + else if(strcmp(string, "CLICK") == 0) k.virtualKey = VK_LBUTTON; + else if(strcmp(string, "RIGHT CLICK") == 0) k.virtualKey = VK_RBUTTON; + else if(strcmp(string, "ENTER") == 0) k.virtualKey = VK_RETURN; + else if(strcmp(string, "BACKSPACE") == 0) k.virtualKey = VK_BACK; + else if(strcmp(string, "SHIFT") == 0) k.virtualKey = VK_SHIFT; + else if(strcmp(string, "TAB") == 0) k.virtualKey = VK_TAB; + else if(strcmp(string, "LEFT") == 0) k.virtualKey = VK_LEFT; + else if(strcmp(string, "RIGHT") == 0) k.virtualKey = VK_RIGHT; + else if(strcmp(string, "UP") == 0) k.virtualKey = VK_UP; + else if(strcmp(string, "DOWN") == 0) k.virtualKey = VK_DOWN; + else if(strcmp(string, "PAGE UP") == 0) k.virtualKey = VK_PRIOR; + else if(strcmp(string, "PAGE DOWN") == 0) k.virtualKey = VK_NEXT; + else if(strcmp(string, "WINDOWS") == 0) k.virtualKey = VK_LWIN; + else if(strcmp(string, "NONE") == 0) k.virtualKey = 0; + + else if(strcmp(string, "JOY1") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 0; } + else if(strcmp(string, "JOY2") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 1; } + else if(strcmp(string, "JOY3") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 2; } + else if(strcmp(string, "JOY4") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 3; } + else if(strcmp(string, "JOY5") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 4; } + else if(strcmp(string, "JOY6") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 5; } + else if(strcmp(string, "JOY7") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 6; } + else if(strcmp(string, "JOY8") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 7; } + + else k.virtualKey = (int)string[0]; + + return k; } bool readSettings(void) { From acad14c7006eaa082c0c5091a65bc64ee45e29d0 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 21 Mar 2015 12:36:09 +0000 Subject: [PATCH 107/140] Version 0.5 --- PC/source/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/source/main.c b/PC/source/main.c index 6a2b055..386fc65 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -1,6 +1,6 @@ // 3DS Controller Server -#define VERSION 0.4 +#define VERSION 0.5 #include #include From f826941fdaf52277e3017ee63200038da3bedc2f Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 22 Mar 2015 13:43:14 +0000 Subject: [PATCH 108/140] Link to gcc libs --- PC/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/Makefile b/PC/Makefile index 88e6b19..33f12ab 100644 --- a/PC/Makefile +++ b/PC/Makefile @@ -6,7 +6,7 @@ SDIR := source IDIR := include LDIR := lib CFLAGS := -I$(IDIR) -fms-extensions -O2 -Wall -LFLAGS := -L$(LDIR) -lvJoyInterface -lws2_32 -lGdi32 -lgdiplus +LFLAGS := -L$(LDIR) -lvJoyInterface -lws2_32 -lGdi32 -lgdiplus -static-libgcc -static-libstdc++ CFILES := $(wildcard $(SDIR)/*.c) CPPFILES := $(wildcard $(SDIR)/*.cpp) OBJS := $(patsubst $(SDIR)/%.c, build/%.o, $(wildcard $(SDIR)/*.c)) From da319963b62c9563fff7865c9aa8a0eeb3d6dbb2 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sat, 25 Jul 2015 22:42:55 +0100 Subject: [PATCH 109/140] Update for latest compilers and libraries --- PC/include/keys.h | 13 ++++++ PC/include/public.h | 83 +++++++++++++++++++++++++++++++------- PC/include/vjoyinterface.h | 33 ++++++++++++++- PC/source/keys.c | 4 ++ 4 files changed, 118 insertions(+), 15 deletions(-) diff --git a/PC/include/keys.h b/PC/include/keys.h index 40baacc..95555fd 100644 --- a/PC/include/keys.h +++ b/PC/include/keys.h @@ -1,6 +1,19 @@ #pragma once #include +#include +#include + +// For some reason, these are not defined in winuser.h like they used to be... +#ifndef VK_OEM_MINUS +#define VK_OEM_MINUS 0xBD +#endif +#ifndef VK_OEM_COMMA +#define VK_OEM_COMMA 0xBC +#endif +#ifndef KEYEVENTF_SCANCODE +#define KEYEVENTF_SCANCODE 0x08 +#endif #define MAPVK_VK_TO_VSC 0 diff --git a/PC/include/public.h b/PC/include/public.h index 38342a8..32dc016 100644 --- a/PC/include/public.h +++ b/PC/include/public.h @@ -1,4 +1,37 @@ -#pragma once +/*++ + +Copyright (c) Shaul Eizikovich. All rights reserved. + + THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR + PURPOSE. + +Module Name: + + public.h + +Abstract: + + Public header file for the vJoy project + Developpers that need to interface with vJoy need to include this file + +Author: + + +Environment: + + kernel mode and User mode + +Notes: + + +Revision History: + + +--*/ +#ifndef _PUBLIC_H +#define _PUBLIC_H // Compilation directives #define PPJOY_MODE @@ -10,10 +43,6 @@ #include // Definitions for controlling GUID initialization -// Sideband comunication with vJoy Device -//{781EF630-72B2-11d2-B852-00C04FAD5101} -DEFINE_GUID(GUID_DEVINTERFACE_VJOY, 0x781EF630, 0x72B2, 0x11d2, 0xB8, 0x52, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x01); - // // Usage example: // CreateFile(TEXT("\\\\.\\vJoy"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); @@ -31,7 +60,7 @@ DEFINE_GUID(GUID_DEVINTERFACE_VJOY, 0x781EF630, 0x72B2, 0x11d2, 0xB8, 0x52, 0x00 #define VER_X_ 0 #define VER_H_ 2 #define VER_M_ 0 -#define VER_L_ 4 +#define VER_L_ 5 #define STRINGIFY_1(x) #x #define STRINGIFY(x) STRINGIFY_1(x) @@ -51,15 +80,34 @@ DEFINE_GUID(GUID_DEVINTERFACE_VJOY, 0x781EF630, 0x72B2, 0x11d2, 0xB8, 0x52, 0x00 #define SERIALNUMBER_STR MAKEWIDE(STRINGIFY(VER_H_)) L"." MAKEWIDE(STRINGIFY(VER_M_)) L"." MAKEWIDE(STRINGIFY(VER_L_)) // Function codes; -#define LOAD_POSITIONS 0x910 -#define GETATTRIB 0x911 - - +//#define LOAD_POSITIONS 0x910 +//#define GETATTRIB 0x911 +// #define GET_FFB_DATA 0x00222912 // METHOD_OUT_DIRECT + FILE_DEVICE_UNKNOWN + FILE_ANY_ACCESS +//#define SET_FFB_STAT 0x913 // METHOD_NEITHER +//#define GET_FFB_STAT 0x916 + +#define F_LOAD_POSITIONS 0x910 +#define F_GETATTRIB 0x911 +#define F_GET_FFB_DATA 0x912 +#define F_SET_FFB_STAT 0x913 +#define F_GET_FFB_STAT 0x916 +#define F_GET_DEV_INFO 0x917 // IO Device Control codes; -#define IOCTL_VJOY_GET_ATTRIB CTL_CODE (FILE_DEVICE_UNKNOWN, GETATTRIB, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_VJOY_GET_ATTRIB CTL_CODE (FILE_DEVICE_UNKNOWN, GETATTRIB, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define LOAD_POSITIONS CTL_CODE (FILE_DEVICE_UNKNOWN, F_LOAD_POSITIONS, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define GET_FFB_DATA CTL_CODE (FILE_DEVICE_UNKNOWN, F_GET_FFB_DATA, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) +#define SET_FFB_STAT CTL_CODE (FILE_DEVICE_UNKNOWN, F_SET_FFB_STAT, METHOD_NEITHER, FILE_ANY_ACCESS) +#define GET_FFB_STAT CTL_CODE (FILE_DEVICE_UNKNOWN, F_GET_FFB_STAT, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define GET_DEV_INFO CTL_CODE (FILE_DEVICE_UNKNOWN, F_GET_DEV_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) #ifndef __HIDPORT_H__ // Copied from hidport.h +#define IOCTL_HID_SET_FEATURE 0xB0191 +#define IOCTL_HID_WRITE_REPORT 0xB000F + +#define MAX_N_DEVICES 16 // Maximum number of vJoy devices + + typedef struct _HID_DEVICE_ATTRIBUTES { ULONG Size; @@ -153,12 +201,14 @@ typedef struct _JOYSTICK_POSITION_V2 DWORD bHatsEx1; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch DWORD bHatsEx2; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch DWORD bHatsEx3; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch LONG lButtonsEx1; // Buttons 33-64 + /// JOYSTICK_POSITION_V2 Extenssion - LONG lButtonsEx1; // Buttons 33-64 - LONG lButtonsEx2; // Buttons 65-96 - LONG lButtonsEx3; // Buttons 97-128 + LONG lButtonsEx1; // Buttons 33-64 + LONG lButtonsEx2; // Buttons 65-96 + LONG lButtonsEx3; // Buttons 97-128 } JOYSTICK_POSITION_V2, *PJOYSTICK_POSITION_V2; + // HID Descriptor definitions #define HID_USAGE_X 0x30 #define HID_USAGE_Y 0x31 @@ -170,3 +220,8 @@ typedef struct _JOYSTICK_POSITION_V2 #define HID_USAGE_SL1 0x37 #define HID_USAGE_WHL 0x38 #define HID_USAGE_POV 0x39 + + +#endif + + diff --git a/PC/include/vjoyinterface.h b/PC/include/vjoyinterface.h index 4a53b8f..0127577 100644 --- a/PC/include/vjoyinterface.h +++ b/PC/include/vjoyinterface.h @@ -21,6 +21,35 @@ enum VjdStat /* Declares an enumeration data type called BOOLEAN */ VJD_STAT_MISS, // The vJoy Device is missing. It either does not exist or the driver is down. VJD_STAT_UNKN // Unknown }; + +/* Error codes for some of the functions */ +#define NO_HANDLE_BY_INDEX -1 +#define BAD_PREPARSED_DATA -2 +#define NO_CAPS -3 +#define BAD_N_BTN_CAPS -4 +#define BAD_CALLOC -5 +#define BAD_BTN_CAPS -6 +#define BAD_BTN_RANGE -7 +#define BAD_N_VAL_CAPS -8 +#define BAD_ID_RANGE -9 +#define NO_SUCH_AXIS -10 + +/* Environment Variables */ +#define INTERFACE_LOG_LEVEL "VJOYINTERFACELOGLEVEL" +#define INTERFACE_LOG_FILE "VJOYINTERFACELOGFILE" +#define INTERFACE_DEF_LOG_FILE "vJoyInterface.log" + +struct DEV_INFO { + BYTE DeviceID; // Device ID: Valid values are 1-16 + BYTE nImplemented; // Number of implemented device: Valid values are 1-16 + BYTE isImplemented; // Is this device implemented? + BYTE MaxDevices; // Maximum number of devices that may be implemented (16) + BYTE DriverFFB; // Does this driver support FFB (False) + BYTE DeviceFFB; // Does this device support FFB (False) +} ; + +typedef void (CALLBACK *RemovalCB)(BOOL, BOOL, PVOID); + #endif ///////////////////////////// vJoy device (collection) Control interface ///////////////////////////////// /* @@ -40,6 +69,8 @@ VJOYINTERFACE_API BOOL __cdecl vJoyEnabled(void); VJOYINTERFACE_API PVOID __cdecl GetvJoyProductString(void); VJOYINTERFACE_API PVOID __cdecl GetvJoyManufacturerString(void); VJOYINTERFACE_API PVOID __cdecl GetvJoySerialNumberString(void); +VJOYINTERFACE_API BOOL __cdecl DriverMatch(WORD * DllVer, WORD * DrvVer); +VJOYINTERFACE_API VOID __cdecl RegisterRemovalCB(RemovalCB cb, PVOID data); ///// vJoy Device properties @@ -70,4 +101,4 @@ VJOYINTERFACE_API BOOL __cdecl ResetPovs(UINT rID); // Reset all POV Switches VJOYINTERFACE_API BOOL __cdecl SetAxis(LONG Value, UINT rID, UINT Axis); // Write Value to a given axis defined in the specified VDJ VJOYINTERFACE_API BOOL __cdecl SetBtn(BOOL Value, UINT rID, UCHAR nBtn); // Write Value to a given button defined in the specified VDJ VJOYINTERFACE_API BOOL __cdecl SetDiscPov(int Value, UINT rID, UCHAR nPov); // Write Value to a given descrete POV defined in the specified VDJ -VJOYINTERFACE_API BOOL __cdecl SetContPov(DWORD Value, UINT rID, UCHAR nPov); // Write Value to a given continuous POV defined in the specified VDJ \ No newline at end of file +VJOYINTERFACE_API BOOL __cdecl SetContPov(DWORD Value, UINT rID, UCHAR nPov); // Write Value to a given continuous POV defined in the specified VDJ diff --git a/PC/source/keys.c b/PC/source/keys.c index 1eecb2f..5f24212 100644 --- a/PC/source/keys.c +++ b/PC/source/keys.c @@ -1,5 +1,9 @@ #include "keys.h" +// Sideband comunication with vJoy Device +//{781EF630-72B2-11d2-B852-00C04FAD5101} +DEFINE_GUID(GUID_DEVINTERFACE_VJOY, 0x781EF630, 0x72B2, 0x11d2, 0xB8, 0x52, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x01); + unsigned int lastKeys; unsigned int currentKeys; From e4aee2a977cecd561f9d8590f2079a8789f55929 Mon Sep 17 00:00:00 2001 From: Nick Thyer Date: Sun, 6 Sep 2015 09:31:30 +0930 Subject: [PATCH 110/140] Initial n3ds First commit, the bulk of the changes. ZL and ZR work, but neither cStick nor circlePad work. So something's broken. --- 3DS/include/wireless.h | 7 ++++++- 3DS/source/main.c | 8 +++++--- 3DS/source/wireless.c | 3 ++- PC/3DSController.ini | 3 +++ PC/include/joystick.h | 2 ++ PC/include/keys.h | 6 ++++++ PC/include/settings.h | 3 ++- PC/include/wireless.h | 5 +++++ PC/source/keys.c | 1 + PC/source/main.c | 22 ++++++++++++++++++++-- PC/source/settings.c | 10 ++++++++++ 11 files changed, 62 insertions(+), 8 deletions(-) diff --git a/3DS/include/wireless.h b/3DS/include/wireless.h index cd99712..27efcae 100644 --- a/3DS/include/wireless.h +++ b/3DS/include/wireless.h @@ -54,6 +54,11 @@ struct packet { unsigned short x; unsigned short y; } touch; + + struct { + short x; + short y; + } cStick; }; struct keysPacket keysPacket; }; @@ -79,4 +84,4 @@ bool openSocket(int port); void sendBuf(int length); int receiveBuffer(int length); void sendConnectionRequest(void); -void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch); +void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch, circlePosition cStick); diff --git a/3DS/source/main.c b/3DS/source/main.c index ff57fd5..11c235b 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -87,12 +87,14 @@ int main(void) { while(aptMainLoop()) { hidScanInput(); - //irrstScanInput(); + irrstScanInput(); u32 kHeld = hidKeysHeld(); + circlePosition circlePad; - //hidCstickRead(&cstick); + circlePosition cStick; hidCircleRead(&circlePad); + irrstCstickRead(&cStick); touchPosition touch; touchRead(&touch); @@ -133,7 +135,7 @@ int main(void) { } } - sendKeys(kHeld, circlePad, touch); + sendKeys(kHeld, circlePad, touch, cStick); receiveBuffer(sizeof(struct packet)); diff --git a/3DS/source/wireless.c b/3DS/source/wireless.c index 76146e8..0c9bc38 100644 --- a/3DS/source/wireless.c +++ b/3DS/source/wireless.c @@ -38,11 +38,12 @@ void sendConnectionRequest(void) { sendBuf(offsetof(struct packet, connectPacket) + sizeof(struct connectPacket)); } -void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch) { +void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch, circlePosition cStick) { outBuf.command = KEYS; outBuf.keyboardActive = keyboardActive; memcpy(&outBuf.keys, &keys, 4); memcpy(&outBuf.circlePad, &circlePad, 4); memcpy(&outBuf.touch, &touch, 4); + memcpy(&outBuf.cStick, &cStick, 4); sendBuf(offsetof(struct packet, keysPacket) + sizeof(struct keysPacket)); } diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 4059437..be8abb4 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -18,6 +18,7 @@ Make sure to use a single space, not a tab for seperating settings, Port: 8889 Throttle: 20 Circle Pad: JOYSTICK +C Stick: JOYSTICK Touch: MOUSE Mouse Speed: 0 A: A @@ -26,6 +27,8 @@ X: X Y: Y L: L R: R +ZL: Q +ZR: W Left: LEFT Right: RIGHT Up: UP diff --git a/PC/include/joystick.h b/PC/include/joystick.h index 9f4bf31..bcbb46b 100644 --- a/PC/include/joystick.h +++ b/PC/include/joystick.h @@ -11,6 +11,8 @@ #define joyX iReport.wAxisX #define joyY iReport.wAxisY +#define joyRX iReport.wAxisXRot +#define joyRY iReport.wAxisYRot #define joyButtons iReport.lButtons #define JOY_MIDDLE (128 * 128) diff --git a/PC/include/keys.h b/PC/include/keys.h index 95555fd..790b645 100644 --- a/PC/include/keys.h +++ b/PC/include/keys.h @@ -78,6 +78,11 @@ struct circlePad { short y; }; +struct cStick { + short x; + short y; +}; + struct touch { short x; short y; @@ -87,6 +92,7 @@ extern unsigned int lastKeys; extern unsigned int currentKeys; extern struct circlePad circlePad; +extern struct cStick cStick; extern struct touch lastTouch; extern struct touch currentTouch; diff --git a/PC/include/settings.h b/PC/include/settings.h index f909109..c632d60 100644 --- a/PC/include/settings.h +++ b/PC/include/settings.h @@ -13,9 +13,10 @@ struct settings { int port; int throttle; enum analogue circlePad; + enum analogue cStick; enum analogue touch; int mouseSpeed; - struct keyMapping A, B, X, Y, L, R, Left, Right, Up, Down, Start, Select, Tap; + struct keyMapping A, B, X, Y, L, R, ZL, ZR, Left, Right, Up, Down, Start, Select, Tap; }; extern struct settings settings; diff --git a/PC/include/wireless.h b/PC/include/wireless.h index 36444d3..772a194 100644 --- a/PC/include/wireless.h +++ b/PC/include/wireless.h @@ -46,6 +46,11 @@ struct packet { unsigned short x; unsigned short y; } touch; + + struct { + short x; + short y; + } cStick; }; struct keysPacket keysPacket; diff --git a/PC/source/keys.c b/PC/source/keys.c index 5f24212..8d7a89b 100644 --- a/PC/source/keys.c +++ b/PC/source/keys.c @@ -8,6 +8,7 @@ unsigned int lastKeys; unsigned int currentKeys; struct circlePad circlePad; +struct cStick cStick; struct touch lastTouch; struct touch currentTouch; diff --git a/PC/source/main.c b/PC/source/main.c index 386fc65..6e649fb 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -29,8 +29,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) UINT iInterface = 1; iReport.wAxisZ = JOY_MIDDLE; - iReport.wAxisXRot = JOY_MIDDLE; - iReport.wAxisYRot = JOY_MIDDLE; + //iReport.wAxisXRot = JOY_MIDDLE; Using these for c stick. Likely reported as axes 4 and 5, skipping 3 as z? Not sure if that's ideal? + //iReport.wAxisYRot = JOY_MIDDLE; Makes most sense in vJoy though. iReport.wAxisZRot = JOY_MIDDLE; iReport.wSlider = JOY_MIDDLE; iReport.lButtons = 0; @@ -93,6 +93,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) lastTouch.y = 0; currentTouch.x = 0; currentTouch.y = 0; + cStick.x = 0; + cStick.y = 0; buffer.command = CONNECT; printf("3DS Connected!\n"); @@ -114,6 +116,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) memcpy(¤tKeys, &buffer.keys, 4); memcpy(&circlePad, &buffer.circlePad, 4); memcpy(¤tTouch, &buffer.touch, 4); + memcpy(&cStick, &buffer.cStick, 4); handleKey(KEY_A, settings.A); handleKey(KEY_B, settings.B); @@ -125,6 +128,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) handleKey(KEY_DDOWN, settings.Down); handleKey(KEY_R, settings.R); handleKey(KEY_L, settings.L); + handleKey(KEY_ZR, settings.ZR); + handleKey(KEY_ZL, settings.ZL); handleKey(KEY_X, settings.X); handleKey(KEY_Y, settings.Y); @@ -177,6 +182,19 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) joyY = (128 - circlePad.y) * 128; } + if(settings.cStick == mouse) { + if(abs(cStick.x) < settings.mouseSpeed * 3) cStick.x = 0; + if(abs(cStick.y) < settings.mouseSpeed * 3) cStick.y = 0; + + POINT p; + GetCursorPos(&p); + SetCursorPos(p.x + (cStick.x * settings.mouseSpeed) / 32, p.y - (cStick.y * settings.mouseSpeed) / 32); + } + else if(settings.cStick == joystick) { + joyRX = (cStick.x + 128) * 128; + joyRY = (128 - cStick.y) * 128; + } + break; } diff --git a/PC/source/settings.c b/PC/source/settings.c index 604d195..e0f5832 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -13,6 +13,7 @@ struct settings defaultSettings = { port: 8889, throttle: 20, circlePad: joystick, + cStick: joystick, touch: mouse, mouseSpeed: 4, A: { 1, {'A'} }, @@ -21,6 +22,8 @@ struct settings defaultSettings = { Y: { 1, {'Y'} }, L: { 1, {'L'} }, R: { 1, {'R'} }, + ZL: { 1, {'Q'} }, + ZR: { 1, {'W'} }, Left: { 1, {VK_LEFT} }, Right: { 1, {VK_RIGHT} }, Up: { 1, {VK_UP} }, @@ -121,6 +124,11 @@ bool readSettings(void) { else if(strcmp(setting, "JOYSTICK") == 0) settings.circlePad = joystick; } + if(getSetting("C Stick: ", buffer, setting)) { + if(strcmp(setting, "MOUSE") == 0) settings.cStick = mouse; + else if(strcmp(setting, "JOYSTICK") == 0) settings.cStick = joystick; + } + if(getSetting("Touch: ", buffer, setting)) { if(strcmp(setting, "MOUSE") == 0) settings.touch = mouse; else if(strcmp(setting, "JOYSTICK") == 0) settings.touch = joystick; @@ -136,6 +144,8 @@ bool readSettings(void) { if(getSetting("Y: ", buffer, setting)) settings.Y = getButton(setting); if(getSetting("L: ", buffer, setting)) settings.L = getButton(setting); if(getSetting("R: ", buffer, setting)) settings.R = getButton(setting); + if(getSetting("ZL: ", buffer, setting)) settings.ZL = getButton(setting); + if(getSetting("ZR: ", buffer, setting)) settings.ZR = getButton(setting); if(getSetting("Left: ", buffer, setting)) settings.Left = getButton(setting); if(getSetting("Right: ", buffer, setting)) settings.Right = getButton(setting); if(getSetting("Up: ", buffer, setting)) settings.Up = getButton(setting); From f2241d3e739fb388bd0b1eea515377d35204fe02 Mon Sep 17 00:00:00 2001 From: Poke Date: Sun, 6 Sep 2015 11:27:23 +0930 Subject: [PATCH 111/140] Update vJoy dll dll works with vJoy version: 05/05/2015,6.0.6000.16386 --- PC/vJoyInterface.dll | Bin 28160 -> 25600 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/PC/vJoyInterface.dll b/PC/vJoyInterface.dll index f1e7b0a36c9b1b9a5108e7356ecc01ee9ccfcccd..8832f23c93aa56a07e218568f3afa3c790ad47d8 100644 GIT binary patch literal 25600 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 literal 28160 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 Date: Sun, 6 Sep 2015 11:56:53 +0930 Subject: [PATCH 112/140] Configurable dual joysticks Added the ability to map mouse, circle pad and c stick to 2 separate joysticks. This was partly added before for c stick but now it's configurable. --- PC/3DSController.ini | 12 +++++++----- PC/include/settings.h | 3 ++- PC/source/main.c | 24 +++++++++++++++++++----- PC/source/settings.c | 13 ++++++++----- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index be8abb4..953d11e 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -1,6 +1,7 @@ Default port is 8889, if you change this, you must change it in the 3DS's 3DSController.ini as well, -Circle Pad and Touch can be either JOYSTICK or MOUSE, +Circle Pad, C Stick and Touch can be MOUSE, JOYSTICK1 or JOYSTICK2 +JOYSTICK1 uses X and Y. JOYSTICK2 uses Rx and Ry. These are 0, 1, 3 and 4 respectively, leaving 2 and 5 unused which may cause confusion. Mouse Speed controls how fast the Circle Pad or Touch Screen moves the mouse. If set to 0 and using the Touch Screen, it will set to the absolute position, rather than moving relatively to last position, @@ -17,10 +18,11 @@ Make sure to use a single space, not a tab for seperating settings, Port: 8889 Throttle: 20 -Circle Pad: JOYSTICK -C Stick: JOYSTICK -Touch: MOUSE -Mouse Speed: 0 +Circle Pad: JOYSTICK1 +C Stick: JOYSTICK1 +Touch: JOYSTICK2 +Mouse Speed: + A: A B: B X: X diff --git a/PC/include/settings.h b/PC/include/settings.h index c632d60..e5006de 100644 --- a/PC/include/settings.h +++ b/PC/include/settings.h @@ -6,7 +6,8 @@ enum analogue { mouse, - joystick, + joystick1, + joystick2, }; struct settings { diff --git a/PC/source/main.c b/PC/source/main.c index 6e649fb..52568cb 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -29,8 +29,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) UINT iInterface = 1; iReport.wAxisZ = JOY_MIDDLE; - //iReport.wAxisXRot = JOY_MIDDLE; Using these for c stick. Likely reported as axes 4 and 5, skipping 3 as z? Not sure if that's ideal? - //iReport.wAxisYRot = JOY_MIDDLE; Makes most sense in vJoy though. iReport.wAxisZRot = JOY_MIDDLE; iReport.wSlider = JOY_MIDDLE; iReport.lButtons = 0; @@ -160,10 +158,15 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) SetCursorPos((int)((double)currentTouch.x * widthMultiplier), (int)((double)currentTouch.y * heightMultiplier)); } } - else if(settings.touch == joystick) { + else if(settings.touch == joystick1) { joyX = (currentTouch.x) * 128; joyY = (currentTouch.y) * 128; } + + else if(settings.touch == joystick2) { + joyRX = (currentTouch.x) * 128; + joyRY = (currentTouch.y) * 128; + } else { handleKey(KEY_TOUCH, settings.Tap); } @@ -177,11 +180,16 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) GetCursorPos(&p); SetCursorPos(p.x + (circlePad.x * settings.mouseSpeed) / 32, p.y - (circlePad.y * settings.mouseSpeed) / 32); } - else if(settings.circlePad == joystick) { + else if(settings.circlePad == joystick1) { joyX = (circlePad.x + 128) * 128; joyY = (128 - circlePad.y) * 128; } + else if(settings.circlePad == joystick2) { + joyRX = (circlePad.x + 128) * 128; + joyRY = (128 - circlePad.y) * 128; + } + if(settings.cStick == mouse) { if(abs(cStick.x) < settings.mouseSpeed * 3) cStick.x = 0; if(abs(cStick.y) < settings.mouseSpeed * 3) cStick.y = 0; @@ -190,7 +198,13 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) GetCursorPos(&p); SetCursorPos(p.x + (cStick.x * settings.mouseSpeed) / 32, p.y - (cStick.y * settings.mouseSpeed) / 32); } - else if(settings.cStick == joystick) { + + else if(settings.cStick == joystick1) { + joyX = (cStick.x + 128) * 128; + joyY = (128 - cStick.y) * 128; + } + + else if(settings.cStick == joystick2) { joyRX = (cStick.x + 128) * 128; joyRY = (128 - cStick.y) * 128; } diff --git a/PC/source/settings.c b/PC/source/settings.c index e0f5832..e02ef43 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -12,8 +12,8 @@ struct settings settings; struct settings defaultSettings = { port: 8889, throttle: 20, - circlePad: joystick, - cStick: joystick, + circlePad: joystick1, + cStick: joystick2, touch: mouse, mouseSpeed: 4, A: { 1, {'A'} }, @@ -121,17 +121,20 @@ bool readSettings(void) { if(getSetting("Circle Pad: ", buffer, setting)) { if(strcmp(setting, "MOUSE") == 0) settings.circlePad = mouse; - else if(strcmp(setting, "JOYSTICK") == 0) settings.circlePad = joystick; + else if(strcmp(setting, "JOYSTICK1") == 0) settings.circlePad = joystick1; + else if(strcmp(setting, "JOYSTICK2") == 0) settings.circlePad = joystick2; } if(getSetting("C Stick: ", buffer, setting)) { if(strcmp(setting, "MOUSE") == 0) settings.cStick = mouse; - else if(strcmp(setting, "JOYSTICK") == 0) settings.cStick = joystick; + else if(strcmp(setting, "JOYSTICK1") == 0) settings.cStick = joystick1; + else if(strcmp(setting, "JOYSTICK2") == 0) settings.cStick = joystick2; } if(getSetting("Touch: ", buffer, setting)) { if(strcmp(setting, "MOUSE") == 0) settings.touch = mouse; - else if(strcmp(setting, "JOYSTICK") == 0) settings.touch = joystick; + else if(strcmp(setting, "JOYSTICK1") == 0) settings.touch = joystick1; + else if(strcmp(setting, "JOYSTICK2") == 0) settings.touch = joystick2; } if(getSetting("Mouse Speed: ", buffer, setting)) { From aa4e66653d776cfd690fb857ee66a90a4b124e70 Mon Sep 17 00:00:00 2001 From: Poke Date: Sun, 6 Sep 2015 11:58:53 +0930 Subject: [PATCH 113/140] Reset configs to default oops haha --- PC/3DSController.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 953d11e..747ac7f 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -19,9 +19,9 @@ Make sure to use a single space, not a tab for seperating settings, Port: 8889 Throttle: 20 Circle Pad: JOYSTICK1 -C Stick: JOYSTICK1 -Touch: JOYSTICK2 -Mouse Speed: +C Stick: JOYSTICK2 +Touch: MOUSE +Mouse Speed: 0 A: A B: B From 2a2bc447eae2c959e2eff9458c10c8fa5efb5a85 Mon Sep 17 00:00:00 2001 From: Poke Date: Sun, 6 Sep 2015 23:07:43 +0930 Subject: [PATCH 114/140] Raised joystick button limit to 16, set default axis values. Also filled in default values for all axes, instead of just unused ones. buttons 9 - 16 are a bit of a hack but hey it works! As long as the user configures their vJoy. --- PC/3DSController.ini | 6 ++++-- PC/include/keys.h | 10 +++++++--- PC/source/main.c | 8 ++++++++ PC/source/settings.c | 25 +++++++++++++++++-------- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 747ac7f..2bb191b 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -1,11 +1,13 @@ Default port is 8889, if you change this, you must change it in the 3DS's 3DSController.ini as well, Circle Pad, C Stick and Touch can be MOUSE, JOYSTICK1 or JOYSTICK2 -JOYSTICK1 uses X and Y. JOYSTICK2 uses Rx and Ry. These are 0, 1, 3 and 4 respectively, leaving 2 and 5 unused which may cause confusion. +JOYSTICK1 uses X and Y. JOYSTICK2 uses Rx and Ry. These are 0, 1, 3 and 4 respectively, leaving 2 and 5 unused. Mouse Speed controls how fast the Circle Pad or Touch Screen moves the mouse. If set to 0 and using the Touch Screen, it will set to the absolute position, rather than moving relatively to last position, -Buttons can be a letter for a keyboard key (like Q, W, E, R, T, or Y), a special keyboard key (like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS), or a joypad button (JOY1, JOY2, JOY3, to JOY8), +Buttons can be a letter for a keyboard key (like Q, W, E, R, T, or Y), a special keyboard key (like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS), or a joypad button (JOY1, JOY2, JOY3, to JOY16). + +If you want to use JOY9 through JOY16 you need to reconfigure vJoy. Search for vJoyConf in your start menu and set buttons to 16. Alternatively, you can disable a key by binding it to NONE, diff --git a/PC/include/keys.h b/PC/include/keys.h index 790b645..f362629 100644 --- a/PC/include/keys.h +++ b/PC/include/keys.h @@ -21,14 +21,18 @@ #define release(key) (!(currentKeys & key) && (lastKeys & key)) #define handleKey(DSKey, PCKey) do {\ - if(PCKey.useKeyboard) {\ + if(!PCKey.useJoypad) {\ if(newpress(DSKey)) simulateKeyNewpress(PCKey.virtualKey);\ if(release(DSKey)) simulateKeyRelease(PCKey.virtualKey);\ }\ - else {\ + else if(PCKey.useJoypad == 1) {\ if(currentKeys & DSKey) joyButtons |= PCKey.joypadButton;\ else joyButtons &= ~PCKey.joypadButton;\ }\ + else if(PCKey.useJoypad == 2) {\ + if(currentKeys & DSKey) joyButtons |= PCKey.joypadButton << 8;\ + else joyButtons &= ~(PCKey.joypadButton << 8);\ + }\ } while(0) #define BIT(n) (1 << (n)) @@ -66,7 +70,7 @@ typedef enum { } KEYPAD_BITS; struct keyMapping { - unsigned char useKeyboard; // 0 joypad button, 1 keyboard key + unsigned char useJoypad; // 0 keyboard key, 1 joypad1-8, 2 joypad9-16 union { unsigned char virtualKey; unsigned char joypadButton; diff --git a/PC/source/main.c b/PC/source/main.c index 52568cb..f0b5378 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -28,9 +28,14 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) bool vJoy = true; UINT iInterface = 1; + iReport.wAxisX = JOY_MIDDLE; + iReport.wAxisY = JOY_MIDDLE; iReport.wAxisZ = JOY_MIDDLE; + iReport.wAxisXRot = JOY_MIDDLE; + iReport.wAxisYRot = JOY_MIDDLE; iReport.wAxisZRot = JOY_MIDDLE; iReport.wSlider = JOY_MIDDLE; + iReport.wDial = JOY_MIDDLE; iReport.lButtons = 0; iReport.bHats = -1; @@ -59,6 +64,9 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) initNetwork(); + char nButtons = GetVJDButtonNumber(iInterface); + if(nButtons <16) printf("Your vJoy has less than 16 buttons (8 by default), some may not work!\n"); + printf("Port: %d\n", settings.port); printf("Running on: %s\n", hostName); diff --git a/PC/source/settings.c b/PC/source/settings.c index e02ef43..1af66c3 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -55,6 +55,7 @@ static bool getSetting(char *name, char *src, char *dest) { static struct keyMapping getButton(char *string) { struct keyMapping k = { 1, {0} }; + k.useJoypad = 0; if(strcmp(string, "SPACE") == 0) k.virtualKey = VK_SPACE; else if(strcmp(string, "CLICK") == 0) k.virtualKey = VK_LBUTTON; else if(strcmp(string, "RIGHT CLICK") == 0) k.virtualKey = VK_RBUTTON; @@ -71,14 +72,22 @@ static struct keyMapping getButton(char *string) { else if(strcmp(string, "WINDOWS") == 0) k.virtualKey = VK_LWIN; else if(strcmp(string, "NONE") == 0) k.virtualKey = 0; - else if(strcmp(string, "JOY1") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 0; } - else if(strcmp(string, "JOY2") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 1; } - else if(strcmp(string, "JOY3") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 2; } - else if(strcmp(string, "JOY4") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 3; } - else if(strcmp(string, "JOY5") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 4; } - else if(strcmp(string, "JOY6") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 5; } - else if(strcmp(string, "JOY7") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 6; } - else if(strcmp(string, "JOY8") == 0) { k.useKeyboard = 0; k.joypadButton = 1 << 7; } + else if(strcmp(string, "JOY1") == 0) { k.useJoypad = 1; k.joypadButton = 1 << 0; } + else if(strcmp(string, "JOY2") == 0) { k.useJoypad = 1; k.joypadButton = 1 << 1; } + else if(strcmp(string, "JOY3") == 0) { k.useJoypad = 1; k.joypadButton = 1 << 2; } + else if(strcmp(string, "JOY4") == 0) { k.useJoypad = 1; k.joypadButton = 1 << 3; } + else if(strcmp(string, "JOY5") == 0) { k.useJoypad = 1; k.joypadButton = 1 << 4; } + else if(strcmp(string, "JOY6") == 0) { k.useJoypad = 1; k.joypadButton = 1 << 5; } + else if(strcmp(string, "JOY7") == 0) { k.useJoypad = 1; k.joypadButton = 1 << 6; } + else if(strcmp(string, "JOY8") == 0) { k.useJoypad = 1; k.joypadButton = 1 << 7; } + else if(strcmp(string, "JOY9") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 0; } + else if(strcmp(string, "JOY10") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 1; } + else if(strcmp(string, "JOY11") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 2; } + else if(strcmp(string, "JOY12") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 3; } + else if(strcmp(string, "JOY13") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 4; } + else if(strcmp(string, "JOY14") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 5; } + else if(strcmp(string, "JOY15") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 6; } + else if(strcmp(string, "JOY16") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 7; } else k.virtualKey = (int)string[0]; From a1f68e8e485479d9f5f5ac07893e1af9f50c80d6 Mon Sep 17 00:00:00 2001 From: Poke Date: Sun, 6 Sep 2015 23:21:29 +0930 Subject: [PATCH 115/140] Update readme I'm done coding the upgrades I wanted for the moment, time for release! unofficial 0.6 here we go! --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9dbb516..3e363a9 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A 3DS homebrew application which allows you to use your 3DS as a wireless contro The latest release will always be downloadable from [here](https://github.com/CTurt/3DSController/releases/). ### Setup and Usage -Firstly, if you want to be able to use the circle pad as a joystick you will need to install [vJoy (version 2.0.4 is preferable)](http://sourceforge.net/projects/vjoystick/files/Beta%202.x/2.0.4%20220914/vJoy_204_I220914.exe/download). However, if you just want to use the buttons, this is not necessary. +Firstly, if you want to be able to use the circle pad as a joystick you will need to install [vJoy (version 2.0.5-120515 is preferable)](http://sourceforge.net/projects/vjoystick/files/Beta%202.x/2.0.5-120515/vJoy_205_050515.exe/download). However, if you just want to use keyboard buttons, this is not necessary. Extract the archive and copy the executable in the `3DS` directory with the extension that applies to your loader: `3DSController.3dsx` and `3DSController.smdh` for Ninjhax, `3DSController.3ds` for flashcards, or `3DSController.cia` for CFWs, into your 3DS's SD card or flashcard's micro SD card. @@ -24,10 +24,12 @@ Otherwise, you should just see a black screen, this is a good sign. To see if it If using version 0.4 or above you can press L, R and X to bring up the keyboard. Press L, R and X again to close it. +If using version 0.6 or above, up to 16 joystick buttons are available. If you wish to use more than 8, you need to configure vJoy. Search in your start menu for vJoyConfig and set buttons to 16. + If using Ninjhax press Start and Select to return to the Homebrew Loader, otherwise you can just exit with the Home button. ### Configuration -Find the line `Port: 8888` and change it to your desired port, do this for both the 3DS's `3DSController.ini` and the PC's `3DSController.ini`. +Find the line `Port: 8889` and change it to your desired port, do this for both the 3DS's `3DSController.ini` and the PC's `3DSController.ini`. To use custom key bindings, just change the PC's `3DSController.ini` file, it should be straight forward. From 2f5bd498378bfa40a33604fa37ab4387f81494ee Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 6 Sep 2015 18:38:49 +0100 Subject: [PATCH 116/140] General fixes --- PC/Makefile | 2 +- PC/include/keys.h | 2 + PC/include/screenshot.h | 16 -------- PC/source/main.c | 5 --- PC/source/screenshot.cpp | 80 ---------------------------------------- PC/source/wireless.c | 22 ----------- 6 files changed, 3 insertions(+), 124 deletions(-) delete mode 100644 PC/include/screenshot.h delete mode 100644 PC/source/screenshot.cpp diff --git a/PC/Makefile b/PC/Makefile index 33f12ab..4581eca 100644 --- a/PC/Makefile +++ b/PC/Makefile @@ -6,7 +6,7 @@ SDIR := source IDIR := include LDIR := lib CFLAGS := -I$(IDIR) -fms-extensions -O2 -Wall -LFLAGS := -L$(LDIR) -lvJoyInterface -lws2_32 -lGdi32 -lgdiplus -static-libgcc -static-libstdc++ +LFLAGS := $(LDIR)/vJoyInterface.lib -lws2_32 -lGdi32 -lgdiplus -static-libgcc CFILES := $(wildcard $(SDIR)/*.c) CPPFILES := $(wildcard $(SDIR)/*.cpp) OBJS := $(patsubst $(SDIR)/%.c, build/%.o, $(wildcard $(SDIR)/*.c)) diff --git a/PC/include/keys.h b/PC/include/keys.h index f362629..7ba9136 100644 --- a/PC/include/keys.h +++ b/PC/include/keys.h @@ -15,7 +15,9 @@ #define KEYEVENTF_SCANCODE 0x08 #endif +#ifndef MAPVK_VK_TO_VSC #define MAPVK_VK_TO_VSC 0 +#endif #define newpress(key) ((currentKeys & key) && !(lastKeys & key)) #define release(key) (!(currentKeys & key) && (lastKeys & key)) diff --git a/PC/include/screenshot.h b/PC/include/screenshot.h deleted file mode 100644 index a530517..0000000 --- a/PC/include/screenshot.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define SCREENSHOT_NAME "tempScreen.jpg" -#define SCREENSHOT_NAMEL L"tempScreen.jpg" - -void screenshot(const WCHAR *filename, BOOL fullscreen, int windowedX, int windowedY, ULONG quality); - -#ifdef __cplusplus -} -#endif diff --git a/PC/source/main.c b/PC/source/main.c index f0b5378..835f5d2 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -12,7 +12,6 @@ #include "joystick.h" #include "settings.h" #include "keyboard.h" -#include "screenshot.h" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) { printf("3DS Controller Server %.1f\n", VERSION); @@ -23,8 +22,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) double widthMultiplier = screenWidth / 320.0; double heightMultiplier = screenHeight / 240.0; - //screenshot(SCREENSHOT_NAMEL, TRUE, 0, 0, 18); - bool vJoy = true; UINT iInterface = 1; @@ -221,8 +218,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) } if(vJoy) updateJoystick(); - - //sendScreenshot(); } error("accept()"); diff --git a/PC/source/screenshot.cpp b/PC/source/screenshot.cpp deleted file mode 100644 index 029a863..0000000 --- a/PC/source/screenshot.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include -#include - -#include "screenshot.h" - -extern "C" { - -int GetEncoderClsid(const WCHAR *format, CLSID *pClsid) { - using namespace Gdiplus; - UINT num = 0; // number of image encoders - UINT size = 0; // size of the image encoder array in bytes - - ImageCodecInfo *pImageCodecInfo = NULL; - - GetImageEncodersSize(&num, &size); - if(size == 0) - return -1; // Failure - - pImageCodecInfo = (ImageCodecInfo *)(malloc(size)); - if(pImageCodecInfo == NULL) - return -1; // Failure - - GetImageEncoders(num, size, pImageCodecInfo); - - UINT j; - for(j = 0; j < num; j++) { - if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0) { - *pClsid = pImageCodecInfo[j].Clsid; - free(pImageCodecInfo); - return j; // Success - } - } - - free(pImageCodecInfo); - return 0; -} - -void screenshot(const WCHAR *filename, BOOL fullscreen, int windowedX, int windowedY, ULONG quality) { - using namespace Gdiplus; - GdiplusStartupInput gdiplusStartupInput; - ULONG_PTR gdiplusToken; - GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); - - { - HDC scrdc, memdc; - HBITMAP membit; - scrdc = ::GetDC(0); - memdc = CreateCompatibleDC(scrdc); - membit = CreateCompatibleBitmap(scrdc, 400, 240); - HBITMAP hOldBitmap = (HBITMAP) SelectObject(memdc, membit); - - EncoderParameters encoderParams; - encoderParams.Count = 1; - encoderParams.Parameter[0].NumberOfValues = 1; - encoderParams.Parameter[0].Guid = EncoderQuality; - encoderParams.Parameter[0].Type = EncoderParameterValueTypeLong; - encoderParams.Parameter[0].Value = &quality; - - if(fullscreen) { - StretchBlt(memdc, 0, 0, 400, 240, scrdc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SRCCOPY); - } - else { - BitBlt(memdc, 0, 0, 400, 240, scrdc, windowedX, windowedY, SRCCOPY); - } - - Gdiplus::Bitmap bitmap(membit, NULL); - CLSID clsid; - GetEncoderClsid(L"image/jpeg", &clsid); - bitmap.Save(filename, &clsid, &encoderParams); - - SelectObject(memdc, hOldBitmap); - DeleteObject(memdc); - DeleteObject(membit); - ::ReleaseDC(0, scrdc); - } - - GdiplusShutdown(gdiplusToken); -} - -} diff --git a/PC/source/wireless.c b/PC/source/wireless.c index 9100878..389989a 100644 --- a/PC/source/wireless.c +++ b/PC/source/wireless.c @@ -3,7 +3,6 @@ #include "general.h" #include "settings.h" -#include "screenshot.h" #include "wireless.h" @@ -79,24 +78,3 @@ void sendBuffer(int length) { int receiveBuffer(int length) { return recvfrom(listener, (char *)&buffer, length, 0, (struct sockaddr *)&client_in, &sockaddr_in_sizePtr); } - -void sendScreenshot(void) { - FILE *f = fopen(SCREENSHOT_NAME, "rb"); - fseek(f, 0, SEEK_END); - size_t len = ftell(f); - unsigned char *screenshotData = malloc(len); - rewind(f); - fread(screenshotData, len, 1, f); - fclose(f); - - buffer.command = SCREENSHOT; - - while(1) { - int tl = len - buffer.offset > SCREENSHOT_CHUNK ? SCREENSHOT_CHUNK : len - buffer.offset; - memcpy(buffer.data, screenshotData + buffer.offset, tl); - sendBuffer(tl + offsetof(struct packet, screenshotPacket)); - if(tl < SCREENSHOT_CHUNK) break; - } - - free(screenshotData); -} From 800657cc2b931bea28683fd7b80d0c1d00b0d542 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 6 Sep 2015 18:39:59 +0100 Subject: [PATCH 117/140] Take out the trash --- PC/Makefile | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/PC/Makefile b/PC/Makefile index 4581eca..3084134 100644 --- a/PC/Makefile +++ b/PC/Makefile @@ -1,6 +1,5 @@ CC := gcc -CP := g++ -LN := g++ +LN := gcc ODIR := build SDIR := source IDIR := include @@ -8,9 +7,7 @@ LDIR := lib CFLAGS := -I$(IDIR) -fms-extensions -O2 -Wall LFLAGS := $(LDIR)/vJoyInterface.lib -lws2_32 -lGdi32 -lgdiplus -static-libgcc CFILES := $(wildcard $(SDIR)/*.c) -CPPFILES := $(wildcard $(SDIR)/*.cpp) -OBJS := $(patsubst $(SDIR)/%.c, build/%.o, $(wildcard $(SDIR)/*.c)) -OBJS += $(patsubst $(SDIR)/%.cpp, build/%.o, $(wildcard $(SDIR)/*.cpp)) +OBJS := $(patsubst $(SDIR)/%.c, $(ODIR)/%.o, $(wildcard $(SDIR)/*.c)) PLATFORM = $(shell uname) @@ -32,9 +29,6 @@ $(TARGET): $(ODIR) $(OBJS) $(ODIR)/%.o: $(SDIR)/%.c $(CC) -c -o $@ $< $(CFLAGS) -$(ODIR)/%.o: $(SDIR)/%.cpp - $(CP) -c -o $@ $< $(CFLAGS) - $(ODIR): @mkdir $@ From 6577488dc01710cad4ad9a5e0d8fe775d45e8d09 Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 6 Sep 2015 18:50:21 +0100 Subject: [PATCH 118/140] backlight --- 3DS/include/drawing.h | 11 +++++++++++ 3DS/source/drawing.c | 18 ++++++++++++++++++ 3DS/source/main.c | 24 +++++++++--------------- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/3DS/include/drawing.h b/3DS/include/drawing.h index dd30618..78f94bb 100644 --- a/3DS/include/drawing.h +++ b/3DS/include/drawing.h @@ -1,5 +1,13 @@ #pragma once +#ifndef REG_LCDBACKLIGHTMAIN +#define REG_LCDBACKLIGHTMAIN (u32)(0x1ED02240 - 0x1EB00000) +#endif + +#ifndef REG_LCDBACKLIGHTSUB +#define REG_LCDBACKLIGHTSUB (u32)(0x1ED02A40 - 0x1EB00000) +#endif + inline void clearScreen(void); #define drawPixelRGB(x, y, r, g, b) drawPixelRGBFramebuffer(0, x, y, r, g, b) @@ -10,3 +18,6 @@ inline void drawBoxFramebuffer(u8 *fb, int x, int y, int width, int height, u8 r #define drawString(sx, sy, text, ...) drawStringFramebuffer(0, sx, sy, text, ##__VA_ARGS__) void drawStringFramebuffer(u8 *fb, int sx, int sy, char *text, ...); + +void disableBacklight(); +void enableBacklight(); diff --git a/3DS/source/drawing.c b/3DS/source/drawing.c index d17317b..653022d 100644 --- a/3DS/source/drawing.c +++ b/3DS/source/drawing.c @@ -155,3 +155,21 @@ void drawStringFramebuffer(u8 *fb, int sx, int sy, char *text, ...) { sx += 8; } } + +static u32 brightnessMain; +static u32 brightnessSub; + +void disableBacklight() { + u32 off = 0; + + GSPGPU_ReadHWRegs(NULL, REG_LCDBACKLIGHTMAIN, &brightnessMain, 4); + GSPGPU_ReadHWRegs(NULL, REG_LCDBACKLIGHTSUB, &brightnessSub, 4); + + GSPGPU_WriteHWRegs(NULL, REG_LCDBACKLIGHTMAIN, &off, 4); + GSPGPU_WriteHWRegs(NULL, REG_LCDBACKLIGHTSUB, &off, 4); +} + +void enableBacklight() { + GSPGPU_WriteHWRegs(NULL, REG_LCDBACKLIGHTMAIN, &brightnessMain, 4); + GSPGPU_WriteHWRegs(NULL, REG_LCDBACKLIGHTSUB, &brightnessSub, 4); +} diff --git a/3DS/source/main.c b/3DS/source/main.c index 11c235b..b76d011 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -34,7 +34,8 @@ int main(void) { acInit(); gfxInitDefault(); - //consoleInit(GFX_BOTTOM, NULL); + gfxSetDoubleBuffering(GFX_TOP, false); + gfxSetDoubleBuffering(GFX_BOTTOM, false); if(setjmp(exitJmp)) goto exit; @@ -81,20 +82,17 @@ int main(void) { gfxFlushBuffers(); gfxSwapBuffers(); - clearScreen(); - gfxFlushBuffers(); - gfxSwapBuffers(); + disableBacklight(); while(aptMainLoop()) { hidScanInput(); irrstScanInput(); u32 kHeld = hidKeysHeld(); - circlePosition circlePad; circlePosition cStick; + hidCstickRead(&cStick); hidCircleRead(&circlePad); - irrstCstickRead(&cStick); touchPosition touch; touchRead(&touch); @@ -104,6 +102,8 @@ int main(void) { if(keyboardToggle) { keyboardActive = !keyboardActive; keyboardToggle = false; + + if(keyboardActive) enableBacklight(); } } else keyboardToggle = true; @@ -137,15 +137,7 @@ int main(void) { sendKeys(kHeld, circlePad, touch, cStick); - receiveBuffer(sizeof(struct packet)); - - /*u8 *frame = gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL); - - switch(rcvBuf.command) { - case SCREENSHOT: - //drawStringFramebuffer(frame, 10, 10, "R"); - break; - }*/ + //receiveBuffer(sizeof(struct packet)); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) longjmp(exitJmp, 1); @@ -156,6 +148,8 @@ int main(void) { exit: + enableBacklight(); + SOC_Shutdown(); svcCloseHandle(fileHandle); From d9f5ac9f67802748e6fd8111ca4fd71c9d9f86be Mon Sep 17 00:00:00 2001 From: CTurt Date: Sun, 6 Sep 2015 18:53:18 +0100 Subject: [PATCH 119/140] 0.6 --- PC/source/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PC/source/main.c b/PC/source/main.c index 835f5d2..38f8388 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -1,6 +1,6 @@ // 3DS Controller Server -#define VERSION 0.5 +#define VERSION 0.6 #include #include From ef59dcd7df804a20c417242b9403a557dae77274 Mon Sep 17 00:00:00 2001 From: CTurt Date: Tue, 8 Sep 2015 22:55:56 +0100 Subject: [PATCH 120/140] Add note about updated vJoy --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e363a9..f9b4671 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,10 @@ A 3DS homebrew application which allows you to use your 3DS as a wireless contro ### Download The latest release will always be downloadable from [here](https://github.com/CTurt/3DSController/releases/). +If you are updating to 0.6 from an older version, you will need to make sure you update vJoy to the recommended version. + ### Setup and Usage -Firstly, if you want to be able to use the circle pad as a joystick you will need to install [vJoy (version 2.0.5-120515 is preferable)](http://sourceforge.net/projects/vjoystick/files/Beta%202.x/2.0.5-120515/vJoy_205_050515.exe/download). However, if you just want to use keyboard buttons, this is not necessary. +Firstly, if you want to be able to register the circle pad or touch screen as a joystick you will need to install [vJoy (version 2.0.5-120515 is preferable)](http://sourceforge.net/projects/vjoystick/files/Beta%202.x/2.0.5-120515/vJoy_205_050515.exe/download). However, if you just want to use keyboard buttons, this is not necessary. Extract the archive and copy the executable in the `3DS` directory with the extension that applies to your loader: `3DSController.3dsx` and `3DSController.smdh` for Ninjhax, `3DSController.3ds` for flashcards, or `3DSController.cia` for CFWs, into your 3DS's SD card or flashcard's micro SD card. From d51123dce4c4ed67f735609774e25bc4a803f5ce Mon Sep 17 00:00:00 2001 From: RedInquisitive Date: Sat, 3 Oct 2015 12:26:52 -0500 Subject: [PATCH 121/140] Testing Git for Windows. --- 3DS/source/input.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/3DS/source/input.c b/3DS/source/input.c index e79248e..2496832 100644 --- a/3DS/source/input.c +++ b/3DS/source/input.c @@ -8,6 +8,8 @@ #include "input.h" +//Insert line of text here to test if Git for Windows will work with this repo. + int inputIP(void) { touchPosition touch; hidTouchRead(&touch); From ca1f816e977d36d9eb719ff839f96ffb5cab4624 Mon Sep 17 00:00:00 2001 From: RedInquisitive Date: Sat, 3 Oct 2015 17:30:33 -0500 Subject: [PATCH 122/140] Keyboard is less fuzzy and backlight turns off when the keyboard is closed. --- 3DS/source/main.c | 10 +++++++--- PC/include/keyboard.h | 2 +- PC/include/keys.h | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/3DS/source/main.c b/3DS/source/main.c index b76d011..686a00a 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -34,8 +34,8 @@ int main(void) { acInit(); gfxInitDefault(); - gfxSetDoubleBuffering(GFX_TOP, false); - gfxSetDoubleBuffering(GFX_BOTTOM, false); + gfxSetDoubleBuffering(GFX_TOP, true); + gfxSetDoubleBuffering(GFX_BOTTOM, true); if(setjmp(exitJmp)) goto exit; @@ -103,7 +103,11 @@ int main(void) { keyboardActive = !keyboardActive; keyboardToggle = false; - if(keyboardActive) enableBacklight(); + if(keyboardActive) { + enableBacklight(); + } else { + disableBacklight(); + } } } else keyboardToggle = true; diff --git a/PC/include/keyboard.h b/PC/include/keyboard.h index accab67..a69601d 100644 --- a/PC/include/keyboard.h +++ b/PC/include/keyboard.h @@ -3,4 +3,4 @@ extern unsigned char keyboardActive; extern unsigned char keyboardToggle; -inline char currentKeyboardKey(void); +char currentKeyboardKey(void); diff --git a/PC/include/keys.h b/PC/include/keys.h index 7ba9136..8b64fd2 100644 --- a/PC/include/keys.h +++ b/PC/include/keys.h @@ -102,6 +102,6 @@ extern struct cStick cStick; extern struct touch lastTouch; extern struct touch currentTouch; -inline unsigned int mapVirtualKey(unsigned int key); +unsigned int mapVirtualKey(unsigned int key); void simulateKeyNewpress(unsigned int key); void simulateKeyRelease(unsigned int key); From 7352c3079bfa99c2e7d33603e8cf3df2eb6dfe74 Mon Sep 17 00:00:00 2001 From: RedInquisitive Date: Sat, 3 Oct 2015 19:29:44 -0500 Subject: [PATCH 123/140] 3ds transmits volume status. The Volume slider now controls the "Slider" axis in v-joy --- 3DS/include/wireless.h | 4 +++- 3DS/source/main.c | 8 ++++++-- 3DS/source/wireless.c | 3 ++- PC/include/joystick.h | 1 + PC/include/keys.h | 2 ++ PC/include/wireless.h | 2 ++ PC/source/keys.c | 1 + PC/source/main.c | 4 ++++ 8 files changed, 21 insertions(+), 4 deletions(-) diff --git a/3DS/include/wireless.h b/3DS/include/wireless.h index 27efcae..6ad6983 100644 --- a/3DS/include/wireless.h +++ b/3DS/include/wireless.h @@ -59,6 +59,8 @@ struct packet { short x; short y; } cStick; + + unsigned int volume; //way longer than needed, but it works. }; struct keysPacket keysPacket; }; @@ -84,4 +86,4 @@ bool openSocket(int port); void sendBuf(int length); int receiveBuffer(int length); void sendConnectionRequest(void); -void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch, circlePosition cStick); +void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch, circlePosition cStick, unsigned int volume); diff --git a/3DS/source/main.c b/3DS/source/main.c index 686a00a..e119ca7 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -91,8 +91,12 @@ int main(void) { u32 kHeld = hidKeysHeld(); circlePosition circlePad; circlePosition cStick; + u8 vol8; + u8* volp = &vol8; //As a test for pointing at things. hidCstickRead(&cStick); hidCircleRead(&circlePad); + HIDUSER_GetSoundVolume(volp); + u32 volume = (u32)vol8; //Upscale to 32 for transmission touchPosition touch; touchRead(&touch); @@ -139,8 +143,8 @@ int main(void) { } } - sendKeys(kHeld, circlePad, touch, cStick); - + sendKeys(kHeld, circlePad, touch, cStick, volume); + drawString(10, 10, "Volume: %x", volume); //receiveBuffer(sizeof(struct packet)); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) longjmp(exitJmp, 1); diff --git a/3DS/source/wireless.c b/3DS/source/wireless.c index 0c9bc38..8abe2c8 100644 --- a/3DS/source/wireless.c +++ b/3DS/source/wireless.c @@ -38,12 +38,13 @@ void sendConnectionRequest(void) { sendBuf(offsetof(struct packet, connectPacket) + sizeof(struct connectPacket)); } -void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch, circlePosition cStick) { +void sendKeys(unsigned int keys, circlePosition circlePad, touchPosition touch, circlePosition cStick, unsigned int volume) { outBuf.command = KEYS; outBuf.keyboardActive = keyboardActive; memcpy(&outBuf.keys, &keys, 4); memcpy(&outBuf.circlePad, &circlePad, 4); memcpy(&outBuf.touch, &touch, 4); memcpy(&outBuf.cStick, &cStick, 4); + memcpy(&outBuf.volume, &volume, 4); sendBuf(offsetof(struct packet, keysPacket) + sizeof(struct keysPacket)); } diff --git a/PC/include/joystick.h b/PC/include/joystick.h index bcbb46b..a01ee64 100644 --- a/PC/include/joystick.h +++ b/PC/include/joystick.h @@ -13,6 +13,7 @@ #define joyY iReport.wAxisY #define joyRX iReport.wAxisXRot #define joyRY iReport.wAxisYRot +#define joyVolume iReport.wSlider #define joyButtons iReport.lButtons #define JOY_MIDDLE (128 * 128) diff --git a/PC/include/keys.h b/PC/include/keys.h index 8b64fd2..c8e23ba 100644 --- a/PC/include/keys.h +++ b/PC/include/keys.h @@ -97,6 +97,8 @@ struct touch { extern unsigned int lastKeys; extern unsigned int currentKeys; +extern unsigned int volume; + extern struct circlePad circlePad; extern struct cStick cStick; extern struct touch lastTouch; diff --git a/PC/include/wireless.h b/PC/include/wireless.h index 772a194..4bff563 100644 --- a/PC/include/wireless.h +++ b/PC/include/wireless.h @@ -51,6 +51,8 @@ struct packet { short x; short y; } cStick; + + unsigned int volume; }; struct keysPacket keysPacket; diff --git a/PC/source/keys.c b/PC/source/keys.c index 8d7a89b..e8ef73b 100644 --- a/PC/source/keys.c +++ b/PC/source/keys.c @@ -6,6 +6,7 @@ DEFINE_GUID(GUID_DEVINTERFACE_VJOY, 0x781EF630, 0x72B2, 0x11d2, 0xB8, 0x52, 0x00 unsigned int lastKeys; unsigned int currentKeys; +unsigned int volume; //slider struct circlePad circlePad; struct cStick cStick; diff --git a/PC/source/main.c b/PC/source/main.c index 38f8388..7eaf098 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -120,6 +120,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) memcpy(&circlePad, &buffer.circlePad, 4); memcpy(¤tTouch, &buffer.touch, 4); memcpy(&cStick, &buffer.cStick, 4); + memcpy(&volume, &buffer.volume, 4); + //printf("\rVolume is currently: %x ", volume); //test handleKey(KEY_A, settings.A); handleKey(KEY_B, settings.B); @@ -214,6 +216,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) joyRY = (128 - cStick.y) * 128; } + joyVolume = volume * 512; + break; } From 82917a0437312568ba44e0086ef7679666dc70ad Mon Sep 17 00:00:00 2001 From: RedInquisitive Date: Sat, 3 Oct 2015 20:25:46 -0500 Subject: [PATCH 124/140] Added ability to use POV hat. Set any of the DPad settings to the word "POV" and the DPad will be used as "CONTINUOUS POV number 1". --- 3DS/3DSController.ini | 2 +- PC/3DSController.ini | 36 +++++++++++++++++---------------- PC/include/joystick.h | 2 ++ PC/include/settings.h | 1 + PC/source/main.c | 47 ++++++++++++++++++++++++++++++++++++++----- PC/source/settings.c | 4 ++++ 6 files changed, 69 insertions(+), 23 deletions(-) diff --git a/3DS/3DSController.ini b/3DS/3DSController.ini index 8d43317..2773d24 100644 --- a/3DS/3DSController.ini +++ b/3DS/3DSController.ini @@ -1,4 +1,4 @@ Change the IP to be your PC's local IP, (run 3DSController.exe to find it), -IP: 192.168.0.4 +IP: 192.168.0.40 Port: 8889 \ No newline at end of file diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 2bb191b..c45e834 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -9,6 +9,8 @@ Buttons can be a letter for a keyboard key (like Q, W, E, R, T, or Y), a special If you want to use JOY9 through JOY16 you need to reconfigure vJoy. Search for vJoyConf in your start menu and set buttons to 16. +If you want to use the DPad as a Point of View Hat, set any or all of the DPad Left Right Up or Down to POV. + Alternatively, you can disable a key by binding it to NONE, Throttle controls the delay between checking for new packets (in milliseconds), a high number will have slightly more lag between pressing a button on the 3DS and receiving it on the PC, however will make the application use less CPU. In my experience, 20 is a reasonable throttling amount, @@ -23,20 +25,20 @@ Throttle: 20 Circle Pad: JOYSTICK1 C Stick: JOYSTICK2 Touch: MOUSE -Mouse Speed: 0 - -A: A -B: B -X: X -Y: Y -L: L -R: R -ZL: Q -ZR: W -Left: LEFT -Right: RIGHT -Up: UP -Down: DOWN -Start: ENTER -Select: BACKSPACE -Tap: SPACE \ No newline at end of file +Mouse Speed: 4 + +A: JOY1 +B: JOY2 +X: JOY3 +Y: JOY4 +L: JOY5 +R: JOY6 +ZL: JOY9 +ZR: JOY10 +Left: POV +Right: POV +Up: POV +Down: POV +Start: JOY8 +Select: JOY7 +Tap: NONE \ No newline at end of file diff --git a/PC/include/joystick.h b/PC/include/joystick.h index a01ee64..a495198 100644 --- a/PC/include/joystick.h +++ b/PC/include/joystick.h @@ -14,6 +14,8 @@ #define joyRX iReport.wAxisXRot #define joyRY iReport.wAxisYRot #define joyVolume iReport.wSlider +#define povHat iReport.bHats + #define joyButtons iReport.lButtons #define JOY_MIDDLE (128 * 128) diff --git a/PC/include/settings.h b/PC/include/settings.h index e5006de..e771b9c 100644 --- a/PC/include/settings.h +++ b/PC/include/settings.h @@ -18,6 +18,7 @@ struct settings { enum analogue touch; int mouseSpeed; struct keyMapping A, B, X, Y, L, R, ZL, ZR, Left, Right, Up, Down, Start, Select, Tap; + bool isUsingPov; }; extern struct settings settings; diff --git a/PC/source/main.c b/PC/source/main.c index 7eaf098..320256b 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -127,10 +127,12 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) handleKey(KEY_B, settings.B); handleKey(KEY_SELECT, settings.Select); handleKey(KEY_START, settings.Start); - handleKey(KEY_DRIGHT, settings.Right); - handleKey(KEY_DLEFT, settings.Left); - handleKey(KEY_DUP, settings.Up); - handleKey(KEY_DDOWN, settings.Down); + if(!settings.isUsingPov) { //Handle normally if not using POV in settings. + handleKey(KEY_DRIGHT, settings.Right); + handleKey(KEY_DLEFT, settings.Left); + handleKey(KEY_DUP, settings.Up); + handleKey(KEY_DDOWN, settings.Down); + } handleKey(KEY_R, settings.R); handleKey(KEY_L, settings.L); handleKey(KEY_ZR, settings.ZR); @@ -216,6 +218,41 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) joyRY = (128 - cStick.y) * 128; } + + if(settings.isUsingPov) { + if((currentKeys & KEY_DUP) && !(currentKeys & KEY_DLEFT)) { + if((currentKeys & KEY_DRIGHT)) { + povHat = 4500; + } else { + povHat = 0; + } + } else if((currentKeys & KEY_DRIGHT)) { + if((currentKeys & KEY_DDOWN)) { + povHat = 13500; + } else { + povHat = 9000; + } + } else if((currentKeys & KEY_DDOWN)) { + if((currentKeys & KEY_DLEFT)) { + povHat = 22500; + } else { + povHat = 18000; + } + } else if((currentKeys & KEY_DLEFT)) { + if ((currentKeys & KEY_DUP)) { + povHat = 31500; + } else { + povHat = 27000; + } + } + + if(!((currentKeys & KEY_DUP) || (currentKeys & KEY_DRIGHT) || (currentKeys & KEY_DDOWN) || (currentKeys & KEY_DLEFT))) { + //If none are pressed, reset the POV hat + povHat = -1; + } + + } + joyVolume = volume * 512; break; @@ -226,4 +263,4 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) error("accept()"); return 0; -} +} \ No newline at end of file diff --git a/PC/source/settings.c b/PC/source/settings.c index 1af66c3..66b751d 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -31,6 +31,7 @@ struct settings defaultSettings = { Start: { 1, {VK_RETURN} }, Select: { 1, {VK_BACK} }, Tap: { 1, {'T'} }, + isUsingPov: false, }; static bool getSetting(char *name, char *src, char *dest) { @@ -88,6 +89,9 @@ static struct keyMapping getButton(char *string) { else if(strcmp(string, "JOY14") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 5; } else if(strcmp(string, "JOY15") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 6; } else if(strcmp(string, "JOY16") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 7; } + else if(strcmp(string, "POV") == 0) {settings.isUsingPov = true;} + //No matter what the others are, if any are set to true then we are using the POV hat for the DPad + //This would mean if any setting at all is POV then the dpad is suddenly a POV. else k.virtualKey = (int)string[0]; From ef7b8c2c9e41601ddc952c6f5a296d6747aae421 Mon Sep 17 00:00:00 2001 From: RedInquisitive Date: Sat, 3 Oct 2015 21:25:41 -0500 Subject: [PATCH 125/140] Fixed some bindings and added tweaks. The volume slider is now the Z axis and the touchpad (if configured like a joystick) is more accurate. If the touchpad is lifted off of, then the RX and RY axis will center (like taking your thumb off a real joystick) --- PC/3DSController.ini | 4 ++-- PC/include/joystick.h | 3 ++- PC/source/main.c | 20 +++++++++++++++----- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index c45e834..6a4c88f 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -23,8 +23,8 @@ Make sure to use a single space, not a tab for seperating settings, Port: 8889 Throttle: 20 Circle Pad: JOYSTICK1 -C Stick: JOYSTICK2 -Touch: MOUSE +C Stick: MOUSE +Touch: JOYSTICK2 Mouse Speed: 4 A: JOY1 diff --git a/PC/include/joystick.h b/PC/include/joystick.h index a495198..f5b2ea8 100644 --- a/PC/include/joystick.h +++ b/PC/include/joystick.h @@ -13,7 +13,8 @@ #define joyY iReport.wAxisY #define joyRX iReport.wAxisXRot #define joyRY iReport.wAxisYRot -#define joyVolume iReport.wSlider +//#define joyVolume iReport.wSlider +#define joyVolume iReport.wAxisZ #define povHat iReport.bHats #define joyButtons iReport.lButtons diff --git a/PC/source/main.c b/PC/source/main.c index 320256b..67e778b 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -167,18 +167,28 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) SetCursorPos((int)((double)currentTouch.x * widthMultiplier), (int)((double)currentTouch.y * heightMultiplier)); } } - else if(settings.touch == joystick1) { - joyX = (currentTouch.x) * 128; - joyY = (currentTouch.y) * 128; + else if(settings.touch == joystick1) { //made a little bit more accurate to the screen size. + joyX = (int)((float)(currentTouch.x) * 102.3f); + joyY = (int)((float)(currentTouch.y) * 136.5f); } else if(settings.touch == joystick2) { - joyRX = (currentTouch.x) * 128; - joyRY = (currentTouch.y) * 128; + joyRX = (int)((float)(currentTouch.x) * 102.3f); + joyRY = (int)((float)(currentTouch.y) * 136.5f); } else { handleKey(KEY_TOUCH, settings.Tap); } + } else { //If we are not touching, move to center (Like if you release the joystick on a normal controller). + if(settings.touch == joystick1) { + joyX = 16383; //Halfway between the x + joyY = 16383; //Halfway between the y + } + + else if(settings.touch == joystick2) { + joyRX = 16383; //Halfway between the rx + joyRY = 16383; //Halfway between the ry + } } if(settings.circlePad == mouse) { From 79bef7cdfcf78a1bbc8a921f04443ecaec224b65 Mon Sep 17 00:00:00 2001 From: RedInquisitive Date: Sun, 4 Oct 2015 00:45:40 -0500 Subject: [PATCH 126/140] Prep for a pull request. THINGS CHANGED: - Keyboard is less fuzzy - Back-light turns off after exiting keyboard mode - DPad can be configured as a POV Hat - Screen touches are more accurate when using as a joystick - When touch is configured as a joystick, untapping will spring the axis to the center - Changed the config file to be in controller mode - Volume slider is sent as the "Z" axis in vJoy --- 3DS/source/input.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/3DS/source/input.c b/3DS/source/input.c index 2496832..e79248e 100644 --- a/3DS/source/input.c +++ b/3DS/source/input.c @@ -8,8 +8,6 @@ #include "input.h" -//Insert line of text here to test if Git for Windows will work with this repo. - int inputIP(void) { touchPosition touch; hidTouchRead(&touch); From 7e64fea25425facdb4588d51f277a305c52affce Mon Sep 17 00:00:00 2001 From: Poke Date: Fri, 16 Oct 2015 13:05:39 +1030 Subject: [PATCH 127/140] Clear keys on exit Stops start and select from being stuck on when you exit the homebrew. --- 3DS/source/main.c | 5 ++++- PC/source/main.c | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/3DS/source/main.c b/3DS/source/main.c index b76d011..e61954b 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -139,7 +139,10 @@ int main(void) { //receiveBuffer(sizeof(struct packet)); - if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) longjmp(exitJmp, 1); + if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) { + sendKeys(0, circlePad, touch, cStick); + longjmp(exitJmp, 1); + } gfxFlushBuffers(); gspWaitForVBlank(); diff --git a/PC/source/main.c b/PC/source/main.c index 38f8388..23d6dd8 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -62,7 +62,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) initNetwork(); char nButtons = GetVJDButtonNumber(iInterface); - if(nButtons <16) printf("Your vJoy has less than 16 buttons (8 by default), some may not work!\n"); + if(nButtons <16) printf("Your vJoy has %d buttons, 3DSController supports 16!\n", nButtons); printf("Port: %d\n", settings.port); From 0684a4811e95ed33efb851ef4f195c38401cfd1e Mon Sep 17 00:00:00 2001 From: Poke Date: Fri, 16 Oct 2015 16:34:36 +1030 Subject: [PATCH 128/140] Made vJoy Device configurabe You can now choose which vJoy device to output to in the .ini, allowing you to use multiple 3DS, each controlling their own virtual Joystick. --- PC/3DSController.ini | 3 +++ PC/include/joystick.h | 3 +-- PC/include/settings.h | 1 + PC/source/joystick.c | 3 +-- PC/source/main.c | 20 ++++++++++---------- PC/source/settings.c | 5 +++++ 6 files changed, 21 insertions(+), 14 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 2bb191b..ab7e0ae 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -13,6 +13,8 @@ Alternatively, you can disable a key by binding it to NONE, Throttle controls the delay between checking for new packets (in milliseconds), a high number will have slightly more lag between pressing a button on the 3DS and receiving it on the PC, however will make the application use less CPU. In my experience, 20 is a reasonable throttling amount, +vJoy Device chooses which device to connect to. Set this to 2 in a second instance of 3DSController to use a second 3DS at the same time, perhaps for multiplayer. + Make sure to use a single space, not a tab for seperating settings, @@ -24,6 +26,7 @@ Circle Pad: JOYSTICK1 C Stick: JOYSTICK2 Touch: MOUSE Mouse Speed: 0 +vJoy Device: 1 A: A B: B diff --git a/PC/include/joystick.h b/PC/include/joystick.h index bcbb46b..0681214 100644 --- a/PC/include/joystick.h +++ b/PC/include/joystick.h @@ -18,9 +18,8 @@ #define JOY_MIDDLE (128 * 128) extern int ContPovNumber; -extern UINT iInterface; //extern BOOL ContinuousPOV; extern JOYSTICK_POSITION iReport; -BOOL updateJoystick(void); +BOOL updateJoystick(int); diff --git a/PC/include/settings.h b/PC/include/settings.h index e5006de..6a88d43 100644 --- a/PC/include/settings.h +++ b/PC/include/settings.h @@ -17,6 +17,7 @@ struct settings { enum analogue cStick; enum analogue touch; int mouseSpeed; + UINT vJoyDevice; struct keyMapping A, B, X, Y, L, R, ZL, ZR, Left, Right, Up, Down, Start, Select, Tap; }; diff --git a/PC/source/joystick.c b/PC/source/joystick.c index 735cec2..bdf4f2c 100644 --- a/PC/source/joystick.c +++ b/PC/source/joystick.c @@ -4,12 +4,11 @@ #include "joystick.h" int ContPovNumber; -UINT iInterface = 1; //BOOL ContinuousPOV = FALSE; JOYSTICK_POSITION iReport; -BOOL updateJoystick(void) { +BOOL updateJoystick(iInterface) { BYTE id = (BYTE)iInterface; iReport.bDevice = id; diff --git a/PC/source/main.c b/PC/source/main.c index 23d6dd8..e4b0bb0 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -22,8 +22,12 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) double widthMultiplier = screenWidth / 320.0; double heightMultiplier = screenHeight / 240.0; + if(!readSettings()) { + printf("Couldn't read settings file, using default key bindings.\n"); + } + bool vJoy = true; - UINT iInterface = 1; + UINT iInterface = settings.vJoyDevice; iReport.wAxisX = JOY_MIDDLE; iReport.wAxisY = JOY_MIDDLE; @@ -50,19 +54,15 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) ContPovNumber = GetVJDContPovNumber(iInterface); //int DiscPovNumber = GetVJDDiscPovNumber(iInterface); - if(vJoy && !updateJoystick()) { - printf("vJoy failed (3)! Buttons will still work, but joystick won't work.\n"); + if(vJoy && !updateJoystick(iInterface)) { + printf("vJoy failed (3)! Buttons will still work, but joystick won't work.\nIs vJoy device %d configured?\n",iInterface); vJoy = false; - } - - if(!readSettings()) { - printf("Couldn't read settings file, using default key bindings.\n"); - } + } else printf("Connected to vJoy device %d\n",iInterface); initNetwork(); char nButtons = GetVJDButtonNumber(iInterface); - if(nButtons <16) printf("Your vJoy has %d buttons, 3DSController supports 16!\n", nButtons); + if(vJoy && nButtons <16) printf("Your vJoy has %d buttons, 3DSController supports 16!\n", nButtons); printf("Port: %d\n", settings.port); @@ -217,7 +217,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) break; } - if(vJoy) updateJoystick(); + if(vJoy) updateJoystick(iInterface); } error("accept()"); diff --git a/PC/source/settings.c b/PC/source/settings.c index 1af66c3..bc01782 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -16,6 +16,7 @@ struct settings defaultSettings = { cStick: joystick2, touch: mouse, mouseSpeed: 4, + vJoyDevice: 1, A: { 1, {'A'} }, B: { 1, {'B'} }, X: { 1, {'X'} }, @@ -150,6 +151,10 @@ bool readSettings(void) { sscanf(setting, "%d", &settings.mouseSpeed); } + if(getSetting("vJoy Device: ", buffer, setting)) { + sscanf(setting, "%d", &settings.vJoyDevice); + } + if(getSetting("A: ", buffer, setting)) settings.A = getButton(setting); if(getSetting("B: ", buffer, setting)) settings.B = getButton(setting); if(getSetting("X: ", buffer, setting)) settings.X = getButton(setting); From b86ad46b989e082fe0e84e78fe7fee76d423bd1d Mon Sep 17 00:00:00 2001 From: Poke Date: Fri, 16 Oct 2015 17:10:12 +1030 Subject: [PATCH 129/140] Version bump Changed the version numbers, added to the readme --- PC/source/main.c | 2 +- README.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/PC/source/main.c b/PC/source/main.c index e4b0bb0..0db9cf2 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -1,6 +1,6 @@ // 3DS Controller Server -#define VERSION 0.6 +#define VERSION 0.7 #include #include diff --git a/README.md b/README.md index f9b4671..f6383b2 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,8 @@ If using version 0.4 or above you can press L, R and X to bring up the keyboard. If using version 0.6 or above, up to 16 joystick buttons are available. If you wish to use more than 8, you need to configure vJoy. Search in your start menu for vJoyConfig and set buttons to 16. +If using version 0.7 or above, the output vJoy device is configurable. To output to a device other than 1 it must first be enabled in vJoyConfig. + If using Ninjhax press Start and Select to return to the Homebrew Loader, otherwise you can just exit with the Home button. ### Configuration From f3381fb2d3f6d878d3a36385cace2a22b954cd3d Mon Sep 17 00:00:00 2001 From: Poke Date: Fri, 16 Oct 2015 22:28:03 +1030 Subject: [PATCH 130/140] CPad and CStick as keys Can now use the CPad as keys eg. WASD for games that don't take joysticks. --- PC/3DSController.ini | 18 +++++++++++++++--- PC/include/settings.h | 3 ++- PC/source/main.c | 14 ++++++++++++++ PC/source/settings.c | 16 ++++++++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index ab7e0ae..8c68bcf 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -2,6 +2,7 @@ Default port is 8889, if you change this, you must change it in the 3DS's 3DSCon Circle Pad, C Stick and Touch can be MOUSE, JOYSTICK1 or JOYSTICK2 JOYSTICK1 uses X and Y. JOYSTICK2 uses Rx and Ry. These are 0, 1, 3 and 4 respectively, leaving 2 and 5 unused. +Circle Pad and C Stick may also be set to KEYS, which will enable Pad directions to map to regular keys (no vJoy necessary). Mouse Speed controls how fast the Circle Pad or Touch Screen moves the mouse. If set to 0 and using the Touch Screen, it will set to the absolute position, rather than moving relatively to last position, @@ -36,10 +37,21 @@ L: L R: R ZL: Q ZR: W +Start: ENTER +Select: BACKSPACE +Tap: SPACE + Left: LEFT Right: RIGHT Up: UP Down: DOWN -Start: ENTER -Select: BACKSPACE -Tap: SPACE \ No newline at end of file + +Pad Left: 1 +Pad Right: 2 +Pad Up: 3 +Pad Down: 4 + +C Stick Left: 5 +C Stick Right: 6 +C Stick Up: 7 +C Stick Down: 8 \ No newline at end of file diff --git a/PC/include/settings.h b/PC/include/settings.h index 6a88d43..5865770 100644 --- a/PC/include/settings.h +++ b/PC/include/settings.h @@ -8,6 +8,7 @@ enum analogue { mouse, joystick1, joystick2, + keys, }; struct settings { @@ -18,7 +19,7 @@ struct settings { enum analogue touch; int mouseSpeed; UINT vJoyDevice; - struct keyMapping A, B, X, Y, L, R, ZL, ZR, Left, Right, Up, Down, Start, Select, Tap; + struct keyMapping A, B, X, Y, L, R, ZL, ZR, Start, Select, Tap, Left, Right, Up, Down, PadLeft, PadRight, PadUp, PadDown, CSLeft, CSRight, CSUp, CSDown; }; extern struct settings settings; diff --git a/PC/source/main.c b/PC/source/main.c index 0db9cf2..d78b6d4 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -136,6 +136,20 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) handleKey(KEY_X, settings.X); handleKey(KEY_Y, settings.Y); + if(settings.circlePad == keys) { + handleKey(KEY_CPAD_RIGHT, settings.PadRight); + handleKey(KEY_CPAD_LEFT, settings.PadLeft); + handleKey(KEY_CPAD_UP, settings.PadUp); + handleKey(KEY_CPAD_DOWN, settings.PadDown); + } + + if(settings.cStick == keys) { + handleKey(KEY_CSTICK_RIGHT, settings.CSRight); + handleKey(KEY_CSTICK_LEFT, settings.CSLeft); + handleKey(KEY_CSTICK_UP, settings.CSUp); + handleKey(KEY_CSTICK_DOWN, settings.CSDown); + } + //handleKey(KEY_LID, 'I'); if(newpress(KEY_TOUCH)) { diff --git a/PC/source/settings.c b/PC/source/settings.c index bc01782..82e6952 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -133,12 +133,14 @@ bool readSettings(void) { if(strcmp(setting, "MOUSE") == 0) settings.circlePad = mouse; else if(strcmp(setting, "JOYSTICK1") == 0) settings.circlePad = joystick1; else if(strcmp(setting, "JOYSTICK2") == 0) settings.circlePad = joystick2; + else if(strcmp(setting, "KEYS") == 0) settings.circlePad = keys; } if(getSetting("C Stick: ", buffer, setting)) { if(strcmp(setting, "MOUSE") == 0) settings.cStick = mouse; else if(strcmp(setting, "JOYSTICK1") == 0) settings.cStick = joystick1; else if(strcmp(setting, "JOYSTICK2") == 0) settings.cStick = joystick2; + else if(strcmp(setting, "KEYS") == 0) settings.cStick = keys; } if(getSetting("Touch: ", buffer, setting)) { @@ -171,6 +173,20 @@ bool readSettings(void) { if(getSetting("Select: ", buffer, setting)) settings.Select = getButton(setting); if(getSetting("Tap: ", buffer, setting)) settings.Tap = getButton(setting); + if(settings.circlePad == keys) { + if(getSetting("Pad Left: ", buffer, setting)) settings.PadLeft = getButton(setting); + if(getSetting("Pad Right: ", buffer, setting)) settings.PadRight = getButton(setting); + if(getSetting("Pad Up: ", buffer, setting)) settings.PadUp = getButton(setting); + if(getSetting("Pad Down: ", buffer, setting)) settings.PadDown = getButton(setting); + } + + if(settings.cStick == keys) { + if(getSetting("C Stick Left: ", buffer, setting)) settings.CSLeft = getButton(setting); + if(getSetting("C Stick Right: ", buffer, setting)) settings.CSRight = getButton(setting); + if(getSetting("C Stick Up: ", buffer, setting)) settings.CSUp = getButton(setting); + if(getSetting("C Stick Down: ", buffer, setting)) settings.CSDown = getButton(setting); + } + fclose(f); return true; From b0faecd8a6822a386ecd2902fbbbd3a89b757084 Mon Sep 17 00:00:00 2001 From: Poke Date: Sun, 18 Oct 2015 11:31:34 +1030 Subject: [PATCH 131/140] Added 4 dir hat switch and more keys 4 Direction POV hat switch, and escape, control, alt as keys. --- PC/3DSController.ini | 4 ++-- PC/include/keys.h | 7 ++++++- PC/source/keys.c | 11 ++++++++++- PC/source/main.c | 3 +++ PC/source/settings.c | 8 ++++++++ 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 8c68bcf..05e3245 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -6,9 +6,9 @@ Circle Pad and C Stick may also be set to KEYS, which will enable Pad directions Mouse Speed controls how fast the Circle Pad or Touch Screen moves the mouse. If set to 0 and using the Touch Screen, it will set to the absolute position, rather than moving relatively to last position, -Buttons can be a letter for a keyboard key (like Q, W, E, R, T, or Y), a special keyboard key (like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, or WINDOWS), or a joypad button (JOY1, JOY2, JOY3, to JOY16). +Buttons can be a letter for a keyboard key (like Q, W, E, R, T, or Y), a special keyboard key (like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, WINDOWS, ESCAPE, CONTROL or ALT), a joypad button (JOY1, JOY2, JOY3, to JOY16) or vJoy Hat Switch direction (NORTH, EAST, SOUTH or WEST) (The hat switch must be enabled in vJoy Config. 4 way only, not continuous!) -If you want to use JOY9 through JOY16 you need to reconfigure vJoy. Search for vJoyConf in your start menu and set buttons to 16. +If you want to use JOY9 through JOY16 you need to reconfigure vJoy. Search for vJoy Config in your start menu and set buttons to 16. Alternatively, you can disable a key by binding it to NONE, diff --git a/PC/include/keys.h b/PC/include/keys.h index 7ba9136..7d12ca6 100644 --- a/PC/include/keys.h +++ b/PC/include/keys.h @@ -35,6 +35,10 @@ if(currentKeys & DSKey) joyButtons |= PCKey.joypadButton << 8;\ else joyButtons &= ~(PCKey.joypadButton << 8);\ }\ + else if(PCKey.useJoypad == 3) {\ + if(currentKeys & DSKey) hatButtons |= PCKey.joypadButton;\ + else hatButtons &= ~(PCKey.joypadButton);\ + }\ } while(0) #define BIT(n) (1 << (n)) @@ -72,7 +76,7 @@ typedef enum { } KEYPAD_BITS; struct keyMapping { - unsigned char useJoypad; // 0 keyboard key, 1 joypad1-8, 2 joypad9-16 + unsigned char useJoypad; // 0 keyboard key, 1 joypad1-8, 2 joypad9-16, 3 hat union { unsigned char virtualKey; unsigned char joypadButton; @@ -105,3 +109,4 @@ extern struct touch currentTouch; inline unsigned int mapVirtualKey(unsigned int key); void simulateKeyNewpress(unsigned int key); void simulateKeyRelease(unsigned int key); +void handleHat(unsigned int hat); diff --git a/PC/source/keys.c b/PC/source/keys.c index 8d7a89b..9e68c97 100644 --- a/PC/source/keys.c +++ b/PC/source/keys.c @@ -1,8 +1,9 @@ #include "keys.h" +#include "joystick.h" // Sideband comunication with vJoy Device //{781EF630-72B2-11d2-B852-00C04FAD5101} -DEFINE_GUID(GUID_DEVINTERFACE_VJOY, 0x781EF630, 0x72B2, 0x11d2, 0xB8, 0x52, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x01); +//DEFINE_GUID(GUID_DEVINTERFACE_VJOY, 0x781EF630, 0x72B2, 0x11d2, 0xB8, 0x52, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x01); unsigned int lastKeys; unsigned int currentKeys; @@ -76,3 +77,11 @@ void simulateKeyRelease(unsigned int key) { SendInput(1, &ip, sizeof(INPUT)); } + +void handleHat(unsigned int hat) { + if(hat & BIT(0)) iReport.bHats = 0; + else if(hat & BIT(1)) iReport.bHats = 1; + else if(hat & BIT(2)) iReport.bHats = 2; + else if(hat & BIT(3)) iReport.bHats = 3; + else iReport.bHats = -1; +} \ No newline at end of file diff --git a/PC/source/main.c b/PC/source/main.c index d78b6d4..2e8952e 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -28,6 +28,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) bool vJoy = true; UINT iInterface = settings.vJoyDevice; + int hatButtons = 0; iReport.wAxisX = JOY_MIDDLE; iReport.wAxisY = JOY_MIDDLE; @@ -136,6 +137,8 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) handleKey(KEY_X, settings.X); handleKey(KEY_Y, settings.Y); + handleHat(hatButtons); + if(settings.circlePad == keys) { handleKey(KEY_CPAD_RIGHT, settings.PadRight); handleKey(KEY_CPAD_LEFT, settings.PadLeft); diff --git a/PC/source/settings.c b/PC/source/settings.c index 82e6952..2a8298e 100644 --- a/PC/source/settings.c +++ b/PC/source/settings.c @@ -71,6 +71,9 @@ static struct keyMapping getButton(char *string) { else if(strcmp(string, "PAGE UP") == 0) k.virtualKey = VK_PRIOR; else if(strcmp(string, "PAGE DOWN") == 0) k.virtualKey = VK_NEXT; else if(strcmp(string, "WINDOWS") == 0) k.virtualKey = VK_LWIN; + else if(strcmp(string, "ESCAPE") == 0) k.virtualKey = VK_ESCAPE; + else if(strcmp(string, "CONTROL") == 0) k.virtualKey = VK_CONTROL; + else if(strcmp(string, "ALT") == 0) k.virtualKey = VK_MENU; else if(strcmp(string, "NONE") == 0) k.virtualKey = 0; else if(strcmp(string, "JOY1") == 0) { k.useJoypad = 1; k.joypadButton = 1 << 0; } @@ -90,6 +93,11 @@ static struct keyMapping getButton(char *string) { else if(strcmp(string, "JOY15") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 6; } else if(strcmp(string, "JOY16") == 0) { k.useJoypad = 2; k.joypadButton = 1 << 7; } + else if(strcmp(string, "NORTH") == 0) { k.useJoypad = 3; k.joypadButton = 1 << 0; } + else if(strcmp(string, "EAST") == 0) { k.useJoypad = 3; k.joypadButton = 1 << 1; } + else if(strcmp(string, "SOUTH") == 0) { k.useJoypad = 3; k.joypadButton = 1 << 2; } + else if(strcmp(string, "WEST") == 0) { k.useJoypad = 3; k.joypadButton = 1 << 3; } + else k.virtualKey = (int)string[0]; return k; From 752f616d06f3c5788d0b9a90fd377edba138ea92 Mon Sep 17 00:00:00 2001 From: thedax Date: Sun, 18 Oct 2015 03:37:10 -0400 Subject: [PATCH 132/140] Update build_cia.rsf --- 3DS/cxi/build_cia.rsf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/3DS/cxi/build_cia.rsf b/3DS/cxi/build_cia.rsf index 8dc9258..02d90eb 100644 --- a/3DS/cxi/build_cia.rsf +++ b/3DS/cxi/build_cia.rsf @@ -196,7 +196,7 @@ AccessControlInfo: - y2r:u - ldr:ro - ir:USER - + - ir:rst SystemControlInfo: SaveDataSize: 0KB # It doesn't use any save data. @@ -233,4 +233,4 @@ SystemControlInfo: ro: 0x0004013000003702L socket: 0x0004013000002e02L spi: 0x0004013000002302L - ssl: 0x0004013000002f02L \ No newline at end of file + ssl: 0x0004013000002f02L From e6dba74ad0fdede5cfe928809b0163f238278062 Mon Sep 17 00:00:00 2001 From: thedax Date: Sun, 18 Oct 2015 03:37:29 -0400 Subject: [PATCH 133/140] Update gw_workaround.rsf --- 3DS/cxi/gw_workaround.rsf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/3DS/cxi/gw_workaround.rsf b/3DS/cxi/gw_workaround.rsf index 451bfc8..2eda3b7 100644 --- a/3DS/cxi/gw_workaround.rsf +++ b/3DS/cxi/gw_workaround.rsf @@ -161,6 +161,7 @@ AccessControlInfo: - y2r:u - ldr:ro - ir:USER + - ir:rst SystemControlInfo: @@ -231,4 +232,4 @@ CommonHeaderKey: AAAAAAAAAABOn/rw/7//8ec/APIA8JH/APaR/1D/gf9Y/4H/cP+B/3j/gf8B AQD/AAIA/iECAPz///////////////////////////////////////////// ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAA - AAADAAAAAAAAAAAAAAAAAAI= \ No newline at end of file + AAADAAAAAAAAAAAAAAAAAAI= From d486f315cbb614ab8a2f830c99d0a94c710c6e3d Mon Sep 17 00:00:00 2001 From: RedInquisitive Date: Sun, 1 Nov 2015 16:51:51 -0600 Subject: [PATCH 134/140] Recompiled using the latest ctrulib (NOT the great refactor version! Too much work for that :/) --- .gitignore | 5 +++-- 3DS/3DSController.3dsx | Bin 0 -> 177000 bytes PC/3DSController.exe | Bin 0 -> 92734 bytes 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 3DS/3DSController.3dsx create mode 100644 PC/3DSController.exe diff --git a/.gitignore b/.gitignore index 8366875..d059877 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,10 @@ 3DS/build/ 3DS/*.elf 3DS/*stripped.elf -3DS/*.3dsx 3DS/*.smdh 3DS/*.3ds 3DS/*.cia PC/build/ -PC/*.exe \ No newline at end of file +*.pnproj +*.pnps +*.ppg diff --git a/3DS/3DSController.3dsx b/3DS/3DSController.3dsx new file mode 100644 index 0000000000000000000000000000000000000000..3ec81d142df31800333d0e0c6a9a105e7347e27c GIT binary patch literal 177000 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

hx?qh* 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 Aod5s; literal 0 HcmV?d00001 diff --git a/PC/3DSController.exe b/PC/3DSController.exe new file mode 100644 index 0000000000000000000000000000000000000000..82ad4a9324e8ec5ea5379550106a2a8ca87e45ac GIT binary patch literal 92734 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 Date: Wed, 11 Nov 2015 20:28:49 +1030 Subject: [PATCH 135/140] Upload builds Removed the volume display from bottom screen and included some builds. Maybe not an official version yet since I want to add something, but we'll see. --- 3DS/3DSController.3dsx | Bin 177000 -> 175240 bytes 3DS/source/main.c | 2 +- PC/3DSController.exe | Bin 92734 -> 96829 bytes PC/3DSController.ini | 48 ++++++++++++++++++++--------------------- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/3DS/3DSController.3dsx b/3DS/3DSController.3dsx index 3ec81d142df31800333d0e0c6a9a105e7347e27c..cd4959e1453f2a668fc623c98b23e1afbaf7fd91 100644 GIT binary patch delta 18995 zcmc(H33OD&@^|;08M4Dn_Kjq+Kte*ugoHH$lYlG|AndyYWQRylP*89J1X&~y=)esM zW>i2>KrrCAzU0q#W zRo!>6@}lR`vz}3@-3AWRGk50vFR!`8wA~mptW~p|;c7NzbyPoTdg$usy89Xe+?XB^ z4w$@+v9zhXziP{U$E#VjyK#Rd)0%D8M6>OKB;hL!;ZKPv(rI7MC(vmqsL&b;m3UTI z@m8y{0jdNZpwY5wwSH+uBdyu0W&nfP#>8s1U*Ntb=mCa$H2V4;OB3;_x>e}=)TJ+| zV9adOVn%OmsX_xcHxZKNb?L<<@uucgX{>Kq^F~#?>5*KC{RlXmCb1JJkDxqCbwFNO zl6wJrqkSp@7^~W$ z6>B_OH%rp7YH!9Wyjix*gE7yM7%o9V4t)eQX4Navepy`h43pMIi$-42t@^ZL)y$Y( z;SXXBR{CyBY8RZRRc}Jw69ZXxecPj@7~&NnooOjv@Oqjjij!XLxGa3UV**cjV-%+R zt*$QAVBDzCXpa`6yLYs-&Rb0NZq8p8tG$yYRigNpcV?%b<5~5=y1J?yYyzn@77I+o z;%)<1-bP|u2|jPc-18+?jB+2^yHI|P@`%Xr36fq35F>m#HtXa|^R89Ykdn7B+qR+2 zvD{i{Y4QmS#Gvis6QAUOv;ZjPXkmrAX5)qJ#1b$^-1kWg$@G8NLs%LYj)}`fM&md> zM@(rv6n_siHhE-SXv9VV28mux4r=tMwG=w7#WV-Cc>p~|QGZK7O+V}p8(>?SQW^lz zEFD{__+zgMGD-sg8eU|!GBa7!t4asE_RO}t1*J+}3Sefb0t2=(!%}6T536>AHp!qz z^)FSXVjaVxN)?TPaI(Vmg`&64V|YK%@z&TYZHc1Nql8xGfL6^$*y2-4*T(lRUF(@5 z${JGm=)9Y`rIT=+gP;;<7HR z&2|G!oGnzmNFMV+g%=%E*sd>>gu1$FFUU)pAA|a2(2*QW|D7^Vbnp%H`Niv@8MYT= zef>Jb-k&G*x2kMI4CkO_J&&Zaf26W4tMO!I(Kll6cu6>GIy zlA}Jpp6-vndS2`7bXi*P!Z-=~rQ?sa*sah9?KE0D6N;y!PlJ8gjMX!P*`_uWD3GO+ z)(iQ4|5ywy)V^r3+wWbwnb9%_iLw6A@KkZgKb1EZcl;xHga`=;bLsCCkeV^_L0vV> z->&>3)JY({o;JX2y?}|yHxZ6JfH&|zd$B4K;16RJy8}`?c6Q?9#k}Nj&8`WuTv_y;z4a?|< zUJ7QtVbdERHYvV-SwiWKK5zR-p%9H1MlA&m(UJDUAy$ysADS$U_7m4aBcL;%uyo#C z^a@LKBf@+piR+QgbOtaY*ImGhHKd=VVs}`aUvxvP+RaYw-w-dN!qYhyqrB4hDfEVe~O@>j)|Q88n8 zdyr1ewg)K5G|h<0bc#CI>FZ7P4IQf@JFLN`o;PB{5FF@?(qWhfdU9w-9H!x~Kd2Cn zc*KLp$D&1aI`0GdBl#H7Cn`=HjaF;AqNf9-2s33t%8qD-<51OLPn|X&j>L-Qn}hGCECjJE^fiKv2JolE0q4P! zWOj~aY@JD&2w@R*lz0qa20`)Js%DET!e^E$y9{4gQ_)YjaNrEISc8ni=4Xp%EK~)? zwQy9VK(%3E#V+kBYYWF@7a)Wh^}7&^CM6!j9DV1|cOUq2mJFwXj!*|<35)~5_$oSy z88N=)7<3eaYJ?^>(sUY0AcvEtUcKRvvKNPrMxFpgF7!#c$tjxFz7(_dGjR9;?PE@y z-ku&}nP%%j^qm0y2aKUTCjC1PC$ckUMw|9x1Dw7~NF}={&483+S-kZjvo+zqxZAw>*cNC; z0vch}dWY412rb1p22OEj)j?EuYQ>?oi@=2fw18dO({^nIW6}V$uVWe#nDW-Q#ez7$ zrl}B71rd*+$7##K*@YGE#%9Vru{$ot#|LA7NAD$Qx<**z5(DbM=_)WAfFT`|{>>sP zK2bOLPih(+pJ?jd5R3gVvM#KqD-yVDv#oMmsZ#kIU=3hleG=!47e{;%0rlTly^+V- zlP=hgcXpxT0iNE5jf#q|yYv(83EoJFDRw{}PlSHk6SO5Luhi989egkCImI0~FT**78@g7wA+u54D3!^`f?F^a4*MD9D9tEu;xG}8 z`U>si3UQWBTX_PVt3riA(D2r#`h#YJ9*Kwyf+o85`@@O691|VDMBN-rk2*@4pdqY4 z-!MQHfDUUJ#?dae1OI8z1~aU;dmWr8Pi8^~r7CZ`k!720*B#|XXn|IpfI;toL8x80 zY?~R{_^|aE9O8ktjbPA|A|9v%)Jt6X@P zR)7f-Y?~IH%Rt0XYQXSS5Op)0!M+W&B@;t-MsY)5K4@-3I~+9gK|`w|!AZ3Y);<8I zARRdSHeoCjne~+uH zKI`bDRgu)+p-rBNyp%I?6o|JH<8-rV_b}bVT;XhD58cx)*!K1eBBf=r#uFR3TTEyf zX<7)rDvas}4g3pry5iJp>^rLp!hHc;PDZJcgJ9u~Xn6_uRObmpG*P_l{MRXND5+nA zG8|4!h0B@~7_1sqDf?_)eUx!;M8!7NlsP5DR>mE<>NJ!W#oSQ)B$6YXMv-KRS} z6^>#l`efk0B~73tX^SZqgJzfZJL?u$^(x>$L4N^C;z==aA;v93+axw71?AGZ=>UVu z6C-Vd>>L)^Bg=D+QN%e9qh3Ti*G^x*Ni-8=x6VOd9`M&N6L~W7XtXc1KZqLk{h^dE zRz$T*)*Yu6Ke9h#Tct_|8jE$UC;{BtDv|FLosyGL*Ci+7?p|NdP3{u#`(2p5!%3gQ zq~w9>#DV0Ix-oxZnq(Ln^rQYe~hFeN;QqxK+y70{(%eE(9#7k!)=;bXIH3_jKm zFDxfg7}Eka0gR6Nc>`nKtr`0DBd;DsgJ1g=WlNcC%a4K=b9XD+2Dv6k$w3^o=jKZ&Tcn5gRz=p3lN1JE`FAyAO* zJPSN+)hRI{ZDhbjTtrEkCQ!xZEw7-kVh|_O;xqxkY!SRoOjB|Po6({^{IQqL`OG4t zO|s4tt9aCk7PRT7`^A3Atv~zq+h=VPCiRUL58AYrc6y7}ZQDvm@Yd5dK`Lt^*0qiB zsKrH)6go`2HPlZWZR^c-;#}Jx>5V4hH&E5K5z*~l;jf6d+I`J?i`@1yZzlS8Y$~EV zY~eS>fhU@Ziyfx&E|Y+*dl}DPHaTlC*`2p5m!4&1qbh-uy-UZ6;b71Nmf8m>I`gi(F$D-dF4} zKEvAxT}C?|CwgUc<$aX%-0F1w2w5#_2tbayvkc>#SN^s@%XM$Wh>#*xl8S zj}nKvrt(;Er|UrJCwI}eTWC_M{Q@!6`aAqPIT(AAy=s3YF>*3JV`OYA+FQliZZU15 z>>?B^O;PIUT9I7ulFgr^u)hrYw&$tMSLKe7JF*Q6SE(Y*V!(g}C*`jeqzSN9ygSLk~5<8O(v zJqGd>_zU&*NZ|8O^AqkpV?}l^e_`y|9!_~~&w;p-68?P8G@fR!#rKLQL+I6x2Z?39 zOww&P;rUc+smiUa^HULA)b#Gw_&qo%vRQI2mHr|#YeeHB2Z~G+sQ0qQHJ;@_(E$f4 zw9kmfBY=vf!&OhU5GdoLR8@UOn3_L=a%1$KRFH$oI;QpXbV9wgM)@vN)S7EePPF$ZEo7ait)8|)ozA!ZS51N zaATnfnBfadTv$O18-dr`JBS1)U^BJYyqkb4fEs{W+~^h;upR82o4BY^{U$CDWBd6v zdK;};fALbk%m966siGf%_28|`KM(eScd2FKSie+{iHt2*u>scU!Y8|j2LkqTTI(n= zIy-fEmabIMvI0diY`8?&ObEDuQ;1!wxND0Qb$PK893_x2>LN!n&}t%E{rnkkOhb8L`wgdHT`3Cc!I`s18m98PLb5#AaeT$nc`ZR zZFK(%MEMiSjAXoLJz=KETD1u}D$$#5Z=>#RSgr83i)`+O10*Dl&$DYZ6RAmFy4O}ZpK(xZtxHY5TMfrO)WY<=7J4@A6^KqL(a5~BvVi?jh+ zeqM|o5Xmd;e{00X0jbhmjW|AFgo*Zr_OK=+>9RYr8!Z`-{*=-L219B_R;+_cLTmD1 z4B2Mu6)lVj$Gn~W5D&KT0cMy%wyim6PC%X$`S2T%n<0Hy>kAccZPyBSJpg0WxDxym zhD$f7XwYvjFE!cU%g$5M-3GK%GXh7iH$Mk68 z#7~0)Q=WZHS3tbkMiDBnU(;)`&@b&lzP`YIFvp4hgTo}u`0U^aK2Q`64x+}E!4XMe zc24!LIKQZI#&D!-5J{;dM@bKnu2zG*}=}-mI4H=!feMInyhs`1XVO9m*?RET9>g4Llp&z(W-L{@+2@4X;bAj@YmWuy+Ha8A zHVt`bY)Nn6X-k~)^}v>W51GiJkW3^4$wG3FTr?|P{`1DbDCkix&+KNEipw(;?3dXq?W-#8qpT%M~4yV(%S*zg%J^hU#CZZ<9Qp)&sT7_uUdz8Ao*~@8S)i+ zrSQu)+is#XS%|J9#qXfZlH=^|d{UD?A~S=(bz&jZi0CseR(2o9EXHSrg# zN8^)X6R~r20{0SUN5@H98VTv?)_vNkNG0~~i=hQZe6K>93rBA^#kX;3V>#Is6?Jv* z(epVYS~!dc2y@K17;0InG%}j4*ex8gwMwm6@U<*GVo?DiliC>qL!FSE;n)F%n5#YzWAg!{A=F9@Fo1D8V* zLgE4@YhcqlvS}wjgXlFz=0}8e%uwmgK+!QLBCv&1wCwu*{uLs`!h_@la(}Tn=UqNm zB#j*-^$HX#$3{pe{KU?&fldEIPwGy6VjvlS#N3#~-LW6mu|34D2|0YD&`k{EEyd<> zFH08!MD#NQ_$6_6d~)NXxJi&dz^B)$fqvq{XQGpy0!O>qImDa@Ri`0F2T+NCqxI{z+-wtE?0a--wCvs2@`rtSDT20aS@W)TRb(cv-Fv- zSUxTk5++Sd>@bzC5P8`Z&7emuqmSaW#_S4Qmp-L$>ewgiQ9T}^^A=rjr+v(!y;!5@ z#p;Ra-4}r3HOx-d=jJeOvOdy2UOB9D(O-bvg(4Qc`{X-lokm}cwY}^sd?z(;Iul*q zVB_ri5nca+XC=e%7lS9gChhST6_cL!px+XVN>Z_K(Q9&Y^GKvo^i^dK$lY<}jz#bI zPAca89R1P&2>X9!>n1;|=Km3z+?du;2nrfJI0s`@>ho*tX~YdY1NsB6296!Y>JSiu zVTm+PalU9Zqq#IoClY2Qi0!%YzVj*O!g)8wiu|Fo!8&mDSuopA%*xY7&4`N(CzQ*-dFE;0`k`%3IJF`OCt`(ur^_A9W#nk8C?U$BP!T zp5Y#%a8@LrA$H74mTol>Kh5eZ9pj?a>}bz4uzdnhFhh)(-CQzrv2b>D6mEilOisN- zwRHw5u~eZiwrS$fY@0OtzIgA2Dk=KDSoh)?hJ2xg^pPk}iM3wNNxTm-}H;!)=0WT#6yg>bMGjy?{ z?3y^J#o(7xn|_9kBtyG}lD-43z#K(61u!^)M0xW|aUNsu!6k7G_?>(yrb8*{h|5`& zlt=;cm4Rev79B(=9jU*#o zM~vB}3ME`5Wv_c;&C3Y^L62FEw>b84YCwt$BU05urc(D5A@d>wVjJ`rnOfbm%;S|+ z67N^GKHpC*ow*}+7DP+m-Vw(O5}t~Ok*T0YGBh%{99S}0Gkuv1L!5o_YF%~TU+bzL zRMpwf&!YP{Kj_;4C$*)re#3Ha)>W^&Dl!*mN^ji}uP%;mRD$P-KKI4W#eo6zGU2pj znoNs{V#V3TG9N2uz8Vy`!Gtz`Btr>-Jwauwl?T_wo3D11j$9YtzdBL6e@$dA=`KBS zT`XTRMEd%=s95q;;HU6M9Bx2O-UL2hjlB2G>mqY$cm9r8w)7ePo3JkNTeB=aB>p-X zMK*pw!$RpYvQ+MuSlD(i5He%i}(OfB4_l6>>R_vQJsTVb#tNO zUR0>ey(SjEmLM&;CU(9Sjn9t9Ui(%Ti5D>XB~dxd^kevhU&QVeAB0|qY{zj1O7Lq2 zj`e1plUO$dv+S#)^Qs6@QfQEjSHwzGD+?z#{qYLqL;8k`MJTxdJw7um$8`u^^g@Ej zUHNj7312Neie^a9REw92 z`bs`m#8*Ypnn6BzvlTarhDtuw_Sq+|&X<-{iK^AjTV1KHp8~Iue<+FWAnEwM!5mod zKJ#I#J3??grcc8%)^wKEToJFVsgPP!iE(13bhk?UBAWZoBT*3+PU5;iv~gENLh%r3 zcC}bo9Id+yr@>jCjpg7Zf?}K4TO7wXi*vLU>yQ>f-F~^Dv*Ztjlz{)KeoxwyTEaQG_?MkrTdgTO^Ty{YzDjH?jSC2; zYfUzOq=3z%bFR^wt%Jnb(t|!1DdWyJt48y5#o(_Y!@%9@$ zSrooA3GwmPJE?rSXt5~~k4=L&#Q;AS^*&Fyyen>=Z>B7g0v0J(}^}xC0Bj6~F zWc!0`O`wLJ7{f!&wsGRXmN33foZHen#2(+UdBONzOOX|hl>5P%ju#p4#{AK%|5NY$ zcZ2@ujsH{cj(39~#~~LEX@8>OTZtxQYZv~u7`}B3FA$$>{hF7H#oG>I1A4vJgO4v; z{oczOllF(Y>WuGUGw}NyOP+O>o@uc(?8{8lcd1I1bM_a}>oZg+;H&bF<@>b^cHLU%_GP@{hs`d0$9xbGB$Wczca z%5jui@$vFg@Z7Mx^lCr!Z@>r40+j2Q|9mwI<4RsHz1j}J-+8&jLxbnx(_-cBsXF>b z>BainB<&*Ru3f;4!sEj*Qy+)hv41?&Zd79R8x?Xv-bQuBTbR%r1~wcc12Bo?*rj7i zU3E{i+gR&me;#MKFM`2Om+|e1f&vUvk1wb`2pZuiF9H{Yatr!nQ3hq7Q+@z$%E`Kj zYPToU6>i?pn!)VH4F3+;jh9hoIBnPDPI30b7>y3=+9Y^cBtIac%DNCm73p<3%000A z9OyY$%r5I^>Peabmb4v?#n7Uh3+jT!Xz7%|6z(7>y}mxA(~!X@GZ@>DS^Jse=ZQ#b zf&uY>YykaKaVbhQJo!z~WZ`#frh`_y1@vdU*UK4T@>)zk_1##}9ApTR?t&dbH9$j|llg}jneA(W8FLR&m zaC*A{TLGKOI{l-IgeTVdC^6fu)3(?|e50m#1{4DSI|2HuGY4Qul@Y;R!&jNV^ z|2RR5f&V-3xUu_=Bio>k?GEN2qx>8|Z6`Dwc<<|nf(&zvbJEOd&?fv9m&JHD)U?Tg za0(EP?TB><_$vKuI0nT{NvL?;=g6g_#ejhK!okzkrkV*^rO$`1^@0HQwaq45fsjn>N&t={TE0> z9|6(+6~vasKgU{dQznAr~zRURwWw$EI zB=Fj%l=2Cp*Tp5gYuT}jaVl;ryK^~_^QmRcs-J1Zhl*u4%J^i_>6agPN?FLSGUs2H z?Y`-!;y20;-5$xML8&78&Jeyt%)OI}x3(R3x^TU?ih55Gb+#dx;uFXSBA?{rX7 ztbQIV;z2&y$Q3C$(&)scsf3E;A9E8d$k{d=4p1??Gt8L$gL z`}ss;&ZfT)zPVCwHUb}(K1RpqfWv@!fP4ZF-UE|OU{ZkgQa};lnBVn zC~pF4bLC$=cq=|bj`HLK8z1hhVp_;ZYrB_gS?I}slRRj#ySm`HLtfy++esHX$)Ec0 z(2(Yr96veH<6+sjzY?Ea?T-a|`Kk|phnLH%8}l$;BkyR;O}yNa)P(nI6j;=RvszjR z%29xOs2iKeYXbO1O%7~st7U#5pQhr|-b`Do5aFRrlkF*w)$|A+M;_ILp-Rq^~et|Ni9Gw9K;woZ-G-IANY zZK}}Xcsv>aMge*PVjb<`czJ3o-a5hv+Pb>ZdBG@&M_pYL@W}2^J`-m9tmV^Id>rS? zEKLpk4bG$GPg3{~{IsujTZOsqz&hqY59>m*Q zzD(tlB)(QoY0Le1faS@yydCHJ<@xRSw>(Jh(;h>bSaRFrIOy)6p7!(-PG(T5rJ@h_Rr8DT zt^T|>zh=o8z~5K#TFceJywrnN$%SKhy2ngwMnFXK$&dHsEJ&p-YMtJ9>G~QWvrKft9KC_|~J*D6WnrHBc zRSUs4fW96~&dUE@dBri|$B#_xm@mm8iEF2Gz(XnPiLZ>dc>cnFkwPb9(9#^v4r6)2 zsEZ_oP^B%75Tsq2uIV%Pb%>|U+&;HNgoTEW$vNP!k2GlWc8ax*mQrig)2C&Jw^|XXn z16=!qr#kq!(0o4WQ5skJf*CLuLbwWWe*DA937-X_2p0<=+6@jZ96{+0=Cu&m*+&8x zK$qt-=@Exegx4Y+)$149wD=Vl(|)JCE}xtV4^k&LoyL2FY=_q<0W1Zq02~JVh_7CA zEc2(qb3|=I=Bzdp+4H%{hC(F+51AC{$79RAu-zLhy=L%g&Ief9%;dkT_ybGIY#yWL zGcAMX@*bXWL>m_&tMQiS7Qk*)^2P%G4AK$4n9oqdJUL_mSJ&u{3?3TX>6A{~%L5Z~FqNKiwslqrJ~?!uq_v?&411G%!=bFP86b=Og*E z^6(wFOr^*>c0d+IzPbZ`_LSUWCz30*Ja#9JM!CFTCy=}4{W~$>lqKW?K9uurmYKWw z`x5`z(zJ}%sTyy!AZilq<*dBil3?Kjc*q4T0sro$uJOIPx-+QL66>?#wIB15?u{rx ztj)9hR?Zh{_%D{ZU+_zu@3f3PjC);+HWqvpAc-MuD(WOPeN>{ydJS&8&JUIl^D7>i zQHjJe_#liNck0XVU87= zV2TSK3#ih5Zu!SI`~eRzeT$Vi>{VsN&zNDeVe+wW`D?t5W%N-9z^}*)j`2Fa-Ll{~ zzoh0L$x}}ANU3s$W%+6Tw1kRWb(T-%7R%u8`PayaEm1%6>uTvrp2gS7Khj9pn6EDK z#vH!!>?Pb6Z(4>|f`KmnbKL!~FK$S%$rDD%%c^);!0m%|)m?#>fVTgry5IiFE0+G% zly_g3bFc7z{0GbaD>#x;)*gA~7~aw2yML3dnyvqldtF0(E~!LV1?&N&IiRG{5ub~z zVOs!m6=&No!wmqY1Kh80cA~mIJ|987+cj(z%ANpfJAv?j1w`xGmw&as?TQa~;9Th% z)J^uu2>CgPX@GNbr(lm`LX#2RIVp{I)?MkT-Y`DrL2!T2*8?2x!^ZzkeY|5r!y^+r z=1Ou%;@asP&`_}PR~+&AJeI|-BRfY~1o#o0)6g!tQXik^%Ne)egl5ZQZ#@#91AfEl z@|So2hP&ZU@|VBC_g$11+~(8h%--gUJbE0eH?B;1ZY^T++wzWD{;p}*@0`uKR}bA> z>V&)J(w>F-WCz{RI|!cuqM3}c<=+7391Tj-ACptZnOfwQfCfZ=*~ZK1BYoW*?Zdx4 z#P7QKu>NPh(;w|50n!=_C;>CV=^gk@ck9QDLRoSPhYh8(j|6B5IwSDT$u2lF)$*q0 zA9wj075B3Af4~Q-qYnM+VTjFwyBfEveuJ_dA$GszkR&CmxrcnKk(AEwT2kDkFnp9l z+@KIyi?nQ>Ww^VvO2xmEFMCOs_;2ztZz+afm2Y`V&+t3)a35(T&yn}~NH6j>a#CXq zPq*}HEcMXvA1$l>q=9aHh(!sNKJeC1fSo6=kCP_x91D-fe7uj`sfCotC(2V=NG3i| zzT848<+1Xz1Sza((>>&F&9-ia#ma~DffaR%OZyCmtOy(ll3zgM(z@z9B=|~0dTXe+&V>St#Y3w$+|Yu1o=pc zbVdHWwKU$6mMXb(OLm%MXcuC@LnFiEo;M&E5DPE>+RN*wNq7NemcG-a=9)nI87qDe z$nxk!$Opyj!&drqkv?lt$%Q*k@Z->+w4Z{k2T3N_g&jLJ&F2aX2)QbT3 zmg67Pn(z?~W$;qO(PiL>(f}6omLNYxU%>(dctBA;`T<%1{WlMND**RiWq4q!s~dz| z0wBM*P)d>W7fSAytqY~JSl&}Uw?&GJBC-A}Sem^nwd0NIpM~XdTcwVwp1F3N&9rE@ zNd+oiB(L2rMM|UA${%f)j{8kyjTrJ`CNcc#48R%wx!(>c1CLK9cSy;2*wXEkVl?Ua zIoCM3!%ivEt0n%&OTPGDq~tP<{LD^i{kjjNVaq#uP6S7$(KKndPf=XQ@6qP0VsT}d&a`$p3R3Y5}7%PtUhlr8KCC}kB{i=vd0Rb(F0tyPRq~TF$0n4IqL7?C7K1noG^zV1h_dg%!TxRCZojZ5#+?ji4 zo=J;Ngr5B|G&#G+kdbB<%zXcjHy5m355`8W(X*oa^lZVZn0+tFMUe-9Uk|);85G;76U<^#FTi|Iqkmg9Ky-YZ}bu=E&#oJWG^DYvws-b-02L_pgX# ztg??uJ{Q`m(IFG7GB8$QU^aIMW1-{GTtGq&eJrles@9-mKpcRPT3b-L;53c86Y`;G$ZVeS%b9X`y@q0T3;9^R2lx_stX^CGvkWt&Ms*28 zD|Gp5ZEc*zx?ZK$FE^9D3@L(#$*G3M{71RUkR{eNm!BBAb(+_VRqd&*t<1$FkXq9) zz`YpUe}OA+E!cKI`QAVloG;k>NDrWV6zO54$7R>BXps{oM}>80bfp3HyGGSRO5W7r z9vjZ8IEGsTEv+~j$WBuu`9WA#WMw22bGW!dU%md!VPL6doxB;A5nB`SM-5@AT>?5j zBfHj5=j-G{^+(|U-SzDud1nGyK46}_=dL{gJ&?0WlhJ8khnxdoMk}hf0jdXLe%N65 zik2mjfPfX_O4JCr@$ zGDDbB2*MVtL>Y{}s5aQVUfm*jgJ^rx+S;mm5R(-D0P+(pXklCnsg9`gc9p1$a~7Qz z9hYFGC@Qn8P=iZ9RYL${Fl?V~zKnc5a3?+yn5OE1JI@XaW0g6NGPZ6eV?%ccmWKQa z!jYTyVOJ&SU7_m)|U<|4uT`qx%)nM)HveI&04Yds+ zYYE<-TcS>b5T){5gLwPeJk*k1fg&4&)oje0&j+O*L!r8Pwi2!0!%6Yb8rOj9^Xj{> zIGRBW1L^bXF0D*;HaFxAZHw7v7D#0&RC7pWOsY;#n-=be&?p4r5P{xOpprq84ro}u zA=3CYUC1@zn>FL4nt8Hk#00L$*CVp|)ACeA5??HDM#THoCr4&?9eS&_3X4XYv!{?J zLCt2GH;1ba`lTI>aI|k2fbVW#mDK<5CN9@RX4~8PahdMrvJ@$`CZ#XARr`CZU?@F- zm8c2E5;ZKARAO^uGYbv|j`mL4wS!_=WiEO-iFJMkp!cdp7wN(G(8@M9Z{l$4m_zoC zY9!2&a%R*6A~;fh5!H+TDkG!YiVtJtfan&cQmky+iGpEJMkw&4ERIeRFUQEYqoc&S z82M>*V_qsRM0XcG46;?s)Ah$|4OXipfBOjeS^stzkaMl2N@>HBbh1Q{L85^A#=_giow4m#`|D7?8Pu>c09wBYBlN%T1%pWPR7I)7rE@r3O;)Z~ zo9C}rEw=UQlU~j>&+d$2Y_z+`vO01_-s(tQZoa8H_j41&2DuVAX88;*^gj1$Eq@UC zk?yrx{s8jB?Cy11p)eA|QNipiX~W8}68!{g2Mv;7Ievl_nLWbkY!25*uQ2WMNtj`p zFr}7#CgKU4#xtMwXS6vHpOM-O*sv;tG-K!eWO8PB_wK~TVyl32k1NpjuVL=+tXZy? zQ{W5C4w%wlcahmMPN9u+p9xFFMH>i-E!ar;Qe0EfBwRkwxnYoJBq16qLPJ64!xGa? z;!m?uoY>Lyv*vI8=k-KlM)c{rSWP{t^4Y}p(dBoj>%r3G4~dOTJL}fTjSU~;=gEOm9(;} zF&R{s0MGp`>PzK8b4O8oQ;te%SbqvSsRhz#J)~Z}DX%BR*~$I=0#p@%yfbaFdNcO; zykZr>&N*75!$5N$^$FzWFe?cNdaJu;o?8LWPSKp%atszd1UrZ$96l|ScCYG1JJ04J zf?$Xk8lf#S+OTstObD3b#voc4gJ=K|g57n7DiO|+gYj*B)R=tlUJSHd%M!I68Ze8b zpvk3Yg%zci{jMemJ655da0$RYgFL*8Hh?FPXO^|t{`RSyg}a-;^vcjrjhU7u`KQGd zrN(bvCvJ}RbbcCAZ3n>{01|?j24glzuoI|z3;10OUKIE_UgiRfqriAQ>WCRJzTs_C zjy4XtJ|)TC64ac0CTh)=ed;!BU)1s_DCR(~6hJPeUbUe)T%Ul$a+DYOaArtjp!-EB+l&8K?v zjnc-(_ND=Ow?5K5vD9+|yIZ;v!)0lj*_7i);n^HrX>G;H8#1m@!$zOsSV2M2dpByU zE&xc<5J;MqTUc?~Ti!44Z0o0d(Kn&9i&rOa01+^UU zHhdzORqdxd>NPcZ)pP-DJ_CLifRs<|lF;csluH0Kades(h`i5ii?BcG;R%W%Fg6(X z<2Py>{9YMjE3OE(Hd43Bdm5*PMS#_tX!;X0?U0W*&WH^JW<4rDHG-EoIHE9=6ldn4wy!8&r`fAdbePcAM|Pd*2DxkNQ$WtBH5 zQFUh2!-A@F54j9Dei&@U>O}A}Sk|jLzV@f~l*b8%{4yj96-e(!iV)O&5mq+hMy*|& zlv3jfS3Pra#r-q|R)=d8=?O$Ch-k~GXFR38_ZuQ(%PEyxx>p2YN$W0^D5o&w`OOgC z!;*G+Q+)6=!$2&p>}fM3zDwt@G=sp0^`9 zU~OsY=_tp`oI0%w)u7n{CyJ zAzy_SXw=6+{3;k6Kq}DaWoYAHt-ix@9^x(mgFfsK23M zRiqp=cF>$fo&+YOAbO%vLtqirzK6r@-N?oFth4IZnJ_F$i>*c9#V5@JF@ z9)i6DjOYl|MCqGI52H?-H#1ZP1|8ACQQ&gHWC>Cn58d}e5S*pl#VGIf(i5!}vRbBMdMM>^yes(cHczZiP|JjLaM6J&M*3t)s27YqNCIVTf|u`jL+}>uvhb z5326|qJDORO?B_olC%H0{^5A{V) zboijHNP${xDE9(rJ3Hphw~NE5s_p^)OK71pQj&Hxg-)O;H6C$ofkk%({sYvvK}tNy zvB55?I-=ZCc4{6yBS&jF)D5aov~&;EI4n_VEu?u{5$8O#YKn4_M(>#*>It&D=AkYH zcI@!WGZ$To1Jv5xvn5o9B%K z3s@^H27Au0&f|<`XALwx;fK{)$gi@}J0$>1J5DhA?*d3O7gqS(ObTqMJ8b7EowYeEK*l^s2UFk3IQ}t(eM&vJad7ksVb5I*`p)7p?^|l3s9xyJzYVD-d#SL zogT2arnYLN+?bu37zfElpq}b(;bxOkUw;RrD?7_HS-V{DH>2d7fu;d|SkLq=%83`x zrpgUDtwd;;{5q$NXc8tvTQ?JSqioZ&Q6ebRa%|4w#o z^Euxv!`dohkwI?g5GQxF-6CuTIknwV(ZYiad*ek(b)V%lA8M z;m^r&9hdOgQth}*46G+--aT2gt|z~_dw@u;CmVNqLI_Iw$jVN1Q)uekmmk6ZjrbH< z)u|ERMR~cna}?huU+A39pOm{hcfl10?=m4|A)C3r%7)ey(K}RjL((}^PPTUAnHv6MYYI=&IG&RsU9&^}qn!*C^*!0M>s%Pa&aSEL z#{y@dt7bY4Lhvm6$sja7KGObo8BQ;xb__h_m zR92rEk8%JT>iP|?gm!XjK^)j;FLtb!UAt#w4hDsuulb2?6`F>yN`^d1LO9y92~SR} z59+Gr3*CqCG4ew9<)VFve4@upo`^!c)c4Hgx8$Ur19_!f)GJ&b=xOE0v|K{3=6s)) z8`CR|JCWpQA` z{Owe4^c`jAx1oZx`=QcY&*_d?zJZMlahoy!@EY!QnA0H3AvMA~ufGQVF|P$S+;O0u zu7H?vwR#$Ll)r#9k31B{S*hV1?jU1vMRRN%L6%cvwGI%g#WA?x9vTDBmE$Oi*3c=# zjiM*Tr4)ukgMJua28cewOMeB1^$T3taZHC9h7|!w0K`Pf_xd%<+=qUB*0nCsV_h$L zasJlz5$eox(2y>%HQh7MHSboUHXjU4;N~JC50(r;o|lvQXNQbq>}eev?3yJv_U|2X zFG{4P5%N<1?0ZI<5WlkmRan;jMA%Lk+B2LEsH@L0%NiB8?yi{KQsw4dt{^rBVbgA$ z`U})FT)#BI9Z`zLZHzldK0cst*j-v_usZ`>qU3@Bsq)5v5Ida4N^^-yN0b#vg=NWU zQf~s-Y_}Y7ZMS^ts#&u0Y}YK@iQbLy6Lg!P$+c#Odo%LEmQ^Zmv&0>2S)}ennP_ne zb3bPgr|->LT=5lfv6dwjOIjjyF)yij8)eZ7*Hy^p06*w?An=vRy-JAF51_$+P$t!r z$_FDtZYAK&yn77x7Z=r0ISoSkmz(&?@~wf<{4D-Yl4l0S@bmK2z$AWECfc$^{XjX` zHtK;GuqMAmmk&+gNa={gaQSc-J46H4iqsLQb+6cg6+wr{c<4N%zQg?^EM-SNSulJyzI4#nCkl2s zR7O`7yp_ZKOaNG-4g7iBU9j%czt&dWg?N`NAR0I_V4^3d$jtlHCb&mW0|W!~00hmG zE1C5)7(TDA05c-=jfXl}MjbGGr+^T!^w3+hl(f}Rq+WvhzhESQ!*#|x6{N2;Y)lqF zbL4$1!X!t)#?qz5|q+HrMqr& z1Bn5wvKV7 z=3u~dd3n+X(Y$w9WI|+Obo+RKm8b_`Dx0(;BRn=PLU#bS1Gq1|_R$dYx(T=pqQM;49NP@v=aK4P=m`lAC#y|#w%OVnj=6$Iq{PWtp zV^xLTBn@fvz7z&Tok(>7XsDgm1~ya!8wiCU??ceBW(w;0(3O9 zc6_$JO+Q3QQ#YU3Fd-QwKwuZp%VnS z8c*C!L8og}8}L@}%RyTbxu4c2wXwC*nD6<0T!q>VGY*PX)ffkfPU4c-Br**lM-~r{ z7AM2yYr`9gXN~gH;p4?!v9j5SHkk2oBRY!0D7j%o!v+iRT~S+8`T6R3@OnH-ela3W zJRBt}M>GuS0Zs)hfW=7D$RT2SxSTw)p-3{yr6Y$UYB)7=mOU2j!!hUp3oY7w^(=Tq z02c+E=R}>ax`CT+b-3$OUv$d0=ButgHiEf zu2Ft7su>TFd~~{q2$Ic4x8kkk{iEY!3+VnS*H%$cTl)sh#4XKru2pZyRimT(|B8}k za(UQ`yxZpj^b-ENIPl=!7FCpL_(Jqvq#i`?eK3Rwh)+YX$zMh%-TytPV%s^~eK6Dc zmSvh%u-pQb>(Ck-6v^;4Xqv-HSZ<*j5BYG-KpXgnF~D^rc@cLOFeLzznaHSpJ@k>Y z$0+W8ef-%nX;; zC&V=#jjZSE%@FM>Yyx_vW#L-_Rgm+6aM@vESdd0okdCm`Pj5x{JPvZExKU{qBU9*G*4;Z(;P4q62b4Yv>Ed9 zw8p*mYsPG=pbw*F7_GrrP;mu4(1niyWg|oxgDsA(0Vr-K7R0I#-v2PvH{}eh<6#jD$5(~WU>hEqfD!o{18iiLS9ID-N%Sx1N*-amd< z*b*$;K?qHksCs;j4c@gx%>iS*Wl^NXh!n3XC@QCbcnvf`Oekigk(1!Bk|v-)+6UWV z)K)+Z-a^nbpcuq$MhKxd;s^lxhi=oPY&<{+fLp;{aG>H zBri^{5ZNaA^^5@`)+AGAZs3>X?wO-;36MBz4}V9xW=-HLWzW1MeD0l;mnG)osvvKG z7%b$Ec`2rTU^^60{s?3FMu&Twyf!UKBn#PLc1rSl*r9wf5D^hqgOFsPR~h}}g4u3S zdqa+YxKixBAqPD2+L)0ra*A>%vm=^aGGk2=eX0(GJ(20*0YOX*>KW>(tiv}m#2dO1 zs3+^^Fp6CCLp&JUqyCJ3sLZO(ZW%nMoOhDP=42;YaL+S`OKl$kI^r?_DMch2z0E^^6W3uh)D@Q10nD;2 zfI=`WN`W_+C^tTq)a@1wk$P)~)}$P2O+9(8zCB|=@Nsq*E;2|)dcI(_m8e!DYz^&B z{3gZRW|5nzqdLP$lU?U#NAC8D;EVniGo5~-d}?lzeS4i6E7R+#3*Y&EA@n~5<>qaD zb0XCzF?7QDXdVU4bd+pIl{ET1=_uS((_ZxSp+y zqyrZ%sWXMx>G8UeHY`ufvP%8-q8y&zLA-iVK9@gP?71MX=l2qk7iG6a!^NhH^2J5> zM(xH;CO0FFw|K%F+T-S4l-C#a;%~^VizkRLFUZ#xcZlT|$yjZ8_sHUC)9!&bWXtpA zwZ&!PiwpAYB@4yE3$jJQMgE>lEQ}X}FUSss%|z}6Ik_+emxfOjerak9S58kocVX?n zZ!S@<$%mG{6ZsJHXo}VBh5P{*c3!?b7ae919_n2%af#I*%a||l?*M4<1J;Q zq9>E*S9t^qfk0+>j{iXawBhGqk@h`HoE<#XrQRAl)avMf)~r(Pt6idD`l&v z2Z$q;a`DqC0rSFi=;!sPM~EZmK-5s0m*5l&`5^khSr zv2G<^aRPiVbv2#IPR}NZh)Vguvr(}d!0wxYJ+;FbS-!84wXFErssM#&h?uf@Yxe5k zZ92V>9+^n@3s{Q5m>t>~1I&0xAs>HXPuNd%RLpna;s+;ndC!Y|xutB)i$C+Q`LKT9 zDi|qOt$PVGlezvu-a@WfPdBp%*JtoH@|X3g+#+K)Wbgs9=Z3bpo?NhDY~;RiP(i58 z-JUVrO*&j1;LK9xr47-ES8)pSVd9YI*8GZ-Pytay$wnn}`ImBiNh<$T?k?%VizIh+ zPsBxU6(0q4S;>fpx^V-A523JwIEQg?e6X<#e??x~IF=X6`(FN>@0N{T z*@Fo<_eyVGRMv9SlL2=7iQ1~ykHdQ4EjfmK@>}}&LY4r(fqbd1MEzF#&S9&lhhe53 ztF77uYg?C18@5!JV4co#p$s06gBS5>f-OS7eCK((XSxjf`;XRE(X->}XoI!yB6YtA z+%Ly#?Nu3QR0IY?y+r-|h*kl29*k2!!=oS|-qfZc5}Jx9r(2`mR!JnW~J|5xG~sT zzL727oNDTZY(2z`!nlM58yB%&^7S|4?L%m_Ln8^s^=cZTL^BNnZv#Tnndh-~v8FW| z!22x`?ppN~jnI(+hIb!0E=1?TJ9`_>)K+an`R5-zW14~0-WSf`>{&dEK}rT|#v_Sn zIE@6PXMd_~Qx%O&DG1W2!gfkM1;Wpd;O6;meMOJ~+O!}Bv+R$2Q`;!M)ik_Cj@z0V z@Cd}%AfMWr#6Oa+Z|y=9mF<8lKT6i^O0PxP^VZjOd>VB2?eU!?-C|mH+vM@eM1|0l1ZzlI0>}}8cnlbZ<|8HRbQ|En-!-0Db%Z)ur%Y{aez-huKfm*| zgMbP?0rJ7T$ggw4=Yv56z}GSJwpod~(}1%8AH%E2p9ihOuT!4@gl~tnEZA`PG4^60 z>_!Hc8~J@QwtQObierpzI?7ng5s330)-aYoJ(Qm#*O$Lyzwr%YR)8<1{9Zum-@sbb z5fJTPK@sZi1a;``f61T@;cav`Fr>e$r@A|JPPp6KwX2KxXXP8m`PQcv<9EiojEgw~jdNdrx83{sV=2Q_8PIz8sey{}T}HU%}Bjbww!8 z^TYM?&cDq+696yY{2Tq>2_QEddk;5@!@lXw-Aa~ti2sx1r4#?3GnLqLkXWO)gPAe9%VC5r|bBcvNi4u&Zm{_J~JVZkCct7%J@U_MAi4aRoT1e z70%1c`d3g2BClj)%f9DI7j*O#@^j?QD}A|MhFs0y*JSIf z-SO${@vCk5(Xwq<(eq(B>AycWTwRMv0*nOo0OSD700W@uoXZjRyuRiR{?UrSmW2D z<;v>@J`K4fK0)rho*ps=KPSt>&&Vdq3)i#x8kziC5{?gDe+$RZhW)14R|jx*LvYsI zn=)LOQ2Bjtc_@|j9B-36c&hWkN;2!Kj#l}yP>m=Rlh6Pbf{$xARjOfuomC|)YRup{|;wsL1Td0jDQHhVcba> zod_WSxurNfBegc*EExP~LRKJO1pE!~(1X4l=}F>=I!6R&N4IfyV20?+M(G$kgNkav zRlpX&Rss;_;uW_6grz8N2kZbGDlaczf%GU~JlZCJxfzf)Q+Y6X< zN0>qpGR}dk(j)8)Mm#;(c_Ew!>G=@lmuTJ{pWX0R9G{+f`#@)KO8!b3H4%iDQ1+4IvZ?sTE6W*%f z6wubzmdv*zB_6f4IN&l{`?JU=%yJHH!pC!7UG({jjrt4pstx z&G}Gkp3eC)WmOx#jAtpaZFz5=sEljNvv^}=Ra-uqw^c5*$sr1M}SR8s{uwo`n|{>1&s8= z`2-+5V(vE66jwNRb>wL}zSF68=JkYq`aPVj>x1R&O)1|T`Ix@}hB^YG z{VS+O-JPHgz5Op4)FHf$Zsgx|>}z+Y&I#wM_oVIWBK}!R|ePwzj@vrnXs4LjeiOy#C^UEUcFoso)h8CpxfO2q7dk`VrMCI*^ycv&E#^u6G zG*A}h@;5`a;|1jQM-V_Mt;g}yrVDWA#VjjTM}9Fr1v^}0@Ee?1+_B-N(~Y0WzjhPQb<=KhrQjcG#byd`8wsk@m#ULKa;cbk9y#!U!HJh{mQmk*q{I!{$T{1 z0Lu4!gtIww{%7#@Q76Um5ll+KfYLLwIhz8;RQ5rg2JA38^x>wXjW17Wex8?)A5C+= zLHN^p@~|4p_zTcy+8>=0emjIB+={6lTD`ZE9HeHDly{ND9>wml3s4H!4yXp4#1|=tGjbAkkmOfzkEzFm z(_~MT9#RV$e6c;HAUc)J1iL&N3#52>CORw=Eh;@2yM%QPQ!p+!Tk14x1BYYCd zwar)%|5jqR09mRG+kys1o!ho>+>3N~hP=Vw6#SI)-L1Sucpp5#JIaZD zn6onF=03!zE0h;L}PmGKmuUhMGvr_y>9i!B^U=F z7!Xm7WecLCfV|6`-F?~PR&%c4;B^(-G;pN=D*J%&e+5MAUw78a#~)wd#rf0K$=kKg z2-zG!4Sb#Z1iKRx>WuKdPN}^w?@v$px^DG21fLIj4`74*qwv3zFZXu1_O_0_ePwzj z@vrnXs4H0cWv^T9gGN(+K~#<5)c|?`)}hRTTdzDsJEF$?HK-|NG;de9Y(tPAAqlqI;s8l&Z)u*Mtg607}p`Z zjm}rsrw;Abo1V57Z%TAAzx^FQ`yZqC39#<^?F|^15w6IKH+Z$Q7g}I9u=-H;)sX@{puR>0IBgU(7 zjfx&P(BEI_;4E$|oVt+nt#M5VxS{lKCWbVdh*xfTfC9j3z*fNffCGTzfb)PG07F~l zvu2`|&N4?Rvs;Ks%ESzDK6Lo3>5tBs)WO_no-&}hm>m4zBY7P<^qVlzS=w9}c!Rt- zGdes9KSb#xk3WLflFkn^MXR>4bcfs=7kupiJpeYq7{Ej&V3Ke;cTEy$0a5gxnlAN5 zj=_&v0c!zM@L)JY3~~0KCc=$&`g>ize^%V=(^H^%&oQ>82$x|`qX6jf6l2Fx?y(9! zw-8@bR^pr4Gx);uEMvg{3s~$e#-Cb1UHLNf0yw@D^?;E8`nMN#M*%%RSBrl`5m^9~ zpPm#gmFg!&urp@9$VtPt)88S|lS!<<1?L)vXv+gVSHsHJ8$|~lu8v8svz_@bivk_r zt^~X$lEjXel*X@#uj@UC?{0zxu(m8nskd2l#qpv4W|0+^!|2r&XYqh=Wx-~V8qf;a z$;zvnMN+*C{8hUK%)n+az4GN|@q#jOix^|-rE$XH41@#`%I+;9IxGw9BT-yW)rz`B zB=G@C!0RGAqyt{*hN31#>G`_o+qwlF`wi2Gbs)tSjJIDV0OgyZF4CJ{2aFLodKuPO z+4j1~YDq*?^rd$pUl&NEkFZDJ@WnEfbFYi;e1?+whIpKZDVyIA>rv|YrnnNYw0;oV KsC3#Y`u-mS8Y33~ diff --git a/3DS/source/main.c b/3DS/source/main.c index e26a7c2..3f774cf 100644 --- a/3DS/source/main.c +++ b/3DS/source/main.c @@ -144,7 +144,7 @@ int main(void) { } sendKeys(kHeld, circlePad, touch, cStick, volume); - drawString(10, 10, "Volume: %x", volume); + //drawString(10, 10, "Volume: %x", volume); //receiveBuffer(sizeof(struct packet)); if((kHeld & KEY_START) && (kHeld & KEY_SELECT)) { diff --git a/PC/3DSController.exe b/PC/3DSController.exe index 82ad4a9324e8ec5ea5379550106a2a8ca87e45ac..ec4ea9d92eb0f5f1e7d0e467299458680017ac56 100644 GIT binary patch delta 33986 zcmcJ&3tW^{{y+Xa4+8>%g93`EI0D{{z`T{1gF=#-q2m1lC=j-YgoBxxgE5qZ8hI?- zvKGWGb~B|gHM1PWyp(NZuHhw@+%7X|Mw@G7=KS8D^PFd9o|1j-_y79uQ-|}M_vdmx z=W{;i^4!MvPWirj)wgo(R2L5EYe_olCrK?*2cM3z5+T(|l5`QNrzBN(K^}r+N0Q9y zxgtphlw>5z`H_Ya3eG#8J=@>cBumYK?4WX&ufZ%!5zqDs^)*M!QZ?&*y4$ny29|lr zKk(G6kR#1?>}fe_#CFnRM}l&R7m$m?EM?l`in6mTSs(=gY(naUw1ZucBL|0d$7u^v zB+`B)ufr_Go8uNPTSicR4~fYycV~%8=KxqJk*3pZhSEDA9wn;xB3q3TOy;F88(vYK zk(JMC*hs@%Wn~T9WEi20t6?V$6QX{umZZ{SF6SNa-_hh)14N{whFEfk%yGf9@JBh9K>)!1p@RuG=Yy@vlz~mKI_}*x?!>_j$EpfaCH>|hxlh*I=50X^V z4A9k5eoZT%;N?o~m|p%>>E#G0lA6qt<7G5uABn+Z@J=|@9|{85`!r~!m;K8Rm7TP7 zCW60en7zd;xlY#9+09n+=v~k?kaSJEg|3l8*H|xI0T6&NbR2J7zg*HA)ae#V?h{I` zlP82hq{J?_uoE2yTi+UrK!JVP#Md(x&J3zZ@uyC340@T9C@hJ^{|RE57i*yQ<8a&s zl{Kk7lAxEzK@n8dm^xC~Kt5QAG6fUmn#_fl&~f}gk5nYbT1`~BIgt1AR?1!Bhhr$( zjL+Fi5BD_gwl@mzPbeUnLpqgFkSzOIt^<-$xe)VKTja@yttLCtJa(B%!^<-Sl3H9Wj z1bgn9pGV4%6dMl&zX_|>&wev^%`Z<#k7SoRCznr(^*fgw>vzWY6xh!nKeH;H89!9r#Ci3;Qu}v@&@Mi|;r?evv)ZakR4U zMRvGjKkNG4kP&5r7ixYZE|;e=`o+$N|@1j)R!^}_(lqFwMdeU zm7cP~%j91K(##p~@TAXu_ntIMpR3*60;?TA{L#~WyVv1pXNSS_%SuUY;X61 z>BC}O;U@&J1^~Qhv^}U%nm_?dtqE!zfxoz1Wmdb<7ENRe9|+NCl;h-PIO5kqLfa|G z97*|9PBdCWjqlkJku+k=#P}C5*4Uvd;T)jlshd~#J zZa0>df_}}HR4T@@kyu-=`I0e;(OQ;?()wNfs8=CyMF>>71q{ZrDQ*E2R_gdK3;vhf z{QkzW^{8B}0EOKs2>m5v0%5#lEW_$Um0b-?vU2nKase_g#8@`3izbai84BS1m#F4A zW>2*pCS%#3I%|w5976$&*97BWH>25DW_L59;8YpgR7Pvr@s66x5@VTa}+2Qhk1yF(5QRsn~(>!k7?fb0|u($uVSI;$0!jb(*yeiZ(w<8KlCxo&>+;?siPnk1prpcA+#1bo~A z=*A=N7NGDw3ZezHeK>aA3}QY;TL(k}kNNULrDIO0SSy;g<|2&&qwR4Ft{Muy zzErjvZ595KR5FG}kW~CoMR*fPWeDlo5b&L%0tQrG7%EI@p^PWy%UZNJa%W(npod?V8U;r63VWdeINe+Z$*$1-DMw$w|Z45{_o?9MFC^WyK zBOY4K8$h72asMWdjoF;LT_brt>FwC~IP}1gVpLmFwO+rNS$f@Uv@O68tP3&Pb_TM| zU81b0zpk}7(6e&X&>VKKC7^Z|@{-3tMQjuxkgz^DE?#xHoLML&*b`2w&d1sD+*!Qy(YTF*|R?1fN?TPIki~)aavpro%!4ayhu;zNsS;m2VrsK%imHsqSV@^e3c zoa`%glpJj7P)m#P-V#(fu!)M9C^{>^%r(fQp$${V>0i0H8ja!PjsGD27cke*a3UR6 zn-LQoSMvQ0T-5kdg|4yW6sn8PoTov+vSoV}(?OzQv<<*ipXg&O^8>EVH2#?2{t0%Y zZB(cv1vEM@VG$>hBq&c*Dvh@7m9Wo0bQ*s?bPeQ2VI;5UyLkD5m-R=81m-t?*PprGP z$HBm>^GEzqeaXVwCqd8_ z)|SEb6=P_vEpu6o*$2}x8!Gx7`maNHgb0`sW;lrPyl@hEux9G z-kSIZP5fSLxw&+tkjBgqOePy`C7QHoyUkCN?xsnHf~DkVD=N?a30E9;$dU_;YaavQ zr%(EP=$r&xTm_4b2$m4OmDm$b>jX-CyJ4FSM#mFZTrL`5Z<5q|ZRLrvjtAfe%3u8+ zE`0&Gd#@LMjmOGYH2;u;`+-xNrOJN(w};bq83p*9CN5%}PpX>T3?&FBm4W6aVmJ>5 zRTF6c@M5%`)H8;XruVFF4vdW?)he3FN!3QTD$x3Zrkd|>v_~N=d_ZlIc^S&>c>@vFNCU_V9*wjvMet~Te_ZcIB7Biqlq?y z&s$g;U$IzYAb zPIrYSDF2aHSgckU1rmvj@t&HW7IMwJMyfspa{uOXvsAfvImt@apnF$xYxty3X1@qy z)CPjKfOD#hwkdkXlb2!j7&ilE=qAj2sEgJv(lo`b3AA0HX_uI`SBVi9IvVF%QpMaH z==$BNDq6`%RR^~!&|dIjw5``O-c6bwx~qwU|m%pBRn3MI}72rNFCy#%-O$?QA09J3MD(Un*?Xfnep988Oc(bgFg zH=oSJf@I4D3m1>#QkVu|t;3(9I+CYVn3g4@Z8wOBt$o~3D|M%5g}#Q%u>jw7 zWYkv7B3$d&no-*jwS0>FBPMjxi4{7SRw$#bm~_$vE0$ba8CbaV-I{c=CT$ba3fO(D zT)Zb2cm4qs)svpJKgna!4}4xDgCQ#RGY@&l>I_3<&yHoOhg^$k!+Re!4A+POz8!d5 z2Yk=6B13s!)bqhXSKyv~=sM2IIn#I`5Sa$Kx`%rg*LK2bH84@VC8lnB)4|BMy%fl5 z(`b;ZJI>=Cxj$0Vto*{C+NSO-|K*`af==TyUkv5$G(LU!dT1>36%NIy45wAoXxo86 z2>7)8kn=KMC&*m#2~B%O+an&e)1X#dCK?ZfTfO%BX<+rbRG@Y^-=KkUtLuteG56=; zMdKVx$FG>UP(RIyG-8%G$r;pBpnbt7HDa`u7;UHYoZB22F?KhH$yk=9GSI9=s$$%# zKuhsrw2jg;&LK^)ZU(cl%&aodgiD&vIINmgAbNA!y6HJXNR^LU74})%FqxozG$oR% zXTYGg545#>qM`QTI`uI<!-Ez~p4rMf1o7{%?u7JoG$ON?dXaTWJdleLdJ@-M1J z(y9X{8Z%`laCP=mlc4_#(-A9mJy4$L5EZxnvmT*F!}&4<=jT^z$^`;zteaq`k;qy5NkZsoPSkY zMvDknL`*Q~c`qhsKb42p5jPK7_N+J0Q1H~5jJ7{~&uV(9bNoc!HEPUjyMt`cNc<2I zYRGuj?Y6@7c8J?Gkz`h(=;Wc9}?)sMhyOF*E!a*HVj5cXqOom zzVebl`#uBN`92@8WFXB@>NdoI`x9bjQ``o67XSGk^0VJ+^_g&QR^7H}TYKwL@A^Q` z2i>`VPqfq|c<*u5K<(=2Zf^mQ=aGSvxq&2re)|gMz)bBzE7)5Ad&&vm#q@W88*L?- z5L`8seWF&QU0O7M>E#Cu)q1MtW&FWoI@NiIqUUJV^IVB-^OgbG0EiRoyG0DLMn)BQ|aN|F`$H_>Qho)FJPl>T?i{P=Y1HqZ2GEwKcnaswr2=B@w zz(bMb*>KFGZVu)OKE;CJb#>#9g%MXbDs4PMfCLf1;<78nBWR@^lp3JgWz|s+b&VkM zEdk#VbfMT+^^QiJ6~Q!tmK`^)y`VNhyTA-E7D z4WFWY&U)Aa11S(uJ;JZN4QrAJq%m3xUlr}KI$O1ty{DZlqLY(-K6NIdCHy74J7g*U5DSj*M|z}@LpBx8dNXXg)DJ&#lQ!`4gN!8VH6 z=4)*9l=jl!=wY>${!~`Zd>dOFX~uyj#MQL&BlH$RLSZI>Hwna5fnZD|O!*WTwpRj6C9DHsWUN~8 z7{Y=H!->F#6BeSEy^XMN!mvXZe0_mg5A-6?V_`31?5}4GC+v2@u=Nwd!NBN2^9aDS z+J~*=+d!L!-%U84kKK4w#hsXgh<}{Gzf^InO(RSYgcCyGtPq$a@LdAGDex%*-y-nO z1U^IHHi6d*e6GOr1zyf^JcG&^5z?TXZiS1^3&IIOC=mjO1^#D&KPm9-0$(lgbpqcc@Rjd6Y;7s7J3)~>^e1SIz{PH8JC$J6&<5D6t z;rOK>esRGTMGpwrhp{gKI?bx1ds^Slt=t!&0z1TG*L@*s`DLw)Cr%`=VPAiK;(P*A z;l6(A`EoiRpq@WO=Y7=k1#}**o=>Iox$5~nblyWfzYFW5YabpCK)W-J2%Xh)nrjnI z0_;v8S|`0tf1H6-BS9(B8=>SEvln9f zTldGldf-o1@L|R^bvgx2Q&mkvf2-*Ou1T-x z75L()?+KxZ>xdv7oqnT(+Rx2dehVchxsoPtB_>kx0YZVA-vu&UbsV9)1bSX;ej=eS z3zXhn;Jju+*9!DWs|F_%TqNKH8k$PzJb{kT&`E^eBhXG7nnq~6KwIEHUR^q&kpkVT zp|c4!0JTy(Dm8ck!B?;YBQ#G#a|mq~s98go5PC?UT{N_a(Cq^KmLiG5<55DN7w91k zT?5qWC=u`r8vHadKg7}ECoKGPzXe64z;(Q2A#&s#tY1|!6#*(TrNW?HqWhifU+=-_rxwUlT$hiV@6OjHK zp=Z9%bQPh8M!B_@2^pdyJ{)Ny#GoQS;J$QjExqpKJdfa0rx0j6!*T0XBJ2PG&`}Q2 zD^$)WRpc#>(2GaT1u9a@5eFf(O^4L89Qm3Mif(rWk8=D=!duWPa6ZTpdTYqJS4F1N z)27_o7J@2OXgo*gxwtb=MG`o2o)9w-wE}WsGazpl+Y8~r4#c9m_|$Lc)kOaUJxg>x z%K6(K&OU%DkNVO;qr>?}wM?Uzms6IMup$r+9!?UuhPK;h5m162#BJq#`A zGU_5;{xg*kVgbBm^kCijts0&`;Z{&?Ej@X59#WC7I6_a6o#!X25ItbYt)({zoO4v< zAV=sm1?Ny8?x_9?$LR@)(*Rt(BI1A9l0i|{fiz8A_NS;!LmRMgn!)ObRN>M#mqj^F z@9?%!uY`TT($O`0|M<Z6$uAzjgO@x;9DUQ<1L9_+oZ=chM zq{W)ZechFa_9l@9-+x5yg*~IF^uIPP5i5lb7=%UWVL|6T)((yTLRYI0RI#~UkMeJgQwTZw#& z$k&N{lgPJ;yjtYjMZRC;bt12i5ht5PzE|YCc%ECy|6@B7hAR<)?CXR+A<1}=QK?9d zjkVxiHxyX6p;6u9lcY6Q!tnRtO{MJG>MzjghL^(P*`%Sv2Cu@_{!%sOF7cH_g8LPH zH44xDQ+s88AVw4#BElB^Z|c~Q}dA@mxiWYCJH zYX>z>wj+L!mGsfboBLzq8m_zq+?S42ss-9TT{=ltx!-TU=DXHz#(j7jZHFDNKZMTB zv7=ARk2um6BbJh-&ZRA_j`P?{4?K*|OK_{VJms+ZeM!ofP%a%!X;QNjlEfaotu^%D z*sE5goUf&CRVq?iYVi#Udnj(SvewRCjk72RA7s65AEEr*g-ySG41t?&zh9|1!v1;t zm{b~WVKwwo4MlA?=v{A#<-259PNOy*v9*4d837pNs6xD;pG>&%;*XV_0^U&p%&{St z4H!O1nfM?}AKpiqkjow!etVCb#C?BD`TcgfF@n7<-LIhyz^^&%;PAo9-duKNcu#9S z4S|o`GmG}&OCs8W?^8N7suRxM?dQ$XZS<$Kt;11YqLP8DTlhxmrA|rsdUa*wu(x@yHI*(FG0tRHhP`to$Xywsu)k-E*Q)1h04;#pf$g2KhOR& zVr-97Fb!_$2}XQ{faRg`9n#L}KaYqHp+eCorH4(}>@n zI&^ylwW&8Ii`+_A6Gzsk87j<%^6+(bmXHu`weLX-e{or2%g$MhuCSMQ`I3xSFa80& z5&r;`Pi@2_w!;x~8xzi5Qpy|GkC!XL%7_sYU+bkK;`+8C*i0@wZt?q3e1Jh^a@wU$ zA|SQ7HVp)aAsZe_>XnLfnsU!s23PpdRP*meG}RaooVR8SEPCG3+sqVMFArvO2bV6RB^ zFQ4d7?bx5ieo&_i1+;horpY~QecZ;ra6$UE5gcYPRi*L;kA45TBD`1uV-Mt>l8 zo`)L>r8iy0-&9QCR!?FzV-l1>bJ?jeTjW*j;k#qykJZ-vO|qW5qPAqN}5^e8!f4ig+)hw}xo|7hiC^ zfjR|;^+Ndvh@$i52g~oL8=$oKILcXAQi{@XCYzgdkMheLR-1Ice1rXv6efSe{KoZ_ z-(W+=O_RT3CF5REzMjqoj4zgtvX{rtm227c@e?{Lr_GWjxV+Wz1h(Wy{gl&eYI3}M zk(DOjD>t!^k_Re)+LDL$bxae{5=i~Ea3&hlh~Z}lg96y1kS&MVl$40sT~!1CR&z+L zFO+F=smZ5kg6uM2wY-3tid2vQ5mtgAz98f37E&2g(op0i%?_pXRmMzX&Xl1_z%G)|1>p$V2(OtkmdmO_NgP*R#AFvss3JQmO+lc16nhxBZAIyo8uS?rK1$fM+iK}J188Ly24MF-lg(uyi85M^g5Ma zWJMFdl2h2M`=aHA?6Ldu5(eH+62y^UzqH>G$%_;QD8BCK$cv;8#h2+0%NZ6nDOujd zW>31k=Q>bn?yy^o)W+$Ph>ee0$6~f^(y-t}jiETiF@SwFX^MQBjl4f!Ufi(l{%NvO zX=guA?yY1;vB(ED$xpJK52Pw@4P`$+Fi)8|v|(mix}rQgfxSM}q#Q_X_;~67Kjp1~ z?B`ibu4n6Ko8%!4J7%}Z%9FRTy14_Dxwo-T=f0-w7{W^C4OLbSVY}u%uSAY!ljh&s zwQ4X7J#40F``UP4|Khu8)a+xg&F`gT4{rEiewjg;Z(>sxzNn;)U{@CQl%rY4MOMXh znyp(Dsl=XUb&H-*#++tDvQy+wSyA@$O8RLQm~*d!2%4T#EWgn3VNQUrvLdeG^g~uz z8F8A;%%7nQIL&tEpJcKnPHFm#C0JsWswg(ovP>x&$WB-WD957MHA|n4AAM$4zsgFC zWYNX9bv&+>4Uue4@xYFDt=!a|Z7A-l z=ob_Q@KW5FgUz=AcxuI;mDU&*_h^FR-^{WeozS%>$oN_>WKDi-m?W8f&e)s#nwr^r zk8W0WN3vNf)23eSfr!QTd>DW*!{o3<@-cw(5Jy`C<{sMQG~#dkz&3oNM0cLVw|#?% z^C&2Zn7lfnlW4|rZ0o_UuS{1i^kiv|MJR`RvWFg<7_tJ2XetE*?y{}y#STAqJ2mp( zkHsl4r|+s{Wm-4(hgDI5cXZ>Nj=|j;*s6DAC9IjHt=_0i?9RSiJz9AwjPe$+;VaS>R za*tW)Ikbo#h)WgN^%?O|=;U2NXMEw2rB6Jd#5OnBpSUXbU!k=L{nzLS#M^BZ`LPkD z_IT<+-X@HmMPclmZJ;v1$o$Gihg|9++`vV?3uRNv9*m$sLVcrfJH~}5364Oy*%zVL zR2Hcy!R&HbbeG9+6M30zqUohm7iM~LOGsg7Z+%5w8csYpT2}f7v4FLkSI~hovivEE+TlTic3Jq>^`_SVl&}bA-iFHRy}da7Dp?a>YYE((&_nk7?|sp0I@k}*n;a28tdvhr9MYbfZe z3=3sv3lh00@xL|230HYnk$`f-aj#1JL)qk|$uzZWS~|K*%5T`$cV=HK4ez*s9G)B- zLAJ<+2AQ@w&NpdSyU@yHqDi`E9kl~Jq-`a37L~p|&lyx@9o!Rt<#{@y?r4Pi8 zw&7;^dx{c}#NJyMX&u&y&-@kP#{#f@ye?b5#+zT3bUyb}Wz?M*)I@bua$efgO##$G zP>L#!VjC4lxQp?xm?g(g`TULtD6}lCH_Tmcc%Q_mn%_~4c&)md(Ms~UN6 zvS#hrU}oIV$9Mt*fp2azI3pXoA$I6CyIDHGWA}$ozgcg17c-x9(BV^lcFnidaNfb| zKJuY8*G=GfT52q#Tcw&L11St3spd9ujUDYv4+%RPTSUG}Ol)l z^&T@1T{_1Pu*7eC*}(i?j-Vf1F}>Wq4`_0dJWie^&z2|2Q{^f0OgUKgm(%6Ga(}s> zJb-nU`*p%}h^>wKBPdOKSi#HPFxVQNeR;OLvHAu(R+GqXRDWO%ymy&t`NXAm>YHs^w6q|1@q@)hIoV?arSVG(3UU@%alxl zGg}M0q)Z#1l$Iime_(R@)CVR>Nt4pq&8=DClOLFxo+_mzO-q-iJun@oGgGFevjw$N z4fmzYp2l|8_UXu5lFVDeKB}E*P0PwQP0GndZ4#YMUHo94c0RpOfXPcADZuG?(=^NC zMSsxPwW21XmARN!5TcUwV2&kk=`u?}){>k71GUn^N7?9YNlM{_hSl2?*;;QiOHY)l zsZyMmcwrjN49p~O33-c5^qfE+o37lwqNFK?%Qth1Z zdlAD0i!F~zld~pE@shN*^IEgi_>`Ki;@rNLb$NC2vjamKGGDDWG&CtDdE@pz^6e~o zdyF-~<@$$&BdL>rnKCZeH@VaYTW4t=VMAT?Ie{dN?__?glK~&M;|dmO0C4QA2saV7 z7HQaTFnT6q21f4|(LsFmNQqt;)x%C4?ip{K?Vc;o|BY_R5_F>uaA_6 zvb$a%8FYusHIR5w`9k*i>#_13Z0qZz@%O^(z47;2_ntly64V5+hbsd~7}bssx; zxWC_FoE?c`1v`dD&BK$)zv5Dcs(ebhr&G|AKKFDADK(^YGWo3ZVejqe(>tkST41M; z)W%LhmY9n_a)I8-gzEjAPhI=}NmHMW3 zDv^ES*|ME?D)vmaV`o3bk;zW)9Hb1%VoLoWr74TWAu}vwbL!(*{OkV8s)el6n^DU4 zg)HvPyL_cZE|(7s@6DS+&iHbniu6~GEo9%;#|4vjh)@XDj_ly>P*zuORtDs@k zS-I@#hPxI22iXS=_pmK*_(yKebGe3qU7Fk}WFC6dgwtV2^?B^QH==#dgWQuU4Ak`6 zKW3BPn9SC_=`XKf&%N1SwzGHN9H~SsX4l?~lh?Ao4Wn7eE`KHLAr`soF26jyjAK+- zl)XD!wrh&7KX!%-*bi@qvh%xQl_B{|d25DZC}4Bm8mgEI*oL?6>6%*La^aeS9|Q20 zo>-?Buy5ZQq~sN_uDkD6nwPN|yYKRyXF<^EY)iAS_jb=v+8$wD_l#50SFkyI2Klz( z8T50@5eI@%~Pqb39l3m%;PpMnUy6znmb$+GGMeh_LfCP@9j9H`f+vzrPjw; z+`gg8Wh+~VZ1WTBd1RZ)*a!RWR$`xIf$xm)-SVW%^*MXv-B4Ejj)Bd4XNWTFDfaX` z_bB;m*~xc?`uT5gx$*+I?_%~Rbh5!f>RD5j%k`%)4*%)BN2wcl#-8Ut>Go z9pT&b8in_owbf=QNmmNCvkb>VUh-;kTTk^Kc)sM%1I&2|F*no85++z>isZ83( zRvs9^%!mDb*X?(?(m3J4!}FQt&4^$!pG3^>YPEjcIGYu|*^@VY+j|Y)9>ywFZ9<2O zqhz2g(J#K;@WM6&+XBqLkB2XBkSx^!Yx2U@0V|A=rORH}31I7h#e!EmwhoY`!@$JB zB2RZ>COOpF0;~-wBvzK9kOm*bQq|1F}t8@(~Qa@P=LJC8QLK=iL6e$rY8EG=o45Un? zJfuRT6-XsWYmq9EUO?K0v;%2B(h;PSNavBhMruWBLsI&qE~E&g=>Aq&8iJD%NM@vo zNa;umkn)g(_=3KAVRkq5!kQAk6Oh9QkZnu?T(l!s(N zdID(!(q=3E(6I~oVWd+?4#Lp=5lD3WFT2S4U-Z%cvWu+$MIZeyyU6@s^bvIjj$3z8 z!`b8C8iFGv+7YJ|WG&3k$z})t){V9PEy8M$CgfOVOiUifH|vv&mn_UF;;N*iMGqG* zF3JIomucMp|DUYVeJN8Xr%bwIXk2!FK2;QkN+>N^wtP{MMMVdo{J%*UTmKuyzt`*C zphPr?r~9=Nkx!qNGF9_M8nFLcYWSe(F1bVD1hZtCU~cGq@<;jEct4|TPLg^e#Y_0O zD?SPM4|1*Hv@BP%K9_p4`Wpr|;In+Wjy?C;FL)5r=TZ;0z1bh-x0;>uF*nblGs}Hx zU+KfLE{AVyj%CZw#>(f3T-D?!`?3RPpV^4t2%U9qq1@^gx^OO5&SgI57vTa?lHw3U ztsU5c^O3%fDU#HYG_lF&0@(-Oj9~Rnf7!sEy%Eb?=L3AJ!ERumoC)u@9A`IOxUQ0y zWGya;TZE$SxD!gv{;c(vNct7h5HoIc(_rwCk3>n*T?z~NHcZqpl70MnXBhXz=iTK9 z)D$DnW4$lL^rP*$TEns&i)C@agUj@_q(EOte^&Bi)JXbKR690^vSgBcxEXZ!*?gOd zC{mmyX9ZmWgkb*!0<2hwdvt%LhITZej8+4i#MWHy&K9)91~ma7Jw9?j<=H-A8$UD1 zL&!4YCJ+pq5ClCwWNXfLm(AQ`)$GHTn9zDIPV_kSM_eTv zlfQ^z8@^5r-Fpk#4`2Qv)P4(`WP-j)iWFWu)(%Su)Hbz4i}>>1F71$>Z=cljpQ)ja zTZ;W5wDp#F40{1GZSBxrzL**+jTC+U8>ejiDmB!<9op6}QbR-9p_wiw1>`Qy&q25P z%2jvA;33|MZ(@~*k?iGfqN_q=ITj(*i^+}$r zLGSJN4;Tv_80ft-atn)cFjzx=XFEsOOV_)xN{7F^j>*k2YDHC?JW}lrJ+~h-6JS41PDsZFiC-RV^dsfKGRcj+Z-P zzy#A^7xIbjCY~T2av@uKrMDlwWgn7AeUTV})67J*1JwECb|7hEv@StC(nKI&kzh6r zIBkYWWM_ZW>`Y{RuEunv-=I`S>|gnaZQ*tw^JN>ZM)LW04m8D& zBS}kenu)s^>SU6UkwMd~RPRQ>D3yT6j9hO@{Me1(NBeSZh>!^Oz?lx1Ey#0Mxdkiy zSmpPTY{Pf{iv1N{JB35jSPB)nl6O%uIf~+RJ!$~cfGg3mf7Kg)a*WdA#|p1RvYVHG zCqgy!B&ObeFG36o;Zo~{cP?~jZEFVdUnq1bk3Gyt}1LI(vc^vn^G_srvn?&Dc0%=KBEypR2 zhlxGK8(9scaDq3o35Z>XybdHD&GIaN2Y{sMkn^JfRq7xI5c6bJ3_ikf4Tyv{K-6H< zTnYPM`H4b;8cJ)B5^I8t2b~;HytSsCz=!!tAnrFN>C81J`=69hE%PVWp#n+ z4*ALrq@1mC`CCKK(H`afL0pCYhF3(-j|Eb%wSgrj6cu7J`TN z*eZ_}&XpU8hsJt0_!#ev;MRH0<<6>So*N~{Dkg4kzsqCer?*w+0Jo*y4>? zftX(MMk;_*zwC`X52W%>-bf9Q612%HcDtb3%;yNAp121yW&*7NzT6kuR;4OPkpruW z{NzZ*>|eFPPmWen)krykC{iQE4C6aNiT>Du8tbbmQlj_cw5di{Ie6=o*2<)AYlEl0y6EE?b3!`x>IIYE6I~Q*|Ly#+5>Q)UPA{6E*Wc%61Kg zY(#sSFLnpj)E@P8Pf!Qkf|}4v{zGW|EeO0Zvq)@Id(^Zj+1x`LNapsqHU~jRYJ1fD zZlI>MM-2=Cbyj=SPDW5O+oP@{YF>NPsE(i(wnyz30P2eNsL_F-mb6FRLYmj!n)-*( z%3Bj+stUV8Y;$|m6=9%Ow@1Am3Tj<@)GnPst-l2|t26q3?=1*Z!a=a#g202~3R!xr zJ!&L%cT;=Rk}jY&w?|z??PzI_I>;YX$1SKy-C=I)EePD)wG=~b?NPs__>*ee8O+zn z?f&gi>&T#x_NbNQ_K5bV)f7Xf_NZrjfI8q7)Q5vvVx!ul`gI1?+#Yov zRhilz6_-jFrtMJ`>eX58QEw78vpwo|vN^9k>d9XJiJBK7o2x2u8$v0pL<~1wss$F^DXGS zCs&)~B!6*FX*TW|^+oRfV zm)&)&>r=kI8fu;qdr7V9@QRo&OlJj?NJv{vs2rn zHV>5D_ehOATBECm#3P#1ws{8bgsT1Vh~~N8(d?%4p}Z+U&hz^KTR6bll~vlds+&V` z)g!iSg?!7VZ0lCF;SO27I{rHZs{gDB1Xcf8+w2AFHhVTM+0h)~-t4jOE_V;Df93Zb zoit2dQ}2)kCdYVI%Bhc_*JwFyX$UruM|%-l+EM;eycPRw(>SajgsrFQDD{%wf_Djj#FI0 z2#ex@>_YM&cm7W5)_RWpPS0Vz9_xRp=)~_7ozg4%FZDG2MvoOAfBk<_bm}*X;4ED3 z{hvJ)Ej9m6QG{Mm)snm97=Jv>am1 z+v?350(a5jXtvXZbC!#8KOrHR; z<6b{q*MorL9FTM!5Bf|&KR;{iZo_iBN-VvMMVWmC6lfh^!w}T%BJE{wa55 z#BZv~8Y9OnN#O4ld-v15goJn_3ptO;OWi6U2C#X0cQcR>om>9Or6jt;A}rls^}`s9 z7WKMGYtUJ+sVks{T=|_K|K}^A#-l0(E~wVG2S_IRPjw7#2(HM_Sjh!FQn!Q0gpTrZ zl^M`>ouYJ74F`Gxh5qp#b#Fo@(tutD9kaH2$9n;I>UDaa0HV#bAmDfoNK!g3jK)S5FnoFPm&^?>I*>B4Ws6>e*u}LbH5Z^l|NRFw$eZSuo-^w)NmV+EjoRp zfmGId+jSohliLY+sEA1nkBW3WbBG6h<*_sy2pt}z$OGV9zX4LHGl>2%0{R{Xf+FHNbV6^_<0?<}U2(U{th3q##I7?a4#zIB8q^)fT<%Pw$xp=FoTIUZVJ__`-BV*y>f^2ibQ1uzU zrn)zHM(H%)1|$;`CqOtqBLgojWn^Fx3m7K{TkiyMfQ~%{2p#GSl9BsJ(PB%Eq~55| zDwzYGX1CKb;D>@mg^#Y)bxa<3N_3i60g2Ed>#TqVpfXPs{0Ru0>@|Vy0P>}~GNSGS zQm9kZ1jGc2r>j~>51i$h2(JNA-=CmnWMo;EE~Z~#%B%GbCmABUbgJpMVd8Z>QPc-G zJgSEPx#2c3V@b{uxI)GVbd@atQy54de=Gx{-;X?7b#%NO z6Iu5%I{nn!p$rz0LiY=>sFf+ut* zkWpK`dHN3oq+WD!H!sRxoKs+tQhR8flVMq!zx0uuBLCW|W65&-++pCiyZ1L__&8Fk zGj|dYIz&unjGvmGaesO;5Ko8C1J4SbR6*6W6gg(@;~?N)UG`!v2ZC3SypZRBXnS31 z9cFPLba>V%`u7>*fq1GsQT0g*md#9EtzUs{yL*Br761C3Dg*BFtFO>-A7T7t7Z*zE zmejw}I24&=0a_EKY>aE_Pnbj3z zU%h`w)o0|<2b|_%>Kl=oL93x?luq>qAoK#2XU2E|$O`aykOm+nI-X`A>H*C%+AZO- zylUwr{L7U;fTZ5^(<-H(_5#_v%|Phzcp(AEIyl%qKqj5oBS0h_VgsVRp+(9h=~?2z;i>)=Ao?x;ULgB*UN|D8Jk7Y+Z8%1@j_KdO zW5VnFl1;~hH{tHbl(Ax~cZUuEoBBeo=E%{6=me(#DS_Ppg-ddQ3_wW@o{XFoi!pwr zRGsG4;AyS(u4_FIGyM#$#{t^`N!z@c4g=Ywb0po9oaL6vQ1A9gX}ZdOAk{i47ZCN0 zVy$7p_)0EY!aG8q>Td@$OebarqVJJ~KuUC1jw^uh*Il_kGN$F{6ON z&w@$|h-b`h0ixdfCR1nwkN>4YT?2N3M?e1^2693dtj$2w_lvbAIe@h2^!zIs&|cjn z@+**JxBp<7)FTqHp=)*m5Q7^TyT|o_9480lWff%S=cHy?ss>MymsfS1D&NshyjY7% zn~X(;#TmIdSr&Z#y)1)1paqC`ZnKIWTwZl?s+?Z+*%WzbFn>@Vw+yhQxUg#URQWG^ zMog3KN>$nnxqH>M>GGUCWi#Z_a@FD)a!+G1_B+{&?;!QX*^8I&`FN(B(rJ$=SB^6L EKeYFe9smFU delta 29947 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 Date: Wed, 11 Nov 2015 20:38:41 +1030 Subject: [PATCH 136/140] Rebuild on latest libctru I forgot to get the new libctru until now, oops. (Doesn't seem to make a difference for me, but some people had problems?) --- 3DS/3DSController.3dsx | Bin 175240 -> 185852 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/3DS/3DSController.3dsx b/3DS/3DSController.3dsx index cd4959e1453f2a668fc623c98b23e1afbaf7fd91..0b5f3c6bc1742c1ed205a8902dfee21d11624a22 100644 GIT binary patch delta 36631 zcmc${3v^UP@;~0)GkHxym^=wXNQMwX3?WRyE5wK+0wN*~0mD-^Ah3w25m8yzWda0@ zNMfLYiwI<75m^@5K#(Y+-+&;ffG7_ULFd7R5D)=bjfm#|sXKQx0`7Nz=lp-?mvj2` zz17v#)z#J2)zy6`WnY-C|1&(hYu}+GtSpoT{?^|w80*KF`2!<6{(_Oc!u=&7Izs%S z>^p_M&7x_25^_%pW}busr0WwySnN*5N*`lPsZ0|Ii%zEocLjp&q>SV_!8ZS6f8N_f z)#&f7FJ%QE+~ch;13D@; zcI3|?^?k4=FSLn|1exiJ3~UfUCdfaW#sJj@;QdzO86v<(`%C%7C7%f&%je3Y;XV1cvPDGu_=j4c7WnzTsmWrquTrV@u5Pk_M2bjmA*V#731bVn zI3i1&=^=MT^eJ54jh%nLsi~m|Ql`;MMfZP1*M9&ky%2hdR2CP)LR}Cg@>IN6BF{wL z4XIHV4fUH@kJ2$v)d-Ljy29+D;+lkc<~+=7bGbOch_P#JID;v9j;F*-NI85Lc6 z0NTI`d<(Oy;*f$Cj;m5*p=xD!RmC9%@k*Li^Ht`;SVlmICYP_e6+2%%yGkv7l6q5y zt*PmJI8+3J@{Psw1QMosIk-Bk&Zw(W=X9Ix z7PrrZg-}#xTd0Osf1rjT%|y2YQ>zZo;h;`*V#&xn@NWH6Em*_Wrx{Cpf-xG@wRn!e zGl@DKDHI8!AFOErdlq9g(Wng#X-Ggj_QCcNV;DV6kLO|}Nx$ptWTuutY(q(TL$?-H zsV{(uYI!cYjdOW1N=eOu(G{K5R9=5B0j3dMp|Tl{Dy`g4N%7;FmxAgt^(a)FMiAXV zzD#v%?^NdSL4{1iG1|-qu59zvZX_}$)zAHPY`*7FsUz4S1f#7~rTIlNpl*@&Q5UKI zx-6s;vnqzlNpY!+aDXfCi5dnB%Gb+NvB}vk(EJ7>2uz%S*r;x^dYW|{VXaa} z$XDZ%<)FCGyNCVKbRM%_8|4@9OkJ}AgN(x@P$k<>Ffx=8fRBq{4FQhyNg^kN=-ClQY4ZX9X{Ca&``i=ouOrKN+N662kvuWxa>%N zQy|s$aejDTO|+QG=`Npvx#T_Z9fUnjJ{})0_MMdTPQPa#pJ((Kb;IZj}{%DAvC~(t>D4X>OscKxt5-+|(*wG_{c*v`R7U2V0XL zgy9=1ue9nd#z)AUgay%aw5m%~>hQ=|*0BGiJebf!APa7tA&%g!b-eRWK#J8kU!um^ z534D9d(_qpkR;ODf@61iMmR7ERyPz02}(Pts7ieR_?!*%#o9km;lG%Ewi&$~sveBz z5PM%d4}&z=3c@c2BPK9%1qx||q9(+$7>K}MU_^nxLE>vv_hx)0*rnPC`%lYJbG~x* zh0tmTUm8!CX5cRkb^;)K_%cjW4~Mz}RR~ySRnLOX3Vg zB~h1(K8|8A;+23g+eh$HM*5a$&mZD>gm1a_ybsS0I(;j(mw9pMlL}(!QwX!OVAi)8 zV>B|vShr@3m0A7F85}Op44oP1JD7P;W2V}+CyHp&93Yw{?0(HbAUY$o(R9ELglLnC z50dRV$K3rek+C_v@SiNDnvH$X7t`el&zcmhS5_DFuE1Aj_4iX~{oE6Usp%mjM@?Yq zm#QjnmB7 z0ku$Ow`(I^$;PnZ1aTZt2gx^*lVy6lRCy`c7<4zFy$C1j?^rJL@MdHqJTy(SWCv?9 z?;`tI+u!j;7_sN_rI~1oEm32@5*f&^e)$p zvmBM26ge4pf%W_G~TxT4^BTE@Vu z83V5co{ZCTnhN0<(?Up%1uBz|a2hUnZg!QLiwevp$=Ag8WS+O$w%3ym_h>W936==h zCOikDKE1ENGqWv+z1*X67UN5Y`qiMFMk`HCT1V%2tIeN#zW8~xzi~IX+6sgXNW=sY z3B_m-V_%@`4Z!OdR(rsg=)?sG$Aj=Hlo2r^d|j`zA9Y-ERZ6mR2(US=?I^X{_Nbd- z}RU`&Tx$rGPXt%5SOybBaw#QW?3%nG>8U-l8oN&){8b!e=~8q<^@yN8_$D?v_U zGZp!Cq@wO2p=>fb4O`||~Xm$cNet^Z7&g3+QGK-)SZYvd6u zUwYcc$m&#U^sr_ax~24{_7EqpOG}5O4h`7*kq5W!deixDkfo4(k<{hqCi~={X<^T~^y<{}H2k%u#Gc z-y#;I{)wt*A#RuaOIoMa!GNp+WF;UZXc`0(x=oYPp|sdmpMY#Yj(#bTo$O7P#94QX zGCRAIUAjlxF8WvzR_$W9@8p~+_2gotHC3t^(`$cpm1?j;g`h^4iVk=pu$hZ+lw(1m zWpI^h;LFdBq-SghX*CCDCTvE1`N$dai%_-U*PEQ$pj4Z`@Pu2-y${h4*j=7cBqt!L zKq9*lZa$@M`w4Em?Uc%GcY8xHuML;0lvC*Pa~ar+K%MIJ+}H_gkN!+$y+JG7R*tFl zg@A4N_hfeB`!$;X_~n$JS~mNXd}MZnh}1?u&2Aio9z`;ZG%S_5fp z$vJ^JJ=9kP0t46z^uPhlWTrt@dM=xYlI}lI_C-@W zf8lz(5Z8xMNQR2$56z;xTps za}LEie=p#lKoY%?6Sqsqj{;7$`LJg_wE8Z<-$r>4u#jz|aiQ_SBBCuc znsbd1W;fl_<7f->O&-o{8$Fn00NMZMKS|L!N8Hg;n(Uh6UD!E8WVDoDbO#KygdtVx&L7Dh*kO_p&VosfL9DV{SH_BS7&9VwA*W|M(p0?X zca`zkSwUwJK$s`*%^n`~8BFgY`C9f9e3^{P=^0E7V3%2tlh%3-X#0C}OzTYx^kyAk zE9Ih`n6@rF(IOG>(X7Pb^Y7Lt*vr*QxihDIyGHQ+60qhW(Ga%65<^<|EZ{VZWiqJi z=(zD!Y}9L0Il`VR9454a9VUR6*JtAI>kgN0Jsrzwt!VhcmZN7t_W39^$TWnRZ7Xt%G;;5GlXD zow*}J1c%estu6JJu~wmhjc1W=Mqont2)Wr3^S~ACZm8c7uD0dGs%;`uS!S(Kjdj@R z!)uE$OPI%bc%O&&d3c|vnyrWk00!fuZB3~qJIj*i@94mf%BbGSnyldjYmi+8Ax>xY zw(uJHa_^4(Z*phvJNe6!-}!J@iOxi$jIzhbk~I%+oq^*$$ob|%a_Y{?`q$B9ALW0H>krT5D1#T9>yAMr({x}EdGSNzt7ONw}B9a)GuL! zPgB!)*9&HBr=gz8=~?pKKCR-3e4wf8ec(Xhy=az8buw~_%_KTXF&CGd zo`CltHq7%A7JAZgszM~#M=Ne8a>4TLK^?P(0n5mjo~39}C-BAaOzaShR#bwMn=ue& z>nF+;cNg%n@|(L`iQH2%xbL*&+kqQUaB77?nJA~emogz=xx1G<)Hi`A2P%nv;}h5o zl?a)MASMs>%Z_;`8hp3y`xZ$L_PpPO+W2e|u9;F>i9B6&tY zS6EBdkPi_|*L5YLnXbGQqUp+lXDt>2f2sMrzX`|AqM?2g#femW@TTG@O*>`vy?rC+ zVHGChOLKnTL@5T2ihNWDkzoaB%E0lF59lCTv;aB*tnL7%l6v~F`rJ1vvd!uO{0Z@OCQKzI%16slzAC8`%? z^!zRIV$IM<^@0X-`9jR)-bk!AA+}S0(i(uBu`t+?tZB>Rz$ARU@0w++h3+KYArvt@O#f3~dDVa;dDyC^$8 zQAXb1CoZ#3m6}-qF(6_VTa2j*E|$rO_je5&$Jhb`EATuaU%mgHuz`3Z5e=7@@9%o= zh$w6qS*a>)E6)=24)m*nQ&42dIc8g`Vyo&&*eO+Rt@Gfx0ABh|M4C#~RD}J~5t~fW zsEzS;lYbd}UyGL7TY;|=sKm>^4Q?;54-Rv}ONIn=gDvK$x%iU5=8 zr1go)=sop@_w--i<)#PXh2xZ#4LT*idLT&*^JimVZXG$o94reQqsAUW3*^vH+$$Z< z7;VfM;$AJ;0n#EIhA<#Yr?!c^|&_x@FzEh;jR}XF3Q9{}czYm9jbc9S>Eb_o9O2%_szDjsXR0lqx zr6n|c*Y{25TVj_*iqHx$QewgsJMU;#xXcfImqxPFk z!d!_gu*5CC2^_*=s6zbnw&gXFqp~qBtD!1U!vYNSK06CD3zH)?&H2pp8I_ z2Mdz0u76X|ie7?;CS~2GQS!%ASrDcwX8A9;Q$aaRRXV4kg)JFnmuRZ?mX$*{CQXHs zHKL3DBZVny z=oK|0RVQ$$o>m8{)dc5qW@DJNOo#^5z60JM^k+)2DA{|i|1jGNk?67h?YX8OVt9v?V#5U zb&2J{REI{JIl5}Z_x#$gd75*HsKxn9=m)V*>=N6=GIastT2UA;mL|w`g-PN^oH`Yb z7q_>U8N;WEw=Ht@@TBO?7SN|zR#Ku~0GT%|^5AfbSZ9$9!!40zn+0=$P$`tJ2akvs9TMcE5lP~OSUG>h2hRIJBnF)hf^*EQC2Bng4FD`2Fn@TbMD-Dmc9*XY zHAo>Jdx=WMG6pd0VjA)Ta7T%H9PiBjuonwiLx6={I4&tcA4h0oS^|Oi9e!5lk{^%U zDSmD(D@Mh~|Iixb9TU9_WT+VmAb|7jqb$M`E02vT5F<@8WAtEgF;>nT-A8P0E#DiR z5x*9ld=Av9g^hUbi-Y-0m;7aP|Ezg9+e560?CJIdjMzrJlYd*vlprWm6e&}n>e@m% zZOp~NZ?q#%0GC_H{K6eB!vL;B?1U!$IWS}glQGl}2jpNYQK_G|H)kAhVqCzcm7J>C z^iVJtBihMrW0NfB6ZER6*1QQdL0%kd5$LMvPyNM|czI%ck~kPGuZ{1Wv=wzo+$1vE zBnL$97p*+_rdhyNJYyfNw(F({HY$8hA5X{3! zJ2J-260cb0hH;BU6wyh^3cUpZ!z~Gzh(N{ofubx<MI1!*Vt>m?bEorfM^dI{Tg|%ZQ1r3nq2DJ1% zy0f^I%$tywREDC6W<@7av}uYdxWbqdgI(R?Htc+Y6~TY^V$C%;jRu41Kn*ZeC z;?fX#)#TI8gd~UvxqZ}gV*E9d1O!ON%7tF9N1B0Nn9|dNDjt0v~#aZGxi(FPbSo92*XNpszwu1N$q(RdWE;YM+ zo8^y>CX3);nfGK$$}8~N0-O*MAr}LYIH9XYTcOlXj&hP8sa@Z2K!`;ypAGN!x^izz zwy@sjF87W=AkA#Y)j3C&8p0OWhp^K60X8a^^(|R>y%pyx5o~3BBxFYxDzT_s?S6^E zbq*h{18gUmW@13s8vFwf*=~k!znxaYVdkob)U)~wChew6o)dr^YW1%!YjJlh6oiOy znB5)IfH>Gn5TXIHK|^S#9|%vapct9Gk~E@WD<S} zka?%O(h_p<&-cA`vCu-o8Zjc zm`t}u-qhA~?YdAx0?HZ6Nje6cR>Q9{1Y?OO15$0oH6aWV(V!cI-=ZV*t{u-|DhUY1 zT#4yW;_^+#C>gN}FycTV6QktJuPgVmVt+_68N1X>9DQ{|%0M0s7Fqw*>N@nHW@AY>py~D2$hF_nIEt<6i zCzg(Kr}qpH;D*#wVF;U7U+ltBM`bxC_sjK$>;-NEbS1M+Vn2z-?4&{!7HN8Zi{K zN#b^w#|kmg>R@)1!$}Pw5hT>i5u*^jzb5?SEjum9jTFVM2it~yFA)@iykmrg-YfQ2E%jQzSFZS+2y&!_hUv4A)VzYTTV)U>8|}A!Xq3Q zclWO3*W85Xyb5JG#0gjl;H&QA_Wc?G@+;;;dC2eJI%9$N0HcBT8_NUl0X%YkxdW23 zBY_!acKP~3DX&_X^E}5xDDE55wWj&iQxurE$Cc zcSN0V`@ku7uQZnPRB~}iTn@}nk^qS+)LQCI2Mz)c=hLgDQ8Bm$3^AO;pTtDno3IMtpyfpncf=Vk=*bpol) z2t3z}KtA9d_4=eo-E2z`(y3DWT6e>6m8xgyQYYRY)=ta(lA^I+?t&T)CmnD?vFwYq z3;nzZqAGTI^1vxg8JfR7@)#gaZZC;u_W8KNhB=OD2=Q4KK=gq?c0Ek09ib{_dtPOB z>@I=V1$Yx^x>nNg4)smOGtun=`Ui+^wZnTK0#hbq$!Ir*z{E`>sKNpxlxHPJEC?dJ z1b3fTzvxA{!;L%F>VV4kRaQM;Yaq*S53tqsGt~vO2-cfug2ouopxa6vuugDR>|-S^ z4?GrAH#-=uR@A;IcbYNv!mB5^=`vn8Vg>D@XgP+1mtCcnx#zmKSP#1+5hikr6gNfJ z3*oie&{Li*&vNz@T_iGmyd5mSvsia?Vl z(kSg>Z7Di2U&SW9K{LfD$BeNstAYg$J+?0Phy6f@b|V_h=JYqn?YP@*pO1?phgFHf zKm!T6)Pr(ws)K zI|f!Xu0M1JM$7|8(95A`Mw?YNIIVav<5r8N)f6V1ul56C0>;{C_J1c~#u$<>z-@M{ zick3#*j#g&**zCG)aGTAzSy8AF1XDltJH2-@#?Krs@1$g4K11KE~%u&Cq*09u)0$B z7IxSjf#LL~SheAFVj_6F*iGcxR;U|MF)*$O#+dRQ5E;fb0n>`cmEtajx}|3g_IV&O zLL1jal!bvHjq3!Asg;#_!_cYLG^}QamxlE?Ogfa$M>8Q4*ETQ|Zf5(t_mXw5(?e$Q z((JvSM(bXzd=QVmKBI@eD2zS9=q_G!I4xQMvC}Y+=$Vy1-tmhap9(?r?J*Vo!A3|} zHGmFD+VHESOQAzfEDW})pa|=#AiH&L5H(^BED#vOK?rEiz&Q5Rrx@u1ZYNoC>0%I^ z65QnX!UMtC}_>%(9lVtNt&!g_My zY(;R#TnDsOGHxUVqOn@S3xBhCz6XbQ^>FPpPaKy-%Ihc320?eZ*9sRav9cU)7%ii# z>rLh|H;lVBJ*k&7ARTg@-~ss}zz8pL`3AxA4MN?P>`gGU3Ct|5PX}=WtDr{IZY2lQ zT+lTGr<=|M`HAGh+3L!jXsn`s7%B{M_&Ktofc65!SOjhKv~er-eyB5Y3JTQ=eq4YV z66t;@9+b{Egv1J$3`!k?fS2Vh!0A5M04QYz%0kWay!1@4ws_}x&QkAyqW9GS*vhVk zQbE~#0m2w-ZTTGpt}~&C9^5R*Y_|M&tIJziW-TjoO6LbNJ zx?(zv6)vMeiOW<(;7p(BwuAQk%!w^FeOtF4t5HCs#|*>q7*aK0JCNuTzC<+8SC1Vc z!USK??<*Q<*NPo0Zo+B?iDtk6J8*S{Z9%wTK9><}x7r5gn|z0jV4l|h%+c5>VI5XS zBB%9yIC5H6A4E=#1ZKl-Fd{>z?-$n^<+15G$=~24N|O+lXu?U1grP(uB zt1#S#Ak$vT{CCu0CmEIf>FEyQ-;Hwq(;4ya6B&eQN$-nwGW&?VM*|bTqdbRVbLNRdM*MY}Xie_!ioh z1Ys=+BBm%N$GCy&YY|$y5KgnshPrTAJSFfUN}(@@K$loCfiCUDh%T}5nog5w!3%3s zUx$4J5i7FsQtWk<*GvX)QqPIte%RbNMw3^k76v=ZAGZ;x$FFxDW`Q!~{ zc4nk9Mw>($*j%*oH{Gm3IdCWlr;&t-GAqiS(aW$7n`pyGXR-9{Nij6h3OXk-wx^LU zAZaGlPR=J>D{9x~ip1LMA7nxn^3#GghI<;DebJswC=r4g|+10%Y;BlK3MZ3SH#nE>7P zewy;Tf~X+E4br%Z^K+#^f;C7;Gd=^f(m^X7yxz!X;}3pyrO#&Y$pF_!wVvqPag6`J z)vy2K`W6tt(U;yCo4X3O4;{h@VT2s{Y#Zkhy(%^7AAPQg0E-$HEf_J3C`E+vy(lz{ zTm#&)#aBkDVC^bK&A;`R>arjFumH|s;G_fRx{gB^h|6`HKzA~2Rlyi;hc8(2RxyT6 zKWHNxN2HsfXc!?H#%e!Cr(0nNj2YG}?jNU0mBzo~KTr(QD9-X@+YDx{S!APqE3^jeGw-sf9xGS{` z#}biYx!AcZ>v{bQ$O!ow@wIEfS*c#e*g~uqq+aCl&^gks23c5=Cn_7{;*v?C@|?U@ z(qFI!*=Kg4c&S0Im_0E5IO1O13b(>WRp@)za_{&Cd2M$8sGTS>Wcn{{(oW*K95QF9 z*nUo~o0Dg`aE?s2Kkh+=eL;haql}T)=4=sfpOc&B&JvHDlUbz~#eryqVTNju`q+WGJfGU zvE#I~lvjvyRcuslwAy9P`rk$#s2YDKdIZ!X{u!6my@1oqke?gW;^pJWP4tCM4 z$chXRdPe3|q(t{c98U8(i(KT)n~Vnectu(gR9_3B;H(a3@i?=Gw3u1Kcvh)}F>*`A zl=h1;3HE|^M1=t&5G;|TsQWegn8`a|YAZad9Q#tdZ%59P_?!xnB_F_er$fBA7ON_iGcdc2-K}$0g-buvP%vieB5M7GqC~iml zc2?r@;PP(om($`uqN}|Q?0%qNk$P+6DPBfw))CY1~=x7wXW9<}@vnRD3 zF!=!51_U?)jI^ceH#Uct;??=kc5)y>AxW0K_-rDq0PP)uP)0O~S&C7|$VIQTi6DMy zO()+x8Z7YP!Xg^P{X|yceHTYSgnOsWWgyAHVGSbx@l(Lb8;Y>cJ{@WtuEOV7p zkn=v;&3M9WXuNKfv2j6TbVx*sNSBXj&!C;hYUh|`D*TWJDqBWpPH2d>b7h<5 zrdOs3WGO4hx6Flo4cJ-y1cm(9D{W=<%3)L-yedspOq5xxCW#j(%4Mr^#K$ec8FBUib<+Y}LCYlTl!X>#oa+Z3ar}6 zL=W@f`~zQfz+{2_ofA-oQKMiS)FzKqhFD7n@m`T~mMcSm$_7`Gr7z|sUGYfJl?-ac zV=z>GE2P(z@@uj6=HjGR<9{tqzqxqutMLLvCcT=H6KJE`O<4Z6b8mvn?XUI@#{I{J zeLLkZuY%c~GGk4aI2bBNt;tEL-w7cg@o;>PYOCswUpBC%vdZq52JLAY0DIG#XX5iQ zr=WeXNNzZ(B^2@`dU=1}#KYyezb6M14Jb|I+LTaYG2s|?F$2~minBk}Oj_69;LJSQ zbiVKiY$c`_#~{9NnC1%+bb03Ex!O>rw!rmvTJXXl{X>VE&OZU0yRxf)0y`S;h1My2 z4gnfzpha}jq4LHT-@QO_{i;u~Nkkp`m5iyV!}U?R2e36qnw;m4qhfau;5yQvW=OpO zdl}`QAn|xGXma^3<8+Rme}SP-$BJ#Xx6>?XFEpN@hs8M7mQXMr^%*{o{KVh5)YGPVzH&~L>O%hVg0H_BhkDCbRDIJEF{8jO$TW~W^{LGI=N9KSRF8lbj|3C?iE1|}(FOv-Q@z5!VAa_c(^A3S;&V=Md6Po&U~jugY1lps|iy@fcnjNw2@qCMA{bj%c+hu~E1MGUyQ5c9qAKWGS(8;3$7QiV3{)gx* z83&5?8VyXTN)>VDYVbyejc$k406|IE$=!xsg4O=ClON@g9YBOa`$Vw)b>*w~xkX&P zu3ST&F%oBvu_F)w{SYe?EY5>?-?)cqPVo-gA&-cNK`fJ5OxKm(yHU@0T^Y5TKW;#% zL-}|&pJ=!b4_){0A%-4!czzG>5Pce?>b_yD5oypx#%5ep-rK`11~9ICxretiBmlE% z4}aN!IiS4q0Uy$aIH2D>p&!Sg<+RG+=L(!CA$xg;%#P>+?RbgBX(+seHpn+`*9<-t z@Q9C4J$F+#XJipRO~DY-j~HD7BK^`2FUEQbIU$(qrA6ax7YqubOc@w3l1(LTuVEiZ z)#>1eV01g+2sqnJA&_DRPW{>T30fFc`}WpE*Bt2X+YT!d@OVVL@4e#PPS1{_-JV2y zDaBFMR5LEPT1#;zTdGDwm;nM9NqlV1EIVvRG?P!lrUODPJPu_eIKdF+#s&o|7Yvve z14%X@fTJ-9W|f`6h8ow+SG1i9%~WGF03$D#C7Ex9GDRM6!^={SUp5yG7w zn)dK}Ou5!d3~qsM1)eA16oIp7-wx|>&oo!l8M1UD!s1(sGGVfi|AZ*?a#d`Y;}aP> zedJ9~u$HMafom)R++{+;g=F4qV2U>r93IT8qR6$`XfAsb?T_;H0}&(qo1ki!2V!q9 zyYN9aDznNm)r=HdT?UQwueOiVg=jSBKQM6k%r2A{;dgI}%W$kR&dn=da2su9+VBwr z!8i^Hg9PcvWe}%XLGII+bXCu~9Qc!*?%?7%ZXQ0`7mSKThb%NFD7ca#AE786XZQx=JT~Z4|h*P*+*+DK>JL-uEM5#9$s2Av=5rl1cHxWTm%7xT$|>$1ph>?30i`tAaTo*~ZK#b-5S&Ffe?SOh7%WV8QjKJ`ne7aMFdF)nymE>QqqQ^7&vG+tP(>}{h~G$`0W@I=?G_0KCPqp z4o*ZwX}6??1hGdnvCW6ruy!q0XW@heKYgaC z!MLstmmJZ3zr}frWR1y8(K5^%$bW(tA<-UJv*KSz5&vD0%eSXd&b*q_J`v7OC7hu2 z6X-TZh5SI;qy%Q{LbUqH)pLdd?q$0h>@H6By(?{mP33Cfs|f?!(<#*zJzCvsr(3XfgIN`pi_l(AH+l#N{JYKaYe+m zVb+b}C=Ji;8$=ru=rePQTOf9r1MQh5)Gc54?czrOBa`tyO&B!5O))-C@or&T;0}R#n1iLlUNgSIRplh zW9*=KzC|FM1#jjFX_$v+LC1zRjar+| z0$)h+!|r>*UB1o;jTc??3$tRUYx6Jpi5Tx(eFwY)L}>hJ>~A$p_=Tunhlz%TBw+^a zIlcWuWyH$Qu=3OJEyic`4TDffJz&=HUQrzG4nf1zAdPjP(G_Tvp*PepNlVZjAP}MG z{jHc7-;4=jAf$S&EhG{HX(rYs8Ww|1UqjFctM+p|5eyRp z%Seo1CNK*+lLTE$RD5>da4V@XOhYgd1=^OWz##^HF&}ZF7vW6a6rYxub$2RdxYH(8Nd57&& z&r_H~0-g~rfmq0K<#v+YryjDongw#WJh+#!okY3&-+obs_ymV6~l?tkw}KrwN?5BULrt*=yE}c zZLW{8;l6y>Wz8ZnoGT&47E#VDnoY)<#-YV`+h%)Xt+S!Mv!TtiwS&c}@RZZ7PSU^v z&v7V%CUaEA0;$RTYm5akKuWMq?8jK1wK$Zz#8dx~S@@{LX7h|UNFjk*; zW^1YXC1}x}g!Up7J0gkF;`}4NhWTaFw8(c6dmy)fl<(v3>%IZm%Y`3`$A6Rq8W`%QA z9^LW)|5SFUc|sh&Dwoxa<*VesYi{QiGJES@K1Tkybu{lMAAIvCaog3Jf^8Yx(DA1x z>8$OSNDDWu_Oxiz%3p?5sxRP5eiUC{z_$u*$> zGxc7eEU;eRsq2QOccy3`I%b&wdm!@W!t>tcn*a&Y5K}qL7%S9;tQzU35zkiC*Da(| zTeELm$@-Gd1V-{P?dUcemSFfzr7ChYf(8XA$$l6?3$yYB(I)@N%$(7_t{@Z&uAr!}aDH9D?x}%pH<3vtJtI?U*URX- z9#wt?^B9+m8aQxVP)@qMNE^}RW?V=p3iifeu?d5(u%mdlrmw^psRDjY>iiMZBf889 zVpg3n5zPg+WU~X_9aWI}X_i}8diwq`6zh5d@~3P~XK=4eQ+&cLK%;ai0gIE57$z@> z7^dMMnzU=Sp2Km4tux>SKBo<1{G!cOLrPh!*$a0K7rTOkJed6ot*z>EF0+WWvBx^MACZbcKb@}{5_1cm%8yq0!hGILOryjhe+Ez=plM~ zP4l>m=_cHEr7VUg4*E~n=XC7fx-wtu3i-+uD<@I-yE0$9rY85lJt(a$c%P1@i3Qqe zR^W053DD?Xbvi%yYaNtflQcTz;V%Qds!8EdFL6wl4P=Hz>&!q5*!>fxP_hz^-G2X{{6VqYiu z-k$iH5${)WUL?=$b{g)6;dyk=5OEuooDtt<)U5j;hbzO*@&V%dHD&c#o)_LPo%VMw zk3F3!kB;O|wwmxWf@?@6NK8+F)jnF!Tl1tM9KGfuO>II*=okDr2vRQ65x`tb$r#NG zoy$3AW&?gg3VAFNy$2G(|0oe|^Rhw0|K1#4e*;c)eEr#}HAXL$AV3uYjRzRJ6%lHT z;DJV|e&D$|zJ_D%b!% zh>uuIzpE(N$wgR-5KHYjjC=tM zoN;_bcpTwF|IBGj={TNei%pHnsPTN6b9p#8iuR|i&7KLiui3jTg0mw?8oVWECz0qm z(+mxa`rlKajT>^OMx+u1s9<*_X9GZ(-UI1|3alCp24I79#slv~Ep$4~a3Y#@B7pZ> z4lSaW<_x5V{?<6bmw+jPO%3tmp4O!hi^d!#&g^I`P(}>Q0Nz`G2O5b*eR?Li8TQO- zo#QiG%i&TVR#zyGP2ep>at~$J1l~i`T~W48;C+&4*au<3%0)^?%0!xs)EDvggb}sz z6Zr>RJm0k;-a)lleJr=#a*0KbgXR zG#I?;toGx_`4BF8cCAe+<|Zz#<|r9Y^0DG%jG3R|A_}vWHP7KHmDtz5cEeo$Jr^gxRo2YI zOk5VN9Gu4ois!#kEc1DqW$U+?Tv#Ycpxw-?)Fs$bP(v5?=+uPG{J=aqKl z{7(L*GLEv3l~<984>~E{atz{@PD&2`L4jD^Ntsi@ukb?U>6f^Z_fY=*5~_AovMc%B zJYIRalE1{SC_#$=^eJ~O;`i}GwdIR=8-rMFuHCSN&o_u2EtQ<*{26L}Ie$qQB9*+C z`5FFCrQHhDT3P$h3jSvNY(2KHl0 z>ni?d(fO=0rwTM$E04GUH7T#T_-OuJEq|4F<$RseeGUJXPf@_8;Ub}4X6>_>9??FLgZjtGf_+=WUvgydhfs;La^QzE#l1Q5gAe;VkKe~x zS;7CaLHv>ciha-@ms)%@gm^=H|f@$gw>;h86ZM=De_7rdJm)>^z1!CrnvupJwV(EVmHBU@VbPqADbjO7@qWDxin%CYtF|C+tbmaF%# zaZUgW>v4M`kkfM}U2RJ{7%dwP&va%E$6$_tl=YmR8w)x9zsUcd2=|Xt{tac9K;PZ0jjjG?=kExN zX@=08@St13^KSubUgy7K;Evz-;Qx>TS#|VHaV|?19_ueY$B*S5>mhzgs5y2lgD2S# z6CuaqXY45+hJu!01sd@wXFHBU@ki7o9mj}F%8~_N3>NWOa?Ka`J-saX5whM{^2!$l zVpJ>H|HK;6CQCLTv-@Plmsm;7GX7+L;WW#!Cv(KI&T{d|HR71JrpKvBAzVr=v1@o zbcGNrV`RbEk3?x$O;UZZ0X>mv=eLNm+vJJ!C&ZB3YPMZi#>M&cn!y*N4Ptph&G^fs zxY%)2zIUb2FzIxYZ1r8XVI=bVzPm%L{7f$RE=d{jI?puBHR1UEb>1s)Iz9qoMexP2 zk{hl5SZD4h zU(efGs7Bzw<(TWV-K+L1G^cDz#d@A%>5Z!vbSh>$SloGyy zw-cEsYO^-L14+;h`w>WF*11|hkOp!s22Yu>k>`s|`;~1Q`7u$@LaBIzZ@|$g_6WI~ zcwaF&T$#0rpAais)QXo6-+{O3RLnZ5=7t z#h;p*BCj_!t;aL@FGZDbLl-GoTloC61-Oq(2LRY;;D@}?517kHg5f<^e;;B}PHcgn z@}o)lWeavQ#o`gvRj1Q|d zZR1l6QJd+%?cn>bp-RqnUKpH? z9am9hZN+vT&yzmZf6@-WD!qXkrb7r~0wHu?QmC@)9lptU1;1yYxZmMcWyubnD(($a zw(sBr3l0EG(P7daLZ@m}eJ|j&DKizL@8E@4{6xP&z^eT$(~ta78J(Fk7xV=;okjGCjwZ}F*^V%md4+Y3SG2CD`k@O_bB1d;FtIrWG7!T4=MzSGIAB9^`m>yRFw@&}<8v1=WHKH#9$Ly8g|Cl0%?v<8n zDPrJW+51{jk{igUkuD%I6I8J(Q!>v?$uh-v8=^f9fm-yjS7D#o?V3l~jj2o>$ z=d?5iDm2k((*6u(4+xmh`U1@Wr5_U}H~pNH6{=G~KwP5|i{b`U5jgR|O%DrJ3m?rz z7F4C4J|?gIoaX!<@pB5qpH9Wl_-g^%1^i<=&T_mP!EK7p=8H`@a{1-9v})k&)^SDvXOB*2 zrcS3XV6PvO7k|l$9}QucU_mIHWWw4=hiR81WlmG?j4Hj>Fuj%|rb?X+%HT%pQ8nH} z(Yhy8u4qacTdt$`(a}p#`~=YH17i}vbi9*jKhg1Wfk!_+UIch&%zOOGfe2^i(SOy; zZ2@Lc{?M_dFw$as=+YjrjMbq_$0A!9xpY44diJrUAMpMn`Ir*Pfz!27$>N9_%-N%i z#e0eYEZEKd`-ZP+*IDsNvUZiSE{@phc}!W&u`FCUs_f!?rs08OP0F2u$F;c^6=|@x z!!Ctb>H0U;#HcFuZXi4%_=C=UICffy)p{f5t{E%#4&+;rjv$>xO0U8`Wjfqi;0(YV zAB5yUnhG~V$iVKU+}ssU+|KVpmwRR zxY>+juVEgnSe8dnhx$eeP+4iv20!qjC=G7l(=|Hypn(pQK@lGKT_KHlpl}!nHb0ZS z1T#;KV}5Iw4b#vl-SceF%s*xx1U>A8vMhuz4kpJxy->*th1<1#uQD){&(vYHABFP% z22uTGZFB?=HpHi{gE@Z<%L?*K$SaYKyryKey!ycaK14uRoQd| zLY$PUe02oAX5}Zf+mG^#Mlr0icEbriEl9Cq5Jgd?GTzOv)SiywBRKU)sXfDAR`O%` z07KE?Cgu4U{$R|io&EzKI_#lCpZ-VgCcoon)U`wD(VACe zJx*(bxl(g;W6kC26m6}jRC5mKH{CJTv2X_|*8A9j+AFQ$&Y2Es=cJYDvi-G#6Zsr& z=yR<}Ioy^%8LWHm1C#hH!;b)doW$E2X5!&IJ-q#6lMCZ;*u|7*5-) zIBmQB5ogDdb|Y0IE!5wyf24?Xo|Ci>Y&A7iJ?GLkN%V{lb(o_UZJK5*sx3(8<2f%= z-n@yl~S%cy@%Lj?D z-P-A}so*kZ1=_#=vNB~PpB8WXg0sm;gOK(g_b1yIwNvW3g(qd6#Nv*W`z2?6Pax=t zWJGcSHua?cYkw&Pl#{-_VRz{`8p&;ZS2$Y-?i6S=cIXI zpu+DEfp`6+el|P4)?DJ_4)d24c_$oA&2yf^P#c~

OdsI$Zc@sf7nSHM@TvZ^Q|W(&uXA2Hk8{j#{OM$~XM!!c@LO2~o|%p} zxdC?+kO+q%-+k_XPk}aW$eq77P6fpvbhZAsMsGm=9WIs4xB>U%S%2LkJtv$2>VKjK z-D=(lF|hyi?_o9&BiLIyJYSd6RrK6;2D23JfihxXH}H-(YxFr?QUs5MS*CkZu^2`A zjp>(bAGyk%2C?AV+J+x^fia~oej+At`b)o6Xo43-!{$IRjSegGFVv2`&a;f-nYWf! zh&=Jiz)rJ~Ir?TQ*Xh;P)fS< z3F4hlGM@%Nndtw6QS|Fh)0sqs`WbM+QX#r^@4r51dm{a>V8cM?B=)x2OO z2qhpjhu!#mycu)5Z@@it!#mYI-3)fA*|SF1c|)(RgZP*mkS5@LVFLb5gWmAu)_w-d zkRL(1s=pJ#^}u}#DZd$w00RW43%K1mv!t?B>fgRD_tw_k&QlFy+?m=ly}3y^9m)8* zF$ueGJ*Q_gp06YSqjVZ&lnD2a(h-#1D&2tZ{6hjaApQ<7|35SwsCTQz2^J{#=e=$O z{CDqQptfTl{)G_lZ&pMpN}1me)6wv?a>|VC_I&`Ki@e2~Z7Bkx zdsR7>0=xI{KNQhk%redVr{9q_m(&j4$AfwN%g52CejmqRhwBNeJoXJ`%7=V``0E?W z_aE}bhCL_X1%JfLMa~_xb4d(W%$Q@r?|3FvFzs`X&7hs^E(W80kz`+{+gi` z9zHq1Z!;KAH7P$GK+)BcP0H;D@h}Fp|9X($Yxwje{QHCaX>NE5W&dAiXB!*GQO5Dv zxwGT+?Bv`!X)&ooopbsUzojt{85fG;l!Q8NT8wF_18ID=F@BBDX;sDL4wR~;GObli zCJhEmaOxLaDImjD;13j8LV%^F)S(3Yp^4l;QG}vmq<%;!zyEns1%!me+Q0ojJ3F&8 zJA2+6KRYw~iPOQ!kC&gNI4ODZU%-?9^?&o^ubHGhOSPyO{VC!_Q{SN9IV1m4PoI|y z@!fBxi(jLQPa#t|Wu{zsImNKe{j`|5rRp)mnZO-?o&Q0vOu4_k&h7Unfh$@Fiq^cu z$jZPxlbHo!=1=a^3qfIeE@n%EqRhCc{r8{OAX6P>k)}%I?x)VHh)ol&?_BT|d)Gwz zopZFmufOF4E&(!WF z$b>VC3fZcQxm-8GT`I9peqe$+=HFWRi{vttk4qn;k4>bX-E4mvx^7n^_ZE1t(beB! zA4vWMdl_;*$Bh>%p$6)p33?#~LtqaC#`470J_54i&;qT{2MIXnZM=#05a8Hb&0UY? zR)*Wi>*|94rQpBqaKF97ZVfT@hdWqqThj3@c5jf=mgudnu4|6FQ>AwMoqauBt%>T2 zM_c+5?LFP)2im)h>EpPc?e6IAd91r!S(F?q&-|8^94cwP&b?D=f0p#=Od{UZTupEI zZSh2Bdv}LSQ^AJPW#XWTzDKLIE$!{%S#@h$HBT}!s)*V?g!cA#y|0PK6T~D9$CvJa zORrI_D~r3e)jpJ-E3=is+TGo)?cMGDk1JaJBlYROm)k2auab|Td3zPaoiKV zFaS@(FpNCsvRmx)>ESjT3*5058&ALdCHrpR=F4n}%i3Zq+%H<~X?N<&wraiJ3n7=( z=_X_D-bY7dc(Y0Kw|r(#${5Wn$0Q`?rmq^a|1bv2`~WXK!`_Zw@?i=e`kL0)EbNcM zhoEvmhb&6(?Xb~k^4e>hL!(KvDAoSJnEn@-vGLpFaGaDd#&+}s6?l}Rf8UtW@6knk zl+MLyB_ETa@6tJdeaDU&6NfR!eu#mVA@+?zlz8v4%rNee zsX;}prw$bjo+ebpJ)NlN_Y9!o$O>G43^D8(LB*J78Wl61Syaq<=25ZWSwzK>=OQYW zJ(p1tJ}Y$nF+_o911e&kQdCrVYEV(@sY6ABrwJ8tPbVt+Jp-sXB9g2IJ;SIN@rSQwy_6Y{irS8JV0-j z+Zz8D>7%3eBSE&F&h_GWeUV1r;!AGxi}rVsHvHb!WSNheRW34aKN%FdJ>#|_uZk~J zeW`vBZg5YG+f7+_Vz#=I<91_Yi(#CV$u(Uj>|PzW-wJMa`zCC2{ymvv(f^RBqQJc} zVQ~m3q$_bhnzR+n&K5SS*pUY+kMt^Qu-C%% zkV6t>qs*lW|4(#!ZwD%9*p#`qC+&{lm#%Ee-nhDuFcogA+c{;wn0z&0AQKT4bw3rM zvWMAH##yiidlw;jobLp>n=TLs&_=>PY_rWRqA&<L}wjfH^9L>sgh5+O7)}SJu)|@vqj>CKx!xlQ)gCx!bMSe4#7yWH2{DAO~*=BQwDfj%^@v_4|Mp%@?JMKMnB z{0|qFUwviQg|rweyR=gt)LSh7BvETYIfE$%m=SC!c9Hnn`m7QnzCKIDi>>8KpBEb> z3#LEY+7*2G(Q-XZdCFK4=Ud4W4viD+G;kmVWd%J1dYHa}JcLhzhP8uCN=d4JEq?-P z7NzOfIj{p!@j<{+h@D0F&#I@lfZ4E#s^*E7_|D&TfzlgLjV#Sk<_~ki8LNEPAQuKE zHEZ2~RRuFv9?Y^T0vHP%g5&~4h`CmZ|k(QT&!D`c3e5qbAoA_W3gZd{iZ9DZ-mU_kkV)ZfR9R{H_SmrrjHWU~D zSdnBl^($Mki?O{fOKqDnk_mQ)vtapNA8yziPJEL6ozIT?aCY=}zCX$HnP>Hee76pg zr5Z=yGNX89RGX*?xwC$sdWfsG+*WN9*Nu}{J0G|d{ajH0eShTg#XRm^T%91i%* zeyZ3NhOSo7y*M23;YE%z=Ae-^%hk!Ce& zrHbua{OV$zPm!KIQSnGihb-&tnCXvr>YV|I_kXY0wNR%k@`uAnL9NxucN=u(`{cz2 zjoNKQE$P_|R}k6b*z4j&dtGevepf>fX#tuEp7`51Ge3#;z>XBKQp%-X8Ky^zk%w9xWjL^HQo_c_{^)H0^ zG0K-wnPJ0Bv=oiRHEHCA7NJ-4ugJ^a<-ar+HldyuWlTBlmlpN7oX!T&4lKkWQd}$?c&m?m&)f z_U1|O3pDWZpDOSv=nJq#K2&9hUTw-S5Bck85s_$qSc{%*TjaxRuewur^rY?`VG%1L z;vjOO1Ga>t%RbSo_={fvKSlV8f4`vg;w4UXh z4XD7#SVnRkVZZ}0K##uH2Wh;#)KKPE>B)p_iFvk;Es<%`m3W^mGSO_d4+YzxnH-rl z)2-eD^(5;kvWKOa_*Y$!)3H4HRku*tCCbXV{99BH%42m@x=gdgi{nN)#$s{jlg0w% z1C|!zBR7kLPFdnY|K*+n>*newi=#Ukm*2;iInfEm!u#3FqPrRYem}c1I-%j1``Bb~ z4>rYZaGEufXUalrG}*Grn#i}y@2pJ&w!4Sm=dO3<%S{^9+YJxAi8xuGyWWy*n?wh! z(c<5r_<)UwUj|MQLecdW;7iX2mtl1q_^N!TNi?4&KW)F{qhpbjtCRdj~4X=p^uZ{$K~a7}|e`Q$@dCknIfbrFwr#6!n+*&?Phe-!pd z^C#t_O`6NYF?ydKi0K3?8rd^pWhz2ZwBkhDdOKbe=4Hxn8sY zqy-1b=VFdzwi&L;zro!ZvM^R04Y2+(XJQ`CM4T^dv_U_u&M<}o$!2d_#+KM!BVjBi zPFFk`|HluvA z;Y3*rEwghlLXYp;FpM%K9fP&F?-2JJ_`6vf_#i}>HN^soO;CIpk)(_i|EwiCj6_$Z zPi(aPYpmxv<{65$+CFx@kAX-jk3nJ_>XX)gCn#HYQ5y{d)&2*2m0&Ftx=z&_y&R&-tPYHD@FwqnmZ-t>shAT2enXH_PA#Z(x42 z9OGq}=^eJTnSjilW~s(gb=cZy?j6_u!B#MW8fgF;3G4NW0yKO9+JGkRE$JVZ4cRilA?A&1f}u9y~K(05%)GcGp-WG7U%g3bG-CY4@;NzS2CjaWYKQ!Nfy| z@%HD)tip2tv}Udv`Cjv;_39z*uZaBtwS85VHE-Fl7Md=Dvm6|%XKDkgbDR7zI#hOy z4>JzDzrJ$f6YLrHvB`rxz^?XiZ%-;N3@dhBm5nU3MC=x8I)1=uXi&F(lYu88THhZ9@Z#ja4+T| zZZMDu(8w)8I%>`i(EluIgW2A2yC4j&KxRh-Evr`hQ73m)T+!$X)B=?{0g2v%0<+t= ztO^HeV@uLWjOhLqE1;kk!@3!BnjTe}X{GOev9lxPa7iD(vRG?cm9 z&Fb+~sWjfe%Yl;PNaqVfhQJW)NGiTZI8>7-qaJ{4B*OivUo?1Ivrh|d|!OQJl?8?RL;g9L_2OJ%EM;WFUSCBh{B`!Zu ziuVDHf=APV+T6ONi{YDQAlgp+hVI>KFU z8pMzaM9PW*ZVfZtQ_Vyz6=}{xsuvL+2Y4Hba)Rw;QxKO2el>C;w?^)b+J@Q)(}=r` zX#E(A^D@tN3LA0cg)t|S6B`?kP#yfS&4wi=iH|~LV!C^|xGgb3YzmRx+9dkZl*JfU zd8LW5Lb-V~Cyj5@E&SKp7#NyAKLL}-N7c%Y+BEecqq@jd@Ut~-ti~tr&o0q6DB{67 z>^yfD@nZ!n$=$2k*NM}nvLm)WMoS&GCy7jI8`pI=wut1Xo`6AxK&PXaGblNup? zlA`-j>x=*=k`_#ug}oCDZA6CmEp{0Z$5|TOGLBK;mP2tycC0Oq*nl-an)ZFx##nF? zW2f877m^Zvo<(6!$aj(+_c@GVP%eFvC-6e~d~ye0$^aXpEy-~Wum0jK%?WpDf>4_4 z;8n^WlS3O< zKosqsemA3CpTukK-M`0$-0cX_p7TH$0~5+b7B=6xjBD9Oku8h$+Fir+j|F7$dvL0SU(aDaAhERy(;3(hUsqOnZ}fv%b91KF*gS z5fRg2I-f3Ab!aZ2^I(V7{1G{>V{<=BrWZOnA@v#FO!iHUplC~{4g9+Ns7r)9x~K4Q zM<0>Db#_OONgdBOdjr=}r}McaO9|(8p2$aeV@zE(@b=!AQ(eaJaQR?YclP7E=7^sH zu*J6oZZzfZUJ;^RO$t6RF;a)j2oLvGs`3zzlNn!$os(xNp^ zgq!nX9ZsaYk{-@S%Ux;Bd6IOcJrK}G%P&tZ=pHK5y7%Jk`WEx}Z5ndlA zLmrIj)WmJsB3ENjD{aZL3efKtook4&4;xVSD<)RzPn3jIu!GAwlR96y;<4t50g%%3 z#Xsbw?YeN*pH(t^lR3nr*^Brzt=A&%K$!gS!G1hcHpqw&hf8Hb#zb+|U#`qB`B6~| zut)#*gPr8{j7V|JUxqwnBB8j4h8f?7LhmplQ@~#KP&ebMI&AWpU{^krZk%^NyIZeB zi%M5zBy)or}_R5D7jLq(6pL#fsM@Zg# z2x-je9n<)xdyRK@5kcjTckg?%D$MeuMiIu!`y@*C_YUE5bY{)lnXIwMRfDzg(d>|HuwuzKdZccHmG(!eVSTdgaerX>x!qDhE>LK`EXWp zz(~gC>R7+BvGUcdhXSy0n@dF>DvxI+56o;(>@u(dm#{7Wfw<|g_Z5x;+7`R~4U1g* z-HTk2O(Yi2`DMX|-DQ4Qm9yQ4aB5QEiZv9t;&&IgTDvv&t7vAOVVu##(I8Ov?fXar z-25P)eidzg=dSH*v)g8#rBz)Nl5e#gE!&Fogj+LrU1*-@sGv={3G@tT_cl0_?c$)- zR^=L0-%_lCR^!{>w!p>P&#dsbz2e%AFr^hqjf5%YpTT`^et?v+Y-* znp*g3_tqEvvFJ5W_p+XF)kk-tTF2t80cyy6H4j|~v*9HJx*8_84sM4vu!8qw1>p4a;?v<%~l}R%$v+j4r<6X~XN7!!aV%UbH^)EGD_ zmcI^Y82-9D-CYktvPSvafQaydKZyyY7~|jXi;>d@nvLV{XKxs2;lt#o0~`5}-U!)u zZX;cPA0{Wv4Hp<~mO+;AM($LeW4&v7j5dtytFrH)P~QeVtkMvU@l|PIy9A4b^`3*= zqo_vOr%LxN8r$XWBL2JN+{a`1MfvXIEk$s+JoR{t{W#WDUWZRk4#&4F7;5O6u@s)j z>xHanCF&X*(fo`JtXR*AUF%WPx-18e)7jcxNRhx$TqTz>_q#VdBP-a8|95BEaKhz(v&?+w2G8dvnPtx;j%j0Vq8YoSZQY~ zSbn|>r#qEP!lh-1S-c)DQ-_#CtP2Ed1w{qShlTBu!-jOm71hciCNbA2w+*p~uJz@K zA^Yv^p(GT;(#J+aE8leiirRu_0?%_wknh5&Q03S(M@37@kS-O{@?GQtL&2k2qM4VU zmG3%$x~)sqP(8wzQFcFLh6zI)=%u~ok8 z^JGS1C#=?SWKo7gnjMj7m0b7geE?1rln**p1L`c^q_*~Q&y&@CR+?y9#l1Ya6s+=Q zqw#3_O`ZQD3~B)*L#Z5Ds0WmV${AbNaPY}+!O)(&O77(Pa`CW9`VO<0kKw|@ofOIH zX7NR+>^96SP}J;U8RAQWOc-eqGwR9SBfD8v&?O0~o2rcVS>7u5RIRi;Jyo0wm&=}> zFZzed`6C*&+g!7_$6ZFyPc&Coms=6;p} z{aNMMweBdbFRMom@_hv@_79`%J<1&ScYGFL_5_qS@7&a_gwuW4q?N<*Mr9nFLYVqm?P02N%f+9 zxoJY2nA|{an4BP6jgL3JOw$_ta|lWihH?*VAV-e3h@Cn)YkW7+wSn9}K0`Fp$&d-A zX8(jN`9Eq@D>TLftzZ?_E^NRU#`58q-j!v~M~e$WmgmL9ysU$1=)C03NthB%fgtT? zKf^hJb(f5LZoY6CncC+!jO23R~y1Q=w< z^A<5d$i(Lp#n1I+&hvf5S6ps-J|-{)%DVss6XdDqC4IHeOUeo^rvIc->WN zh1@>H=8N;zs+iwo^^~_F@Jt~Mt*?i#9?6cn8;u!mMa$S(hs3)z^4hGVXa~+4XnJ8- z`BCllg4y0v0DQ|HuQiD%b<5mc3}EliDDI`#nu+x_a`kHorWZ&g?N#?J7Oka8jlP2{ ze=W(f6WxYJ{?DLvX*>@(73CJ7OH0?B8ksaZF6gNm_)qTRR{HepCY_5RN=JR)fW~^0 zWOA1isc=v$pkTij8c{6$V(93#H`MXp?&&^sPoT!*@)Zcg1j7Xyg~6Wv=k!d&{| z<=Uz~Kh;*=_FEE@v=paFk3zyd z3)8(J>yN{I7Dx|F=%mRzuqbx}B4Wekx+P2aQ?jdyFfF%(f%jyz3~(<>ajkymiX5X- z#i1*5of;{AtCk^4Genmwa?sL2;#E+ z)8DMN{0rw?C#@g5Gl)V4`dr+(I0{|H3)unjp!ci5O-(h0CELhfMA%h%^|!Q-N`Qn1~Km3>!+%KYM#m~EFl zJO-gQ-9bftc)!$^4NK9l}*&Ea@(1*+HGgX>ha>WO1W)yoVZja z?I^&hi6by}0$AL0`JnM>wRVkNc;9K3q!b`IETM1%Kk$mB;ZK6e`Ok6Wx+^&=# zu8A{Fqk>?zI*v^SC24+1-dJM^LC%bf4}ul2HfC*tc)m*ZSsP=#2)D>tUIojA2SB2C zgq*Q9POKGj!&YUbL7kKwBZHv-FK8MSY*|WudS7DFKR7pOrBUYQuf@CE3dB~U9x6_p3Cj;wko;x z?pB>K3JXu#X{KUkV)>4;*Zt*(@5Py-Xit`fmp$loLi*cOhUV%#6)+qkDd~|DnJ!M2eIs5$q!n#17d4E{QV0aa;cd>=bKHDZz%${v= zqRlW_xoxCqHB9z%CW*0ra+Whew6n-9&KS|gU!FkdQ9miRw-*oi$<*!XqBKQL-)=VT zeG2Uym{rk>-RDk8>DZrX0L{Df_Rm(>v8JT1TcG+Kv5!u@3V_C)@?Z16z`<5O62 zj@CxRXb61aC$m3@5g+@>=^u0p91feQEV&Eh{tr?u0dR;s8?~KAE@nVQeYAZqB;saA z#jvNOWrtZTfrUE~1QLwgVKKXxH0be>@PV|Pq8&~seBkh|a^;Q~yEoc;Uo=)iNEZ7S z{P@4%xB3%4%|)%Ol)dK;)dm?dLEs|kft^0To0xK6TA8!cBw*1bkbCs*cZdq0uN`V`toA~Q;?XGCwTnM495AKTb zry}>lyVjER|1<~-)d>vKVVP-WtS`Q^bj)xT*DPm4Z`76;Kg`hC4d2#Qbw7o{hJnY? ze3QSSI~g4LFOkkz3u`c^Xo~)u2AS5 z1)VES8EUIKoFuEWD(0hfpBWm(MM} z{21bw-T>+5gN%+%(fF00Y8`_Y(E6N{9kI4_*Z5I>g67v02nY3?Y2o-!ToX1uSq1>M@zo%jrz4M2EMNIUi5=e*sGodh#v@e4Y~Q zm%}O#A)bC^AZxzuC|*4#+n-Lfcz%F@$KT-7H#vWfa*;3X@tZ9FZeoapZ+D-)q3f;x zO%6K~$6u3k&P>w9HDI##Ogmj9Xov5ciE}kF=X+EAGgy+*l7bE-u#=H9zi-Ps%lE&3 ztZ_VPN~3ED?Zp*#zy=I}Q8+2JmNYr5INvEhD0_^*Ed$CYh?v`QYIzQyB)=)|%!kYH zicfI4^IgRd-bi*j_p6xnOG$fI0@poSpUJ1sKNwZ;o?u1q3$_u1Z8NYQSOX03VXS2A z50|*qU(Sr1cDuG}vULT{b}<;xFQ37Tm`4NS?22=A_d;i*+jqzpE{}o{K{+x}wL{ba-n>6gA@iBbCAJ}-tEOR8@takb_l zK0w6RsM`;5b0Ga3gW6|HeP!vzw}>YisUy93x+wcqnI7g-MT=AAdgU#yvBYccG{!7NvzF=%Ctk`%Io(^M>UhYpat1+2; zwS6h9I1L#urSDwuGXDco5Jw={zd|hH{|xuY+y7F*J%WFbTlya|_NM!@%!%iX_fV{+ z{>b?6!Z1Mf=)*^diiT=KAKpiN*-+i?!{>{CHgwK?j1S^sU_)nl7Ej{BRo`jq$A@w8 zuShkuKTj2>g4MSEe5yV7YqaZ0)V4mN(-|I+~V>_Gm$_%uSr4B{EW8KK4u;_b!b2IuNQJb_yl zVLk|R3iewqV^3rG5sUrE)kHjCOy(@AgR}B+YMG1(WqAT^cf+K{Kf&Wfe1uv;)DodS ze1i8Ac_GS}%~y+GO==s_teYx(2%jbP1*-BP$o2C;l`xbii5E;NXDH&&-*Ae*@emxJr~yBb;%oX*3_60^=rKi10VBkdA>=xhWppM7zoiJdX7`8+># z8~vkawRsCm4?0m`hT-M6FUlE55>1aIiWaeVqZ}0%FUtK#lA6-wO_MfF;It;DJwsld zwMZA_+UV#-6r)!99UGy$aJ9B%!m)Ndj1tZxXfr>}_DkmT3(>Y;(A|OSx3I1T4g;mY zdSKoy=Jb1=_vJ|`ov~<0#X=p}*9rSSAhRQW?*abSes_;!9>H2*xB!@fdOP zyxIiX?aT9?wIMBOV7ZwVJvyx4p27-`j;kg^&lDgZaIdXUgJYqG){c|ftB?iIHO5U% z?hSP-#0_h&`YqsbAvXNBvFCWC1HHOU&04?{#gg-C+X8Me&DZjM2DMK6-6;{pt~uvb zY)i_Qab4UfC6O zL!yShh8}7;I;uK`?^d+h!=jYrdO}WTbyUQ@60r%$WAGNhAc`nX)BUjTGZarKduO4e3_q8tL_ch@pphvVd~9Mh>P%HO7{jIXukl5colvv4Gy3eFaXE|#sZUpMgE*EU(eZ6 z$ecy^9B=_RybX>EvtA@{>m3|(gPsoJ>>TuwGl~!9%({WI!;n1*IDpLnIjb%qoQ?e_ z^o|pDmJO%A9TEG01Hd#Op8&xcC|Ls~1qjauih$1#9XgZ?x*iyYv{yl|1Gj+35gvho zNnUU)cDdvQv#9pc92NAF%QQnlIXAp|b^zigoTFM*gO>5Q_D|#Z$s1?I=8<;DIp8_4 zW5+osPEd+nbmVxT8xB!WaH_DHacavlw0umpy0(nBH&Z^*Xr%%%>nw+krr2=Om<*{_ z>2IQ?e5%#RH+iZlNt448dhT2?2lqvevL7$2ZEs?BpL1DNzKK;rm|mqW=i^ORaYsNp z;TPPpwB`NRW%c25cBLtCpD@!jvBpg95t>tZad=Y?&RZs&>lRam*MAv z5f|_@%zdF@MFb_HbAs*ftAv$&VGQ*a`mH$qY($qvJ9YfFD+>-RA5&bOqwMN=b!H`> z>g$nn<`nY`od|O}*R94v#8gzDvs=`MK!*Y~_)e>@_N?XSeRDCHtsn2)w2sGcx$pdX zXX#cxn5)g(crP7(ov41@#s`K5q3vmdPMdSur1uSF&ZnJx4i}5wSJm4wzy157%K3no z>uH5j5_ZkNBWR_7epE(gid-B$Jo4bBer=f=vV(V5jvc(0U5_80^lbE>VS~)Q_@C1J zm+>9kivLSt#u|DI?Pyjjck=m(PydQmG8DPb)4~jet|uwXid=Vaxa2-tvpUMc4ET`_ zbCk8Ob!L}h(HgiH2OT6d?1FRKhkORt@kFLN@8-|>-pWG*Kc}|r=F@v@Po!h;ta9t_ z6|R4C7MMjf4>fd-Zrxqz>O}EYPrMWH6qkjpT3HKS6hEakQ;+QAK&7m!+tG~`E}9SxG z!&m9r;G=2}Z<}1Nwda(Z+;O1xP09SUZyafs>9udY;Z4_>R!lv%mp5s%mCo~mHdj*_ z2B2pR#=Mn7HeeKIu|k)?pOv6EI)7VsRBQ3$((Hta4u5g(0blhe-IJ_FfM)ZCj=rD+Ry0gY5&+jV@Mu0yUH*da zHFrCM9SYhr7=4vGi?0=(#0C#|#(D5dzQ^rQ=6}Ukn-)Wr9s__EK^O_B0>Zy@W*mW^ zGLe^Y??kfTThd@#uA^+%X*K;Q|3XB3r}`Yj%A@{w&hf|iRJX>;<9vtlH=KHt7M2g- zan0n@&TS{S;5O3s#v5-myjSCTB&hQzSIY9RkC*``tqwI1!^NA8RFY9_5VNnSGe$8> z*v_hvp&~Sx|PU>mPadCY)EtxGDD-Rd7$3 z(k`vTTT|!Tt=E1JV>6T+?%_ouoYsXiZ^luYfn7jn1MBM;JQT8Hfva_RUIU2Fumx$y znK_oNaJ~F}VYxFnQpD=Shu57+jYOcZ>w9pPk`CXdQTpBoZ2k{eiZ}wv{uO2;?$2Bp1CpKln+l^|oUc}=nv33|y4o2RFE;4Jt&8eN zOL0p0-*j$jC4BwFgd5In$zlSRjcXnem0!y-HK{?*(G5IY(AcV4`LCMiBCOe*4FoyrkMO0xy+58`6XwxKGdq{F z11Mc2zK4V2{E%65)Knc$5RFc#bvn#Sp(oUS9bZ?Udf>c?z$7ddCJJTO^Ck(?aY@N+ zMJ`7^e(=p4Wkd1W-i&)$TrgMQuSdBz=`?vBJ+3U}+^o*&d45njB|_)xda+hb@ZoL6 zisNdv4_{)>8jX$M1P{j6`6ga|o$v*G&%+;0bMwb?wg{l_bD+WF|7UpfxQE)^N_s&7 zMNE4Zt`7<+?8Q9^*ywQ{S>o$~y77@?G(B}>_Ko_ZOkMec3Ft+{sB6I4;de79ekP0} zUMxVe%e7iK1nLjvw_vb0jtsCtF0W3ehcu&zZ@?nmYMoJGz`}+Zj=Gkq_x*T%@mY-8 z?}yXx+6r~YkEdIx-8aJHECpr*^MC`uX*@HVGQpYS&-ZhY9OH}&$f1cA5whgxULV1AM7`dzGbMuhNRbUJK6oS{aXql$`X=g3eV$b}lPHc`vJG>5v|;o=WGVM8-aKFdaI~>b)M|2C2(E_z-^G`EXC3%=z2uZ1()5bvo19^y+?vv#7XNU5)Sw-aW|;eBWzM$gR(TsFL?P01^8(Hk1x2=6rZ zs2T0V4c#a|re10r?x=+e z{FTuT>stk=_I6BwZw079b`0k4{MB?jA7t4}j|7XLgAK00N#rR5MjH;J%cyxu1JpG; z?`=$@cY)ApfX)E$%L7!Oe4Y@8AI?=pVe3opn6Tdtj6zyU7Yja7vZIN=TA2^GQ|_li zUf~}KjNmU`;SeSOvK*Z3yU%vWugjho16e(Kt6G!FAs z-R5vp>TNn<&c%i{4+TO7l<#329#P(GGmJ)9;h`YK(e9Y`-Bg%=`l$s2lVh;T5M?NZbE-Ly1AC)~9hfbgSs!elI;LW}&<{x}n2>n9TTQHrU zI`|KGN;6LW=W(;~+Ah!Ciy!oIoba#qRoV0S4H@>yS>2{XwIw${InG1cIq?FG1`9Gy zcFI$qnltpmqvkzU67?gGvjBKKki0NzD}hc?Br2+jvfZHLQ5 zaA*Z~MP{>8rXIv^Vw`f&!SOo2t5$w;aD?uM(puT(v%b0`pff*fX1o9`vv)AI8wlHp z=My{Sj?c`x%{yx4*Pk`fZH3scpS__g1XYLnHlmE{8k4LU0|TV)^Jc9&pe*$34>AnD zKdZbB^<-GvI(!&cY1qe^)PH-+IW1M_xyk+|hO#y<>(c0StkBhHms-+U%oXj9s+cZf zq3(IXl(UN{6qk;ujIJV8_YD{`yNZv*MliaGgKmk?2SiuhkDRIg4~Vt8Pw?^U1EPiQ zeLYjn(-5^5AEW3aSjW`cY2sns3_WxHlqR0%x>&?Ln=aONJ43%N$w&2D-@q?3=adWU zjB?S0&Q0>mw|#(95404Gg`1Ew+lS4B5XpW;^+^iYfbwx~M%Ht!`C zgevoT%+;?V^?LZ7+1s6Q@9=89xRmEKZQ>JsFxGLKFuR1OiCcNWvuv+nKsO#LHMv<>}sEBz@ON0|$EM|7sM1QB0miWbfPfrndq+cMXuS_Hj4 zroUhGs++&Ug`!pBK3hd><8R2QnoNlH-AHeOdkq_Y$+PD>i&C*GI2r;i0!~A53c^b-dG>rSZ}IH;p5Nl$^M(9z z&!;lZ@@3|*&E!e4%G+Z4qN&tipg(|$zpV0}x_uT?j$b{MTE>T&jP#ot$bEy`DH;VN zcYe3pQU;HIW30Bnv0QL2yu}lJ#Od|UJ-_jOeqzuD zr^!c@>xBNC^R~Y@=ja1Ws6*}VBof5Px74*x zVtQErwVpKvy}Y6OQi449aTi_I54E!C{zvVxaLshpWV5~M>WOYmPmOSG>b~}Ati|<2 z+!lJ?4LMqOl-fQn3oFK7)&!5-I{gBK_#xoc_+%;bJt5(u7GW(DNQqtl{^ zhLF$JT6txExZyZtybG8T#5;>JL@Tc19~H0iwQAF&B0{&ewsOItNaxu{#d2NX*><=b z2ClYKv-*mDEi>^$!@dLpZ~&Wu-M}&69B{q8P|x-gZFTrfi)!$=7~$0S7g=28 z4iG7U1IIr*e!`366EQFDA0T!_PMY{aD$SBa^TvS=ANMqcor4Dn8+R^!T-2oS9%{in zQ6g{=mtH6`%r?5I#+7a`5DCNrHlX8pwYpF&RD)j^!&UAe5v$fL5C-KxNMzN2c>Ks` z#y>Op@1(oWQ+?Db7^wUgio-gqQ#h07i)P$e`ntHq)yah-#Y8_br`bFI2|OkMb^}FE zP^$hs-+4v~qrpyh)!zT;_eKT;Z1eD*at33)3h;noCf?WLy9lV6i@z*r$J<)a$k|xZ z&4Er(8&pht4W~wkD|iLhQ$SHZ;sFCd|4l>OJfLP4!zEU2?EvghfR6Of{|TJmOW|Ws z8@CE;5dBtUEHGu2aF$8&TYWpdYy16e8@?B5SPn{9qhTW`VXKBxP{KY9hd>F(G@J${ zoYQa#lyF@`4Jcq|`Yot>AXq~fC?QHiEGVIsh7?dj7Y#i@37HxOfD(pk7!FDpt6?%I zVVWCulpY_1c^Vdh5|(RN14`JaVJj%1RKq?{!XXXEKnbTcoC76X(r_J=P(!feAAN}j z!JvdN4N;(kSPiW}2`L)7fD(FY$OI(}&@dE~FkHh}P{L#l(?IR?Pl1McpoB#lmV*-3 zXxIo!*s7rvl(0|3AyC3G4W~f~=QLabC0y4~Q-b!#KTN;XgJ4iXn1(1&Lac^XpoA0+ zT|fyvHDrPk251-xN*JzTEGS{JhG|>T{?iaB&@c~_ut>vlP{JAw8$k(MHI#x9_Gvf- zN;szBG$`SmhD)G?>l$k8_^1K&?|TpoN(j>s1xkq3&keu*cka z>+n}ARk!29G-5m(!kVMJ%l!Qy%vpVZ9O;9O16FZ8>*wZjcUC4mHW>zx^|>hNBcN2T z^+2g!CkkxOLE8fOSri)wECNQUuE#~wCb?k$04u{-5Gt3mmqPs5YS18n6g5=4j*G@I a%x$4R>hV$NMlG`dMAzWU0(=|7+5ZP`b0XLP From 4a99a1ba4cdbfe6852f707c3cd3c13aed9d61061 Mon Sep 17 00:00:00 2001 From: Poke Date: Thu, 12 Nov 2015 13:05:26 +1030 Subject: [PATCH 137/140] Unified Pov styles, reorganised ini New pref to choose between Pov or Keys for D Pad, making it work similarly to C Pad, C Stick and Touch. Will automatically check whether vJoy has 4-way Pov or Continuous Pov enabled and choose the correct one to output. --- PC/3DSController.exe | Bin 96829 -> 95776 bytes PC/3DSController.ini | 24 +++++++++++++----------- PC/include/keys.h | 5 ----- PC/include/settings.h | 8 +++++++- PC/source/keys.c | 10 +--------- PC/source/main.c | 17 ++++++++++++----- PC/source/settings.c | 14 +++++--------- 7 files changed, 38 insertions(+), 40 deletions(-) diff --git a/PC/3DSController.exe b/PC/3DSController.exe index ec4ea9d92eb0f5f1e7d0e467299458680017ac56..5ff7142c8ab1f8b37ef62c48fca4265769a9d9b6 100644 GIT binary patch delta 21765 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 Xb{vpE9ZCMkn<>VNAEjiAruP2>WKUb? delta 23148 zcmbV!3tUvy_WwBt29Vc`3W|?(R75i+G+!m^XlhiZm{z7H;DgW~A}KyHb1-H~Lc8d; z#@;AqbgvnO8JX!Arf61VUZXN2Zx2SzFiY_{|L@v+pEGlA_kKRV-+w+0XRq)6uC>=* zd+)XPIcKu$jOD{WETwDWe^!(OVT#hAgoi|_T7pucD9XvTn+AsXZqe3$`D*8$k@ ztzb{9H{G}urJ#>P$@C^Kn3YwKr6^mYQBj9)EWX>=3AKG}TsssS@NJLpE*7SZSC6s# zwI1q8wgP{DtlFaeP1U~I$OeT@)s}5!>q7@>BR8_cp?7q;RHi6JwSM0%e!u^~sKihe z77m0ahT_urT^Z|Z>71|&6!*8)Ao#7WbJzX;;!%mwjavq?9E)8|XT_GA;u<%?%9+r{ z%z;q5oBj+O#A+>FoHs#tV}E6Y0-ey3+f#}|6C2x_v2?;hfHj8UPf5JX>rjeqjW-T~ z$sd~8ovgmxMO1DonVv}ok?9YDzSGl%L%(# zd-+xNeApuGl`>`vZ?8RF#(IbM(I%F$sgQ=3u_fU>wAeCM2I=yvY*+XY=ezw71Nb|u z4xV&Or0$lCj-b{Xd%eP|Xb6ZB@dQz(C59qo1U23UFE*xi7=dWm$hieDwb33$awy3& zAXA{|s_UG186NXb(V31VqY|qYM`Wnlt1q*!T8z;ic$syM9ISPJnLQY}K`VNRosS%% zjeCiuMBS(T_9A;KYKXS;MYb<0X~LQvpRqS}!1 z(#R1?%>fHtXqao(6eKA^B+Z)AfUJ?sPDj~0pL;&w=nXG&=ZkCLIT>h-ev$QxPHDRi zeRp{mMFYNycr?BMost3dEI+ynTOXb7eE$XvP5(rH{NZjR6t~yvS_uGNSzQn7HFc-~ zrQ8nR8Y8dx{Y2|ZwFNx5U5~)-kqv0`S}$qrC{*^3{!&e~I$K+Jduf8f0S6J^0CA%i zruu#h$hjC8RX45!P6O+}fS{s~xGM+?O)RDIGHT#gGyouyI`{|yV{cNFJ!MdN|5S*g z^!1+q$7$QfeXvdg`WE_%0fj<^72NdRSS#KY4b~l&jnLR+$0TLZu~E)R7DY)_t?mK1 zZrlpxH)y$+m!VV;T@qhO=Hj>GZ%KRw6iZ?@<8N_%HAl8mIfk@~ITL(dyP4N+=j95N ztvlk6|LnGn6Vs&E?Q)_=n z?e3gU-r20~X{~f+2yO@<{w|3Ju@pr&>{j=yEp;MAF`;87j_zi;W043qt%YJ{+&|0X4SY6?m3CVoU7k^YV^soS%(6^N* zX$@Fik7HSFq{-J^$R!cXZ;S6!ZUcN2Fy(@rI5aT2ftK9WXECsQVs@a$y2tVkE+z3t z*@%|C+ti?@=uE^$Y8XoHZOCIAkFuhcW5P2~RT6WQ)wOiAu}d1cLbO9jW}qdt8WX;2 zy`U{@<+$;2lwnOy(SkI+3nw#+E<3EQ>6lLyHmmEcNR|-St*0OrXMAmYNn?Vo>(s-5=be$>Sc4)iJ+<{ z%vCk0^7TUdJh#q=e?`q&cB$1}jZGV&qI6;16TbzQqQ*k@P3yLCz7kY%x+>^a_c4|c z*W3BVHFTqnn3SijSQ4;>alVRUf@Kn%pUKx3Vy-U_ZK_^wR7K@5(*Fn3sff*$f^30H(2xg1@q z!6JWu!d#~=dJr*k_gO=`5bV>u)iB}hGE@~_hR$^86kdkXlTa$W46VO4Bk)MjJ1pOE zjoY71xcdqDhBNfa}kTei$C(shxc&11*nvPE}rxI zOX6vF^4%wD!ez~OsNs3y^k(owBzizcec4!@sIbV2ZAL|+sJIH7l=_`l&^P^@KzrcL zhTjmj>m9sIbi}L{0CmuAbw7fD3)k(77V{2Xm!uyg$zgSG z@ry2>_{LsjJKFbf-iPYOC(io)7(CZI5UjhKi&GOD$D@~Yef>8C>;>S)mLGqC&jd;~ z6ul%6^%Ug3^k;zRIs*X#)rk+0rFw%bw{1>KEmosFcX~z(RE*_!N3&rh_)yRlc_Yr6zU!`+H_!N zG!val6_ndXd56)*Fg~7LtU02I#CyDbxkre2aqWTFv_ACJS)jVnd=?e253%U zI~KW=a`z>evAU8l;gFURP(_OSWd<$hDsrbea$eV?o#rC7Z*^V7q=Vvnr~^o8o%~Jb z{!+3)4lDYd^k`MV@?r=<#HW6RyEA}Mt93H-{@g-1daKc(9V+K}dy7PSoz7$YNoQzq z;(b~w*7Fvrc^ee}~;hAGr-N1cAB;d$GCS(w9^=I9w&6u$~c|DIzO*XOh#?aPdbuA*B zlsV;I>T-j^wTJ22qjYVT)Yd?!9SzC3BUktR4{G!v>YMtAfJf(eP9u+@Di11i1JxqC zP<7xaGCxpVj*Jm}K!Q1}t#6Ty4;N>3saDnijV>n0<&_ z0vWK4aPNR69o6D2J4u#&G=D|6XmN{UA$}(=EI%%s zO}rsad;1)lbHh!}9(;ySazWz1hO`4Sl+tLv&+}2ADA=g`fu|%vbR9JlH#cIwdkume zIaUxT=a8jth9%UE4k9{TgU!q-WGc~MIIM1mAY7EDz6L=!g}Pv(tF4)6BTFHMB^-e^ zBNd=~l+Vbizk%Qsrck+x=LzZ`?#~`GGxz@jQx5|xqH}pZ4t+(JHF;P~$B1EEnxII} zP&QfkS;$?2nTWQ|$+i-?*W0*t_k6yuZ6X2p3^UBksnpgufzkBa+YlkuGv9Z3it&{Q;RAY_ArZG7ewMrh&~B;?8BVA3~&Lvz;P zAS=fPbCLvy4gm%Sn?OOZLmvqaWmALWgx7m;n`L;t4LKHG)0V;LvzE4U)s^P6%!+0VJ9nfz!b>8oHR((DHqW43B#+{T?F% zI~ndVMBVKeRZ_&Hls7-41B!Ie5mQdw+aMDi2-L2WwZ{JKYDM!|*d2m4OJXQhx(`}c zoe+J{Z}VFJOAZUXTIEHZZ!Bz;Qd5EB$vkRFOuenLcgO_#L4%&H$)+l>@Wd`Cwmve0 z{9KJoi+BnErpao!gORE6-H9a2pPW1jU-^@hCwKv8_G7|HO2;@B)k5MLuR{aP(#&=4 z{UL&^W5RBx=<7jT#8WYkpJZU5KL}>@)7!s{)XmMl4YR>s?>)&)V-}_1cJbnoF1qVS zVEpUHk9}{cjAUPRALP6){GsF^8^dI{HMp^AXkexoGjS+1c$-nkBfPLc_u@t!@nU)L zs;BhAHgM2yN-44(B$Bh&`hutTy9eJ*`O!~OuwDiRyK)@)oYi&j#6~CCowVDU$G9uH z3Qv8NnDA(e<_8R6Rung5SCHd7RCo4u-L)pYuv;(8q{5LdU;0wv62F0_`#oN`2QKiQ zIW;mwH`l}Ux)xMN$T$>QeB%2O;lP^ZQ$S3;hj?3{C6!}<(JQ%ufaxF?w~U{;Tsl6CaJ*5t`l!Ht z$O6P4De)iw4ZlO;hb8_E@tsf@D=W6kitEzQ1c|>S@vkI)zrRG=Sw_V;_W3~An`wzib$N74KI`Uafu(6c%j7i zEmfTKNYC|}tawsZY?TTtB)(eW>m~kx#MeoDxx`Z>zCq%%B;G>euSk5X#D7rnG?m6| zldR}3D|TXUAiP529VN~r{-(r3C7vtsDv6(2A|gRMp>;>=z6Vc7^MgFuRr((6>n+-6 zTU9%C)lt^JSKAglvF?GMKE^V8b#%U;UAnV{0Jg~&S37M&enpq@I)xOT+1Y~^d`}Mo%5$mQMUm$%i)hj$71tC@r1x4iS%~ES0ZqnF8ar~c#UG=Yj#gI)`@DDC8?P6@VsAXL6xZSdjaR9J$HDyi zaS6EYU-5v5S^IQwenWNj?^D3mOiQ#EpF01K;;*Yeh55z<=smp^cnh&8{<`>7^;d+x zEm1llar7jiFLJbC(4OBQi41>&wwv=9&^><=#TT<>-&p|41kUiosagV0qHeNsn95xPL4({(hB&}rAODyg}FIy{!(F_Ijsqv?dE zNVEYS^X4WI+Fqj7I{F}?p%N|C(dmSq#leYM%hA!<<0btWG)I$kH?Dkl9aEM-H`X(XO0HJp!+2v;l=`D~Dj?gbQe4zq4hi9_c<@9S0-*HSnvHqd^ zHOJ|9CBALIfgIon{eZ;xq(I)~$f-ytpy>iC=TIY&=%5U>wH%?}e)wp18x1_lar%*m zuL0cx^I?wAk0yN80=bVP4TO{mE^aoa}P?0gulCNHjnptOpbvVsAb| z7)}%sV)~6laD5roe}SQ;dcM3de2T9NkkSJdT4-E;UdXg~xjgzR;$O;V^9M9J?#0V% znxUsK`W!t(XsSea>F76vCP{R?j{ZWZO`xt_qK6akBqY0>o`U=SZgh}aE+zKKOK6`O z?5!Jlk>JC4T23haG?9~ECv=BIjTKQzXqiA=!$pHX;K@dIIlbQV^)VXU<2NNi*GuU9 zo)*x4-$HMli+N^Dy+Y51DKyAE(1vK%D|k@q7%Cs5vm)ADWd}qtgl0uN=;XF(7_in9 zUpz!Q`TmqgyW(pY6k&x|J_0KkGjfE>uaS%?)`Itp-WK~#iRpO}PfN1P>2<2_BZ2(H z5qdSsR|K@^-9mOby%qOO5uCjop;zy|e%Jji1GD-KUZJtew>%i$OreeYoK5LJv3xSnM^O2RwJ#%yvj0R1e>$I17erlPCs?Dy6?n9DXNKHd1Wh`KGf0vC>qA<=m?t9cn;H` zl(VV2dT3uOX)gGpXrCP^t>%NRta)gqTE^ZOcFz#+dk&@OioYPy{cVBOANMksPpeo| zi_W2QDdW+(du#9@d0)cRn!ewj){1M^+^&|yxxMdI^&P$e$KhjDpQN?1wA79{l!BPz zrp70bwGM=7$Jp=pY}RnuFm9|G$9@`@sJ3B|<5Sc&RYS&q7NT}!krNBmj#VWSUu~z_ z*-i60sEO>3c}40__Q|~O5V1G%#)hi{*@Z<9s6DI3Eml>vj-@a8Mg5cwUOGrU$nuxo zqI%iprL%hd_?1IB9@9vFElv3Q?Wn}G<1x)Bo!Gm=hQmslK$Lpc@6mKMv#RLPX(}9O zSawT9Vm-9_|8p|y@YrP4#tI(m5fumMbn@4G>-*T)mdC!T z#5g?o4Efqy-`!sI-SUB&n#tmvH>>ulQO;hP8do)cr6sieWY94p^yEt^DM(DTzBejy z-1g|NEphA_ce`$u4afcH@0h5oG+Jvo#nuqI|GM-iwo=viBS`4-_i1y;{n;ivDbHMcUew zP*zwGt<}9(^-P7$(k^}c{mQuU_fASvMvs^{NtrnQJ`^7qJ#i9y`OPdAx$OkbOTTP; zP|LrgYUEp*>a27*lqZVBw^Wu3gD}0$0n9FO1=j|tvshkr-v9CHi&b{DJ%aw|A``LOp&A}$aXZ=1lf!4dVEU@1(uI1HM~UX zq(CO)+a*qQ?~y*f!Hw!=!tcz>o|8AH;8A5<);J|aQC78FNG8ej@703mJRUx?`G$Ab!I8=M}+Nzw7(O}+u5(vG@Ld5P7gXp#6~=& zjfstZGGt7wttfPKtUY8|2;050OXm?$>5;Lvw3^uH+xN#tj5rV*il45fLk0JzO67y> z`p$b3k3Z=5_oK%fFykgOPlenbYkM+uOl(|{B`vm44M_=Mdk?nOMnz&24UA?rrES8K*=nOVx*TAmJXZZcM!>V$7to^>o*wD17%vc2RaOp}t)M{t2F&_@p@@KLYAKtI^%x1?v?4(W3W*0sj zrbRr=2JRl$enXDm-y1fRaj~{(uxdxKKfaYY?3LYJEyq#aks=mJ4N)5Pe$LMBzF%9K z!^Z4M(!4n=Z_hw2VGi4}Cs|uHhaKB9Qj43*+Iw#c%fYR&Rbwj-wPOpt6D$$Ae*biK z?&H?%xHnPjoy)Yn_iLefY|7q#nmvy_vv*9Jv^>AR9onD|-ColXbW$EWwYQg+lgHY8 zG)${s$nO8>Hp{dEzdzpOR(b*3{n7ne^AgskW~4T0DVtK$%hJ5m?|+eiVGW83y6 z)8zyt$73w{u!v{;{+t#( zaNTNe)$ATNz4jH&{ttG&Hc4Cc50-RrpjP(}HvQlWnrkb&d~lq${Y`e)p=3+qHot!! z`rCnRI5bx4`4;>6&~06pzlBLjJ;bCe(lDbRj*S>q6B|kara^t_EjIF#UhTY~*&))0 z;N|!p26hGZ+OteG^X{rsb(;FlkDKJaJxKn-W$Y+7N<0e(jGPs_g&D zSJmxRYk!PU)mlQB{a+F6qo3;4NM8*RJWv6pb4uBXBQOA z$$NOA*)lyPv-M#1tDOd=qv*wwR~0)y-zp02#g0A#(UjzZ*-Hyx&W2@y3bZ~056}Ki zor|(VMo)o_WqU8TTX!LH-RVRvNn6_`Zr#5^)!v3%*7cxKjtWtuVI+jQu3ltMo$eeq z7jj{LPgA(sY1|T&>#*F&7qW|=g#&R62u9Wdu?-AHUIvnHAiBSW{aM19xlzq%HH0_( z09*NUJJn(Mgi-(GOgF7^AZt3aT&t!_f41q@G|elD_OoePtth^NVx1^<{4GtZ7sVG) zY!JnSrZlZl6rV$}X&`H8TCOz;+YM|)7uzucacU5bda{iSJC?z%Kr-E6d}MO)a|%bmh}jtq!OSwlMpt_MSSdp0MlG%UelT!zK61T=lR)RP))DE1kn4Fk@_~ zG^bM&P|QTK3C!u6fus-BqXb*ZT|g)w(Ka6vnB}Q#+10sG^nd7xS@U;3YZ?NL)v`X< zI)_bxcFJ%bh1_dxQs+^F!*%l+85y*gl}ZDl1`EM);A(CVMs{DDtNsyaU@5!jdN<9x zg?F}YILq^=d+v%yHKQaif{u3ayMth(+p{mK52-2KU3IYM1{Gf0Mxu{nJgZbSQ5{7!9XyWSYDAQ6q~6h9?A7Z- zJ!eAH8`!)*!nM?qo?)6gSDh?6HxlhSM)J;0B&WEVosS|A z`F8{(>w$Pp$eTb?5T(GB+5;rrgd86NsMG{C0&$EJYUn;b7l0_^bwrPnW29$Gh&ne) z3DYNDYd-OEd8D-H2+x#IwNqFGvYCB6PnHSoP|k%d^L#?>_E5wo&ePeVc2f(5K3+p# zz0xVH2dPiwks6GmcVcjV?gCOeNq3A~oeCu7{$L~*NTCT?0i@1^tR<}ng0(gQ$utn& zWpdg+(UTme&b4%;KC?ZS+R{e3o;#crfpZtMFl#nou1AnJrcV_$`+x|<$GogJs7DmF zso@Ajg@`~|H1qx}lgZ~~d9qMG$;s&n2?)*G))QS3A1tVLCGdmcm2GV3g4g#sm4(5CdBt0h>`3;CYPayiifCs{Jxdnn{_sovO zl&j-0gY+gOt#k=?ny#McST)h(h*Trlp{uQEoPQ)%he)K#hi4Vc&jO8dd+8F-lTk3` z^_+`>sb*m+-E(U+k{GRxl+_4&`{axzGZz%hpEtw1TK9$m9}9wGjgIIOA!W5^OEhdo zd){sZn@yepF)-E++|p;r*pQ5QGhl4VOdEz#?4o3>2MEh?MW5xk4hK?c;@stVD@Kh^ zvabtPoBr1Q!zY9+>0}wM`Pi|LNd9I&&1Rsl$%VJ)&p^{VB2LtG7Utx z4GYb&u-#wuFwXOo6}Gn#_gOwi>D5my-f#x`!vFts6Y@`RQl1lyiCNnSq);LF1KWk&Z=P!jF|l^vR8tU=YW*H8jNfNQdp)VJn9t5%x67= zTOwy0Zm4PO2VXliO$@_f&*_#l3{b8t6Uk;5%5@t}hF}M^V_ISOrg1$jx~=C}E48a? z^SnJ=9pFiBt)}VatwH5paRI!7$_av>6pyl9ls8kkrzm%AgK~-}mr;4JD0gZLhbxDx z13fQMDcONi`vjEg9BK>C`@_{fo(&MO*>ZQQ+bsrM|MQHRFqdyd4nj2-GFkLD7&a!A<9}Olq*HKkjmAfe4WZ(QC{8|&NtE-uqTDRXXHnLaa!-CdmRD{!2oX{^MS@KV zIf)Pwr0_Ed_Hs{3cXheeQ-UYE15A-ZW)g(KQaC|^LkiP+KuD9qHzcG>VRBChlcjKs zgv@e}{YEsABf%p#0@Q`{UTUtEU+&r6OMQo~(^J&Bp5r$OkoRUqZ_t-Y-K!)NN?}lW(wf|&%{CM9a_X@;a=S!FlK6b_SMm%?4Q zLg*=lS`t#EFy=N0gExChZ$lFf362~BFii?x60AH%T|K>15xw-yG*ojvyHZgzH8^^x z;e)q+sG1XY2q`3eGi{bp=}5dd9N~5(3al;((?qQh*r2cXt-TH>+A%E{t@}V2kD@QJxcBfDL}U4 z8$fRTi`IX(Q~MV?`^wXBDD&r+46 z1wP*bnPlS7zf?gVijLr@&?qo*=pV2+ZgTN9AgeUY*+4(W1IocSfY3wKe3PL8C+kkN z+q}N0pif|&?j*z(jLhI1dk|+ikWiD>1|T+5SpLqn6gopoPj`9F-KoY;t=Ocm4b&*# zfHv6F#j}4=RM27i1Weh0l$rYjB-4|1m)hBRGm3W5DH!xs6bF#4Ci)~YfG`E71N|!( z%|`TT*)D|U_cggyae0sS*L>3{;w(?8GCWNLmL5c6Dq7f6ArgP#L2&&FSX z{Dohah?1Wfk^a@BA#W8Um}2#3;SipQ%zt@JBwGF1mrh^oR zsz5vz0x=&f)_M+%SG%+Eun=gdcnUKP9TF#-RxljgxieG>1tQH`K(P>Q@ZyD<~0r@WNIWSnp_&|xnTmj zH4PO@O%-{biKv+RI4W{G1P^gB5WId18uVv@=x0xI68RPgeF8fT{rg!dKmt?cu;+^j zIP_(jTKx&Mtw!P`6Tkn(RA?(qF=MUKGMKd}U#Z*@JfT{Gv&$6Mu0TeakQ5* z^*9>EK&0r{mNg5B#uVa7;Ls;9|FVEI7(ZtnbdGBfkYV5Bjnds zSdV|emB94B3{po^V-c+}?Tn;KYVClenK(UwP?rJ`x(&!!)9e`yq|!9N6I&}Db&}fJ zX)}5L2#Ci`PCX7J&eUKDkVz)w1t9bZxbPN`P!qBbNN+8r+$)}bW7o;;9-eIZpk!hCILw?S?}-ZdmmPV%}~VKK|XmZ z4TPK+3&r63il%of}Nl zcTrJknnJZe97Y3V=1XqQ7G&-W5M;8T3~-%u96_9@c+w4aqBD??923+BP`W8pLx5~B zHGemd22G#98Cf&tFDO87Ox<`8oaF|GnqA`g@O~uj)u<>mnR@{UeFDMR0_2QIxe7>y z38@8g)a2+%AlprI{Z}A%SPpCwmz{v>OyOiu z-UDQ{;ZR0)!R*{zOzKU+Q!}d#*1pYH*BLnl^Ya!u`Zo;>Car)Wyo(Pq{R|L#+Z)Ij zF92BzP5`L_QfT7T0}&rPPTAvb#R}7&?gXuzCczZ zz=1|b1DR&@nb?zntilzZ@UNm|07)=KVU81!-K4ezh+;xqK=ilGWK2=k5(l3^^IL$J zkK)xpcA28EUup%qakA|ItZWnM&%cmj@DR;q;&k-9`XExq(oMl*)f=?xfx*ZSLQIMi zfE2=SfHEZ6Kzc$FlP6>L(m7Z^N}9>?3UHdrgDtNC;&7TwZv{l}dIGP=_5oRM3M4%a zoNQ=ih^H?~x~Z{qWZI Date: Thu, 12 Nov 2015 14:51:43 +1030 Subject: [PATCH 138/140] Version bump, fixed .ini instructions Getting ready for a release I guess? Though CIA building isn't sorted yet. --- PC/3DSController.exe | Bin 95776 -> 95776 bytes PC/3DSController.ini | 24 ++++++++++++------------ PC/source/main.c | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/PC/3DSController.exe b/PC/3DSController.exe index 5ff7142c8ab1f8b37ef62c48fca4265769a9d9b6..e60e4c6a8f3264484b2f8706b825dbf3823f236f 100644 GIT binary patch delta 2421 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 diff --git a/PC/3DSController.ini b/PC/3DSController.ini index 7149810..65265b7 100644 --- a/PC/3DSController.ini +++ b/PC/3DSController.ini @@ -7,10 +7,10 @@ vJoy Device chooses which device to connect to. Set this to 2 in a second instan Circle Pad, C Stick and Touch can be MOUSE, JOYSTICK1, or JOYSTICK2. JOYSTICK1 uses X and Y. JOYSTICK2 uses Rx and Ry. These are axes 0, 1, 3 and 4 respectively, leaving 2 and 5 unused. KEYS will enable Pad directions (eg. Pad Left, C Stick Right) to map to regular keys (no vJoy necessary). -D Pad can be KEYS or POV. POV will automatically choose a continuous or 4 directional POV hat depending on what is set in your vJoy Config. +D Pad can be KEYS or POV. POV will automatically choose a continuous or 4 directional POV hat depending on what is set in your vJoy Config. KEYS will allow Left, Right and etc. to be buttons as previously. -Buttons can be a letter for a keyboard key (like Q, W, E, R, T, or Y), a special keyboard key (like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, WINDOWS, ESCAPE, CONTROL or ALT), a joypad button (JOY1, JOY2, JOY3, to JOY16) or vJoy Hat Switch direction (NORTH, EAST, SOUTH or WEST) (The hat switch must be enabled in vJoy Config. 4 way only, not continuous!) +Buttons can be a letter for a keyboard key (like Q, W, E, R, T, or Y), a special keyboard key (like SPACE, CLICK, RIGHT CLICK, ENTER, BACKSPACE, SHIFT, TAB, LEFT, RIGHT, UP, DOWN, PAGE UP, PAGE DOWN, WINDOWS, ESCAPE, CONTROL or ALT), or a joypad button (JOY1, JOY2, JOY3, to JOY16). If you want to use JOY9 through JOY16 you need to reconfigure vJoy. Search for vJoy Config in your start menu and set buttons to 16. Alternatively, you can disable any key by binding it to NONE. @@ -28,19 +28,19 @@ vJoy Device: 1 Circle Pad: KEYS C Stick: MOUSE -D Pad: POV +D Pad: KEYS Touch: MOUSE A: SPACE -B: CONTROL -X: E +B: E +X: CONTROL Y: SHIFT L: CLICK R: RIGHT CLICK -ZL: RIGHT CLICK -ZR: LEFT CLICK +ZL: CONTROL +ZR: SHIFT Start: ESCAPE -Select: ENTER +Select: Q Tap: NONE Left: A @@ -53,7 +53,7 @@ Pad Right: D Pad Up: W Pad Down: S -C Stick Left: 5 -C Stick Right: 6 -C Stick Up: 7 -C Stick Down: 8 \ No newline at end of file +C Stick Left: NONE +C Stick Right: NONE +C Stick Up: NONE +C Stick Down: NONE \ No newline at end of file diff --git a/PC/source/main.c b/PC/source/main.c index f3eb834..54504b3 100644 --- a/PC/source/main.c +++ b/PC/source/main.c @@ -1,6 +1,6 @@ // 3DS Controller Server -#define VERSION 0.7 +#define VERSION "0.7.2" #include #include @@ -14,7 +14,7 @@ #include "keyboard.h" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) { - printf("3DS Controller Server %.1f\n", VERSION); + printf("3DS Controller Server %s\n", VERSION); DWORD screenWidth = GetSystemMetrics(SM_CXSCREEN); DWORD screenHeight = GetSystemMetrics(SM_CYSCREEN); From 63268cd32e83d48b679d17d4f1f9454580e52d4d Mon Sep 17 00:00:00 2001 From: Poke Date: Thu, 12 Nov 2015 20:55:03 +1030 Subject: [PATCH 139/140] Got CIA and 3DS building working If I rename the .3ds to a .cxi citra runs it, so I guess that's working? I don't have any way to test either of them properly though. Hopefully they work. The .rsf is from a template provided by daxtsu. --- .gitignore | 3 - 3DS/3DSController.3ds | Bin 0 -> 223744 bytes 3DS/3DSController.cia | Bin 0 -> 236992 bytes 3DS/3DSController.smdh | Bin 0 -> 14016 bytes 3DS/Makefile | 2 +- 3DS/cxi/build_cia.rsf | 241 ++++++++++++++++++-------------------- 3DS/cxi/gw_workaround.rsf | 235 ------------------------------------- 7 files changed, 113 insertions(+), 368 deletions(-) create mode 100644 3DS/3DSController.3ds create mode 100644 3DS/3DSController.cia create mode 100644 3DS/3DSController.smdh delete mode 100644 3DS/cxi/gw_workaround.rsf diff --git a/.gitignore b/.gitignore index d059877..0922335 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,6 @@ 3DS/build/ 3DS/*.elf 3DS/*stripped.elf -3DS/*.smdh -3DS/*.3ds -3DS/*.cia PC/build/ *.pnproj *.pnps diff --git a/3DS/3DSController.3ds b/3DS/3DSController.3ds new file mode 100644 index 0000000000000000000000000000000000000000..75900018a9ffb71402a20039481c7ddb63c1bbac GIT binary patch literal 223744 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

*Tn> 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«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 b=X3L~r2dh)I{)8)g=hbF^8C;A|NXxJnq1lC literal 0 HcmV?d00001 diff --git a/3DS/3DSController.smdh b/3DS/3DSController.smdh new file mode 100644 index 0000000000000000000000000000000000000000..9c71067d90e8b9e1a3a6750babb916e26b0dc994 GIT binary patch literal 14016 zcmeHNJxF6g5T3#!g~cnbc!foTD^9R5oP~ij{v6y1DfG@l!9v91$a%+IOmWCH5>gyu zafB;GQUuOIh(#bN1k(geA!s4QLhuzSUSW~qidS5*H{-az7h=qNMqG=X6ua;3?9A-! zd^@v`ypK=41*F$71@9pYlkf#T!y0_U_7nbAu=g|+fz_u`^enYZ!Uss9uh$e=r}tlx z<8RdJ{nz-{_*aWTmD)A_HU2gJRU%NWZjFD9e~o{&7*wfU<6q-n<6k8L)#}#x*Z9}? zSBpWF+BN<){x$wpB2cYvjem`QjeoTmRHPSY zBAyYeCE^J-r{YjsE;ZNhH}Bsijc+CAPg?oLj_5g_s6~He0sn=vn&=xmUSOV>y@PVtX3uP%ANDU(?1paw_~jtL)x!Bs_-7}j2eP}yB8|kYBX=%6CNLNh@r=2ACLTgh^XxM&xO*__jThL@w5T}^Nd z@6EoNumtZ%bAA5A5)Ct+VBVZl#9d@6W0L>r&zJ0LgcX~%0$}d zhVfO-IjGZ!pBkc5J+Lw)L}-HRrST9+W3rF)hrIO+`(*S_ z=NUmq&JnF#Ba_9JSPG3{j7qv++G5kdn)2PWZ*iqH|(X8Con|Xuk z`NyD!c~Gx7+x3I`Vlxvt+u2W&RJt=fCmLSPIo|lAj8Qe4J^Nt0-Zw}$oL3W!O4@5b zxPLs~(22l#^5Qx-vScGo8S?(2YoDAG#txrM@{Nj?teDw6+iADYYt4p1=xwDi>_#XKhnM-T zPUzlG3K4r?P1`D+ZhHJpU^f!RJ0|UEJDsjC-DVWm|DAel8J)Sjr>%VL(u2QotpT{W zq?qG-@v-kaIO+6eN!JDo&2_&-2tl=z_j`}ac~>uQP$uAtk=K1tZ(V=4r&NLbMp$B! z{N>UX?t1Se<#PLTmcA;GRJrE7LEpN1*P|tL^8lR&?L@IXVDH^lERtiu{(C3C9QWJ0 U`@f&8MJvuonxotDE1*Zd|2rCHEdT%j literal 0 HcmV?d00001 diff --git a/3DS/Makefile b/3DS/Makefile index c98ab90..072f53e 100644 --- a/3DS/Makefile +++ b/3DS/Makefile @@ -150,7 +150,7 @@ endif $(OUTPUT).3dsx : $(OUTPUT).elf $(OUTPUT).3ds : $(OUTPUT)stripped.elf - makerom -f cci -o $(OUTPUT).3ds -rsf "$(TOPDIR)/cxi/gw_workaround.rsf" -target d -exefslogo -elf $(OUTPUT)stripped.elf -icon "$(TOPDIR)/cxi/icon.icn" -banner "$(TOPDIR)/cxi/banner.bnr" + makerom -f cci -o $(OUTPUT).3ds -rsf "$(TOPDIR)/cxi/build_cia.rsf" -target t -exefslogo -elf $(OUTPUT)stripped.elf -icon "$(TOPDIR)/cxi/icon.icn" -banner "$(TOPDIR)/cxi/banner.bnr" $(OUTPUT).cia : $(OUTPUT)stripped.elf makerom -f cia -o $(OUTPUT).cia -elf $(OUTPUT)stripped.elf -rsf "$(TOPDIR)/cxi/build_cia.rsf" -icon "$(TOPDIR)/cxi/icon.icn" -banner "$(TOPDIR)/cxi/banner.bnr" -exefslogo -target t diff --git a/3DS/cxi/build_cia.rsf b/3DS/cxi/build_cia.rsf index 02d90eb..8cbde36 100644 --- a/3DS/cxi/build_cia.rsf +++ b/3DS/cxi/build_cia.rsf @@ -1,97 +1,70 @@ BasicInfo: Title : "3DS Controller" - CompanyCode : "00" ProductCode : "CTR-N-3DSC" - ContentType : Application # Application / SystemUpdate / Manual / Child / Trial Logo : Nintendo # Nintendo / Licensed / Distributed / iQue / iQueForSystem -Rom: - # Specifies the root path of the file system to include in the ROM. - # HostRoot : "$(ROMFS_ROOT)" - +RomFs: + # Specifies the root path of the read only file system to include in the ROM. + RootPath : "$(ROMFS_ROOT)" TitleInfo: - UniqueId : 0xf0fc2 # This was/is the first real homebrew app. I hope this TID range is not used by any retail game/app. - Category : Application # Application / SystemApplication / Applet / Firmware / Base / DlpChild / Demo / Contents / SystemContents / SharedContents / AddOnContents / Patch / AutoUpdateContents - -CardInfo: - MediaSize : 512MB # 128MB / 256MB / 512MB / 1GB / 2GB / 4GB / 8GB / 16GB / 32GB - MediaType : Card1 # Card1 / Card2 - CardDevice : NorFlash # NorFlash / None - + Category : Application + UniqueId : 0xf0fc2 Option: UseOnSD : true # true if App is to be installed to SD - EnableCompress : true # Compresses exefs code FreeProductCode : true # Removes limitations on ProductCode - EnableCrypt : false # Enables encryption for NCCH and CIA MediaFootPadding : false # If true CCI files are created with padding - -ExeFs: # these are the program segments from the ELF, check your elf for the appropriate segment names - ReadOnly: - - .rodata - - RO - ReadWrite: - - .data - - RO - Text: - - .init - - .text - - STUP_ENTRY - -PlainRegion: # only used with SDK ELFs - # - .module_id + EnableCrypt : false # Enables encryption for NCCH and CIA + EnableCompress : true # Compresses where applicable (currently only exefs:/.code) AccessControlInfo: - # UseOtherVariationSaveData : true - # UseExtSaveData : true - # ExtSaveDataId: 0xffffffff - # SystemSaveDataId1: 0x220 - # SystemSaveDataId2: 0x00040010 - # OtherUserSaveDataId1: 0x220 - # OtherUserSaveDataId2: 0x330 - # OtherUserSaveDataId3: 0x440 - # UseExtendedSaveDataAccessControl: true - # AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606] + CoreVersion : 2 + + # Exheader Format Version + DescVersion : 2 + + # Minimum Required Kernel Version (below is for 4.5.0) + ReleaseKernelMajor : "02" + ReleaseKernelMinor : "33" + + # ExtData + UseExtSaveData : false # enables ExtData + #ExtSaveDataId : 0x300 # only set this when the ID is different to the UniqueId + + # FS:USER Archive Access Permissions + # Uncomment as required FileSystemAccess: - # - CategorySystemApplication - # - CategoryHardwareCheck - # - CategoryFileSystemTool - - Debug - # - TwlCardBackup - # - TwlNandData - # - Boss + #- CategorySystemApplication + #- CategoryHardwareCheck + - CategoryFileSystemTool + #- Debug + #- TwlCardBackup + #- TwlNandData + #- Boss - DirectSdmc - # - Core - # - CtrNandRo - # - CtrNandRw - # - CtrNandRoWrite - # - CategorySystemSettings - # - CardBoard - # - ExportImportIvs - # - DirectSdmcWrite - # - SwitchCleanup - # - SaveDataMove - # - Shop - # - Shell - # - CategoryHomeMenu - IoAccessControl: - # - FsMountNand - # - FsMountNandRoWrite - # - FsMountTwln - # - FsMountWnand - # - FsMountCardSpi - # - UseSdif3 - # - CreateSeed - # - UseCardSpi - + #- Core + #- CtrNandRo + #- CtrNandRw + #- CtrNandRoWrite + #- CategorySystemSettings + #- CardBoard + #- ExportImportIvs + #- DirectSdmcWrite + #- SwitchCleanup + #- SaveDataMove + #- Shop + #- Shell + #- CategoryHomeMenu + + # Process Settings + MemoryType : Application # Application/System/Base + SystemMode : 64MB # 64MB(Default)/96MB/80MB/72MB/32MB IdealProcessor : 0 AffinityMask : 1 - Priority : 16 - MaxCpu : 0x9E # Default - + HandleTableSize : 0x200 DisableDebug : true EnableForceDebug : false CanWriteSharedPage : true @@ -101,21 +74,23 @@ AccessControlInfo: CanShareDeviceMemory : true RunnableOnSleep : false SpecialMemoryArrange : true - - CoreVersion : 2 - DescVersion : 2 - - ReleaseKernelMajor : "02" - ReleaseKernelMinor : "33" - MemoryType : Application # Application / System / Base - HandleTableSize: 512 - IORegisterMapping: - - 1ff50000-1ff57fff - - 1ff70000-1ff77fff + + # New3DS Exclusive Process Settings + SystemModeExt : Legacy # Legacy(Default)/124MB/178MB Legacy:Use Old3DS SystemMode + CpuSpeed : 804MHz # 256MHz(Default)/804MHz + EnableL2Cache : true # false(default)/true + CanAccessCore2 : true + + # Virtual Address Mappings + IORegisterMapping: + - 1ff00000-1ff7ffff # DSP memory MemoryMapping: - - 1f000000-1f5fffff:r + - 1f000000-1f5fffff:r # VRAM + + # Accessible SVCs, : SystemCallAccess: ArbitrateAddress: 34 + Backdoor: 123 Break: 60 CancelTimer: 28 ClearEvent: 25 @@ -123,6 +98,7 @@ AccessControlInfo: CloseHandle: 35 ConnectToPort: 45 ControlMemory: 1 + ControlProcessMemory: 112 CreateAddressArbiter: 33 CreateEvent: 23 CreateMemoryBlock: 30 @@ -166,25 +142,28 @@ AccessControlInfo: UnmapMemoryBlock: 32 WaitSynchronization1: 36 WaitSynchronizationN: 37 - InterruptNumbers: - ServiceAccessControl: + + # Service List + # Maximum 34 services (32 if firmware is prior to 9.6.0) + ServiceAccessControl: - APT:U - - $hioFIO - - $hostio0 - - $hostio1 - ac:u + - am:net - boss:U - cam:u - cecd:u + - cfg:nor - cfg:u - - dlp:FKCL - - dlp:SRVR + - csnd:SND - dsp::DSP - frd:u - fs:USER - gsp::Gpu - hid:USER - http:C + - ir:rst + - ir:u + - ir:USER - mic:u - ndm:u - news:u @@ -194,43 +173,47 @@ AccessControlInfo: - soc:U - ssl:C - y2r:u - - ldr:ro - - ir:USER - - ir:rst - + + SystemControlInfo: - SaveDataSize: 0KB # It doesn't use any save data. + SaveDataSize: 0KB # Change if the app uses savedata RemasterVersion: 2 StackSize: 0x40000 - # JumpId: 0 + + # Modules that run services listed above should be included below + # Maximum 48 dependencies + # : Dependency: - ac: 0x0004013000002402L - am: 0x0004013000001502L - boss: 0x0004013000003402L - camera: 0x0004013000001602L - cecd: 0x0004013000002602L - cfg: 0x0004013000001702L - codec: 0x0004013000001802L - csnd: 0x0004013000002702L - dlp: 0x0004013000002802L - dsp: 0x0004013000001a02L - friends: 0x0004013000003202L - gpio: 0x0004013000001b02L - gsp: 0x0004013000001c02L - hid: 0x0004013000001d02L - http: 0x0004013000002902L - i2c: 0x0004013000001e02L - ir: 0x0004013000003302L - mcu: 0x0004013000001f02L - mic: 0x0004013000002002L - ndm: 0x0004013000002b02L - news: 0x0004013000003502L - nim: 0x0004013000002c02L - nwm: 0x0004013000002d02L - pdn: 0x0004013000002102L - ps: 0x0004013000003102L - ptm: 0x0004013000002202L - ro: 0x0004013000003702L - socket: 0x0004013000002e02L - spi: 0x0004013000002302L - ssl: 0x0004013000002f02L + ac: 0x0004013000002402 + act: 0x0004013000003802 + am: 0x0004013000001502 + boss: 0x0004013000003402 + camera: 0x0004013000001602 + cecd: 0x0004013000002602 + cfg: 0x0004013000001702 + codec: 0x0004013000001802 + csnd: 0x0004013000002702 + dlp: 0x0004013000002802 + dsp: 0x0004013000001a02 + friends: 0x0004013000003202 + gpio: 0x0004013000001b02 + gsp: 0x0004013000001c02 + hid: 0x0004013000001d02 + http: 0x0004013000002902 + i2c: 0x0004013000001e02 + ir: 0x0004013000003302 + mcu: 0x0004013000001f02 + mic: 0x0004013000002002 + ndm: 0x0004013000002b02 + news: 0x0004013000003502 + nfc: 0x0004013000004002 + nim: 0x0004013000002c02 + nwm: 0x0004013000002d02 + pdn: 0x0004013000002102 + ps: 0x0004013000003102 + ptm: 0x0004013000002202 + qtm: 0x0004013020004202 + ro: 0x0004013000003702 + socket: 0x0004013000002e02 + spi: 0x0004013000002302 + ssl: 0x0004013000002f02 diff --git a/3DS/cxi/gw_workaround.rsf b/3DS/cxi/gw_workaround.rsf deleted file mode 100644 index 2eda3b7..0000000 --- a/3DS/cxi/gw_workaround.rsf +++ /dev/null @@ -1,235 +0,0 @@ -BasicInfo: - Title : "3DS Controller" - CompanyCode : "00" - ProductCode : "CTR-N-3DSC" - ContentType : Application - Logo : Nintendo # Nintendo / Licensed / Distributed / iQue / iQueForSystem - -Rom: - # Specifies the root path of the file system to include in the ROM. - #HostRoot : "romfs" - - -TitleInfo: - UniqueId : 0xf0fc2 - Category : Application - -CardInfo: - MediaSize : 128MB # 128MB / 256MB / 512MB / 1GB / 2GB / 4GB - MediaType : Card1 # Card1 / Card2 - CardDevice : NorFlash # NorFlash(Pick this if you use savedata) / None - - -Option: - FreeProductCode : true # Removes limitations on ProductCode - MediaFootPadding : false # If true CCI files are created with padding - EnableCrypt : true # Enables encryption for NCCH and CIA - EnableCompress : true # Compresses exefs code - -ExeFs: # these are the program segments from the ELF, check your elf for the appropriate segment names - ReadOnly: - - .rodata - - RO - ReadWrite: - - .data - - RO - Text: - - .init - - .text - - STUP_ENTRY - -PlainRegion: # only used with SDK ELFs - - .module_id - -AccessControlInfo: - #UseExtSaveData : true - #ExtSaveDataId: 0xff3ff - #UseExtendedSaveDataAccessControl: true - #AccessibleSaveDataIds: [0x101, 0x202, 0x303, 0x404, 0x505, 0x606] - -SystemControlInfo: - SaveDataSize: 128KB - RemasterVersion: 0 - StackSize: 0x40000 - -# DO NOT EDIT BELOW HERE OR PROGRAMS WILL NOT LAUNCH (most likely) - -AccessControlInfo: - FileSystemAccess: - - Debug - - DirectSdmc - - DirectSdmcWrite - - IdealProcessor : 0 - AffinityMask : 1 - - Priority : 16 - - MaxCpu : 0x9E # Default - - CoreVersion : 2 - DescVersion : 2 - - ReleaseKernelMajor : "02" - ReleaseKernelMinor : "33" - MemoryType : Application - HandleTableSize: 512 - IORegisterMapping: - - 1ff50000-1ff57fff - - 1ff70000-1ff77fff - MemoryMapping: - - 1f000000-1f5fffff:r - SystemCallAccess: - ArbitrateAddress: 34 - Break: 60 - CancelTimer: 28 - ClearEvent: 25 - ClearTimer: 29 - CloseHandle: 35 - ConnectToPort: 45 - ControlMemory: 1 - CreateAddressArbiter: 33 - CreateEvent: 23 - CreateMemoryBlock: 30 - CreateMutex: 19 - CreateSemaphore: 21 - CreateThread: 8 - CreateTimer: 26 - DuplicateHandle: 39 - ExitProcess: 3 - ExitThread: 9 - GetCurrentProcessorNumber: 17 - GetHandleInfo: 41 - GetProcessId: 53 - GetProcessIdOfThread: 54 - GetProcessIdealProcessor: 6 - GetProcessInfo: 43 - GetResourceLimit: 56 - GetResourceLimitCurrentValues: 58 - GetResourceLimitLimitValues: 57 - GetSystemInfo: 42 - GetSystemTick: 40 - GetThreadContext: 59 - GetThreadId: 55 - GetThreadIdealProcessor: 15 - GetThreadInfo: 44 - GetThreadPriority: 11 - MapMemoryBlock: 31 - OutputDebugString: 61 - QueryMemory: 2 - ReleaseMutex: 20 - ReleaseSemaphore: 22 - SendSyncRequest1: 46 - SendSyncRequest2: 47 - SendSyncRequest3: 48 - SendSyncRequest4: 49 - SendSyncRequest: 50 - SetThreadPriority: 12 - SetTimer: 27 - SignalEvent: 24 - SleepThread: 10 - UnmapMemoryBlock: 32 - WaitSynchronization1: 36 - WaitSynchronizationN: 37 - InterruptNumbers: - ServiceAccessControl: - - APT:U - - $hioFIO - - $hostio0 - - $hostio1 - - ac:u - - boss:U - - cam:u - - cecd:u - - cfg:u - - dlp:FKCL - - dlp:SRVR - - dsp::DSP - - frd:u - - fs:USER - - gsp::Gpu - - hid:USER - - http:C - - mic:u - - ndm:u - - news:u - - nwm::UDS - - ptm:u - - pxi:dev - - soc:U - - ssl:C - - y2r:u - - ldr:ro - - ir:USER - - ir:rst - - -SystemControlInfo: - Dependency: - ac: 0x0004013000002402L - am: 0x0004013000001502L - boss: 0x0004013000003402L - camera: 0x0004013000001602L - cecd: 0x0004013000002602L - cfg: 0x0004013000001702L - codec: 0x0004013000001802L - csnd: 0x0004013000002702L - dlp: 0x0004013000002802L - dsp: 0x0004013000001a02L - friends: 0x0004013000003202L - gpio: 0x0004013000001b02L - gsp: 0x0004013000001c02L - hid: 0x0004013000001d02L - http: 0x0004013000002902L - i2c: 0x0004013000001e02L - ir: 0x0004013000003302L - mcu: 0x0004013000001f02L - mic: 0x0004013000002002L - ndm: 0x0004013000002b02L - news: 0x0004013000003502L - nim: 0x0004013000002c02L - nwm: 0x0004013000002d02L - pdn: 0x0004013000002102L - ps: 0x0004013000003102L - ptm: 0x0004013000002202L - ro: 0x0004013000003702L - socket: 0x0004013000002e02L - spi: 0x0004013000002302L - ssl: 0x0004013000002f02L -CommonHeaderKey: - D: | - jL2yO86eUQnYbXIrzgFVMm7FVze0LglZ2f5g+c42hWoEdnb5BOotaMQPBfqt - aUyAEmzQPaoi/4l4V+hTJRXQfthVRqIEx27B84l8LA6Tl5Fy9PaQaQ+4yRfP - g6ylH2l0EikrIVjy2uMlFgl0QJCrG+QGKHftxhaGCifdAwFNmiZuyJ/TmktZ - 0RCb66lYcr2h/p2G7SnpKUliS9h9KnpmG+UEgVYQUK+4SCfByUa9PxYGpT0E - nw1UcRz0gsBmdOqcgzwnAd9vVqgb42hVn6uQZyAl+j1RKiMWywZarazIR/k5 - Lmr4+groimSEa+3ajyoIho9WaWTDmFU3mkhA2tUDIQ== - Exponent: | - AQAB - Modulus: | - zwCcsyCgMkdlieCgQMVXA6X2jmb1ICjup0Q+jk/AydPkOgsx7I/MjUymFEkU - vgXBtCKtzh3NKXtFFuW51tJ60GPOabLKuG0Qm5li+UXALrWhzWuvd5vv2FZI - dTQCbrq/MFS/M02xNtwqzWiBjE/LwqIdbrDAAvX4HGy0ydaQJ1DKYeQeph5D - lAGBw2nQ4izXhhuLaU3w8VQkIJHdhxIKI5gJY/20AGkG0vHD553Mh5kBINrWp - CRYmmJS8DCYbAiQtKbkeUfzHViGTZuj6PwaY8Mv39PGO47a++pt45IUyCEs4/ - LjMS72cyfo8tU4twRGp76SFGYejYj3wGC1f/POQw== - Signature: | - BOPR0jL0BOV5Zx502BuPbOvi/hvOq5ID8Dz1MQfOjkey6FKP/6cb4f9YXpm6c - ZCHAZLo0GduKdMepiKPUq1rsbbAxkRdQdjOOusEWoxNA58x3E4373tCAhlqM2 - DvuQERrIIQ/XnYLV9C3uw4efZwhFqog1jvVyoEHpuvs8xnYtGbsKQ8FrgLwXv - pOZYy9cSgq+jqLy2D9IxiowPcbq2cRlbW9d2xlUfpq0AohyuXQhpxn7d9RUor - 9veoARRAdxRJK12EpcSoEM1LhTRYdJnSRCY3x3p6YIV3c+l1sWvaQwKt0sZ/U - 8TTDx2gb9g7r/+U9icneu/zlqUpSkexCS009Q== - Descriptor: | - AP///wAABAACAAAAAAAFGJ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIAAAAAAAABBUFQ6VQAAACRo - aW9GSU8AJGhvc3RpbzAkaG9zdGlvMWFjOnUAAAAAYm9zczpVAABjYW06dQAA - AGNlY2Q6dQAAY2ZnOnUAAABkbHA6RktDTGRscDpTUlZSZHNwOjpEU1BmcmQ6 - dQAAAGZzOlVTRVIAZ3NwOjpHcHVoaWQ6VVNFUmh0dHA6QwAAbWljOnUAAABu - ZG06dQAAAG5ld3M6dQAAbndtOjpVRFNwdG06dQAAAHB4aTpkZXYAc29jOlUA - AABzc2w6QwAAAHkycjp1AAAAbGRyOnJvAABpcjpVU0VSAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAABOn/rw/7//8ec/APIA8JH/APaR/1D/gf9Y/4H/cP+B/3j/gf8B - AQD/AAIA/iECAPz///////////////////////////////////////////// - ////////////////////////////////////////AAAAAAAAAAAAAAAAAAAA - AAADAAAAAAAAAAAAAAAAAAI= From 24d5bd89d93b5a4f4be2266c1fb1e45d5a3263ed Mon Sep 17 00:00:00 2001 From: goose121 Date: Wed, 24 May 2017 21:12:03 -0600 Subject: [PATCH 140/140] Add linux support for new branch Quick edit to struct.unpack() call allowing Linux to interface with the new version, currently does NOT do anything with the volume slider value --- Linux/3DSController.py | 254 +++++++++++++++++++++++++++++++++ Linux/3DSController_gamepad.py | 163 +++++++++++++++++++++ 2 files changed, 417 insertions(+) create mode 100644 Linux/3DSController.py create mode 100644 Linux/3DSController_gamepad.py diff --git a/Linux/3DSController.py b/Linux/3DSController.py new file mode 100644 index 0000000..1615890 --- /dev/null +++ b/Linux/3DSController.py @@ -0,0 +1,254 @@ +#!/usr/bin/env python +# Compatible with both Python 2.7.6 and 3.4.3 + +from __future__ import print_function +import socket, struct, time +import Xlib, Xlib.display, Xlib.XK +LMouse = []; RMouse = [] +Button = []; MouseAbs = []; MouseRel = []; MouseAbsClick = []; MouseRelClick = [] + +########################################################## +# CONFIGURABLE REGION START - Don't touch anything above # +########################################################## +port = 8889 + +#This tells what the touch screen does if touched. +#Valid values: Button, MouseAbs, MouseRel, MouseRelClick, MouseRelClick +#Button sends the Tap button. +#MouseAbs moves your mouse to the same part of the screen as the touch screen was touched. +#MouseRel moves your mouse by the same distance as you drag across the touch screen. +#MouseAbsClick and MouseRelClick send the primary mouse button event if the screen is tapped, not held. +touch = MouseRelClick + +mouse_speed = 4 +# The number of pixels on each side of the 3DS screen which are ignored, since you can't reach the outermost corners. +abs_deadzone = 10 + +#Valid values can be found in any of these locations on your Linux system (some may not exist): +# /usr/include/X11/keysymdef.h +# /usr/lib/python3/dist-packages/Xlib/keysymdef/ +# /usr/lib/python2.7/dist-packages/Xlib/keysymdef/ +#Additionally, LMouse and RMouse can also be used on any button. +btn_map = { + "A": "A", + "B": "B", + "X": "X", + "Y": "Y", + "L": "L", + "R": "R", + "ZL": "Q", + "ZR": "W", + "Left": Xlib.XK.XK_Left, + "Right": Xlib.XK.XK_Right, + "Up": Xlib.XK.XK_Up, + "Down": Xlib.XK.XK_Down, + "Start": Xlib.XK.XK_Return, + "Select": Xlib.XK.XK_BackSpace, + "Tap": LMouse, +} +######################################################## +# CONFIGURABLE REGION END - Don't touch anything below # +######################################################## + +def pprint(obj): + import pprint + pprint.PrettyPrinter().pprint(obj) + +class x: pass + +command = x() +command.CONNECT = 0 +command.KEYS = 1 +command.SCREENSHOT = 2 + +keynames = [ + "A", "B", "Select", "Start", "Right", "Left", "Up", "Down", + "R", "L", "X", "Y", None, None, "ZL", "ZR", + None, None, None, None, "Tap", None, None, None, + "CSRight", "CSLeft", "CSUp", "CSDown", "CRight", "CLeft", "CUp", "CDown", +] + +keys = x() +keys.A = 1<<0 +keys.B = 1<<1 +keys.Select = 1<<2 +keys.Start = 1<<3 +keys.Right = 1<<4 +keys.Left = 1<<5 +keys.Up = 1<<6 +keys.Down = 1<<7 +keys.R = 1<<8 +keys.L = 1<<9 +keys.X = 1<<10 +keys.Y = 1<<11 +keys.ZL = 1<<14 # (new 3DS only) +keys.ZR = 1<<15 # (new 3DS only) +keys.Tap = 1<<20 # Not actually provided by HID +keys.CSRight = 1<<24 # c-stick (new 3DS only) +keys.CSLeft = 1<<25 # c-stick (new 3DS only) +keys.CSUp = 1<<26 # c-stick (new 3DS only) +keys.CSDown = 1<<27 # c-stick (new 3DS only) +keys.CRight = 1<<28 # circle pad +keys.CLeft = 1<<29 # circle pad +keys.CUp = 1<<30 # circle pad +keys.CDown = 1<<31 # circle pad + +def currentKeyboardKey(x, y): + chars = ("!1234567890\x08"+ + "QWERTYUIOP\13\13"+ + "ASDFGHJKL-\13\13"+ + "ZXCVBNM,.?\13\13"+ + "\0\0\0 \0\0\0\0") + + if x>=1 and x<=312 and y>=78 and y<=208: + xi = int(x*12/320) + yi = int((y-78)*12/320) + return chars[yi*12 + xi] + else: return None + +def key_to_keysym(key): + if not key: return 0 + + if isinstance(key,str): + if key=="\x08": return Xlib.XK.XK_BackSpace + if key=="\13": return Xlib.XK.XK_Return + if key==" ": return Xlib.XK.XK_space + return Xlib.XK.string_to_keysym(key) + + return key + +def action_key(key, action): + x_action = Xlib.X.ButtonRelease + x_action2 = Xlib.X.KeyRelease + if action: + x_action = Xlib.X.ButtonPress + x_action2 = Xlib.X.KeyPress + + if key is LMouse or key is RMouse: + if key is LMouse: button = 1 + if key is RMouse: button = 3 + button = disp.get_pointer_mapping()[button-1] # account for left-handed mice + disp.xtest_fake_input(x_action, button) + disp.sync() + return + + keysym = key_to_keysym(key) + if not keysym: return + + keycode = disp.keysym_to_keycode(keysym) + disp.xtest_fake_input(x_action2, keycode) + disp.sync() + +def press_key(key): + action_key(key,True) + +def release_key(key): + action_key(key,False) + +def move_mouse(x,y): + x=int(x) + y=int(y) + if not x and not y: return + + disp.warp_pointer(x,y) + disp.sync() + +def move_mouse_abs_frac(x,y): + root = disp.screen().root + geom = root.get_geometry() + + root.warp_pointer(int(x*geom.width), int(y*geom.height)) + disp.sync() + +disp = Xlib.display.Display() + +touch_click = (touch is MouseAbsClick or touch is MouseRelClick) +if touch is MouseAbsClick: touch = MouseAbs +if touch is MouseRelClick: touch = MouseRel + +if touch is MouseAbs and disp.screen_count()!=1: + print("Sorry, but MouseAbs only supports a single monitor. I'll use MouseRel instead.") + touch = MouseRel + +sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +sock.bind(("", port)) + +prevkeys = 0 + +touch_start = 0 +touch_last_x = 0 +touch_last_y = 0 +keyboard_prevkey = currentKeyboardKey(0, 0) + +while True: + rawdata, addr = sock.recvfrom(4096) + rawdata = bytearray(rawdata) + #print("received message", rawdata, "from", addr) + + if rawdata[0]==command.CONNECT: + pass # CONNECT packets are empty + + if rawdata[0]==command.KEYS: + fields = struct.unpack("=16 or abs(data["circleY"])>=16: + move_mouse(data["circleX"]*mouse_speed/32.0, -data["circleY"]*mouse_speed/32.0) + + if rawdata[0]==command.SCREENSHOT: + pass # unused by both 3DS and PC applications diff --git a/Linux/3DSController_gamepad.py b/Linux/3DSController_gamepad.py new file mode 100644 index 0000000..f57858e --- /dev/null +++ b/Linux/3DSController_gamepad.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python +# Compatible with both Python 2.7.6 and 3.4.3 + +from __future__ import print_function +import socket, struct, time +import uinput + +########################################################## +# CONFIGURABLE REGION START - Don't touch anything above # +########################################################## +port = 8889 + +#Valid values can be found in any of these locations on your Linux system (some may not exist): +# /usr/include/linux/input-event-codes.h +#The virtual device is defined on the device variable and the mapping of the keys on btn_map +#RECAP keynames (DO NOT TOUCH) are the keys that we expect commming from the 3ds, device is +#the virtual device that we define and btn_map maps what we recieve with our virtual device +btn_map = { + "A": uinput.BTN_A, + "B": uinput.BTN_B, + "X": uinput.BTN_X, + "Y": uinput.BTN_Y, + "L": uinput.BTN_TL, + "R": uinput.BTN_TR, + "ZL": uinput.BTN_THUMBL, + "ZR": uinput.BTN_THUMBR, + "Left": uinput.BTN_DPAD_LEFT, + "Right": uinput.BTN_DPAD_RIGHT, + "Up": uinput.BTN_DPAD_UP, + "Down": uinput.BTN_DPAD_DOWN, + "Start": uinput.BTN_START, + "Select": uinput.BTN_SELECT, + "Tap": uinput.BTN_MODE, +} + +device = uinput.Device([ + uinput.ABS_X + (-159, 159, 0, 10), + uinput.ABS_Y + (-159, 159, 0, 10), + uinput.ABS_RX + (-146, 146, 0, 16), + uinput.ABS_RY + (-146, 146, 0, 16), + uinput.BTN_A, + uinput.BTN_B, + uinput.BTN_X, + uinput.BTN_Y, + uinput.BTN_TL, + uinput.BTN_TR, + uinput.BTN_THUMBL, + uinput.BTN_THUMBR, + uinput.BTN_DPAD_LEFT, + uinput.BTN_DPAD_RIGHT, + uinput.BTN_DPAD_UP, + uinput.BTN_DPAD_DOWN, + uinput.BTN_START, + uinput.BTN_SELECT, + uinput.BTN_MODE, + ]) +######################################################## +# CONFIGURABLE REGION END - Don't touch anything below # +######################################################## + +def pprint(obj): + import pprint + pprint.PrettyPrinter().pprint(obj) + +class x: pass + +command = x() +command.CONNECT = 0 +command.KEYS = 1 +command.SCREENSHOT = 2 + +keynames = [ + "A", "B", "Select", "Start", "Right", "Left", "Up", "Down", + "R", "L", "X", "Y", None, None, "ZL", "ZR", + None, None, None, None, "Tap", None, None, None, + "CSRight", "CSLeft", "CSUp", "CSDown", "CRight", "CLeft", "CUp", "CDown", +] + +keys = x() +keys.A = 1<<0 +keys.B = 1<<1 +keys.Select = 1<<2 +keys.Start = 1<<3 +keys.Right = 1<<4 +keys.Left = 1<<5 +keys.Up = 1<<6 +keys.Down = 1<<7 +keys.R = 1<<8 +keys.L = 1<<9 +keys.X = 1<<10 +keys.Y = 1<<11 +keys.ZL = 1<<14 # (new 3DS only) +keys.ZR = 1<<15 # (new 3DS only) +keys.Tap = 1<<20 # Not actually provided by HID +keys.CSRight = 1<<24 # c-stick (new 3DS only) +keys.CSLeft = 1<<25 # c-stick (new 3DS only) +keys.CSUp = 1<<26 # c-stick (new 3DS only) +keys.CSDown = 1<<27 # c-stick (new 3DS only) +keys.CRight = 1<<28 # circle pad +keys.CLeft = 1<<29 # circle pad +keys.CUp = 1<<30 # circle pad +keys.CDown = 1<<31 # circle pad + +def press_key(key): + device.emit(key, 1) + +def release_key(key): + device.emit(key,0) + +sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +sock.bind(("", port)) + +prevkeys = 0 + +touch_start = 0 +touch_last_x = 0 +touch_last_y = 0 + +while True: + rawdata, addr = sock.recvfrom(4096) + rawdata = bytearray(rawdata) + #print("received message", rawdata, "from", addr) + + if rawdata[0]==command.CONNECT: + pass # CONNECT packets are empty + + if rawdata[0]==command.KEYS: + fields = struct.unpack("