diff --git a/.gitignore b/.gitignore index dfa199d..11ff6fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ -buildApplet/* -buildSysmodule/* +*.d +*.o +*.lst +*.map +main +out/* *.nro *.nacp *.elf @@ -9,5 +13,3 @@ buildSysmodule/* *.code-workspace *.flag *.zip -*.xml -*.png diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index a98045a..a7845d9 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -3,14 +3,13 @@ { "name": "AArch64 libnx", "includePath": [ - "${workspaceFolder}/build", "${DEVKITPRO}/devkitA64/lib/gcc/aarch64-none-elf/*/include/", "${DEVKITPRO}/devkitA64/aarch64-none-elf/include/", "${DEVKITPRO}/portlibs/switch/include/", "${DEVKITPRO}/libnx/include/", - "ControllerUSB/include", - "SwitchUSB/include", - "inih/" + "source/ControllerLib", + "source/ControllerSwitch", + "source/inih" ], "defines": [ "SWITCH", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 6e04616..723d68e 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,10 +2,10 @@ "version": "2.0.0", "tasks": [ { - "label": "Build Sysmodule", + "label": "Build Release", "type": "shell", "promptOnClose": true, - "command": "make sysmodule -j8", + "command": "make", "presentation": { "reveal": "always", "panel": "shared" @@ -27,60 +27,14 @@ } }, { - "label": "Build Applet", + "label": "Clean", "type": "shell", "promptOnClose": true, - "command": "make applet -j8", + "command": "make clean", "presentation": { "reveal": "always", "panel": "shared" }, - "problemMatcher": { - "owner": "cpp", - "pattern": { - "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", - "file": 1, - "line": 2, - "column": 3, - "severity": 4, - "message": 5 - } - }, - "group": { - "kind": "build", - "isDefault": true - } - }, - { - "label": "Clean Applet", - "type": "shell", - "promptOnClose": true, - "command": "make cleanApplet -j8", - "presentation": { - "reveal": "always", - "panel": "new" - }, - "problemMatcher": { - "owner": "cpp", - "pattern": { - "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", - "file": 1, - "line": 2, - "column": 3, - "severity": 4, - "message": 5 - } - } - }, - { - "label": "Clean Sysmodule", - "type": "shell", - "promptOnClose": true, - "command": "make cleanSysmodule -j8", - "presentation": { - "reveal": "always", - "panel": "new" - }, "problemMatcher": { "owner": "cpp", "pattern": { diff --git a/ControllerUSB/README.md b/ControllerUSB/README.md deleted file mode 100644 index ff1abae..0000000 --- a/ControllerUSB/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# ControllerUSB - -Small controller driver library. Since it is up to the user to provide the USB implementation, this library becomes platform independent. diff --git a/Makefile b/Makefile index d8198e3..93bb9d8 100644 --- a/Makefile +++ b/Makefile @@ -1,235 +1,19 @@ -#--------------------------------------------------------------------------------- -.SUFFIXES: -#--------------------------------------------------------------------------------- +.PHONY: all build clean -ifeq ($(strip $(DEVKITPRO)),) -$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") -endif +all: build + rm -rf out + mkdir -p out/atmosphere/contents/690000000000000D/flags + mkdir -p out/config/sys-con + mkdir -p out/switch/ + touch out/atmosphere/contents/690000000000000D/flags/boot2.flag + cp source/Sysmodule/sys-con.nsp out/atmosphere/contents/690000000000000D/exefs.nsp + cp source/AppletCompanion/sys-con.nro out/switch/sys-con.nro + cp -r common/. out/ + @echo [DONE] sys-con compiled successfully. All files have been placed in out/ -TOPDIR ?= $(CURDIR) -include $(DEVKITPRO)/libnx/switch_rules +build: + $(MAKE) -C source/ -#--------------------------------------------------------------------------------- -# 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 -# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) -# -# NO_ICON: if set to anything, do not use icon. -# NO_NACP: if set to anything, no .nacp file is generated. -# APP_TITLE is the name of the app stored in the .nacp file (Optional) -# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) -# APP_VERSION is the version of the app stored in the .nacp file (Optional) -# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) -# ICON is the filename of the icon (.jpg), relative to the project folder. -# If not set, it attempts to use one of the following (in this order): -# - .jpg -# - icon.jpg -# - /default_icon.jpg -# -# CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder. -# If not set, it attempts to use one of the following (in this order): -# - .json -# - config.json -# If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead -# of a homebrew executable (.nro). This is intended to be used for sysmodules. -# NACP building is skipped as well. -#--------------------------------------------------------------------------------- -TARGET := sys-con -SOURCES := source SwitchUSB/source ControllerUSB/source ControllerUSB/source/Controllers ControllerUSB/source/Controllers/XboxOneAdapter inih -DATA := data -INCLUDES := include SwitchUSB/include ControllerUSB/include inih -#ROMFS := romfs - -#--------------------------------------------------------------------------------- -# options for code generation -#--------------------------------------------------------------------------------- -ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE - -CFLAGS := -g -Wall -O2 -ffunction-sections \ - $(ARCH) $(DEFINES) $(BUILD_CFLAGS) - -CFLAGS += $(INCLUDE) -D__SWITCH__ - -CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=c++17 - -ASFLAGS := -g $(ARCH) -LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) - -LIBS := -lnx - -#--------------------------------------------------------------------------------- -# list of directories containing libraries, this must be the top level containing -# include and lib -#--------------------------------------------------------------------------------- -LIBDIRS := $(PORTLIBS) $(LIBNX) - - -#--------------------------------------------------------------------------------- -# 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_BIN := $(addsuffix .o,$(BINFILES)) -export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) -export OFILES := $(OFILES_BIN) $(OFILES_SRC) -export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) - -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 $(CONFIG_JSON)),) - jsons := $(wildcard *.json) - ifneq (,$(findstring $(TARGET).json,$(jsons))) - export APP_JSON := $(TOPDIR)/$(TARGET).json - else - ifneq (,$(findstring config.json,$(jsons))) - export APP_JSON := $(TOPDIR)/config.json - endif - endif -else - export APP_JSON := $(TOPDIR)/$(CONFIG_JSON) -endif - -ifeq ($(strip $(ICON)),) - icons := $(wildcard *.jpg) - ifneq (,$(findstring $(TARGET).jpg,$(icons))) - export APP_ICON := $(TOPDIR)/$(TARGET).jpg - else - ifneq (,$(findstring icon.jpg,$(icons))) - export APP_ICON := $(TOPDIR)/icon.jpg - endif - endif -else - export APP_ICON := $(TOPDIR)/$(ICON) -endif - -ifeq ($(strip $(NO_ICON)),) - export NROFLAGS += --icon=$(APP_ICON) -endif - -ifeq ($(strip $(NO_NACP)),) - export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp -endif - -ifneq ($(APP_TITLEID),) - export NACPFLAGS += --titleid=$(APP_TITLEID) -endif - -ifneq ($(ROMFS),) - export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) -endif - -.PHONY: all buildApplet buildSysmodule applet sysmodule cleanApplet cleanSysmodule - -#--------------------------------------------------------------------------------- -all: sysmodule - -buildApplet: - @echo building applet ... - @[ -d $@ ] || mkdir -p $@ - @$(MAKE) --no-print-directory \ - BUILD=$@ -C $@ -f $(CURDIR)/Makefile \ - DEPSDIR=$(CURDIR)/$@ \ - BUILD_CFLAGS="-D__APPLET__" \ - makeNRO - -buildSysmodule: - @echo building sysmodule ... - @[ -d $@ ] || mkdir -p $@ - @$(MAKE) --no-print-directory \ - BUILD=$@ -C $@ -f $(CURDIR)/Makefile \ - DEPSDIR=$(CURDIR)/$@ \ - makeNSP - -applet: buildApplet - -sysmodule: buildSysmodule - -cleanApplet: - @echo clean applet ... - @rm -fr buildApplet $(TARGET).nro $(TARGET).nacp $(TARGET).elf - -cleanSysmodule: - @echo clean sysmodule ... - @rm -fr buildSysmodule exefs.nsp $(TARGET).nsp $(TARGET).nso $(TARGET).npdm $(TARGET).elf - -# Makefile commands -#--------------------------------------------------------------------------------- -else -.PHONY: makeNRO makeNSP - -DEPENDS := $(OFILES:.o=.d) - -#--------------------------------------------------------------------------------- -# main targets -#--------------------------------------------------------------------------------- -makeNRO: $(OUTPUT).nro - -makeNSP: $(OUTPUT).nsp - -#TODO: add an option to make exefs.nsp instead of $(OUTPUT).nsp - -ifeq ($(strip $(NO_NACP)),) -$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp -else -$(OUTPUT).nro : $(OUTPUT).elf -endif - - - -$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm - -$(OUTPUT).nso : $(OUTPUT).elf - -$(OUTPUT).elf : $(OFILES) - -$(OFILES_SRC) : $(HFILES_BIN) - -#--------------------------------------------------------------------------------- -# you need a rule like this for each extension you use as binary data -#--------------------------------------------------------------------------------- -%.bin.o %_bin.h : %.bin -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - --include $(DEPENDS) - -#--------------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------------- +clean: + $(MAKE) -C source/ clean + rm -rf out \ No newline at end of file diff --git a/SwitchUSB/README.md b/SwitchUSB/README.md deleted file mode 100644 index c9110f9..0000000 --- a/SwitchUSB/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# SwitchUSB - -Switch implementation for ControllerUSB library. diff --git a/common/atmosphere/contents/690000000000000D/toolbox.json b/common/atmosphere/contents/690000000000000D/toolbox.json new file mode 100644 index 0000000..a89be0a --- /dev/null +++ b/common/atmosphere/contents/690000000000000D/toolbox.json @@ -0,0 +1,5 @@ +{ + "name" : "sys-con", + "tid" : "690000000000000D", + "requires_reboot": false +} diff --git a/config/sys-con/config_dualshock3.ini b/common/config/sys-con/config_dualshock3.ini similarity index 100% rename from config/sys-con/config_dualshock3.ini rename to common/config/sys-con/config_dualshock3.ini diff --git a/config/sys-con/config_dualshock4.ini b/common/config/sys-con/config_dualshock4.ini similarity index 100% rename from config/sys-con/config_dualshock4.ini rename to common/config/sys-con/config_dualshock4.ini diff --git a/config/sys-con/config_global.ini b/common/config/sys-con/config_global.ini similarity index 100% rename from config/sys-con/config_global.ini rename to common/config/sys-con/config_global.ini diff --git a/config/sys-con/config_xbox360.ini b/common/config/sys-con/config_xbox360.ini similarity index 100% rename from config/sys-con/config_xbox360.ini rename to common/config/sys-con/config_xbox360.ini diff --git a/config/sys-con/config_xboxone.ini b/common/config/sys-con/config_xboxone.ini similarity index 100% rename from config/sys-con/config_xboxone.ini rename to common/config/sys-con/config_xboxone.ini diff --git a/config/sys-con/config_xboxoneadapter.ini b/common/config/sys-con/config_xboxoneadapter.ini similarity index 100% rename from config/sys-con/config_xboxoneadapter.ini rename to common/config/sys-con/config_xboxoneadapter.ini diff --git a/config/sys-con/config_xboxorig.ini b/common/config/sys-con/config_xboxorig.ini similarity index 100% rename from config/sys-con/config_xboxorig.ini rename to common/config/sys-con/config_xboxorig.ini diff --git a/config/sys-con/example.ini b/common/config/sys-con/example.ini similarity index 100% rename from config/sys-con/example.ini rename to common/config/sys-con/example.ini diff --git a/config/sys-con/firmware/XboxOneAdapter.bin b/common/config/sys-con/firmware/XboxOneAdapter.bin similarity index 100% rename from config/sys-con/firmware/XboxOneAdapter.bin rename to common/config/sys-con/firmware/XboxOneAdapter.bin diff --git a/source/AppletCompanion/Makefile b/source/AppletCompanion/Makefile new file mode 100644 index 0000000..8cff2d7 --- /dev/null +++ b/source/AppletCompanion/Makefile @@ -0,0 +1,218 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITPRO)/libnx/switch_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 +# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) +# +# NO_ICON: if set to anything, do not use icon. +# NO_NACP: if set to anything, no .nacp file is generated. +# APP_TITLE is the name of the app stored in the .nacp file (Optional) +# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) +# APP_VERSION is the version of the app stored in the .nacp file (Optional) +# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) +# ICON is the filename of the icon (.jpg), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .jpg +# - icon.jpg +# - /default_icon.jpg +# +# CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .json +# - config.json +# If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead +# of a homebrew executable (.nro). This is intended to be used for sysmodules. +# NACP building is skipped as well. +#--------------------------------------------------------------------------------- +TARGET := sys-con +BUILD := build +SOURCES := source +DATA := data +INCLUDES := include +#ROMFS := romfs + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE + +CFLAGS := -g -Wall -O2 -ffunction-sections \ + $(ARCH) $(DEFINES) $(BUILD_CFLAGS) + +CFLAGS += $(INCLUDE) -D__SWITCH__ + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=c++17 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lnx + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) $(LIBNX) + + +#--------------------------------------------------------------------------------- +# 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_BIN := $(addsuffix .o,$(BINFILES)) +export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) +export OFILES := $(OFILES_BIN) $(OFILES_SRC) +export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) + +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 $(CONFIG_JSON)),) + jsons := $(wildcard *.json) + ifneq (,$(findstring $(TARGET).json,$(jsons))) + export APP_JSON := $(TOPDIR)/$(TARGET).json + else + ifneq (,$(findstring config.json,$(jsons))) + export APP_JSON := $(TOPDIR)/config.json + endif + endif +else + export APP_JSON := $(TOPDIR)/$(CONFIG_JSON) +endif + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.jpg) + ifneq (,$(findstring $(TARGET).jpg,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).jpg + else + ifneq (,$(findstring icon.jpg,$(icons))) + export APP_ICON := $(TOPDIR)/icon.jpg + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +ifeq ($(strip $(NO_ICON)),) + export NROFLAGS += --icon=$(APP_ICON) +endif + +ifeq ($(strip $(NO_NACP)),) + export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp +endif + +ifneq ($(APP_TITLEID),) + export NACPFLAGS += --titleid=$(APP_TITLEID) +endif + +ifneq ($(ROMFS),) + export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) +endif + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @echo building applet companion ... + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory \ + -C $@ -f $(CURDIR)/Makefile \ + makeNRO + +clean: + @echo cleaning applet companion ... + @rm -fr $(BUILD) $(TARGET).nro $(TARGET).nacp $(TARGET).elf + +# Makefile commands +#--------------------------------------------------------------------------------- +else +.PHONY: makeNRO makeNSP + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +makeNRO: $(OUTPUT).nro + +makeNSP: $(OUTPUT).nsp + +#TODO: add an option to make exefs.nsp instead of $(OUTPUT).nsp + +ifeq ($(strip $(NO_NACP)),) +$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp +else +$(OUTPUT).nro : $(OUTPUT).elf +endif + + + +$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm + +$(OUTPUT).nso : $(OUTPUT).elf + +$(OUTPUT).elf : $(OFILES) + +$(OFILES_SRC) : $(HFILES_BIN) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o %_bin.h : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/source/AppletCompanion/source/main.cpp b/source/AppletCompanion/source/main.cpp new file mode 100644 index 0000000..9e3ddd8 --- /dev/null +++ b/source/AppletCompanion/source/main.cpp @@ -0,0 +1,24 @@ +#include "switch.h" +#include + +int main() +{ + consoleInit(NULL); + + printf("Hello\n"); + + while(appletMainLoop()) + { + hidScanInput(); + u64 kDown = 0; + for (u8 controller = 0; controller < 10; controller++) + kDown |= hidKeysDown(static_cast(controller)); + + if (kDown & KEY_PLUS || kDown & KEY_B) + break; + consoleUpdate(NULL); + } + + consoleExit(NULL); + return 0; +} \ No newline at end of file diff --git a/ControllerUSB/include/ControllerConfig.h b/source/ControllerLib/ControllerConfig.h similarity index 100% rename from ControllerUSB/include/ControllerConfig.h rename to source/ControllerLib/ControllerConfig.h diff --git a/ControllerUSB/source/ControllerHelpers.cpp b/source/ControllerLib/ControllerHelpers.cpp similarity index 100% rename from ControllerUSB/source/ControllerHelpers.cpp rename to source/ControllerLib/ControllerHelpers.cpp diff --git a/ControllerUSB/include/ControllerHelpers.h b/source/ControllerLib/ControllerHelpers.h similarity index 100% rename from ControllerUSB/include/ControllerHelpers.h rename to source/ControllerLib/ControllerHelpers.h diff --git a/ControllerUSB/include/ControllerTypes.h b/source/ControllerLib/ControllerTypes.h similarity index 100% rename from ControllerUSB/include/ControllerTypes.h rename to source/ControllerLib/ControllerTypes.h diff --git a/ControllerUSB/include/Controllers.h b/source/ControllerLib/Controllers.h similarity index 100% rename from ControllerUSB/include/Controllers.h rename to source/ControllerLib/Controllers.h diff --git a/ControllerUSB/source/Controllers/Dualshock3Controller.cpp b/source/ControllerLib/Controllers/Dualshock3Controller.cpp similarity index 100% rename from ControllerUSB/source/Controllers/Dualshock3Controller.cpp rename to source/ControllerLib/Controllers/Dualshock3Controller.cpp diff --git a/ControllerUSB/include/Controllers/Dualshock3Controller.h b/source/ControllerLib/Controllers/Dualshock3Controller.h similarity index 100% rename from ControllerUSB/include/Controllers/Dualshock3Controller.h rename to source/ControllerLib/Controllers/Dualshock3Controller.h diff --git a/ControllerUSB/source/Controllers/Dualshock4Controller.cpp b/source/ControllerLib/Controllers/Dualshock4Controller.cpp similarity index 100% rename from ControllerUSB/source/Controllers/Dualshock4Controller.cpp rename to source/ControllerLib/Controllers/Dualshock4Controller.cpp diff --git a/ControllerUSB/include/Controllers/Dualshock4Controller.h b/source/ControllerLib/Controllers/Dualshock4Controller.h similarity index 100% rename from ControllerUSB/include/Controllers/Dualshock4Controller.h rename to source/ControllerLib/Controllers/Dualshock4Controller.h diff --git a/ControllerUSB/source/Controllers/Xbox360Controller.cpp b/source/ControllerLib/Controllers/Xbox360Controller.cpp similarity index 100% rename from ControllerUSB/source/Controllers/Xbox360Controller.cpp rename to source/ControllerLib/Controllers/Xbox360Controller.cpp diff --git a/ControllerUSB/include/Controllers/Xbox360Controller.h b/source/ControllerLib/Controllers/Xbox360Controller.h similarity index 100% rename from ControllerUSB/include/Controllers/Xbox360Controller.h rename to source/ControllerLib/Controllers/Xbox360Controller.h diff --git a/ControllerUSB/source/Controllers/Xbox360WirelessController.cpp b/source/ControllerLib/Controllers/Xbox360WirelessController.cpp similarity index 100% rename from ControllerUSB/source/Controllers/Xbox360WirelessController.cpp rename to source/ControllerLib/Controllers/Xbox360WirelessController.cpp diff --git a/ControllerUSB/include/Controllers/Xbox360WirelessController.h b/source/ControllerLib/Controllers/Xbox360WirelessController.h similarity index 100% rename from ControllerUSB/include/Controllers/Xbox360WirelessController.h rename to source/ControllerLib/Controllers/Xbox360WirelessController.h diff --git a/ControllerUSB/source/Controllers/XboxController.cpp b/source/ControllerLib/Controllers/XboxController.cpp similarity index 100% rename from ControllerUSB/source/Controllers/XboxController.cpp rename to source/ControllerLib/Controllers/XboxController.cpp diff --git a/ControllerUSB/include/Controllers/XboxController.h b/source/ControllerLib/Controllers/XboxController.h similarity index 100% rename from ControllerUSB/include/Controllers/XboxController.h rename to source/ControllerLib/Controllers/XboxController.h diff --git a/ControllerUSB/source/Controllers/XboxOneAdapter.cpp b/source/ControllerLib/Controllers/XboxOneAdapter.cpp similarity index 99% rename from ControllerUSB/source/Controllers/XboxOneAdapter.cpp rename to source/ControllerLib/Controllers/XboxOneAdapter.cpp index ccda7e9..816fd03 100644 --- a/ControllerUSB/source/Controllers/XboxOneAdapter.cpp +++ b/source/ControllerLib/Controllers/XboxOneAdapter.cpp @@ -1,7 +1,7 @@ #include "Controllers/XboxOneAdapter.h" #include "Controllers/XboxOneAdapter/Firmware.h" #include -#include "../../source/log.h" +#include "../../Sysmodule/source/log.h" #include #include "cstring" diff --git a/ControllerUSB/include/Controllers/XboxOneAdapter.h b/source/ControllerLib/Controllers/XboxOneAdapter.h similarity index 100% rename from ControllerUSB/include/Controllers/XboxOneAdapter.h rename to source/ControllerLib/Controllers/XboxOneAdapter.h diff --git a/ControllerUSB/source/Controllers/XboxOneAdapter/Firmware.cpp b/source/ControllerLib/Controllers/XboxOneAdapter/Firmware.cpp similarity index 100% rename from ControllerUSB/source/Controllers/XboxOneAdapter/Firmware.cpp rename to source/ControllerLib/Controllers/XboxOneAdapter/Firmware.cpp diff --git a/ControllerUSB/include/Controllers/XboxOneAdapter/Firmware.h b/source/ControllerLib/Controllers/XboxOneAdapter/Firmware.h similarity index 100% rename from ControllerUSB/include/Controllers/XboxOneAdapter/Firmware.h rename to source/ControllerLib/Controllers/XboxOneAdapter/Firmware.h diff --git a/ControllerUSB/source/Controllers/XboxOneController.cpp b/source/ControllerLib/Controllers/XboxOneController.cpp similarity index 99% rename from ControllerUSB/source/Controllers/XboxOneController.cpp rename to source/ControllerLib/Controllers/XboxOneController.cpp index f909730..ee2c1c1 100644 --- a/ControllerUSB/source/Controllers/XboxOneController.cpp +++ b/source/ControllerLib/Controllers/XboxOneController.cpp @@ -1,6 +1,6 @@ #include "Controllers/XboxOneController.h" #include -#include "../../source/log.h" +#include "../../Sysmodule/source/log.h" static ControllerConfig _xboxoneControllerConfig{}; diff --git a/ControllerUSB/include/Controllers/XboxOneController.h b/source/ControllerLib/Controllers/XboxOneController.h similarity index 100% rename from ControllerUSB/include/Controllers/XboxOneController.h rename to source/ControllerLib/Controllers/XboxOneController.h diff --git a/ControllerUSB/include/IController.h b/source/ControllerLib/IController.h similarity index 100% rename from ControllerUSB/include/IController.h rename to source/ControllerLib/IController.h diff --git a/ControllerUSB/include/IUSBDevice.h b/source/ControllerLib/IUSBDevice.h similarity index 100% rename from ControllerUSB/include/IUSBDevice.h rename to source/ControllerLib/IUSBDevice.h diff --git a/ControllerUSB/include/IUSBEndpoint.h b/source/ControllerLib/IUSBEndpoint.h similarity index 100% rename from ControllerUSB/include/IUSBEndpoint.h rename to source/ControllerLib/IUSBEndpoint.h diff --git a/ControllerUSB/include/IUSBInterface.h b/source/ControllerLib/IUSBInterface.h similarity index 100% rename from ControllerUSB/include/IUSBInterface.h rename to source/ControllerLib/IUSBInterface.h diff --git a/ControllerUSB/include/Result.h b/source/ControllerLib/Result.h similarity index 100% rename from ControllerUSB/include/Result.h rename to source/ControllerLib/Result.h diff --git a/SwitchUSB/source/SwitchAbstractedPadHandler.cpp b/source/ControllerSwitch/SwitchAbstractedPadHandler.cpp similarity index 100% rename from SwitchUSB/source/SwitchAbstractedPadHandler.cpp rename to source/ControllerSwitch/SwitchAbstractedPadHandler.cpp diff --git a/SwitchUSB/include/SwitchAbstractedPadHandler.h b/source/ControllerSwitch/SwitchAbstractedPadHandler.h similarity index 100% rename from SwitchUSB/include/SwitchAbstractedPadHandler.h rename to source/ControllerSwitch/SwitchAbstractedPadHandler.h diff --git a/SwitchUSB/source/SwitchControllerHandler.cpp b/source/ControllerSwitch/SwitchControllerHandler.cpp similarity index 100% rename from SwitchUSB/source/SwitchControllerHandler.cpp rename to source/ControllerSwitch/SwitchControllerHandler.cpp diff --git a/SwitchUSB/include/SwitchControllerHandler.h b/source/ControllerSwitch/SwitchControllerHandler.h similarity index 100% rename from SwitchUSB/include/SwitchControllerHandler.h rename to source/ControllerSwitch/SwitchControllerHandler.h diff --git a/SwitchUSB/source/SwitchHDLHandler.cpp b/source/ControllerSwitch/SwitchHDLHandler.cpp similarity index 100% rename from SwitchUSB/source/SwitchHDLHandler.cpp rename to source/ControllerSwitch/SwitchHDLHandler.cpp diff --git a/SwitchUSB/include/SwitchHDLHandler.h b/source/ControllerSwitch/SwitchHDLHandler.h similarity index 100% rename from SwitchUSB/include/SwitchHDLHandler.h rename to source/ControllerSwitch/SwitchHDLHandler.h diff --git a/SwitchUSB/source/SwitchThread.cpp b/source/ControllerSwitch/SwitchThread.cpp similarity index 100% rename from SwitchUSB/source/SwitchThread.cpp rename to source/ControllerSwitch/SwitchThread.cpp diff --git a/SwitchUSB/include/SwitchThread.h b/source/ControllerSwitch/SwitchThread.h similarity index 100% rename from SwitchUSB/include/SwitchThread.h rename to source/ControllerSwitch/SwitchThread.h diff --git a/SwitchUSB/source/SwitchUSBDevice.cpp b/source/ControllerSwitch/SwitchUSBDevice.cpp similarity index 100% rename from SwitchUSB/source/SwitchUSBDevice.cpp rename to source/ControllerSwitch/SwitchUSBDevice.cpp diff --git a/SwitchUSB/include/SwitchUSBDevice.h b/source/ControllerSwitch/SwitchUSBDevice.h similarity index 100% rename from SwitchUSB/include/SwitchUSBDevice.h rename to source/ControllerSwitch/SwitchUSBDevice.h diff --git a/SwitchUSB/source/SwitchUSBEndpoint.cpp b/source/ControllerSwitch/SwitchUSBEndpoint.cpp similarity index 100% rename from SwitchUSB/source/SwitchUSBEndpoint.cpp rename to source/ControllerSwitch/SwitchUSBEndpoint.cpp diff --git a/SwitchUSB/include/SwitchUSBEndpoint.h b/source/ControllerSwitch/SwitchUSBEndpoint.h similarity index 100% rename from SwitchUSB/include/SwitchUSBEndpoint.h rename to source/ControllerSwitch/SwitchUSBEndpoint.h diff --git a/SwitchUSB/source/SwitchUSBInterface.cpp b/source/ControllerSwitch/SwitchUSBInterface.cpp similarity index 100% rename from SwitchUSB/source/SwitchUSBInterface.cpp rename to source/ControllerSwitch/SwitchUSBInterface.cpp diff --git a/SwitchUSB/include/SwitchUSBInterface.h b/source/ControllerSwitch/SwitchUSBInterface.h similarity index 100% rename from SwitchUSB/include/SwitchUSBInterface.h rename to source/ControllerSwitch/SwitchUSBInterface.h diff --git a/SwitchUSB/source/SwitchVirtualGamepadHandler.cpp b/source/ControllerSwitch/SwitchVirtualGamepadHandler.cpp similarity index 100% rename from SwitchUSB/source/SwitchVirtualGamepadHandler.cpp rename to source/ControllerSwitch/SwitchVirtualGamepadHandler.cpp diff --git a/SwitchUSB/include/SwitchVirtualGamepadHandler.h b/source/ControllerSwitch/SwitchVirtualGamepadHandler.h similarity index 100% rename from SwitchUSB/include/SwitchVirtualGamepadHandler.h rename to source/ControllerSwitch/SwitchVirtualGamepadHandler.h diff --git a/source/Makefile b/source/Makefile new file mode 100644 index 0000000..6e878f8 --- /dev/null +++ b/source/Makefile @@ -0,0 +1,16 @@ +COMPONENTS := AppletCompanion Sysmodule +TOPTARGETS := all clean + +.PHONY: $(TOPTARGETS) $(COMPONENTS) + +all: $(COMPONENTS) + +AppletCompanion: + $(MAKE) -C $@ -j$(nproc) + +Sysmodule: + $(MAKE) -C $@ buildSysmodule -j$(nproc) + +clean: + $(MAKE) -C AppletCompanion clean + $(MAKE) -C Sysmodule cleanSysmodule \ No newline at end of file diff --git a/source/README.md b/source/README.md index f8a6b36..ba3bb0e 100644 --- a/source/README.md +++ b/source/README.md @@ -1,2 +1,2 @@ ### File structure -![](https://i.imgur.com/hyYdbqG.png) +![](map.png) diff --git a/source/Sysmodule/Makefile b/source/Sysmodule/Makefile new file mode 100644 index 0000000..b06883f --- /dev/null +++ b/source/Sysmodule/Makefile @@ -0,0 +1,235 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITPRO)/libnx/switch_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 +# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) +# +# NO_ICON: if set to anything, do not use icon. +# NO_NACP: if set to anything, no .nacp file is generated. +# APP_TITLE is the name of the app stored in the .nacp file (Optional) +# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) +# APP_VERSION is the version of the app stored in the .nacp file (Optional) +# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) +# ICON is the filename of the icon (.jpg), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .jpg +# - icon.jpg +# - /default_icon.jpg +# +# CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .json +# - config.json +# If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead +# of a homebrew executable (.nro). This is intended to be used for sysmodules. +# NACP building is skipped as well. +#--------------------------------------------------------------------------------- +TARGET := sys-con +SOURCES := source ../ControllerSwitch ../ControllerLib ../ControllerLib/Controllers ../ControllerLib/Controllers/XboxOneAdapter ../inih +DATA := data +INCLUDES := include ../ControllerSwitch ../ControllerLib ../inih +#ROMFS := romfs + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE + +CFLAGS := -g -Wall -O2 -ffunction-sections \ + $(ARCH) $(DEFINES) $(BUILD_CFLAGS) + +CFLAGS += $(INCLUDE) -D__SWITCH__ + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=c++17 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lnx + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) $(LIBNX) + + +#--------------------------------------------------------------------------------- +# 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_BIN := $(addsuffix .o,$(BINFILES)) +export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) +export OFILES := $(OFILES_BIN) $(OFILES_SRC) +export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) + +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 $(CONFIG_JSON)),) + jsons := $(wildcard *.json) + ifneq (,$(findstring $(TARGET).json,$(jsons))) + export APP_JSON := $(TOPDIR)/$(TARGET).json + else + ifneq (,$(findstring config.json,$(jsons))) + export APP_JSON := $(TOPDIR)/config.json + endif + endif +else + export APP_JSON := $(TOPDIR)/$(CONFIG_JSON) +endif + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.jpg) + ifneq (,$(findstring $(TARGET).jpg,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).jpg + else + ifneq (,$(findstring icon.jpg,$(icons))) + export APP_ICON := $(TOPDIR)/icon.jpg + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +ifeq ($(strip $(NO_ICON)),) + export NROFLAGS += --icon=$(APP_ICON) +endif + +ifeq ($(strip $(NO_NACP)),) + export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp +endif + +ifneq ($(APP_TITLEID),) + export NACPFLAGS += --titleid=$(APP_TITLEID) +endif + +ifneq ($(ROMFS),) + export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) +endif + +.PHONY: all buildApplet buildSysmodule applet sysmodule cleanApplet cleanSysmodule + +#--------------------------------------------------------------------------------- +all: sysmodule + +buildApplet: + @echo building applet ... + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory \ + BUILD=$@ -C $@ -f $(CURDIR)/Makefile \ + DEPSDIR=$(CURDIR)/$@ \ + BUILD_CFLAGS="-D__APPLET__" \ + makeNRO + +buildSysmodule: + @echo building sysmodule ... + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory \ + BUILD=$@ -C $@ -f $(CURDIR)/Makefile \ + DEPSDIR=$(CURDIR)/$@ \ + makeNSP + +applet: buildApplet + +sysmodule: buildSysmodule + +cleanApplet: + @echo clean applet ... + @rm -fr buildApplet $(TARGET).nro $(TARGET).nacp $(TARGET).elf + +cleanSysmodule: + @echo clean sysmodule ... + @rm -fr buildSysmodule exefs.nsp $(TARGET).nsp $(TARGET).nso $(TARGET).npdm $(TARGET).elf + +# Makefile commands +#--------------------------------------------------------------------------------- +else +.PHONY: makeNRO makeNSP + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +makeNRO: $(OUTPUT).nro + +makeNSP: $(OUTPUT).nsp + +#TODO: add an option to make exefs.nsp instead of $(OUTPUT).nsp + +ifeq ($(strip $(NO_NACP)),) +$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp +else +$(OUTPUT).nro : $(OUTPUT).elf +endif + + + +$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm + +$(OUTPUT).nso : $(OUTPUT).elf + +$(OUTPUT).elf : $(OFILES) + +$(OFILES_SRC) : $(HFILES_BIN) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o %_bin.h : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/config.json b/source/Sysmodule/config.json similarity index 100% rename from config.json rename to source/Sysmodule/config.json diff --git a/source/configFile.cpp b/source/Sysmodule/source/configFile.cpp similarity index 100% rename from source/configFile.cpp rename to source/Sysmodule/source/configFile.cpp diff --git a/source/configFile.h b/source/Sysmodule/source/configFile.h similarity index 100% rename from source/configFile.h rename to source/Sysmodule/source/configFile.h diff --git a/source/log.c b/source/Sysmodule/source/log.c similarity index 100% rename from source/log.c rename to source/Sysmodule/source/log.c diff --git a/source/log.h b/source/Sysmodule/source/log.h similarity index 100% rename from source/log.h rename to source/Sysmodule/source/log.h diff --git a/source/main.cpp b/source/Sysmodule/source/main.cpp similarity index 100% rename from source/main.cpp rename to source/Sysmodule/source/main.cpp diff --git a/source/mainLoop.cpp b/source/Sysmodule/source/mainLoop.cpp similarity index 100% rename from source/mainLoop.cpp rename to source/Sysmodule/source/mainLoop.cpp diff --git a/source/mainLoop.h b/source/Sysmodule/source/mainLoop.h similarity index 100% rename from source/mainLoop.h rename to source/Sysmodule/source/mainLoop.h diff --git a/inih/ini.c b/source/inih/ini.c similarity index 100% rename from inih/ini.c rename to source/inih/ini.c diff --git a/inih/ini.h b/source/inih/ini.h similarity index 100% rename from inih/ini.h rename to source/inih/ini.h diff --git a/source/map.png b/source/map.png new file mode 100644 index 0000000..bce6646 Binary files /dev/null and b/source/map.png differ diff --git a/source/map.xml b/source/map.xml new file mode 100644 index 0000000..6a7d690 --- /dev/null +++ b/source/map.xml @@ -0,0 +1 @@ +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 \ No newline at end of file