diff --git a/.gitignore b/.gitignore index f66a961f..6029afce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .dep *.o +*.bin *.eep *.elf *.hex diff --git a/.travis.yml b/.travis.yml index e74744a9..6c26e411 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,23 +2,26 @@ os: linux dist: trusty sudo: required language: c -compiler: avr-gcc branches: except: - /^.*-automated-build$/ + - /^[0-9]+\.[0-9]+\.[0-9]+/ env: global: - secure: vBTSL34BDPxDilKUuTXqU4CJ26Pv5hogD2nghatkxSQkI1/jbdnLj/DQdPUrMJFDIY6TK3AltsBx72MaMsLQ1JO/Ou24IeHINHXzUC1FlS9yQa48cpxnhX5kzXNyGs3oa0qaFbvnr7RgYRWtmD52n4bIZuSuW+xpBv05x2OCizdT2ZonH33nATaHGFasxROm4qYZ241VfzcUv766V6RVHgL4x9V08warugs+RENVkfzxxwhk3NmkrISabze0gSVJLHBPHxroZC6EUcf/ocobcuDrCwFqtEt90i7pNIAFUE7gZsN2uE75LmpzAWin21G7lLPcPL2k4FJVd8an1HiP2WmscJU6U89fOfMb2viObnKcCzebozBCmKGtHEuXZo9FcReOx49AnQSpmESJGs+q2dL/FApkTjQiyT4J6O5dJpoww0/r57Wx0cmmqjETKBb5rSgXM51Etk3wO09mvcPHsEwrT7qH8r9XWdyCDoEn7FCLX3/LYnf/D4SmZ633YPl5gv3v9XEwxR5+04akjgnvWDSNIaDbWBdxHNb7l4pMc+WR1bwCyMyA7KXj0RrftEGOrm9ZRLe6BkbT4cycA+j77nbPOMcyZChliV9pPQos+4TOJoTzcK2L8yWVoY409aDNVuAjdP6Yum0R2maBGl/etLmIMpJC35C5/lZ+dUNjJAM= - matrix: - - TARGET=all-keyboards AUTOGEN=true - - TARGET=test AUTOGEN=false +before_install: + - wget http://www.atmel.com/images/avr8-gnu-toolchain-3.5.4.1709-linux.any.x86_64.tar.gz +install: + - tar -zxf avr8-gnu-toolchain-3.5.4.1709-linux.any.x86_64.tar.gz + - export PATH="$PATH:$TRAVIS_BUILD_DIR/avr8-gnu-toolchain-linux_x86_64/bin" +before_script: + - avr-gcc --version script: -- make $TARGET AUTOGEN=$AUTOGEN +- make test AUTOGEN=false +- bash util/travis_build.sh addons: apt: packages: - - avr-libc - - gcc-avr - dfu-programmer - pandoc - gcc-arm-none-eabi @@ -26,6 +29,11 @@ addons: - libnewlib-arm-none-eabi - diffutils after_success: - if [ "$AUTOGEN" == "true" ]; then - bash util/travis_compiled_push.sh; - fi + bash util/travis_compiled_push.sh +notifications: + webhooks: + urls: + - https://webhooks.gitter.im/e/cca31de3d44b9adb617b + on_success: change # options: [always|never|change] default: always + on_failure: always # options: [always|never|change] default: always + on_start: never # options: [always|never|change] default: always \ No newline at end of file diff --git a/Makefile b/Makefile index 66c0ff30..9d9c9629 100644 --- a/Makefile +++ b/Makefile @@ -16,10 +16,10 @@ ifdef SILENT endif # We need to make sure that silent is always turned off at the top level -# Otherwise the [OK], [ERROR] and [WARN] messags won't be displayed correctly +# Otherwise the [OK], [ERROR] and [WARN] messages won't be displayed correctly override SILENT := false -ON_ERROR := error_occured=1 +ON_ERROR := error_occurred=1 STARTING_MAKEFILE := $(firstword $(MAKEFILE_LIST)) ROOT_MAKEFILE := $(lastword $(MAKEFILE_LIST)) @@ -34,29 +34,29 @@ ABS_ROOT_DIR := $(dir $(ABS_ROOT_MAKEFILE)) STARTING_DIR := $(subst $(ABS_ROOT_DIR),,$(ABS_STARTING_DIR)) BUILD_DIR := $(ROOT_DIR)/.build TEST_DIR := $(BUILD_DIR)/test -ERROR_FILE := $(BUILD_DIR)/error_occured +ERROR_FILE := $(BUILD_DIR)/error_occurred MAKEFILE_INCLUDED=yes -# Helper function to process the newt element of a space separated path +# Helper function to process the newt element of a space separated path # It works a bit like the traditional functional head tail -# so the CURRENT_PATH_ELEMENT will beome the new head +# so the CURRENT_PATH_ELEMENT will become the new head # and the PATH_ELEMENTS are the rest that are still unprocessed define NEXT_PATH_ELEMENT $$(eval CURRENT_PATH_ELEMENT := $$(firstword $$(PATH_ELEMENTS))) $$(eval PATH_ELEMENTS := $$(wordlist 2,9999,$$(PATH_ELEMENTS))) endef -# We change the / to spaces so that we more easily can work with the elements +# We change the / to spaces so that we more easily can work with the elements # separately PATH_ELEMENTS := $(subst /, ,$(STARTING_DIR)) # Initialize the path elements list for further processing $(eval $(call NEXT_PATH_ELEMENT)) -# This function sets the KEYBOARD; KEYMAP and SUBPROJECT to the correct +# This function sets the KEYBOARD; KEYMAP and SUBPROJECT to the correct # variables depending on which directory you stand in. -# It's really a very simple if else chain, if you squint enough, -# but the makefile syntax makes it very verbose. +# It's really a very simple if else chain, if you squint enough, +# but the makefile syntax makes it very verbose. # If we are in a subfolder of keyboards ifeq ($(CURRENT_PATH_ELEMENT),keyboards) $(eval $(call NEXT_PATH_ELEMENT)) @@ -84,7 +84,7 @@ endif # Only consider folders with makefiles, to prevent errors in case there are extra folders KEYBOARDS := $(notdir $(patsubst %/Makefile,%,$(wildcard $(ROOT_DIR)/keyboards/*/Makefile))) -#Compability with the old make variables, anything you specify directly on the command line +#Compatibility with the old make variables, anything you specify directly on the command line # always overrides the detected folders ifdef keyboard KEYBOARD := $(keyboard) @@ -106,12 +106,12 @@ endif #$(info Keyboards: $(KEYBOARDS)) -# Set the default goal depening on where we are running make from +# Set the default goal depending on where we are running make from # this handles the case where you run make without any arguments .DEFAULT_GOAL := all ifneq ($(KEYMAP),) ifeq ($(SUBPROJECT),) - # Inside a keymap folder, just build the keymap, with the + # Inside a keymap folder, just build the keymap, with the # default subproject .DEFAULT_GOAL := $(KEYBOARD)-$(KEYMAP) else @@ -163,24 +163,24 @@ define TRY_TO_MATCH_RULE_FROM_LIST_HELPER3 ifneq ($1,) ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,$$(firstword $1)),true) MATCHED_ITEM := $$(firstword $1) - else + else $$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$$(wordlist 2,9999,$1))) endif endif endef # A recursive helper function for finding the longest match -# $1 The list to be checed -# It works by always removing the currently matched item from the list +# $1 The list to be checked +# It works by always removing the currently matched item from the list # and call itself recursively, until a match is found define TRY_TO_MATCH_RULE_FROM_LIST_HELPER2 - # Stop the recursion when the list is empty + # Stop the recursion when the list is empty ifneq ($1,) RULE_BEFORE := $$(RULE) $$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$1)) # If a match is found in the current list, otherwise just return what we had before ifeq ($$(RULE_FOUND),true) - # Save the best match so far and call itself recursivel + # Save the best match so far and call itself recursively BEST_MATCH := $$(MATCHED_ITEM) BEST_MATCH_RULE := $$(RULE) RULE_FOUND := false @@ -270,7 +270,7 @@ define PARSE_KEYBOARD $$(eval $$(call PARSE_SUBPROJECT,$$(SUBPROJECT))) # If there's no matching subproject, we assume it's the default # This will allow you to leave the subproject part of the target out - else + else $$(eval $$(call PARSE_SUBPROJECT,)) endif endef @@ -285,7 +285,7 @@ endef # When entering this, the keyboard and subproject are known, so now we need # to determine which keymaps are going to get compiled define PARSE_SUBPROJECT - # If we want to compile the default subproject, then we need to + # If we want to compile the default subproject, then we need to # include the correct makefile to determine the actual name of it CURRENT_SP := $1 ifeq ($$(CURRENT_SP),) @@ -304,7 +304,7 @@ define PARSE_SUBPROJECT endif endif # The special allsp is handled later - ifneq ($$(CURRENT_SP),allsp) + ifneq ($$(CURRENT_SP),allsp) # get a list of all keymaps KEYMAPS := $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/keymaps/*/.))) ifneq ($$(CURRENT_SP),) @@ -337,13 +337,13 @@ define PARSE_SUBPROJECT $$(eval $$(call PARSE_ALL_KEYMAPS)) endif else - # As earlier mentione,d when allsb is specified, we call our self recursively + # As earlier mentioned when allsb is specified, we call our self recursively # for all of the subprojects $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_SUBPROJECT,$(SUBPROJECTS))) endif endef -# If we want to parse all subprojects, but the keyboard doesn't have any, +# If we want to parse all subprojects, but the keyboard doesn't have any, # then use defaultsp instead define PARSE_ALL_SUBPROJECTS ifeq ($$(SUBPROJECTS),) @@ -403,11 +403,11 @@ define BUILD printf "$$(MAKE_MSG)\n\n"; \ $$(MAKE_CMD) $$(MAKE_VARS) SILENT=false; \ if [ $$$$? -gt 0 ]; \ - then error_occured=1; \ + then error_occurred=1; \ fi; endef -# Just parse all the keymaps for a specifc keyboard +# Just parse all the keymaps for a specific keyboard define PARSE_ALL_KEYMAPS $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYMAP,$$(KEYMAPS))) endef @@ -428,7 +428,7 @@ define BUILD_TEST printf "$$(TEST_MSG)\n"; \ $$(TEST_EXECUTABLE); \ if [ $$$$? -gt 0 ]; \ - then error_occured=1; \ + then error_occurred=1; \ fi; \ printf "\n"; endif @@ -448,7 +448,7 @@ endef # Set the silent mode depending on if we are trying to compile multiple keyboards or not -# By default it's on in that case, but it can be overriden by specifying silent=false +# By default it's on in that case, but it can be overridden by specifying silent=false # from the command line define SET_SILENT_MODE ifdef SUB_IS_SILENT @@ -465,30 +465,31 @@ include $(ROOT_DIR)/message.mk # The empty line is important here, as it will force a new shell to be created for each command # Otherwise the command line will become too long with a lot of keyboards and keymaps define RUN_COMMAND -+error_occured=0;\ ++error_occurred=0;\ $(COMMAND_$(SILENT_MODE)_$(COMMAND))\ -if [ $$error_occured -gt 0 ]; then echo $$error_occured > $(ERROR_FILE); fi; +if [ $$error_occurred -gt 0 ]; then echo $$error_occurred > $(ERROR_FILE); fi; endef define RUN_TEST -+error_occured=0;\ -$($(TEST)_COMMAND))\ -if [ $$error_occured -gt 0 ]; then echo $$error_occured > $(ERROR_FILE); fi; ++error_occurred=0;\ +$($(TEST)_COMMAND)\ +if [ $$error_occurred -gt 0 ]; then echo $$error_occurred > $(ERROR_FILE); fi; endef # Allow specifying just the subproject, in the keyboard directory, which will compile all keymaps SUBPROJECTS := $(notdir $(patsubst %/Makefile,%,$(wildcard ./*/Makefile))) .PHONY: $(SUBPROJECTS) -$(SUBPROJECTS): %: %-allkm +$(SUBPROJECTS): %: %-allkm # Let's match everything, we handle all the rule parsing ourselves .PHONY: % -%: +%: # Check if we have the CMP tool installed - cmp --version >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi; + cmp $(ROOT_DIR)/Makefile $(ROOT_DIR)/Makefile >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi; # Check if the submodules are dirty, and display a warning if they are +ifndef SKIP_GIT git submodule status --recursive 2>/dev/null | \ while IFS= read -r x; do \ case "$$x" in \ @@ -496,6 +497,7 @@ $(SUBPROJECTS): %: %-allkm *) printf "$(MSG_SUBMODULE_DIRTY)";break;; \ esac \ done +endif rm -f $(ERROR_FILE) > /dev/null 2>&1 $(eval $(call PARSE_RULE,$@)) $(eval $(call SET_SILENT_MODE)) @@ -505,14 +507,14 @@ $(SUBPROJECTS): %: %-allkm # But we return the error code at the end, to trigger travis failures $(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND)) if [ -f $(ERROR_FILE) ]; then printf "$(MSG_ERRORS)" & exit 1; fi; - $(foreach TEST,$(TESTS),$(RUN_TEST)) + $(foreach TEST,$(TESTS),$(RUN_TEST)) if [ -f $(ERROR_FILE) ]; then printf "$(MSG_ERRORS)" & exit 1; fi; # All should compile everything .PHONY: all all: all-keyboards test-all -# Define some shortcuts, mostly for compability with the old syntax +# Define some shortcuts, mostly for compatibility with the old syntax .PHONY: all-keyboards all-keyboards: allkb-allsp-allkm @@ -526,9 +528,13 @@ test: test-all test-clean: test-all-clean # Generate the version.h file -GIT_VERSION := $(shell git describe --abbrev=6 --dirty --always --tags 2>/dev/null || date +"%Y-%m-%d-%H:%M:%S") +ifndef SKIP_GIT + GIT_VERSION := $(shell git describe --abbrev=6 --dirty --always --tags 2>/dev/null || date +"%Y-%m-%d-%H:%M:%S") +else + GIT_VERSION := NA +endif BUILD_DATE := $(shell date +"%Y-%m-%d-%H:%M:%S") $(shell echo '#define QMK_VERSION "$(GIT_VERSION)"' > $(ROOT_DIR)/quantum/version.h) $(shell echo '#define QMK_BUILDDATE "$(BUILD_DATE)"' >> $(ROOT_DIR)/quantum/version.h) -include $(ROOT_DIR)/testlist.mk \ No newline at end of file +include $(ROOT_DIR)/testlist.mk diff --git a/build_keyboard.mk b/build_keyboard.mk index 61aebf39..82464d58 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -23,9 +23,9 @@ ifdef master MASTER = $(master) endif -ifeq ($(MASTER),right) +ifeq ($(MASTER),right) OPT_DEFS += -DMASTER_IS_ON_RIGHT -else +else ifneq ($(MASTER),left) $(error MASTER does not have a valid value(left/right)) endif @@ -38,7 +38,7 @@ KEYBOARD_C := $(KEYBOARD_PATH)/$(KEYBOARD).c ifneq ("$(wildcard $(KEYBOARD_C))","") include $(KEYBOARD_PATH)/rules.mk -else +else $(error "$(KEYBOARD_C)" does not exist) endif @@ -49,7 +49,7 @@ ifneq ($(SUBPROJECT),) ifneq ("$(wildcard $(SUBPROJECT_C))","") OPT_DEFS += -DSUBPROJECT_$(SUBPROJECT) include $(SUBPROJECT_PATH)/rules.mk - else + else $(error "$(SUBPROJECT_PATH)/$(SUBPROJECT).c" does not exist) endif endif @@ -83,7 +83,7 @@ ifneq ($(SUBPROJECT),) endif endif -# Save the defines and includes here, so we don't include any keymap specific ones +# Save the defines and includes here, so we don't include any keymap specific ones PROJECT_DEFS := $(OPT_DEFS) PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(SUBPROJECT_PATH) $(KEYBOARD_PATH) PROJECT_CONFIG := $(CONFIG_H) @@ -131,35 +131,64 @@ ifndef CUSTOM_MATRIX SRC += $(QUANTUM_DIR)/matrix.c endif +ifeq ($(strip $(API_SYSEX_ENABLE)), yes) + OPT_DEFS += -DAPI_SYSEX_ENABLE + SRC += $(QUANTUM_DIR)/api/api_sysex.c + OPT_DEFS += -DAPI_ENABLE + SRC += $(QUANTUM_DIR)/api.c + MIDI_ENABLE=yes +endif + +MUSIC_ENABLE := 0 + +ifeq ($(strip $(AUDIO_ENABLE)), yes) + OPT_DEFS += -DAUDIO_ENABLE + MUSIC_ENABLE := 1 + SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c + SRC += $(QUANTUM_DIR)/audio/audio.c + SRC += $(QUANTUM_DIR)/audio/voices.c + SRC += $(QUANTUM_DIR)/audio/luts.c +endif + ifeq ($(strip $(MIDI_ENABLE)), yes) OPT_DEFS += -DMIDI_ENABLE + MUSIC_ENABLE := 1 SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c endif +ifeq ($(MUSIC_ENABLE), 1) + SRC += $(QUANTUM_DIR)/process_keycode/process_music.c +endif + +ifeq ($(strip $(COMBO_ENABLE)), yes) + OPT_DEFS += -DCOMBO_ENABLE + SRC += $(QUANTUM_DIR)/process_keycode/process_combo.c +endif + ifeq ($(strip $(VIRTSER_ENABLE)), yes) OPT_DEFS += -DVIRTSER_ENABLE endif -ifeq ($(strip $(AUDIO_ENABLE)), yes) - OPT_DEFS += -DAUDIO_ENABLE - SRC += $(QUANTUM_DIR)/process_keycode/process_music.c - SRC += $(QUANTUM_DIR)/audio/audio.c - SRC += $(QUANTUM_DIR)/audio/voices.c - SRC += $(QUANTUM_DIR)/audio/luts.c +ifeq ($(strip $(FAUXCLICKY_ENABLE)), yes) + OPT_DEFS += -DFAUXCLICKY_ENABLE + SRC += $(QUANTUM_DIR)/fauxclicky.c endif ifeq ($(strip $(UCIS_ENABLE)), yes) OPT_DEFS += -DUCIS_ENABLE - UNICODE_ENABLE = yes + SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c + SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c endif ifeq ($(strip $(UNICODEMAP_ENABLE)), yes) OPT_DEFS += -DUNICODEMAP_ENABLE - UNICODE_ENABLE = yes + SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c + SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c endif ifeq ($(strip $(UNICODE_ENABLE)), yes) OPT_DEFS += -DUNICODE_ENABLE + SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c endif @@ -174,6 +203,12 @@ ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c endif +ifeq ($(strip $(PRINTING_ENABLE)), yes) + OPT_DEFS += -DPRINTING_ENABLE + SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c + SRC += $(TMK_DIR)/protocol/serial_uart.c +endif + ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes) SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC)) OPT_DEFS += $(SERIAL_DEFS) @@ -199,6 +234,7 @@ endif VPATH += $(KEYBOARD_PATH) VPATH += $(COMMON_VPATH) +include $(TMK_PATH)/protocol.mk include $(TMK_PATH)/common.mk SRC += $(TMK_COMMON_SRC) @@ -206,7 +242,11 @@ OPT_DEFS += $(TMK_COMMON_DEFS) EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS) ifeq ($(PLATFORM),AVR) +ifeq ($(strip $(PROTOCOL)), VUSB) + include $(TMK_PATH)/protocol/vusb.mk +else include $(TMK_PATH)/protocol/lufa.mk +endif include $(TMK_PATH)/avr.mk endif @@ -218,7 +258,7 @@ endif OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT) $(KEYMAP_OUTPUT)_SRC := $(SRC) -$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\" +$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\" $(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H) $(KEYBOARD_OUTPUT)_SRC := $(CHIBISRC) diff --git a/common.mk b/common.mk index 18751cd5..c4b9394a 100644 --- a/common.mk +++ b/common.mk @@ -23,4 +23,5 @@ COMMON_VPATH += $(QUANTUM_PATH) COMMON_VPATH += $(QUANTUM_PATH)/keymap_extras COMMON_VPATH += $(QUANTUM_PATH)/audio COMMON_VPATH += $(QUANTUM_PATH)/process_keycode +COMMON_VPATH += $(QUANTUM_PATH)/api COMMON_VPATH += $(SERIAL_PATH) \ No newline at end of file diff --git a/doc/BUILD_GUIDE.md b/doc/BUILD_GUIDE.md index 70a4e10f..17501918 100644 --- a/doc/BUILD_GUIDE.md +++ b/doc/BUILD_GUIDE.md @@ -6,7 +6,7 @@ 1. If you have ever installed WinAVR, uninstall it. 2. Install [MHV AVR Tools](https://infernoembedded.com/sites/default/files/project/MHV_AVR_Tools_20131101.exe). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**. 3. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location. -4. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/jackhumbert/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer. +4. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/qmk/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer. 5. Double-click on the 1-setup-path-win batch script to run it. You'll need to accept a User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up. 6. Right-click on the 2-setup-environment-win batch script, select "Run as administrator", and accept the User Account Control prompt. This part may take a couple of minutes, and you'll need to approve a driver installation, but once it finishes, your environment is complete! 7. Future build commands should be run from the standard Windows command prompt, which you can find by searching for "command prompt" from the start menu or start screen. Ignore the "MHV AVR Shell". @@ -38,7 +38,7 @@ Debian/Ubuntu example: If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [VAGRANT_GUIDE file](VAGRANT_GUIDE.md). ## Verify Your Installation -1. If you haven't already, obtain this repository ([https://github.com/jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware)). You can either download it as a zip file and extract it, or clone it using the command line tool git or the Github Desktop application. +1. If you haven't already, obtain this repository ([https://github.com/qmk/qmk_firmware](https://github.com/qmk/qmk_firmware)). You can either download it as a zip file and extract it, or clone it using the command line tool git or the Github Desktop application. 2. Open up a terminal or command prompt and navigate to the `qmk_firmware` folder using the `cd` command. The command prompt will typically open to your home directory. If, for example, you cloned the repository to your Documents folder, then you would type `cd Documents/qmk_firmware`. If you extracted the file from a zip, then it may be named `qmk_firmware-master` instead. 3. To confirm that you're in the correct location, you can display the contents of your current folder using the `dir` command on Windows, or the `ls` command on Linux or Mac. You should see several files, including `readme.md` and a `quantum` folder. From here, you need to navigate to the appropriate folder under `keyboards/`. For example, if you're building for a Planck, run `cd keyboards/planck`. 4. Once you're in the correct keyboard-specific folder, run the `make` command. This should output a lot of information about the build process. More information about the `make` command can be found below. diff --git a/doc/COPYING.GPLv2 b/doc/COPYING.GPLv2 deleted file mode 100644 index d159169d..00000000 --- a/doc/COPYING.GPLv2 +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/doc/COPYING.GPLv3 b/doc/COPYING.GPLv3 deleted file mode 100644 index 94a9ed02..00000000 --- a/doc/COPYING.GPLv3 +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/doc/CYGWIN_GUIDE.md b/doc/CYGWIN_GUIDE.md index 05e7a55f..05d71961 100755 --- a/doc/CYGWIN_GUIDE.md +++ b/doc/CYGWIN_GUIDE.md @@ -234,7 +234,7 @@ If you did everything else right. This part should be a snap! Grab the latest so ###Build Planck and Load the Firmware ``` $ cd ~/src -$ git clone https://github.com/jackhumbert/qmk_firmware.git +$ git clone https://github.com/qmk/qmk_firmware.git $ cd qmk_firmware/keyboards/planck $ make ``` diff --git a/doc/HAND_WIRE.md b/doc/HAND_WIRE.md index 18cb7011..17ef3116 100644 --- a/doc/HAND_WIRE.md +++ b/doc/HAND_WIRE.md @@ -183,7 +183,7 @@ As you move along, be sure that the Teensy is staying in place - recutting and s From here, you should have a working keyboard with the correct firmware. Before we attach the Teensy permanently to the keyboard, let's quickly get some firmware loaded onto the Teensy so we can test each keyswitch. -To start out, download [the firmware](https://github.com/jackhumbert/qmk_firmware/) - we'll be using my (Jack's) fork of TMK called QMK/Quantum. We'll be doing a lot from the Terminal/command prompt, so get that open, along with a decent text editor like [Sublime Text](http://www.sublimetext.com/). +To start out, download [the firmware](https://github.com/qmk/qmk_firmware/) - we'll be using my (Jack's) fork of TMK called QMK/Quantum. We'll be doing a lot from the Terminal/command prompt, so get that open, along with a decent text editor like [Sublime Text](http://www.sublimetext.com/). The first thing we're going to do is create a new project using the script in the root directory of the firmware. In your terminal, run this command with `` replaced by the name of your project - it'll need to be different from any other project in the `keyboards/` folder: @@ -276,7 +276,7 @@ This can be accomplished by using the following `keymaps` definition: ), }; -Note that the layout of the keycodes is similar to the physical layout of our keyboard - this make it much easier to see what's going on. A lot of the keycodes should be fairly obvious, but for a full list of them, check out [tmk_code/doc/keycode.txt](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keycode.txt) - there are also a lot of aliases to condense your keymap file. +Note that the layout of the keycodes is similar to the physical layout of our keyboard - this make it much easier to see what's going on. A lot of the keycodes should be fairly obvious, but for a full list of them, check out [tmk_code/doc/keycode.txt](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/doc/keycode.txt) - there are also a lot of aliases to condense your keymap file. It's also important to use the `KEYMAP` function we defined earlier - this is what allows the firmware to associate our intended readable keymap with the actual wiring. @@ -306,7 +306,7 @@ If you've done all of these things, keep in mind that sometimes you might have h Now that you have a working board, it's time to get things in their permanent positions. I've often used liberal amounts of hot glue to secure and insulate things, so if that's your style, start spreading that stuff like butter. Otherwise, double-sided tape is always an elegant solution, and electrical tape is a distant second. Due to the nature of these builds, a lot of this part is up to you and how you planned (or didn't plan) things out. -There are a lot of possibilities inside the firmware - check out the [readme](https://github.com/jackhumbert/qmk_firmware/blob/master/readme.md) for a full feature list, and dive into the different project (Planck, Ergodox EZ, etc) to see how people use all of them. You can always stop by [the OLKB subreddit for help!](http://reddit.com/r/olkb) +There are a lot of possibilities inside the firmware - check out the [readme](https://github.com/qmk/qmk_firmware/blob/master/readme.md) for a full feature list, and dive into the different project (Planck, Ergodox EZ, etc) to see how people use all of them. You can always stop by [the OLKB subreddit for help!](http://reddit.com/r/olkb) ## Trouble-shooting compiling diff --git a/doc/PCB_GUIDE.md b/doc/PCB_GUIDE.md index 3fad41df..16de7111 100644 --- a/doc/PCB_GUIDE.md +++ b/doc/PCB_GUIDE.md @@ -5,7 +5,7 @@ ### Windows 1. Install [MHV AVR Tools](https://infernoembedded.com/sites/default/files/project/MHV_AVR_Tools_20131101.exe). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**. 2. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location. -3. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/jackhumbert/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer. +3. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/qmk/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer. 4. Right-click on the 1-setup-path-win batch script, select "Run as administrator", and accept the User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up. 5. Right-click on the 2-setup-environment-win batch script, select "Run as administrator", and accept the User Account Control prompt. This part may take a couple of minutes, and you'll need to approve a driver installation, but once it finishes, your environment is complete! @@ -32,7 +32,7 @@ Note that, since it will be directly accessing USB hardware, the `dfu-programmer` program needs to be run as root. ## Verify Your Installation -1. Clone the following repository: https://github.com/jackhumbert/qmk_firmware +1. Clone the following repository: https://github.com/qmk/qmk_firmware 2. Open a Terminal and `cd` into `qmk_firmware/keyboards/planck` 3. Run `make`. This should output a lot of information about the build process. @@ -80,7 +80,7 @@ when trying to 'make dfu' on Windows you need to copy the dfu-programmer.exe to ### Keymap -Unlike the other keymaps, prefixing the keycodes with `KC_` is required. A full list of the keycodes is available [here](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keycode.txt). For the keycodes available only in the extended keymap, see this [header file](https://github.com/jackhumbert/qmk_firmware/blob/master/quantum/keymap_common.h). +Unlike the other keymaps, prefixing the keycodes with `KC_` is required. A full list of the keycodes is available [here](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/doc/keycode.txt). For the keycodes available only in the extended keymap, see this [header file](https://github.com/qmk/qmk_firmware/blob/master/quantum/keymap_common.h). You can use modifiers with keycodes like this: diff --git a/doc/keymap.md b/doc/keymap.md index 6f2a663f..2b0d2cd9 100644 --- a/doc/keymap.md +++ b/doc/keymap.md @@ -549,6 +549,9 @@ Layer switching with tap key: [dual_role]: http://en.wikipedia.org/wiki/Modifier_key#Dual-role_keys +When user hold a key after tap, it repeat the tapped key rather to hold a modifier key. +If you prefer to hold a modifier instead, define `TAPPING_FORCE_HOLD` in `config.h`. +See https://github.com/qmk/qmk_firmware/issues/889 for the detail. ### 4.2 Tap Toggle This is a feature to assign both toggle layer and momentary switch layer action to just same one physical key. It works as momentary layer switch when holding a key but toggle switch with several taps. diff --git a/keyboards/amj60/config.h b/keyboards/amj60/config.h index d98e0e9f..7c06f9a6 100644 --- a/keyboards/amj60/config.h +++ b/keyboards/amj60/config.h @@ -67,7 +67,7 @@ along with this program. If not, see . */ #define RGB_DI_PIN E2 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 8 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/amjpad/Makefile b/keyboards/amjpad/Makefile new file mode 100644 index 00000000..4e2a6f00 --- /dev/null +++ b/keyboards/amjpad/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif \ No newline at end of file diff --git a/keyboards/amjpad/amjpad.c b/keyboards/amjpad/amjpad.c new file mode 100644 index 00000000..ac5991bd --- /dev/null +++ b/keyboards/amjpad/amjpad.c @@ -0,0 +1,30 @@ +#include "amjpad.h" +#include "led.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + matrix_init_user(); + led_init_ports(); +}; + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + matrix_scan_user(); +}; + +void led_init_ports(void) { + // * Set our LED pins as output + DDRD |= (1<<6); +} + +void led_set_kb(uint8_t usb_led) { + if (usb_led & (1< + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0003 +#define MANUFACTURER AMJ +#define PRODUCT PAD +#define DESCRIPTION QMK keyboard firmware for AMJ PAD + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 4 + +// ROWS: Top to bottom, COLS: Left to right + +#define MATRIX_ROW_PINS { F7, F6, F5, F4, D5, D0 } +#define MATRIX_COL_PINS { F1, F0, E6, C7 } +#define UNUSED_PINS + +#define BACKLIGHT_PIN B6 + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* Backlight configuration + */ +#define BACKLIGHT_LEVELS 4 + +/* Underlight configuration + */ + +#define RGB_DI_PIN E2 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 8 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/amjpad/keymaps/default/keymap.c b/keyboards/amjpad/keymaps/default/keymap.c new file mode 100644 index 00000000..362afd10 --- /dev/null +++ b/keyboards/amjpad/keymaps/default/keymap.c @@ -0,0 +1,101 @@ +#include "amjpad.h" + +#ifdef RGBLIGHT_ENABLE +#include "rgblight.h" +#endif + +// Used for SHIFT_ESC +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 + +#define _______ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,-------------------. + * |Esc |TAB |BS | = | + * |----|----|----|----| + * | NL | / | * | - | + * |----|----|----|----| + * | 7 | 8 | 9 | | + * |----|----|----| + | + * | 4 | 5 | 6 | | + * |----|----|----|----| + * | 1 | 2 | 3 | | + * |----|----|----| En | + * | 0 |./FN| | + * `-------------------' + */ + +[_BL] = KEYMAP( + KC_ESC,KC_TAB,KC_BSPC,KC_PEQL, \ + KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, \ + KC_P7, KC_P8, KC_P9, KC_PPLS, \ + KC_P4, KC_P5, KC_P6, \ + KC_P1, KC_P2, KC_P3, KC_PENT, \ + KC_P0, LT(_FL,KC_PDOT)), + + /* Keymap _FL: Function Layer + * ,-------------------. + * |Esc |TAB |BS | = | + * |----|----|----|----| + * | NL | / | * | - | + * |----|----|----|----| + * | 7 | 8 | 9 | | + * |----|----|----|RST | + * | 4 | 5 | 6 | | + * |----|----|----|----| + * | 1 | 2 | 3 | | + * |----|----|----| En | + * | 0 |./FN| | + * `-------------------' + */ +[_FL] = KEYMAP( + + KC_ESC,KC_TAB,KC_BSPC,KC_PEQL, \ + KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ + KC_P7, KC_P8, KC_P9, RESET, \ + KC_P4, KC_P5, KC_P6, \ + KC_P1, KC_P2, KC_P3, KC_PENT, \ + KC_P0, LT(_FL,KC_PDOT)), +}; + +enum function_id { + SHIFT_ESC, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(SHIFT_ESC), +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t shift_esc_shift_mask; + switch (id) { + case SHIFT_ESC: + shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (shift_esc_shift_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (shift_esc_shift_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/amjpad/rules.mk b/keyboards/amjpad/rules.mk new file mode 100644 index 00000000..d8ec4236 --- /dev/null +++ b/keyboards/amjpad/rules.mk @@ -0,0 +1,66 @@ + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +RGBLIGHT_ENABLE ?= no # Enable keyboard underlight functionality (+4870) +BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality (+1150) +MIDI_ENABLE ?= no # MIDI controls +AUDIO_ENABLE ?= no +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID diff --git a/keyboards/atreus/keymaps/default/keymap.c b/keyboards/atreus/keymaps/default/keymap.c index 04ad66fe..ce92e89c 100644 --- a/keyboards/atreus/keymaps/default/keymap.c +++ b/keyboards/atreus/keymaps/default/keymap.c @@ -15,8 +15,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QW] = { /* Qwerty */ {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P }, {KC_A, KC_S, KC_D, KC_F, KC_G, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN }, - {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LALT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH }, - {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT } + {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH }, + {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LALT, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT } }, /* * ! @ up { } || pgup 7 8 9 * @@ -27,8 +27,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RS] = { /* [> RAISE <] */ {KC_EXLM, KC_AT, KC_UP, KC_LCBR, KC_RCBR, KC_TRNS, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR}, {KC_HASH, KC_LEFT, KC_DOWN, KC_RGHT, KC_DLR, KC_TRNS, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS}, - {KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_AMPR, KC_LALT, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS}, - {TG(_LW), KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL} + {KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_AMPR, KC_LCTL, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS}, + {TG(_LW), KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL} }, /* * insert home up end pgup || up F7 F8 F9 F10 @@ -39,8 +39,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LW] = { /* [> LOWER <] */ {KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_TRNS, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10}, {KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_TRNS, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11}, - {KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, RESET, KC_LALT, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12}, - {KC_TRNS, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, DF(_QW), KC_PSCR, KC_SLCK, KC_PAUS} + {KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, RESET, KC_LCTL, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12}, + {KC_TRNS, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LALT, KC_SPC, DF(_QW), KC_PSCR, KC_SLCK, KC_PAUS} }}; const uint16_t PROGMEM fn_actions[] = { diff --git a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-base-colemakdh.png b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-base-colemakdh.png deleted file mode 100644 index 4640f9f5..00000000 Binary files a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-base-colemakdh.png and /dev/null differ diff --git a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-base.png b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-base.png new file mode 100644 index 00000000..1d5bd78d Binary files /dev/null and b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-base.png differ diff --git a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-extend.png b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-extend.png index 08c2e614..cf4db3e2 100644 Binary files a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-extend.png and b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-extend.png differ diff --git a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-function.png b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-function.png index 34ad03de..30e5621e 100644 Binary files a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-function.png and b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-function.png differ diff --git a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-game.png b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-game.png index 14ae35b5..95f8be5e 100644 Binary files a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-game.png and b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-game.png differ diff --git a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-num.png b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-num.png index 6598acb2..3c445f90 100644 Binary files a/keyboards/atreus/keymaps/replicaJunction/atreus-replica-num.png and b/keyboards/atreus/keymaps/replicaJunction/atreus-replica-num.png differ diff --git a/keyboards/atreus/keymaps/replicaJunction/keymap.c b/keyboards/atreus/keymaps/replicaJunction/keymap.c index 52d3677f..d39a184d 100644 --- a/keyboards/atreus/keymaps/replicaJunction/keymap.c +++ b/keyboards/atreus/keymaps/replicaJunction/keymap.c @@ -1,7 +1,7 @@ /* * Keyboard: Atreus * Keymap: replicaJunction - * Version: 0.3 + * Version: 0.4 * * This keymap is designed to complement my Ergodox keyboard layout, found in keyboards/ergodox_ez. * The Atreus keyboard is a 40% board whose design was heavily influenced by the Ergodox. I now @@ -42,51 +42,157 @@ #define KX_PAST LCTL(KC_V) #define KX_UNDO LCTL(KC_Z) +#define _USER 0 // User macro + ; // This doesn't do anything. It's just for VSCode because its syntax highlighting is weird for the above #define statements. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* + * Colemak-ModDH + * + * ,----------------------------------. ,----------------------------------. + * | Q | W | F | P | B | | J | L | U | Y | ; | + * +------+------+------+------+------| +------+------+------+------+------| + * | A | R | S | T | G | | M | N | E | I | O | + * +------+------+------+------+------| +------+------+------+------+------| + * |Z Shft| X | C | D | V | ,------. ,------. | K | H | , | . |/ Shft| + * +------+------+------+------+------| | Ctrl | | Alt | +------+------+------+------+------| + * | Esc | Gui | Tab | _FN | Bksp | | Del | | Enter| |Sp/_NU| _EX | - | ' | = | + * `----------------------------------' `------' `------' `----------------------------------' + * + */ [_CO] = KEYMAP( KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, SFT_T(KC_Z), KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, SFT_T(KC_SLSH), - KC_ESC, KC_LGUI, KC_TAB, KC_LALT, KC_BSPC, CTL_T(KC_DEL), ALT_T(KC_ENT), LT(_NU, KC_SPC), MO(_EX), KC_MINS, KC_QUOT, KC_EQL + KC_ESC, KC_LGUI, KC_TAB, MO(_FN), KC_BSPC, CTL_T(KC_DEL), ALT_T(KC_ENT), LT(_NU, KC_SPC), MO(_EX), KC_MINS, KC_QUOT, KC_EQL ), +/* + * QWERTY + * + * ,----------------------------------. ,----------------------------------. + * | Q | W | E | R | T | | Y | U | I | O | P | + * +------+------+------+------+------| +------+------+------+------+------| + * | A | S | D | F | G | | H | J | K | L | ; | + * +------+------+------+------+------| +------+------+------+------+------| + * |Z Shft| X | C | V | B | ,------. ,------. | N | M | , | . |/ Shft| + * +------+------+------+------+------| | Ctrl | | Alt | +------+------+------+------+------| + * | Esc | Gui | Tab | _FN | Bksp | | Del | | Enter| |Sp/_NU| _EX | - | ' | = | + * `----------------------------------' `------' `------' `----------------------------------' + * + */ [_QW] = KEYMAP( /* Qwerty */ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH), - KC_ESC, KC_LGUI, KC_TAB, KC_LALT, KC_BSPC, CTL_T(KC_DEL), ALT_T(KC_ENT), LT(_NU, KC_SPC), MO(_EX), KC_MINS, KC_QUOT, KC_EQL + KC_ESC, KC_LGUI, KC_TAB, MO(_FN), KC_BSPC, CTL_T(KC_DEL), ALT_T(KC_ENT), LT(_NU, KC_SPC), MO(_EX), KC_MINS, KC_QUOT, KC_EQL ), +/* + * Extend + * + * Ctrl+` is a keyboard shortcut for the program ConEmu, which brings up a dropdown console window. + * + * Also note that some dual-role keys are overridden here with their modifiers + * + * ,----------------------------------. ,----------------------------------. + * | | | | |Ctrl `| | PgUp | Home | Up | End | Del | + * +------+------+------+------+------| +------+------+------+------+------| + * | Gui | Shift| Alt | Ctrl | | | PgDn | Left | Down | Right| Bksp | + * +------+------+------+------+------| +------+------+------+------+------| + * | Shift| Cut | Copy | | Paste| ,------. ,------. | | ^Tab | Tab | |Insert| + * +------+------+------+------+------| | Del | | Enter| +------+------+------+------+------| + * | | | | | | | | | | | Space|XXXXXX| | |PrntSc| + * `----------------------------------' `------' `------' `----------------------------------' + * + */ [_EX] = KEYMAP( /* Extend */ - KC_CAPS, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_DEL, - _______, KC_LGUI, KC_LALT, KC_LCTL, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_BSPC, - _______, KX_CUT, KX_COPY, _______, KX_PAST, _______, KC_TAB, KCX_LST, _______, KC_INSERT, - _______, _______, _______, _______, _______, _______, _______, KC_SPC, _______, _______, _______, KC_PSCR + _______, _______, _______, _______, LCTL(KC_GRV), KC_PGUP, KC_HOME, KC_UP, KC_END, KC_DEL, + KC_LGUI, KC_LSFT, KC_LALT, KC_LCTL, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_BSPC, + KC_LSFT, KX_CUT, KX_COPY, _______, KX_PAST, _______, KCX_LST, KC_TAB, _______, KC_INS, + _______, _______, _______, _______, _______, KC_DEL, KC_ENT, KC_SPC, _______, _______, _______, KC_PSCR ), +/* + * Numbers and symbols + * + * ,----------------------------------. ,----------------------------------. + * | ! | @ | { | } | & | | / | 7 | 8 | 9 | * | + * +------+------+------+------+------| +------+------+------+------+------| + * | # | $ | ( | ) | ~ | | | | 4 | 5 | 6 | - | + * +------+------+------+------+------| +------+------+------+------+------| + * | % | ^ | [ | ] | ` | ,------. ,------. | \ | 1 | 2 | 3 | + | + * +------+------+------+------+------| | | | | +------+------+------+------+------| + * | | _GA | | | | | | | | |XXXXXX| 0 | . | = | | + * `----------------------------------' `------' `------' `----------------------------------' + * + */ [_NU] = KEYMAP( /* Numbers and symbols */ KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_AMPR, KC_SLSH, KC_7, KC_8, KC_9, KC_ASTR, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_TILD, KC_PIPE, KC_4, KC_5, KC_6, KC_MINS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_GRV, KC_BSLS, KC_1, KC_2, KC_3, KC_PLUS, - _______, TG(_GA), _______, MO(_FN), _______, _______, _______, _______, KC_0, KC_DOT, KC_EQL, _______ + _______, TG(_GA), _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_EQL, _______ ), +/* + * Functions + * + * ,----------------------------------. ,----------------------------------. + * | Caps | F9 | F10 | F11 | F12 | | _USER|Whl Up| MUp |Whl Dn| | + * +------+------+------+------+------| +------+------+------+------+------| + * | | F5 | F6 | F7 | F8 | | Vol ^| MLeft| MDown|MRight| | + * +------+------+------+------+------| +------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | ,------. ,------. | Vol v| | | | | + * +------+------+------+------+------| | | |RClick| +------+------+------+------+------| + * | | | |XXXXXX| | | | | | |LClick|MClick| _CO | _GA | RESET| + * `----------------------------------' `------' `------' `----------------------------------' + * + */ [_FN] = KEYMAP( /* Functions */ - KC_DEL, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, KC_F7, KC_F8, KC_F9, KC_F10, - KC_BSPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, _______, KC_F4, KC_F5, KC_F6, KC_F11, - _______, KC_VOLU, KC_MUTE, KC_VOLD, KC_MPLY, _______, KC_F1, KC_F2, KC_F3, KC_F12, - _______, _______, _______, _______, KC_MSTP, _______, _______, _______, KC_NO, DF(_CO), DF(_QW), RESET + KC_CAPS, KC_F9, KC_F10, KC_F11, KC_F12, M(_USER),KC_WH_U, KC_MS_U, KC_WH_D, _______, + _______, KC_F5, KC_F6, KC_F7, KC_F8, KC_VOLU, KC_MS_L, KC_MS_D, KC_MS_R, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_VOLD, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, KC_BTN2, KC_BTN1, KC_BTN3, DF(_CO), DF(_QW), RESET ), +/* + * Gaming + * + * ,----------------------------------. ,----------------------------------. + * | | | | | | | |Whl Up| MUp |Whl Dn| | + * +------+------+------+------+------| +------+------+------+------+------| + * | | | | | | | | MLeft| MDown|MRight| | + * +------+------+------+------+------| +------+------+------+------+------| + * | Z | | | | | ,------. ,------. | | | | | | + * +------+------+------+------+------| | Bksp | |RClick| +------+------+------+------+------| + * | | _GA | | Shift| Space| | | | | |LClick|MClick| | | | + * `----------------------------------' `------' `------' `----------------------------------' + * + */ [_GA] = KEYMAP( /* Gaming */ _______, _______, _______, _______, _______, _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, - KC_Z, _______, _______, _______, _______, KC_BTN3, _______, KC_MS_D, _______, _______, - _______, TG(_GA), _______, KC_LSFT, KC_SPC, KC_BSPC, KC_BTN2, KC_BTN1, _______, _______, _______, _______ + KC_Z, _______, _______, _______, _______, _______, _______, KC_MS_D, _______, _______, + _______, TG(_GA), _______, KC_LSFT, KC_SPC, KC_BSPC, KC_BTN2, KC_BTN1, KC_BTN3, _______, _______, _______ )}; +/* + * Template + * + * ,----------------------------------. ,----------------------------------. + * | | | | | | | | | | | | + * +------+------+------+------+------| +------+------+------+------+------| + * | | | | | | | | | | | | + * +------+------+------+------+------| +------+------+------+------+------| + * | | | | | | ,------. ,------. | | | | | | + * +------+------+------+------+------| | | | | +------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `----------------------------------' `------' `------' `----------------------------------' + * + */ + const uint16_t PROGMEM fn_actions[] = { }; @@ -95,7 +201,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function switch(id) { - case 0: + case _USER: if (record->event.pressed) { register_code(KC_RSFT); } else { diff --git a/keyboards/atreus/keymaps/replicaJunction/readme.md b/keyboards/atreus/keymaps/replicaJunction/readme.md index 21af48e8..6ac3cb00 100644 --- a/keyboards/atreus/keymaps/replicaJunction/readme.md +++ b/keyboards/atreus/keymaps/replicaJunction/readme.md @@ -10,13 +10,15 @@ I won't claim that this layout is perfect for everyone. It does make several sig ## Base Layer ## -![Atreus base layout](atreus-replica-base-colemakdh.png) +![Atreus base layout](atreus-replica-base.png) The letters on this layout are arranged in the [Colemak Mod-DH layout](https://colemakmods.github.io/mod-dh/). -Note that there are four dual-purpose keys: Shift (Backspace), Ctrl (Delete), Alt (Enter), and Space (Number layer). In QMK, these dual-role keys can be made to hold their primary key by double-tapping the key and holding on the second tap. For example, if I wanted to insert a long string of Spaces, I would tap the Space key, then tap it again and hold. A single press and hold would trigger the secondary function of the key instead. +The primary mechanism for the Shift keys in this keyboard are the dual-role Z and slash keys. Pressing the key sends the keystroke, while holding the key sends a shift. This is a design choice taken from the xyverz layout, and one I find much more intuitive than a thumb shift. In addition, the pinky doesn't need to stretch as far to reach these keys as it does to reach a standard Shift key. -The secondary Alt on the left bottom row exists to provide a single-hand Alt+Tab shortcut, which would take two rows otherwise. +Occasionally, when typing the letter Z, I'll hold the key down a fraction of a second too long, and the keyboard will shift instead. If you're not a confident typist, this dual-role Shift key layout is probably not a good solution. In that case, I'd suggest moving Shift onto the Backspace key (press for Backspace, hold for Shift). + +In addition to the Shift keys, there are three dual-purpose keys: Ctrl (Delete), Alt (Enter), and Space (Number layer). In QMK, these dual-role keys can be made to hold their primary key with a tap and hold. For example, if I wanted to insert a long string of Spaces, I would tap the Space key, then tap it again and hold. A single press and hold would trigger the secondary function of the key instead. ## Extend Layer ## @@ -42,9 +44,11 @@ This layer also provides plenty of symbol shortcuts. Most of these can be access ![Atreus function layer](atreus-replica-function.png) -Function keys (F1-F12) are on this layer, as well as some more generic "functions" such as media keys. I've also set up a mirror image of the arrows from the Extend layer in case I need to use these with my left hand, but I don't do this very often. +Function keys (F1-F12) are on this layer. Their layout in groups of four comes from Jeremy's Atreus layout in this repository. I'd been using 1-9 in a numpad layout, then adding 10-12 on the side...I suppose it took seeing someone else do it this way for me to realize how much more sense it makes. + +On the right side are mouse keys - cursor left/right/up/down, and scroll up/down. Volume keys are also here, though really only because there was room for them (I'm not entirely happy with their positions). -The reset key is on this layer, as well as a toggle from Colemak to QWERTY and back. The QWERTY layer is not currently documented, but it is functionally identical to the base layer except for letter positions. +Finally, the reset key is on this layer, as well as toggles from Colemak to QWERTY and back. The QWERTY layer is not currently documented, but it is functionally identical to the base layer except for letter positions. ## Gaming Layer ## @@ -54,4 +58,4 @@ This is a small layer developed to allow some simple gameplay without a mouse. T The keys on the left hand bring Space into the left thumb's reach, as well as overriding the dual-role Shift with its standard function (Z in both QWERTY and in Colemak). This allows easy Shift presses without blocking the Z key, commonly used in games. -I would probably not consider this a hard-core gaming keyboard, and this layout does have the huge problem of blocking access to the number keys, but for more casual games, it plays quite well. I've used it quite a bit on Minecraft, for example, and I'm quite pleased with it. \ No newline at end of file +I would probably not consider the Atreus a hard-core gaming keyboard in the first place, and this layout does have the huge problem of blocking access to the number keys, but for more casual games, it plays quite well. I've used it quite a bit on Minecraft, for example, and I'm quite pleased with it. \ No newline at end of file diff --git a/keyboards/atreus/readme.md b/keyboards/atreus/readme.md index a4077668..476d1bce 100644 --- a/keyboards/atreus/readme.md +++ b/keyboards/atreus/readme.md @@ -88,7 +88,7 @@ We've added shortcuts to make common modifier/tap (mod-tap) mappings more compac ### Remember: These are just aliases -These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk ACTION_* functions, please see the [TMK documentation](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keymap.md#2-action). +These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk ACTION_* functions, please see the [TMK documentation](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/doc/keymap.md#2-action). Instead of using `FNx` when defining `ACTION_*` functions, you can use `F(x)` - the benefit here is being able to use more than 32 function actions (up to 4096), if you happen to need them. @@ -169,7 +169,7 @@ This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboar ## Building -Download or clone the whole firmware and navigate to the keyboards/planck folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use `make dfu` to program your PCB once you hit the reset button. +Download or clone the whole firmware and navigate to the keyboards/atreus folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use `make dfu` to program your PCB once you hit the reset button. Depending on which keymap you would like to use, you will have to compile slightly differently. diff --git a/keyboards/atreus62/Makefile b/keyboards/atreus62/Makefile new file mode 100644 index 00000000..4e2a6f00 --- /dev/null +++ b/keyboards/atreus62/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif \ No newline at end of file diff --git a/keyboards/atreus62/atreus62.c b/keyboards/atreus62/atreus62.c new file mode 100644 index 00000000..ba5bce98 --- /dev/null +++ b/keyboards/atreus62/atreus62.c @@ -0,0 +1 @@ +#include "atreus62.h" \ No newline at end of file diff --git a/keyboards/atreus62/atreus62.h b/keyboards/atreus62/atreus62.h new file mode 100644 index 00000000..ca5cda8a --- /dev/null +++ b/keyboards/atreus62/atreus62.h @@ -0,0 +1,42 @@ +#ifndef ATREUS62_H +#define ATREUS62_H + +#include "quantum.h" + +void promicro_bootloader_jmp(bool program); + +// This a shortcut to help you visually see your layout. +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, KC_NO, k06, k07, k08, k09, k0a, k0b }, \ + { k10, k11, k12, k13, k14, k15, KC_NO, k16, k17, k18, k19, k1a, k1b }, \ + { k20, k21, k22, k23, k24, k25, KC_NO, k26, k27, k28, k29, k2a, k2b }, \ + { k30, k31, k32, k33, k34, k35, k46, k36, k37, k38, k39, k3a, k3b }, \ + { k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b, k4c, k4d } \ +} + +// Used to create a keymap using only KC_ prefixed keys. +#define KC_KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d \ +) \ +{ \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_NO, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_NO, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_NO, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k46, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b }, \ + { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45, KC_##k47, KC_##k48, KC_##k49, KC_##k4a, KC_##k4b, KC_##k4c, KC_##k4d } \ +} + +#endif diff --git a/keyboards/atreus62/config.h b/keyboards/atreus62/config.h new file mode 100644 index 00000000..90a4aa05 --- /dev/null +++ b/keyboards/atreus62/config.h @@ -0,0 +1,83 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6062 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Profet +#define PRODUCT Atreus62 +#define DESCRIPTION q.m.k. keyboard firmware for Atreus62 + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 5 +#define MATRIX_COLS 13 + +// wiring of each half +#define MATRIX_ROW_PINS { D2, D3, D1, D0, D4 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6, B5, B4, E6, D7, C6 } + +#define CATERINA_BOOTLOADER + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION ROW2COL + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +// #define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +// #define NO_DEBUG + +/* disable print */ +// #define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/atreus62/keymaps/default/keymap.c b/keyboards/atreus62/keymaps/default/keymap.c new file mode 100644 index 00000000..52802c77 --- /dev/null +++ b/keyboards/atreus62/keymaps/default/keymap.c @@ -0,0 +1,71 @@ +// this is the style you want to emulate. +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, + +#include "atreus62.h" + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _DEFAULT 0 +#define _NAV 1 +#define _RESET 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_DEFAULT] = { /* qwerty */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS }, + { KC_BSLS, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRC }, + { KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, + { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_DELT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LBRC }, + { KC_LCTL, KC_LGUI, KC_LALT, KC_GRV, MO(_NAV),KC_BSPC, KC_ENT, KC_SPC, KC_EQL, KC_MINS, KC_QUOT, KC_ENT, KC_RGUI } +}, + +[_NAV] = { + { TO(_DEFAULT), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11 }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS }, + { TO(_RESET), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS } +}, + +[_RESET] = { + { TO(_DEFAULT), KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO }, + { KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO }, + { KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO }, + { KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO }, + { KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , RESET } +} + + +/* +[_TRNS] = { + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS } +}, +*/ +}; + + + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch (id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } + else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/atreus62/keymaps/mneme/Makefile b/keyboards/atreus62/keymaps/mneme/Makefile new file mode 100644 index 00000000..046aec27 --- /dev/null +++ b/keyboards/atreus62/keymaps/mneme/Makefile @@ -0,0 +1,5 @@ +TAP_DANCE_ENABLE = yes +NKRO_ENABLE = true +MOUSEKEY_ENABLE = no +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = no diff --git a/keyboards/atreus62/keymaps/mneme/README.md b/keyboards/atreus62/keymaps/mneme/README.md new file mode 100644 index 00000000..7bb5da9f --- /dev/null +++ b/keyboards/atreus62/keymaps/mneme/README.md @@ -0,0 +1,58 @@ + + +Mnemes Swedish Bonanza +======================= + +My Layout in process, most of the code is shamelessly stolen from [algernons][algernon] excellent layout + + [algernon]: https://github.com/algernon/ergodox-layout + +It's for Windows (current work forces me to) and Swedish (matter of birth) so ymmw. + +## Table of Contents + +* [Layouts](#layouts) + - [Base layer](#base-layer) + - [Nav layer](#nav-layer) + - [Sym layer](#sym-layer) + - [LED states](#led-states) + +# Layouts + +## Base layer + +![Base layer](img/base.png) + + +* The number row doubles as a function row. Short presses produces numbers, long presses produces Fxx +* The `Shift`, `Alt`, and `Control` modifiers are one-shot. +* `Backspace` and `Enter` doubles as switches to the `sym` layer when held +* The `ESC` key also doubles as a one-shot cancel key. +* The **Lead** key is followed by a sequence of keys. + - `LEAD l` : `lgui+l`. + - `LEAD s l` : `λ`. + - `LEAD s s` : `¯\_(ツ)_/¯` + - `LEAD s f` : `凸(ツ)凸` + - `LEAD u l` : Set unicode input mode to linux. + - `LEAD s w` : Set unicode input mode to windows. + - `LEAD a *` : Application switching based on position in start menu. Very specific to my computer. + + +## Nav layer + +![Nav layer](img/fun.png) + +Basic navigation on the right hand and modifiers close +by for the left. The latter because I tend to use `ctrl+arrows` quite a lot. + +## Sym layer + +![Sym layer](img/sym.png) + +* Easy access to most symbols I use on a daily basis. Most common are on the home row, the rest are grouped as best as I could. + +- `eq` : Tapdance, produces `===` and `!==` +- `fun`: Tapdance, produces `=>` and `() => {\n` + +# License + GPL-3+ diff --git a/keyboards/atreus62/keymaps/mneme/config.h b/keyboards/atreus62/keymaps/mneme/config.h new file mode 100644 index 00000000..73eb0fa3 --- /dev/null +++ b/keyboards/atreus62/keymaps/mneme/config.h @@ -0,0 +1,7 @@ +#define ONESHOT_TIMEOUT 3000 +#define TAPPING_TERM 200 +#define PREVENT_STUCK_MODIFIERS +#define FORCE_NKRO +#define LEADER_TIMEOUT 1000 + +#include "../../config.h" diff --git a/keyboards/atreus62/keymaps/mneme/img/base.png b/keyboards/atreus62/keymaps/mneme/img/base.png new file mode 100644 index 00000000..3e77a518 Binary files /dev/null and b/keyboards/atreus62/keymaps/mneme/img/base.png differ diff --git a/keyboards/atreus62/keymaps/mneme/img/fun.png b/keyboards/atreus62/keymaps/mneme/img/fun.png new file mode 100644 index 00000000..961a1972 Binary files /dev/null and b/keyboards/atreus62/keymaps/mneme/img/fun.png differ diff --git a/keyboards/atreus62/keymaps/mneme/img/sym.png b/keyboards/atreus62/keymaps/mneme/img/sym.png new file mode 100644 index 00000000..5e2c8033 Binary files /dev/null and b/keyboards/atreus62/keymaps/mneme/img/sym.png differ diff --git a/keyboards/atreus62/keymaps/mneme/keymap.c b/keyboards/atreus62/keymaps/mneme/keymap.c new file mode 100644 index 00000000..2627e024 --- /dev/null +++ b/keyboards/atreus62/keymaps/mneme/keymap.c @@ -0,0 +1,344 @@ +#include +#include "atreus62.h" +#include "led.h" +#include "action_layer.h" +#include "action_util.h" + +/* + *WINDOWS SWEDISH + */ + /* + *WINDOWS SWEDISH + */ + #define KN_HALF KC_GRV // 1/2 + #define KN_PLUS KC_MINS // + + #define KN_ACUT KC_EQL // ´ + #define KN_AO KC_LBRC // Ã… + #define KN_UMLA KC_RBRC // ¨ + #define KN_OE KC_SCLN // Ö + #define KN_AE KC_QUOT // Ä + #define KN_QUOT KC_NUHS // ' + #define KN_LABK KC_NUBS // < + #define KN_MINS KC_SLSH // - + #define KN_EXLM LSFT(KC_1) // ! + #define KN_DQT LSFT(KC_2) // " + #define KN_AT RALT(KC_2) // @ + #define KN_HASH LSFT(KC_3) // # + #define KN_EUR LSFT(KC_4) // € + #define KN_DLR RALT(KC_4) // $ + #define KN_PERC LSFT(KC_5) // % + #define KN_AMPR LSFT(KC_6) // & + #define KN_SLSH LSFT(KC_7) // / + #define KN_LPRN LSFT(KC_8) // ( + #define KN_RPRN LSFT(KC_9) // ) + #define KN_EQL LSFT(KC_0) // = + #define KN_UNDS LSFT(KN_MINS) // _ + #define KN_QUES LSFT(KN_PLUS) // ? + #define KN_GRAV LSFT(KN_ACUT) // ` + #define KN_LCBR RALT(KC_7) // { + #define KN_RCBR RALT(KC_0) // } + #define KN_LBRC RALT(KC_8) // [ + #define KN_RBRC RALT(KC_9) // ] + #define KN_RABK LSFT(KN_LABK) // < + #define KN_COLN LSFT(KC_DOT) // : + #define KN_SCLN LSFT(KC_COMM) // : + #define KN_PIPE RALT(KN_LABK) // | + #define KN_QUES LSFT(KN_PLUS) // ? + #define KN_CIRC LSFT(KN_UMLA) // ^ + #define KN_ASTR LSFT(KN_QUOT) // * + #define KN_TILD RALT(KN_UMLA) // ~ + #define KN_BSLS RALT(KN_PLUS) // + +#define OSM_LCTL OSM(MOD_LCTL) +#define OSM_LALT OSM(MOD_LALT) +#define OSM_LSFT OSM(MOD_LSFT) + +#define KC_HYP LSFT(LALT(LCTL(KC_LGUI))) + +#define KC_COPY LCTL(KC_C) +#define KC_PASTE LCTL(KC_V) +#define KC_UNDO LCTL(KC_Z) +#define KC_REDO LCTL(LSFT(KC_Z)) + +// Layers +enum { + BASE = 0, + NAV, + SYM +}; + +//Macros +enum { + KF_1 = 0, // 1, F1 + KF_2, // ... + KF_3, + KF_4, + KF_5, + KF_6, + KF_7, + KF_8, + KF_9, + KF_10, + KF_11, + KF_12 +}; + +// Tapdance +enum { + TD_FUN = 0, + TD_EQ +}; + +//State and timers +uint16_t kf_timers[12]; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [BASE] = { + + { M(KF_11) ,M(KF_1) ,M(KF_2) ,M(KF_3) ,M(KF_4) ,M(KF_5) ,KC_NO ,M(KF_6) ,M(KF_7) ,M(KF_8) ,M(KF_9) ,M(KF_10) ,M(KF_12) }, + { KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_NO ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KN_AO }, + { OSM_LCTL ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_NO ,KC_H ,KC_J ,KC_K ,KC_L ,KN_OE ,KN_AE }, + { OSM_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_DELT ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KN_MINS ,OSM_LSFT }, + { MO(NAV) ,OSM_LCTL ,OSM_LALT ,KC_LGUI ,MO(SYM) ,KC_BSPC ,KC_ENT ,KC_SPC ,MO(SYM) ,KC_LEAD ,KC_LALT ,KC_LCTRL ,KC_HYP } + + }, + [NAV] = { + + { KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS }, + { KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_NO ,KC_HOME ,KC_PGDN ,KC_PGUP ,KC_END ,KC_TRNS ,KC_TRNS }, + { KC_TRNS ,KC_LSFT ,KC_LCTL ,KC_LALT ,KC_L ,KC_TRNS ,KC_NO ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT ,KC_TRNS ,KC_TRNS }, + { KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS }, + { KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_VOLD ,KC_VOLU } + + }, + [SYM] = { + + { KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,TD(TD_EQ) ,KC_NO ,TD(TD_FUN) ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS }, + { KC_TRNS ,KN_LABK ,KN_RABK ,KN_LCBR ,KN_RCBR ,KN_PLUS ,KC_NO ,KN_AT ,KN_DQT ,KN_QUOT ,KN_GRAV ,KN_SLSH ,KC_TRNS }, + { KC_TRNS ,KN_EXLM ,KN_EQL ,KN_LPRN ,KN_RPRN ,KN_MINS ,KC_NO ,KN_UNDS ,KN_CIRC ,KN_DLR ,KN_AMPR ,KN_PIPE ,KC_TRNS }, + { KC_TRNS ,KN_EUR ,KN_PERC ,KN_LBRC ,KN_RBRC ,KN_ASTR ,KC_TRNS ,KN_HASH ,KN_SCLN ,KN_COLN ,KN_QUES ,KN_BSLS ,KC_TRNS }, + { KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS } + + } +}; + +#define TAP_ONCE(code) \ + register_code (code); \ + unregister_code (code) + +static void m_tapn (uint8_t code, ...) { + uint8_t kc = code; + va_list ap; + + va_start(ap, code); + do { + register_code(kc); + unregister_code(kc); + wait_ms(50); + kc = va_arg(ap, int); + } while (kc != 0); + va_end(ap); +} + +static void m_handle_kf (keyrecord_t *record, uint8_t id) { + uint8_t code = id - KF_1; + + if (record->event.pressed) { + kf_timers[code] = timer_read (); + } else { + uint8_t kc_base; + uint8_t long_press = (kf_timers[code] && timer_elapsed (kf_timers[code]) > TAPPING_TERM); + + kf_timers[code] = 0; + + switch(id){ + case KF_1 ... KF_10: + if (long_press) { + // Long press + kc_base = KC_F1; + } else { + kc_base = KC_1; + } + code += kc_base; + break; + case KF_11: + code = long_press ? KC_F11 : KC_ESC; + break; + case KF_12: + code = long_press ? KC_F12 : KN_PLUS; + break; + } + register_code (code); + unregister_code (code); + } +} + +const uint16_t PROGMEM fn_actions[] = { +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch (id) { + case KF_1 ... KF_12: + m_handle_kf(record, id); + break; + } + return MACRO_NONE; +}; + +// Custom keycodes +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + bool queue = true; + + //Cancle one-shot mods. + switch (keycode) { + case KC_ESC: + if (record->event.pressed && get_oneshot_mods() && !has_oneshot_mods_timed_out()) { + clear_oneshot_mods(); + queue = false; + } + break; + } + return queue; +} + +// TAP DANCE SETTINGS +void dance_eq (qk_tap_dance_state_t *state, void *user_data) { + switch (state->count) { + case 1: // === + register_code(KC_LSHIFT); + m_tapn(KC_0, KC_0, KC_0, 0); + unregister_code(KC_LSHIFT); + break; + case 2: + register_code(KC_LSHIFT); + m_tapn(KC_1, KC_0, KC_0, 0); + unregister_code(KC_LSHIFT); + break; + default: + reset_tap_dance(state); + } +} + +void dance_fun (qk_tap_dance_state_t *state, void *user_data) { + switch (state->count) { + case 1: // => + register_code(KC_LSHIFT); + m_tapn(KC_0, KN_LABK, 0); + unregister_code(KC_LSHIFT); + break; + case 2: // () => {} + register_code(KC_LSHIFT); + m_tapn(KC_8, KC_9, KC_SPC, KC_0, KN_LABK, KC_SPC, 0); + unregister_code(KC_LSHIFT); + register_code(KC_RALT); + m_tapn(KC_7, 0); + unregister_code(KC_RALT); + TAP_ONCE(KC_ENT); + break; + default: + reset_tap_dance(state); + } +} + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_FUN] = ACTION_TAP_DANCE_FN (dance_fun) + ,[TD_EQ] = ACTION_TAP_DANCE_FN (dance_eq) +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + set_unicode_input_mode(UC_WINC); +}; + +LEADER_EXTERNS(); +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + LEADER_DICTIONARY() { + leading = false; + leader_end(); + SEQ_ONE_KEY(KC_L){ + register_code(KC_RGUI); + TAP_ONCE(KC_L); + unregister_code(KC_RGUI); + }; + + + SEQ_TWO_KEYS (KC_A, KC_W) { + //Web - chrome + register_code (KC_LGUI); TAP_ONCE (KC_1); unregister_code (KC_LGUI); + } + SEQ_TWO_KEYS (KC_A, KC_P) { + //sPotify + register_code (KC_LGUI); TAP_ONCE (KC_2); unregister_code (KC_LGUI); + + } + SEQ_TWO_KEYS (KC_A, KC_T) { + //Total Commander + register_code (KC_LGUI); TAP_ONCE (KC_3); unregister_code (KC_LGUI); + + } + SEQ_TWO_KEYS (KC_A, KC_A) { + //Atom + register_code (KC_LGUI); TAP_ONCE (KC_4); unregister_code (KC_LGUI); + + } + SEQ_TWO_KEYS (KC_A, KC_E) { + //Emacs + register_code (KC_LGUI); TAP_ONCE (KC_5); unregister_code (KC_LGUI); + + } + SEQ_TWO_KEYS (KC_A, KC_C) { + //Cmdr + register_code (KC_LGUI); TAP_ONCE (KC_6); unregister_code (KC_LGUI); + + } + SEQ_TWO_KEYS (KC_A, KC_S) { + //Slack + register_code (KC_LGUI); TAP_ONCE (KC_7); unregister_code (KC_LGUI); + } + + SEQ_TWO_KEYS (KC_U, KC_L) { + set_unicode_input_mode(UC_LNX); + } + + + SEQ_TWO_KEYS (KC_U, KC_W) { + set_unicode_input_mode(UC_WINC); + } + + + SEQ_TWO_KEYS (KC_S, KC_S) { + // ¯\_(ツ)_/¯ + unicode_input_start(); register_hex(0xaf); unicode_input_finish(); + register_code (KC_LALT); + register_code (KC_LCTL); + TAP_ONCE (KN_PLUS); + unregister_code (KC_LCTL); + unregister_code (KC_LALT); + + register_code (KC_RSFT); TAP_ONCE (KC_8); unregister_code (KC_RSFT); + unicode_input_start (); register_hex(0x30c4); unicode_input_finish(); + register_code (KC_RSFT); TAP_ONCE (KC_9); TAP_ONCE(KC_7); unregister_code (KC_RSFT); + unicode_input_start (); register_hex(0xaf); unicode_input_finish(); + } + + SEQ_TWO_KEYS (KC_S, KC_F) { + // 凸(ツ)凸 + unicode_input_start(); register_hex(0x51F8); unicode_input_finish(); + register_code (KC_RSFT); TAP_ONCE (KC_8); unregister_code (KC_RSFT); + unicode_input_start (); register_hex(0x30c4); unicode_input_finish(); + register_code (KC_RSFT); TAP_ONCE (KC_9); unregister_code (KC_RSFT); + unicode_input_start (); register_hex(0x51F8); unicode_input_finish(); + } + + SEQ_TWO_KEYS (KC_S, KC_L) { + // λ + unicode_input_start(); + register_hex(0x03bb); + unicode_input_finish(); + } + }; +}; diff --git a/keyboards/atreus62/keymaps/mneme/unicode b/keyboards/atreus62/keymaps/mneme/unicode new file mode 100644 index 00000000..b3f62b6d --- /dev/null +++ b/keyboards/atreus62/keymaps/mneme/unicode @@ -0,0 +1,114 @@ +Todo +☠2610 Todo +☑ 2611 Done +☒ 2612 Failed + +Operator +× 00D7 Multiplication +÷ 00F7 Division +≤ 2264 LessEqual +≥ 2265 MoreEqual +± 00B1 Plusminus + +Math +∠220F Product +∑ 2211 Sum +≈ 2248 Almost +≡ 2261 Equivalent +∞ 221E Infinity +‰ 2030 Mille + +Set +⊂ 2282 Subset +⊃ 2283 sUperset +∩ 2229 Intersextion +∪ 222A Union +∈ 2208 Element +∉ 2209 Notelement +∠220D Contains +∌ 220C doesNotcontain + +Logic +¬ 00AC Not +∧ 2227 And +∨ 2228 Or +∃ 2203 Exists +∄ 2204 Notexists + +Greek +µ 00B5 Micro +λ 03BB Lamda +Ω 2126 Omega +α 03B1 Alpha +β 03B2 Beta +γ 03B3 Gamma +Ï€ 03C0 Pi +δ 03B4 Delta + +Other +☠2601 Cloud +☼ 263C Sun +☂ 2602 Rain +☠ 2620 Skull +♺ 267A Recycle +ðŸ‘1F44D thumbsUp +👎1F44E thumbsDown +💩 1F4A9 Poo + + +//Todo +SEQ_THREE_KEYS(KC_U, KC_G, KC_T){m_unicode(0x2610);}; // Todo +SEQ_THREE_KEYS(KC_U, KC_G, KC_D){m_unicode(0x2611);}; // Done +SEQ_THREE_KEYS(KC_U, KC_G, KC_F){m_unicode(0x2612);}; // Failed + +//Operator +SEQ_THREE_KEYS(KC_U, KC_O, KC_M){m_unicode(0x00D7);}; // Multiplication +SEQ_THREE_KEYS(KC_U, KC_O, KC_D){m_unicode(0x00F7);}; // Division +SEQ_THREE_KEYS(KC_U, KC_O, KC_L){m_unicode(0x2264);}; // LessEqual +SEQ_THREE_KEYS(KC_U, KC_O, KC_M){m_unicode(0x2265);}; // MoreEqual +SEQ_THREE_KEYS(KC_U, KC_O, KC_P){m_unicode(0x00B1);}; // Plusminus + +//Math +SEQ_THREE_KEYS(KC_U, KC_M, KC_P){m_unicode(0x220F);}; // Product +SEQ_THREE_KEYS(KC_U, KC_M, KC_S){m_unicode(0x2211);}; // Sum +SEQ_THREE_KEYS(KC_U, KC_M, KC_A){m_unicode(0x2248);}; // Almost +SEQ_THREE_KEYS(KC_U, KC_M, KC_E){m_unicode(0x2261);}; // Equivalent +SEQ_THREE_KEYS(KC_U, KC_M, KC_I){m_unicode(0x221E);}; // Infinity +SEQ_THREE_KEYS(KC_U, KC_M, KC_M){m_unicode(0x2030);}; // Mille + +//Set +SEQ_THREE_KEYS(KC_U, KC_S, KC_S){m_unicode(0x2282);}; Subset +SEQ_THREE_KEYS(KC_U, KC_S, KC_P){m_unicode(0x2283);}; suPerset +SEQ_THREE_KEYS(KC_U, KC_S, KC_I){m_unicode(0x2229);}; Intersection +SEQ_THREE_KEYS(KC_U, KC_S, KC_U){m_unicode(0x222A);}; Union +SEQ_THREE_KEYS(KC_U, KC_S, KC_E){m_unicode(0x2208);}; Element +SEQ_THREE_KEYS(KC_U, KC_S, KC_N){m_unicode(0x2209);}; Notelement +SEQ_THREE_KEYS(KC_U, KC_S, KC_C){m_unicode(0x220D);}; Contains +SEQ_THREE_KEYS(KC_U, KC_S, KC_D){m_unicode(0x220C);}; doesNotcontain + +//Logic +SEQ_THREE_KEYS(KC_U, KC_L, KC_N){m_unicode(0x00AC);}; // Not +SEQ_THREE_KEYS(KC_U, KC_L, KC_A){m_unicode(0x2227);}; // And +SEQ_THREE_KEYS(KC_U, KC_L, KC_O){m_unicode(0x2228);}; // Or +SEQ_THREE_KEYS(KC_U, KC_L, KC_E){m_unicode(0x2203);}; // Exists +SEQ_THREE_KEYS(KC_U, KC_L, KC_N){m_unicode(0x2204);}; // Notexists + +//Greek +SEQ_THREE_KEYS(KC_U, KC_G, KC_M){m_unicode(0x00B5);}; // Micro +SEQ_THREE_KEYS(KC_U, KC_G, KC_L){m_unicode(0x03BB);}; // Lamda +SEQ_THREE_KEYS(KC_U, KC_G, KC_O){m_unicode(0x2126);}; // Omega +SEQ_THREE_KEYS(KC_U, KC_G, KC_A){m_unicode(0x03B1);}; // Alpha +SEQ_THREE_KEYS(KC_U, KC_G, KC_B){m_unicode(0x03B2);}; // Beta +SEQ_THREE_KEYS(KC_U, KC_G, KC_G){m_unicode(0x03B3);}; // Gamma +SEQ_THREE_KEYS(KC_U, KC_G, KC_P){m_unicode(0x03C0);}; // Pi +SEQ_THREE_KEYS(KC_U, KC_G, KC_D){m_unicode(0x03B4);}; // Delta + +//Zother +SEQ_THREE_KEYS(KC_U, KC_Z, KC_C){m_unicode(0x2601);}; // Cloud +SEQ_THREE_KEYS(KC_U, KC_Z, KC_S){m_unicode(0x263C);}; // Sun +SEQ_THREE_KEYS(KC_U, KC_Z, KC_R){m_unicode(0x2602);}; // Rain +SEQ_THREE_KEYS(KC_U, KC_Z, KC_K){m_unicode(0x2620);}; // sKull +SEQ_THREE_KEYS(KC_U, KC_Z, KC_R){m_unicode(0x267A);}; // rEcycle +SEQ_THREE_KEYS(KC_U, KC_Z, KC_U){m_unicode(0x1F44D);}; // thumbsUp +SEQ_THREE_KEYS(KC_U, KC_Z, KC_D){m_unicode(0x1F44E);}; // thumbsDown +SEQ_THREE_KEYS(KC_U, KC_Z, KC_P){m_unicode(0x1F4A9);}; // Poo diff --git a/keyboards/atreus62/pro_micro.h b/keyboards/atreus62/pro_micro.h new file mode 100644 index 00000000..f9e7ed75 --- /dev/null +++ b/keyboards/atreus62/pro_micro.h @@ -0,0 +1,362 @@ +/* + pins_arduino.h - Pin definition functions for Arduino + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2007 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ +*/ + +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +// Workaround for wrong definitions in "iom32u4.h". +// This should be fixed in the AVR toolchain. +#undef UHCON +#undef UHINT +#undef UHIEN +#undef UHADDR +#undef UHFNUM +#undef UHFNUML +#undef UHFNUMH +#undef UHFLEN +#undef UPINRQX +#undef UPINTX +#undef UPNUM +#undef UPRST +#undef UPCONX +#undef UPCFG0X +#undef UPCFG1X +#undef UPSTAX +#undef UPCFG2X +#undef UPIENX +#undef UPDATX +#undef TCCR2A +#undef WGM20 +#undef WGM21 +#undef COM2B0 +#undef COM2B1 +#undef COM2A0 +#undef COM2A1 +#undef TCCR2B +#undef CS20 +#undef CS21 +#undef CS22 +#undef WGM22 +#undef FOC2B +#undef FOC2A +#undef TCNT2 +#undef TCNT2_0 +#undef TCNT2_1 +#undef TCNT2_2 +#undef TCNT2_3 +#undef TCNT2_4 +#undef TCNT2_5 +#undef TCNT2_6 +#undef TCNT2_7 +#undef OCR2A +#undef OCR2_0 +#undef OCR2_1 +#undef OCR2_2 +#undef OCR2_3 +#undef OCR2_4 +#undef OCR2_5 +#undef OCR2_6 +#undef OCR2_7 +#undef OCR2B +#undef OCR2_0 +#undef OCR2_1 +#undef OCR2_2 +#undef OCR2_3 +#undef OCR2_4 +#undef OCR2_5 +#undef OCR2_6 +#undef OCR2_7 + +#define NUM_DIGITAL_PINS 30 +#define NUM_ANALOG_INPUTS 12 + +#define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0) +#define TXLED0 PORTD |= (1<<5) +#define TXLED1 PORTD &= ~(1<<5) +#define RXLED0 PORTB |= (1<<0) +#define RXLED1 PORTB &= ~(1<<0) + +static const uint8_t SDA = 2; +static const uint8_t SCL = 3; +#define LED_BUILTIN 13 + +// Map SPI port to 'new' pins D14..D17 +static const uint8_t SS = 17; +static const uint8_t MOSI = 16; +static const uint8_t MISO = 14; +static const uint8_t SCK = 15; + +// Mapping of analog pins as digital I/O +// A6-A11 share with digital pins +static const uint8_t ADC0 = 18; +static const uint8_t ADC1 = 19; +static const uint8_t ADC2 = 20; +static const uint8_t ADC3 = 21; +static const uint8_t ADC4 = 22; +static const uint8_t ADC5 = 23; +static const uint8_t ADC6 = 24; // D4 +static const uint8_t ADC7 = 25; // D6 +static const uint8_t ADC8 = 26; // D8 +static const uint8_t ADC9 = 27; // D9 +static const uint8_t ADC10 = 28; // D10 +static const uint8_t ADC11 = 29; // D12 + +#define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0)) +#define digitalPinToPCICRbit(p) 0 +#define digitalPinToPCMSK(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCMSK0) : ((uint8_t *)0)) +#define digitalPinToPCMSKbit(p) ( ((p) >= 8 && (p) <= 11) ? (p) - 4 : ((p) == 14 ? 3 : ((p) == 15 ? 1 : ((p) == 16 ? 2 : ((p) == 17 ? 0 : (p - A8 + 4)))))) + +// __AVR_ATmega32U4__ has an unusual mapping of pins to channels +extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; +#define analogPinToChannel(P) ( pgm_read_byte( analog_pin_to_channel_PGM + (P) ) ) + +#define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT))))) + +#ifdef ARDUINO_MAIN + +// On the Arduino board, digital pins are also used +// for the analog output (software PWM). Analog input +// pins are a separate set. + +// ATMEL ATMEGA32U4 / ARDUINO LEONARDO +// +// D0 PD2 RXD1/INT2 +// D1 PD3 TXD1/INT3 +// D2 PD1 SDA SDA/INT1 +// D3# PD0 PWM8/SCL OC0B/SCL/INT0 +// D4 A6 PD4 ADC8 +// D5# PC6 ??? OC3A/#OC4A +// D6# A7 PD7 FastPWM #OC4D/ADC10 +// D7 PE6 INT6/AIN0 +// +// D8 A8 PB4 ADC11/PCINT4 +// D9# A9 PB5 PWM16 OC1A/#OC4B/ADC12/PCINT5 +// D10# A10 PB6 PWM16 OC1B/0c4B/ADC13/PCINT6 +// D11# PB7 PWM8/16 0C0A/OC1C/#RTS/PCINT7 +// D12 A11 PD6 T1/#OC4D/ADC9 +// D13# PC7 PWM10 CLK0/OC4A +// +// A0 D18 PF7 ADC7 +// A1 D19 PF6 ADC6 +// A2 D20 PF5 ADC5 +// A3 D21 PF4 ADC4 +// A4 D22 PF1 ADC1 +// A5 D23 PF0 ADC0 +// +// New pins D14..D17 to map SPI port to digital pins +// +// MISO D14 PB3 MISO,PCINT3 +// SCK D15 PB1 SCK,PCINT1 +// MOSI D16 PB2 MOSI,PCINT2 +// SS D17 PB0 RXLED,SS/PCINT0 +// +// Connected LEDs on board for TX and RX +// TXLED D24 PD5 XCK1 +// RXLED D17 PB0 +// HWB PE2 HWB + +// these arrays map port names (e.g. port B) to the +// appropriate addresses for various functions (e.g. reading +// and writing) +const uint16_t PROGMEM port_to_mode_PGM[] = { + NOT_A_PORT, + NOT_A_PORT, + (uint16_t) &DDRB, + (uint16_t) &DDRC, + (uint16_t) &DDRD, + (uint16_t) &DDRE, + (uint16_t) &DDRF, +}; + +const uint16_t PROGMEM port_to_output_PGM[] = { + NOT_A_PORT, + NOT_A_PORT, + (uint16_t) &PORTB, + (uint16_t) &PORTC, + (uint16_t) &PORTD, + (uint16_t) &PORTE, + (uint16_t) &PORTF, +}; + +const uint16_t PROGMEM port_to_input_PGM[] = { + NOT_A_PORT, + NOT_A_PORT, + (uint16_t) &PINB, + (uint16_t) &PINC, + (uint16_t) &PIND, + (uint16_t) &PINE, + (uint16_t) &PINF, +}; + +const uint8_t PROGMEM digital_pin_to_port_PGM[] = { + PD, // D0 - PD2 + PD, // D1 - PD3 + PD, // D2 - PD1 + PD, // D3 - PD0 + PD, // D4 - PD4 + PC, // D5 - PC6 + PD, // D6 - PD7 + PE, // D7 - PE6 + + PB, // D8 - PB4 + PB, // D9 - PB5 + PB, // D10 - PB6 + PB, // D11 - PB7 + PD, // D12 - PD6 + PC, // D13 - PC7 + + PB, // D14 - MISO - PB3 + PB, // D15 - SCK - PB1 + PB, // D16 - MOSI - PB2 + PB, // D17 - SS - PB0 + + PF, // D18 - A0 - PF7 + PF, // D19 - A1 - PF6 + PF, // D20 - A2 - PF5 + PF, // D21 - A3 - PF4 + PF, // D22 - A4 - PF1 + PF, // D23 - A5 - PF0 + + PD, // D24 - PD5 + PD, // D25 / D6 - A7 - PD7 + PB, // D26 / D8 - A8 - PB4 + PB, // D27 / D9 - A9 - PB5 + PB, // D28 / D10 - A10 - PB6 + PD, // D29 / D12 - A11 - PD6 +}; + +const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { + _BV(2), // D0 - PD2 + _BV(3), // D1 - PD3 + _BV(1), // D2 - PD1 + _BV(0), // D3 - PD0 + _BV(4), // D4 - PD4 + _BV(6), // D5 - PC6 + _BV(7), // D6 - PD7 + _BV(6), // D7 - PE6 + + _BV(4), // D8 - PB4 + _BV(5), // D9 - PB5 + _BV(6), // D10 - PB6 + _BV(7), // D11 - PB7 + _BV(6), // D12 - PD6 + _BV(7), // D13 - PC7 + + _BV(3), // D14 - MISO - PB3 + _BV(1), // D15 - SCK - PB1 + _BV(2), // D16 - MOSI - PB2 + _BV(0), // D17 - SS - PB0 + + _BV(7), // D18 - A0 - PF7 + _BV(6), // D19 - A1 - PF6 + _BV(5), // D20 - A2 - PF5 + _BV(4), // D21 - A3 - PF4 + _BV(1), // D22 - A4 - PF1 + _BV(0), // D23 - A5 - PF0 + + _BV(5), // D24 - PD5 + _BV(7), // D25 / D6 - A7 - PD7 + _BV(4), // D26 / D8 - A8 - PB4 + _BV(5), // D27 / D9 - A9 - PB5 + _BV(6), // D28 / D10 - A10 - PB6 + _BV(6), // D29 / D12 - A11 - PD6 +}; + +const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + TIMER0B, /* 3 */ + NOT_ON_TIMER, + TIMER3A, /* 5 */ + TIMER4D, /* 6 */ + NOT_ON_TIMER, + + NOT_ON_TIMER, + TIMER1A, /* 9 */ + TIMER1B, /* 10 */ + TIMER0A, /* 11 */ + + NOT_ON_TIMER, + TIMER4A, /* 13 */ + + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, + NOT_ON_TIMER, +}; + +const uint8_t PROGMEM analog_pin_to_channel_PGM[] = { + 7, // A0 PF7 ADC7 + 6, // A1 PF6 ADC6 + 5, // A2 PF5 ADC5 + 4, // A3 PF4 ADC4 + 1, // A4 PF1 ADC1 + 0, // A5 PF0 ADC0 + 8, // A6 D4 PD4 ADC8 + 10, // A7 D6 PD7 ADC10 + 11, // A8 D8 PB4 ADC11 + 12, // A9 D9 PB5 ADC12 + 13, // A10 D10 PB6 ADC13 + 9 // A11 D12 PD6 ADC9 +}; + +#endif /* ARDUINO_MAIN */ + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_USBVIRTUAL Serial +#define SERIAL_PORT_HARDWARE Serial1 +#define SERIAL_PORT_HARDWARE_OPEN Serial1 + +#endif /* Pins_Arduino_h */ diff --git a/keyboards/atreus62/readme.md b/keyboards/atreus62/readme.md new file mode 100644 index 00000000..0245b4f9 --- /dev/null +++ b/keyboards/atreus62/readme.md @@ -0,0 +1,10 @@ +atreus62 keyboard firmware +====================== + +This firmware is for the atreus62 keyboard. + +This version utilizes a Pro Micro for its controller and has a 62 key layout. + +https://github.com/profet23/atreus62 + +TODO: More information \ No newline at end of file diff --git a/keyboards/atreus62/rules.mk b/keyboards/atreus62/rules.mk new file mode 100644 index 00000000..f5d0be23 --- /dev/null +++ b/keyboards/atreus62/rules.mk @@ -0,0 +1,66 @@ + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +#BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality +#MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= yes # Unicode +#BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend diff --git a/keyboards/clueboard/keymaps/caps_fn/keymap.c b/keyboards/clueboard/keymaps/caps_fn/keymap.c new file mode 100644 index 00000000..7fad9c1b --- /dev/null +++ b/keyboards/clueboard/keymaps/caps_fn/keymap.c @@ -0,0 +1,86 @@ +#include "clueboard.h" + +// Helpful defines +#define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define _______ KC_TRNS + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _CL 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: Base Layer (Default Layer) + */ +[_BL] = KEYMAP( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + */ +[_FL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, BL_STEP, \ + _______, _______, _______,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK, KC_PAUS, _______, _______, _______, _______, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, KC_PGUP, \ + _______, _______, _______, _______, _______,_______, _______, _______, _______, MO(_FL), KC_HOME, KC_PGDN, KC_END), + + /* Keymap _CL: Control layer + */ +[_CL] = KEYMAP( + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, \ + _______, _______, _______,_______,RESET, _______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_VAD, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + MO(_FL), _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, MO(_FL), RGB_SAI, \ + _______, _______, _______,_______, RGB_MOD, RGB_MOD, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI), +}; + +/* This is a list of user defined functions. F(N) corresponds to item N + of this list. + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(0), // Calls action_function() +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t mods_pressed; + static bool mod_flag; + + switch (id) { + case 0: + /* Handle the combined Grave/Esc key + */ + mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed + + if (record->event.pressed) { + /* The key is being pressed. + */ + if (mods_pressed) { + mod_flag = true; + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + /* The key is being released. + */ + if (mod_flag) { + mod_flag = false; + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/clueboard/keymaps/caps_fn/layout.png b/keyboards/clueboard/keymaps/caps_fn/layout.png new file mode 100644 index 00000000..a5bd57ad Binary files /dev/null and b/keyboards/clueboard/keymaps/caps_fn/layout.png differ diff --git a/keyboards/clueboard/keymaps/caps_fn/readme.md b/keyboards/clueboard/keymaps/caps_fn/readme.md new file mode 100644 index 00000000..74ad01fc --- /dev/null +++ b/keyboards/clueboard/keymaps/caps_fn/readme.md @@ -0,0 +1,15 @@ +``` + ___ _____ _ _ _ __ __ _ __ +|__ \ / ____| | | | | | / / / /(_) / / + ||) | | | | |_ _ ___| |__ ___ __ _ _ __ __| | / /_ / /_ / / + |/ / | | | | | | |/ _ \ '_ \ / _ \ / _` | '__/ _` | | '_ \| '_ \ / / + |_| | |____| | |_| | __/ |_) | (_) | (_| | | | (_| | | (_) | (_) / / _ + (_) \_____|_|\__,_|\___|_.__/ \___/ \__,_|_| \__,_| \___/ \___/_/ (_) +``` + +![Clueboard Layout Image](layout.png) + +# Caps Fn Layout + +This is the default layout except that Caps Lock acts like Caps Lock when +tapped but Fn when held. diff --git a/keyboards/clueboard/keymaps/colemak/keymap.c b/keyboards/clueboard/keymaps/colemak/keymap.c new file mode 100644 index 00000000..42c85ff9 --- /dev/null +++ b/keyboards/clueboard/keymaps/colemak/keymap.c @@ -0,0 +1,86 @@ +#include "clueboard.h" + +// Helpful defines +#define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define _______ KC_TRNS + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _CL 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: Base Layer (Default Layer) + */ +[_BL] = KEYMAP( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ + KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, MO(_FL), KC_LGUI,KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + */ +[_FL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_CAPS, BL_STEP, \ + _______, _______, _______,_______,_______,_______,_______,KC_HOME,KC_PGDN,KC_PGUP, KC_END, _______, _______, _______, _______, \ + KC_DEL, _______, MO(_CL),_______,_______,_______,_______,KC_LEFT,KC_DOWN,KC_UP, KC_RGHT, _______, _______, _______, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, KC_PGUP, \ + _______, _______, _______,_______, _______,_______, _______, _______, _______, MO(_FL), KC_HOME, KC_PGDN, KC_END), + + /* Keymap _CL: Control layer + */ +[_CL] = KEYMAP( + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, \ + _______, _______, _______,_______,RESET, _______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_VAD, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + MO(_FL), _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, MO(_FL), RGB_SAI, \ + _______, _______, _______,_______, RGB_MOD, RGB_MOD, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI), +}; + +/* This is a list of user defined functions. F(N) corresponds to item N + of this list. + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(0), // Calls action_function() +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t mods_pressed; + static bool mod_flag; + + switch (id) { + case 0: + /* Handle the combined Grave/Esc key + */ + mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed + + if (record->event.pressed) { + /* The key is being pressed. + */ + if (mods_pressed) { + mod_flag = true; + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + /* The key is being released. + */ + if (mod_flag) { + mod_flag = false; + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/clueboard/keymaps/default/keymap.c b/keyboards/clueboard/keymaps/default/keymap.c index 01f158bf..7fad9c1b 100644 --- a/keyboards/clueboard/keymaps/default/keymap.c +++ b/keyboards/clueboard/keymaps/default/keymap.c @@ -1,7 +1,8 @@ #include "clueboard.h" -// Used for SHIFT_ESC -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +// Helpful defines +#define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define _______ KC_TRNS // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. @@ -9,21 +10,10 @@ // entirely and just use numbers. #define _BL 0 #define _FL 1 -#define _RS 2 +#define _CL 2 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Keymap _BL: (Base Layer) Default Layer - * ,--------------------------------------------------------------------------. ,----. - * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP| - * |--------------------------------------------------------------------------| |----| - * | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN| - * |--------------------------------------------------------------------------| `----' - * |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent| - * |-----------------------------------------------------------------------------. - * |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP| - * |------------------------------------------------------------------------|----|----. - * | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT| - * `----------------------------------------------------------------------------------' + /* Keymap _BL: Base Layer (Default Layer) */ [_BL] = KEYMAP( F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ @@ -33,61 +23,46 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), /* Keymap _FL: Function Layer - * ,--------------------------------------------------------------------------. ,----. - * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN| - * |--------------------------------------------------------------------------| |----| - * | | | | | | | | |PScr|SLck|Paus| | | | |BLDE| - * |--------------------------------------------------------------------------| `----' - * | | | _RS| | | | | | | | | | | | - * |-----------------------------------------------------------------------------. - * | | | | | | | | | | | | | | |PGUP| - * |------------------------------------------------------------------------|----|----. - * | | | | | | | | | | _FL|HOME|PGDN| END| - * `----------------------------------------------------------------------------------' */ [_FL] = KEYMAP( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, BL_STEP, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END), + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, BL_STEP, \ + _______, _______, _______,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK, KC_PAUS, _______, _______, _______, _______, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, KC_PGUP, \ + _______, _______, _______, _______, _______,_______, _______, _______, _______, MO(_FL), KC_HOME, KC_PGDN, KC_END), - /* Keymap _RS: Reset layer - * ,--------------------------------------------------------------------------. ,----. - * | | | | | | | | | | | | | | | | | | - * |--------------------------------------------------------------------------| |----| - * | | | | |RESET| | | | | | | | | | | | - * |--------------------------------------------------------------------------| `----' - * | | | _RS| | | | | | | | | | | | - * |-----------------------------------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------------------------------------------------------------------------|----|----. - * | | | | | | | | | | _FL| | | | - * `----------------------------------------------------------------------------------' + /* Keymap _CL: Control layer */ -[_RS] = KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_VAI, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, \ - KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), RGB_SAI, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, RGB_MOD, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUD, RGB_SAD, RGB_HUI), -}; - -enum function_id { - SHIFT_ESC, +[_CL] = KEYMAP( + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, \ + _______, _______, _______,_______,RESET, _______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_VAD, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + MO(_FL), _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, MO(_FL), RGB_SAI, \ + _______, _______, _______,_______, RGB_MOD, RGB_MOD, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI), }; +/* This is a list of user defined functions. F(N) corresponds to item N + of this list. + */ const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), + [0] = ACTION_FUNCTION(0), // Calls action_function() }; void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; + static uint8_t mods_pressed; + static bool mod_flag; + switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + case 0: + /* Handle the combined Grave/Esc key + */ + mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed + if (record->event.pressed) { - if (shift_esc_shift_mask) { + /* The key is being pressed. + */ + if (mods_pressed) { + mod_flag = true; add_key(KC_GRV); send_keyboard_report(); } else { @@ -95,7 +70,10 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { send_keyboard_report(); } } else { - if (shift_esc_shift_mask) { + /* The key is being released. + */ + if (mod_flag) { + mod_flag = false; del_key(KC_GRV); send_keyboard_report(); } else { diff --git a/keyboards/clueboard/keymaps/default/layout.png b/keyboards/clueboard/keymaps/default/layout.png new file mode 100644 index 00000000..cd318163 Binary files /dev/null and b/keyboards/clueboard/keymaps/default/layout.png differ diff --git a/keyboards/clueboard/keymaps/default/readme.md b/keyboards/clueboard/keymaps/default/readme.md new file mode 100644 index 00000000..cede17ee --- /dev/null +++ b/keyboards/clueboard/keymaps/default/readme.md @@ -0,0 +1,17 @@ +``` + ___ _____ _ _ _ __ __ _ __ +|__ \ / ____| | | | | | / / / /(_) / / + ||) | | | | |_ _ ___| |__ ___ __ _ _ __ __| | / /_ / /_ / / + |/ / | | | | | | |/ _ \ '_ \ / _ \ / _` | '__/ _` | | '_ \| '_ \ / / + |_| | |____| | |_| | __/ |_) | (_) | (_| | | | (_| | | (_) | (_) / / _ + (_) \_____|_|\__,_|\___|_.__/ \___/ \__,_|_| \__,_| \___/ \___/_/ (_) +``` + +![Clueboard Layout Image](layout.png) + +# Default Clueboard Layout + +This is the default layout that comes flashed on every Clueboard. For the most +part it's a straightforward and easy to follow layout. The only unusual key is +the key in the upper left, which sends Escape normally, but Grave when any of +the Ctrl, Alt, or GUI modifiers are held down. diff --git a/keyboards/clueboard/keymaps/mac_optimized/keymap.c b/keyboards/clueboard/keymaps/mac_optimized/keymap.c new file mode 100644 index 00000000..7ea02d27 --- /dev/null +++ b/keyboards/clueboard/keymaps/mac_optimized/keymap.c @@ -0,0 +1,86 @@ +#include "clueboard.h" + +// Helpful defines +#define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define _______ KC_TRNS + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _CL 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: Base Layer (Default Layer) + */ +[_BL] = KEYMAP( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LALT, KC_LGUI,KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RGUI, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + */ +[_FL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, BL_STEP, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, _______, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, KC_PGUP, \ + _______, _______, _______, _______, _______,_______, _______, _______, _______, MO(_FL), KC_HOME, KC_PGDN, KC_END), + + /* Keymap _CL: Control layer + */ +[_CL] = KEYMAP( + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, \ + _______, _______, _______,_______,RESET, _______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_VAD, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + MO(_FL), _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, MO(_FL), RGB_SAI, \ + _______, _______, _______,_______, RGB_MOD, RGB_MOD, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI), +}; + +/* This is a list of user defined functions. F(N) corresponds to item N + of this list. + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(0), // Calls action_function() +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t mods_pressed; + static bool mod_flag; + + switch (id) { + case 0: + /* Handle the combined Grave/Esc key + */ + mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed + + if (record->event.pressed) { + /* The key is being pressed. + */ + if (mods_pressed) { + mod_flag = true; + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + /* The key is being released. + */ + if (mod_flag) { + mod_flag = false; + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/clueboard/keymaps/mac_optimized/layout.png b/keyboards/clueboard/keymaps/mac_optimized/layout.png new file mode 100644 index 00000000..e84ba54e Binary files /dev/null and b/keyboards/clueboard/keymaps/mac_optimized/layout.png differ diff --git a/keyboards/clueboard/keymaps/mac_optimized/readme.md b/keyboards/clueboard/keymaps/mac_optimized/readme.md new file mode 100644 index 00000000..940e0912 --- /dev/null +++ b/keyboards/clueboard/keymaps/mac_optimized/readme.md @@ -0,0 +1,15 @@ +``` + ___ _____ _ _ _ __ __ _ __ +|__ \ / ____| | | | | | / / / /(_) / / + ||) | | | | |_ _ ___| |__ ___ __ _ _ __ __| | / /_ / /_ / / + |/ / | | | | | | |/ _ \ '_ \ / _ \ / _` | '__/ _` | | '_ \| '_ \ / / + |_| | |____| | |_| | __/ |_) | (_) | (_| | | | (_| | | (_) | (_) / / _ + (_) \_____|_|\__,_|\___|_.__/ \___/ \__,_|_| \__,_| \___/ \___/_/ (_) +``` + +![Clueboard Layout Image](layout.png) + +# Default Clueboard Layout for Mac + +This is the default Clueboard layout with Alt and GUI switched to match Mac +conventions. diff --git a/keyboards/clueboard/keymaps/max/keymap.c b/keyboards/clueboard/keymaps/max/keymap.c deleted file mode 100644 index 19380984..00000000 --- a/keyboards/clueboard/keymaps/max/keymap.c +++ /dev/null @@ -1,85 +0,0 @@ -#include "clueboard.h" - -// Used for SHIFT_ESC -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _BL 0 -#define _FL 1 -#define _RS 2 - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Keymap _BL: (Base Layer) Default Layer - * ,--------------------------------------------------------------------------. ,----. - * | Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| ~| BS| |PgUp| - * |--------------------------------------------------------------------------| |----| - * | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PgDn| - * |--------------------------------------------------------------------------| `----' - * |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent| - * |-----------------------------------------------------------------------------. - * |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| Up| - * |------------------------------------------------------------------------|----|----. - * | Ctrl| Alt| Gui| MHen| Space| Space| Hen| Gui| Alt| Ctrl|Left|Down|Rght| - * `----------------------------------------------------------------------------------' - */ -[_BL] = KEYMAP( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ - MO(_FL), KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FL), KC_UP, \ - KC_LCTL, KC_LALT, KC_LGUI,KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), - - /* Keymap _FL: Function Layer - * ,--------------------------------------------------------------------------. ,----. - * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN| - * |--------------------------------------------------------------------------| |----| - * | | | | | | | | |PScr|SLck|Paus| | | | |BLDE| - * |--------------------------------------------------------------------------| `----' - * | | | _RS| | | | | | | | | | | | - * |-----------------------------------------------------------------------------. - * | | | | | | | | | | | | | | |PGUP| - * |------------------------------------------------------------------------|----|----. - * | | | | | | | | | | _FL|HOME|PGDN| END| - * `----------------------------------------------------------------------------------' - */ -[_FL] = KEYMAP( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, BL_STEP, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_PGUP, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END), - - /* Keymap _RS: Reset/Underlight layer - * ,--------------------------------------------------------------------------. ,----. - * | | | | | | | | | | | | | | | | | | - * |--------------------------------------------------------------------------| |----| - * | | | | |RESET| | | | | | | | | | | | - * |--------------------------------------------------------------------------| `----' - * | | | _RS| | | | | | | | | | | | - * |-----------------------------------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------------------------------------------------------------------------|----|----. - * | | | | | | | | | | _FL| | | | - * `----------------------------------------------------------------------------------' - */ -[_RS] = KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_VAI, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, \ - KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), RGB_SAI, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, RGB_MOD, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUD, RGB_SAD, RGB_HUI), -}; - -/*enum function_id { -};*/ - -const uint16_t PROGMEM fn_actions[] = { -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch (id) { - } -} diff --git a/keyboards/clueboard/keymaps/maximised/keymap.c b/keyboards/clueboard/keymaps/maximised/keymap.c new file mode 100644 index 00000000..ebaefa66 --- /dev/null +++ b/keyboards/clueboard/keymaps/maximised/keymap.c @@ -0,0 +1,47 @@ +#include "clueboard.h" + +// Helpful defines +#define _______ KC_TRNS + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _CL 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: Base Layer (Default Layer) + */ +[_BL] = KEYMAP( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + MO(_FL), KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FL), KC_UP, \ + KC_LCTL, KC_LALT, KC_LGUI,KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + */ +[_FL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, BL_STEP, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,KC_SLCK, KC_PAUS, _______, _______, _______, _______, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + MO(_FL), _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, MO(_FL), KC_PGUP, \ + _______, _______, _______,_______, _______,_______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END), + + /* Keymap _CL: Reset/Underlight layer + */ +[_CL] = KEYMAP( + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, \ + _______, _______, _______,_______,RESET, _______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_VAD, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + MO(_FL), _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, MO(_FL), RGB_SAI, \ + _______, _______, _______,_______, RGB_MOD, RGB_MOD, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI), +}; + +const uint16_t PROGMEM fn_actions[] = { +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { +}; diff --git a/keyboards/clueboard/keymaps/maximised/layout.png b/keyboards/clueboard/keymaps/maximised/layout.png new file mode 100644 index 00000000..bdc5d762 Binary files /dev/null and b/keyboards/clueboard/keymaps/maximised/layout.png differ diff --git a/keyboards/clueboard/keymaps/maximised/readme.md b/keyboards/clueboard/keymaps/maximised/readme.md new file mode 100644 index 00000000..b95d1750 --- /dev/null +++ b/keyboards/clueboard/keymaps/maximised/readme.md @@ -0,0 +1,14 @@ +``` + ___ _____ _ _ _ __ __ _ __ +|__ \ / ____| | | | | | / / / /(_) / / + ||) | | | | |_ _ ___| |__ ___ __ _ _ __ __| | / /_ / /_ / / + |/ / | | | | | | |/ _ \ '_ \ / _ \ / _` | '__/ _` | | '_ \| '_ \ / / + |_| | |____| | |_| | __/ |_) | (_) | (_| | | | (_| | | (_) | (_) / / _ + (_) \_____|_|\__,_|\___|_.__/ \___/ \__,_|_| \__,_| \___/ \___/_/ (_) +``` + +![Clueboard Layout Image](layout.png) + +# Maximised Clueboard Layout + +This layout is intended for a board with one or both shifts split. The outside key on the split shift is an Fn, while the inside is shift. The bottom row has all the mods on both sides, optimised for a Mac. diff --git a/keyboards/clueboard/keymaps/mouse_keys/Makefile b/keyboards/clueboard/keymaps/mouse_keys/Makefile new file mode 100644 index 00000000..6c605dae --- /dev/null +++ b/keyboards/clueboard/keymaps/mouse_keys/Makefile @@ -0,0 +1 @@ +MOUSEKEY_ENABLE = yes diff --git a/keyboards/clueboard/keymaps/mouse_keys/keymap.c b/keyboards/clueboard/keymaps/mouse_keys/keymap.c new file mode 100644 index 00000000..d3108d1e --- /dev/null +++ b/keyboards/clueboard/keymaps/mouse_keys/keymap.c @@ -0,0 +1,96 @@ +#include "clueboard.h" + +// Helpful defines +#define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define _______ KC_TRNS + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _CL 2 +#define _ML 3 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: Base Layer (Default Layer) + */ +[_BL] = KEYMAP( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + */ +[_FL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, BL_STEP, \ + _______, _______, _______,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK, KC_PAUS, _______, _______, _______, _______, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, KC_PGUP, \ + _______, _______, _______, _______, _______,_______, _______, _______, _______, MO(_FL), KC_HOME, KC_PGDN, KC_END), + + /* Keymap _CL: Control layer + */ +[_CL] = KEYMAP( + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, \ + _______, _______, _______,_______,RESET, _______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_VAD, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + MO(_FL), _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, MO(_FL), RGB_SAI, \ + _______, _______, _______,_______, RGB_MOD, RGB_MOD, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI), + + /* Keymap _ML: Mouse layer + */ + [_ML] = KEYMAP( + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, _______, \ + _______, _______, KC_BTN3,KC_BTN2,KC_BTN1,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, KC_MS_U, \ + _______, _______, _______,_______, LT(_ML, KC_SPC),LT(_ML, KC_SPC), _______, KC_BTN1, KC_BTN2, KC_BTN3, KC_MS_L, KC_MS_D,KC_MS_R), +}; + +/* This is a list of user defined functions. F(N) corresponds to item N + of this list. + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(0), // Calls action_function() +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t mods_pressed; + static bool mod_flag; + + switch (id) { + case 0: + /* Handle the combined Grave/Esc key + */ + mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed + + if (record->event.pressed) { + /* The key is being pressed. + */ + if (mods_pressed) { + mod_flag = true; + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + /* The key is being released. + */ + if (mod_flag) { + mod_flag = false; + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/clueboard/keymaps/mouse_keys/layout.png b/keyboards/clueboard/keymaps/mouse_keys/layout.png new file mode 100644 index 00000000..52e5c458 Binary files /dev/null and b/keyboards/clueboard/keymaps/mouse_keys/layout.png differ diff --git a/keyboards/clueboard/keymaps/mouse_keys/readme.md b/keyboards/clueboard/keymaps/mouse_keys/readme.md new file mode 100644 index 00000000..97ac6dfa --- /dev/null +++ b/keyboards/clueboard/keymaps/mouse_keys/readme.md @@ -0,0 +1,16 @@ +``` + ___ _____ _ _ _ __ __ _ __ +|__ \ / ____| | | | | | / / / /(_) / / + ||) | | | | |_ _ ___| |__ ___ __ _ _ __ __| | / /_ / /_ / / + |/ / | | | | | | |/ _ \ '_ \ / _ \ / _` | '__/ _` | | '_ \| '_ \ / / + |_| | |____| | |_| | __/ |_) | (_) | (_| | | | (_| | | (_) | (_) / / _ + (_) \_____|_|\__,_|\___|_.__/ \___/ \__,_|_| \__,_| \___/ \___/_/ (_) +``` + +![Clueboard Layout Image](layout.png) + +# MouseKeys Layout + +This layout adds a mouse layer. When you hold down the spacebar the arrow keys +will move your mouse cursor. You can click using the 3 mods to the left of the +arrow keys, or the 3 keys under your primary fingers on the home row. diff --git a/keyboards/clueboard/keymaps/shift_fn/keymap.c b/keyboards/clueboard/keymaps/shift_fn/keymap.c new file mode 100644 index 00000000..c4fae036 --- /dev/null +++ b/keyboards/clueboard/keymaps/shift_fn/keymap.c @@ -0,0 +1,86 @@ +#include "clueboard.h" + +// Helpful defines +#define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define _______ KC_TRNS + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _CL 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: Base Layer (Default Layer) + */ +[_BL] = KEYMAP( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + */ +[_FL] = KEYMAP( + S(KC_GRV), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_GRV), KC_DEL, BL_STEP, \ + S(KC_TAB), S(KC_Q), S(KC_W),S(KC_E),S(KC_R),S(KC_T), S(KC_Y), S(KC_U),S(KC_I),S(KC_O), S(KC_P), S(KC_LBRC),S(KC_RBRC),S(KC_BSLS), S(KC_PGDN), \ + S(KC_LCTL),S(KC_A), MO(_CL),S(KC_D),S(KC_F),S(KC_G), S(KC_H), S(KC_J),S(KC_K),S(KC_L), S(KC_SCLN),S(KC_QUOT),S(KC_NUHS),S(KC_ENT), \ + MO(_FL), S(KC_NUBS),S(KC_Z),S(KC_X),S(KC_C),S(KC_V), S(KC_B), S(KC_N),S(KC_M),S(KC_COMM),S(KC_DOT), S(KC_SLSH),S(KC_RO), KC_RSFT, KC_PGUP, \ + KC_LCTL, KC_LALT, KC_LGUI,MO(_FL), S(KC_SPC),S(KC_SPC), MO(_FL), KC_RGUI, KC_RALT, KC_RCTL, KC_HOME, KC_PGDN, KC_END), + + /* Keymap _CL: Control layer + */ +[_CL] = KEYMAP( + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, \ + _______, _______, _______,_______,RESET, _______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_VAD, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + MO(_FL), _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, MO(_FL), RGB_SAI, \ + _______, _______, _______,_______, RGB_MOD,RGB_MOD, _______, _______, _______, _______, RGB_HUD,RGB_SAD,RGB_HUI), +}; + +/* This is a list of user defined functions. F(N) corresponds to item N + of this list. + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(0), // Calls action_function() +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t mods_pressed; + static bool mod_flag; + + switch (id) { + case 0: + /* Handle the combined Grave/Esc key + */ + mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed + + if (record->event.pressed) { + /* The key is being pressed. + */ + if (mods_pressed) { + mod_flag = true; + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + /* The key is being released. + */ + if (mod_flag) { + mod_flag = false; + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/clueboard/keymaps/shift_fn/layout.png b/keyboards/clueboard/keymaps/shift_fn/layout.png new file mode 100644 index 00000000..66d85410 Binary files /dev/null and b/keyboards/clueboard/keymaps/shift_fn/layout.png differ diff --git a/keyboards/clueboard/keymaps/shift_fn/readme.md b/keyboards/clueboard/keymaps/shift_fn/readme.md new file mode 100644 index 00000000..369f556f --- /dev/null +++ b/keyboards/clueboard/keymaps/shift_fn/readme.md @@ -0,0 +1,17 @@ +``` + ___ _____ _ _ _ __ __ _ __ +|__ \ / ____| | | | | | / / / /(_) / / + ||) | | | | |_ _ ___| |__ ___ __ _ _ __ __| | / /_ / /_ / / + |/ / | | | | | | |/ _ \ '_ \ / _ \ / _` | '__/ _` | | '_ \| '_ \ / / + |_| | |____| | |_| | __/ |_) | (_) | (_| | | | (_| | | (_) | (_) / / _ + (_) \_____|_|\__,_|\___|_.__/ \___/ \__,_|_| \__,_| \___/ \___/_/ (_) +``` + +![Clueboard Layout Image](layout.png) + +# Shift Fn Clueboard Layout + +This is an experimental layout. It makes the left shift key a dual roll key. +For most keys it acts as a shift key, but for some keys it activates an +alternate function instead. Primarily I use this to access the F-keys under +the number rows. diff --git a/keyboards/clueboard/keymaps/skully/keymap.c b/keyboards/clueboard/keymaps/skully/keymap.c index df6f054e..077d214f 100644 --- a/keyboards/clueboard/keymaps/skully/keymap.c +++ b/keyboards/clueboard/keymaps/skully/keymap.c @@ -1,7 +1,8 @@ #include "clueboard.h" -// Used for SHIFT_ESC -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +// Helpful defines +#define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define _______ KC_TRNS // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. @@ -9,21 +10,10 @@ // entirely and just use numbers. #define _BL 0 #define _FL 1 -#define _RS 2 +#define _CL 2 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Keymap _BL: (Base Layer) Default Layer - * ,--------------------------------------------------------------------------. ,----. - * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP| - * |--------------------------------------------------------------------------| |----| - * | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN| - * |--------------------------------------------------------------------------| `----' - * |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent| - * |-----------------------------------------------------------------------------. - * |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP| - * |------------------------------------------------------------------------|----|----. - * | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT| - * `----------------------------------------------------------------------------------' + /* Keymap _BL: Base Layer (Default Layer) */ [_BL] = KEYMAP( F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ @@ -33,61 +23,43 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LALT,KC_LGUI,MO(_FL), KC_SPC, KC_SPC, MO(_FL), KC_RGUI, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), /* Keymap _FL: Function Layer - * ,--------------------------------------------------------------------------. ,----. - * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN| - * |--------------------------------------------------------------------------| |----| - * | | | | | | | | |PScr|SLck|Paus| | | | |BLDE| - * |--------------------------------------------------------------------------| `----' - * | | | _RS| | | | | | | | | | | | - * |-----------------------------------------------------------------------------. - * | | | | | | | | | | | | | | |PGUP| - * |------------------------------------------------------------------------|----|----. - * | | | | | | | | | | _FL|HOME|PGDN| END| - * `----------------------------------------------------------------------------------' */ [_FL] = KEYMAP( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,KC_DEL, BL_STEP, \ - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \ - KC_TRNS,KC_TRNS,MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_PGUP, \ - KC_TRNS,KC_TRNS,KC_TRNS,MO(_FL), KC_TRNS,KC_TRNS, MO(_FL),KC_TRNS,KC_TRNS,MO(_FL),KC_HOME,KC_PGDN,KC_END), + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,KC_DEL, BL_STEP, \ + _______,_______,_______,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK,KC_PAUS,_______,_______,_______, _______, \ + _______,_______,MO(_CL),_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_PGUP, \ + _______,_______,_______,MO(_FL), _______,_______, MO(_FL),_______,_______,MO(_FL),KC_HOME,KC_PGDN,KC_END), - /* Keymap _RS: Reset layer - * ,--------------------------------------------------------------------------. ,----. - * | | | | | | | | | | | | | | | | | | - * |--------------------------------------------------------------------------| |----| - * | | | | |RESET| | | | | | | | | | | | - * |--------------------------------------------------------------------------| `----' - * | | | _RS| | | | | | | | | | | | - * |-----------------------------------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------------------------------------------------------------------------|----|----. - * | | | | | | | | | | _FL| | | | - * `----------------------------------------------------------------------------------' + /* Keymap _CL: Control layer */ -[_RS] = KEYMAP( - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \ - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \ - KC_TRNS,KC_TRNS,MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \ - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,MO(_FL),KC_TRNS, KC_TRNS, KC_TRNS), -}; - -enum function_id { - SHIFT_ESC, +[_CL] = KEYMAP( + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, \ + _______,_______,_______,_______,RESET, _______,_______,_______,_______,_______,_______,_______,_______,_______, _______, \ + _______,_______,MO(_CL),_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, \ + _______,_______,_______,_______, _______,_______, _______,_______,_______,MO(_FL),_______, _______, _______), }; const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), + [0] = ACTION_FUNCTION(0), }; void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; + static uint8_t mods_pressed; + static bool mod_flag; + switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + case 0: + /* Handle the combined Grave/Esc key + */ + mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed + if (record->event.pressed) { - if (shift_esc_shift_mask) { + /* The key is being pressed. + */ + if (mods_pressed) { + mod_flag = true; add_key(KC_GRV); send_keyboard_report(); } else { @@ -95,7 +67,10 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { send_keyboard_report(); } } else { - if (shift_esc_shift_mask) { + /* The key is being released. + */ + if (mod_flag) { + mod_flag = false; del_key(KC_GRV); send_keyboard_report(); } else { diff --git a/keyboards/clueboard/keymaps/skully/layout.png b/keyboards/clueboard/keymaps/skully/layout.png new file mode 100644 index 00000000..64854aae Binary files /dev/null and b/keyboards/clueboard/keymaps/skully/layout.png differ diff --git a/keyboards/clueboard/keymaps/skully/readme.md b/keyboards/clueboard/keymaps/skully/readme.md index c1182123..08255dfb 100644 --- a/keyboards/clueboard/keymaps/skully/readme.md +++ b/keyboards/clueboard/keymaps/skully/readme.md @@ -1,3 +1,14 @@ +``` + ___ _____ _ _ _ __ __ _ __ +|__ \ / ____| | | | | | / / / /(_) / / + ||) | | | | |_ _ ___| |__ ___ __ _ _ __ __| | / /_ / /_ / / + |/ / | | | | | | |/ _ \ '_ \ / _ \ / _` | '__/ _` | | '_ \| '_ \ / / + |_| | |____| | |_| | __/ |_) | (_) | (_| | | | (_| | | (_) | (_) / / _ + (_) \_____|_|\__,_|\___|_.__/ \___/ \__,_|_| \__,_| \___/ \___/_/ (_) +``` + +![Clueboard Layout Image](layout.png) + # skullY's Clueboard Layout This layout is what I (@skullydazed) use on my personal Clueboards. I mostly use it for programming, CAD, and general typing. diff --git a/keyboards/clueboard/keymaps/unix_optimized/keymap.c b/keyboards/clueboard/keymaps/unix_optimized/keymap.c new file mode 100644 index 00000000..7c135995 --- /dev/null +++ b/keyboards/clueboard/keymaps/unix_optimized/keymap.c @@ -0,0 +1,86 @@ +#include "clueboard.h" + +// Helpful defines +#define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define _______ KC_TRNS + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _CL 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: Base Layer (Default Layer) + */ +[_BL] = KEYMAP( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + */ +[_FL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, KC_INS, \ + _______, _______, _______,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK, KC_PAUS, _______, _______, _______, KC_DEL, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, KC_PGUP, \ + _______, _______, _______, _______, _______,_______, _______, _______, _______, MO(_FL), KC_HOME, KC_PGDN, KC_END), + + /* Keymap _CL: Control layer + */ +[_CL] = KEYMAP( + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, \ + _______, _______, _______,_______,RESET, _______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_VAD, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + MO(_FL), _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, MO(_FL), RGB_SAI, \ + _______, _______, _______,_______, RGB_MOD,RGB_MOD, _______, _______, _______, _______, RGB_HUD, RGB_SAD,RGB_HUI), +}; + +/* This is a list of user defined functions. F(N) corresponds to item N + of this list. + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(0), // Calls action_function() +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t mods_pressed; + static bool mod_flag; + + switch (id) { + case 0: + /* Handle the combined Grave/Esc key + */ + mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed + + if (record->event.pressed) { + /* The key is being pressed. + */ + if (mods_pressed) { + mod_flag = true; + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + /* The key is being released. + */ + if (mod_flag) { + mod_flag = false; + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/clueboard/keymaps/unix_optimized/layout.png b/keyboards/clueboard/keymaps/unix_optimized/layout.png new file mode 100644 index 00000000..ea7d30e3 Binary files /dev/null and b/keyboards/clueboard/keymaps/unix_optimized/layout.png differ diff --git a/keyboards/clueboard/keymaps/unix_optimized/readme.md b/keyboards/clueboard/keymaps/unix_optimized/readme.md new file mode 100644 index 00000000..3510e138 --- /dev/null +++ b/keyboards/clueboard/keymaps/unix_optimized/readme.md @@ -0,0 +1,15 @@ +``` + ___ _____ _ _ _ __ __ _ __ +|__ \ / ____| | | | | | / / / /(_) / / + ||) | | | | |_ _ ___| |__ ___ __ _ _ __ __| | / /_ / /_ / / + |/ / | | | | | | |/ _ \ '_ \ / _ \ / _` | '__/ _` | | '_ \| '_ \ / / + |_| | |____| | |_| | __/ |_) | (_) | (_| | | | (_| | | (_) | (_) / / _ + (_) \_____|_|\__,_|\___|_.__/ \___/ \__,_|_| \__,_| \___/ \___/_/ (_) +``` + +![Clueboard Layout Image](layout.png) + +# Default Clueboard Layout + +This is the default layout except that Caps Lock has been changed to Control +and Insert and Delete have been put into the Fn layer. diff --git a/keyboards/clueboard/keymaps/win_optimized/keymap.c b/keyboards/clueboard/keymaps/win_optimized/keymap.c new file mode 100644 index 00000000..c5553ff1 --- /dev/null +++ b/keyboards/clueboard/keymaps/win_optimized/keymap.c @@ -0,0 +1,86 @@ +#include "clueboard.h" + +// Helpful defines +#define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define _______ KC_TRNS + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _CL 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: Base Layer (Default Layer) + */ +[_BL] = KEYMAP( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_INS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + */ +[_FL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, BL_STEP, \ + _______, _______, _______,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK, KC_PAUS, _______, _______, _______, _______, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, KC_PGUP, \ + _______, _______, _______, _______, _______,_______, _______, _______, _______, MO(_FL), KC_HOME, KC_PGDN, KC_END), + + /* Keymap _CL: Control layer + */ +[_CL] = KEYMAP( + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, \ + _______, _______, _______,_______,RESET, _______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_VAD, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + MO(_FL), _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, MO(_FL), RGB_SAI, \ + _______, _______, _______,_______, RGB_MOD, RGB_MOD, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI), +}; + +/* This is a list of user defined functions. F(N) corresponds to item N + of this list. + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(0), // Calls action_function() +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t mods_pressed; + static bool mod_flag; + + switch (id) { + case 0: + /* Handle the combined Grave/Esc key + */ + mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed + + if (record->event.pressed) { + /* The key is being pressed. + */ + if (mods_pressed) { + mod_flag = true; + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + /* The key is being released. + */ + if (mod_flag) { + mod_flag = false; + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/clueboard/keymaps/win_optimized/layout.png b/keyboards/clueboard/keymaps/win_optimized/layout.png new file mode 100644 index 00000000..7d8c82da Binary files /dev/null and b/keyboards/clueboard/keymaps/win_optimized/layout.png differ diff --git a/keyboards/clueboard/keymaps/win_optimized/readme.md b/keyboards/clueboard/keymaps/win_optimized/readme.md new file mode 100644 index 00000000..cede17ee --- /dev/null +++ b/keyboards/clueboard/keymaps/win_optimized/readme.md @@ -0,0 +1,17 @@ +``` + ___ _____ _ _ _ __ __ _ __ +|__ \ / ____| | | | | | / / / /(_) / / + ||) | | | | |_ _ ___| |__ ___ __ _ _ __ __| | / /_ / /_ / / + |/ / | | | | | | |/ _ \ '_ \ / _ \ / _` | '__/ _` | | '_ \| '_ \ / / + |_| | |____| | |_| | __/ |_) | (_) | (_| | | | (_| | | (_) | (_) / / _ + (_) \_____|_|\__,_|\___|_.__/ \___/ \__,_|_| \__,_| \___/ \___/_/ (_) +``` + +![Clueboard Layout Image](layout.png) + +# Default Clueboard Layout + +This is the default layout that comes flashed on every Clueboard. For the most +part it's a straightforward and easy to follow layout. The only unusual key is +the key in the upper left, which sends Escape normally, but Grave when any of +the Ctrl, Alt, or GUI modifiers are held down. diff --git a/keyboards/clueboard/rev1/config.h b/keyboards/clueboard/rev1/config.h index 8c949723..f40876ff 100644 --- a/keyboards/clueboard/rev1/config.h +++ b/keyboards/clueboard/rev1/config.h @@ -26,7 +26,7 @@ /* Underlight configuration */ #define RGB_DI_PIN B2 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 14 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/clueboard/rev2/config.h b/keyboards/clueboard/rev2/config.h index 15ca4ece..8435fd02 100644 --- a/keyboards/clueboard/rev2/config.h +++ b/keyboards/clueboard/rev2/config.h @@ -30,7 +30,7 @@ /* Underlight configuration */ #define RGB_DI_PIN D7 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 14 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/clueboard/rules.mk b/keyboards/clueboard/rules.mk index 3909fbd5..7ce096ba 100644 --- a/keyboards/clueboard/rules.mk +++ b/keyboards/clueboard/rules.mk @@ -90,14 +90,14 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # Build Options # comment out to disable the options. # -BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) -EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +EXTRAKEY_ENABLE ?= no # Audio control and System control(+450) CONSOLE_ENABLE ?= yes # Console for debug(+400) -COMMAND_ENABLE ?= yes # Commands for debug and configuration +COMMAND_ENABLE ?= yes # Commands for debug and configuration NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work AUDIO_ENABLE ?= no -RGBLIGHT_ENABLE ?= no # Enable keyboard underlight functionality +RGBLIGHT_ENABLE ?= yes # Enable keyboard underlight functionality MIDI_ENABLE ?= no # MIDI controls UNICODE_ENABLE ?= no # Unicode -BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID \ No newline at end of file +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID diff --git a/keyboards/cluecard/config.h b/keyboards/cluecard/config.h index 765347b1..6520eb55 100644 --- a/keyboards/cluecard/config.h +++ b/keyboards/cluecard/config.h @@ -140,7 +140,7 @@ along with this program. If not, see . /* Underlight configuration */ #define RGB_DI_PIN E6 -//#define RGBLIGHT_TIMER +//#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 4 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/cluecard/keymaps/rgb_effects/config.h b/keyboards/cluecard/keymaps/rgb_effects/config.h index e88847df..c6c9342c 100644 --- a/keyboards/cluecard/keymaps/rgb_effects/config.h +++ b/keyboards/cluecard/keymaps/rgb_effects/config.h @@ -4,7 +4,7 @@ #include "../../config.h" // place overrides here -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLIGHT_EFFECT_SNAKE_LENGTH 3 #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 #define RGBLIGHT_EFFECT_KNIGHT_OFFSET 2 diff --git a/keyboards/cluepad/config.h b/keyboards/cluepad/config.h index bae05fad..bd64dfd2 100644 --- a/keyboards/cluepad/config.h +++ b/keyboards/cluepad/config.h @@ -70,7 +70,7 @@ along with this program. If not, see . /* Underlight configuration */ #define RGB_DI_PIN F6 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 4 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/converter/Makefile b/keyboards/converter/Makefile new file mode 100644 index 00000000..4e2a6f00 --- /dev/null +++ b/keyboards/converter/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif \ No newline at end of file diff --git a/keyboards/converter/converter.c b/keyboards/converter/converter.c new file mode 100644 index 00000000..aa4bef63 --- /dev/null +++ b/keyboards/converter/converter.c @@ -0,0 +1 @@ +#include "converter.h" \ No newline at end of file diff --git a/keyboards/converter/converter.h b/keyboards/converter/converter.h new file mode 100644 index 00000000..7a4a4835 --- /dev/null +++ b/keyboards/converter/converter.h @@ -0,0 +1 @@ +#include "quantum.h" \ No newline at end of file diff --git a/keyboards/converter/ibm_terminal/Makefile b/keyboards/converter/ibm_terminal/Makefile new file mode 100644 index 00000000..191c6bb6 --- /dev/null +++ b/keyboards/converter/ibm_terminal/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/converter/ibm_terminal/README b/keyboards/converter/ibm_terminal/README new file mode 100644 index 00000000..6b7aff2c --- /dev/null +++ b/keyboards/converter/ibm_terminal/README @@ -0,0 +1,40 @@ +Keyboard converter for IBM terminal keyboard +============================================ + +This is a port of TMK's converter/terminal_usb to QMK. + +It supports PS/2 Scan Code Set 3 and runs on USB AVR chips such like PJRC Teensy. +I tested the converter on ATMega32U4 with 1392595(102keys) and 6110345(122keys). + +Source code: https://github.com/tmk/tmk_keyboard +Article: http://geekhack.org/index.php?topic=27272.0 + + +CONNECTION +---------- +Keyboard ATMega32U4 +---------------------- +Data: PD2 +Clock: PD5 + +And VCC and GND, of course. See RESOURCE for keyboard connector pin assign. + + +BUILD +----- +$ git clone https://github.com/tmk/tmk_keyboard.git +$ cd converter/terminal_usb +$ make + + +RESOURCE +-------- +Soarer's Converter: http://geekhack.org/index.php?topic=17458.0 +102keys(1392595): http://geekhack.org/index.php?topic=10737.0 +122keys(1390876): http://www.seasip.info/VintagePC/ibm_1390876.html +KbdBabel: http://www.kbdbabel.org/ +RJ45 Connector: http://www.kbdbabel.org/conn/kbd_connector_ibmterm.png +DIN Connector: http://www.kbdbabel.org/conn/kbd_connector_ibm3179_318x_319x.png +WinAVR: http://winavr.sourceforge.net/ + +EOF diff --git a/keyboards/converter/ibm_terminal/config.h b/keyboards/converter/ibm_terminal/config.h new file mode 100644 index 00000000..4dd85f69 --- /dev/null +++ b/keyboards/converter/ibm_terminal/config.h @@ -0,0 +1,138 @@ +/* +Copyright 2012 Jun Wako +Copyright 2016 Priyadi Iman Nurcahyo + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6535 +#define DEVICE_VER 0x0100 +#define MANUFACTURER QMK +#define PRODUCT IBM Terminal Keyboard +#define DESCRIPTION USB converter for IBM Terminal Keyboard + + +/* matrix size */ +#define MATRIX_ROWS 17 // keycode bit: 3-0 +#define MATRIX_COLS 8 // keycode bit: 6-4 + + +/* legacy keymap support */ +#define USE_LEGACY_KEYMAP + + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT) | MOD_BIT(KC_RALT) | MOD_BIT(KC_RCTL)) \ +) + + +/* + * PS/2 USART configuration for ATMega32U4 + */ +#ifdef PS2_USE_USART +/* XCK for clock line */ +#define PS2_CLOCK_PORT PORTD +#define PS2_CLOCK_PIN PIND +#define PS2_CLOCK_DDR DDRD +#define PS2_CLOCK_BIT 5 +/* RXD for data line */ +#define PS2_DATA_PORT PORTD +#define PS2_DATA_PIN PIND +#define PS2_DATA_DDR DDRD +#define PS2_DATA_BIT 2 + +/* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */ +/* set DDR of CLOCK as input to be slave */ +#define PS2_USART_INIT() do { \ + PS2_CLOCK_DDR &= ~(1< + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include +#include +#include "keycode.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "ibm_terminal.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Layer 0 + + KEYMAP( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + + KC_PSCR,KC_ESC, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_NO, KC_BSPC, KC_INS, KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, + KC_SLCK,KC_INT4, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC, KC_NO, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_PAUS,KC_INT5, KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_BSLS,KC_ENT, KC_UP, KC_P4, KC_P5, KC_P6, KC_PCMM, + KC_APP, KC_INT6, KC_LSFT,KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_NO, KC_RSFT, KC_LEFT,KC_INT2,KC_RGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_RGUI,KC_LGUI, KC_LCTL, KC_LALT, KC_SPC, KC_LGUI, KC_GRV, KC_DOWN, KC_NO, KC_P0, KC_PDOT,KC_NO + ), + +/* 101-key keymaps + */ + /* 0: default + * ,---. ,---------------. ,---------------. ,---------------. ,-----------. + * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| + * `---' `---------------' `---------------' `---------------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| /| *| -| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| | + * |-----------------------------------------------------------| `-----------' |-----------| +| + * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| | + * |-----------------------------------------------------------| ,---. |---------------| + * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | + * |-----------------------------------------------------------| ,-----------. |-----------|Ent| + * |Ctrl| |Alt | Space |Alt | |Ctrl| |Lef|Dow|Rig| | 0| .| | + * `----' `---------------------------------------' `----' `-----------' `---------------' + */ +/* + KEYMAP_101( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK, KC_BRK, + + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL,KC_BSPC, KC_INS,KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, KC_END,KC_PGDN, KC_P7, KC_P8, KC_P9, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6,KC_PPLS, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT,KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, + KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT, KC_P0, KC_PDOT,KC_PENT + ), +*/ +}; diff --git a/keyboards/converter/ibm_terminal/keymaps/priyadi/Makefile b/keyboards/converter/ibm_terminal/keymaps/priyadi/Makefile new file mode 100644 index 00000000..9ec24649 --- /dev/null +++ b/keyboards/converter/ibm_terminal/keymaps/priyadi/Makefile @@ -0,0 +1,27 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= no # Console for debug(+400) +COMMAND_ENABLE ?= no # Commands for debug and configuration +NKRO_ENABLE ?= yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality +MIDI_ENABLE ?= no # MIDI controls +AUDIO_ENABLE ?= no # Audio output on port C6 +UNICODE_ENABLE ?= no # Unicode +UNICODEMAP_ENABLE ?= yes +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +PS2_USE_USART ?= yes +API_SYSEX_ENABLE ?= no + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../../Makefile +endif + diff --git a/keyboards/converter/ibm_terminal/keymaps/priyadi/config.h b/keyboards/converter/ibm_terminal/keymaps/priyadi/config.h new file mode 100644 index 00000000..7fa3bf32 --- /dev/null +++ b/keyboards/converter/ibm_terminal/keymaps/priyadi/config.h @@ -0,0 +1,6 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#endif diff --git a/keyboards/converter/ibm_terminal/keymaps/priyadi/keymap.c b/keyboards/converter/ibm_terminal/keymaps/priyadi/keymap.c new file mode 100644 index 00000000..592f7654 --- /dev/null +++ b/keyboards/converter/ibm_terminal/keymaps/priyadi/keymap.c @@ -0,0 +1,312 @@ +/* +Copyright 2016 Priyadi Iman Nurcahyo + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "keycode.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "ibm_terminal.h" +#include "action_layer.h" + +// Fillers to make layering clearer + +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +enum layers { + QWE, // qwerty + COL, // colemak + WOR, // workman + DVO, // dvorak + + MOU, // mouse keys + EMO, // emoji + SYS, // system +}; + +enum keycodes { + // default layout switcher + LAY_QWE = SAFE_RANGE, + LAY_COL, + LAY_WOR, + LAY_DVO, + + // layer switchers + LYR_SYS, + LYR_EMO, + + // os switchers + OS_LIN, + OS_WIN, + OS_MAC, +}; + +// unicode map + +enum unicode_name { + GRIN, // grinning face 😊 + TJOY, // tears of joy 😂 + SMILE, // grining face with smiling eyes 😠+ HEART, // heart ⤠+ EYERT, // smiling face with heart shaped eyes 😠+ CRY, // crying face 😭 + SMEYE, // smiling face with smiling eyes 😊 + UNAMU, // unamused 😒 + KISS, // kiss 😘 + HART2, // two hearts 💕 + WEARY, // weary 😩 + OKHND, // ok hand sign 👌 + PENSV, // pensive 😔 + SMIRK, // smirk 😠+ RECYC, // recycle â™» + WINK, // wink 😉 + THMUP, // thumb up 👠+ THMDN, // thumb down 👎 + PRAY, // pray 🙠+ PHEW, // relieved 😌 + MUSIC, // musical notes + FLUSH, // flushed 😳 + CELEB, // celebration 🙌 + CRY2, // crying face 😢 + COOL, // smile with sunglasses 😎 + NOEVS, // see no evil + NOEVH, // hear no evil + NOEVK, // speak no evil + POO, // pile of poo + EYES, // eyes + VIC, // victory hand + BHART, // broken heart + SLEEP, // sleeping face + SMIL2, // smiling face with open mouth & sweat + HUNRD, // 100 + CONFU, // confused + TONGU, // face with tongue & winking eye + DISAP, // disappointed + YUMMY, // face savoring delicious food + CLAP, // hand clapping + FEAR, // face screaming in fear + HORNS, // smiling face with horns + HALO, // smiling face with halo + BYE, // waving hand + SUN, // sun + MOON, // moon + SKULL, // skull +}; + +const uint32_t PROGMEM unicode_map[] = { + [GRIN] = 0x1F600, + [TJOY] = 0x1F602, + [SMILE] = 0x1F601, + [HEART] = 0x2764, + [EYERT] = 0x1f60d, + [CRY] = 0x1f62d, + [SMEYE] = 0x1F60A, + [UNAMU] = 0x1F612, + [KISS] = 0x1F618, + [HART2] = 0x1F495, + [WEARY] = 0x1F629, + [OKHND] = 0x1F44C, + [PENSV] = 0x1F614, + [SMIRK] = 0x1F60F, + [RECYC] = 0x267B, + [WINK] = 0x1F609, + [THMUP] = 0x1F44D, + [THMDN] = 0x1F44E, + [PRAY] = 0x1F64F, + [PHEW] = 0x1F60C, + [MUSIC] = 0x1F3B6, + [FLUSH] = 0x1F633, + [CELEB] = 0x1F64C, + [CRY2] = 0x1F622, + [COOL] = 0x1F60E, + [NOEVS] = 0x1F648, + [NOEVH] = 0x1F649, + [NOEVK] = 0x1F64A, + [POO] = 0x1F4A9, + [EYES] = 0x1F440, + [VIC] = 0x270C, + [BHART] = 0x1F494, + [SLEEP] = 0x1F634, + [SMIL2] = 0x1F605, + [HUNRD] = 0x1F4AF, + [CONFU] = 0x1F615, + [TONGU] = 0x1F61C, + [DISAP] = 0x1F61E, + [YUMMY] = 0x1F60B, + [CLAP] = 0x1F44F, + [FEAR] = 0x1F631, + [HORNS] = 0x1F608, + [HALO] = 0x1F607, + [BYE] = 0x1F44B, + [SUN] = 0x2600, + [MOON] = 0x1F314, + [SKULL] = 0x1F480, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* qwerty */ + [QWE] = KEYMAP( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_PSCR, KC_SLCK, KC_PAUS, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + + MO(EMO), MO(SYS), KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, XXXXXXX, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_MNXT, KC_VOLU, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, XXXXXXX, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_MPLY, KC_MUTE, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, KC_UP, KC_P4, KC_P5, KC_P6, KC_PCMM, + KC_MPRV, KC_VOLD, KC_LSFT, KC_GRV, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, XXXXXXX, KC_RSFT, KC_LEFT, TG(MOU), KC_RGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LGUI, KC_APP, KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_DOWN, XXXXXXX, KC_P0, KC_PDOT, XXXXXXX + ), + + /* colemak */ + [COL] = KEYMAP( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + + /* workman */ + [WOR] = KEYMAP( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_SCLN, KC_LBRC, KC_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, KC_QUOT, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + + /* dvorak */ + [DVO] = KEYMAP( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + + /* system */ + [SYS] = KEYMAP( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, LAY_QWE, OS_WIN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, LAY_DVO, _______, _______, _______, _______, LAY_WOR, OS_LIN, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, LAY_COL, _______, _______, _______, OS_MAC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + + /* mouse keys */ + [MOU] = KEYMAP( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_BTN4, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_U, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_BTN5, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, _______, KC_MS_R, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_BTN1, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_D, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), + + /* emoji */ + [EMO] = KEYMAP( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY), X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV),XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN), X(HEART),X(BYE), X(KISS), X(CELEB),X(COOL), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,X(SLEEP),X(CLAP), X(CRY), X(VIC), X(BHART),X(SUN), X(SMEYE),X(WINK), X(MOON), X(CONFU), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), + + /* + [XXX] = KEYMAP( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + */ +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + /* layout switcher */ + case LAY_QWE: + if (record->event.pressed) { + persistant_default_layer_set(1UL<event.pressed) { + persistant_default_layer_set(1UL<event.pressed) { + persistant_default_layer_set(1UL<event.pressed) { + persistant_default_layer_set(1UL< + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "stdint.h" +#include "ps2.h" +#include "led.h" + + +void led_set(uint8_t usb_led) +{ + uint8_t ps2_led = 0; + if (usb_led & (1< + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "print.h" +#include "util.h" +#include "debug.h" +#include "ps2.h" +#include "matrix.h" + +#define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +#define print_matrix_header() print("\nr/c 01234567\n") +#define matrix_bitpop(i) bitpop(matrix[i]) +#define ROW_SHIFTER ((uint8_t)1) + + +static void matrix_make(uint8_t code); +static void matrix_break(uint8_t code); + + +/* + * Matrix Array usage: + * 'Scan Code Set 3' is assigned into 17x8 cell matrix. + * + * 8bit wide + * +---------+ + * 0| | + * :| | 0x00-0x87 + * ;| | + * 17| | + * +---------+ + */ +static uint8_t matrix[MATRIX_ROWS]; +#define ROW(code) (code>>3) +#define COL(code) (code&0x07) + + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +void matrix_init(void) +{ + debug_enable = true; + //debug_matrix = true; + //debug_keyboard = true; + //debug_mouse = false; + + ps2_host_init(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + + matrix_init_user(); + return; +} + +uint8_t matrix_scan(void) +{ + + // scan code reading states + static enum { + RESET, + RESET_RESPONSE, + KBD_ID0, + KBD_ID1, + CONFIG, + READY, + F0, + } state = RESET; + + uint8_t code; + if ((code = ps2_host_recv())) { + debug("r"); debug_hex(code); debug(" "); + } + + switch (state) { + case RESET: + debug("wFF "); + if (ps2_host_send(0xFF) == 0xFA) { + debug("[ack]\nRESET_RESPONSE: "); + state = RESET_RESPONSE; + } + break; + case RESET_RESPONSE: + if (code == 0xAA) { + debug("[ok]\nKBD_ID: "); + state = KBD_ID0; + } else if (code) { + debug("err\nRESET: "); + state = RESET; + } + break; + // after reset receive keyboad ID(2 bytes) + case KBD_ID0: + if (code) { + state = KBD_ID1; + } + break; + case KBD_ID1: + if (code) { + debug("\nCONFIG: "); + state = CONFIG; + } + break; + case CONFIG: + debug("wF8 "); + if (ps2_host_send(0xF8) == 0xFA) { + debug("[ack]\nREADY\n"); + state = READY; + } + break; + case READY: + switch (code) { + case 0x00: + break; + case 0xF0: + state = F0; + debug(" "); + break; + default: // normal key make + if (code < 0x88) { + matrix_make(code); + } else { + debug("unexpected scan code at READY: "); debug_hex(code); debug("\n"); + } + state = READY; + debug("\n"); + } + break; + case F0: // Break code + switch (code) { + case 0x00: + break; + default: + if (code < 0x88) { + matrix_break(code); + } else { + debug("unexpected scan code at F0: "); debug_hex(code); debug("\n"); + } + state = READY; + debug("\n"); + } + break; + } + return 1; +} + +inline +uint8_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +inline +static void matrix_make(uint8_t code) +{ + if (!matrix_is_on(ROW(code), COL(code))) { + matrix[ROW(code)] |= 1<. #include "../config.h" +#include "config_common.h" + /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x1307 @@ -39,10 +41,24 @@ along with this program. If not, see . #define LED_BRIGHTNESS_LO 15 #define LED_BRIGHTNESS_HI 255 +/* ws2812 RGB LED */ +#define RGB_DI_PIN D7 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 15 // Number of LEDs +#define RGBLIGHT_HUE_STEP 12 +#define RGBLIGHT_SAT_STEP 255 +#define RGBLIGHT_VAL_STEP 12 + +// #define RGB_MIDI +#define RGBW_BB_TWI + +#define RGBW 1 /* Set 0 if debouncing isn't needed */ #define DEBOUNCE 5 +#define USB_MAX_POWER_CONSUMPTION 500 + /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboards/ergodox/ez/ez.c b/keyboards/ergodox/ez/ez.c index ddb8ff0c..3e19f230 100644 --- a/keyboards/ergodox/ez/ez.c +++ b/keyboards/ergodox/ez/ez.c @@ -16,10 +16,10 @@ void matrix_init_kb(void) { // unused pins - C7, D4, D5, D7, E6 // set as input with internal pull-ip enabled DDRC &= ~(1<<7); - DDRD &= ~(1<<7 | 1<<5 | 1<<4); + DDRD &= ~(1<<5 | 1<<4); DDRE &= ~(1<<6); PORTC |= (1<<7); - PORTD |= (1<<7 | 1<<5 | 1<<4); + PORTD |= (1<<5 | 1<<4); PORTE |= (1<<6); ergodox_blink_all_leds(); @@ -51,6 +51,10 @@ uint8_t init_mcp23018(void) { mcp23018_status = 0x20; // I2C subsystem + + // uint8_t sreg_prev; + // sreg_prev=SREG; + // cli(); if (i2c_initialized == 0) { i2c_init(); // on pins D(1,0) i2c_initialized++; @@ -79,6 +83,8 @@ uint8_t init_mcp23018(void) { out: i2c_stop(); + // SREG=sreg_prev; + return mcp23018_status; } diff --git a/keyboards/ergodox/ez/matrix.c b/keyboards/ergodox/ez/matrix.c index a19bab90..43f51525 100644 --- a/keyboards/ergodox/ez/matrix.c +++ b/keyboards/ergodox/ez/matrix.c @@ -121,7 +121,7 @@ void matrix_init(void) matrix_scan_count = 0; #endif - matrix_init_kb(); + matrix_init_quantum(); } diff --git a/keyboards/ergodox/ez/rules.mk b/keyboards/ergodox/ez/rules.mk index a9715beb..64b2db81 100644 --- a/keyboards/ergodox/ez/rules.mk +++ b/keyboards/ergodox/ez/rules.mk @@ -72,6 +72,8 @@ OPT_DEFS += -DBOOTLOADER_SIZE=512 # SLEEP_LED_ENABLE = no +API_SYSEX_ENABLE ?= no +RGBLIGHT_ENABLE ?= yes ifndef QUANTUM_DIR include ../../../Makefile diff --git a/keyboards/ergodox/infinity/infinity.c b/keyboards/ergodox/infinity/infinity.c index c5793385..02db67ea 100644 --- a/keyboards/ergodox/infinity/infinity.c +++ b/keyboards/ergodox/infinity/infinity.c @@ -38,7 +38,6 @@ void init_serial_link_hal(void) { // Using a higher pre-scalar without flicker is possible but FTM0_MOD will need to be reduced // Which will reduce the brightness range #define PRESCALAR_DEFINE 0 -#ifdef VISUALIZER_ENABLE void lcd_backlight_hal_init(void) { // Setup Backlight SIM->SCGC6 |= SIM_SCGC6_FTM0; @@ -76,7 +75,6 @@ void lcd_backlight_hal_color(uint16_t r, uint16_t g, uint16_t b) { CHANNEL_GREEN.CnV = g; CHANNEL_BLUE.CnV = b; } -#endif __attribute__ ((weak)) void matrix_init_user(void) { @@ -92,6 +90,10 @@ void matrix_init_kb(void) { // runs once when the firmware starts up matrix_init_user(); + // The backlight always has to be initialized, otherwise it will stay lit +#ifndef VISUALIZER_ENABLE + lcd_backlight_hal_init(); +#endif } void matrix_scan_kb(void) { diff --git a/keyboards/ergodox/infinity/led.c b/keyboards/ergodox/infinity/led.c index 77195bb3..8175c1c5 100644 --- a/keyboards/ergodox/infinity/led.c +++ b/keyboards/ergodox/infinity/led.c @@ -21,29 +21,6 @@ along with this program. If not, see . void led_set(uint8_t usb_led) { -// The LCD backlight functionality conflicts with this simple -// red backlight -#if !defined(LCD_BACKLIGHT_ENABLE) && defined(STATUS_LED_ENABLE) - // PTC1: LCD Backlight Red(0:on/1:off) - GPIOC->PDDR |= (1<<1); - PORTC->PCR[1] |= PORTx_PCRn_DSE | PORTx_PCRn_MUX(1); - if (usb_led & (1<PCOR |= (1<<1); - } else { - GPIOC->PSOR |= (1<<1); - } -#elif !defined(LCD_BACKLIGHT_ENABLE) + //TODO: Add led emulation if there's no customized visualization (void)usb_led; - GPIOC->PDDR |= (1<<1); - PORTC->PCR[1] |= PORTx_PCRn_DSE | PORTx_PCRn_MUX(1); - GPIOC->PSOR |= (1<<1); - GPIOC->PDDR |= (1<<2); - PORTC->PCR[2] |= PORTx_PCRn_DSE | PORTx_PCRn_MUX(1); - GPIOC->PSOR |= (1<<2); - GPIOC->PDDR |= (1<<3); - PORTC->PCR[3] |= PORTx_PCRn_DSE | PORTx_PCRn_MUX(1); - GPIOC->PSOR |= (1<<3); -#else - (void)usb_led; -#endif } diff --git a/keyboards/ergodox/infinity/rules.mk b/keyboards/ergodox/infinity/rules.mk index ccb735a4..473a6dfe 100644 --- a/keyboards/ergodox/infinity/rules.mk +++ b/keyboards/ergodox/infinity/rules.mk @@ -63,6 +63,8 @@ VISUALIZER_ENABLE ?= no #temporarily disabled to make everything compile LCD_ENABLE ?= yes LED_ENABLE ?= yes LCD_BACKLIGHT_ENABLE ?= yes +MIDI_ENABLE = no +RGBLIGHT_ENABLE = no ifndef QUANTUM_DIR include ../../../Makefile diff --git a/keyboards/ergodox/keymaps/ab/readme.md b/keyboards/ergodox/keymaps/ab/readme.md index 6b1ac2be..4ad80efe 100644 --- a/keyboards/ergodox/keymaps/ab/readme.md +++ b/keyboards/ergodox/keymaps/ab/readme.md @@ -8,7 +8,7 @@ Beginner's keymap emulates standard QWERTY keyboard for beginners. Once you get * Easy on beginners. It has everything you need for your day to day usage. #### Cons -* Keys are not ergonomically placed to take full advantage of Ergodox-EZ. Take a look at this [Default Keymap](https://github.com/jackhumbert/qmk_firmware/blob/master/keyboards/ergodox_ez/keymaps/default/readme.md) +* Keys are not ergonomically placed to take full advantage of Ergodox-EZ. Take a look at this [Default Keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/ergodox/keymaps/default/readme.md) * While multiple layers are possible, beginner's keymap only uses one additional layer for mouse, function and volume keys. #### Notes diff --git a/keyboards/ergodox/keymaps/albert/Makefile b/keyboards/ergodox/keymaps/albert/Makefile new file mode 100644 index 00000000..eb8544af --- /dev/null +++ b/keyboards/ergodox/keymaps/albert/Makefile @@ -0,0 +1,5 @@ +COMMAND_ENABLE = no # Commands for debug and configuration + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/ergodox/keymaps/albert/config.h b/keyboards/ergodox/keymaps/albert/config.h new file mode 100644 index 00000000..e6d36311 --- /dev/null +++ b/keyboards/ergodox/keymaps/albert/config.h @@ -0,0 +1,12 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* using UK layout for space-cadet-shift */ +#define LSPO_KEY KC_9 +#define RSPC_KEY KC_0 + +#define LEADER_TIMEOUT 800 // leader key sequence timeout in millis + +#endif diff --git a/keyboards/ergodox/keymaps/albert/keymap.c b/keyboards/ergodox/keymaps/albert/keymap.c new file mode 100644 index 00000000..dfbb311b --- /dev/null +++ b/keyboards/ergodox/keymaps/albert/keymap.c @@ -0,0 +1,661 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" + +#include + +/* use UK keymap */ + +#define UK_HASH KC_NONUS_HASH +#define UK_BSLS KC_NONUS_BSLASH +#define UK_PIPE LSFT(UK_BSLS) + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define NUMB 2 // numbers and hex +#define CRSR 3 // cursor keys +#define MOUS 4 // mouse keys +#define KEYW 5 // keyword macros +#define EMAC 6 // emacs + +// my macros +#define UM_ECET M(0) // { } +#define UM_0x M(1) +#define UM_PUB M(2) +#define UM_PRO M(3) +#define UM_PRV M(4) +#define UM_CLS M(5) +#define UM_STR M(6) +#define UM_RET M(7) +#define UM_INC M(8) +#define UM_OBJ M(9) +#define UM_GITLOG M(10) +#define UM_GOODM M(11) +#define UM_NAMESP M(12) +#define UM_EMTR M(14) // emacs toggle read-only +#define UM_EMWR M(15) // emacs write buffer (save) +#define UM_EMUN M(16) // emacs undo +#define UM_EMRE M(17) // emacs redo +#define UM_EMPB M(18) // emacs previous buffer +#define UM_EMNB M(19) // emacs next buffer +#define UM_GOODN M(20) +#define UM_ECETS M(22) // { }; +#define UM_TMPL M(23) +#define UM_TYPN M(24) +#define UM_CONT M(25) +#define UM_BREAK M(26) +#define UM_CONST M(27) +#define UM_SMILY M(28) +#define UM_SADF M(29) +#define UM_SCARF M(30) +#define UM_DECAF M(31) +#define UM_OPER M(32) +#define UM_NULP M(33) +#define UM_EXTR M(34) +#define UM_VIRT M(35) +#define UM_EMFB M(36) // emacs font bigger +#define UM_EMFS M(37) // emacs font smaller +#define UM_VOLAT M(38) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Base layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | SfLt | | SfRt | 6 | 7 | 8 | 9 | 0 | BkSp | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | Del | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | Caps/L2| A | S | D | F | G |------| |------| H | J | K | L | ; |Enter/L2| + * |--------+------+------+------+------+------| L6 | | L6 |------+------+------+------+------+--------| + * | LSft/( | Z | X | C | V/L3 | B/L4 | | | | N/L4 | M/L3 | , | . | / | RSft/) | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |Ctrl/[| Alt/]| # | Left |Right | | Up | Down | - | Alt/[|Ctrl/]| + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | L2 | lead | | lead | Ins | + * ,------|------|------| |------+------+------. + * | Space| BkSp | Home | | PgUp | Enter|Space | + * | / | / |------| |------| / | / | + * | Ctrl | Alt |End/L5| |PDn/L5| Alt | Ctrl | + * `--------------------' `--------------------' + */ +[BASE] = KEYMAP( // layer 0 : default + // left hand + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, LSFT(KC_LEFT), + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, MO(SYMB), + LT(NUMB, KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSPO, KC_Z, KC_X, KC_C, LT(CRSR, KC_V), LT(MOUS, KC_B), MO(EMAC), + CTL_T(KC_LBRC), ALT_T(KC_RBRC), UK_HASH, KC_LEFT, KC_RGHT, + TG(NUMB), KC_LEAD, + KC_HOME, + CTL_T(KC_SPC), ALT_T(KC_BSPC), LT(KEYW, KC_END), + // right hand + LSFT(KC_RGHT), KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + MO(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DELT, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, LT(NUMB, KC_ENT), + MO(EMAC), LT(MOUS, KC_N), LT(CRSR, KC_M), KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_UP, KC_DOWN, KC_MINS, ALT_T(KC_LBRC), CTL_T(KC_RBRC), + KC_LEAD, KC_INS, + KC_PGUP, + LT(KEYW, KC_PGDN), ALT_T(KC_ENT), CTL_T(KC_SPC) + ), +/* Keymap 1: Symbol Layer with F keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ## | F1 | F2 | F3 | F4 | F5 | ## | | ## | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | ## | ! | " | £ | $ | % | ## | | ## | - | + | = | @ | ~ | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | ## | ^ | & | * | _ | # |------| |------| { | } | ; | ' | # | ## | + * |--------+------+------+------+------+------| ## | | ## |------+------+------+------+------+--------| + * | ## | \ | | | ` | - | / | | | | [ | ] | < | > | ? | ## | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | ## | ## | ## | ## | ## | | ## | ## | ## | ## | ## | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | ## | ## | | ## | ## | + * ,------|------|------| |------+------+------. + * | | | ## | | ## | | | + * | ## | ## |------| |------| ## | ## | + * | | | ## | | ## | | | + * `--------------------' `--------------------' + */ +[SYMB] = KEYMAP( + // left hand + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS, KC_EXLM, LSFT(KC_2), LSFT(KC_3), LSFT(KC_4), LSFT(KC_5), KC_TRNS, + KC_TRNS, LSFT(KC_6), LSFT(KC_7), LSFT(KC_8), LSFT(KC_MINS), UK_HASH, + KC_TRNS, UK_BSLS, UK_PIPE, KC_GRV, KC_MINS, KC_SLSH, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_MINS, KC_PLUS, KC_EQL, LSFT(KC_QUOT), LSFT(UK_HASH), KC_F12, + KC_LCBR, KC_RCBR, KC_SCLN, KC_QUOT, UK_HASH, KC_TRNS, + KC_TRNS, KC_LBRC, KC_RBRC, LSFT(KC_COMM), LSFT(KC_DOT), LSFT(KC_SLSH), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS + ), +/* Keymap 2: Numerics and hex + * + * ,---------------------------------------------------. ,--------------------------------------------------. + * | ## | A | B | C | D | E | F | | A | B | C | D | E | F | ## | + * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | ## | * | 7 | 8 | 9 | * | 0x | | 0x | * | 7 | 8 | 9 | * | ## | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | ## | / | 4 | 5 | 6 | / |------| |------| / | 4 | 5 | 6 | / | ## | + * |---------+------+------+------+------+------| ## | | ## |------+------+------+------+------+--------| + * | ## | - | 1 | 2 | 3 | - | | | | - | 1 | 2 | 3 | - | ## | + * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | = | + | 0 | , | . | | 0 | , | . | + | = | + * `-----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | ## | ## | | ## | ## | + * ,------|------|------| |------+------+------. + * | | | ## | | ## | | | + * | ## | ## |------| |------| ## | ## | + * | | | ## | | ## | | | + * `--------------------' `--------------------' + */ +[NUMB] = KEYMAP( + // left hand + KC_TRNS, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, + KC_TRNS, KC_ASTR, KC_7, KC_8, KC_9, KC_ASTR, UM_0x, + KC_TRNS, KC_SLSH, KC_4, KC_5, KC_6, KC_SLSH, + KC_TRNS, KC_MINS, KC_1, KC_2, KC_3, KC_MINS, KC_TRNS, + KC_EQL, KC_PLUS, KC_0, KC_COMM, KC_DOT, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_TRNS, + UM_0x, KC_ASTR, KC_7, KC_8, KC_9, KC_ASTR, KC_TRNS, + KC_SLSH, KC_4, KC_5, KC_6, KC_SLSH, KC_TRNS, + KC_TRNS, KC_MINS, KC_1, KC_2, KC_3, KC_MINS, KC_TRNS, + KC_0, KC_COMM, KC_DOT, KC_PLUS, KC_EQL, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS + ), +/* Keymap 3: Cursor movement + * + * ,---------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | | Home | | Up | | PgUp | | | | PgUp | | Up | | Home | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | End | Left | Down | Right| PgDn |------| |------| PgDn | Left | Down | Right| End | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | ## | Up | | Down | ## | | | | | | ## | Down | | Up | ## | + * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | Left | Down | Right| | | | | | Left | Down | Right| + * `-----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | ## | ## |------| |------| ## | ## | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[CRSR] = KEYMAP( + // left hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_HOME, KC_NO, KC_UP, KC_NO, KC_PGUP, KC_NO, + KC_NO, KC_END, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, + KC_TRNS, KC_UP, KC_NO, KC_DOWN, KC_TRNS, KC_NO, KC_NO, + KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_TRNS, KC_TRNS, KC_NO, + // right hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_PGUP, KC_NO, KC_UP, KC_NO, KC_HOME, KC_NO, + KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_NO, + KC_NO, KC_NO, KC_TRNS, KC_DOWN, KC_NO, KC_UP, KC_TRNS, + KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_TRNS, KC_TRNS + ), +/* Keymap 4: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | Lclk | MsUp | Rclk | | | | | | Lclk | MsUp | Rclk | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| |MsLeft|MsDown|MsRght| | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | Lclk | MsUp | Rclk |MsDown| | ## | | | | ## | |MsDown| Lclk | MsUp | Rclk | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |MsLeft|MsDown|MsRight | | | | |MsLeft|MsDown|MsRght| + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[MOUS] = KEYMAP( + // left hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO, KC_NO, + KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, + KC_BTN1, KC_MS_U, KC_BTN2, KC_MS_D, KC_NO, KC_TRNS, KC_NO, + KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_NO, + // right hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO, KC_NO, + KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_NO, + KC_NO, KC_TRNS, KC_NO, KC_MS_D, KC_BTN1, KC_MS_U, KC_BTN2, + KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_NO + ), +/* Keymap 5: Keywords + * + * ,---------------------------------------------------. ,--------------------------------------------------. + * | | | | scarf| sadf | smily| | | | decaf| | | | | | + * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | | const| volat| oper | ret | tmpl | | | | typen| cont | prv | pro | pub | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | str | obj | | gitl |------| |------| | | | nulp | | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | extr | cls | virt | break| | | |namesp| goodm| goodn| | | | + * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | inc | | | | | | | | | + * `-----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | ecet | ecets| + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | ## | | ## | | | + * `--------------------' `--------------------' + */ +[KEYW] = KEYMAP( + // left hand + KC_NO, KC_NO, KC_NO, UM_SCARF, UM_SADF, UM_SMILY, KC_NO, + KC_NO, UM_CONST, UM_VOLAT, UM_OPER, UM_RET, UM_TMPL, KC_NO, + KC_NO, KC_NO, UM_STR, UM_OBJ, KC_NO, UM_GITLOG, + KC_NO, KC_NO, UM_EXTR, UM_CLS, UM_VIRT, UM_BREAK, KC_NO, + KC_NO, KC_NO, UM_INC, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_TRNS, + // right hand + KC_NO, UM_DECAF, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, UM_TYPN, UM_CONT, UM_PRV, UM_PRO, UM_PUB, KC_NO, + KC_NO, KC_NO, KC_NO, UM_NULP, KC_NO, KC_NO, + KC_NO, UM_NAMESP, UM_GOODM, UM_GOODN, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + UM_ECET, UM_ECETS, + KC_NO, + KC_TRNS, KC_NO, KC_NO + ), +/* Keymap 6: emacs + * + * ,---------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | empb | | emnb | emfs | emfb | | | | | + * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | | emtr | | | | | | | | emun | emre | w-up | | | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | emwr | | | |------| |------| |w-left|w-down|w-rght| | | + * |---------+------+------+------+------+------| ## | | ## |------+------+------+------+------+--------| + * | | | | | | | | | | | |w-down| | | | + * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `-----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[EMAC] = KEYMAP( + // left hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, UM_EMPB, + KC_NO, UM_EMTR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, UM_EMWR, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_NO, + // right hand + UM_EMNB, UM_EMFS, UM_EMFB, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, UM_EMUN, UM_EMRE, LSFT(KC_UP), KC_NO, KC_NO, KC_NO, + KC_NO, LSFT(KC_LEFT), LSFT(KC_DOWN), LSFT(KC_RGHT), KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_NO, LSFT(KC_DOWN), KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_NO + ), +}; + +enum next_key_down_up { + NK_DOWN_UP, + NK_DOWN, + NK_UP // a bit of a hack, this works as long as NK_UP < KC_A +}; + +void send_keystrokes(uint8_t key, ...) +{ + va_list vl; + va_start(vl, key); + enum next_key_down_up nkdu = NK_DOWN_UP; + while (key != KC_NO) { + if (key < KC_A) { + nkdu = key; + } else { + switch (nkdu) { + case NK_DOWN_UP: + register_code(key); + case NK_UP: + unregister_code(key); + break; + case NK_DOWN: + register_code(key); + } + nkdu = NK_DOWN_UP; + } + key = va_arg(vl, int); + } + va_end(vl); +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: // { } + if (record->event.pressed) { + return MACRO(T(ENT), D(LSFT), T(LBRC), U(LSFT), T(ENT), + D(LSFT), T(RBRC), U(LSFT), T(UP), + T(TAB), END); + } + break; + case 1: + if (record->event.pressed) { + return MACRO(T(0), T(X), END); + } + break; + case 2: + if (record->event.pressed) { + SEND_STRING("public"); + } + break; + case 3: + if (record->event.pressed) { + SEND_STRING("protected"); + } + break; + case 4: + if (record->event.pressed) { + SEND_STRING("private"); + } + break; + case 5: // class + if (record->event.pressed) { + return MACRO(T(C), T(L), T(A), T(S), T(S), T(ENT), + D(LSFT), T(LBRC), U(LSFT), T(ENT), + T(P), T(U), T(B), T(L), T(I), T(C), + D(LSFT), T(SCLN), U(LSFT), T(ENT), T(ENT), + T(P), T(R), T(I), T(V), T(A), T(T), T(E), + D(LSFT), T(SCLN), U(LSFT), T(ENT), + D(LSFT), T(RBRC), U(LSFT), T(SCLN), T(ENT), + T(UP), T(UP), T(UP), T(UP), T(UP), T(UP), T(UP), + T(END), T(SPC), END); + } + break; + case 6: // struct + if (record->event.pressed) { + return MACRO(T(S), T(T), T(R), T(U), T(C), T(T), T(ENT), + D(LSFT), T(LBRC), U(LSFT), T(ENT), + D(LSFT), T(RBRC), U(LSFT), T(SCLN), T(ENT), + T(UP), T(UP), T(UP), T(UP), + T(END), T(SPC), END); + } + break; + case 7: + if (record->event.pressed) { + SEND_STRING("return"); + } + break; + case 8: // #include + if (record->event.pressed) { + return MACRO(T(NONUS_HASH), T(I), T(N), T(C), T(L), T(U), T(D), T(E), END); + } + break; + case 9: + if (record->event.pressed) { + SEND_STRING("objdump -CT -x -d"); + } + break; + case 10: + if (record->event.pressed) { + SEND_STRING("git log --oneline --graph --decorate=short"); + } + break; + case 11: + if (record->event.pressed) { + SEND_STRING("good morning"); + } + break; + case 12: + if (record->event.pressed) { + SEND_STRING("namespace"); + } + break; + case 14: // emacs toggle read-only + if (record->event.pressed) { + return MACRO(D(LCTL), T(X), T(Q), U(LCTL), END); + } + break; + case 15: // emacs write buffer + if (record->event.pressed) { + return MACRO(D(LCTL), T(X), T(S), U(LCTL), END); + } + break; + case 16: // emacs undo + if (record->event.pressed) { + return MACRO(D(LCTL), D(LSFT), T(MINS), U(LSFT), U(LCTL), END); + } + break; + case 17: // emacs redo + if (record->event.pressed) { + return MACRO(D(LALT), D(LSFT), T(MINS), U(LSFT), U(LALT), END); + } + break; + case 18: // emacs previous buffer + if (record->event.pressed) { + return MACRO(D(LCTL), T(X), U(LCTL), T(LEFT), END); + } + break; + case 19: // emacs next buffer + if (record->event.pressed) { + return MACRO(D(LCTL), T(X), U(LCTL), T(RGHT), END); + } + break; + case 20: + if (record->event.pressed) { + SEND_STRING("good night"); + } + break; + case 22: // { }; + if (record->event.pressed) { + return MACRO(T(ENT), D(LSFT), T(LBRC), U(LSFT), T(ENT), + D(LSFT), T(RBRC), U(LSFT), T(SCLN), T(UP), + T(TAB), END); + } + break; + case 23: + if (record->event.pressed) { + SEND_STRING("template"); + } + break; + case 24: + if (record->event.pressed) { + SEND_STRING("typename"); + } + break; + case 25: + if (record->event.pressed) { + SEND_STRING("continue"); + return MACRO(T(SCLN), END); + } + break; + case 26: + if (record->event.pressed) { + SEND_STRING("break"); + return MACRO(T(SCLN), END); + } + break; + case 27: + if (record->event.pressed) { + SEND_STRING("const"); + } + break; + case 28: + if (record->event.pressed) { + SEND_STRING(":-)"); + } + break; + case 29: + if (record->event.pressed) { + SEND_STRING(":-("); + } + break; + case 30: // dazed + if (record->event.pressed) { + send_keystrokes(NK_DOWN, KC_LSFT, KC_8, KC_MINS, KC_8, NK_UP, KC_LSFT, KC_NO); + } + break; + case 31: // decaf + if (record->event.pressed) { + send_keystrokes(NK_DOWN, KC_LSFT, KC_C, KC_9, KC_MINS, KC_0, NK_UP, KC_LSFT, KC_NO); + } + break; + case 32: + if (record->event.pressed) { + SEND_STRING("operator"); + } + break; + case 33: + if (record->event.pressed) { + SEND_STRING("nullptr"); + } + break; + case 34: + if (record->event.pressed) { + SEND_STRING("extern"); + } + break; + case 35: + if (record->event.pressed) { + SEND_STRING("virtual"); + } + break; + case 36: // emacs font smaller + if (record->event.pressed) { + return MACRO(D(LCTL), T(X), T(EQL), U(LCTL), END); + } + break; + case 37: // emacs font bigger + if (record->event.pressed) { + return MACRO(D(LCTL), T(X), T(MINS), U(LCTL), END); + } + break; + case 38: + if (record->event.pressed) { + SEND_STRING("volatile"); + } + break; + } + return MACRO_NONE; +} + +LEADER_EXTERNS(); + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + LEADER_DICTIONARY() { + leading = false; + leader_end(); + + SEQ_TWO_KEYS(KC_G, KC_A) { + SEND_STRING("git add ."); + } + SEQ_TWO_KEYS(KC_G, KC_D) { + SEND_STRING("git diff"); + } + SEQ_THREE_KEYS(KC_G, KC_D, KC_S) { + SEND_STRING("git diff --staged"); + } + SEQ_TWO_KEYS(KC_G, KC_L) { + SEND_STRING("git log"); + } + SEQ_THREE_KEYS(KC_G, KC_L, KC_O) { + SEND_STRING("git log --oneline"); + } + SEQ_TWO_KEYS(KC_G, KC_F) { + SEND_STRING("git fetch"); + } + SEQ_TWO_KEYS(KC_G, KC_O) { + SEND_STRING("git checkout"); + } + SEQ_TWO_KEYS(KC_G, KC_P) { + SEND_STRING("git pull"); + } + SEQ_TWO_KEYS(KC_G, KC_S) { + SEND_STRING("git status"); + } + SEQ_TWO_KEYS(KC_G, KC_C) { + SEND_STRING("git commit -m ''"); + send_keystrokes(KC_LEFT, KC_NO); + } + SEQ_THREE_KEYS(KC_G, KC_C, KC_A) { + SEND_STRING("git commit --amend"); + } + + SEQ_TWO_KEYS(KC_C, KC_C) { + SEND_STRING("const_cast<>"); + send_keystrokes(KC_LEFT, KC_NO); + } + SEQ_TWO_KEYS(KC_C, KC_D) { + SEND_STRING("dynamic_cast<>"); + send_keystrokes(KC_LEFT, KC_NO); + } + SEQ_TWO_KEYS(KC_C, KC_R) { + SEND_STRING("reinterpret_cast<>"); + send_keystrokes(KC_LEFT, KC_NO); + } + SEQ_TWO_KEYS(KC_C, KC_S) { + SEND_STRING("static_cast<>"); + send_keystrokes(KC_LEFT, KC_NO); + } + + SEQ_ONE_KEY(KC_SLSH) { + send_keystrokes(KC_SLSH, NK_DOWN, KC_LSFT, KC_8, KC_8, NK_UP, KC_LSFT, KC_ENT, + NK_DOWN, KC_LSFT, KC_8, NK_UP, KC_LSFT, KC_ENT, + NK_DOWN, KC_LSFT, KC_8, NK_UP, KC_LSFT, KC_SLSH, KC_UP, KC_END, KC_SPC, + KC_NO); + } + } +} diff --git a/keyboards/ergodox/keymaps/albert/readme.md b/keyboards/ergodox/keymaps/albert/readme.md new file mode 100644 index 00000000..e20e047a --- /dev/null +++ b/keyboards/ergodox/keymaps/albert/readme.md @@ -0,0 +1,188 @@ +# ErgoDox EZ Configuration for typing like a boss. + +This layout has 7 layers: +0. Base layers +1. Symbols and F-keys +2. Number pad (with hexadecimal) +3. Cursor keys +4. Mouse movement and clicks +5. Keyword macros +6. Emacs + +There are also some leader keys defined for frequently used commands (git etc). + +## The layers + +Double hashes (`##`) indicate transparent keys (`KC_TRNS`) and blanks indicate no key (`KC_NO`). + +### 0. Base layer + +``` +,--------------------------------------------------. ,--------------------------------------------------. +| ESC | 1 | 2 | 3 | 4 | 5 | SfLt | | SfRt | 6 | 7 | 8 | 9 | 0 | BkSp | +|--------|------|------|------|------|-------------| |------|------|------|------|------|------|--------| +| Tab | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | Del | +|--------|------|------|------|------|------| | | |------|------|------|------|------|--------| +| Caps/L2| A | S | D | F | G |------| |------| H | J | K | L | ; |Enter/L2| +|--------|------|------|------|------|------| L6 | | L6 |------|------|------|------|------|--------| +| LSft/( | Z | X | C | V/L3 | B/L4 | | | | N/L4 | M/L3 | , | . | / | RSft/) | +`--------|------|------|------|------|-------------' `-------------|------|------|------|------|--------' + |Ctrl/[| Alt/]| # | Left |Right | | Up | Down | - | Alt/[|Ctrl/]| + `----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | L2 | lead | | lead | Ins | + ,------|------|------| |------|------|------. + | Space| BkSp | Home | | PgUp | Enter|Space | + | / | / |------| |------| / | / | + | Ctrl | Alt |End/L5| |PDn/L5| Alt | Ctrl | + `--------------------' `--------------------' +``` + +Space Cadet shift is enabled. Ctrl and Alt doubles up as normal keys when tapped. +SfLt and SfRt sends Shift + left and Shift + Right respectively - for use with emacs with `windmove-default-keybindings`. +Caps and Enter may be held down to activate layer 2 (hexadecimal number pad). +Please see `matrix_scan_user` function in `keymap.c` for list of commands available via `lead` key. + +### 1. Symbols and F-keys + +``` +,--------------------------------------------------. ,--------------------------------------------------. +| ## | F1 | F2 | F3 | F4 | F5 | ## | | ## | F6 | F7 | F8 | F9 | F10 | F11 | +|--------|------|------|------|------|------|------| |------|------|------|------|------|------|--------| +| ## | ! | " | £ | $ | % | ## | | ## | - | + | = | @ | ~ | F12 | +|--------|------|------|------|------|------| | | |------|------|------|------|------|--------| +| ## | ^ | & | * | _ | # |------| |------| { | } | ; | ' | # | ## | +|--------|------|------|------|------|------| ## | | ## |------|------|------|------|------|--------| +| ## | \ | | | ` | - | / | | | | [ | ] | < | > | ? | ## | +`--------|------|------|------|------|-------------' `-------------|------|------|------|------|--------' + | ## | ## | ## | ## | ## | | ## | ## | ## | ## | ## | + `----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | ## | ## | | ## | ## | + ,------|------|------| |------|------|------. + | | | ## | | ## | | | + | ## | ## |------| |------| ## | ## | + | | | ## | | ## | | | + `--------------------' `--------------------' +``` + +### 2. Number pad (with hexadecimal) + +``` +,---------------------------------------------------. ,--------------------------------------------------. +| ## | A | B | C | D | E | F | | A | B | C | D | E | F | ## | +|---------|------|------|------|------|------|------| |------|------|------|------|------|------|--------| +| ## | * | 7 | 8 | 9 | * | 0x | | 0x | * | 7 | 8 | 9 | * | ## | +|---------|------|------|------|------|------| | | |------|------|------|------|------|--------| +| ## | / | 4 | 5 | 6 | / |------| |------| / | 4 | 5 | 6 | / | ## | +|---------|------|------|------|------|------| ## | | ## |------|------|------|------|------|--------| +| ## | - | 1 | 2 | 3 | - | | | | - | 1 | 2 | 3 | - | ## | +`---------|------|------|------|------|-------------' `-------------|------|------|------|------|--------' + | = | + | 0 | , | . | | 0 | , | . | + | = | + `-----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | ## | ## | | ## | ## | + ,------|------|------| |------|------|------. + | | | ## | | ## | | | + | ## | ## |------| |------| ## | ## | + | | | ## | | ## | | | + `--------------------' `--------------------' +``` + +### 3. Cursor keys + +``` +,---------------------------------------------------. ,--------------------------------------------------. +| | | | | | | | | | | | | | | | +|---------|------|------|------|------|------|------| |------|------|------|------|------|------|--------| +| | Home | | Up | | PgUp | | | | PgUp | | Up | | Home | | +|---------|------|------|------|------|------| | | |------|------|------|------|------|--------| +| | End | Left | Down | Right| PgDn |------| |------| PgDn | Left | Down | Right| End | | +|---------|------|------|------|------|------| | | |------|------|------|------|------|--------| +| ## | Up | | Down | ## | | | | | | ## | Down | | Up | ## | +`---------|------|------|------|------|-------------' `-------------|------|------|------|------|--------' + | Left | Down | Right| | | | | | Left | Down | Right| + `-----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | | | | | | + ,------|------|------| |------|------|------. + | | | | | | | | + | ## | ## |------| |------| ## | ## | + | | | | | | | | + `--------------------' `--------------------' +``` + +### 4. Mouse movement and clicks + +``` +,--------------------------------------------------. ,--------------------------------------------------. +| | | | | | | | | | | | | | | | +|--------|------|------|------|------|-------------| |------|------|------|------|------|------|--------| +| | | Lclk | MsUp | Rclk | | | | | | Lclk | MsUp | Rclk | | | +|--------|------|------|------|------|------| | | |------|------|------|------|------|--------| +| | |MsLeft|MsDown|MsRght| |------| |------| |MsLeft|MsDown|MsRght| | | +|--------|------|------|------|------|------| | | |------|------|------|------|------|--------| +| Lclk | MsUp | Rclk |MsDown| | ## | | | | ## | |MsDown| Lclk | MsUp | Rclk | +`--------|------|------|------|------|-------------' `-------------|------|------|------|------|--------' + |MsLeft|MsDown|MsRight | | | | |MsLeft|MsDown|MsRght| + `----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | | | | | | + ,------|------|------| |------|------|------. + | | | | | | | | + | | |------| |------| | | + | | | | | | | | + `--------------------' `--------------------' +``` + +### 5. Keyword macros + +``` +,---------------------------------------------------. ,--------------------------------------------------. +| | | | scarf| sadf | smily| | | | decaf| | | | | | +|---------|------|------|------|------|------|------| |------|------|------|------|------|------|--------| +| | const| volat| oper | ret | tmpl | | | | typen| cont | prv | pro | pub | | +|---------|------|------|------|------|------| | | |------|------|------|------|------|--------| +| | | str | obj | | gitl |------| |------| | | | nulp | | | +|---------|------|------|------|------|------| | | |------|------|------|------|------|--------| +| | | extr | cls | virt | break| | | |namesp| goodm| goodn| | | | +`---------|------|------|------|------|-------------' `-------------|------|------|------|------|--------' + | | | inc | | | | | | | | | + `-----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | | | | ecet | ecets| + ,------|------|------| |------|------|------. + | | | | | | | | + | | |------| |------| | | + | | | ## | | ## | | | + `--------------------' `--------------------' +``` +Please see `keymap.c` for the keywords/commands. +Some are const, volatile, operator, return, template, typename, continue, private, +protected, public, struct, class, extern, virtual, break, namespace. +Also a git log command I use a lot (`git log --oneline --graph --decorate=short` (I know git can be configured but that is boring)). + +### 6. Emacs + +``` +,---------------------------------------------------. ,--------------------------------------------------. +| | | | | | | empb | | emnb | emfs | emfb | | | | | +|---------|------|------|------|------|------|------| |------|------|------|------|------|------|--------| +| | emtr | | | | | | | | emun | emre | w-up | | | | +|---------|------|------|------|------|------| | | |------|------|------|------|------|--------| +| | | emwr | | | |------| |------| |w-left|w-down|w-rght| | | +|---------|------|------|------|------|------| ## | | ## |------|------|------|------|------|--------| +| | | | | | | | | | | |w-down| | | | +`---------|------|------|------|------|-------------' `-------------|------|------|------|------|--------' + | | | | | | | | | | | | + `-----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | | | | | | + ,------|------|------| |------|------|------. + | | | | | | | | + | | |------| |------| | | + | | | | | | | | + `--------------------' `--------------------' +``` +Some emacs shortcuts like toggle read/write mode (emtr), write file (emwr), previous-buffer (empb), +next-buffer (emnb), smaller font(emfs), larger font (emfb), undo (emun), redo (emre) and switching between windows in a frame. diff --git a/keyboards/ergodox/keymaps/algernon/NEWS.md b/keyboards/ergodox/keymaps/algernon/NEWS.md index e1199899..ee9d6067 100644 --- a/keyboards/ergodox/keymaps/algernon/NEWS.md +++ b/keyboards/ergodox/keymaps/algernon/NEWS.md @@ -1,5 +1,19 @@ +## v1.10 + +*2016-12-28* + +### Miscellaneous + +* `µ` can now be entered with UCIS. +* `â„¢` can now be entered with UCIS. + +### Tools + +* `tools/hid-commands` can now find Banshee, and prefers it over Kodi. +* `tools/hid-commands` can now find Chrome too, not juts Chromium. + ## v1.9 *2016-10-16* diff --git a/keyboards/ergodox/keymaps/algernon/keymap.c b/keyboards/ergodox/keymaps/algernon/keymap.c index bad24033..b615f3f5 100644 --- a/keyboards/ergodox/keymaps/algernon/keymap.c +++ b/keyboards/ergodox/keymaps/algernon/keymap.c @@ -96,8 +96,6 @@ enum { uint16_t gui_timer = 0; -uint16_t kf_timers[12]; - #if KEYLOGGER_ENABLE # ifdef AUTOLOG_ENABLE bool log_enable = true; @@ -786,7 +784,7 @@ static void ang_tap_dance_tmux_pane_select (qk_tap_dance_state_t *state, void *u if (state->count >= 2) { kc = KC_Z; } - + register_code(KC_LALT); register_code(KC_SPC); unregister_code(KC_SPC); @@ -1040,7 +1038,9 @@ const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE UCIS_SYM("heart", 0x2764), UCIS_SYM("bolt", 0x26a1), UCIS_SYM("pi", 0x03c0), - UCIS_SYM("mouse", 0x1f401) + UCIS_SYM("mouse", 0x1f401), + UCIS_SYM("micro", 0x00b5), + UCIS_SYM("tm", 0x2122) ); bool process_record_user (uint16_t keycode, keyrecord_t *record) { diff --git a/keyboards/ergodox/keymaps/algernon/readme.md b/keyboards/ergodox/keymaps/algernon/readme.md index 015bd7cd..3783eadf 100644 --- a/keyboards/ergodox/keymaps/algernon/readme.md +++ b/keyboards/ergodox/keymaps/algernon/readme.md @@ -121,10 +121,10 @@ There is a very small tool in `tools/layer-notify`, that listens to the HID cons To make my workflow easier, this layout is maintained in [its own repository][algernon:ez-layout]. To build it, you will need the [QMK][qmk] firmware checked out, and this repo either checked out to something like `keyboards/ergodox_ez/algernon-master`. One way to achieve that is this: [algernon:ez-layout]: https://github.com/algernon/ergodox-layout - [qmk]: https://github.com/jackhumbert/qmk_firmware + [qmk]: https://github.com/qmk/qmk_firmware ``` -$ git clone https://github.com/jackhumbert/qmk_firmware.git +$ git clone https://github.com/qmk/qmk_firmware.git $ cd qmk_firmware $ git clone https://github.com/algernon/ergodox-layout.git \ keyboards/ergodox/keymaps/algernon-master diff --git a/keyboards/ergodox/keymaps/algernon/tools/hid-commands b/keyboards/ergodox/keymaps/algernon/tools/hid-commands index a29d38f4..54ca7556 100755 --- a/keyboards/ergodox/keymaps/algernon/tools/hid-commands +++ b/keyboards/ergodox/keymaps/algernon/tools/hid-commands @@ -16,7 +16,8 @@ _cmd_appsel () { } cmd_appsel_music () { - wmctrl -x -a rhythmbox || wmctrl -x -a spotify || wmctrl -x -a kodi || true + wmctrl -x -a rhythmbox || wmctrl -x -a spotify || \ + wmctrl -x -a banshee || wmctrl -x -a kodi || true xdotool key Escape } @@ -33,7 +34,7 @@ cmd_appsel_term () { } cmd_appsel_chrome () { - _cmd_appsel chromium + _cmd_appsel chrom } cmd_appsel_start () { diff --git a/keyboards/ergodox/keymaps/bepo/Makefile b/keyboards/ergodox/keymaps/bepo/Makefile new file mode 100644 index 00000000..b673c5ce --- /dev/null +++ b/keyboards/ergodox/keymaps/bepo/Makefile @@ -0,0 +1,9 @@ +# Having a file like this allows you to override Makefile definitions +# for your own particular keymap + +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +COMMAND_ENABLE = no # Commands for debug and configuration + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/ergodox/keymaps/bepo/bepo.png b/keyboards/ergodox/keymaps/bepo/bepo.png index 3df7aa60..54992f5a 100644 Binary files a/keyboards/ergodox/keymaps/bepo/bepo.png and b/keyboards/ergodox/keymaps/bepo/bepo.png differ diff --git a/keyboards/ergodox/keymaps/bepo/keymap.c b/keyboards/ergodox/keymaps/bepo/keymap.c index 2d88fc10..05250ee6 100644 --- a/keyboards/ergodox/keymaps/bepo/keymap.c +++ b/keyboards/ergodox/keymaps/bepo/keymap.c @@ -1,21 +1,23 @@ #include "ergodox.h" -#include "debug.h" -#include "action_layer.h" #include "keymap_bepo.h" +#include "keymap_french.h" -#define BASE 0 // default layer -#define QWER 1 // qwerty compat layer -#define SQWER 2 // shifted qwerty compat layer -#define AQWER 3 // alted qwerty compat layer -#define FNAV 4 // function / navigation keys -#define NUM 5 // numeric keypad keys -#define MSE 6 // mouse keys +// keymaps +#define BEPO 0 // default layer, for bepo compatible systems +#define QW_B 1 // bepo to qwerty base compat layer, for qwerty systems +#define QW_A 2 // bepo with altgr key to qwerty compat layer +#define QW_S 3 // bepo with shift key to qwerty compat layer +#define AZ_B 4 // bepo to azerty base compat layer, for azerty systems +#define AZ_A 5 // bepo with altgr key to azerty compat layer +#define AZ_S 6 // bepo with shift key to azerty compat layer +#define FNAV 7 // function / navigation / mouse layer +#define NUMK 8 // numeric keypad layer -#define KP_00 0 -#define CA_Fx 1 +// macros +#define KP_00 0 // keypad "double 0" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Keymap 0: Base layer +/* Keymap 0: default layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | $ | " | < | > | ( | ) |Delete| |ScroLo| @ | + | - | / | * | = | @@ -26,22 +28,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------| * | E_CIRC |A_GRAV| Y | X | . | K | | | | ' | Q | G | H | F | C_CEDIL| * `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------' - * |QWERTY| |LSuper| LCtrl| LAlt| |Escape| L_Mse| | |Insert| | AltGr| RCtrl|RSuper|PrntSc| Pause| + * |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause| * `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------' - * | | | L_Num| | CA_Fx| | | + * | | |L_NumK| |L_NumK| | | * | Space|LShift|------| |------|RShift|Enter | * | | |L_FNav| |L_FNav| | | * `--------------------' `--------------------' */ -[BASE] = KEYMAP( +[BEPO] = KEYMAP( // Left hand BP_DOLLAR, BP_DQOT, BP_LGIL, BP_RGIL, BP_LPRN, BP_RPRN, KC_DEL, BP_PERCENT, BP_B, BP_E_ACUTE, BP_P, BP_O, BP_E_GRAVE, KC_BSPC, BP_W, BP_A, BP_U, BP_I, BP_E, BP_COMMA, BP_ECRC, BP_A_GRAVE, BP_Y, BP_X, BP_DOT, BP_K, KC_TAB, -TG(QWER), KC_NO, KC_LGUI, KC_LCTL, KC_LALT, - KC_ESC, MO(MSE), - MO(NUM), +KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT, + DF(BEPO), DF(QW_B), + MO(NUMK), KC_SPC, KC_LSHIFT, MO(FNAV), // Right hand KC_SLCK, BP_AT, BP_PLUS, BP_MINUS, BP_SLASH, BP_ASTR, BP_EQUAL, @@ -49,10 +51,10 @@ TG(QWER), KC_NO, KC_LGUI, KC_LCTL, KC_LALT, BP_C, BP_T, BP_S, BP_R, BP_N, BP_M, KC_NUMLOCK, BP_APOS, BP_Q, BP_G, BP_H, BP_F, BP_CCED, BP_ALGR, KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE, -KC_NO, KC_INS, -M(CA_Fx), +DF(AZ_B), DF(BEPO), +MO(NUMK), MO(FNAV), KC_RSHIFT, KC_ENTER), -/* Keymap 1: QWERTY system compatibility layer +/* Keymap 1: bepo to qwerty base compat layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | $ | " | < | > | ( | ) |Delete| |ScroLo| @ | + | - | / | * | = | @@ -63,33 +65,70 @@ MO(FNAV), KC_RSHIFT, KC_ENTER), * |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------| * | e | a | y | x | . | k | | | | ' | q | g | h | f | c | * `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------' - * | BEPO | |LSuper| LCtrl| LAlt| |Escape| L_Mse| | |Insert| | AltGr| RCtrl|RSuper|PrntSc| Pause| + * |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause| * `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------' - * | | | L_Num| | | | | + * | | |L_NumK| |L_NumK| | | * | Space|LShift|------| |------|RShift|Enter | * | | |L_FNav| |L_FNav| | | * `--------------------' `--------------------' */ -[QWER] = KEYMAP( +[QW_B] = KEYMAP( // Left hand KC_DOLLAR, S(KC_QUOT), S(KC_COMM), S(KC_DOT), KC_LPRN, KC_RPRN, KC_DEL, KC_PERCENT, KC_B, KC_E, KC_P, KC_O, KC_E, KC_BSPC, KC_W, KC_A, KC_U, KC_I, KC_E, KC_COMMA, KC_E, KC_A, KC_Y, KC_X, KC_DOT, KC_K, KC_TAB, -KC_TRNS, KC_NO, KC_LGUI, KC_LCTL, KC_LALT, - KC_ESC, MO(MSE), - MO(NUM), - KC_SPC, MO(SQWER), MO(FNAV), +KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_SPC, MO(QW_S), KC_TRNS, // Right hand KC_SLCK, KC_AT, KC_PLUS, KC_MINUS, KC_SLASH, KC_ASTR, KC_EQUAL, KC_CAPSLOCK, KC_CIRC, KC_V, KC_D, KC_L, KC_J, KC_Z, KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, KC_NUMLOCK, KC_QUOT, KC_Q, KC_G, KC_H, KC_F, KC_C, - MO(AQWER), KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE, -KC_NO, KC_INS, + MO(QW_A), KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE, +KC_TRNS, KC_TRNS, +KC_TRNS, +KC_TRNS, MO(QW_S), KC_ENTER), +/* Keymap 2: bepo with altgr key to qwerty compat layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | $ | " | < | > | [ | ] |Delete| |ScroLo| @ | + | - | / | * | = | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | % | | | e | & | o | e |Backsp| |CapsLo| ^ | v | d | l | j | z | + * |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------| + * | w | a | u | i | € | , |------| |------| c | t | s | r | n | m | + * |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------| + * | e | \ | { | } | . | ~ | | | | ' | q | g | h | f | c | + * `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------' + * |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause| + * `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------' + * | | |L_NumK| |L_NumK| | | + * | _ |LShift|------| |------|RShift|Enter | + * | | |L_FNav| |L_FNav| | | + * `--------------------' `--------------------' + */ +[QW_A] = KEYMAP( +// Left hand +KC_DOLLAR, S(KC_QUOT), S(KC_COMM), S(KC_DOT), KC_LBRC, KC_RBRC, KC_DEL, +KC_PERCENT, KC_PIPE, KC_E, KC_AMPR, KC_O, KC_E, KC_BSPC, +KC_W, KC_A, KC_U, KC_I, RALT(KC_5), KC_COMMA, +KC_E, KC_BSLASH, KC_LCBR, KC_RCBR, KC_DOT, KC_TILDE, KC_TAB, +KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_UNDS, MO(QW_S), KC_TRNS, +// Right hand + KC_SLCK, KC_AT, KC_PLUS, KC_MINUS, KC_SLASH, KC_ASTR, KC_EQUAL, + KC_CAPSLOCK, KC_CIRC, KC_V, KC_D, KC_L, KC_J, KC_Z, + KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, + KC_NUMLOCK, KC_QUOT, KC_Q, KC_G, KC_H, KC_F, KC_C, + KC_TRNS, KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE, +KC_TRNS, KC_TRNS, KC_TRNS, -MO(FNAV), MO(SQWER), KC_ENTER), -/* Keymap 2: QWERTY shifted system compatibility layer +KC_TRNS, MO(QW_S), KC_ENTER), +/* Keymap 3: bepo with shift key to qwerty compat layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | # | 1 | 2 | 3 | 4 | 5 |Delete| |ScroLo| 6 | 7 | 8 | 9 | 0 | = | @@ -100,20 +139,20 @@ MO(FNAV), MO(SQWER), KC_ENTER), * |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------| * | E | A | Y | X | : | K | | | | ? | Q | G | H | F | C | * `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------' - * | BEPO | |LSuper| LCtrl| LAlt| |Escape| L_Mse| | |Insert| | AltGr| RCtrl|RSuper|PrntSc| Pause| + * |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause| * `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------' - * | | | L_Num| | | | | + * | | |L_NumK| |L_NumK| | | * | Space|LShift|------| |------|RShift|Enter | * | | |L_FNav| |L_FNav| | | * `--------------------' `--------------------' */ -[SQWER] = KEYMAP( +[QW_S] = KEYMAP( // Left hand KC_HASH, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_GRV, S(KC_B), S(KC_E), S(KC_P), S(KC_O), S(KC_E), KC_TRNS, S(KC_W), S(KC_A), S(KC_U), S(KC_I), S(KC_E), KC_SCOLON, S(KC_E), S(KC_A), S(KC_Y), S(KC_X), KC_COLON, S(KC_K), S(KC_TAB), -KC_TRNS, KC_TRNS, S(KC_LGUI), S(KC_LCTL), S(KC_LALT), +S(KC_ESC), S(KC_INS), S(KC_LGUI), S(KC_LCTL), S(KC_LALT), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -126,51 +165,125 @@ KC_TRNS, KC_TRNS, S(KC_LGUI), S(KC_LCTL), S(KC_LALT), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), -/* Keymap 3: QWERTY alted system compatibility layer +/* Keymap 4: bepo to azerty base compat layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | $ | " | < | > | ( | ) |Delete| |ScroLo| @ | + | - | / | * | = | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | % | b |e_acut| p | o |e_grav|Backsp| |CapsLo| ^ | v | d | l | j | z | + * |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------| + * | w | a | u | i | e | , |------| |------| c | t | s | r | n | m | + * |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------| + * | e |a_grav| y | x | . | k | | | | ' | q | g | h | f | c_cedil| + * `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------' + * |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause| + * `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------' + * | | |L_NumK| |L_NumK| | | + * | Space|LShift|------| |------|RShift|Enter | + * | | |L_FNav| |L_FNav| | | + * `--------------------' `--------------------' + */ +[AZ_B] = KEYMAP( +// Left hand +FR_DLR, FR_QUOT, FR_LESS, FR_GRTR, FR_LPRN, FR_RPRN, KC_DEL, +FR_PERC, KC_B, FR_EACU, KC_P, KC_O, FR_EGRV, KC_BSPC, +FR_W, FR_A, KC_U, KC_I, KC_E, FR_COMM, +KC_E, FR_AGRV, KC_Y, KC_X, FR_DOT, KC_K, KC_TAB, +KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_SPC, MO(AZ_S), KC_TRNS, +// Right hand + KC_SLCK, FR_AT, FR_PLUS, FR_MINS, FR_SLSH, FR_ASTR, FR_EQL, + KC_CAPSLOCK, KC_LBRC, KC_V, KC_D, KC_L, KC_J, FR_Z, + KC_C, KC_T, KC_S, KC_R, KC_N, FR_M, + KC_NUMLOCK, FR_APOS, FR_Q, KC_G, KC_H, KC_F, FR_CCED, + MO(AZ_A), KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE, +KC_TRNS, KC_TRNS, +KC_TRNS, +KC_TRNS, MO(AZ_S), KC_ENTER), +/* Keymap 5: bepo with altgr key to azerty compat layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | $ | " | < | > | [ | ] |Delete| |ScroLo| @ | + | - | / | * | = | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | % | | | e | & | o | e |Backsp| |CapsLo| ^ | v | d | l | j | z | * |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------| - * | w | a | u | i | € | , |------| |------| c | t | s | r | n | m | + * | w | a |u_grav| trem | € | , |------| |------| c | t | s | r | n | m | * |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------| - * | e | \ | { | } | . | ~ | | | | ' | q | g | h | f | c | + * | / | \ | { | } | . | ~ | | | | ' | q | g | h | f | c | * `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------' - * | BEPO | |LSuper| LCtrl| LAlt| |Escape| L_Mse| | |Insert| | AltGr| RCtrl|RSuper|PrntSc| Pause| + * |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause| * `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------' - * | | | L_Num| | | | | + * | | |L_NumK| |L_NumK| | | * | _ |LShift|------| |------|RShift|Enter | * | | |L_FNav| |L_FNav| | | * `--------------------' `--------------------' */ -[AQWER] = KEYMAP( +[AZ_A] = KEYMAP( // Left hand -KC_DOLLAR, S(KC_QUOT), S(KC_COMM), S(KC_DOT), KC_LBRC, KC_RBRC, KC_DEL, -KC_PERCENT, KC_PIPE, KC_E, KC_AMPR, KC_O, KC_E, KC_BSPC, -KC_W, KC_A, KC_U, KC_I, RALT(KC_5), KC_COMMA, -KC_E, KC_BSLASH, KC_LCBR, KC_RCBR, KC_DOT, KC_TILDE, KC_TAB, -KC_TRNS, KC_NO, KC_LGUI, KC_LCTL, KC_LALT, - KC_ESC, MO(MSE), - MO(NUM), - KC_UNDS, MO(SQWER), MO(FNAV), +FR_DLR, FR_QUOT, FR_LESS, FR_GRTR, FR_LBRC, FR_RBRC, KC_DEL, +FR_PERC, FR_PIPE, FR_EACU, FR_AMP, KC_O, FR_EGRV, KC_BSPC, +FR_W, FR_A, FR_UGRV, S(KC_LBRC), FR_EURO, FR_COMM, +FR_SLSH, FR_BSLS, FR_LCBR, FR_RCBR, FR_DOT, FR_TILD, KC_TAB, +KC_ESC, KC_INS, KC_LGUI, KC_LCTL, KC_LALT, + KC_TRNS, KC_TRNS, + KC_TRNS, + FR_UNDS, MO(AZ_S), KC_TRNS, // Right hand - KC_SLCK, KC_AT, KC_PLUS, KC_MINUS, KC_SLASH, KC_ASTR, KC_EQUAL, - KC_CAPSLOCK, KC_CIRC, KC_V, KC_D, KC_L, KC_J, KC_Z, - KC_C, KC_T, KC_S, KC_R, KC_N, KC_M, - KC_NUMLOCK, KC_QUOT, KC_Q, KC_G, KC_H, KC_F, KC_C, + KC_SLCK, FR_AT, FR_PLUS, FR_MINS, FR_SLSH, FR_ASTR, FR_EQL, + KC_CAPSLOCK, KC_LBRC, KC_V, KC_D, KC_L, KC_J, FR_Z, + KC_C, KC_T, KC_S, KC_R, KC_N, FR_M, + KC_NUMLOCK, FR_APOS, FR_Q, KC_G, KC_H, KC_F, FR_CCED, KC_TRNS, KC_RCTL, KC_RGUI, KC_PSCREEN, KC_PAUSE, -KC_NO, KC_INS, +KC_TRNS, KC_TRNS, KC_TRNS, -MO(FNAV), MO(SQWER), KC_ENTER), -/* Keymap 4: function / navigation layer +KC_TRNS, MO(AZ_S), KC_ENTER), +/* Keymap 6: bepo with shift key to azerty compat layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | # | 1 | 2 | 3 | 4 | 5 |Delete| |ScroLo| 6 | 7 | 8 | 9 | 0 | ° | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | ` | B | E | P | O | E |Backsp| |CapsLo| ! | V | D | L | J | Z | + * |--------+------+------+------+------+------| ace | | |------+------+------+------+------+--------| + * | W | A | U | I | E | ; |------| |------| C | T | S | R | N | M | + * |--------+------+------+------+------+------| Tab | | NumLo|------+------+------+------+------+--------| + * | E | A | Y | X | : | K | | | | ? | Q | G | H | F | C | + * `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------' + * |Escape|Insert|LSuper| LCtrl| LAlt| | BEPO |QWERTY| |AZERTY| BEPO | | AltGr| RCtrl|RSuper|PrntSc| Pause| + * `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------' + * | | |L_NumK| |L_NumK| | | + * | Space|LShift|------| |------|RShift|Enter | + * | | |L_FNav| |L_FNav| | | + * `--------------------' `--------------------' + */ +[AZ_S] = KEYMAP( +// Left hand +FR_HASH, FR_1, FR_2, FR_3, FR_4, FR_5, KC_TRNS, +FR_GRV, S(KC_B), S(KC_E), S(KC_P), S(KC_O), S(KC_E), KC_TRNS, +S(FR_W), S(FR_A), S(KC_U), S(KC_I), S(KC_E), FR_SCLN, +S(KC_E), S(FR_A), S(KC_Y), S(KC_X), FR_COLN, S(KC_K), S(KC_TAB), +S(KC_ESC), S(KC_INS), S(KC_LGUI), S(KC_LCTL), S(KC_LALT), + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, +// Right hand + KC_TRNS, FR_6, FR_7, FR_8, FR_9, FR_0, FR_OVRR, + KC_TRNS, FR_EXLM, S(KC_V), S(KC_D), S(KC_L), S(KC_J), S(FR_Z), + S(KC_C), S(KC_T), S(KC_S), S(KC_R), S(KC_N), S(FR_M), + KC_TRNS, FR_QUES, S(FR_Q), S(KC_G), S(KC_H), S(KC_F), S(KC_C), + S(KC_RALT), S(KC_RCTL), S(KC_RGUI), KC_TRNS, KC_TRNS, +KC_TRNS, KC_TRNS, +KC_TRNS, +KC_TRNS, KC_TRNS, KC_TRNS), +/* Keymap 7: function / navigation / mouse layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | | F1 | F2 | F3 | F4 | F5 |VolMut| | | F6 | F7 | F8 | F9 | F10 | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | |VolDwn| | | PgUp | Home | Up | End | F11 | | + * | | Next |LClick| Up |RClick| WhUp |VolDwn| | | PgUp | Home | Up | End | F11 | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| PgDn | Left | Down | Right| F12 | | + * | | Prev | Left | Down | Right|WhDown|------| |------| PgDn | Left | Down | Right| F12 | | * |--------+------+------+------+------+------| VolUp| | |------+------+------+------+------+--------| * | | Undo | Cut | Copy | Paste| | | | | | | | | | | * `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------' @@ -184,12 +297,12 @@ MO(FNAV), MO(SQWER), KC_ENTER), [FNAV] = KEYMAP( // Left hand KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MUTE, -KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_VOLU, -KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, +KC_NO, KC_MS_BTN5, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_MS_WH_UP, KC_VOLU, +KC_NO, KC_MS_BTN4, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN, KC_NO, KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, KC_NO, KC_VOLD, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, - KC_NO, KC_NO, - KC_NO, + KC_TRNS, KC_TRNS, + KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, // Right hand KC_NO, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NO, @@ -197,91 +310,52 @@ KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDOWN, KC_LEFT, KC_DOWN, KC_RIGHT, KC_F12, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, -KC_NO, KC_NO, +KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO), -/* Keymap 5: numeric layer, sends keypad codes +/* Keymap 8: numeric keypad layer, sends keypad codes * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | + | - | / | * | | + * | | | | | | | | | | | NumLo| / | * | - | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | | | | | | 7 | 8 | 9 | | | + * | | | | | | | | | | | 7 | 8 | 9 | + | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| | 4 | 5 | 6 | | | + * | | | | | | |------| |------| | 4 | 5 | 6 | + | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | 1 | 2 | 3 | | | + * | | | | | | | | | | | 1 | 2 | 3 | Enter| | * `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------' - * | | | | | | | | | | | | | 0 | 00 | . | | | - * `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------' - * | | | | | | | | - * | | |------| |------| | Enter| - * | | | | | | | | - * `--------------------' `--------------------' - */ -[NUM] = KEYMAP( -// Left hand -KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, -KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, -KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, -KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, -KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, - KC_NO, KC_NO, - KC_TRNS, - KC_NO, KC_TRNS, KC_NO, -// Right hand - KC_NO, KC_NO, KC_KP_PLUS, KC_KP_MINUS, KC_KP_SLASH, KC_KP_ASTERISK, KC_NO, - KC_NO, KC_NO, KC_KP_7, KC_KP_8, KC_KP_9, KC_NO, KC_NO, - KC_NO, KC_KP_4, KC_KP_5, KC_KP_6, KC_NO, KC_NO, - KC_NO, KC_NO, KC_KP_1, KC_KP_2, KC_KP_3, KC_NO, KC_NO, - KC_KP_0, M(KP_00), KC_KP_COMMA, KC_NO, KC_NO, -KC_NO, KC_NO, -KC_NO, -KC_NO, KC_TRNS, KC_KP_ENTER), -/* Keymap 6: mouse layer - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | | | | | |LClick| Up |RClick| WhUp | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| | Left | Down | Right|WhDown| | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | | | | | - * `--------+------+------+------+------+-------------,-------------. ,-------------`-------------+------+------+------+------+--------' - * | | | | | | | | | | | | | | | | | | + * | | | | | | | | | | | | | 0 | 00 | . | Enter| | * `----------------------------------' ,------|------|------| |------+------+------. `----------------------------------' * | | | | | | | | * | | |------| |------| | | * | | | | | | | | * `--------------------' `--------------------' */ -[MSE] = KEYMAP( +[NUMK] = KEYMAP( // Left hand KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, - KC_NO, KC_TRNS, - KC_NO, - KC_NO, KC_TRNS, KC_NO, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_NO, KC_TRNS, KC_TRNS, // Right hand - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_MS_WH_UP, KC_NO, - KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, -KC_NO, KC_NO, -KC_NO, -KC_NO, KC_TRNS, KC_NO) -}; - -const uint16_t PROGMEM fn_actions[] = { + KC_NO, KC_NO, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_NO, + KC_NO, KC_NO, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, KC_NO, + KC_NO, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_NO, + KC_NO, KC_NO, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_NO, + KC_KP_0, M(KP_00), KC_KP_COMMA, KC_KP_ENTER, KC_NO, +KC_TRNS, KC_TRNS, +KC_TRNS, +KC_TRNS, KC_TRNS, KC_NO) }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { switch(id) { + // keypad "double 0" case KP_00: if (record->event.pressed) { return MACRO( T(KP_0), D(KP_0), END ); @@ -289,23 +363,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO( U(KP_0), END ); } break; - case CA_Fx: - if (record->event.pressed) { - layer_on(FNAV); - return MACRO( D(LALT), D(LCTL), END ); - } else { - layer_off(FNAV); - return MACRO( U(LCTL), U(LALT), END ); - } - break; } return MACRO_NONE; }; - -// Runs just one time when the keyboard initializes. -void matrix_init_user(void) { -}; - -// Runs constantly in the background, in a loop. -void matrix_scan_user(void) { -}; diff --git a/keyboards/ergodox/keymaps/bepo/readme.md b/keyboards/ergodox/keymaps/bepo/readme.md index 4a18cd80..2959ac82 100644 --- a/keyboards/ergodox/keymaps/bepo/readme.md +++ b/keyboards/ergodox/keymaps/bepo/readme.md @@ -23,12 +23,12 @@ La touche "Tab" est placée comme sur la TypeMatrix 2020. Meilleure symétrie et accessibilité que la TypeMatrix 2030 : les touches "W" et "%" ont dû être déplacées du côté gauche en raison du nombre de touches de l'ErgoDox, mais l'auriculaire droit ne gère maintenant que deux colonnes de touches au lieu de trois. La touche "Ê" redevient accessible sur la même rangée que les autres lettres, comme sur un clavier classique en disposition bépo. Les lettres, chiffres et symboles sont tous regroupés sur 4 lignes et 6 colonnes pour chaque main, et la première rangée de lettres à la main gauche conserve une identité visuelle "BÉPO". -Touche de fonction permettant de saisir les touches F1 à F12, les touches F1 à F10 sont placées de façon logique par rapport aux chiffres 1 à 0. Cette même touche permet l'accès aux touches directionnelles sans déplacer la main droite. Les touches "Home" et "End" sont placées de la même façon que sur une TypeMatrix 2030 par rapport aux touches directionnelles. Les touches "Page Up" et "Page Down" sont également accessibles facilement sans déplacer la main droite. Les fonctions "VolUp" et "VolDown" sont placées comme sur la TypeMatrix 2030, avec la fonction "Mute" juste au dessus. Les fonctions "Undo", "Cut", "Copy" et "Paste" sont placées côte à côte comme elles le seraient sur un clavier QWERTY en combinaison avec la touche "Ctrl" (à l'emplacement des lettres "Z", "X", "C" et "V"). Par rapport au layout "SpaceFN", l'utilisation d'une touche de fonction dédiée au pouce permet de ne pas ajouter de latence, et la touche espace reste compatible avec les jeux (action au moment de l'appui et possibilité d'appui long). +Touche de fonction permettant de saisir les touches F1 à F12, les touches F1 à F10 sont placées de façon logique par rapport aux chiffres 1 à 0. Cette même touche permet l'accès aux touches directionnelles sans déplacer la main droite et d'effectuer des actions souris avec uniquement la main gauche. Les touches "Home" et "End" sont placées de la même façon que sur une TypeMatrix 2030 par rapport aux touches directionnelles. Les touches "Page Up" et "Page Down" sont également accessibles facilement sans déplacer la main droite. Les fonctions "VolUp" et "VolDown" sont placées comme sur la TypeMatrix 2030, avec la fonction "Mute" juste au dessus. Les fonctions "Undo", "Cut", "Copy" et "Paste" sont placées côte à côte comme elles le seraient sur un clavier QWERTY en combinaison avec la touche "Ctrl" (à l'emplacement des lettres "Z", "X", "C" et "V"). Par rapport au layout "SpaceFN", l'utilisation d'une touche de fonction dédiée au pouce permet de ne pas ajouter de latence, et la touche espace reste compatible avec les jeux (action au moment de l'appui et possibilité d'appui long). Touche de fonction permettant l'accès au pavé numérique comme sur la TypeMatrix 2030, mais sans avoir à déplacer la main droite : avec les doigts sur la rangée de repos, possibilité de saisir les chiffres "4", "5" et "6" comme sur un pavé numérique classique. Le double "0" de la TypeMatrix a été conservé, et gagne une possibilité de répétition en simples "0". -L'appui sur une touche permet de basculer en mode BEPO sur un système configuré pour un clavier QWERTY. Cette compatibilité n'est pas parfaite (pas encore de gestion des accents mais ça devrait être faisable avec une disposition en qwerty international, et les combinaisons de touches ne sont pas toutes supportées puisque le clavier traduit déjà certaines touches en combinaisons) mais reste pratique pour une saisie de texte occasionnelle. +Touche permettant de basculer en mode BEPO sur un système configuré pour un clavier QWERTY. Cette compatibilité n'est pas parfaite (pas encore de gestion des accents mais ça devrait être faisable avec une disposition en qwerty international, et les combinaisons de touches ne sont pas toutes supportées puisque le clavier traduit déjà certaines touches en combinaisons) mais reste pratique pour une saisie de texte occasionnelle et pour des accès BIOS ou console en QWERTY. -TODO : couche de compatibilité pour utiliser la disposition BÉPO sur un système configuré pour un clavier AZERTY. +Touche permettant de basculer en mode BEPO sur un système configuré pour un clavier AZERTY. Cette compatibilité n'est pas parfaite (pas de gestion des caractères non présents sur le clavier AZERTY, et les combinaisons de touches ne sont pas toutes supportées puisque le clavier traduit déjà certaines touches en combinaisons) mais reste pratique pour une saisie de texte occasionnelle et pour faire du bureau à distance vers un système Windows sans BEPO. > Olivier Smedts diff --git a/keyboards/ergodox/keymaps/bryan/keymap.c b/keyboards/ergodox/keymaps/bryan/keymap.c new file mode 100644 index 00000000..572cea8c --- /dev/null +++ b/keyboards/ergodox/keymaps/bryan/keymap.c @@ -0,0 +1,226 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + EPRM, + VRSN, + RGB_SLD +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------------. ,--------------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | Cmd,Shft,[ | | Cmd,Shft,] | 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------------| |------------+------+------+------+------+------+--------| + * | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * |BkSp/Cmd| A | S | D | F | G |------------| |------------| H | J | K | L |; / L2|' / Cmd | + * |--------+------+------+------+------+------| Hyper | | Meh |------+------+------+------+------+--------| + * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | + * `--------+------+------+------+------+-------------------' `-------------+------+------+------+------+--------' + * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * |Ctrl/Esc|PgUp| | App | LGui | + * ,------|------|------| |------+--------+------. + * | | | PgDn | | Home | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | Esc | | Alt | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, M(2), + KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), + GUI_T(KC_BSPC), KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, + CTL_T(KC_ESC),KC_PGUP, + KC_PGDN, + KC_SPC,KC_BSPC, KC_ESC, + // right hand + M(3), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT), + MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, + + ALT_T(KC_APP), KC_LGUI, + KC_HOME, + KC_LALT,KC_TAB, KC_ENT + ), +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | <- | 1 | 2 | 3 | \ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, + KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, + KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, M(1), KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +// KC_COMM, KC_MINS + +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MDIA] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + break; + case 1: + if (record->event.pressed) { // For resetting EEPROM + eeconfig_init(); + } + break; + } + return MACRO_NONE; +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + // dynamically generate these. + case EPRM: + if (record->event.pressed) { + eeconfig_init(); + } + return false; + break; + case VRSN: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + return false; + break; + case RGB_SLD: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode(1); + #endif + } + return false; + break; + } + return true; +} + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/coderkun_neo2/keymap.c b/keyboards/ergodox/keymaps/coderkun_neo2/keymap.c index b62b1444..aaf75d58 100644 --- a/keyboards/ergodox/keymaps/coderkun_neo2/keymap.c +++ b/keyboards/ergodox/keymaps/coderkun_neo2/keymap.c @@ -312,6 +312,8 @@ uint16_t hex_to_keycode(uint8_t hex) return NEO_E; case 0xF: return NEO_F; + default: + return KC_NO; } } } diff --git a/keyboards/ergodox/keymaps/colemak_programmer/Makefile b/keyboards/ergodox/keymaps/colemak_programmer/Makefile new file mode 100644 index 00000000..91b77c77 --- /dev/null +++ b/keyboards/ergodox/keymaps/colemak_programmer/Makefile @@ -0,0 +1 @@ +TAP_DANCE_ENABLE = no \ No newline at end of file diff --git a/keyboards/ergodox/keymaps/colemak_programmer/colemak_programmer_001.jpg b/keyboards/ergodox/keymaps/colemak_programmer/colemak_programmer_001.jpg new file mode 100644 index 00000000..de24d937 Binary files /dev/null and b/keyboards/ergodox/keymaps/colemak_programmer/colemak_programmer_001.jpg differ diff --git a/keyboards/ergodox/keymaps/colemak_programmer/colemak_programmer_002.jpg b/keyboards/ergodox/keymaps/colemak_programmer/colemak_programmer_002.jpg new file mode 100644 index 00000000..15f8ec8c Binary files /dev/null and b/keyboards/ergodox/keymaps/colemak_programmer/colemak_programmer_002.jpg differ diff --git a/keyboards/ergodox/keymaps/colemak_programmer/keymap.c b/keyboards/ergodox/keymaps/colemak_programmer/keymap.c new file mode 100644 index 00000000..1caccc5c --- /dev/null +++ b/keyboards/ergodox/keymaps/colemak_programmer/keymap.c @@ -0,0 +1,256 @@ +#include "ergodox.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * MEH: Alt+Control+Shift + * HYPER: Alt+Control+Shift+Gui + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ` ~ | 1 ! | 2 @ | 3 # | 4 $ | 5 % | 6 ^ | | 7 & | 8 * | 9 ( | 0 ) | - _ | = + | Backsp | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | TAB | Q | W | F | P | G |TG(3) | |TG(4) | J | L | U | Y | ; : | ' " | + * |--------+------+------+------+------+------|F-lck | |N-lck |------+------+------+------+------+--------| + * | CAPS | A | R | S | T | D |------| |------| H | N | E | I | O | ENT | + * |--------+------+------+------+------+------| MEH | | MEH |------+------+------+------+------+--------| + * | Shift | Z | X | C | V | B | | | | K | M | , < | . > | UP | Shift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LCTL | LCTL | LGUI | LALT | LGUI | | RALT | RCTL | LEFT | DOWN | RIGHT| + * `----------------------------------' `----------------------------------' + * ,--------------. ,--------------. + * | Esc | App | | Ins | Del | + * ,------|------|-------| |------+-------+------. + * | | | Home | | PgUp | | | + * | MO(2)| MO(4)|-------| |------| Space |Space | + * |symbol|N-Lock| End | | PgDn | | | + * `---------------------' `---------------------' + */ +[0] = KEYMAP( // layer 0 : default + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, TG(3), + KC_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MEH, + KC_LCTL, KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI, + + KC_ESC, KC_APP, + KC_HOME, + MO(2), MO(4), KC_END, + + // right hand + KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + TG(4), KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_QUOT, + KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT, + KC_MEH, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSFT, + KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT, + + KC_INS, KC_DEL, + KC_PGUP, + KC_PGDN, KC_SPC, KC_SPC + ), + +/* Keymap 1: QWERTY layer (games) + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | Q | W | E | R | T | | | | Y | U | I | O | P | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | A | S | D | F | G |------| |------| H | J | K | L | ; | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | Z | X | C | V | B | | | | N | M | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+--------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `----------------------' + */ +[1] = KEYMAP( // layer 1: QWERTY layer (games) + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRNS, + KC_TRNS, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TRNS, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_TRNS, + KC_TRNS, KC_N, KC_M, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS + ), + +/* Keymap 2: Symbol Layer +* +* ,--------------------------------------------------. ,--------------------------------------------------. +* | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | +* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| +* | | | | + | < | % | # | DF(1)| | | & | [ | ] | \ | : | " | +* |--------+------+------+------+------+------|QWERTY| | |------+------+------+------+------+--------| +* | | ! | - | > | = | @ |------| |------| * | { | } | / | ? | | +* |--------+------+------+------+------+------| DF(0)| | |------+------+------+------+------+--------| +* | | NUBS | NUHS | / | $ | ^ |COLEMAK | | | | ( | ) | | | | +* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' +* | | | | | | | | | | | | +* `----------------------------------' `----------------------------------' +* ,-------------. ,-------------. +* | | | | | | +* ,------|------|------| |------+------+------. +* | | | | | | | | +* | | |------| |------| | | +* | | | | | | | | +* `--------------------' `--------------------' +*/ +// SYMBOLS +[2] = KEYMAP( + // left hand + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + KC_TRNS, KC_PIPE, KC_PLUS, KC_LT, KC_PERC, KC_HASH, DF(1), + KC_LBRC, KC_EXCLAIM, KC_MINUS, KC_GT, KC_EQUAL, KC_AT, + KC_TRNS, KC_NUBS, KC_NUHS, KC_SLSH, KC_DOLLAR, KC_CIRC, DF(0), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + + // right hand + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, + KC_TRNS, KC_AMPERSAND, KC_LBRC, KC_RBRC, KC_BSLS, KC_COLN, KC_DQT, + KC_ASTERISK, KC_LCBR, KC_RCBR, KC_SLSH, KC_QUES, KC_TRNS, + KC_TRNS, KC_PIPE, KC_LPRN, KC_RPRN, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + +/* Keymap 3: + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | HYPR | | HYPR | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------ |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// F-keys +[3] = KEYMAP( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HYPR, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + + // right hand + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_HYPR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 4: Numlock + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | RESET | | | |P-SCRE|S-LOCK|PAUSE | |NLOCK | CALC | = | / | * | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | Vol+ | 7 | 8 | 9 | - | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |------| |------| Vol- | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | HYPR | | HYPR | Mute | 1 | 2 | 3 |Enter | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | 0 | . | RCTL | RCTL | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------ |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[4] = KEYMAP( + RESET, KC_LSFT, KC_LSFT, KC_SYSREQ, KC_PSCR, KC_SLCK, KC_PAUSE, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HYPR, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + + // right hand + KC_NLCK, KC_CALC, KC_PEQL, KC_PSLS, KC_PAST, KC_LSFT, KC_TRNS, + KC_TRNS, KC_VOLU, KC_P7, KC_P8, KC_P9, KC_PMNS, KC_TRNS, + KC_VOLD, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, + KC_HYPR, KC_MUTE, KC_P1, KC_P2, KC_P3, KC_PENT, KC_TRNS, + KC_TRNS, KC_P0, KC_PDOT, KC_RCTL, KC_RCTL, + + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + +}; + + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + static uint8_t state; + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + + //reduce LED on time to 1/6th because LEDs are too strong + if (++state < 6) return; + state = 0; + + //bit 1: default layer 1 - QWERTY + if (default_layer_state & (1UL << 1)) ergodox_right_led_1_on(); + + uint8_t layer = biton32(layer_state); + + //layer 2 : Symbols (& Fs) + //if (layer == 2) ergodox_right_led_2_on(); + + //layer 3 : F-lock + if (layer == 3) ergodox_right_led_2_on(); + + //layer 4 : Num-lock + if (layer == 4) ergodox_right_led_3_on(); +}; diff --git a/keyboards/ergodox/keymaps/colemak_programmer/readme.md b/keyboards/ergodox/keymaps/colemak_programmer/readme.md new file mode 100644 index 00000000..db0cc577 --- /dev/null +++ b/keyboards/ergodox/keymaps/colemak_programmer/readme.md @@ -0,0 +1,23 @@ +# ErgoDox EZ colemak_programmer + +## Features + +* Qwerty and colemak 2 in 1 + * Use DF() macro to swap the bottom layer so it behaves literally as collemak or qwerty + * Graphical creator did not allow this so I had to use TO(0) and TO(1) on the picture +* Symbol layer programmers friendly + * Not only symbols are easy to access but common combination are easy too: ->, =>, !=, etc. +* Windows and Mac + * The extra repeated Win key is very handy on Mac +* Numlock + +I came to this layout after several iterations. It is not the ultimate best ergonomic layout but it is the best if you switch back and forth between ergodox and laptops. + +## Notes +* The Quote and Enter can be swapped +* If you use sculpted key caps try turning the bottom key 180 degrees so it became very comfortable to type with thumb. + +Alternatively view the [graphical creator version](http://configure.ergodox-ez.com/keyboard_layouts/kmevwm/edit) but beware it is not the same due to the creator limitations. + +![Default](colemak_programmer_001.jpg) +![Default](colemak_programmer_002.jpg) \ No newline at end of file diff --git a/keyboards/ergodox/keymaps/common-nighthawk/Makefile b/keyboards/ergodox/keymaps/common-nighthawk/Makefile new file mode 100644 index 00000000..fafa40c4 --- /dev/null +++ b/keyboards/ergodox/keymaps/common-nighthawk/Makefile @@ -0,0 +1,6 @@ +SUBPROJECT_DEFAULT = ez +TAP_DANCE_ENABLE = yes + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/ergodox/keymaps/common-nighthawk/keymap.c b/keyboards/ergodox/keymaps/common-nighthawk/keymap.c new file mode 100644 index 00000000..debf384f --- /dev/null +++ b/keyboards/ergodox/keymaps/common-nighthawk/keymap.c @@ -0,0 +1,216 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys + +//Tap Dance Declarations +enum { + TD_U_LBRC = 0, + TD_I_RBRC, +}; + +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_U_LBRC] = ACTION_TAP_DANCE_DOUBLE(KC_U, KC_LBRC), + [TD_I_RBRC] = ACTION_TAP_DANCE_DOUBLE(KC_I, KC_RBRC) +}; + +//Macro Declarations +static uint16_t sunds_timer; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | _ | x | x | _ | Esc | Hypr | Home | | End | Hypr | [ | ] | `~ | `~ | Bks | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * |Ctrl/Tab| Q | W | E | R | T | Up | | PgUp | Y | U | I | O | P | Ctrl | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | Cmd/"' | A | S | D | F | G |------| |------| H | J | K | L | ;: |Cmd/Entr| + * |--------+------+------+------+------+------| Down | | PgDn |------+------+------+------+------+--------| + * | Shft | Z | X | C | V | B | | | | N | M | ,< | .> | /? | Shft | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | Alt | x | x | x | Left | |Right | Bks | x | x | Alt | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * |Teensy| VolUp| | Play | Del | + * ,------|------|------| |------+--------+------. + * | | | VolDn| | Next | | | + * |Sp/~L1| L2 |------| |------| L2 |'"/~L1| + * | | | Mute | | Prev | | | + * `--------------------' `----------------------' + */ +[BASE] = KEYMAP( // layer 0 : default + // left hand + KC_UNDS, KC_1, KC_1, KC_UNDS, KC_ESC, ALL_T(KC_NO), KC_HOME, + CTL_T(KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_UP, + M(1), KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_DOWN, + KC_LALT, KC_1, KC_1, KC_1, KC_LEFT, + RESET, KC_VOLU, + KC_VOLD, + LT(SYMB, KC_SPC), TG(MDIA), KC_MUTE, + // right hand + KC_END, ALL_T(KC_NO), KC_LBRC, KC_RBRC, KC_GRV, KC_GRV, KC_BSPC, + KC_PGUP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LCTRL, + KC_H, KC_J, KC_K, KC_L, KC_SCOLON, GUI_T(KC_ENT), + KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_RGHT, KC_BSPC, KC_1, KC_1, KC_RALT, + KC_MPLY, KC_DEL, + KC_MNXT, + KC_MPRV, TG(MDIA), LT(SYMB, KC_QUOT) + ), +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | ^ | [ | ( | { | | | | = | 7 | 8 | 9 | 0 | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | & | $ | ] | ) | } |------| |------| + | 4 | 5 | 6 | * | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | \ | @ | # | % | | | | | | - | 1 | 2 | 3 | / | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | 0 | 0 | . | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS, KC_EXLM, KC_CIRC, KC_LBRC, KC_LPRN, KC_LCBR, KC_TRNS, + KC_TRNS, KC_AMPR, KC_DLR, KC_RBRC, KC_RPRN, KC_RCBR, + KC_TRNS, KC_BSLS, KC_AT, KC_HASH, KC_PERC, KC_PIPE, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS, KC_EQL, KC_7, KC_8, KC_9, KC_0, KC_TRNS, + KC_PLUS, KC_4, KC_5, KC_6, KC_ASTR, KC_TRNS, + KC_TRNS, KC_MINS, KC_1, KC_2, KC_3, KC_TRNS, KC_TRNS, + KC_0, KC_0, KC_DOT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * |Version | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | | WhDn | WhUp | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | R-Ck | L-Ck | |------| |------| MsLt | MsDn | MsUp | MsRt | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MDIA] = KEYMAP( + M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN2, KC_BTN1, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_WH_U, KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, + KC_MS_LEFT, KC_MS_DOWN, KC_MS_UP, KC_MS_RIGHT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + break; + + case 1: + if (record->event.pressed) { + sunds_timer = timer_read(); + register_code (KC_LGUI); + } else { + if (timer_elapsed (sunds_timer) < TAPPING_TERM) { + unregister_code (KC_LGUI); + register_code (KC_LSFT); + register_code (KC_QUOT); + unregister_code (KC_QUOT); + unregister_code (KC_LSFT); + register_code (KC_LGUI); + } + unregister_code (KC_LGUI); + } + break; + + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_3_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + if (keyboard_report->mods & MOD_BIT(KC_LSFT)) { + ergodox_right_led_1_on (); + } +}; diff --git a/keyboards/ergodox/keymaps/deadcyclo/Makefile b/keyboards/ergodox/keymaps/deadcyclo/Makefile new file mode 100644 index 00000000..039f07c8 --- /dev/null +++ b/keyboards/ergodox/keymaps/deadcyclo/Makefile @@ -0,0 +1 @@ +UNICODE_ENABLE = yes diff --git a/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-base-layout.png b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-base-layout.png new file mode 100644 index 00000000..273a4977 Binary files /dev/null and b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-base-layout.png differ diff --git a/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-1-symbols.png b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-1-symbols.png new file mode 100644 index 00000000..5adb7ac7 Binary files /dev/null and b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-1-symbols.png differ diff --git a/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-2-media-and-mouse.png b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-2-media-and-mouse.png new file mode 100644 index 00000000..5930e38a Binary files /dev/null and b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-2-media-and-mouse.png differ diff --git a/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-3-unicode.png b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-3-unicode.png new file mode 100644 index 00000000..0c6473ab Binary files /dev/null and b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-3-unicode.png differ diff --git a/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-4-unicode-2.png b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-4-unicode-2.png new file mode 100644 index 00000000..4488e1b3 Binary files /dev/null and b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-4-unicode-2.png differ diff --git a/keyboards/ergodox/keymaps/deadcyclo/keymap.c b/keyboards/ergodox/keymaps/deadcyclo/keymap.c new file mode 100644 index 00000000..243ce94e --- /dev/null +++ b/keyboards/ergodox/keymaps/deadcyclo/keymap.c @@ -0,0 +1,563 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys and navigation +#define UNI 3 // unicode 1 +#define UNI2 4 // unicode 2 + +enum macros { + RUN +}; + +enum function_ids { + EMOJI, + EMOJI2, + EPRM, + VRSN, + RGB_SLD, + GO_GROUP +}; + +/* opt can only be 0-15 */ +enum emojis { + SHRUG, + YAY, + HUG, + SMILE, + SMILE2, + HMM1, + HMM2, + BEAR1, + BEAR2, + FUU, + EGGY1, + EGGY2, + FACE1, + FACE2, + UHU, + SMRK1 +}; + +enum emojis2 { + SMRK2, + LOVE +}; + +enum progmem_ids { + EMOJI_SHRUG, + EMOJI_YAY, + EMOJI_HUG, + EMOJI_SMILE, + EMOJI_SMILE2, + EMOJI_HMM1, + EMOJI_HMM2, + EMOJI_BEAR1, + EMOJI_BEAR2, + EMOJI_FUU, + EMOJI_EGGY1, + EMOJI_EGGY2, + EMOJI_FACE1, + EMOJI_FACE2, + EMOJI_UHU, + EMOJI_SMRK1, + EMOJI_SMRK2, + EMOJI_LOVE, + F_EPRM, + F_VRSN, + F_RGB_SLD, + I3_GO_GROUP_10, + I3_GO_GROUP_1, + I3_GO_GROUP_2, + I3_GO_GROUP_3, + I3_GO_GROUP_4, + I3_GO_GROUP_5, + I3_GO_GROUP_6, + I3_GO_GROUP_7, + I3_GO_GROUP_8, + I3_GO_GROUP_9, +}; + +// TODO: Finish the macros for i3 (Macros should potentially be own function instead to make things easier? some of them at least, f. ex. the ones that use 1-0 keys so we can have a single switch) + +// TODO: Do stuff with hyper and meh keys +// TODO: Add macros for lots of stuff. (Lastpass cli, pushbullet cli, other push service cli, linode cli, more?) +// TODO: Make macros for gnu screen and i3wm +// TODO: Need to change hotkeys for lastpass, and potentially make my own keys for them on one of my layers +// TODO: Look into using tap dance +// TODO: Use leader key for stuff. See https://github.com/qmk/qmk_firmware/wiki +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | Esc/L3 | 1 | 2 | 3 | 4 | 5 | 6 | | 6 | 7 | 8 | 9 | 0 | - | =/L3 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab/L1 | Q | W | E | R | T | L1 | | L2 | Y | U | I | O | P | \/L1 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | LCtrl | A | S | D | F | G |------| |------| H | J | K | L | ; | ctrl/'| + * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| + * | LShift |Z / L4|X / L2| C | V | B | | | | N | M | , |. / L2|/ / L4| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |Grv/L1| UNI |AltShf| Lalt | Ralt | | Lalt | Ralt | LEAD | UNI | ~/L1 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | App | Home | | PgUp | Ins | + * ,------|------|------| |------+--------+------. + * | | | End | | PgDn | | | + * | Space| TAB |------| |------| BSPC |Enter | + * | | | [ | | ] | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + LT(UNI,KC_ESC), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, + LT(SYMB,KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, LT(4, KC_Z), LT(MDIA, KC_X), KC_C, KC_V, KC_B, ALL_T(KC_NO), + LT(SYMB,KC_GRV),LCTL(LSFT(KC_U)), LALT(KC_LSFT), KC_RALT,KC_LALT, + ALT_T(KC_APP), KC_HOME, + KC_END, + KC_SPC,KC_TAB,KC_LBRC, + // right hand + KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, LT(UNI,KC_EQL), + TG(MDIA), KC_Y, KC_U, KC_I, KC_O, KC_P, LT(SYMB, KC_BSLS), + KC_H, KC_J, KC_K, KC_L, KC_SCLN,CTL_T(KC_QUOT), + MEH_T(KC_NO),KC_N, KC_M, KC_COMM,LT(MDIA, KC_DOT), LT(UNI2, KC_SLSH), KC_RSFT, + KC_LALT, KC_RALT,KC_LEAD,LCTL(LSFT(KC_U)), LT(SYMB,KC_TILD), + KC_PGUP, KC_INS, + KC_PGDN, + KC_RBRC,KC_BSPC, KC_ENT + ), +/* Keymap 1: Symbol Layer LCTL(LSFT(KC_U)) + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * |Toggle|Animat| | Hue+ | Hue- | + * ,------|------|------| |------+------+------. + * |Bright|Bright|Solid | | | | | + * |ness- |ness+ |------| |------| DEL | | + * | | | | | EPRM | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, + KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, + KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + RGB_TOG,RGB_MOD, + F(F_RGB_SLD), + RGB_VAD,RGB_VAI,KC_TRNS, + // right hand + KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_TRNS, + KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, + RGB_HUD, RGB_HUI, + KC_TRNS, + F(F_EPRM), KC_DEL, KC_TRNS +), +/* Keymap 2: Media, mouse and navigation + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | gg(1)| gg(2)| gg(3)| gg(4)| gg(5)| gg(6)| | gg(6)| gg(7)| gg(8)| gg(9)| gg(0)| | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | RUN | | | | | | | Up | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | Left | Down | Right| | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | Prev | Next | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA , MOUSE and NAVIGATION +[MDIA] = KEYMAP( + KC_TRNS, F(I3_GO_GROUP_1), F(I3_GO_GROUP_2), F(I3_GO_GROUP_3), F(I3_GO_GROUP_4), F(I3_GO_GROUP_5), F(I3_GO_GROUP_6), +KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, M(RUN), KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + F(I3_GO_GROUP_6), F(I3_GO_GROUP_7), F(I3_GO_GROUP_8), F(I3_GO_GROUP_9), F(I3_GO_GROUP_10), KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), + +/* Keymap 3: Unicode + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | ┌ | â” | â”” | ┘ | │ | ─ | | â•” | â•— | â•š | â• | â•‘ | â• | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | shrug| yay | hug | smile|smile2| | | | â–  | λ | → | âž™ | â–» | â–ˆ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | hmm1 | hmm2 | bear1| bear2| fuu |------| |------| ☺ | ☻ | ☹ | ♡ | ♥ | â–‘ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | eggy1| eggy2| face1| face2| uhu | | | | ⤠| ☠| ☑ | ☒ | ✓ | â–„ | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | smrk1| smrk2| love | VER | | ✔ | ✗ | ✘ | â— | â–€ | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | â–’ | â–“ | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// Unicode +[UNI] = KEYMAP( + KC_TRNS, UC(0x250c), UC(0x2510), UC(0x2514), UC(0x2518), UC(0x2502), UC(0x2500), + KC_TRNS, F(EMOJI_SHRUG), F(EMOJI_YAY), F(EMOJI_HUG), F(EMOJI_SMILE), F(EMOJI_SMILE2), KC_TRNS, + KC_TRNS, F(EMOJI_HMM1), F(EMOJI_HMM2), F(EMOJI_BEAR1), F(EMOJI_BEAR2), F(EMOJI_FUU), + KC_TRNS, F(EMOJI_EGGY1), F(EMOJI_EGGY2), F(EMOJI_FACE1), F(EMOJI_FACE2), F(EMOJI_UHU), KC_TRNS, + KC_TRNS, F(EMOJI_SMRK1), F(EMOJI_SMRK2), F(EMOJI_LOVE), F(F_VRSN), + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + UC(0x2554), UC(0x2557), UC(0x255a), UC(0x255d), UC(0x2551), UC(0x2550), KC_TRNS, + KC_TRNS, UC(0x25a0), UC(0x03bb), UC(0x2192), UC(0x2799), UC(0x25bb), UC(0x2588), + UC(0x263a), UC(0x263b), UC(0x2639), UC(0x2661), UC(0x2665), UC(0x2591), + KC_TRNS, UC(0x2764), UC(0x2610), UC(0x2611), UC(0x2612), UC(0x2713), UC(0x2584), + UC(0x2714), UC(0x2717), UC(0x2718), UC(0x25cf), UC(0x2580), + UC(0x2592), UC(0x2593), + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + +/* Keymap 4: Unicode 2 + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | ¹ | ² | ³ | â´ | âµ | ⶠ| | ⶠ| â· | ⸠| â¹ | â° | ℃ | â„¢ | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | â‚ | â‚‚ | ₃ | â‚„ | â‚… | ₆ | | ₆ | ₇ | ₈ | ₉ | â‚€ | â„ | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | â…ž | â… | â…œ | â…› | â…š |------| |------| â…“ | â…’ | â…‘ | â… | ¾ | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | â…— | â…– | â…• | â…” | | ¼ | â…™ | â…˜ | ½ | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// Unicode 2 +[UNI2] = KEYMAP( + KC_TRNS, UC(0x00b9), UC(0x00b2), UC(0x00b3), UC(0x2074), UC(0x2075), UC(0x2076), + KC_TRNS, UC(0x2081), UC(0x2082), UC(0x2083), UC(0x2084), UC(0x2085), UC(0x2086), + KC_TRNS, UC(0x215e), UC(0x215d), UC(0x215c), UC(0x215b), UC(0x215a), + KC_TRNS, KC_TRNS, KC_TRNS, UC(0x2157), UC(0x2156), UC(0x2155), UC(0x2154), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + UC(0x2076), UC(0x2077), UC(0x2078), UC(0x2079), UC(0x2070), UC(0x2103), UC(0x2122), + UC(0x2086), UC(0x2087), UC(0x2088), UC(0x2089), UC(0x2080), UC(0x2044), KC_TRNS, + UC(0x2153), UC(0x2152), UC(0x2151), UC(0x2150), UC(0x00be), KC_TRNS, + UC(0x00bc), UC(0x2159), UC(0x2158), UC(0x00bd), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [EMOJI_SHRUG] = ACTION_FUNCTION_OPT(EMOJI, SHRUG), + [EMOJI_YAY] = ACTION_FUNCTION_OPT(EMOJI, YAY), + [EMOJI_HUG] = ACTION_FUNCTION_OPT(EMOJI,HUG), + [EMOJI_SMILE] = ACTION_FUNCTION_OPT(EMOJI,SMILE), + [EMOJI_SMILE2] = ACTION_FUNCTION_OPT(EMOJI,SMILE2), + [EMOJI_HMM1] = ACTION_FUNCTION_OPT(EMOJI,HMM1), + [EMOJI_HMM2] = ACTION_FUNCTION_OPT(EMOJI,HMM2), + [EMOJI_BEAR1] = ACTION_FUNCTION_OPT(EMOJI,BEAR1), + [EMOJI_BEAR2] = ACTION_FUNCTION_OPT(EMOJI,BEAR2), + [EMOJI_FUU] = ACTION_FUNCTION_OPT(EMOJI,FUU), + [EMOJI_EGGY1] = ACTION_FUNCTION_OPT(EMOJI,EGGY1), + [EMOJI_EGGY2] = ACTION_FUNCTION_OPT(EMOJI,EGGY2), + [EMOJI_FACE1] = ACTION_FUNCTION_OPT(EMOJI,FACE1), + [EMOJI_FACE2] = ACTION_FUNCTION_OPT(EMOJI,FACE2), + [EMOJI_UHU] = ACTION_FUNCTION_OPT(EMOJI,UHU), + [EMOJI_SMRK1] = ACTION_FUNCTION_OPT(EMOJI,SMRK1), + [EMOJI_SMRK2] = ACTION_FUNCTION_OPT(EMOJI2,SMRK2), + [EMOJI_LOVE] = ACTION_FUNCTION_OPT(EMOJI2,LOVE), + [F_EPRM] = ACTION_FUNCTION(EPRM), + [F_VRSN] = ACTION_FUNCTION(VRSN), + [F_RGB_SLD] = ACTION_FUNCTION(RGB_SLD), + [I3_GO_GROUP_10]= ACTION_FUNCTION_OPT(GO_GROUP,0), + [I3_GO_GROUP_1] = ACTION_FUNCTION_OPT(GO_GROUP,1), + [I3_GO_GROUP_2] = ACTION_FUNCTION_OPT(GO_GROUP,2), + [I3_GO_GROUP_3] = ACTION_FUNCTION_OPT(GO_GROUP,3), + [I3_GO_GROUP_4] = ACTION_FUNCTION_OPT(GO_GROUP,4), + [I3_GO_GROUP_5] = ACTION_FUNCTION_OPT(GO_GROUP,5), + [I3_GO_GROUP_6] = ACTION_FUNCTION_OPT(GO_GROUP,6), + [I3_GO_GROUP_7] = ACTION_FUNCTION_OPT(GO_GROUP,7), + [I3_GO_GROUP_8] = ACTION_FUNCTION_OPT(GO_GROUP,8), + [I3_GO_GROUP_9] = ACTION_FUNCTION_OPT(GO_GROUP,9), +}; + +#define TAP_ONCE(code) \ + register_code (code); \ + unregister_code (code) + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + if (record->event.pressed) { + switch(id) { + case EPRM: + eeconfig_init(); + break; + case VRSN: + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + break; + case RGB_SLD: +#ifdef RGBLIGHT_ENABLE + rgblight_mode(1); +#endif + break; + case GO_GROUP: + register_code(KC_LCTL); TAP_ONCE(KC_I); unregister_code(KC_LCTL); + TAP_ONCE(KC_G); + if (opt == 0) { + TAP_ONCE(39); + } else { + TAP_ONCE(29+opt); + } + break; + case EMOJI: + switch(opt) { + case SHRUG: + unicode_input_start(); register_hex(0xaf); unicode_input_finish(); + TAP_ONCE (KC_BSLS); + register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT); + unicode_input_start (); register_hex(0x30c4); unicode_input_finish(); + register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT); + TAP_ONCE (KC_SLSH); + unicode_input_start (); register_hex(0xaf); unicode_input_finish(); + break; + case YAY: + SEND_STRING ("\\o/"); + break; + case HUG: + unicode_input_start(); register_hex(0x0f3c); unicode_input_finish(); + TAP_ONCE (KC_SPC); + unicode_input_start(); register_hex(0x3064); unicode_input_finish(); + TAP_ONCE (KC_SPC); + unicode_input_start(); register_hex(0x25d5); unicode_input_finish(); + unicode_input_start(); register_hex(0x005f); unicode_input_finish(); + unicode_input_start(); register_hex(0x25d5); unicode_input_finish(); + TAP_ONCE (KC_SPC); + unicode_input_start(); register_hex(0x0f3d); unicode_input_finish(); + unicode_input_start(); register_hex(0x3064); unicode_input_finish(); + break; + case SMILE: + unicode_input_start(); register_hex(0x0298); unicode_input_finish(); + unicode_input_start(); register_hex(0x203f); unicode_input_finish(); + unicode_input_start(); register_hex(0x0298); unicode_input_finish(); + break; + case SMILE2: + unicode_input_start(); register_hex(0x0028); unicode_input_finish(); + unicode_input_start(); register_hex(0x0298); unicode_input_finish(); + unicode_input_start(); register_hex(0x203f); unicode_input_finish(); + unicode_input_start(); register_hex(0x0298); unicode_input_finish(); + unicode_input_start(); register_hex(0x0029); unicode_input_finish(); + break; + case HMM1: + unicode_input_start(); register_hex(0x0ca0); unicode_input_finish(); + unicode_input_start(); register_hex(0x005f); unicode_input_finish(); + unicode_input_start(); register_hex(0x0ca0); unicode_input_finish(); + break; + case HMM2: + unicode_input_start(); register_hex(0x0028); unicode_input_finish(); + unicode_input_start(); register_hex(0x0ca0); unicode_input_finish(); + unicode_input_start(); register_hex(0x005f); unicode_input_finish(); + unicode_input_start(); register_hex(0x0ca0); unicode_input_finish(); + unicode_input_start(); register_hex(0x0029); unicode_input_finish(); + break; + case BEAR1: + unicode_input_start(); register_hex(0x0295); unicode_input_finish(); + unicode_input_start(); register_hex(0x2022); unicode_input_finish(); + unicode_input_start(); register_hex(0x1d25); unicode_input_finish(); + unicode_input_start(); register_hex(0x2022); unicode_input_finish(); + unicode_input_start(); register_hex(0x0294); unicode_input_finish(); + break; + case BEAR2: + unicode_input_start(); register_hex(0x0028); unicode_input_finish(); + unicode_input_start(); register_hex(0x1d54); unicode_input_finish(); + unicode_input_start(); register_hex(0x1d25); unicode_input_finish(); + unicode_input_start(); register_hex(0x1d54); unicode_input_finish(); + unicode_input_start(); register_hex(0x0029); unicode_input_finish(); + break; + case FUU: + unicode_input_start(); register_hex(0x256d); unicode_input_finish(); + unicode_input_start(); register_hex(0x2229); unicode_input_finish(); + unicode_input_start(); register_hex(0x256e); unicode_input_finish(); + unicode_input_start(); register_hex(0x0028); unicode_input_finish(); + unicode_input_start(); register_hex(0x002d); unicode_input_finish(); + unicode_input_start(); register_hex(0x005f); unicode_input_finish(); + unicode_input_start(); register_hex(0x002d); unicode_input_finish(); + unicode_input_start(); register_hex(0x0029); unicode_input_finish(); + unicode_input_start(); register_hex(0x256d); unicode_input_finish(); + unicode_input_start(); register_hex(0x2229); unicode_input_finish(); + unicode_input_start(); register_hex(0x256e); unicode_input_finish(); + break; + case EGGY1: + unicode_input_start(); register_hex(0x0028); unicode_input_finish(); + unicode_input_start(); register_hex(0x256f); unicode_input_finish(); + unicode_input_start(); register_hex(0x00b0); unicode_input_finish(); + unicode_input_start(); register_hex(0x25a1); unicode_input_finish(); + unicode_input_start(); register_hex(0x00b0); unicode_input_finish(); + unicode_input_start(); register_hex(0xff09); unicode_input_finish(); + unicode_input_start(); register_hex(0x256f); unicode_input_finish(); + break; + case EGGY2: + unicode_input_start(); register_hex(0x30ce); unicode_input_finish(); + unicode_input_start(); register_hex(0x0028); unicode_input_finish(); + unicode_input_start(); register_hex(0x0020); unicode_input_finish(); + unicode_input_start(); register_hex(0x309c); unicode_input_finish(); + unicode_input_start(); register_hex(0x002d); unicode_input_finish(); + unicode_input_start(); register_hex(0x309c); unicode_input_finish(); + unicode_input_start(); register_hex(0x30ce); unicode_input_finish(); + unicode_input_start(); register_hex(0x0029); unicode_input_finish(); + break; + case FACE1: + unicode_input_start(); register_hex(0x0028); unicode_input_finish(); + unicode_input_start(); register_hex(0x002d); unicode_input_finish(); + unicode_input_start(); register_hex(0x005f); unicode_input_finish(); + unicode_input_start(); register_hex(0x002d); unicode_input_finish(); + unicode_input_start(); register_hex(0x0029); unicode_input_finish(); + break; + case FACE2: + unicode_input_start(); register_hex(0x0028); unicode_input_finish(); + unicode_input_start(); register_hex(0x2022); unicode_input_finish(); + unicode_input_start(); register_hex(0x005f); unicode_input_finish(); + unicode_input_start(); register_hex(0x2022); unicode_input_finish(); + unicode_input_start(); register_hex(0x0029); unicode_input_finish(); + break; + case UHU: + unicode_input_start(); register_hex(0x2299); unicode_input_finish(); + unicode_input_start(); register_hex(0xfe4f); unicode_input_finish(); + unicode_input_start(); register_hex(0x2299); unicode_input_finish(); + break; + case SMRK1: + unicode_input_start(); register_hex(0x005e); unicode_input_finish(); + unicode_input_start(); register_hex(0x032e); unicode_input_finish(); + unicode_input_start(); register_hex(0x005e); unicode_input_finish(); + break; + } + break; + case EMOJI2: + switch(opt) { + case SMRK2: + unicode_input_start(); register_hex(0x0028); unicode_input_finish(); + unicode_input_start(); register_hex(0x005e); unicode_input_finish(); + unicode_input_start(); register_hex(0x032e); unicode_input_finish(); + unicode_input_start(); register_hex(0x005e); unicode_input_finish(); + unicode_input_start(); register_hex(0x0029); unicode_input_finish(); + break; + case LOVE: + unicode_input_start(); register_hex(0x2665); unicode_input_finish(); + unicode_input_start(); register_hex(0x203f); unicode_input_finish(); + unicode_input_start(); register_hex(0x2665); unicode_input_finish(); + break; + } + break; + } + } +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + if (record->event.pressed) { + switch(id) { + case RUN: + return MACRO( D(LCTL), T(I), U(LCTL), T(R), END ); + break; + } + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case 1: + ergodox_right_led_1_on(); + #ifdef RGBLIGHT_ENABLE + rgblight_setrgb(0xff,0x00,0x00); + #endif + break; + case 2: + ergodox_right_led_2_on(); + #ifdef RGBLIGHT_ENABLE + rgblight_setrgb(0x00,0xff,0x00); + #endif + break; + case 3: + ergodox_right_led_3_on(); + #ifdef RGBLIGHT_ENABLE + rgblight_setrgb(0x00,0x00,0xff); + #endif + break; + case 4: + ergodox_right_led_1_on(); + ergodox_right_led_3_on(); + #ifdef RGBLIGHT_ENABLE + rgblight_setrgb(0xff,0x00,0xff); + #endif + break; + default: + // none + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/deadcyclo/readme.md b/keyboards/ergodox/keymaps/deadcyclo/readme.md new file mode 100644 index 00000000..c839f99c --- /dev/null +++ b/keyboards/ergodox/keymaps/deadcyclo/readme.md @@ -0,0 +1,79 @@ +# ErgoDox EZ 1337 configuration + +Custom layout based on the default layout. Intended for interational +users of us intl-altgr layout. Note that some common keys might be +missing, as this layout is intented to be used on *nix systems by +users familiar with their system. The layout is geared towards +avoiding using the rat (mouse for those of you who are unfamiliar with +tiling window managers) as much as possibly. + +# Layouts + +All layer images created using [keyboard-layout-editor](http://www.keyboard-layout-editor.com/) + +## Base layer + +[![Base layer](images/deadcyclo-base-layout.png)](http://www.keyboard-layout-editor.com/#/gists/0321b18620180a3e46c498206eb65366) + +The base layer here is marked with the us international alt-gr layout, +including characters bound to what on an iso keyboard would be alt-gr +and on an ansi keyboard right alt. + +Regular (and irregular) modifier keys are marked with a yellowish +gray. Layer moderators are marked with blue, red and green, which are +the same colors each layer displays on the LEDs when active. + +All of the layer switch keys, except for the two center keys marked L1 +TOG, are dual purpose. Hence for example the top left key produces ESC +if tapped, and temporarilly toggles L3 when hold down. The two center +L1 TOG keys toggle L1 on and off for more permanent layer toggling. + +The UNI keys enter the linux ibus unicode composer mode +(ie. Ctrl+Shift+u). Use this to enter unicode characters. Hit the key, +type in the unicode hex value, and hit enter. + +## Layer 1 - Symbols and RGB + +[![Layer 1 - Symbols and RGB](images/deadcyclo-layer-1-symbols.png)](http://www.keyboard-layout-editor.com/#/gists/96714e198054c9115bafb5267cc6bc73) + +The Symbols and RGB layer contains function keys, commonly used +symbols, a numpad and if you have the new Ergodox Ez shine keys for +controlling various RGB-led functions. In addition, it provides an up +and a down key for easy scrolling. RGB controller keys are yellow. + +## Layer 2 - Media, Mouse and Navigation + +[![Layer 2 - Media, Mouse and Navigation](images/deadcyclo-layer-2-media-and-mouse.png)](http://www.keyboard-layout-editor.com/#/gists/824759486e378bcec30784309a7e5731) + +The Media, Mouse and unicode layer contains special keys for moving +the mouse and clicking on it with the keyboard. In addition it +provides standard media control keys, and default arrow keys. + +## Layer 3 - Unicode + +[![Layer 3 - Unicode](images/deadcyclo-layer-3-unicode.png)](http://www.keyboard-layout-editor.com/#/gists/67d9613dcd873c68693d11863d0fd289) + +The unicode layer provides keys for directly typing unicode (utf-8) + +## Layer 4 - Unicode 2 + +[![Layer 43 - Unicode](images/deadcyclo-layer-4-unicode-2.png)](http://www.keyboard-layout-editor.com/#/gists/7b2241110ab8311d9668a0798f3baf4a) + +The unicode 2 layer provides keys for directly typing unicode (utf-8) + +# Changelog + +- 02.01.2017 Added delete key on second layer +- 10.01.2017 Added layer images to readme +- 24.01.2017 Added support for Ergodox Shine. Added secondary L2 switch key on left hand +- 24.01.2017 Added unicode keys. Added shrug hug and yay. Moved Navigation to layer 2 +- 25.01.2017 Added lots of new emojis and some unicode keys +- 27.01.2017 Added new unicode keys and shortcut for ibus unicode composer key (CTRL+SHIFT+U) +- 11.03.2017 Added additional unicode layer. Moved some layer switch keys to more sane locations + +# TODO + +- Add macros for lots of stuff. (Lastpass cli, pushbullet cli, other push service cli, linode cli, more?) +- Make macros for gnu screen and i3wm +- Look into the app launch macros in algernon keymap + diff --git a/keyboards/ergodox/keymaps/default/default_firmware_v1.2-2.png b/keyboards/ergodox/keymaps/default/default_firmware_v1.2-2.png new file mode 100644 index 00000000..e3c321cc Binary files /dev/null and b/keyboards/ergodox/keymaps/default/default_firmware_v1.2-2.png differ diff --git a/keyboards/ergodox/keymaps/default/keymap.c b/keyboards/ergodox/keymaps/default/keymap.c index 2f399bd1..4477cab3 100644 --- a/keyboards/ergodox/keymaps/default/keymap.c +++ b/keyboards/ergodox/keymaps/default/keymap.c @@ -7,7 +7,12 @@ #define SYMB 1 // symbols #define MDIA 2 // media keys -#define EPRM M(1) // Macro 1: Reset EEPROM +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + EPRM, + VRSN, + RGB_SLD +}; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 0: Basic layer @@ -44,56 +49,56 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_HOME, KC_SPC,KC_BSPC,KC_END, // right hand - KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, - KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT), - MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, - KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, + KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT), + MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, KC_LALT, CTL_T(KC_ESC), KC_PGUP, KC_PGDN,KC_TAB, KC_ENT ), /* Keymap 1: Symbol Layer * - * ,--------------------------------------------------. ,--------------------------------------------------. - * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | EPRM | | | | | | | . | 0 | = | | - * `----------------------------------' `----------------------------------' + * ,---------------------------------------------------. ,--------------------------------------------------. + * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | EPRM | | | | | | | . | 0 | = | | + * `-----------------------------------' `----------------------------------' * ,-------------. ,-------------. - * | | | | | | + * |Animat| | |Toggle|Solid | * ,------|------|------| |------+------+------. - * | | | | | | | | - * | | |------| |------| | | + * |Bright|Bright| | | |Hue- |Hue+ | + * |ness- |ness+ |------| |------| | | * | | | | | | | | * `--------------------' `--------------------' */ // SYMBOLS [SYMB] = KEYMAP( // left hand - M(0), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, EPRM,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - KC_TRNS,KC_TRNS, + RGB_MOD,KC_TRNS, KC_TRNS, - KC_TRNS,KC_TRNS,KC_TRNS, + RGB_VAD,RGB_VAI,KC_TRNS, // right hand KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, - KC_TRNS, KC_TRNS, + RGB_TOG, RGB_SLD, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS + KC_TRNS, RGB_HUD, RGB_HUI ), /* Keymap 2: Media and mouse keys * @@ -160,6 +165,33 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO_NONE; }; +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + // dynamically generate these. + case EPRM: + if (record->event.pressed) { + eeconfig_init(); + } + return false; + break; + case VRSN: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + return false; + break; + case RGB_SLD: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode(1); + #endif + } + return false; + break; + } + return true; +} + // Runs just one time when the keyboard initializes. void matrix_init_user(void) { diff --git a/keyboards/ergodox/keymaps/default/readme.md b/keyboards/ergodox/keymaps/default/readme.md index f68138ed..979ce0f5 100644 --- a/keyboards/ergodox/keymaps/default/readme.md +++ b/keyboards/ergodox/keymaps/default/readme.md @@ -2,6 +2,9 @@ ## Changelog +* Dec 2016: + * Added LED keys + * Refreshed layout graphic, comes from http://configure.ergodox-ez.com now. * Sep 22, 2016: * Created a new key in layer 1 (bottom-corner key) that resets the EEPROM. * Feb 2, 2016 (V1.1): @@ -9,4 +12,4 @@ This is what we ship with out of the factory. :) The image says it all: -![Default](default_highres.png) +![Default](default_firmware_v1.2-2.png) diff --git a/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c b/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c new file mode 100755 index 00000000..d33c6e52 --- /dev/null +++ b/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c @@ -0,0 +1,165 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" + +/****************************************************************************************** + * DVORAK LAYOUT (see http://djelibeibi.unex.es/dvorak/) + * Layer 1: auxiliary keys + * Layer 2: full qwerty layout + *****************************************************************************************/ + +// LAYERS +#define BASE 0 // dvorak layout (default) +#define AUX 1 // auxiliary keys + +// MACROS +/* #define OBRACE 0 // key { or shift */ +/* #define CBRACE 1 // key } or shift */ +/* #define OBRACK 2 // key [ or left alt */ +/* #define CBRACK 3 // key ] or left alt */ +/* #define CAPS 4 // caps lock */ + +// LEDS +#define USB_LED_NUM_LOCK 0 +#define USB_LED_CAPS_LOCK 1 +#define USB_LED_SCROLL_LOCK 2 +#define USB_LED_COMPOSE 3 +#define USB_LED_KANA 4 + +// TIMERS +#define KEY_TAP_FAST 85 +#define KEY_TAP_SLOW 95 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Base layer + * Keys with double values (like Esc/Ctrl) correspond to the 'tapped' key and the 'held' key, respectively + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | = / + | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | ~ |" / ' |, / < |. / > | P | Y | [ | | ] | F | G | C | H | L | / / ? | + * |--------+------+------+------+------+------| { | | } |------+------+------+------+------+--------| + * | Tab | A | O | E |U/LSft| I/L1 |------| |------| D/L1|R/RSft| T | N | S | - / _ | + * |--------+------+------+------+------+------| LGUI | | LGUI |------+------+------+------+------+--------| + * | {/LSft |; / : | Q | J | K | X | | | | B | M | W | V | Z | }/RSft | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | ~L1 | | ~L1 | | | \ / || | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | HOME | END | | LEFT | RIGHT| + * ,------|------|------| |------+--------+------. + * | BSPC | DEL | PGUP | | UP | SPACE |RETURN| + * | / | / |------| |------| / | / | + * | LCTL | LALT |PGDWN | | DOWN | LALT | LCTL | + * `--------------------' `----------------------' + * + */ +[BASE] = KEYMAP( + // left hand + KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, + KC_TILD, KC_QUOTE, KC_COMM,KC_DOT, KC_P, KC_Y, KC_LBRACKET, + KC_TAB, KC_A, KC_O, KC_E, SFT_T(KC_U), LT(AUX, KC_I), + SFT_T(KC_LBRC), KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LGUI, + KC_NO, KC_NO, KC_NO, KC_NO, MO(AUX), + KC_HOME, KC_END, + KC_PGUP, + CTL_T(KC_BSPC), ALT_T(KC_DEL), KC_PGDN, + // right hand + KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, + KC_RBRACKET, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLASH, + LT(AUX, KC_D), SFT_T(KC_H), KC_T, KC_N, KC_S, KC_MINUS, + KC_LGUI, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_RBRC), + MO(AUX), KC_NO, KC_NO, KC_BSLASH, KC_NO, + KC_LEFT, KC_RIGHT, + KC_UP, + KC_DOWN, ALT_T(KC_ENT), CTL_T(KC_SPC) + ), +/* Keymap 1: Aux layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | VolUp | | | | | | SLEEP | PWR | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | VolDn | F1 | F2 | F3 | F4 | | | | | | 7 | 8 | 9 | * | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | F5 | F6 | F7 | F8 | TRANS|------| |------|TRANS | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | |PSCR |------+------+------+------+------+--------| + * | TRANS | F9 | F10 | F11 | F12 | | | | | | 1 | 2 | 3 | / | TRANS | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |CTRL-S|CTRL-Z|CTRL-X|CTRL-C| TRANS| | TRANS| . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | TRANS| TRANS| | TRANS| TRANS| + * ,------|------|------| |------+------+------. + * | | | TRANS| | TRANS| | | + * |TRANS |TRANS |------| |------| TRANS| TRANS| + * | | | TRANS| | TRANS| | | + * `--------------------' `--------------------' + */ +[AUX] = KEYMAP( + // left hand + KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_SLEP, + KC_VOLD, KC_F1, KC_F2, KC_F3, KC_F4, KC_NO, KC_NO, + KC_NO , KC_F5, KC_F6, KC_F7, KC_F8, KC_TRNS, + KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, + LCTL(KC_S), LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), KC_TRNS, + KC_TRNS , KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_PWR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_7, KC_8, KC_9, KC_PAST, KC_NO, + KC_TRNS, KC_4, KC_5, KC_6, KC_PPLS, KC_NO, + KC_PSCR, KC_NO, KC_1, KC_2, KC_3, KC_PSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, KC_PEQL, KC_NO, + KC_TRNS , KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(AUX) // FN1 - Momentary Layer 1 (Aux) +}; + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } +} diff --git a/keyboards/ergodox/keymaps/dvorak_emacs/readme.md b/keyboards/ergodox/keymaps/dvorak_emacs/readme.md new file mode 100644 index 00000000..a3fc34af --- /dev/null +++ b/keyboards/ergodox/keymaps/dvorak_emacs/readme.md @@ -0,0 +1,70 @@ +# Ergodox Dvorak Layout with emacs binding in mind + * Control & Alt key on the thumbs (activated if pressed with another key). + * In the same way, "U" and "R" are the shift modifier if pressed with another key. + * "I" and "D" set the layer 1 for the auxiliary keys if pressed with another key. + * Software layout set to english. + +## Keymap Layers + - L0: dvorak with some customizations (see layout below) + - L1: auxiliary keys (includes function keys, numpad...) + + +### Keymap 0: Base layer +Keys with double values (like U/LSft) correspond to the 'tapped' key and the 'held' key, respectively + +

+
+,--------------------------------------------------.           ,--------------------------------------------------.
+|        |   1  |   2  |   3  |   4  |   5  |  Esc |           |  Esc |   6  |   7  |   8  |   9  |   0  |   =    |
+|--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+|   ~    |  '   |   ,  |   .  |   P  |   Y  |   [  |           |   ]  |   F  |   G  |   C  |   H  |   L  |   /    |
+|--------+------+------+------+------+------|   {  |           |   }  |------+------+------+------+------+--------|
+|  Tab   |   A  |   O  |   E  |U/LSft| I/L1 |------|           |------|  D/L1|R/RSft|   T  |   N  |   S  |   -    |
+|--------+------+------+------+------+------| LGUI |           | LGUI |------+------+------+------+------+--------|
+| {/LSft |   ;  |   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |   Z  | }/RSft |
+`--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+  |      |      |      |      | ~L1  |                                       | ~L1  |      |      |   \  |      |
+  `----------------------------------'                                       `----------------------------------'
+                                       ,-------------.       ,-------------.
+                                       | HOME |  END |       | LEFT | RIGHT|
+                                ,------|------|------|       |------+--------+------.
+                                | BSPC |  DEL | PGUP |       |  UP  | SPACE  |RETURN|
+                                |  /   |  /   |------|       |------|   /    |  /   |
+                                | LCTL | LALT |PGDWN |       | DOWN | LALT   | LCTL |
+                                `--------------------'       `----------------------'
+
+
+ +### Keymap 1: Aux layer + +

+
+,--------------------------------------------------.           ,--------------------------------------------------.
+|  VolUp |      |      |      |      |      | SLEEP            | PWR  |      |      |      |      |      |        |
+|--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+|  VolDn |  F1  |  F2  |  F3  |  F4  |      |      |           |      |      |   7  |   8  |   9  |   *  |        |
+|--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+|        |  F5  |  F6  |  F7  |  F8  | TRANS|------|           |------|TRANS |   4  |   5  |   6  |   +  |        |
+|--------+------+------+------+------+------|      |           |PSCR  |------+------+------+------+------+--------|
+|  TRANS |  F9  |  F10 |  F11 |  F12 |      |      |           |      |      |   1  |   2  |   3  |   /  |  TRANS |
+`--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+  |CTRL-S|CTRL-Z|CTRL-X|CTRL-C| TRANS|                                       | TRANS|    . |   0  |   =  |      |
+  `----------------------------------'                                       `----------------------------------'
+                                       ,-------------.       ,-------------.
+                                       | TRANS| TRANS|       | TRANS| TRANS|
+                                ,------|------|------|       |------+------+------.
+                                |      |      | TRANS|       | TRANS|      |      |
+                                |TRANS |TRANS |------|       |------| TRANS| TRANS|
+                                |      |      | TRANS|       | TRANS|      |      |
+                                `--------------------'       `--------------------'
+
+
+ + + +## Generation of .hex file +> In the "qmk_firmware/keyboards/ergodox" directory. + +> Execute "make dvorak_emacs". Then the hex file "ergodox_ez_dvorak_emacs.hex" is in the root directory : "qmk_firmware". + +> Flash with `teensy_loader` binary diff --git a/keyboards/ergodox/keymaps/dvorak_emacs_software/keymap.c b/keyboards/ergodox/keymaps/dvorak_emacs_software/keymap.c new file mode 100755 index 00000000..a2bc15c9 --- /dev/null +++ b/keyboards/ergodox/keymaps/dvorak_emacs_software/keymap.c @@ -0,0 +1,166 @@ +#include "ergodox.h" +#include "keymap_dvorak.h" +#include "debug.h" +#include "action_layer.h" + +/****************************************************************************************** + * DVORAK LAYOUT (see http://djelibeibi.unex.es/dvorak/) + * Layer 1: auxiliary keys + * Layer 2: full qwerty layout + *****************************************************************************************/ + +// LAYERS +#define BASE 0 // dvorak layout (default) +#define AUX 1 // auxiliary keys + +// MACROS +/* #define OBRACE 0 // key { or shift */ +/* #define CBRACE 1 // key } or shift */ +/* #define OBRACK 2 // key [ or left alt */ +/* #define CBRACK 3 // key ] or left alt */ +/* #define CAPS 4 // caps lock */ + +// LEDS +#define USB_LED_NUM_LOCK 0 +#define USB_LED_CAPS_LOCK 1 +#define USB_LED_SCROLL_LOCK 2 +#define USB_LED_COMPOSE 3 +#define USB_LED_KANA 4 + +// TIMERS +#define KEY_TAP_FAST 85 +#define KEY_TAP_SLOW 95 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Base layer + * Keys with double values (like Esc/Ctrl) correspond to the 'tapped' key and the 'held' key, respectively + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | = / + | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | ~ |" / ' |, / < |. / > | P | Y | [ | | ] | F | G | C | H | L | / / ? | + * |--------+------+------+------+------+------| { | | } |------+------+------+------+------+--------| + * | Tab | A | O | E |U/LSft| I/L1 |------| |------| D/L1|R/RSft| T | N | S | - / _ | + * |--------+------+------+------+------+------| LGUI | | LGUI |------+------+------+------+------+--------| + * | {/LSft |; / : | Q | J | K | X | | | | B | M | W | V | Z | }/RSft | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | ~L1 | | ~L1 | | | \ / || | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | HOME | END | | LEFT | RIGHT| + * ,------|------|------| |------+--------+------. + * | BSPC | DEL | PGUP | | UP | SPACE |RETURN| + * | / | / |------| |------| / | / | + * | LCTL | LALT |PGDWN | | DOWN | LALT | LCTL | + * `--------------------' `----------------------' + * + */ +[BASE] = KEYMAP( + // left hand + KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, + KC_TILD, DV_QUOT, DV_COMM,DV_DOT, DV_P, DV_Y, DV_LBRC, + KC_TAB, DV_A, DV_O, DV_E, SFT_T(DV_U), LT(AUX, DV_I), + SFT_T(DV_LBRC), DV_SCLN, DV_Q, DV_J, DV_K, DV_X, KC_LGUI, + KC_NO, KC_NO, KC_NO, KC_NO, MO(AUX), + KC_HOME, KC_END, + KC_PGUP, + CTL_T(KC_BSPC), ALT_T(KC_DEL), KC_PGDN, + // right hand + KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, DV_EQL, + DV_RBRC, DV_F, DV_G, DV_C, DV_R, DV_L, DV_SLSH, + LT(AUX, DV_D), SFT_T(DV_H), DV_T, DV_N, DV_S, DV_MINS, + KC_LGUI, DV_B, DV_M, DV_W, DV_V, DV_Z, SFT_T(DV_RBRC), + MO(AUX), KC_NO, KC_NO, KC_BSLS, KC_NO, + KC_LEFT, KC_RIGHT, + KC_UP, + KC_DOWN, ALT_T(KC_ENT), CTL_T(KC_SPC) + ), +/* Keymap 1: Aux layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | VolUp | | | | | | SLEEP | PWR | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | VolDn | F1 | F2 | F3 | F4 | | | | | | 7 | 8 | 9 | * | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | F5 | F6 | F7 | F8 | TRANS|------| |------|TRANS | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | |PSCR |------+-----aan+------+------+------+--------| + * | TRANS | F9 | F10 | F11 | F12 | | | | | | 1 | 2 | 3 | / | TRANS | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |CTRL-S|CTRL-Z|CTRL-X|CTRL-C| TRANS| | TRANS| . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | TRANS| TRANS| | TRANS| TRANS| + * ,------|------|------| |------+------+------. + * | | | TRANS| | TRANS| | | + * |TRANS |TRANS |------| |------| TRANS| TRANS| + * | | | TRANS| | TRANS| | | + * `--------------------' `--------------------' + */ +[AUX] = KEYMAP( + // left hand + KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_SLEP, + KC_VOLD, KC_F1, KC_F2, KC_F3, KC_F4, KC_NO, KC_NO, + KC_NO , KC_F5, KC_F6, KC_F7, KC_F8, KC_TRNS, + KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, + LCTL(DV_S), LCTL(DV_Z), LCTL(DV_X), LCTL(DV_C), KC_TRNS, + KC_TRNS , KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_PWR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_7, KC_8, KC_9, KC_PAST, KC_NO, + KC_TRNS, KC_4, KC_5, KC_6, KC_PPLS, KC_NO, + KC_PSCR, KC_NO, KC_1, KC_2, KC_3, KC_PSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, KC_PEQL, KC_NO, + KC_TRNS , KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(AUX) // FN1 - Momentary Layer 1 (Aux) +}; + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } +} diff --git a/keyboards/ergodox/keymaps/dvorak_emacs_software/readme.md b/keyboards/ergodox/keymaps/dvorak_emacs_software/readme.md new file mode 100644 index 00000000..0e1e94ff --- /dev/null +++ b/keyboards/ergodox/keymaps/dvorak_emacs_software/readme.md @@ -0,0 +1,74 @@ +# Ergodox Dvorak Layout with emacs binding in mind - software version + +This configuration is the same as the dvorak_emacs layout, but using a sofware dvorak configuration +instead of a firmware configuration. This layout is for those who run their computer in dvorak mode. + + * Control & Alt key on the thumbs (activated if pressed with another key). + * In the same way, "U" and "R" are the shift modifier if pressed with another key. + * "I" and "D" set the layer 1 for the auxiliary keys if pressed with another key. + * Software layout set to english. + +## Keymap Layers + - L0: dvorak with some customizations (see layout below) + - L1: auxiliary keys (includes function keys, numpad...) + + +### Keymap 0: Base layer +Keys with double values (like U/LSft) correspond to the 'tapped' key and the 'held' key, respectively + +

+
+,--------------------------------------------------.           ,--------------------------------------------------.
+|        |   1  |   2  |   3  |   4  |   5  |  Esc |           |  Esc |   6  |   7  |   8  |   9  |   0  |   =    |
+|--------|------|------|------|------|-------------|           |------|------|------|------|------|------|--------|
+|   ~    |  '   |   ,  |   .  |   P  |   Y  |   [  |           |   ]  |   F  |   G  |   C  |   H  |   L  |   /    |
+|--------|------|------|------|------|------|   {  |           |   }  |------|------|------|------|------|--------|
+|  Tab   |   A  |   O  |   E  |U/LSft| I/L1 |------|           |------|  D/L1|R/RSft|   T  |   N  |   S  |   -    |
+|--------|------|------|------|------|------| LGUI |           | LGUI |------|------|------|------|------|--------|
+| {/LSft |   ;  |   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |   Z  | }/RSft |
+`--------|------|------|------|------|-------------'           `-------------|------|------|------|------|--------'
+  |      |      |      |      | ~L1  |                                       | ~L1  |      |      |   \  |      |
+  `----------------------------------'                                       `----------------------------------'
+                                       ,-------------.       ,-------------.
+                                       | HOME |  END |       | LEFT | RIGHT|
+                                ,------|------|------|       |------|--------|------.
+                                | BSPC |  DEL | PGUP |       |  UP  | SPACE  |RETURN|
+                                |  /   |  /   |------|       |------|   /    |  /   |
+                                | LCTL | LALT |PGDWN |       | DOWN | LALT   | LCTL |
+                                `--------------------'       `----------------------'
+
+
+ +### Keymap 1: Aux layer + +

+
+,--------------------------------------------------.           ,--------------------------------------------------.
+|  VolUp |      |      |      |      |      | SLEEP            | PWR  |      |      |      |      |      |        |
+|--------|------|------|------|------|-------------|           |------|------|------|------|------|------|--------|
+|  VolDn |  F1  |  F2  |  F3  |  F4  |      |      |           |      |      |   7  |   8  |   9  |   *  |        |
+|--------|------|------|------|------|------|      |           |      |------|------|------|------|------|--------|
+|        |  F5  |  F6  |  F7  |  F8  | TRANS|------|           |------|TRANS |   4  |   5  |   6  |   +  |        |
+|--------|------|------|------|------|------|      |           |PSCR  |------|------|------|------|------|--------|
+|  TRANS |  F9  |  F10 |  F11 |  F12 |      |      |           |      |      |   1  |   2  |   3  |   /  |  TRANS |
+`--------|------|------|------|------|-------------'           `-------------|------|------|------|------|--------'
+  |CTRL-S|CTRL-Z|CTRL-X|CTRL-C| TRANS|                                       | TRANS|    . |   0  |   =  |      |
+  `----------------------------------'                                       `----------------------------------'
+                                       ,-------------.       ,-------------.
+                                       | TRANS| TRANS|       | TRANS| TRANS|
+                                ,------|------|------|       |------|------|------.
+                                |      |      | TRANS|       | TRANS|      |      |
+                                |TRANS |TRANS |------|       |------| TRANS| TRANS|
+                                |      |      | TRANS|       | TRANS|      |      |
+                                `--------------------'       `--------------------'
+
+
+ + + +## Generation of .hex file +> In the "qmk_firmware/keyboards/ergodox" directory. + +> Execute "make dvorak_emacs". Then the hex file "ergodox_ez_dvorak_emacs.hex" is in the root directory : "qmk_firmware". + +> Flash with `teensy_loader` binary diff --git a/keyboards/ergodox/keymaps/dvorak_plover/README.md b/keyboards/ergodox/keymaps/dvorak_plover/README.md new file mode 100644 index 00000000..c8287b01 --- /dev/null +++ b/keyboards/ergodox/keymaps/dvorak_plover/README.md @@ -0,0 +1,14 @@ +Dvorak support, plover support, gaming support + +I'm used to the Kinesis, so originally I was just going to patch up +the thumb keys to be more familiar. But the ergodox is really well +suited to NKRO support in Plover, so I added a layer for that, and +then I remembered that dvorak can be really annoying for video +games (try to reach WASD), so I added a layer for that. + +The result is probably a bit idiosyncratic, but it works for me. + +(I also don't have any press/hold distinction keys, because that +confuses my fuzzy little brain.) + +Contributed by seebs (seebs@seebs.net) diff --git a/keyboards/ergodox/keymaps/dvorak_plover/keymap.c b/keyboards/ergodox/keymaps/dvorak_plover/keymap.c new file mode 100644 index 00000000..d0505609 --- /dev/null +++ b/keyboards/ergodox/keymaps/dvorak_plover/keymap.c @@ -0,0 +1,230 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define PLVR 2 // media keys +#define QWRT 3 // qwerty layer for gaming + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | \ | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | ' | , | . | P | Y | L1 | | L2 | F | G | C | R | L | / | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | LGui | A | O | E | U | I |------| |------| D | H | T | N | S | - | + * |--------+------+------+------+------+------| Esc | | L3 |------+------+------+------+------+--------| + * | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |Lalt | Grv | | Left | Right| | Up | Down | [ | ] | RAlt | + * `----------------------------------' `----------------------------------' + * ,-------------. ,---------------. + * | LCtrl| Alt | | LGui | RCtrl | + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * |Backsp|Delete|------| |------| Enter |Space | + * | ace| | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, MO(SYMB), + KC_LGUI, KC_A, KC_O, KC_E, KC_U, KC_I, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_ESC, + KC_LALT, KC_GRV, KC_ESC, KC_LEFT,KC_RGHT, + KC_LCTL, KC_LALT, + KC_HOME, + KC_BSPC,KC_DEL,KC_END, + // right hand + KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, + TG(PLVR), KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, + KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, + TG(QWRT),KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, + KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_RALT, + KC_LGUI, KC_RCTL, + KC_PGUP, + KC_PGDN,KC_ENT, KC_SPC + ), +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | KP7 | KP8 | KP9 | KP* | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | KP4 | KP5 | KP6 | KP+ | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | KP1 | KP2 | KP3 | KP/ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | KP. | KP0 | KP= | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, + KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, + KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_P7, KC_P8, KC_P9, KC_PAST, KC_F12, + KC_DOWN, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, + KC_TRNS, KC_AMPR, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_TRNS, + KC_TRNS,KC_PDOT, KC_P0, KC_PEQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 2: Steno for Plover from https://github.com/shayneholmes/tmk_keyboard/commit/11290f8489013018f778627db725160c745e75bd + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | 1 | 2 | 3 | 4 | 5 | | | L2 | 6 | 7 | 8 | 9 | 0 | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | q | w | e | r | t |------| |------| y | u | i | o | p | [ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | a | s | d | f | g | | | | h | j | k | l | ; | ' | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | c | v |------| |------| n | m | + * | | | | | | | | + * `--------------------' `--------------------' + */ + +[PLVR] = KEYMAP( // layout: layer 2: Steno for Plover + // left hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, + KC_NO, KC_Q, KC_W, KC_E, KC_R, KC_T, + KC_NO, KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_FN4, KC_NO, + KC_NO, + KC_C, KC_V, KC_NO, + // right hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + TG(2), KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, + KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_NO, KC_N, KC_M +), +/* Keymap 3: qwerty-ish + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | Esc | | Esc | 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | | | | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | LGui | A | S | D | F | G |------| |------| H | J | K | L | ; | LGui | + * |--------+------+------+------+------+------| Spc | | L3 |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | Lalt | Grv | '" | Left | Right| | Up | Down | [ | ] | RAlt | + * `----------------------------------' `----------------------------------' + * ,-------------. ,---------------. + * | LCtrl| LAlt | | LGui | RCtrl | + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * |Backsp|Delete|------| |------| Enter |Space | + * | ace| | End | | PgDn | | | + * `--------------------' `----------------------' + */ +[QWRT] = KEYMAP( // layer 3: qwerty for gaming + // left hand + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), + KC_LGUI, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_SPACE, + KC_LALT, KC_GRV, KC_QUOT, KC_LEFT,KC_RGHT, + KC_LCTL, KC_LALT, + KC_HOME, + KC_BSPC,KC_DEL,KC_END, + // right hand + KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + TG(QWRT), KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, + KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_RALT, + KC_LGUI, KC_RCTL, + KC_PGUP, + KC_PGDN,KC_ENT, KC_SPC + ), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + case 3: + ergodox_right_led_3_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/dvorak_programmer/Makefile b/keyboards/ergodox/keymaps/dvorak_programmer/Makefile index 1fd6cb9f..91b1ae59 100644 --- a/keyboards/ergodox/keymaps/dvorak_programmer/Makefile +++ b/keyboards/ergodox/keymaps/dvorak_programmer/Makefile @@ -4,5 +4,5 @@ SLEEP_LED_ENABLE=no FORCE_NKRO ?= yes DEBUG_ENABLE = no CONSOLE_ENABLE = no -TAP_DANCE_ENABLE = yes -MOUSEKEY_ENABLE = no +TAP_DANCE_ENABLE = no +MOUSEKEY_ENABLE = yes diff --git a/keyboards/ergodox/keymaps/dvorak_programmer/README.md b/keyboards/ergodox/keymaps/dvorak_programmer/README.md index a4580fe0..36722469 100644 --- a/keyboards/ergodox/keymaps/dvorak_programmer/README.md +++ b/keyboards/ergodox/keymaps/dvorak_programmer/README.md @@ -11,5 +11,29 @@ Layers * KEY_NAV: arrow key movement with backward/forward word support, and copy/paste. * KEY_SEL: same as above, but every movement shift-selects. * NUMBER: keypad layer. -* SYMBOL: all the symbols as well as brackets at the bottom. +* SYMBOL: all the symbols. +* BRACKET: special brackets-only layer for programming. Activated by pressing left capslock (OSL) * SHORTCUTS: sends Hyper keys for Autohotkey to interpret. I use this to switch between specific apps. +* MOUSE: use mouse keys + +Updates +------- + +2017/02/10: +* Made left shift an MO for SHELL_NAV, and symbol+right shift CAPSLOCK. Made all modifiers OSM. + +2017/01/28: +* Made the capslock key a dual momentary layer activation for BRACKETS and SHELL_NAV. One keypress held down for BRACKETS, one keypress, released and then held down for SHELL_NAV + +2017/01/22: +* Made brackets toggle an OSL on the left capslock +* Added SHELL_LAYER + +2016/12/10: +* toggle for brackets layer is now on left thumb cluster. + +2016/11/05: +* removed brackets anywhere but in brackets layer +* added mouse layer back in +* put semicolon-newline and end-newline on symbol layer +* replaced all HYPR with MEH, added more shortcut keys \ No newline at end of file diff --git a/keyboards/ergodox/keymaps/dvorak_programmer/keymap.c b/keyboards/ergodox/keymaps/dvorak_programmer/keymap.c index 5100115a..ae4fd444 100644 --- a/keyboards/ergodox/keymaps/dvorak_programmer/keymap.c +++ b/keyboards/ergodox/keymaps/dvorak_programmer/keymap.c @@ -6,13 +6,14 @@ #include "action_code.h" #define BASE 0 // default layer -#define SHELL_NAV 1 +#define SHELL_NAV 2 #define KEY_NAV 3 // key navigation layer #define KEY_SEL 4 // key selection layer #define NUMBER 5 // number layer #define SYMBOL 6 #define BRACKETS 7 #define SHORTCUTS 8 +#define MOUSE 9 // macros #define MC_COPY_LINE 0 @@ -35,50 +36,36 @@ #define END_NEWLINE 17 -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_TAP_TOGGLE(KEY_NAV), // FN1 - keynav layer - [2] = ACTION_LAYER_TAP_TOGGLE(NUMBER), // FN2 - number layer - [3] = ACTION_MODS_ONESHOT(MOD_LSFT), // FN3 - shift modifier / oneshot - [4] = ACTION_MODS_ONESHOT(MOD_LCTL), // FN4 - ctrl modifier / oneshot - [5] = ACTION_MODS_ONESHOT(MOD_LALT), // FN5 - alt modifier / oneshot -}; - -//Tap Dance Declarations -enum { - TD_SHIFT_CAPSLOCK = 0, - TD_BRK_LEFT = 1, - TD_BRK_RIGHT = 2 -}; - - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // base layer [BASE] = KEYMAP( // layer 0 : default // left hand KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, - LT(BRACKETS,KC_TAB), KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, MO(KEY_SEL), - MO(SHELL_NAV), KC_A, KC_O, KC_E, KC_U, KC_I, - KC_FN3, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, MO(KEY_NAV), - OSL(SHORTCUTS),KC_FN4, KC_FN5,OSL(SYMBOL),MO(NUMBER), + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, MO(KEY_SEL), + MO(BRACKETS), KC_A, KC_O, KC_E, KC_U, KC_I, + MO(SHELL_NAV), KC_SCLN, KC_Q, KC_J, KC_K, KC_X, MO(KEY_NAV), + OSL(SHORTCUTS),OSM(MOD_LCTL), OSM(MOD_LALT),OSL(SYMBOL),MO(NUMBER), // thumb cluster - RCTL(KC_F), RCTL(KC_S), - RCTL(KC_DEL), + OSM(MOD_LSFT), RCTL(KC_S), + RCTL(KC_DEL), KC_BSPC,RCTL(KC_BSPC),KC_DEL, // right hand KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSLS, KC_PGUP, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, - KC_PGDN, KC_B, KC_M, KC_W, KC_V, KC_Z, TD(TD_SHIFT_CAPSLOCK), + KC_PGDN, KC_B, KC_M, KC_W, KC_V, KC_Z, OSM(MOD_LSFT), // lower keys - browser tab control - RSFT(RCTL(KC_TAB)), RCTL(KC_TAB), RCTL(KC_T), RCTL(KC_K), RCTL(KC_W), + RSFT(RCTL(KC_TAB)), RCTL(KC_TAB), RCTL(KC_T), LALT(KC_LEFT), RCTL(KC_W), // thumb cluster - M(SEMICOLON_NEWLINE), M(END_NEWLINE), + KC_HOME,KC_END, KC_UP, KC_DOWN,KC_ENT, KC_SPC ), + + // shell navigation layer [SHELL_NAV] = KEYMAP( // left hand @@ -96,7 +83,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RCTL(KC_L), RCTL(KC_W), KC_HOME, KC_UP, KC_END, LALT(KC_D), RCTL(KC_R), LALT(KC_B), KC_LEFT, KC_DOWN, KC_RIGHT, LALT(KC_F), LALT(KC_DOT), - RCTL(KC_C), RCTL(KC_U), M(SCREEN_COPY_MODE), M(SCREEN_PASTE), HYPR(KC_V), RCTL(KC_K), M(SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND), + RCTL(KC_C), RCTL(KC_U), M(SCREEN_COPY_MODE), M(SCREEN_PASTE), MEH(KC_V), RCTL(KC_K), M(SHELL_RECALL_LAST_ARG_REMOVE_FIRST_COMMAND), // bottom row M(SCREEN_TAB_LEFT), M(SCREEN_TAB_RIGHT), M(SCREEN_NEW_TAB), KC_TRNS, KC_TRNS, // thumb cluster @@ -187,33 +174,33 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [SYMBOL] = KEYMAP( // left hand - KC_NO,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, - KC_TRNS,KC_TRNS, M(OPEN_CLOSE_PAREN), KC_LPRN, KC_RPRN, KC_TRNS, KC_TRNS, - KC_TRNS,KC_TRNS, M(OPEN_CLOSE_BRACKET), KC_LBRC, KC_RBRC, M(OPEN_CLOSE_DOUBLE_QUOTE), - KC_TRNS,M(SEMICOLON_NEWLINE),M(OPEN_CLOSE_CURLY), KC_LCBR, KC_RCBR, M(OPEN_CLOSE_SINGLE_QUOTE),KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, // right hand - KC_LPRN, KC_RPRN, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PLUS, KC_AMPR, KC_ASTR, KC_GRAVE,KC_TILD, KC_TRNS, KC_MINS, KC_DLR, KC_PERC, KC_CIRC, KC_PIPE, KC_TRNS, KC_TRNS, KC_EQUAL,KC_EXLM, KC_AT, KC_HASH, KC_TRNS, KC_TRNS, - KC_LBRC, KC_RBRC, TD(TD_BRK_LEFT), TD(TD_BRK_RIGHT), KC_TRNS, - KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + M(SEMICOLON_NEWLINE), M(END_NEWLINE), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [BRACKETS] = KEYMAP( // left hand - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,M(OPEN_CLOSE_CURLY), M(OPEN_CLOSE_PAREN),M(OPEN_CLOSE_BRACKET), KC_TRNS,KC_TRNS, + KC_TRNS,KC_LPRN, KC_RPRN, KC_LBRC, KC_RBRC, KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, KC_LCBR, KC_RCBR, KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, // right hand @@ -229,26 +216,46 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [SHORTCUTS] = KEYMAP( // left hand - KC_NO, HYPR(KC_F1), HYPR(KC_F2), HYPR(KC_F3), HYPR(KC_F4), HYPR(KC_F5), HYPR(KC_F6), + KC_NO, MEH(KC_F1), MEH(KC_F2), MEH(KC_F3), MEH(KC_F4), MEH(KC_F5), MEH(KC_F6), KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - KC_TRNS,KC_TRNS, - KC_TRNS, - KC_TRNS,KC_TRNS,KC_TRNS, + MEH(KC_0),MEH(KC_1), + MEH(KC_2), + MEH(KC_3),MEH(KC_4),MEH(KC_5), // right hand - HYPR(KC_F7), HYPR(KC_F8), HYPR(KC_F9), HYPR(KC_F10), HYPR(KC_F11), HYPR(KC_F12), M(SWITCH_NDS), - KC_TRNS, HYPR(KC_A), HYPR(KC_B), HYPR(KC_C), HYPR(KC_D), HYPR(KC_E), HYPR(KC_F), - HYPR(KC_G), HYPR(KC_H), HYPR(KC_I), HYPR(KC_J), HYPR(KC_K), HYPR(KC_L), - KC_TRNS, HYPR(KC_M), HYPR(KC_N), HYPR(KC_O), HYPR(KC_P), HYPR(KC_Q), HYPR(KC_R), - LALT(KC_LEFT),LALT(KC_RIGHT),KC_F5, LCTL(LGUI(KC_LEFT)), LCTL(LGUI(KC_RIGHT)), + MEH(KC_F7), MEH(KC_F8), MEH(KC_F9), MEH(KC_F10), MEH(KC_F11), MEH(KC_F12), M(SWITCH_NDS), + KC_TRNS, MEH(KC_A), MEH(KC_B), MEH(KC_C), MEH(KC_D), MEH(KC_E), MEH(KC_F), + MEH(KC_G), MEH(KC_H), MEH(KC_I), MEH(KC_J), MEH(KC_K), MEH(KC_L), + KC_TRNS, MEH(KC_M), MEH(KC_N), MEH(KC_O), MEH(KC_P), MEH(KC_Q), KC_CAPSLOCK, + MEH(KC_S), MEH(KC_T), MEH(KC_U), MEH(KC_V), MEH(KC_X), + MEH(KC_6), MEH(KC_7), + MEH(KC_8), + MEH(KC_9), MEH(KC_Y), MEH(KC_Z) +), + + +[MOUSE] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS + KC_TRNS, KC_BTN1, KC_BTN2 ), - }; @@ -346,7 +353,8 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { return MACRO( T(END), T(ENTER), END); } - break; + break; + } return MACRO_NONE; @@ -366,13 +374,6 @@ void led_set_user(uint8_t usb_led) { } } -qk_tap_dance_action_t tap_dance_actions[] = { - [TD_SHIFT_CAPSLOCK] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPSLOCK), - [TD_BRK_LEFT] = ACTION_TAP_DANCE_DOUBLE (KC_LPRN, KC_LCBR), - [TD_BRK_RIGHT] = ACTION_TAP_DANCE_DOUBLE (KC_RPRN, KC_RCBR) - -}; - // Runs constantly in the background, in a loop. void matrix_scan_user(void) { @@ -385,6 +386,8 @@ void matrix_scan_user(void) { switch (layer) { case NUMBER: case SYMBOL: + case BRACKETS: + //case SHELL_LAYER: ergodox_right_led_2_on(); break; case KEY_NAV: diff --git a/keyboards/ergodox/keymaps/erez_experimental/Makefile b/keyboards/ergodox/keymaps/erez_experimental/Makefile index b673c5ce..51a0c74c 100644 --- a/keyboards/ergodox/keymaps/erez_experimental/Makefile +++ b/keyboards/ergodox/keymaps/erez_experimental/Makefile @@ -3,6 +3,8 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend COMMAND_ENABLE = no # Commands for debug and configuration +RGBLIGHT_ENABLE ?= yes +MIDI_ENABLE ?= yes ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/ergodox/keymaps/erez_experimental/config.h b/keyboards/ergodox/keymaps/erez_experimental/config.h index e5d7fe18..4da18c65 100644 --- a/keyboards/ergodox/keymaps/erez_experimental/config.h +++ b/keyboards/ergodox/keymaps/erez_experimental/config.h @@ -8,5 +8,6 @@ #undef LEADER_TIMEOUT #define LEADER_TIMEOUT 300 + #endif diff --git a/keyboards/ergodox/keymaps/erez_experimental/keymap.c b/keyboards/ergodox/keymaps/erez_experimental/keymap.c index 4804959d..13b8240c 100644 --- a/keyboards/ergodox/keymaps/erez_experimental/keymap.c +++ b/keyboards/ergodox/keymaps/erez_experimental/keymap.c @@ -7,6 +7,12 @@ #define SYMB 1 // symbols #define MDIA 2 // media keys +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + RGB_FF00BB // always start with RGB_ +}; + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 0: Basic layer * @@ -65,33 +71,33 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | |NxtTab|PrvTab| | | | | | | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. - * | | | | | | + * | | | |TOG | * ,------|------|------| |------+------+------. - * | | | | | | | | + * |VAI |VAD |HUI | |SAI | |MOD | * | | |------| |------| | | - * | | | | | | | | + * | | |HUD | |SAD | | | * `--------------------' `--------------------' */ // SYMBOLS [SYMB] = KEYMAP( // left hand - KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + RGB_FF00BB, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,LCTL(KC_PGUP), LCTL(KC_PGDN), KC_TRNS,KC_TRNS, - KC_TRNS, - KC_TRNS,KC_TRNS,KC_TRNS, + RGB_HUI, + RGB_VAI,RGB_VAD,RGB_HUD, // right hand KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12, KC_AMPR, KC_UNDS, KC_MINS, CM_SCLN, KC_PLUS, KC_TRNS, KC_TRNS, KC_PIPE, KC_AT, KC_EQL, KC_PERC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS + RGB_TOG, KC_TRNS, + RGB_SAI, + RGB_SAD, KC_TRNS, RGB_MOD ), /* Keymap 2: Media and mouse keys * @@ -152,6 +158,24 @@ void matrix_init_user(void) { }; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + // dynamically generate these. + case RGB_FF00BB: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_enable(); + rgblight_mode(1); + rgblight_setrgb(0xff,0x00,0xbb); + #endif + } + return false; + break; + } + return true; +} + LEADER_EXTERNS(); // Runs constantly in the background, in a loop. diff --git a/keyboards/ergodox/keymaps/galson/Makefile b/keyboards/ergodox/keymaps/galson/Makefile new file mode 100644 index 00000000..f008f507 --- /dev/null +++ b/keyboards/ergodox/keymaps/galson/Makefile @@ -0,0 +1,2 @@ +COMMAND_ENABLE = no # Commands for debug and configuration + diff --git a/keyboards/ergodox/keymaps/galson/keymap.c b/keyboards/ergodox/keymaps/galson/keymap.c new file mode 100644 index 00000000..0d3e7560 --- /dev/null +++ b/keyboards/ergodox/keymaps/galson/keymap.c @@ -0,0 +1,183 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | + | 1 | 2 | 3 | 4 | 5 | rclk | | lclk | 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | = | Q | W | E | R |cmd/T |shift | |shift |cmd/Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| ( | | ) |------+------+------+------+------+--------| + * | " | A | S | D | F | G |------| |------| H | J | K | L |; / L2| ' | + * |--------+------+------+------+------+------| ctrl | | ctrl |------+------+------+------+------+--------| + * | { | Z | X | C | V | B | [ | | ] | N | M | , | . | / | } | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | _ | ` | $ | Left | Right| | Up | Down | : | * | ! | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | < | | | | & | > | + * ,------|------|------| |------+--------+------. + * | | | # | | @ | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | % | | ESC | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + KC_PLUS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_BTN2, + KC_EQL, KC_Q, KC_W, KC_E, KC_R, GUI_T(KC_T), KC_LSPO, + KC_DQUO, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LCBR, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_LBRC), + KC_UNDS, KC_GRV, KC_DLR, KC_LEFT,KC_RGHT, + KC_LABK, KC_PIPE, + KC_HASH, + KC_SPC, KC_BSPC,KC_PERC, + // right hand + KC_BTN1, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_RSPC, GUI_T(KC_Y), KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN), KC_QUOT, + CTL_T(KC_RBRC), KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RCBR, + KC_UP, KC_DOWN,KC_COLN,KC_ASTR, KC_EXLM, + KC_AMPR, KC_RABK, + KC_AT, + KC_ESC, KC_TAB, KC_ENT + ), +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. + * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + M(0), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, + KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, + KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MDIA] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/galson/readme.md b/keyboards/ergodox/keymaps/galson/readme.md new file mode 100644 index 00000000..ebc91672 --- /dev/null +++ b/keyboards/ergodox/keymaps/galson/readme.md @@ -0,0 +1,11 @@ +# Galson keymap + + +Sep 26, 2016. + +This is an ergonomic layout for programming for those with typing-related injuries. Key features: + +- As many symbol keys as possible are accessible without shifting. These should be accessed by moving the entire hand and pressing with a strong finger. +- Arrow keys and left and right mouse clicks for mouse-free navigation when combined with head mouse or eyetracker. +- Modifier keys are dual role and relocated to positions convenient for the index finger. +- Positions are more convenient when the keyboard is vertically mounted (as it should be!) \ No newline at end of file diff --git a/keyboards/ergodox/keymaps/german-kinergo/readme.md b/keyboards/ergodox/keymaps/german-kinergo/readme.md index 557d85a8..beb74cf7 100644 --- a/keyboards/ergodox/keymaps/german-kinergo/readme.md +++ b/keyboards/ergodox/keymaps/german-kinergo/readme.md @@ -2,7 +2,7 @@ This layout is inspired by the "kinesis-qwerty-mod" from benblazak's [ergodox-firmware](https://github.com/benblazak/ergodox-firmware), as well as by the "german" layout from the -[qmk_firmware](https://github.com/jackhumbert/qmk_firmware). +[qmk_firmware](https://github.com/qmk/qmk_firmware). The goal was to have a layout that is pretty close to an ordinary German keyboard, so I don't have to make adjustments on the operating system level and I keep some of the muscle memory to use a regular keyboard. diff --git a/keyboards/ergodox/keymaps/german-lukas/README.md b/keyboards/ergodox/keymaps/german-lukas/README.md new file mode 100644 index 00000000..3566b4ee --- /dev/null +++ b/keyboards/ergodox/keymaps/german-lukas/README.md @@ -0,0 +1,12 @@ +# About this keymap + +This keymap is based on the qwertz layout. +It has a key for pressing the left control and the left alt key at once. + +Linux makes a difference between AltGr and Control + Alt. Some keybindings are easier to press now. + +Also, I added a layer for pressing Control + Alt + F-Keys very fast. + +# Layer + +Each layer in the *keymap.c*-file has a comment showing the mappings of the layer. diff --git a/keyboards/ergodox/keymaps/german-lukas/keymap.c b/keyboards/ergodox/keymaps/german-lukas/keymap.c new file mode 100644 index 00000000..c6e9f2f9 --- /dev/null +++ b/keyboards/ergodox/keymaps/german-lukas/keymap.c @@ -0,0 +1,236 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "keymap_german.h" + +// Layer names +#define BASE 0 // default layer +#define SYMB 1 // symbol layer +#define MDIA 2 // media keys +#define SHRT 3 // shortcut layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | Caps | 1 | 2 | 3 | 4 | 5 |X ` X| | PRSC | 6 | 7 | 8 | 9 | 0 | ß | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | L1 | | L1 | Z | U | I | O | P | Ãœ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | Esc | A | S | D | F | G |------| |------| H | J | K | L | Ö | Ä/L2 | + * |--------+------+------+------+------+------| L2 | | L2 |------+------+------+------+------+--------| + * | LShift | Y | X | C | V | B | | | | N | M | , | . | - | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LGui | ^ | < | LEFT | RIGHT| | Up | Down | # | + | LCA | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | CTRL | ALT | | Alt |Ctrl/Esc| + * ,------+------+------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Del |------| |------| Bkspc | Enter| + * | | | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + KC_CAPS, KC_1, KC_2, KC_3, KC_4, KC_5, DE_ACUT, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, DE_Y, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + KC_LGUI, DE_CIRC, DE_LESS, KC_LEFT, KC_RIGHT, + KC_LCTRL, KC_LALT, + KC_HOME, + KC_SPC ,KC_DELT,KC_END, + // right hand + KC_PSCREEN, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + TG(MDIA), DE_Z, KC_U, KC_I, KC_O, KC_P, LT(SHRT,DE_UE), + KC_H, KC_J, KC_K, KC_L, DE_OE, LT(MDIA,DE_AE), + MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, DE_MINS, KC_RSFT, + KC_UP, KC_DOWN, DE_HASH, DE_PLUS, LCA_T(KC_NO), + KC_RALT, KC_RCTRL, + KC_PGUP, + KC_PGDN, KC_BSPC, KC_ENT + ), + +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,DE_EXLM,DE_AT, DE_LCBR,DE_RCBR,DE_PIPE,KC_TRNS, + KC_TRNS,DE_HASH,DE_DLR, DE_LPRN,DE_RPRN,DE_GRV, + KC_TRNS,DE_PERC,DE_CIRC,DE_LBRC,DE_RBRC,DE_TILD,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, DE_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, DE_PLUS, KC_TRNS, + KC_TRNS, DE_AMPR, KC_1, KC_2, KC_3, DE_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, DE_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | Lclk | MsUp | Rclk | | | | | |VolDwn| Mute |VolUp | | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | Btn4 |MsLeft|MsDown|MsRght| Btn5 |------| |------| | Prev | Stop | Play | Next | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | |WhRght|WhDown| WhUp |WhLeft|WhClk | | | |BwSrch|BwBack|BwHome|BwRefr|BwFwd | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | |MsAcl0|MsAcl1|MsAcl2| | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | |Brwser|Brwser| + * | Lclk | Rclk |------| |------|Back |Forwd | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MDIA] = KEYMAP( + // left hand + KC_TRNS, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_TRNS, + KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, + KC_TRNS, KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5, + KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, KC_BTN3, KC_TRNS, + KC_TRNS, KC_TRNS, KC_ACL0, KC_ACL1, KC_ACL2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_BTN1, KC_BTN2, KC_TRNS, + // right hand + KC_TRNS, KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11, + KC_TRNS, KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_F12, + KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS, + KC_TRNS, KC_WSCH, KC_WBAK, KC_WHOM, KC_WREF, KC_WFWD, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_WBAK, KC_WFWD +), + +/* Keymap 3: Linux shortcuts + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | |LCA-F1|LCA-F2|LCA-F3|LCA-F4|LCA-F5| | | |LCA-F6|LCA-F7|LCA-F8|LCA-F9| | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |LCA-Le| |LCA-Ri| |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | |LCA-Le|LCA-Ri| | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// Shortcuts +[SHRT] = KEYMAP( + // left hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, LCA(KC_F1), LCA(KC_F2), LCA(KC_F3), LCA(KC_F4), LCA(KC_F5), KC_TRNS, + KC_TRNS, KC_TRNS, LCA(KC_LEFT), KC_TRNS, LCA(KC_RIGHT), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, LCA(KC_LEFT), LCA(KC_RIGHT), + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, LCA(KC_F6), LCA(KC_F7), LCA(KC_F8), LCA(KC_F9), KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + LCA(KC_UP), LCA(KC_DOWN), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case SYMB: + ergodox_right_led_1_on(); + break; + case MDIA: + ergodox_right_led_2_on(); + break; + case SHRT: + ergodox_right_led_3_on(); + break; + default: + ergodox_board_led_off(); + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/guni/keymap.c b/keyboards/ergodox/keymaps/guni/keymap.c new file mode 100644 index 00000000..9d9191f6 --- /dev/null +++ b/keyboards/ergodox/keymaps/guni/keymap.c @@ -0,0 +1,177 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "bootloader.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + KEYMAP( // layer 0 : default + // left hand + KC_EQL , KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC, + KC_FN25 , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, + KC_FN27 , KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_PGUP, + KC_LGUI , KC_GRV,KC_LEFT,KC_RGHT,KC_LALT, + KC_NO , KC_NO , + KC_NO , + KC_BSPC,KC_DEL ,KC_FN23, + // right hand + KC_RBRC , KC_6, KC_7 , KC_8, KC_9, KC_0, KC_MINS, + KC_END , KC_Y, KC_U , KC_I, KC_O, KC_P, KC_FN28, + KC_H , KC_J, KC_K , KC_L, KC_SCLN,KC_FN30, + KC_PGDN , KC_N, KC_M , KC_COMM,KC_DOT, KC_SLSH,KC_FN29, + KC_RALT , KC_DOWN,KC_UP, KC_NO ,KC_RGUI, + KC_NO , KC_NO, + KC_NO , + KC_FN29,KC_ENT ,KC_SPC + ), + + KEYMAP( // layer 1 : function and symbol keys + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, + KC_TRNS,KC_AT,KC_UNDS ,KC_LBRC,KC_RBRC,KC_CIRC ,KC_TRNS, + KC_TRNS,KC_BSLS,KC_SLSH,KC_LCBR ,KC_RCBR ,KC_ASTR, + KC_TRNS,KC_HASH ,KC_DLR ,KC_PIPE ,KC_TILD ,KC_GRV ,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1, + // right hand + KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS,KC_EXLM,LSFT(KC_COMM),LSFT(KC_DOT),KC_EQL,KC_AMPR, KC_TRNS, + LSFT(KC_SLSH),KC_LPRN,KC_RPRN,KC_MINS,LSFT(KC_SCLN),KC_TRNS, + KC_TRNS,KC_PLUS,LSFT(KC_5),LSFT(KC_QUOT),KC_QUOT,KC_SCLN,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + KEYMAP( // layer 2: navigation + // left hand + KC_NO,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_PGUP,KC_HOME,KC_UP ,KC_END,KC_NO ,KC_TRNS, + KC_TRNS,KC_PGDN,KC_LEFT,KC_DOWN,KC_RGHT,KC_NO, + KC_TRNS,KC_NO, KC_NO, KC_NO, KC_NO,KC_NO,KC_NO, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // right hand + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS ,KC_TRNS, KC_HOME, KC_TRNS, KC_TRNS, KC_END ,KC_TRNS, + KC_NO, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT,KC_TRNS, + KC_TRNS,KC_TRNS, KC_HOME, KC_UP, KC_END, KC_PGUP,KC_TRNS, + KC_LEFT, KC_DOWN,KC_RGHT,KC_PGDN,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + KEYMAP( // layer 3 : teensy bootloader functions + // left hand + KC_FN0, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // right hand + KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + + KEYMAP( // layer 4: numpad + // left hand + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS,KC_NLCK,KC_PSLS,KC_PAST,KC_PAST,KC_PMNS,KC_BSPC, + KC_TRNS,KC_NO, KC_P7, KC_P8, KC_P9, KC_PMNS,KC_BSPC, + KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS,KC_PENT, + KC_TRNS,KC_NO, KC_P1, KC_P2, KC_P3, KC_PPLS,KC_PENT, + KC_P0, KC_PDOT,KC_SLSH,KC_PENT,KC_PENT, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + +}; + +/* id for user defined functions */ +enum function_id { + TEENSY_KEY, +}; + +/* + * Fn action definition + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key + [1] = ACTION_LAYER_SET(0, ON_PRESS), + //[11] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), + //[12] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), + + //[14] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), + //[17] = ACTION_MODS_KEY(MOD_LSFT, KC_SCLN), + //[20] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + //[21] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), + [23] = ACTION_LAYER_SET(3, ON_PRESS), + [24] = ACTION_LAYER_SET(2, ON_PRESS), + [25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_TAB), + [26] = ACTION_LAYER_SET(1, ON_PRESS), + [27] = ACTION_LAYER_TAP_KEY(1, KC_CAPS), + [28] = ACTION_MODS_TAP_KEY(MOD_RCTL,KC_BSLS), + //[29] = ACTION_LAYER_TOGGLE(4), + [29] = ACTION_MODS_TAP_KEY(MOD_RSFT,KC_ESC), + [30] = ACTION_LAYER_TAP_KEY(1, KC_QUOT), + [31] = ACTION_LAYER_MOMENTARY(2), + //[] = ACTION_LAYER_TAP_KEY(4, KC_S), +}; + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + + +void action_function(keyrecord_t *event, uint8_t id, uint8_t opt) +{ + + if (id == TEENSY_KEY) { + clear_keyboard(); + print("\n\nJump to bootloader... "); + wait_ms(250); + bootloader_jump(); // should not return + print("not supported.\n"); + } +} diff --git a/keyboards/ergodox/keymaps/guni/readme.txt b/keyboards/ergodox/keymaps/guni/readme.txt new file mode 100644 index 00000000..93ae5f05 --- /dev/null +++ b/keyboards/ergodox/keymaps/guni/readme.txt @@ -0,0 +1,133 @@ +My main layout (Layer 0) is based on qwerty. I tried to fit the layout of the kinesis keyboard onto the ergodox. Furthermore I did some tweaks. +The other layers are seldom used. Except the F Keys and the teensy key. As I own a ergodox I cant press the reset button, so i need a key to send the teensy into reprogram mode. +There is a layer with symbols a numpad. These layers are seldom used. Except the F Keys and the teensy key. As I own a ergodox I need a key to reprogram, because I can't access the reset button. + +I am a linux user and need the esc key and str keys often therefore it is easyly accessed. Switching console str+alt+tab+f2 (layer 2 and 2) is tricky but you get it after a while. +As I live in germany and need to type umlaut frquently, i mapped the CAPS to the meta key, and swapped ' and ". So I can type ö with CAPS o + ¨. no need to press o+SHIFT+' +As a note for linux users i use str+p to get last command, instead of using the cursor keys. + +HOWTO to convert CAPS to Meta-Key and swap ' with " + +* create file with following content +.Xmodmap + clear Lock + keycode 48 = quotedbl apostrophe quotedbl apostrophe + keycode 66 = Multi_key + +* apply with +xmodmap .Xmodmap + +* convert to xkbmap +xkbcomp $DISPLAY $HOME/.xkbmap + +* automatic startup each time you startup x +echo 'xkbcomp $HOME/.xkbmap $DISPLAY' >> ~/.xinitrc + + KEYMAP( // layer 0 : default + // left hand + KC_EQL , KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC, + KC_FN25 , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, + KC_FN27 , KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_PGUP, + KC_LGUI , KC_GRV,KC_LEFT,KC_RGHT,KC_LALT, + KC_NO , KC_NO , + KC_NO , + KC_BSPC,KC_DEL ,KC_FN23, + // right hand + KC_RBRC , KC_6, KC_7 , KC_8, KC_9, KC_0, KC_MINS, + KC_END , KC_Y, KC_U , KC_I, KC_O, KC_P, KC_FN28, + KC_H , KC_J, KC_K , KC_L, KC_SCLN,KC_FN30, + KC_PGDN , KC_N, KC_M , KC_COMM,KC_DOT, KC_SLSH,KC_FN29, + KC_RALT , KC_DOWN,KC_UP, KC_NO ,KC_RGUI, + KC_NO , KC_NO, + KC_NO , + KC_FN29,KC_ENT ,KC_SPC + ), + + KEYMAP( // layer 1 : function and symbol keys + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, + KC_TRNS,KC_AT,KC_UNDS ,KC_LBRC,KC_RBRC,KC_CIRC ,KC_TRNS, + KC_TRNS,KC_BSLS,KC_SLSH,KC_LCBR ,KC_RCBR ,KC_ASTR, + KC_TRNS,KC_HASH ,KC_DLR ,KC_PIPE ,KC_TILD ,KC_GRV ,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1, + // right hand + KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS,KC_EXLM,LSFT(KC_COMM),LSFT(KC_DOT),KC_EQL,KC_AMPR, KC_TRNS, + LSFT(KC_SLSH),KC_LPRN,KC_RPRN,KC_MINS,LSFT(KC_SCLN),KC_TRNS, + KC_TRNS,KC_PLUS,LSFT(KC_5),LSFT(KC_QUOT),KC_QUOT,KC_SCLN,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + KEYMAP( // layer 2: navigation + // left hand + KC_NO,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_PGUP,KC_HOME,KC_UP ,KC_END,KC_NO ,KC_TRNS, + KC_TRNS,KC_PGDN,KC_LEFT,KC_DOWN,KC_RGHT,KC_NO, + KC_TRNS,KC_NO, KC_NO, KC_NO, KC_NO,KC_NO,KC_NO, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // right hand + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS ,KC_TRNS, KC_HOME, KC_TRNS, KC_TRNS, KC_END ,KC_TRNS, + KC_NO, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT,KC_TRNS, + KC_TRNS,KC_TRNS, KC_HOME, KC_UP, KC_END, KC_PGUP,KC_TRNS, + KC_LEFT, KC_DOWN,KC_RGHT,KC_PGDN,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + KEYMAP( // layer 3 : teensy bootloader functions + // left hand + KC_FN0, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // right hand + KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + + KEYMAP( // layer 4: numpad + // left hand + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS,KC_NLCK,KC_PSLS,KC_PAST,KC_PAST,KC_PMNS,KC_BSPC, + KC_TRNS,KC_NO, KC_P7, KC_P8, KC_P9, KC_PMNS,KC_BSPC, + KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS,KC_PENT, + KC_TRNS,KC_NO, KC_P1, KC_P2, KC_P3, KC_PPLS,KC_PENT, + KC_P0, KC_PDOT,KC_SLSH,KC_PENT,KC_PENT, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + +}; + + diff --git a/keyboards/ergodox/keymaps/ishigoya-jp/img/keyboard-layout-enL.png b/keyboards/ergodox/keymaps/ishigoya-jp/img/keyboard-layout-enL.png new file mode 100755 index 00000000..e6aec35b Binary files /dev/null and b/keyboards/ergodox/keymaps/ishigoya-jp/img/keyboard-layout-enL.png differ diff --git a/keyboards/ergodox/keymaps/ishigoya-jp/img/keyboard-layout-jpL.png b/keyboards/ergodox/keymaps/ishigoya-jp/img/keyboard-layout-jpL.png new file mode 100755 index 00000000..69a1f694 Binary files /dev/null and b/keyboards/ergodox/keymaps/ishigoya-jp/img/keyboard-layout-jpL.png differ diff --git a/keyboards/ergodox/keymaps/ishigoya-jp/img/keyboard-layout-numL.png b/keyboards/ergodox/keymaps/ishigoya-jp/img/keyboard-layout-numL.png new file mode 100755 index 00000000..8b2cce5e Binary files /dev/null and b/keyboards/ergodox/keymaps/ishigoya-jp/img/keyboard-layout-numL.png differ diff --git a/keyboards/ergodox/keymaps/ishigoya-jp/keymap.c b/keyboards/ergodox/keymaps/ishigoya-jp/keymap.c new file mode 100644 index 00000000..c219ce88 --- /dev/null +++ b/keyboards/ergodox/keymaps/ishigoya-jp/keymap.c @@ -0,0 +1,962 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "keymap_jp.h" + +static uint16_t start; + +#define BASE 0 // EN layer +#define JP 1 // Japanese +#define JPXON 2 // JP + Fn +#define JPKAZARI 3 // JP + KAZARI +#define JPTOPROW 4 // JP + TOPROW +#define JPTRKZ 5 // JP + TOPROW + KAZARI +#define NUM 6 // Numbers + +#define CTLSHFT 1 +#define CUTCOPY 2 + +//kana macro definitions start here + +#define JPVU 4 +#define JPNU 6 +#define JPKO 7 +#define JPSA 8 +#define JPKE 9 +#define JPHE 10 +#define JPSHI 11 +#define JPKA 12 +#define JPKI 13 +#define JPSU 14 +#define JPSO 15 +#define JPHI 16 +#define JPCHI 17 +#define JPFU 18 +#define JPSE 19 +#define JPTSU 20 +#define JPKU 21 +#define JPTE 22 +#define JPTA 23 +#define JPTO 24 +#define JPHA 25 +#define JPHO 26 +#define JPXKE 27 +#define JPXU 28 +#define JPXKA 29 +#define JPXA 30 +#define JPXO 31 +#define JPGO 32 +#define JPZA 33 +#define JPGE 34 +#define JPBE 35 +#define JPYU 36 +#define JPJI 37 +#define JPGA 38 +#define JPGI 39 +#define JPZU 40 +#define JPZO 41 +#define JPBI 42 +#define JPDI 43 +#define JPZE 44 +#define JPDU 45 +#define JPGU 46 +#define JPYA 47 +#define JPYO 48 +#define JPDE 49 +#define JPDA 50 +#define JPDO 51 +#define JPBA 52 +#define JPBO 53 +#define JPRI 54 +#define JPRE 55 +#define JPRA 56 +#define JPNA 57 +#define JPNO 58 +#define JPMI 59 +#define JPMU 60 +#define JPME 61 +#define JPNE 62 +#define JPMA 63 +#define JPXTU 64 +#define JPWA 65 +#define JPRU 66 +#define JPWO 67 +#define JPNI 68 +#define JPNN 69 +#define JPMO 70 +#define JPRO 71 +#define JPXE 72 +#define JPXI 73 +#define JPXYU 74 +#define JPXYA 75 +#define JPXYO 76 +#define JPPE 77 +#define JPPU 78 +#define JPPI 79 +#define JPPA 80 +#define JPPO 81 +#define JPBU 82 + +// kana macro definitions end here + +#define SHIFT 86 +#define KAZARI 87 +#define JPFN 88 //shifts to JPXON layer +#define TOJPLOUT 89 +#define TOENL 90 +#define TOJPL 91 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * + * ,----------------------------------------------------. ,--------------------------------------------------. + * | En / å’Œ | | ^ | % | | |Selall| | Undo | | $ | @ | LT | UP | RT | + * |----------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | D | R | W | B | Cut | | PgUP | J | F | U | P | DN | \ | + * |----------+------+------+------+------+------| Copy | | |------+------+------+------+------+--------| + * | / | A | S | H | T | G |------| |------| Y | N | E | O | I | , | + * |----------+------+------+------+------+------|Paste | | PgDN |------+------+------+------+------+--------| + * | Ctl+Shft | Z | X | M | C | V | | | | . | L | K | ' | ? | tmux | + * `----------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LCtrl | LGui | Alt| _ | Esc | |MouseL|MouseR| - | ~ | Ctrl | + * `------------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * |MidMs | Del | | VolUp| Mute | + * ,------|------|------| |------+--------+------. + * | | | | | VolDn| | | + * | Space| Shift|------| |------| Backsp |Enter | + * | | | Num | | Esc | | | + * `--------------------' `----------------------' + * + * + * tmux prefix set to C-b + * + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + M(TOJPLOUT), KC_NO, KC_EQL, LSFT(KC_5), KC_NO, KC_NO, LCTL(KC_A), + KC_TAB, KC_Q, KC_D, KC_R, KC_W, KC_B, M(CUTCOPY), + KC_SLSH, KC_A, KC_S, KC_H, KC_T, KC_G, + M(CTLSHFT), KC_Z, KC_X, KC_M, KC_C, KC_V, LCTL(KC_V), + KC_RCTL, KC_LGUI, KC_LALT,JP_UNDS,KC_LCTL, + KC_BTN3, KC_DEL, + KC_NO, + KC_SPC,KC_LSFT,F(1), + // right hand + LCTL(KC_Z), KC_NO, LSFT(KC_4), JP_AT, KC_LEFT, KC_UP, KC_RIGHT, + KC_PGUP, KC_J, KC_F, KC_U, KC_P, KC_DOWN, LSFT(KC_3), + KC_Y, KC_N, KC_E, KC_O, KC_I, KC_COMMA, + KC_PGDN, KC_DOT, KC_L, KC_K, LSFT(KC_7), KC_QUES, LCTL(KC_B), + KC_BTN1, KC_BTN2,KC_MINS,JP_TILD, KC_RCTL, + KC_VOLU, KC_MUTE, + KC_VOLD, + KC_SPC,KC_BSLS, KC_ENT + ), +/* Keymap 1: Japanese + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | En / å’Œ| | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | |   nu | ko | sa | he | ke | | | | fu | se | tsu | ku | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | to | shi | ka | ki | su |------| |------| a | ha | te | ta | u | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | mu | so | hi | chi | me | | | | | ma | ho | i | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | shift| fn |------| |------| |kazari| + * | | | Num | | | | | + * `--------------------' `--------------------' + * + * + * + */ +[JP] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, M(JPNU), M(JPKO), M(JPSA), M(JPHE), M(JPKE), KC_TRNS, + KC_TRNS, M(JPTO), M(JPSHI), M(JPKA), M(JPKI), M(JPSU), + KC_TRNS, M(JPMU), M(JPSO), M(JPHI), M(JPCHI), M(JPME), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_NO, + M(SHIFT), M(JPFN), F(1), + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, M(JPFU), M(JPSE), M(JPTSU), M(JPKU), KC_TRNS, KC_TRNS, + KC_A, M(JPHA), M(JPTE), M(JPTA), KC_U, KC_TRNS, + KC_TRNS, KC_TRNS, M(JPMA), M(JPHO), KC_I, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,M(KAZARI) +), +/* Keymap 2: Japanese with Fn + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | |   | xe | | | xke | | | | xya | | xtsu | xo | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | xka | | |------| |------| xa | xyo | | | xu | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | xi | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + * + * + * + */ +[JPXON] = KEYMAP( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, M(JPXE), KC_NO, M(JPXKE), KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, M(JPXKA), KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_TRNS, KC_TRNS, + // right hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, M(JPXYA), KC_NO, M(JPXTU), M(JPXO), KC_NO, KC_NO, + M(JPXA), M(JPXYO), M(JPXYU), KC_NO, M(JPXU), KC_NO, + KC_NO, KC_NO,KC_NO, KC_NO, M(JPXI), KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_NO +), +/* Keymap 3: Japanese with kazari + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | |   | go | za | be | ge | | | | bu | ze | du | gu | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | do | ji | ga | gi | zu |------| |------| | ba | de | da | vu | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | zo | bi | di | | | | | | | bo | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + * + * + * + */ +[JPKAZARI] = KEYMAP( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, M(JPGO), M(JPZA), M(JPBE), M(JPGE), KC_NO, + KC_NO, M(JPDO), M(JPJI), M(JPGA), M(JPGI), M(JPZU), + KC_NO, KC_NO, M(JPZO), M(JPBI), M(JPDI), KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + M(SHIFT), KC_NO, KC_TRNS, + // right hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, M(JPBU), M(JPZE), M(JPDU), M(JPGU), KC_NO, KC_NO, + KC_NO, M(JPBA), M(JPDE), M(JPDA), M(JPVU), KC_NO, + KC_NO, KC_NO, KC_NO, M(JPBO), KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_TRNS +), +/* Keymap 4: Japanese with Toprow + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | |   | e | - | re | | | | | ya | ne | ru | o | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | ra | ri | na | no | mi |------| |------| wa | yo | yu | ni | nn | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | mo | ro | wo | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + * + * + * + */ +[JPTOPROW] = KEYMAP( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_E, KC_MINS, M(JPRE), KC_NO, KC_NO, + KC_NO, M(JPRA), M(JPRI), M(JPNA), M(JPNO), M(JPMI), + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_TRNS, KC_NO, KC_NO, + // right hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, M(JPYA), M(JPNE), M(JPRU), KC_O, KC_NO, KC_NO, + M(JPWA), M(JPYO), M(JPYU), M(JPNI), M(JPNN), KC_NO, + KC_NO, KC_NO, M(JPMO), M(JPRO), M(JPWO), KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, M(KAZARI) +), + +/* Keymap 5: Japanese with Toprow and Kazari + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | |   | | | pe | | | | | pu | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |------| |------| | pa | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | pi | | | | | | | | po | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + * + * + * + */ +[JPTRKZ] = KEYMAP( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, M(JPPE),KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, M(JPPI), KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_TRNS, KC_NO, KC_NO, + // right hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, M(JPPU), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, M(JPPA), KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, M(JPPO), KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_TRNS +), +/* Keymap 6: Number Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | " | [ | ] | | | | | % | 7 | 8 | 9 | | F12 | + * |--------+------+------+------+------+------| ; | | |------+------+------+------+------+--------| + * | | | / | + | { | } |------| |------| ! | 4 | 5 | 6 | 0 | , | + * |--------+------+------+------+------+------| : | | & |------+------+------+------+------+--------| + * | | | * | - | ( | ) | | | | . | 1 | 2 | 3 | ? | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | # | | < | = | > | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| Back | Ent | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// Numbers +[NUM] = KEYMAP( + // left hand + KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_NO, + KC_NO, KC_NO, KC_NO, JP_DQT, KC_RBRACKET, KC_BSPC, KC_SCLN, + KC_NO, KC_NO, KC_SLSH, JP_PLUS, LSFT(KC_RBRACKET), JP_RCBR, + KC_NO, KC_NO, JP_ASTR, KC_MINS, LSFT(KC_8), LSFT(KC_9), JP_COLN, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_HASH, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_TRNS, + // right hand + KC_NO, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + LSFT(KC_JYEN), KC_PERC, KC_7, KC_8, KC_9, KC_NO, KC_F12, + KC_EXLM, KC_4, KC_5, KC_6, KC_0, KC_COMM, + LSFT(KC_6), KC_DOT, KC_1, KC_2, KC_3, KC_QUES, KC_NO, + KC_LT,JP_EQL, KC_GT, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_SPC, KC_BSLS, KC_DOT +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(NUM) // FN1 - Momentary Layer 6 (Numbers) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + + // MACRO only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + case CTLSHFT: + if (record->event.pressed) { + return MACRO( D(LSFT), D(LCTL), END); + } else { + return MACRO( U(LSFT), U(LCTL), END); + } + break; + case CUTCOPY: + if (record->event.pressed) { + start = timer_read(); + } else { + if (timer_elapsed(start) > 150) { + return MACRO( D(LCTL), T(X), U(LCTL), END); + } else { + return MACRO( D(LCTL), T(C), U(LCTL), END); + } + } + break; + + // kana macros start here + + case JPVU: + if (record->event.pressed) { + return MACRO( I(1), T(V), T(U), END); + } + break; + case JPNU: + if (record->event.pressed) { + return MACRO( I(1), T(N), T(U), END); + } + break; + case JPKO: + if (record->event.pressed) { + return MACRO( I(1), T(K), T(O), END); + } + break; + case JPSA: + if (record->event.pressed) { + return MACRO( I(1), T(S), T(A), END); + } + break; + case JPKE: + if (record->event.pressed) { + return MACRO( I(1), T(K), T(E), END); + } + break; + case JPHE: + if (record->event.pressed) { + return MACRO( I(1), T(H), T(E), END); + } + break; + case JPSHI: + if (record->event.pressed) { + return MACRO( I(1), T(S), T(I), END); + } + break; + case JPKA: + if (record->event.pressed) { + return MACRO( I(1), T(K), T(A), END); + } + break; + case JPKI: + if (record->event.pressed) { + return MACRO( I(1), T(K), T(I), END); + } + break; + case JPSU: + if (record->event.pressed) { + return MACRO( I(1), T(S), T(U), END); + } + break; + case JPSO: + if (record->event.pressed) { + return MACRO( I(1), T(S), T(O), END); + } + break; + case JPHI: + if (record->event.pressed) { + return MACRO( I(1), T(H), T(I), END); + } + break; + case JPCHI: + if (record->event.pressed) { + return MACRO( I(1), T(T), T(I), END); + } + break; + case JPFU: + if (record->event.pressed) { + return MACRO( I(1), T(F), T(U), END); + } + break; + case JPSE: + if (record->event.pressed) { + return MACRO( I(1), T(S), T(E), END); + } + break; + case JPTSU: + if (record->event.pressed) { + return MACRO( I(1), T(T), T(U), END); + } + break; + case JPKU: + if (record->event.pressed) { + return MACRO( I(1), T(K), T(U), END); + } + break; + case JPTE: + if (record->event.pressed) { + return MACRO( I(1), T(T), T(E), END); + } + break; + case JPTA: + if (record->event.pressed) { + return MACRO( I(1), T(T), T(A), END); + } + break; + case JPTO: + if (record->event.pressed) { + return MACRO( I(1), T(T), T(O), END); + } + break; + case JPHA: + if (record->event.pressed) { + return MACRO( I(1), T(H), T(A), END); + } + break; + case JPHO: + if (record->event.pressed) { + return MACRO( I(1), T(H), T(O), END); + } + break; + case JPXKE: + if (record->event.pressed) { + return MACRO( I(1), T(X), T(K), T(E), END); + } + break; + case JPXU: + if (record->event.pressed) { + return MACRO( I(1), T(X), T(U), END); + } + break; + case JPXKA: + if (record->event.pressed) { + return MACRO( I(1), T(X), T(K), T(A), END); + } + break; + case JPXA: + if (record->event.pressed) { + return MACRO( I(1), T(X), T(A), END); + } + break; + case JPXO: + if (record->event.pressed) { + return MACRO( I(1), T(X), T(O), END); + } + break; + case JPGO: + if (record->event.pressed) { + return MACRO( I(1), T(G), T(O), END); + } + break; + case JPZA: + if (record->event.pressed) { + return MACRO( I(1), T(Z), T(A), END); + } + break; + case JPGE: + if (record->event.pressed) { + return MACRO( I(1), T(G), T(E), END); + } + break; + case JPBE: + if (record->event.pressed) { + return MACRO( I(1), T(B), T(E), END); + } + break; + case JPYU: + if (record->event.pressed) { + return MACRO( I(1), T(Y), T(U), END); + } + break; + case JPJI: + if (record->event.pressed) { + return MACRO( I(1), T(J), T(I), END); + } + break; + case JPGA: + if (record->event.pressed) { + return MACRO( I(1), T(G), T(A), END); + } + break; + case JPGI: + if (record->event.pressed) { + return MACRO( I(1), T(G), T(I), END); + } + break; + case JPZU: + if (record->event.pressed) { + return MACRO( I(1), T(Z), T(U), END); + } + break; + case JPZO: + if (record->event.pressed) { + return MACRO( I(1), T(Z), T(O), END); + } + break; + case JPBI: + if (record->event.pressed) { + return MACRO( I(1), T(B), T(I), END); + } + break; + case JPDI: + if (record->event.pressed) { + return MACRO( I(1), T(D), T(I), END); + } + break; + case JPZE: + if (record->event.pressed) { + return MACRO( I(1), T(Z), T(E), END); + } + break; + case JPDU: + if (record->event.pressed) { + return MACRO( I(1), T(D), T(U), END); + } + break; + case JPGU: + if (record->event.pressed) { + return MACRO( I(1), T(G), T(U), END); + } + break; + case JPYA: + if (record->event.pressed) { + return MACRO( I(1), T(Y), T(A), END); + } + break; + case JPYO: + if (record->event.pressed) { + return MACRO( I(1), T(Y), T(O), END); + } + break; + case JPDE: + if (record->event.pressed) { + return MACRO( I(1), T(D), T(E), END); + } + break; + case JPDA: + if (record->event.pressed) { + return MACRO( I(1), T(D), T(A), END); + } + break; + case JPDO: + if (record->event.pressed) { + return MACRO( I(1), T(D), T(O), END); + } + break; + case JPBA: + if (record->event.pressed) { + return MACRO( I(1), T(B), T(A), END); + } + break; + case JPBO: + if (record->event.pressed) { + return MACRO( I(1), T(B), T(O), END); + } + break; + case JPRI: + if (record->event.pressed) { + return MACRO( I(1), T(R), T(I), END); + } + break; + case JPRE: + if (record->event.pressed) { + return MACRO( I(1), T(R), T(E), END); + } + break; + case JPRA: + if (record->event.pressed) { + return MACRO( I(1), T(R), T(A), END); + } + break; + case JPNA: + if (record->event.pressed) { + return MACRO( I(1), T(N), T(A), END); + } + break; + case JPNO: + if (record->event.pressed) { + return MACRO( I(1), T(N), T(O), END); + } + break; + case JPMI: + if (record->event.pressed) { + return MACRO( I(1), T(M), T(I), END); + } + break; + case JPMU: + if (record->event.pressed) { + return MACRO( I(1), T(M), T(U), END); + } + break; + case JPME: + if (record->event.pressed) { + return MACRO( I(1), T(M), T(E), END); + } + break; + case JPNE: + if (record->event.pressed) { + return MACRO( I(1), T(N), T(E), END); + } + break; + case JPMA: + if (record->event.pressed) { + return MACRO( I(1), T(M), T(A), END); + } + break; + case JPXTU: + if (record->event.pressed) { + return MACRO( I(1), T(X), T(T), T(U), END); + } + break; + case JPWA: + if (record->event.pressed) { + return MACRO( I(1), T(W), T(A), END); + } + break; + case JPRU: + if (record->event.pressed) { + return MACRO( I(1), T(R), T(U), END); + } + break; + case JPWO: + if (record->event.pressed) { + return MACRO( I(1), T(W), T(O), END); + } + break; + case JPNI: + if (record->event.pressed) { + return MACRO( I(1), T(N), T(I), END); + } + break; + case JPNN: + if (record->event.pressed) { + return MACRO( I(1), T(N), T(N), END); + } + break; + case JPMO: + if (record->event.pressed) { + return MACRO( I(1), T(M), T(O), END); + } + break; + case JPRO: + if (record->event.pressed) { + return MACRO( I(1), T(R), T(O), END); + } + break; + case JPXE: + if (record->event.pressed) { + return MACRO( I(1), T(X), T(E), END); + } + break; + case JPXI: + if (record->event.pressed) { + return MACRO( I(1), T(X), T(I), END); + } + break; + case JPXYU: + if (record->event.pressed) { + return MACRO( I(1), T(X), T(Y), T(U), END); + } + break; + case JPXYA: + if (record->event.pressed) { + return MACRO( I(1), T(X), T(Y), T(A), END); + } + break; + case JPXYO: + if (record->event.pressed) { + return MACRO( I(1), T(X), T(Y), T(O), END); + } + break; + case JPPE: + if (record->event.pressed) { + return MACRO( I(1), T(P), T(E), END); + } + break; + case JPPU: + if (record->event.pressed) { + return MACRO( I(1), T(P), T(U), END); + } + break; + case JPPI: + if (record->event.pressed) { + return MACRO( I(1), T(P), T(I), END); + } + break; + case JPPA: + if (record->event.pressed) { + return MACRO( I(1), T(P), T(A), END); + } + break; + case JPPO: + if (record->event.pressed) { + return MACRO( I(1), T(P), T(O), END); + } + break; + case JPBU: + if (record->event.pressed) { + return MACRO( I(1), T(B), T(U), END); + } + break; + + // kana macros end here + + break; + case SHIFT: + if (record->event.pressed) { + start = timer_read(); + if (layer_state == (1<event.pressed) { + start = timer_read(); + if (layer_state == (1<event.pressed) { + start = timer_read(); + layer_state = (1<event.pressed) { + if (default_layer_state == (1<event.pressed) { + default_layer_state = (1<event.pressed) { + default_layer_state = (1<event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + break; + case 1: + if (record->event.pressed) { // For resetting EEPROM + eeconfig_init(); + } + break; + } + return MACRO_NONE; +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + // dynamically generate these. + case EPRM: + if (record->event.pressed) { + eeconfig_init(); + } + return false; + break; + case VRSN: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + return false; + break; + case RGB_SLD: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode(1); + #endif + } + return false; + break; + } + return true; +} + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/italian/readme.md b/keyboards/ergodox/keymaps/italian/readme.md new file mode 100644 index 00000000..215c24a5 --- /dev/null +++ b/keyboards/ergodox/keymaps/italian/readme.md @@ -0,0 +1,72 @@ +# ErgoDox Italian layout + +## Layer 0 +``` + + ,--------------------------------------------------. ,--------------------------------------------------. + | \ | 1 | 2 | 3 | 4 | 5 | ESC | | T2 | 6 | 7 | 8 | 9 | 0 | ' | + |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + | Tab | Q | W | E | R | T | TT1 | | TT1 | Y | U | I | O | P | è | + |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + | Caps | A | S | D | F | G |------| |------| H | J | K | L | ò | à | + |--------+------+------+------+------+------| Alt | | Alt |------+------+------+------+------+--------| + | LShift | Z | X | C | V | B | | | | N | M | , | . | ù |-/RShift| + `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + |event.pressed) { // For resetting EEPROM + eeconfig_init(); + } + break; + case 2: + if (record->event.pressed) { // For resetting EEPROM + api_send_unicode(0x0CA0); + } + break; } return MACRO_NONE; }; diff --git a/keyboards/ergodox/keymaps/josh/keymap.c b/keyboards/ergodox/keymaps/josh/keymap.c index b5463873..da887fc6 100644 --- a/keyboards/ergodox/keymaps/josh/keymap.c +++ b/keyboards/ergodox/keymaps/josh/keymap.c @@ -8,15 +8,16 @@ #define MDIA 2 // media keys //macros -#define CTL_SFT_T 100 -#define CTL_SFT_G 101 -#define CTL_ALT_H 102 +#define CTL_SFT_T 100 // open type +#define CTL_SFT_G 101 // find references +#define CTL_ALT_H 102 // open call hierarchy +#define CTL_SFT_R 103 // open resource const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 0: Basic layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | = | 1 | 2 | 3 | 4 | 5 | ESC | | M 100| 6 | 7 | 8 | 9 | 0 | - | + * | = | 1 | 2 | 3 | 4 | 5 | ESC | |M100/3| 6 | 7 | 8 | 9 | 0 | - | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * |TAB /Alt| Q | W | E | R | T | Meh | | Meh | Y | U | I | O | P |\ / ALT | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -38,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [BASE] = KEYMAP( // layer 0 : default // left hand - KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, + LT(MDIA, KC_EQL),KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, ALT_T(KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, ALL_T(KC_NO), KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(SYMB), @@ -47,11 +48,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_HOME, KC_SPC,KC_BSPC,KC_END, // right hand - M(CTL_SFT_T),KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - MEH_T(KC_NO),KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, - KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),CTL_T(KC_QUOT), - MO(SYMB), KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, - LALT(KC_LSFT),KC_LEFT,KC_DOWN,KC_UP, KC_RIGHT, + LT(M(CTL_SFT_T), + M(CTL_SFT_R)),KC_6, KC_7, KC_8, KC_9, KC_0, LT(MDIA, KC_MINS), + MEH_T(KC_NO), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN), CTL_T(KC_QUOT), + MO(SYMB), KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, + LALT(KC_LSFT),KC_LEFT,KC_DOWN,KC_UP, KC_RIGHT, KC_LALT, KC_CAPS, KC_PGUP, KC_PGDN,KC_DEL, KC_ENT @@ -101,7 +103,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 2: Media and mouse keys * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | | | | | | + * | | | | | | |RESET | |RESET | | | | | | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | | MsUp | | | | | | | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -121,7 +123,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ // MEDIA AND MOUSE [MDIA] = KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -130,7 +132,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, // right hand - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, @@ -172,6 +174,12 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } return MACRO(U(LCTL), U(LALT), END); break; + case CTL_SFT_R: + if (record->event.pressed) { + return MACRO(D(LCTL), D(LSFT), T(R), END); + } + return MACRO(U(LCTL), U(LSFT), END); + break; } return MACRO_NONE; }; diff --git a/keyboards/ergodox/keymaps/kristian/keymap.c b/keyboards/ergodox/keymaps/kristian/keymap.c new file mode 100644 index 00000000..e7e42432 --- /dev/null +++ b/keyboards/ergodox/keymaps/kristian/keymap.c @@ -0,0 +1,79 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" +#include "keymap_fr_ch.h" +#include "keymap_french.h" +#include "keymap_german.h" +#include "keymap_german_ch.h" +#include "keymap_nordic.h" +#include "keymap_norwegian.h" +#include "keymap_spanish.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + +[0] = KEYMAP(NO_LESS,KC_1,KC_2,KC_3,KC_4,KC_5,KC_BSPACE,KC_TAB,KC_Q,KC_W,KC_E,KC_R,KC_T,TG(1),KC_BSPACE,KC_A,KC_S,KC_D,KC_F,KC_G,SFT_T(NO_APOS),CTL_T(KC_Z),KC_X,KC_C,KC_V,KC_B,SFT_T(KC_EQUAL),MO(1),CTL_T(KC_GRAVE),KC_LGUI,KC_LEFT,KC_RIGHT,KC_ESCAPE,KC_CAPSLOCK,KC_HOME,KC_SPACE,KC_LGUI,KC_LALT,KC_DELETE,KC_6,KC_7,KC_8,KC_9,KC_0,NO_PLUS,TG(1),KC_Y,KC_U,KC_I,KC_O,KC_P,NO_AM,KC_H,KC_J,KC_K,KC_L,LT(2,NO_OSLH),NO_AE,SFT_T(KC_RBRC),KC_N,KC_M,KC_COMMA,KC_DOT,CTL_T(KC_SLASH),SFT_T(NO_APOS),KC_DOWN,KC_UP,NO_LPRN,NO_RPRN,MO(1),NO_QUOT,CTL_T(KC_ESCAPE),NO_APOS,KC_LALT,KC_LGUI,KC_ENTER), + +[1] = KEYMAP(M(0),KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_BSPACE,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_BSPACE,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_LSHIFT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_LCTL,KC_LGUI,KC_LEFT,KC_RIGHT,KC_ESCAPE,KC_TRANSPARENT,KC_HOME,KC_SPACE,KC_LGUI,KC_LALT,KC_DELETE,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_F11,KC_TRANSPARENT,KC_7,KC_8,KC_9,KC_TRANSPARENT,KC_TRANSPARENT,KC_F12,KC_4,KC_5,KC_6,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_0,KC_1,KC_2,KC_3,NO_LBRC,NO_RBRC,KC_LSHIFT,KC_COMMA,KC_DOT,LSFT(NO_LBRC),LSFT(NO_RBRC),KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_LALT,KC_LGUI,KC_ENTER), + +[2] = KEYMAP(KC_ESCAPE,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MS_UP,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MS_LEFT,KC_MS_DOWN,KC_MS_RIGHT,KC_TRANSPARENT,KC_LSHIFT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_LCTL,KC_LALT,KC_LGUI,KC_MS_BTN1,KC_MS_BTN2,KC_ESCAPE,KC_TRANSPARENT,KC_TRANSPARENT,KC_SPACE,KC_LGUI,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MEDIA_PREV_TRACK,KC_MEDIA_PLAY_PAUSE,KC_MEDIA_NEXT_TRACK,KC_TRANSPARENT,KC_TRANSPARENT,KC_AUDIO_VOL_UP,KC_AUDIO_VOL_DOWN,KC_AUDIO_MUTE,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_ESCAPE,KC_MS_WH_UP,KC_MS_WH_DOWN,KC_MS_ACCEL0,KC_MS_ACCEL1), + +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(1) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case 0: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + break; + } + return MACRO_NONE; +}; + +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + case 3: + ergodox_right_led_3_on(); + break; + case 4: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + break; + case 5: + ergodox_right_led_1_on(); + ergodox_right_led_3_on(); + break; + case 6: + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); + break; + case 7: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); + break; + default: + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/mclennon_osx/README.md b/keyboards/ergodox/keymaps/mclennon_osx/README.md index 60980d04..28cdb7c1 100644 --- a/keyboards/ergodox/keymaps/mclennon_osx/README.md +++ b/keyboards/ergodox/keymaps/mclennon_osx/README.md @@ -2,4 +2,4 @@ This keymapping is designed to be reasonably familiar to an ordinary Mac keyboard while taking advantage of the Ergodox EZ's features. Caps lock instead enables a layer which allows a user to use HJKL as arrow keys and to control media. Shift and control have additional mappings on S and D to provide easier access while holding down caps lock. -If you choose to compile this yourself, be sure to compile with `#define PREVENT_STUCK_MODIFIERS` in your `config.h`. Firmware built using [qmk_firmware](https://github.com/jackhumbert/qmk_firmware/). +If you choose to compile this yourself, be sure to compile with `#define PREVENT_STUCK_MODIFIERS` in your `config.h`. Firmware built using [qmk_firmware](https://github.com/qmk/qmk_firmware/). diff --git a/keyboards/ergodox/keymaps/neo2_on_qwertz_hardware/keymap.c b/keyboards/ergodox/keymaps/neo2_on_qwertz_hardware/keymap.c new file mode 100644 index 00000000..ab2464c4 --- /dev/null +++ b/keyboards/ergodox/keymaps/neo2_on_qwertz_hardware/keymap.c @@ -0,0 +1,408 @@ +#include "ergodox.h" +#include "action_layer.h" +#include "keymap_extras/keymap_german.h" + +#define UM 0 + +#define L0 0 // layer_0 +#define L1 1 // layer_1 +#define L2 2 // layer_2 +#define L3 3 // layer_3 +#define L4 4 // layer_4 +#define L5 5 // layer_5 +#define L6 6 // layer_6 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* + .------------------------------------.------------------------------------. + |ESC | 1 | 2 | 3 | 4 | 5 | ´ | ` | 6 | 7 | 8 | 9 | 0 | ^ | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + |TAB | X | V | L | C | W |Print| | K | H | G | F | Q | ß | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | Y | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + |LSFT | ü | ö | ä | P | Z |SPACE| | B | M | , | . | J |RSFT | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + |LCTL|LGUI|LALT|MO(3)|MO(2)| !MO(2)|MO(3)|APP |RALT|RCTL| + '------------------------' '------------------------' + .-----------. .-----------. + |VOL- |VOL+ | !MUTE |PLAY | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! |-----| !-----| ! ! + ! CTL ! ! ALT ! ! CTL ! ! ALT ! + |ENTER|MO(1)| TAB | !ESC |MO(1)|SPACE| + '-----------------' '-----------------' + */ +[L0] = KEYMAP( + KC_ESC, DE_1, DE_2, DE_3, DE_4, DE_5, DE_ACUT, + KC_TAB, DE_X, DE_V, DE_L, DE_C, DE_W, KC_PSCR, + MO(1), DE_U, DE_I, DE_A, DE_E, DE_O, + KC_LSFT, DE_UE, DE_OE, DE_AE, DE_P, DE_Z, KC_SPACE, + KC_LCTL, KC_LGUI, KC_LALT, MO(3), MO(2), + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLD, KC_VOLU, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ CTL_T(KC_ENTER), MO(1), ALT_T(KC_TAB), + DE_GRV, DE_6, DE_7, DE_8, DE_9, DE_0, DE_CIRC, + KC_TRNS, DE_K, DE_H, DE_G, DE_F, DE_Q, DE_SS, + /*-*/ DE_S, DE_N, DE_R, DE_T, DE_D, DE_Y, + KC_TRNS, DE_B, DE_M, DE_COMM, DE_DOT, DE_J, KC_RSFT, + /*-*/ /*-*/ MO(2), MO(3), KC_APP, KC_RALT, KC_RCTL, + KC_MUTE, KC_MPLY, + KC_TRNS, + CTL_T(KC_ESC), MO(1), ALT_T(KC_SPACE) +), +/* + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | | € | _ | [ | ] | | | | ! | < | > | = | & | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | \ | / | { | } | * |-----!-----! ? | ( | ) | - | : | @ | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | # | $ | | | ~ | | | | + | % | " | ' | ; | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' + */ +[L1] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, DE_EURO, DE_UNDS, DE_LBRC, DE_RBRC, KC_TRNS, KC_TRNS, + KC_TRNS, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, + KC_TRNS, DE_HASH, DE_DLR, DE_PIPE, DE_TILD, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, DE_EXLM, DE_LESS, DE_MORE, DE_EQL, DE_AMPR, KC_TRNS, + /*-*/ DE_QST, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, DE_AT, + KC_TRNS, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, KC_TRNS, + /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* + * .------------------------------------.------------------------------------. + * | | | | | | | | | | | | | | | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * | |PGUP|BSPC| UP |DEL |PGDN| | | | 7 | 8 | 9 | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | |HOME|LEFT|DOWN|RGHT|END |-----!-----! | 4 | 5 | 6 | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | |PREV|NEXT| | | | | 1 | 2 | 3 | | | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * | | | | | | ! | | | | | + * '------------------------' '------------------------' + * .-----------. .-----------. + * | | | ! | | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! ! !-----! !-----! ! ! + * | | | | ! | | 0 | + * '-----------------' '-----------------' + */ +[L2] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_TRNS, + KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, DE_7, DE_8, DE_9, KC_TRNS, KC_TRNS, + /*-*/ KC_TRNS, DE_4, DE_5, DE_6, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, DE_1, DE_2, DE_3, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, DE_0 +), +/* + * .------------------------------------.------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | | | | | | | | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * | | F7 | F8 | F9 | F10| F11| F12 | | |M_WU|M_CU|M_WD| | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * |M_B5 |M_B4|M_B3|M_B2|M_B1| |-----!-----! |M_CL|M_CD|M_CR| | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | |M_A2|M_A1|M_A0| | | | | | | | | | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * | | | | | | ! | | | | | + * '------------------------' '------------------------' + * .-----------. .-----------. + * | | | ! | | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! ! !-----! !-----! ! ! + * | | | | ! | | | + * '-----------------' '-----------------' + */ +[L3] = KEYMAP( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_BTN1, KC_TRNS, + KC_TRNS, KC_TRNS, KC_ACL2, KC_ACL1, KC_ACL0, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_WH_U, KC_MS_U, KC_WH_D, KC_TRNS, KC_TRNS, + /*-*/ KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* + * .------------------------------------.------------------------------------. + * | | | | | | | | | | | | | | | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * | | | | | | | | | | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | |-----!-----! | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | | | | | | | | | | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * | | | | | | ! | | | | | + * '------------------------' '------------------------' + * .-----------. .-----------. + * | | | ! | | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! ! !-----! !-----! ! ! + * | | | | ! | | | + * '-----------------' '-----------------' + */ +[L4] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* + * .------------------------------------.------------------------------------. + * | | | | | | | | | | | | | | | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * | | | | | | | | | | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | |-----!-----! | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | | | | | | | | | | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * | | | | | | ! | | | | | + * '------------------------' '------------------------' + * .-----------. .-----------. + * | | | ! | | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! ! !-----! !-----! ! ! + * | | | | ! | | | + * '-----------------' '-----------------' + */ +[L5] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* + * .------------------------------------.------------------------------------. + * | | | | | | | | | | | | | | | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * | | | | | | | | | | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | |-----!-----! | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | | | | | | | | | | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * | | | | | | ! | | | | | + * '------------------------' '------------------------' + * .-----------. .-----------. + * | | | ! | | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! ! !-----! !-----! ! ! + * | | | | ! | | | + * '-----------------' '-----------------' + */ +[L6] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +}; + +const uint16_t PROGMEM fn_actions[] = {}; + +#define UC_MODE_WIN 0 +#define UC_MODE_LINUX 1 +#define UC_MODE_OSX 2 + +// TODO: allow default mode to be configured +static uint16_t unicode_mode = UC_MODE_WIN; + +uint16_t hextokeycode(uint8_t hex) { + if (hex == 0x0) { + return KC_P0; + } + if (hex < 0xA) { + return KC_P1 + (hex - 0x1); + } + return KC_A + (hex - 0xA); +} + +void unicode_action_function(uint16_t hi, uint16_t lo) { + switch (unicode_mode) { + case UC_MODE_WIN: + register_code(KC_LALT); + + register_code(KC_PPLS); + unregister_code(KC_PPLS); + + register_code(hextokeycode((hi & 0xF0) >> 4)); + unregister_code(hextokeycode((hi & 0xF0) >> 4)); + register_code(hextokeycode((hi & 0x0F))); + unregister_code(hextokeycode((hi & 0x0F))); + register_code(hextokeycode((lo & 0xF0) >> 4)); + unregister_code(hextokeycode((lo & 0xF0) >> 4)); + register_code(hextokeycode((lo & 0x0F))); + unregister_code(hextokeycode((lo & 0x0F))); + + unregister_code(KC_LALT); + break; + case UC_MODE_LINUX: + register_code(KC_LCTL); + register_code(KC_LSFT); + + register_code(KC_U); + unregister_code(KC_U); + + register_code(hextokeycode((hi & 0xF0) >> 4)); + unregister_code(hextokeycode((hi & 0xF0) >> 4)); + register_code(hextokeycode((hi & 0x0F))); + unregister_code(hextokeycode((hi & 0x0F))); + register_code(hextokeycode((lo & 0xF0) >> 4)); + unregister_code(hextokeycode((lo & 0xF0) >> 4)); + register_code(hextokeycode((lo & 0x0F))); + unregister_code(hextokeycode((lo & 0x0F))); + + unregister_code(KC_LCTL); + unregister_code(KC_LSFT); + break; + case UC_MODE_OSX: + break; + } +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + if (!record->event.pressed) { + return MACRO_NONE; + } + // MACRODOWN only works in this function + switch(id) { + case UM: + unicode_mode = (unicode_mode + 1) % 2; + break; + + + default: + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case L1: + ergodox_right_led_1_on(); + break; + case L2: + ergodox_right_led_2_on(); + break; + case L3: + ergodox_right_led_3_on(); + break; + case L4: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + break; + case L5: + ergodox_right_led_1_on(); + ergodox_right_led_3_on(); + break; + // case L6: + // ergodox_right_led_2_on(); + // ergodox_right_led_3_on(); + // break; + // case L7: + // ergodox_right_led_1_on(); + // ergodox_right_led_2_on(); + // ergodox_right_led_3_on(); + // break; + default: + ergodox_board_led_off(); + break; + } +}; diff --git a/keyboards/ergodox/keymaps/neo2_on_qwertz_hardware/keymap.md b/keyboards/ergodox/keymaps/neo2_on_qwertz_hardware/keymap.md new file mode 100644 index 00000000..d9fcda96 --- /dev/null +++ b/keyboards/ergodox/keymaps/neo2_on_qwertz_hardware/keymap.md @@ -0,0 +1,194 @@ +# Neo2 for ErgoDox on QWERTZ +# +# Description +This layout is ment to be used on PCs with DE-de with an additional guest keyboard. E.g. on your PC at work you can use your ergodox with neo but a second keybord is plugged in so your coworkers can enter a few signs if necessary. I live in Germany, so this is my usecase. +# Layers +[Layer0](#layer-0) +Letters, modifiers and volume + +[Layer1](#layer-1) +Symbols + +[Layer2](#layer-2) +Motion, digits and next/prev Song + +[Layer3](#layer-3) +F1 to F12 and mouse actions + +[Layer4](#layer-4) +not used + +[Layer5](#layer-5) +not used + +[Layer6](#layer-6) +not used + + +## Layer 0 + + .------------------------------------.------------------------------------. + |ESC | 1 | 2 | 3 | 4 | 5 | ´ | ` | 6 | 7 | 8 | 9 | 0 | ^ | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + |TAB | X | V | L | C | W |Print| | K | H | G | F | Q | ß | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | Y | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + |LSFT | ü | ö | ä | P | Z |SPACE| | B | M | , | . | J |RSFT | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + |LCTL|LGUI|LALT|MO(3)|MO(2)| !MO(2)|MO(3)|APP |RALT|RCTL| + '------------------------' '------------------------' + .-----------. .-----------. + |VOL- |VOL+ | !MUTE |PLAY | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! |-----| !-----| ! ! + ! CTL ! ! ALT ! ! CTL ! ! ALT ! + |ENTER|MO(1)| TAB | !ESC |MO(1)|SPACE| + '-----------------' '-----------------' + +* Left side ESC, TAB, [SymbolLayer], Shift, Ctr, Gui(Windows key), and Alt like normal QWERTZ with neo2. +* Space on right side of left half for mous activity so you don't have to leave the mouse for Space. +* Top row of thumb keys is hard to reach for me, so I put media control on there. +* Thumb keys make use of modifier/tap. E.g. if you tap the Enter key it will be Enter. If you keep it pressed down it will be Ctr. The hold action is written on top of the tap action. +* The small middle thumb keys are not used, es well as the 1.5 sized ones on the left side of the right half. + + +## Layer 1 + + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | | € | _ | [ | ] | | | | ! | < | > | = | & | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | \ | / | { | } | * |-----!-----! ? | ( | ) | - | : | @ | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | # | $ | | | ~ | | | | + | % | " | ' | ; | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' + + +## Layer 2 + + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | |PGUP|BSPC| UP |DEL |PGDN| | | | 7 | 8 | 9 | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | |HOME|LEFT|DOWN|RGHT|END |-----!-----! | 4 | 5 | 6 | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | |PREV|NEXT| | | | | 1 | 2 | 3 | | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | 0 | + '-----------------' '-----------------' + + + +## Layer 3 + + .------------------------------------.------------------------------------. + | | F1 | F2 | F3 | F4 | F5 | F6 | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | | F7 | F8 | F9 | F10| F11| F12 | | |M_WU|M_CU|M_WD| | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + |M_B5 |M_B4|M_B3|M_B2|M_B1| |-----!-----! |M_CL|M_CD|M_CR| | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | |M_A2|M_A1|M_A0| | | | | | | | | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' +* M_A Mouse acceleration +* M_B Mouse button +* M_C Mouse cursor +* M_W Mouse wheel + +## Layer 4 + + + + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | | | | | | | | | | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | |-----!-----! | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | | | | | | | | | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' + + +## Layer 5 + + + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | | | | | | | | | | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | |-----!-----! | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | | | | | | | | | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' + + +## Layer 6 + + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | | | | | | | | | | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | |-----!-----! | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | | | | | | | | | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' + diff --git a/keyboards/ergodox/keymaps/ordinary/keymap.c b/keyboards/ergodox/keymaps/ordinary/keymap.c index 302c41cc..1dfdf7e6 100644 --- a/keyboards/ergodox/keymaps/ordinary/keymap.c +++ b/keyboards/ergodox/keymaps/ordinary/keymap.c @@ -1,5 +1,6 @@ #include "ergodox.h" #include "led.h" +#include "mousekey.h" #include "debug.h" #include "action_layer.h" #include "action_util.h" @@ -8,6 +9,7 @@ #define SYMB 1 // symbols layer #define MDIA 2 // media layer #define SPEC 3 // special layer +#define RBASE 4 // reverse default layer #define LSymb 10 // left symbol-shift key #define LMdia 11 // left media-shift key @@ -16,15 +18,23 @@ #define RMdia 14 // right media-shift key #define RSpec 15 // right special-shift key +#define NotEq 16 // != macro +#define GrtEq 17 // >= macro +#define LesEq 18 // <= macro +#define DeRef 19 // -> macro + #define MUL 20 // mouse up left #define MUR 21 // mouse up right #define MDL 22 // mouse down left #define MDR 23 // mouse down right + + /* - * The Ordinary Layout for the Ergodox EZ keyboard, v4.20 + * The Ordinary Layout for the Ergodox EZ keyboard, v5 * - * Modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com + * Modifications from the default Ergodox EZ layout + * by Nicholas Keene ergodoxez@nicholaskeene.com * * No rights reserved. This software is in the public domain. * Credit me if you are friendly but if you're a jerk don't bother. @@ -43,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------------+------+------+------+------+-------------| |------+------+------+------+------+------+------------| * | Media Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \| Media | * |------------+------+------+------+------+------| | | |------+------+------+------+------+------------| - * | Symbol | A | S | D | F | G |------| |------| H | J | K | L | ; | '" Symbol | + * | Symbol | ^A | S | D | ^F | G |------| |------| H | ^J | K | L | ^; | '" Symbol | * |------------+------+------+------+------+------|Shift | | Tab |------+------+------+------+------+------------| * | Capitals | Z | X | C | V | B | -Tab | | | N | M | , | . | / | Capitals | * `------------+------+------+------+------+-------------' `-------------+------+------+------+------+------------' @@ -59,24 +69,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [BASE] = KEYMAP( // left hand - F(LSpec) ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_ESC -,F(LMdia) ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_LBRC -,M(LSymb) ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G -,KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,LSFT(KC_TAB) -,KC_LCTL ,KC_MEH ,KC_HYPR,KC_LALT,KC_LGUI + F(LSpec) ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_ESC +,F(LMdia) ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_LBRC +,M(LSymb) ,LT(RBASE, KC_A),KC_S ,KC_D ,LT(RBASE, KC_F) ,KC_G +,KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,LSFT(KC_TAB) +,KC_LCTL ,MEH_T(KC_NO) ,ALL_T(KC_NO),KC_LALT,KC_LGUI ,KC_HOME,KC_END ,KC_PGUP ,KC_BSPC,KC_DEL ,KC_PGDN // right hand - ,KC_MINS ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,F(RSpec) - ,KC_RBRC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,F(RMdia) - ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,F(RSymb) - ,KC_TAB ,KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH ,KC_RSFT - ,KC_RGUI,KC_RALT,KC_HYPR ,KC_MEH ,KC_RCTL + ,KC_MINS ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,F(RSpec) + ,KC_RBRC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,F(RMdia) + ,KC_H ,LT(RBASE, KC_J),KC_K ,KC_L ,LT(RBASE,KC_SCLN),F(RSymb) + ,KC_TAB ,KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH ,KC_RSFT + ,KC_RGUI ,KC_RALT,KC_HYPR,KC_MEH ,KC_RCTL ,KC_LEFT ,KC_RGHT ,KC_UP ,KC_DOWN ,KC_ENT ,KC_SPC - ), +), /******* Symbols Layer ************************************************************************************************* * @@ -86,52 +96,52 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | ! | @ | { | } | & | < | | > | | | 7 | 8 | 9 | / | | * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * | | # | $ | ( | ) | ` |------| |------| / | 4 | 5 | 6 | * | | - * |-----------+------+------+------+------+------| Tab | | Shift|------+------+------+------+------+-----------| - * | | % | ^ | [ | ] | ~ | | | -Tab| \ | 1 | 2 | 3 | - | | + * |-----------+------+------+------+------+------| ' | | " |------+------+------+------+------+-----------| + * | | % | ^ | [ | ] | ~ | | | | \ | 1 | 2 | 3 | - | | * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' - * | LCtrl | Meh |Hyper | LAlt | LGui | | 0 | . | = | + | Ent | + * | ; | & | * | < | > | | 0 | . | = | + | Enter | * `-----------------------------------' `-----------------------------------' * ,-------------. ,-------------. - * | Left | Right| | Home | End | + * | |||| | |||| | | |||| | |||| | * ,------|------|------| |------+------+------. - * | | | Up | | PgUp | | | - * |Space |Enter |------| |------|BackSp| Del | - * | | | Down | | PgDn | | | + * | Plus | Equal| |||| | | |||| | Under| Dash | + * | | |------| |------| Score| | + * | + | = | != | | -> | _ | - | * `--------------------' `--------------------' */ [SYMB] = KEYMAP( // left hand - KC_TRNS ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_ESC -,KC_TRNS ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM) -,KC_TRNS ,KC_HASH ,KC_DLR ,KC_LPRN ,KC_RPRN ,KC_GRV -,KC_TRNS ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_TAB -,KC_LCTL ,KC_MEH ,KC_HYPR ,KC_LALT ,KC_LGUI - ,KC_LEFT ,KC_RGHT - ,KC_UP - ,KC_SPC ,KC_ENT ,KC_DOWN + KC_TRNS ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_ESC +,KC_TRNS ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM) +,KC_TRNS ,KC_HASH ,KC_DLR ,KC_LPRN ,KC_RPRN ,KC_GRV +,KC_TRNS ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_QUOT +,KC_SCLN ,KC_AMPR ,KC_ASTR ,LSFT(KC_COMM),LSFT(KC_DOT) + ,M(GrtEq),M(LesEq) + ,KC_NO + ,KC_PLUS ,KC_EQL ,M(NotEq) // right hand - ,KC_MINS ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_TRNS - ,LSFT(KC_DOT),KC_PIPE ,KC_7 ,KC_8 ,KC_9 ,KC_SLSH ,KC_TRNS - ,KC_SLSH ,KC_4 ,KC_5 ,KC_6 ,KC_ASTR ,KC_TRNS - ,LSFT(KC_TAB),KC_BSLS ,KC_1 ,KC_2 ,KC_3 ,KC_MINS ,KC_TRNS - ,KC_0 ,KC_DOT ,KC_EQL,KC_PLUS ,KC_ENT - ,KC_HOME ,KC_END - ,KC_PGUP - ,KC_PGDN ,KC_BSPC ,KC_DEL + ,KC_MINS ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_TRNS + ,LSFT(KC_DOT),KC_PIPE ,KC_7 ,KC_8 ,KC_9 ,KC_SLSH ,KC_TRNS + ,KC_SLSH ,KC_4 ,KC_5 ,KC_6 ,KC_ASTR ,KC_TRNS + ,LSFT(KC_QUOT),KC_BSLS ,KC_1 ,KC_2 ,KC_3 ,KC_MINS ,KC_TRNS + ,KC_0 ,KC_DOT ,KC_EQL,KC_PLUS ,KC_ENT + ,KC_NO ,KC_NO + ,KC_NO + ,M(DeRef) ,LSFT(KC_MINS),KC_MINS ), /******* Media Layer ******************************************************************************************************* * * ,---------------------------------------------------------------. ,---------------------------------------------------------------. - * | | F11 | F12 | F13 | F14 | F15 | Esc | | | F16 | F17 | F18 | F19 | F20 | | + * | | F11 | F12 | F13 | F14 | F15 | Esc | | |||| | F16 | F17 | F18 | F19 | F20 | | * |------+---------+---------+---------+---------+----------------| |------+---------+---------+---------+---------+---------+------| * | |Shut Down|MouseUpLf|Mouse Up |MouseUpRg|Volume Up|Scroll| |Scroll|PrintScrn| Home | Up | PgUp | Mail | | * |------+---------+---------+---------+---------+---------| Up | | Up |---------+---------+---------+---------+---------+------| * | | Sleep |MouseLeft|MouseDown|MouseRght|Volume Dn|------| |------| Num Lock| Left | Down | Right | MyComp | | * |------+---------+---------+---------+---------+---------|Scroll| |Scroll|---------+---------+---------+---------+---------+------| - * | | |MouseDnLf|MouseDown|MouseDnRg| Mute | Down | | Down | | End | Down | PgDn | | | + * | | |||| |MouseDnLf|MouseDown|MouseDnRg| Mute | Down | | Down | |||| | End | Down | PgDn | |||| | | * `------+---------+---------+---------+---------+----------------' `----------------+---------+---------+---------+---------+------' - * |LCtrl| Meh | MClick | LClick | R Click| |Cmd/Insrt|Optn/Del | Hyper | Meh |RCtrl| + * | ||| | |||| | MClick | LClick | R Click| | Insert | Del | |||| | |||| | ||| | * `---------------------------------------------' `---------------------------------------------' * ,-------------. ,-------------. * | Stop |Refrsh| | Prev | Next | @@ -147,7 +157,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ,KC_TRNS ,KC_POWER ,M(MUL) ,KC_MS_U ,M(MUR) ,KC_VOLU ,KC_WH_U ,KC_TRNS ,KC_SLEP ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_VOLD ,KC_TRNS ,KC_NO ,M(MDL) ,KC_MS_D ,M(MDR) ,KC_MUTE ,KC_WH_D -,KC_LCTL ,KC_MEH ,KC_BTN3 ,KC_BTN1 ,KC_BTN2 +,KC_NO ,KC_NO ,KC_BTN3 ,KC_BTN1 ,KC_BTN2 ,KC_WSTP ,KC_WREF ,KC_WSCH ,KC_WBAK ,KC_NO ,KC_WHOM @@ -156,7 +166,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ,KC_WH_U ,KC_PSCR ,KC_HOME ,KC_UP ,KC_PGUP ,KC_MAIL ,KC_TRNS ,KC_NLCK ,KC_LEFT ,KC_DOWN ,KC_RIGHT,KC_MYCM ,KC_TRNS ,KC_WH_D ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO ,KC_TRNS - ,GUI_T(KC_INS),ALT_T(KC_DEL),KC_HYPR ,KC_MEH ,KC_RCTL + ,KC_INS ,KC_DEL ,KC_NO ,KC_NO ,KC_NO ,KC_MPRV ,KC_MNXT ,KC_VOLU ,KC_VOLD ,KC_MSTP ,KC_MPLY @@ -202,7 +212,49 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS - ) +), + +/******* Reverse Base Layer ********************************************************************************************* + * + * ,------------------------------------------------------. ,------------------------------------------------------. + * | =+ | 0 | 9 | 8 | 7 | 6 | - | | Esc | 5 | 4 | 3 | 2 | 1 | `~ | + * |------------+------+------+------+------+-------------| |------+------+------+------+------+------+------------| + * | \| | P | O | I | U | Y | ] | | [ | T | R | E | W | Q | Tab | + * |------------+------+------+------+------+------| | | |------+------+------+------+------+------------| + * | '" | ; | L | K | J | H |------| |------| G | F | D | S | A | | + * |------------+------+------+------+------+------| Tab | |Shift |------+------+------+------+------+------------| + * | Capitals | / | . | , | M | N | | | -Tab | B | V | C | X | Z | Capitals | + * `------------+------+------+------+------+-------------' `-------------+------+------+------+------+------------' + * | LCtrl | Meh |Hyper | LAlt | LGui | | RGui | RAlt | Hyper| Meh | RCtrl | + * `-----------------------------------' `-----------------------------------' + * ,-------------. ,-------------. + * | Left | Right| | Home | End | + * ,------|------|------| |------+------+------. + * | | | Up | | PgUp | | | + * |Space |Enter |------| |------|BackSp| Del | + * | | | Down | | PgDn | | | + * `--------------------' `--------------------' + */ +[RBASE] = KEYMAP( +// left hand + KC_EQL ,KC_0 ,KC_9 ,KC_8 ,KC_7 ,KC_6 ,KC_MINS +,KC_BSLS ,KC_P ,KC_O ,KC_I ,KC_U ,KC_Y ,KC_RBRC +,KC_QUOT ,LT(RBASE, KC_SCLN) ,KC_L ,KC_K ,LT(RBASE, KC_J) ,KC_H +,KC_RSFT ,KC_SLSH ,KC_DOT ,KC_COMM,KC_M ,KC_N ,KC_TAB +,KC_RCTL ,MEH_T(KC_NO),ALL_T(KC_NO),KC_RALT,KC_RGUI + ,KC_LEFT ,KC_RGHT + ,KC_UP + ,KC_SPC ,KC_ENT ,KC_DOWN + // right hand + ,KC_ESC ,KC_5 ,KC_4 ,KC_3 ,KC_2 ,KC_1 ,KC_GRV + ,KC_LBRC ,KC_T ,KC_R ,KC_E ,KC_W ,KC_Q ,KC_TAB + ,KC_G ,LT(RBASE, KC_F),KC_D ,KC_S ,LT(RBASE, KC_A) ,KC_NO + ,LSFT(KC_TAB),KC_B ,KC_V ,KC_C ,KC_X ,KC_Z ,KC_LSFT + ,KC_LGUI,KC_LALT,KC_HYPR ,KC_MEH,KC_LCTL + ,KC_HOME ,KC_END + ,KC_PGUP + ,KC_PGDN ,KC_BSPC ,KC_DEL +) }; const uint16_t PROGMEM fn_actions[] = { @@ -226,14 +278,13 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { switch(id) { // There are two shift keys for each layer so we increment a layer_shift var when one - // is pressed and decrement when one is released. If both are pressed at the same time - // then the layer is locked (or unlocked). The shift counts are bound between 0 and 2 + // is pressed and decrement when one is released. The shift counts are bound between 0 and 2 // only because sometimes rapid pressing led to irregular events; this way the states // are self healing during use. case LSymb: // if (record->event.pressed) { // when the LSymb button is pressed - if(++symb_shift > 2) mdia_shift = 2; // increment the symb shift count, max two + if(++symb_shift > 2) symb_shift = 2; // increment the symb shift count, max two if(spec_shift) symb_lock = !symb_lock; // if the Special layer is on, toggle the shift lock layer_on(SYMB); // in any case, turn on the Symbols layer } else { // when the LSymb button is released @@ -263,7 +314,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case LSpec: if (record->event.pressed) { // when the LSpec button is pressed - if(symb_shift) symb_lock == !symb_lock; // if another layer button is engaged, then + if(symb_shift) symb_lock = !symb_lock; // if another layer button is engaged, then else if(mdia_shift) mdia_lock = !mdia_lock; // lock that layer, be it caps or symb or mdia else if (record->tap.count && !record->tap.interrupted && (!spec_shift)) { register_code(KC_GRV); // otherwise, if it's an uninterrupted tap, emit a char @@ -339,6 +390,30 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } break; + case NotEq: + if (record->event.pressed) { + return MACRO( I(10), D(LSFT), T(EXLM), U(LSFT), T(EQL), END ); // != + } + break; + + case GrtEq: + if (record->event.pressed) { + return MACRO( I(10), D(LSFT), T(COMM), U(LSFT), T(EQL), END ); // <= + } + break; + + case LesEq: + if (record->event.pressed) { + return MACRO( I(10), D(LSFT), T(DOT), U(LSFT), T(EQL), END ); // >= + } + break; + + case DeRef: + if (record->event.pressed) { + return MACRO( I(10), T(MINS), D(LSFT), T(DOT), U(LSFT), END ); // -> + } + break; + // mouse diagonals case MUL: // mouse up left diff --git a/keyboards/ergodox/keymaps/ordinary/ordinary-base.png b/keyboards/ergodox/keymaps/ordinary/ordinary-base.png index 831db4f5..18c6c4ab 100644 Binary files a/keyboards/ergodox/keymaps/ordinary/ordinary-base.png and b/keyboards/ergodox/keymaps/ordinary/ordinary-base.png differ diff --git a/keyboards/ergodox/keymaps/ordinary/ordinary-base.txt b/keyboards/ergodox/keymaps/ordinary/ordinary-base.txt index 7763c3d3..4fc11faf 100644 --- a/keyboards/ergodox/keymaps/ordinary/ordinary-base.txt +++ b/keyboards/ergodox/keymaps/ordinary/ordinary-base.txt @@ -7,10 +7,10 @@ [{y:-0.875,x:5.5},"T",{h:1.5},"{\n\n\n\n\n\n[",{x:4.5,h:1.5},"}\n\n\n\n\n\n]","Y"], [{y:-0.875,c:"#c6c600",t:"#002299",w:1.5},"Media\n\nTab\n\n\n\nShift",{c:"#cccccc",t:"#000000"},"Q",{x:14.5},"P",{c:"#c6c600",t:"#002299",w:1.5},"|\n\\\nMedia\n\n\n\n\nShift"], [{y:-0.375,x:3.5,c:"#cccccc",t:"#000000"},"D",{x:10.5},"K"], -[{y:-0.875,x:2.5},"S",{x:1},"F",{x:8.5},"J",{x:1},"L"], +[{y:-0.875,x:2.5},"S",{x:1,fa:[0,0,0,1]},"F\n\n\nreverse",{x:8.5},"J\n\n\nreverse",{x:1},"L"], [{y:-0.875,x:5.5},"G",{x:6.5},"H"], -[{y:-0.875,c:"#c6c600",t:"#007d00",w:1.5},"Symbols\n\n\n\n\n\nShift",{c:"#cccccc",t:"#000000"},"A",{x:14.5},":\n;",{c:"#c6c600",t:"#007d00",w:1.5},"\"\n'\nSymbols\n\n\n\n\nShift"], -[{y:-0.625,x:6.5,c:"#ff8500",t:"#000000",fa:[0,0,0,1],h:1.5},"< Tab\n\n\nShift Tab",{x:4.5,h:1.5},"Tab >\n\n\nTab"], +[{y:-0.875,c:"#c6c600",t:"#007d00",w:1.5},"Symbols\n\n\n\n\n\nShift",{c:"#cccccc",t:"#000000"},"A\n\n\nreverse",{x:14.5},":\n;\n\nreverse",{c:"#c6c600",t:"#007d00",w:1.5},"\"\n'\nSymbols\n\n\n\n\nShift"], +[{y:-0.625,x:6.5,c:"#ff8500",t:"#000000",h:1.5},"< Tab\n\n\nShift Tab",{x:4.5,h:1.5},"Tab >\n\n\nTab"], [{y:-0.75,x:3.5,c:"#cccccc"},"C",{x:10.5},"<\n,"], [{y:-0.875,x:2.5},"X",{x:1},"V",{x:8.5},"M",{x:1},">\n."], [{y:-0.875,x:5.5},"B",{x:6.5},"N"], diff --git a/keyboards/ergodox/keymaps/ordinary/ordinary-media.png b/keyboards/ergodox/keymaps/ordinary/ordinary-media.png index 5ff3f533..491f698d 100644 Binary files a/keyboards/ergodox/keymaps/ordinary/ordinary-media.png and b/keyboards/ergodox/keymaps/ordinary/ordinary-media.png differ diff --git a/keyboards/ergodox/keymaps/ordinary/ordinary-media.txt b/keyboards/ergodox/keymaps/ordinary/ordinary-media.txt index e1467b22..67b7840b 100644 --- a/keyboards/ergodox/keymaps/ordinary/ordinary-media.txt +++ b/keyboards/ergodox/keymaps/ordinary/ordinary-media.txt @@ -15,10 +15,10 @@ [{y:-0.875,x:2.5},"Mouse\n\n\n\n\n\nDnLeft",{x:1},"Mouse\n\n\n\n\n\nDnRgt",{x:8.5,c:"#1e8fff"},"End",{x:1},"Page\n\n\n\n\n\nDown"], [{y:-0.875,x:5.5,c:"#9977ee"},"Mute",{x:6.5,c:"#737373",a:7},""], [{y:-0.875,c:"#c6c600",t:"#9e0000",a:4,w:1.5},"Capitals\n\n\n\n\n\nShift",{c:"#737373",t:"#000000",a:7},"",{x:14.5},"",{c:"#c6c600",t:"#9e0000",a:4,w:1.5},"\n\nCapitals\n\n\n\n\nShift"], -[{y:-0.375,x:3.5,c:"#0066cc",t:"#000000"},"Middle\n\n\n\n\n\nClick",{x:10.5,c:"#1e8fff",fa:[0,0,0,1]},"Delete\n\n\nOption"], -[{y:-0.875,x:2.5,c:"#0066cc"},"Left\n\n\n\n\n\nClick",{x:1},"Right\n\n\n\n\n\nClick",{x:8.5,c:"#1e8fff"},"Insert\n\n\nCmd",{x:1,c:"#dddd77"},"Hyper"], -[{y:-0.75,x:0.5},"Ctrl\n\n\nLCtrl","Meh",{x:14.5},"Meh","Crtl\n\n\nRCtrl"], -[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#6633ee"},"Stop\n\n\nBrowser","Reload\n\n\nBrowser"], +[{y:-0.375,x:3.5,c:"#0066cc",t:"#000000"},"Middle\n\n\n\n\n\nClick",{x:10.5,c:"#1e8fff"},"Delete"], +[{y:-0.875,x:2.5,c:"#0066cc"},"Left\n\n\n\n\n\nClick",{x:1},"Right\n\n\n\n\n\nClick",{x:8.5,c:"#1e8fff"},"Insert",{x:1,c:"#737373",a:7},""], +[{y:-0.75,x:0.5},"","",{x:14.5},"",""], +[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#6633ee",a:4,fa:[0,0,0,1]},"Stop\n\n\nBrowser","Reload\n\n\nBrowser"], [{h:2},"< Web\n\n\nBrowser",{h:2},"Web >\n\n\nBrowser","Search\n\n\nBrowser"], [{x:2},"Home\n\n\nBrowser"], [{r:-30,rx:13,y:-1,x:-3},"Prev\n\n\nAudio\n\n\nTrack","Next\n\n\nAudio\n\n\nTrack"], diff --git a/keyboards/ergodox/keymaps/ordinary/ordinary-symbol.png b/keyboards/ergodox/keymaps/ordinary/ordinary-symbol.png index dd908632..1277f748 100644 Binary files a/keyboards/ergodox/keymaps/ordinary/ordinary-symbol.png and b/keyboards/ergodox/keymaps/ordinary/ordinary-symbol.png differ diff --git a/keyboards/ergodox/keymaps/ordinary/ordinary-symbol.txt b/keyboards/ergodox/keymaps/ordinary/ordinary-symbol.txt index 001bf370..65eca9d6 100644 --- a/keyboards/ergodox/keymaps/ordinary/ordinary-symbol.txt +++ b/keyboards/ergodox/keymaps/ordinary/ordinary-symbol.txt @@ -10,18 +10,18 @@ [{y:-0.875,x:2.5,c:"#bbddbb"},"$",{x:1},")",{x:8.5,c:"#89b087"},"4",{x:1},"6"], [{y:-0.875,x:5.5,c:"#bbddbb"},"`",{x:6.5},"/"], [{y:-0.875,c:"#000000",t:"#007d00",w:1.5},"Symbols\n\n\n\n\n\nShift",{c:"#bbddbb",t:"#000000"},"#",{x:14.5,c:"#89b087"},"*",{c:"#000000",t:"#007d00",w:1.5},"\n\nSymbols\n\n\n\n\nShift"], -[{y:-0.625,x:6.5,c:"#ff8500",t:"#000000",fa:[0,0,0,1],h:1.5},"Tab >\n\n\nTab",{x:4.5,h:1.5},"< Tab\n\n\nShift Tab"], -[{y:-0.75,x:3.5,c:"#bbddbb"},"[",{x:10.5,c:"#89b087"},"2"], +[{y:-0.625,x:6.5,c:"#bbddbb",t:"#000000",a:6,h:1.5},"'",{x:4.5,h:1.5},"\""], +[{y:-0.75,x:3.5,a:4},"[",{x:10.5,c:"#89b087"},"2"], [{y:-0.875,x:2.5,c:"#bbddbb"},"^",{x:1},"]",{x:8.5,c:"#89b087"},"1",{x:1},"3"], [{y:-0.875,x:5.5,c:"#bbddbb"},"~",{x:6.5},"\\"], [{y:-0.875,c:"#c6c600",t:"#9e0000",w:1.5},"Capitals\n\n\n\n\n\nShift",{c:"#bbddbb",t:"#000000"},"%",{x:14.5,c:"#89b087"},"-",{c:"#c6c600",t:"#9e0000",w:1.5},"\n\nCapitals\n\n\n\n\nShift"], -[{y:-0.375,x:3.5,c:"#dddd77",t:"#000000"},"Option\n\n\nLAlt",{x:10.5,c:"#89b087"},"."], -[{y:-0.875,x:2.5,c:"#dddd77"},"Hyper",{x:1},"Cmd\n\n\nSuper",{x:8.5,c:"#89b087"},"0",{x:1},"="], -[{y:-0.75,x:0.5,c:"#dddd77"},"Ctrl\n\n\nLCtrl","Meh",{x:14.5,c:"#89b087"},"+","Enter"], -[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#ff8500"},"Left","Right"], -[{h:2},"Space",{h:2},"Enter","Up"], -[{x:2},"Down"], -[{r:-30,rx:13,y:-1,x:-3},"Home","End"], -[{x:-3},"Page\n\n\n\n\n\nUp",{h:2},"< Del\n\n\nBackspace",{h:2},"Del >\n\n\nDelete"], -[{x:-3},"Page\n\n\n\n\n\nDown"] +[{y:-0.375,x:3.5,c:"#bbddbb",t:"#000000"},"<",{x:10.5,c:"#89b087"},"."], +[{y:-0.875,x:2.5,c:"#bbddbb"},"*",{x:1},">",{x:8.5,c:"#89b087"},"0",{x:1},"="], +[{y:-0.75,x:0.5,c:"#bbddbb"},";","&",{x:14.5,c:"#89b087"},"+","Enter"], +[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#bbddbb"},"<=",">="], +[{a:7,h:2},"+",{h:2},"=",{c:"#737373"},""], +[{x:2,c:"#bbddbb",a:4},"!="], +[{r:-30,rx:13,y:-1,x:-3,c:"#737373",a:7},"",""], +[{x:-3},"",{c:"#bbddbb",h:2},"_",{h:2},"-"], +[{x:-3,a:4},"->"] diff --git a/keyboards/ergodox/keymaps/ordinary/readme.md b/keyboards/ergodox/keymaps/ordinary/readme.md index 820b80b4..e13cb7ec 100644 --- a/keyboards/ergodox/keymaps/ordinary/readme.md +++ b/keyboards/ergodox/keymaps/ordinary/readme.md @@ -10,12 +10,13 @@ no rights reserved, use for any purposes, credit me if you are a nice person ## The Base Layout ## -* *White Keys* are all the normal characters and symbols in all the normal locations (except for the brackets). -* *Modifier Keys* are light yellow and in the traditional location: Control, Option, Command, plus Hyper and Meh. -* *Shift Keys* are dark yellow, found on the outsides of the keyboard. Capitals Shift (traditional shift) is found in the usual place and above that is found Symbol Shift, Media Shift, and Special Shift (Shift Lock). +* *White Keys* are all the normal characters and symbols in all the normal locations (except for the brackets, and who touch-types brackets?). +* *Modifier Keys* are light yellow and in the traditional locationn at the bottom of the keyboard: Control, Option, Command, plus Hyper and Meh. Modifier keys are only found on the base layout. +* *Shift Keys* are dark yellow, found on the outsides of the keyboard. Capitals Shift (traditional Shift) is found in the usual place and above that are Symbol Shift, Media Shift, and Special Shift (Shift Lock). * Several of the shift keys double for entry of characters which would typically be in those locations. * *Thumb Keys* shown in orange are for text navigation and manipulation. -* *Escape* is red and it is always found in that location no matter what. +* The keys under pinky fingers and index fingers will *reverse* the keyboard layout. +* *Escape* is red and it is always found in that location (*except* when the layout is reversed). ![Ordinary base layout](ordinary-base.png) @@ -23,12 +24,16 @@ The four big orange keys are arranged differently than in the default Ergodox EZ The Forward Tab and Backward Tab keys are in their locations mostly because I ended up with two extra buttons and needed something to do with them. My muscle memory from using the Truly Ergonomic Keyboard makes me look for the Tab key with my right index finger, so it is handy to have this redundant Tab, and the idea with the Backward Tab key is that it becomes easy to navigate text fields in forms, or to indent/unindent code. +#### Reversing The Base Layout #### + +The Ordinary Layout can be used to perform one-handed chorded text input. If you hold down the key under either index finger or either pinky finger (A, F, J and Semicolon), the whole base layout reverses order. Most keys are _mirrored_ but the delete keys, home/end, and left/right arrow keys are merely *translated* to preserve directionality. Pro-tip: This feature is particularly handly for bringing the Enter key to the left hand when the right hand is using the mouse. + ## The Symbols Layer ## -* *Symbols* shown in light green. All kinds of brackets are available on this layer. Ampersand and Pipe justapose each other. Pipe, slash, and backslash are arranged in a column. -* *F-Keys* are bright green and overlay the row of numerals. +* *Symbols* shown in light green. All kinds of brackets are available on this layer. Ampersand and Pipe juxtapose each other. Pipe, slash, and backslash are arranged in a column. +* *F-Keys* are bright green and overlay the row of numerals. This layer has F1-F10, higher *F-Keys* are on the Symbols layer. * *Number pad* in dark green under the right hand includes all four arithmetic operations in the same order found on most number pads and features an Enter key. The keycodes emitted here are normal numeric keycodes, not the number-pad specific keycodes emitted by most number pads so that NumLock is not needed. -* *Thumb keys* on this layer are the *reverse* of the orange keys on the base layer, with the keys either mirrored or shifted. This is powerful! Often I find myself using the mouse with my right hand, and the left hand needs to press Enter. Instead of reaching the left hand over to the right side of the keyboard, now I simply tap Symbols to reverse the turquoise keys, and Enter is right where it should be. +* The dark gray keys do nothing in case you bump them by accident. ![Ordinary symbol layout](ordinary-symbol.png) @@ -42,7 +47,7 @@ The Symbols Layer is based on the Coder Layer from the default Ergodox EZ layout * Higher-order *F-Keys* are shown in bright green overylaying the numerals. * *Application Keys* to control web browsers and audio players are dark purple but don't get too excited because these have weak support on operating systems I've looked at. Good luck. * The light purple keys are various operating system keys such as NumLock and Mute and a button to navigate to My Computer (usually your home dir). -* The dark gray keys do nothing in case you bump them by accident +* The dark gray keys do nothing in case you bump them by accident. ![Ordinary media layout](ordinary-media.png) @@ -64,27 +69,33 @@ Multiple layers can be turned on at once. The Capitals layer will affect charact The Special Shift layer is mostly used to lock the shift keys but in order to make this layout more _ordinary_ there are a few special sequences which put some keys near their most common traditional locations. -### Escape ### +#### Escape #### -The One True Location for the Escape key is segregated way up on the top left of the keyboard. The Ergodox does not have a physical button in such a location and the nearest one is home to the tilde (er, grave) which is commonly found there. In the Ordinary layout the Escape key is found on all layers in the prominent location in the corner next to the 5, which is easy to remember, and yet it isn't natural for those of us with muscle memory flicking our wrists up and to the left looking for Escape. +The One True Location for an Escape key is separated from the rest of the keys, way up on the top left of the keyboard. The Ergodox does not have a physical button in such a location, however, and the nearest one is home to the tilde (er, *grave*) which is commonly found there. In the Ordinary layout the Escape key is found on all layers in the prominent location in the corner next to the 5, which is easy to remember, and yet it isn't natural for those of us with muscle memory flicking our wrists up and to the left looking for Escape. -The Ordinary layout offers as a consolation prize a Special sequence for Escape: Special Shift + 1. This is natural so you can tap the top left button, then the button next to it and get Escape. This gesture works in all layers. +The Ordinary layout offers as a consolation prize, a Special sequence for Escape: **Special Shift + 1**. This is natural so you can tap the top left button, then the button next to it and get Escape. This gesture works in all layers. -### Backspace ### +#### Backspace #### -At the top right corner of the Ergodox EZ you can a gesture similar to the special Escape sequence using the 0 key to produce a Backspace. Users of this keyboard and this layout are well advised to learn to use their thumbs for deleting text, but sometimes you are doing other computery things and just want to flick your digits up to the right and press backspace a bunch times. +At the top right corner of the Ergodox EZ you can do **Special Shift + 0** to produce a Backspace. Users of this keyboard and this layout are well advised to learn to use their thumbs for deleting text, but sometimes you are doing other computery things and just want to flick your digits up to the right and press backspace a bunch times. -### Other Characters ### +#### Other Characters #### The Escape and Backspace special sequences are so useful why not have a few more? You can find dash under 9, left bracket under o, and right bracket under p. That's pretty much all the characters from the top right corner of the keyboard which moved to make room for the columnar layout. +## Errata ## + +Some of the symbols on the Symbols layer are produced by the keyboard by "capitalizing" another character (such as *!* from *1*) so when you type that key you will notice the Capitals Shift red LED turn on. + **** -The Ordinary Layout for the Ergodox EZ keyboard, v4.20 +The Ordinary Layout for the Ergodox EZ keyboard, v5 Modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com No rights reserved. This software is in the public domain. Credit me if you are friendly but if you're a jerk don't bother. +Keyboard layout images were created with http://www.keyboard-layout-editor.com/ by Ian Prest my thanks to that free service + Details: readme.md https://github.com/nrrkeene/qmk_firmware/tree/master/keyboards/ergodox/keymaps/ordinary diff --git a/keyboards/ergodox/keymaps/pvinis/Readme.md b/keyboards/ergodox/keymaps/pvinis/Readme.md index 2a4a0c8f..af272105 100644 --- a/keyboards/ergodox/keymaps/pvinis/Readme.md +++ b/keyboards/ergodox/keymaps/pvinis/Readme.md @@ -59,7 +59,7 @@ I have two commented out layers that are just templates, so I can easily create # Building ``` -$ git clone https://github.com/jackhumbert/qmk_firmware.git +$ git clone https://github.com/qmk/qmk_firmware.git $ cd qmk_firmware/keyboards/ergodox/keymaps/pvinis $ make ``` diff --git a/keyboards/ergodox/keymaps/pvinis/keymap.c b/keyboards/ergodox/keymaps/pvinis/keymap.c index df906201..3c491188 100644 --- a/keyboards/ergodox/keymaps/pvinis/keymap.c +++ b/keyboards/ergodox/keymaps/pvinis/keymap.c @@ -13,20 +13,16 @@ enum { QWERTY, CARPALX, SYSCTL, + MOUSE, }; // extra keys enum { NONE = 0, - // mouse - MS_UL, // up left - MS_UR, // up right - MS_DL, // down left - MS_DR, // down right - // tap dance TD_FLSH, // flash keyboard + TD_LAYR, // SYSCTL and MOUSE layer switch }; // application selection @@ -49,10 +45,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | | | | | | | | | | | | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | | | | | + * | | | | | | |SYSCTL| | | | | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. - * |BEGIN |QWERTY| |SYSCTL| | + * |BEGIN |QWERTY| | | | * ,------|------|------| |------+--------+------. * | | |CARPAL| |Slack | | | * |Backsp|LShift|------| |------| Enter |Space | @@ -66,15 +62,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO - ,TG(BEGIN) ,TG(QWERTY) - ,TG(CARPALX) - ,KC_BSPC ,KC_LSFT ,TG(SYSCTL) + ,TG(BEGIN) ,TD(TD_LAYR) + ,TG(MOUSE) + ,KC_BSPC ,KC_LSFT ,TD(TD_LAYR) - ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO - ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO - ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO - ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO - ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO + ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO + ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO + ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO + ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO + ,MO(SYSCTL) ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TG(SYSCTL) ,KC_NO ,AP_SLCK @@ -85,7 +81,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * a beginner's keymap i currently use. * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | 1 | 2 | 3 | 4 | 5 | 6 | | 6 | 7 | 8 | 9 | 0 | - | = | + * | | 1 | 2 | 3 | 4 | 5 | opt | | 6 | 7 | 8 | 9 | 0 | - | = | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -104,7 +100,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `--------------------' `----------------------' */ [BEGIN] = KEYMAP( - KC_TRNS ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_6 + KC_TRNS ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_LALT ,KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_LBRC ,CTL_T(KC_ESC) ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_LPRN @@ -114,11 +110,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS - ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS ,KC_EQL - ,KC_RBRC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS - ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_ENT - ,KC_RPRN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSFT - ,KC_UP ,KC_DOWN ,KC_TRNS ,KC_QUOT ,KC_TRNS + ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS ,KC_EQL + ,KC_RBRC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS + ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_ENT + ,KC_RPRN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSFT + ,KC_TRNS ,KC_DOWN ,KC_TRNS ,KC_QUOT ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS @@ -213,30 +209,73 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ,KC_TRNS ,KC_TRNS ,KC_TRNS ), - /* SYSCTL + * a keymap to control my system. + * + * ,--------------------------------------------------. ,------------------------------------------------------. + * | ^ | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+----------+------+------+--------| + * | | | | | | | | | | Mute | Home | Up | End | | | + * |--------+------+------+------+------+------| | | |------+------+----------+------+------+--------| + * | | | | | | |------| |------|VolUp | Left | Down |Right | | Lock | + * |--------+------+------+------+------+------| | | |------+------+----------+------+------+--------| + * | | | | | | | | | |VolDn | Prev |Play/Pause| Next | | Sleep | + * `--------+------+------+------+------+-------------' `-------------+------+----------+------+------+--------' + * | | | | | | | | | | | Power| + * `----------------------------------' `--------------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | ^ | | | | | + * `--------------------' `--------------------' + */ +[SYSCTL] = KEYMAP( + KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO +,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO +,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO +,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO +,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO + + ,KC_NO ,KC_NO + ,KC_NO + ,KC_NO ,KC_NO ,KC_TRNS + + /*,KC_POP /// */,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO + /* /// ,KC_PTRN*/,KC_NO ,KC_MUTE ,KC_HOME ,KC_UP ,KC_END ,KC_NO ,KC_NO + ,KC_VOLU ,KC_LEFT ,KC_DOWN ,KC_RGHT ,KC_NO ,LCTL(LSFT(KC_PWR)) + ,KC_NO ,KC_VOLD ,KC_MPRV ,KC_MPLY ,KC_MNXT ,KC_NO ,KC_SLEP + ,KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_PWR + + ,KC_NO ,KC_NO + ,KC_NO + ,KC_NO ,KC_NO ,KC_NO +), + +/* MOUSE * a keymap to control my system. * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | | Mute |VolDn |VolUp | | + * | ^ | | | | | | | | | | | | | | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | | | | | |MsUpL | MsUp |MsUpR | | | + * | | | | | | | | | | | | MsUp | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| |MsLeft| MsDn |MsRght| | Lock | + * | | | | | | |------| |------| |MsLeft| MsDn |MsRght| | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | |MsDnL | MsDn | | | Sleep | + * | | | | | | | | | | | | | | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | | | | Power| + * | | | | | | | | | | | | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. * | | | | |MidClk| * ,------|------|------| |------+------+------. * | | | | | |Left |Right | * | | |------| |------| Click| Click| - * | | | | | | | | + * | | | ^ | | | | | * `--------------------' `--------------------' */ -[SYSCTL] = KEYMAP( +[MOUSE] = KEYMAP( KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO @@ -245,13 +284,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ,KC_NO ,KC_NO ,KC_NO - ,KC_NO ,KC_NO ,KC_NO + ,KC_NO ,KC_NO ,KC_TRNS - /*,KC_POP*/,KC_NO ,KC_NO ,KC_NO ,KC_MUTE ,KC_VOLD ,KC_VOLU ,KC_NO - /*,KC_PTRN*/,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO - ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,LCTL(LSFT(KC_PWR)) - ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_SLEP - ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_PWR + ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO + ,KC_NO ,KC_NO ,KC_NO ,KC_MS_U ,KC_NO ,KC_NO ,KC_NO + ,KC_NO ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_NO ,KC_NO + ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO + ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO @@ -341,48 +380,29 @@ void matrix_init_user() { ergodox_led_all_off(); } -// extra keys -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch (id) { +// light up leds based on the layer +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); - // mouse - case MS_UL: - if (record->event.pressed) { - mousekey_on(KC_MS_UP); - mousekey_on(KC_MS_LEFT); - } else { - mousekey_off(KC_MS_UP); - mousekey_off(KC_MS_LEFT); - } - break; - case MS_UR: - if (record->event.pressed) { - mousekey_on(KC_MS_UP); - mousekey_on(KC_MS_RIGHT); - } else { - mousekey_off(KC_MS_UP); - mousekey_off(KC_MS_RIGHT); - } + switch(layer) { + case SYSCTL: + ergodox_right_led_3_on(); break; - case MS_DL: - if (record->event.pressed) { - mousekey_on(KC_MS_DOWN); - mousekey_on(KC_MS_LEFT); - } else { - mousekey_off(KC_MS_DOWN); - mousekey_off(KC_MS_LEFT); - } + case MOUSE: + ergodox_right_led_2_on(); break; - case MS_DR: - if (record->event.pressed) { - mousekey_on(KC_MS_DOWN); - mousekey_on(KC_MS_RIGHT); - } else { - mousekey_off(KC_MS_DOWN); - mousekey_off(KC_MS_RIGHT); - } + default: + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); break; } +} + +// extra keys +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + switch (id) { + } return MACRO_NONE; } @@ -425,6 +445,31 @@ void flash_dance_reset(qk_tap_dance_state_t *state, void *user_data) { ergodox_right_led_3_off(); } +// SYSCTL on first tap, MOUSE ON second tap +void layers_dance_finished(qk_tap_dance_state_t *state, void *user_data) { + uint8_t layer = biton32(layer_state); + + switch(state->count) { + case 1: + switch(layer) { + case SYSCTL: + layer_off(SYSCTL); + break; + case MOUSE: + layer_off(MOUSE); + break; + default: + layer_on(SYSCTL); + break; + } + break; + case 2: + layer_on(MOUSE); + break; + } +} + qk_tap_dance_action_t tap_dance_actions[] = { [TD_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED( flash_each_tap, flash_dance_finished, flash_dance_reset ), + [TD_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED( NULL, layers_dance_finished, NULL ), }; diff --git a/keyboards/ergodox/keymaps/replicaJunction/config.h b/keyboards/ergodox/keymaps/replicaJunction/config.h new file mode 100644 index 00000000..d32b46e4 --- /dev/null +++ b/keyboards/ergodox/keymaps/replicaJunction/config.h @@ -0,0 +1,63 @@ +/* +Config file - Ergodox QMK with replicaJunction layout + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef KEYBOARDS_ERGODOX_CONFIG_H_ +#define KEYBOARDS_ERGODOX_CONFIG_H_ + +#define MOUSEKEY_DELAY 100 +#define MOUSEKEY_INTERVAL 20 +#define MOUSEKEY_MAX_SPEED 3 +#define MOUSEKEY_TIME_TO_MAX 10 + +#define TAPPING_TOGGLE 1 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +// MS the button needs to be held before a tap becomes a hold (default: 200) +#define TAPPING_TERM 200 + +#define IGNORE_MOD_TAP_INTERRUPT // this makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when you hold it, and when this option isn't enabled, z rapidly followed by x actually sends Ctrl-x. That's bad.) + +// I don't have any locking keys, so I don't need these features + + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ + +//#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +//#define LOCKING_RESYNC_ENABLE + +/* Prevent modifiers from sticking when switching layers */ +/* Uses 5 bytes of memory per 8 keys, but makes sure modifiers don't get "stuck" switching layers */ +#define PREVENT_STUCK_MODIFIERS + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) || \ + keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \ +) + +#ifdef SUBPROJECT_ez + #include "ez/config.h" +#endif +#ifdef SUBPROJECT_infinity + #include "infinity/config.h" +#endif + + +#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */ diff --git a/keyboards/ergodox/keymaps/replicaJunction/keymap.c b/keyboards/ergodox/keymaps/replicaJunction/keymap.c new file mode 100644 index 00000000..c9213553 --- /dev/null +++ b/keyboards/ergodox/keymaps/replicaJunction/keymap.c @@ -0,0 +1,336 @@ +/* + * Keyboard: Ergodox + * Keymap: replicaJunction + * Version: 1.2 + * + * This keymap is designed to complement my Atreus keyboard layout, found in keyboards/atreus. + * The Atreus keyboard is a 40% board whose design was heavily influenced by the Ergodox, and I now + * have both keyboards, so I've designed these layouts in an effort to make switching between the + * two as easy as possible. + * + * I've also tried to make use of the extra keys on the Ergodox in as logical of a manner as possible, + * adding to the layers in the Atreus config without disturbing what's there already. This allows for + * things like F11-F20, the Application (Menu) key, and better media key placement. + * + * The default key layout in this keymap is Colemak-ModDH. Information on that layout can be found + * here: https://colemakmods.github.io/mod-dh/ + */ + +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" + +#define _CO 0 // Colemak +#define _QW 1 // QWERTY +#define _ME 2 // media keys +#define _NU 3 // numpad +#define _EX 4 // extend +#define _GA 5 // mouse overlay for gaming + +// Some quick aliases, just to make it look pretty +#define _______ KC_TRNS +#define KCX_CGR LCTL(KC_GRV) +#define KX_STAB LSFT(KC_TAB) +#define KX_COPY LCTL(KC_C) +#define KX_CUT LCTL(KC_X) +#define KX_PAST LCTL(KC_V) +#define KX_UNDO LCTL(KC_Z) + +; // This doesn't do anything. It's just for VSCode because its syntax highlighting is weird for the above #define statements. + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * Keymap: Colemak-ModDH + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | Esc | | | 6 | 7 | 8 | 9 | 0 | = | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | LCtrl | Q | W | F | P | B | Home | | BkSp | J | L | U | Y | ; | - | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | Tab | A | R | S | T | G |------| |------| M | N | E | I | O | ' | + * |--------+------+------+------+------+------| Hyper| | \ |------+------+------+------+------+--------| + * | LShft | Z | X | C | D | V | | | | K | H | , | , | / | RShft | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LGui | [ | ] |CtlShf| LAlt | | _EX | - | ' | = | \ | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | LCtrl| ~GA | | Left | Right| + * ,------|------|------| |------+------+------. + * |LCtrl/| LAlt/| Home | | Up | Alt/| _NU/ | + * | BkSp | Del |------| |------| Enter| Space| + * | | | _NU | | Down | | | + * `--------------------' `--------------------' + */ +[_CO] = KEYMAP( + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, + KC_LCTL,KC_Q, KC_W, KC_F, KC_P, KC_B, KC_HOME, + KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_G, + KC_LSFT,KC_Z, KC_X, KC_C, KC_D, KC_V, ALL_T(KC_NO), + KC_LGUI,KC_LBRC,KC_RBRC, LCTL(KC_LSFT), KC_LALT, + + KC_LCTL, TG(_GA), + KC_HOME, + CTL_T(KC_BSPC), ALT_T(KC_DEL), MO(_NU), + // right hand + KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, + KC_BSPC, KC_J, KC_L, KC_U, KC_Y, KC_SCLN,KC_MINS, + KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_BSLS, KC_K, KC_H, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT, + MO(_EX),KC_MINS,KC_QUOT,KC_EQL, KC_BSLS, + + KC_LEFT, KC_RGHT, + KC_UP, + KC_DOWN, ALT_T(KC_ENT), LT(_NU,KC_SPC) + ), + + /* + * Keymap: QWERTY layout. + * + * This is optimized for gaming, not typing, so there aren't as many macros + * as the Dvorak layer. Some of the keys have also been moved to "game- + * like" locations, such as making the spacebar available to the left thumb, + * and repositioning the arrow keys at the bottom right corner. + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | Esc | | | 6 | 7 | 8 | 9 | 0 | = | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | LCtrl | Q | W | E | R | T | Home | | BkSp | Y | U | I | O | P | - | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | Tab | A | S | D | F | G |------| |------| H | J | K | L | ; | ' | + * |--------+------+------+------+------+------| Hyper| | \ |------+------+------+------+------+--------| + * | LShft | Z | X | C | V | B | | | | N | M | , | . | / | RShft | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LGui | ` | \ |CtlShf| _NU | | _EX | - | ' | = | \ | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | LCtrl| ~GA | | Left | Right| + * ,------|------|------| |------+------+------. + * |LCtrl/| LAlt/| Home | | Up | Alt/| _NU/ | + * | BkSp | Del |------| |------| Enter| Space| + * | | | _NU | | Down | | | + * `--------------------' `--------------------' + */ +[_QW] = KEYMAP( // Layer1: QWERTY + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, + KC_LCTL,KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + KC_LGUI,KC_GRV, KC_SLSH,LCTL(KC_LSFT), MO(_NU), + + KC_LCTL,TG(_GA), + KC_HOME, + CTL_T(KC_BSPC), ALT_T(KC_DEL), MO(_NU), + // right hand + KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, + KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, + KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, + KC_BSLS, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT, + MO(_EX),KC_MINS,KC_QUOT,KC_EQL, KC_BSLS, + + KC_LEFT, KC_RGHT, + KC_UP, + KC_DOWN, ALT_T(KC_ENT), LT(_NU,KC_SPC) + ), + + /* + * Keymap: Numbers and symbols + * + * Note that the number keys here are actually numpad keystrokes. This often doesn't matter, but it may be relevant in a few cases. + * That's why the Num Lock key exists on this layer - just in case. + * + * This layer also contains the layout switches. + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | & | | | | / | 7 | 8 | 9 | * | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ~ |------| |------| | | 4 | 5 | 6 | - | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ` | | | | \ | 1 | 2 | 3 | + | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | |QWERTY|Colemk| | | | 0 | . | = | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * |NumLck| RESET| | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[_NU] = KEYMAP( + // left hand + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, + _______, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_AMPR, _______, + _______, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_TILD, + _______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_GRV, _______, + _______, DF(_QW), DF(_CO), _______, _______, + + KC_NLCK,RESET, + _______, + _______,_______,_______, + // right hand + _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, + _______, KC_SLSH, KC_P7, KC_P8, KC_P9, KC_PAST, _______, + KC_PIPE, KC_P4, KC_P5, KC_P6, KC_PMNS, _______, + _______, KC_BSLS, KC_P1, KC_P2, KC_P3, KC_PPLS, _______, + KC_P0, KC_PDOT, KC_EQL, _______, _______, + + _______, _______, + _______, + _______, _______, _______ + ), + + /* + * Keymap: Extend + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F11 | F12 | F13 | F14 | F15 | Mute | | | F16 | F17 | F18 | F19 | F20 | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | Ctrl`| Vol | | | PgUp | Home | Up | End | Del | | + * |--------+------+------+------+------+------| Up | | |------+------+------+------+------+--------| + * | | | Gui | Alt | Ctrl | |------| |------| PgDn | Left | Down | Right| BkSp | Menu | + * |--------+------+------+------+------+------| Vol | | |------+------+------+------+------+--------| + * | | Undo | Cut | Copy | | Paste| Down | | | | ^Tab | Tab | |Insert| PrntScr| + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + * + * Ctrl+` is a keyboard shortcut for the program ConEmu, which provides a Quake-style drop-down command prompt. + * + */ +[_EX] = KEYMAP( + // left hand + _______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_MUTE, + _______, _______, _______, _______, _______, KCX_CGR, KC_VOLU, + _______, _______, KC_LGUI, KC_LALT, KC_LCTL, _______, + _______, KX_UNDO, KX_CUT, KX_COPY, _______, KX_PAST, KC_VOLD, + _______, _______, _______, _______, _______, + + _______,_______, + _______, + _______,_______,_______, + // right hand + _______, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, _______, + _______, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_DEL, _______, + KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_BSPC, KC_MENU, + _______, _______, KX_STAB, KC_TAB, _______, KC_INS, KC_PSCR, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______ + ), + + /* + * Keymap: Gaming + * + * Provides a mouse overlay for the right hand, and also moves some "gamer friendly" keys to the left, such as space. + * This layer also removes a lot of dual-role keys, as when gaming, it's nicer not to need to keep track of those. + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | |WhlUp | MsUp |WhlDn | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |------| |------| |MsLeft|MsDown|MsRght| | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LCtrl| | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | ~_GA | | |MClick| + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | Space| |------| |------|RClick|LClick| + * | | | | | | | | + * `--------------------' `--------------------' + */ +[_GA] = KEYMAP( + // left hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + KC_LCTL, _______, _______, _______, _______, + + _______,_______, + _______, + KC_SPC, _______,_______, + + // right hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, _______, + _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, KC_BTN3, + _______, + _______, KC_BTN2, KC_BTN1 + ), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(_NU) // FN1 - Momentary Layer 1 (Numbers and symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + // uint8_t default_layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + + switch (layer) { + case _CO: + ergodox_right_led_1_on(); + break; + case _QW: + ergodox_right_led_2_on(); + break; + case _NU: + ergodox_right_led_3_on(); + break; + case _GA: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + default: + // none + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/replicaJunction/readme.md b/keyboards/ergodox/keymaps/replicaJunction/readme.md new file mode 100644 index 00000000..8c4c0335 --- /dev/null +++ b/keyboards/ergodox/keymaps/replicaJunction/readme.md @@ -0,0 +1,5 @@ +# replicaJunction - Ergodox (EZ) Layout + +I designed this layout, along with my complimentary Atreus layout, to address the challenge of having an Ergodox as my primary home keyboard and an Atreus as my primary work board. I wanted a layout that provided symbols in comfortable locations on both keyboards - but didn't require me to learn two separate sets of symbols for the two keyboards. + +I had originally used several keys as dual-role keys, where a tap would send a keypress and a long press and hold would trigger a different layer. However, after several months of experimenting with those ideas, I've begun moving away from that design due to performance. It's very hard to strike a balance between the time it takes to press a key normally while typing and the "delay" in the typing motion needed to trigger the alternate layer. I was frequently getting strange characters and artifacts because I pressed the function key + the symbol key too quickly, and the layer never shifted. \ No newline at end of file diff --git a/keyboards/ergodox/keymaps/reset_eeprom/keymap.c b/keyboards/ergodox/keymaps/reset_eeprom/keymap.c new file mode 100644 index 00000000..8d689765 --- /dev/null +++ b/keyboards/ergodox/keymaps/reset_eeprom/keymap.c @@ -0,0 +1,140 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + EPRM, + VRSN, + RGB_SLD +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | BkSp | A | S | D | F | G |------| |------| H | J | K | L |; / L2|' / Cmd | + * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| + * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | App | LGui | | Alt |Ctrl/Esc| + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + EPRM, EPRM, EPRM, EPRM, EPRM, EPRM, EPRM, + EPRM, EPRM, EPRM, EPRM, EPRM, EPRM, EPRM, + EPRM, EPRM, EPRM, EPRM, EPRM, EPRM, + EPRM, EPRM, EPRM, EPRM, EPRM, EPRM, EPRM, + EPRM, EPRM, EPRM, EPRM,EPRM, + EPRM, EPRM, + EPRM, + EPRM,EPRM,EPRM, + // right hand + EPRM, EPRM, EPRM, EPRM, EPRM, EPRM, EPRM, + EPRM, EPRM, EPRM, EPRM, EPRM, EPRM, EPRM, + EPRM, EPRM, EPRM, EPRM, EPRM,EPRM, + EPRM,EPRM, EPRM, EPRM,EPRM, EPRM, EPRM, + EPRM, EPRM,EPRM,EPRM, EPRM, + EPRM, EPRM, + EPRM, + EPRM,EPRM, EPRM + ) +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + break; + case 1: + if (record->event.pressed) { // For resetting EEPROM + eeconfig_init(); + } + break; + } + return MACRO_NONE; +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + // dynamically generate these. + case EPRM: + if (record->event.pressed) { + eeconfig_init(); + } + return false; + break; + case VRSN: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + return false; + break; + case RGB_SLD: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode(1); + #endif + } + return false; + break; + } + return true; +} + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + eeconfig_init(); +}; + + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/robot_test_layout/keymap.c b/keyboards/ergodox/keymaps/robot_test_layout/keymap.c new file mode 100644 index 00000000..e9e2597d --- /dev/null +++ b/keyboards/ergodox/keymaps/robot_test_layout/keymap.c @@ -0,0 +1,151 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + RGB_FF0000, + RGB_00FF00, + RGB_0000FF, + RGB_FFFFFF, + RGB_TOGGLE, + LED1, + LED2, + LED3 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[0] = KEYMAP( + RGB_TOGGLE, RGB_FF0000, RGB_00FF00, RGB_0000FF, RGB_FFFFFF, KC_5, KC_LPRN, + KC_GRAVE, KC_A, KC_B, KC_C, KC_D, KC_E, KC_EXLM, + KC_HASH, KC_J, KC_K, KC_L, KC_M, KC_N, + KC_AMPR, KC_T, KC_U, KC_V, KC_W, KC_X, KC_DLR, + KC_PIPE, KC_R, KC_PLUS, KC_LCBR, KC_RCBR, + + KC_F, KC_G, + KC_H, + KC_P, KC_O, KC_I, + + + + // RIGHT HAND + KC_RPRN, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_AT, KC_F, KC_G, KC_H, KC_I, KC_COLN, KC_BSLS, + KC_O, KC_P, KC_Q, KC_R, KC_S, KC_QUOT, + LSFT(KC_COMM), KC_Y, KC_Z, KC_COMM, KC_DOT, KC_SLSH, KC_ASTR, + KC_A, KC_B, KC_C, KC_D, KC_PIPE, + + LED1, KC_E, + LED2, + LED3, KC_J, KC_K + ) +}; + + + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(1) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case 0: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + break; + } + return MACRO_NONE; +}; + +bool status_led1_on = false, status_led2_on = false, status_led3_on = false; +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + // dynamically generate these. + case RGB_FF0000: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + EZ_RGB(0xff0000UL); + register_code(KC_1); unregister_code(KC_1); + #endif + } + return false; + break; + case RGB_00FF00: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + EZ_RGB(0x00ff00UL); + register_code(KC_2); unregister_code(KC_2); + #endif + } + return false; + break; + case RGB_0000FF: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + EZ_RGB(0x0000ffUL); + register_code(KC_3); unregister_code(KC_3); + #endif + } + return false; + break; + case RGB_FFFFFF: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + EZ_RGB(0xffffffUL); + register_code(KC_4); unregister_code(KC_4); + #endif + } + return false; + break; + case RGB_TOGGLE: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_toggle(); + register_code(KC_EQL); unregister_code(KC_EQL); + #endif + } + return false; + break; + case LED1: + if (record->event.pressed) { + if(status_led1_on) { + ergodox_right_led_1_off(); + status_led1_on = false; + } else { + ergodox_right_led_1_on(); + status_led1_on = true; + } + } + return false; + break; + case LED2: + if (record->event.pressed) { + if(status_led2_on) { + ergodox_right_led_2_off(); + status_led2_on = false; + } else { + ergodox_right_led_2_on(); + status_led2_on = true; + } + } + return false; + break; + case LED3: + if (record->event.pressed) { + if(status_led3_on) { + ergodox_right_led_3_off(); + status_led3_on = false; + } else { + ergodox_right_led_3_on(); + status_led3_on = true; + } + } + return false; + break; + } + return true; +} diff --git a/keyboards/ergodox/keymaps/robot_test_layout/readme.md b/keyboards/ergodox/keymaps/robot_test_layout/readme.md new file mode 100644 index 00000000..45dc2aa7 --- /dev/null +++ b/keyboards/ergodox/keymaps/robot_test_layout/readme.md @@ -0,0 +1,5 @@ +# Robot test layout + +Use this layout if you like to pretend you're [Norman](https://www.youtube.com/watch?v=-sbxFBay-tg), the ErgoDox EZ manufacturing robot. + +It's really meant just for internal use, but we're posting it on GitHub anyway, because hurray to open source. :) diff --git a/keyboards/ergodox/keymaps/sethbc/Makefile b/keyboards/ergodox/keymaps/sethbc/Makefile index 8c4ff878..457a3d01 100644 --- a/keyboards/ergodox/keymaps/sethbc/Makefile +++ b/keyboards/ergodox/keymaps/sethbc/Makefile @@ -1,14 +1,3 @@ -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -CUSTOM_MATRIX = yes # Custom matrix file for the ErgoDox EZ -SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -MIDI_ENABLE = no # MIDI controls -UNICODE_ENABLE = yes # Unicode - ifndef QUANTUM_DIR include ../../../../Makefile endif diff --git a/keyboards/ergodox/keymaps/sethbc/keymap.c b/keyboards/ergodox/keymaps/sethbc/keymap.c index 6846c4d5..8816ad63 100644 --- a/keyboards/ergodox/keymaps/sethbc/keymap.c +++ b/keyboards/ergodox/keymaps/sethbc/keymap.c @@ -15,7 +15,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LGUI, KC_GRV, KC_BSLS, KC_LEFT, KC_RGHT, KC_LCTL, KC_LALT, KC_HOME, - KC_SPC, KC_BSPC, KC_END, + KC_BSPC, KC_DEL, KC_END, // right hand MO(FN2), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_LBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRC, diff --git a/keyboards/ergodox/keymaps/sethbc/readme.md b/keyboards/ergodox/keymaps/sethbc/readme.md index 510b2f99..57b5d0ec 100644 --- a/keyboards/ergodox/keymaps/sethbc/readme.md +++ b/keyboards/ergodox/keymaps/sethbc/readme.md @@ -1,3 +1,4 @@ # sethbc's Ergodox EZ keymap -Largely based on the Ergodox Infinity default keymap +Largely based on the Ergodox Infinity default keymap, but layer locking has been +removed in favor of momentary layer activation diff --git a/keyboards/ergodox/keymaps/software_neo2/keymap.c b/keyboards/ergodox/keymaps/software_neo2/keymap.c index 41ace403..571ca062 100644 --- a/keyboards/ergodox/keymaps/software_neo2/keymap.c +++ b/keyboards/ergodox/keymaps/software_neo2/keymap.c @@ -1,7 +1,8 @@ #include "ergodox.h" #include "debug.h" +#include "led.h" #include "action_layer.h" -#include "keymap_neo2.h" +#include "keymap_extras/keymap_neo2.h" // Layer names #define BASE 0 // default layer @@ -11,45 +12,45 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 0: Basic layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | ^ | 1 | 2 | 3 | 4 | 5 | Play | | Next | 6 | 7 | 8 | 9 | 0 |BackSpce| + * | Del | 1 | 2 | 3 | 4 | 5 | Play | | Next | 6 | 7 | 8 | 9 | 0 | ß | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | Del | X | V | L | C | W | L1 | | L1 | K | H | G | F | Q | ß | + * | Tab | X | V | L | C | W | Esc | | Esc | K | H | G | F | Q | Y | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | Caps | U | I | A | E | O |------| |------| S | N | R | T | D | Y | - * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| - * | LShift |Ãœ/Ctrl| Ö/C-S| Ä/Alt| P | Z | | | | B | M | , | . | J | RShift | + * | NeoL1 | U | I | A | E | O |------| |------| S | N | R | T | D | NeoR1 | + * |--------+------+------+------+------+------| L1 | | L1 |------+------+------+------+------+--------| + * | LShift |Ãœ/Ctrl| Ö/Win| Ä/Alt| P | Z | | | | B | M | , | . | J | RShift | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | L1 | Home | PgDn | PgUp | End | | Right| Down | Up | Left | Esc | + * |NeoL2 | Home | PgDn | PgUp | End | | Right| Down | Up | Left | NeoR2| * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. + * ,-------------. ,---------------. * | App | LGui | | Alt |Ctrl/Esc| * ,------+------+------| |------+--------+------. - * | | |NeoL2 | |NeoL2 | | | - * | Tab |Backsp|------| |------| Space |Enter | - * | |ace |NeoL1 | |NeoL1 | | | + * | | | Enter| |Delete| | | + * | Space|Backsp|------| |------| Enter |Space | + * | |ace | Tab | | Esc | | | * `--------------------' `----------------------' */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* [BASE] = KEYMAP( // layer 0 : default // left hand - KC_CIRC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MPLY, - KC_DELT, NEO_X, NEO_V, NEO_L, NEO_C, NEO_W, TG(1), - KC_CAPS, NEO_U, NEO_I, NEO_A, NEO_E, NEO_O, - KC_LSFT, CTL_T(NEO_UE), C_S_T(NEO_OE), ALT_T(NEO_AE), NEO_P, NEO_Z, ALL_T(KC_NO), - DE_LESS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, - ALT_T(KC_APP),KC_LGUI, - NEO_L2_L, - KC_TAB,KC_BSPC,NEO_L1_L, + KC_DELT, NEO_1, NEO_2, NEO_3, NEO_4, NEO_5, KC_MPLY, + KC_TAB, NEO_X, NEO_V, NEO_L, NEO_C, NEO_W, KC_ESC, + NEO_L1_L, NEO_U, NEO_I, NEO_A, NEO_E, NEO_O, + KC_LSFT, CTL_T(NEO_UE), GUI_T(NEO_OE), ALT_T(NEO_AE), NEO_P, NEO_Z, TG(1), + NEO_L2_L, KC_HOME, KC_PGDN, KC_PGUP, KC_END, + C_S_T(KC_ESC),KC_LGUI, + KC_ENT, + KC_SPC,KC_BSPC,KC_TAB, // right hand - KC_MNXT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - TG(1), NEO_K, NEO_H, NEO_G, NEO_F, NEO_Q, NEO_SS, - NEO_S, NEO_N, NEO_R, NEO_T, NEO_D, NEO_Y, - MEH_T(KC_NO),NEO_B, NEO_M, KC_COMM, KC_DOT, NEO_J, KC_RSFT, - KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ESC, - KC_LALT,CTL_T(KC_ESC), - NEO_L2_R, - NEO_L1_R,KC_SPC, KC_ENT + KC_MNXT, NEO_6, NEO_7, NEO_8, NEO_9, NEO_0, NEO_SS, + KC_ESC, NEO_K, NEO_H, NEO_G, NEO_F, NEO_Q, NEO_Y, + NEO_S, NEO_N, NEO_R, NEO_T, NEO_D, NEO_L1_R, + TG(1), NEO_B, NEO_M, NEO_COMM, NEO_DOT, NEO_J, KC_RSFT, + KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, NEO_L2_R, + KC_LALT,KC_RGUI, + KC_DELT, + KC_ESC,KC_ENT, KC_SPC ), /* Keymap 1: Media and mouse keys * @@ -127,13 +128,16 @@ void matrix_scan_user(void) { ergodox_right_led_1_off(); ergodox_right_led_2_off(); ergodox_right_led_3_off(); + ergodox_board_led_off(); + + if (host_keyboard_leds() & (1<", + { + "x": 4.5 + }, + "", + { + "a": 4 + }, + "^\n6" + ], + [ + { + "y": -0.875, + "w": 1.5 + }, + "°\n§", + "!\n1", + { + "x": 14.5 + }, + ")\n0", + { + "w": 1.5 + }, + "?\n'\n\n'" + ], + [ + { + "y": -0.375, + "x": 3.5 + }, + "E", + { + "x": 10.5 + }, + "I" + ], + [ + { + "y": -0.875, + "x": 2.5 + }, + "W", + { + "x": 1 + }, + "R", + { + "x": 8.5 + }, + "U", + { + "x": 1 + }, + "O" + ], + [ + { + "y": -0.875, + "x": 5.5 + }, + "T", + { + "c": "#b56b6b", + "a": 6, + "h": 1.5 + }, + "Toggle Code Layer", + { + "x": 4.5, + "h": 1.5 + }, + "Toggle Code Layer", + { + "c": "#cccccc", + "a": 4 + }, + "Y" + ], + [ + { + "y": -0.875, + "a": 6, + "w": 1.5 + }, + "Delete", + { + "a": 4 + }, + "Q", + { + "x": 14.5 + }, + "P", + { + "w": 1.5 + }, + "è\nü\n\n[" + ], + [ + { + "y": -0.375, + "x": 3.5 + }, + "D", + { + "x": 10.5 + }, + "K" + ], + [ + { + "y": -0.875, + "x": 2.5 + }, + "S", + { + "x": 1 + }, + "F", + { + "x": 8.5 + }, + "J", + { + "x": 1 + }, + "L" + ], + [ + { + "y": -0.875, + "x": 5.5 + }, + "G", + { + "x": 6.5 + }, + "H" + ], + [ + { + "y": -0.875, + "a": 6, + "w": 1.5 + }, + "Backspace", + { + "c": "#79c777", + "a": 4 + }, + "A\n\nLyr3", + { + "x": 14.5 + }, + "é\nö\nLyr3", + { + "c": "#748adb", + "w": 1.5 + }, + "à\nä\nCmd\n{" + ], + [ + { + "y": -0.625, + "x": 6.5, + "c": "#cccccc", + "a": 6, + "h": 1.5 + }, + "Hyper", + { + "x": 4.5, + "h": 1.5 + }, + "Meh" + ], + [ + { + "y": -0.75, + "x": 3.5, + "a": 4 + }, + "C", + { + "x": 10.5 + }, + ";\n," + ], + [ + { + "y": -0.875, + "x": 2.5, + "c": "#748adb" + }, + "X\n\nAlt", + { + "x": 1, + "c": "#cccccc" + }, + "V", + { + "x": 8.5 + }, + "M", + { + "x": 1, + "c": "#748adb" + }, + ":\n.\nAlt" + ], + [ + { + "y": -0.875, + "x": 5.5, + "c": "#cccccc" + }, + "B", + { + "x": 6.5 + }, + "N" + ], + [ + { + "y": -0.875, + "a": 6, + "w": 1.5 + }, + "Shift", + { + "c": "#748adb", + "a": 4 + }, + "Z\n\nCtrl", + { + "x": 14.5 + }, + "_\n-\nCtrl", + { + "c": "#cccccc", + "a": 6, + "w": 1.5 + }, + "Shift" + ], + [ + { + "y": -0.375, + "x": 3.5, + "a": 7 + }, + "", + { + "x": 10.5 + }, + "" + ], + [ + { + "y": -0.875, + "x": 2.5, + "a": 4 + }, + "£\n$\n\n}", + { + "x": 1, + "a": 7 + }, + "", + { + "x": 10.5, + "a": 6 + }, + "AltGr" + ], + [ + { + "y": -0.9950000000000001, + "x": 14, + "a": 7 + }, + "" + ], + [ + { + "y": -0.7549999999999999, + "x": 0.5, + "c": "#b56b6b", + "a": 4 + }, + ">\n<\nCode Layer\n\\", + { + "c": "#cccccc" + }, + "`\n^\n\n~", + { + "x": 14.5 + }, + "!\n¨\n\n]", + { + "c": "#b56b6b" + }, + "\n\nCode Layer" + ], + [ + { + "r": 30, + "rx": 6.5, + "ry": 4.25, + "y": -1, + "x": 1, + "c": "#748adb" + }, + "Apps\nAlt", + { + "c": "#cccccc", + "a": 6 + }, + "Win / Cmd" + ], + [ + { + "h": 2 + }, + "Space", + { + "h": 2 + }, + "Back Space", + "Home" + ], + [ + { + "x": 2 + }, + "End" + ], + [ + { + "r": -30, + "rx": 13, + "y": -1, + "x": -3 + }, + "Alt", + { + "c": "#748adb", + "a": 4 + }, + "Esc\nCtrl" + ], + [ + { + "x": -3, + "c": "#cccccc", + "a": 6 + }, + "Pg Up", + { + "h": 2 + }, + "Tab", + { + "h": 2 + }, + "Enter" + ], + [ + { + "x": -3 + }, + "Pg Dn" + ] +] diff --git a/keyboards/ergodox/keymaps/swissgerman/keyboard-layout.png b/keyboards/ergodox/keymaps/swissgerman/keyboard-layout.png new file mode 100644 index 00000000..aff6af85 Binary files /dev/null and b/keyboards/ergodox/keymaps/swissgerman/keyboard-layout.png differ diff --git a/keyboards/ergodox/keymaps/swissgerman/keyboard-layout_1_2.json b/keyboards/ergodox/keymaps/swissgerman/keyboard-layout_1_2.json new file mode 100644 index 00000000..38a72851 --- /dev/null +++ b/keyboards/ergodox/keymaps/swissgerman/keyboard-layout_1_2.json @@ -0,0 +1,436 @@ +[ + { + "backcolor": "#ffffff", + "name": "Ergodox Swiss German Layout - Symbol & Media Layer", + "author": "Andreas Schmidt (https://github.com/remigius42)" + }, + [ + { + "x": 3.5, + "t": "#b81c1c" + }, + "F3", + { + "x": 10.5 + }, + "F8" + ], + [ + { + "y": -0.875, + "x": 2.5 + }, + "F2", + { + "x": 1 + }, + "F4", + { + "x": 8.5 + }, + "F7", + { + "x": 1 + }, + "F9" + ], + [ + { + "y": -0.875, + "x": 5.5 + }, + "F5", + { + "t": "#000000", + "a": 7 + }, + "", + { + "x": 4.5 + }, + "", + { + "t": "#b81c1c", + "a": 4 + }, + "F6" + ], + [ + { + "y": -0.875, + "t": "#000000\n\n\n#529151", + "w": 1.5 + }, + "\n\n\nFlash", + { + "t": "#b81c1c" + }, + "F1", + { + "x": 14.5 + }, + "F10", + { + "t": "#b81c1c\n\n\n#529151", + "w": 1.5 + }, + "F11\n\n\nFlash" + ], + [ + { + "y": -0.375, + "x": 3.5 + }, + "{\n\n\n", + { + "x": 10.5, + "t": "#b81c1c" + }, + "8" + ], + [ + { + "y": -0.875, + "x": 2.5 + }, + "@", + { + "x": 1 + }, + "}", + { + "x": 8.5, + "t": "#b81c1c\n\n\n#529151" + }, + "7\n\n\nHTML ul", + { + "x": 1 + }, + "9\n\n\nHTML ol" + ], + [ + { + "y": -0.875, + "x": 5.5, + "t": "#b81c1c" + }, + "|", + { + "t": "#000000", + "a": 7, + "h": 1.5 + }, + "", + { + "x": 4.5, + "h": 1.5 + }, + "", + { + "t": "#b81c1c", + "a": 4 + }, + "" + ], + [ + { + "y": -0.875, + "t": "#000000", + "a": 7, + "w": 1.5 + }, + "", + { + "t": "#b81c1c", + "a": 4 + }, + "!", + { + "x": 14.5 + }, + "*", + { + "w": 1.5 + }, + "F12" + ], + [ + { + "y": -0.375, + "x": 3.5, + "t": "#b81c1c\n\n\n#529151" + }, + "(\n\n\n", + { + "x": 10.5 + }, + "5\n\n\nHTML li" + ], + [ + { + "y": -0.875, + "x": 2.5 + }, + "$\n\n\n", + { + "x": 1 + }, + ")\n\n\n", + { + "x": 8.5, + "t": "#b81c1c" + }, + "4", + { + "x": 1 + }, + "6" + ], + [ + { + "y": -0.875, + "x": 5.5 + }, + "`", + { + "x": 6.5 + }, + "" + ], + [ + { + "y": -0.875, + "t": "#000000", + "a": 7, + "w": 1.5 + }, + "", + { + "t": "#b81c1c", + "a": 4 + }, + "#", + { + "x": 14.5 + }, + "+", + { + "t": "#000000\n\n\n#529151", + "w": 1.5 + }, + "\n\n\n" + ], + [ + { + "y": -0.625, + "x": 6.5, + "t": "#000000", + "a": 7, + "h": 1.5 + }, + "", + { + "x": 4.5, + "h": 1.5 + }, + "" + ], + [ + { + "y": -0.75, + "x": 3.5, + "t": "#b81c1c\n\n\n#529151", + "a": 4 + }, + "[\n\n\nHTML code", + { + "x": 10.5 + }, + "2\n\n\n" + ], + [ + { + "y": -0.875, + "x": 2.5, + "t": "#b81c1c" + }, + "^", + { + "x": 1, + "t": "#b81c1c\n\n\n#529151" + }, + "]\n\n\nHTML br", + { + "x": 8.5, + "t": "#b81c1c" + }, + "1", + { + "x": 1, + "t": "#b81c1c\n\n\n#529151" + }, + "3\n\n\n" + ], + [ + { + "y": -0.875, + "x": 5.5, + "t": "#b81c1c" + }, + "~", + { + "x": 6.5 + }, + "&" + ], + [ + { + "y": -0.875, + "t": "#000000", + "a": 7, + "w": 1.5 + }, + "", + { + "t": "#b81c1c", + "a": 4 + }, + "%", + { + "x": 14.5 + }, + "\\", + { + "t": "#000000", + "a": 7, + "w": 1.5 + }, + "" + ], + [ + { + "y": -0.375, + "x": 3.5, + "t": "#000000\n\n\n#529151", + "a": 4 + }, + "\n\n\nleft click", + { + "x": 10.5, + "t": "#b81c1c\n\n\n#529151" + }, + ".\n\n\n" + ], + [ + { + "y": -0.875, + "x": 2.5, + "t": "#000000", + "a": 7 + }, + "", + { + "x": 1, + "t": "#000000\n\n\n#529151", + "a": 4 + }, + "\n\n\nright click", + { + "x": 8.5, + "t": "#b81c1c\n\n\n#529151" + }, + "?\n\n\n", + { + "x": 1, + "t": "#b81c1c" + }, + "0" + ], + [ + { + "y": -0.75, + "x": 0.5, + "t": "#000000", + "a": 7 + }, + "", + { + "t": "#b81c1c", + "a": 4 + }, + "EPRM RST", + { + "x": 14.5, + "t": "#000000", + "a": 7 + }, + "", + "" + ], + [ + { + "r": 30, + "rx": 6.5, + "ry": 4.25, + "y": -1, + "x": 1 + }, + "", + "" + ], + [ + { + "t": "#000000\n\n\n#529151", + "a": 4, + "h": 2 + }, + "\n\n\nEnter", + { + "t": "#000000", + "a": 7, + "h": 2 + }, + "", + "" + ], + [ + { + "x": 2 + }, + "" + ], + [ + { + "r": -30, + "rx": 13, + "y": -1, + "x": -3 + }, + "", + "" + ], + [ + { + "x": -3 + }, + "", + { + "h": 2 + }, + "", + { + "t": "#000000\n\n\n#529151", + "a": 4, + "h": 2 + }, + "\n\n\nWeb back" + ], + [ + { + "x": -3, + "t": "#000000", + "a": 7 + }, + "" + ] +] diff --git a/keyboards/ergodox/keymaps/swissgerman/keyboard-layout_1_2.png b/keyboards/ergodox/keymaps/swissgerman/keyboard-layout_1_2.png new file mode 100644 index 00000000..54c4a758 Binary files /dev/null and b/keyboards/ergodox/keymaps/swissgerman/keyboard-layout_1_2.png differ diff --git a/keyboards/ergodox/keymaps/swissgerman/keymap.c b/keyboards/ergodox/keymaps/swissgerman/keymap.c new file mode 100644 index 00000000..2291fb65 --- /dev/null +++ b/keyboards/ergodox/keymaps/swissgerman/keymap.c @@ -0,0 +1,287 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" +#include "string.h" + +#ifdef SUBPROJECT_infinity +#include "visualizer/lcd_backlight.h" +#endif + + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys + +#define EPRM M(1) // Macro 1: Reset EEPROM +#define HTML_LI M(10) +#define HTML_UL M(11) +#define HTML_OL M(12) +#define HTML_CODE M(13) +#define HTML_BR M(14) + +#define SEND_TAG(TAG) do {\ + send_key(KC_NONUS_BSLASH); \ + SEND_STRING(TAG); \ + send_larger_than(); \ + send_key(KC_NONUS_BSLASH); \ + SEND_STRING("&"); \ + SEND_STRING(TAG); \ + send_larger_than(); \ + go_back_based_on_tag(TAG); \ + } while (0) + +#define SEND_SHORT_TAG(TAG) do {\ + send_key(KC_NONUS_BSLASH); \ + SEND_STRING(TAG); \ + SEND_STRING("&"); \ + send_larger_than(); \ + } while (0) + +void send_key(uint16_t keycode); +void go_back_based_on_tag(char* tag); +void send_larger_than(void); + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | § | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | ' | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Del | Q | W | E | R | T | L1 | | L1 | Z | U | I | O | P | ü | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | BkSp | A /L2| S | D | F | G |------| |------| H | J | K | L |ö / L2|ä / Cmd | + * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| + * | LShift |Y/Ctrl|X/Alt | C | V | B | | | | N | M | , |./Alt |-/Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |< / L1| ^ | $ | Left | Right| | Up | Down |AltGr | ¨ | ~L1 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | App | LGui | | Alt |Ctrl/Esc| + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, + KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), + KC_BSPC, LT(MDIA, KC_A),KC_S, KC_D, KC_F, KC_G, + KC_LSFT, CTL_T(KC_Z), ALT_T(KC_X), KC_C, KC_V, KC_B, ALL_T(KC_NO), + LT(SYMB,KC_NONUS_BSLASH), KC_EQL, KC_BSLS, KC_LEFT,KC_RGHT, + ALT_T(KC_APP), KC_LGUI, + KC_HOME, + KC_SPC,KC_BSPC,KC_END, + // right hand + KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT), + MEH_T(KC_NO),KC_N, KC_M, KC_COMM,ALT_T(KC_DOT), CTL_T(KC_SLSH), KC_RSFT, + KC_UP, KC_DOWN,KC_RALT,KC_RBRC, KC_FN1, + KC_LALT,CTL_T(KC_ESC), + KC_PGUP, + KC_PGDN,KC_TAB, KC_ENT + ), +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | EPRM | | | | | ? | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + M(0), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), ACTION_MODS_KEY(MOD_RALT, KC_2), ACTION_MODS_KEY(MOD_RALT, KC_QUOT), ACTION_MODS_KEY(MOD_RALT, KC_BSLS),ACTION_MODS_KEY(MOD_RALT,KC_7),KC_TRNS, + KC_TRNS,ACTION_MODS_KEY(MOD_RALT,KC_3),KC_BSLS, ACTION_MODS_KEY(MOD_LSFT, KC_8), ACTION_MODS_KEY(MOD_RSFT, KC_9),ACTION_MODS_KEY(MOD_LSFT,KC_EQL), + KC_TRNS,ACTION_MODS_KEY(MOD_LSFT,KC_5),KC_EQL, ACTION_MODS_KEY(MOD_RALT, KC_LBRC), ACTION_MODS_KEY(MOD_RALT, KC_RBRC),ACTION_MODS_KEY(MOD_RALT,KC_EQL),KC_TRNS, + KC_TRNS,EPRM,KC_TRNS,KC_NONUS_BSLASH, ACTION_MODS_KEY(MOD_LSFT, KC_NONUS_BSLASH)/*KC_TRNS,KC_TRNS*/, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, ACTION_MODS_KEY(MOD_RSFT,KC_3), KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, ACTION_MODS_KEY(MOD_RSFT,KC_1), KC_TRNS, + KC_TRNS, ACTION_MODS_KEY(MOD_RSFT,KC_6), KC_1, KC_2, KC_3, ACTION_MODS_KEY(MOD_RALT,KC_NONUS_BSLASH), KC_TRNS, + ACTION_MODS_KEY(MOD_RSFT,KC_MINS),KC_DOT, KC_0, KC_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | RESET | | | | | | | | | | | | | | RESET | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | |H_UL | |H_OL | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | |H_LI | | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |H_CODE| |H_BR | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * |Enter | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MDIA] = KEYMAP( + RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, HTML_CODE, KC_TRNS, HTML_BR, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_ENT, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, + KC_TRNS, KC_TRNS, HTML_UL, KC_TRNS, HTML_OL, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, HTML_LI, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + break; + case 1: + if (record->event.pressed) { // For resetting EEPROM + eeconfig_init(); + } + break; + case 10: + if (record->event.pressed) { + SEND_TAG("li"); + } + break; + case 11: + if (record->event.pressed) { + SEND_TAG("ul"); + } + break; + case 12: + if (record->event.pressed) { + SEND_TAG("ol"); + } + break; + case 13: + if (record->event.pressed) { + SEND_TAG("code"); + } + break; + case 14: + if (record->event.pressed) { + SEND_SHORT_TAG("br"); + } + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 0: + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + + #ifdef SUBPROJECT_infinity + lcd_backlight_hal_color(0, 0, 0); + #endif + break; + case 1: + ergodox_right_led_1_on(); + + ergodox_board_led_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + #ifdef SUBPROJECT_infinity + lcd_backlight_hal_color(5000, 0, 0); + #endif + break; + case 2: + ergodox_right_led_2_on(); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_3_off(); + #ifdef SUBPROJECT_infinity + lcd_backlight_hal_color(0, 5000, 0); + #endif + break; + default: + // none + break; + } + +}; + +void send_key(uint16_t keycode) { + register_code(keycode); + unregister_code(keycode); +} + +void go_back_based_on_tag(char* tag) { + const int BRACKETS_AND_SLASH_LENGTH = 3; + + for (int i=0; i < strlen(tag) + BRACKETS_AND_SLASH_LENGTH; i++) { + send_key(KC_LEFT); + } +} + +void send_larger_than() { + register_code(KC_LSFT); + send_key(KC_NONUS_BSLASH); + unregister_code(KC_LSFT); +} diff --git a/keyboards/ergodox/keymaps/swissgerman/readme.md b/keyboards/ergodox/keymaps/swissgerman/readme.md new file mode 100644 index 00000000..b1061c1d --- /dev/null +++ b/keyboards/ergodox/keymaps/swissgerman/readme.md @@ -0,0 +1,15 @@ +# ErgoDox Swiss German Configuration + +Swiss German keyboard layout based on the Ergodox EZ default layout. + +Keyboard diagrams created with the [keyboard layout editor](http://www.keyboard-layout-editor.com). + +Diagram sources: [default layer](keyboard-layout.json), [layer 1 & 2](keyboard-layout_1_2.json) + +![Layout Layer 0](keyboard-layout.png) +![Layout Layer 1&2](keyboard-layout_1_2.png) + +## Changelog +* Jan 21, 2017: + * Initial version based on default layout. + diff --git a/keyboards/ergodox/keymaps/twey/keymap.c b/keyboards/ergodox/keymaps/twey/keymap.c index 5deacd63..1ecbce46 100644 --- a/keyboards/ergodox/keymaps/twey/keymap.c +++ b/keyboards/ergodox/keymaps/twey/keymap.c @@ -205,6 +205,7 @@ void matrix_init_user(void) { // Runs constantly in the background, in a loop. void matrix_scan_user(void) { + __attribute__ ((unused)) uint32_t layer0 = layer_state & (1UL << 0), layer1 = layer_state & (1UL << 1), layer2 = layer_state & (1UL << 2), diff --git a/keyboards/ergodox/keymaps/videck/Makefile b/keyboards/ergodox/keymaps/videck/Makefile new file mode 100644 index 00000000..5c7d21f2 --- /dev/null +++ b/keyboards/ergodox/keymaps/videck/Makefile @@ -0,0 +1,19 @@ +AUDIO_ENABLE:=no +BACKLIGHT_ENABLE:=no +BLUETOOTH_ENABLE:=no +BOOTMAGIC_ENABLE:=no +COMMAND_ENABLE:=no +CONSOLE_ENABLE:=no +EXTRAKEY_ENABLE:=yes +MIDI_ENABLE:=no +MOUSEKEY_ENABLE:=yes +NKRO_ENABLE:=no +RGBLIGHT_ENABLE:=no +SLEEP_LED_ENABLE:=no +TAP_DANCE_ENABLE:=yes +UNICODEMAP_ENABLE:=no +UNICODE_ENABLE:=no + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/ergodox/keymaps/videck/config.h b/keyboards/ergodox/keymaps/videck/config.h new file mode 100644 index 00000000..d89aabe7 --- /dev/null +++ b/keyboards/ergodox/keymaps/videck/config.h @@ -0,0 +1,13 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#ifndef NO_DEBUG + #define NO_DEBUG +#endif +#ifndef NO_PRINT + #define NO_PRINT +#endif + +#endif diff --git a/keyboards/ergodox/keymaps/videck/keymap.c b/keyboards/ergodox/keymaps/videck/keymap.c new file mode 100644 index 00000000..7bd6274e --- /dev/null +++ b/keyboards/ergodox/keymaps/videck/keymap.c @@ -0,0 +1,179 @@ +#include + +#include "ergodox.h" +#include "action_layer.h" + +enum { + BASE = 0, // Default layer + ARROWS = 1, // Arrows and Fx keys layer + MOUSE = 2, // Mouse movement and buttons layer + PARENS = 3, // Parenthesis easy access layer + + TD_L = 0, // Tap dance index for left shift + TD_R = 1 // Tap dance index for right shift +}; + +// See the videck.png image for a visualization of the layout. +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [BASE] = KEYMAP( + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_HOME, + KC_EQL, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_END, + MO(PARENS), KC_A, KC_S, KC_D, KC_F, KC_G, + TD(TD_L), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_BSPC, + KC_LCTL, KC_LALT, KC_VOLD, KC_VOLU, KC_MUTE, + KC_ESC, KC_LGUI, + TG(MOUSE), + KC_SPC, KC_TAB, TG(ARROWS), + // right hand + KC_PGUP, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_PGDN, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_DELT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, TD(TD_R), + KC_LBRC, KC_RBRC, KC_EQL, KC_RALT, KC_RCTL, + KC_APP, KC_ESC, + KC_INS, + KC_SLCK, KC_ENT, KC_SPC + ), + [ARROWS] = KEYMAP( + // left hand + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_NO, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12, + KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS + ), + [MOUSE] = KEYMAP( + // left hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_BTN3, KC_TRNS, + KC_TRNS, + KC_BTN1, KC_BTN2, KC_NO, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS + ), + [PARENS] = KEYMAP( + // left hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_NO, + KC_TRNS, KC_TRNS, KC_NO, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LCBR, KC_RCBR, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_LPRN, KC_RPRN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS + ) +}; + +typedef void (*videck_tap_dance_trigger_t) (const uint16_t kc); + +typedef struct +{ + uint16_t kc1; + uint16_t kc2; + videck_tap_dance_trigger_t trigger; +} videck_tap_dance_tuple_t; + +static void videck_tap_dance_finished (qk_tap_dance_state_t *state, void *user_data) { + videck_tap_dance_tuple_t *const tuple = (videck_tap_dance_tuple_t *)user_data; + + if (state->count == 1) { + register_code16 (tuple->kc1); + } else if (state->count == 2) { + register_code16 (tuple->kc2); + } +} + +static void videck_tap_dance_reset (qk_tap_dance_state_t *state, void *user_data) { + videck_tap_dance_tuple_t *const tuple = (videck_tap_dance_tuple_t *)user_data; + + if (state->count == 1) { + unregister_code16 (tuple->kc1); + } else if (state->count == 2) { + unregister_code16 (tuple->kc2); + tuple->trigger(tuple->kc2); + } +} + +static bool caps_lock_is_on; + +// Toggles caps lock status. +static void videck_caps_trigger (const uint16_t kc) { + caps_lock_is_on ^= true; +} + +#define ACTION_TAP_DANCE_DOUBLE_TRIGGER(kc1, kc2, double_trigger) { \ + .fn = { NULL, videck_tap_dance_finished, videck_tap_dance_reset }, \ + .user_data = (void *)&((videck_tap_dance_tuple_t) { kc1, kc2, double_trigger }), \ + } + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_L] = ACTION_TAP_DANCE_DOUBLE_TRIGGER(KC_LSFT, KC_CAPS, videck_caps_trigger), + [TD_R] = ACTION_TAP_DANCE_DOUBLE_TRIGGER(KC_RSFT, KC_CAPS, videck_caps_trigger) +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + ergodox_led_all_set(LED_BRIGHTNESS_LO); + caps_lock_is_on = false; +}; + +static void indicate_using_led(const uint8_t led, const bool enabled) { + if (enabled) { + ergodox_right_led_on(led); + } else { + ergodox_right_led_off(led); + } +} + +static inline void indicate_caps_lock_state(const bool enabled) { + indicate_using_led(1, enabled); +} + +static inline void indicate_arrows_layer_state(const bool enabled) { + indicate_using_led(2, enabled); +} + +static inline void indicate_mouse_layer_state(const bool enabled) { + indicate_using_led(3, enabled); +} + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + // Check if we have shift locked. + indicate_caps_lock_state(caps_lock_is_on); + indicate_arrows_layer_state(IS_LAYER_ON(ARROWS)); + indicate_mouse_layer_state(IS_LAYER_ON(MOUSE)); +}; diff --git a/keyboards/ergodox/keymaps/videck/readme.md b/keyboards/ergodox/keymaps/videck/readme.md new file mode 100644 index 00000000..759e81ba --- /dev/null +++ b/keyboards/ergodox/keymaps/videck/readme.md @@ -0,0 +1,24 @@ +ViDeck keymap for ErgoDox +========================= + +This is a QWERTY layout based on the US layout, where Vi functionality has been +especially considered. + +# Features +* Mouse movements using the Vi movement keys. +* Vi movement keys doubling as arrow keys. +* Shift lock using double tap. +* A coder's modifier key for easy input of parenthesis. +* Acess to the escape key using either thumb. +* Reasonably accessible Scroll Lock key (useful if you, like me, want to switch + to a non-US layout once in a while in X). + +# Missing keys +* Caps Lock (shift lock is used instead). +* Pause/Break. +* Print Screen. + +# LEDs +* Shift lock is indicated using first LED. +* Arrow keys layer is indicated using second LED. +* Mouse keys layer is indicated using third LED. diff --git a/keyboards/ergodox/keymaps/videck/videck.json b/keyboards/ergodox/keymaps/videck/videck.json new file mode 100644 index 00000000..7068cf54 --- /dev/null +++ b/keyboards/ergodox/keymaps/videck/videck.json @@ -0,0 +1,443 @@ +[ + { + "backcolor": "#333333", + "background": { + "name": "PBT Black", + "style": "background-image: url('/bg/plastic/pbt-black.png');" + }, + "switchMount": "cherry", + "switchBrand": "gateron", + "switchType": "KS-3-Red" + }, + [ + { + "x": 3.5, + "c": "#323232", + "t": "#ffffff\n\n\n#ac97d8" + }, + "#\n3\n\nF3", + { + "x": 10.5 + }, + "*\n8\n\nF8" + ], + [ + { + "y": -0.875, + "x": 2.5 + }, + "@\n2\n\nF2", + { + "x": 1 + }, + "$\n4\n\nF4", + { + "x": 8.5 + }, + "&\n7\n\nF7", + { + "x": 1, + "t": "#ffffff\n\n\n#ac97d8\n\n\n\n#555454" + }, + "(\n9\n\nF9" + ], + [ + { + "y": -0.875, + "x": 5.5, + "t": "#ffffff\n\n\n#ac97d8" + }, + "%\n5\n\nF5", + { + "t": "#ffffff" + }, + "home", + { + "x": 4.5 + }, + "pgup", + { + "t": "#ffffff\n\n\n#ac97d8" + }, + "^\n6\n\nF6" + ], + [ + { + "y": -0.875, + "t": "#ffffff", + "w": 1.5 + }, + "~\n`", + { + "t": "#ffffff\n\n\n#ac97d8" + }, + "!\n1\n\nF1", + { + "x": 14.5 + }, + ")\n0\n\nF10", + { + "w": 1.5 + }, + "_\n-\n\nF11" + ], + [ + { + "y": -0.375, + "x": 3.5, + "t": "#ffffff" + }, + "E", + { + "x": 10.5 + }, + "I" + ], + [ + { + "y": -0.875, + "x": 2.5 + }, + "W", + { + "x": 1 + }, + "R", + { + "x": 8.5 + }, + "U", + { + "x": 1, + "t": "#ffffff\n\n\n\n\n\n\n\n\n#f8d615" + }, + "O\n\n\n\n\n\n\n\n\n{" + ], + [ + { + "y": -0.875, + "x": 5.5, + "t": "#ffffff" + }, + "T", + { + "h": 1.5 + }, + "end", + { + "x": 4.5, + "h": 1.5 + }, + "pgdn", + "Y" + ], + [ + { + "y": -0.875, + "w": 1.5 + }, + "+\n=", + "Q", + { + "x": 14.5, + "t": "#ffffff\n\n\n\n\n\n\n\n\n#f8d615" + }, + "P\n\n\n\n\n\n\n\n\n}", + { + "t": "#ffffff\n\n\n#ac97d8", + "w": 1.5 + }, + "|\n\\\n\nF12" + ], + [ + { + "y": -0.375, + "x": 3.5, + "t": "#ffffff" + }, + "D", + { + "x": 10.5, + "t": "#ffffff\n\n#5eb1e7\n#ac97d8" + }, + "K\n\n\n" + ], + [ + { + "y": -0.875, + "x": 2.5, + "t": "#ffffff" + }, + "S", + { + "x": 1, + "n": true + }, + "F", + { + "x": 8.5, + "t": "#ffffff\n\n#5eb1e7\n#ac97d8", + "n": true + }, + "J\n\n\n", + { + "x": 1, + "t": "#ffffff\n\n#5eb1e7\n#ac97d8\n\n\n\n\n\n#f8d615" + }, + "L\n\n\n\n\n\n\n\n\n(" + ], + [ + { + "y": -0.875, + "x": 5.5, + "t": "#ffffff" + }, + "G", + { + "x": 6.5, + "t": "#ffffff\n\n#5eb1e7\n#ac97d8" + }, + "H\n\n\n" + ], + [ + { + "y": -0.875, + "t": "#f8d615", + "a": 6, + "w": 1.5 + }, + "( ) [ ] { }", + { + "t": "#ffffff", + "a": 4 + }, + "A", + { + "x": 14.5, + "t": "#ffffff\n\n\n\n\n\n\n#60605b\n\n#f8d615" + }, + ":\n;\n\n\n\n\n\nÖ\n\n)", + { + "t": "#ffffff\n\n\n\n\n\n\n#60605b", + "w": 1.5 + }, + "\"\n'\n\n\n\n\n\nÄ" + ], + [ + { + "y": -0.625, + "x": 6.5, + "t": "#ffffff", + "h": 1.5 + }, + "", + { + "x": 4.5, + "h": 1.5 + }, + "" + ], + [ + { + "y": -0.75, + "x": 3.5 + }, + "C", + { + "x": 10.5 + }, + "<\n," + ], + [ + { + "y": -0.875, + "x": 2.5 + }, + "X", + { + "x": 1 + }, + "V", + { + "x": 8.5 + }, + "M", + { + "x": 1, + "t": "#ffffff\n\n\n\n\n\n\n\n\n#f8d615" + }, + ">\n.\n\n\n\n\n\n\n\n[" + ], + [ + { + "y": -0.875, + "x": 5.5, + "t": "#ffffff" + }, + "B", + { + "x": 6.5 + }, + "N" + ], + [ + { + "y": -0.875, + "t": "#ffffff\n\n#f67f00", + "a": 6, + "fa": [ + 5 + ], + "w": 1.5 + }, + "⇑\n\n2-tap
locks", + { + "t": "#ffffff", + "a": 4, + "f": 3 + }, + "Z", + { + "x": 14.5, + "t": "#ffffff\n\n\n\n\n\n\n\n\n#f8d615", + "f": 3 + }, + "?\n/\n\n\n\n\n\n\n\n]", + { + "t": "#ffffff\n\n#f67f00", + "a": 6, + "f": 3, + "w": 1.5 + }, + "⇑\n\n2-tap
locks" + ], + [ + { + "y": -0.375, + "x": 3.5, + "t": "#ffffff", + "a": 4 + }, + "\n", + { + "x": 10.5, + "f": 3 + }, + "}\n]" + ], + [ + { + "y": -0.875, + "x": 2.5 + }, + "\n", + { + "x": 1 + }, + "\n", + { + "x": 8.5, + "t": "#ffffff\n\n\n\n\n\n\n#60605b", + "f": 3 + }, + "{\n[\n\n\n\n\n\nÅ", + { + "x": 1, + "t": "#ffffff", + "f": 3 + }, + "+\n=" + ], + [ + { + "y": -0.75, + "x": 0.5, + "f": 3 + }, + "ctrl", + { + "f": 3 + }, + "alt", + { + "x": 14.5, + "f": 3 + }, + "altgr", + { + "f": 3 + }, + "ctrl" + ], + [ + { + "r": 30, + "rx": 6.5, + "ry": 4.25, + "y": -1, + "x": 1, + "t": "#ffffff\n\n\n\n\n\n\n\n\n\n#5eb1e7", + "f": 3 + }, + "esc\n\n\n\n\n\n\n\n\n\nM", + { + "t": "#ffffff", + "f": 7 + }, + "" + ], + [ + { + "t": "#ffffff\n\n\n\n\n\n\n\n\n\n#5eb1e7", + "f": 3, + "h": 2 + }, + "space\n\n\n\n\n\n\n\n\n\nL", + { + "h": 2 + }, + "\n\n\n\n\n\n\n\n\n\nR", + { + "t": "#5eb1e7" + }, + "" + ], + [ + { + "x": 2, + "t": "#ac97d8" + }, + "" + ], + [ + { + "r": -30, + "rx": 13, + "y": -1, + "x": -3, + "t": "#ffffff" + }, + "", + "esc" + ], + [ + { + "x": -3 + }, + "ins", + { + "h": 2 + }, + "", + { + "h": 2 + }, + "space" + ], + [ + { + "x": -3 + }, + "scroll
lock" + ] +] \ No newline at end of file diff --git a/keyboards/ergodox/keymaps/videck/videck.png b/keyboards/ergodox/keymaps/videck/videck.png new file mode 100644 index 00000000..c99323f5 Binary files /dev/null and b/keyboards/ergodox/keymaps/videck/videck.png differ diff --git a/keyboards/ergodox/keymaps/win10_writers-block/readme.md b/keyboards/ergodox/keymaps/win10_writers-block/readme.md index e51e3c48..83f91bce 100644 --- a/keyboards/ergodox/keymaps/win10_writers-block/readme.md +++ b/keyboards/ergodox/keymaps/win10_writers-block/readme.md @@ -90,7 +90,7 @@ Your LEDs will change to indicate your layer. You'll know you are in the base la To build, you will need the [QMK][qmk] firmware checked out. from there, dive into `keyboards/ergodox/keymaps/win10_writers-block/` -[qmk]: https://github.com/jackhumbert/qmk_firmware +[qmk]: https://github.com/qmk/qmk_firmware ``` $ make keyboard=ergodox keymap=win10_writers-block diff --git a/keyboards/ergodox/readme.md b/keyboards/ergodox/readme.md index 3bbe98fd..3d6fb455 100644 --- a/keyboards/ergodox/readme.md +++ b/keyboards/ergodox/readme.md @@ -1,5 +1,7 @@ # The Easy Way +If you have an ErgoDox EZ, the absolute easiest way for you to customize your firmware is using the [graphical configurator](http://configure.ergodox-ez.com), which uses QMK under the hood. + If you can find firmware someone else has made that does what you want, that is the easiest way to customize your ErgoDox. It requires no programming experience or the setup of a build environment. @@ -23,7 +25,7 @@ If none of the existing keymaps suit you, you can create your own custom keymap. This will require some experience with coding. Follow these steps to customize a keymap: - - Read the [qmk firmware README](https://github.com/jackhumbert/qmk_firmware) from top to bottom. Then come back here. :) + - Read the [qmk firmware README](https://github.com/qmk/qmk_firmware) from top to bottom. Then come back here. :) - Clone the qmk_firmware repository @@ -63,16 +65,20 @@ files. Check them out with: # Flashing Firmware -## ErgoDox Ez +## ErgoDox EZ The Ez uses the [Teensy Loader](https://www.pjrc.com/teensy/loader.html). -Linux users need to modify udev rules as described on the Teensy Linux page. -Some distributions provide a binary, maybe called `teensy-loader-cli`). +Linux users need to modify udev rules as described on the [Teensy +Linux page]. Some distributions provide a binary, maybe called +`teensy-loader-cli`. + +[Teensy Linux page]: https://www.pjrc.com/teensy/loader_linux.html To flash the firmware: - - Build the firmware with `make keymapname`, for example `make default` + - Build the firmware with `make keymapname`, for example `make default` + - This will result in a hex file called `ergodox_ez_keymapname.hex`, e.g. `ergodox_ez_default.hex` @@ -85,6 +91,15 @@ To flash the firmware: - Click the button in the Teensy app to download the firmware. +To flash with ´teensy-loader-cli´: + + - Build the firmware with `make keymapname`, for example `make default` + + - Run ´teensy_loader_cli --mcu=atmega32u4 -w ergodox_ez_.hex´ + + - Press the Reset button by inserting a paperclip gently into the reset hole + in the top right corder. + ## ErgoDox Infinity The Infinity is two completely independent keyboards, and needs to be flashed @@ -98,7 +113,7 @@ for the left and right halves seperately. To flash them: - Install the firmware with `sudo make infinity-keymapname-dfu-util` - - Build left hand firmware with `make infinity-keymapname MASTER=right` + - Build right hand firmware with `make infinity-keymapname MASTER=right` - Plug in the right hand keyboard only. @@ -153,13 +168,10 @@ If you want to send a plain vanilla key, you can look up its code under `doc/key There are external tools for customizing the layout, but those do not use the featurs of this qmk firmware. These sites include: - - [Massdrop configurator](https://keyboard-configurator.massdrop.com/ext/ergodox) for Ez + - The official [ErgoDox EZ configurator](http://configure.ergodox-ez.com) + - [Massdrop configurator](https://keyboard-configurator.massdrop.com/ext/ergodox) for EZ, works but not officially supported - [Input Club configurator](https://input.club/configurator-ergodox) for Infinity, provides left and right files You can also find an existing firmware that you like, for example from: - [Dozens of community-contributed keymaps](http://qmk.fm/keyboards/ergodox/) - -This qmk firmware also provides the ability to customize keymaps, but requires -a toolchain to build the firmware. See below for instructions on building -firmware and customizing keymaps. diff --git a/keyboards/ergodox/rules.mk b/keyboards/ergodox/rules.mk index add64ec7..2e501e81 100644 --- a/keyboards/ergodox/rules.mk +++ b/keyboards/ergodox/rules.mk @@ -24,6 +24,5 @@ COMMAND_ENABLE ?= yes # Commands for debug and configuration CUSTOM_MATRIX ?= yes # Custom matrix file for the ErgoDox EZ SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -MIDI_ENABLE ?= no # MIDI controls UNICODE_ENABLE ?= yes # Unicode ONEHAND_ENABLE ?= yes # Allow swapping hands of keyboard diff --git a/keyboards/frosty_flake/Makefile b/keyboards/frosty_flake/Makefile new file mode 100644 index 00000000..57b2ef62 --- /dev/null +++ b/keyboards/frosty_flake/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif diff --git a/keyboards/frosty_flake/config.h b/keyboards/frosty_flake/config.h new file mode 100644 index 00000000..2c73f107 --- /dev/null +++ b/keyboards/frosty_flake/config.h @@ -0,0 +1,147 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Bathroom Epiphanies +#define PRODUCT frosty_flake +#define DESCRIPTION Frosty Flake controller for the CM Storm Quick Fire Rapid + +/* + * Frosty Flake Rev. 20140521 made by Bathroom Ephiphanies + * Ported from the Bathroom Epiphanies TMK Firmware: + * https://github.com/BathroomEpiphanies/epiphanies_tmk_keyboard/tree/master/be_controllers + * + */ + +/* key matrix size */ +#define MATRIX_ROWS 8 // Row0 - Row7 in the schematic +#define MATRIX_COLS 18 // ColA - ColR in the schematic + +/* + * Keyboard Matrix Assignments + */ +#define UNUSED_PINS { B0, C4, D3 } + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/frosty_flake/frosty_flake.c b/keyboards/frosty_flake/frosty_flake.c new file mode 100644 index 00000000..1cd47603 --- /dev/null +++ b/keyboards/frosty_flake/frosty_flake.c @@ -0,0 +1,63 @@ +#include "frosty_flake.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + DDRB |= (1<<7); + DDRC |= (1<<5) | (1<<6); + + print_dec(usb_led); + + if (usb_led & (1< + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 +#endif +static uint8_t debouncing = DEBOUNCING_DELAY; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t scan_col(void) { + return ( + (PINC&(1<<7) ? 0 : ((matrix_row_t)1<<0)) | + (PINB&(1<<5) ? 0 : ((matrix_row_t)1<<1)) | + (PINB&(1<<4) ? 0 : ((matrix_row_t)1<<2)) | + (PINB&(1<<6) ? 0 : ((matrix_row_t)1<<3)) | + (PINB&(1<<1) ? 0 : ((matrix_row_t)1<<4)) | + (PINB&(1<<2) ? 0 : ((matrix_row_t)1<<5)) | + (PINB&(1<<3) ? 0 : ((matrix_row_t)1<<6)) | + (PINB&(1<<0) ? 0 : ((matrix_row_t)1<<7)) + ); +} + +static void select_col(uint8_t col) { + switch (col) { + case 0: PORTD = (PORTD & ~0b01111011) | 0b00011011; break; + case 1: PORTD = (PORTD & ~0b01111011) | 0b01000011; break; + case 2: PORTD = (PORTD & ~0b01111011) | 0b01101010; break; + case 3: PORTD = (PORTD & ~0b01111011) | 0b01111001; break; + case 4: PORTD = (PORTD & ~0b01111011) | 0b01100010; break; + case 5: PORTD = (PORTD & ~0b01111011) | 0b01110001; break; + case 6: PORTD = (PORTD & ~0b01111011) | 0b01100001; break; + case 7: PORTD = (PORTD & ~0b01111011) | 0b01110000; break; + case 8: PORTD = (PORTD & ~0b01111011) | 0b01100000; break; + case 9: PORTD = (PORTD & ~0b01111011) | 0b01101000; break; + case 10: PORTD = (PORTD & ~0b01111011) | 0b00101011; break; + case 11: PORTD = (PORTD & ~0b01111011) | 0b00110011; break; + case 12: PORTD = (PORTD & ~0b01111011) | 0b00100011; break; + case 13: PORTD = (PORTD & ~0b01111011) | 0b01111000; break; + case 14: PORTD = (PORTD & ~0b01111011) | 0b00010011; break; + case 15: PORTD = (PORTD & ~0b01111011) | 0b01101001; break; + case 16: PORTD = (PORTD & ~0b01111011) | 0b00001011; break; + case 17: PORTD = (PORTD & ~0b01111011) | 0b00111011; break; + } +} + +void matrix_init(void) { + /* Row output pins */ + DDRD |= 0b01111011; + /* Column input pins */ + DDRC &= ~0b10000000; + DDRB &= ~0b01111111; + PORTC |= 0b10000000; + PORTB |= 0b01111111; + + for (uint8_t i=0; i < MATRIX_ROWS; i++) + matrix[i] = matrix_debouncing[i] = 0; + + matrix_init_quantum(); +} + +uint8_t matrix_scan(void) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + select_col(col); + _delay_us(3); + matrix_row_t col_scan = scan_col(); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<] +``` + +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/frosty_flake/rules.mk b/keyboards/frosty_flake/rules.mk new file mode 100644 index 00000000..dd2f4b6e --- /dev/null +++ b/keyboards/frosty_flake/rules.mk @@ -0,0 +1,71 @@ +# MCU name +#MCU = at90usb1287 +MCU = atmega32u2 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 +FAUXCLICKY_ENABLE ?= no # Use buzzer to emulate clicky switches + +CUSTOM_MATRIX = yes +SRC += matrix.c \ No newline at end of file diff --git a/keyboards/gh60/gh60.h b/keyboards/gh60/gh60.h index 82624b61..99ccf175 100644 --- a/keyboards/gh60/gh60.h +++ b/keyboards/gh60/gh60.h @@ -4,7 +4,7 @@ #include "quantum.h" #include "led.h" -/* GH60 LEDs +/* GH60 LEDs * GPIO pads * 0 F7 WASD LEDs * 1 F6 ESC LED @@ -35,40 +35,41 @@ inline void gh60_wasd_leds_off(void) { DDRF &= ~(1<<7); PORTF &= ~(1<<7); } K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \ ) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_##K45, KC_NO, KC_NO, KC_NO, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D } \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ + { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, K49, K4A, K4B, K4C, K4D } \ } -/* ANSI valiant. No extra keys for ISO */ +/* ANSI variant. No extra keys for ISO */ #define KEYMAP_ANSI( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ K40, K41, K42, K45, K4A, K4B, K4C, K4D \ -) KEYMAP( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ - K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ - K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \ - K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, NO, K3D, \ - K40, K41, K42, K45, NO, K4A, K4B, K4C, K4D \ -) +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D }, \ + { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D } \ +} +/* HHKB Variant */ #define KEYMAP_HHKB( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3C, \ K40, K41, K42, K45, K4A, K4B, K4C, K4D \ -) KEYMAP( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ - K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ - K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \ - K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ - K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \ -) +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ + { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, K49, K4A, K4B, K4C, K4D } \ +} -#endif +#endif \ No newline at end of file diff --git a/keyboards/gh60/keymaps/dbroqua/Makefile b/keyboards/gh60/keymaps/dbroqua/Makefile new file mode 100644 index 00000000..f1644a8e --- /dev/null +++ b/keyboards/gh60/keymaps/dbroqua/Makefile @@ -0,0 +1,112 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +# CONSOLE_ENABLE ?= yes # Console for debug(+400) +# COMMAND_ENABLE ?= yes # Commands for debug and configuration +KEYBOARD_LOCK_ENABLE ?= yes # Allow locking of keyboard via magic key +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend +NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +# BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality +# MIDI_ENABLE ?= YES # MIDI controls +# UNICODE_ENABLE ?= YES # Unicode +# BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE ?= yes # Enable RGB Underglow + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif + diff --git a/keyboards/gh60/keymaps/dbroqua/config.h b/keyboards/gh60/keymaps/dbroqua/config.h new file mode 100644 index 00000000..75ccec09 --- /dev/null +++ b/keyboards/gh60/keymaps/dbroqua/config.h @@ -0,0 +1,187 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER geekhack +#define PRODUCT GH60 +#define DESCRIPTION t.m.k. keyboard firmware for GH60 + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 } +#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 3 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +/* + * RGB Underglow + * These settings are for the F4 by default: + * + * + * #define ws2812_PORTREG PORTF + * #define ws2812_DDRREG DDRF + * #define ws2812_pin PF4 + * #define RGBLED_NUM 14 // Number of LEDs + * #define RGBLIGHT_HUE_STEP 10 + * #define RGBLIGHT_SAT_STEP 17 + * #define RGBLIGHT_VAL_STEP 17 + * + * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. + * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. + * For details, please check this keymap. keyboard/planck/keymaps/yang/keymap.c +*/ + +/* Deprecated code below +#define ws2812_PORTREG PORTF +#define ws2812_DDRREG DDRF +#define ws2812_pin PF4 +*/ +#define RGB_DI_PIN F4 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 11 // Number of LEDs +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif diff --git a/keyboards/gh60/keymaps/dbroqua/keymap.c b/keyboards/gh60/keymaps/dbroqua/keymap.c new file mode 100644 index 00000000..be88edc0 --- /dev/null +++ b/keyboards/gh60/keymaps/dbroqua/keymap.c @@ -0,0 +1,198 @@ +#include "gh60.h" +#include "action_layer.h" +#include "rgblight.h" + +#define _DEFAULT 0 +#define _FN 1 +#define _WASD 2 +#define _SFX 3 + +//bool esc_led_on; + +enum planck_keycodes { + DEFAULT = SAFE_RANGE +}; + +// Fillers to make layering more clear +#define ______ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Qwerty gui/alt/space/alt/gui + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Bksp | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | RShift | FN | + * |-----------------------------------------------------------------------------------------+ + * |LGUI | LAlt | Space | RAlt |RGUI | + * `-----------------------------------------------------------------' + */ + [_DEFAULT] = KEYMAP_HHKB( /* Basic QWERTY */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN), \ + ______, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, ______, ______ \ + ), + +/* FN Layer + * ,-----------------------------------------------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del | + * |-----------------------------------------------------------------------------------------+ + * | CAPS | | | | | | | | Psc | Slck| Paus| Up | | | + * |-----------------------------------------------------------------------------------------+ + * | | Vol-| Vol+| Mute| | | * | / | Home| PgUp| Left|Right| | + * |-----------------------------------------------------------------------------------------+ + * | | Prev| Play| Next| | | + | - | End |PgDn| Down| | | + * |-----------------------------------------------------------------------------------------+ + * | | | | Stop | | + * `-----------------------------------------------------------------' + */ + [_FN] = KEYMAP_HHKB( /* Layer 1 */ + TG(_SFX),KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ + KC_CAPS, ______, ______, ______, ______, ______, ______, ______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, ______, ______, \ + ______, KC_VOLD, KC_VOLU, KC_MUTE, ______, ______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT,______, \ + ______, KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, ______, ______, \ + ______, ______, ______, TG(_WASD), KC_MSTP, ______, ______, ______ \ + ), + +/* WASD Layer + * ,-----------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | Up | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | Left| Down|Right| | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | + * `-----------------------------------------------------------------' + */ + [_WASD] = KEYMAP_HHKB( /* Layer 2 */ + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ + ______, ______, KC_UP, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ + ______, KC_LEFT, KC_DOWN,KC_RGHT,______, ______, ______, ______, ______, ______, ______, ______, ______, \ + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______, \ + ______, ______, ______, ______, ______, ______, ______, ______ \ + ), + +/* SFX Layer + * ,-----------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | BL- | BL+ | BL | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | RGBT| RGBM| | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | + * `-----------------------------------------------------------------' + */ + [_SFX] = KEYMAP_HHKB( + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ + ______, F(0), F(1), ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ + ______, F(2), F(3), F(4), F(5), F(6), F(7), ______, ______, ______, ______, ______, ______, \ + ______, ______, ______, ______, ______, ______, ______, ______ \ + ) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + return MACRO_NONE; +}; + +enum function_id { + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(RGBLED_TOGGLE), + [1] = ACTION_FUNCTION(RGBLED_STEP_MODE), + [2] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), + [3] = ACTION_FUNCTION(RGBLED_DECREASE_HUE), + [4] = ACTION_FUNCTION(RGBLED_INCREASE_SAT), + [5] = ACTION_FUNCTION(RGBLED_DECREASE_SAT), + [6] = ACTION_FUNCTION(RGBLED_INCREASE_VAL), + [7] = ACTION_FUNCTION(RGBLED_DECREASE_VAL) +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + switch (id) { + case RGBLED_TOGGLE: + if (record->event.pressed) { + rgblight_toggle(); + } + break; + case RGBLED_INCREASE_HUE: + if (record->event.pressed) { + rgblight_increase_hue(); + } + break; + case RGBLED_DECREASE_HUE: + if (record->event.pressed) { + rgblight_decrease_hue(); + } + break; + case RGBLED_INCREASE_SAT: + if (record->event.pressed) { + rgblight_increase_sat(); + } + break; + case RGBLED_DECREASE_SAT: + if (record->event.pressed) { + rgblight_decrease_sat(); + } + break; + case RGBLED_INCREASE_VAL: + if (record->event.pressed) { + rgblight_increase_val(); + } + break; + case RGBLED_DECREASE_VAL: + if (record->event.pressed) { + rgblight_decrease_val(); + } + break; + case RGBLED_STEP_MODE: + if (record->event.pressed) { + rgblight_step(); + } + break; + } +} + +void matrix_scan_user(void) { + uint32_t layer = layer_state; + + if (layer & (1<<1)) { + gh60_fn_led_on(); + } else { + gh60_fn_led_off(); + } + + if (layer & (1<<2)) { + gh60_wasd_leds_on(); + } else { + gh60_wasd_leds_off(); + } + + if (layer & (1<<3)) { + gh60_esc_led_on(); + } else { + gh60_esc_led_off(); + } +}; \ No newline at end of file diff --git a/keyboards/gh60/keymaps/default/keymap.c b/keyboards/gh60/keymaps/default/keymap.c index 3622be41..92f54598 100644 --- a/keyboards/gh60/keymaps/default/keymap.c +++ b/keyboards/gh60/keymaps/default/keymap.c @@ -4,25 +4,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* 0: qwerty */ KEYMAP( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, GRV, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ - CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NO, ENT, \ - LSFT,FN1, Z, X, C, V, B, N, M, COMM,DOT, SLSH,FN0, RSFT, \ - LCTL,LGUI,LALT, SPC, BSLS,RALT,RGUI,APP, RCTL), + KC_ESC,KC_1,KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINS,KC_EQL,KC_GRV,\ + KC_TAB,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_LBRC,KC_RBRC,KC_BSPC,\ + KC_CAPS,KC_A,KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L,KC_SCLN,KC_QUOT,KC_NO,KC_ENT,\ + KC_LSFT,F(1),KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT,KC_SLSH,F(0),KC_RSFT,\ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_BSLS,KC_RALT,KC_RGUI,KC_APP,KC_RCTL), /* 1: fn */ KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, \ - TRNS,TRNS,UP, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS), + KC_ESC,KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_F11,KC_F12,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_UP,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_LEFT,KC_DOWN,KC_RGHT,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS), /* 2: arrows */ KEYMAP( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,UP, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,LEFT,DOWN,RGHT), + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_UP,\ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_LEFT,KC_DOWN,KC_RGHT), }; const uint16_t PROGMEM fn_actions[] = { @@ -49,7 +49,7 @@ void matrix_scan_user(void) { //Layer LED indicators uint32_t layer = layer_state; - + if (layer & (1<<1)) { gh60_wasd_leds_on(); gh60_fn_led_on(); @@ -57,7 +57,7 @@ void matrix_scan_user(void) { gh60_wasd_leds_off(); gh60_fn_led_off(); } - + if (layer & (1<<2)) { gh60_poker_leds_on(); gh60_esc_led_on(); @@ -65,5 +65,5 @@ void matrix_scan_user(void) { gh60_poker_leds_off(); gh60_esc_led_off(); } - + }; diff --git a/keyboards/gh60/keymaps/robotmaxtron/config.h b/keyboards/gh60/keymaps/robotmaxtron/config.h index 6a29e6b8..bcd75346 100644 --- a/keyboards/gh60/keymaps/robotmaxtron/config.h +++ b/keyboards/gh60/keymaps/robotmaxtron/config.h @@ -182,7 +182,7 @@ along with this program. If not, see . #define ws2812_pin PF4 */ #define RGB_DI_PIN F4 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 8 // Number of LEDs #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 diff --git a/keyboards/gh60/keymaps/robotmaxtron/keymap.c b/keyboards/gh60/keymaps/robotmaxtron/keymap.c index 263eec4e..9acac7ce 100644 --- a/keyboards/gh60/keymaps/robotmaxtron/keymap.c +++ b/keyboards/gh60/keymaps/robotmaxtron/keymap.c @@ -8,9 +8,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* - * Base layer, pretty standard ANSI layout. + * Base layer, pretty standard ANSI layout. * ,-----------------------------------------------------------. - * |FN12| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |F(12)| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | * |-----------------------------------------------------------| * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| * |-----------------------------------------------------------| @@ -22,13 +22,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------' */ [_BL] = KEYMAP( - FN12,1,2,3,4,5,6,7,8,9,0,MINS,EQL,BSPC, \ - TAB,Q,W,E,R,T,Y,U,I,O,P,LBRC,RBRC,BSLS, \ - FN2,A,S,D,F,G,H,J,K,L,SCLN,QUOT,NO,ENT, \ - LSFT,NO,Z,X,C,V,B,N,M,COMM,DOT,SLSH,NO,RSFT, \ - LCTL,LGUI,LALT, SPC, NO,RALT,FN0,APP, RCTL), - - /* + F(12),KC_1,KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINS,KC_EQL,KC_BSPC, \ + KC_TAB,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_LBRC,KC_RBRC,KC_BSLS, \ + F(2),KC_A,KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L,KC_SCLN,KC_QUOT,KC_NO,KC_ENT, \ + KC_LSFT,KC_NO,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT,KC_SLSH,KC_NO,KC_RSFT, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_NO,KC_RALT,F(0),KC_APP,KC_RCTL), + + /* * Locking arrow keys to WASD for when you need dedicated arrow keys * ,-----------------------------------------------------------. * | | | | | | | | | | | | | | | @@ -43,14 +43,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------' */ [_AL] = KEYMAP( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,UP,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS), + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_UP,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_LEFT,KC_DOWN,KC_RGHT,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS), - /* + /* * Primary function layer, mostly the same as the traditional Pok3r layout. * ,-------------------------------------------------------------. * |`~ | F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12|DEL | @@ -65,15 +65,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------------------------------------------------------------' */ [_FL] = KEYMAP( - GRAVE,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12, DELETE, \ - TRNS,FN1,TRNS,TRNS,TRNS,TRNS,CALC,PGUP,UP,PGDN,PSCR,SLCK,PAUS,TRNS, \ - TRNS,MUTE,_VOLDOWN,_VOLUP,TRNS,TRNS,HOME,LEFT,DOWN,RGHT,INS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,FN3,TRNS,TRNS,TRNS,TRNS,END,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS), - - /* + KC_GRAVE,KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_F11,KC_F12,KC_DELETE, \ + KC_TRNS,F(1),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_CALC,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS, \ + KC_TRNS,KC_MUTE,KC__VOLDOWN,KC__VOLUP,KC_TRNS,KC_TRNS,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,F(3),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_END,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS), + + /* * Locking layer for controlling the underglow. - * + * * ,-----------------------------------------------------------. * | | | | | | | | | | | | | | | * |-----------------------------------------------------------| @@ -87,11 +87,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------' */ [_UL] = KEYMAP( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,FN4,FN5,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,FN6,FN7,FN8,FN9,FN10,FN11,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS), + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,F(4),F(5),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,F(6),F(7),F(8),F(9),F(10),F(11),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS), }; enum function_id { @@ -124,7 +124,7 @@ const uint16_t PROGMEM fn_actions[] = { const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - // MACRODOWN only works in this function + // MACRODOWN only works in this function switch(id) { case 0: if (record->event.pressed) { diff --git a/keyboards/gh60/keymaps/sethbc/Makefile b/keyboards/gh60/keymaps/sethbc/Makefile new file mode 100644 index 00000000..457a3d01 --- /dev/null +++ b/keyboards/gh60/keymaps/sethbc/Makefile @@ -0,0 +1,3 @@ +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/gh60/keymaps/sethbc/keymap.c b/keyboards/gh60/keymaps/sethbc/keymap.c new file mode 100644 index 00000000..599e664e --- /dev/null +++ b/keyboards/gh60/keymaps/sethbc/keymap.c @@ -0,0 +1,76 @@ +#include "gh60.h" +#include "action_layer.h" + +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + KEYMAP_HHKB( + F(0),KC_1,KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINS,KC_EQL,KC_BSLS,KC_GRV,\ + KC_TAB,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_LBRC,KC_RBRC,KC_BSPC,\ + KC_LCTL,KC_A,KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L,KC_SCLN,KC_QUOT,KC_ENT,\ + KC_LSFT,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT,KC_SLSH,KC_RSFT,F(1),\ + KC_LCTL,KC_LALT,KC_LGUI, KC_SPC, KC_RGUI,KC_RALT,KC_APP,KC_RCTL), + /* 1: fn */ + KEYMAP_HHKB( + KC_GRV,KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_F11,KC_F12,KC_TRNS,KC_TRNS,\ + KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_UP,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_VOLD,KC_VOLU,KC_MUTE,KC_TRNS,KC_TRNS,KC_PAST,KC_PSLS,KC_HOME,KC_PGUP,KC_LEFT,KC_RIGHT,KC_PENT,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PPLS,KC_PMNS,KC_END,KC_PGDN,KC_DOWN,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS), +}; + +enum function_id { + SHIFT_ESC, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(SHIFT_ESC), + [1] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +void matrix_scan_user(void) { + +} + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t shift_esc_shift_mask; + switch (id) { + case SHIFT_ESC: + shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (shift_esc_shift_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (shift_esc_shift_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/gh60/keymaps/unxmaal/Makefile b/keyboards/gh60/keymaps/unxmaal/Makefile new file mode 100644 index 00000000..c73cf114 --- /dev/null +++ b/keyboards/gh60/keymaps/unxmaal/Makefile @@ -0,0 +1,112 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +# CONSOLE_ENABLE ?= yes # Console for debug(+400) +# COMMAND_ENABLE ?= yes # Commands for debug and configuration +KEYBOARD_LOCK_ENABLE ?= yes # Allow locking of keyboard via magic key +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +# SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend +NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +# BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality +# MIDI_ENABLE ?= YES # MIDI controls +# UNICODE_ENABLE ?= YES # Unicode +# BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE ?= yes # Enable RGB Underglow + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif + diff --git a/keyboards/gh60/keymaps/unxmaal/README.md b/keyboards/gh60/keymaps/unxmaal/README.md new file mode 100644 index 00000000..52bf97ef --- /dev/null +++ b/keyboards/gh60/keymaps/unxmaal/README.md @@ -0,0 +1,20 @@ +Unxmaal's GH60 Layout +===================== +* Mostly stolen from /u/robotmaxtron + +##Quantum MK Firmware +For the full Quantum feature list, see the parent readme.md. + +* Standard Mac ANSI layout +* Spacebar acts as space when tapped, Fn when held +* Menu acts as menu when tapped, Fn2 when held +* Layer1: + * Top row = `~, F1-F12, Del + * JKIL = arrow cluster +* Layer2: + * Top row = media controls + * JKIL = PgDn/Up/Home/Insert + * Backspace = Reset + +### Additional Credits +Keymap has been based on various keymaps available from the QMK Repo for the GH60-SATAN and KC60 keyboards. diff --git a/keyboards/gh60/keymaps/unxmaal/WS2812-wiring.jpg b/keyboards/gh60/keymaps/unxmaal/WS2812-wiring.jpg new file mode 100644 index 00000000..4ab8cc31 Binary files /dev/null and b/keyboards/gh60/keymaps/unxmaal/WS2812-wiring.jpg differ diff --git a/keyboards/gh60/keymaps/unxmaal/config.h b/keyboards/gh60/keymaps/unxmaal/config.h new file mode 100644 index 00000000..bb218d6f --- /dev/null +++ b/keyboards/gh60/keymaps/unxmaal/config.h @@ -0,0 +1,190 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER geekhack +#define PRODUCT GH60 +#define DESCRIPTION t.m.k. keyboard firmware for GH60 + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ + #define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 } +// Rev A +// #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B0, B5, B4, D7, D6, B3 } +// Rev B/C +#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 3 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +/* + * RGB Underglow + * These settings are for the F4 by default: + * + * + * #define ws2812_PORTREG PORTF + * #define ws2812_DDRREG DDRF + * #define ws2812_pin PF4 + * #define RGBLED_NUM 14 // Number of LEDs + * #define RGBLIGHT_HUE_STEP 10 + * #define RGBLIGHT_SAT_STEP 17 + * #define RGBLIGHT_VAL_STEP 17 + * + * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. + * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. + * For details, please check this keymap. keyboard/planck/keymaps/yang/keymap.c +*/ + +/* Deprecated code below +#define ws2812_PORTREG PORTF +#define ws2812_DDRREG DDRF +#define ws2812_pin PF4 +*/ +#define RGB_DI_PIN F4 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 8 // Number of LEDs +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif diff --git a/keyboards/gh60/keymaps/unxmaal/keymap.c b/keyboards/gh60/keymaps/unxmaal/keymap.c new file mode 100644 index 00000000..7c9bd6a6 --- /dev/null +++ b/keyboards/gh60/keymaps/unxmaal/keymap.c @@ -0,0 +1,228 @@ +#include "gh60.h" +#include "action_layer.h" + +#define _BL 0 +#define _AL 1 +#define _FL 2 +#define _UL 3 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ANSI Base, Mac style + * ,-----------------------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| = | Backsp | + * |-----------------------------------------------------------------------------| + * |Tab | Q | W | E | R | T | Y | U | I| O| P| [| ]| \| + * |-----------------------------------------------------------------------------| + * |Caps/Fn | A| S| D| F| G| H| J| K| L| ;| '| Enter | + * |-----------------------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /| Shift | + * |-----------------------------------------------------------------------------| + * |Fn|Alt |Gui | Space(tapped), Fn(held) |Gui |Alt |Menu(tapped, Fn2(held)|Ctrl| + * `-----------------------------------------------------------------------------' + */ + [_BL] = KEYMAP( + KC_ESC,KC_1,KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINS,KC_EQL,KC_BSPC, \ + KC_TAB,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_LBRC,KC_RBRC,KC_BSLS, \ + KC_LCTL,KC_A,KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L,KC_SCLN,KC_QUOT,KC_NO,KC_ENT, \ + KC_LSFT,KC_NO,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT,KC_SLSH,KC_NO,KC_RSFT, \ + MO(1),KC_LALT,KC_LGUI, LT(1,KC_SPACE), KC_NO, KC_RGUI, KC_RALT, LT(2,KC_MENU), KC_RCTL), + + /* + * Pok3r style arrow cluster + * ,-----------------------------------------------------------. + * |`~ | F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12|DEL | + * |-----------------------------------------------------------| + * | | | | | | | | |Up| | | | | | + * |-----------------------------------------------------------| + * | | | | | | | |Left|Down|Right| | | | + * |-----------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + */ + [_AL] = KEYMAP( + KC_GRV,KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_F11,KC_F12,KC_DELETE, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_UP,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_LEFT,KC_DOWN,KC_RGHT,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS), + + + /* + * Secondary function layer + * ,-------------------------------------------------------------. + * | | | | | | | | RW|Play|FF| Mute| Vol Down | Vol up |Reset | + * |-------------------------------------------------------------| + * | | | | | | | | | |PgUp| | | | | + * |-------------------------------------------------------------| + * | | | | | | | |Home|PgDown|End| | | | + * |-------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-------------------------------------------------------------| + * | | | | | | | | | + * `-------------------------------------------------------------' + */ + [_FL] = KEYMAP( + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MPRV,KC_MPLY,KC_MNXT,KC_MUTE,KC_VOLD,KC_VOLU,RESET, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PGUP,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_HOME,KC_TRNS,KC_HOME,KC_PGDN,KC_END,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS), + + /* + * Locking layer for controlling the underglow. + * NOTE: currently unused. + * + * ,-----------------------------------------------------------. + * | | | | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | |On|Mode| | | | | | | | | | | + * |-----------------------------------------------------------| + * | | |Hue+|Hue-|Sat+|Sat-|Val+|Val-| | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + */ + [_UL] = KEYMAP( + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,F(4),F(5),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,F(6),F(7),F(8),F(9),F(10),F(11),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS), +}; + +enum function_id { + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL, + SHIFT_ESC, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(2), // Momentary Fn overlay + [1] = ACTION_LAYER_TOGGLE(1), // Toggle Arrow Layer overlay + [2] = ACTION_LAYER_TAP_KEY(2, KC_CAPS), // Tap to toggle caps lock and hold to activate function layer + [3] = ACTION_LAYER_TOGGLE(3), // Toggle Underglow Layer overlay + [4] = ACTION_FUNCTION(RGBLED_TOGGLE), //Turn on/off underglow + [5] = ACTION_FUNCTION(RGBLED_STEP_MODE), // Change underglow mode + [6] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), + [7] = ACTION_FUNCTION(RGBLED_DECREASE_HUE), + [8] = ACTION_FUNCTION(RGBLED_INCREASE_SAT), + [9] = ACTION_FUNCTION(RGBLED_DECREASE_SAT), + [10] = ACTION_FUNCTION(RGBLED_INCREASE_VAL), + [11] = ACTION_FUNCTION(RGBLED_DECREASE_VAL), + [12] = ACTION_FUNCTION(SHIFT_ESC), + [13] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +void matrix_scan_user(void) { + +// Layer LED indicators +// ESC led on when in function layer, WASD cluster leds enabled when on arrow cluster + uint32_t layer = layer_state; + if (layer & (1<<1)) { + gh60_wasd_leds_on(); + } else { + gh60_wasd_leds_off(); + } + + if (layer & (1<<2)) { + gh60_esc_led_on(); + } else { + gh60_esc_led_off(); + } +}; + +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + switch (id) { + case RGBLED_TOGGLE: + //led operations + if (record->event.pressed) { + rgblight_toggle(); + } + break; + case RGBLED_INCREASE_HUE: + if (record->event.pressed) { + rgblight_increase_hue(); + } + break; + case RGBLED_DECREASE_HUE: + if (record->event.pressed) { + rgblight_decrease_hue(); + } + break; + case RGBLED_INCREASE_SAT: + if (record->event.pressed) { + rgblight_increase_sat(); + } + break; + case RGBLED_DECREASE_SAT: + if (record->event.pressed) { + rgblight_decrease_sat(); + } + break; + case RGBLED_INCREASE_VAL: + if (record->event.pressed) { + rgblight_increase_val(); + } + break; + case RGBLED_DECREASE_VAL: + if (record->event.pressed) { + rgblight_decrease_val(); + } + break; + case RGBLED_STEP_MODE: + if (record->event.pressed) { + rgblight_step(); + } + break; + static uint8_t shift_esc_shift_mask; + // Shift + ESC = ~ + case SHIFT_ESC: + shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (shift_esc_shift_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (shift_esc_shift_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +}; diff --git a/keyboards/gonnerd/Makefile b/keyboards/gonnerd/Makefile new file mode 100644 index 00000000..57b2ef62 --- /dev/null +++ b/keyboards/gonnerd/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif diff --git a/keyboards/gonnerd/config.h b/keyboards/gonnerd/config.h new file mode 100644 index 00000000..cad8fe58 --- /dev/null +++ b/keyboards/gonnerd/config.h @@ -0,0 +1,43 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER GON +#define PRODUCT NerD +#define DESCRIPTION QMK port for the GON Nerd PCB + +/* key matrix size */ +#define MATRIX_ROWS 10 +#define MATRIX_COLS 9 + +/* backlight */ +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_LEVELS 3 + +/* matrix pins */ +#define MATRIX_ROW_PINS { B4, E2, F4, F7, F1, F6, C6, F5, D7, C7 } +#define MATRIX_COL_PINS { E6, B0, B1, B2, B3, F0, D0, D5, D1 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +#endif diff --git a/keyboards/gonnerd/gonnerd.c b/keyboards/gonnerd/gonnerd.c new file mode 100644 index 00000000..f25d3a85 --- /dev/null +++ b/keyboards/gonnerd/gonnerd.c @@ -0,0 +1 @@ +#include "gonnerd.h" diff --git a/keyboards/gonnerd/gonnerd.h b/keyboards/gonnerd/gonnerd.h new file mode 100644 index 00000000..e5070328 --- /dev/null +++ b/keyboards/gonnerd/gonnerd.h @@ -0,0 +1,42 @@ +#ifndef GONNERD_H +#define GONNERD_H + +#include "quantum.h" + +#define KEYMAP_TKL( \ + K08, K09, K18, K19, K28, K29, K38, K39, K48, K49, K58, K59, K68, K69, K88, K89, \ + K00, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, K80, K81, K84, \ + K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, K82, K83, K85, \ + K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, K71, K65, \ + K07, K79, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, K67, K86, \ + K06, K05, K78, K70, K72, K73, K74, K75, K76, K77, K87 \ +) \ +{ \ + { K00, K10, K20, K30, K40, K50, K60, K70, K80 }, \ + { K01, K11, K21, K31, K41, K51, K61, K71, K81 }, \ + { K02, K12, K22, K32, K42, K52, K62, K72, K82 }, \ + { K03, K13, K23, K33, K43, K53, K63, K73, K83 }, \ + { K04, K14, K24, K34, K44, K54, K64, K74, K84 }, \ + { K05, K15, K25, K35, K45, K55, K65, K75, K85 }, \ + { K06, K16, K26, K36, K46, K56, K66, K76, K86 }, \ + { K07, K17, K27, K37, K47, K57, K67, K77, K87 }, \ + { K08, K18, K28, K38, K48, K58, K68, K78, K88 }, \ + { K09, K19, K29, K39, K49, K59, K69, K79, K89 } \ +} + +#define KEYMAP_60( \ + K08, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, \ + K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, \ + K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, K71, K65, \ + K07, K79, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, K67, \ + K06, K05, K78, K70, K72, K73, K74, K75 \ +) KEYMAP_TKL( \ + K08, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, K01, K10, K11, K20, K21, K30, K31, K40, K41, K50, K51, K60, K61, KC_NO, KC_NO, KC_NO, \ + K02, K03, K12, K13, K22, K23, K32, K33, K42, K43, K52, K53, K62, K63, KC_NO, KC_NO, KC_NO, \ + K04, K14, K15, K24, K25, K34, K35, K44, K45, K54, K55, K64, K71, K65, \ + K07, K79, K16, K17, K26, K27, K36, K37, K46, K47, K56, K57, K66, K67, KC_NO, \ + K06, K05, K78, K70, K72, K73, K74, K75, KC_NO, KC_NO, KC_NO \ +) + +#endif diff --git a/keyboards/gonnerd/keymaps/default/Makefile b/keyboards/gonnerd/keymaps/default/Makefile new file mode 100644 index 00000000..772d7aee --- /dev/null +++ b/keyboards/gonnerd/keymaps/default/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/gonnerd/keymaps/default/keymap.c b/keyboards/gonnerd/keymaps/default/keymap.c new file mode 100644 index 00000000..d74f949d --- /dev/null +++ b/keyboards/gonnerd/keymaps/default/keymap.c @@ -0,0 +1,26 @@ +#include "gonnerd.h" + +#define __x__ KC_NO + +// Keymap layers +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = KEYMAP_60( /* Base */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, __x__, KC_ENT, \ + KC_LSFT, __x__, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, __x__, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL \ + ), + + [1] = KEYMAP_60( /* System layer to have access to RESET button */ + RESET, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, \ + __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, \ + __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, \ + __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, \ + __x__, __x__, __x__, __x__, __x__, __x__, KC_TRNS, __x__ \ + ), +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; diff --git a/keyboards/gonnerd/keymaps/mauin/Makefile b/keyboards/gonnerd/keymaps/mauin/Makefile new file mode 100644 index 00000000..772d7aee --- /dev/null +++ b/keyboards/gonnerd/keymaps/mauin/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/gonnerd/keymaps/mauin/keymap.c b/keyboards/gonnerd/keymaps/mauin/keymap.c new file mode 100644 index 00000000..5979a7ca --- /dev/null +++ b/keyboards/gonnerd/keymaps/mauin/keymap.c @@ -0,0 +1,108 @@ +#include "gonnerd.h" + +// Keymap layers +#define BASE_LAYER 0 +#define FUNCTION_LAYER 1 +#define SYSTEM_LAYER 2 + +// Key aliases +#define __x__ KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Layer 0: Default Layer + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| = | BSp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| + * |-----------------------------------------------------------| + * |Funct | A| S| D| F| G| H| J| K| L| ;| '|Enter | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /| Shift | + * |-----------------------------------------------------------' + * | Ctl|Alt|Gui | Space |Gui |Alt| F2| Ctl | + * `-----------------------------------------------------------' + */ + [BASE_LAYER] = KEYMAP_60( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, __x__, KC_ENT, \ + KC_LSFT, __x__, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, __x__, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, MO(2), KC_RCTL \ + ), + + /* Layer 1: Function Layer + * ,-----------------------------------------------------------. + * | | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11| F12| Del | + * |-----------------------------------------------------------| + * | |Prv|Ply|Nxt| | |Pg^|Hme|Up |End| |Br-|Br+| | + * |-----------------------------------------------------------| + * |Hold |Mte|Vl-|Vl+| | |Pgv|Lft|Dwn|Rgt| | | | + * |-----------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------' + * | | | | | | | | | + * `-----------------------------------------------------------' + */ + [FUNCTION_LAYER] = KEYMAP_60( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + __x__, KC_MPRV, KC_MPLY, KC_MNXT, __x__, __x__, KC_PGUP, KC_HOME, KC_UP, KC_END, __x__, KC_SLCK, KC_PAUS, __x__, \ + KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, __x__, __x__, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, __x__, __x__, __x__, __x__, \ + KC_LSFT, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, __x__, __x__, __x__, __x__ \ + ), + + /* Layer 2: System Layer + * ,-----------------------------------------------------------. + * |Reset| | | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------' + * | | | | | | | | | + * `-----------------------------------------------------------' + */ + [SYSTEM_LAYER] = KEYMAP_60( + RESET, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, \ + __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, \ + __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, \ + __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, __x__, \ + __x__, __x__, __x__, __x__, __x__, __x__, KC_TRNS, __x__ \ + ), +}; + +enum function_id { + ESC_GRV, // Makes Esc behave like `~ when pressed with the left GUI modifier. This is the "switch between windows of the same application" key combination in macOS +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(ESC_GRV), +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t esc_grv_mask; + switch (id) { + case ESC_GRV: + esc_grv_mask = get_mods() & MOD_BIT(KC_LGUI); + if (record->event.pressed) { + if (esc_grv_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (esc_grv_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/gonnerd/keymaps/mauin/readme.md b/keyboards/gonnerd/keymaps/mauin/readme.md new file mode 100644 index 00000000..63be7c39 --- /dev/null +++ b/keyboards/gonnerd/keymaps/mauin/readme.md @@ -0,0 +1,5 @@ +# Mauin's keymap for the GON NerD + +This layout is based on a Pok3r style layout with a standard base layer. + +Function layers provide access to navigation and media keys. diff --git a/keyboards/gonnerd/readme.md b/keyboards/gonnerd/readme.md new file mode 100644 index 00000000..807df308 --- /dev/null +++ b/keyboards/gonnerd/readme.md @@ -0,0 +1,38 @@ +GON NerD keyboard firmware +====================== + +## Changing Bootloader + +It's not possible to simply flash this firmware on the GON NerD keyboard as the original bootloader does not support DFU connections. + +It is possible to change the bootloader of the GON NerD with an ISP programmer. A guide on how to change the bootloader on your GON NerD can be found here: +[Converting NerD60 to TMK](https://deskthority.net/wiki/Converting_NerD60_to_TMK). After changing the bootloader you can flash your QMK keymap onto the keyboard. + +_After changing the bootloader on your GON NerD PCB you will not be able to go back to the original firmware and the official configuration software will +not work anymore. You will lose your warranty and official support from GON!_ + +## Reset button + +To run the `make dfu` command to flash keymaps onto the board, you need to put the board into DFU mode. As the GON NerD PCBs do not have a reset button on the board to put it into DFU mode, be sure to include a `RESET` button on your keymap. Otherwise you'll have to unscrew your keyboard from the case and short the GND and RST pins. + +## Building + +Download or clone the whole firmware and navigate to the keyboards/gonnerd folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make default`. + +### Other Keymaps + +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. + +To build the firmware binary hex file with a keymap just do `make` with a keymap like this: + +``` +$ make [default|jack|] +``` + +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/gonnerd/rules.mk b/keyboards/gonnerd/rules.mk new file mode 100644 index 00000000..c9b584d5 --- /dev/null +++ b/keyboards/gonnerd/rules.mk @@ -0,0 +1,66 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 8000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= no # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration + # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend + # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 diff --git a/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.c b/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.c new file mode 100644 index 00000000..4c735a6c --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.c @@ -0,0 +1 @@ +#include "MS-sculpt-mobile.h" diff --git a/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.h b/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.h new file mode 100644 index 00000000..1583dea6 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.h @@ -0,0 +1,48 @@ +#ifndef MICROSOFT_SCULPT_MOBILE_H +#define MICROSOFT_SCULPT_MOBILE_H + +#include "quantum.h" + + +#define KEYMAP( \ + k7Q, k6O, k6P, k6Q, k5O, k5P, k5Q, k7A, k7B, k7C, k7D, k7E, k7F, k1O, k1K, k1L, \ + k5A, k5K, k5L, k5M, k5N, k5H, k5I, k2A, k2B, k2C, k2D, k5B, k5C, k5J, k2E, \ + k6R, k6D, k6E, k6F, k7I, k7J, k4A, k4B, k4C, k4D, k3A, k3B, k3C, k3D, \ + k0J, k6A, k6B, k6C, k7H, k1A, k1B, k5D, k5E, k5F, k5G, k1C, k7P, k2G, \ + k2P, k7K, k7L, k7M, k7O, k0A, k0B, k0C, k0D, k0E, k0F, k2L, k6G, k1P,\ + k1Q, k4N, k3O,k6N, k3K, k0R, k1M, k6H, k6I, k6J \ +) \ +{ \ + {k0A, k0B, k0C, k0D, k0E, k0F, KC_NO, KC_NO, KC_NO, k0J, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,KC_NO, KC_NO, k0R},\ + {k1A, k1B, k1C, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k1K, k1L, k1M, KC_NO, k1O, k1P, k1Q, KC_NO},\ + {k2A, k2B, k2C, k2D, k2E, KC_NO, k2G, KC_NO, KC_NO, KC_NO, KC_NO, k2L, KC_NO, KC_NO, KC_NO, k2P, KC_NO, KC_NO},\ + {k3A, k3B, k3C, k3D, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k3K, KC_NO, KC_NO, KC_NO, k3O, KC_NO, KC_NO, KC_NO},\ + {k4A, k4B, k4C, k4D, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k4N, KC_NO,KC_NO, KC_NO, KC_NO},\ + {k5A, k5B, k5C, k5D, k5E, k5F, k5G, k5H, k5I, k5J, k5K, k5L, k5M, k5N, k5O, k5P, k5Q, KC_NO },\ + {k6A, k6B, k6C, k6D, k6E, k6F, k6G, k6H, k6I, k6J, KC_NO, KC_NO, KC_NO, k6N, k6O, k6P, k6Q, k6R},\ + {k7A, k7B, k7C, k7D, k7E, k7F, KC_NO, k7H, k7I, k7J, k7K, k7L, k7M, KC_NO, k7O, k7P, k7Q, KC_NO},\ +} + + +#define MATRIX_TESTING_KEYMAP( \ + k0A, k0B, k0C, k0D, k0E, k0F, k0G, k0H, k0I, k0, k0J, k0K, k0L, k0M, k0N, k0O, k0P, k0Q,\ + k1A, k1B, k1C, k1D, k1E, k1F, k1G, k1H, k1I, k1, k1J, k1K, k1L, k1M, k1N, k1O, k1P, k1Q,\ + k2A, k2B, k2C, k2D, k2E, k2F, k2G, k2H, k2I, k2, k2J, k2K, k2L, k2M, k2N, k2O, k2P, k2Q,\ + k3A, k3B, k3C, k3D, k3E, k3F, k3G, k3H, k3I, k3, k3J, k3K, k3L, k3M, k3N, k3O, k3P, k3Q,\ + k4A, k4B, k4C, k4D, k4E, k4F, k4G, k4H, k4I, k4, k4J, k4K, k4L, k4M, k4N, k4O, k4P, k4Q,\ + k5A, k5B, k5C, k5D, k5E, k5F, k5G, k5H, k5I, k5, k5J, k5K, k5L, k5M, k5N, k5O, k5P, k5Q,\ + k6A, k6B, k6C, k6D, k6E, k6F, k6G, k6H, k6I, k6, k6J, k6K, k6L, k6M, k6N, k6O, k6P, k6Q,\ + k7A, k7B, k7C, k7D, k7E, k7F, k7G, k7H, k7I, k7, k7J, k7K, k7L, k7M, k7N, k7O, k7P, k7Q\ +) \ +{ \ + {k0A, k0B, k0C, k0D, k0E, k0F, k0G, k0H, k0I, k0, k0J, k0K, k0L, k0M, k0N, k0O, k0P, k0Q},\ + {k1A, k1B, k1C, k1D, k1E, k1F, k1G, k1H, k1I, k1, k1J, k1K, k1L, k1M, k1N, k1O, k1P, k1Q},\ + {k2A, k2B, k2C, k2D, k2E, k2F, k2G, k2H, k2I, k2, k2J, k2K, k2L, k2M, k2N, k2O, k2P, k2Q},\ + {k3A, k3B, k3C, k3D, k3E, k3F, k3G, k3H, k3I, k3, k3J, k3K, k3L, k3M, k3N, k3O, k3P, k3Q},\ + {k4A, k4B, k4C, k4D, k4E, k4F, k4G, k4H, k4I, k4, k4J, k4K, k4L, k4M, k4N, k4O, k4P, k4Q},\ + {k5A, k5B, k5C, k5D, k5E, k5F, k5G, k5H, k5I, k5, k5J, k5K, k5L, k5M, k5N, k5O, k5P, k5Q},\ + {k6A, k6B, k6C, k6D, k6E, k6F, k6G, k6H, k6I, k6, k6J, k6K, k6L, k6M, k6N, k6O, k6P, k6Q},\ + {k7A, k7B, k7C, k7D, k7E, k7F, k7G, k7H, k7I, k7, k7J, k7K, k7L, k7M, k7N, k7O, k7P, k7Q},\ +} + +#endif diff --git a/keyboards/handwired/MS-sculpt-mobile/Makefile b/keyboards/handwired/MS-sculpt-mobile/Makefile new file mode 100644 index 00000000..bd09e588 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.c b/keyboards/handwired/MS-sculpt-mobile/babblePaste.c new file mode 100644 index 00000000..3a9b8699 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.c @@ -0,0 +1,459 @@ +/* A library to output the right key shortcut in any common app. +Given a global variable babble_mode to show the environment and a +key that calls the paste macro, do the right type of paste. +Setting the context is done by another macro, or TBD interaction with the host. + +Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts +and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c +*/ + +#include "babblePaste.h" +#include "action_macro.h" + +#ifdef USE_BABLPASTE + +// GLOBAL variable to determine mode. Sets startup default if no eeppom +uint8_t babble_mode =0 ; + +// small function that we might also want to call from a keymap. + +macro_t* switch_babble_mode( uint8_t id) { + babble_mode= id; + return MACRO_NONE; //less typing where called +} + + +// Today I learned that the preprocessor can not create a switch statement label from an argument +// And else statements have problems, see https://gcc.gnu.org/onlinedocs/gcc-3.0.1/cpp_3.html#SEC15 +#define BABLM(ent, macro...) \ + if ( ent == shortcut ) \ + { action_macro_play( MACRO(macro)); return MACRO_NONE; } + + +/* this function runs the appropriate babblepaste macro, given +the global babble_mode, and a shortcut from the ENUM in babblePaste.h +TODO, the pointers in this function should be stored in a PROGMEM array, not ram. +But that requires even more clever preprocessor foo. +*/ +const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { +/* + if ( shortcut < BABL_START_NUM || \ + shortcut >= (BABL_START_NUM + BABL_NUM_MACROS ) ) { + return MACRO_NONE; + } +*/ + + +#ifdef MS_MODE + if ( BABL_WINDOWS == shortcut ) { return switch_babble_mode(MS_MODE); } +#endif +#ifdef MAC_MODE + if ( BABL_MAC == shortcut) { return switch_babble_mode(MAC_MODE); } +#endif +#ifdef LINUX_MODE + if ( BABL_LINUX == shortcut ) { return switch_babble_mode(LINUX_MODE); } +#endif + #ifdef READMUX_MODE + if ( BABL_READLINE == shortcut ) { switch_babble_mode(READMUX_MODE); return MACRO_NONE; } +#endif +#ifdef VI_MODE + if ( BABL_VI == shortcut ) { return switch_babble_mode(VI_MODE); } +#endif +#ifdef EMACS_MODE + if ( BABL_EMACS == shortcut ) { return switch_babble_mode(EMACS_MODE); } +#endif + + + + switch(babble_mode) { + +#ifdef MS_MODE + + case MS_MODE: + BABLM( BABL_GO_LEFT_1C, T(LEFT), END ); + BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); + BABLM( BABL_GO_LEFT_WORD, D(LCTL), T(LEFT), U(LCTL), END ); + BABLM( BABL_GO_RIGHT_WORD, D(LCTL), T(RIGHT), U(LCTL), END ); + BABLM( BABL_GO_START_LINE, T(HOME), END ); + BABLM( BABL_GO_END_LINE, T(END), END ); + BABLM( BABL_GO_START_DOC, D(LCTL),T(HOME), U(LCTL),END ); + BABLM( BABL_GO_END_DOC, D(LCTL),T(END), U(LCTL),END ); + BABLM( BABL_GO_NEXT_LINE, T(DOWN), END ); + BABLM( BABL_GO_PREV_LINE, T(UP), END ); + BABLM( BABL_PGDN, T(PGDN), END ); + BABLM( BABL_PGUP, T(PGUP), END ); + BABLM( BABL_DEL_RIGHT_1C, T(DEL), END ); + BABLM( BABL_DEL_LEFT_WORD, D(LCTL), T(BSPACE), U(LCTL), END ); + BABLM( BABL_DEL_RIGHT_WORD, D(LCTL), T(DEL), U(LCTL), END ); + BABLM( BABL_DEL_TO_LINE_END, D(RSFT), T(HOME), U(RSFT), T(DEL), END); + BABLM( BABL_DEL_TO_LINE_START, D(RSFT), T(END), U(RSFT), T(DEL), END ); +#ifndef BABL_MOVEMENTONLY + BABLM( BABL_UNDO, D(LCTL), T(Z), U(LCTL), END ); + BABLM( BABL_REDO, D(LCTL), T(Y), U(LCTL), END ); + BABLM( BABL_CUT, D(LCTL), T(X), U(LCTL), END ); + BABLM( BABL_COPY, D(LCTL), T(C), U(LCTL), END ); + BABLM( BABL_PASTE, D(LCTL), T(V), U(LCTL), END ); + BABLM( BABL_SELECT_ALL, D(LCTL), T(A), U(LCTL), END ); + BABLM( BABL_FIND, D(LCTL),T(F), U(LCTL),END ); + BABLM( BABL_FIND_NEXT, T(F3),END ); + BABLM( BABL_FIND_REPLACE, D(LCTL),T(H), U(LCTL),END ); + BABLM( BABL_RUNAPP, D(LGUI),T(R), U(LGUI),END ); + BABLM( BABL_SWITCH_APP_NEXT, D(LALT),T(TAB), U(LALT),END ); + BABLM( BABL_SWITCH_APP_LAST, D(LSFT),D(LALT),T(TAB), U(LALT), U(LSFT),END ); + BABLM( BABL_CLOSE_APP, D(LALT),T(F4), U(LALT),END ); + BABLM( BABL_HELP, T(F1),END ); +#ifndef BABL_NOBROWSER + BABLM( BABL_BROWSER_NEW_TAB, D(LCTL), T(T), U(LCTL),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LCTL), T(W), U(LCTL),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LCTL), D(RSFT),T(T), U(RSFT),U(LCTL),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LCTL), T(TAB), U(LCTL),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LCTL), D(RSFT), T(TAB), U(RSFT), U(LCTL),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LCTL), T(L), U(LCTL),END ); + BABLM( BABL_BROWSER_FORWARD, D(LALT), T(RIGHT), U(LALT),END ); + BABLM( BABL_BROWSER_BACK, D(LALT), T(LEFT), U(LALT),END ); + BABLM( BABL_BROWSER_FIND, D(LCTL), T(F), U(LCTL),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LCTL), T(D), U(LCTL),END ); + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LCTL),END ); // EDGE + BABLM( BABL_BROWSER_DEV_TOOLS, D(LCTL), T(T), U(LCTL),END ); // Chrome + // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LCTL), T(F5), U(LCTL),END ); // hard reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, T(F11),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LCTL), D(RSFT), T(EQL), U(RSFT), U(LCTL),END ); // ctr+ + + BABLM( BABL_BROWSER_ZOOM_OUT, D(LCTL), T(MINS), U(LCTL),END ); +#endif +#endif + + // Todo, ring bell, flash light, show user this isn't supported + return MACRO_NONE; + + +#endif /* MS_MODE*/ + + +#ifdef LINUX_MODE + + case LINUX_MODE: + BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); + BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); + BABLM( BABL_GO_LEFT_WORD , D(LCTL), T(LEFT), U(LCTL), END ); + BABLM( BABL_GO_RIGHT_WORD , D(LCTL), T(RIGHT), U(LCTL), END ); + BABLM( BABL_GO_START_LINE , T(HOME), END ); + BABLM( BABL_GO_END_LINE , T(END), END ); + BABLM( BABL_GO_START_DOC , D(LCTL),T(HOME), U(LCTL),END ); + BABLM( BABL_GO_END_DOC , D(LCTL),T(END), U(LCTL),END ); + BABLM( BABL_GO_NEXT_LINE , T(DOWN), END ); + BABLM( BABL_GO_PREV_LINE , T(UP), END ); + BABLM( BABL_PGDN , T(PGDN), END ); + BABLM( BABL_PGUP , T(PGUP), END ); + BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); + BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(BSPACE), U(LCTL), END ); + BABLM( BABL_DEL_RIGHT_WORD , D(LCTL), T(DEL), U(LCTL), END ); + BABLM( BABL_DEL_TO_LINE_END, D(RSFT), T(HOME), U(RSFT), T(DEL), END); + BABLM( BABL_DEL_TO_LINE_START, D(RSFT), T(END), U(RSFT), T(DEL), END ); +#ifndef BABL_MOVEMENTONLY + BABLM( BABL_UNDO , D(LCTL), T(Z), U(LCTL), END ); + BABLM( BABL_REDO , D(LCTL), T(Y), U(LCTL), END ); + BABLM( BABL_CUT , D(LCTL), T(X), U(LCTL), END ); + BABLM( BABL_COPY , D(LCTL), T(C), U(LCTL), END ); + BABLM( BABL_PASTE , D(LCTL), T(V), U(LCTL), END ); + BABLM( BABL_SELECT_ALL, D(LCTL), T(A), U(LCTL), END ); + BABLM( BABL_FIND, D(LCTL),T(F), U(LCTL),END ); + /* BABLM(BABL_FIND_NEXT , T(F3),END ); KDE */ + BABLM( BABL_FIND_NEXT, D(LCTL),T(G), U(LCTL),END ); // Gnome*/ + /* BABLM( , D(LCTL),T(R), U(LCTL),END ); KDE */ + BABLM( BABL_FIND_REPLACE, D(LCTL),T(H), U(LCTL),END ); // Gnome*/ + BABLM( BABL_RUNAPP, D(LALT),T(F2), U(LALT),END ); + BABLM( BABL_SWITCH_APP_NEXT, D(LCTL),T(TAB), U(LCTL),END ); + BABLM( BABL_SWITCH_APP_LAST, D(LSFT),D(LCTL),T(TAB), U(LCTL), U(LSFT),END ); + BABLM( BABL_CLOSE_APP, D(LALT),T(F4), U(LALT),END ); + //BABLM( BABL_HELP, END ); + +#ifndef BABL_NOBROWSER + BABLM( BABL_BROWSER_NEW_TAB, D(LCTL), T(T), U(LCTL),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LCTL), T(W), U(LCTL),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LCTL), D(RSFT),T(T), U(RSFT),U(LCTL),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LCTL), T(TAB), U(LCTL),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LCTL), D(RSFT), T(TAB), U(RSFT), U(LCTL),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LCTL), T(L), U(LCTL),END ); + BABLM( BABL_BROWSER_FORWARD, D(LALT), T(RIGHT), U(LALT),END ); + BABLM( BABL_BROWSER_BACK, D(LALT), T(LEFT), U(LALT),END ); + BABLM( BABL_BROWSER_FIND, D(LCTL), T(F), U(LCTL),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LCTL), T(D), U(LCTL),END ); + BABLM( BABL_BROWSER_DEV_TOOLS, D(LCTL), T(T), U(LCTL),END ); // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LCTL), T(F5), U(LCTL),END ); // hard reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, T(F11),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LCTL), T(PLUS), U(LCTL),END ); + BABLM( BABL_BROWSER_ZOOM_OUT, D(LCTL), T(MINS), U(LCTL),END ); +#endif +#endif + return MACRO_NONE; + +#endif + +#ifdef MAC_MODE + + case MAC_MODE: + BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); + BABLM( BABL_GO_RIGHT_1C, T(RIGHT), END ); + BABLM( BABL_GO_LEFT_WORD , D(LALT), T(LEFT), U(LALT), END ); + BABLM( BABL_GO_RIGHT_WORD , D(LALT), T(RIGHT), U(LALT), END ); + BABLM( BABL_GO_START_LINE , D(LGUI), T(LEFT), U(LGUI), END ); + BABLM( BABL_GO_END_LINE , D(LGUI), T(RIGHT), U(LGUI), END ); + BABLM( BABL_GO_START_DOC , D(LGUI),T(UP), U(LGUI),END ); + BABLM( BABL_GO_END_DOC , D(LGUI),T(DOWN), U(LGUI),END ); + BABLM( BABL_GO_NEXT_LINE , T(DOWN), END ); + BABLM( BABL_GO_PREV_LINE , T(UP), END ); + BABLM( BABL_PGDN , D(LALT),T(DOWN), U(LALT), END ); + BABLM( BABL_PGUP , D(LALT),T(UP), U(LALT), END ); + BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); + BABLM( BABL_DEL_LEFT_WORD , D(LALT), T(BSPACE), U(LALT), END ); + BABLM( BABL_DEL_RIGHT_WORD, D(LALT), T(DEL), U(LALT), END ); + BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END );// there must be another way + BABLM( BABL_DEL_TO_LINE_START, D(LGUI), T(BSPACE), U(LGUI), END ); +#ifndef BABL_MOVEMENTONLY + BABLM( BABL_UNDO , D(1), D(LGUI), T(Z), U(LGUI), END ); + BABLM( BABL_REDO , D(LSFT),D(LGUI), T(Z), U(LSFT),U(LGUI), END ); + BABLM( BABL_CUT , D(LGUI), T(X), U(LGUI), END ); + BABLM( BABL_COPY , D(LGUI), T(C), U(LGUI), END ); + BABLM( BABL_PASTE , D(LGUI), T(V), U(LGUI), END ); + BABLM( BABL_SELECT_ALL , D(LGUI), T(A), U(LGUI), END ); + BABLM( BABL_FIND , D(LGUI),T(F), U(LGUI),END ); + BABLM( BABL_FIND_NEXT, D(LGUI),T(G), U(LGUI),END ); + BABLM( BABL_FIND_REPLACE, D(LGUI),T(F), U(LGUI),END ); + BABLM( BABL_RUNAPP , D(LGUI),T(R), U(LGUI),END ); + BABLM( BABL_SWITCH_APP_NEXT , D(LGUI),T(TAB), U(LGUI),END ); + BABLM( BABL_SWITCH_APP_LAST , D(LSFT),D(LGUI),T(TAB), U(LGUI), U(LSFT),END ); + BABLM( BABL_CLOSE_APP , D(LGUI),T(Q), U(LGUI),END ); + BABLM( BABL_HELP , D(LSFT),D(LGUI),T(SLASH), U(LGUI), U(LSFT),END ); + +#ifndef BABL_NOBROWSER + BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LGUI),D(LALT), T(RIGHT),U(LALT), U(LGUI),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LGUI), D(RSFT), T(LEFT), U(RSFT), U(LGUI),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LGUI), T(L), U(LGUI),END ); + BABLM( BABL_BROWSER_FORWARD, D(LGUI), T(RIGHT), U(LGUI),END ); + BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); + BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome + // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, D(LGUI), D(LCTL), T(P), U(LCTL), U(LGUI),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LGUI), D(RSFT), T(EQL), U(RSFT), U(LGUI),END ); // ctr+ + + BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END ); +#endif +#endif + + return MACRO_NONE; +#endif + +#ifdef EMACS_MODE + + case EMACS_MODE: + switch(shortcut) { +//probably should allow meta to not be ALT + + BABLM( BABL_GO_LEFT_1C, T(LEFT), END ); + BABLM( BABL_GO_RIGHT_1C, T(RIGHT), END ); + BABLM( BABL_GO_LEFT_WORD, D(LALT), T(B), U(LALT), END ); + BABLM( BABL_GO_RIGHT_WORD , D(LALT), T(F), U(LALT), END ); + BABLM( BABL_GO_START_LINE , D(LCTL), T(A), U(LCTL), END ); + BABLM( BABL_GO_END_LINE , D(LCTL), T(E), U(LCTL), END ); + BABLM( BABL_GO_START_DOC , D(LALT), D(LSFT), T(COMM),U(LSFT), U(LALT) ,END ); + BABLM( BABL_GO_END_DOC , D(LALT), D(LSFT), T(DOT), U(LSFT), U(LALT) ,END ); + BABLM( BABL_GO_NEXT_LINE , D(LCTL), T(N), U(LCTL), END ); + BABLM( BABL_GO_PREV_LINE , D(LCTL), T(P), U(LCTL), END ); + BABLM( BABL_PGDN , D(LCTL), T(V), U(LCTL), END ); + BABLM( BABL_PGUP , D(LALT), T(V), U(LALT), END ); + BABLM( BABL_DEL_RIGHT_1C, D(LCTL), T(D), U(LCTL),END ); + BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(BSPACE), U(LCTL), END ); + BABLM( BABL_DEL_RIGHT_WORD , D(LALT), T(D), U(LALT), END ); + BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END ); + BABLM( BABL_DEL_TO_LINE_START, T(ESC), T(0), D(LCTL), T(K), U(LCTL), END ); +#ifndef BABL_MOVEMENTONLY + BABLM( BABL_UNDO , D(LCTL), T(X), U(LCTL),T(C), END ); + BABLM( BABL_REDO , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably + BABLM( BABL_CUT , D(LCTL), T(W), U(LCTL), END ); + BABLM( BABL_COPY , D(LALT), T(W), U(LALT), END ); //really? + BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END ); + BABLM( BABL_SELECT_ALL ,D(LCTL), T(X), U(LCTL),T(H), END ); + BABLM( BABL_FIND , D(LCTL), T(S), U(LCTL),END ); + BABLM( BABL_FIND_NEXT , D(LCTL), T(S), U(LCTL),END ); + BABLM( BABL_FIND_REPLACE , D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); + BABLM( BABL_RUNAPP , D(LALT), T(X), U(LALT),T(S),T(H),T(E),T(L),T(L),END );// arguably + BABLM( BABL_SWITCH_APP_NEXT , D(LCTL), T(X), U(LCTL),T(RIGHT), END ); // arguably + BABLM( BABL_SWITCH_APP_LAST , D(LCTL), T(X), U(LCTL),T(LEFT), END ); // arguably + BABLM( BABL_CLOSE_APP , D(LCTL), T(X), U(LCTL),T(C),END ); + BABLM( BABL_HELP , D(LCTL),T(H), U(LCTL),T(A),END); // start search in help +#ifndef BABL_NOBROWSER +/* you get to figure w3 out + BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LGUI),D(LALT), T(RIGHT),U(LALT), U(LGUI),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LGUI), D(RSFT), T(LEFT), U(RSFT), U(LGUI),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LGUI), T(L), U(LGUI),END ); + BABLM( BABL_BROWSER_FORWARD, D(LGUI), T(RIGHT), U(LGUI),END ); + BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); + BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome + // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, D(LGUI), D(LCTL), T(P), U(LCTL), U(LGUI),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LGUI), D(RSFT), T(EQL), U(RSFT), U(LGUI),END ); // ctr+ + + BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END ); +*/ +#endif +#endif + break; + + return MACRO_NONE; + } + +#endif + + +#ifdef VI_MODE + case VI_MODE: +// you have to track the modes yourself. Otherwise motion is awful (bell, bell, bell) + + + BABLM( BABL_GO_LEFT_1C , T(H), END ); + BABLM( BABL_GO_RIGHT_1C , T(L), END ); + BABLM( BABL_GO_LEFT_WORD , T(B),END ); + BABLM( BABL_GO_RIGHT_WORD , T(W), END ); + BABLM( BABL_GO_START_LINE , D(LSFT), T(6),U(LSFT), END ); //^ + BABLM( BABL_GO_END_LINE , D(LSFT), T(4),U(LSFT) , END ); //$ + BABLM( BABL_GO_START_DOC , T(G),T(G) ,END ); + BABLM( BABL_GO_END_DOC , D(LSFT), T(G),U(LSFT),END ); + BABLM( BABL_GO_NEXT_LINE , T(J), END ); + BABLM( BABL_GO_PREV_LINE, T(K), END ); + BABLM( BABL_PGDN ,D(LCTL), T(F), U(LCTL), END ); + BABLM( BABL_PGUP , D(LCTL), T(B), U(LCTL), END ); + BABLM( BABL_DEL_RIGHT_1C , T(X),END ); + BABLM( BABL_DEL_LEFT_WORD , T(D),T(G),T(E),END ); + BABLM( BABL_DEL_RIGHT_WORD , T(D),T(W),END ); + BABLM( BABL_DEL_TO_LINE_END, T(D),D(LSFT), T(4),U(LSFT) ,END ); // d$ + BABLM( BABL_DEL_TO_LINE_START, T(D),D(LSFT), T(6),U(LSFT) ,END ); +#ifndef BABL_MOVEMENTONLY + BABLM( BABL_UNDO , T(U), END ); + BABLM( BABL_REDO , D(LCTL), T(R), U(LCTL), END ); + BABLM( BABL_CUT , T(X), END ); + BABLM( BABL_COPY , T(Y),END ); + BABLM( BABL_PASTE , T(P), END ); + BABLM( BABL_SELECT_ALL , D(LSFT), T(SCLN),U(LSFT),D(LSFT), T(5),U(LSFT),T(Y), END ); // wrong but helpful? + BABLM( BABL_FIND , T(SLASH),END ); + BABLM( BABL_FIND_NEXT , T(N),END ); + BABLM( BABL_FIND_REPLACE , D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); + BABLM( BABL_RUNAPP,END ); + BABLM( BABL_SWITCH_APP_NEXT ,END ); + BABLM( BABL_SWITCH_APP_LAST ,END ); + BABLM(BABL_CLOSE_APP, D(LSFT), T(SCLN),U(LSFT), T(Q), D(RSFT), T(1),U(RSFT), END ); + BABLM(BABL_HELP, D(LSFT), T(SCLN),U(LSFT),T(H),END); // start search in help +#ifndef BABL_NOBROWSER +/* you get to figure this out + BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LGUI),D(LALT), T(RIGHT),U(LALT), U(LGUI),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LGUI), D(RSFT), T(LEFT), U(RSFT), U(LGUI),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LGUI), T(L), U(LGUI),END ); + BABLM( BABL_BROWSER_FORWARD, D(LGUI), T(RIGHT), U(LGUI),END ); + BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); + BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome + // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, D(LGUI), D(LCTL), T(P), U(LCTL), U(LGUI),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LGUI), T(PLUS), U(LGUI),END ); + BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END ); +*/ +#endif +#endif + return MACRO_NONE; +#endif + + + + +#ifdef READMUX_MODE +// Readline command line editing + tmux windowing +// I havent decided how much to do readline and how much tmux + + + case READMUX_MODE: + + BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); + BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); + BABLM( BABL_GO_LEFT_WORD , D(LALT), T(B), U(LALT), END ); + BABLM( BABL_GO_RIGHT_WORD , D(LALT), T(F), U(LALT), END ); + BABLM( BABL_GO_START_LINE , D(LCTL), T(A), U(LCTL), END ); + BABLM( BABL_GO_END_LINE , D(LCTL), T(E), U(LCTL), END ); + //BABLM( BABL_GO_START_DOC ,END );// tmux? + //BABLM( BABL_GO_END_DOC ,END ); // tmux? + BABLM( BABL_GO_NEXT_LINE , D(LCTL), T(N), U(LCTL), END ); + BABLM( BABL_GO_PREV_LINE , D(LCTL), T(P), U(LCTL), END ); + BABLM( BABL_PGDN , T(PGDN), END ); + BABLM( BABL_PGUP , T(PGUP), END ); + BABLM( BABL_DEL_RIGHT_1C , D(LCTL), T(D), U(LCTL),END ); + BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(W), U(LCTL), END ); + BABLM( BABL_DEL_RIGHT_WORD , D(LALT), T(D), U(LALT), END ); + BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END ); + BABLM( BABL_DEL_TO_LINE_START, D(LCTL), T(U), U(LCTL), END ); +#ifndef BABL_MOVEMENTONLY + BABLM( BABL_UNDO , D(LALT), T(R), U(LALT) , END ); + BABLM( BABL_REDO , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably + BABLM( BABL_CUT , D(LCTL), T(K), U(LCTL), END ); // wrong half the time + //BABLM( BABL_COPY ,END ); + BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END ); + BABLM( BABL_SELECT_ALL , D(LCTL), T(A), T(K), T(Y), U(LCTL) , END ); + BABLM( BABL_FIND , D(LCTL), T(R), U(LCTL), END ); // search history + BABLM(BABL_FIND_NEXT, D(LCTL), T(S), U(LCTL), END ); + //BABLM( BABL_FIND_REPLACE ,END ); + BABLM( BABL_RUNAPP , D(LCTL), T(B), U(LCTL), T(C),END ); //tmux + BABLM( BABL_SWITCH_APP_NEXT , D(LCTL), T(B), U(LCTL), T(N),END ); //tmux + BABLM( BABL_SWITCH_APP_LAST , D(LCTL), T(B), U(LCTL), T(P),END ); //tmux + BABLM( BABL_CLOSE_APP , D(LCTL), T(B), U(LCTL), T(D),END); // usually what I want + // BABLM( BABL_HELP ,END ); +#ifndef BABL_NOBROWSER +/* Add lynx shortcuts? + BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LGUI),D(LALT), T(RIGHT),U(LALT), U(LGUI),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LGUI), D(RSFT), T(LEFT), U(RSFT), U(LGUI),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LGUI), T(L), U(LGUI),END ); + BABLM( BABL_BROWSER_FORWARD, D(LGUI), T(RIGHT), U(LGUI),END ); + BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); + BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome + // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, D(LGUI), D(LCTL), T(P), U(LCTL), U(LGUI),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LGUI), T(PLUS), U(LGUI),END ); + BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END ); +*/ +#endif +#endif + + return MACRO_NONE; + +#endif + + default: + return MACRO_NONE; + } + +} + + +#endif \ No newline at end of file diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.h b/keyboards/handwired/MS-sculpt-mobile/babblePaste.h new file mode 100644 index 00000000..3067c854 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.h @@ -0,0 +1,238 @@ +/* A library to output the right key shortcut in any common app. +Given a global variable babble_mode to show the environment and a +key that calls the paste macro, do the right type of paste. + +Setting the bable_mode is done by another macro, or TBD interaction with the host. + +Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts +and jeebak & algernon's keymap +*/ +#ifndef _babblePaste_h_included__ +#define _babblePaste_h_included__ +#include "action_layer.h" +#include "quantum_keycodes.h" +#include "config.h" + +#ifdef USE_BABLPASTE + +/* *************************** + +// Uncomment any modes you want. Whatever mode = 0 will be the default on boot +// Expect to get errors if you comment a feature out and leave it in your keymap. + +#define USE_BABLPASTE + +//#define MS_MODE 0 // Windows. +//#define MAC_MODE 1 +//#define LINUX_MODE 2 //aka gnome+KDE +//#define EMACS_MODE 3 +//#define VI_MODE 4 +//#define WORDSTAR_MODE 5 +//#define READMUX 6 // Readline and tmux + +// This removes everything but cursor movement +//#define BABL_MOVEMENTONLY +// and this just removes browser shortcuts +//#define BABL_NOBROWSER +****************************/ + + +// Uncomment if you need more free flash space +// It removes everything but cursor movement +//#define BABL_MOVEMENTONLY + + +// Define starting number for BABL macros in the macro range. +// Probably can start the default even lower +#define BABL_START_NUM 50 + +/* Macros handled by babblepaste. Most should be available for all platforms. +Whatever isn't defined will NOP */ +enum { +// Movement macros + // left & right + BABL_GO_LEFT_1C= BABL_START_NUM, + BABL_GO_RIGHT_1C, + BABL_GO_LEFT_WORD, + BABL_GO_RIGHT_WORD, + BABL_GO_START_LINE, + BABL_GO_END_LINE, + // now up & down + BABL_GO_START_DOC, + BABL_GO_END_DOC, + BABL_GO_NEXT_LINE, + BABL_GO_PREV_LINE, + BABL_PGDN, + BABL_PGUP, + // And the delete options + //BABL_DEL_LEFT_1C == backspace, so why bother. + BABL_DEL_RIGHT_1C, // usually = Del + BABL_DEL_LEFT_WORD, + BABL_DEL_RIGHT_WORD, + BABL_DEL_TO_LINE_END, // delete from cursor to end of line + BABL_DEL_TO_LINE_START, // delete from cursor to begining line +#ifndef BABL_MOVEMENTONLY + // Cut & Paste + BABL_UNDO, + BABL_REDO, + BABL_CUT, + BABL_COPY, + BABL_PASTE, + BABL_SELECT_ALL, + /* not yet implemented + BABL_SWAP_LAST2C // swap last characters before the cursor + BABL_SWAP_LAST2W // Swap the last two words before the cursor + */ + // find & replace + BABL_FIND, + BABL_FIND_NEXT, + BABL_FIND_REPLACE, + // GUI or app + BABL_RUNAPP, + BABL_SWITCH_APP_NEXT, + BABL_SWITCH_APP_LAST, // previous + BABL_CLOSE_APP, + BABL_HELP, + +#ifndef BABL_NOBROWSER + BABL_BROWSER_NEW_TAB, + BABL_BROWSER_CLOSE_TAB, + BABL_BROWSER_REOPEN_LAST_TAB, + BABL_BROWSER_NEXT_TAB, + BABL_BROWSER_PREV_TAB, + BABL_BROWSER_URL_BAR, + BABL_BROWSER_FORWARD, + BABL_BROWSER_BACK, + BABL_BROWSER_FIND, + BABL_BROWSER_BOOKMARK, + BABL_BROWSER_DEV_TOOLS, // hard one to remember + BABL_BROWSER_RELOAD, + BABL_BROWSER_FULLSCREEN, + BABL_BROWSER_ZOOM_IN, + BABL_BROWSER_ZOOM_OUT, + +#endif + +#endif +// Macros for mode switching +#ifdef MS_MODE + BABL_WINDOWS, +#endif +#ifdef MAC_MODE + BABL_MAC, +#endif +#ifdef LINUX_MODE + BABL_LINUX, +#endif +#ifdef EMACS_MODE + BABL_EMACS, +#endif +#ifdef VI_MODE + BABL_VI, +#endif +#ifdef READMUX_MODE + BABL_READLINE, +#endif + + +}; + +// BUG, used to jump to babble functiion. Surely there is a way to calculate size of enum? +#define BABL_NUM_MACROS 48+4 // 48 + # of defined modes. + +/* And all the shorthand keymap ready versions */ +// First the mode switching macros +#ifdef MS_MODE +#define B_WIN M(BABL_WINDOWS) +#endif +#ifdef MAC_MODE +#define B_MAC M(BABL_MAC) +#endif +#ifdef LINUX_MODE +#define B_LNX M(BABL_LINUX) +#endif +#ifdef EMACS_MODE +#define B_EMAX M(BABL_EMACS) +#endif +#ifdef VI_MODE +#define B_VI M(BABL_VI) +#endif +#ifdef READMUX_MODE +#define B_READ M(BABL_READLINE) +#endif + +// and all the movement & action. + +#define B_L1C M(BABL_GO_LEFT_1C) +#define B_R1C M(BABL_GO_RIGHT_1C) +#define B_L1W M(BABL_GO_LEFT_WORD) +#define B_R1W M(BABL_GO_RIGHT_WORD) +#define B_GSOL M(BABL_GO_START_LINE) +#define B_GEOL M(BABL_GO_END_LINE) +#define B_GTOP M(BABL_GO_START_DOC) +#define B_GEND M(BABL_GO_END_DOC) +#define B_DOWN M(BABL_GO_NEXT_LINE) +#define B_UP M(BABL_GO_PREV_LINE) +#define B_PGDN M(BABL_PGDN) +#define B_PGUP M(BABL_PGUP) +//#define B_BKSP M(BABL_DEL_LEFT_1C) == backspace so why bother. +#define B_DEL M(BABL_DEL_RIGHT_1C) // usually = Del +#define B_DLW M(BABL_DEL_LEFT_WORD) +#define B_DRW M(BABL_DEL_RIGHT_WORD) +#define B_DEOL M(BABL_DEL_TO_LINE_END) // delete from cursor to end of line +#define B_DSOL M(BABL_DEL_TO_LINE_START) // delete from cursor to begining line +#define B_UNDO M(BABL_UNDO) +#define B_REDO M(BABL_REDO) +#define B_CUT M(BABL_CUT) +#define B_COPY M(BABL_COPY) +#define B_PAST M(BABL_PASTE) +#define B_SELA M(BABL_SELECT_ALL) +#define B_FIND M(BABL_FIND) +#define B_FINDN M(BABL_FIND_NEXT) +#define B_FINDR M(BABL_FIND_REPLACE) +#define B_RAPP M(BABL_RUNAPP) +#define B_NAPP M(BABL_SWITCH_APP_NEXT) +#define B_PAPP M(BABL_SWITCH_APP_LAST) // previous +#define B_CAPP M(BABL_CLOSE_APP) +#define B_HELP M(BABL_HELP) +#define B_NTAB M(BABL_BROWSER_NEW_TAB) +#define B_CTAB M(BABL_BROWSER_CLOSE_TAB) +#define B_ROTB M(BABL_BROWSER_REOPEN_LAST_TAB) +#define B_NXTB M(BABL_BROWSER_NEXT_TAB) +#define B_PTAB M(BABL_BROWSER_PREV_TAB) +#define B_NURL M(BABL_BROWSER_URL_BAR) +#define B_BFWD M(BABL_BROWSER_FORWARD) +#define B_BBAK M(BABL_BROWSER_BACK) +#define B_BFND M(BABL_BROWSER_FIND) +#define B_BOOK M(BABL_BROWSER_BOOKMARK) +#define B_BDEV M(BABL_BROWSER_DEV_TOOLS) // hard one to remember +#define B_BRLD M(BABL_BROWSER_RELOAD) +#define B_BFUlL M(BABL_BROWSER_FULLSCREEN) +#define B_ZMIN M(BABL_BROWSER_ZOOM_IN) +#define B_ZMOT M(BABL_BROWSER_ZOOM_OUT) + + + + + + + +/* from action_macro.h +typedef uint8_t macro_t; + +#define MACRO_NONE (macro_t*)0 +#define MACRO(...) ({ static const macro_t __m[] PROGMEM = { __VA_ARGS__ }; &__m[0]; }) +#define MACRO_GET(p) pgm_read_byte(p) + +#define BABL_MSTART (entry, os, macro...) ( const macro_t bablDict[entry][os] PROGMEM = { macro... }; ) + +*/ + +const macro_t *babblePaste(keyrecord_t *record, uint8_t shortcut); + +macro_t* switch_babble_mode( uint8_t id); + + +#endif +#endif + diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.txt b/keyboards/handwired/MS-sculpt-mobile/babblePaste.txt new file mode 100644 index 00000000..cf75e153 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.txt @@ -0,0 +1,123 @@ + BabblePaste is a library of common macros used to make sure that +you can have one "paste" button on one layer, and it will do the +right thing on any OS or app. Windows=Ctrl-V. Mac = Command-V and so on. + +The babblepaste library looks for the current status in a babble_mode global variable. +To switch modes, run the switch_babble_mode() function, or a pre defined macro. +Currently supported are Windows, OS X, Gnome/kde, Emacs, VI and readline, +across 42+ common macro actions. + + +###To use the library +1) Paste the following into your config.h. + +//////Begin////// +#define USE_BABLPASTE 1 + +#ifdef USE_BABLPASTE +/* define BabblePaste maps. Whatever = 0 will be the default. */ +// MAC_MODE 0 +// MS_MODE 1 +// LINUX_MODE 2 +// EMACS_MODE 3 +// VI_MODE 3 +// Readline and tmux +// READMUX_MODE 2 +// WORDSTAR_MODE 5 +#endif + +// Uncomment these to remove options an free up flash space + +// This removes everything but cursor movement +// BABL_MOVEMENTONLY +// and this just removes browser shortcuts +// BABL_NOBROWSER +///////End/////// + +2) Add the following to your keymap in the action_get_macro + +//////Begin////// +#ifdef USE_BABLPASTE + + if( id >= BABL_START_NUM && id < (BABL_START_NUM + BABL_NUM_MACROS ) ) { + if (record->event.pressed) { // is there a case where this isn't desired? + + babblePaste ( record, id ); + return MACRO_NONE; + } + } +#endif +///////End/////// + +3) add Babbelpaste actions to your keymap. See the full list in babblePaste.h, or the +list below +B_L1C // go left 1 char +B_R1C // go Right 1 char + B_L1W //GO_LEFT_1 WORD + B_R1W //BABL_GO_RIGHT_1 WORD + B_GSOL // BABL_GOTO_START of _LINE + B_GEOL // BABL_GOTO_END_LINE + B_GTOP //BABL_GOTO_START_DOC + B_GEND //BABL_GO_END_DOC + B_DOWN //BABL_GO_NEXT_LINE + B_UP // BABL_GO_PREV_LINE + B_PGDN //PGDN + B_PGUP //PGUP +// B_BKSP //backspace so why bother. + B_DEL // DEL_RIGHT_1 Char // usually = Del + B_DLW // DEL_LEFT_ 1 WORD) + B_DRW //DEL_RIGHT_1 WORD + B_DEOL // delete from cursor to end of line + B_DSOL // delete from cursor to begining line + B_UNDO //UNDO + B_REDO // REDO + B_CUT // CUT) + B_COPY // COPY) + B_PAST // PASTE) + B_SELA // SELECT_ALL + B_FIND // FIND) + B_FINDN //FIND_NEXT) + B_FINDR // FIND_REPLACE) + B_RAPP // open application launcher + B_NAPP // switch to next app + B_PAPP // switch to previous app + B_CAPP // CLOSE_APP) + B_HELP // HELP) + B_NTAB // BROWSER_NEW_TAB) + B_CTAB //BROWSER_CLOSE_TAB) + B_ROTB //BROWSER_REOPEN_LAST_TAB) + B_NXTB //BROWSER_NEXT_TAB) + B_PTAB //BROWSER_PREV_TAB) + B_NURL //BROWSER_jump to URL_BAR) + B_BFWD // BROWSER_FORWARD (in history) + B_BBAK //BROWSER_BACK (in history) + B_BFND // BROWSER_FIND) + B_BOOK //BROWSER_New BOOKMARK) + B_BDEV //BROWSER_ Open DEV_TOOLS) // hard one to remember + B_BRLD // BROWSER_RELOAD Page + B_BFUlL // BROWSER_FULLSCREEN) + B_ZMIN // BROWSER_ZOOM_IN) + B_ZMOT //BROWSER_ZOOM_OUT) + + +#### Development notes +-Why a new function? Because it would make the keymap too ugly to put it there. +-Why not return the macro to action_get_macro? Because I kept running into scope problems +and pointers to the wrong type. +-Why not an array of arrays as a lookup instead of a function? That would allow you +to store the lookup table in PROGMEM. True, but that takes more pre-processor skill +than I had. + +-Have you tested this on every platform? No. Submit a patch. + + +### Next steps for someone. +Make it easier to pair macros with modifiers. So key foo will jump to start of line, and +Shift(foo) will jump to the first tab in a browser. + +## Thanks + +Thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts +and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c +And of course QMK... + diff --git a/keyboards/handwired/MS-sculpt-mobile/config.h b/keyboards/handwired/MS-sculpt-mobile/config.h new file mode 100644 index 00000000..f8951427 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/config.h @@ -0,0 +1,100 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Microsoftplus +#define DESCRIPTION 6000 + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 18 + +#ifdef ASTAR +#define PRODUCT sculpt mobile astar + /*0 1 2 3 4 5 6 7 8 */ +#define MATRIX_ROW_PINS {D7, C6, D4, D0, D1, D3, D2, E2} +/* A B C D E F G H I J K L M N O P Q R */ +#define MATRIX_COL_PINS {B4, B5, E6, B7, B6, D6, C7, F7, F6, F4,F5, F1,F0, D5, B0, B1, B2, B3} + +#else +#define PRODUCT sculpt mobile teensypp +/* 0 1 2 3 4 5 6 7 */ +#define MATRIX_ROW_PINS { F7,F6,F4,F5,F3,F2,F1,F0} +/* A B C D E F G H I J K L M N O P Q R */ +#define MATRIX_COL_PINS { B7, D0, D1, D2, D3, D4, D5, D6, D7, E0,E1,C1, C0, C3, C2, C5, C4,C7} +#define UNUSED_PINS { B6,B5,B4,B3,B2,B1,B0 } + + +#endif + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION ROW2COL + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#define PREVENT_STUCK_MODIFIERS + +#endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/default/Makefile b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/Makefile new file mode 100644 index 00000000..8b829218 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../../Makefile +endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/default/config.h b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/config.h new file mode 100644 index 00000000..8893d122 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/default/keymap.c b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/keymap.c new file mode 100644 index 00000000..ab09dcdd --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/keymap.c @@ -0,0 +1,64 @@ +#include "MS-sculpt-mobile.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* +* +* |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|Mute| +* -------------------------------------------------------------------------------' +* | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del | +* -------------------------------------------------------------------------- +* | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ | | +* -------------------------------------------------------------------------------' +* | caps | a | s | d | f | g | h | j | k | l | ; | ' | enter |PgUp| +* -------------------------------------------------------------------------------- +* |Lsft | z | x | c | v | b | n | m | , | . | / | Rsft| Up| PgDn| +* --------------------------------------------------------------------------------- +* |Lctl |Lgui |Lalt | Space |Ralt | FN | Rctl |Left|Down|Rght| +* --------------------------------------------------------------------------------- +*/ + +[0] = KEYMAP( \ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_VOLU, KC_MUTE,\ + KC_GRAVE, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_DEL,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,\ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,\ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, RSFT(KC_1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT +) + +}; +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/default/readme.md b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/readme.md new file mode 100644 index 00000000..e67ddc6f --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for microsoft-sculpt-mobile diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile new file mode 100644 index 00000000..1209ad78 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../../Makefile +endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h new file mode 100644 index 00000000..8cf4202c --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h @@ -0,0 +1,32 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#define USE_BABLPASTE + +// Expect to get errors if you comment a feature out and leave it in your keymap. + +#ifdef USE_BABLPASTE +//define BabblePaste maps +// Windows. +#define MAC_MODE 0 +#define MS_MODE 1 +//aka gnome+KDE +//#define LINUX_MODE 2 +//#define EMACS_MODE 3 +#define VI_MODE 3 +// Readline and tmux +#define READMUX_MODE 2 +//#define WORDSTAR_MODE 5 +#endif + +// Uncomment if you need more free flash space + +// This removes everything but cursor movement +//#define BABL_MOVEMENTONLY +// and this just removes browser shortcuts +//#define BABL_NOBROWSER + +// place overrides here +#endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c new file mode 100644 index 00000000..395a9fb4 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c @@ -0,0 +1,272 @@ +#include "MS-sculpt-mobile.h" +#include "action_layer.h" +#include "action_util.h" +#include "babblePaste.h" + +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif + +#define _QWR 0 +#define _CDH 2 +#define _SYM 3 +#define _MOV 4 +#define _TRAN 5 + + +enum layer_keycodes { +QWR, +CDH, +SYM, +MOV, +NUM, +TRAN +}; + + +// Shorter spacing +#define XXXX KC_NO +#define ____ KC_TRNS + +// Custom macros + +/* Fn Keys */ +#define TT_SYM MO(_SYM) +#define TT_MOV KC_FN2 +#define TT_NUM MO(_NUM) +#define SSFT ACTION_MODS_ONESHOT(MOD_LSFT) + +enum macro_keycodes { +DHPASTE=1, +VIBRK, +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* QWERTY +* +* |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|_CDH| +* -------------------------------------------------------------------------------' +* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del| +* --------------------------------------------------------------------------- +* | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ | | +* -------------------------------------------------------------------------------' +* |Bak/Mov| a | s | d | f | g | h | j | k | l | ; | ' | enter |PgUp| +* -------------------------------------------------------------------------------- +* |Lsft | z | x | c | v | b | n | m | , | . | / | Rsft| Up| PgDn| +* --------------------------------------------------------------------------------- +* |Lctl |Lgui |Lalt | Space/Sym | GUI | Sym | Rctl |Left|Down|Rght| +* --------------------------------------------------------------------------------- +*/ + +[_QWR] = KEYMAP( \ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_VOLU, CDH,\ + KC_ESC, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_DEL,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,\ + TT_MOV, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT,KC_SLSH,KC_RSFT, KC_UP, KC_PGDN,\ + KC_LCTL, KC_LGUI, KC_LALT, KC_FN1, KC_RGUI,TT_SYM,KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT +), + +[_CDH] = KEYMAP (\ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, QWR, \ + KC_ESC, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, ____, ____, ____,\ + TT_MOV, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_2,\ + KC_LSFT, KC_Z, KC_X, KC_C, M(DHPASTE), KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, ____, KC_1,\ + ____, ____, ____ , KC_FN1, ____, ____, ____, ____, ____, ____ + +), + + +/* SYM +* +* |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|_CDH| +* -------------------------------------------------------------------------------' +* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace|Del | +* -------------------------------------------------------------------------- +* | ESC: | ^ | { | } | @ | % | | [ | ( | ) | _ | [ | ] | \ | | +* -------------------------------------------------------------------------------' +* |Bak/Mov| ! | # | 0 | = | { | } | - | 1 | + | ] | ` | enter |PgUp| +* -------------------------------------------------------------------------------- +* |Lsft | ; | ~ | : | ~ | "|"| $ | * | | . | / | Rsft| Up| PgDn| +* --------------------------------------------------------------------------------- +* |Lctl |Lgui |Lalt | Space/Sym | GUI | Sym | Rctl |Left|Down|Rght| +* --------------------------------------------------------------------------------- +*/ + +[_SYM] = KEYMAP (\ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + M(VIBRK), KC_CIRC, KC_LCBR, KC_RCBR,KC_AT, KC_PERC, ____, KC_LBRC,KC_LPRN,KC_RPRN,KC_UNDS, ____, ____, ____,\ + ____, KC_EXLM, KC_HASH, KC_0, KC_EQL, KC_LCBR, KC_RCBR,KC_MINS,KC_1, KC_PLUS,KC_RBRC, KC_GRV, ____, ____,\ + ____, KC_SCLN, KC_TILDE, KC_COLN, KC_TILDE, KC_PIPE, KC_DLR, KC_ASTR, ____, KC_DOT , KC_SLSH, ____, ____, ____,\ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ +), +/* +* |ESC | MAC| Win|RdLn| VI | | | | | | | | | | | | +* -------------------------------------------------------------------------------' +* | | | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del| +* --------------------------------------------------------------------------- +* | tab | | |Find| |pTab |DSOL|DelW| Up |DelW|DEOL| [ | ] | \ | | +* -------------------------------------------------------------------------------' +* |Bak/Mov| | | | |nTab |GSOL| <- | Dwn | -> | EOL | ' | enter |PgUp| +* -------------------------------------------------------------------------------- +* |Lsft |Undo| Cut|Copy|Pste| | | | | | / | Rsft| Up| PgDn| +* --------------------------------------------------------------------------------- +* |Lctl |Lgui |Lalt | Space/Sym | GUI | Sym | Rctl |Left|Down|Rght| +* --------------------------------------------------------------------------------- +*/ + +[_MOV] = KEYMAP (\ + ____, B_MAC,B_WIN,B_READ, B_VI, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, B_PAPP, B_NAPP, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, B_UNDO, ____, B_BFND, ____, B_PTAB, B_DSOL, B_DLW, B_UP, B_DRW, B_DEOL, ____, ____, ____, \ + ____, B_SELA, B_BRLD, ____, ____, B_NXTB, B_GSOL, B_L1C, B_DOWN, B_R1C,B_GEOL, ____, ____, ____,\ + ____, B_UNDO,B_CUT, B_COPY, B_PAST, B_PAST, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ +), + +[_TRAN] = KEYMAP (\ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ +) +}; + +const uint16_t PROGMEM fn_actions[] = { +[1] = ACTION_LAYER_TAP_KEY(_SYM,KC_SPACE), +[2] = ACTION_LAYER_TAP_KEY(_MOV,KC_BSPC) +}; + +#ifdef AUDIO_ENABLE + +float tone_startup[][2] = SONG(STARTUP_SOUND); +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWR: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + layer_off(_CDH); + } + return false; + break; + + case CDH: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + layer_on(_CDH); + } + return false; + break; + + case SYM: + if (record->event.pressed) { + layer_on(_SYM); + } else { + layer_off(_SYM); + } + return false; + break; + + } + return true; + +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + +/* If id is in the range of BABL macros, call the babl function */ +/* Any clever remapping with modifiers should happen here e.g. shift bablkey does opposite*/ +#ifdef USE_BABLPASTE + + if( id >= BABL_START_NUM && id < (BABL_START_NUM + BABL_NUM_MACROS ) ) { + if (record->event.pressed) { // is there a case where this isn't desired? + + babblePaste ( record, id ); + return MACRO_NONE; + } + } +#endif + + + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + + /* Colemak mod-dh moves the D key to the qwerty V position + This hack makes apple-V_position do what I mean */ + case DHPASTE: + if(keyboard_report->mods & MOD_BIT(KC_LGUI) ) { + if (record->event.pressed) { + clear_keyboard_but_mods(); + register_code(KC_V); + } else { + unregister_code(KC_V); + } + } else { + if (record->event.pressed) { + register_code(KC_D); + } else { + unregister_code(KC_D); + } + } + break; + + case VIBRK: // vi esc: + if (record->event.pressed) { + return MACRO( T(ESC),D(LSFT),T(SCLN),U(LSFT), END ); + } + break; + + + + + default: + return MACRO_NONE; + } + + +return MACRO_NONE; +}; + + + + + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { + +} + + +void led_set_user(uint8_t usb_led) { + +} + + + + + + diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/readme.md b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/readme.md new file mode 100644 index 00000000..96ee0e77 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/readme.md @@ -0,0 +1 @@ +# A more programmer oriented keymap for microsoft-sculpt-mobile diff --git a/keyboards/handwired/MS-sculpt-mobile/readme.md b/keyboards/handwired/MS-sculpt-mobile/readme.md new file mode 100644 index 00000000..d435b449 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/readme.md @@ -0,0 +1,58 @@ + +This is a way to take a Microsoft ergonomic bluetooth keyboard, and make it +into a hard-wired keyboard running QMK. + +The keyboard is known under several different names: +Mobile Bluetooth 5000, Mobile 6000, Sculpt mobile, and Asus rebranded + +I had a stack of them,since they're cheap on ebay, travel well, and are just ergo enough. + +The ribbon cable is 1mm pitch, which is hard to hand solder. I bought a cheap set of +"pitch adapter" boards https://www.amazon.com/Double-Sided-0-4mm-1-0-Adapter-60mmx38mm/dp/B00OK42118 + +Cut the original ribbon cable sockets off the bluetooth board using a razor, they're hard to desolder. +They're also allow the cable to be inserted on top or bottom. + +If I was going to do it again, I'd make the MCU connection come out the top of the keyboard +and avoid the wires dangling out the bottom. + +As I was debugging the matrix, I started to get random failures. In desparation I tried a second MCU, +but had the same problems. It turns out that the ribbon cable connections can get worn. Shave a +half millimeter off the end of the ribbon cable & the errors go away. + +My method for discovering the matrix was to set up a KEYMAP macro that included all pins. +See MATRIX_TESTING_KEYMAP if you need it. Then set up a keymap that has all printable symbols +in the first 4 rows. test each key & record output. Then switch the printable symbols to the +bottom 4 rows & repeat. This was enough to show the matrix. + + +The full original keymap for the sculpt is + A B C D E F G H ---> +0 b n m , . / +1 g h " +2 7 8 9 0 Del PgUp +3 p [ ] \ +4 y u i o +5 ~ - += j k l ; 5 +6 a s d q w e, Up left +7 F7 F8 F9 F10 F11 F12 f + +-----> I J K L M N O P Q R +0 Caps FN +1 Vol+ mute Rctl vol- pgdn LCTL +2 Rshift LShift +3 Ralt LAlt +4 LGUI +5 6 bakspc 1 2 3 4 F4 F5 F6 +6 Down right spc F1 F2 F3 tab +7 r t z x c v enter Esc + +This works with 18 cols + 8 rows on a Teensy++, or Arm based Teensy. + +The Astar mini has all pins exposed , so you can do 18x8 +If you want a speaker, LEDs &etc, you'll need to free up a pin. I recommend joining columns +R and L to the same pin. + +Building - add ASTAR=1 to the compile line or leave out for teensy2++ + + diff --git a/keyboards/handwired/MS-sculpt-mobile/rules.mk b/keyboards/handwired/MS-sculpt-mobile/rules.mk new file mode 100644 index 00000000..680389c8 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/rules.mk @@ -0,0 +1,48 @@ + +## Project specific files +SRC= babblePaste.c + + +ifdef ASTAR + CFLAGS=-D ASTAR + OPT_DEFS += -DBOOTLOADER_SIZE=4096 + MCU = atmega32u4 + OPT_DEFS += -DCATERINA_BOOTLOADER + SCULPT_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done ; \ + avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB) + +else + MCU = at90usb1286 + OPT_DEFS += -DBOOTLOADER_SIZE=2048 + SCULPT_UPLOAD_COMMAND = teensy_loader_cli -w -mmcu=$(MCU) $(TARGET).hex +endif + +F_CPU = 16000000 +ARCH = AVR8 +F_USB = $(F_CPU) +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 + + +USB ?= /dev/cu.usbmodem14141 + + + +upload: build + $(SCULPT_UPLOAD_COMMAND) diff --git a/keyboards/handwired/atreus50/Makefile b/keyboards/handwired/atreus50/Makefile new file mode 100644 index 00000000..57b2ef62 --- /dev/null +++ b/keyboards/handwired/atreus50/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif diff --git a/keyboards/handwired/atreus50/atreus50.c b/keyboards/handwired/atreus50/atreus50.c new file mode 100644 index 00000000..225a51bc --- /dev/null +++ b/keyboards/handwired/atreus50/atreus50.c @@ -0,0 +1,10 @@ +#include "atreus50.h" + +void matrix_init_kb(void) { + + // Turn status LED on + //DDRE |= (1<<6); + PORTE |= (1<<6); + + matrix_init_user(); +}; diff --git a/keyboards/handwired/atreus50/atreus50.h b/keyboards/handwired/atreus50/atreus50.h new file mode 100644 index 00000000..de06f255 --- /dev/null +++ b/keyboards/handwired/atreus50/atreus50.h @@ -0,0 +1,36 @@ +#ifndef ATREUS50_H +#define ATREUS50_H + +#include "quantum.h" + +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, km0, km1, k36, k37, k38, k39, k3a, k3b \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, KC_NO, k06, k07, k08, k09, k0a, k0b }, \ + { k10, k11, k12, k13, k14, k15, KC_NO, k16, k17, k18, k19, k1a, k1b }, \ + { k20, k21, k22, k23, k24, k25, km0, k26, k27, k28, k29, k2a, k2b }, \ + { k30, k31, k32, k33, k34, k35, km1, k36, k37, k38, k39, k3a, k3b } \ +} + +#define COMPACT_KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, km0, km1, k36, k37, k38, k39, k3a, k3b \ +) \ +{ \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_NO, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_NO, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##km0, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##km1, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b } \ +} + +#define KC_ KC_TRNS + +#endif diff --git a/keyboards/handwired/atreus50/config.h b/keyboards/handwired/atreus50/config.h new file mode 100644 index 00000000..2e34e0f8 --- /dev/null +++ b/keyboards/handwired/atreus50/config.h @@ -0,0 +1,163 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xBB80 +#define PRODUCT_ID 0x040D +#define DEVICE_VER 0x0001 +#define MANUFACTURER Hexwire +#define PRODUCT Atreus 50 Keyboard +#define DESCRIPTION Atreus layout with extra column + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 13 + +/* Planck PCB default pin-out */ +#define MATRIX_ROW_PINS { D3, D2, D1, D0 } +#define MATRIX_COL_PINS { D4, D7, E6, B4, B5, B6, B2, B3, B1, F7, F6, F5, F4 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + + +/* ws2812 RGB LED */ +#define RGB_DI_PIN C6 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/atreus50/keymaps/default/Makefile b/keyboards/handwired/atreus50/keymaps/default/Makefile new file mode 100644 index 00000000..d7b0fa7f --- /dev/null +++ b/keyboards/handwired/atreus50/keymaps/default/Makefile @@ -0,0 +1,6 @@ +RGBLIGHT_ENABLE = yes +AUDIO_ENABLE = no + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/atreus50/keymaps/default/keymap.c b/keyboards/handwired/atreus50/keymaps/default/keymap.c new file mode 100644 index 00000000..415405ec --- /dev/null +++ b/keyboards/handwired/atreus50/keymaps/default/keymap.c @@ -0,0 +1,250 @@ +#include "atreus50.h" +#include "action_layer.h" +#include "eeconfig.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _MOVEMENT 5 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + MOVEMENT, + BACKLIT +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO +#define KC_X0 MT(MOD_LCTL, KC_ESC) // Hold for Left Ctrl, Tap for ESC +#define KC_X1 LOWER +#define KC_X2 RAISE +#define KC_X3 MO(_MOVEMENT) +#define KC_X4 MT(MOD_LSFT, KC_ENT) // Hold for Left Shift, Tap for Enter + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, X4 , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), + + [_COLEMAK] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , R , S , T , D , H , N , E , I , O ,QUOT, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , K , M ,COMM,DOT ,SLSH, X4 , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), + + [_DVORAK] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , O , E , U , I , D , H , R , N , S ,SLSH, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT,SCLN, Q , J , K , X , B , M , W , V , Z , X4 , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), + + [_LOWER] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,DEL , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL , F1 , F2 , F3 , F4 , F5 , F6 ,UNDS,PLUS,LCBR,RCBR,PIPE, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , F7 , F8 , F9 ,F10 ,F11 , F12 ,END , , , , , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + , , , , , , , , , ,MNXT,VOLD,VOLU,MPLY + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), + + [_RAISE] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + GRV , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,DEL , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL , F1 , F2 , F3 , F4 , F5 , F6 ,MINS,EQL ,LBRC,RBRC,BSLS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , F7 , F8 , F9 ,F10 ,F11 , F12 ,NUHS,NUBS, , , , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + , , , , , , , , , ,MNXT,VOLD,VOLU,MPLY + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), + + [_MOVEMENT] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR, UP ,LPRN,RPRN,DEL , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL , F1 , F2 , F3 , F4 , F5 , F6 ,LEFT,DOWN,RGHT,RCBR,PIPE, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , F7 , F8 , F9 ,F10 ,F11 , F12 ,END , , , , , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + , , , , , , , ,PGDN,PGUP,MNXT,VOLD,VOLU,MPLY + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), + +/* Adjust (Lower + Raise) + * |------+------+------+------+------+------. ,------+------+------+------+------+------| + * | | Reset| | | | | | | | | | | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | |Audoff|Aud on|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | |Voice-|Voice+|Musoff|Mus on| | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | + * `-------------------------------------------------------------------------------------------------' + */ + [_ADJUST] = KEYMAP( \ + _______, RESET, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) + +}; + +#ifdef AUDIO_ENABLE +float tone_startup[][2] = { + {NOTE_B5, 20}, + {NOTE_B6, 8}, + {NOTE_DS6, 20}, + {NOTE_B6, 8} +}; + +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); + +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +#endif + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +}; + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif +} + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif diff --git a/keyboards/handwired/atreus50/readme.md b/keyboards/handwired/atreus50/readme.md new file mode 100644 index 00000000..0c24f67d --- /dev/null +++ b/keyboards/handwired/atreus50/readme.md @@ -0,0 +1,16 @@ +Handwired Atreus50 +================== + +This firmware is for a Handwired Atreus50 using an Arduino Pro Micro. + +## Pinout + +The following pins are used: +- Columns 1-13: D4, D7, E6, B4, B5, B6, B2, B3, B1, F7, F6, F5, F4 +- Rows 1-4: D3, D2, D1, D0 + +## Compiling and loading the firmware + +To build the firmware, run `make`. + +To flash the firemware onto the microcontroller, run `make avrdude`, and press the reset button. diff --git a/keyboards/handwired/atreus50/rules.mk b/keyboards/handwired/atreus50/rules.mk new file mode 100644 index 00000000..7770ea2a --- /dev/null +++ b/keyboards/handwired/atreus50/rules.mk @@ -0,0 +1,81 @@ + + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= no # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality +MIDI_ENABLE ?= no # MIDI controls +AUDIO_ENABLE ?= no # Audio output on port C6 +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend + +avrdude: build + ls /dev/tty* > /tmp/1; \ + echo "Reset your Pro Micro now"; \ + while [[ -z $$USB ]]; do \ + sleep 1; \ + ls /dev/tty* > /tmp/2; \ + USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \ + done; \ + avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex + +.PHONY: avrdude diff --git a/keyboards/handwired/magicforce68/Makefile b/keyboards/handwired/magicforce68/Makefile new file mode 100644 index 00000000..191c6bb6 --- /dev/null +++ b/keyboards/handwired/magicforce68/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/magicforce68/README.md b/keyboards/handwired/magicforce68/README.md new file mode 100644 index 00000000..4f0ccecf --- /dev/null +++ b/keyboards/handwired/magicforce68/README.md @@ -0,0 +1,20 @@ +Magicforce 68 Handwired +======================= + +This firmware is for a Magicforce 68 that's had its PCB removed and is handwired with an Arduino Micro. NOTE: The Arduino Micro is different than the Arduino *Pro* Micro. + +## Wiring Layout + +![Wiring Layout](wiring-layout.png) + +## Pinout + +The following pins are used: +- Columns 1-15: B2, B0, D3, D2, D1, D0, D4, C6, D7, E6, B4, B5, B6, B7, D6 +- Rows 1-5: F0, F1, F4, F5, F6 + +## Compiling and loading the firmware + +To build the firmware, run `make`. + +To flash the firemware onto the microcontroller, run `make avrdude`, and press the reset button. diff --git a/keyboards/handwired/magicforce68/config.h b/keyboards/handwired/magicforce68/config.h new file mode 100644 index 00000000..1e2b7d3e --- /dev/null +++ b/keyboards/handwired/magicforce68/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Hexwire +#define PRODUCT Magicforce 68 +#define DESCRIPTION Handwired Magicforce 68 + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { F0, F1, F4, F5, F6 } +#define MATRIX_COL_PINS { B2, B0, D3, D2, D1, D0, D4, C6, D7, E6, B4, B5, B6, B7, D6 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/magicforce68/keymaps/default/keymap.c b/keyboards/handwired/magicforce68/keymaps/default/keymap.c new file mode 100644 index 00000000..22553f71 --- /dev/null +++ b/keyboards/handwired/magicforce68/keymaps/default/keymap.c @@ -0,0 +1,67 @@ +#include "magicforce68.h" + +#define _QWERTY 0 +#define _FN1 1 +#define _FN2 2 +#define KC_ KC_TRNS +#define KC_X0 LT(_FN2, KC_GRV) +#define KC_X1 MO(_FN1) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = KEYMAP( + /*,----+----+----+----+----+----+----+----+----+----+----+----+----+--------. ,----+----. */ + ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL , BSPC , INS ,PGUP, + /*|----`----`----`----`----`----`----`----`----`----`----`----`----`--------| |----`----| */ + TAB , Q , W , E , R , T , Y , U , I , O , P ,LBRC,RBRC, BSLS , DEL ,PGDN, + /*|------`----`----`----`----`----`----`----`----`----`----`----`----`------| `----`----' */ + X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, ENTER , + /*|-------`----`----`----`----`----`----`----`----`----`----`----`----------| ,----. */ + LSFT , Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, RSFT , UP , + /*|---------`----`----`----`----`----`----`----`----`----`----`-------------.--|----|----. */ + LCTL ,LGUI ,LALT , SPACE , X1 ,RALT ,RCTL , LEFT,DOWN,RGHT + /*`-----+-----+-----+------------------------------+------+-----+-----' `----+----+----' */ + ), + + [_FN1] = KEYMAP( + /*,----+----+----+----+----+----+----+----+----+----+----+----+----+--------. ,----+----. */ + GRV , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,F12 , BSPC , VOLU,HOME, + /*|esc-`-1--`-2--`-3--`-4--`-5--`-6--`-7--`-8--`-9--`-0--`mnus`plus`--bksp--| |ins-`pgup| */ + , , , UP , , , , , , , , , , , VOLD,END, + /*|tab---`-q--`-w--`-e--`-r--`-t--`-y--`-u--`-i--`-o--`-p--`-{--`-}--`--|---| `del-`pgdn' */ + , ,LEFT,DOWN,RGHT, , , , , , , , , + /*|caps---`-a--`-s--`-d--`-f--`-g--`-h--`-j--`-k--`-l--`-;--`-'--`----enter-| ,----. */ + , , , , , , ,MUTE, , , , , MUTE, + /*|shift----`-z--`-x--`-c--`-v--`-b--`-n--`-m--`-,--`-.--`-/--`-------shift-.--|-up-|----. */ + , , , , , , , MPRV,MPLY,MNXT + /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ + ), + + [_FN2] = KEYMAP( + /*,----+----+----+----+----+----+----+----+----+----+----+----+----+--------. ,----+----. */ + GRV , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,F12 , BSPC , VOLU,HOME, + /*|esc-`-1--`-2--`-3--`-4--`-5--`-6--`-7--`-8--`-9--`-0--`mnus`plus`--bksp--| |ins-`pgup| */ + , , , UP , , , , 7 , 8 , 9 , , , , , VOLD,END, + /*|tab---`-q--`-w--`-e--`-r--`-t--`-y--`-u--`-i--`-o--`-p--`-{--`-}--`--|---| `del-`pgdn' */ + , ,LEFT,DOWN,RGHT, , , 4 , 5 , 6 , , , , + /*|caps---`-a--`-s--`-d--`-f--`-g--`-h--`-j--`-k--`-l--`-;--`-'--`----enter-| ,----. */ + , , , , , , 0 , 1 , 2 , 3 , , , MUTE, + /*|shift----`-z--`-x--`-c--`-v--`-b--`-n--`-m--`-,--`-.--`-/--`-------shift-.--|-up-|----. */ + , , , , , , , MPRV,MPLY,MNXT + /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ + ) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/handwired/magicforce68/magicforce68.c b/keyboards/handwired/magicforce68/magicforce68.c new file mode 100644 index 00000000..84b1007e --- /dev/null +++ b/keyboards/handwired/magicforce68/magicforce68.c @@ -0,0 +1,8 @@ +#include "magicforce68.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} diff --git a/keyboards/handwired/magicforce68/magicforce68.h b/keyboards/handwired/magicforce68/magicforce68.h new file mode 100644 index 00000000..cfcdce38 --- /dev/null +++ b/keyboards/handwired/magicforce68/magicforce68.h @@ -0,0 +1,20 @@ +#ifndef MAGICFORCE68_H +#define MAGICFORCE68_H + +#include "quantum.h" + +#define KEYMAP( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K2E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K3E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3C, K3D, \ + K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D, K4E \ + ) { \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_NO, KC_##K2E }, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_NO, KC_##K3C, KC_##K3D, KC_##K3E }, \ + { KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_##K45, KC_NO, KC_NO, KC_NO, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E } \ +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/magicforce68/rules.mk b/keyboards/handwired/magicforce68/rules.mk new file mode 100644 index 00000000..e897ef25 --- /dev/null +++ b/keyboards/handwired/magicforce68/rules.mk @@ -0,0 +1,83 @@ + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 + +ifndef QUANTUM_DIR + include ../../../Makefile +endif + +avrdude: build + ls /dev/tty* > /tmp/1; \ + echo "Reset your Pro Micro now"; \ + while [[ -z $$USB ]]; do \ + sleep 1; \ + ls /dev/tty* > /tmp/2; \ + USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \ + done; \ + avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex + +.PHONY: avrdude diff --git a/keyboards/handwired/magicforce68/wiring-layout.png b/keyboards/handwired/magicforce68/wiring-layout.png new file mode 100644 index 00000000..816b10b2 Binary files /dev/null and b/keyboards/handwired/magicforce68/wiring-layout.png differ diff --git a/keyboards/handwired/minorca/keymaps/rgb/config.h b/keyboards/handwired/minorca/keymaps/rgb/config.h index deaac2e2..43b3c591 100644 --- a/keyboards/handwired/minorca/keymaps/rgb/config.h +++ b/keyboards/handwired/minorca/keymaps/rgb/config.h @@ -11,7 +11,7 @@ /* ws2812 RGB LED */ #define RGB_DI_PIN D5 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 13 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/handwired/numpad20/Makefile b/keyboards/handwired/numpad20/Makefile new file mode 100644 index 00000000..191c6bb6 --- /dev/null +++ b/keyboards/handwired/numpad20/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/numpad20/config.h b/keyboards/handwired/numpad20/config.h new file mode 100644 index 00000000..847f2111 --- /dev/null +++ b/keyboards/handwired/numpad20/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xBB80 +#define PRODUCT_ID 0x0504 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Hexwire +#define PRODUCT Numpad 20 +#define DESCRIPTION Handwired 4x5 numpad + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 4 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { F6, B1, B3, B6, B5 } +#define MATRIX_COL_PINS { D1, D0, F5, F4 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/numpad20/keymaps/default/keymap.c b/keyboards/handwired/numpad20/keymaps/default/keymap.c new file mode 100644 index 00000000..37031206 --- /dev/null +++ b/keyboards/handwired/numpad20/keymaps/default/keymap.c @@ -0,0 +1,16 @@ +#include "numpad20.h" + +#define KC_ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = COMPACT_KEYMAP( + LEFT,RGHT, UP ,DOWN, \ + P7 , P8 , P9 ,PLUS, \ + P4 , P5 , P6 ,MINS, \ + P1 , P2 , P3 , ENT, \ + P0 ,DOT ,RGHT, TAB \ + ) +}; + +const uint16_t PROGMEM fn_actions[] = { +}; diff --git a/keyboards/handwired/numpad20/numpad20.c b/keyboards/handwired/numpad20/numpad20.c new file mode 100644 index 00000000..101cf2cb --- /dev/null +++ b/keyboards/handwired/numpad20/numpad20.c @@ -0,0 +1,8 @@ +#include "numpad20.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} diff --git a/keyboards/handwired/numpad20/numpad20.h b/keyboards/handwired/numpad20/numpad20.h new file mode 100644 index 00000000..191979be --- /dev/null +++ b/keyboards/handwired/numpad20/numpad20.h @@ -0,0 +1,20 @@ +#ifndef NUMPAD20_H +#define NUMPAD20_H + +#include "quantum.h" + +#define COMPACT_KEYMAP( \ + K00, K01, K02, K03, \ + K10, K11, K12, K13, \ + K20, K21, K22, K23, \ + K30, K31, K32, K33, \ + K40, K41, K42, K43 \ + ) { \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03 }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23 }, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33 }, \ + { KC_##K40, KC_##K41, KC_##K42, KC_##K43 } \ +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/numpad20/rules.mk b/keyboards/handwired/numpad20/rules.mk new file mode 100644 index 00000000..e897ef25 --- /dev/null +++ b/keyboards/handwired/numpad20/rules.mk @@ -0,0 +1,83 @@ + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 + +ifndef QUANTUM_DIR + include ../../../Makefile +endif + +avrdude: build + ls /dev/tty* > /tmp/1; \ + echo "Reset your Pro Micro now"; \ + while [[ -z $$USB ]]; do \ + sleep 1; \ + ls /dev/tty* > /tmp/2; \ + USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \ + done; \ + avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex + +.PHONY: avrdude diff --git a/keyboards/handwired/onekey/keymaps/default/keymap.c b/keyboards/handwired/onekey/keymaps/default/keymap.c index 756c4f51..10c48671 100644 --- a/keyboards/handwired/onekey/keymaps/default/keymap.c +++ b/keyboards/handwired/onekey/keymaps/default/keymap.c @@ -1,5 +1,5 @@ #include "onekey.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - { KC_A } + {{ KC_A }} }; diff --git a/keyboards/handwired/ortho5x13/Makefile b/keyboards/handwired/ortho5x13/Makefile new file mode 100644 index 00000000..191c6bb6 --- /dev/null +++ b/keyboards/handwired/ortho5x13/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/ortho5x13/config.h b/keyboards/handwired/ortho5x13/config.h new file mode 100644 index 00000000..f8515959 --- /dev/null +++ b/keyboards/handwired/ortho5x13/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xBB80 +#define PRODUCT_ID 0x050D +#define DEVICE_VER 0x0001 +#define MANUFACTURER Hexwire +#define PRODUCT Ortho 5x13 +#define DESCRIPTION Handwired 5x13 ortholinear keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 13 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { D3, D2, D1, D0, D4 } +#define MATRIX_COL_PINS { C6, D7, E6, B4, B5, B6, B2, B3, B1, F7, F6, F5, F4 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/ortho5x13/keymaps/default/keymap.c b/keyboards/handwired/ortho5x13/keymaps/default/keymap.c new file mode 100644 index 00000000..c1262a83 --- /dev/null +++ b/keyboards/handwired/ortho5x13/keymaps/default/keymap.c @@ -0,0 +1,289 @@ +#include "ortho5x13.h" +#include "action_layer.h" +#include "eeconfig.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + BACKLIT +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +#define KC_L1 LOWER +#define KC_L2 RAISE + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,------------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | + * |------+------+------+------+------+-------------+------+------+------+------+------+------| + * | ` | A | S | D | F | G | H | J | K | L | ; | ' | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | Up | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Hyper| Ctrl | Alt | GUI |Lower | Space |Raise | Bksp |Shift | Left | Down |Right | + * `------------------------------------------------------------------------------------------' + */ +[_QWERTY] = COMPACT_KEYMAP( + //,----+----+----+----+----+----+----+----+----+----+----+----+----. + ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL , + //|----+----+----+----+----+----+----+----+----+----+----+----+----| + TAB , Q , W , E , R , T , Y , U , I , O , P ,LBRC,RBRC, + //|----+----+----+----+----+----+----+----+----+----+----+----+----| + GRV , A , S , D , F , G , H , J , K , L ,SCLN,QUOT,BSLS, + //|----+----+----+----+----+----+----+----+----+----+----+----+----| + LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,ENT , UP , + //|----+----+----+----+----+---------+----+----+----+----+----+----| + HYPR,LCTL,LALT,LGUI, L1 , SPACE , L2 ,BSPC,RSFT,LEFT,RGHT,DOWN + //`----+----+----+----+----+---------+----+----+----+----+----+----' + ), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL}, + {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | " | , | . | P | Y | F | G | C | R | L | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL}, + {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = { + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, + {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, + {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Musoff|Mus on| | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = { + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, + {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +} + + +}; + +#ifdef AUDIO_ENABLE +float tone_startup[][2] = { + {NOTE_B5, 20}, + {NOTE_B6, 8}, + {NOTE_DS6, 20}, + {NOTE_B6, 8} +}; + +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); + +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +#endif + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +}; + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif +} + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/ortho5x13/ortho5x13.c b/keyboards/handwired/ortho5x13/ortho5x13.c new file mode 100644 index 00000000..cf8352cc --- /dev/null +++ b/keyboards/handwired/ortho5x13/ortho5x13.c @@ -0,0 +1,8 @@ +#include "ortho5x13.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} diff --git a/keyboards/handwired/ortho5x13/ortho5x13.h b/keyboards/handwired/ortho5x13/ortho5x13.h new file mode 100644 index 00000000..d442212f --- /dev/null +++ b/keyboards/handwired/ortho5x13/ortho5x13.h @@ -0,0 +1,36 @@ +#ifndef ORTHO5X13_H +#define ORTHO5X13_H + +#include "quantum.h" + +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \ + k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b, k4c \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c }, \ + { k30, k31, k32, k33, k34, k35, k35, k37, k38, k39, k3a, k3b, k3c }, \ + { k40, k41, k42, k43, k44, k45, KC_NO, k47, k48, k49, k4a, k4b, k4c } \ +} + +#define COMPACT_KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \ + k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b, k4c \ +) \ +{ \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b, KC_##k0c }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b, KC_##k1c }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b, KC_##k2c }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k35, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b, KC_##k3c }, \ + { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45, KC_NO, KC_##k47, KC_##k48, KC_##k49, KC_##k4a, KC_##k4b, KC_##k4c } \ +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/ortho5x13/rules.mk b/keyboards/handwired/ortho5x13/rules.mk new file mode 100644 index 00000000..e897ef25 --- /dev/null +++ b/keyboards/handwired/ortho5x13/rules.mk @@ -0,0 +1,83 @@ + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 + +ifndef QUANTUM_DIR + include ../../../Makefile +endif + +avrdude: build + ls /dev/tty* > /tmp/1; \ + echo "Reset your Pro Micro now"; \ + while [[ -z $$USB ]]; do \ + sleep 1; \ + ls /dev/tty* > /tmp/2; \ + USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \ + done; \ + avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex + +.PHONY: avrdude diff --git a/keyboards/handwired/pilcrow/Makefile b/keyboards/handwired/pilcrow/Makefile new file mode 100644 index 00000000..191c6bb6 --- /dev/null +++ b/keyboards/handwired/pilcrow/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/pilcrow/config.h b/keyboards/handwired/pilcrow/config.h new file mode 100644 index 00000000..d63eeba3 --- /dev/null +++ b/keyboards/handwired/pilcrow/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER You +#define PRODUCT pilcrow +#define DESCRIPTION A custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 10 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { B4, F7, B1, B3 } +#define MATRIX_COL_PINS { D4, C6, D7, E6, F5, F6, B6, B2, F4, B5} +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/pilcrow/keymaps/default/Makefile b/keyboards/handwired/pilcrow/keymaps/default/Makefile new file mode 100644 index 00000000..f4671a9d --- /dev/null +++ b/keyboards/handwired/pilcrow/keymaps/default/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/pilcrow/keymaps/default/config.h b/keyboards/handwired/pilcrow/keymaps/default/config.h new file mode 100644 index 00000000..df06a262 --- /dev/null +++ b/keyboards/handwired/pilcrow/keymaps/default/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif \ No newline at end of file diff --git a/keyboards/handwired/pilcrow/keymaps/default/keymap.c b/keyboards/handwired/pilcrow/keymaps/default/keymap.c new file mode 100644 index 00000000..e382e4c6 --- /dev/null +++ b/keyboards/handwired/pilcrow/keymaps/default/keymap.c @@ -0,0 +1,88 @@ +#include "pilcrow.h" +#define _______ KC_TRNS +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( \ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \ + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ + KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, MT(MOD_LSFT, KC_SPC), MO(2), MO(3), KC_DEL, KC_ESC \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[1] = KEYMAP( \ + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, \ + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_PIPE, S(KC_QUOT), \ + _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_GRV \ +), +[2] = KEYMAP( \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_TAB, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, \ + OSM(MOD_LSFT), KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_BSLS, KC_QUOT, \ + _______, _______, _______, _______, KC_ENT, KC_ENT, _______, KC_MNXT, KC_VOLD, KC_VOLU \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[3] = KEYMAP( \ + RESET, KC_UP, _______, _______, _______, _______, _______, KC_MS_WH_DOWN, KC_MS_U, KC_MS_WH_UP, \ + KC_LEFT, KC_DOWN, KC_RIGHT, AU_ON, AU_OFF, AG_NORM, AG_SWAP, KC_MS_L,KC_MS_D, KC_MS_R, \ + RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, \ + _______, _______, _______, _______, KC_MS_BTN1, KC_MS_BTN2, _______, _______, _______, _______ \ +) +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} \ No newline at end of file diff --git a/keyboards/handwired/pilcrow/keymaps/default/readme.md b/keyboards/handwired/pilcrow/keymaps/default/readme.md new file mode 100644 index 00000000..95472dfc --- /dev/null +++ b/keyboards/handwired/pilcrow/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for pilcrow \ No newline at end of file diff --git a/keyboards/handwired/pilcrow/pilcrow.c b/keyboards/handwired/pilcrow/pilcrow.c new file mode 100644 index 00000000..c8243df7 --- /dev/null +++ b/keyboards/handwired/pilcrow/pilcrow.c @@ -0,0 +1,28 @@ +#include "pilcrow.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/handwired/pilcrow/pilcrow.h b/keyboards/handwired/pilcrow/pilcrow.h new file mode 100644 index 00000000..7138ccb3 --- /dev/null +++ b/keyboards/handwired/pilcrow/pilcrow.h @@ -0,0 +1,23 @@ +#ifndef PILCROW_H +#define PILCROW_H + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. +// The following is an example using the Planck MIT layout +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39 \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09 }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19 }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29 }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39 } \ +} + +#endif diff --git a/keyboards/handwired/pilcrow/readme.md b/keyboards/handwired/pilcrow/readme.md new file mode 100644 index 00000000..7a7f6d2a --- /dev/null +++ b/keyboards/handwired/pilcrow/readme.md @@ -0,0 +1,28 @@ +pilcrow keyboard firmware +====================== + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme](/). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/pilcrow folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make default`. + +### Other Keymaps + +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. + +To build the firmware binary hex file with a keymap just do `make` with a keymap like this: + +``` +$ make [default|jack|] +``` + +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/handwired/pilcrow/rules.mk b/keyboards/handwired/pilcrow/rules.mk new file mode 100644 index 00000000..55898147 --- /dev/null +++ b/keyboards/handwired/pilcrow/rules.mk @@ -0,0 +1,67 @@ +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 diff --git a/keyboards/handwired/promethium/Makefile b/keyboards/handwired/promethium/Makefile new file mode 100644 index 00000000..191c6bb6 --- /dev/null +++ b/keyboards/handwired/promethium/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/promethium/config.h b/keyboards/handwired/promethium/config.h new file mode 100644 index 00000000..24f02993 --- /dev/null +++ b/keyboards/handwired/promethium/config.h @@ -0,0 +1,341 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +#define USB_VENDOR_ID_LENOVO 0x17ef +#define USB_DEVICE_ID_LENOVO_TPKBD 0x6009 +#define USB_DEVICE_ID_LENOVO_CUSBKBD 0x6047 +#define USB_DEVICE_ID_LENOVO_CBTKBD 0x6048 +#define USB_DEVICE_ID_LENOVO_TPPRODOCK 0x6067 + +/* USB Device descriptor parameter */ +#define VENDOR_ID USB_VENDOR_ID_LENOVO +#define PRODUCT_ID USB_DEVICE_ID_LENOVO_CBTKBD +#define DEVICE_VER 0x0001 +#define MANUFACTURER Priyadi +#define PRODUCT Promethium Keyboard +#define DESCRIPTION + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 6 + +/* default pin-out */ +#define MATRIX_COL_PINS { B6, B7, D6, C7, F6, F7 } +#define MATRIX_ROW_PINS { D7, C6, D0, D1, F5, F4, F1, F0 } +#define UNUSED_PINS + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +// #define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +// #define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT) | MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RCTRL)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +// #define NO_DEBUG + +/* disable print */ +// #define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#define PS2_INIT_DELAY 2000 +#define BATTERY_PIN 9 +#define BATTERY_POLL 30000 +#define MAX_VOLTAGE 4.2 +#define MIN_VOLTAGE 3.2 + +#define KEYMAP( \ + k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \ + k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \ + k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \ + k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c \ +) \ +{ \ + {k11, k12, k13, k14, k15, k16}, \ + {k21, k22, k23, k24, k25, k26}, \ + {k31, k32, k33, k34, k35, k36}, \ + {k41, k42, k43, k44, k45, k46}, \ + {k17, k18, k19, k1a, k1b, k1c}, \ + {k27, k28, k29, k2a, k2b, k2c}, \ + {k37, k38, k39, k3a, k3b, k3c}, \ + {k47, k48, k49, k4a, k4b, k4c} \ +} + +#ifndef __ASSEMBLER__ // assembler doesn't like enum in .h file +enum led_sequence { + LED_IND_BLUETOOTH, + LED_IND_USB, + LED_IND_BATTERY, + + LED_IND_FUN, + LED_IND_NUM, + LED_IND_EMOJI, + + LED_BKSP, + LED_ENT, + LED_RSFT, + LED_RCTL, + + LED_RGUI, + LED_SLSH, + LED_SCLN, + LED_P, + + LED_O, + LED_L, + LED_DOT, + LED_RALT, + + LED_EMOJI, + LED_COMM, + LED_K, + LED_I, + + LED_U, + LED_J, + LED_M, + LED_FUN, + + LED_RSPC, + LED_N, + LED_HH, + LED_Y, + + LED_TRACKPOINT3, + LED_TRACKPOINT2, + LED_TRACKPOINT1, + + LED_LSPC, + LED_B, + LED_G, + LED_T, + + LED_R, + LED_F, + LED_V, + LED_NUM, + + LED_PUNC, + LED_C, + LED_D, + LED_E, + + LED_W, + LED_S, + LED_X, + LED_LALT, + + LED_LGUI, + LED_Z, + LED_A, + LED_Q, + + LED_TAB, + LED_ESC, + LED_LSFT, + LED_LCTL, + + LED_TOTAL +}; + +#define RGB_DI_PIN B5 +#define RGBSPS_NUM LED_TOTAL +#endif + +/* PS/2 mouse */ +#ifdef PS2_USE_BUSYWAIT +# define PS2_CLOCK_PORT PORTD +# define PS2_CLOCK_PIN PIND +# define PS2_CLOCK_DDR DDRD +# define PS2_CLOCK_BIT 1 +# define PS2_DATA_PORT PORTD +# define PS2_DATA_PIN PIND +# define PS2_DATA_DDR DDRD +# define PS2_DATA_BIT 2 +#endif + +/* PS/2 mouse interrupt version */ +#ifdef PS2_USE_INT +/* uses INT1 for clock line(ATMega32U4) */ +#define PS2_CLOCK_PORT PORTD +#define PS2_CLOCK_PIN PIND +#define PS2_CLOCK_DDR DDRD +#define PS2_CLOCK_BIT 3 +#define PS2_DATA_PORT PORTD +#define PS2_DATA_PIN PIND +#define PS2_DATA_DDR DDRD +#define PS2_DATA_BIT 2 + +#define PS2_INT_INIT() do { \ + EICRA |= ((1< occupied precious real estate, and so they are moved down to punctuation layer. +* Right-shift on Enter position. +* Removed arrow keys, they are on another layer now. +* Put Ctrl-Alt-Super and Super-AltGr-Ctrl in left & right corners. +* Lower & Raise is now called Num and Fun. +* OS & Left keys become another thumb modifier: Empty & Greek (Empty because I used this for another use and my muscle memory is not adapted to it yet) + +On Promethium, Trackpoint is enabled on PD2 and PD3. We impersonate a Thinkpad keyboard to be able to use Thinkpad driver on Windows (still needs verification). + +AltGr & Compose dual use key. Tap for Compose (mapped to Scroll Lock in hardware) and press for AltGr. + +Supported layouts: QWERTY, DVORAK, Colemak, Workman, Norman. Switchable from SYS layer. In DVORAK, semicolon is replaced by /? key. + +Num activates NUM layer: hexkeypad on the right side and most punctuation on the left side. Hexkeypad is optimized for C-style hex, IPv6, HTML RGB triplets, etc. + +Fun activates FUN layer: arrow cluster on right home row, F-numbers on left side. + +Pressing Num+Fun activates PUNC layer: same punctuations as NUM layer on the left side, parens on the right side. + +Greek activates either GREEKU or GREEKL layer, depending whether shift is pressed or not. Shift state changes are also taken into account when the layer is active. + +Greek+Empty activates EMOJI layer. The whole keyboard now outputs emojis! + +Pressing both spacebars (spacekeys, actually) activates GUI layer. QWERTYUIOP switches to a virtual desktop. J & L switches virtual desktop to the left or right. S & F behaves like Alt-Tab and Alt-Shift-Tab. This works by sending Alt press when entering the layer, and Alt release when other than S or F keys are pressed. + +Pressing both Ctrls activates SYS layer for configuring the keyboard. + +On Promethium, USB or Bluetooth output is detected on startup. If USB is connected, then USB is used initially. SYS-U and SYS-B switch output to USB or Bluetooth at runtime. Current active output is indicated with LEDs. + +SYS-W, SYS-L, SYS-M switch Unicode input method. SYS-Q, SYS-D, SYS-C, SYS-K, SYS-N switch to QWERTY, DVORAK, Colemak, Workman and Norman, respectively. + +On Planck, SYS-A (mnemonic: audio) toggles faux clicky: use buzzer to emit clicks on key presses and releases. + +On Promethium there are 6 indicator LEDs, and under switch LEDs on each switches, including Trackpoint buttons. Totaling 57 LEDs. Output is limited to 0xF for each LEDs to conserve power. SYS-G (mnemonic: glow) toggles various backlighting modes. + +On Promethium, there's a LED to indicate battery level. Hue indicates level: green is full, red is empty. \ No newline at end of file diff --git a/keyboards/handwired/promethium/keymaps/priyadi/config.h b/keyboards/handwired/promethium/keymaps/priyadi/config.h new file mode 100644 index 00000000..3f5dd581 --- /dev/null +++ b/keyboards/handwired/promethium/keymaps/priyadi/config.h @@ -0,0 +1,28 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#define PRIYADI_PROMETHIUM + +/* bootmagic salt key */ +#define BOOTMAGIC_KEY_SALT KC_ESC + +/* skip bootmagic and eeconfig */ +#define BOOTMAGIC_KEY_SKIP KC_SPACE + +#define PREVENT_STUCK_MODIFIERS + +#define RGBSPS_ENABLE + +#define UNICODE_TYPE_DELAY 0 + +#define LAYOUT_DVORAK +#define LAYOUT_COLEMAK +#define LAYOUT_NORMAN +#define LAYOUT_WORKMAN + +#define DOUBLESPACE_LAYER_ENABLE +// #define TOLELOT_ENABLE + +#endif diff --git a/keyboards/handwired/promethium/keymaps/priyadi/flash.sh b/keyboards/handwired/promethium/keymaps/priyadi/flash.sh new file mode 100755 index 00000000..14a3b437 --- /dev/null +++ b/keyboards/handwired/promethium/keymaps/priyadi/flash.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +sleep 10 +avrdude -p m32u4 -P /dev/ttyACM0 -c avr109 -U flash:w:../../../../../.build/handwired_promethium_priyadi.hex diff --git a/keyboards/handwired/promethium/keymaps/priyadi/keymap.c b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c new file mode 100644 index 00000000..cf7c6733 --- /dev/null +++ b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c @@ -0,0 +1,1211 @@ +/* +Copyright 2017 Priyadi Iman Nurcahyo + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#if defined(PRIYADI_PROMETHIUM) + #include "promethium.h" +#elif defined(PRIYADI_PLANCK) + #include "planck.h" +#else + #error "no keyboard defined" +#endif + +#include "action_layer.h" +#ifdef AUDIO_ENABLE + #include "audio.h" + #include "musical_notes.h" +#endif +#include "eeconfig.h" +#include "process_unicode.h" +#include "quantum.h" +#ifdef RGBSPS_ENABLE +#include "rgbsps.h" +#endif +#ifdef PS2_MOUSE_ENABLE +#include "ps2_mouse.h" +#include "ps2.h" +#endif +#ifdef FAUXCLICKY_ENABLE +#include "fauxclicky.h" +#endif +#include "outputselect.h" +#include "led.h" +#define COUNT(x) (sizeof (x) / sizeof (*(x))) + +// Fillers to make layering clearer +#define _______ KC_TRNS +#define XXXXXXX KC_NO +#define G(x) LGUI(x) +#define KC_WWWB KC_WWW_BACK +#define KC_WWWF KC_WWW_FORWARD + +// hybrid right-alt & scroll lock (mapped to Compose in OS) +#define C_RALT MT(MOD_RALT, KC_SLCK) + +// dual use right-shift & del key +// #define C_RSFT MT(MOD_RSFT, KC_DEL) + +bool capslock = false; +#ifdef DOUBLESPACE_LAYER_ENABLE +bool lspace_active = false; +bool rspace_active = false; +bool lspace_emitted = false; +bool rspace_emitted = false; +bool space_layer_entered = false; +#endif + +// glow +enum glow_modes { + GLOW_NONE, + GLOW_MIN, + GLOW_FULL +}; +uint8_t glow_mode = GLOW_MIN; + +void turn_off_capslock(void); +extern keymap_config_t keymap_config; + +// layers, ordering is important! +enum layers { + _QWERTY, + _DVORAK, + _COLEMAK, + _WORKMAN, + _NORMAN, + _DEFAULT_LAYER_MAX = _NORMAN, + + _GREEKU, + _GREEKL, + + _NUM, + _FUN, + _PUNC, + + _EMPTY, + _EMOJI, + _GUI, + _SYS +}; + +// double-space layer +#define _SPACE _GUI + +enum planck_keycodes { + // layouts + QWERTY = SAFE_RANGE, + DVORAK, + COLEMAK, + WORKMAN, + NORMAN, + + // layer switchers + EMOJI, + GUI, + GREEK, + + // os switchers + LINUX, + WIN, + OSX, + + // others + LSPACE, + RSPACE, + GLOW, + + // stub +#ifndef FAUXCLICKY_ENABLE + FC_TOG, +#endif +#ifndef ADAFRUIT_BLE_ENABLE + OUT_BLE, +#endif + KEYCODE_END +}; + +#define EMPTY MO(_EMPTY) +#define NUM MO(_NUM) +#define FUN MO(_FUN) +#define FUN0 LT(_FUN, KC_0) + +// unicode map + +enum unicode_name { + GRIN, // grinning face 😊 + TJOY, // tears of joy 😂 + SMILE, // grining face with smiling eyes 😠+ HEART, // heart ⤠+ EYERT, // smiling face with heart shaped eyes 😠+ CRY, // crying face 😭 + SMEYE, // smiling face with smiling eyes 😊 + UNAMU, // unamused 😒 + KISS, // kiss 😘 + HART2, // two hearts 💕 + WEARY, // weary 😩 + OKHND, // ok hand sign 👌 + PENSV, // pensive 😔 + SMIRK, // smirk 😠+ RECYC, // recycle ♻ + WINK, // wink 😉 + THMUP, // thumb up 👠+ THMDN, // thumb down 👎 + PRAY, // pray 🙠+ PHEW, // relieved 😌 + MUSIC, // musical notes + FLUSH, // flushed 😳 + CELEB, // celebration 🙌 + CRY2, // crying face 😢 + COOL, // smile with sunglasses 😎 + NOEVS, // see no evil + NOEVH, // hear no evil + NOEVK, // speak no evil + POO, // pile of poo + EYES, // eyes + VIC, // victory hand + BHART, // broken heart + SLEEP, // sleeping face + SMIL2, // smiling face with open mouth & sweat + HUNRD, // 100 + CONFU, // confused + TONGU, // face with tongue & winking eye + DISAP, // disappointed + YUMMY, // face savoring delicious food + CLAP, // hand clapping + FEAR, // face screaming in fear + HORNS, // smiling face with horns + HALO, // smiling face with halo + BYE, // waving hand + SUN, // sun + MOON, // moon + SKULL, // skull + + // greek letters + UALPH, + UBETA, + UGAMM, + UDELT, + UEPSI, + UZETA, + UETA, + UTHET, + UIOTA, + UKAPP, + ULAMB, + UMU, + UNU, + UXI, + UOMIC, + UPI, + URHO, + USIGM, + UTAU, + UUPSI, + UPHI, + UCHI, + UPSI, + UOMEG, + + LALPH, + LBETA, + LGAMM, + LDELT, + LEPSI, + LZETA, + LETA, + LTHET, + LIOTA, + LKAPP, + LLAMB, + LMU, + LNU, + LXI, + LOMIC, + LPI, + LRHO, + LSIGM, + LTAU, + LUPSI, + LPHI, + LCHI, + LPSI, + LOMEG, + + FSIGM, + + LTEQ, + GTEQ, + NOTEQ, + PLMIN, +}; + +const uint32_t PROGMEM unicode_map[] = { + [GRIN] = 0x1F600, + [TJOY] = 0x1F602, + [SMILE] = 0x1F601, + [HEART] = 0x2764, + [EYERT] = 0x1f60d, + [CRY] = 0x1f62d, + [SMEYE] = 0x1F60A, + [UNAMU] = 0x1F612, + [KISS] = 0x1F618, + [HART2] = 0x1F495, + [WEARY] = 0x1F629, + [OKHND] = 0x1F44C, + [PENSV] = 0x1F614, + [SMIRK] = 0x1F60F, + [RECYC] = 0x267B, + [WINK] = 0x1F609, + [THMUP] = 0x1F44D, + [THMDN] = 0x1F44E, + [PRAY] = 0x1F64F, + [PHEW] = 0x1F60C, + [MUSIC] = 0x1F3B6, + [FLUSH] = 0x1F633, + [CELEB] = 0x1F64C, + [CRY2] = 0x1F622, + [COOL] = 0x1F60E, + [NOEVS] = 0x1F648, + [NOEVH] = 0x1F649, + [NOEVK] = 0x1F64A, + [POO] = 0x1F4A9, + [EYES] = 0x1F440, + [VIC] = 0x270C, + [BHART] = 0x1F494, + [SLEEP] = 0x1F634, + [SMIL2] = 0x1F605, + [HUNRD] = 0x1F4AF, + [CONFU] = 0x1F615, + [TONGU] = 0x1F61C, + [DISAP] = 0x1F61E, + [YUMMY] = 0x1F60B, + [CLAP] = 0x1F44F, + [FEAR] = 0x1F631, + [HORNS] = 0x1F608, + [HALO] = 0x1F607, + [BYE] = 0x1F44B, + [SUN] = 0x2600, + [MOON] = 0x1F314, + [SKULL] = 0x1F480, + + // greek letters + [UALPH] = 0x0391, + [UBETA] = 0x0392, + [UGAMM] = 0x0393, + [UDELT] = 0x0394, + [UEPSI] = 0x0395, + [UZETA] = 0x0396, + [UETA] = 0x0397, + [UTHET] = 0x0398, + [UIOTA] = 0x0399, + [UKAPP] = 0x039A, + [ULAMB] = 0x039B, + [UMU] = 0x039C, + [UNU] = 0x039D, + [UXI] = 0x039E, + [UOMIC] = 0x039F, + [UPI] = 0x03A0, + [URHO] = 0x03A1, + [USIGM] = 0x03A3, + [UTAU] = 0x03A4, + [UUPSI] = 0x03A5, + [UPHI] = 0x03A6, + [UCHI] = 0x03A7, + [UPSI] = 0x03A8, + [UOMEG] = 0x03A9, + [LALPH] = 0x03B1, + [LBETA] = 0x03B2, + [LGAMM] = 0x03B3, + [LDELT] = 0x03B4, + [LEPSI] = 0x03B5, + [LZETA] = 0x03B6, + [LETA] = 0x03B7, + [LTHET] = 0x03B8, + [LIOTA] = 0x03B9, + [LKAPP] = 0x03BA, + [LLAMB] = 0x03BB, + [LMU] = 0x03BC, + [LNU] = 0x03BD, + [LXI] = 0x03BE, + [LOMIC] = 0x03BF, + [LPI] = 0x03C0, + [LRHO] = 0x03C1, + [LSIGM] = 0x03C3, + [LTAU] = 0x03C4, + [LUPSI] = 0x03C5, + [LPHI] = 0x03C6, + [LCHI] = 0x03C7, + [LPSI] = 0x03C8, + [LOMEG] = 0x03C9, + [FSIGM] = 0x03C2, + + // other + [LTEQ] = 0x2264, // less than or equal + [GTEQ] = 0x2265, // greater than or equal + [NOTEQ] = 0x2260, // not equal + [PLMIN] = 0xB1, // plus minus +}; + +// RGBSPS + +#ifdef RGBSPS_ENABLE +const uint8_t PROGMEM LED_ALNUM[] = { + LED_Z, + LED_A, + LED_Q, + LED_W, + LED_S, + LED_X, + LED_C, + LED_D, + LED_E, + LED_R, + LED_F, + LED_V, + LED_B, + LED_G, + LED_T, + LED_N, + LED_HH, + LED_Y, + LED_U, + LED_J, + LED_M, + LED_COMM, + LED_K, + LED_I, + LED_O, + LED_L, + LED_DOT, + LED_SLSH, + LED_SCLN, + LED_P, + LED_LSPC, + LED_RSPC +}; + +const uint8_t PROGMEM LED_HOMING[] = { + LED_A, + LED_S, + LED_D, + LED_F, + LED_J, + LED_K, + LED_L, + LED_SCLN +}; + +const uint8_t PROGMEM LED_MODS[] = { + LED_TAB, + LED_ESC, + LED_LSFT, + LED_LCTL, + LED_LGUI, + LED_LALT, + LED_RALT, + LED_RGUI, + LED_BKSP, + LED_ENT, + LED_RSFT, + LED_RCTL +}; + +const uint8_t PROGMEM LED_FN[] = { + LED_PUNC, + LED_NUM, + LED_FUN, + LED_EMOJI +}; + +const uint8_t PROGMEM LED_INDICATORS[] = { + LED_IND_EMOJI, + LED_IND_NUM, + LED_IND_FUN, + LED_IND_BATTERY, + LED_IND_USB, + LED_IND_BLUETOOTH, +}; + +const uint8_t PROGMEM LED_TRACKPOINT[] = { + LED_TRACKPOINT1, + LED_TRACKPOINT2, + LED_TRACKPOINT3, +}; + +void led_turnoff_keys(void) { + for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) { + rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 0, 0, 0); + } + for(uint8_t i = 0; i < COUNT(LED_MODS); i++) { + rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 0, 0); + } + for(uint8_t i = 0; i < COUNT(LED_FN); i++) { + rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 0); + } +} + +void led_reset(void) { + switch (glow_mode) { + case GLOW_NONE: + led_turnoff_keys(); + break; + case GLOW_MIN: + led_turnoff_keys(); + for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) { + rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 8, 8, 8); + } + rgbsps_set(LED_F, 15, 0, 0); + rgbsps_set(LED_J, 15, 0, 0); + break; + case GLOW_FULL: + for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) { + rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 8, 8, 8); + } + for(uint8_t i = 0; i < COUNT(LED_MODS); i++) { + rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 15, 0); + } + for(uint8_t i = 0; i < COUNT(LED_FN); i++) { + rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 15); + } + for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) { + rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 15, 0, 0); + } + rgbsps_set(LED_F, 15, 15, 0); + rgbsps_set(LED_J, 15, 15, 0); + break; + } +} + +void led_set_layer_indicator(void) { + static uint8_t oldlayer = 255; + + rgbsps_set(LED_IND_FUN, 0, 0, 0); + // rgbsps_set(LED_IND_NUM, 0, 0, 0); + rgbsps_set(LED_IND_EMOJI, 0, 0, 0); + + led_reset(); + + uint8_t layer = biton32(layer_state); + if (oldlayer == layer) { + return; + } + + oldlayer = layer; + + if (layer <= _DEFAULT_LAYER_MAX) { + rgbsps_send(); + return; + } + + switch(layer) { + case _FUN: + rgbsps_set(LED_IND_FUN, 15, 0, 0); + break; + // case _NUM: + // rgbsps_set(LED_IND_NUM, 0, 0, 15); + // break; + case _EMOJI: + rgbsps_set(LED_IND_EMOJI, 15, 15, 0); + break; + default: + rgbsps_set(LED_IND_FUN, 3, 3, 3); + // rgbsps_set(LED_IND_NUM, 3, 3, 3); + rgbsps_set(LED_IND_EMOJI, 3, 3, 3); + } + + rgbsps_send(); +} + +void led_set_output_ble(void) { + rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 15); + rgbsps_set(LED_IND_USB, 0, 0, 0); + rgbsps_send(); +} + +void led_set_output_usb(void) { + rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0); + rgbsps_set(LED_IND_USB, 15, 15, 15); + rgbsps_send(); +} + +void led_set_output_none(void) { + rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0); + rgbsps_set(LED_IND_USB, 0, 0, 0); + rgbsps_send(); +} + +void led_init(void) { + // turn off all + rgbsps_turnoff(); + + // set trackpoint color + rgbsps_set(LED_TRACKPOINT1, 15, 0, 0); + rgbsps_set(LED_TRACKPOINT2, 0, 0, 15); + rgbsps_set(LED_TRACKPOINT3, 15, 0, 0); +} +#endif // RGBSPS_ENABLE + +// keymaps + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ' |Enter | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Alt | GUI | Punc | Num | Space | Fun |Greek | GUI |AltGr | Ctrl | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = KEYMAP( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT , + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LALT, KC_LGUI, EMPTY, NUM, LSPACE, RSPACE, FUN, GREEK, KC_RGUI, C_RALT, KC_RCTL +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S |Enter | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl | + * `-----------------------------------------------------------------------------------' + */ +#ifdef LAYOUT_DVORAK +[_DVORAK] = KEYMAP( + _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______, + _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______, + _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), +#endif + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O |Enter | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl | + * `-----------------------------------------------------------------------------------' + */ + +#ifdef LAYOUT_COLEMAK +[_COLEMAK] = KEYMAP( + _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______, + _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______, + _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), +#endif + +/* Norman + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl | + * `-----------------------------------------------------------------------------------' + */ + +#ifdef LAYOUT_NORMAN +[_NORMAN] = KEYMAP( + _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______, + _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______, + _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), +#endif + +/* Workman + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl | + * `-----------------------------------------------------------------------------------' + */ + +#ifdef LAYOUT_WORKMAN +[_WORKMAN] = KEYMAP( + _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______, + _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______, + _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), +#endif + +/* Punc + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ≤ | ≥ | ` | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | * | \ | - | = | / | ≠ | ( | ) | < | > | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | & | ^ | | | _ | + | ? | ± | [ | ] | { | } | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | : | | + * `-----------------------------------------------------------------------------------' + */ +[_PUNC] = KEYMAP( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______, + KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______, + KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______ +), + +/* Num + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ` | * | \ | - | = | / | B | 4 | 5 | 6 | E | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | x | | | | | 0 | , | . | : | | + * `-----------------------------------------------------------------------------------' + */ +[_NUM] = KEYMAP( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_7, KC_8, KC_9, S(KC_D), _______, + KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______, + KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_1, KC_2, KC_3, S(KC_F), _______, + _______, _______, KC_X, _______, _______, _______, _______, FUN0 , KC_COMM, KC_DOT, KC_COLN, _______ +), + +/* Func + * ,-----------------------------------------------------------------------------------. + * | | F1 | F2 | F3 | F4 | Ins | | PgUp | Up | PgDn | PgUp | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Caps | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F9 | F10 | F11 | F12 |Pause | | | Home | End | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_FUN] = KEYMAP( + XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_INS, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL, + KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, + _______, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Uppercase Greek + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_GREEKU] = KEYMAP( + _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______, + _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______, + _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Lowercase Greek + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_GREEKL] = KEYMAP( + _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______, + _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______, + _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Empty + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_EMPTY] = KEYMAP( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Emoji + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_EMOJI] = KEYMAP( + X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW), + X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS), + X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH), + X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK) +), + +/* GUI + * ,-----------------------------------------------------------------------------------. + * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | | Btab | Esc | Tab | | | Prev | | Next | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | Prev | Play | Next | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_GUI] = KEYMAP( + XXXXXXX, G(KC_1), G(KC_2), G(KC_3), G(KC_4), G(KC_5), G(KC_6), G(KC_7), G(KC_8), G(KC_9), G(KC_0), XXXXXXX, + KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX +), + +/* Sys + * ,-----------------------------------------------------------------------------------. + * | |Qwerty| Win | |Reset | | | USB | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | |Colmak| | BLE |Norman|MacOS | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_SYS] = KEYMAP( + XXXXXXX, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______ +), + + +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +#ifdef DOUBLESPACE_LAYER_ENABLE +void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) { + if (pressed) { + *isactive = true; + if (*otheractive) { + layer_on(_SPACE); + register_code(KC_LALT); // sends alt and enter layer + space_layer_entered = true; + } + } else { + *isactive = false; + if (space_layer_entered) { + unregister_code(KC_LALT); // release alt and exit layer + layer_off(_SPACE); + if (!*otheractive) { + space_layer_entered = false; + } + } else { + if (!*isemitted) { + register_code(KC_SPC); + unregister_code(KC_SPC); + } + *isemitted = false; + } + } +} +#endif + +uint32_t layer_state_set_kb(uint32_t state) +{ + // turn on punc layer if both fun & num are on + if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) { + state |= (1UL<<_PUNC); + } else { + state &= ~(1UL<<_PUNC); + } + + // turn on emoji layer if empty and greek layer are on + if ( + (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU)) + || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL)) + ) { + state |= (1UL<<_EMOJI); + } else { + state &= ~(1UL<<_EMOJI); + } + return state; +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static bool lshift = false; + static bool rshift = false; + static uint8_t layer = 0; + + lshift = keyboard_report->mods & MOD_BIT(KC_LSFT); + rshift = keyboard_report->mods & MOD_BIT(KC_RSFT); + layer = biton32(layer_state); + +#ifdef DOUBLESPACE_LAYER_ENABLE + // double-space: send space immediately if any other key depressed before space is released + if ((lspace_active ^ rspace_active) + && keycode != LSPACE + && keycode != RSPACE + && record->event.pressed) + { + if (lspace_active) { + if (!lspace_emitted) { + register_code(KC_SPC); + unregister_code(KC_SPC); + } + lspace_emitted = true; + } + if (rspace_active) { + if (!rspace_emitted) { + register_code(KC_SPC); + unregister_code(KC_SPC); + } + rspace_emitted = true; + } + } + + if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) { + if (record->event.pressed) { + unregister_code(KC_LALT); + } else { + register_code(KC_LALT); + } + } +#endif + + switch (keycode) { + +#ifdef DOUBLESPACE_LAYER_ENABLE + // double-space enter space layer + case LSPACE: + process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted); + return false; + break; + case RSPACE: + process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted); + return false; + break; +#endif + + // handle greek layer shift + case KC_LSFT: + case KC_RSFT: + ; + if (layer == _GREEKU || layer == _GREEKL) { + if (record->event.pressed) { + layer_on(_GREEKU); + layer_off(_GREEKL); + } else { + if (lshift ^ rshift) { // if only one shift was pressed + layer_on(_GREEKL); + layer_off(_GREEKU); + } + } + } + return true; + break; + + // press both ctrls to activate SYS layer + case KC_LCTL: + case KC_RCTL: + ; + bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL); + bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL); + if (record->event.pressed) { + if (lctrl ^ rctrl) { // if only one ctrl was pressed + layer_on(_SYS); + } + } else { + layer_off(_SYS); + } + return true; + break; + + // QWERTZ style comma and dot: semicolon and colon when shifted + case KC_COMM: + if (record->event.pressed) { + if (lshift || rshift) { + if (lshift) unregister_code(KC_LSFT); + if (rshift) unregister_code(KC_RSFT); + register_code(KC_SCLN); + unregister_code(KC_SCLN); + if (lshift) register_code(KC_LSFT); + if (rshift) register_code(KC_RSFT); + } else { + register_code(KC_COMM); + unregister_code(KC_COMM); + } + } + return false; + break; + case KC_DOT: + if (record->event.pressed) { + if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) { + register_code(KC_SCLN); + unregister_code(KC_SCLN); + } else { + register_code(KC_DOT); + unregister_code(KC_DOT); + } + } + return false; + break; + + // layout switchers + case QWERTY: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; +#ifdef LAYOUT_DVORAK + case DVORAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; +#endif +#ifdef LAYOUT_COLEMAK + case COLEMAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; +#endif +#ifdef LAYOUT_WORKMAN + case WORKMAN: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_WORKMAN); + } + return false; + break; +#endif +#ifdef LAYOUT_NORMAN + case NORMAN: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_NORMAN); + } + return false; + break; +#endif + + // only process Fnumber on key release, and only when layer switcher is still pressed. + // this is to avoid accidental presses on potentially destructive keys + case KC_F1 ... KC_F12: + case KC_PAUS: + case KC_PSCR: + case KC_INS: + if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer + register_code(keycode); + unregister_code(keycode); + } + return false; + break; + + // layer switcher + // + case GREEK: + if (record->event.pressed) { + if (lshift || rshift) { + layer_on(_GREEKU); + layer_off(_GREEKL); + } else { + layer_on(_GREEKL); + layer_off(_GREEKU); + } + } else { + layer_off(_GREEKU); + layer_off(_GREEKL); + } + return false; + break; + + // OS switchers + case LINUX: + set_unicode_input_mode(UC_LNX); + return false; + break; + case WIN: + set_unicode_input_mode(UC_WINC); + return false; + break; + case OSX: + set_unicode_input_mode(UC_OSX); + return false; + break; + + // glow mode changer +#ifdef RGBSPS_ENABLE + case GLOW: + if (record->event.pressed) { + glow_mode++; + if (glow_mode > GLOW_FULL) { + glow_mode = GLOW_NONE; + } + led_reset(); + rgbsps_send(); + } + return false; + break; +#endif + + // faux clicky indicator +#ifdef FAUXCLICKY_ENABLE + case FC_TOG: + return true; + break; +#endif + } + return true; +} + +void set_output_user(uint8_t output) { +#ifdef ADAFRUIT_BLE_ENABLE + switch(output) { + case OUTPUT_USB: + led_set_output_usb(); + break; + case OUTPUT_ADAFRUIT_BLE: + led_set_output_ble(); + break; + default: + led_set_output_none(); + } +#endif +} + +void matrix_init_user() { + _delay_ms(500); // give time for usb to initialize + + set_unicode_input_mode(UC_LNX); + +#ifdef RGBSPS_ENABLE + led_init(); +#endif + + // auto detect output on init +#ifdef ADAFRUIT_BLE_ENABLE + uint8_t output = auto_detect_output(); + if (output == OUTPUT_USB) { + set_output(OUTPUT_USB); + } else { + set_output(OUTPUT_ADAFRUIT_BLE); + } +#endif +} + +void turn_off_capslock() { + if (capslock) { + register_code(KC_CAPS); + unregister_code(KC_CAPS); + } +} + +#ifdef RGBSPS_ENABLE + void matrix_scan_user(void) { + led_set_layer_indicator(); + } + + void battery_poll(uint8_t level) { + rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15); + rgbsps_send(); + } + + void led_set_user(uint8_t usb_led) { + bool new_capslock = usb_led & (1<sort lines), and use this format: + + * **folder_name** description + +# List of Promethium keymaps + + diff --git a/keyboards/handwired/promethium/promethium.c b/keyboards/handwired/promethium/promethium.c new file mode 100644 index 00000000..4943f8c9 --- /dev/null +++ b/keyboards/handwired/promethium/promethium.c @@ -0,0 +1,42 @@ +#include "promethium.h" +#include "analog.h" +#include "timer.h" +#include "matrix.h" + +// cubic fit {3.3, 0}, {3.5, 2.9}, {3.6, 5}, {3.7, 8.6}, {3.8, 36}, {3.9, 62}, {4.0, 73}, {4.05, 83}, {4.1, 89}, {4.15, 94}, {4.2, 100} + +uint8_t battery_level(void) { + float voltage = analogRead(BATTERY_PIN) * 2 * 3.3 / 1024; + if (voltage < MIN_VOLTAGE) return 0; + if (voltage > MAX_VOLTAGE) return 255; + return (voltage - MIN_VOLTAGE) / (MAX_VOLTAGE - MIN_VOLTAGE) * 255; +} + +__attribute__ ((weak)) +void battery_poll(uint8_t level) { +} + +void matrix_init_kb(void) { + matrix_init_user(); +} + +void matrix_scan_kb(void) { + static uint16_t counter = BATTERY_POLL; + counter++; + + if (counter > BATTERY_POLL) { + counter = 0; + battery_poll(battery_level()); + } + + matrix_scan_user(); +} + +void led_set_kb(uint8_t usb_led) { + led_set_user(usb_led); +} + +__attribute__ ((weak)) +void led_set_user(uint8_t usb_led) { +} + diff --git a/keyboards/handwired/promethium/promethium.h b/keyboards/handwired/promethium/promethium.h new file mode 100644 index 00000000..260f140c --- /dev/null +++ b/keyboards/handwired/promethium/promethium.h @@ -0,0 +1,10 @@ +#ifndef PROMETHIUM_H +#define PROMETHIUM_H + +#include "stdint.h" + +void battery_poll(uint8_t level); +void led_set_kb(uint8_t usb_led); +void led_set_user(uint8_t usb_led); + +#endif diff --git a/keyboards/handwired/promethium/readme.md b/keyboards/handwired/promethium/readme.md new file mode 100644 index 00000000..e63d2f1a --- /dev/null +++ b/keyboards/handwired/promethium/readme.md @@ -0,0 +1,13 @@ +Promethium Keyboard Firmware +============================ +A handwired Planck based keyboard using the Adafruit Feather 32u4 Bluefruit LE controller. + +Features: + +* Single piece split form factor +* Columnar stagger +* Trackpoint +* Bluetooth LE *TBD* +* Battery +* Per switch RGB LED +* Proximity sensor for energy conservation *TBD* \ No newline at end of file diff --git a/keyboards/handwired/promethium/rgbsps.c b/keyboards/handwired/promethium/rgbsps.c new file mode 100644 index 00000000..f30badd3 --- /dev/null +++ b/keyboards/handwired/promethium/rgbsps.c @@ -0,0 +1,73 @@ +#include "light_ws2812.h" +#include "rgbsps.h" + +struct cRGB led[RGBSPS_NUM]; + +void rgbsps_set(uint8_t index, uint8_t r, uint8_t g, uint8_t b) { + led[index].r = r; + led[index].g = g; + led[index].b = b; +} + +void rgbsps_setall(uint8_t r, uint8_t g, uint8_t b) { + for (uint16_t i = 0; i < RGBSPS_NUM; i++) { + rgbsps_set(i, r, g, b); + } +} + +void rgbsps_turnoff(void) { + rgbsps_setall(0, 0, 0); +} + +void rgbsps_send(void) { + ws2812_setleds(led, RGBSPS_NUM); +} + +void rgbsps_sethsv(uint8_t index, uint16_t hue, uint8_t sat, uint8_t val) { + uint8_t r = 0, g = 0, b = 0, base, color; + + if (sat == 0) { // Acromatic color (gray). Hue doesn't mind. + r = val; + g = val; + b = val; + } else { + base = ((255 - sat) * val) >> 8; + color = (val - base) * (hue % 60) / 60; + + switch (hue / 60) { + case 0: + r = val; + g = base + color; + b = base; + break; + case 1: + r = val - color; + g = val; + b = base; + break; + case 2: + r = base; + g = val; + b = base + color; + break; + case 3: + r = base; + g = val - color; + b = val; + break; + case 4: + r = base + color; + g = base; + b = val; + break; + case 5: + r = val; + g = base; + b = val - color; + break; + } + } + + rgbsps_set(index, r, g, b); +} + diff --git a/keyboards/handwired/promethium/rgbsps.h b/keyboards/handwired/promethium/rgbsps.h new file mode 100644 index 00000000..72612a7a --- /dev/null +++ b/keyboards/handwired/promethium/rgbsps.h @@ -0,0 +1,5 @@ +void rgbsps_set(uint8_t index, uint8_t r, uint8_t g, uint8_t b); +void rgbsps_setall(uint8_t r, uint8_t g, uint8_t b); +void rgbsps_turnoff(void); +void rgbsps_send(void); +void rgbsps_sethsv(uint8_t index, uint16_t hue, uint8_t sat, uint8_t val); \ No newline at end of file diff --git a/keyboards/handwired/promethium/rules.mk b/keyboards/handwired/promethium/rules.mk new file mode 100644 index 00000000..e75cf4dd --- /dev/null +++ b/keyboards/handwired/promethium/rules.mk @@ -0,0 +1,76 @@ +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 8000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= no # Console for debug(+400) +COMMAND_ENABLE ?= no # Commands for debug and configuration +NKRO_ENABLE ?= yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality +MIDI_ENABLE ?= no # MIDI controls +AUDIO_ENABLE ?= no # Audio output on port C6 +UNICODE_ENABLE ?= no # Unicode +UNICODEMAP_ENABLE ?= yes +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +PS2_MOUSE_ENABLE ?= yes +PS2_USE_INT ?= yes +ADAFRUIT_BLE_ENABLE ?= yes +API_SYSEX_ENABLE ?= no + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend + +SRC += $(QUANTUM_DIR)/light_ws2812.c +SRC += rgbsps.c +SRC += $(QUANTUM_DIR)/analog.c \ No newline at end of file diff --git a/keyboards/handwired/reddot/Makefile b/keyboards/handwired/reddot/Makefile new file mode 100755 index 00000000..191c6bb6 --- /dev/null +++ b/keyboards/handwired/reddot/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/reddot/config.h b/keyboards/handwired/reddot/config.h new file mode 100755 index 00000000..15f11429 --- /dev/null +++ b/keyboards/handwired/reddot/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER upils +#define PRODUCT reddot +#define DESCRIPTION A custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 19 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { B0, B1, B2, B3, E6 } +#define MATRIX_COL_PINS { B7, D0, D1, D2, D3, C6, C7, D5, D4, D7, B4, B5, B6, F7, F6, F5, F4, F1, F0 } +#define UNUSED_PINS + + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +//#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/reddot/keymaps/default/keymap.c b/keyboards/handwired/reddot/keymaps/default/keymap.c new file mode 100755 index 00000000..44ee2ce5 --- /dev/null +++ b/keyboards/handwired/reddot/keymaps/default/keymap.c @@ -0,0 +1,29 @@ +#include "reddot.h" +#include "../../../../../quantum/keymap_extras/keymap_french.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[0] = KEYMAP( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_FN0, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS,\ + KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_INSERT, KC_HOME, KC_PGUP,\ + KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_DELETE, KC_END, KC_PGDOWN, KC_KP_PLUS,\ + KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_KP_1, KC_UP, KC_KP_3,\ + FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, NO_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER), + + [1] = KEYMAP( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_FN0, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS,\ + KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_7, KC_8, KC_9,\ + KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_4, KC_5, KC_6, KC_KP_PLUS,\ + KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_1, KC_2, KC_3,\ + FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, NO_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER), +}; + + +const uint16_t PROGMEM fn_actions[] = { + ACTION_LAYER_TOGGLE(1), +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + return MACRO_NONE; +}; + diff --git a/keyboards/handwired/reddot/keymaps/default/readme.md b/keyboards/handwired/reddot/keymaps/default/readme.md new file mode 100755 index 00000000..f04833c3 --- /dev/null +++ b/keyboards/handwired/reddot/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for handwired/reddot diff --git a/keyboards/handwired/reddot/readme.md b/keyboards/handwired/reddot/readme.md new file mode 100755 index 00000000..11bcba54 --- /dev/null +++ b/keyboards/handwired/reddot/readme.md @@ -0,0 +1,24 @@ +## RedDot Specific Info ## + + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent README.md](/README.md). + +## Building + +Download or clone the whole firmware and navigate to the keyboard/reddot folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default +To build with the default keymap, simply run `make`. + +### Other Keymaps +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` and see keymap document (you can find in top README.md) and existent keymap files. + +To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like: +``` +$ make KEYMAP=[default|jack|] +``` +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/handwired/reddot/reddot.c b/keyboards/handwired/reddot/reddot.c new file mode 100755 index 00000000..4e1efc06 --- /dev/null +++ b/keyboards/handwired/reddot/reddot.c @@ -0,0 +1,7 @@ +#include "reddot.h" + +void matrix_init_kb(void) { + + matrix_init_user(); +} + diff --git a/keyboards/handwired/reddot/reddot.h b/keyboards/handwired/reddot/reddot.h new file mode 100755 index 00000000..f0c4be55 --- /dev/null +++ b/keyboards/handwired/reddot/reddot.h @@ -0,0 +1,20 @@ +#ifndef REDDOT_H +#define REDDOT_H + +#include "quantum.h" + +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k10, k11, k12, k13, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k30, k31, k32, \ + k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k50, k51, k52, k53, \ + k60, k61, k62, k63, k64, k65, k66, k68, k69, k6A, k6B, k6C, k6D, k6E, k70, k71, k72, \ + k80, k81, k82, k83, k84, k85, k86, k88, k89, k8A, k8B, k8C, k8D, k8E, k90, k91, k92, k93\ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k10, k11, k12, k13 }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k30, k31, k32, KC_NO }, \ + { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k50, k51, k52, k53 }, \ + { k60, k61, k62, k63, k64, k65, k66, KC_NO, k68, k69, k6A, k6B, k6C, k6D, k6E, k70, k71, k72, KC_NO }, \ + { k80, k81, k82, k83, k84, k85, k86, KC_NO, k88, k89, k8A, k8B, k8C, k8D, k8E, k90, k91, k92, k93 } \ +} + +#endif diff --git a/keyboards/handwired/reddot/rules.mk b/keyboards/handwired/reddot/rules.mk new file mode 100755 index 00000000..9a4409fe --- /dev/null +++ b/keyboards/handwired/reddot/rules.mk @@ -0,0 +1,88 @@ + +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# for avr upload +USB ?= /dev/cu.usbmodem1421 +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + + +ifdef TEENSY2 + OPT_DEFS += -DATREUS_TEENSY2 + ATREUS_UPLOAD_COMMAND = teensy_loader_cli -w -mmcu=$(MCU) $(TARGET).hex +else + OPT_DEFS += -DATREUS_ASTAR + OPT_DEFS += -DCATERINA_BOOTLOADER + ATREUS_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \ + avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB) +endif +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# MCU name + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= no # Console for debug(+400) +COMMAND_ENABLE ?= no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 + +ifndef QUANTUM_DIR + include ../../../Makefile +endif + +upload: build + $(ATREUS_UPLOAD_COMMAND) + diff --git a/keyboards/hhkb/keymaps/sh_jp/Makefile b/keyboards/hhkb/keymaps/sh_jp/Makefile new file mode 100644 index 00000000..a7f700f0 --- /dev/null +++ b/keyboards/hhkb/keymaps/sh_jp/Makefile @@ -0,0 +1 @@ +OPT_DEFS += -DHHKB_JP diff --git a/keyboards/hhkb/keymaps/sh_jp/README.md b/keyboards/hhkb/keymaps/sh_jp/README.md new file mode 100644 index 00000000..4f82f2f4 --- /dev/null +++ b/keyboards/hhkb/keymaps/sh_jp/README.md @@ -0,0 +1,86 @@ +###Keymaps with both Dvorak layout and QWER layout for HHKB JP. + +1. The default layout is Dvorak. +2. Use `Tog` to toggle between Dvorak and QWER +3. Holding `NewCmd`, the original `LftCmd`, will activate the `NewCmd` layer which means `NewCmd+key` is the same as `Cmd+key` in normal QWER layout.[1](#cmdTab) + - For example, no matter you are in Dvorak layout or QWER layout, you can use `Cmd+s` to save a currently editing file. +4. `Symb` makes type symbols easier + - for example: `Symb+a` is `!`. +5. `Spc+key` equals to `Shft+key` while using `Spc` alone will yield a space as usual. +6. There's an extra `Tab` in the last line. + +``` +Layer DVOR: +,-----------------------------------------------------------. +|Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| |Bsp| +|-----------------------------------------------------------| +|Tab | '| ,| .| P| Y| F| G| C| R| L| /| =| | +|------------------------------------------------------` Ent| +|Ctrl | A| O| E| U| I| D| H| T| N| S| -| \| | +|-----------------------------------------------------------| +|Shft | ;| Q| J| K| X| B| M| W| V| Z| | Up| | +|-----------------------------------------------------------| +|FN| `| Alt|NewCmd|Symb| Spc |Symb|Tab|RCmd|Tog|Lft|Dwn|Rgh| +`-----------------------------------------------------------' +``` + +``` +Layer QWER: +,-----------------------------------------------------------. +|Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| -| =| |Bsp| +|-----------------------------------------------------------| +|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | +|------------------------------------------------------` Ent| +|Ctrl | A| S| D| F| G| H| J| K| L| ;| '| \| | +|-----------------------------------------------------------| +|Shft | Z| X| C| V| B| N| M| ,| .| /| | Up| | +|-----------------------------------------------------------| +|FN| `| Alt|NewCmd|Symb| Spc |Symb|Tab|Cmd|Tog|Lft|Dwn|Rgh| +`-----------------------------------------------------------' +``` + +``` +Layer Symb: +,-----------------------------------------------------------. +| | | | | | | | | | | | | | | | +|-----------------------------------------------------------| +| | | | [| ]| | | {| }| | | | | | +|------------------------------------------------------` | +| | !| @| #| $| %| ^| &| *| (| )| '| \| | +|-----------------------------------------------------------| +| | | | | | | | | | | | | | | +|-----------------------------------------------------------| +| | | | | | | | | | | | | | +`-----------------------------------------------------------' +``` + +``` +Layer FUNC: HHKB mode (HHKB Fn) +,-----------------------------------------------------------. +|Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| +|-----------------------------------------------------------| +|Caps | | | | | | | |Psc|Slk|Pus|Up | | | +|------------------------------------------------------` | +| |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig| | | +|-----------------------------------------------------------| +| | | | | | | +| -|End|PgD|Dow| | | | +|-----------------------------------------------------------| +| || | | | | | | | | || | | | +`-----------------------------------------------------------' +``` + +``` +Empty Layer: +,-----------------------------------------------------------. +| | | | | | | | | | | | | | | | +|-----------------------------------------------------------| +| | | | | | | | | | | | | | | +|------------------------------------------------------` | +| | | | | | | | | | | | | | | +|-----------------------------------------------------------| +| | | | | | | | | | | | | | | +|-----------------------------------------------------------| +| | | | | | | | | | | | | | +`-----------------------------------------------------------' +``` +1: `NewCmd + Tab` does not work, you can use `RCmd+Tab` to switch among applications. diff --git a/keyboards/hhkb/keymaps/sh_jp/keymap.c b/keyboards/hhkb/keymaps/sh_jp/keymap.c new file mode 100644 index 00000000..d4cb3b04 --- /dev/null +++ b/keyboards/hhkb/keymaps/sh_jp/keymap.c @@ -0,0 +1,60 @@ +#include "hhkb.h" + +#define _______ KC_TRNS + +enum { + DVOR, + QWER, + NEW_CMD, + SYMB, + FUNC +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [DVOR] = KEYMAP_JP( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_JYEN, KC_BSPC, + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, + KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_BSLS, KC_ENT, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RO, KC_UP, KC_RSFT, + MO(FUNC), KC_ZKHK, KC_LALT, MO(NEW_CMD), MO(SYMB), MT(MOD_LSFT, KC_SPC), MO(SYMB), KC_TAB, KC_RGUI, TG(QWER), KC_LEFT, KC_DOWN, KC_RGHT + ), + [QWER] = KEYMAP_JP( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_JYEN, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_UP, KC_RSFT, + MO(FUNC), KC_ZKHK, KC_LALT, MO(NEW_CMD), MO(SYMB), MT(MOD_LSFT, KC_SPC), MO(SYMB), KC_TAB, KC_RGUI, _______, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [NEW_CMD] = KEYMAP_JP( + _______, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), LGUI(KC_6), LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), LGUI(KC_0), _______, _______, _______, LGUI(KC_BSPC), + _______, LGUI(KC_Q), LGUI(KC_W), LGUI(KC_E), LGUI(KC_R), LGUI(KC_T), LGUI(KC_Y), LGUI(KC_U), LGUI(KC_I), LGUI(KC_O), LGUI(KC_P), LGUI(KC_LBRC), LGUI(KC_RBRC), + _______, LGUI(KC_A), LGUI(KC_S), LGUI(KC_D), LGUI(KC_F), LGUI(KC_G), LGUI(KC_H), LGUI(KC_J), LGUI(KC_K), LGUI(KC_L), _______, _______, _______, _______, + LGUI(KC_LSFT), LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), LGUI(KC_B), LGUI(KC_N), LGUI(KC_M), LGUI(KC_COMM), LGUI(KC_DOT), LGUI(KC_SLSH), _______, _______, _______, + _______, _______, _______, _______, _______, LGUI(KC_SPC), _______, _______, _______, _______, LGUI(KC_LEFT), LGUI(KC_DOWN), LGUI(KC_RGHT) + ), + + [SYMB] = KEYMAP_JP( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, KC_LBRC, KC_RBRC, _______, _______, LSFT(KC_LBRC), LSFT(KC_RBRC), _______, _______,_______, _______, + _______, LSFT(KC_1),LSFT(KC_2),LSFT(KC_3),LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_0), _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + + [FUNC] = KEYMAP_JP( + KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PWR, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______, KC_PENT, + _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, _______, + _______, _______, _______, _______, _______, _______ , _______, _______, _______, _______, _______, _______, _______ + ) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t macro_id, uint8_t opt) { + return MACRO_NONE; +} + +const uint16_t PROGMEM fn_actions[] = { + +}; diff --git a/keyboards/hhkb/readme.md b/keyboards/hhkb/readme.md index 367c0a08..ee7d1112 100644 --- a/keyboards/hhkb/readme.md +++ b/keyboards/hhkb/readme.md @@ -82,7 +82,7 @@ We've added shortcuts to make common modifier/tap (mod-tap) mappings more compac ### Remember: These are just aliases -These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk ACTION_* functions, please see the [TMK documentation](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keymap.md#2-action). +These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk ACTION_* functions, please see the [TMK documentation](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/doc/keymap.md#2-action). Instead of using `FNx` when defining `ACTION_*` functions, you can use `F(x)` - the benefit here is being able to use more than 32 function actions (up to 4096), if you happen to need them. diff --git a/keyboards/infinity60/chconf.h b/keyboards/infinity60/chconf.h index 43c84573..d9114ec8 100644 --- a/keyboards/infinity60/chconf.h +++ b/keyboards/infinity60/chconf.h @@ -48,7 +48,7 @@ * @details Frequency of the system timer that drives the system ticks. This * setting also defines the system tick time unit. */ -#define CH_CFG_ST_FREQUENCY 1000 +#define CH_CFG_ST_FREQUENCY 100000 /** * @brief Time delta constant for the tick-less mode. diff --git a/keyboards/infinity60/infinity60.c b/keyboards/infinity60/infinity60.c index e471250f..fdeed512 100644 --- a/keyboards/infinity60/infinity60.c +++ b/keyboards/infinity60/infinity60.c @@ -15,3 +15,18 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "infinity60.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + diff --git a/keyboards/infinity60/keymaps/default/keymap.c b/keyboards/infinity60/keymaps/default/keymap.c index 44341285..8347c94b 100644 --- a/keyboards/infinity60/keymaps/default/keymap.c +++ b/keyboards/infinity60/keymaps/default/keymap.c @@ -46,3 +46,12 @@ const uint16_t fn_actions[] = { }; +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + +}; diff --git a/keyboards/infinity60/keymaps/depariel/keymap.c b/keyboards/infinity60/keymaps/depariel/keymap.c index 7412b9b9..57f9487f 100755 --- a/keyboards/infinity60/keymaps/depariel/keymap.c +++ b/keyboards/infinity60/keymaps/depariel/keymap.c @@ -80,3 +80,12 @@ const uint16_t PROGMEM fn_actions[] = { }; +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + +}; diff --git a/keyboards/infinity60/keymaps/hasu/keymap.c b/keyboards/infinity60/keymaps/hasu/keymap.c index d3728869..9982078c 100644 --- a/keyboards/infinity60/keymaps/hasu/keymap.c +++ b/keyboards/infinity60/keymaps/hasu/keymap.c @@ -111,3 +111,13 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t fn_actions[] = { }; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + +}; diff --git a/keyboards/infinity60/matrix.c b/keyboards/infinity60/matrix.c index 62c165aa..b6ccf86c 100644 --- a/keyboards/infinity60/matrix.c +++ b/keyboards/infinity60/matrix.c @@ -62,6 +62,8 @@ void matrix_init(void) #endif memset(matrix, 0, MATRIX_ROWS); memset(matrix_debouncing, 0, MATRIX_ROWS); + + matrix_init_quantum(); } uint8_t matrix_scan(void) @@ -96,7 +98,12 @@ uint8_t matrix_scan(void) } #endif - wait_us(1); // need wait to settle pin state + // need wait to settle pin state + // if you wait too short, or have a too high update rate + // the keyboard might freeze, or there might not be enough + // processing power to update the LCD screen properly. + // 20us, or two ticks at 100000Hz seems to be OK + wait_us(20); // read col data data = (palReadPort(GPIOD)>>1); @@ -141,6 +148,7 @@ uint8_t matrix_scan(void) } debouncing = false; } + matrix_scan_quantum(); return 1; } diff --git a/keyboards/jd40/config.h b/keyboards/jd40/config.h index e2594f4b..047be570 100644 --- a/keyboards/jd40/config.h +++ b/keyboards/jd40/config.h @@ -70,7 +70,7 @@ along with this program. If not, see . ) #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 12 // Number of LEDs #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 diff --git a/keyboards/kc60/kc60.c b/keyboards/kc60/kc60.c index 746ac634..09b924b2 100644 --- a/keyboards/kc60/kc60.c +++ b/keyboards/kc60/kc60.c @@ -1 +1,16 @@ #include "kc60.h" + +void led_set_kb(uint8_t usb_led) +{ + if (usb_led & (1< + uint8_t leds = 0xF0; + if (usb_led & 1 << USB_LED_NUM_LOCK) + leds &= ~0x10; + if (usb_led & 1 << USB_LED_CAPS_LOCK) + leds &= ~0x80; + if (usb_led & 1 << USB_LED_SCROLL_LOCK) + leds &= ~0x20; + PORTD = (PORTD & 0x0F) | leds; + + led_set_user(usb_led); + +} + + diff --git a/keyboards/kinesis/alvicstep/alvicstep.h b/keyboards/kinesis/alvicstep/alvicstep.h new file mode 100644 index 00000000..f91a5231 --- /dev/null +++ b/keyboards/kinesis/alvicstep/alvicstep.h @@ -0,0 +1,67 @@ +#ifndef KINESIS_ALVICSTEP_H +#define KINESIS_ALVICSTEP_H + +#include "../kinesis.h" + + +#define KEYMAP( \ + k02,k22,k12,k01,k21,k11,k00,k20,k10, \ + k80,k70,k60,k50,k40,k30, \ + k81,k71,k61,k51,k41,k31, \ + k82,k72,k62,k52,k42,k32, \ + k83,k73,k63,k53,k43,k33, \ + k74,k64,k54,k34, \ + k36,k35, \ + k55, \ + k56,k46,k75, \ + k03,k23,k13,k04,k24,k14,k05,k85,k84, \ + k94,kA4,kB4,kD4,kE4,kF4, \ + k95,kA5,kB5,kD5,kE5,kF5, \ + k96,kA6,kB6,kD6,kE6,kF6, \ + k97,kA7,kB7,kD7,kE7,kF7, \ + k93,kB3,kD3,kE3, \ + k47,k66, \ + k67, \ + k87,k76,k86 \ +) { \ + { k00, k01, k02, k03, k04, k05, KC_NO, KC_NO }, \ + { k10, k11, k12, k13, k14, KC_NO, KC_NO, KC_NO }, \ + { k20, k21, k22, k23, k24, KC_NO, KC_NO, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, KC_NO }, \ + { k40, k41, k42, k43, KC_NO, KC_NO, k46, k47 }, \ + { k50, k51, k52, k53, k54, k55, k56, KC_NO }, \ + { k60, k61, k62, k63, k64, KC_NO, k66, k67 }, \ + { k70, k71, k72, k73, k74, k75, k76, KC_NO }, \ + { k80, k81, k82, k83, k84, k85, k86, k87}, \ + { KC_NO, KC_NO ,KC_NO ,k93, k94, k95, k96, k97}, \ + { KC_NO, KC_NO ,KC_NO ,KC_NO, kA4, kA5, kA6, kA7}, \ + { KC_NO, KC_NO ,KC_NO ,kB3, kB4, kB5, kB6, kB7}, \ + { KC_NO, KC_NO ,KC_NO ,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, \ + { KC_NO, KC_NO ,KC_NO ,kD3, kD4, kD5, kD6, kD7}, \ + { KC_NO, KC_NO ,KC_NO ,kE3, kE4, kE5, kE6, kE7}, \ + { KC_NO, KC_NO ,KC_NO ,KC_NO, kF4, kF5, kF6, kF7} \ +} + + +/* Row pin configuration +PF0 A +PF1 B +PF2 C +PF3 G 0 = U4, 1 = U5 + + + r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 rA rB rC rD rE rF +PB0 c0| f6 f8 f7 5 4 3 2 1 =+ +PB1 c1| f3 f5 f4 t r e w q TAB +PB2 c2| ESC f2 f1 g f d s a CL +PB3 c3| f9 f11 f10 b v c x z LS UP DN [{ ]} +PB4 c4| f12 SL PS RT LT §± `~ 6 7 8 9 0 -_ +PB5 c5| PB PGM KPD y u i o p \ +PB6 c6| LC DL BS RC EN SP h j k l ;: '" +PB7 c7| RA PU PD n m ,< .> /? RS + */ + + + + +#endif diff --git a/keyboards/kinesis/alvicstep/config.h b/keyboards/kinesis/alvicstep/config.h new file mode 100644 index 00000000..88b7e264 --- /dev/null +++ b/keyboards/kinesis/alvicstep/config.h @@ -0,0 +1,35 @@ +#ifndef ALVICSTEP_CONFIG_H +#define ALVICSTEP_CONFIG_H + +#include "../config.h" + +/* USB Device descriptor parameter */ +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 + +/* key matrix size */ +#define MATRIX_ROWS 16 +#define MATRIX_COLS 8 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +//Passed through the port multipler, so 4 pins =16 +#define MATRIX_ROW_PINS { F0,F1, F2, F3 } + +// May be upside down. +#define MATRIX_COL_PINS { B0,B1, B2, B3, B4, B5, B6, B7 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + + +#endif diff --git a/keyboards/kinesis/docs/kicad/kinesis-cache.lib b/keyboards/kinesis/alvicstep/docs/kicad/kinesis-cache.lib similarity index 100% rename from keyboards/kinesis/docs/kicad/kinesis-cache.lib rename to keyboards/kinesis/alvicstep/docs/kicad/kinesis-cache.lib diff --git a/keyboards/kinesis/docs/kicad/kinesis.pro b/keyboards/kinesis/alvicstep/docs/kicad/kinesis.pro similarity index 100% rename from keyboards/kinesis/docs/kicad/kinesis.pro rename to keyboards/kinesis/alvicstep/docs/kicad/kinesis.pro diff --git a/keyboards/kinesis/docs/kicad/kinesis.sch b/keyboards/kinesis/alvicstep/docs/kicad/kinesis.sch similarity index 100% rename from keyboards/kinesis/docs/kicad/kinesis.sch rename to keyboards/kinesis/alvicstep/docs/kicad/kinesis.sch diff --git a/keyboards/kinesis/docs/photos/P1050573.jpg b/keyboards/kinesis/alvicstep/docs/photos/P1050573.jpg similarity index 100% rename from keyboards/kinesis/docs/photos/P1050573.jpg rename to keyboards/kinesis/alvicstep/docs/photos/P1050573.jpg diff --git a/keyboards/kinesis/docs/photos/P1050574.jpg b/keyboards/kinesis/alvicstep/docs/photos/P1050574.jpg similarity index 100% rename from keyboards/kinesis/docs/photos/P1050574.jpg rename to keyboards/kinesis/alvicstep/docs/photos/P1050574.jpg diff --git a/keyboards/kinesis/docs/photos/P1050575.jpg b/keyboards/kinesis/alvicstep/docs/photos/P1050575.jpg similarity index 100% rename from keyboards/kinesis/docs/photos/P1050575.jpg rename to keyboards/kinesis/alvicstep/docs/photos/P1050575.jpg diff --git a/keyboards/kinesis/docs/readme.txt b/keyboards/kinesis/alvicstep/docs/readme.txt similarity index 100% rename from keyboards/kinesis/docs/readme.txt rename to keyboards/kinesis/alvicstep/docs/readme.txt diff --git a/keyboards/kinesis/docs/schematic.png b/keyboards/kinesis/alvicstep/docs/schematic.png similarity index 100% rename from keyboards/kinesis/docs/schematic.png rename to keyboards/kinesis/alvicstep/docs/schematic.png diff --git a/keyboards/kinesis/matrix.c b/keyboards/kinesis/alvicstep/matrix.c similarity index 100% rename from keyboards/kinesis/matrix.c rename to keyboards/kinesis/alvicstep/matrix.c diff --git a/keyboards/kinesis/alvicstep/readme.md b/keyboards/kinesis/alvicstep/readme.md new file mode 100644 index 00000000..974e42e5 --- /dev/null +++ b/keyboards/kinesis/alvicstep/readme.md @@ -0,0 +1,46 @@ +kinesis-advantage keyboard firmware +====================== + +This directory is called alvicstep because https://github.com/alvicstep did the heavy work and took the photos in the doc directory. +alvicstep did NOT do anything related to the QMK implementation, so don't bug him/her. + +There are other ways of replacing the CPU in the kinesis, this one uses jumper wires from the Teensy to the original DIP socket + + +## Kinesis specific information +This is a port of https://github.com/alvicstep/tmk_keyboard, +which is a fork of https://github.com/wjanssens/tmk_keyboard, +which is based on work from https://github.com/chrisandreae/keyboard-firmware + +If you replace the kinesis CPU as described in the doc folder, then this code should allow you to use QMK. +I've tested with a Teensy 2++, remember to change the CPU if you use a 32u4 instead. + +Not yet implemented: +- Kinesis EEProm reading or writing +- Audio - this should be simple if we remove hardcoded pins from audio.h and switch to E7 + + + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme.md](/doc/readme.md). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/kinesis-advantage folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make`. + +### Other Keymaps + +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. + +To build the firmware binary hex file with a keymap just do `make` with `keymap` option like: + +$ make keymap=[default|jack|] + +Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` diff --git a/keyboards/kinesis/alvicstep/rules.mk b/keyboards/kinesis/alvicstep/rules.mk new file mode 100644 index 00000000..fb421a34 --- /dev/null +++ b/keyboards/kinesis/alvicstep/rules.mk @@ -0,0 +1,10 @@ +ifndef QUANTUM_DIR + include ../../../Makefile +endif + +# just silently stop, since we need to upload with teensy uploader +upload: build + + + + diff --git a/keyboards/kinesis/config.h b/keyboards/kinesis/config.h index 8f1fdbdb..7cb0532c 100644 --- a/keyboards/kinesis/config.h +++ b/keyboards/kinesis/config.h @@ -22,58 +22,22 @@ along with this program. If not, see . /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6060 -#define DEVICE_VER 0x0001 #define MANUFACTURER You #define PRODUCT kinesis-advantage #define DESCRIPTION A custom keyboard // Mouse -#define MOUSEKEY_DELAY 20 +#define MOUSEKEY_DELAY 60 #define MOUSEKEY_INTERVAL 20 #define MOUSEKEY_MAX_SPEED 4 -#define MOUSEKEY_TIME_TO_MAX 20 +#define MOUSEKEY_TIME_TO_MAX 10 #define MOUSEKEY_WHEEL_MAX_SPEED 1 #define MOUSEKEY_WHEEL_DELTA 1 #define MOUSEKEY_WHEEL_TIME_TO_MAX 1 -/* key matrix size */ -#define MATRIX_ROWS 16 -#define MATRIX_COLS 8 - -/* - * Keyboard Matrix Assignments - * - * Change this to how you wired your keyboard - * COLS: AVR pins used for columns, left to right - * ROWS: AVR pins used for rows, top to bottom - * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) - * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) - * -*/ -//Passed through the port multipler, so 4 pins =16 -#define MATRIX_ROW_PINS { F0,F1, F2, F3 } - -// May be upside down. -#define MATRIX_COL_PINS { B0,B1, B2, B3, B4, B5, B6, B7 } -#define UNUSED_PINS - -/* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW - -// #define BACKLIGHT_PIN B7 -// #define BACKLIGHT_BREATHING -// #define BACKLIGHT_LEVELS 3 - - /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCING_DELAY 5 -/* define if matrix has ghost (lacks anti-ghosting diodes) */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ - /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ @@ -171,4 +135,13 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION + + +#ifdef SUBPROJECT_alvicstep + #include "alvicstep/config.h" +#endif +#ifdef SUBPROJECT_stapelberg + #include "stapelberg/config.h" +#endif + #endif diff --git a/keyboards/kinesis/keymaps/default/keymap.c b/keyboards/kinesis/keymaps/default/keymap.c index 3bf80699..01a66b5e 100644 --- a/keyboards/kinesis/keymaps/default/keymap.c +++ b/keyboards/kinesis/keymaps/default/keymap.c @@ -1,10 +1,6 @@ #include "kinesis.h" -#include "action_layer.h" -#define QWERTY 0 // Base qerty -#define SYMB 1// Symbol layer - -// An almost entirely blank keymap. Test layers with the upper right hand key - 1 in normal mode, reset in layer 2. +#define QWERTY 0 // Base qwerty /**************************************************************************************************** @@ -33,7 +29,6 @@ * `--------------------' `--------------------' */ - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [QWERTY] = KEYMAP( KC_ESC, KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8, @@ -45,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LALT, KC_HOME, KC_BSPC,KC_DEL ,KC_END , - KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_PSCR ,KC_SLCK ,KC_PAUS, KC_FN0, KC_1, + KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_PSCR ,KC_SLCK ,KC_PAUS, KC_FN0, KC_1, KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS, KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS, KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN,KC_QUOT, @@ -54,32 +49,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_RGUI,KC_RCTL, KC_PGUP, KC_PGDN,KC_ENTER ,KC_SPC - ), -[SYMB] = KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_FN0, RESET, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS ) }; -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_TAP_TOGGLE(SYMB) , // FN1 - Momentary Layer 1 (Symbols) +const uint16_t PROGMEM fn_actions[] = { }; diff --git a/keyboards/kinesis/keymaps/dvorak/Makefile b/keyboards/kinesis/keymaps/dvorak/Makefile new file mode 100644 index 00000000..9d3df596 --- /dev/null +++ b/keyboards/kinesis/keymaps/dvorak/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/kinesis/keymaps/dvorak/config.h b/keyboards/kinesis/keymaps/dvorak/config.h new file mode 100644 index 00000000..8893d122 --- /dev/null +++ b/keyboards/kinesis/keymaps/dvorak/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif diff --git a/keyboards/kinesis/keymaps/dvorak/keymap.c b/keyboards/kinesis/keymaps/dvorak/keymap.c new file mode 100644 index 00000000..9008bc80 --- /dev/null +++ b/keyboards/kinesis/keymaps/dvorak/keymap.c @@ -0,0 +1,93 @@ +#include "kinesis.h" + +#define _DVORAK 0 // Base Dvorak layer +#define _MEDIA 1 // Media layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_DVORAK] = KEYMAP( + // left hand + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, + KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, + KC_ESC, KC_LBRC, KC_DOWN, KC_UP, + // left thumb + KC_LGUI, KC_LCTL, + KC_LALT, + KC_BSPC, KC_DEL, TG(_MEDIA), + // right hand + KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_FN0, KC_1, + KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, + KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, + KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, + KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, + KC_LEFT, KC_RIGHT, KC_RBRC, KC_BSLS, + // right thumb + KC_RCTL, KC_RGUI, + KC_RALT, + TG(_MEDIA), KC_ENT, KC_SPC + ), + +[_MEDIA] = KEYMAP( + // left hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_BTN4, KC_BTN3, KC_BTN2, KC_BTN1, KC_NO, + KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, + KC_NO, KC_NO, KC_MS_D, KC_MS_U, + // left thumb + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_TRNS, + // right hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_POWER, + KC_NO, KC_VOLU, KC_MS_U, KC_VOLD, KC_NO, KC_NO, + KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_NO, + KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, KC_NO, + KC_MS_L, KC_MS_R, KC_NO, KC_NO, + // right thumb + KC_NO, KC_NO, + KC_NO, + KC_TRNS, KC_ENT, KC_NO +) +}; + + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/kinesis/keymaps/milestogo/Makefile b/keyboards/kinesis/keymaps/milestogo/Makefile new file mode 100644 index 00000000..9d3df596 --- /dev/null +++ b/keyboards/kinesis/keymaps/milestogo/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/kinesis/keymaps/milestogo/config.h b/keyboards/kinesis/keymaps/milestogo/config.h new file mode 100644 index 00000000..8893d122 --- /dev/null +++ b/keyboards/kinesis/keymaps/milestogo/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif diff --git a/keyboards/kinesis/keymaps/milestogo/keymap.c b/keyboards/kinesis/keymaps/milestogo/keymap.c new file mode 100644 index 00000000..bf1f9c59 --- /dev/null +++ b/keyboards/kinesis/keymaps/milestogo/keymap.c @@ -0,0 +1,384 @@ +#include "kinesis.h" +#include "action_layer.h" +#include "mousekey.h" + +#define _QWERTY 0 // Base qerty +#define _SYMB 1// Symbol layer +#define _MOUSE 2// +#define _TRANS 3// +#define _SYMB2 4// old symbol level, more ergodox like + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +/* Macros */ +enum { + NONE = 0, + // Diagonal mouse movement + A_MUL, + A_MUR, + A_MDL, + A_MDR, +}; + + +// Train out of using uncomfortable esc and GUI keys. +/**************************************************************************************************** +* +* Keymap: Default Layer in Qwerty +* +* ,-------------------------------------------------------------------------------------------------------------------. +* | no | F1 | F2 | F3 | F4 | F5 | F6 | F8 | F9 | F10 | F12 | FN0 | FN1 | FN2 | | bOOT | +* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------| +* | `~ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | -_ | +* |--------+------+------+------+------+------| +------+------+------+------+------+--------| +* | Tab | Q | W | E | R | T | | Y | U | I | O | P | \| | +* |--------+------+------+------+------+------| |------+------+------+------+------+--------| +* |MouseFN0| A | S | D | F | G | | H | J | K | L | ;: | '" | +* |--------+------+------+------+------+------| |------+------+------+------+------+--------| +* | Shift | Z | X | C | V | B | | N | M | ,< | .> | /? | Shift | +* `--------+------+------+------+------+------- `------+------+------+------+------+--------' +* | ~` | ESC |GUI/L |L1/RT | | L1/UP|GUI/DN| [{ | ]} | +* `---------------------------' `---------------------------' +* ,-------------. ,-------------. +* | CTRL | ALT | | ALT | GUI | +* ,------|------|------| |------+------+------. +* | | | Del | | PgUp | | | +* | BkSp | BkSp |------| |------|Return| Space| +* | | | FN0 | | PgDn | | | +* `--------------------' `--------------------' +*/ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_QWERTY] = KEYMAP( + XXXXXXX, KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8, + KC_GRAVE, KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , + KC_TAB, KC_Q ,KC_W ,KC_E ,KC_R ,KC_T , + KC_FN0 ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G , + KC_LSFT,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B , + KC_GRAVE, KC_ESC, KC_FN4, KC_FN5, + KC_LCTL,KC_LALT, + KC_DEL, + KC_BSPC, KC_DEL ,KC_FN0 , + KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_FN0 ,KC_FN1 ,KC_FN2, KC_NO, RESET, + KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS, + KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS, + KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN,KC_QUOT, + KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_RSFT, + KC_FN6, KC_FN7, KC_LBRC ,KC_RBRC, + KC_RALT,KC_RGUI, + KC_PGUP, + KC_PGDN,KC_ENTER ,KC_SPC + ), + + +/* _SYMB level, more planck like. Much work to make sequences into multi-finger rolls. eg ([1,0]), !=0 +* Also sorted by frequency / strength of finger. +* +* ,-------------------------------------------------------------------------------------------------------------------. +* | | | | | | | | | | | | | | | | | +* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------| +* | | | | | | | | | | | | | | +* |--------+------+------+------+------+------| +------+------+------+------+------+--------| +* | | ^ | { | } | @ | % | | & | [ | ( | ) | _ | \ | +* |--------+------+------+------+------+------| +------+------+------+------+------+--------| +* | | ! | # | 0 | = | ~ | | * | + | 1 | - | ] | ` | +* |--------+------+------+------+------+------| |------+------+------+------+------+--------| +* | | 6 | 7 | 8 | 9 | pipe | | $ | 2 | 3 | 4 | 5 | | +* `--------+------+------+------+------+------- `------+------+------+------+------+--------' +* | | : |GUI/L |L1/RT | | L1/UP|GUI/DN| \ | | +* `---------------------------' `---------------------------' +* ,-------------. ,-------------. +* | CTRL | | | ALT | GUI | +* ,------|------|------| |------+------+------. +* | | | | | | | | +* | Cut | Paste|------| |------| | | +* | | |Reset | | | | | +* `--------------------' `--------------------' +*/ + + + +[_SYMB] = KEYMAP( + _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, KC_CIRC, KC_LCBR, KC_RCBR, KC_AT, KC_PERC, + _______, KC_EXLM, KC_HASH, KC_0, KC_EQL, KC_TILD, + _______, KC_6, KC_7, KC_8, KC_9, KC_PIPE, + _______, KC_COLON, KC_FN4, KC_FN5, + _______, _______, + _______, + _______, _______, RESET, + _______, _______, _______, _______, _______, _______, _______, KC_FN0, KC_2, + _______, _______, _______, _______, _______, _______, + KC_AMPR, KC_LBRC, KC_LPRN, KC_RPRN, KC_UNDS, _______, + KC_ASTR, KC_PLUS, KC_1, KC_MINS, KC_RBRC, KC_GRV, + KC_DLR, KC_2, KC_3, KC_4, KC_5, XXXXXXX, + KC_FN6, KC_FN7, KC_BSLS, XXXXXXX, + _______, _______, + _______, + _______, _______, _______ + ), + + +/* _SYMB2ol level, more ergodox like +* +* ,-------------------------------------------------------------------------------------------------------------------. +* | | | | | | | | | | | | | | | | | +* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------| +* | | | * | # | | | | | | | | | | +* |--------+------+------+------+------+------| +------+------+------+------+------+--------| +* | | / | < | > | | | | | | + | * | | | +* |--------+------+------+------+------+------| |------+------+------+------+------+--------| +* | | | { | } | | | | | | = | - | | | +* |--------+------+------+------+------+------| |------+------+------+------+------+--------| +* | | = | ( | ) | | | | | | | | | | | +* `--------+------+------+------+------+------- `------+------+------+------+------+--------' +* | | |GUI/L |L1/RT | | L1/UP|GUI/DN| { | } | +* `---------------------------' `---------------------------' +* ,-------------. ,-------------. +* | CTRL | | | ALT | GUI | +* ,------|------|------| |------+------+------. +* | | | | | | | | +* | BkSp | Del |------| |------|Mouse1|Mouse2| +* | | |Reset | | |LClick|Rclick| +* `--------------------' `--------------------' +*/ + + + +[_SYMB2] = KEYMAP( + _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, KC_ASTR, KC_HASH, _______, _______, + _______, KC_SLSH, RSFT(KC_COMM), RSFT(KC_DOT), _______, _______, + _______, _______, RSFT(KC_LBRC), RSFT(KC_RBRC), _______, _______, + _______, KC_EQL, RSFT(KC_9), RSFT(KC_0), _______, _______, + _______, _______, KC_FN4, KC_FN5, + _______, _______, + _______, + _______, _______, RESET, + _______, _______, _______, _______, _______, _______, _______, KC_FN0, KC_2, + _______, _______, _______, KC_ASTR, _______, _______, + _______, _______, KC_PLUS, KC_MINS, _______, _______, + _______, _______, KC_EQL, KC_PIPE, _______, _______, + _______, _______, _______, _______, _______, _______, + KC_FN6, KC_FN7, _______, _______, + _______, _______, + _______, + _______, _______, _______ + ), +/* Keymap: Movement and function layer +* +* ,-------------------------------------------------------------------------------------------------------------------. +* | Caps | F1 | F2 | F3 | F4 | F5 | F6 | F8 | F9 | F10 | F12 | FN0 | FN1 | FN2 | Tada | bOOT | +* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------| +* | =+ | ! | @ | # | $ | % | | ^ | & | * | ( | ) |MS Fast | +* |--------+------+------+------+------+------| +------+------+------+------+------+--------| +* | Tab | | | | |PgUp | | MwU |MS_UL | MS_U |MS_UR | | Ms Norm| +* |--------+------+------+------+------+------| |------+------+------+------+------+--------| +* |MouseFN1|GUI_V |GUI X |GUI C |GUI_V | | | | MS_L |Mouse1| MS_R | |MS Slow | +* |--------+------+------+------+------+------| |------+------+------+------+------+--------| +* | | | | | |PgDown| | MWD | MDown|MS Dwn|MS_DR | ? | | +* `--------+------+------+------+------+------- `------+------+------+------+------+--------' +* | `~ | ESC | | | | | | { | } | +* `---------------------------' `---------------------------' +* ,-------------. ,-------------. +* | CTRL | GUI | | ALT | GUI | +* ,------|------|------| |------+------+------. +* | | | Home | | PgUp | | | +* | BkSp | Del |------| |------|Mouse1|Mouse2| +* | | | End | | PgDn |LClick|Rclick| +* `--------------------' `--------------------' +*/ + + +[_MOUSE] = KEYMAP( + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_EXLM ,KC_AT, KC_HASH, KC_DLR ,KC_PERC , + _______, KC_NO, KC_NO, KC_UP, KC_NO, KC_PGUP, + KC_FN1, LGUI(KC_Z),LGUI(KC_X),LGUI(KC_C),LGUI(KC_V), KC_NO, + _______, KC_NO, KC_NO, KC_UP, KC_NO, KC_PGDN, + _______, _______, KC_NO, KC_NO, + _______, _______, + _______, + _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_FN0,RESET, + KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_ACL2, + KC_WH_U, M(A_MUL), KC_MS_U, M(A_MUR), KC_NO, KC_ACL1, + KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_ACL0, + KC_WH_D, M(A_MDL), KC_MS_D, M(A_MDR), RSFT(KC_LBRC), RSFT(KC_RBRC), + KC_LCBR, KC_RCBR, KC_NO, KC_NO, + _______, _______, + _______, + _______, KC_BTN1, KC_BTN2 + ), + + + +/* EMPTY +* +* ,-------------------------------------------------------------------------------------------------------------------. +* | | | | | | | | | | | | | | | | bOOT | +* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------| +* | | | | | | | | | | | | | | +* |--------+------+------+------+------+------| +------+------+------+------+------+--------| +* | | | | | | | | | | | | | | +* |--------+------+------+------+------+------| |------+------+------+------+------+--------| +* | | | | | | | | | | | | | | +* |--------+------+------+------+------+------| |------+------+------+------+------+--------| +* | | | | | | | | | | | | | | +* `--------+------+------+------+------+------- `------+------+------+------+------+--------' +* | | | | | | | | | | +* `---------------------------' `---------------------------' +* ,-------------. ,-------------. +* | Ctrl | Alt | | Gui | Ctrl | +* ,------|------|------| |------+------+------. +* | | | Home | | PgUp | | | +* | BkSp | Del |------| |------|Mouse1|Mouse2| +* | | | End | | PgDn |LClick|Rclick| +* `--------------------' `--------------------' +*/ + + + +[_TRANS] = KEYMAP( + _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_FN0, KC_2, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______ + ), + + +}; + + + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_TAP_TOGGLE(_MOUSE) , + [1] = ACTION_LAYER_TOGGLE(_MOUSE) , + [2] = ACTION_LAYER_TAP_TOGGLE(_SYMB) , + [5]= ACTION_LAYER_TAP_KEY(_SYMB,KC_RIGHT), + [4]= ACTION_MODS_TAP_KEY(MOD_LGUI,KC_LEFT), + [6]= ACTION_LAYER_TAP_KEY(_SYMB,KC_UP), + [7]= ACTION_MODS_TAP_KEY(MOD_LGUI,KC_DOWN), + + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + + // from algernon's ErgoDox EZ layout, + case A_MUL: + if (record->event.pressed) { + mousekey_on(KC_MS_UP); + mousekey_on(KC_MS_LEFT); + } else { + mousekey_off(KC_MS_UP); + mousekey_off(KC_MS_LEFT); + } + mousekey_send(); + break; + + case A_MUR: + if (record->event.pressed) { + mousekey_on(KC_MS_UP); + mousekey_on(KC_MS_RIGHT); + } else { + mousekey_off(KC_MS_UP); + mousekey_off(KC_MS_RIGHT); + } + mousekey_send(); + break; + + case A_MDL: + if (record->event.pressed) { + mousekey_on(KC_MS_DOWN); + mousekey_on(KC_MS_LEFT); + } else { + mousekey_off(KC_MS_DOWN); + mousekey_off(KC_MS_LEFT); + } + mousekey_send(); + break; + + case A_MDR: + if (record->event.pressed) { + mousekey_on(KC_MS_DOWN); + mousekey_on(KC_MS_RIGHT); + } else { + mousekey_off(KC_MS_DOWN); + mousekey_off(KC_MS_RIGHT); + } + mousekey_send(); + break; + } + return MACRO_NONE; +}; + + +void matrix_init_user(void) { + + +} + +void matrix_scan_user(void) { + +#ifdef ALVICSTEP_CONFIG_H + int8_t layer = biton32(layer_state); + + switch (layer) { + case 1: + if (!(host_keyboard_leds() & (1 << USB_LED_CAPS_LOCK))) { + all_led_off(); + caps_lock_led_on(); + } + break; + + case 2: + if (!(host_keyboard_leds() & (1 << USB_LED_SCROLL_LOCK))) { + all_led_off(); + scroll_lock_led_on(); + } + case 0: + all_led_off(); + num_lock_led_on(); + break; + default: + break; + } +#endif + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/kinesis/keymaps/programmer/readme.md b/keyboards/kinesis/keymaps/milestogo/readme.md similarity index 100% rename from keyboards/kinesis/keymaps/programmer/readme.md rename to keyboards/kinesis/keymaps/milestogo/readme.md diff --git a/keyboards/kinesis/keymaps/programmer/keymap.c b/keyboards/kinesis/keymaps/programmer/keymap.c deleted file mode 100644 index 83fb7bd5..00000000 --- a/keyboards/kinesis/keymaps/programmer/keymap.c +++ /dev/null @@ -1,245 +0,0 @@ -#include "kinesis.h" -#include "action_layer.h" -#include "mousekey.h" - -#define QWERTY 0 // Base qerty -#define SYMB 1// Symbol layer -#define MOUSE 2// - - - - -/* Macros */ -enum { - NONE = 0, - // Diagonal mouse movement - A_MUL, - A_MUR, - A_MDL, - A_MDR, -}; - - -// Borrowing very heavily from -// https://github.com/alvicstep/tmk_keyboard -/**************************************************************************************************** -* -* Keymap: Default Layer in Qwerty -* -* ,-------------------------------------------------------------------------------------------------------------------. -* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F8 | F9 | F10 | F12 | FN0 | FN1 | FN2 | | bOOT | -* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------| -* | =+ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | -_ | -* |--------+------+------+------+------+------| +------+------+------+------+------+--------| -* | Tab | Q | W | E | R | T | | Y | U | I | O | P | \| | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* |MouseFN1| A | S | D | F | G | | H | J | K | L | ;: | '" | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | Shift | Z | X | C | V | B | | N | M | ,. | .> | /? | Shift | -* `--------+------+------+------+------+------- `------+------+------+------+------+--------' -* | `~ | ESC |MOUSE1|MOUSE2| | [{ | ]} | ESC | GUI | -* `---------------------------' `---------------------------' -* ,-------------. ,-------------. -* | Ctrl | Alt | | Gui | Ctrl | -* ,------|------|------| |------+------+------. -* | | | Home | | PgUp | | | -* | BkSp | Del |------| |------|Return| Space| -* | | | End | | PgDn | | | -* `--------------------' `--------------------' -*/ - - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[QWERTY] = KEYMAP( - KC_ESC, KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8, - KC_EQL, KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , - KC_TAB, KC_Q ,KC_W ,KC_E ,KC_R ,KC_T , - KC_FN1 ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G , - KC_LSFT,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B , - KC_GRV ,KC_ESC, KC_BTN1,KC_BTN2, - KC_LCTL,KC_LALT, - KC_HOME, - KC_BSPC,KC_DEL ,KC_FN0 , - KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_FN0 ,KC_FN1 ,KC_FN2, KC_NO, RESET, - KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS, - KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS, - KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN,KC_QUOT, - KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_RSFT, - KC_LBRC,KC_RBRC, KC_ESC, KC_RGUI, - KC_RGUI,KC_RCTL, - KC_PGUP, - KC_PGDN,KC_ENTER ,KC_SPC - ), -[SYMB] = KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_FN0, KC_2, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS - ), -/* Keymap: Movement and function layer -* -* ,-------------------------------------------------------------------------------------------------------------------. -* | Caps | F1 | F2 | F3 | F4 | F5 | F6 | F8 | F9 | F10 | F12 | FN0 | FN1 | FN2 | Tada | bOOT | -* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------| -* | =+ | ! | @ | # | $ | % | | ^ | & | * | ( | ) |MS Fast | -* |--------+------+------+------+------+------| +------+------+------+------+------+--------| -* | Tab | | | Up | |PgUp | | MwU |MS_UL | MS_U |MS_UR | | Ms Norm| -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* |MouseFN1| C^A | Left | Down |Right | C^E | | | MS_L |Mouse1| MS_R | |MS Slow | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | | GuiZ | GUI X| GUI C| GUI_V|PgDown| | MWD | MDown|MS Dwn|MS_DR | ? | | -* `--------+------+------+------+------+------- `------+------+------+------+------+--------' -* | `~ | ESC | < | > | | { | } | ESC | | -* `---------------------------' `---------------------------' -* ,-------------. ,-------------. -* | Ctrl | Alt | | Gui | Ctrl | -* ,------|------|------| |------+------+------. -* | | | Home | | PgUp | | | -* | BkSp | Del |------| |------|Mouse1|Mouse2| -* | | | End | | PgDn |LClick|Rclick| -* `--------------------' `--------------------' -*/ - - -[MOUSE] = KEYMAP( - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_EXLM ,KC_AT, KC_HASH, KC_DLR ,KC_PERC , - KC_TRNS, KC_NO, KC_NO, KC_UP, KC_NO, KC_PGUP, - KC_FN1, LCTL(KC_A),KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_E), - KC_TRNS, LGUI(KC_Z),LGUI(KC_X),LGUI(KC_C),LGUI(KC_V),KC_PGDN, - KC_TRNS, KC_TRNS, KC_LABK, KC_RABK, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_FN0,RESET, - KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_ACL2, - KC_WH_U, M(A_MUL), KC_MS_U, M(A_MUR), KC_NO, KC_ACL1, - KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_ACL0, - KC_WH_D, M(A_MDL), KC_MS_D, M(A_MDR), KC_TRNS, KC_TRNS, - KC_LCBR, KC_RCBR, KC_ESC, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_BTN1, KC_BTN2 - ), - - -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_TAP_TOGGLE(MOUSE) , // FN1 - Momentary Layer 1 (Symbols) - [1] = ACTION_LAYER_TOGGLE(MOUSE) , // FN1 - Momentary Layer 1 (Symbols) - [2] = ACTION_LAYER_TAP_TOGGLE(SYMB) , // FN1 - Momentary Layer 1 (Symbols) - - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - - // from algernon's ErgoDox EZ layout, - case A_MUL: - if (record->event.pressed) { - mousekey_on(KC_MS_UP); - mousekey_on(KC_MS_LEFT); - } else { - mousekey_off(KC_MS_UP); - mousekey_off(KC_MS_LEFT); - } - mousekey_send(); - break; - - case A_MUR: - if (record->event.pressed) { - mousekey_on(KC_MS_UP); - mousekey_on(KC_MS_RIGHT); - } else { - mousekey_off(KC_MS_UP); - mousekey_off(KC_MS_RIGHT); - } - mousekey_send(); - break; - - case A_MDL: - if (record->event.pressed) { - mousekey_on(KC_MS_DOWN); - mousekey_on(KC_MS_LEFT); - } else { - mousekey_off(KC_MS_DOWN); - mousekey_off(KC_MS_LEFT); - } - mousekey_send(); - break; - - case A_MDR: - if (record->event.pressed) { - mousekey_on(KC_MS_DOWN); - mousekey_on(KC_MS_RIGHT); - } else { - mousekey_off(KC_MS_DOWN); - mousekey_off(KC_MS_RIGHT); - } - mousekey_send(); - break; - } - return MACRO_NONE; -}; - - -void matrix_init_user(void) { - - -} - -void matrix_scan_user(void) { - int8_t layer = biton32(layer_state); - - switch (layer) { - case 1: - all_led_off(); - break; - case 2: - if (!(host_keyboard_leds() & (1 << USB_LED_CAPS_LOCK))) { - all_led_off(); - caps_lock_led_on(); - } - break; - case 0: - all_led_off(); - num_lock_led_on(); - break; - default: - break; - } - -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - return true; -} - -void led_set_user(uint8_t usb_led) { - -} diff --git a/keyboards/kinesis/kinesis.c b/keyboards/kinesis/kinesis.c index 1fee90e6..7a6a1be5 100644 --- a/keyboards/kinesis/kinesis.c +++ b/keyboards/kinesis/kinesis.c @@ -1,106 +1 @@ #include "kinesis.h" - -// begin section origin https://github.com/alvicstep/tmk_keyboard - - -void all_led_off(void) -{ - PORTD = 0b11111111; -} - -void all_led_on(void) -{ - PORTD = 0b00000000; -} -void num_lock_led_on(void) -{ - PORTD = 0b11101111; -} - -void caps_lock_led_on(void) -{ - PORTD = 0b01111111; -} - -void scroll_lock_led_on(void) -{ - PORTD = 0b11011111; -} -void keypad_led_on(void) -{ - PORTD = 0b10111111; -} -void blink_all_leds(void) -{ - all_led_on(); - _delay_ms(500); - - all_led_off(); - _delay_ms(100); - - caps_lock_led_on(); - _delay_ms(100); - - num_lock_led_on(); - _delay_ms(100); - - scroll_lock_led_on(); - _delay_ms(100); - - keypad_led_on(); - _delay_ms(100); - - //back - - scroll_lock_led_on(); - _delay_ms(100); - - num_lock_led_on(); - _delay_ms(100); - - caps_lock_led_on(); - _delay_ms(100); - - all_led_off(); -} - -// End section origin https://github.com/alvicstep/tmk_keyboard - - void matrix_init_kb(void) { - blink_all_leds(); - matrix_init_user(); -} - - -void matrix_scan_kb(void) { - // put your looping keyboard code here - // runs every cycle (a lot) - - matrix_scan_user(); -} - -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - // put your per-action keyboard code here - // runs for every action, just before processing by the firmware - - return process_record_user(keycode, record); -} - -void led_set_kb(uint8_t usb_led) { - // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here - -//Copyright 2014 Warren Janssens - uint8_t leds = 0xF0; - if (usb_led & 1 << USB_LED_NUM_LOCK) - leds &= ~0x10; - if (usb_led & 1 << USB_LED_CAPS_LOCK) - leds &= ~0x80; - if (usb_led & 1 << USB_LED_SCROLL_LOCK) - leds &= ~0x20; - PORTD = (PORTD & 0x0F) | leds; - - led_set_user(usb_led); - -} - - diff --git a/keyboards/kinesis/kinesis.h b/keyboards/kinesis/kinesis.h index c04fbda1..66713731 100644 --- a/keyboards/kinesis/kinesis.h +++ b/keyboards/kinesis/kinesis.h @@ -1,67 +1,23 @@ #ifndef KINESIS_H #define KINESIS_H -#include "quantum.h" - - -// The first section contains all of the arguements -// The second converts the arguments into a two-dimensional array +#ifdef SUBPROJECT_alvicstep + #include "alvicstep.h" +#endif +#ifdef SUBPROJECT_stapelberg + #include "stapelberg.h" +#endif -#define KEYMAP( \ - k02,k22,k12,k01,k21,k11,k00,k20,k10, \ - k80,k70,k60,k50,k40,k30, \ - k81,k71,k61,k51,k41,k31, \ - k82,k72,k62,k52,k42,k32, \ - k83,k73,k63,k53,k43,k33, \ - k74,k64,k54,k34, \ - k36,k35, \ - k55, \ - k56,k46,k75, \ - k03,k23,k13,k04,k24,k14,k05,k85,k84, \ - k94,kA4,kB4,kD4,kE4,kF4, \ - k95,kA5,kB5,kD5,kE5,kF5, \ - k96,kA6,kB6,kD6,kE6,kF6, \ - k97,kA7,kB7,kD7,kE7,kF7, \ - k93,kB3,kD3,kE3, \ - k47,k66, \ - k67, \ - k87,k76,k86 \ -) { \ - { k00, k01, k02, k03, k04, k05, KC_NO, KC_NO }, \ - { k10, k11, k12, k13, k14, KC_NO, KC_NO, KC_NO }, \ - { k20, k21, k22, k23, k24, KC_NO, KC_NO, KC_NO }, \ - { k30, k31, k32, k33, k34, k35, k36, KC_NO }, \ - { k40, k41, k42, k43, KC_NO, KC_NO, k46, k47 }, \ - { k50, k51, k52, k53, k54, k55, k56, KC_NO }, \ - { k60, k61, k62, k63, k64, KC_NO, k66, k67 }, \ - { k70, k71, k72, k73, k74, k75, k76, KC_NO }, \ - { k80, k81, k82, k83, KC_NO ,KC_NO, k86, k87}, \ - { KC_NO, KC_NO ,KC_NO ,k93, k94, k95, k96, k97}, \ - { KC_NO, KC_NO ,KC_NO ,KC_NO, kA4, kA5, kA6, kA7}, \ - { KC_NO, KC_NO ,KC_NO ,kB3, kB4, kB5, kB6, kB7}, \ - { KC_NO, KC_NO ,KC_NO ,KC_NO, KC_NO, KC_NO, k84, k85}, \ - { KC_NO, KC_NO ,KC_NO ,kD3, kD4, kD5, kD6, kD7}, \ - { KC_NO, KC_NO ,KC_NO ,kE3, kE4, kE5, kE6, kE7}, \ - { KC_NO, KC_NO ,KC_NO ,KC_NO, kF4, kF5, kF6, kF7} \ -} +#include "quantum.h" -/* 4y0 A 4y1 B 4y2 4y3 D 4y4 E 4y5 F 4y6 G 4y7 H 5y0 I 5y1 J 5y2 K 5y3 L 5y4 M 5y5 N 5y6 O 5y7 P */ +void all_led_off(void); +void all_led_on(void); +void num_lock_led_on(void); +void caps_lock_led_on(void); +void scroll_lock_led_on(void); +void keypad_led_on(void); -/* - 0 1 2 3 4 5 6 7 8 9 A B C D E F - A B C D E F G H I J K L M N O P - 4y0 4y1 4y2 4y3 4y4 4y5 4y6 4y7 5y0 5y1 5y2 5y3 5y4 5y5 5y6 5y7 - r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 -0 PB0 21 c0 f6 f8 f7 5 4 3 2 1 =+ -1 PB1 22 c1 f3 f5 f4 t r e w q TAB -2 PB2 23 c2 ESC f2 f1 g f d s a CL -3 PB3 24 c3 f9 f11 f10 b v c x z LS UP DN [{ ]} -4 PB4 25 c4 f12 SL PS RT LT §± `~ 6 7 8 9 0 -_ -5 PB5 26 c5 PB PGM KPD LA HM END y u i o p \ -6 PB6 27 c6 LC DEL BS RC ENT SP h j k l ;: '" -7 PB7 28 c7 RA PU PD n m ,< .> /? RS -*/ #endif diff --git a/keyboards/kinesis/readme.md b/keyboards/kinesis/readme.md index 79c86581..2813ee27 100644 --- a/keyboards/kinesis/readme.md +++ b/keyboards/kinesis/readme.md @@ -1,42 +1,12 @@ -kinesis-advantage keyboard firmware -====================== +# Firmware for the Kinesis advantage keyboard -## Kinesis specific information -This is a port of https://github.com/alvicstep/tmk_keyboard, -which is a fork of https://github.com/wjanssens/tmk_keyboard, -which is based on work from https://github.com/chrisandreae/keyboard-firmware +There are at least two different ways to replace the controller in this keyboard. -If you replace the kinesis CPU as described in the doc folder, then this code should allow you to use QMK. -I've tested with a Teensy 2++, remember to change the CPU if you use a 32u4 instead. +The Stapelberg folder contains the docs and configuration for using the custom controller created by Michael Stapelberg. -Not yet implemented: -- Kinesis EEProm reading or writing -- Audio - this should be simple if we remove hardcoded pins from audio.h and switch to E7 +The alvicstep folder contains docs and configuration for directly wiring a Teensy2++ to the existing controller board. This follows the pinouts described in https://github.com/alvicstep/tmk_keyboard, which is where the name comes from. +## Keymaps +Both hardware solutions should work with the same keymaps -## Quantum MK Firmware - -For the full Quantum feature list, see [the parent readme.md](/doc/readme.md). - -## Building - -Download or clone the whole firmware and navigate to the keyboards/kinesis-advantage folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. - -Depending on which keymap you would like to use, you will have to compile slightly differently. - -### Default - -To build with the default keymap, simply run `make default`. - -### Other Keymaps - -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. - -To build the firmware binary hex file with a keymap just do `make` with a keymap like this: - -``` -$ make [default|jack|] -``` - -Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` diff --git a/keyboards/kinesis/rules.mk b/keyboards/kinesis/rules.mk index a4a2b7d1..956a64bd 100644 --- a/keyboards/kinesis/rules.mk +++ b/keyboards/kinesis/rules.mk @@ -46,11 +46,11 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Boot Section Size in *bytes* # Teensy halfKay 512 -# Teensy++ halfKay 1024 +# Teensy++ halfKay 2048 # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=1024 +OPT_DEFS += -DBOOTLOADER_SIZE=2048 # Build Options diff --git a/keyboards/kinesis/stapelberg/Makefile b/keyboards/kinesis/stapelberg/Makefile new file mode 100644 index 00000000..bd09e588 --- /dev/null +++ b/keyboards/kinesis/stapelberg/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif diff --git a/keyboards/kinesis/stapelberg/config.h b/keyboards/kinesis/stapelberg/config.h new file mode 100644 index 00000000..0677e0ad --- /dev/null +++ b/keyboards/kinesis/stapelberg/config.h @@ -0,0 +1,50 @@ +#ifndef STAPELBERG_CONFIG_H +#define STAPELBERG_CONFIG_H + +#include "../config.h" + +/* USB Device descriptor parameter */ +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0002 + +/* key matrix size */ +#define MATRIX_ROWS 15 +#define MATRIX_COLS 7 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { D0, D1, D2, D3, D4, D5, D6, D7, C0, C1, C2, C3, C4, C5, C6 } +#define MATRIX_COL_PINS { B0, B1, B2, B3, B4, B5, B6 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* don't know if this should be defined at the board or top level. Assuming board +#define MOUSEKEY_DELAY 100 +#define MOUSEKEY_INTERVAL 20 +#define MOUSEKEY_MAX_SPEED 3 +#define MOUSEKEY_TIME_TO_MAX 10 +*/ + +#define IGNORE_MOD_TAP_INTERRUPT + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + +#endif diff --git a/keyboards/kinesis/stapelberg/images/controller_board.jpg b/keyboards/kinesis/stapelberg/images/controller_board.jpg new file mode 100644 index 00000000..b18f76f7 Binary files /dev/null and b/keyboards/kinesis/stapelberg/images/controller_board.jpg differ diff --git a/keyboards/kinesis/stapelberg/images/exterior_reset.jpg b/keyboards/kinesis/stapelberg/images/exterior_reset.jpg new file mode 100644 index 00000000..6edda813 Binary files /dev/null and b/keyboards/kinesis/stapelberg/images/exterior_reset.jpg differ diff --git a/keyboards/kinesis/stapelberg/images/teensy_detail.jpg b/keyboards/kinesis/stapelberg/images/teensy_detail.jpg new file mode 100644 index 00000000..12e6c1c8 Binary files /dev/null and b/keyboards/kinesis/stapelberg/images/teensy_detail.jpg differ diff --git a/keyboards/kinesis/stapelberg/readme.md b/keyboards/kinesis/stapelberg/readme.md new file mode 100644 index 00000000..b04a0bd4 --- /dev/null +++ b/keyboards/kinesis/stapelberg/readme.md @@ -0,0 +1,55 @@ +# kinesis_stapelberg keyboard firmware + +This folder contains the firmware customization required to run QMK on the custom controller for the Kinesis Advantage created by Michael Stapelberg. +It differs from the `alvicstep keyboard in that the existing QMK Kinesis Advantage project uses the existing controller board provided by Kinesis. + +The controller board hardware is described +[here](http://michael.stapelberg.de/Artikel/kinesis_custom_controller) + +Mapping the pin assignments was done using the corresponding matrix description provided at this +[link](https://github.com/stapelberg/kinesis-firmware/blob/master/kb_kinesis/config.kspec) + +This code makes no attempt to drive the four LEDs provided on the controller board. + + +## Building the Hardware + +If you want to perform this customization, these parts may be helpful. + +| Function | Quantity | Vendor | Part Number | +| ------------------------------------------------------ | -------- | ------- | ------------ | +| 13 pin connector for function keys and finger keywells | 4 | Digi-Key | WM14526-ND | +| 10 pin headers for thumb clusters | 4 | Digi-Key | 609-3250-ND | +| 8 pin cable for thumb clusters | 2 | Digi-Key | SAM8928-ND | +| Teensy++ 2.0 | 1 | Digi-Key | 1528-1056-ND | +| 2 pin right angle header for reset | 1 | Digi-Key | 3M9467-ND | +| Reset cables | 2 | Sparkfun | PRT-09140 | + +The board and connections are shown here +![](images/controller_board.jpg) + +The Teensy mounting detail can be seen here. +I used a socket for prototyping. +![](images/teensy_detail.jpg) + + +Since the proper mounting of the Teensy board places the reset button in a tight space, I added a 2-pin header to the reset and ground pins on the edge of the board. +Shorting these two pins together will reset the board. +I also put female to male header jumper cables on these so they could be accessed outside the enclosure. +The exterior cables can be seen here. +![](images/exterior_reset.jpg) + + +## Keymaps + +### Default + +To build with the default keymap, run `make default` while in the +`kinesis_stapelberg` working directory. + +### Dvorak + +This keymap contains a dvorak implementation as well as media and symbol layers. + +Run `make dvorak` while in the `kinesis_stapelberg` working directory. + diff --git a/keyboards/kinesis/stapelberg/rules.mk b/keyboards/kinesis/stapelberg/rules.mk new file mode 100644 index 00000000..fb421a34 --- /dev/null +++ b/keyboards/kinesis/stapelberg/rules.mk @@ -0,0 +1,10 @@ +ifndef QUANTUM_DIR + include ../../../Makefile +endif + +# just silently stop, since we need to upload with teensy uploader +upload: build + + + + diff --git a/keyboards/kinesis/stapelberg/stapelberg.c b/keyboards/kinesis/stapelberg/stapelberg.c new file mode 100644 index 00000000..111db81f --- /dev/null +++ b/keyboards/kinesis/stapelberg/stapelberg.c @@ -0,0 +1,28 @@ +#include "stapelberg.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/kinesis/stapelberg/stapelberg.h b/keyboards/kinesis/stapelberg/stapelberg.h new file mode 100644 index 00000000..c90fc3d5 --- /dev/null +++ b/keyboards/kinesis/stapelberg/stapelberg.h @@ -0,0 +1,72 @@ +#ifndef KINESIS_STAPELBERG_H +#define KINESIS_STAPELBERG_H + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. +// The first section contains all of the arguments as on the physical keyboard +// The second converts the arguments into the 2-D scanned array + +#define KEYMAP( \ + kC0,kD0,kE0,kC1,kD1,kE1,kC2,kD2,kE2, \ + k00,k10,k20,k30,k40,k50, \ + k01,k11,k21,k31,k41,k51, \ + k02,k12,k22,k32,k42,k52, \ + k03,k13,k23,k33,k43,k53, \ + k14,k24,k34,k54, \ + k56,k55, \ + k35, \ + k36,k46,k25, \ + kC3,kD3,kE3,kC4,kD4,kE4,kC5,kE5,kD5, \ + k60,k70,k80,k90,kA0,kB0, \ + k61,k71,k81,k91,kA1,kB1, \ + k62,k72,k82,k92,kA2,kB2, \ + k63,k73,k83,k93,kA3,kB3, \ + k64,k84,k94,kA4, \ + k96,k85, \ + k86, \ + k66,k75,k65 \ +) { \ + { k00, k01, k02, k03, KC_NO, KC_NO, KC_NO }, \ + { k10, k11, k12, k13, k14, KC_NO, KC_NO }, \ + { k20, k21, k22, k23, k24, k25, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36 }, \ + { k40, k41, k42, k43, KC_NO, KC_NO, k46 }, \ + { k50, k51, k52, k53, k54, k55, k56 }, \ + { k60, k61, k62, k63, k64, k65, k66 }, \ + { k70, k71, k72, k73, KC_NO, k75, KC_NO }, \ + { k80, k81, k82, k83, k84, k85, k86 }, \ + { k90, k91, k92, k93, k94, KC_NO, k96 }, \ + { kA0, kA1, kA2, kA3, kA4, KC_NO, KC_NO }, \ + { kB0, kB1, kB2, kB3, KC_NO, KC_NO, KC_NO }, \ + { kC0, kC1, kC2, kC3, kC4, kC5, KC_NO }, \ + { kD0, kD1, kD2, kD3, kD4, kD5, KC_NO }, \ + { kE0, kE1, kE2, kE3, kE4, kE5, KC_NO } \ +} + +/* +This is the Stapelberg matrix as published at +https://github.com/stapelberg/kinesis-firmware/blob/master/kb_kinesis/config.kspec +Along with the pins for each row and column + PB0 PB1 PB2 PB3 PB4 PB5 PB6 + kx0 kx1 kx2 kx3 kx4 kx5 kx6 +PD0 k0x Row: EQL TAB CAP LSH X2 -- -- +PD1 k1x Row: 1 Q A Z BQ -- -- +PD2 k2x Row: 2 W S X INS END -- +PD3 k3x Row: 3 E D C LFT HOM BAK +PD4 k4x Row: 4 R F V -- -- DEL +PD5 k5x Row: 5 T G B RT LAL LCT +PD6 k6x Row: 6 Y H N UP SPC PGD +PD7 k7x Row: 7 U J M -- RET -- +PB0 k8x Row: 8 I K COM DWN RCT PGU +PB1 k9x Row: 9 O L PER LBR -- RAL +PB2 kAx Row: 0 P SEM SLA RBR -- -- +PB3 kBx Row: MIN BSL APO RSH X1 -- -- +PB4 kCx Row: ESC F3 F6 F9 F12 PAU -- +PB5 kDx Row: F1 F4 F7 F10 PRT PRG -- +PB6 kEx Row: F2 F5 F8 F11 SLK KEY -- +*/ + + + +#endif diff --git a/keyboards/lets_split/Makefile b/keyboards/lets_split/Makefile index 4e2a6f00..f5c87d4d 100644 --- a/keyboards/lets_split/Makefile +++ b/keyboards/lets_split/Makefile @@ -1,3 +1,5 @@ +SUBPROJECT_DEFAULT = rev2 + ifndef MAKEFILE_INCLUDED include ../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/lets_split/common/glcdfont.c b/keyboards/lets_split/common/glcdfont.c new file mode 100644 index 00000000..6f88bd23 --- /dev/null +++ b/keyboards/lets_split/common/glcdfont.c @@ -0,0 +1,276 @@ +// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. +// See gfxfont.h for newer custom bitmap font info. + +#ifndef FONT5X7_H +#define FONT5X7_H + +#ifdef __AVR__ + #include + #include +#elif defined(ESP8266) + #include +#else + #define PROGMEM +#endif + +// Standard ASCII 5x7 font + +static const unsigned char font[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, + 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, + 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, + 0x18, 0x3C, 0x7E, 0x3C, 0x18, + 0x1C, 0x57, 0x7D, 0x57, 0x1C, + 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, + 0x00, 0x18, 0x3C, 0x18, 0x00, + 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, + 0x00, 0x18, 0x24, 0x18, 0x00, + 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, + 0x30, 0x48, 0x3A, 0x06, 0x0E, + 0x26, 0x29, 0x79, 0x29, 0x26, + 0x40, 0x7F, 0x05, 0x05, 0x07, + 0x40, 0x7F, 0x05, 0x25, 0x3F, + 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, + 0x7F, 0x3E, 0x1C, 0x1C, 0x08, + 0x08, 0x1C, 0x1C, 0x3E, 0x7F, + 0x14, 0x22, 0x7F, 0x22, 0x14, + 0x5F, 0x5F, 0x00, 0x5F, 0x5F, + 0x06, 0x09, 0x7F, 0x01, 0x7F, + 0x00, 0x66, 0x89, 0x95, 0x6A, + 0x60, 0x60, 0x60, 0x60, 0x60, + 0x94, 0xA2, 0xFF, 0xA2, 0x94, + 0x08, 0x04, 0x7E, 0x04, 0x08, + 0x10, 0x20, 0x7E, 0x20, 0x10, + 0x08, 0x08, 0x2A, 0x1C, 0x08, + 0x08, 0x1C, 0x2A, 0x08, 0x08, + 0x1E, 0x10, 0x10, 0x10, 0x10, + 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, + 0x30, 0x38, 0x3E, 0x38, 0x30, + 0x06, 0x0E, 0x3E, 0x0E, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5F, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x07, 0x00, + 0x14, 0x7F, 0x14, 0x7F, 0x14, + 0x24, 0x2A, 0x7F, 0x2A, 0x12, + 0x23, 0x13, 0x08, 0x64, 0x62, + 0x36, 0x49, 0x56, 0x20, 0x50, + 0x00, 0x08, 0x07, 0x03, 0x00, + 0x00, 0x1C, 0x22, 0x41, 0x00, + 0x00, 0x41, 0x22, 0x1C, 0x00, + 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, + 0x08, 0x08, 0x3E, 0x08, 0x08, + 0x00, 0x80, 0x70, 0x30, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x00, 0x60, 0x60, 0x00, + 0x20, 0x10, 0x08, 0x04, 0x02, + 0x3E, 0x51, 0x49, 0x45, 0x3E, + 0x00, 0x42, 0x7F, 0x40, 0x00, + 0x72, 0x49, 0x49, 0x49, 0x46, + 0x21, 0x41, 0x49, 0x4D, 0x33, + 0x18, 0x14, 0x12, 0x7F, 0x10, + 0x27, 0x45, 0x45, 0x45, 0x39, + 0x3C, 0x4A, 0x49, 0x49, 0x31, + 0x41, 0x21, 0x11, 0x09, 0x07, + 0x36, 0x49, 0x49, 0x49, 0x36, + 0x46, 0x49, 0x49, 0x29, 0x1E, + 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x40, 0x34, 0x00, 0x00, + 0x00, 0x08, 0x14, 0x22, 0x41, + 0x14, 0x14, 0x14, 0x14, 0x14, + 0x00, 0x41, 0x22, 0x14, 0x08, + 0x02, 0x01, 0x59, 0x09, 0x06, + 0x3E, 0x41, 0x5D, 0x59, 0x4E, + 0x7C, 0x12, 0x11, 0x12, 0x7C, + 0x7F, 0x49, 0x49, 0x49, 0x36, + 0x3E, 0x41, 0x41, 0x41, 0x22, + 0x7F, 0x41, 0x41, 0x41, 0x3E, + 0x7F, 0x49, 0x49, 0x49, 0x41, + 0x7F, 0x09, 0x09, 0x09, 0x01, + 0x3E, 0x41, 0x41, 0x51, 0x73, + 0x7F, 0x08, 0x08, 0x08, 0x7F, + 0x00, 0x41, 0x7F, 0x41, 0x00, + 0x20, 0x40, 0x41, 0x3F, 0x01, + 0x7F, 0x08, 0x14, 0x22, 0x41, + 0x7F, 0x40, 0x40, 0x40, 0x40, + 0x7F, 0x02, 0x1C, 0x02, 0x7F, + 0x7F, 0x04, 0x08, 0x10, 0x7F, + 0x3E, 0x41, 0x41, 0x41, 0x3E, + 0x7F, 0x09, 0x09, 0x09, 0x06, + 0x3E, 0x41, 0x51, 0x21, 0x5E, + 0x7F, 0x09, 0x19, 0x29, 0x46, + 0x26, 0x49, 0x49, 0x49, 0x32, + 0x03, 0x01, 0x7F, 0x01, 0x03, + 0x3F, 0x40, 0x40, 0x40, 0x3F, + 0x1F, 0x20, 0x40, 0x20, 0x1F, + 0x3F, 0x40, 0x38, 0x40, 0x3F, + 0x63, 0x14, 0x08, 0x14, 0x63, + 0x03, 0x04, 0x78, 0x04, 0x03, + 0x61, 0x59, 0x49, 0x4D, 0x43, + 0x00, 0x7F, 0x41, 0x41, 0x41, + 0x02, 0x04, 0x08, 0x10, 0x20, + 0x00, 0x41, 0x41, 0x41, 0x7F, + 0x04, 0x02, 0x01, 0x02, 0x04, + 0x40, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x03, 0x07, 0x08, 0x00, + 0x20, 0x54, 0x54, 0x78, 0x40, + 0x7F, 0x28, 0x44, 0x44, 0x38, + 0x38, 0x44, 0x44, 0x44, 0x28, + 0x38, 0x44, 0x44, 0x28, 0x7F, + 0x38, 0x54, 0x54, 0x54, 0x18, + 0x00, 0x08, 0x7E, 0x09, 0x02, + 0x18, 0xA4, 0xA4, 0x9C, 0x78, + 0x7F, 0x08, 0x04, 0x04, 0x78, + 0x00, 0x44, 0x7D, 0x40, 0x00, + 0x20, 0x40, 0x40, 0x3D, 0x00, + 0x7F, 0x10, 0x28, 0x44, 0x00, + 0x00, 0x41, 0x7F, 0x40, 0x00, + 0x7C, 0x04, 0x78, 0x04, 0x78, + 0x7C, 0x08, 0x04, 0x04, 0x78, + 0x38, 0x44, 0x44, 0x44, 0x38, + 0xFC, 0x18, 0x24, 0x24, 0x18, + 0x18, 0x24, 0x24, 0x18, 0xFC, + 0x7C, 0x08, 0x04, 0x04, 0x08, + 0x48, 0x54, 0x54, 0x54, 0x24, + 0x04, 0x04, 0x3F, 0x44, 0x24, + 0x3C, 0x40, 0x40, 0x20, 0x7C, + 0x1C, 0x20, 0x40, 0x20, 0x1C, + 0x3C, 0x40, 0x30, 0x40, 0x3C, + 0x44, 0x28, 0x10, 0x28, 0x44, + 0x4C, 0x90, 0x90, 0x90, 0x7C, + 0x44, 0x64, 0x54, 0x4C, 0x44, + 0x00, 0x08, 0x36, 0x41, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, + 0x00, 0x41, 0x36, 0x08, 0x00, + 0x02, 0x01, 0x02, 0x04, 0x02, + 0x3C, 0x26, 0x23, 0x26, 0x3C, + 0x1E, 0xA1, 0xA1, 0x61, 0x12, + 0x3A, 0x40, 0x40, 0x20, 0x7A, + 0x38, 0x54, 0x54, 0x55, 0x59, + 0x21, 0x55, 0x55, 0x79, 0x41, + 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut + 0x21, 0x55, 0x54, 0x78, 0x40, + 0x20, 0x54, 0x55, 0x79, 0x40, + 0x0C, 0x1E, 0x52, 0x72, 0x12, + 0x39, 0x55, 0x55, 0x55, 0x59, + 0x39, 0x54, 0x54, 0x54, 0x59, + 0x39, 0x55, 0x54, 0x54, 0x58, + 0x00, 0x00, 0x45, 0x7C, 0x41, + 0x00, 0x02, 0x45, 0x7D, 0x42, + 0x00, 0x01, 0x45, 0x7C, 0x40, + 0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut + 0xF0, 0x28, 0x25, 0x28, 0xF0, + 0x7C, 0x54, 0x55, 0x45, 0x00, + 0x20, 0x54, 0x54, 0x7C, 0x54, + 0x7C, 0x0A, 0x09, 0x7F, 0x49, + 0x32, 0x49, 0x49, 0x49, 0x32, + 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut + 0x32, 0x4A, 0x48, 0x48, 0x30, + 0x3A, 0x41, 0x41, 0x21, 0x7A, + 0x3A, 0x42, 0x40, 0x20, 0x78, + 0x00, 0x9D, 0xA0, 0xA0, 0x7D, + 0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut + 0x3D, 0x40, 0x40, 0x40, 0x3D, + 0x3C, 0x24, 0xFF, 0x24, 0x24, + 0x48, 0x7E, 0x49, 0x43, 0x66, + 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, + 0xFF, 0x09, 0x29, 0xF6, 0x20, + 0xC0, 0x88, 0x7E, 0x09, 0x03, + 0x20, 0x54, 0x54, 0x79, 0x41, + 0x00, 0x00, 0x44, 0x7D, 0x41, + 0x30, 0x48, 0x48, 0x4A, 0x32, + 0x38, 0x40, 0x40, 0x22, 0x7A, + 0x00, 0x7A, 0x0A, 0x0A, 0x72, + 0x7D, 0x0D, 0x19, 0x31, 0x7D, + 0x26, 0x29, 0x29, 0x2F, 0x28, + 0x26, 0x29, 0x29, 0x29, 0x26, + 0x30, 0x48, 0x4D, 0x40, 0x20, + 0x38, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x38, + 0x2F, 0x10, 0xC8, 0xAC, 0xBA, + 0x2F, 0x10, 0x28, 0x34, 0xFA, + 0x00, 0x00, 0x7B, 0x00, 0x00, + 0x08, 0x14, 0x2A, 0x14, 0x22, + 0x22, 0x14, 0x2A, 0x14, 0x08, + 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code + 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block + 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block + 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x10, 0x10, 0x10, 0xFF, 0x00, + 0x14, 0x14, 0x14, 0xFF, 0x00, + 0x10, 0x10, 0xFF, 0x00, 0xFF, + 0x10, 0x10, 0xF0, 0x10, 0xF0, + 0x14, 0x14, 0x14, 0xFC, 0x00, + 0x14, 0x14, 0xF7, 0x00, 0xFF, + 0x00, 0x00, 0xFF, 0x00, 0xFF, + 0x14, 0x14, 0xF4, 0x04, 0xFC, + 0x14, 0x14, 0x17, 0x10, 0x1F, + 0x10, 0x10, 0x1F, 0x10, 0x1F, + 0x14, 0x14, 0x14, 0x1F, 0x00, + 0x10, 0x10, 0x10, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0x10, + 0x10, 0x10, 0x10, 0x1F, 0x10, + 0x10, 0x10, 0x10, 0xF0, 0x10, + 0x00, 0x00, 0x00, 0xFF, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0xFF, 0x10, + 0x00, 0x00, 0x00, 0xFF, 0x14, + 0x00, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x1F, 0x10, 0x17, + 0x00, 0x00, 0xFC, 0x04, 0xF4, + 0x14, 0x14, 0x17, 0x10, 0x17, + 0x14, 0x14, 0xF4, 0x04, 0xF4, + 0x00, 0x00, 0xFF, 0x00, 0xF7, + 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0xF7, 0x00, 0xF7, + 0x14, 0x14, 0x14, 0x17, 0x14, + 0x10, 0x10, 0x1F, 0x10, 0x1F, + 0x14, 0x14, 0x14, 0xF4, 0x14, + 0x10, 0x10, 0xF0, 0x10, 0xF0, + 0x00, 0x00, 0x1F, 0x10, 0x1F, + 0x00, 0x00, 0x00, 0x1F, 0x14, + 0x00, 0x00, 0x00, 0xFC, 0x14, + 0x00, 0x00, 0xF0, 0x10, 0xF0, + 0x10, 0x10, 0xFF, 0x10, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x14, + 0x10, 0x10, 0x10, 0x1F, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x10, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x38, 0x44, 0x44, 0x38, 0x44, + 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta + 0x7E, 0x02, 0x02, 0x06, 0x06, + 0x02, 0x7E, 0x02, 0x7E, 0x02, + 0x63, 0x55, 0x49, 0x41, 0x63, + 0x38, 0x44, 0x44, 0x3C, 0x04, + 0x40, 0x7E, 0x20, 0x1E, 0x20, + 0x06, 0x02, 0x7E, 0x02, 0x02, + 0x99, 0xA5, 0xE7, 0xA5, 0x99, + 0x1C, 0x2A, 0x49, 0x2A, 0x1C, + 0x4C, 0x72, 0x01, 0x72, 0x4C, + 0x30, 0x4A, 0x4D, 0x4D, 0x30, + 0x30, 0x48, 0x78, 0x48, 0x30, + 0xBC, 0x62, 0x5A, 0x46, 0x3D, + 0x3E, 0x49, 0x49, 0x49, 0x00, + 0x7E, 0x01, 0x01, 0x01, 0x7E, + 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, + 0x44, 0x44, 0x5F, 0x44, 0x44, + 0x40, 0x51, 0x4A, 0x44, 0x40, + 0x40, 0x44, 0x4A, 0x51, 0x40, + 0x00, 0x00, 0xFF, 0x01, 0x03, + 0xE0, 0x80, 0xFF, 0x00, 0x00, + 0x08, 0x08, 0x6B, 0x6B, 0x08, + 0x36, 0x12, 0x36, 0x24, 0x36, + 0x06, 0x0F, 0x09, 0x0F, 0x06, + 0x00, 0x00, 0x18, 0x18, 0x00, + 0x00, 0x00, 0x10, 0x10, 0x00, + 0x30, 0x40, 0xFF, 0x01, 0x01, + 0x00, 0x1F, 0x01, 0x01, 0x1E, + 0x00, 0x19, 0x1D, 0x17, 0x12, + 0x00, 0x3C, 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP +}; +#endif // FONT5X7_H diff --git a/keyboards/lets_split/config.h b/keyboards/lets_split/config.h index f4d900ac..008fb097 100644 --- a/keyboards/lets_split/config.h +++ b/keyboards/lets_split/config.h @@ -20,83 +20,13 @@ along with this program. If not, see . #include "config_common.h" -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x3060 -#define DEVICE_VER 0x0001 -#define MANUFACTURER Wootpatoot -#define PRODUCT Lets Split -#define DESCRIPTION A split keyboard for the cheap makers - -/* key matrix size */ -// Rows are doubled-up -#define MATRIX_ROWS 8 -#define MATRIX_COLS 6 - -// wiring of each half -#define MATRIX_ROW_PINS { B5, B4, E6, D7 } -#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 } - -#define CATERINA_BOOTLOADER - -// #define USE_I2C - -// Use serial if not using I2C -#ifndef USE_I2C -# define USE_SERIAL +#ifdef SUBPROJECT_rev1 + #include "rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "rev2/config.h" +#endif +#ifdef SUBPROJECT_rev2fliphalf + #include "../../rev2fliphalf/config.h" #endif - -// #define EE_HANDS - -#define I2C_MASTER_LEFT -// #define I2C_MASTER_RIGHT - -/* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW - -/* define if matrix has ghost */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ -// #define BACKLIGHT_LEVELS 3 - -/* Set 0 if debouncing isn't needed */ -#define DEBOUNCING_DELAY 5 - -/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ -#define LOCKING_SUPPORT_ENABLE -/* Locking resynchronize hack */ -#define LOCKING_RESYNC_ENABLE - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - -/* ws2812 RGB LED */ -#define RGB_DI_PIN D4 -#define RGBLIGHT_TIMER -#define RGBLED_NUM 8 // Number of LEDs -#define RGBLIGHT_HUE_STEP 10 -#define RGBLIGHT_SAT_STEP 17 -#define RGBLIGHT_VAL_STEP 17 - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ -// #define NO_DEBUG - -/* disable print */ -// #define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT -//#define NO_ACTION_MACRO -//#define NO_ACTION_FUNCTION - #endif diff --git a/keyboards/lets_split/eeprom-lefthand.eep b/keyboards/lets_split/eeprom-lefthand.eep index a92200b1..b9666a74 100644 --- a/keyboards/lets_split/eeprom-lefthand.eep +++ b/keyboards/lets_split/eeprom-lefthand.eep @@ -1,2 +1,2 @@ -:080000000000000000000001F7 +:0B0000000000000000000000000001F4 :00000001FF diff --git a/keyboards/lets_split/eeprom-righthand.eep b/keyboards/lets_split/eeprom-righthand.eep index 91a68317..94cc5be7 100644 --- a/keyboards/lets_split/eeprom-righthand.eep +++ b/keyboards/lets_split/eeprom-righthand.eep @@ -1,2 +1,2 @@ -:080000000000000000000000F8 +:0B0000000000000000000000000000F5 :00000001FF diff --git a/keyboards/lets_split/i2c.h b/keyboards/lets_split/i2c.h index 08ce4b00..c15b6bc5 100644 --- a/keyboards/lets_split/i2c.h +++ b/keyboards/lets_split/i2c.h @@ -16,7 +16,7 @@ #define SLAVE_BUFFER_SIZE 0x10 // i2c SCL clock frequency -#define SCL_CLOCK 100000L +#define SCL_CLOCK 400000L extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; @@ -28,4 +28,22 @@ uint8_t i2c_master_read(int); void i2c_reset_state(void); void i2c_slave_init(uint8_t address); + +static inline unsigned char i2c_start_read(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_READ); +} + +static inline unsigned char i2c_start_write(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_WRITE); +} + +// from SSD1306 scrips +extern unsigned char i2c_rep_start(unsigned char addr); +extern void i2c_start_wait(unsigned char addr); +extern unsigned char i2c_readAck(void); +extern unsigned char i2c_readNak(void); +extern unsigned char i2c_read(unsigned char ack); + +#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); + #endif diff --git a/keyboards/lets_split/imgs/left.stl b/keyboards/lets_split/imgs/left.stl new file mode 100644 index 00000000..ea738d62 Binary files /dev/null and b/keyboards/lets_split/imgs/left.stl differ diff --git a/keyboards/lets_split/imgs/lets split rev2 case.iges b/keyboards/lets_split/imgs/lets split rev2 case.iges new file mode 100644 index 00000000..5677d097 --- /dev/null +++ b/keyboards/lets_split/imgs/lets split rev2 case.iges @@ -0,0 +1,17931 @@ + S 1 +,,20Hlets split rev2 case,20Hlets split rev2 case,7Hunknown,7Hunknown, G 1 +32,38,7,99,15,,1.,2,2HMM,1,0.08,15H20161218.141108,0.01,10000.,7HunknownG 2 +,7Hunknown,11,0,; G 3 + 186 1 00000000D 1 + 186 -5703 1 0 0D 2 + 186 2 00000000D 3 + 186 -5705 1 0 0D 4 + 186 3 00000000D 5 + 186 -5705 1 0 0D 6 + 514 4 00010000D 7 + 514 29 1 0D 8 + 514 33 00010000D 9 + 514 7 1 0D 10 + 514 40 00010000D 11 + 514 9 1 0D 12 + 510 49 00010000D 13 + 510 -5703 1 1 0D 14 + 510 50 00010000D 15 + 510 -5703 1 1 0D 16 + 510 51 00010000D 17 + 510 -5703 1 1 0D 18 + 510 52 00010000D 19 + 510 -5703 1 1 0D 20 + 510 53 00010000D 21 + 510 -5703 1 1 0D 22 + 510 54 00010000D 23 + 510 -5703 1 1 0D 24 + 510 55 00010000D 25 + 510 -5703 1 1 0D 26 + 510 56 00010000D 27 + 510 -5703 1 1 0D 28 + 510 57 00010000D 29 + 510 -5703 1 1 0D 30 + 510 58 00010000D 31 + 510 -5703 1 1 0D 32 + 510 59 00010000D 33 + 510 -5703 1 1 0D 34 + 510 60 00010000D 35 + 510 -5703 1 1 0D 36 + 510 61 00010000D 37 + 510 -5703 1 1 0D 38 + 510 62 00010000D 39 + 510 -5703 1 1 0D 40 + 510 63 00010000D 41 + 510 -5703 1 1 0D 42 + 510 64 00010000D 43 + 510 -5703 1 1 0D 44 + 510 65 00010000D 45 + 510 -5703 1 1 0D 46 + 510 66 00010000D 47 + 510 -5703 1 1 0D 48 + 510 67 00010000D 49 + 510 -5703 1 1 0D 50 + 510 68 00010000D 51 + 510 -5703 1 1 0D 52 + 510 69 00010000D 53 + 510 -5703 1 1 0D 54 + 510 70 00010000D 55 + 510 -5703 1 1 0D 56 + 510 71 00010000D 57 + 510 -5703 1 1 0D 58 + 510 72 00010000D 59 + 510 -5703 1 1 0D 60 + 510 73 00010000D 61 + 510 -5703 1 1 0D 62 + 510 74 00010000D 63 + 510 -5703 1 1 0D 64 + 510 75 00010000D 65 + 510 -5703 1 1 0D 66 + 510 76 00010000D 67 + 510 -5703 1 1 0D 68 + 510 77 00010000D 69 + 510 -5703 1 1 0D 70 + 510 78 00010000D 71 + 510 -5703 1 1 0D 72 + 510 79 00010000D 73 + 510 -5703 1 1 0D 74 + 510 80 00010000D 75 + 510 -5703 1 1 0D 76 + 510 81 00010000D 77 + 510 -5703 1 1 0D 78 + 510 82 00010000D 79 + 510 -5703 1 1 0D 80 + 510 83 00010000D 81 + 510 -5703 1 1 0D 82 + 510 84 00010000D 83 + 510 -5703 1 1 0D 84 + 510 85 00010000D 85 + 510 -5703 1 1 0D 86 + 510 86 00010000D 87 + 510 -5703 1 1 0D 88 + 510 87 00010000D 89 + 510 -5703 1 1 0D 90 + 510 88 00010000D 91 + 510 -5703 1 1 0D 92 + 510 89 00010000D 93 + 510 -5703 1 1 0D 94 + 510 90 00010000D 95 + 510 -5703 1 1 0D 96 + 510 91 00010000D 97 + 510 -5703 1 1 0D 98 + 510 92 00010000D 99 + 510 -5703 1 1 0D 100 + 510 93 00010000D 101 + 510 -5703 1 1 0D 102 + 510 94 00010000D 103 + 510 -5703 1 1 0D 104 + 510 95 00010000D 105 + 510 -5703 1 1 0D 106 + 510 96 00010000D 107 + 510 -5703 1 1 0D 108 + 510 97 00010000D 109 + 510 -5703 1 1 0D 110 + 510 98 00010000D 111 + 510 -5703 1 1 0D 112 + 510 99 00010000D 113 + 510 -5703 1 1 0D 114 + 510 100 00010000D 115 + 510 -5703 1 1 0D 116 + 510 101 00010000D 117 + 510 -5703 1 1 0D 118 + 510 102 00010000D 119 + 510 -5703 1 1 0D 120 + 510 103 00010000D 121 + 510 -5703 1 1 0D 122 + 510 104 00010000D 123 + 510 -5703 1 1 0D 124 + 510 105 00010000D 125 + 510 -5703 1 1 0D 126 + 510 106 00010000D 127 + 510 -5703 1 1 0D 128 + 510 107 00010000D 129 + 510 -5703 1 1 0D 130 + 510 108 00010000D 131 + 510 -5703 1 1 0D 132 + 510 109 00010000D 133 + 510 -5703 1 1 0D 134 + 510 110 00010000D 135 + 510 -5703 1 1 0D 136 + 510 111 00010000D 137 + 510 -5703 1 1 0D 138 + 510 112 00010000D 139 + 510 -5703 1 1 0D 140 + 510 113 00010000D 141 + 510 -5703 1 1 0D 142 + 510 114 00010000D 143 + 510 -5703 1 1 0D 144 + 510 115 00010000D 145 + 510 -5703 1 1 0D 146 + 510 116 00010000D 147 + 510 -5703 1 1 0D 148 + 510 117 00010000D 149 + 510 -5703 1 1 0D 150 + 510 118 00010000D 151 + 510 -5703 1 1 0D 152 + 510 119 00010000D 153 + 510 -5703 1 1 0D 154 + 510 120 00010000D 155 + 510 -5703 1 1 0D 156 + 510 121 00010000D 157 + 510 -5703 1 1 0D 158 + 510 122 00010000D 159 + 510 -5703 1 1 0D 160 + 510 123 00010000D 161 + 510 -5703 1 1 0D 162 + 510 124 00010000D 163 + 510 -5703 1 1 0D 164 + 510 125 00010000D 165 + 510 -5703 1 1 0D 166 + 510 126 00010000D 167 + 510 -5703 1 1 0D 168 + 510 127 00010000D 169 + 510 -5703 1 1 0D 170 + 510 128 00010000D 171 + 510 -5703 1 1 0D 172 + 510 129 00010000D 173 + 510 -5703 1 1 0D 174 + 510 130 00010000D 175 + 510 -5703 1 1 0D 176 + 510 131 00010000D 177 + 510 -5703 1 1 0D 178 + 510 132 00010000D 179 + 510 -5703 1 1 0D 180 + 510 133 00010000D 181 + 510 -5703 1 1 0D 182 + 510 134 00010000D 183 + 510 -5703 1 1 0D 184 + 510 135 00010000D 185 + 510 -5703 1 1 0D 186 + 510 136 00010000D 187 + 510 -5703 1 1 0D 188 + 510 137 00010000D 189 + 510 -5703 1 1 0D 190 + 510 138 00010000D 191 + 510 -5703 1 1 0D 192 + 510 139 00010000D 193 + 510 -5703 1 1 0D 194 + 510 140 00010000D 195 + 510 -5703 1 1 0D 196 + 510 141 00010000D 197 + 510 -5703 1 1 0D 198 + 510 142 00010000D 199 + 510 -5703 1 1 0D 200 + 510 143 00010000D 201 + 510 -5703 1 1 0D 202 + 510 144 00010000D 203 + 510 -5703 1 1 0D 204 + 510 145 00010000D 205 + 510 -5703 1 1 0D 206 + 510 146 00010000D 207 + 510 -5703 1 1 0D 208 + 510 147 00010000D 209 + 510 -5703 1 1 0D 210 + 510 148 00010000D 211 + 510 -5703 1 1 0D 212 + 510 149 00010000D 213 + 510 -5703 1 1 0D 214 + 510 150 00010000D 215 + 510 -5703 1 1 0D 216 + 510 151 00010000D 217 + 510 -5703 1 1 0D 218 + 510 152 00010000D 219 + 510 -5703 1 1 0D 220 + 510 153 00010000D 221 + 510 -5703 1 1 0D 222 + 510 154 00010000D 223 + 510 -5703 1 1 0D 224 + 510 155 00010000D 225 + 510 -5703 1 1 0D 226 + 510 156 00010000D 227 + 510 -5703 1 1 0D 228 + 510 157 00010000D 229 + 510 -5703 1 1 0D 230 + 510 158 00010000D 231 + 510 -5703 1 1 0D 232 + 510 159 00010000D 233 + 510 -5703 1 1 0D 234 + 510 160 00010000D 235 + 510 -5703 1 1 0D 236 + 510 161 00010000D 237 + 510 -5703 1 1 0D 238 + 510 162 00010000D 239 + 510 -5703 1 1 0D 240 + 510 163 00010000D 241 + 510 -5703 1 1 0D 242 + 510 164 00010000D 243 + 510 -5703 1 1 0D 244 + 510 165 00010000D 245 + 510 -5703 1 1 0D 246 + 510 166 00010000D 247 + 510 -5703 1 1 0D 248 + 510 167 00010000D 249 + 510 -5703 1 1 0D 250 + 510 168 00010000D 251 + 510 -5703 1 1 0D 252 + 510 169 00010000D 253 + 510 -5703 1 1 0D 254 + 510 170 00010000D 255 + 510 -5703 1 1 0D 256 + 510 171 00010000D 257 + 510 -5703 1 1 0D 258 + 510 172 00010000D 259 + 510 -5703 1 1 0D 260 + 510 173 00010000D 261 + 510 -5703 1 1 0D 262 + 510 174 00010000D 263 + 510 -5703 1 1 0D 264 + 510 175 00010000D 265 + 510 -5703 1 1 0D 266 + 510 176 00010000D 267 + 510 -5703 1 1 0D 268 + 510 177 00010000D 269 + 510 -5703 1 1 0D 270 + 510 178 00010000D 271 + 510 -5703 1 1 0D 272 + 510 179 00010000D 273 + 510 -5703 1 1 0D 274 + 510 180 00010000D 275 + 510 -5703 1 1 0D 276 + 510 181 00010000D 277 + 510 -5703 1 1 0D 278 + 510 182 00010000D 279 + 510 -5703 1 1 0D 280 + 510 183 00010000D 281 + 510 -5703 1 1 0D 282 + 510 184 00010000D 283 + 510 -5703 1 1 0D 284 + 510 185 00010000D 285 + 510 -5703 1 1 0D 286 + 510 186 00010000D 287 + 510 -5703 1 1 0D 288 + 510 187 00010000D 289 + 510 -5703 1 1 0D 290 + 510 188 00010000D 291 + 510 -5703 1 1 0D 292 + 510 189 00010000D 293 + 510 -5703 1 1 0D 294 + 510 190 00010000D 295 + 510 -5703 1 1 0D 296 + 510 191 00010000D 297 + 510 -5703 1 1 0D 298 + 510 192 00010000D 299 + 510 -5703 1 1 0D 300 + 510 193 00010000D 301 + 510 -5703 1 1 0D 302 + 510 194 00010000D 303 + 510 -5703 1 1 0D 304 + 510 195 00010000D 305 + 510 -5703 1 1 0D 306 + 510 196 00010000D 307 + 510 -5703 1 1 0D 308 + 510 197 00010000D 309 + 510 -5703 1 1 0D 310 + 510 198 00010000D 311 + 510 -5703 1 1 0D 312 + 510 199 00010000D 313 + 510 -5703 1 1 0D 314 + 510 200 00010000D 315 + 510 -5703 1 1 0D 316 + 510 201 00010000D 317 + 510 -5703 1 1 0D 318 + 510 202 00010000D 319 + 510 -5703 1 1 0D 320 + 510 203 00010000D 321 + 510 -5703 1 1 0D 322 + 510 204 00010000D 323 + 510 -5703 1 1 0D 324 + 510 205 00010000D 325 + 510 -5703 1 1 0D 326 + 510 206 00010000D 327 + 510 -5703 1 1 0D 328 + 510 207 00010000D 329 + 510 -5703 1 1 0D 330 + 510 208 00010000D 331 + 510 -5703 1 1 0D 332 + 510 209 00010000D 333 + 510 -5703 1 1 0D 334 + 510 210 00010000D 335 + 510 -5703 1 1 0D 336 + 510 211 00010000D 337 + 510 -5703 1 1 0D 338 + 510 212 00010000D 339 + 510 -5703 1 1 0D 340 + 510 213 00010000D 341 + 510 -5703 1 1 0D 342 + 510 214 00010000D 343 + 510 -5703 1 1 0D 344 + 510 215 00010000D 345 + 510 -5703 1 1 0D 346 + 510 216 00010000D 347 + 510 -5703 1 1 0D 348 + 510 217 00010000D 349 + 510 -5703 1 1 0D 350 + 510 218 00010000D 351 + 510 -5703 1 1 0D 352 + 510 219 00010000D 353 + 510 -5703 1 1 0D 354 + 510 220 00010000D 355 + 510 -5703 1 1 0D 356 + 510 221 00010000D 357 + 510 -5703 1 1 0D 358 + 510 222 00010000D 359 + 510 -5703 1 1 0D 360 + 510 223 00010000D 361 + 510 -5703 1 1 0D 362 + 510 224 00010000D 363 + 510 -5703 1 1 0D 364 + 510 225 00010000D 365 + 510 -5703 1 1 0D 366 + 510 226 00010000D 367 + 510 -5703 1 1 0D 368 + 510 227 00010000D 369 + 510 -5703 1 1 0D 370 + 510 228 00010000D 371 + 510 -5703 1 1 0D 372 + 510 229 00010000D 373 + 510 -5703 1 1 0D 374 + 510 230 00010000D 375 + 510 -5703 1 1 0D 376 + 510 231 00010000D 377 + 510 -5703 1 1 0D 378 + 510 232 00010000D 379 + 510 -5703 1 1 0D 380 + 510 233 00010000D 381 + 510 -5703 1 1 0D 382 + 510 234 00010000D 383 + 510 -5703 1 1 0D 384 + 510 235 00010000D 385 + 510 -5703 1 1 0D 386 + 510 236 00010000D 387 + 510 -5703 1 1 0D 388 + 510 237 00010000D 389 + 510 -5703 1 1 0D 390 + 510 238 00010000D 391 + 510 -5703 1 1 0D 392 + 510 239 00010000D 393 + 510 -5703 1 1 0D 394 + 510 240 00010000D 395 + 510 -5703 1 1 0D 396 + 510 241 00010000D 397 + 510 -5703 1 1 0D 398 + 510 242 00010000D 399 + 510 -5703 1 1 0D 400 + 510 243 00010000D 401 + 510 -5703 1 1 0D 402 + 510 244 00010000D 403 + 510 -5703 1 1 0D 404 + 510 245 00010000D 405 + 510 -5703 1 1 0D 406 + 510 246 00010000D 407 + 510 -5703 1 1 0D 408 + 510 247 00010000D 409 + 510 -5703 1 1 0D 410 + 510 248 00010000D 411 + 510 -5703 1 1 0D 412 + 510 249 00010000D 413 + 510 -5703 1 1 0D 414 + 510 250 00010000D 415 + 510 -5703 1 1 0D 416 + 510 251 00010000D 417 + 510 -5703 1 1 0D 418 + 510 252 00010000D 419 + 510 -5703 1 1 0D 420 + 510 253 00010000D 421 + 510 -5703 1 1 0D 422 + 510 254 00010000D 423 + 510 -5703 1 1 0D 424 + 510 255 00010000D 425 + 510 -5703 1 1 0D 426 + 510 256 00010000D 427 + 510 -5703 1 1 0D 428 + 510 257 00010000D 429 + 510 -5703 1 1 0D 430 + 510 258 00010000D 431 + 510 -5703 1 1 0D 432 + 510 259 00010000D 433 + 510 -5703 1 1 0D 434 + 510 260 00010000D 435 + 510 -5703 1 1 0D 436 + 510 261 00010000D 437 + 510 -5703 1 1 0D 438 + 510 262 00010000D 439 + 510 -5703 1 1 0D 440 + 510 263 00010000D 441 + 510 -5703 1 1 0D 442 + 510 264 00010000D 443 + 510 -5703 1 1 0D 444 + 510 265 00010000D 445 + 510 -5703 1 1 0D 446 + 510 266 00010000D 447 + 510 -5703 1 1 0D 448 + 510 267 00010000D 449 + 510 -5703 1 1 0D 450 + 510 268 00010000D 451 + 510 -5703 1 1 0D 452 + 510 269 00010000D 453 + 510 -5703 1 1 0D 454 + 510 270 00010000D 455 + 510 -5703 1 1 0D 456 + 510 271 00010000D 457 + 510 -5703 1 1 0D 458 + 510 272 00010000D 459 + 510 -5703 1 1 0D 460 + 510 273 00010000D 461 + 510 -5703 1 1 0D 462 + 510 274 00010000D 463 + 510 -5703 1 1 0D 464 + 510 275 00010000D 465 + 510 -5703 1 1 0D 466 + 510 276 00010000D 467 + 510 -5703 1 1 0D 468 + 510 277 00010000D 469 + 510 -5703 1 1 0D 470 + 510 278 00010000D 471 + 510 -5703 1 1 0D 472 + 510 279 00010000D 473 + 510 -5703 1 1 0D 474 + 510 280 00010000D 475 + 510 -5703 1 1 0D 476 + 510 281 00010000D 477 + 510 -5703 1 1 0D 478 + 510 282 00010000D 479 + 510 -5703 1 1 0D 480 + 510 283 00010000D 481 + 510 -5703 1 1 0D 482 + 510 284 00010000D 483 + 510 -5703 1 1 0D 484 + 510 285 00010000D 485 + 510 -5703 1 1 0D 486 + 510 286 00010000D 487 + 510 -5703 1 1 0D 488 + 510 287 00010000D 489 + 510 -5703 1 1 0D 490 + 510 288 00010000D 491 + 510 -5703 1 1 0D 492 + 510 289 00010000D 493 + 510 -5703 1 1 0D 494 + 510 290 00010000D 495 + 510 -5703 1 1 0D 496 + 510 291 00010000D 497 + 510 -5703 1 1 0D 498 + 510 292 00010000D 499 + 510 -5703 1 1 0D 500 + 510 293 00010000D 501 + 510 -5703 1 1 0D 502 + 510 294 00010000D 503 + 510 -5703 1 1 0D 504 + 510 295 00010000D 505 + 510 -5703 1 1 0D 506 + 510 296 00010000D 507 + 510 -5703 1 1 0D 508 + 510 297 00010000D 509 + 510 -5703 1 1 0D 510 + 510 298 00010000D 511 + 510 -5703 1 1 0D 512 + 510 299 00010000D 513 + 510 -5703 1 1 0D 514 + 510 300 00010000D 515 + 510 -5703 1 1 0D 516 + 510 301 00010000D 517 + 510 -5703 1 1 0D 518 + 510 302 00010000D 519 + 510 -5703 1 1 0D 520 + 510 303 00010000D 521 + 510 -5703 1 1 0D 522 + 510 304 00010000D 523 + 510 -5703 1 1 0D 524 + 510 305 00010000D 525 + 510 -5703 1 1 0D 526 + 510 306 00010000D 527 + 510 -5703 1 1 0D 528 + 510 307 00010000D 529 + 510 -5703 1 1 0D 530 + 510 308 00010000D 531 + 510 -5703 1 1 0D 532 + 510 309 00010000D 533 + 510 -5703 1 1 0D 534 + 510 310 00010000D 535 + 510 -5703 1 1 0D 536 + 510 311 00010000D 537 + 510 -5703 1 1 0D 538 + 510 312 00010000D 539 + 510 -5703 1 1 0D 540 + 510 313 00010000D 541 + 510 -5703 1 1 0D 542 + 510 314 00010000D 543 + 510 -5703 1 1 0D 544 + 510 315 00010000D 545 + 510 -5703 1 1 0D 546 + 510 316 00010000D 547 + 510 -5703 1 1 0D 548 + 510 317 00010000D 549 + 510 -5703 1 1 0D 550 + 510 318 00010000D 551 + 510 -5703 1 1 0D 552 + 510 319 00010000D 553 + 510 -5703 1 1 0D 554 + 510 320 00010000D 555 + 510 -5703 1 1 0D 556 + 510 321 00010000D 557 + 510 -5703 1 1 0D 558 + 510 322 00010000D 559 + 510 -5703 1 1 0D 560 + 510 323 00010000D 561 + 510 -5703 1 1 0D 562 + 510 324 00010000D 563 + 510 -5703 1 1 0D 564 + 510 325 00010000D 565 + 510 -5703 1 1 0D 566 + 510 326 00010000D 567 + 510 -5703 1 1 0D 568 + 510 327 00010000D 569 + 510 -5703 1 1 0D 570 + 510 328 00010000D 571 + 510 -5703 1 1 0D 572 + 510 329 00010000D 573 + 510 -5703 1 1 0D 574 + 510 330 00010000D 575 + 510 -5703 1 1 0D 576 + 510 331 00010000D 577 + 510 -5703 1 1 0D 578 + 510 332 00010000D 579 + 510 -5703 1 1 0D 580 + 510 333 00010000D 581 + 510 -5703 1 1 0D 582 + 510 334 00010000D 583 + 510 -5703 1 1 0D 584 + 510 335 00010000D 585 + 510 -5703 1 1 0D 586 + 510 336 00010000D 587 + 510 -5703 1 1 0D 588 + 510 337 00010000D 589 + 510 -5703 1 1 0D 590 + 510 338 00010000D 591 + 510 -5703 1 1 0D 592 + 510 339 00010000D 593 + 510 -5703 1 1 0D 594 + 510 340 00010000D 595 + 510 -5703 1 1 0D 596 + 510 341 00010000D 597 + 510 -5703 1 1 0D 598 + 510 342 00010000D 599 + 510 -5703 1 1 0D 600 + 510 343 00010000D 601 + 510 -5703 1 1 0D 602 + 510 344 00010000D 603 + 510 -5703 1 1 0D 604 + 510 345 00010000D 605 + 510 -5703 1 1 0D 606 + 510 346 00010000D 607 + 510 -5703 1 1 0D 608 + 510 347 00010000D 609 + 510 -5703 1 1 0D 610 + 510 348 00010000D 611 + 510 -5703 1 1 0D 612 + 510 349 00010000D 613 + 510 -5703 1 1 0D 614 + 510 350 00010000D 615 + 510 -5703 1 1 0D 616 + 510 351 00010000D 617 + 510 -5703 1 1 0D 618 + 510 352 00010000D 619 + 510 -5703 1 1 0D 620 + 510 353 00010000D 621 + 510 -5703 1 1 0D 622 + 510 354 00010000D 623 + 510 -5703 3 1 0D 624 + 510 357 00010000D 625 + 510 -5703 3 1 0D 626 + 510 360 00010000D 627 + 510 -5705 1 1 0D 628 + 510 361 00010000D 629 + 510 -5705 1 1 0D 630 + 510 362 00010000D 631 + 510 -5705 1 1 0D 632 + 510 363 00010000D 633 + 510 -5705 1 1 0D 634 + 510 364 00010000D 635 + 510 -5705 1 1 0D 636 + 510 365 00010000D 637 + 510 -5705 1 1 0D 638 + 510 366 00010000D 639 + 510 -5705 1 1 0D 640 + 510 367 00010000D 641 + 510 -5705 1 1 0D 642 + 510 368 00010000D 643 + 510 -5705 1 1 0D 644 + 510 369 00010000D 645 + 510 -5705 1 1 0D 646 + 510 370 00010000D 647 + 510 -5705 1 1 0D 648 + 510 371 00010000D 649 + 510 -5705 1 1 0D 650 + 510 372 00010000D 651 + 510 -5705 1 1 0D 652 + 510 373 00010000D 653 + 510 -5705 1 1 0D 654 + 510 374 00010000D 655 + 510 -5705 1 1 0D 656 + 510 375 00010000D 657 + 510 -5705 1 1 0D 658 + 510 376 00010000D 659 + 510 -5705 1 1 0D 660 + 510 377 00010000D 661 + 510 -5705 1 1 0D 662 + 510 378 00010000D 663 + 510 -5705 1 1 0D 664 + 510 379 00010000D 665 + 510 -5705 1 1 0D 666 + 510 380 00010000D 667 + 510 -5705 1 1 0D 668 + 510 381 00010000D 669 + 510 -5705 1 1 0D 670 + 510 382 00010000D 671 + 510 -5705 1 1 0D 672 + 510 383 00010000D 673 + 510 -5705 1 1 0D 674 + 510 384 00010000D 675 + 510 -5705 1 1 0D 676 + 510 385 00010000D 677 + 510 -5705 1 1 0D 678 + 510 386 00010000D 679 + 510 -5705 1 1 0D 680 + 510 387 00010000D 681 + 510 -5705 1 1 0D 682 + 510 388 00010000D 683 + 510 -5705 1 1 0D 684 + 510 389 00010000D 685 + 510 -5705 1 1 0D 686 + 510 390 00010000D 687 + 510 -5705 1 1 0D 688 + 510 391 00010000D 689 + 510 -5705 1 1 0D 690 + 510 392 00010000D 691 + 510 -5705 1 1 0D 692 + 510 393 00010000D 693 + 510 -5705 1 1 0D 694 + 510 394 00010000D 695 + 510 -5705 1 1 0D 696 + 510 395 00010000D 697 + 510 -5705 1 1 0D 698 + 510 396 00010000D 699 + 510 -5705 1 1 0D 700 + 510 397 00010000D 701 + 510 -5705 1 1 0D 702 + 510 398 00010000D 703 + 510 -5705 1 1 0D 704 + 510 399 00010000D 705 + 510 -5705 1 1 0D 706 + 510 400 00010000D 707 + 510 -5705 1 1 0D 708 + 510 401 00010000D 709 + 510 -5705 1 1 0D 710 + 510 402 00010000D 711 + 510 -5705 1 1 0D 712 + 510 403 00010000D 713 + 510 -5705 1 1 0D 714 + 510 404 00010000D 715 + 510 -5705 1 1 0D 716 + 510 405 00010000D 717 + 510 -5705 1 1 0D 718 + 510 406 00010000D 719 + 510 -5705 1 1 0D 720 + 510 407 00010000D 721 + 510 -5705 1 1 0D 722 + 510 408 00010000D 723 + 510 -5705 1 1 0D 724 + 510 409 00010000D 725 + 510 -5705 1 1 0D 726 + 510 410 00010000D 727 + 510 -5705 1 1 0D 728 + 510 411 00010000D 729 + 510 -5705 1 1 0D 730 + 510 412 00010000D 731 + 510 -5705 1 1 0D 732 + 510 413 00010000D 733 + 510 -5705 1 1 0D 734 + 510 414 00010000D 735 + 510 -5705 1 1 0D 736 + 510 415 00010000D 737 + 510 -5705 1 1 0D 738 + 510 416 00010000D 739 + 510 -5705 1 1 0D 740 + 510 417 00010000D 741 + 510 -5705 1 1 0D 742 + 510 418 00010000D 743 + 510 -5705 1 1 0D 744 + 510 419 00010000D 745 + 510 -5705 1 1 0D 746 + 510 420 00010000D 747 + 510 -5705 1 1 0D 748 + 510 421 00010000D 749 + 510 -5705 1 1 0D 750 + 510 422 00010000D 751 + 510 -5705 1 1 0D 752 + 510 423 00010000D 753 + 510 -5705 1 1 0D 754 + 510 424 00010000D 755 + 510 -5705 1 1 0D 756 + 510 425 00010000D 757 + 510 -5705 1 1 0D 758 + 510 426 00010000D 759 + 510 -5705 1 1 0D 760 + 510 427 00010000D 761 + 510 -5705 1 1 0D 762 + 510 428 00010000D 763 + 510 -5705 1 1 0D 764 + 510 429 00010000D 765 + 510 -5705 1 1 0D 766 + 510 430 00010000D 767 + 510 -5705 1 1 0D 768 + 510 431 00010000D 769 + 510 -5705 1 1 0D 770 + 510 432 00010000D 771 + 510 -5705 1 1 0D 772 + 510 433 00010000D 773 + 510 -5705 1 1 0D 774 + 510 434 00010000D 775 + 510 -5705 1 1 0D 776 + 510 435 00010000D 777 + 510 -5705 1 1 0D 778 + 510 436 00010000D 779 + 510 -5705 1 1 0D 780 + 510 437 00010000D 781 + 510 -5705 1 1 0D 782 + 510 438 00010000D 783 + 510 -5705 1 1 0D 784 + 510 439 00010000D 785 + 510 -5705 1 1 0D 786 + 510 440 00010000D 787 + 510 -5705 1 1 0D 788 + 510 441 00010000D 789 + 510 -5705 1 1 0D 790 + 510 442 00010000D 791 + 510 -5705 1 1 0D 792 + 510 443 00010000D 793 + 510 -5705 1 1 0D 794 + 510 444 00010000D 795 + 510 -5705 1 1 0D 796 + 510 445 00010000D 797 + 510 -5705 1 1 0D 798 + 510 446 00010000D 799 + 510 -5705 1 1 0D 800 + 510 447 00010000D 801 + 510 -5705 1 1 0D 802 + 510 448 00010000D 803 + 510 -5705 1 1 0D 804 + 510 449 00010000D 805 + 510 -5705 1 1 0D 806 + 510 450 00010000D 807 + 510 -5705 1 1 0D 808 + 510 451 00010000D 809 + 510 -5705 1 1 0D 810 + 510 452 00010000D 811 + 510 -5705 1 1 0D 812 + 510 453 00010000D 813 + 510 -5705 1 1 0D 814 + 510 454 00010000D 815 + 510 -5705 1 1 0D 816 + 510 455 00010000D 817 + 510 -5705 1 1 0D 818 + 510 456 00010000D 819 + 510 -5705 1 1 0D 820 + 510 457 00010000D 821 + 510 -5705 1 1 0D 822 + 510 458 00010000D 823 + 510 -5705 1 1 0D 824 + 510 459 00010000D 825 + 510 -5705 1 1 0D 826 + 510 460 00010000D 827 + 510 -5705 1 1 0D 828 + 510 461 00010000D 829 + 510 -5705 1 1 0D 830 + 510 462 00010000D 831 + 510 -5705 1 1 0D 832 + 510 463 00010000D 833 + 510 -5705 1 1 0D 834 + 510 464 00010000D 835 + 510 -5705 1 1 0D 836 + 510 465 00010000D 837 + 510 -5705 1 1 0D 838 + 510 466 00010000D 839 + 510 -5705 1 1 0D 840 + 510 467 00010000D 841 + 510 -5705 1 1 0D 842 + 510 468 00010000D 843 + 510 -5705 1 1 0D 844 + 510 469 00010000D 845 + 510 -5705 1 1 0D 846 + 510 470 00010000D 847 + 510 -5705 1 1 0D 848 + 510 471 00010000D 849 + 510 -5705 1 1 0D 850 + 510 472 00010000D 851 + 510 -5705 1 1 0D 852 + 510 473 00010000D 853 + 510 -5705 1 1 0D 854 + 510 474 00010000D 855 + 510 -5705 1 1 0D 856 + 510 475 00010000D 857 + 510 -5705 1 1 0D 858 + 510 476 00010000D 859 + 510 -5705 1 1 0D 860 + 510 477 00010000D 861 + 510 -5705 1 1 0D 862 + 510 478 00010000D 863 + 510 -5705 1 1 0D 864 + 510 479 00010000D 865 + 510 -5705 1 1 0D 866 + 510 480 00010000D 867 + 510 -5705 1 1 0D 868 + 510 481 00010000D 869 + 510 -5705 1 1 0D 870 + 510 482 00010000D 871 + 510 -5705 1 1 0D 872 + 510 483 00010000D 873 + 510 -5705 1 1 0D 874 + 510 484 00010000D 875 + 510 -5705 1 1 0D 876 + 510 485 00010000D 877 + 510 -5705 1 1 0D 878 + 510 486 00010000D 879 + 510 -5705 1 1 0D 880 + 510 487 00010000D 881 + 510 -5705 1 1 0D 882 + 510 488 00010000D 883 + 510 -5705 1 1 0D 884 + 510 489 00010000D 885 + 510 -5705 1 1 0D 886 + 510 490 00010000D 887 + 510 -5705 1 1 0D 888 + 510 491 00010000D 889 + 510 -5705 1 1 0D 890 + 510 492 00010000D 891 + 510 -5705 1 1 0D 892 + 510 493 00010000D 893 + 510 -5705 1 1 0D 894 + 510 494 00010000D 895 + 510 -5705 1 1 0D 896 + 510 495 00010000D 897 + 510 -5705 1 1 0D 898 + 510 496 00010000D 899 + 510 -5705 1 1 0D 900 + 510 497 00010000D 901 + 510 -5705 1 1 0D 902 + 510 498 00010000D 903 + 510 -5705 1 1 0D 904 + 510 499 00010000D 905 + 510 -5705 1 1 0D 906 + 510 500 00010000D 907 + 510 -5705 1 1 0D 908 + 510 501 00010000D 909 + 510 -5705 1 1 0D 910 + 510 502 00010000D 911 + 510 -5705 1 1 0D 912 + 510 503 00010000D 913 + 510 -5705 1 1 0D 914 + 510 504 00010000D 915 + 510 -5705 1 1 0D 916 + 510 505 00010000D 917 + 510 -5705 1 1 0D 918 + 510 506 00010000D 919 + 510 -5705 1 1 0D 920 + 510 507 00010000D 921 + 510 -5705 1 1 0D 922 + 510 508 00010000D 923 + 510 -5705 1 1 0D 924 + 510 509 00010000D 925 + 510 -5705 1 1 0D 926 + 510 510 00010000D 927 + 510 -5705 1 1 0D 928 + 510 511 00010000D 929 + 510 -5705 1 1 0D 930 + 510 512 00010000D 931 + 510 -5705 1 1 0D 932 + 510 513 00010000D 933 + 510 -5705 1 1 0D 934 + 508 514 00010000D 935 + 508 1 1 0D 936 + 508 515 00010000D 937 + 508 1 1 0D 938 + 508 516 00010000D 939 + 508 1 1 0D 940 + 508 517 00010000D 941 + 508 1 1 0D 942 + 508 518 00010000D 943 + 508 1 1 0D 944 + 508 519 00010000D 945 + 508 1 1 0D 946 + 508 520 00010000D 947 + 508 1 1 0D 948 + 508 521 00010000D 949 + 508 1 1 0D 950 + 508 522 00010000D 951 + 508 1 1 0D 952 + 508 523 00010000D 953 + 508 1 1 0D 954 + 508 524 00010000D 955 + 508 1 1 0D 956 + 508 525 00010000D 957 + 508 1 1 0D 958 + 508 526 00010000D 959 + 508 1 1 0D 960 + 508 527 00010000D 961 + 508 1 1 0D 962 + 508 528 00010000D 963 + 508 1 1 0D 964 + 508 529 00010000D 965 + 508 1 1 0D 966 + 508 530 00010000D 967 + 508 1 1 0D 968 + 508 531 00010000D 969 + 508 1 1 0D 970 + 508 532 00010000D 971 + 508 1 1 0D 972 + 508 533 00010000D 973 + 508 1 1 0D 974 + 508 534 00010000D 975 + 508 1 1 0D 976 + 508 535 00010000D 977 + 508 1 1 0D 978 + 508 536 00010000D 979 + 508 1 1 0D 980 + 508 537 00010000D 981 + 508 1 1 0D 982 + 508 538 00010000D 983 + 508 1 1 0D 984 + 508 539 00010000D 985 + 508 1 1 0D 986 + 508 540 00010000D 987 + 508 1 1 0D 988 + 508 541 00010000D 989 + 508 1 1 0D 990 + 508 542 00010000D 991 + 508 1 1 0D 992 + 508 543 00010000D 993 + 508 1 1 0D 994 + 508 544 00010000D 995 + 508 1 1 0D 996 + 508 545 00010000D 997 + 508 1 1 0D 998 + 508 546 00010000D 999 + 508 1 1 0D 1000 + 508 547 00010000D 1001 + 508 2 1 0D 1002 + 508 549 00010000D 1003 + 508 2 1 0D 1004 + 508 551 00010000D 1005 + 508 2 1 0D 1006 + 508 553 00010000D 1007 + 508 2 1 0D 1008 + 508 555 00010000D 1009 + 508 2 1 0D 1010 + 508 557 00010000D 1011 + 508 2 1 0D 1012 + 508 559 00010000D 1013 + 508 2 1 0D 1014 + 508 561 00010000D 1015 + 508 2 1 0D 1016 + 508 563 00010000D 1017 + 508 2 1 0D 1018 + 508 565 00010000D 1019 + 508 2 1 0D 1020 + 508 567 00010000D 1021 + 508 2 1 0D 1022 + 508 569 00010000D 1023 + 508 2 1 0D 1024 + 508 571 00010000D 1025 + 508 2 1 0D 1026 + 508 573 00010000D 1027 + 508 2 1 0D 1028 + 508 575 00010000D 1029 + 508 2 1 0D 1030 + 508 577 00010000D 1031 + 508 2 1 0D 1032 + 508 579 00010000D 1033 + 508 2 1 0D 1034 + 508 581 00010000D 1035 + 508 2 1 0D 1036 + 508 583 00010000D 1037 + 508 2 1 0D 1038 + 508 585 00010000D 1039 + 508 2 1 0D 1040 + 508 587 00010000D 1041 + 508 2 1 0D 1042 + 508 589 00010000D 1043 + 508 2 1 0D 1044 + 508 591 00010000D 1045 + 508 2 1 0D 1046 + 508 593 00010000D 1047 + 508 2 1 0D 1048 + 508 595 00010000D 1049 + 508 2 1 0D 1050 + 508 597 00010000D 1051 + 508 2 1 0D 1052 + 508 599 00010000D 1053 + 508 2 1 0D 1054 + 508 601 00010000D 1055 + 508 2 1 0D 1056 + 508 603 00010000D 1057 + 508 2 1 0D 1058 + 508 605 00010000D 1059 + 508 2 1 0D 1060 + 508 607 00010000D 1061 + 508 2 1 0D 1062 + 508 609 00010000D 1063 + 508 2 1 0D 1064 + 508 611 00010000D 1065 + 508 2 1 0D 1066 + 508 613 00010000D 1067 + 508 2 1 0D 1068 + 508 615 00010000D 1069 + 508 2 1 0D 1070 + 508 617 00010000D 1071 + 508 2 1 0D 1072 + 508 619 00010000D 1073 + 508 2 1 0D 1074 + 508 621 00010000D 1075 + 508 2 1 0D 1076 + 508 623 00010000D 1077 + 508 2 1 0D 1078 + 508 625 00010000D 1079 + 508 2 1 0D 1080 + 508 627 00010000D 1081 + 508 2 1 0D 1082 + 508 629 00010000D 1083 + 508 2 1 0D 1084 + 508 631 00010000D 1085 + 508 2 1 0D 1086 + 508 633 00010000D 1087 + 508 2 1 0D 1088 + 508 635 00010000D 1089 + 508 2 1 0D 1090 + 508 637 00010000D 1091 + 508 2 1 0D 1092 + 508 639 00010000D 1093 + 508 2 1 0D 1094 + 508 641 00010000D 1095 + 508 2 1 0D 1096 + 508 643 00010000D 1097 + 508 2 1 0D 1098 + 508 645 00010000D 1099 + 508 2 1 0D 1100 + 508 647 00010000D 1101 + 508 2 1 0D 1102 + 508 649 00010000D 1103 + 508 2 1 0D 1104 + 508 651 00010000D 1105 + 508 2 1 0D 1106 + 508 653 00010000D 1107 + 508 2 1 0D 1108 + 508 655 00010000D 1109 + 508 2 1 0D 1110 + 508 657 00010000D 1111 + 508 2 1 0D 1112 + 508 659 00010000D 1113 + 508 2 1 0D 1114 + 508 661 00010000D 1115 + 508 2 1 0D 1116 + 508 663 00010000D 1117 + 508 2 1 0D 1118 + 508 665 00010000D 1119 + 508 2 1 0D 1120 + 508 667 00010000D 1121 + 508 2 1 0D 1122 + 508 669 00010000D 1123 + 508 2 1 0D 1124 + 508 671 00010000D 1125 + 508 2 1 0D 1126 + 508 673 00010000D 1127 + 508 2 1 0D 1128 + 508 675 00010000D 1129 + 508 2 1 0D 1130 + 508 677 00010000D 1131 + 508 2 1 0D 1132 + 508 679 00010000D 1133 + 508 2 1 0D 1134 + 508 681 00010000D 1135 + 508 2 1 0D 1136 + 508 683 00010000D 1137 + 508 2 1 0D 1138 + 508 685 00010000D 1139 + 508 2 1 0D 1140 + 508 687 00010000D 1141 + 508 2 1 0D 1142 + 508 689 00010000D 1143 + 508 2 1 0D 1144 + 508 691 00010000D 1145 + 508 2 1 0D 1146 + 508 693 00010000D 1147 + 508 2 1 0D 1148 + 508 695 00010000D 1149 + 508 2 1 0D 1150 + 508 697 00010000D 1151 + 508 2 1 0D 1152 + 508 699 00010000D 1153 + 508 2 1 0D 1154 + 508 701 00010000D 1155 + 508 2 1 0D 1156 + 508 703 00010000D 1157 + 508 2 1 0D 1158 + 508 705 00010000D 1159 + 508 2 1 0D 1160 + 508 707 00010000D 1161 + 508 2 1 0D 1162 + 508 709 00010000D 1163 + 508 2 1 0D 1164 + 508 711 00010000D 1165 + 508 2 1 0D 1166 + 508 713 00010000D 1167 + 508 2 1 0D 1168 + 508 715 00010000D 1169 + 508 2 1 0D 1170 + 508 717 00010000D 1171 + 508 2 1 0D 1172 + 508 719 00010000D 1173 + 508 2 1 0D 1174 + 508 721 00010000D 1175 + 508 2 1 0D 1176 + 508 723 00010000D 1177 + 508 2 1 0D 1178 + 508 725 00010000D 1179 + 508 2 1 0D 1180 + 508 727 00010000D 1181 + 508 2 1 0D 1182 + 508 729 00010000D 1183 + 508 2 1 0D 1184 + 508 731 00010000D 1185 + 508 2 1 0D 1186 + 508 733 00010000D 1187 + 508 2 1 0D 1188 + 508 735 00010000D 1189 + 508 2 1 0D 1190 + 508 737 00010000D 1191 + 508 2 1 0D 1192 + 508 739 00010000D 1193 + 508 2 1 0D 1194 + 508 741 00010000D 1195 + 508 2 1 0D 1196 + 508 743 00010000D 1197 + 508 2 1 0D 1198 + 508 745 00010000D 1199 + 508 2 1 0D 1200 + 508 747 00010000D 1201 + 508 2 1 0D 1202 + 508 749 00010000D 1203 + 508 2 1 0D 1204 + 508 751 00010000D 1205 + 508 2 1 0D 1206 + 508 753 00010000D 1207 + 508 2 1 0D 1208 + 508 755 00010000D 1209 + 508 2 1 0D 1210 + 508 757 00010000D 1211 + 508 2 1 0D 1212 + 508 759 00010000D 1213 + 508 2 1 0D 1214 + 508 761 00010000D 1215 + 508 2 1 0D 1216 + 508 763 00010000D 1217 + 508 2 1 0D 1218 + 508 765 00010000D 1219 + 508 2 1 0D 1220 + 508 767 00010000D 1221 + 508 2 1 0D 1222 + 508 769 00010000D 1223 + 508 2 1 0D 1224 + 508 771 00010000D 1225 + 508 2 1 0D 1226 + 508 773 00010000D 1227 + 508 2 1 0D 1228 + 508 775 00010000D 1229 + 508 2 1 0D 1230 + 508 777 00010000D 1231 + 508 2 1 0D 1232 + 508 779 00010000D 1233 + 508 2 1 0D 1234 + 508 781 00010000D 1235 + 508 2 1 0D 1236 + 508 783 00010000D 1237 + 508 2 1 0D 1238 + 508 785 00010000D 1239 + 508 2 1 0D 1240 + 508 787 00010000D 1241 + 508 2 1 0D 1242 + 508 789 00010000D 1243 + 508 2 1 0D 1244 + 508 791 00010000D 1245 + 508 2 1 0D 1246 + 508 793 00010000D 1247 + 508 2 1 0D 1248 + 508 795 00010000D 1249 + 508 2 1 0D 1250 + 508 797 00010000D 1251 + 508 2 1 0D 1252 + 508 799 00010000D 1253 + 508 2 1 0D 1254 + 508 801 00010000D 1255 + 508 2 1 0D 1256 + 508 803 00010000D 1257 + 508 2 1 0D 1258 + 508 805 00010000D 1259 + 508 2 1 0D 1260 + 508 807 00010000D 1261 + 508 2 1 0D 1262 + 508 809 00010000D 1263 + 508 2 1 0D 1264 + 508 811 00010000D 1265 + 508 2 1 0D 1266 + 508 813 00010000D 1267 + 508 2 1 0D 1268 + 508 815 00010000D 1269 + 508 2 1 0D 1270 + 508 817 00010000D 1271 + 508 2 1 0D 1272 + 508 819 00010000D 1273 + 508 2 1 0D 1274 + 508 821 00010000D 1275 + 508 2 1 0D 1276 + 508 823 00010000D 1277 + 508 2 1 0D 1278 + 508 825 00010000D 1279 + 508 2 1 0D 1280 + 508 827 00010000D 1281 + 508 2 1 0D 1282 + 508 829 00010000D 1283 + 508 2 1 0D 1284 + 508 831 00010000D 1285 + 508 2 1 0D 1286 + 508 833 00010000D 1287 + 508 2 1 0D 1288 + 508 835 00010000D 1289 + 508 2 1 0D 1290 + 508 837 00010000D 1291 + 508 2 1 0D 1292 + 508 839 00010000D 1293 + 508 2 1 0D 1294 + 508 841 00010000D 1295 + 508 2 1 0D 1296 + 508 843 00010000D 1297 + 508 2 1 0D 1298 + 508 845 00010000D 1299 + 508 2 1 0D 1300 + 508 847 00010000D 1301 + 508 2 1 0D 1302 + 508 849 00010000D 1303 + 508 2 1 0D 1304 + 508 851 00010000D 1305 + 508 2 1 0D 1306 + 508 853 00010000D 1307 + 508 2 1 0D 1308 + 508 855 00010000D 1309 + 508 2 1 0D 1310 + 508 857 00010000D 1311 + 508 2 1 0D 1312 + 508 859 00010000D 1313 + 508 2 1 0D 1314 + 508 861 00010000D 1315 + 508 2 1 0D 1316 + 508 863 00010000D 1317 + 508 2 1 0D 1318 + 508 865 00010000D 1319 + 508 2 1 0D 1320 + 508 867 00010000D 1321 + 508 2 1 0D 1322 + 508 869 00010000D 1323 + 508 2 1 0D 1324 + 508 871 00010000D 1325 + 508 2 1 0D 1326 + 508 873 00010000D 1327 + 508 2 1 0D 1328 + 508 875 00010000D 1329 + 508 2 1 0D 1330 + 508 877 00010000D 1331 + 508 2 1 0D 1332 + 508 879 00010000D 1333 + 508 2 1 0D 1334 + 508 881 00010000D 1335 + 508 2 1 0D 1336 + 508 883 00010000D 1337 + 508 2 1 0D 1338 + 508 885 00010000D 1339 + 508 2 1 0D 1340 + 508 887 00010000D 1341 + 508 2 1 0D 1342 + 508 889 00010000D 1343 + 508 2 1 0D 1344 + 508 891 00010000D 1345 + 508 2 1 0D 1346 + 508 893 00010000D 1347 + 508 2 1 0D 1348 + 508 895 00010000D 1349 + 508 2 1 0D 1350 + 508 897 00010000D 1351 + 508 2 1 0D 1352 + 508 899 00010000D 1353 + 508 2 1 0D 1354 + 508 901 00010000D 1355 + 508 2 1 0D 1356 + 508 903 00010000D 1357 + 508 2 1 0D 1358 + 508 905 00010000D 1359 + 508 2 1 0D 1360 + 508 907 00010000D 1361 + 508 2 1 0D 1362 + 508 909 00010000D 1363 + 508 2 1 0D 1364 + 508 911 00010000D 1365 + 508 2 1 0D 1366 + 508 913 00010000D 1367 + 508 2 1 0D 1368 + 508 915 00010000D 1369 + 508 2 1 0D 1370 + 508 917 00010000D 1371 + 508 2 1 0D 1372 + 508 919 00010000D 1373 + 508 2 1 0D 1374 + 508 921 00010000D 1375 + 508 2 1 0D 1376 + 508 923 00010000D 1377 + 508 2 1 0D 1378 + 508 925 00010000D 1379 + 508 2 1 0D 1380 + 508 927 00010000D 1381 + 508 2 1 0D 1382 + 508 929 00010000D 1383 + 508 2 1 0D 1384 + 508 931 00010000D 1385 + 508 2 1 0D 1386 + 508 933 00010000D 1387 + 508 2 1 0D 1388 + 508 935 00010000D 1389 + 508 2 1 0D 1390 + 508 937 00010000D 1391 + 508 2 1 0D 1392 + 508 939 00010000D 1393 + 508 2 1 0D 1394 + 508 941 00010000D 1395 + 508 2 1 0D 1396 + 508 943 00010000D 1397 + 508 2 1 0D 1398 + 508 945 00010000D 1399 + 508 2 1 0D 1400 + 508 947 00010000D 1401 + 508 2 1 0D 1402 + 508 949 00010000D 1403 + 508 2 1 0D 1404 + 508 951 00010000D 1405 + 508 2 1 0D 1406 + 508 953 00010000D 1407 + 508 2 1 0D 1408 + 508 955 00010000D 1409 + 508 2 1 0D 1410 + 508 957 00010000D 1411 + 508 2 1 0D 1412 + 508 959 00010000D 1413 + 508 2 1 0D 1414 + 508 961 00010000D 1415 + 508 2 1 0D 1416 + 508 963 00010000D 1417 + 508 2 1 0D 1418 + 508 965 00010000D 1419 + 508 2 1 0D 1420 + 508 967 00010000D 1421 + 508 2 1 0D 1422 + 508 969 00010000D 1423 + 508 2 1 0D 1424 + 508 971 00010000D 1425 + 508 2 1 0D 1426 + 508 973 00010000D 1427 + 508 2 1 0D 1428 + 508 975 00010000D 1429 + 508 2 1 0D 1430 + 508 977 00010000D 1431 + 508 2 1 0D 1432 + 508 979 00010000D 1433 + 508 2 1 0D 1434 + 508 981 00010000D 1435 + 508 2 1 0D 1436 + 508 983 00010000D 1437 + 508 2 1 0D 1438 + 508 985 00010000D 1439 + 508 2 1 0D 1440 + 508 987 00010000D 1441 + 508 2 1 0D 1442 + 508 989 00010000D 1443 + 508 2 1 0D 1444 + 508 991 00010000D 1445 + 508 2 1 0D 1446 + 508 993 00010000D 1447 + 508 2 1 0D 1448 + 508 995 00010000D 1449 + 508 2 1 0D 1450 + 508 997 00010000D 1451 + 508 2 1 0D 1452 + 508 999 00010000D 1453 + 508 2 1 0D 1454 + 508 1001 00010000D 1455 + 508 2 1 0D 1456 + 508 1003 00010000D 1457 + 508 2 1 0D 1458 + 508 1005 00010000D 1459 + 508 2 1 0D 1460 + 508 1007 00010000D 1461 + 508 2 1 0D 1462 + 508 1009 00010000D 1463 + 508 2 1 0D 1464 + 508 1011 00010000D 1465 + 508 2 1 0D 1466 + 508 1013 00010000D 1467 + 508 2 1 0D 1468 + 508 1015 00010000D 1469 + 508 2 1 0D 1470 + 508 1017 00010000D 1471 + 508 2 1 0D 1472 + 508 1019 00010000D 1473 + 508 2 1 0D 1474 + 508 1021 00010000D 1475 + 508 2 1 0D 1476 + 508 1023 00010000D 1477 + 508 2 1 0D 1478 + 508 1025 00010000D 1479 + 508 2 1 0D 1480 + 508 1027 00010000D 1481 + 508 2 1 0D 1482 + 508 1029 00010000D 1483 + 508 2 1 0D 1484 + 508 1031 00010000D 1485 + 508 2 1 0D 1486 + 508 1033 00010000D 1487 + 508 2 1 0D 1488 + 508 1035 00010000D 1489 + 508 2 1 0D 1490 + 508 1037 00010000D 1491 + 508 2 1 0D 1492 + 508 1039 00010000D 1493 + 508 2 1 0D 1494 + 508 1041 00010000D 1495 + 508 2 1 0D 1496 + 508 1043 00010000D 1497 + 508 2 1 0D 1498 + 508 1045 00010000D 1499 + 508 2 1 0D 1500 + 508 1047 00010000D 1501 + 508 2 1 0D 1502 + 508 1049 00010000D 1503 + 508 2 1 0D 1504 + 508 1051 00010000D 1505 + 508 2 1 0D 1506 + 508 1053 00010000D 1507 + 508 2 1 0D 1508 + 508 1055 00010000D 1509 + 508 2 1 0D 1510 + 508 1057 00010000D 1511 + 508 2 1 0D 1512 + 508 1059 00010000D 1513 + 508 2 1 0D 1514 + 508 1061 00010000D 1515 + 508 2 1 0D 1516 + 508 1063 00010000D 1517 + 508 2 1 0D 1518 + 508 1065 00010000D 1519 + 508 2 1 0D 1520 + 508 1067 00010000D 1521 + 508 2 1 0D 1522 + 508 1069 00010000D 1523 + 508 2 1 0D 1524 + 508 1071 00010000D 1525 + 508 2 1 0D 1526 + 508 1073 00010000D 1527 + 508 2 1 0D 1528 + 508 1075 00010000D 1529 + 508 2 1 0D 1530 + 508 1077 00010000D 1531 + 508 2 1 0D 1532 + 508 1079 00010000D 1533 + 508 2 1 0D 1534 + 508 1081 00010000D 1535 + 508 2 1 0D 1536 + 508 1083 00010000D 1537 + 508 2 1 0D 1538 + 508 1085 00010000D 1539 + 508 2 1 0D 1540 + 508 1087 00010000D 1541 + 508 2 1 0D 1542 + 508 1089 00010000D 1543 + 508 2 1 0D 1544 + 508 1091 00010000D 1545 + 508 3 1 0D 1546 + 508 1094 00010000D 1547 + 508 3 1 0D 1548 + 508 1097 00010000D 1549 + 508 3 1 0D 1550 + 508 1100 00010000D 1551 + 508 3 1 0D 1552 + 508 1103 00010000D 1553 + 508 3 1 0D 1554 + 508 1106 00010000D 1555 + 508 3 1 0D 1556 + 508 1109 00010000D 1557 + 508 3 1 0D 1558 + 508 1112 00010000D 1559 + 508 3 1 0D 1560 + 508 1115 00010000D 1561 + 508 3 1 0D 1562 + 508 1118 00010000D 1563 + 508 3 1 0D 1564 + 508 1121 00010000D 1565 + 508 3 1 0D 1566 + 508 1124 00010000D 1567 + 508 3 1 0D 1568 + 508 1127 00010000D 1569 + 508 3 1 0D 1570 + 508 1130 00010000D 1571 + 508 3 1 0D 1572 + 508 1133 00010000D 1573 + 508 3 1 0D 1574 + 508 1136 00010000D 1575 + 508 3 1 0D 1576 + 508 1139 00010000D 1577 + 508 3 1 0D 1578 + 508 1142 00010000D 1579 + 508 3 1 0D 1580 + 508 1145 00010000D 1581 + 508 3 1 0D 1582 + 508 1148 00010000D 1583 + 508 3 1 0D 1584 + 508 1151 00010000D 1585 + 508 3 1 0D 1586 + 508 1154 00010000D 1587 + 508 3 1 0D 1588 + 508 1157 00010000D 1589 + 508 3 1 0D 1590 + 508 1160 00010000D 1591 + 508 3 1 0D 1592 + 508 1163 00010000D 1593 + 508 3 1 0D 1594 + 508 1166 00010000D 1595 + 508 1 1 0D 1596 + 508 1167 00010000D 1597 + 508 1 1 0D 1598 + 508 1168 00010000D 1599 + 508 1 1 0D 1600 + 508 1169 00010000D 1601 + 508 1 1 0D 1602 + 508 1170 00010000D 1603 + 508 3 1 0D 1604 + 508 1173 00010000D 1605 + 508 3 1 0D 1606 + 508 1176 00010000D 1607 + 508 3 1 0D 1608 + 508 1179 00010000D 1609 + 508 3 1 0D 1610 + 508 1182 00010000D 1611 + 508 3 1 0D 1612 + 508 1185 00010000D 1613 + 508 3 1 0D 1614 + 508 1188 00010000D 1615 + 508 3 1 0D 1616 + 508 1191 00010000D 1617 + 508 3 1 0D 1618 + 508 1194 00010000D 1619 + 508 3 1 0D 1620 + 508 1197 00010000D 1621 + 508 3 1 0D 1622 + 508 1200 00010000D 1623 + 508 3 1 0D 1624 + 508 1203 00010000D 1625 + 508 3 1 0D 1626 + 508 1206 00010000D 1627 + 508 3 1 0D 1628 + 508 1209 00010000D 1629 + 508 3 1 0D 1630 + 508 1212 00010000D 1631 + 508 3 1 0D 1632 + 508 1215 00010000D 1633 + 508 3 1 0D 1634 + 508 1218 00010000D 1635 + 508 3 1 0D 1636 + 508 1221 00010000D 1637 + 508 3 1 0D 1638 + 508 1224 00010000D 1639 + 508 3 1 0D 1640 + 508 1227 00010000D 1641 + 508 3 1 0D 1642 + 508 1230 00010000D 1643 + 508 3 1 0D 1644 + 508 1233 00010000D 1645 + 508 3 1 0D 1646 + 508 1236 00010000D 1647 + 508 3 1 0D 1648 + 508 1239 00010000D 1649 + 508 3 1 0D 1650 + 508 1242 00010000D 1651 + 508 3 1 0D 1652 + 508 1245 00010000D 1653 + 508 1 1 0D 1654 + 508 1246 00010000D 1655 + 508 1 1 0D 1656 + 508 1247 00010000D 1657 + 508 1 1 0D 1658 + 508 1248 00010000D 1659 + 508 1 1 0D 1660 + 508 1249 00010000D 1661 + 508 1 1 0D 1662 + 508 1250 00010000D 1663 + 508 1 1 0D 1664 + 508 1251 00010000D 1665 + 508 1 1 0D 1666 + 508 1252 00010000D 1667 + 508 1 1 0D 1668 + 508 1253 00010000D 1669 + 508 1 1 0D 1670 + 508 1254 00010000D 1671 + 508 1 1 0D 1672 + 508 1255 00010000D 1673 + 508 2 1 0D 1674 + 508 1257 00010000D 1675 + 508 1 1 0D 1676 + 508 1258 00010000D 1677 + 508 1 1 0D 1678 + 508 1259 00010000D 1679 + 508 1 1 0D 1680 + 508 1260 00010000D 1681 + 508 1 1 0D 1682 + 508 1261 00010000D 1683 + 508 1 1 0D 1684 + 508 1262 00010000D 1685 + 508 1 1 0D 1686 + 508 1263 00010000D 1687 + 508 1 1 0D 1688 + 508 1264 00010000D 1689 + 508 1 1 0D 1690 + 508 1265 00010000D 1691 + 508 2 1 0D 1692 + 508 1267 00010000D 1693 + 508 1 1 0D 1694 + 508 1268 00010000D 1695 + 508 1 1 0D 1696 + 508 1269 00010000D 1697 + 508 1 1 0D 1698 + 508 1270 00010000D 1699 + 508 1 1 0D 1700 + 508 1271 00010000D 1701 + 508 1 1 0D 1702 + 508 1272 00010000D 1703 + 508 1 1 0D 1704 + 508 1273 00010000D 1705 + 508 1 1 0D 1706 + 508 1274 00010000D 1707 + 508 1 1 0D 1708 + 508 1275 00010000D 1709 + 508 1 1 0D 1710 + 508 1276 00010000D 1711 + 508 1 1 0D 1712 + 508 1277 00010000D 1713 + 508 1 1 0D 1714 + 508 1278 00010000D 1715 + 508 1 1 0D 1716 + 508 1279 00010000D 1717 + 508 1 1 0D 1718 + 508 1280 00010000D 1719 + 508 1 1 0D 1720 + 508 1281 00010000D 1721 + 508 2 1 0D 1722 + 508 1283 00010000D 1723 + 508 5 1 0D 1724 + 508 1288 00010000D 1725 + 508 2 1 0D 1726 + 508 1290 00010000D 1727 + 508 1 1 0D 1728 + 508 1291 00010000D 1729 + 508 1 1 0D 1730 + 508 1292 00010000D 1731 + 508 1 1 0D 1732 + 508 1293 00010000D 1733 + 508 1 1 0D 1734 + 508 1294 00010000D 1735 + 508 1 1 0D 1736 + 508 1295 00010000D 1737 + 508 1 1 0D 1738 + 508 1296 00010000D 1739 + 508 2 1 0D 1740 + 508 1298 00010000D 1741 + 508 2 1 0D 1742 + 508 1300 00010000D 1743 + 508 2 1 0D 1744 + 508 1302 00010000D 1745 + 508 2 1 0D 1746 + 508 1304 00010000D 1747 + 508 3 1 0D 1748 + 508 1307 00010000D 1749 + 508 2 1 0D 1750 + 508 1309 00010000D 1751 + 508 2 1 0D 1752 + 508 1311 00010000D 1753 + 508 2 1 0D 1754 + 508 1313 00010000D 1755 + 508 2 1 0D 1756 + 508 1315 00010000D 1757 + 508 2 1 0D 1758 + 508 1317 00010000D 1759 + 508 2 1 0D 1760 + 508 1319 00010000D 1761 + 508 2 1 0D 1762 + 508 1321 00010000D 1763 + 508 2 1 0D 1764 + 508 1323 00010000D 1765 + 508 2 1 0D 1766 + 508 1325 00010000D 1767 + 508 1 1 0D 1768 + 508 1326 00010000D 1769 + 508 2 1 0D 1770 + 508 1328 00010000D 1771 + 508 2 1 0D 1772 + 508 1330 00010000D 1773 + 508 2 1 0D 1774 + 508 1332 00010000D 1775 + 508 2 1 0D 1776 + 508 1334 00010000D 1777 + 508 2 1 0D 1778 + 508 1336 00010000D 1779 + 508 2 1 0D 1780 + 508 1338 00010000D 1781 + 508 3 1 0D 1782 + 508 1341 00010000D 1783 + 508 2 1 0D 1784 + 508 1343 00010000D 1785 + 508 3 1 0D 1786 + 508 1346 00010000D 1787 + 508 3 1 0D 1788 + 508 1349 00010000D 1789 + 508 2 1 0D 1790 + 508 1351 00010000D 1791 + 508 2 1 0D 1792 + 508 1353 00010000D 1793 + 508 2 1 0D 1794 + 508 1355 00010000D 1795 + 508 2 1 0D 1796 + 508 1357 00010000D 1797 + 508 2 1 0D 1798 + 508 1359 00010000D 1799 + 508 2 1 0D 1800 + 508 1361 00010000D 1801 + 508 2 1 0D 1802 + 508 1363 00010000D 1803 + 508 3 1 0D 1804 + 508 1366 00010000D 1805 + 508 2 1 0D 1806 + 508 1368 00010000D 1807 + 508 5 1 0D 1808 + 508 1373 00010000D 1809 + 508 1 1 0D 1810 + 508 1374 00010000D 1811 + 508 1 1 0D 1812 + 508 1375 00010000D 1813 + 508 1 1 0D 1814 + 508 1376 00010000D 1815 + 508 1 1 0D 1816 + 508 1377 00010000D 1817 + 508 1 1 0D 1818 + 508 1378 00010000D 1819 + 508 1 1 0D 1820 + 508 1379 00010000D 1821 + 508 1 1 0D 1822 + 508 1380 00010000D 1823 + 508 2 1 0D 1824 + 508 1382 00010000D 1825 + 508 3 1 0D 1826 + 508 1385 00010000D 1827 + 508 2 1 0D 1828 + 508 1387 00010000D 1829 + 508 2 1 0D 1830 + 508 1389 00010000D 1831 + 508 1 1 0D 1832 + 508 1390 00010000D 1833 + 508 3 1 0D 1834 + 508 1393 00010000D 1835 + 508 4 1 0D 1836 + 508 1397 00010000D 1837 + 508 1 1 0D 1838 + 508 1398 00010000D 1839 + 508 1 1 0D 1840 + 508 1399 00010000D 1841 + 508 1 1 0D 1842 + 508 1400 00010000D 1843 + 508 1 1 0D 1844 + 508 1401 00010000D 1845 + 508 1 1 0D 1846 + 508 1402 00010000D 1847 + 508 1 1 0D 1848 + 508 1403 00010000D 1849 + 508 1 1 0D 1850 + 508 1404 00010000D 1851 + 508 1 1 0D 1852 + 508 1405 00010000D 1853 + 508 1 1 0D 1854 + 508 1406 00010000D 1855 + 508 1 1 0D 1856 + 508 1407 00010000D 1857 + 508 1 1 0D 1858 + 508 1408 00010000D 1859 + 508 1 1 0D 1860 + 508 1409 00010000D 1861 + 508 1 1 0D 1862 + 508 1410 00010000D 1863 + 508 1 1 0D 1864 + 508 1411 00010000D 1865 + 508 1 1 0D 1866 + 508 1412 00010000D 1867 + 508 1 1 0D 1868 + 508 1413 00010000D 1869 + 508 2 1 0D 1870 + 508 1415 00010000D 1871 + 508 2 1 0D 1872 + 508 1417 00010000D 1873 + 508 2 1 0D 1874 + 508 1419 00010000D 1875 + 508 2 1 0D 1876 + 508 1421 00010000D 1877 + 508 2 1 0D 1878 + 508 1423 00010000D 1879 + 508 2 1 0D 1880 + 508 1425 00010000D 1881 + 508 2 1 0D 1882 + 508 1427 00010000D 1883 + 508 2 1 0D 1884 + 508 1429 00010000D 1885 + 508 2 1 0D 1886 + 508 1431 00010000D 1887 + 508 2 1 0D 1888 + 508 1433 00010000D 1889 + 508 2 1 0D 1890 + 508 1435 00010000D 1891 + 508 2 1 0D 1892 + 508 1437 00010000D 1893 + 508 2 1 0D 1894 + 508 1439 00010000D 1895 + 508 2 1 0D 1896 + 508 1441 00010000D 1897 + 508 2 1 0D 1898 + 508 1443 00010000D 1899 + 508 2 1 0D 1900 + 508 1445 00010000D 1901 + 508 2 1 0D 1902 + 508 1447 00010000D 1903 + 508 5 1 0D 1904 + 508 1452 00010000D 1905 + 508 3 1 0D 1906 + 508 1455 00010000D 1907 + 508 5 1 0D 1908 + 508 1460 00010000D 1909 + 508 1 1 0D 1910 + 508 1461 00010000D 1911 + 508 1 1 0D 1912 + 508 1462 00010000D 1913 + 508 1 1 0D 1914 + 508 1463 00010000D 1915 + 508 1 1 0D 1916 + 508 1464 00010000D 1917 + 508 1 1 0D 1918 + 508 1465 00010000D 1919 + 508 1 1 0D 1920 + 508 1466 00010000D 1921 + 508 5 1 0D 1922 + 508 1471 00010000D 1923 + 508 2 1 0D 1924 + 508 1473 00010000D 1925 + 508 2 1 0D 1926 + 508 1475 00010000D 1927 + 508 2 1 0D 1928 + 508 1477 00010000D 1929 + 508 2 1 0D 1930 + 508 1479 00010000D 1931 + 508 2 1 0D 1932 + 508 1481 00010000D 1933 + 508 2 1 0D 1934 + 508 1483 00010000D 1935 + 508 2 1 0D 1936 + 508 1485 00010000D 1937 + 508 1 1 0D 1938 + 508 1486 00010000D 1939 + 508 2 1 0D 1940 + 508 1488 00010000D 1941 + 508 2 1 0D 1942 + 508 1490 00010000D 1943 + 508 2 1 0D 1944 + 508 1492 00010000D 1945 + 508 2 1 0D 1946 + 508 1494 00010000D 1947 + 508 2 1 0D 1948 + 508 1496 00010000D 1949 + 508 2 1 0D 1950 + 508 1498 00010000D 1951 + 508 2 1 0D 1952 + 508 1500 00010000D 1953 + 508 2 1 0D 1954 + 508 1502 00010000D 1955 + 508 2 1 0D 1956 + 508 1504 00010000D 1957 + 508 2 1 0D 1958 + 508 1506 00010000D 1959 + 508 2 1 0D 1960 + 508 1508 00010000D 1961 + 508 2 1 0D 1962 + 508 1510 00010000D 1963 + 508 2 1 0D 1964 + 508 1512 00010000D 1965 + 508 1 1 0D 1966 + 508 1513 00010000D 1967 + 508 2 1 0D 1968 + 508 1515 00010000D 1969 + 508 3 1 0D 1970 + 508 1518 00010000D 1971 + 508 1 1 0D 1972 + 508 1519 00010000D 1973 + 508 2 1 0D 1974 + 508 1521 00010000D 1975 + 508 1 1 0D 1976 + 508 1522 00010000D 1977 + 508 1 1 0D 1978 + 508 1523 00010000D 1979 + 508 1 1 0D 1980 + 508 1524 00010000D 1981 + 508 1 1 0D 1982 + 508 1525 00010000D 1983 + 508 2 1 0D 1984 + 508 1527 00010000D 1985 + 508 1 1 0D 1986 + 508 1528 00010000D 1987 + 508 2 1 0D 1988 + 508 1530 00010000D 1989 + 508 2 1 0D 1990 + 508 1532 00010000D 1991 + 508 2 1 0D 1992 + 508 1534 00010000D 1993 + 508 2 1 0D 1994 + 508 1536 00010000D 1995 + 508 2 1 0D 1996 + 508 1538 00010000D 1997 + 508 2 1 0D 1998 + 508 1540 00010000D 1999 + 508 2 1 0D 2000 + 508 1542 00010000D 2001 + 508 2 1 0D 2002 + 508 1544 00010000D 2003 + 508 3 1 0D 2004 + 508 1547 00010000D 2005 + 508 2 1 0D 2006 + 508 1549 00010000D 2007 + 508 3 1 0D 2008 + 508 1552 00010000D 2009 + 508 3 1 0D 2010 + 508 1555 00010000D 2011 + 508 2 1 0D 2012 + 508 1557 00010000D 2013 + 508 2 1 0D 2014 + 508 1559 00010000D 2015 + 508 2 1 0D 2016 + 508 1561 00010000D 2017 + 508 2 1 0D 2018 + 508 1563 00010000D 2019 + 508 2 1 0D 2020 + 508 1565 00010000D 2021 + 508 2 1 0D 2022 + 508 1567 00010000D 2023 + 508 1 1 0D 2024 + 508 1568 00010000D 2025 + 508 1 1 0D 2026 + 126 1569 00010000D 2027 + 126 0 13 0 0D 2028 + 126 1582 00010000D 2029 + 126 0 4 0 0D 2030 + 126 1586 00010000D 2031 + 126 0 13 0 0D 2032 + 126 1599 00010000D 2033 + 126 0 3 0 0D 2034 + 126 1602 00010000D 2035 + 126 0 13 0 0D 2036 + 126 1615 00010000D 2037 + 126 0 13 0 0D 2038 + 126 1628 00010000D 2039 + 126 0 13 0 0D 2040 + 126 1641 00010000D 2041 + 126 0 4 0 0D 2042 + 126 1645 00010000D 2043 + 126 0 13 0 0D 2044 + 126 1658 00010000D 2045 + 126 0 3 0 0D 2046 + 126 1661 00010000D 2047 + 126 0 13 0 0D 2048 + 126 1674 00010000D 2049 + 126 0 13 0 0D 2050 + 126 1687 00010000D 2051 + 126 0 11 0 0D 2052 + 126 1698 00010000D 2053 + 126 0 3 0 0D 2054 + 126 1701 00010000D 2055 + 126 0 11 0 0D 2056 + 126 1712 00010000D 2057 + 126 0 3 0 0D 2058 + 126 1715 00010000D 2059 + 126 0 11 0 0D 2060 + 126 1726 00010000D 2061 + 126 0 11 0 0D 2062 + 126 1737 00010000D 2063 + 126 0 11 0 0D 2064 + 126 1748 00010000D 2065 + 126 0 3 0 0D 2066 + 126 1751 00010000D 2067 + 126 0 11 0 0D 2068 + 126 1762 00010000D 2069 + 126 0 3 0 0D 2070 + 126 1765 00010000D 2071 + 126 0 11 0 0D 2072 + 126 1776 00010000D 2073 + 126 0 11 0 0D 2074 + 126 1787 00010000D 2075 + 126 0 4 0 0D 2076 + 126 1791 00010000D 2077 + 126 0 3 0 0D 2078 + 126 1794 00010000D 2079 + 126 0 4 0 0D 2080 + 126 1798 00010000D 2081 + 126 0 3 0 0D 2082 + 126 1801 00010000D 2083 + 126 0 4 0 0D 2084 + 126 1805 00010000D 2085 + 126 0 4 0 0D 2086 + 126 1809 00010000D 2087 + 126 0 3 0 0D 2088 + 126 1812 00010000D 2089 + 126 0 4 0 0D 2090 + 126 1816 00010000D 2091 + 126 0 4 0 0D 2092 + 126 1820 00010000D 2093 + 126 0 3 0 0D 2094 + 126 1823 00010000D 2095 + 126 0 4 0 0D 2096 + 126 1827 00010000D 2097 + 126 0 4 0 0D 2098 + 126 1831 00010000D 2099 + 126 0 3 0 0D 2100 + 126 1834 00010000D 2101 + 126 0 4 0 0D 2102 + 126 1838 00010000D 2103 + 126 0 4 0 0D 2104 + 126 1842 00010000D 2105 + 126 0 3 0 0D 2106 + 126 1845 00010000D 2107 + 126 0 4 0 0D 2108 + 126 1849 00010000D 2109 + 126 0 4 0 0D 2110 + 126 1853 00010000D 2111 + 126 0 3 0 0D 2112 + 126 1856 00010000D 2113 + 126 0 4 0 0D 2114 + 126 1860 00010000D 2115 + 126 0 4 0 0D 2116 + 126 1864 00010000D 2117 + 126 0 3 0 0D 2118 + 126 1867 00010000D 2119 + 126 0 4 0 0D 2120 + 126 1871 00010000D 2121 + 126 0 4 0 0D 2122 + 126 1875 00010000D 2123 + 126 0 3 0 0D 2124 + 126 1878 00010000D 2125 + 126 0 4 0 0D 2126 + 126 1882 00010000D 2127 + 126 0 4 0 0D 2128 + 126 1886 00010000D 2129 + 126 0 3 0 0D 2130 + 126 1889 00010000D 2131 + 126 0 4 0 0D 2132 + 126 1893 00010000D 2133 + 126 0 4 0 0D 2134 + 126 1897 00010000D 2135 + 126 0 3 0 0D 2136 + 126 1900 00010000D 2137 + 126 0 4 0 0D 2138 + 126 1904 00010000D 2139 + 126 0 4 0 0D 2140 + 126 1908 00010000D 2141 + 126 0 3 0 0D 2142 + 126 1911 00010000D 2143 + 126 0 4 0 0D 2144 + 126 1915 00010000D 2145 + 126 0 4 0 0D 2146 + 126 1919 00010000D 2147 + 126 0 4 0 0D 2148 + 126 1923 00010000D 2149 + 126 0 3 0 0D 2150 + 126 1926 00010000D 2151 + 126 0 4 0 0D 2152 + 126 1930 00010000D 2153 + 126 0 3 0 0D 2154 + 126 1933 00010000D 2155 + 126 0 4 0 0D 2156 + 126 1937 00010000D 2157 + 126 0 4 0 0D 2158 + 126 1941 00010000D 2159 + 126 0 3 0 0D 2160 + 126 1944 00010000D 2161 + 126 0 4 0 0D 2162 + 126 1948 00010000D 2163 + 126 0 4 0 0D 2164 + 126 1952 00010000D 2165 + 126 0 3 0 0D 2166 + 126 1955 00010000D 2167 + 126 0 4 0 0D 2168 + 126 1959 00010000D 2169 + 126 0 4 0 0D 2170 + 126 1963 00010000D 2171 + 126 0 3 0 0D 2172 + 126 1966 00010000D 2173 + 126 0 4 0 0D 2174 + 126 1970 00010000D 2175 + 126 0 4 0 0D 2176 + 126 1974 00010000D 2177 + 126 0 3 0 0D 2178 + 126 1977 00010000D 2179 + 126 0 4 0 0D 2180 + 126 1981 00010000D 2181 + 126 0 4 0 0D 2182 + 126 1985 00010000D 2183 + 126 0 3 0 0D 2184 + 126 1988 00010000D 2185 + 126 0 4 0 0D 2186 + 126 1992 00010000D 2187 + 126 0 4 0 0D 2188 + 126 1996 00010000D 2189 + 126 0 3 0 0D 2190 + 126 1999 00010000D 2191 + 126 0 4 0 0D 2192 + 126 2003 00010000D 2193 + 126 0 4 0 0D 2194 + 126 2007 00010000D 2195 + 126 0 3 0 0D 2196 + 126 2010 00010000D 2197 + 126 0 4 0 0D 2198 + 126 2014 00010000D 2199 + 126 0 4 0 0D 2200 + 126 2018 00010000D 2201 + 126 0 3 0 0D 2202 + 126 2021 00010000D 2203 + 126 0 4 0 0D 2204 + 126 2025 00010000D 2205 + 126 0 3 0 0D 2206 + 126 2028 00010000D 2207 + 126 0 3 0 0D 2208 + 126 2031 00010000D 2209 + 126 0 4 0 0D 2210 + 126 2035 00010000D 2211 + 126 0 4 0 0D 2212 + 126 2039 00010000D 2213 + 126 0 3 0 0D 2214 + 126 2042 00010000D 2215 + 126 0 4 0 0D 2216 + 126 2046 00010000D 2217 + 126 0 4 0 0D 2218 + 126 2050 00010000D 2219 + 126 0 4 0 0D 2220 + 126 2054 00010000D 2221 + 126 0 3 0 0D 2222 + 126 2057 00010000D 2223 + 126 0 3 0 0D 2224 + 126 2060 00010000D 2225 + 126 0 3 0 0D 2226 + 126 2063 00010000D 2227 + 126 0 4 0 0D 2228 + 126 2067 00010000D 2229 + 126 0 4 0 0D 2230 + 126 2071 00010000D 2231 + 126 0 3 0 0D 2232 + 126 2074 00010000D 2233 + 126 0 4 0 0D 2234 + 126 2078 00010000D 2235 + 126 0 4 0 0D 2236 + 126 2082 00010000D 2237 + 126 0 3 0 0D 2238 + 126 2085 00010000D 2239 + 126 0 4 0 0D 2240 + 126 2089 00010000D 2241 + 126 0 3 0 0D 2242 + 126 2092 00010000D 2243 + 126 0 3 0 0D 2244 + 126 2095 00010000D 2245 + 126 0 4 0 0D 2246 + 126 2099 00010000D 2247 + 126 0 4 0 0D 2248 + 126 2103 00010000D 2249 + 126 0 3 0 0D 2250 + 126 2106 00010000D 2251 + 126 0 4 0 0D 2252 + 126 2110 00010000D 2253 + 126 0 3 0 0D 2254 + 126 2113 00010000D 2255 + 126 0 3 0 0D 2256 + 126 2116 00010000D 2257 + 126 0 4 0 0D 2258 + 126 2120 00010000D 2259 + 126 0 3 0 0D 2260 + 126 2123 00010000D 2261 + 126 0 3 0 0D 2262 + 126 2126 00010000D 2263 + 126 0 4 0 0D 2264 + 126 2130 00010000D 2265 + 126 0 4 0 0D 2266 + 126 2134 00010000D 2267 + 126 0 3 0 0D 2268 + 126 2137 00010000D 2269 + 126 0 4 0 0D 2270 + 126 2141 00010000D 2271 + 126 0 4 0 0D 2272 + 126 2145 00010000D 2273 + 126 0 3 0 0D 2274 + 126 2148 00010000D 2275 + 126 0 4 0 0D 2276 + 126 2152 00010000D 2277 + 126 0 3 0 0D 2278 + 126 2155 00010000D 2279 + 126 0 3 0 0D 2280 + 126 2158 00010000D 2281 + 126 0 4 0 0D 2282 + 126 2162 00010000D 2283 + 126 0 4 0 0D 2284 + 126 2166 00010000D 2285 + 126 0 3 0 0D 2286 + 126 2169 00010000D 2287 + 126 0 4 0 0D 2288 + 126 2173 00010000D 2289 + 126 0 4 0 0D 2290 + 126 2177 00010000D 2291 + 126 0 3 0 0D 2292 + 126 2180 00010000D 2293 + 126 0 3 0 0D 2294 + 126 2183 00010000D 2295 + 126 0 3 0 0D 2296 + 126 2186 00010000D 2297 + 126 0 3 0 0D 2298 + 126 2189 00010000D 2299 + 126 0 4 0 0D 2300 + 126 2193 00010000D 2301 + 126 0 4 0 0D 2302 + 126 2197 00010000D 2303 + 126 0 3 0 0D 2304 + 126 2200 00010000D 2305 + 126 0 4 0 0D 2306 + 126 2204 00010000D 2307 + 126 0 4 0 0D 2308 + 126 2208 00010000D 2309 + 126 0 3 0 0D 2310 + 126 2211 00010000D 2311 + 126 0 4 0 0D 2312 + 126 2215 00010000D 2313 + 126 0 3 0 0D 2314 + 126 2218 00010000D 2315 + 126 0 3 0 0D 2316 + 126 2221 00010000D 2317 + 126 0 4 0 0D 2318 + 126 2225 00010000D 2319 + 126 0 4 0 0D 2320 + 126 2229 00010000D 2321 + 126 0 3 0 0D 2322 + 126 2232 00010000D 2323 + 126 0 4 0 0D 2324 + 126 2236 00010000D 2325 + 126 0 3 0 0D 2326 + 126 2239 00010000D 2327 + 126 0 3 0 0D 2328 + 126 2242 00010000D 2329 + 126 0 4 0 0D 2330 + 126 2246 00010000D 2331 + 126 0 3 0 0D 2332 + 126 2249 00010000D 2333 + 126 0 3 0 0D 2334 + 126 2252 00010000D 2335 + 126 0 3 0 0D 2336 + 126 2255 00010000D 2337 + 126 0 4 0 0D 2338 + 126 2259 00010000D 2339 + 126 0 3 0 0D 2340 + 126 2262 00010000D 2341 + 126 0 3 0 0D 2342 + 126 2265 00010000D 2343 + 126 0 4 0 0D 2344 + 126 2269 00010000D 2345 + 126 0 3 0 0D 2346 + 126 2272 00010000D 2347 + 126 0 3 0 0D 2348 + 126 2275 00010000D 2349 + 126 0 3 0 0D 2350 + 126 2278 00010000D 2351 + 126 0 3 0 0D 2352 + 126 2281 00010000D 2353 + 126 0 3 0 0D 2354 + 126 2284 00010000D 2355 + 126 0 4 0 0D 2356 + 126 2288 00010000D 2357 + 126 0 3 0 0D 2358 + 126 2291 00010000D 2359 + 126 0 3 0 0D 2360 + 126 2294 00010000D 2361 + 126 0 4 0 0D 2362 + 126 2298 00010000D 2363 + 126 0 3 0 0D 2364 + 126 2301 00010000D 2365 + 126 0 3 0 0D 2366 + 126 2304 00010000D 2367 + 126 0 3 0 0D 2368 + 126 2307 00010000D 2369 + 126 0 3 0 0D 2370 + 126 2310 00010000D 2371 + 126 0 3 0 0D 2372 + 126 2313 00010000D 2373 + 126 0 4 0 0D 2374 + 126 2317 00010000D 2375 + 126 0 3 0 0D 2376 + 126 2320 00010000D 2377 + 126 0 3 0 0D 2378 + 126 2323 00010000D 2379 + 126 0 4 0 0D 2380 + 126 2327 00010000D 2381 + 126 0 3 0 0D 2382 + 126 2330 00010000D 2383 + 126 0 3 0 0D 2384 + 126 2333 00010000D 2385 + 126 0 3 0 0D 2386 + 126 2336 00010000D 2387 + 126 0 3 0 0D 2388 + 126 2339 00010000D 2389 + 126 0 3 0 0D 2390 + 126 2342 00010000D 2391 + 126 0 4 0 0D 2392 + 126 2346 00010000D 2393 + 126 0 3 0 0D 2394 + 126 2349 00010000D 2395 + 126 0 3 0 0D 2396 + 126 2352 00010000D 2397 + 126 0 3 0 0D 2398 + 126 2355 00010000D 2399 + 126 0 3 0 0D 2400 + 126 2358 00010000D 2401 + 126 0 3 0 0D 2402 + 126 2361 00010000D 2403 + 126 0 3 0 0D 2404 + 126 2364 00010000D 2405 + 126 0 3 0 0D 2406 + 126 2367 00010000D 2407 + 126 0 3 0 0D 2408 + 126 2370 00010000D 2409 + 126 0 4 0 0D 2410 + 126 2374 00010000D 2411 + 126 0 3 0 0D 2412 + 126 2377 00010000D 2413 + 126 0 3 0 0D 2414 + 126 2380 00010000D 2415 + 126 0 4 0 0D 2416 + 126 2384 00010000D 2417 + 126 0 3 0 0D 2418 + 126 2387 00010000D 2419 + 126 0 3 0 0D 2420 + 126 2390 00010000D 2421 + 126 0 3 0 0D 2422 + 126 2393 00010000D 2423 + 126 0 3 0 0D 2424 + 126 2396 00010000D 2425 + 126 0 3 0 0D 2426 + 126 2399 00010000D 2427 + 126 0 4 0 0D 2428 + 126 2403 00010000D 2429 + 126 0 3 0 0D 2430 + 126 2406 00010000D 2431 + 126 0 3 0 0D 2432 + 126 2409 00010000D 2433 + 126 0 4 0 0D 2434 + 126 2413 00010000D 2435 + 126 0 3 0 0D 2436 + 126 2416 00010000D 2437 + 126 0 3 0 0D 2438 + 126 2419 00010000D 2439 + 126 0 3 0 0D 2440 + 126 2422 00010000D 2441 + 126 0 3 0 0D 2442 + 126 2425 00010000D 2443 + 126 0 3 0 0D 2444 + 126 2428 00010000D 2445 + 126 0 4 0 0D 2446 + 126 2432 00010000D 2447 + 126 0 3 0 0D 2448 + 126 2435 00010000D 2449 + 126 0 3 0 0D 2450 + 126 2438 00010000D 2451 + 126 0 4 0 0D 2452 + 126 2442 00010000D 2453 + 126 0 3 0 0D 2454 + 126 2445 00010000D 2455 + 126 0 3 0 0D 2456 + 126 2448 00010000D 2457 + 126 0 3 0 0D 2458 + 126 2451 00010000D 2459 + 126 0 3 0 0D 2460 + 126 2454 00010000D 2461 + 126 0 3 0 0D 2462 + 126 2457 00010000D 2463 + 126 0 4 0 0D 2464 + 126 2461 00010000D 2465 + 126 0 3 0 0D 2466 + 126 2464 00010000D 2467 + 126 0 3 0 0D 2468 + 126 2467 00010000D 2469 + 126 0 3 0 0D 2470 + 126 2470 00010000D 2471 + 126 0 3 0 0D 2472 + 126 2473 00010000D 2473 + 126 0 3 0 0D 2474 + 126 2476 00010000D 2475 + 126 0 4 0 0D 2476 + 126 2480 00010000D 2477 + 126 0 3 0 0D 2478 + 126 2483 00010000D 2479 + 126 0 3 0 0D 2480 + 126 2486 00010000D 2481 + 126 0 4 0 0D 2482 + 126 2490 00010000D 2483 + 126 0 3 0 0D 2484 + 126 2493 00010000D 2485 + 126 0 3 0 0D 2486 + 126 2496 00010000D 2487 + 126 0 4 0 0D 2488 + 126 2500 00010000D 2489 + 126 0 3 0 0D 2490 + 126 2503 00010000D 2491 + 126 0 3 0 0D 2492 + 126 2506 00010000D 2493 + 126 0 3 0 0D 2494 + 126 2509 00010000D 2495 + 126 0 3 0 0D 2496 + 126 2512 00010000D 2497 + 126 0 3 0 0D 2498 + 126 2515 00010000D 2499 + 126 0 4 0 0D 2500 + 126 2519 00010000D 2501 + 126 0 3 0 0D 2502 + 126 2522 00010000D 2503 + 126 0 3 0 0D 2504 + 126 2525 00010000D 2505 + 126 0 4 0 0D 2506 + 126 2529 00010000D 2507 + 126 0 4 0 0D 2508 + 126 2533 00010000D 2509 + 126 0 3 0 0D 2510 + 126 2536 00010000D 2511 + 126 0 4 0 0D 2512 + 126 2540 00010000D 2513 + 126 0 3 0 0D 2514 + 126 2543 00010000D 2515 + 126 0 4 0 0D 2516 + 126 2547 00010000D 2517 + 126 0 4 0 0D 2518 + 126 2551 00010000D 2519 + 126 0 3 0 0D 2520 + 126 2554 00010000D 2521 + 126 0 4 0 0D 2522 + 126 2558 00010000D 2523 + 126 0 4 0 0D 2524 + 126 2562 00010000D 2525 + 126 0 3 0 0D 2526 + 126 2565 00010000D 2527 + 126 0 4 0 0D 2528 + 126 2569 00010000D 2529 + 126 0 4 0 0D 2530 + 126 2573 00010000D 2531 + 126 0 3 0 0D 2532 + 126 2576 00010000D 2533 + 126 0 4 0 0D 2534 + 126 2580 00010000D 2535 + 126 0 4 0 0D 2536 + 126 2584 00010000D 2537 + 126 0 3 0 0D 2538 + 126 2587 00010000D 2539 + 126 0 4 0 0D 2540 + 126 2591 00010000D 2541 + 126 0 4 0 0D 2542 + 126 2595 00010000D 2543 + 126 0 3 0 0D 2544 + 126 2598 00010000D 2545 + 126 0 4 0 0D 2546 + 126 2602 00010000D 2547 + 126 0 4 0 0D 2548 + 126 2606 00010000D 2549 + 126 0 3 0 0D 2550 + 126 2609 00010000D 2551 + 126 0 4 0 0D 2552 + 126 2613 00010000D 2553 + 126 0 4 0 0D 2554 + 126 2617 00010000D 2555 + 126 0 3 0 0D 2556 + 126 2620 00010000D 2557 + 126 0 4 0 0D 2558 + 126 2624 00010000D 2559 + 126 0 4 0 0D 2560 + 126 2628 00010000D 2561 + 126 0 3 0 0D 2562 + 126 2631 00010000D 2563 + 126 0 4 0 0D 2564 + 126 2635 00010000D 2565 + 126 0 4 0 0D 2566 + 126 2639 00010000D 2567 + 126 0 3 0 0D 2568 + 126 2642 00010000D 2569 + 126 0 4 0 0D 2570 + 126 2646 00010000D 2571 + 126 0 4 0 0D 2572 + 126 2650 00010000D 2573 + 126 0 3 0 0D 2574 + 126 2653 00010000D 2575 + 126 0 4 0 0D 2576 + 126 2657 00010000D 2577 + 126 0 4 0 0D 2578 + 126 2661 00010000D 2579 + 126 0 4 0 0D 2580 + 126 2665 00010000D 2581 + 126 0 3 0 0D 2582 + 126 2668 00010000D 2583 + 126 0 4 0 0D 2584 + 126 2672 00010000D 2585 + 126 0 3 0 0D 2586 + 126 2675 00010000D 2587 + 126 0 4 0 0D 2588 + 126 2679 00010000D 2589 + 126 0 4 0 0D 2590 + 126 2683 00010000D 2591 + 126 0 3 0 0D 2592 + 126 2686 00010000D 2593 + 126 0 4 0 0D 2594 + 126 2690 00010000D 2595 + 126 0 4 0 0D 2596 + 126 2694 00010000D 2597 + 126 0 3 0 0D 2598 + 126 2697 00010000D 2599 + 126 0 4 0 0D 2600 + 126 2701 00010000D 2601 + 126 0 4 0 0D 2602 + 126 2705 00010000D 2603 + 126 0 3 0 0D 2604 + 126 2708 00010000D 2605 + 126 0 4 0 0D 2606 + 126 2712 00010000D 2607 + 126 0 4 0 0D 2608 + 126 2716 00010000D 2609 + 126 0 3 0 0D 2610 + 126 2719 00010000D 2611 + 126 0 4 0 0D 2612 + 126 2723 00010000D 2613 + 126 0 4 0 0D 2614 + 126 2727 00010000D 2615 + 126 0 3 0 0D 2616 + 126 2730 00010000D 2617 + 126 0 4 0 0D 2618 + 126 2734 00010000D 2619 + 126 0 4 0 0D 2620 + 126 2738 00010000D 2621 + 126 0 3 0 0D 2622 + 126 2741 00010000D 2623 + 126 0 4 0 0D 2624 + 126 2745 00010000D 2625 + 126 0 4 0 0D 2626 + 126 2749 00010000D 2627 + 126 0 3 0 0D 2628 + 126 2752 00010000D 2629 + 126 0 4 0 0D 2630 + 126 2756 00010000D 2631 + 126 0 4 0 0D 2632 + 126 2760 00010000D 2633 + 126 0 3 0 0D 2634 + 126 2763 00010000D 2635 + 126 0 4 0 0D 2636 + 126 2767 00010000D 2637 + 126 0 3 0 0D 2638 + 126 2770 00010000D 2639 + 126 0 3 0 0D 2640 + 126 2773 00010000D 2641 + 126 0 4 0 0D 2642 + 126 2777 00010000D 2643 + 126 0 4 0 0D 2644 + 126 2781 00010000D 2645 + 126 0 3 0 0D 2646 + 126 2784 00010000D 2647 + 126 0 4 0 0D 2648 + 126 2788 00010000D 2649 + 126 0 4 0 0D 2650 + 126 2792 00010000D 2651 + 126 0 4 0 0D 2652 + 126 2796 00010000D 2653 + 126 0 3 0 0D 2654 + 126 2799 00010000D 2655 + 126 0 3 0 0D 2656 + 126 2802 00010000D 2657 + 126 0 3 0 0D 2658 + 126 2805 00010000D 2659 + 126 0 4 0 0D 2660 + 126 2809 00010000D 2661 + 126 0 4 0 0D 2662 + 126 2813 00010000D 2663 + 126 0 3 0 0D 2664 + 126 2816 00010000D 2665 + 126 0 4 0 0D 2666 + 126 2820 00010000D 2667 + 126 0 4 0 0D 2668 + 126 2824 00010000D 2669 + 126 0 3 0 0D 2670 + 126 2827 00010000D 2671 + 126 0 4 0 0D 2672 + 126 2831 00010000D 2673 + 126 0 3 0 0D 2674 + 126 2834 00010000D 2675 + 126 0 3 0 0D 2676 + 126 2837 00010000D 2677 + 126 0 4 0 0D 2678 + 126 2841 00010000D 2679 + 126 0 4 0 0D 2680 + 126 2845 00010000D 2681 + 126 0 3 0 0D 2682 + 126 2848 00010000D 2683 + 126 0 4 0 0D 2684 + 126 2852 00010000D 2685 + 126 0 4 0 0D 2686 + 126 2856 00010000D 2687 + 126 0 3 0 0D 2688 + 126 2859 00010000D 2689 + 126 0 4 0 0D 2690 + 126 2863 00010000D 2691 + 126 0 3 0 0D 2692 + 126 2866 00010000D 2693 + 126 0 3 0 0D 2694 + 126 2869 00010000D 2695 + 126 0 4 0 0D 2696 + 126 2873 00010000D 2697 + 126 0 4 0 0D 2698 + 126 2877 00010000D 2699 + 126 0 3 0 0D 2700 + 126 2880 00010000D 2701 + 126 0 4 0 0D 2702 + 126 2884 00010000D 2703 + 126 0 4 0 0D 2704 + 126 2888 00010000D 2705 + 126 0 3 0 0D 2706 + 126 2891 00010000D 2707 + 126 0 4 0 0D 2708 + 126 2895 00010000D 2709 + 126 0 3 0 0D 2710 + 126 2898 00010000D 2711 + 126 0 3 0 0D 2712 + 126 2901 00010000D 2713 + 126 0 4 0 0D 2714 + 126 2905 00010000D 2715 + 126 0 4 0 0D 2716 + 126 2909 00010000D 2717 + 126 0 3 0 0D 2718 + 126 2912 00010000D 2719 + 126 0 4 0 0D 2720 + 126 2916 00010000D 2721 + 126 0 4 0 0D 2722 + 126 2920 00010000D 2723 + 126 0 3 0 0D 2724 + 126 2923 00010000D 2725 + 126 0 3 0 0D 2726 + 126 2926 00010000D 2727 + 126 0 3 0 0D 2728 + 126 2929 00010000D 2729 + 126 0 3 0 0D 2730 + 126 2932 00010000D 2731 + 126 0 4 0 0D 2732 + 126 2936 00010000D 2733 + 126 0 4 0 0D 2734 + 126 2940 00010000D 2735 + 126 0 3 0 0D 2736 + 126 2943 00010000D 2737 + 126 0 4 0 0D 2738 + 126 2947 00010000D 2739 + 126 0 4 0 0D 2740 + 126 2951 00010000D 2741 + 126 0 3 0 0D 2742 + 126 2954 00010000D 2743 + 126 0 4 0 0D 2744 + 126 2958 00010000D 2745 + 126 0 3 0 0D 2746 + 126 2961 00010000D 2747 + 126 0 3 0 0D 2748 + 126 2964 00010000D 2749 + 126 0 4 0 0D 2750 + 126 2968 00010000D 2751 + 126 0 4 0 0D 2752 + 126 2972 00010000D 2753 + 126 0 3 0 0D 2754 + 126 2975 00010000D 2755 + 126 0 4 0 0D 2756 + 126 2979 00010000D 2757 + 126 0 4 0 0D 2758 + 126 2983 00010000D 2759 + 126 0 3 0 0D 2760 + 126 2986 00010000D 2761 + 126 0 4 0 0D 2762 + 126 2990 00010000D 2763 + 126 0 3 0 0D 2764 + 126 2993 00010000D 2765 + 126 0 3 0 0D 2766 + 126 2996 00010000D 2767 + 126 0 3 0 0D 2768 + 126 2999 00010000D 2769 + 126 0 4 0 0D 2770 + 126 3003 00010000D 2771 + 126 0 3 0 0D 2772 + 126 3006 00010000D 2773 + 126 0 3 0 0D 2774 + 126 3009 00010000D 2775 + 126 0 4 0 0D 2776 + 126 3013 00010000D 2777 + 126 0 3 0 0D 2778 + 126 3016 00010000D 2779 + 126 0 3 0 0D 2780 + 126 3019 00010000D 2781 + 126 0 3 0 0D 2782 + 126 3022 00010000D 2783 + 126 0 3 0 0D 2784 + 126 3025 00010000D 2785 + 126 0 3 0 0D 2786 + 126 3028 00010000D 2787 + 126 0 4 0 0D 2788 + 126 3032 00010000D 2789 + 126 0 3 0 0D 2790 + 126 3035 00010000D 2791 + 126 0 3 0 0D 2792 + 126 3038 00010000D 2793 + 126 0 4 0 0D 2794 + 126 3042 00010000D 2795 + 126 0 3 0 0D 2796 + 126 3045 00010000D 2797 + 126 0 3 0 0D 2798 + 126 3048 00010000D 2799 + 126 0 3 0 0D 2800 + 126 3051 00010000D 2801 + 126 0 3 0 0D 2802 + 126 3054 00010000D 2803 + 126 0 3 0 0D 2804 + 126 3057 00010000D 2805 + 126 0 4 0 0D 2806 + 126 3061 00010000D 2807 + 126 0 3 0 0D 2808 + 126 3064 00010000D 2809 + 126 0 3 0 0D 2810 + 126 3067 00010000D 2811 + 126 0 4 0 0D 2812 + 126 3071 00010000D 2813 + 126 0 3 0 0D 2814 + 126 3074 00010000D 2815 + 126 0 3 0 0D 2816 + 126 3077 00010000D 2817 + 126 0 3 0 0D 2818 + 126 3080 00010000D 2819 + 126 0 3 0 0D 2820 + 126 3083 00010000D 2821 + 126 0 3 0 0D 2822 + 126 3086 00010000D 2823 + 126 0 4 0 0D 2824 + 126 3090 00010000D 2825 + 126 0 3 0 0D 2826 + 126 3093 00010000D 2827 + 126 0 3 0 0D 2828 + 126 3096 00010000D 2829 + 126 0 4 0 0D 2830 + 126 3100 00010000D 2831 + 126 0 3 0 0D 2832 + 126 3103 00010000D 2833 + 126 0 3 0 0D 2834 + 126 3106 00010000D 2835 + 126 0 3 0 0D 2836 + 126 3109 00010000D 2837 + 126 0 3 0 0D 2838 + 126 3112 00010000D 2839 + 126 0 3 0 0D 2840 + 126 3115 00010000D 2841 + 126 0 4 0 0D 2842 + 126 3119 00010000D 2843 + 126 0 3 0 0D 2844 + 126 3122 00010000D 2845 + 126 0 3 0 0D 2846 + 126 3125 00010000D 2847 + 126 0 4 0 0D 2848 + 126 3129 00010000D 2849 + 126 0 3 0 0D 2850 + 126 3132 00010000D 2851 + 126 0 3 0 0D 2852 + 126 3135 00010000D 2853 + 126 0 3 0 0D 2854 + 126 3138 00010000D 2855 + 126 0 3 0 0D 2856 + 126 3141 00010000D 2857 + 126 0 3 0 0D 2858 + 126 3144 00010000D 2859 + 126 0 4 0 0D 2860 + 126 3148 00010000D 2861 + 126 0 3 0 0D 2862 + 126 3151 00010000D 2863 + 126 0 3 0 0D 2864 + 126 3154 00010000D 2865 + 126 0 4 0 0D 2866 + 126 3158 00010000D 2867 + 126 0 3 0 0D 2868 + 126 3161 00010000D 2869 + 126 0 3 0 0D 2870 + 126 3164 00010000D 2871 + 126 0 3 0 0D 2872 + 126 3167 00010000D 2873 + 126 0 3 0 0D 2874 + 126 3170 00010000D 2875 + 126 0 3 0 0D 2876 + 126 3173 00010000D 2877 + 126 0 4 0 0D 2878 + 126 3177 00010000D 2879 + 126 0 3 0 0D 2880 + 126 3180 00010000D 2881 + 126 0 3 0 0D 2882 + 126 3183 00010000D 2883 + 126 0 4 0 0D 2884 + 126 3187 00010000D 2885 + 126 0 3 0 0D 2886 + 126 3190 00010000D 2887 + 126 0 3 0 0D 2888 + 126 3193 00010000D 2889 + 126 0 3 0 0D 2890 + 126 3196 00010000D 2891 + 126 0 3 0 0D 2892 + 126 3199 00010000D 2893 + 126 0 3 0 0D 2894 + 126 3202 00010000D 2895 + 126 0 4 0 0D 2896 + 126 3206 00010000D 2897 + 126 0 3 0 0D 2898 + 126 3209 00010000D 2899 + 126 0 3 0 0D 2900 + 126 3212 00010000D 2901 + 126 0 4 0 0D 2902 + 126 3216 00010000D 2903 + 126 0 3 0 0D 2904 + 126 3219 00010000D 2905 + 126 0 3 0 0D 2906 + 126 3222 00010000D 2907 + 126 0 4 0 0D 2908 + 126 3226 00010000D 2909 + 126 0 3 0 0D 2910 + 126 3229 00010000D 2911 + 126 0 3 0 0D 2912 + 126 3232 00010000D 2913 + 126 0 4 0 0D 2914 + 126 3236 00010000D 2915 + 126 0 3 0 0D 2916 + 126 3239 00010000D 2917 + 126 0 3 0 0D 2918 + 126 3242 00010000D 2919 + 126 0 4 0 0D 2920 + 126 3246 00010000D 2921 + 126 0 3 0 0D 2922 + 126 3249 00010000D 2923 + 126 0 3 0 0D 2924 + 126 3252 00010000D 2925 + 126 0 3 0 0D 2926 + 126 3255 00010000D 2927 + 126 0 3 0 0D 2928 + 126 3258 00010000D 2929 + 126 0 3 0 0D 2930 + 126 3261 00010000D 2931 + 126 0 4 0 0D 2932 + 126 3265 00010000D 2933 + 126 0 3 0 0D 2934 + 126 3268 00010000D 2935 + 126 0 3 0 0D 2936 + 126 3271 00010000D 2937 + 126 0 4 0 0D 2938 + 126 3275 00010000D 2939 + 126 0 4 0 0D 2940 + 126 3279 00010000D 2941 + 126 0 3 0 0D 2942 + 126 3282 00010000D 2943 + 126 0 4 0 0D 2944 + 126 3286 00010000D 2945 + 126 0 3 0 0D 2946 + 126 3289 00010000D 2947 + 126 0 4 0 0D 2948 + 126 3293 00010000D 2949 + 126 0 4 0 0D 2950 + 126 3297 00010000D 2951 + 126 0 3 0 0D 2952 + 126 3300 00010000D 2953 + 126 0 4 0 0D 2954 + 126 3304 00010000D 2955 + 126 0 4 0 0D 2956 + 126 3308 00010000D 2957 + 126 0 3 0 0D 2958 + 126 3311 00010000D 2959 + 126 0 4 0 0D 2960 + 126 3315 00010000D 2961 + 126 0 4 0 0D 2962 + 126 3319 00010000D 2963 + 126 0 3 0 0D 2964 + 126 3322 00010000D 2965 + 126 0 4 0 0D 2966 + 126 3326 00010000D 2967 + 126 0 4 0 0D 2968 + 126 3330 00010000D 2969 + 126 0 3 0 0D 2970 + 126 3333 00010000D 2971 + 126 0 4 0 0D 2972 + 126 3337 00010000D 2973 + 126 0 4 0 0D 2974 + 126 3341 00010000D 2975 + 126 0 3 0 0D 2976 + 126 3344 00010000D 2977 + 126 0 4 0 0D 2978 + 126 3348 00010000D 2979 + 126 0 4 0 0D 2980 + 126 3352 00010000D 2981 + 126 0 3 0 0D 2982 + 126 3355 00010000D 2983 + 126 0 4 0 0D 2984 + 126 3359 00010000D 2985 + 126 0 4 0 0D 2986 + 126 3363 00010000D 2987 + 126 0 3 0 0D 2988 + 126 3366 00010000D 2989 + 126 0 4 0 0D 2990 + 126 3370 00010000D 2991 + 126 0 4 0 0D 2992 + 126 3374 00010000D 2993 + 126 0 3 0 0D 2994 + 126 3377 00010000D 2995 + 126 0 4 0 0D 2996 + 126 3381 00010000D 2997 + 126 0 4 0 0D 2998 + 126 3385 00010000D 2999 + 126 0 3 0 0D 3000 + 126 3388 00010000D 3001 + 126 0 4 0 0D 3002 + 126 3392 00010000D 3003 + 126 0 4 0 0D 3004 + 126 3396 00010000D 3005 + 126 0 3 0 0D 3006 + 126 3399 00010000D 3007 + 126 0 4 0 0D 3008 + 126 3403 00010000D 3009 + 126 0 4 0 0D 3010 + 126 3407 00010000D 3011 + 126 0 4 0 0D 3012 + 126 3411 00010000D 3013 + 126 0 3 0 0D 3014 + 126 3414 00010000D 3015 + 126 0 4 0 0D 3016 + 126 3418 00010000D 3017 + 126 0 3 0 0D 3018 + 126 3421 00010000D 3019 + 126 0 4 0 0D 3020 + 126 3425 00010000D 3021 + 126 0 4 0 0D 3022 + 126 3429 00010000D 3023 + 126 0 3 0 0D 3024 + 126 3432 00010000D 3025 + 126 0 4 0 0D 3026 + 126 3436 00010000D 3027 + 126 0 4 0 0D 3028 + 126 3440 00010000D 3029 + 126 0 3 0 0D 3030 + 126 3443 00010000D 3031 + 126 0 4 0 0D 3032 + 126 3447 00010000D 3033 + 126 0 4 0 0D 3034 + 126 3451 00010000D 3035 + 126 0 3 0 0D 3036 + 126 3454 00010000D 3037 + 126 0 4 0 0D 3038 + 126 3458 00010000D 3039 + 126 0 4 0 0D 3040 + 126 3462 00010000D 3041 + 126 0 3 0 0D 3042 + 126 3465 00010000D 3043 + 126 0 4 0 0D 3044 + 126 3469 00010000D 3045 + 126 0 4 0 0D 3046 + 126 3473 00010000D 3047 + 126 0 3 0 0D 3048 + 126 3476 00010000D 3049 + 126 0 4 0 0D 3050 + 126 3480 00010000D 3051 + 126 0 4 0 0D 3052 + 126 3484 00010000D 3053 + 126 0 3 0 0D 3054 + 126 3487 00010000D 3055 + 126 0 4 0 0D 3056 + 126 3491 00010000D 3057 + 126 0 4 0 0D 3058 + 126 3495 00010000D 3059 + 126 0 3 0 0D 3060 + 126 3498 00010000D 3061 + 126 0 4 0 0D 3062 + 126 3502 00010000D 3063 + 126 0 4 0 0D 3064 + 126 3506 00010000D 3065 + 126 0 3 0 0D 3066 + 126 3509 00010000D 3067 + 126 0 4 0 0D 3068 + 126 3513 00010000D 3069 + 126 0 3 0 0D 3070 + 126 3516 00010000D 3071 + 126 0 3 0 0D 3072 + 126 3519 00010000D 3073 + 126 0 4 0 0D 3074 + 126 3523 00010000D 3075 + 126 0 4 0 0D 3076 + 126 3527 00010000D 3077 + 126 0 3 0 0D 3078 + 126 3530 00010000D 3079 + 126 0 4 0 0D 3080 + 126 3534 00010000D 3081 + 126 0 4 0 0D 3082 + 126 3538 00010000D 3083 + 126 0 4 0 0D 3084 + 126 3542 00010000D 3085 + 126 0 3 0 0D 3086 + 126 3545 00010000D 3087 + 126 0 3 0 0D 3088 + 126 3548 00010000D 3089 + 126 0 3 0 0D 3090 + 126 3551 00010000D 3091 + 126 0 4 0 0D 3092 + 126 3555 00010000D 3093 + 126 0 4 0 0D 3094 + 126 3559 00010000D 3095 + 126 0 3 0 0D 3096 + 126 3562 00010000D 3097 + 126 0 4 0 0D 3098 + 126 3566 00010000D 3099 + 126 0 4 0 0D 3100 + 126 3570 00010000D 3101 + 126 0 3 0 0D 3102 + 126 3573 00010000D 3103 + 126 0 4 0 0D 3104 + 126 3577 00010000D 3105 + 126 0 3 0 0D 3106 + 126 3580 00010000D 3107 + 126 0 3 0 0D 3108 + 126 3583 00010000D 3109 + 126 0 4 0 0D 3110 + 126 3587 00010000D 3111 + 126 0 4 0 0D 3112 + 126 3591 00010000D 3113 + 126 0 3 0 0D 3114 + 126 3594 00010000D 3115 + 126 0 4 0 0D 3116 + 126 3598 00010000D 3117 + 126 0 4 0 0D 3118 + 126 3602 00010000D 3119 + 126 0 3 0 0D 3120 + 126 3605 00010000D 3121 + 126 0 4 0 0D 3122 + 126 3609 00010000D 3123 + 126 0 3 0 0D 3124 + 126 3612 00010000D 3125 + 126 0 3 0 0D 3126 + 126 3615 00010000D 3127 + 126 0 4 0 0D 3128 + 126 3619 00010000D 3129 + 126 0 4 0 0D 3130 + 126 3623 00010000D 3131 + 126 0 3 0 0D 3132 + 126 3626 00010000D 3133 + 126 0 4 0 0D 3134 + 126 3630 00010000D 3135 + 126 0 4 0 0D 3136 + 126 3634 00010000D 3137 + 126 0 3 0 0D 3138 + 126 3637 00010000D 3139 + 126 0 4 0 0D 3140 + 126 3641 00010000D 3141 + 126 0 3 0 0D 3142 + 126 3644 00010000D 3143 + 126 0 3 0 0D 3144 + 126 3647 00010000D 3145 + 126 0 4 0 0D 3146 + 126 3651 00010000D 3147 + 126 0 4 0 0D 3148 + 126 3655 00010000D 3149 + 126 0 3 0 0D 3150 + 126 3658 00010000D 3151 + 126 0 4 0 0D 3152 + 126 3662 00010000D 3153 + 126 0 4 0 0D 3154 + 126 3666 00010000D 3155 + 126 0 3 0 0D 3156 + 126 3669 00010000D 3157 + 126 0 3 0 0D 3158 + 126 3672 00010000D 3159 + 126 0 3 0 0D 3160 + 126 3675 00010000D 3161 + 126 0 3 0 0D 3162 + 126 3678 00010000D 3163 + 126 0 4 0 0D 3164 + 126 3682 00010000D 3165 + 126 0 4 0 0D 3166 + 126 3686 00010000D 3167 + 126 0 3 0 0D 3168 + 126 3689 00010000D 3169 + 126 0 4 0 0D 3170 + 126 3693 00010000D 3171 + 126 0 4 0 0D 3172 + 126 3697 00010000D 3173 + 126 0 3 0 0D 3174 + 126 3700 00010000D 3175 + 126 0 4 0 0D 3176 + 126 3704 00010000D 3177 + 126 0 3 0 0D 3178 + 126 3707 00010000D 3179 + 126 0 3 0 0D 3180 + 126 3710 00010000D 3181 + 126 0 4 0 0D 3182 + 126 3714 00010000D 3183 + 126 0 4 0 0D 3184 + 126 3718 00010000D 3185 + 126 0 3 0 0D 3186 + 126 3721 00010000D 3187 + 126 0 4 0 0D 3188 + 126 3725 00010000D 3189 + 126 0 4 0 0D 3190 + 126 3729 00010000D 3191 + 126 0 3 0 0D 3192 + 126 3732 00010000D 3193 + 126 0 4 0 0D 3194 + 126 3736 00010000D 3195 + 126 0 3 0 0D 3196 + 126 3739 00010000D 3197 + 126 0 3 0 0D 3198 + 126 3742 00010000D 3199 + 126 0 3 0 0D 3200 + 126 3745 00010000D 3201 + 126 0 4 0 0D 3202 + 126 3749 00010000D 3203 + 126 0 3 0 0D 3204 + 126 3752 00010000D 3205 + 126 0 3 0 0D 3206 + 126 3755 00010000D 3207 + 126 0 4 0 0D 3208 + 126 3759 00010000D 3209 + 126 0 3 0 0D 3210 + 126 3762 00010000D 3211 + 126 0 3 0 0D 3212 + 126 3765 00010000D 3213 + 126 0 3 0 0D 3214 + 126 3768 00010000D 3215 + 126 0 3 0 0D 3216 + 126 3771 00010000D 3217 + 126 0 3 0 0D 3218 + 126 3774 00010000D 3219 + 126 0 4 0 0D 3220 + 126 3778 00010000D 3221 + 126 0 3 0 0D 3222 + 126 3781 00010000D 3223 + 126 0 3 0 0D 3224 + 126 3784 00010000D 3225 + 126 0 4 0 0D 3226 + 126 3788 00010000D 3227 + 126 0 3 0 0D 3228 + 126 3791 00010000D 3229 + 126 0 3 0 0D 3230 + 126 3794 00010000D 3231 + 126 0 3 0 0D 3232 + 126 3797 00010000D 3233 + 126 0 3 0 0D 3234 + 126 3800 00010000D 3235 + 126 0 3 0 0D 3236 + 126 3803 00010000D 3237 + 126 0 4 0 0D 3238 + 126 3807 00010000D 3239 + 126 0 3 0 0D 3240 + 126 3810 00010000D 3241 + 126 0 3 0 0D 3242 + 126 3813 00010000D 3243 + 126 0 4 0 0D 3244 + 126 3817 00010000D 3245 + 126 0 3 0 0D 3246 + 126 3820 00010000D 3247 + 126 0 3 0 0D 3248 + 126 3823 00010000D 3249 + 126 0 3 0 0D 3250 + 126 3826 00010000D 3251 + 126 0 3 0 0D 3252 + 126 3829 00010000D 3253 + 126 0 3 0 0D 3254 + 126 3832 00010000D 3255 + 126 0 4 0 0D 3256 + 126 3836 00010000D 3257 + 126 0 3 0 0D 3258 + 126 3839 00010000D 3259 + 126 0 3 0 0D 3260 + 126 3842 00010000D 3261 + 126 0 4 0 0D 3262 + 126 3846 00010000D 3263 + 126 0 3 0 0D 3264 + 126 3849 00010000D 3265 + 126 0 3 0 0D 3266 + 126 3852 00010000D 3267 + 126 0 3 0 0D 3268 + 126 3855 00010000D 3269 + 126 0 3 0 0D 3270 + 126 3858 00010000D 3271 + 126 0 3 0 0D 3272 + 126 3861 00010000D 3273 + 126 0 4 0 0D 3274 + 126 3865 00010000D 3275 + 126 0 3 0 0D 3276 + 126 3868 00010000D 3277 + 126 0 3 0 0D 3278 + 126 3871 00010000D 3279 + 126 0 4 0 0D 3280 + 126 3875 00010000D 3281 + 126 0 3 0 0D 3282 + 126 3878 00010000D 3283 + 126 0 3 0 0D 3284 + 126 3881 00010000D 3285 + 126 0 3 0 0D 3286 + 126 3884 00010000D 3287 + 126 0 3 0 0D 3288 + 126 3887 00010000D 3289 + 126 0 3 0 0D 3290 + 126 3890 00010000D 3291 + 126 0 4 0 0D 3292 + 126 3894 00010000D 3293 + 126 0 3 0 0D 3294 + 126 3897 00010000D 3295 + 126 0 3 0 0D 3296 + 126 3900 00010000D 3297 + 126 0 4 0 0D 3298 + 126 3904 00010000D 3299 + 126 0 3 0 0D 3300 + 126 3907 00010000D 3301 + 126 0 3 0 0D 3302 + 126 3910 00010000D 3303 + 126 0 3 0 0D 3304 + 126 3913 00010000D 3305 + 126 0 3 0 0D 3306 + 126 3916 00010000D 3307 + 126 0 3 0 0D 3308 + 126 3919 00010000D 3309 + 126 0 4 0 0D 3310 + 126 3923 00010000D 3311 + 126 0 3 0 0D 3312 + 126 3926 00010000D 3313 + 126 0 3 0 0D 3314 + 126 3929 00010000D 3315 + 126 0 4 0 0D 3316 + 126 3933 00010000D 3317 + 126 0 3 0 0D 3318 + 126 3936 00010000D 3319 + 126 0 3 0 0D 3320 + 126 3939 00010000D 3321 + 126 0 3 0 0D 3322 + 126 3942 00010000D 3323 + 126 0 3 0 0D 3324 + 126 3945 00010000D 3325 + 126 0 3 0 0D 3326 + 126 3948 00010000D 3327 + 126 0 4 0 0D 3328 + 126 3952 00010000D 3329 + 126 0 3 0 0D 3330 + 126 3955 00010000D 3331 + 126 0 3 0 0D 3332 + 126 3958 00010000D 3333 + 126 0 4 0 0D 3334 + 126 3962 00010000D 3335 + 126 0 3 0 0D 3336 + 126 3965 00010000D 3337 + 126 0 3 0 0D 3338 + 126 3968 00010000D 3339 + 126 0 4 0 0D 3340 + 126 3972 00010000D 3341 + 126 0 3 0 0D 3342 + 126 3975 00010000D 3343 + 126 0 3 0 0D 3344 + 126 3978 00010000D 3345 + 126 0 4 0 0D 3346 + 126 3982 00010000D 3347 + 126 0 3 0 0D 3348 + 126 3985 00010000D 3349 + 126 0 3 0 0D 3350 + 126 3988 00010000D 3351 + 126 0 4 0 0D 3352 + 126 3992 00010000D 3353 + 126 0 3 0 0D 3354 + 126 3995 00010000D 3355 + 126 0 3 0 0D 3356 + 126 3998 00010000D 3357 + 126 0 3 0 0D 3358 + 126 4001 00010000D 3359 + 126 0 3 0 0D 3360 + 126 4004 00010000D 3361 + 126 0 3 0 0D 3362 + 126 4007 00010000D 3363 + 126 0 4 0 0D 3364 + 126 4011 00010000D 3365 + 126 0 3 0 0D 3366 + 126 4014 00010000D 3367 + 126 0 3 0 0D 3368 + 126 4017 00010000D 3369 + 126 0 4 0 0D 3370 + 126 4021 00010000D 3371 + 126 0 4 0 0D 3372 + 126 4025 00010000D 3373 + 126 0 3 0 0D 3374 + 126 4028 00010000D 3375 + 126 0 4 0 0D 3376 + 126 4032 00010000D 3377 + 126 0 3 0 0D 3378 + 126 4035 00010000D 3379 + 126 0 4 0 0D 3380 + 126 4039 00010000D 3381 + 126 0 4 0 0D 3382 + 126 4043 00010000D 3383 + 126 0 3 0 0D 3384 + 126 4046 00010000D 3385 + 126 0 4 0 0D 3386 + 126 4050 00010000D 3387 + 126 0 4 0 0D 3388 + 126 4054 00010000D 3389 + 126 0 3 0 0D 3390 + 126 4057 00010000D 3391 + 126 0 4 0 0D 3392 + 126 4061 00010000D 3393 + 126 0 4 0 0D 3394 + 126 4065 00010000D 3395 + 126 0 3 0 0D 3396 + 126 4068 00010000D 3397 + 126 0 4 0 0D 3398 + 126 4072 00010000D 3399 + 126 0 4 0 0D 3400 + 126 4076 00010000D 3401 + 126 0 3 0 0D 3402 + 126 4079 00010000D 3403 + 126 0 4 0 0D 3404 + 126 4083 00010000D 3405 + 126 0 4 0 0D 3406 + 126 4087 00010000D 3407 + 126 0 3 0 0D 3408 + 126 4090 00010000D 3409 + 126 0 4 0 0D 3410 + 126 4094 00010000D 3411 + 126 0 4 0 0D 3412 + 126 4098 00010000D 3413 + 126 0 3 0 0D 3414 + 126 4101 00010000D 3415 + 126 0 4 0 0D 3416 + 126 4105 00010000D 3417 + 126 0 4 0 0D 3418 + 126 4109 00010000D 3419 + 126 0 3 0 0D 3420 + 126 4112 00010000D 3421 + 126 0 4 0 0D 3422 + 126 4116 00010000D 3423 + 126 0 4 0 0D 3424 + 126 4120 00010000D 3425 + 126 0 3 0 0D 3426 + 126 4123 00010000D 3427 + 126 0 4 0 0D 3428 + 126 4127 00010000D 3429 + 126 0 4 0 0D 3430 + 126 4131 00010000D 3431 + 126 0 3 0 0D 3432 + 126 4134 00010000D 3433 + 126 0 4 0 0D 3434 + 126 4138 00010000D 3435 + 126 0 4 0 0D 3436 + 126 4142 00010000D 3437 + 126 0 3 0 0D 3438 + 126 4145 00010000D 3439 + 126 0 4 0 0D 3440 + 126 4149 00010000D 3441 + 126 0 4 0 0D 3442 + 126 4153 00010000D 3443 + 126 0 4 0 0D 3444 + 126 4157 00010000D 3445 + 126 0 3 0 0D 3446 + 126 4160 00010000D 3447 + 126 0 4 0 0D 3448 + 126 4164 00010000D 3449 + 126 0 3 0 0D 3450 + 126 4167 00010000D 3451 + 126 0 4 0 0D 3452 + 126 4171 00010000D 3453 + 126 0 4 0 0D 3454 + 126 4175 00010000D 3455 + 126 0 3 0 0D 3456 + 126 4178 00010000D 3457 + 126 0 4 0 0D 3458 + 126 4182 00010000D 3459 + 126 0 4 0 0D 3460 + 126 4186 00010000D 3461 + 126 0 3 0 0D 3462 + 126 4189 00010000D 3463 + 126 0 4 0 0D 3464 + 126 4193 00010000D 3465 + 126 0 4 0 0D 3466 + 126 4197 00010000D 3467 + 126 0 3 0 0D 3468 + 126 4200 00010000D 3469 + 126 0 4 0 0D 3470 + 126 4204 00010000D 3471 + 126 0 4 0 0D 3472 + 126 4208 00010000D 3473 + 126 0 3 0 0D 3474 + 126 4211 00010000D 3475 + 126 0 4 0 0D 3476 + 126 4215 00010000D 3477 + 126 0 4 0 0D 3478 + 126 4219 00010000D 3479 + 126 0 3 0 0D 3480 + 126 4222 00010000D 3481 + 126 0 4 0 0D 3482 + 126 4226 00010000D 3483 + 126 0 4 0 0D 3484 + 126 4230 00010000D 3485 + 126 0 3 0 0D 3486 + 126 4233 00010000D 3487 + 126 0 4 0 0D 3488 + 126 4237 00010000D 3489 + 126 0 4 0 0D 3490 + 126 4241 00010000D 3491 + 126 0 3 0 0D 3492 + 126 4244 00010000D 3493 + 126 0 4 0 0D 3494 + 126 4248 00010000D 3495 + 126 0 4 0 0D 3496 + 126 4252 00010000D 3497 + 126 0 3 0 0D 3498 + 126 4255 00010000D 3499 + 126 0 4 0 0D 3500 + 126 4259 00010000D 3501 + 126 0 3 0 0D 3502 + 126 4262 00010000D 3503 + 126 0 3 0 0D 3504 + 126 4265 00010000D 3505 + 126 0 4 0 0D 3506 + 126 4269 00010000D 3507 + 126 0 4 0 0D 3508 + 126 4273 00010000D 3509 + 126 0 3 0 0D 3510 + 126 4276 00010000D 3511 + 126 0 4 0 0D 3512 + 126 4280 00010000D 3513 + 126 0 4 0 0D 3514 + 126 4284 00010000D 3515 + 126 0 4 0 0D 3516 + 126 4288 00010000D 3517 + 126 0 3 0 0D 3518 + 126 4291 00010000D 3519 + 126 0 3 0 0D 3520 + 126 4294 00010000D 3521 + 126 0 3 0 0D 3522 + 126 4297 00010000D 3523 + 126 0 4 0 0D 3524 + 126 4301 00010000D 3525 + 126 0 4 0 0D 3526 + 126 4305 00010000D 3527 + 126 0 3 0 0D 3528 + 126 4308 00010000D 3529 + 126 0 4 0 0D 3530 + 126 4312 00010000D 3531 + 126 0 4 0 0D 3532 + 126 4316 00010000D 3533 + 126 0 3 0 0D 3534 + 126 4319 00010000D 3535 + 126 0 4 0 0D 3536 + 126 4323 00010000D 3537 + 126 0 3 0 0D 3538 + 126 4326 00010000D 3539 + 126 0 3 0 0D 3540 + 126 4329 00010000D 3541 + 126 0 4 0 0D 3542 + 126 4333 00010000D 3543 + 126 0 4 0 0D 3544 + 126 4337 00010000D 3545 + 126 0 3 0 0D 3546 + 126 4340 00010000D 3547 + 126 0 4 0 0D 3548 + 126 4344 00010000D 3549 + 126 0 4 0 0D 3550 + 126 4348 00010000D 3551 + 126 0 3 0 0D 3552 + 126 4351 00010000D 3553 + 126 0 4 0 0D 3554 + 126 4355 00010000D 3555 + 126 0 3 0 0D 3556 + 126 4358 00010000D 3557 + 126 0 3 0 0D 3558 + 126 4361 00010000D 3559 + 126 0 4 0 0D 3560 + 126 4365 00010000D 3561 + 126 0 4 0 0D 3562 + 126 4369 00010000D 3563 + 126 0 3 0 0D 3564 + 126 4372 00010000D 3565 + 126 0 4 0 0D 3566 + 126 4376 00010000D 3567 + 126 0 4 0 0D 3568 + 126 4380 00010000D 3569 + 126 0 3 0 0D 3570 + 126 4383 00010000D 3571 + 126 0 4 0 0D 3572 + 126 4387 00010000D 3573 + 126 0 3 0 0D 3574 + 126 4390 00010000D 3575 + 126 0 3 0 0D 3576 + 126 4393 00010000D 3577 + 126 0 4 0 0D 3578 + 126 4397 00010000D 3579 + 126 0 4 0 0D 3580 + 126 4401 00010000D 3581 + 126 0 3 0 0D 3582 + 126 4404 00010000D 3583 + 126 0 4 0 0D 3584 + 126 4408 00010000D 3585 + 126 0 4 0 0D 3586 + 126 4412 00010000D 3587 + 126 0 3 0 0D 3588 + 126 4415 00010000D 3589 + 126 0 3 0 0D 3590 + 126 4418 00010000D 3591 + 126 0 3 0 0D 3592 + 126 4421 00010000D 3593 + 126 0 3 0 0D 3594 + 126 4424 00010000D 3595 + 126 0 4 0 0D 3596 + 126 4428 00010000D 3597 + 126 0 4 0 0D 3598 + 126 4432 00010000D 3599 + 126 0 3 0 0D 3600 + 126 4435 00010000D 3601 + 126 0 4 0 0D 3602 + 126 4439 00010000D 3603 + 126 0 4 0 0D 3604 + 126 4443 00010000D 3605 + 126 0 3 0 0D 3606 + 126 4446 00010000D 3607 + 126 0 4 0 0D 3608 + 126 4450 00010000D 3609 + 126 0 3 0 0D 3610 + 126 4453 00010000D 3611 + 126 0 3 0 0D 3612 + 126 4456 00010000D 3613 + 126 0 4 0 0D 3614 + 126 4460 00010000D 3615 + 126 0 4 0 0D 3616 + 126 4464 00010000D 3617 + 126 0 3 0 0D 3618 + 126 4467 00010000D 3619 + 126 0 4 0 0D 3620 + 126 4471 00010000D 3621 + 126 0 4 0 0D 3622 + 126 4475 00010000D 3623 + 126 0 3 0 0D 3624 + 126 4478 00010000D 3625 + 126 0 4 0 0D 3626 + 126 4482 00010000D 3627 + 126 0 3 0 0D 3628 + 126 4485 00010000D 3629 + 126 0 3 0 0D 3630 + 126 4488 00010000D 3631 + 126 0 3 0 0D 3632 + 126 4491 00010000D 3633 + 126 0 3 0 0D 3634 + 126 4494 00010000D 3635 + 126 0 3 0 0D 3636 + 126 4497 00010000D 3637 + 126 0 3 0 0D 3638 + 126 4500 00010000D 3639 + 126 0 4 0 0D 3640 + 126 4504 00010000D 3641 + 126 0 3 0 0D 3642 + 126 4507 00010000D 3643 + 126 0 3 0 0D 3644 + 126 4510 00010000D 3645 + 126 0 3 0 0D 3646 + 126 4513 00010000D 3647 + 126 0 3 0 0D 3648 + 126 4516 00010000D 3649 + 126 0 3 0 0D 3650 + 126 4519 00010000D 3651 + 126 0 4 0 0D 3652 + 126 4523 00010000D 3653 + 126 0 3 0 0D 3654 + 126 4526 00010000D 3655 + 126 0 3 0 0D 3656 + 126 4529 00010000D 3657 + 126 0 4 0 0D 3658 + 126 4533 00010000D 3659 + 126 0 3 0 0D 3660 + 126 4536 00010000D 3661 + 126 0 3 0 0D 3662 + 126 4539 00010000D 3663 + 126 0 3 0 0D 3664 + 126 4542 00010000D 3665 + 126 0 3 0 0D 3666 + 126 4545 00010000D 3667 + 126 0 3 0 0D 3668 + 126 4548 00010000D 3669 + 126 0 4 0 0D 3670 + 126 4552 00010000D 3671 + 126 0 3 0 0D 3672 + 126 4555 00010000D 3673 + 126 0 3 0 0D 3674 + 126 4558 00010000D 3675 + 126 0 4 0 0D 3676 + 126 4562 00010000D 3677 + 126 0 3 0 0D 3678 + 126 4565 00010000D 3679 + 126 0 3 0 0D 3680 + 126 4568 00010000D 3681 + 126 0 3 0 0D 3682 + 126 4571 00010000D 3683 + 126 0 3 0 0D 3684 + 126 4574 00010000D 3685 + 126 0 3 0 0D 3686 + 126 4577 00010000D 3687 + 126 0 4 0 0D 3688 + 126 4581 00010000D 3689 + 126 0 3 0 0D 3690 + 126 4584 00010000D 3691 + 126 0 3 0 0D 3692 + 126 4587 00010000D 3693 + 126 0 4 0 0D 3694 + 126 4591 00010000D 3695 + 126 0 3 0 0D 3696 + 126 4594 00010000D 3697 + 126 0 3 0 0D 3698 + 126 4597 00010000D 3699 + 126 0 3 0 0D 3700 + 126 4600 00010000D 3701 + 126 0 3 0 0D 3702 + 126 4603 00010000D 3703 + 126 0 3 0 0D 3704 + 126 4606 00010000D 3705 + 126 0 4 0 0D 3706 + 126 4610 00010000D 3707 + 126 0 3 0 0D 3708 + 126 4613 00010000D 3709 + 126 0 3 0 0D 3710 + 126 4616 00010000D 3711 + 126 0 4 0 0D 3712 + 126 4620 00010000D 3713 + 126 0 3 0 0D 3714 + 126 4623 00010000D 3715 + 126 0 3 0 0D 3716 + 126 4626 00010000D 3717 + 126 0 3 0 0D 3718 + 126 4629 00010000D 3719 + 126 0 3 0 0D 3720 + 126 4632 00010000D 3721 + 126 0 3 0 0D 3722 + 126 4635 00010000D 3723 + 126 0 4 0 0D 3724 + 126 4639 00010000D 3725 + 126 0 3 0 0D 3726 + 126 4642 00010000D 3727 + 126 0 3 0 0D 3728 + 126 4645 00010000D 3729 + 126 0 4 0 0D 3730 + 126 4649 00010000D 3731 + 126 0 3 0 0D 3732 + 126 4652 00010000D 3733 + 126 0 3 0 0D 3734 + 126 4655 00010000D 3735 + 126 0 3 0 0D 3736 + 126 4658 00010000D 3737 + 126 0 3 0 0D 3738 + 126 4661 00010000D 3739 + 126 0 3 0 0D 3740 + 126 4664 00010000D 3741 + 126 0 4 0 0D 3742 + 126 4668 00010000D 3743 + 126 0 3 0 0D 3744 + 126 4671 00010000D 3745 + 126 0 3 0 0D 3746 + 126 4674 00010000D 3747 + 126 0 4 0 0D 3748 + 126 4678 00010000D 3749 + 126 0 3 0 0D 3750 + 126 4681 00010000D 3751 + 126 0 3 0 0D 3752 + 126 4684 00010000D 3753 + 126 0 3 0 0D 3754 + 126 4687 00010000D 3755 + 126 0 3 0 0D 3756 + 126 4690 00010000D 3757 + 126 0 3 0 0D 3758 + 126 4693 00010000D 3759 + 126 0 4 0 0D 3760 + 126 4697 00010000D 3761 + 126 0 3 0 0D 3762 + 126 4700 00010000D 3763 + 126 0 3 0 0D 3764 + 126 4703 00010000D 3765 + 126 0 4 0 0D 3766 + 126 4707 00010000D 3767 + 126 0 3 0 0D 3768 + 126 4710 00010000D 3769 + 126 0 3 0 0D 3770 + 126 4713 00010000D 3771 + 126 0 4 0 0D 3772 + 126 4717 00010000D 3773 + 126 0 3 0 0D 3774 + 126 4720 00010000D 3775 + 126 0 3 0 0D 3776 + 126 4723 00010000D 3777 + 126 0 4 0 0D 3778 + 126 4727 00010000D 3779 + 126 0 3 0 0D 3780 + 126 4730 00010000D 3781 + 126 0 3 0 0D 3782 + 126 4733 00010000D 3783 + 126 0 4 0 0D 3784 + 126 4737 00010000D 3785 + 126 0 3 0 0D 3786 + 126 4740 00010000D 3787 + 126 0 3 0 0D 3788 + 126 4743 00010000D 3789 + 126 0 3 0 0D 3790 + 126 4746 00010000D 3791 + 126 0 3 0 0D 3792 + 126 4749 00010000D 3793 + 126 0 3 0 0D 3794 + 126 4752 00010000D 3795 + 126 0 4 0 0D 3796 + 126 4756 00010000D 3797 + 126 0 3 0 0D 3798 + 126 4759 00010000D 3799 + 126 0 3 0 0D 3800 + 126 4762 00010000D 3801 + 126 0 3 0 0D 3802 + 126 4765 00010000D 3803 + 126 0 5 0 0D 3804 + 126 4770 00010000D 3805 + 126 0 3 0 0D 3806 + 126 4773 00010000D 3807 + 126 0 5 0 0D 3808 + 126 4778 00010000D 3809 + 126 0 3 0 0D 3810 + 126 4781 00010000D 3811 + 126 0 3 0 0D 3812 + 126 4784 00010000D 3813 + 126 0 3 0 0D 3814 + 126 4787 00010000D 3815 + 126 0 3 0 0D 3816 + 126 4790 00010000D 3817 + 126 0 5 0 0D 3818 + 126 4795 00010000D 3819 + 126 0 5 0 0D 3820 + 126 4800 00010000D 3821 + 126 0 3 0 0D 3822 + 126 4803 00010000D 3823 + 126 0 3 0 0D 3824 + 126 4806 00010000D 3825 + 126 0 3 0 0D 3826 + 126 4809 00010000D 3827 + 126 0 3 0 0D 3828 + 126 4812 00010000D 3829 + 126 0 5 0 0D 3830 + 126 4817 00010000D 3831 + 126 0 5 0 0D 3832 + 126 4822 00010000D 3833 + 126 0 3 0 0D 3834 + 126 4825 00010000D 3835 + 126 0 4 0 0D 3836 + 126 4829 00010000D 3837 + 126 0 4 0 0D 3838 + 126 4833 00010000D 3839 + 126 0 3 0 0D 3840 + 126 4836 00010000D 3841 + 126 0 8 0 0D 3842 + 126 4844 00010000D 3843 + 126 0 8 0 0D 3844 + 126 4852 00010000D 3845 + 126 0 3 0 0D 3846 + 126 4855 00010000D 3847 + 126 0 4 0 0D 3848 + 126 4859 00010000D 3849 + 126 0 4 0 0D 3850 + 126 4863 00010000D 3851 + 126 0 3 0 0D 3852 + 126 4866 00010000D 3853 + 126 0 5 0 0D 3854 + 126 4871 00010000D 3855 + 126 0 5 0 0D 3856 + 126 4876 00010000D 3857 + 126 0 5 0 0D 3858 + 126 4881 00010000D 3859 + 126 0 3 0 0D 3860 + 126 4884 00010000D 3861 + 126 0 4 0 0D 3862 + 126 4888 00010000D 3863 + 126 0 3 0 0D 3864 + 126 4891 00010000D 3865 + 126 0 5 0 0D 3866 + 126 4896 00010000D 3867 + 126 0 3 0 0D 3868 + 126 4899 00010000D 3869 + 126 0 3 0 0D 3870 + 126 4902 00010000D 3871 + 126 0 5 0 0D 3872 + 126 4907 00010000D 3873 + 126 0 3 0 0D 3874 + 126 4910 00010000D 3875 + 126 0 4 0 0D 3876 + 126 4914 00010000D 3877 + 126 0 5 0 0D 3878 + 126 4919 00010000D 3879 + 126 0 3 0 0D 3880 + 126 4922 00010000D 3881 + 126 0 4 0 0D 3882 + 126 4926 00010000D 3883 + 126 0 5 0 0D 3884 + 126 4931 00010000D 3885 + 126 0 3 0 0D 3886 + 126 4934 00010000D 3887 + 126 0 4 0 0D 3888 + 126 4938 00010000D 3889 + 126 0 5 0 0D 3890 + 126 4943 00010000D 3891 + 126 0 4 0 0D 3892 + 126 4947 00010000D 3893 + 126 0 13 0 0D 3894 + 126 4960 00010000D 3895 + 126 0 4 0 0D 3896 + 126 4964 00010000D 3897 + 126 0 9 0 0D 3898 + 126 4973 00010000D 3899 + 126 0 4 0 0D 3900 + 126 4977 00010000D 3901 + 126 0 13 0 0D 3902 + 126 4990 00010000D 3903 + 126 0 11 0 0D 3904 + 126 5001 00010000D 3905 + 126 0 13 0 0D 3906 + 126 5014 00010000D 3907 + 126 0 4 0 0D 3908 + 126 5018 00010000D 3909 + 126 0 9 0 0D 3910 + 126 5027 00010000D 3911 + 126 0 4 0 0D 3912 + 126 5031 00010000D 3913 + 126 0 13 0 0D 3914 + 126 5044 00010000D 3915 + 126 0 11 0 0D 3916 + 126 5055 00010000D 3917 + 126 0 7 0 0D 3918 + 126 5062 00010000D 3919 + 126 0 3 0 0D 3920 + 126 5065 00010000D 3921 + 126 0 7 0 0D 3922 + 126 5072 00010000D 3923 + 126 0 3 0 0D 3924 + 126 5075 00010000D 3925 + 126 0 3 0 0D 3926 + 126 5078 00010000D 3927 + 126 0 5 0 0D 3928 + 126 5083 00010000D 3929 + 126 0 3 0 0D 3930 + 126 5086 00010000D 3931 + 126 0 5 0 0D 3932 + 126 5091 00010000D 3933 + 126 0 3 0 0D 3934 + 126 5094 00010000D 3935 + 126 0 4 0 0D 3936 + 126 5098 00010000D 3937 + 126 0 3 0 0D 3938 + 126 5101 00010000D 3939 + 126 0 5 0 0D 3940 + 126 5106 00010000D 3941 + 126 0 6 0 0D 3942 + 126 5112 00010000D 3943 + 126 0 5 0 0D 3944 + 126 5117 00010000D 3945 + 126 0 5 0 0D 3946 + 126 5122 00010000D 3947 + 126 0 5 0 0D 3948 + 126 5127 00010000D 3949 + 126 0 7 0 0D 3950 + 126 5134 00010000D 3951 + 126 0 5 0 0D 3952 + 126 5139 00010000D 3953 + 126 0 5 0 0D 3954 + 126 5144 00010000D 3955 + 126 0 5 0 0D 3956 + 126 5149 00010000D 3957 + 126 0 7 0 0D 3958 + 126 5156 00010000D 3959 + 126 0 7 0 0D 3960 + 126 5163 00010000D 3961 + 126 0 5 0 0D 3962 + 126 5168 00010000D 3963 + 126 0 3 0 0D 3964 + 126 5171 00010000D 3965 + 126 0 5 0 0D 3966 + 126 5176 00010000D 3967 + 126 0 3 0 0D 3968 + 126 5179 00010000D 3969 + 126 0 3 0 0D 3970 + 126 5182 00010000D 3971 + 126 0 5 0 0D 3972 + 126 5187 00010000D 3973 + 126 0 3 0 0D 3974 + 126 5190 00010000D 3975 + 126 0 5 0 0D 3976 + 126 5195 00010000D 3977 + 126 0 7 0 0D 3978 + 126 5202 00010000D 3979 + 126 0 5 0 0D 3980 + 126 5207 00010000D 3981 + 126 0 7 0 0D 3982 + 126 5214 00010000D 3983 + 126 0 5 0 0D 3984 + 126 5219 00010000D 3985 + 126 0 7 0 0D 3986 + 126 5226 00010000D 3987 + 126 0 5 0 0D 3988 + 126 5231 00010000D 3989 + 126 0 5 0 0D 3990 + 126 5236 00010000D 3991 + 126 0 13 0 0D 3992 + 126 5249 00010000D 3993 + 126 0 3 0 0D 3994 + 126 5252 00010000D 3995 + 126 0 11 0 0D 3996 + 126 5263 00010000D 3997 + 126 0 3 0 0D 3998 + 126 5266 00010000D 3999 + 126 0 13 0 0D 4000 + 126 5279 00010000D 4001 + 126 0 11 0 0D 4002 + 126 5290 00010000D 4003 + 126 0 13 0 0D 4004 + 126 5303 00010000D 4005 + 126 0 3 0 0D 4006 + 126 5306 00010000D 4007 + 126 0 13 0 0D 4008 + 126 5319 00010000D 4009 + 126 0 3 0 0D 4010 + 126 5322 00010000D 4011 + 126 0 13 0 0D 4012 + 126 5335 00010000D 4013 + 126 0 13 0 0D 4014 + 126 5348 00010000D 4015 + 126 0 13 0 0D 4016 + 126 5361 00010000D 4017 + 126 0 3 0 0D 4018 + 126 5364 00010000D 4019 + 126 0 11 0 0D 4020 + 126 5375 00010000D 4021 + 126 0 3 0 0D 4022 + 126 5378 00010000D 4023 + 126 0 13 0 0D 4024 + 126 5391 00010000D 4025 + 126 0 11 0 0D 4026 + 126 5402 00010000D 4027 + 126 0 13 0 0D 4028 + 126 5415 00010000D 4029 + 126 0 3 0 0D 4030 + 126 5418 00010000D 4031 + 126 0 13 0 0D 4032 + 126 5431 00010000D 4033 + 126 0 3 0 0D 4034 + 126 5434 00010000D 4035 + 126 0 13 0 0D 4036 + 126 5447 00010000D 4037 + 126 0 13 0 0D 4038 + 126 5460 00010000D 4039 + 126 0 5 0 0D 4040 + 126 5465 00010000D 4041 + 126 0 3 0 0D 4042 + 126 5468 00010000D 4043 + 126 0 4 0 0D 4044 + 126 5472 00010000D 4045 + 126 0 3 0 0D 4046 + 126 5475 00010000D 4047 + 126 0 3 0 0D 4048 + 126 5478 00010000D 4049 + 126 0 5 0 0D 4050 + 126 5483 00010000D 4051 + 126 0 3 0 0D 4052 + 126 5486 00010000D 4053 + 126 0 5 0 0D 4054 + 126 5491 00010000D 4055 + 126 0 5 0 0D 4056 + 126 5496 00010000D 4057 + 126 0 7 0 0D 4058 + 126 5503 00010000D 4059 + 126 0 10 0 0D 4060 + 126 5513 00010000D 4061 + 126 0 5 0 0D 4062 + 126 5518 00010000D 4063 + 126 0 5 0 0D 4064 + 126 5523 00010000D 4065 + 126 0 5 0 0D 4066 + 126 5528 00010000D 4067 + 126 0 5 0 0D 4068 + 126 5533 00010000D 4069 + 126 0 5 0 0D 4070 + 126 5538 00010000D 4071 + 126 0 5 0 0D 4072 + 126 5543 00010000D 4073 + 126 0 10 0 0D 4074 + 126 5553 00010000D 4075 + 126 0 5 0 0D 4076 + 126 5558 00010000D 4077 + 126 0 5 0 0D 4078 + 126 5563 00010000D 4079 + 126 0 13 0 0D 4080 + 126 5576 00010000D 4081 + 126 0 13 0 0D 4082 + 126 5589 00010000D 4083 + 126 0 3 0 0D 4084 + 126 5592 00010000D 4085 + 126 0 4 0 0D 4086 + 126 5596 00010000D 4087 + 126 0 3 0 0D 4088 + 126 5599 00010000D 4089 + 126 0 4 0 0D 4090 + 126 5603 00010000D 4091 + 126 0 5 0 0D 4092 + 126 5608 00010000D 4093 + 126 0 5 0 0D 4094 + 126 5613 00010000D 4095 + 126 0 5 0 0D 4096 + 126 5618 00010000D 4097 + 126 0 3 0 0D 4098 + 126 5621 00010000D 4099 + 126 0 4 0 0D 4100 + 126 5625 00010000D 4101 + 126 0 5 0 0D 4102 + 126 5630 00010000D 4103 + 126 0 5 0 0D 4104 + 126 5635 00010000D 4105 + 126 0 5 0 0D 4106 + 126 5640 00010000D 4107 + 126 0 5 0 0D 4108 + 126 5645 00010000D 4109 + 126 0 5 0 0D 4110 + 126 5650 00010000D 4111 + 126 0 5 0 0D 4112 + 126 5655 00010000D 4113 + 126 0 5 0 0D 4114 + 126 5660 00010000D 4115 + 126 0 4 0 0D 4116 + 126 5664 00010000D 4117 + 126 0 3 0 0D 4118 + 126 5667 00010000D 4119 + 126 0 5 0 0D 4120 + 126 5672 00010000D 4121 + 126 0 3 0 0D 4122 + 126 5675 00010000D 4123 + 126 0 3 0 0D 4124 + 126 5678 00010000D 4125 + 126 0 4 0 0D 4126 + 126 5682 00010000D 4127 + 126 0 3 0 0D 4128 + 126 5685 00010000D 4129 + 126 0 5 0 0D 4130 + 126 5690 00010000D 4131 + 126 0 3 0 0D 4132 + 126 5693 00010000D 4133 + 126 0 5 0 0D 4134 + 126 5698 00010000D 4135 + 126 0 4 0 0D 4136 + 126 5702 00010000D 4137 + 126 0 4 0 0D 4138 + 126 5706 00010000D 4139 + 126 0 5 0 0D 4140 + 126 5711 00010000D 4141 + 126 0 5 0 0D 4142 + 126 5716 00010000D 4143 + 126 0 5 0 0D 4144 + 126 5721 00010000D 4145 + 126 0 5 0 0D 4146 + 126 5726 00010000D 4147 + 126 0 5 0 0D 4148 + 126 5731 00010000D 4149 + 126 0 3 0 0D 4150 + 126 5734 00010000D 4151 + 126 0 3 0 0D 4152 + 126 5737 00010000D 4153 + 126 0 3 0 0D 4154 + 126 5740 00010000D 4155 + 126 0 3 0 0D 4156 + 126 5743 00010000D 4157 + 126 0 3 0 0D 4158 + 126 5746 00010000D 4159 + 126 0 5 0 0D 4160 + 126 5751 00010000D 4161 + 126 0 3 0 0D 4162 + 126 5754 00010000D 4163 + 126 0 3 0 0D 4164 + 126 5757 00010000D 4165 + 126 0 5 0 0D 4166 + 126 5762 00010000D 4167 + 126 0 3 0 0D 4168 + 126 5765 00010000D 4169 + 126 0 9 0 0D 4170 + 126 5774 00010000D 4171 + 126 0 3 0 0D 4172 + 126 5777 00010000D 4173 + 126 0 5 0 0D 4174 + 126 5782 00010000D 4175 + 126 0 3 0 0D 4176 + 126 5785 00010000D 4177 + 126 0 6 0 0D 4178 + 126 5791 00010000D 4179 + 126 0 3 0 0D 4180 + 126 5794 00010000D 4181 + 126 0 5 0 0D 4182 + 126 5799 00010000D 4183 + 126 0 3 0 0D 4184 + 126 5802 00010000D 4185 + 126 0 6 0 0D 4186 + 126 5808 00010000D 4187 + 126 0 6 0 0D 4188 + 126 5814 00010000D 4189 + 126 0 5 0 0D 4190 + 126 5819 00010000D 4191 + 126 0 5 0 0D 4192 + 126 5824 00010000D 4193 + 126 0 4 0 0D 4194 + 126 5828 00010000D 4195 + 126 0 8 0 0D 4196 + 126 5836 00010000D 4197 + 126 0 4 0 0D 4198 + 126 5840 00010000D 4199 + 126 0 5 0 0D 4200 + 126 5845 00010000D 4201 + 126 0 4 0 0D 4202 + 126 5849 00010000D 4203 + 126 0 5 0 0D 4204 + 126 5854 00010000D 4205 + 126 0 4 0 0D 4206 + 126 5858 00010000D 4207 + 126 0 3 0 0D 4208 + 126 5861 00010000D 4209 + 126 0 3 0 0D 4210 + 126 5864 00010000D 4211 + 126 0 3 0 0D 4212 + 126 5867 00010000D 4213 + 126 0 3 0 0D 4214 + 126 5870 00010000D 4215 + 126 0 3 0 0D 4216 + 126 5873 00010000D 4217 + 126 0 7 0 0D 4218 + 126 5880 00010000D 4219 + 126 0 3 0 0D 4220 + 126 5883 00010000D 4221 + 126 0 4 0 0D 4222 + 126 5887 00010000D 4223 + 126 0 3 0 0D 4224 + 126 5890 00010000D 4225 + 126 0 6 0 0D 4226 + 126 5896 00010000D 4227 + 126 0 3 0 0D 4228 + 126 5899 00010000D 4229 + 126 0 4 0 0D 4230 + 126 5903 00010000D 4231 + 126 0 3 0 0D 4232 + 126 5906 00010000D 4233 + 126 0 6 0 0D 4234 + 126 5912 00010000D 4235 + 126 0 3 0 0D 4236 + 126 5915 00010000D 4237 + 126 0 4 0 0D 4238 + 126 5919 00010000D 4239 + 126 0 4 0 0D 4240 + 126 5923 00010000D 4241 + 126 0 3 0 0D 4242 + 126 5926 00010000D 4243 + 126 0 4 0 0D 4244 + 126 5930 00010000D 4245 + 126 0 5 0 0D 4246 + 126 5935 00010000D 4247 + 126 0 3 0 0D 4248 + 126 5938 00010000D 4249 + 126 0 4 0 0D 4250 + 126 5942 00010000D 4251 + 126 0 3 0 0D 4252 + 126 5945 00010000D 4253 + 126 0 4 0 0D 4254 + 126 5949 00010000D 4255 + 126 0 4 0 0D 4256 + 126 5953 00010000D 4257 + 126 0 4 0 0D 4258 + 126 5957 00010000D 4259 + 126 0 4 0 0D 4260 + 126 5961 00010000D 4261 + 126 0 4 0 0D 4262 + 126 5965 00010000D 4263 + 126 0 4 0 0D 4264 + 126 5969 00010000D 4265 + 126 0 4 0 0D 4266 + 126 5973 00010000D 4267 + 126 0 4 0 0D 4268 + 126 5977 00010000D 4269 + 126 0 4 0 0D 4270 + 126 5981 00010000D 4271 + 126 0 3 0 0D 4272 + 126 5984 00010000D 4273 + 126 0 4 0 0D 4274 + 126 5988 00010000D 4275 + 126 0 3 0 0D 4276 + 126 5991 00010000D 4277 + 126 0 4 0 0D 4278 + 126 5995 00010000D 4279 + 126 0 3 0 0D 4280 + 126 5998 00010000D 4281 + 126 0 4 0 0D 4282 + 126 6002 00010000D 4283 + 126 0 3 0 0D 4284 + 126 6005 00010000D 4285 + 126 0 4 0 0D 4286 + 126 6009 00010000D 4287 + 126 0 3 0 0D 4288 + 126 6012 00010000D 4289 + 126 0 3 0 0D 4290 + 126 6015 00010000D 4291 + 126 0 4 0 0D 4292 + 126 6019 00010000D 4293 + 126 0 3 0 0D 4294 + 126 6022 00010000D 4295 + 126 0 5 0 0D 4296 + 126 6027 00010000D 4297 + 126 0 4 0 0D 4298 + 126 6031 00010000D 4299 + 126 0 3 0 0D 4300 + 126 6034 00010000D 4301 + 126 0 3 0 0D 4302 + 126 6037 00010000D 4303 + 126 0 4 0 0D 4304 + 126 6041 00010000D 4305 + 126 0 3 0 0D 4306 + 126 6044 00010000D 4307 + 126 0 4 0 0D 4308 + 126 6048 00010000D 4309 + 126 0 3 0 0D 4310 + 126 6051 00010000D 4311 + 126 0 4 0 0D 4312 + 126 6055 00010000D 4313 + 126 0 3 0 0D 4314 + 126 6058 00010000D 4315 + 126 0 4 0 0D 4316 + 126 6062 00010000D 4317 + 126 0 4 0 0D 4318 + 126 6066 00010000D 4319 + 126 0 4 0 0D 4320 + 126 6070 00010000D 4321 + 126 0 3 0 0D 4322 + 126 6073 00010000D 4323 + 126 0 3 0 0D 4324 + 126 6076 00010000D 4325 + 126 0 3 0 0D 4326 + 126 6079 00010000D 4327 + 126 0 3 0 0D 4328 + 126 6082 00010000D 4329 + 126 0 3 0 0D 4330 + 126 6085 00010000D 4331 + 126 0 4 0 0D 4332 + 126 6089 00010000D 4333 + 126 0 4 0 0D 4334 + 126 6093 00010000D 4335 + 126 0 3 0 0D 4336 + 126 6096 00010000D 4337 + 126 0 4 0 0D 4338 + 126 6100 00010000D 4339 + 126 0 4 0 0D 4340 + 126 6104 00010000D 4341 + 126 0 4 0 0D 4342 + 126 6108 00010000D 4343 + 126 0 4 0 0D 4344 + 126 6112 00010000D 4345 + 126 0 5 0 0D 4346 + 126 6117 00010000D 4347 + 126 0 3 0 0D 4348 + 126 6120 00010000D 4349 + 126 0 5 0 0D 4350 + 126 6125 00010000D 4351 + 126 0 3 0 0D 4352 + 126 6128 00010000D 4353 + 126 0 7 0 0D 4354 + 126 6135 00010000D 4355 + 126 0 3 0 0D 4356 + 126 6138 00010000D 4357 + 126 0 3 0 0D 4358 + 126 6141 00010000D 4359 + 126 0 5 0 0D 4360 + 126 6146 00010000D 4361 + 126 0 11 0 0D 4362 + 126 6157 00010000D 4363 + 126 0 11 0 0D 4364 + 126 6168 00010000D 4365 + 126 0 11 0 0D 4366 + 126 6179 00010000D 4367 + 126 0 11 0 0D 4368 + 126 6190 00010000D 4369 + 126 0 11 0 0D 4370 + 126 6201 00010000D 4371 + 126 0 11 0 0D 4372 + 126 6212 00010000D 4373 + 126 0 11 0 0D 4374 + 126 6223 00010000D 4375 + 126 0 11 0 0D 4376 + 126 6234 00010000D 4377 + 126 0 11 0 0D 4378 + 126 6245 00010000D 4379 + 126 0 9 0 0D 4380 + 126 6254 00010000D 4381 + 126 0 11 0 0D 4382 + 126 6265 00010000D 4383 + 126 0 9 0 0D 4384 + 126 6274 00010000D 4385 + 126 0 4 0 0D 4386 + 126 6278 00010000D 4387 + 126 0 3 0 0D 4388 + 126 6281 00010000D 4389 + 126 0 3 0 0D 4390 + 126 6284 00010000D 4391 + 126 0 3 0 0D 4392 + 126 6287 00010000D 4393 + 126 0 6 0 0D 4394 + 126 6293 00010000D 4395 + 126 0 3 0 0D 4396 + 126 6296 00010000D 4397 + 126 0 6 0 0D 4398 + 126 6302 00010000D 4399 + 126 0 6 0 0D 4400 + 126 6308 00010000D 4401 + 126 0 3 0 0D 4402 + 126 6311 00010000D 4403 + 126 0 6 0 0D 4404 + 126 6317 00010000D 4405 + 126 0 6 0 0D 4406 + 126 6323 00010000D 4407 + 126 0 3 0 0D 4408 + 126 6326 00010000D 4409 + 126 0 6 0 0D 4410 + 126 6332 00010000D 4411 + 126 0 6 0 0D 4412 + 126 6338 00010000D 4413 + 126 0 3 0 0D 4414 + 126 6341 00010000D 4415 + 126 0 6 0 0D 4416 + 126 6347 00010000D 4417 + 126 0 6 0 0D 4418 + 126 6353 00010000D 4419 + 126 0 3 0 0D 4420 + 126 6356 00010000D 4421 + 126 0 6 0 0D 4422 + 126 6362 00010000D 4423 + 126 0 6 0 0D 4424 + 126 6368 00010000D 4425 + 126 0 3 0 0D 4426 + 126 6371 00010000D 4427 + 126 0 6 0 0D 4428 + 126 6377 00010000D 4429 + 126 0 4 0 0D 4430 + 126 6381 00010000D 4431 + 126 0 3 0 0D 4432 + 126 6384 00010000D 4433 + 126 0 3 0 0D 4434 + 126 6387 00010000D 4435 + 126 0 4 0 0D 4436 + 126 6391 00010000D 4437 + 126 0 3 0 0D 4438 + 126 6394 00010000D 4439 + 126 0 4 0 0D 4440 + 126 6398 00010000D 4441 + 126 0 3 0 0D 4442 + 126 6401 00010000D 4443 + 126 0 3 0 0D 4444 + 126 6404 00010000D 4445 + 126 0 3 0 0D 4446 + 126 6407 00010000D 4447 + 126 0 4 0 0D 4448 + 126 6411 00010000D 4449 + 126 0 3 0 0D 4450 + 126 6414 00010000D 4451 + 126 0 3 0 0D 4452 + 126 6417 00010000D 4453 + 126 0 6 0 0D 4454 + 126 6423 00010000D 4455 + 126 0 3 0 0D 4456 + 126 6426 00010000D 4457 + 126 0 6 0 0D 4458 + 126 6432 00010000D 4459 + 126 0 6 0 0D 4460 + 126 6438 00010000D 4461 + 126 0 3 0 0D 4462 + 126 6441 00010000D 4463 + 126 0 6 0 0D 4464 + 126 6447 00010000D 4465 + 126 0 6 0 0D 4466 + 126 6453 00010000D 4467 + 126 0 3 0 0D 4468 + 126 6456 00010000D 4469 + 126 0 6 0 0D 4470 + 126 6462 00010000D 4471 + 126 0 4 0 0D 4472 + 126 6466 00010000D 4473 + 126 0 3 0 0D 4474 + 126 6469 00010000D 4475 + 126 0 3 0 0D 4476 + 126 6472 00010000D 4477 + 126 0 4 0 0D 4478 + 126 6476 00010000D 4479 + 126 0 3 0 0D 4480 + 126 6479 00010000D 4481 + 126 0 3 0 0D 4482 + 126 6482 00010000D 4483 + 126 0 4 0 0D 4484 + 126 6486 00010000D 4485 + 126 0 3 0 0D 4486 + 126 6489 00010000D 4487 + 126 0 3 0 0D 4488 + 126 6492 00010000D 4489 + 126 0 6 0 0D 4490 + 126 6498 00010000D 4491 + 126 0 3 0 0D 4492 + 126 6501 00010000D 4493 + 126 0 6 0 0D 4494 + 126 6507 00010000D 4495 + 126 0 6 0 0D 4496 + 126 6513 00010000D 4497 + 126 0 3 0 0D 4498 + 126 6516 00010000D 4499 + 126 0 6 0 0D 4500 + 126 6522 00010000D 4501 + 126 0 6 0 0D 4502 + 126 6528 00010000D 4503 + 126 0 3 0 0D 4504 + 126 6531 00010000D 4505 + 126 0 6 0 0D 4506 + 126 6537 00010000D 4507 + 126 0 6 0 0D 4508 + 126 6543 00010000D 4509 + 126 0 3 0 0D 4510 + 126 6546 00010000D 4511 + 126 0 6 0 0D 4512 + 126 6552 00010000D 4513 + 126 0 6 0 0D 4514 + 126 6558 00010000D 4515 + 126 0 3 0 0D 4516 + 126 6561 00010000D 4517 + 126 0 6 0 0D 4518 + 126 6567 00010000D 4519 + 126 0 6 0 0D 4520 + 126 6573 00010000D 4521 + 126 0 3 0 0D 4522 + 126 6576 00010000D 4523 + 126 0 6 0 0D 4524 + 126 6582 00010000D 4525 + 126 0 6 0 0D 4526 + 126 6588 00010000D 4527 + 126 0 3 0 0D 4528 + 126 6591 00010000D 4529 + 126 0 6 0 0D 4530 + 126 6597 00010000D 4531 + 126 0 4 0 0D 4532 + 126 6601 00010000D 4533 + 126 0 3 0 0D 4534 + 126 6604 00010000D 4535 + 126 0 3 0 0D 4536 + 126 6607 00010000D 4537 + 126 0 4 0 0D 4538 + 126 6611 00010000D 4539 + 126 0 3 0 0D 4540 + 126 6614 00010000D 4541 + 126 0 3 0 0D 4542 + 126 6617 00010000D 4543 + 126 0 4 0 0D 4544 + 126 6621 00010000D 4545 + 126 0 3 0 0D 4546 + 126 6624 00010000D 4547 + 126 0 4 0 0D 4548 + 126 6628 00010000D 4549 + 126 0 6 0 0D 4550 + 126 6634 00010000D 4551 + 126 0 8 0 0D 4552 + 126 6642 00010000D 4553 + 126 0 4 0 0D 4554 + 126 6646 00010000D 4555 + 126 0 4 0 0D 4556 + 126 6650 00010000D 4557 + 126 0 4 0 0D 4558 + 126 6654 00010000D 4559 + 126 0 4 0 0D 4560 + 126 6658 00010000D 4561 + 126 0 4 0 0D 4562 + 126 6662 00010000D 4563 + 126 0 4 0 0D 4564 + 126 6666 00010000D 4565 + 126 0 4 0 0D 4566 + 126 6670 00010000D 4567 + 126 0 8 0 0D 4568 + 126 6678 00010000D 4569 + 126 0 4 0 0D 4570 + 126 6682 00010000D 4571 + 126 0 6 0 0D 4572 + 126 6688 00010000D 4573 + 126 0 4 0 0D 4574 + 126 6692 00010000D 4575 + 126 0 3 0 0D 4576 + 126 6695 00010000D 4577 + 126 0 11 0 0D 4578 + 126 6706 00010000D 4579 + 126 0 4 0 0D 4580 + 126 6710 00010000D 4581 + 126 0 11 0 0D 4582 + 126 6721 00010000D 4583 + 126 0 11 0 0D 4584 + 126 6732 00010000D 4585 + 126 0 11 0 0D 4586 + 126 6743 00010000D 4587 + 126 0 11 0 0D 4588 + 126 6754 00010000D 4589 + 126 0 11 0 0D 4590 + 126 6765 00010000D 4591 + 126 0 11 0 0D 4592 + 126 6776 00010000D 4593 + 126 0 11 0 0D 4594 + 126 6787 00010000D 4595 + 126 0 11 0 0D 4596 + 126 6798 00010000D 4597 + 126 0 11 0 0D 4598 + 126 6809 00010000D 4599 + 126 0 13 0 0D 4600 + 126 6822 00010000D 4601 + 126 0 13 0 0D 4602 + 126 6835 00010000D 4603 + 126 0 11 0 0D 4604 + 126 6846 00010000D 4605 + 126 0 11 0 0D 4606 + 126 6857 00010000D 4607 + 126 0 3 0 0D 4608 + 126 6860 00010000D 4609 + 126 0 3 0 0D 4610 + 126 6863 00010000D 4611 + 126 0 3 0 0D 4612 + 126 6866 00010000D 4613 + 126 0 3 0 0D 4614 + 126 6869 00010000D 4615 + 126 0 6 0 0D 4616 + 126 6875 00010000D 4617 + 126 0 3 0 0D 4618 + 126 6878 00010000D 4619 + 126 0 3 0 0D 4620 + 126 6881 00010000D 4621 + 126 0 3 0 0D 4622 + 126 6884 00010000D 4623 + 126 0 3 0 0D 4624 + 126 6887 00010000D 4625 + 126 0 4 0 0D 4626 + 126 6891 00010000D 4627 + 126 0 3 0 0D 4628 + 126 6894 00010000D 4629 + 126 0 3 0 0D 4630 + 126 6897 00010000D 4631 + 126 0 4 0 0D 4632 + 126 6901 00010000D 4633 + 126 0 5 0 0D 4634 + 126 6906 00010000D 4635 + 126 0 6 0 0D 4636 + 126 6912 00010000D 4637 + 126 0 4 0 0D 4638 + 126 6916 00010000D 4639 + 126 0 4 0 0D 4640 + 126 6920 00010000D 4641 + 126 0 4 0 0D 4642 + 126 6924 00010000D 4643 + 126 0 6 0 0D 4644 + 126 6930 00010000D 4645 + 126 0 6 0 0D 4646 + 126 6936 00010000D 4647 + 126 0 4 0 0D 4648 + 126 6940 00010000D 4649 + 126 0 3 0 0D 4650 + 126 6943 00010000D 4651 + 126 0 4 0 0D 4652 + 126 6947 00010000D 4653 + 126 0 3 0 0D 4654 + 126 6950 00010000D 4655 + 126 0 6 0 0D 4656 + 126 6956 00010000D 4657 + 126 0 4 0 0D 4658 + 126 6960 00010000D 4659 + 126 0 6 0 0D 4660 + 126 6966 00010000D 4661 + 126 0 4 0 0D 4662 + 126 6970 00010000D 4663 + 126 0 6 0 0D 4664 + 126 6976 00010000D 4665 + 126 0 4 0 0D 4666 + 126 6980 00010000D 4667 + 126 0 3 0 0D 4668 + 126 6983 00010000D 4669 + 126 0 3 0 0D 4670 + 126 6986 00010000D 4671 + 126 0 3 0 0D 4672 + 126 6989 00010000D 4673 + 126 0 3 0 0D 4674 + 126 6992 00010000D 4675 + 126 0 3 0 0D 4676 + 126 6995 00010000D 4677 + 126 0 3 0 0D 4678 + 126 6998 00010000D 4679 + 126 0 3 0 0D 4680 + 126 7001 00010000D 4681 + 126 0 3 0 0D 4682 + 126 7004 00010000D 4683 + 126 0 3 0 0D 4684 + 126 7007 00010000D 4685 + 126 0 4 0 0D 4686 + 126 7011 00010000D 4687 + 126 0 3 0 0D 4688 + 126 7014 00010000D 4689 + 126 0 3 0 0D 4690 + 126 7017 00010000D 4691 + 126 0 4 0 0D 4692 + 126 7021 00010000D 4693 + 126 0 3 0 0D 4694 + 126 7024 00010000D 4695 + 126 0 3 0 0D 4696 + 126 7027 00010000D 4697 + 126 0 3 0 0D 4698 + 126 7030 00010000D 4699 + 126 0 3 0 0D 4700 + 126 7033 00010000D 4701 + 126 0 3 0 0D 4702 + 126 7036 00010000D 4703 + 126 0 4 0 0D 4704 + 126 7040 00010000D 4705 + 126 0 3 0 0D 4706 + 126 7043 00010000D 4707 + 126 0 3 0 0D 4708 + 126 7046 00010000D 4709 + 126 0 4 0 0D 4710 + 126 7050 00010000D 4711 + 126 0 3 0 0D 4712 + 126 7053 00010000D 4713 + 126 0 7 0 0D 4714 + 126 7060 00010000D 4715 + 126 0 3 0 0D 4716 + 126 7063 00010000D 4717 + 126 0 4 0 0D 4718 + 126 7067 00010000D 4719 + 126 0 3 0 0D 4720 + 126 7070 00010000D 4721 + 126 0 5 0 0D 4722 + 126 7075 00010000D 4723 + 126 0 3 0 0D 4724 + 126 7078 00010000D 4725 + 126 0 4 0 0D 4726 + 126 7082 00010000D 4727 + 126 0 3 0 0D 4728 + 126 7085 00010000D 4729 + 126 0 5 0 0D 4730 + 126 7090 00010000D 4731 + 126 0 5 0 0D 4732 + 126 7095 00010000D 4733 + 126 0 5 0 0D 4734 + 126 7100 00010000D 4735 + 126 0 4 0 0D 4736 + 126 7104 00010000D 4737 + 126 0 3 0 0D 4738 + 126 7107 00010000D 4739 + 126 0 7 0 0D 4740 + 126 7114 00010000D 4741 + 126 0 3 0 0D 4742 + 126 7117 00010000D 4743 + 126 0 5 0 0D 4744 + 126 7122 00010000D 4745 + 126 0 3 0 0D 4746 + 126 7125 00010000D 4747 + 126 0 5 0 0D 4748 + 126 7130 00010000D 4749 + 126 0 3 0 0D 4750 + 126 7133 00010000D 4751 + 126 0 3 0 0D 4752 + 126 7136 00010000D 4753 + 126 0 3 0 0D 4754 + 126 7139 00010000D 4755 + 126 0 3 0 0D 4756 + 126 7142 00010000D 4757 + 126 0 3 0 0D 4758 + 126 7145 00010000D 4759 + 126 0 3 0 0D 4760 + 126 7148 00010000D 4761 + 126 0 3 0 0D 4762 + 128 7151 00010000D 4763 + 128 0 -5703 23 0 0D 4764 + 128 7174 00010000D 4765 + 128 0 -5703 23 0 0D 4766 + 128 7197 00010000D 4767 + 128 0 -5703 23 0 0D 4768 + 128 7220 00010000D 4769 + 128 0 -5703 23 0 0D 4770 + 128 7243 00010000D 4771 + 128 0 -5703 20 0 0D 4772 + 128 7263 00010000D 4773 + 128 0 -5703 20 0 0D 4774 + 128 7283 00010000D 4775 + 128 0 -5703 20 0 0D 4776 + 128 7303 00010000D 4777 + 128 0 -5703 20 0 0D 4778 + 128 7323 00010000D 4779 + 128 0 -5703 8 0 0D 4780 + 128 7331 00010000D 4781 + 128 0 -5703 7 0 0D 4782 + 128 7338 00010000D 4783 + 128 0 -5703 7 0 0D 4784 + 128 7345 00010000D 4785 + 128 0 -5703 7 0 0D 4786 + 128 7352 00010000D 4787 + 128 0 -5703 8 0 0D 4788 + 128 7360 00010000D 4789 + 128 0 -5703 7 0 0D 4790 + 128 7367 00010000D 4791 + 128 0 -5703 7 0 0D 4792 + 128 7374 00010000D 4793 + 128 0 -5703 7 0 0D 4794 + 128 7381 00010000D 4795 + 128 0 -5703 8 0 0D 4796 + 128 7389 00010000D 4797 + 128 0 -5703 7 0 0D 4798 + 128 7396 00010000D 4799 + 128 0 -5703 7 0 0D 4800 + 128 7403 00010000D 4801 + 128 0 -5703 7 0 0D 4802 + 128 7410 00010000D 4803 + 128 0 -5703 8 0 0D 4804 + 128 7418 00010000D 4805 + 128 0 -5703 7 0 0D 4806 + 128 7425 00010000D 4807 + 128 0 -5703 7 0 0D 4808 + 128 7432 00010000D 4809 + 128 0 -5703 7 0 0D 4810 + 128 7439 00010000D 4811 + 128 0 -5703 8 0 0D 4812 + 128 7447 00010000D 4813 + 128 0 -5703 7 0 0D 4814 + 128 7454 00010000D 4815 + 128 0 -5703 7 0 0D 4816 + 128 7461 00010000D 4817 + 128 0 -5703 7 0 0D 4818 + 128 7468 00010000D 4819 + 128 0 -5703 8 0 0D 4820 + 128 7476 00010000D 4821 + 128 0 -5703 7 0 0D 4822 + 128 7483 00010000D 4823 + 128 0 -5703 7 0 0D 4824 + 128 7490 00010000D 4825 + 128 0 -5703 7 0 0D 4826 + 128 7497 00010000D 4827 + 128 0 -5703 8 0 0D 4828 + 128 7505 00010000D 4829 + 128 0 -5703 7 0 0D 4830 + 128 7512 00010000D 4831 + 128 0 -5703 7 0 0D 4832 + 128 7519 00010000D 4833 + 128 0 -5703 7 0 0D 4834 + 128 7526 00010000D 4835 + 128 0 -5703 8 0 0D 4836 + 128 7534 00010000D 4837 + 128 0 -5703 7 0 0D 4838 + 128 7541 00010000D 4839 + 128 0 -5703 7 0 0D 4840 + 128 7548 00010000D 4841 + 128 0 -5703 6 0 0D 4842 + 128 7554 00010000D 4843 + 128 0 -5703 8 0 0D 4844 + 128 7562 00010000D 4845 + 128 0 -5703 6 0 0D 4846 + 128 7568 00010000D 4847 + 128 0 -5703 7 0 0D 4848 + 128 7575 00010000D 4849 + 128 0 -5703 6 0 0D 4850 + 128 7581 00010000D 4851 + 128 0 -5703 8 0 0D 4852 + 128 7589 00010000D 4853 + 128 0 -5703 7 0 0D 4854 + 128 7596 00010000D 4855 + 128 0 -5703 7 0 0D 4856 + 128 7603 00010000D 4857 + 128 0 -5703 6 0 0D 4858 + 128 7609 00010000D 4859 + 128 0 -5703 8 0 0D 4860 + 128 7617 00010000D 4861 + 128 0 -5703 6 0 0D 4862 + 128 7623 00010000D 4863 + 128 0 -5703 6 0 0D 4864 + 128 7629 00010000D 4865 + 128 0 -5703 6 0 0D 4866 + 128 7635 00010000D 4867 + 128 0 -5703 8 0 0D 4868 + 128 7643 00010000D 4869 + 128 0 -5703 6 0 0D 4870 + 128 7649 00010000D 4871 + 128 0 -5703 6 0 0D 4872 + 128 7655 00010000D 4873 + 128 0 -5703 6 0 0D 4874 + 128 7661 00010000D 4875 + 128 0 -5703 8 0 0D 4876 + 128 7669 00010000D 4877 + 128 0 -5703 6 0 0D 4878 + 128 7675 00010000D 4879 + 128 0 -5703 6 0 0D 4880 + 128 7681 00010000D 4881 + 128 0 -5703 6 0 0D 4882 + 128 7687 00010000D 4883 + 128 0 -5703 8 0 0D 4884 + 128 7695 00010000D 4885 + 128 0 -5703 6 0 0D 4886 + 128 7701 00010000D 4887 + 128 0 -5703 6 0 0D 4888 + 128 7707 00010000D 4889 + 128 0 -5703 6 0 0D 4890 + 128 7713 00010000D 4891 + 128 0 -5703 8 0 0D 4892 + 128 7721 00010000D 4893 + 128 0 -5703 6 0 0D 4894 + 128 7727 00010000D 4895 + 128 0 -5703 6 0 0D 4896 + 128 7733 00010000D 4897 + 128 0 -5703 6 0 0D 4898 + 128 7739 00010000D 4899 + 128 0 -5703 6 0 0D 4900 + 128 7745 00010000D 4901 + 128 0 -5703 6 0 0D 4902 + 128 7751 00010000D 4903 + 128 0 -5703 8 0 0D 4904 + 128 7759 00010000D 4905 + 128 0 -5703 6 0 0D 4906 + 128 7765 00010000D 4907 + 128 0 -5703 6 0 0D 4908 + 128 7771 00010000D 4909 + 128 0 -5703 6 0 0D 4910 + 128 7777 00010000D 4911 + 128 0 -5703 7 0 0D 4912 + 128 7784 00010000D 4913 + 128 0 -5703 6 0 0D 4914 + 128 7790 00010000D 4915 + 128 0 -5703 7 0 0D 4916 + 128 7797 00010000D 4917 + 128 0 -5703 6 0 0D 4918 + 128 7803 00010000D 4919 + 128 0 -5703 6 0 0D 4920 + 128 7809 00010000D 4921 + 128 0 -5703 6 0 0D 4922 + 128 7815 00010000D 4923 + 128 0 -5703 8 0 0D 4924 + 128 7823 00010000D 4925 + 128 0 -5703 7 0 0D 4926 + 128 7830 00010000D 4927 + 128 0 -5703 7 0 0D 4928 + 128 7837 00010000D 4929 + 128 0 -5703 7 0 0D 4930 + 128 7844 00010000D 4931 + 128 0 -5703 8 0 0D 4932 + 128 7852 00010000D 4933 + 128 0 -5703 7 0 0D 4934 + 128 7859 00010000D 4935 + 128 0 -5703 7 0 0D 4936 + 128 7866 00010000D 4937 + 128 0 -5703 7 0 0D 4938 + 128 7873 00010000D 4939 + 128 0 -5703 8 0 0D 4940 + 128 7881 00010000D 4941 + 128 0 -5703 7 0 0D 4942 + 128 7888 00010000D 4943 + 128 0 -5703 7 0 0D 4944 + 128 7895 00010000D 4945 + 128 0 -5703 7 0 0D 4946 + 128 7902 00010000D 4947 + 128 0 -5703 8 0 0D 4948 + 128 7910 00010000D 4949 + 128 0 -5703 7 0 0D 4950 + 128 7917 00010000D 4951 + 128 0 -5703 7 0 0D 4952 + 128 7924 00010000D 4953 + 128 0 -5703 7 0 0D 4954 + 128 7931 00010000D 4955 + 128 0 -5703 8 0 0D 4956 + 128 7939 00010000D 4957 + 128 0 -5703 7 0 0D 4958 + 128 7946 00010000D 4959 + 128 0 -5703 7 0 0D 4960 + 128 7953 00010000D 4961 + 128 0 -5703 7 0 0D 4962 + 128 7960 00010000D 4963 + 128 0 -5703 8 0 0D 4964 + 128 7968 00010000D 4965 + 128 0 -5703 7 0 0D 4966 + 128 7975 00010000D 4967 + 128 0 -5703 7 0 0D 4968 + 128 7982 00010000D 4969 + 128 0 -5703 7 0 0D 4970 + 128 7989 00010000D 4971 + 128 0 -5703 8 0 0D 4972 + 128 7997 00010000D 4973 + 128 0 -5703 7 0 0D 4974 + 128 8004 00010000D 4975 + 128 0 -5703 7 0 0D 4976 + 128 8011 00010000D 4977 + 128 0 -5703 7 0 0D 4978 + 128 8018 00010000D 4979 + 128 0 -5703 8 0 0D 4980 + 128 8026 00010000D 4981 + 128 0 -5703 7 0 0D 4982 + 128 8033 00010000D 4983 + 128 0 -5703 7 0 0D 4984 + 128 8040 00010000D 4985 + 128 0 -5703 7 0 0D 4986 + 128 8047 00010000D 4987 + 128 0 -5703 8 0 0D 4988 + 128 8055 00010000D 4989 + 128 0 -5703 6 0 0D 4990 + 128 8061 00010000D 4991 + 128 0 -5703 7 0 0D 4992 + 128 8068 00010000D 4993 + 128 0 -5703 6 0 0D 4994 + 128 8074 00010000D 4995 + 128 0 -5703 8 0 0D 4996 + 128 8082 00010000D 4997 + 128 0 -5703 7 0 0D 4998 + 128 8089 00010000D 4999 + 128 0 -5703 7 0 0D 5000 + 128 8096 00010000D 5001 + 128 0 -5703 6 0 0D 5002 + 128 8102 00010000D 5003 + 128 0 -5703 8 0 0D 5004 + 128 8110 00010000D 5005 + 128 0 -5703 6 0 0D 5006 + 128 8116 00010000D 5007 + 128 0 -5703 6 0 0D 5008 + 128 8122 00010000D 5009 + 128 0 -5703 6 0 0D 5010 + 128 8128 00010000D 5011 + 128 0 -5703 8 0 0D 5012 + 128 8136 00010000D 5013 + 128 0 -5703 6 0 0D 5014 + 128 8142 00010000D 5015 + 128 0 -5703 6 0 0D 5016 + 128 8148 00010000D 5017 + 128 0 -5703 6 0 0D 5018 + 128 8154 00010000D 5019 + 128 0 -5703 8 0 0D 5020 + 128 8162 00010000D 5021 + 128 0 -5703 6 0 0D 5022 + 128 8168 00010000D 5023 + 128 0 -5703 6 0 0D 5024 + 128 8174 00010000D 5025 + 128 0 -5703 6 0 0D 5026 + 128 8180 00010000D 5027 + 128 0 -5703 8 0 0D 5028 + 128 8188 00010000D 5029 + 128 0 -5703 6 0 0D 5030 + 128 8194 00010000D 5031 + 128 0 -5703 6 0 0D 5032 + 128 8200 00010000D 5033 + 128 0 -5703 6 0 0D 5034 + 128 8206 00010000D 5035 + 128 0 -5703 8 0 0D 5036 + 128 8214 00010000D 5037 + 128 0 -5703 6 0 0D 5038 + 128 8220 00010000D 5039 + 128 0 -5703 6 0 0D 5040 + 128 8226 00010000D 5041 + 128 0 -5703 6 0 0D 5042 + 128 8232 00010000D 5043 + 128 0 -5703 6 0 0D 5044 + 128 8238 00010000D 5045 + 128 0 -5703 6 0 0D 5046 + 128 8244 00010000D 5047 + 128 0 -5703 8 0 0D 5048 + 128 8252 00010000D 5049 + 128 0 -5703 6 0 0D 5050 + 128 8258 00010000D 5051 + 128 0 -5703 6 0 0D 5052 + 128 8264 00010000D 5053 + 128 0 -5703 6 0 0D 5054 + 128 8270 00010000D 5055 + 128 0 -5703 7 0 0D 5056 + 128 8277 00010000D 5057 + 128 0 -5703 6 0 0D 5058 + 128 8283 00010000D 5059 + 128 0 -5703 7 0 0D 5060 + 128 8290 00010000D 5061 + 128 0 -5703 6 0 0D 5062 + 128 8296 00010000D 5063 + 128 0 -5703 6 0 0D 5064 + 128 8302 00010000D 5065 + 128 0 -5703 6 0 0D 5066 + 128 8308 00010000D 5067 + 128 0 -5703 8 0 0D 5068 + 128 8316 00010000D 5069 + 128 0 -5703 7 0 0D 5070 + 128 8323 00010000D 5071 + 128 0 -5703 7 0 0D 5072 + 128 8330 00010000D 5073 + 128 0 -5703 7 0 0D 5074 + 128 8337 00010000D 5075 + 128 0 -5703 8 0 0D 5076 + 128 8345 00010000D 5077 + 128 0 -5703 7 0 0D 5078 + 128 8352 00010000D 5079 + 128 0 -5703 7 0 0D 5080 + 128 8359 00010000D 5081 + 128 0 -5703 7 0 0D 5082 + 128 8366 00010000D 5083 + 128 0 -5703 8 0 0D 5084 + 128 8374 00010000D 5085 + 128 0 -5703 7 0 0D 5086 + 128 8381 00010000D 5087 + 128 0 -5703 7 0 0D 5088 + 128 8388 00010000D 5089 + 128 0 -5703 7 0 0D 5090 + 128 8395 00010000D 5091 + 128 0 -5703 8 0 0D 5092 + 128 8403 00010000D 5093 + 128 0 -5703 7 0 0D 5094 + 128 8410 00010000D 5095 + 128 0 -5703 7 0 0D 5096 + 128 8417 00010000D 5097 + 128 0 -5703 7 0 0D 5098 + 128 8424 00010000D 5099 + 128 0 -5703 8 0 0D 5100 + 128 8432 00010000D 5101 + 128 0 -5703 7 0 0D 5102 + 128 8439 00010000D 5103 + 128 0 -5703 7 0 0D 5104 + 128 8446 00010000D 5105 + 128 0 -5703 7 0 0D 5106 + 128 8453 00010000D 5107 + 128 0 -5703 8 0 0D 5108 + 128 8461 00010000D 5109 + 128 0 -5703 7 0 0D 5110 + 128 8468 00010000D 5111 + 128 0 -5703 7 0 0D 5112 + 128 8475 00010000D 5113 + 128 0 -5703 7 0 0D 5114 + 128 8482 00010000D 5115 + 128 0 -5703 8 0 0D 5116 + 128 8490 00010000D 5117 + 128 0 -5703 7 0 0D 5118 + 128 8497 00010000D 5119 + 128 0 -5703 7 0 0D 5120 + 128 8504 00010000D 5121 + 128 0 -5703 7 0 0D 5122 + 128 8511 00010000D 5123 + 128 0 -5703 8 0 0D 5124 + 128 8519 00010000D 5125 + 128 0 -5703 7 0 0D 5126 + 128 8526 00010000D 5127 + 128 0 -5703 7 0 0D 5128 + 128 8533 00010000D 5129 + 128 0 -5703 7 0 0D 5130 + 128 8540 00010000D 5131 + 128 0 -5703 8 0 0D 5132 + 128 8548 00010000D 5133 + 128 0 -5703 6 0 0D 5134 + 128 8554 00010000D 5135 + 128 0 -5703 7 0 0D 5136 + 128 8561 00010000D 5137 + 128 0 -5703 6 0 0D 5138 + 128 8567 00010000D 5139 + 128 0 -5703 8 0 0D 5140 + 128 8575 00010000D 5141 + 128 0 -5703 7 0 0D 5142 + 128 8582 00010000D 5143 + 128 0 -5703 7 0 0D 5144 + 128 8589 00010000D 5145 + 128 0 -5703 6 0 0D 5146 + 128 8595 00010000D 5147 + 128 0 -5703 8 0 0D 5148 + 128 8603 00010000D 5149 + 128 0 -5703 7 0 0D 5150 + 128 8610 00010000D 5151 + 128 0 -5703 6 0 0D 5152 + 128 8616 00010000D 5153 + 128 0 -5703 6 0 0D 5154 + 128 8622 00010000D 5155 + 128 0 -5703 8 0 0D 5156 + 128 8630 00010000D 5157 + 128 0 -5703 6 0 0D 5158 + 128 8636 00010000D 5159 + 128 0 -5703 6 0 0D 5160 + 128 8642 00010000D 5161 + 128 0 -5703 6 0 0D 5162 + 128 8648 00010000D 5163 + 128 0 -5703 8 0 0D 5164 + 128 8656 00010000D 5165 + 128 0 -5703 6 0 0D 5166 + 128 8662 00010000D 5167 + 128 0 -5703 6 0 0D 5168 + 128 8668 00010000D 5169 + 128 0 -5703 6 0 0D 5170 + 128 8674 00010000D 5171 + 128 0 -5703 8 0 0D 5172 + 128 8682 00010000D 5173 + 128 0 -5703 6 0 0D 5174 + 128 8688 00010000D 5175 + 128 0 -5703 6 0 0D 5176 + 128 8694 00010000D 5177 + 128 0 -5703 6 0 0D 5178 + 128 8700 00010000D 5179 + 128 0 -5703 8 0 0D 5180 + 128 8708 00010000D 5181 + 128 0 -5703 6 0 0D 5182 + 128 8714 00010000D 5183 + 128 0 -5703 6 0 0D 5184 + 128 8720 00010000D 5185 + 128 0 -5703 6 0 0D 5186 + 128 8726 00010000D 5187 + 128 0 -5703 6 0 0D 5188 + 128 8732 00010000D 5189 + 128 0 -5703 6 0 0D 5190 + 128 8738 00010000D 5191 + 128 0 -5703 8 0 0D 5192 + 128 8746 00010000D 5193 + 128 0 -5703 6 0 0D 5194 + 128 8752 00010000D 5195 + 128 0 -5703 6 0 0D 5196 + 128 8758 00010000D 5197 + 128 0 -5703 6 0 0D 5198 + 128 8764 00010000D 5199 + 128 0 -5703 7 0 0D 5200 + 128 8771 00010000D 5201 + 128 0 -5703 6 0 0D 5202 + 128 8777 00010000D 5203 + 128 0 -5703 7 0 0D 5204 + 128 8784 00010000D 5205 + 128 0 -5703 6 0 0D 5206 + 128 8790 00010000D 5207 + 128 0 -5703 6 0 0D 5208 + 128 8796 00010000D 5209 + 128 0 -5703 6 0 0D 5210 + 128 8802 00010000D 5211 + 128 0 -5703 8 0 0D 5212 + 128 8810 00010000D 5213 + 128 0 -5703 7 0 0D 5214 + 128 8817 00010000D 5215 + 128 0 -5703 7 0 0D 5216 + 128 8824 00010000D 5217 + 128 0 -5703 7 0 0D 5218 + 128 8831 00010000D 5219 + 128 0 -5703 8 0 0D 5220 + 128 8839 00010000D 5221 + 128 0 -5703 7 0 0D 5222 + 128 8846 00010000D 5223 + 128 0 -5703 7 0 0D 5224 + 128 8853 00010000D 5225 + 128 0 -5703 7 0 0D 5226 + 128 8860 00010000D 5227 + 128 0 -5703 8 0 0D 5228 + 128 8868 00010000D 5229 + 128 0 -5703 7 0 0D 5230 + 128 8875 00010000D 5231 + 128 0 -5703 7 0 0D 5232 + 128 8882 00010000D 5233 + 128 0 -5703 7 0 0D 5234 + 128 8889 00010000D 5235 + 128 0 -5703 8 0 0D 5236 + 128 8897 00010000D 5237 + 128 0 -5703 7 0 0D 5238 + 128 8904 00010000D 5239 + 128 0 -5703 7 0 0D 5240 + 128 8911 00010000D 5241 + 128 0 -5703 7 0 0D 5242 + 128 8918 00010000D 5243 + 128 0 -5703 8 0 0D 5244 + 128 8926 00010000D 5245 + 128 0 -5703 7 0 0D 5246 + 128 8933 00010000D 5247 + 128 0 -5703 7 0 0D 5248 + 128 8940 00010000D 5249 + 128 0 -5703 7 0 0D 5250 + 128 8947 00010000D 5251 + 128 0 -5703 8 0 0D 5252 + 128 8955 00010000D 5253 + 128 0 -5703 7 0 0D 5254 + 128 8962 00010000D 5255 + 128 0 -5703 7 0 0D 5256 + 128 8969 00010000D 5257 + 128 0 -5703 7 0 0D 5258 + 128 8976 00010000D 5259 + 128 0 -5703 8 0 0D 5260 + 128 8984 00010000D 5261 + 128 0 -5703 7 0 0D 5262 + 128 8991 00010000D 5263 + 128 0 -5703 7 0 0D 5264 + 128 8998 00010000D 5265 + 128 0 -5703 7 0 0D 5266 + 128 9005 00010000D 5267 + 128 0 -5703 8 0 0D 5268 + 128 9013 00010000D 5269 + 128 0 -5703 7 0 0D 5270 + 128 9020 00010000D 5271 + 128 0 -5703 7 0 0D 5272 + 128 9027 00010000D 5273 + 128 0 -5703 7 0 0D 5274 + 128 9034 00010000D 5275 + 128 0 -5703 8 0 0D 5276 + 128 9042 00010000D 5277 + 128 0 -5703 6 0 0D 5278 + 128 9048 00010000D 5279 + 128 0 -5703 7 0 0D 5280 + 128 9055 00010000D 5281 + 128 0 -5703 6 0 0D 5282 + 128 9061 00010000D 5283 + 128 0 -5703 8 0 0D 5284 + 128 9069 00010000D 5285 + 128 0 -5703 6 0 0D 5286 + 128 9075 00010000D 5287 + 128 0 -5703 7 0 0D 5288 + 128 9082 00010000D 5289 + 128 0 -5703 7 0 0D 5290 + 128 9089 00010000D 5291 + 128 0 -5703 8 0 0D 5292 + 128 9097 00010000D 5293 + 128 0 -5703 7 0 0D 5294 + 128 9104 00010000D 5295 + 128 0 -5703 6 0 0D 5296 + 128 9110 00010000D 5297 + 128 0 -5703 6 0 0D 5298 + 128 9116 00010000D 5299 + 128 0 -5703 7 0 0D 5300 + 128 9123 00010000D 5301 + 128 0 -5703 6 0 0D 5302 + 128 9129 00010000D 5303 + 128 0 -5703 6 0 0D 5304 + 128 9135 00010000D 5305 + 128 0 -5703 6 0 0D 5306 + 128 9141 00010000D 5307 + 128 0 -5703 8 0 0D 5308 + 128 9149 00010000D 5309 + 128 0 -5703 6 0 0D 5310 + 128 9155 00010000D 5311 + 128 0 -5703 6 0 0D 5312 + 128 9161 00010000D 5313 + 128 0 -5703 6 0 0D 5314 + 128 9167 00010000D 5315 + 128 0 -5703 8 0 0D 5316 + 128 9175 00010000D 5317 + 128 0 -5703 6 0 0D 5318 + 128 9181 00010000D 5319 + 128 0 -5703 6 0 0D 5320 + 128 9187 00010000D 5321 + 128 0 -5703 6 0 0D 5322 + 128 9193 00010000D 5323 + 128 0 -5703 8 0 0D 5324 + 128 9201 00010000D 5325 + 128 0 -5703 6 0 0D 5326 + 128 9207 00010000D 5327 + 128 0 -5703 6 0 0D 5328 + 128 9213 00010000D 5329 + 128 0 -5703 6 0 0D 5330 + 128 9219 00010000D 5331 + 128 0 -5703 6 0 0D 5332 + 128 9225 00010000D 5333 + 128 0 -5703 6 0 0D 5334 + 128 9231 00010000D 5335 + 128 0 -5703 8 0 0D 5336 + 128 9239 00010000D 5337 + 128 0 -5703 6 0 0D 5338 + 128 9245 00010000D 5339 + 128 0 -5703 6 0 0D 5340 + 128 9251 00010000D 5341 + 128 0 -5703 6 0 0D 5342 + 128 9257 00010000D 5343 + 128 0 -5703 7 0 0D 5344 + 128 9264 00010000D 5345 + 128 0 -5703 6 0 0D 5346 + 128 9270 00010000D 5347 + 128 0 -5703 8 0 0D 5348 + 128 9278 00010000D 5349 + 128 0 -5703 6 0 0D 5350 + 128 9284 00010000D 5351 + 128 0 -5703 6 0 0D 5352 + 128 9290 00010000D 5353 + 128 0 -5703 6 0 0D 5354 + 128 9296 00010000D 5355 + 128 0 -5703 11 0 0D 5356 + 128 9307 00010000D 5357 + 128 0 -5703 7 0 0D 5358 + 128 9314 00010000D 5359 + 128 0 -5703 11 0 0D 5360 + 128 9325 00010000D 5361 + 128 0 -5703 6 0 0D 5362 + 128 9331 00010000D 5363 + 128 0 -5703 11 0 0D 5364 + 128 9342 00010000D 5365 + 128 0 -5703 7 0 0D 5366 + 128 9349 00010000D 5367 + 128 0 -5703 18 0 0D 5368 + 128 9367 00010000D 5369 + 128 0 -5703 7 0 0D 5370 + 128 9374 00010000D 5371 + 128 0 -5703 7 0 0D 5372 + 128 9381 00010000D 5373 + 128 0 -5703 8 0 0D 5374 + 128 9389 00010000D 5375 + 128 0 -5703 8 0 0D 5376 + 128 9397 00010000D 5377 + 128 0 -5705 7 0 0D 5378 + 128 9404 00010000D 5379 + 128 0 -5705 9 0 0D 5380 + 128 9413 00010000D 5381 + 128 0 -5705 7 0 0D 5382 + 128 9420 00010000D 5383 + 128 0 -5705 8 0 0D 5384 + 128 9428 00010000D 5385 + 128 0 -5705 7 0 0D 5386 + 128 9435 00010000D 5387 + 128 0 -5705 7 0 0D 5388 + 128 9442 00010000D 5389 + 128 0 -5705 8 0 0D 5390 + 128 9450 00010000D 5391 + 128 0 -5705 20 0 0D 5392 + 128 9470 00010000D 5393 + 128 0 -5705 20 0 0D 5394 + 128 9490 00010000D 5395 + 128 0 -5705 20 0 0D 5396 + 128 9510 00010000D 5397 + 128 0 -5705 20 0 0D 5398 + 128 9530 00010000D 5399 + 128 0 -5705 12 0 0D 5400 + 128 9542 00010000D 5401 + 128 0 -5705 7 0 0D 5402 + 128 9549 00010000D 5403 + 128 0 -5705 8 0 0D 5404 + 128 9557 00010000D 5405 + 128 0 -5705 9 0 0D 5406 + 128 9566 00010000D 5407 + 128 0 -5705 9 0 0D 5408 + 128 9575 00010000D 5409 + 128 0 -5705 9 0 0D 5410 + 128 9584 00010000D 5411 + 128 0 -5705 7 0 0D 5412 + 128 9591 00010000D 5413 + 128 0 -5705 8 0 0D 5414 + 128 9599 00010000D 5415 + 128 0 -5705 9 0 0D 5416 + 128 9608 00010000D 5417 + 128 0 -5705 9 0 0D 5418 + 128 9617 00010000D 5419 + 128 0 -5705 20 0 0D 5420 + 128 9637 00010000D 5421 + 128 0 -5705 20 0 0D 5422 + 128 9657 00010000D 5423 + 128 0 -5705 23 0 0D 5424 + 128 9680 00010000D 5425 + 128 0 -5705 23 0 0D 5426 + 128 9703 00010000D 5427 + 128 0 -5705 20 0 0D 5428 + 128 9723 00010000D 5429 + 128 0 -5705 20 0 0D 5430 + 128 9743 00010000D 5431 + 128 0 -5705 23 0 0D 5432 + 128 9766 00010000D 5433 + 128 0 -5705 23 0 0D 5434 + 128 9789 00010000D 5435 + 128 0 -5705 7 0 0D 5436 + 128 9796 00010000D 5437 + 128 0 -5705 7 0 0D 5438 + 128 9803 00010000D 5439 + 128 0 -5705 9 0 0D 5440 + 128 9812 00010000D 5441 + 128 0 -5705 8 0 0D 5442 + 128 9820 00010000D 5443 + 128 0 -5705 7 0 0D 5444 + 128 9827 00010000D 5445 + 128 0 -5705 8 0 0D 5446 + 128 9835 00010000D 5447 + 128 0 -5705 8 0 0D 5448 + 128 9843 00010000D 5449 + 128 0 -5705 9 0 0D 5450 + 128 9852 00010000D 5451 + 128 0 -5705 6 0 0D 5452 + 128 9858 00010000D 5453 + 128 0 -5705 7 0 0D 5454 + 128 9865 00010000D 5455 + 128 0 -5705 7 0 0D 5456 + 128 9872 00010000D 5457 + 128 0 -5705 9 0 0D 5458 + 128 9881 00010000D 5459 + 128 0 -5705 7 0 0D 5460 + 128 9888 00010000D 5461 + 128 0 -5705 8 0 0D 5462 + 128 9896 00010000D 5463 + 128 0 -5705 7 0 0D 5464 + 128 9903 00010000D 5465 + 128 0 -5705 8 0 0D 5466 + 128 9911 00010000D 5467 + 128 0 -5705 7 0 0D 5468 + 128 9918 00010000D 5469 + 128 0 -5705 8 0 0D 5470 + 128 9926 00010000D 5471 + 128 0 -5705 7 0 0D 5472 + 128 9933 00010000D 5473 + 128 0 -5705 7 0 0D 5474 + 128 9940 00010000D 5475 + 128 0 -5705 23 0 0D 5476 + 128 9963 00010000D 5477 + 128 0 -5705 8 0 0D 5478 + 128 9971 00010000D 5479 + 128 0 -5705 23 0 0D 5480 + 128 9994 00010000D 5481 + 128 0 -5705 7 0 0D 5482 + 128 10001 00010000D 5483 + 128 0 -5705 23 0 0D 5484 + 128 10024 00010000D 5485 + 128 0 -5705 18 0 0D 5486 + 128 10042 00010000D 5487 + 128 0 -5705 9 0 0D 5488 + 128 10051 00010000D 5489 + 128 0 -5705 6 0 0D 5490 + 128 10057 00010000D 5491 + 128 0 -5705 6 0 0D 5492 + 128 10063 00010000D 5493 + 128 0 -5705 15 0 0D 5494 + 128 10078 00010000D 5495 + 128 0 -5705 7 0 0D 5496 + 128 10085 00010000D 5497 + 128 0 -5705 12 0 0D 5498 + 128 10097 00010000D 5499 + 128 0 -5705 7 0 0D 5500 + 128 10104 00010000D 5501 + 128 0 -5705 13 0 0D 5502 + 128 10117 00010000D 5503 + 128 0 -5705 8 0 0D 5504 + 128 10125 00010000D 5505 + 128 0 -5705 12 0 0D 5506 + 128 10137 00010000D 5507 + 128 0 -5705 8 0 0D 5508 + 128 10145 00010000D 5509 + 128 0 -5705 6 0 0D 5510 + 128 10151 00010000D 5511 + 128 0 -5705 7 0 0D 5512 + 128 10158 00010000D 5513 + 128 0 -5705 6 0 0D 5514 + 128 10164 00010000D 5515 + 128 0 -5705 7 0 0D 5516 + 128 10171 00010000D 5517 + 128 0 -5705 6 0 0D 5518 + 128 10177 00010000D 5519 + 128 0 -5705 6 0 0D 5520 + 128 10183 00010000D 5521 + 128 0 -5705 6 0 0D 5522 + 128 10189 00010000D 5523 + 128 0 -5705 8 0 0D 5524 + 128 10197 00010000D 5525 + 128 0 -5705 5 0 0D 5526 + 128 10202 00010000D 5527 + 128 0 -5705 11 0 0D 5528 + 128 10213 00010000D 5529 + 128 0 -5705 11 0 0D 5530 + 128 10224 00010000D 5531 + 128 0 -5705 11 0 0D 5532 + 128 10235 00010000D 5533 + 128 0 -5705 11 0 0D 5534 + 128 10246 00010000D 5535 + 128 0 -5705 11 0 0D 5536 + 128 10257 00010000D 5537 + 128 0 -5705 11 0 0D 5538 + 128 10268 00010000D 5539 + 128 0 -5705 5 0 0D 5540 + 128 10273 00010000D 5541 + 128 0 -5705 5 0 0D 5542 + 128 10278 00010000D 5543 + 128 0 -5705 5 0 0D 5544 + 128 10283 00010000D 5545 + 128 0 -5705 5 0 0D 5546 + 128 10288 00010000D 5547 + 128 0 -5705 11 0 0D 5548 + 128 10299 00010000D 5549 + 128 0 -5705 11 0 0D 5550 + 128 10310 00010000D 5551 + 128 0 -5705 11 0 0D 5552 + 128 10321 00010000D 5553 + 128 0 -5705 6 0 0D 5554 + 128 10327 00010000D 5555 + 128 0 -5705 5 0 0D 5556 + 128 10332 00010000D 5557 + 128 0 -5705 6 0 0D 5558 + 128 10338 00010000D 5559 + 128 0 -5705 11 0 0D 5560 + 128 10349 00010000D 5561 + 128 0 -5705 11 0 0D 5562 + 128 10360 00010000D 5563 + 128 0 -5705 11 0 0D 5564 + 128 10371 00010000D 5565 + 128 0 -5705 11 0 0D 5566 + 128 10382 00010000D 5567 + 128 0 -5705 11 0 0D 5568 + 128 10393 00010000D 5569 + 128 0 -5705 11 0 0D 5570 + 128 10404 00010000D 5571 + 128 0 -5705 11 0 0D 5572 + 128 10415 00010000D 5573 + 128 0 -5705 5 0 0D 5574 + 128 10420 00010000D 5575 + 128 0 -5705 5 0 0D 5576 + 128 10425 00010000D 5577 + 128 0 -5705 5 0 0D 5578 + 128 10430 00010000D 5579 + 128 0 -5705 6 0 0D 5580 + 128 10436 00010000D 5581 + 128 0 -5705 7 0 0D 5582 + 128 10443 00010000D 5583 + 128 0 -5705 18 0 0D 5584 + 128 10461 00010000D 5585 + 128 0 -5705 18 0 0D 5586 + 128 10479 00010000D 5587 + 128 0 -5705 18 0 0D 5588 + 128 10497 00010000D 5589 + 128 0 -5705 18 0 0D 5590 + 128 10515 00010000D 5591 + 128 0 -5705 10 0 0D 5592 + 128 10525 00010000D 5593 + 128 0 -5705 6 0 0D 5594 + 128 10531 00010000D 5595 + 128 0 -5705 6 0 0D 5596 + 128 10537 00010000D 5597 + 128 0 -5705 7 0 0D 5598 + 128 10544 00010000D 5599 + 128 0 -5705 7 0 0D 5600 + 128 10551 00010000D 5601 + 128 0 -5705 7 0 0D 5602 + 128 10558 00010000D 5603 + 128 0 -5705 6 0 0D 5604 + 128 10564 00010000D 5605 + 128 0 -5705 7 0 0D 5606 + 128 10571 00010000D 5607 + 128 0 -5705 7 0 0D 5608 + 128 10578 00010000D 5609 + 128 0 -5705 18 0 0D 5610 + 128 10596 00010000D 5611 + 128 0 -5705 18 0 0D 5612 + 128 10614 00010000D 5613 + 128 0 -5705 18 0 0D 5614 + 128 10632 00010000D 5615 + 128 0 -5705 18 0 0D 5616 + 128 10650 00010000D 5617 + 128 0 -5705 18 0 0D 5618 + 128 10668 00010000D 5619 + 128 0 -5705 18 0 0D 5620 + 128 10686 00010000D 5621 + 128 0 -5705 18 0 0D 5622 + 128 10704 00010000D 5623 + 128 0 -5705 18 0 0D 5624 + 128 10722 00010000D 5625 + 128 0 -5705 6 0 0D 5626 + 128 10728 00010000D 5627 + 128 0 -5705 6 0 0D 5628 + 128 10734 00010000D 5629 + 128 0 -5705 7 0 0D 5630 + 128 10741 00010000D 5631 + 128 0 -5705 6 0 0D 5632 + 128 10747 00010000D 5633 + 128 0 -5705 6 0 0D 5634 + 128 10753 00010000D 5635 + 128 0 -5705 7 0 0D 5636 + 128 10760 00010000D 5637 + 128 0 -5705 6 0 0D 5638 + 128 10766 00010000D 5639 + 128 0 -5705 6 0 0D 5640 + 128 10772 00010000D 5641 + 128 0 -5705 6 0 0D 5642 + 128 10778 00010000D 5643 + 128 0 -5705 6 0 0D 5644 + 128 10784 00010000D 5645 + 128 0 -5705 6 0 0D 5646 + 128 10790 00010000D 5647 + 128 0 -5705 6 0 0D 5648 + 128 10796 00010000D 5649 + 128 0 -5705 6 0 0D 5650 + 128 10802 00010000D 5651 + 128 0 -5705 6 0 0D 5652 + 128 10808 00010000D 5653 + 128 0 -5705 6 0 0D 5654 + 128 10814 00010000D 5655 + 128 0 -5705 17 0 0D 5656 + 128 10831 00010000D 5657 + 128 0 -5705 6 0 0D 5658 + 128 10837 00010000D 5659 + 128 0 -5705 17 0 0D 5660 + 128 10854 00010000D 5661 + 128 0 -5705 6 0 0D 5662 + 128 10860 00010000D 5663 + 128 0 -5705 17 0 0D 5664 + 128 10877 00010000D 5665 + 128 0 -5705 13 0 0D 5666 + 128 10890 00010000D 5667 + 128 0 -5705 7 0 0D 5668 + 128 10897 00010000D 5669 + 128 0 -5705 6 0 0D 5670 + 128 10903 00010000D 5671 + 128 0 -5705 6 0 0D 5672 + 128 10909 00010000D 5673 + 128 0 -5705 13 0 0D 5674 + 128 10922 00010000D 5675 + 128 0 -5705 6 0 0D 5676 + 128 10928 00010000D 5677 + 128 0 -5705 9 0 0D 5678 + 128 10937 00010000D 5679 + 128 0 -5705 6 0 0D 5680 + 128 10943 00010000D 5681 + 128 0 -5705 9 0 0D 5682 + 128 10952 00010000D 5683 + 128 0 -5705 9 0 0D 5684 + 502 10961 00010000D 5685 + 502 514 1 0D 5686 + 502 11475 00010000D 5687 + 502 125 1 0D 5688 + 502 11600 00010000D 5689 + 502 115 1 0D 5690 + 504 11715 00010001D 5691 + 504 337 1 0D 5692 + 504 12052 00010001D 5693 + 504 67 1 0D 5694 + 504 12119 00010001D 5695 + 504 91 1 0D 5696 + 406 12210 00000000D 5697 + 406 1 15 0D 5698 + 406 12211 00000000D 5699 + 406 1 15 0D 5700 + 406 12212 00000000D 5701 + 406 1 15 0D 5702 + 314 12213 00000200D 5703 + 314 2 0 0D 5704 + 314 12215 00000200D 5705 + 314 2 0 0D 5706 + 314 12217 00000200D 5707 + 314 2 0 0D 5708 +186,7,1,0,0,1,5697; 1P 1 +186,9,1,0,0,1,5699; 3P 2 +186,11,1,0,0,1,5701; 5P 3 +514,307,13,1,15,1,17,1,19,1,21,1,23,1,25,1,27,1,29,1,31,1,33,1, 7P 4 +35,1,37,1,39,1,41,1,43,1,45,1,47,1,49,1,51,1,53,1,55,1,57,1,59, 7P 5 +1,61,1,63,1,65,1,67,1,69,1,71,1,73,1,75,1,77,1,79,1,81,1,83,1, 7P 6 +85,1,87,1,89,1,91,1,93,1,95,1,97,1,99,1,101,1,103,1,105,1,107,1, 7P 7 +109,1,111,1,113,1,115,1,117,1,119,1,121,1,123,1,125,1,127,1,129, 7P 8 +1,131,1,133,1,135,1,137,1,139,1,141,1,143,1,145,1,147,1,149,1, 7P 9 +151,1,153,1,155,1,157,1,159,1,161,1,163,1,165,1,167,1,169,1,171, 7P 10 +1,173,1,175,1,177,1,179,1,181,1,183,1,185,1,187,1,189,1,191,1, 7P 11 +193,1,195,1,197,1,199,1,201,1,203,1,205,1,207,1,209,1,211,1,213, 7P 12 +1,215,1,217,1,219,1,221,1,223,1,225,1,227,1,229,1,231,1,233,1, 7P 13 +235,1,237,1,239,1,241,1,243,1,245,1,247,1,249,1,251,1,253,1,255, 7P 14 +1,257,1,259,1,261,1,263,1,265,1,267,1,269,1,271,1,273,1,275,1, 7P 15 +277,1,279,1,281,1,283,1,285,1,287,1,289,1,291,1,293,1,295,1,297, 7P 16 +1,299,1,301,1,303,1,305,1,307,1,309,1,311,1,313,1,315,1,317,1, 7P 17 +319,1,321,1,323,1,325,1,327,1,329,1,331,1,333,1,335,1,337,1,339, 7P 18 +1,341,1,343,1,345,1,347,1,349,1,351,1,353,1,355,1,357,1,359,1, 7P 19 +361,1,363,1,365,1,367,1,369,1,371,1,373,1,375,1,377,1,379,1,381, 7P 20 +1,383,1,385,1,387,1,389,1,391,1,393,1,395,1,397,1,399,1,401,1, 7P 21 +403,1,405,1,407,1,409,1,411,1,413,1,415,1,417,1,419,1,421,1,423, 7P 22 +1,425,1,427,1,429,1,431,1,433,1,435,1,437,1,439,1,441,1,443,1, 7P 23 +445,1,447,1,449,1,451,1,453,1,455,1,457,1,459,1,461,1,463,1,465, 7P 24 +1,467,1,469,1,471,1,473,1,475,1,477,1,479,1,481,1,483,1,485,1, 7P 25 +487,1,489,1,491,1,493,1,495,1,497,1,499,1,501,1,503,1,505,1,507, 7P 26 +1,509,1,511,1,513,1,515,1,517,1,519,1,521,1,523,1,525,1,527,1, 7P 27 +529,1,531,1,533,1,535,1,537,1,539,1,541,1,543,1,545,1,547,1,549, 7P 28 +1,551,1,553,1,555,1,557,1,559,1,561,1,563,1,565,1,567,1,569,1, 7P 29 +571,1,573,1,575,1,577,1,579,1,581,1,583,1,585,1,587,1,589,1,591, 7P 30 +1,593,1,595,1,597,1,599,1,601,1,603,1,605,1,607,1,609,1,611,1, 7P 31 +613,1,615,1,617,1,619,1,621,1,623,1,625,1; 7P 32 +514,66,627,1,629,1,631,1,633,1,635,1,637,1,639,1,641,1,643,1, 9P 33 +645,1,647,1,649,1,651,1,653,1,655,1,657,1,659,1,661,1,663,1,665, 9P 34 +1,667,1,669,1,671,1,673,1,675,1,677,1,679,1,681,1,683,1,685,1, 9P 35 +687,1,689,1,691,1,693,1,695,1,697,1,699,1,701,1,703,1,705,1,707, 9P 36 +1,709,1,711,1,713,1,715,1,717,1,719,1,721,1,723,1,725,1,727,1, 9P 37 +729,1,731,1,733,1,735,1,737,1,739,1,741,1,743,1,745,1,747,1,749, 9P 38 +1,751,1,753,1,755,1,757,1; 9P 39 +514,88,759,1,761,1,763,1,765,1,767,1,769,1,771,1,773,1,775,1, 11P 40 +777,1,779,1,781,1,783,1,785,1,787,1,789,1,791,1,793,1,795,1,797, 11P 41 +1,799,1,801,1,803,1,805,1,807,1,809,1,811,1,813,1,815,1,817,1, 11P 42 +819,1,821,1,823,1,825,1,827,1,829,1,831,1,833,1,835,1,837,1,839, 11P 43 +1,841,1,843,1,845,1,847,1,849,1,851,1,853,1,855,1,857,1,859,1, 11P 44 +861,1,863,1,865,1,867,1,869,1,871,1,873,1,875,1,877,1,879,1,881, 11P 45 +1,883,1,885,1,887,1,889,1,891,1,893,1,895,1,897,1,899,1,901,1, 11P 46 +903,1,905,1,907,1,909,1,911,1,913,1,915,1,917,1,919,1,921,1,923, 11P 47 +1,925,1,927,1,929,1,931,1,933,1; 11P 48 +510,4763,1,1,935; 13P 49 +510,4765,1,1,937; 15P 50 +510,4767,1,1,939; 17P 51 +510,4769,1,1,941; 19P 52 +510,4771,1,1,943; 21P 53 +510,4773,1,1,945; 23P 54 +510,4775,1,1,947; 25P 55 +510,4777,1,1,949; 27P 56 +510,4779,1,1,951; 29P 57 +510,4781,1,1,953; 31P 58 +510,4783,1,1,955; 33P 59 +510,4785,1,1,957; 35P 60 +510,4787,1,1,959; 37P 61 +510,4789,1,1,961; 39P 62 +510,4791,1,1,963; 41P 63 +510,4793,1,1,965; 43P 64 +510,4795,1,1,967; 45P 65 +510,4797,1,1,969; 47P 66 +510,4799,1,1,971; 49P 67 +510,4801,1,1,973; 51P 68 +510,4803,1,1,975; 53P 69 +510,4805,1,1,977; 55P 70 +510,4807,1,1,979; 57P 71 +510,4809,1,1,981; 59P 72 +510,4811,1,1,983; 61P 73 +510,4813,1,1,985; 63P 74 +510,4815,1,1,987; 65P 75 +510,4817,1,1,989; 67P 76 +510,4819,1,1,991; 69P 77 +510,4821,1,1,993; 71P 78 +510,4823,1,1,995; 73P 79 +510,4825,1,1,997; 75P 80 +510,4827,1,1,999; 77P 81 +510,4829,1,1,1001; 79P 82 +510,4831,1,1,1003; 81P 83 +510,4833,1,1,1005; 83P 84 +510,4835,1,1,1007; 85P 85 +510,4837,1,1,1009; 87P 86 +510,4839,1,1,1011; 89P 87 +510,4841,1,1,1013; 91P 88 +510,4843,1,1,1015; 93P 89 +510,4845,1,1,1017; 95P 90 +510,4847,1,1,1019; 97P 91 +510,4849,1,1,1021; 99P 92 +510,4851,1,1,1023; 101P 93 +510,4853,1,1,1025; 103P 94 +510,4855,1,1,1027; 105P 95 +510,4857,1,1,1029; 107P 96 +510,4859,1,1,1031; 109P 97 +510,4861,1,1,1033; 111P 98 +510,4863,1,1,1035; 113P 99 +510,4865,1,1,1037; 115P 100 +510,4867,1,1,1039; 117P 101 +510,4869,1,1,1041; 119P 102 +510,4871,1,1,1043; 121P 103 +510,4873,1,1,1045; 123P 104 +510,4875,1,1,1047; 125P 105 +510,4877,1,1,1049; 127P 106 +510,4879,1,1,1051; 129P 107 +510,4881,1,1,1053; 131P 108 +510,4883,1,1,1055; 133P 109 +510,4885,1,1,1057; 135P 110 +510,4887,1,1,1059; 137P 111 +510,4889,1,1,1061; 139P 112 +510,4891,1,1,1063; 141P 113 +510,4893,1,1,1065; 143P 114 +510,4895,1,1,1067; 145P 115 +510,4897,1,1,1069; 147P 116 +510,4899,1,1,1071; 149P 117 +510,4901,1,1,1073; 151P 118 +510,4903,1,1,1075; 153P 119 +510,4905,1,1,1077; 155P 120 +510,4907,1,1,1079; 157P 121 +510,4909,1,1,1081; 159P 122 +510,4911,1,1,1083; 161P 123 +510,4913,1,1,1085; 163P 124 +510,4915,1,1,1087; 165P 125 +510,4917,1,1,1089; 167P 126 +510,4919,1,1,1091; 169P 127 +510,4921,1,1,1093; 171P 128 +510,4923,1,1,1095; 173P 129 +510,4925,1,1,1097; 175P 130 +510,4927,1,1,1099; 177P 131 +510,4929,1,1,1101; 179P 132 +510,4931,1,1,1103; 181P 133 +510,4933,1,1,1105; 183P 134 +510,4935,1,1,1107; 185P 135 +510,4937,1,1,1109; 187P 136 +510,4939,1,1,1111; 189P 137 +510,4941,1,1,1113; 191P 138 +510,4943,1,1,1115; 193P 139 +510,4945,1,1,1117; 195P 140 +510,4947,1,1,1119; 197P 141 +510,4949,1,1,1121; 199P 142 +510,4951,1,1,1123; 201P 143 +510,4953,1,1,1125; 203P 144 +510,4955,1,1,1127; 205P 145 +510,4957,1,1,1129; 207P 146 +510,4959,1,1,1131; 209P 147 +510,4961,1,1,1133; 211P 148 +510,4963,1,1,1135; 213P 149 +510,4965,1,1,1137; 215P 150 +510,4967,1,1,1139; 217P 151 +510,4969,1,1,1141; 219P 152 +510,4971,1,1,1143; 221P 153 +510,4973,1,1,1145; 223P 154 +510,4975,1,1,1147; 225P 155 +510,4977,1,1,1149; 227P 156 +510,4979,1,1,1151; 229P 157 +510,4981,1,1,1153; 231P 158 +510,4983,1,1,1155; 233P 159 +510,4985,1,1,1157; 235P 160 +510,4987,1,1,1159; 237P 161 +510,4989,1,1,1161; 239P 162 +510,4991,1,1,1163; 241P 163 +510,4993,1,1,1165; 243P 164 +510,4995,1,1,1167; 245P 165 +510,4997,1,1,1169; 247P 166 +510,4999,1,1,1171; 249P 167 +510,5001,1,1,1173; 251P 168 +510,5003,1,1,1175; 253P 169 +510,5005,1,1,1177; 255P 170 +510,5007,1,1,1179; 257P 171 +510,5009,1,1,1181; 259P 172 +510,5011,1,1,1183; 261P 173 +510,5013,1,1,1185; 263P 174 +510,5015,1,1,1187; 265P 175 +510,5017,1,1,1189; 267P 176 +510,5019,1,1,1191; 269P 177 +510,5021,1,1,1193; 271P 178 +510,5023,1,1,1195; 273P 179 +510,5025,1,1,1197; 275P 180 +510,5027,1,1,1199; 277P 181 +510,5029,1,1,1201; 279P 182 +510,5031,1,1,1203; 281P 183 +510,5033,1,1,1205; 283P 184 +510,5035,1,1,1207; 285P 185 +510,5037,1,1,1209; 287P 186 +510,5039,1,1,1211; 289P 187 +510,5041,1,1,1213; 291P 188 +510,5043,1,1,1215; 293P 189 +510,5045,1,1,1217; 295P 190 +510,5047,1,1,1219; 297P 191 +510,5049,1,1,1221; 299P 192 +510,5051,1,1,1223; 301P 193 +510,5053,1,1,1225; 303P 194 +510,5055,1,1,1227; 305P 195 +510,5057,1,1,1229; 307P 196 +510,5059,1,1,1231; 309P 197 +510,5061,1,1,1233; 311P 198 +510,5063,1,1,1235; 313P 199 +510,5065,1,1,1237; 315P 200 +510,5067,1,1,1239; 317P 201 +510,5069,1,1,1241; 319P 202 +510,5071,1,1,1243; 321P 203 +510,5073,1,1,1245; 323P 204 +510,5075,1,1,1247; 325P 205 +510,5077,1,1,1249; 327P 206 +510,5079,1,1,1251; 329P 207 +510,5081,1,1,1253; 331P 208 +510,5083,1,1,1255; 333P 209 +510,5085,1,1,1257; 335P 210 +510,5087,1,1,1259; 337P 211 +510,5089,1,1,1261; 339P 212 +510,5091,1,1,1263; 341P 213 +510,5093,1,1,1265; 343P 214 +510,5095,1,1,1267; 345P 215 +510,5097,1,1,1269; 347P 216 +510,5099,1,1,1271; 349P 217 +510,5101,1,1,1273; 351P 218 +510,5103,1,1,1275; 353P 219 +510,5105,1,1,1277; 355P 220 +510,5107,1,1,1279; 357P 221 +510,5109,1,1,1281; 359P 222 +510,5111,1,1,1283; 361P 223 +510,5113,1,1,1285; 363P 224 +510,5115,1,1,1287; 365P 225 +510,5117,1,1,1289; 367P 226 +510,5119,1,1,1291; 369P 227 +510,5121,1,1,1293; 371P 228 +510,5123,1,1,1295; 373P 229 +510,5125,1,1,1297; 375P 230 +510,5127,1,1,1299; 377P 231 +510,5129,1,1,1301; 379P 232 +510,5131,1,1,1303; 381P 233 +510,5133,1,1,1305; 383P 234 +510,5135,1,1,1307; 385P 235 +510,5137,1,1,1309; 387P 236 +510,5139,1,1,1311; 389P 237 +510,5141,1,1,1313; 391P 238 +510,5143,1,1,1315; 393P 239 +510,5145,1,1,1317; 395P 240 +510,5147,1,1,1319; 397P 241 +510,5149,1,1,1321; 399P 242 +510,5151,1,1,1323; 401P 243 +510,5153,1,1,1325; 403P 244 +510,5155,1,1,1327; 405P 245 +510,5157,1,1,1329; 407P 246 +510,5159,1,1,1331; 409P 247 +510,5161,1,1,1333; 411P 248 +510,5163,1,1,1335; 413P 249 +510,5165,1,1,1337; 415P 250 +510,5167,1,1,1339; 417P 251 +510,5169,1,1,1341; 419P 252 +510,5171,1,1,1343; 421P 253 +510,5173,1,1,1345; 423P 254 +510,5175,1,1,1347; 425P 255 +510,5177,1,1,1349; 427P 256 +510,5179,1,1,1351; 429P 257 +510,5181,1,1,1353; 431P 258 +510,5183,1,1,1355; 433P 259 +510,5185,1,1,1357; 435P 260 +510,5187,1,1,1359; 437P 261 +510,5189,1,1,1361; 439P 262 +510,5191,1,1,1363; 441P 263 +510,5193,1,1,1365; 443P 264 +510,5195,1,1,1367; 445P 265 +510,5197,1,1,1369; 447P 266 +510,5199,1,1,1371; 449P 267 +510,5201,1,1,1373; 451P 268 +510,5203,1,1,1375; 453P 269 +510,5205,1,1,1377; 455P 270 +510,5207,1,1,1379; 457P 271 +510,5209,1,1,1381; 459P 272 +510,5211,1,1,1383; 461P 273 +510,5213,1,1,1385; 463P 274 +510,5215,1,1,1387; 465P 275 +510,5217,1,1,1389; 467P 276 +510,5219,1,1,1391; 469P 277 +510,5221,1,1,1393; 471P 278 +510,5223,1,1,1395; 473P 279 +510,5225,1,1,1397; 475P 280 +510,5227,1,1,1399; 477P 281 +510,5229,1,1,1401; 479P 282 +510,5231,1,1,1403; 481P 283 +510,5233,1,1,1405; 483P 284 +510,5235,1,1,1407; 485P 285 +510,5237,1,1,1409; 487P 286 +510,5239,1,1,1411; 489P 287 +510,5241,1,1,1413; 491P 288 +510,5243,1,1,1415; 493P 289 +510,5245,1,1,1417; 495P 290 +510,5247,1,1,1419; 497P 291 +510,5249,1,1,1421; 499P 292 +510,5251,1,1,1423; 501P 293 +510,5253,1,1,1425; 503P 294 +510,5255,1,1,1427; 505P 295 +510,5257,1,1,1429; 507P 296 +510,5259,1,1,1431; 509P 297 +510,5261,1,1,1433; 511P 298 +510,5263,1,1,1435; 513P 299 +510,5265,1,1,1437; 515P 300 +510,5267,1,1,1439; 517P 301 +510,5269,1,1,1441; 519P 302 +510,5271,1,1,1443; 521P 303 +510,5273,1,1,1445; 523P 304 +510,5275,1,1,1447; 525P 305 +510,5277,1,1,1449; 527P 306 +510,5279,1,1,1451; 529P 307 +510,5281,1,1,1453; 531P 308 +510,5283,1,1,1455; 533P 309 +510,5285,1,1,1457; 535P 310 +510,5287,1,1,1459; 537P 311 +510,5289,1,1,1461; 539P 312 +510,5291,1,1,1463; 541P 313 +510,5293,1,1,1465; 543P 314 +510,5295,1,1,1467; 545P 315 +510,5297,1,1,1469; 547P 316 +510,5299,1,1,1471; 549P 317 +510,5301,1,1,1473; 551P 318 +510,5303,1,1,1475; 553P 319 +510,5305,1,1,1477; 555P 320 +510,5307,1,1,1479; 557P 321 +510,5309,1,1,1481; 559P 322 +510,5311,1,1,1483; 561P 323 +510,5313,1,1,1485; 563P 324 +510,5315,1,1,1487; 565P 325 +510,5317,1,1,1489; 567P 326 +510,5319,1,1,1491; 569P 327 +510,5321,1,1,1493; 571P 328 +510,5323,1,1,1495; 573P 329 +510,5325,1,1,1497; 575P 330 +510,5327,1,1,1499; 577P 331 +510,5329,1,1,1501; 579P 332 +510,5331,1,1,1503; 581P 333 +510,5333,1,1,1505; 583P 334 +510,5335,1,1,1507; 585P 335 +510,5337,1,1,1509; 587P 336 +510,5339,1,1,1511; 589P 337 +510,5341,1,1,1513; 591P 338 +510,5343,1,1,1515; 593P 339 +510,5345,1,1,1517; 595P 340 +510,5347,1,1,1519; 597P 341 +510,5349,1,1,1521; 599P 342 +510,5351,1,1,1523; 601P 343 +510,5353,1,1,1525; 603P 344 +510,5355,1,1,1527; 605P 345 +510,5357,1,1,1529; 607P 346 +510,5359,1,1,1531; 609P 347 +510,5361,1,1,1533; 611P 348 +510,5363,1,1,1535; 613P 349 +510,5365,1,1,1537; 615P 350 +510,5367,1,1,1539; 617P 351 +510,5369,1,1,1541; 619P 352 +510,5371,1,1,1543; 621P 353 +510,5373,29,1,1545,1547,1549,1551,1553,1555,1557,1559,1561,1563, 623P 354 +1565,1567,1569,1571,1573,1575,1577,1579,1581,1583,1585,1587, 623P 355 +1589,1591,1593,1595,1597,1599,1601; 623P 356 +510,5375,29,1,1603,1605,1607,1609,1611,1613,1615,1617,1619,1621, 625P 357 +1623,1625,1627,1629,1631,1633,1635,1637,1639,1641,1643,1645, 625P 358 +1647,1649,1651,1653,1655,1657,1659; 625P 359 +510,5377,1,1,1661; 627P 360 +510,5379,1,1,1663; 629P 361 +510,5381,1,1,1665; 631P 362 +510,5383,1,1,1667; 633P 363 +510,5385,1,1,1669; 635P 364 +510,5387,1,1,1671; 637P 365 +510,5389,1,1,1673; 639P 366 +510,5391,1,1,1675; 641P 367 +510,5393,1,1,1677; 643P 368 +510,5395,1,1,1679; 645P 369 +510,5397,1,1,1681; 647P 370 +510,5399,1,1,1683; 649P 371 +510,5401,1,1,1685; 651P 372 +510,5403,1,1,1687; 653P 373 +510,5405,1,1,1689; 655P 374 +510,5407,1,1,1691; 657P 375 +510,5409,1,1,1693; 659P 376 +510,5411,1,1,1695; 661P 377 +510,5413,1,1,1697; 663P 378 +510,5415,1,1,1699; 665P 379 +510,5417,1,1,1701; 667P 380 +510,5419,1,1,1703; 669P 381 +510,5421,1,1,1705; 671P 382 +510,5423,1,1,1707; 673P 383 +510,5425,1,1,1709; 675P 384 +510,5427,1,1,1711; 677P 385 +510,5429,1,1,1713; 679P 386 +510,5431,1,1,1715; 681P 387 +510,5433,1,1,1717; 683P 388 +510,5435,1,1,1719; 685P 389 +510,5437,1,1,1721; 687P 390 +510,5439,8,1,1723,1725,1727,1729,1731,1733,1735,1737; 689P 391 +510,5441,1,1,1739; 691P 392 +510,5443,1,1,1741; 693P 393 +510,5445,1,1,1743; 695P 394 +510,5447,1,1,1745; 697P 395 +510,5449,1,1,1747; 699P 396 +510,5451,1,1,1749; 701P 397 +510,5453,1,1,1751; 703P 398 +510,5455,1,1,1753; 705P 399 +510,5457,1,1,1755; 707P 400 +510,5459,1,1,1757; 709P 401 +510,5461,1,1,1759; 711P 402 +510,5463,1,1,1761; 713P 403 +510,5465,1,1,1763; 715P 404 +510,5467,1,1,1765; 717P 405 +510,5469,1,1,1767; 719P 406 +510,5471,1,1,1769; 721P 407 +510,5473,1,1,1771; 723P 408 +510,5475,1,1,1773; 725P 409 +510,5477,1,1,1775; 727P 410 +510,5479,1,1,1777; 729P 411 +510,5481,1,1,1779; 731P 412 +510,5483,1,1,1781; 733P 413 +510,5485,1,1,1783; 735P 414 +510,5487,2,1,1785,1787; 737P 415 +510,5489,1,1,1789; 739P 416 +510,5491,1,1,1791; 741P 417 +510,5493,1,1,1793; 743P 418 +510,5495,1,1,1795; 745P 419 +510,5497,1,1,1797; 747P 420 +510,5499,1,1,1799; 749P 421 +510,5501,1,1,1801; 751P 422 +510,5503,1,1,1803; 753P 423 +510,5505,1,1,1805; 755P 424 +510,5507,7,1,1807,1809,1811,1813,1815,1817,1819; 757P 425 +510,5509,1,1,1821; 759P 426 +510,5511,1,1,1823; 761P 427 +510,5513,1,1,1825; 763P 428 +510,5515,1,1,1827; 765P 429 +510,5517,1,1,1829; 767P 430 +510,5519,1,1,1831; 769P 431 +510,5521,1,1,1833; 771P 432 +510,5523,7,1,1835,1837,1839,1841,1843,1845,1847; 773P 433 +510,5525,1,1,1849; 775P 434 +510,5527,1,1,1851; 777P 435 +510,5529,1,1,1853; 779P 436 +510,5531,1,1,1855; 781P 437 +510,5533,1,1,1857; 783P 438 +510,5535,1,1,1859; 785P 439 +510,5537,1,1,1861; 787P 440 +510,5539,1,1,1863; 789P 441 +510,5541,1,1,1865; 791P 442 +510,5543,1,1,1867; 793P 443 +510,5545,1,1,1869; 795P 444 +510,5547,1,1,1871; 797P 445 +510,5549,1,1,1873; 799P 446 +510,5551,1,1,1875; 801P 447 +510,5553,1,1,1877; 803P 448 +510,5555,1,1,1879; 805P 449 +510,5557,1,1,1881; 807P 450 +510,5559,1,1,1883; 809P 451 +510,5561,1,1,1885; 811P 452 +510,5563,1,1,1887; 813P 453 +510,5565,1,1,1889; 815P 454 +510,5567,1,1,1891; 817P 455 +510,5569,1,1,1893; 819P 456 +510,5571,1,1,1895; 821P 457 +510,5573,1,1,1897; 823P 458 +510,5575,1,1,1899; 825P 459 +510,5577,1,1,1901; 827P 460 +510,5579,2,1,1903,1905; 829P 461 +510,5581,8,1,1907,1909,1911,1913,1915,1917,1919,1921; 831P 462 +510,5583,1,1,1923; 833P 463 +510,5585,1,1,1925; 835P 464 +510,5587,1,1,1927; 837P 465 +510,5589,1,1,1929; 839P 466 +510,5591,1,1,1931; 841P 467 +510,5593,1,1,1933; 843P 468 +510,5595,1,1,1935; 845P 469 +510,5597,1,1,1937; 847P 470 +510,5599,1,1,1939; 849P 471 +510,5601,1,1,1941; 851P 472 +510,5603,1,1,1943; 853P 473 +510,5605,1,1,1945; 855P 474 +510,5607,1,1,1947; 857P 475 +510,5609,1,1,1949; 859P 476 +510,5611,1,1,1951; 861P 477 +510,5613,1,1,1953; 863P 478 +510,5615,1,1,1955; 865P 479 +510,5617,1,1,1957; 867P 480 +510,5619,1,1,1959; 869P 481 +510,5621,1,1,1961; 871P 482 +510,5623,1,1,1963; 873P 483 +510,5625,1,1,1965; 875P 484 +510,5627,1,1,1967; 877P 485 +510,5629,1,1,1969; 879P 486 +510,5631,1,1,1971; 881P 487 +510,5633,1,1,1973; 883P 488 +510,5635,1,1,1975; 885P 489 +510,5637,1,1,1977; 887P 490 +510,5639,1,1,1979; 889P 491 +510,5641,1,1,1981; 891P 492 +510,5643,1,1,1983; 893P 493 +510,5645,1,1,1985; 895P 494 +510,5647,1,1,1987; 897P 495 +510,5649,1,1,1989; 899P 496 +510,5651,1,1,1991; 901P 497 +510,5653,1,1,1993; 903P 498 +510,5655,1,1,1995; 905P 499 +510,5657,1,1,1997; 907P 500 +510,5659,1,1,1999; 909P 501 +510,5661,1,1,2001; 911P 502 +510,5663,1,1,2003; 913P 503 +510,5665,1,1,2005; 915P 504 +510,5667,2,1,2007,2009; 917P 505 +510,5669,1,1,2011; 919P 506 +510,5671,1,1,2013; 921P 507 +510,5673,1,1,2015; 923P 508 +510,5675,1,1,2017; 925P 509 +510,5677,1,1,2019; 927P 510 +510,5679,1,1,2021; 929P 511 +510,5681,1,1,2023; 931P 512 +510,5683,1,1,2025; 933P 513 +508,4,0,5691,1,1,0,0,5691,2,1,0,0,5691,3,0,0,0,5691,4,0,0; 935P 514 +508,4,0,5691,5,1,0,0,5691,4,1,0,0,5691,6,0,0,0,5691,2,0,0; 937P 515 +508,4,0,5691,7,1,0,0,5691,8,1,0,0,5691,9,0,0,0,5691,10,0,0; 939P 516 +508,4,0,5691,11,1,0,0,5691,10,1,0,0,5691,12,0,0,0,5691,8,0,0; 941P 517 +508,4,0,5691,13,1,0,0,5691,14,1,0,0,5691,15,0,0,0,5691,16,0,0; 943P 518 +508,4,0,5691,17,1,0,0,5691,16,1,0,0,5691,18,0,0,0,5691,14,0,0; 945P 519 +508,4,0,5691,19,1,0,0,5691,20,1,0,0,5691,21,0,0,0,5691,22,0,0; 947P 520 +508,4,0,5691,23,1,0,0,5691,22,1,0,0,5691,24,0,0,0,5691,20,0,0; 949P 521 +508,4,0,5691,25,0,0,0,5691,26,1,0,0,5691,27,0,0,0,5691,28,0,0; 951P 522 +508,4,0,5691,29,0,0,0,5691,28,1,0,0,5691,30,0,0,0,5691,31,0,0; 953P 523 +508,4,0,5691,32,0,0,0,5691,31,1,0,0,5691,33,0,0,0,5691,34,0,0; 955P 524 +508,4,0,5691,35,0,0,0,5691,34,1,0,0,5691,36,0,0,0,5691,37,0,0; 957P 525 +508,4,0,5691,38,0,0,0,5691,37,1,0,0,5691,39,0,0,0,5691,40,0,0; 959P 526 +508,4,0,5691,41,0,0,0,5691,40,1,0,0,5691,42,0,0,0,5691,43,0,0; 961P 527 +508,4,0,5691,44,0,0,0,5691,43,1,0,0,5691,45,0,0,0,5691,46,0,0; 963P 528 +508,4,0,5691,47,0,0,0,5691,46,1,0,0,5691,48,0,0,0,5691,49,0,0; 965P 529 +508,4,0,5691,50,0,0,0,5691,49,1,0,0,5691,51,0,0,0,5691,52,0,0; 967P 530 +508,4,0,5691,53,0,0,0,5691,52,1,0,0,5691,54,0,0,0,5691,55,0,0; 969P 531 +508,4,0,5691,56,0,0,0,5691,55,1,0,0,5691,57,0,0,0,5691,58,0,0; 971P 532 +508,4,0,5691,59,0,0,0,5691,58,1,0,0,5691,60,0,0,0,5691,26,0,0; 973P 533 +508,4,0,5691,61,0,0,0,5691,62,1,0,0,5691,63,0,0,0,5691,64,0,0; 975P 534 +508,4,0,5691,65,0,0,0,5691,64,1,0,0,5691,66,0,0,0,5691,67,0,0; 977P 535 +508,4,0,5691,68,0,0,0,5691,67,1,0,0,5691,69,0,0,0,5691,70,0,0; 979P 536 +508,4,0,5691,71,0,0,0,5691,70,1,0,0,5691,72,0,0,0,5691,73,0,0; 981P 537 +508,4,0,5691,74,0,0,0,5691,73,1,0,0,5691,75,0,0,0,5691,76,0,0; 983P 538 +508,4,0,5691,77,0,0,0,5691,76,1,0,0,5691,78,0,0,0,5691,79,0,0; 985P 539 +508,4,0,5691,80,0,0,0,5691,79,1,0,0,5691,81,0,0,0,5691,82,0,0; 987P 540 +508,4,0,5691,83,0,0,0,5691,82,1,0,0,5691,84,0,0,0,5691,85,0,0; 989P 541 +508,4,0,5691,86,0,0,0,5691,85,1,0,0,5691,87,0,0,0,5691,88,0,0; 991P 542 +508,4,0,5691,89,0,0,0,5691,88,1,0,0,5691,90,0,0,0,5691,91,0,0; 993P 543 +508,4,0,5691,92,0,0,0,5691,91,1,0,0,5691,93,0,0,0,5691,94,0,0; 995P 544 +508,4,0,5691,95,0,0,0,5691,94,1,0,0,5691,96,0,0,0,5691,62,0,0; 997P 545 +508,4,0,5691,97,0,0,0,5691,98,1,0,0,5691,99,0,0,0,5691,100,0,0; 999P 546 +508,4,0,5691,101,0,0,0,5691,100,1,0,0,5691,102,0,0,0,5691,103,0, 1001P 547 +0; 1001P 548 +508,4,0,5691,104,0,0,0,5691,103,1,0,0,5691,105,0,0,0,5691,106,0, 1003P 549 +0; 1003P 550 +508,4,0,5691,107,0,0,0,5691,106,1,0,0,5691,108,0,0,0,5691,109,0, 1005P 551 +0; 1005P 552 +508,4,0,5691,110,0,0,0,5691,109,1,0,0,5691,111,0,0,0,5691,112,0, 1007P 553 +0; 1007P 554 +508,4,0,5691,113,0,0,0,5691,112,1,0,0,5691,114,0,0,0,5691,115,0, 1009P 555 +0; 1009P 556 +508,4,0,5691,116,0,0,0,5691,115,1,0,0,5691,117,0,0,0,5691,118,0, 1011P 557 +0; 1011P 558 +508,4,0,5691,119,0,0,0,5691,118,1,0,0,5691,120,0,0,0,5691,121,0, 1013P 559 +0; 1013P 560 +508,4,0,5691,122,0,0,0,5691,121,1,0,0,5691,123,0,0,0,5691,124,0, 1015P 561 +0; 1015P 562 +508,4,0,5691,125,0,0,0,5691,124,1,0,0,5691,126,0,0,0,5691,127,0, 1017P 563 +0; 1017P 564 +508,4,0,5691,128,0,0,0,5691,127,1,0,0,5691,129,0,0,0,5691,130,0, 1019P 565 +0; 1019P 566 +508,4,0,5691,131,0,0,0,5691,130,1,0,0,5691,132,0,0,0,5691,98,0, 1021P 567 +0; 1021P 568 +508,4,0,5691,133,0,0,0,5691,134,1,0,0,5691,135,0,0,0,5691,136,0, 1023P 569 +0; 1023P 570 +508,4,0,5691,137,0,0,0,5691,136,1,0,0,5691,138,0,0,0,5691,139,0, 1025P 571 +0; 1025P 572 +508,4,0,5691,140,0,0,0,5691,139,1,0,0,5691,141,0,0,0,5691,142,0, 1027P 573 +0; 1027P 574 +508,4,0,5691,143,0,0,0,5691,142,1,0,0,5691,144,0,0,0,5691,145,0, 1029P 575 +0; 1029P 576 +508,4,0,5691,146,0,0,0,5691,145,1,0,0,5691,147,0,0,0,5691,148,0, 1031P 577 +0; 1031P 578 +508,4,0,5691,149,0,0,0,5691,148,1,0,0,5691,150,0,0,0,5691,151,0, 1033P 579 +0; 1033P 580 +508,4,0,5691,152,0,0,0,5691,151,1,0,0,5691,153,0,0,0,5691,154,0, 1035P 581 +0; 1035P 582 +508,4,0,5691,155,0,0,0,5691,154,1,0,0,5691,156,0,0,0,5691,157,0, 1037P 583 +0; 1037P 584 +508,4,0,5691,158,0,0,0,5691,157,1,0,0,5691,159,0,0,0,5691,160,0, 1039P 585 +0; 1039P 586 +508,4,0,5691,161,0,0,0,5691,160,1,0,0,5691,162,0,0,0,5691,163,0, 1041P 587 +0; 1041P 588 +508,4,0,5691,164,0,0,0,5691,163,1,0,0,5691,165,0,0,0,5691,166,0, 1043P 589 +0; 1043P 590 +508,4,0,5691,167,0,0,0,5691,166,1,0,0,5691,168,0,0,0,5691,134,0, 1045P 591 +0; 1045P 592 +508,4,0,5691,169,0,0,0,5691,170,1,0,0,5691,171,0,0,0,5691,172,0, 1047P 593 +0; 1047P 594 +508,4,0,5691,173,0,0,0,5691,172,1,0,0,5691,174,0,0,0,5691,175,0, 1049P 595 +0; 1049P 596 +508,4,0,5691,176,0,0,0,5691,175,1,0,0,5691,177,0,0,0,5691,178,0, 1051P 597 +0; 1051P 598 +508,4,0,5691,179,0,0,0,5691,178,1,0,0,5691,180,0,0,0,5691,181,0, 1053P 599 +0; 1053P 600 +508,4,0,5691,182,0,0,0,5691,181,1,0,0,5691,183,0,0,0,5691,184,0, 1055P 601 +0; 1055P 602 +508,4,0,5691,185,0,0,0,5691,184,1,0,0,5691,186,0,0,0,5691,187,0, 1057P 603 +0; 1057P 604 +508,4,0,5691,188,0,0,0,5691,187,1,0,0,5691,189,0,0,0,5691,190,0, 1059P 605 +0; 1059P 606 +508,4,0,5691,191,0,0,0,5691,190,1,0,0,5691,192,0,0,0,5691,193,0, 1061P 607 +0; 1061P 608 +508,4,0,5691,194,0,0,0,5691,193,1,0,0,5691,195,0,0,0,5691,196,0, 1063P 609 +0; 1063P 610 +508,4,0,5691,197,0,0,0,5691,196,1,0,0,5691,198,0,0,0,5691,199,0, 1065P 611 +0; 1065P 612 +508,4,0,5691,200,0,0,0,5691,199,1,0,0,5691,201,0,0,0,5691,202,0, 1067P 613 +0; 1067P 614 +508,4,0,5691,203,0,0,0,5691,202,1,0,0,5691,204,0,0,0,5691,170,0, 1069P 615 +0; 1069P 616 +508,4,0,5691,205,0,0,0,5691,206,1,0,0,5691,207,0,0,0,5691,208,0, 1071P 617 +0; 1071P 618 +508,4,0,5691,209,0,0,0,5691,208,1,0,0,5691,210,0,0,0,5691,211,0, 1073P 619 +0; 1073P 620 +508,4,0,5691,212,0,0,0,5691,211,1,0,0,5691,213,0,0,0,5691,214,0, 1075P 621 +0; 1075P 622 +508,4,0,5691,215,0,0,0,5691,214,1,0,0,5691,216,0,0,0,5691,217,0, 1077P 623 +0; 1077P 624 +508,4,0,5691,218,0,0,0,5691,217,1,0,0,5691,219,0,0,0,5691,220,0, 1079P 625 +0; 1079P 626 +508,4,0,5691,221,0,0,0,5691,220,1,0,0,5691,222,0,0,0,5691,223,0, 1081P 627 +0; 1081P 628 +508,4,0,5691,224,0,0,0,5691,223,1,0,0,5691,225,0,0,0,5691,226,0, 1083P 629 +0; 1083P 630 +508,4,0,5691,227,0,0,0,5691,226,1,0,0,5691,228,0,0,0,5691,229,0, 1085P 631 +0; 1085P 632 +508,4,0,5691,230,0,0,0,5691,229,1,0,0,5691,231,0,0,0,5691,232,0, 1087P 633 +0; 1087P 634 +508,4,0,5691,233,0,0,0,5691,232,1,0,0,5691,234,0,0,0,5691,235,0, 1089P 635 +0; 1089P 636 +508,4,0,5691,236,0,0,0,5691,235,1,0,0,5691,237,0,0,0,5691,238,0, 1091P 637 +0; 1091P 638 +508,4,0,5691,239,0,0,0,5691,238,1,0,0,5691,240,0,0,0,5691,206,0, 1093P 639 +0; 1093P 640 +508,4,0,5691,241,0,0,0,5691,242,1,0,0,5691,243,0,0,0,5691,244,0, 1095P 641 +0; 1095P 642 +508,4,0,5691,245,0,0,0,5691,244,1,0,0,5691,246,0,0,0,5691,247,0, 1097P 643 +0; 1097P 644 +508,4,0,5691,248,0,0,0,5691,247,1,0,0,5691,249,0,0,0,5691,250,0, 1099P 645 +0; 1099P 646 +508,4,0,5691,251,0,0,0,5691,250,1,0,0,5691,252,0,0,0,5691,253,0, 1101P 647 +0; 1101P 648 +508,4,0,5691,254,0,0,0,5691,253,1,0,0,5691,255,0,0,0,5691,256,0, 1103P 649 +0; 1103P 650 +508,4,0,5691,257,0,0,0,5691,256,1,0,0,5691,258,0,0,0,5691,259,0, 1105P 651 +0; 1105P 652 +508,4,0,5691,260,0,0,0,5691,259,1,0,0,5691,261,0,0,0,5691,262,0, 1107P 653 +0; 1107P 654 +508,4,0,5691,263,0,0,0,5691,262,1,0,0,5691,264,0,0,0,5691,265,0, 1109P 655 +0; 1109P 656 +508,4,0,5691,266,0,0,0,5691,265,1,0,0,5691,267,0,0,0,5691,268,0, 1111P 657 +0; 1111P 658 +508,4,0,5691,269,0,0,0,5691,268,1,0,0,5691,270,0,0,0,5691,271,0, 1113P 659 +0; 1113P 660 +508,4,0,5691,272,0,0,0,5691,271,1,0,0,5691,273,0,0,0,5691,274,0, 1115P 661 +0; 1115P 662 +508,4,0,5691,275,0,0,0,5691,274,1,0,0,5691,276,0,0,0,5691,242,0, 1117P 663 +0; 1117P 664 +508,4,0,5691,277,0,0,0,5691,278,1,0,0,5691,279,0,0,0,5691,280,0, 1119P 665 +0; 1119P 666 +508,4,0,5691,281,0,0,0,5691,280,1,0,0,5691,282,0,0,0,5691,283,0, 1121P 667 +0; 1121P 668 +508,4,0,5691,284,0,0,0,5691,283,1,0,0,5691,285,0,0,0,5691,286,0, 1123P 669 +0; 1123P 670 +508,4,0,5691,287,0,0,0,5691,286,1,0,0,5691,288,0,0,0,5691,289,0, 1125P 671 +0; 1125P 672 +508,4,0,5691,290,0,0,0,5691,289,1,0,0,5691,291,0,0,0,5691,292,0, 1127P 673 +0; 1127P 674 +508,4,0,5691,293,0,0,0,5691,292,1,0,0,5691,294,0,0,0,5691,295,0, 1129P 675 +0; 1129P 676 +508,4,0,5691,296,0,0,0,5691,295,1,0,0,5691,297,0,0,0,5691,298,0, 1131P 677 +0; 1131P 678 +508,4,0,5691,299,0,0,0,5691,298,1,0,0,5691,300,0,0,0,5691,301,0, 1133P 679 +0; 1133P 680 +508,4,0,5691,302,0,0,0,5691,301,1,0,0,5691,303,0,0,0,5691,304,0, 1135P 681 +0; 1135P 682 +508,4,0,5691,305,0,0,0,5691,304,1,0,0,5691,306,0,0,0,5691,307,0, 1137P 683 +0; 1137P 684 +508,4,0,5691,308,0,0,0,5691,307,1,0,0,5691,309,0,0,0,5691,310,0, 1139P 685 +0; 1139P 686 +508,4,0,5691,311,0,0,0,5691,310,1,0,0,5691,312,0,0,0,5691,278,0, 1141P 687 +0; 1141P 688 +508,4,0,5691,313,0,0,0,5691,314,1,0,0,5691,315,0,0,0,5691,316,0, 1143P 689 +0; 1143P 690 +508,4,0,5691,317,0,0,0,5691,316,1,0,0,5691,318,0,0,0,5691,319,0, 1145P 691 +0; 1145P 692 +508,4,0,5691,320,0,0,0,5691,319,1,0,0,5691,321,0,0,0,5691,322,0, 1147P 693 +0; 1147P 694 +508,4,0,5691,323,0,0,0,5691,322,1,0,0,5691,324,0,0,0,5691,325,0, 1149P 695 +0; 1149P 696 +508,4,0,5691,326,0,0,0,5691,325,1,0,0,5691,327,0,0,0,5691,328,0, 1151P 697 +0; 1151P 698 +508,4,0,5691,329,0,0,0,5691,328,1,0,0,5691,330,0,0,0,5691,331,0, 1153P 699 +0; 1153P 700 +508,4,0,5691,332,0,0,0,5691,331,1,0,0,5691,333,0,0,0,5691,334,0, 1155P 701 +0; 1155P 702 +508,4,0,5691,335,0,0,0,5691,334,1,0,0,5691,336,0,0,0,5691,337,0, 1157P 703 +0; 1157P 704 +508,4,0,5691,338,0,0,0,5691,337,1,0,0,5691,339,0,0,0,5691,340,0, 1159P 705 +0; 1159P 706 +508,4,0,5691,341,0,0,0,5691,340,1,0,0,5691,342,0,0,0,5691,343,0, 1161P 707 +0; 1161P 708 +508,4,0,5691,344,0,0,0,5691,343,1,0,0,5691,345,0,0,0,5691,346,0, 1163P 709 +0; 1163P 710 +508,4,0,5691,347,0,0,0,5691,346,1,0,0,5691,348,0,0,0,5691,314,0, 1165P 711 +0; 1165P 712 +508,4,0,5691,349,0,0,0,5691,350,1,0,0,5691,351,0,0,0,5691,352,0, 1167P 713 +0; 1167P 714 +508,4,0,5691,353,0,0,0,5691,352,1,0,0,5691,354,0,0,0,5691,355,0, 1169P 715 +0; 1169P 716 +508,4,0,5691,356,0,0,0,5691,355,1,0,0,5691,357,0,0,0,5691,358,0, 1171P 717 +0; 1171P 718 +508,4,0,5691,359,0,0,0,5691,358,1,0,0,5691,360,0,0,0,5691,361,0, 1173P 719 +0; 1173P 720 +508,4,0,5691,362,0,0,0,5691,361,1,0,0,5691,363,0,0,0,5691,364,0, 1175P 721 +0; 1175P 722 +508,4,0,5691,365,0,0,0,5691,364,1,0,0,5691,366,0,0,0,5691,367,0, 1177P 723 +0; 1177P 724 +508,4,0,5691,368,0,0,0,5691,367,1,0,0,5691,369,0,0,0,5691,370,0, 1179P 725 +0; 1179P 726 +508,4,0,5691,371,0,0,0,5691,370,1,0,0,5691,372,0,0,0,5691,373,0, 1181P 727 +0; 1181P 728 +508,4,0,5691,374,0,0,0,5691,373,1,0,0,5691,375,0,0,0,5691,376,0, 1183P 729 +0; 1183P 730 +508,4,0,5691,377,0,0,0,5691,376,1,0,0,5691,378,0,0,0,5691,379,0, 1185P 731 +0; 1185P 732 +508,4,0,5691,380,0,0,0,5691,379,1,0,0,5691,381,0,0,0,5691,382,0, 1187P 733 +0; 1187P 734 +508,4,0,5691,383,0,0,0,5691,382,1,0,0,5691,384,0,0,0,5691,350,0, 1189P 735 +0; 1189P 736 +508,4,0,5691,385,0,0,0,5691,386,1,0,0,5691,387,0,0,0,5691,388,0, 1191P 737 +0; 1191P 738 +508,4,0,5691,389,0,0,0,5691,388,1,0,0,5691,390,0,0,0,5691,391,0, 1193P 739 +0; 1193P 740 +508,4,0,5691,392,0,0,0,5691,391,1,0,0,5691,393,0,0,0,5691,394,0, 1195P 741 +0; 1195P 742 +508,4,0,5691,395,0,0,0,5691,394,1,0,0,5691,396,0,0,0,5691,397,0, 1197P 743 +0; 1197P 744 +508,4,0,5691,398,0,0,0,5691,397,1,0,0,5691,399,0,0,0,5691,400,0, 1199P 745 +0; 1199P 746 +508,4,0,5691,401,0,0,0,5691,400,1,0,0,5691,402,0,0,0,5691,403,0, 1201P 747 +0; 1201P 748 +508,4,0,5691,404,0,0,0,5691,403,1,0,0,5691,405,0,0,0,5691,406,0, 1203P 749 +0; 1203P 750 +508,4,0,5691,407,0,0,0,5691,406,1,0,0,5691,408,0,0,0,5691,409,0, 1205P 751 +0; 1205P 752 +508,4,0,5691,410,0,0,0,5691,409,1,0,0,5691,411,0,0,0,5691,412,0, 1207P 753 +0; 1207P 754 +508,4,0,5691,413,0,0,0,5691,412,1,0,0,5691,414,0,0,0,5691,415,0, 1209P 755 +0; 1209P 756 +508,4,0,5691,416,0,0,0,5691,415,1,0,0,5691,417,0,0,0,5691,418,0, 1211P 757 +0; 1211P 758 +508,4,0,5691,419,0,0,0,5691,418,1,0,0,5691,420,0,0,0,5691,386,0, 1213P 759 +0; 1213P 760 +508,4,0,5691,421,0,0,0,5691,422,1,0,0,5691,423,0,0,0,5691,424,0, 1215P 761 +0; 1215P 762 +508,4,0,5691,425,0,0,0,5691,424,1,0,0,5691,426,0,0,0,5691,427,0, 1217P 763 +0; 1217P 764 +508,4,0,5691,428,0,0,0,5691,427,1,0,0,5691,429,0,0,0,5691,430,0, 1219P 765 +0; 1219P 766 +508,4,0,5691,431,0,0,0,5691,430,1,0,0,5691,432,0,0,0,5691,433,0, 1221P 767 +0; 1221P 768 +508,4,0,5691,434,0,0,0,5691,433,1,0,0,5691,435,0,0,0,5691,436,0, 1223P 769 +0; 1223P 770 +508,4,0,5691,437,0,0,0,5691,436,1,0,0,5691,438,0,0,0,5691,439,0, 1225P 771 +0; 1225P 772 +508,4,0,5691,440,0,0,0,5691,439,1,0,0,5691,441,0,0,0,5691,442,0, 1227P 773 +0; 1227P 774 +508,4,0,5691,443,0,0,0,5691,442,1,0,0,5691,444,0,0,0,5691,445,0, 1229P 775 +0; 1229P 776 +508,4,0,5691,446,0,0,0,5691,445,1,0,0,5691,447,0,0,0,5691,448,0, 1231P 777 +0; 1231P 778 +508,4,0,5691,449,0,0,0,5691,448,1,0,0,5691,450,0,0,0,5691,451,0, 1233P 779 +0; 1233P 780 +508,4,0,5691,452,0,0,0,5691,451,1,0,0,5691,453,0,0,0,5691,454,0, 1235P 781 +0; 1235P 782 +508,4,0,5691,455,0,0,0,5691,454,1,0,0,5691,456,0,0,0,5691,422,0, 1237P 783 +0; 1237P 784 +508,4,0,5691,457,0,0,0,5691,458,1,0,0,5691,459,0,0,0,5691,460,0, 1239P 785 +0; 1239P 786 +508,4,0,5691,461,0,0,0,5691,460,1,0,0,5691,462,0,0,0,5691,463,0, 1241P 787 +0; 1241P 788 +508,4,0,5691,464,0,0,0,5691,463,1,0,0,5691,465,0,0,0,5691,466,0, 1243P 789 +0; 1243P 790 +508,4,0,5691,467,0,0,0,5691,466,1,0,0,5691,468,0,0,0,5691,469,0, 1245P 791 +0; 1245P 792 +508,4,0,5691,470,0,0,0,5691,469,1,0,0,5691,471,0,0,0,5691,472,0, 1247P 793 +0; 1247P 794 +508,4,0,5691,473,0,0,0,5691,472,1,0,0,5691,474,0,0,0,5691,475,0, 1249P 795 +0; 1249P 796 +508,4,0,5691,476,0,0,0,5691,475,1,0,0,5691,477,0,0,0,5691,478,0, 1251P 797 +0; 1251P 798 +508,4,0,5691,479,0,0,0,5691,478,1,0,0,5691,480,0,0,0,5691,481,0, 1253P 799 +0; 1253P 800 +508,4,0,5691,482,0,0,0,5691,481,1,0,0,5691,483,0,0,0,5691,484,0, 1255P 801 +0; 1255P 802 +508,4,0,5691,485,0,0,0,5691,484,1,0,0,5691,486,0,0,0,5691,487,0, 1257P 803 +0; 1257P 804 +508,4,0,5691,488,0,0,0,5691,487,1,0,0,5691,489,0,0,0,5691,490,0, 1259P 805 +0; 1259P 806 +508,4,0,5691,491,0,0,0,5691,490,1,0,0,5691,492,0,0,0,5691,458,0, 1261P 807 +0; 1261P 808 +508,4,0,5691,493,0,0,0,5691,494,1,0,0,5691,495,0,0,0,5691,496,0, 1263P 809 +0; 1263P 810 +508,4,0,5691,497,0,0,0,5691,496,1,0,0,5691,498,0,0,0,5691,499,0, 1265P 811 +0; 1265P 812 +508,4,0,5691,500,0,0,0,5691,499,1,0,0,5691,501,0,0,0,5691,502,0, 1267P 813 +0; 1267P 814 +508,4,0,5691,503,0,0,0,5691,502,1,0,0,5691,504,0,0,0,5691,505,0, 1269P 815 +0; 1269P 816 +508,4,0,5691,506,0,0,0,5691,505,1,0,0,5691,507,0,0,0,5691,508,0, 1271P 817 +0; 1271P 818 +508,4,0,5691,509,0,0,0,5691,508,1,0,0,5691,510,0,0,0,5691,511,0, 1273P 819 +0; 1273P 820 +508,4,0,5691,512,0,0,0,5691,511,1,0,0,5691,513,0,0,0,5691,514,0, 1275P 821 +0; 1275P 822 +508,4,0,5691,515,0,0,0,5691,514,1,0,0,5691,516,0,0,0,5691,517,0, 1277P 823 +0; 1277P 824 +508,4,0,5691,518,0,0,0,5691,517,1,0,0,5691,519,0,0,0,5691,520,0, 1279P 825 +0; 1279P 826 +508,4,0,5691,521,0,0,0,5691,520,1,0,0,5691,522,0,0,0,5691,523,0, 1281P 827 +0; 1281P 828 +508,4,0,5691,524,0,0,0,5691,523,1,0,0,5691,525,0,0,0,5691,526,0, 1283P 829 +0; 1283P 830 +508,4,0,5691,527,0,0,0,5691,526,1,0,0,5691,528,0,0,0,5691,494,0, 1285P 831 +0; 1285P 832 +508,4,0,5691,529,0,0,0,5691,530,1,0,0,5691,531,0,0,0,5691,532,0, 1287P 833 +0; 1287P 834 +508,4,0,5691,533,0,0,0,5691,532,1,0,0,5691,534,0,0,0,5691,535,0, 1289P 835 +0; 1289P 836 +508,4,0,5691,536,0,0,0,5691,535,1,0,0,5691,537,0,0,0,5691,538,0, 1291P 837 +0; 1291P 838 +508,4,0,5691,539,0,0,0,5691,538,1,0,0,5691,540,0,0,0,5691,541,0, 1293P 839 +0; 1293P 840 +508,4,0,5691,542,0,0,0,5691,541,1,0,0,5691,543,0,0,0,5691,544,0, 1295P 841 +0; 1295P 842 +508,4,0,5691,545,0,0,0,5691,544,1,0,0,5691,546,0,0,0,5691,547,0, 1297P 843 +0; 1297P 844 +508,4,0,5691,548,0,0,0,5691,547,1,0,0,5691,549,0,0,0,5691,550,0, 1299P 845 +0; 1299P 846 +508,4,0,5691,551,0,0,0,5691,550,1,0,0,5691,552,0,0,0,5691,553,0, 1301P 847 +0; 1301P 848 +508,4,0,5691,554,0,0,0,5691,553,1,0,0,5691,555,0,0,0,5691,556,0, 1303P 849 +0; 1303P 850 +508,4,0,5691,557,0,0,0,5691,556,1,0,0,5691,558,0,0,0,5691,559,0, 1305P 851 +0; 1305P 852 +508,4,0,5691,560,0,0,0,5691,559,1,0,0,5691,561,0,0,0,5691,562,0, 1307P 853 +0; 1307P 854 +508,4,0,5691,563,0,0,0,5691,562,1,0,0,5691,564,0,0,0,5691,530,0, 1309P 855 +0; 1309P 856 +508,4,0,5691,565,0,0,0,5691,566,1,0,0,5691,567,0,0,0,5691,568,0, 1311P 857 +0; 1311P 858 +508,4,0,5691,569,0,0,0,5691,568,1,0,0,5691,570,0,0,0,5691,571,0, 1313P 859 +0; 1313P 860 +508,4,0,5691,572,0,0,0,5691,571,1,0,0,5691,573,0,0,0,5691,574,0, 1315P 861 +0; 1315P 862 +508,4,0,5691,575,0,0,0,5691,574,1,0,0,5691,576,0,0,0,5691,577,0, 1317P 863 +0; 1317P 864 +508,4,0,5691,578,0,0,0,5691,577,1,0,0,5691,579,0,0,0,5691,580,0, 1319P 865 +0; 1319P 866 +508,4,0,5691,581,0,0,0,5691,580,1,0,0,5691,582,0,0,0,5691,583,0, 1321P 867 +0; 1321P 868 +508,4,0,5691,584,0,0,0,5691,583,1,0,0,5691,585,0,0,0,5691,586,0, 1323P 869 +0; 1323P 870 +508,4,0,5691,587,0,0,0,5691,586,1,0,0,5691,588,0,0,0,5691,589,0, 1325P 871 +0; 1325P 872 +508,4,0,5691,590,0,0,0,5691,589,1,0,0,5691,591,0,0,0,5691,592,0, 1327P 873 +0; 1327P 874 +508,4,0,5691,593,0,0,0,5691,592,1,0,0,5691,594,0,0,0,5691,595,0, 1329P 875 +0; 1329P 876 +508,4,0,5691,596,0,0,0,5691,595,1,0,0,5691,597,0,0,0,5691,598,0, 1331P 877 +0; 1331P 878 +508,4,0,5691,599,0,0,0,5691,598,1,0,0,5691,600,0,0,0,5691,566,0, 1333P 879 +0; 1333P 880 +508,4,0,5691,601,0,0,0,5691,602,1,0,0,5691,603,0,0,0,5691,604,0, 1335P 881 +0; 1335P 882 +508,4,0,5691,605,0,0,0,5691,604,1,0,0,5691,606,0,0,0,5691,607,0, 1337P 883 +0; 1337P 884 +508,4,0,5691,608,0,0,0,5691,607,1,0,0,5691,609,0,0,0,5691,610,0, 1339P 885 +0; 1339P 886 +508,4,0,5691,611,0,0,0,5691,610,1,0,0,5691,612,0,0,0,5691,613,0, 1341P 887 +0; 1341P 888 +508,4,0,5691,614,0,0,0,5691,613,1,0,0,5691,615,0,0,0,5691,616,0, 1343P 889 +0; 1343P 890 +508,4,0,5691,617,0,0,0,5691,616,1,0,0,5691,618,0,0,0,5691,619,0, 1345P 891 +0; 1345P 892 +508,4,0,5691,620,0,0,0,5691,619,1,0,0,5691,621,0,0,0,5691,622,0, 1347P 893 +0; 1347P 894 +508,4,0,5691,623,0,0,0,5691,622,1,0,0,5691,624,0,0,0,5691,625,0, 1349P 895 +0; 1349P 896 +508,4,0,5691,626,0,0,0,5691,625,1,0,0,5691,627,0,0,0,5691,628,0, 1351P 897 +0; 1351P 898 +508,4,0,5691,629,0,0,0,5691,628,1,0,0,5691,630,0,0,0,5691,631,0, 1353P 899 +0; 1353P 900 +508,4,0,5691,632,0,0,0,5691,631,1,0,0,5691,633,0,0,0,5691,634,0, 1355P 901 +0; 1355P 902 +508,4,0,5691,635,0,0,0,5691,634,1,0,0,5691,636,0,0,0,5691,602,0, 1357P 903 +0; 1357P 904 +508,4,0,5691,637,0,0,0,5691,638,1,0,0,5691,639,0,0,0,5691,640,0, 1359P 905 +0; 1359P 906 +508,4,0,5691,641,0,0,0,5691,640,1,0,0,5691,642,0,0,0,5691,643,0, 1361P 907 +0; 1361P 908 +508,4,0,5691,644,0,0,0,5691,643,1,0,0,5691,645,0,0,0,5691,646,0, 1363P 909 +0; 1363P 910 +508,4,0,5691,647,0,0,0,5691,646,1,0,0,5691,648,0,0,0,5691,649,0, 1365P 911 +0; 1365P 912 +508,4,0,5691,650,0,0,0,5691,649,1,0,0,5691,651,0,0,0,5691,652,0, 1367P 913 +0; 1367P 914 +508,4,0,5691,653,0,0,0,5691,652,1,0,0,5691,654,0,0,0,5691,655,0, 1369P 915 +0; 1369P 916 +508,4,0,5691,656,0,0,0,5691,655,1,0,0,5691,657,0,0,0,5691,658,0, 1371P 917 +0; 1371P 918 +508,4,0,5691,659,0,0,0,5691,658,1,0,0,5691,660,0,0,0,5691,661,0, 1373P 919 +0; 1373P 920 +508,4,0,5691,662,0,0,0,5691,661,1,0,0,5691,663,0,0,0,5691,664,0, 1375P 921 +0; 1375P 922 +508,4,0,5691,665,0,0,0,5691,664,1,0,0,5691,666,0,0,0,5691,667,0, 1377P 923 +0; 1377P 924 +508,4,0,5691,668,0,0,0,5691,667,1,0,0,5691,669,0,0,0,5691,670,0, 1379P 925 +0; 1379P 926 +508,4,0,5691,671,0,0,0,5691,670,1,0,0,5691,672,0,0,0,5691,638,0, 1381P 927 +0; 1381P 928 +508,4,0,5691,673,0,0,0,5691,674,1,0,0,5691,675,0,0,0,5691,676,0, 1383P 929 +0; 1383P 930 +508,4,0,5691,677,0,0,0,5691,676,1,0,0,5691,678,0,0,0,5691,679,0, 1385P 931 +0; 1385P 932 +508,4,0,5691,680,0,0,0,5691,679,1,0,0,5691,681,0,0,0,5691,682,0, 1387P 933 +0; 1387P 934 +508,4,0,5691,683,0,0,0,5691,682,1,0,0,5691,684,0,0,0,5691,685,0, 1389P 935 +0; 1389P 936 +508,4,0,5691,686,0,0,0,5691,685,1,0,0,5691,687,0,0,0,5691,688,0, 1391P 937 +0; 1391P 938 +508,4,0,5691,689,0,0,0,5691,688,1,0,0,5691,690,0,0,0,5691,691,0, 1393P 939 +0; 1393P 940 +508,4,0,5691,692,0,0,0,5691,691,1,0,0,5691,693,0,0,0,5691,694,0, 1395P 941 +0; 1395P 942 +508,4,0,5691,695,0,0,0,5691,694,1,0,0,5691,696,0,0,0,5691,697,0, 1397P 943 +0; 1397P 944 +508,4,0,5691,698,0,0,0,5691,697,1,0,0,5691,699,0,0,0,5691,700,0, 1399P 945 +0; 1399P 946 +508,4,0,5691,701,0,0,0,5691,700,1,0,0,5691,702,0,0,0,5691,703,0, 1401P 947 +0; 1401P 948 +508,4,0,5691,704,0,0,0,5691,703,1,0,0,5691,705,0,0,0,5691,706,0, 1403P 949 +0; 1403P 950 +508,4,0,5691,707,0,0,0,5691,706,1,0,0,5691,708,0,0,0,5691,674,0, 1405P 951 +0; 1405P 952 +508,4,0,5691,709,0,0,0,5691,710,1,0,0,5691,711,0,0,0,5691,712,0, 1407P 953 +0; 1407P 954 +508,4,0,5691,713,0,0,0,5691,712,1,0,0,5691,714,0,0,0,5691,715,0, 1409P 955 +0; 1409P 956 +508,4,0,5691,716,0,0,0,5691,715,1,0,0,5691,717,0,0,0,5691,718,0, 1411P 957 +0; 1411P 958 +508,4,0,5691,719,0,0,0,5691,718,1,0,0,5691,720,0,0,0,5691,721,0, 1413P 959 +0; 1413P 960 +508,4,0,5691,722,0,0,0,5691,721,1,0,0,5691,723,0,0,0,5691,724,0, 1415P 961 +0; 1415P 962 +508,4,0,5691,725,0,0,0,5691,724,1,0,0,5691,726,0,0,0,5691,727,0, 1417P 963 +0; 1417P 964 +508,4,0,5691,728,0,0,0,5691,727,1,0,0,5691,729,0,0,0,5691,730,0, 1419P 965 +0; 1419P 966 +508,4,0,5691,731,0,0,0,5691,730,1,0,0,5691,732,0,0,0,5691,733,0, 1421P 967 +0; 1421P 968 +508,4,0,5691,734,0,0,0,5691,733,1,0,0,5691,735,0,0,0,5691,736,0, 1423P 969 +0; 1423P 970 +508,4,0,5691,737,0,0,0,5691,736,1,0,0,5691,738,0,0,0,5691,739,0, 1425P 971 +0; 1425P 972 +508,4,0,5691,740,0,0,0,5691,739,1,0,0,5691,741,0,0,0,5691,742,0, 1427P 973 +0; 1427P 974 +508,4,0,5691,743,0,0,0,5691,742,1,0,0,5691,744,0,0,0,5691,710,0, 1429P 975 +0; 1429P 976 +508,4,0,5691,745,0,0,0,5691,746,1,0,0,5691,747,0,0,0,5691,748,0, 1431P 977 +0; 1431P 978 +508,4,0,5691,749,0,0,0,5691,748,1,0,0,5691,750,0,0,0,5691,751,0, 1433P 979 +0; 1433P 980 +508,4,0,5691,752,0,0,0,5691,751,1,0,0,5691,753,0,0,0,5691,754,0, 1435P 981 +0; 1435P 982 +508,4,0,5691,755,0,0,0,5691,754,1,0,0,5691,756,0,0,0,5691,757,0, 1437P 983 +0; 1437P 984 +508,4,0,5691,758,0,0,0,5691,757,1,0,0,5691,759,0,0,0,5691,760,0, 1439P 985 +0; 1439P 986 +508,4,0,5691,761,0,0,0,5691,760,1,0,0,5691,762,0,0,0,5691,763,0, 1441P 987 +0; 1441P 988 +508,4,0,5691,764,0,0,0,5691,763,1,0,0,5691,765,0,0,0,5691,766,0, 1443P 989 +0; 1443P 990 +508,4,0,5691,767,0,0,0,5691,766,1,0,0,5691,768,0,0,0,5691,769,0, 1445P 991 +0; 1445P 992 +508,4,0,5691,770,0,0,0,5691,769,1,0,0,5691,771,0,0,0,5691,772,0, 1447P 993 +0; 1447P 994 +508,4,0,5691,773,0,0,0,5691,772,1,0,0,5691,774,0,0,0,5691,775,0, 1449P 995 +0; 1449P 996 +508,4,0,5691,776,0,0,0,5691,775,1,0,0,5691,777,0,0,0,5691,778,0, 1451P 997 +0; 1451P 998 +508,4,0,5691,779,0,0,0,5691,778,1,0,0,5691,780,0,0,0,5691,746,0, 1453P 999 +0; 1453P 1000 +508,4,0,5691,781,0,0,0,5691,782,1,0,0,5691,783,0,0,0,5691,784,0, 1455P 1001 +0; 1455P 1002 +508,4,0,5691,785,0,0,0,5691,784,1,0,0,5691,786,0,0,0,5691,787,0, 1457P 1003 +0; 1457P 1004 +508,4,0,5691,788,0,0,0,5691,787,1,0,0,5691,789,0,0,0,5691,790,0, 1459P 1005 +0; 1459P 1006 +508,4,0,5691,791,0,0,0,5691,790,1,0,0,5691,792,0,0,0,5691,793,0, 1461P 1007 +0; 1461P 1008 +508,4,0,5691,794,0,0,0,5691,793,1,0,0,5691,795,0,0,0,5691,796,0, 1463P 1009 +0; 1463P 1010 +508,4,0,5691,797,0,0,0,5691,796,1,0,0,5691,798,0,0,0,5691,799,0, 1465P 1011 +0; 1465P 1012 +508,4,0,5691,800,0,0,0,5691,799,1,0,0,5691,801,0,0,0,5691,802,0, 1467P 1013 +0; 1467P 1014 +508,4,0,5691,803,0,0,0,5691,802,1,0,0,5691,804,0,0,0,5691,805,0, 1469P 1015 +0; 1469P 1016 +508,4,0,5691,806,0,0,0,5691,805,1,0,0,5691,807,0,0,0,5691,808,0, 1471P 1017 +0; 1471P 1018 +508,4,0,5691,809,0,0,0,5691,808,1,0,0,5691,810,0,0,0,5691,811,0, 1473P 1019 +0; 1473P 1020 +508,4,0,5691,812,0,0,0,5691,811,1,0,0,5691,813,0,0,0,5691,814,0, 1475P 1021 +0; 1475P 1022 +508,4,0,5691,815,0,0,0,5691,814,1,0,0,5691,816,0,0,0,5691,782,0, 1477P 1023 +0; 1477P 1024 +508,4,0,5691,817,0,0,0,5691,818,1,0,0,5691,819,0,0,0,5691,820,0, 1479P 1025 +0; 1479P 1026 +508,4,0,5691,821,0,0,0,5691,820,1,0,0,5691,822,0,0,0,5691,823,0, 1481P 1027 +0; 1481P 1028 +508,4,0,5691,824,0,0,0,5691,823,1,0,0,5691,825,0,0,0,5691,826,0, 1483P 1029 +0; 1483P 1030 +508,4,0,5691,827,0,0,0,5691,826,1,0,0,5691,828,0,0,0,5691,829,0, 1485P 1031 +0; 1485P 1032 +508,4,0,5691,830,0,0,0,5691,829,1,0,0,5691,831,0,0,0,5691,832,0, 1487P 1033 +0; 1487P 1034 +508,4,0,5691,833,0,0,0,5691,832,1,0,0,5691,834,0,0,0,5691,835,0, 1489P 1035 +0; 1489P 1036 +508,4,0,5691,836,0,0,0,5691,835,1,0,0,5691,837,0,0,0,5691,838,0, 1491P 1037 +0; 1491P 1038 +508,4,0,5691,839,0,0,0,5691,838,1,0,0,5691,840,0,0,0,5691,841,0, 1493P 1039 +0; 1493P 1040 +508,4,0,5691,842,0,0,0,5691,841,1,0,0,5691,843,0,0,0,5691,844,0, 1495P 1041 +0; 1495P 1042 +508,4,0,5691,845,0,0,0,5691,844,1,0,0,5691,846,0,0,0,5691,847,0, 1497P 1043 +0; 1497P 1044 +508,4,0,5691,848,0,0,0,5691,847,1,0,0,5691,849,0,0,0,5691,850,0, 1499P 1045 +0; 1499P 1046 +508,4,0,5691,851,0,0,0,5691,850,1,0,0,5691,852,0,0,0,5691,818,0, 1501P 1047 +0; 1501P 1048 +508,4,0,5691,853,0,0,0,5691,854,1,0,0,5691,855,0,0,0,5691,856,0, 1503P 1049 +0; 1503P 1050 +508,4,0,5691,857,0,0,0,5691,856,1,0,0,5691,858,0,0,0,5691,859,0, 1505P 1051 +0; 1505P 1052 +508,4,0,5691,860,0,0,0,5691,859,1,0,0,5691,861,0,0,0,5691,862,0, 1507P 1053 +0; 1507P 1054 +508,4,0,5691,863,0,0,0,5691,862,1,0,0,5691,864,0,0,0,5691,865,0, 1509P 1055 +0; 1509P 1056 +508,4,0,5691,866,0,0,0,5691,865,1,0,0,5691,867,0,0,0,5691,868,0, 1511P 1057 +0; 1511P 1058 +508,4,0,5691,869,0,0,0,5691,868,1,0,0,5691,870,0,0,0,5691,871,0, 1513P 1059 +0; 1513P 1060 +508,4,0,5691,872,0,0,0,5691,871,1,0,0,5691,873,0,0,0,5691,874,0, 1515P 1061 +0; 1515P 1062 +508,4,0,5691,875,0,0,0,5691,874,1,0,0,5691,876,0,0,0,5691,877,0, 1517P 1063 +0; 1517P 1064 +508,4,0,5691,878,0,0,0,5691,877,1,0,0,5691,879,0,0,0,5691,880,0, 1519P 1065 +0; 1519P 1066 +508,4,0,5691,881,0,0,0,5691,880,1,0,0,5691,882,0,0,0,5691,883,0, 1521P 1067 +0; 1521P 1068 +508,4,0,5691,884,0,0,0,5691,883,1,0,0,5691,885,0,0,0,5691,886,0, 1523P 1069 +0; 1523P 1070 +508,4,0,5691,887,0,0,0,5691,886,1,0,0,5691,888,0,0,0,5691,854,0, 1525P 1071 +0; 1525P 1072 +508,4,0,5691,889,1,0,0,5691,890,1,0,0,5691,891,0,0,0,5691,892,0, 1527P 1073 +0; 1527P 1074 +508,4,0,5691,893,1,0,0,5691,892,1,0,0,5691,894,0,0,0,5691,895,0, 1529P 1075 +0; 1529P 1076 +508,4,0,5691,896,1,0,0,5691,895,1,0,0,5691,897,0,0,0,5691,898,0, 1531P 1077 +0; 1531P 1078 +508,4,0,5691,899,1,0,0,5691,898,1,0,0,5691,900,0,0,0,5691,901,0, 1533P 1079 +0; 1533P 1080 +508,4,0,5691,902,1,0,0,5691,901,1,0,0,5691,903,0,0,0,5691,904,0, 1535P 1081 +0; 1535P 1082 +508,4,0,5691,905,1,0,0,5691,904,1,0,0,5691,906,0,0,0,5691,907,0, 1537P 1083 +0; 1537P 1084 +508,4,0,5691,908,1,0,0,5691,907,1,0,0,5691,909,0,0,0,5691,910,0, 1539P 1085 +0; 1539P 1086 +508,4,0,5691,911,1,0,0,5691,910,1,0,0,5691,912,0,0,0,5691,913,0, 1541P 1087 +0; 1541P 1088 +508,4,0,5691,914,1,0,0,5691,913,1,0,0,5691,915,0,0,0,5691,890,0, 1543P 1089 +0; 1543P 1090 +508,9,0,5691,915,1,0,0,5691,912,1,0,0,5691,909,1,0,0,5691,906,1, 1545P 1091 +0,0,5691,903,1,0,0,5691,900,1,0,0,5691,897,1,0,0,5691,894,1,0,0, 1545P 1092 +5691,891,1,0; 1545P 1093 +508,12,0,5691,888,1,0,0,5691,885,1,0,0,5691,882,1,0,0,5691,879, 1547P 1094 +1,0,0,5691,876,1,0,0,5691,873,1,0,0,5691,870,1,0,0,5691,867,1,0, 1547P 1095 +0,5691,864,1,0,0,5691,861,1,0,0,5691,858,1,0,0,5691,855,1,0; 1547P 1096 +508,12,0,5691,852,1,0,0,5691,849,1,0,0,5691,846,1,0,0,5691,843, 1549P 1097 +1,0,0,5691,840,1,0,0,5691,837,1,0,0,5691,834,1,0,0,5691,831,1,0, 1549P 1098 +0,5691,828,1,0,0,5691,825,1,0,0,5691,822,1,0,0,5691,819,1,0; 1549P 1099 +508,12,0,5691,816,1,0,0,5691,813,1,0,0,5691,810,1,0,0,5691,807, 1551P 1100 +1,0,0,5691,804,1,0,0,5691,801,1,0,0,5691,798,1,0,0,5691,795,1,0, 1551P 1101 +0,5691,792,1,0,0,5691,789,1,0,0,5691,786,1,0,0,5691,783,1,0; 1551P 1102 +508,12,0,5691,780,1,0,0,5691,777,1,0,0,5691,774,1,0,0,5691,771, 1553P 1103 +1,0,0,5691,768,1,0,0,5691,765,1,0,0,5691,762,1,0,0,5691,759,1,0, 1553P 1104 +0,5691,756,1,0,0,5691,753,1,0,0,5691,750,1,0,0,5691,747,1,0; 1553P 1105 +508,12,0,5691,744,1,0,0,5691,741,1,0,0,5691,738,1,0,0,5691,735, 1555P 1106 +1,0,0,5691,732,1,0,0,5691,729,1,0,0,5691,726,1,0,0,5691,723,1,0, 1555P 1107 +0,5691,720,1,0,0,5691,717,1,0,0,5691,714,1,0,0,5691,711,1,0; 1555P 1108 +508,12,0,5691,708,1,0,0,5691,705,1,0,0,5691,702,1,0,0,5691,699, 1557P 1109 +1,0,0,5691,696,1,0,0,5691,693,1,0,0,5691,690,1,0,0,5691,687,1,0, 1557P 1110 +0,5691,684,1,0,0,5691,681,1,0,0,5691,678,1,0,0,5691,675,1,0; 1557P 1111 +508,12,0,5691,672,1,0,0,5691,669,1,0,0,5691,666,1,0,0,5691,663, 1559P 1112 +1,0,0,5691,660,1,0,0,5691,657,1,0,0,5691,654,1,0,0,5691,651,1,0, 1559P 1113 +0,5691,648,1,0,0,5691,645,1,0,0,5691,642,1,0,0,5691,639,1,0; 1559P 1114 +508,12,0,5691,636,1,0,0,5691,633,1,0,0,5691,630,1,0,0,5691,627, 1561P 1115 +1,0,0,5691,624,1,0,0,5691,621,1,0,0,5691,618,1,0,0,5691,615,1,0, 1561P 1116 +0,5691,612,1,0,0,5691,609,1,0,0,5691,606,1,0,0,5691,603,1,0; 1561P 1117 +508,12,0,5691,600,1,0,0,5691,597,1,0,0,5691,594,1,0,0,5691,591, 1563P 1118 +1,0,0,5691,588,1,0,0,5691,585,1,0,0,5691,582,1,0,0,5691,579,1,0, 1563P 1119 +0,5691,576,1,0,0,5691,573,1,0,0,5691,570,1,0,0,5691,567,1,0; 1563P 1120 +508,12,0,5691,564,1,0,0,5691,561,1,0,0,5691,558,1,0,0,5691,555, 1565P 1121 +1,0,0,5691,552,1,0,0,5691,549,1,0,0,5691,546,1,0,0,5691,543,1,0, 1565P 1122 +0,5691,540,1,0,0,5691,537,1,0,0,5691,534,1,0,0,5691,531,1,0; 1565P 1123 +508,12,0,5691,528,1,0,0,5691,525,1,0,0,5691,522,1,0,0,5691,519, 1567P 1124 +1,0,0,5691,516,1,0,0,5691,513,1,0,0,5691,510,1,0,0,5691,507,1,0, 1567P 1125 +0,5691,504,1,0,0,5691,501,1,0,0,5691,498,1,0,0,5691,495,1,0; 1567P 1126 +508,12,0,5691,492,1,0,0,5691,489,1,0,0,5691,486,1,0,0,5691,483, 1569P 1127 +1,0,0,5691,480,1,0,0,5691,477,1,0,0,5691,474,1,0,0,5691,471,1,0, 1569P 1128 +0,5691,468,1,0,0,5691,465,1,0,0,5691,462,1,0,0,5691,459,1,0; 1569P 1129 +508,12,0,5691,456,1,0,0,5691,453,1,0,0,5691,450,1,0,0,5691,447, 1571P 1130 +1,0,0,5691,444,1,0,0,5691,441,1,0,0,5691,438,1,0,0,5691,435,1,0, 1571P 1131 +0,5691,432,1,0,0,5691,429,1,0,0,5691,426,1,0,0,5691,423,1,0; 1571P 1132 +508,12,0,5691,420,1,0,0,5691,417,1,0,0,5691,414,1,0,0,5691,411, 1573P 1133 +1,0,0,5691,408,1,0,0,5691,405,1,0,0,5691,402,1,0,0,5691,399,1,0, 1573P 1134 +0,5691,396,1,0,0,5691,393,1,0,0,5691,390,1,0,0,5691,387,1,0; 1573P 1135 +508,12,0,5691,384,1,0,0,5691,381,1,0,0,5691,378,1,0,0,5691,375, 1575P 1136 +1,0,0,5691,372,1,0,0,5691,369,1,0,0,5691,366,1,0,0,5691,363,1,0, 1575P 1137 +0,5691,360,1,0,0,5691,357,1,0,0,5691,354,1,0,0,5691,351,1,0; 1575P 1138 +508,12,0,5691,348,1,0,0,5691,345,1,0,0,5691,342,1,0,0,5691,339, 1577P 1139 +1,0,0,5691,336,1,0,0,5691,333,1,0,0,5691,330,1,0,0,5691,327,1,0, 1577P 1140 +0,5691,324,1,0,0,5691,321,1,0,0,5691,318,1,0,0,5691,315,1,0; 1577P 1141 +508,12,0,5691,312,1,0,0,5691,309,1,0,0,5691,306,1,0,0,5691,303, 1579P 1142 +1,0,0,5691,300,1,0,0,5691,297,1,0,0,5691,294,1,0,0,5691,291,1,0, 1579P 1143 +0,5691,288,1,0,0,5691,285,1,0,0,5691,282,1,0,0,5691,279,1,0; 1579P 1144 +508,12,0,5691,276,1,0,0,5691,273,1,0,0,5691,270,1,0,0,5691,267, 1581P 1145 +1,0,0,5691,264,1,0,0,5691,261,1,0,0,5691,258,1,0,0,5691,255,1,0, 1581P 1146 +0,5691,252,1,0,0,5691,249,1,0,0,5691,246,1,0,0,5691,243,1,0; 1581P 1147 +508,12,0,5691,240,1,0,0,5691,237,1,0,0,5691,234,1,0,0,5691,231, 1583P 1148 +1,0,0,5691,228,1,0,0,5691,225,1,0,0,5691,222,1,0,0,5691,219,1,0, 1583P 1149 +0,5691,216,1,0,0,5691,213,1,0,0,5691,210,1,0,0,5691,207,1,0; 1583P 1150 +508,12,0,5691,204,1,0,0,5691,201,1,0,0,5691,198,1,0,0,5691,195, 1585P 1151 +1,0,0,5691,192,1,0,0,5691,189,1,0,0,5691,186,1,0,0,5691,183,1,0, 1585P 1152 +0,5691,180,1,0,0,5691,177,1,0,0,5691,174,1,0,0,5691,171,1,0; 1585P 1153 +508,12,0,5691,168,1,0,0,5691,165,1,0,0,5691,162,1,0,0,5691,159, 1587P 1154 +1,0,0,5691,156,1,0,0,5691,153,1,0,0,5691,150,1,0,0,5691,147,1,0, 1587P 1155 +0,5691,144,1,0,0,5691,141,1,0,0,5691,138,1,0,0,5691,135,1,0; 1587P 1156 +508,12,0,5691,132,1,0,0,5691,129,1,0,0,5691,126,1,0,0,5691,123, 1589P 1157 +1,0,0,5691,120,1,0,0,5691,117,1,0,0,5691,114,1,0,0,5691,111,1,0, 1589P 1158 +0,5691,108,1,0,0,5691,105,1,0,0,5691,102,1,0,0,5691,99,1,0; 1589P 1159 +508,12,0,5691,96,1,0,0,5691,93,1,0,0,5691,90,1,0,0,5691,87,1,0, 1591P 1160 +0,5691,84,1,0,0,5691,81,1,0,0,5691,78,1,0,0,5691,75,1,0,0,5691, 1591P 1161 +72,1,0,0,5691,69,1,0,0,5691,66,1,0,0,5691,63,1,0; 1591P 1162 +508,12,0,5691,60,1,0,0,5691,57,1,0,0,5691,54,1,0,0,5691,51,1,0, 1593P 1163 +0,5691,48,1,0,0,5691,45,1,0,0,5691,42,1,0,0,5691,39,1,0,0,5691, 1593P 1164 +36,1,0,0,5691,33,1,0,0,5691,30,1,0,0,5691,27,1,0; 1593P 1165 +508,2,0,5691,24,1,0,0,5691,21,1,0; 1595P 1166 +508,2,0,5691,18,1,0,0,5691,15,1,0; 1597P 1167 +508,2,0,5691,12,1,0,0,5691,9,1,0; 1599P 1168 +508,2,0,5691,6,1,0,0,5691,3,1,0; 1601P 1169 +508,9,0,5691,914,0,0,0,5691,889,0,0,0,5691,893,0,0,0,5691,896,0, 1603P 1170 +0,0,5691,899,0,0,0,5691,902,0,0,0,5691,905,0,0,0,5691,908,0,0,0, 1603P 1171 +5691,911,0,0; 1603P 1172 +508,12,0,5691,887,1,0,0,5691,853,1,0,0,5691,857,1,0,0,5691,860, 1605P 1173 +1,0,0,5691,863,1,0,0,5691,866,1,0,0,5691,869,1,0,0,5691,872,1,0, 1605P 1174 +0,5691,875,1,0,0,5691,878,1,0,0,5691,881,1,0,0,5691,884,1,0; 1605P 1175 +508,12,0,5691,851,1,0,0,5691,817,1,0,0,5691,821,1,0,0,5691,824, 1607P 1176 +1,0,0,5691,827,1,0,0,5691,830,1,0,0,5691,833,1,0,0,5691,836,1,0, 1607P 1177 +0,5691,839,1,0,0,5691,842,1,0,0,5691,845,1,0,0,5691,848,1,0; 1607P 1178 +508,12,0,5691,815,1,0,0,5691,781,1,0,0,5691,785,1,0,0,5691,788, 1609P 1179 +1,0,0,5691,791,1,0,0,5691,794,1,0,0,5691,797,1,0,0,5691,800,1,0, 1609P 1180 +0,5691,803,1,0,0,5691,806,1,0,0,5691,809,1,0,0,5691,812,1,0; 1609P 1181 +508,12,0,5691,779,1,0,0,5691,745,1,0,0,5691,749,1,0,0,5691,752, 1611P 1182 +1,0,0,5691,755,1,0,0,5691,758,1,0,0,5691,761,1,0,0,5691,764,1,0, 1611P 1183 +0,5691,767,1,0,0,5691,770,1,0,0,5691,773,1,0,0,5691,776,1,0; 1611P 1184 +508,12,0,5691,743,1,0,0,5691,709,1,0,0,5691,713,1,0,0,5691,716, 1613P 1185 +1,0,0,5691,719,1,0,0,5691,722,1,0,0,5691,725,1,0,0,5691,728,1,0, 1613P 1186 +0,5691,731,1,0,0,5691,734,1,0,0,5691,737,1,0,0,5691,740,1,0; 1613P 1187 +508,12,0,5691,707,1,0,0,5691,673,1,0,0,5691,677,1,0,0,5691,680, 1615P 1188 +1,0,0,5691,683,1,0,0,5691,686,1,0,0,5691,689,1,0,0,5691,692,1,0, 1615P 1189 +0,5691,695,1,0,0,5691,698,1,0,0,5691,701,1,0,0,5691,704,1,0; 1615P 1190 +508,12,0,5691,671,1,0,0,5691,637,1,0,0,5691,641,1,0,0,5691,644, 1617P 1191 +1,0,0,5691,647,1,0,0,5691,650,1,0,0,5691,653,1,0,0,5691,656,1,0, 1617P 1192 +0,5691,659,1,0,0,5691,662,1,0,0,5691,665,1,0,0,5691,668,1,0; 1617P 1193 +508,12,0,5691,635,1,0,0,5691,601,1,0,0,5691,605,1,0,0,5691,608, 1619P 1194 +1,0,0,5691,611,1,0,0,5691,614,1,0,0,5691,617,1,0,0,5691,620,1,0, 1619P 1195 +0,5691,623,1,0,0,5691,626,1,0,0,5691,629,1,0,0,5691,632,1,0; 1619P 1196 +508,12,0,5691,599,1,0,0,5691,565,1,0,0,5691,569,1,0,0,5691,572, 1621P 1197 +1,0,0,5691,575,1,0,0,5691,578,1,0,0,5691,581,1,0,0,5691,584,1,0, 1621P 1198 +0,5691,587,1,0,0,5691,590,1,0,0,5691,593,1,0,0,5691,596,1,0; 1621P 1199 +508,12,0,5691,563,1,0,0,5691,529,1,0,0,5691,533,1,0,0,5691,536, 1623P 1200 +1,0,0,5691,539,1,0,0,5691,542,1,0,0,5691,545,1,0,0,5691,548,1,0, 1623P 1201 +0,5691,551,1,0,0,5691,554,1,0,0,5691,557,1,0,0,5691,560,1,0; 1623P 1202 +508,12,0,5691,527,1,0,0,5691,493,1,0,0,5691,497,1,0,0,5691,500, 1625P 1203 +1,0,0,5691,503,1,0,0,5691,506,1,0,0,5691,509,1,0,0,5691,512,1,0, 1625P 1204 +0,5691,515,1,0,0,5691,518,1,0,0,5691,521,1,0,0,5691,524,1,0; 1625P 1205 +508,12,0,5691,491,1,0,0,5691,457,1,0,0,5691,461,1,0,0,5691,464, 1627P 1206 +1,0,0,5691,467,1,0,0,5691,470,1,0,0,5691,473,1,0,0,5691,476,1,0, 1627P 1207 +0,5691,479,1,0,0,5691,482,1,0,0,5691,485,1,0,0,5691,488,1,0; 1627P 1208 +508,12,0,5691,455,1,0,0,5691,421,1,0,0,5691,425,1,0,0,5691,428, 1629P 1209 +1,0,0,5691,431,1,0,0,5691,434,1,0,0,5691,437,1,0,0,5691,440,1,0, 1629P 1210 +0,5691,443,1,0,0,5691,446,1,0,0,5691,449,1,0,0,5691,452,1,0; 1629P 1211 +508,12,0,5691,419,1,0,0,5691,385,1,0,0,5691,389,1,0,0,5691,392, 1631P 1212 +1,0,0,5691,395,1,0,0,5691,398,1,0,0,5691,401,1,0,0,5691,404,1,0, 1631P 1213 +0,5691,407,1,0,0,5691,410,1,0,0,5691,413,1,0,0,5691,416,1,0; 1631P 1214 +508,12,0,5691,383,1,0,0,5691,349,1,0,0,5691,353,1,0,0,5691,356, 1633P 1215 +1,0,0,5691,359,1,0,0,5691,362,1,0,0,5691,365,1,0,0,5691,368,1,0, 1633P 1216 +0,5691,371,1,0,0,5691,374,1,0,0,5691,377,1,0,0,5691,380,1,0; 1633P 1217 +508,12,0,5691,347,1,0,0,5691,313,1,0,0,5691,317,1,0,0,5691,320, 1635P 1218 +1,0,0,5691,323,1,0,0,5691,326,1,0,0,5691,329,1,0,0,5691,332,1,0, 1635P 1219 +0,5691,335,1,0,0,5691,338,1,0,0,5691,341,1,0,0,5691,344,1,0; 1635P 1220 +508,12,0,5691,311,1,0,0,5691,277,1,0,0,5691,281,1,0,0,5691,284, 1637P 1221 +1,0,0,5691,287,1,0,0,5691,290,1,0,0,5691,293,1,0,0,5691,296,1,0, 1637P 1222 +0,5691,299,1,0,0,5691,302,1,0,0,5691,305,1,0,0,5691,308,1,0; 1637P 1223 +508,12,0,5691,275,1,0,0,5691,241,1,0,0,5691,245,1,0,0,5691,248, 1639P 1224 +1,0,0,5691,251,1,0,0,5691,254,1,0,0,5691,257,1,0,0,5691,260,1,0, 1639P 1225 +0,5691,263,1,0,0,5691,266,1,0,0,5691,269,1,0,0,5691,272,1,0; 1639P 1226 +508,12,0,5691,239,1,0,0,5691,205,1,0,0,5691,209,1,0,0,5691,212, 1641P 1227 +1,0,0,5691,215,1,0,0,5691,218,1,0,0,5691,221,1,0,0,5691,224,1,0, 1641P 1228 +0,5691,227,1,0,0,5691,230,1,0,0,5691,233,1,0,0,5691,236,1,0; 1641P 1229 +508,12,0,5691,203,1,0,0,5691,169,1,0,0,5691,173,1,0,0,5691,176, 1643P 1230 +1,0,0,5691,179,1,0,0,5691,182,1,0,0,5691,185,1,0,0,5691,188,1,0, 1643P 1231 +0,5691,191,1,0,0,5691,194,1,0,0,5691,197,1,0,0,5691,200,1,0; 1643P 1232 +508,12,0,5691,167,1,0,0,5691,133,1,0,0,5691,137,1,0,0,5691,140, 1645P 1233 +1,0,0,5691,143,1,0,0,5691,146,1,0,0,5691,149,1,0,0,5691,152,1,0, 1645P 1234 +0,5691,155,1,0,0,5691,158,1,0,0,5691,161,1,0,0,5691,164,1,0; 1645P 1235 +508,12,0,5691,131,1,0,0,5691,97,1,0,0,5691,101,1,0,0,5691,104,1, 1647P 1236 +0,0,5691,107,1,0,0,5691,110,1,0,0,5691,113,1,0,0,5691,116,1,0,0, 1647P 1237 +5691,119,1,0,0,5691,122,1,0,0,5691,125,1,0,0,5691,128,1,0; 1647P 1238 +508,12,0,5691,95,1,0,0,5691,61,1,0,0,5691,65,1,0,0,5691,68,1,0, 1649P 1239 +0,5691,71,1,0,0,5691,74,1,0,0,5691,77,1,0,0,5691,80,1,0,0,5691, 1649P 1240 +83,1,0,0,5691,86,1,0,0,5691,89,1,0,0,5691,92,1,0; 1649P 1241 +508,12,0,5691,59,1,0,0,5691,25,1,0,0,5691,29,1,0,0,5691,32,1,0, 1651P 1242 +0,5691,35,1,0,0,5691,38,1,0,0,5691,41,1,0,0,5691,44,1,0,0,5691, 1651P 1243 +47,1,0,0,5691,50,1,0,0,5691,53,1,0,0,5691,56,1,0; 1651P 1244 +508,2,0,5691,23,0,0,0,5691,19,0,0; 1653P 1245 +508,2,0,5691,17,0,0,0,5691,13,0,0; 1655P 1246 +508,2,0,5691,11,0,0,0,5691,7,0,0; 1657P 1247 +508,2,0,5691,5,0,0,0,5691,1,0,0; 1659P 1248 +508,4,0,5693,1,0,0,0,5693,2,1,0,0,5693,3,1,0,0,5693,4,0,0; 1661P 1249 +508,4,0,5693,5,0,0,0,5693,6,1,0,0,5693,7,1,0,0,5693,2,0,0; 1663P 1250 +508,4,0,5693,8,0,0,0,5693,9,1,0,0,5693,10,1,0,0,5693,6,0,0; 1665P 1251 +508,4,0,5693,11,0,0,0,5693,12,1,0,0,5693,13,1,0,0,5693,9,0,0; 1667P 1252 +508,4,0,5693,14,0,0,0,5693,15,1,0,0,5693,16,1,0,0,5693,12,0,0; 1669P 1253 +508,4,0,5693,17,0,0,0,5693,4,1,0,0,5693,18,1,0,0,5693,15,0,0; 1671P 1254 +508,6,0,5693,18,0,0,0,5693,3,0,0,0,5693,7,0,0,0,5693,10,0,0,0, 1673P 1255 +5693,13,0,0,0,5693,16,0,0; 1673P 1256 +508,4,0,5693,19,0,0,0,5693,20,1,0,0,5693,21,0,0,0,5693,22,0,0; 1675P 1257 +508,4,0,5693,23,0,0,0,5693,22,1,0,0,5693,24,0,0,0,5693,20,0,0; 1677P 1258 +508,4,0,5693,25,0,0,0,5693,26,1,0,0,5693,27,0,0,0,5693,28,0,0; 1679P 1259 +508,4,0,5693,29,0,0,0,5693,28,1,0,0,5693,30,0,0,0,5693,26,0,0; 1681P 1260 +508,4,0,5693,31,0,0,0,5693,32,0,0,0,5693,33,1,0,0,5693,34,0,0; 1683P 1261 +508,4,0,5693,35,1,0,0,5693,36,1,0,0,5693,37,1,0,0,5693,38,1,0; 1685P 1262 +508,4,0,5693,39,1,0,0,5693,40,1,0,0,5693,41,0,0,0,5693,42,1,0; 1687P 1263 +508,4,0,5693,43,1,0,0,5693,44,0,0,0,5693,45,1,0,0,5693,46,0,0; 1689P 1264 +508,6,0,5693,47,1,0,0,5693,42,0,0,0,5693,48,0,0,0,5693,31,1,0,0, 1691P 1265 +5693,49,0,0,0,5693,50,0,0; 1691P 1266 +508,4,0,5693,51,1,0,0,5693,38,0,0,0,5693,52,1,0,0,5693,53,0,0; 1693P 1267 +508,4,0,5693,54,1,0,0,5693,55,1,0,0,5693,56,1,0,0,5693,44,1,0; 1695P 1268 +508,4,0,5693,57,1,0,0,5693,58,1,0,0,5693,59,1,0,0,5693,60,1,0; 1697P 1269 +508,4,0,5693,61,1,0,0,5693,62,0,0,0,5693,63,1,0,0,5693,64,0,0; 1699P 1270 +508,4,0,5693,65,1,0,0,5693,66,0,0,0,5693,67,1,0,0,5693,58,0,0; 1701P 1271 +508,4,0,5693,68,0,0,0,5693,69,1,0,0,5693,70,0,0,0,5693,71,0,0; 1703P 1272 +508,4,0,5693,72,0,0,0,5693,71,1,0,0,5693,73,0,0,0,5693,69,0,0; 1705P 1273 +508,4,0,5693,74,0,0,0,5693,75,1,0,0,5693,76,0,0,0,5693,77,0,0; 1707P 1274 +508,4,0,5693,78,0,0,0,5693,77,1,0,0,5693,79,0,0,0,5693,75,0,0; 1709P 1275 +508,4,0,5693,80,0,0,0,5693,81,1,0,0,5693,82,0,0,0,5693,83,0,0; 1711P 1276 +508,4,0,5693,84,0,0,0,5693,83,1,0,0,5693,85,0,0,0,5693,81,0,0; 1713P 1277 +508,4,0,5693,86,0,0,0,5693,87,1,0,0,5693,88,0,0,0,5693,89,0,0; 1715P 1278 +508,4,0,5693,90,0,0,0,5693,89,1,0,0,5693,91,0,0,0,5693,87,0,0; 1717P 1279 +508,4,0,5693,92,0,0,0,5693,93,1,0,0,5693,94,0,0,0,5693,95,0,0; 1719P 1280 +508,7,0,5693,59,0,0,0,5693,67,0,0,0,5693,96,1,0,0,5693,97,1,0,0, 1721P 1281 +5693,98,0,0,0,5693,99,0,0,0,5693,93,0,0; 1721P 1282 +508,20,0,5693,100,0,0,0,5693,101,0,0,0,5693,102,0,0,0,5693,60,0, 1723P 1283 +0,0,5693,92,1,0,0,5693,103,0,0,0,5693,104,1,0,0,5693,105,1,0,0, 1723P 1284 +5693,106,1,0,0,5693,107,0,0,0,5693,108,1,0,0,5693,55,0,0,0,5693, 1723P 1285 +109,0,0,0,5693,110,0,0,0,5693,33,0,0,0,5693,111,0,0,0,5693,40,0, 1723P 1286 +0,0,5693,112,0,0,0,5693,36,0,0,0,5693,113,0,0; 1723P 1287 +508,6,0,5693,1,1,0,0,5693,17,1,0,0,5693,14,1,0,0,5693,11,1,0,0, 1725P 1288 +5693,8,1,0,0,5693,5,1,0; 1725P 1289 +508,2,0,5693,23,1,0,0,5693,19,1,0; 1727P 1290 +508,2,0,5693,29,1,0,0,5693,25,1,0; 1729P 1291 +508,2,0,5693,72,1,0,0,5693,68,1,0; 1731P 1292 +508,2,0,5693,78,1,0,0,5693,74,1,0; 1733P 1293 +508,2,0,5693,84,1,0,0,5693,80,1,0; 1735P 1294 +508,2,0,5693,90,1,0,0,5693,86,1,0; 1737P 1295 +508,4,0,5693,108,0,0,0,5693,114,1,0,0,5693,115,0,0,0,5693,116,0, 1739P 1296 +0; 1739P 1297 +508,7,0,5693,117,0,0,0,5693,118,0,0,0,5693,119,1,0,0,5693,120,1, 1741P 1298 +0,0,5693,121,0,0,0,5693,122,0,0,0,5693,114,0,0; 1741P 1299 +508,4,0,5693,123,0,0,0,5693,120,0,0,0,5693,124,0,0,0,5693,125,1, 1743P 1300 +0; 1743P 1301 +508,4,0,5693,126,0,0,0,5693,97,0,0,0,5693,127,0,0,0,5693,128,1, 1745P 1302 +0; 1745P 1303 +508,12,0,5693,124,1,0,0,5693,119,0,0,0,5693,129,1,0,0,5693,130, 1747P 1304 +0,0,0,5693,127,1,0,0,5693,96,0,0,0,5693,66,1,0,0,5693,131,0,0,0, 1747P 1305 +5693,132,0,0,0,5693,133,1,0,0,5693,46,1,0,0,5693,134,0,0; 1747P 1306 +508,7,0,5693,116,1,0,0,5693,135,0,0,0,5693,136,0,0,0,5693,125,0, 1749P 1307 +0,0,5693,134,1,0,0,5693,45,0,0,0,5693,56,0,0; 1749P 1308 +508,7,0,5693,95,1,0,0,5693,137,0,0,0,5693,138,0,0,0,5693,128,0, 1751P 1309 +0,0,5693,130,1,0,0,5693,139,0,0,0,5693,140,0,0; 1751P 1310 +508,4,0,5693,117,1,0,0,5693,107,1,0,0,5693,141,1,0,0,5693,142,1, 1753P 1311 +0; 1753P 1312 +508,8,0,5693,118,1,0,0,5693,142,0,0,0,5693,143,1,0,0,5693,144,1, 1755P 1313 +0,0,5693,145,1,0,0,5693,146,0,0,0,5693,139,1,0,0,5693,129,0,0; 1755P 1314 +508,4,0,5693,104,0,0,0,5693,147,0,0,0,5693,145,0,0,0,5693,148,0, 1757P 1315 +0; 1757P 1316 +508,4,0,5693,105,0,0,0,5693,148,1,0,0,5693,144,0,0,0,5693,149,0, 1759P 1317 +0; 1759P 1318 +508,4,0,5693,106,0,0,0,5693,149,1,0,0,5693,143,0,0,0,5693,141,0, 1761P 1319 +0; 1761P 1320 +508,4,0,5693,150,1,0,0,5693,64,1,0,0,5693,151,1,0,0,5693,100,1, 1763P 1321 +0; 1763P 1322 +508,4,0,5693,140,1,0,0,5693,146,1,0,0,5693,147,1,0,0,5693,103,1, 1765P 1323 +0; 1765P 1324 +508,4,0,5693,32,1,0,0,5693,48,1,0,0,5693,41,1,0,0,5693,111,1,0; 1767P 1325 +508,6,0,5693,152,0,0,0,5693,153,1,0,0,5693,49,1,0,0,5693,34,1,0, 1769P 1326 +0,5693,110,1,0,0,5693,154,0,0; 1769P 1327 +508,4,0,5693,155,0,0,0,5693,156,1,0,0,5693,50,1,0,0,5693,153,0, 1771P 1328 +0; 1771P 1329 +508,8,0,5693,157,0,0,0,5693,158,1,0,0,5693,52,0,0,0,5693,37,0,0, 1773P 1330 +0,5693,112,1,0,0,5693,39,0,0,0,5693,47,0,0,0,5693,156,0,0; 1773P 1331 +508,4,0,5693,159,0,0,0,5693,160,1,0,0,5693,53,1,0,0,5693,158,0, 1775P 1332 +0; 1775P 1333 +508,8,0,5693,161,0,0,0,5693,162,1,0,0,5693,61,0,0,0,5693,150,0, 1777P 1334 +0,0,5693,113,1,0,0,5693,35,0,0,0,5693,51,0,0,0,5693,160,0,0; 1777P 1335 +508,4,0,5693,163,0,0,0,5693,164,1,0,0,5693,62,1,0,0,5693,162,0, 1779P 1336 +0; 1779P 1337 +508,9,0,5693,165,0,0,0,5693,131,1,0,0,5693,65,0,0,0,5693,57,0,0, 1781P 1338 +0,5693,102,1,0,0,5693,101,1,0,0,5693,151,0,0,0,5693,63,0,0,0, 1781P 1339 +5693,164,0,0; 1781P 1340 +508,6,0,5693,166,0,0,0,5693,154,1,0,0,5693,109,1,0,0,5693,54,0, 1783P 1341 +0,0,5693,43,0,0,0,5693,133,0,0; 1783P 1342 +508,9,0,5693,167,1,0,0,5693,168,1,0,0,5693,169,1,0,0,5693,170,1, 1785P 1343 +0,0,5693,171,1,0,0,5693,172,1,0,0,5693,173,1,0,0,5693,174,1,0,0, 1785P 1344 +5693,175,1,0; 1785P 1345 +508,9,0,5693,152,1,0,0,5693,166,1,0,0,5693,132,1,0,0,5693,165,1, 1787P 1346 +0,0,5693,163,1,0,0,5693,161,1,0,0,5693,159,1,0,0,5693,157,1,0,0, 1787P 1347 +5693,155,1,0; 1787P 1348 +508,4,0,5693,168,0,0,0,5693,176,1,0,0,5693,177,0,0,0,5693,178,0, 1789P 1349 +0; 1789P 1350 +508,4,0,5693,169,0,0,0,5693,178,1,0,0,5693,179,0,0,0,5693,180,0, 1791P 1351 +0; 1791P 1352 +508,4,0,5693,170,0,0,0,5693,180,1,0,0,5693,181,0,0,0,5693,182,0, 1793P 1353 +0; 1793P 1354 +508,4,0,5693,171,0,0,0,5693,182,1,0,0,5693,183,0,0,0,5693,184,0, 1795P 1355 +0; 1795P 1356 +508,4,0,5693,172,0,0,0,5693,184,1,0,0,5693,185,0,0,0,5693,186,0, 1797P 1357 +0; 1797P 1358 +508,4,0,5693,173,0,0,0,5693,186,1,0,0,5693,187,0,0,0,5693,188,0, 1799P 1359 +0; 1799P 1360 +508,4,0,5693,174,0,0,0,5693,188,1,0,0,5693,189,0,0,0,5693,190,0, 1801P 1361 +0; 1801P 1362 +508,12,0,5693,98,1,0,0,5693,126,1,0,0,5693,138,1,0,0,5693,191,0, 1803P 1363 +0,0,5693,121,1,0,0,5693,123,1,0,0,5693,136,1,0,0,5693,192,0,0,0, 1803P 1364 +5693,193,0,0,0,5693,175,0,0,0,5693,190,1,0,0,5693,194,0,0; 1803P 1365 +508,4,0,5693,167,0,0,0,5693,193,1,0,0,5693,195,0,0,0,5693,176,0, 1805P 1366 +0; 1805P 1367 +508,17,0,5693,99,1,0,0,5693,194,1,0,0,5693,189,1,0,0,5693,187,1, 1807P 1368 +0,0,5693,185,1,0,0,5693,183,1,0,0,5693,181,1,0,0,5693,179,1,0,0, 1807P 1369 +5693,177,1,0,0,5693,195,1,0,0,5693,192,1,0,0,5693,135,1,0,0, 1807P 1370 +5693,115,1,0,0,5693,122,1,0,0,5693,191,1,0,0,5693,137,1,0,0, 1807P 1371 +5693,94,1,0; 1807P 1372 +508,2,0,5693,24,1,0,0,5693,21,1,0; 1809P 1373 +508,2,0,5693,30,1,0,0,5693,27,1,0; 1811P 1374 +508,2,0,5693,73,1,0,0,5693,70,1,0; 1813P 1375 +508,2,0,5693,79,1,0,0,5693,76,1,0; 1815P 1376 +508,2,0,5693,85,1,0,0,5693,82,1,0; 1817P 1377 +508,2,0,5693,91,1,0,0,5693,88,1,0; 1819P 1378 +508,4,0,5695,1,1,0,0,5695,2,1,0,0,5695,3,1,0,0,5695,4,1,0; 1821P 1379 +508,8,0,5695,5,1,0,0,5695,6,0,0,0,5695,7,1,0,0,5695,8,0,0,0, 1823P 1380 +5695,9,1,0,0,5695,10,1,0,0,5695,11,1,0,0,5695,2,0,0; 1823P 1381 +508,12,0,5695,12,1,0,0,5695,13,0,0,0,5695,14,1,0,0,5695,15,0,0, 1825P 1382 +0,5695,16,0,0,0,5695,17,1,0,0,5695,18,1,0,0,5695,19,0,0,0,5695, 1825P 1383 +20,1,0,0,5695,21,0,0,0,5695,6,1,0,0,5695,22,0,0; 1825P 1384 +508,7,0,5695,23,0,0,0,5695,24,0,0,0,5695,25,1,0,0,5695,19,1,0,0, 1827P 1385 +5695,26,0,0,0,5695,27,0,0,0,5695,28,0,0; 1827P 1386 +508,7,0,5695,29,0,0,0,5695,30,0,0,0,5695,31,1,0,0,5695,22,1,0,0, 1829P 1387 +5695,5,0,0,0,5695,1,0,0,0,5695,32,0,0; 1829P 1388 +508,4,0,5695,27,1,0,0,5695,33,1,0,0,5695,34,1,0,0,5695,35,1,0; 1831P 1389 +508,12,0,5695,36,1,0,0,5695,24,1,0,0,5695,37,0,0,0,5695,38,0,0, 1833P 1390 +0,5695,39,0,0,0,5695,40,1,0,0,5695,41,0,0,0,5695,42,1,0,0,5695, 1833P 1391 +43,1,0,0,5695,30,1,0,0,5695,44,0,0,0,5695,45,1,0; 1833P 1392 +508,17,0,5695,23,1,0,0,5695,46,1,0,0,5695,47,1,0,0,5695,44,1,0, 1835P 1393 +0,5695,29,1,0,0,5695,48,1,0,0,5695,49,1,0,0,5695,41,1,0,0,5695, 1835P 1394 +50,1,0,0,5695,51,1,0,0,5695,52,1,0,0,5695,53,1,0,0,5695,54,1,0, 1835P 1395 +0,5695,55,1,0,0,5695,56,1,0,0,5695,57,1,0,0,5695,37,1,0; 1835P 1396 +508,2,0,5695,58,1,0,0,5695,59,1,0; 1837P 1397 +508,2,0,5695,60,1,0,0,5695,61,1,0; 1839P 1398 +508,2,0,5695,62,1,0,0,5695,63,1,0; 1841P 1399 +508,2,0,5695,64,1,0,0,5695,65,1,0; 1843P 1400 +508,2,0,5695,66,1,0,0,5695,67,1,0; 1845P 1401 +508,2,0,5695,68,1,0,0,5695,69,1,0; 1847P 1402 +508,4,0,5695,70,0,0,0,5695,71,1,0,0,5695,72,1,0,0,5695,73,0,0; 1849P 1403 +508,4,0,5695,74,0,0,0,5695,75,1,0,0,5695,76,1,0,0,5695,71,0,0; 1851P 1404 +508,4,0,5695,77,0,0,0,5695,78,1,0,0,5695,79,1,0,0,5695,75,0,0; 1853P 1405 +508,4,0,5695,80,0,0,0,5695,81,1,0,0,5695,82,1,0,0,5695,78,0,0; 1855P 1406 +508,4,0,5695,83,0,0,0,5695,84,1,0,0,5695,85,1,0,0,5695,81,0,0; 1857P 1407 +508,4,0,5695,86,0,0,0,5695,87,1,0,0,5695,88,1,0,0,5695,84,0,0; 1859P 1408 +508,4,0,5695,89,0,0,0,5695,90,1,0,0,5695,91,1,0,0,5695,87,0,0; 1861P 1409 +508,4,0,5695,92,0,0,0,5695,93,1,0,0,5695,94,1,0,0,5695,90,0,0; 1863P 1410 +508,4,0,5695,95,0,0,0,5695,73,1,0,0,5695,96,1,0,0,5695,93,0,0; 1865P 1411 +508,4,0,5695,97,0,0,0,5695,98,1,0,0,5695,99,1,0,0,5695,100,0,0; 1867P 1412 +508,4,0,5695,101,0,0,0,5695,102,1,0,0,5695,103,1,0,0,5695,98,0, 1869P 1413 +0; 1869P 1414 +508,4,0,5695,104,0,0,0,5695,105,1,0,0,5695,106,1,0,0,5695,102,0, 1871P 1415 +0; 1871P 1416 +508,4,0,5695,107,0,0,0,5695,108,1,0,0,5695,109,1,0,0,5695,105,0, 1873P 1417 +0; 1873P 1418 +508,4,0,5695,110,0,0,0,5695,111,1,0,0,5695,112,1,0,0,5695,108,0, 1875P 1419 +0; 1875P 1420 +508,4,0,5695,113,0,0,0,5695,114,1,0,0,5695,115,1,0,0,5695,111,0, 1877P 1421 +0; 1877P 1422 +508,4,0,5695,116,0,0,0,5695,117,1,0,0,5695,118,1,0,0,5695,114,0, 1879P 1423 +0; 1879P 1424 +508,4,0,5695,119,0,0,0,5695,120,1,0,0,5695,121,1,0,0,5695,117,0, 1881P 1425 +0; 1881P 1426 +508,4,0,5695,122,0,0,0,5695,123,1,0,0,5695,124,1,0,0,5695,120,0, 1883P 1427 +0; 1883P 1428 +508,4,0,5695,125,0,0,0,5695,126,1,0,0,5695,127,1,0,0,5695,123,0, 1885P 1429 +0; 1885P 1430 +508,4,0,5695,128,0,0,0,5695,129,1,0,0,5695,130,1,0,0,5695,126,0, 1887P 1431 +0; 1887P 1432 +508,4,0,5695,131,0,0,0,5695,132,1,0,0,5695,133,1,0,0,5695,129,0, 1889P 1433 +0; 1889P 1434 +508,4,0,5695,134,0,0,0,5695,135,1,0,0,5695,136,1,0,0,5695,132,0, 1891P 1435 +0; 1891P 1436 +508,4,0,5695,137,0,0,0,5695,138,1,0,0,5695,139,1,0,0,5695,135,0, 1893P 1437 +0; 1893P 1438 +508,4,0,5695,140,0,0,0,5695,141,1,0,0,5695,142,1,0,0,5695,138,0, 1895P 1439 +0; 1895P 1440 +508,4,0,5695,143,0,0,0,5695,144,1,0,0,5695,145,1,0,0,5695,141,0, 1897P 1441 +0; 1897P 1442 +508,4,0,5695,146,0,0,0,5695,147,1,0,0,5695,148,1,0,0,5695,144,0, 1899P 1443 +0; 1899P 1444 +508,4,0,5695,149,0,0,0,5695,100,1,0,0,5695,150,1,0,0,5695,147,0, 1901P 1445 +0; 1901P 1446 +508,18,0,5695,150,0,0,0,5695,99,0,0,0,5695,103,0,0,0,5695,106,0, 1903P 1447 +0,0,5695,109,0,0,0,5695,112,0,0,0,5695,115,0,0,0,5695,118,0,0,0, 1903P 1448 +5695,121,0,0,0,5695,124,0,0,0,5695,127,0,0,0,5695,130,0,0,0, 1903P 1449 +5695,133,0,0,0,5695,136,0,0,0,5695,139,0,0,0,5695,142,0,0,0, 1903P 1450 +5695,145,0,0,0,5695,148,0,0; 1903P 1451 +508,9,0,5695,96,0,0,0,5695,72,0,0,0,5695,76,0,0,0,5695,79,0,0,0, 1905P 1452 +5695,82,0,0,0,5695,85,0,0,0,5695,88,0,0,0,5695,91,0,0,0,5695,94, 1905P 1453 +0,0; 1905P 1454 +508,20,0,5695,151,0,0,0,5695,152,0,0,0,5695,153,0,0,0,5695,154, 1907P 1455 +0,0,0,5695,155,1,0,0,5695,4,0,0,0,5695,156,1,0,0,5695,157,1,0,0, 1907P 1456 +5695,158,1,0,0,5695,159,0,0,0,5695,160,1,0,0,5695,35,0,0,0,5695, 1907P 1457 +161,0,0,0,5695,162,0,0,0,5695,163,0,0,0,5695,164,0,0,0,5695,165, 1907P 1458 +0,0,0,5695,166,0,0,0,5695,167,0,0,0,5695,168,0,0; 1907P 1459 +508,2,0,5695,169,1,0,0,5695,170,1,0; 1909P 1460 +508,2,0,5695,171,1,0,0,5695,172,1,0; 1911P 1461 +508,2,0,5695,173,1,0,0,5695,174,1,0; 1913P 1462 +508,2,0,5695,175,1,0,0,5695,176,1,0; 1915P 1463 +508,2,0,5695,177,1,0,0,5695,178,1,0; 1917P 1464 +508,2,0,5695,179,1,0,0,5695,180,1,0; 1919P 1465 +508,18,0,5695,97,1,0,0,5695,149,1,0,0,5695,146,1,0,0,5695,143,1, 1921P 1466 +0,0,5695,140,1,0,0,5695,137,1,0,0,5695,134,1,0,0,5695,131,1,0,0, 1921P 1467 +5695,128,1,0,0,5695,125,1,0,0,5695,122,1,0,0,5695,119,1,0,0, 1921P 1468 +5695,116,1,0,0,5695,113,1,0,0,5695,110,1,0,0,5695,107,1,0,0, 1921P 1469 +5695,104,1,0,0,5695,101,1,0; 1921P 1470 +508,4,0,5695,180,0,0,0,5695,181,1,0,0,5695,69,0,0,0,5695,182,0, 1923P 1471 +0; 1923P 1472 +508,4,0,5695,179,0,0,0,5695,182,1,0,0,5695,68,0,0,0,5695,181,0, 1925P 1473 +0; 1925P 1474 +508,4,0,5695,178,0,0,0,5695,183,1,0,0,5695,67,0,0,0,5695,184,0, 1927P 1475 +0; 1927P 1476 +508,4,0,5695,177,0,0,0,5695,184,1,0,0,5695,66,0,0,0,5695,183,0, 1929P 1477 +0; 1929P 1478 +508,4,0,5695,185,0,0,0,5695,186,0,0,0,5695,163,1,0,0,5695,187,0, 1931P 1479 +0; 1931P 1480 +508,4,0,5695,188,1,0,0,5695,167,1,0,0,5695,189,1,0,0,5695,190,1, 1933P 1481 +0; 1933P 1482 +508,4,0,5695,191,1,0,0,5695,165,1,0,0,5695,192,0,0,0,5695,193,1, 1935P 1483 +0; 1935P 1484 +508,4,0,5695,26,1,0,0,5695,18,0,0,0,5695,194,1,0,0,5695,33,0,0; 1937P 1485 +508,6,0,5695,195,1,0,0,5695,193,0,0,0,5695,196,0,0,0,5695,185,1, 1939P 1486 +0,0,5695,197,0,0,0,5695,198,0,0; 1939P 1487 +508,4,0,5695,199,1,0,0,5695,190,0,0,0,5695,200,1,0,0,5695,201,0, 1941P 1488 +0; 1941P 1489 +508,4,0,5695,202,1,0,0,5695,203,1,0,0,5695,204,1,0,0,5695,154,1, 1943P 1490 +0; 1943P 1491 +508,4,0,5695,205,1,0,0,5695,206,0,0,0,5695,207,1,0,0,5695,208,0, 1945P 1492 +0; 1945P 1493 +508,4,0,5695,209,1,0,0,5695,14,0,0,0,5695,210,1,0,0,5695,203,0, 1947P 1494 +0; 1947P 1495 +508,4,0,5695,176,0,0,0,5695,211,1,0,0,5695,65,0,0,0,5695,212,0, 1949P 1496 +0; 1949P 1497 +508,4,0,5695,175,0,0,0,5695,212,1,0,0,5695,64,0,0,0,5695,211,0, 1951P 1498 +0; 1951P 1499 +508,4,0,5695,174,0,0,0,5695,213,1,0,0,5695,63,0,0,0,5695,214,0, 1953P 1500 +0; 1953P 1501 +508,4,0,5695,173,0,0,0,5695,214,1,0,0,5695,62,0,0,0,5695,213,0, 1955P 1502 +0; 1955P 1503 +508,4,0,5695,172,0,0,0,5695,215,1,0,0,5695,61,0,0,0,5695,216,0, 1957P 1504 +0; 1957P 1505 +508,4,0,5695,171,0,0,0,5695,216,1,0,0,5695,60,0,0,0,5695,215,0, 1959P 1506 +0; 1959P 1507 +508,4,0,5695,170,0,0,0,5695,217,1,0,0,5695,59,0,0,0,5695,218,0, 1961P 1508 +0; 1961P 1509 +508,4,0,5695,169,0,0,0,5695,218,1,0,0,5695,58,0,0,0,5695,217,0, 1963P 1510 +0; 1963P 1511 +508,4,0,5695,155,0,0,0,5695,219,1,0,0,5695,48,0,0,0,5695,32,1,0; 1965P 1512 +508,7,0,5695,204,0,0,0,5695,210,0,0,0,5695,13,1,0,0,5695,220,1, 1967P 1513 +0,0,5695,42,0,0,0,5695,49,0,0,0,5695,219,0,0; 1967P 1514 +508,9,0,5695,70,1,0,0,5695,95,1,0,0,5695,92,1,0,0,5695,89,1,0,0, 1969P 1515 +5695,86,1,0,0,5695,83,1,0,0,5695,80,1,0,0,5695,77,1,0,0,5695,74, 1969P 1516 +1,0; 1969P 1517 +508,4,0,5695,160,0,0,0,5695,221,1,0,0,5695,46,0,0,0,5695,28,1,0; 1971P 1518 +508,7,0,5695,222,0,0,0,5695,7,0,0,0,5695,21,1,0,0,5695,223,1,0, 1973P 1519 +0,5695,45,0,0,0,5695,47,0,0,0,5695,221,0,0; 1973P 1520 +508,4,0,5695,20,0,0,0,5695,25,0,0,0,5695,36,0,0,0,5695,223,0,0; 1975P 1521 +508,4,0,5695,12,0,0,0,5695,31,0,0,0,5695,43,0,0,0,5695,220,0,0; 1977P 1522 +508,4,0,5695,222,1,0,0,5695,159,1,0,0,5695,224,1,0,0,5695,8,1,0; 1979P 1523 +508,4,0,5695,156,0,0,0,5695,3,0,0,0,5695,11,0,0,0,5695,225,0,0; 1981P 1524 +508,4,0,5695,157,0,0,0,5695,225,1,0,0,5695,10,0,0,0,5695,226,0, 1983P 1525 +0; 1983P 1526 +508,4,0,5695,158,0,0,0,5695,226,1,0,0,5695,9,0,0,0,5695,224,0,0; 1985P 1527 +508,4,0,5695,227,1,0,0,5695,208,1,0,0,5695,228,1,0,0,5695,151,1, 1987P 1528 +0; 1987P 1529 +508,4,0,5695,186,1,0,0,5695,196,1,0,0,5695,192,1,0,0,5695,164,1, 1989P 1530 +0; 1989P 1531 +508,6,0,5695,229,0,0,0,5695,230,1,0,0,5695,197,1,0,0,5695,187,1, 1991P 1532 +0,0,5695,162,1,0,0,5695,231,0,0; 1991P 1533 +508,4,0,5695,232,0,0,0,5695,233,1,0,0,5695,198,1,0,0,5695,230,0, 1993P 1534 +0; 1993P 1535 +508,8,0,5695,234,0,0,0,5695,235,1,0,0,5695,200,0,0,0,5695,189,0, 1995P 1536 +0,0,5695,166,1,0,0,5695,191,0,0,0,5695,195,0,0,0,5695,233,0,0; 1995P 1537 +508,4,0,5695,236,0,0,0,5695,237,1,0,0,5695,201,1,0,0,5695,235,0, 1997P 1538 +0; 1997P 1539 +508,8,0,5695,238,0,0,0,5695,239,1,0,0,5695,205,0,0,0,5695,227,0, 1999P 1540 +0,0,5695,168,1,0,0,5695,188,0,0,0,5695,199,0,0,0,5695,237,0,0; 1999P 1541 +508,4,0,5695,240,0,0,0,5695,241,1,0,0,5695,206,1,0,0,5695,239,0, 2001P 1542 +0; 2001P 1543 +508,9,0,5695,242,0,0,0,5695,15,1,0,0,5695,209,0,0,0,5695,202,0, 2003P 1544 +0,0,5695,153,1,0,0,5695,152,1,0,0,5695,228,0,0,0,5695,207,0,0,0, 2003P 1545 +5695,241,0,0; 2003P 1546 +508,6,0,5695,243,0,0,0,5695,231,1,0,0,5695,161,1,0,0,5695,34,0, 2005P 1547 +0,0,5695,194,0,0,0,5695,17,0,0; 2005P 1548 +508,9,0,5695,244,1,0,0,5695,245,1,0,0,5695,246,1,0,0,5695,247,1, 2007P 1549 +0,0,5695,248,1,0,0,5695,249,1,0,0,5695,250,1,0,0,5695,251,1,0,0, 2007P 1550 +5695,39,1,0; 2007P 1551 +508,9,0,5695,229,1,0,0,5695,243,1,0,0,5695,16,1,0,0,5695,242,1, 2009P 1552 +0,0,5695,240,1,0,0,5695,238,1,0,0,5695,236,1,0,0,5695,234,1,0,0, 2009P 1553 +5695,232,1,0; 2009P 1554 +508,4,0,5695,245,0,0,0,5695,252,1,0,0,5695,56,0,0,0,5695,253,0, 2011P 1555 +0; 2011P 1556 +508,4,0,5695,246,0,0,0,5695,253,1,0,0,5695,55,0,0,0,5695,254,0, 2013P 1557 +0; 2013P 1558 +508,4,0,5695,247,0,0,0,5695,254,1,0,0,5695,54,0,0,0,5695,255,0, 2015P 1559 +0; 2015P 1560 +508,4,0,5695,248,0,0,0,5695,255,1,0,0,5695,53,0,0,0,5695,256,0, 2017P 1561 +0; 2017P 1562 +508,4,0,5695,249,0,0,0,5695,256,1,0,0,5695,52,0,0,0,5695,257,0, 2019P 1563 +0; 2019P 1564 +508,4,0,5695,250,0,0,0,5695,257,1,0,0,5695,51,0,0,0,5695,258,0, 2021P 1565 +0; 2021P 1566 +508,4,0,5695,251,0,0,0,5695,258,1,0,0,5695,50,0,0,0,5695,40,0,0; 2023P 1567 +508,4,0,5695,244,0,0,0,5695,38,1,0,0,5695,57,0,0,0,5695,252,0,0; 2025P 1568 +126,6,2,0,0,0,0,-6.28326580027829,-6.28326580027829, 2027P 1569 +-6.28326580027829,-5.23526324929942,-5.23526324929942, 2027P 1570 +-4.18726069832056,-4.18726069832056,-3.1392581473417, 2027P 1571 +-3.1392581473417,-3.1392581473417,1.,0.865824083693573,1., 2027P 1572 +0.865824083693555,1.,0.865824083693611,1.,139.68226259674, 2027P 1573 +-80.5980231141957,8.73624999999999,139.683239604231, 2027P 1574 +-79.7889073538704,8.73624999999999,138.982687181724, 2027P 1575 +-79.3840671737141,8.73624999999999,138.282134759216, 2027P 1576 +-78.9792269935579,8.73624999999999,137.581582336708, 2027P 1577 +-79.3840671737141,8.73624999999999,136.8810299142, 2027P 1578 +-79.7889073538704,8.73624999999999,136.882006921691, 2027P 1579 +-80.5980231141957,8.73624999999999,-6.28326580027829, 2027P 1580 +-3.1392581473417,0.,0.,0.; 2027P 1581 +126,1,1,0,0,1,0,0.,0.,0.1618125,0.1618125,1.,1., 2029P 1582 +136.882006921691,-80.5980231141957,8.73624999999999, 2029P 1583 +136.882006921691,-80.5980231141957,7.11812499999999,0., 2029P 1584 +0.1618125,0.,0.,0.; 2029P 1585 +126,6,2,0,0,0,0,-6.28326580027829,-6.28326580027829, 2031P 1586 +-6.28326580027829,-5.23526324929942,-5.23526324929942, 2031P 1587 +-4.18726069832056,-4.18726069832056,-3.1392581473417, 2031P 1588 +-3.1392581473417,-3.1392581473417,1.,0.865824083693573,1., 2031P 1589 +0.865824083693555,1.,0.865824083693611,1.,139.68226259674, 2031P 1590 +-80.5980231141957,7.11812499999999,139.683239604231, 2031P 1591 +-79.7889073538704,7.11812499999999,138.982687181724, 2031P 1592 +-79.3840671737141,7.11812499999999,138.282134759216, 2031P 1593 +-78.9792269935579,7.11812499999999,137.581582336708, 2031P 1594 +-79.3840671737141,7.11812499999999,136.8810299142, 2031P 1595 +-79.7889073538704,7.11812499999999,136.882006921691, 2031P 1596 +-80.5980231141957,7.11812499999999,-6.28326580027829, 2031P 1597 +-3.1392581473417,0.,0.,0.; 2031P 1598 +126,1,1,0,0,1,0,0.,0.,0.1618125,0.1618125,1.,1.,139.68226259674, 2033P 1599 +-80.5980231141957,8.73624999999999,139.68226259674, 2033P 1600 +-80.5980231141957,7.11812499999999,0.,0.1618125,0.,0.,0.; 2033P 1601 +126,6,2,0,0,0,0,-6.28326580027831,-6.28326580027831, 2035P 1602 +-6.28326580027831,-5.23526324929943,-5.23526324929943, 2035P 1603 +-4.18726069832055,-4.18726069832055,-3.13925814734167, 2035P 1604 +-3.13925814734167,-3.13925814734167,1.,0.865824083693529,1., 2035P 1605 +0.865824083693519,1.,0.865824083693529,1.,136.882006921691, 2035P 1606 +-80.5980231141957,8.73624999999999,136.8810299142, 2035P 1607 +-81.4071388745211,8.73624999999999,137.581582336708, 2035P 1608 +-81.8119790546774,8.73624999999999,138.282134759216, 2035P 1609 +-82.2168192348336,8.73624999999999,138.982687181724, 2035P 1610 +-81.8119790546774,8.73624999999999,139.683239604231, 2035P 1611 +-81.4071388745211,8.73624999999999,139.68226259674, 2035P 1612 +-80.5980231141957,8.73624999999999,-6.28326580027831, 2035P 1613 +-3.13925814734167,0.,0.,0.; 2035P 1614 +126,6,2,0,0,0,0,-6.28326580027831,-6.28326580027831, 2037P 1615 +-6.28326580027831,-5.23526324929943,-5.23526324929943, 2037P 1616 +-4.18726069832055,-4.18726069832055,-3.13925814734167, 2037P 1617 +-3.13925814734167,-3.13925814734167,1.,0.865824083693529,1., 2037P 1618 +0.865824083693519,1.,0.865824083693529,1.,136.882006921691, 2037P 1619 +-80.5980231141957,7.11812499999999,136.8810299142, 2037P 1620 +-81.4071388745211,7.11812499999999,137.581582336708, 2037P 1621 +-81.8119790546774,7.11812499999999,138.282134759216, 2037P 1622 +-82.2168192348336,7.11812499999999,138.982687181724, 2037P 1623 +-81.8119790546774,7.11812499999999,139.683239604231, 2037P 1624 +-81.4071388745211,7.11812499999999,139.68226259674, 2037P 1625 +-80.5980231141957,7.11812499999999,-6.28326580027831, 2037P 1626 +-3.13925814734167,0.,0.,0.; 2037P 1627 +126,6,2,0,0,0,0,-6.28326580027829,-6.28326580027829, 2039P 1628 +-6.28326580027829,-5.23526324929942,-5.23526324929942, 2039P 1629 +-4.18726069832056,-4.18726069832056,-3.1392581473417, 2039P 1630 +-3.1392581473417,-3.1392581473417,1.,0.86582408369359,1., 2039P 1631 +0.865824083693519,1.,0.865824083693555,1.,139.68226259674, 2039P 1632 +-118.69865621105,8.73624999999999,139.683239604231, 2039P 1633 +-117.889540450724,8.73624999999999,138.982687181724, 2039P 1634 +-117.484700270568,8.73624999999999,138.282134759216, 2039P 1635 +-117.079860090412,8.73624999999999,137.581582336708, 2039P 1636 +-117.484700270568,8.73624999999999,136.8810299142, 2039P 1637 +-117.889540450724,8.73624999999999,136.882006921691, 2039P 1638 +-118.69865621105,8.73624999999999,-6.28326580027829, 2039P 1639 +-3.1392581473417,0.,0.,0.; 2039P 1640 +126,1,1,0,0,1,0,0.,0.,0.1618125,0.1618125,1.,1., 2041P 1641 +136.882006921691,-118.69865621105,8.73624999999999, 2041P 1642 +136.882006921691,-118.69865621105,7.11812499999999,0.,0.1618125, 2041P 1643 +0.,0.,0.; 2041P 1644 +126,6,2,0,0,0,0,-6.28326580027829,-6.28326580027829, 2043P 1645 +-6.28326580027829,-5.23526324929942,-5.23526324929942, 2043P 1646 +-4.18726069832056,-4.18726069832056,-3.1392581473417, 2043P 1647 +-3.1392581473417,-3.1392581473417,1.,0.86582408369359,1., 2043P 1648 +0.865824083693519,1.,0.865824083693555,1.,139.68226259674, 2043P 1649 +-118.69865621105,7.11812499999999,139.683239604231, 2043P 1650 +-117.889540450724,7.11812499999999,138.982687181724, 2043P 1651 +-117.484700270568,7.11812499999999,138.282134759216, 2043P 1652 +-117.079860090412,7.11812499999999,137.581582336708, 2043P 1653 +-117.484700270568,7.11812499999999,136.8810299142, 2043P 1654 +-117.889540450724,7.11812499999999,136.882006921691, 2043P 1655 +-118.69865621105,7.11812499999999,-6.28326580027829, 2043P 1656 +-3.1392581473417,0.,0.,0.; 2043P 1657 +126,1,1,0,0,1,0,0.,0.,0.1618125,0.1618125,1.,1.,139.68226259674, 2045P 1658 +-118.69865621105,8.73624999999999,139.68226259674, 2045P 1659 +-118.69865621105,7.11812499999999,0.,0.1618125,0.,0.,0.; 2045P 1660 +126,6,2,0,0,0,0,-6.28326580027831,-6.28326580027831, 2047P 1661 +-6.28326580027831,-5.23526324929943,-5.23526324929943, 2047P 1662 +-4.18726069832055,-4.18726069832055,-3.13925814734167, 2047P 1663 +-3.13925814734167,-3.13925814734167,1.,0.865824083693529,1., 2047P 1664 +0.865824083693519,1.,0.865824083693529,1.,136.882006921691, 2047P 1665 +-118.69865621105,8.73624999999999,136.8810299142, 2047P 1666 +-119.507771971375,8.73624999999999,137.581582336708, 2047P 1667 +-119.912612151531,8.73624999999999,138.282134759216, 2047P 1668 +-120.317452331688,8.73624999999999,138.982687181724, 2047P 1669 +-119.912612151531,8.73624999999999,139.683239604231, 2047P 1670 +-119.507771971375,8.73624999999999,139.68226259674, 2047P 1671 +-118.69865621105,8.73624999999999,-6.28326580027831, 2047P 1672 +-3.13925814734167,0.,0.,0.; 2047P 1673 +126,6,2,0,0,0,0,-6.28326580027831,-6.28326580027831, 2049P 1674 +-6.28326580027831,-5.23526324929943,-5.23526324929943, 2049P 1675 +-4.18726069832055,-4.18726069832055,-3.13925814734167, 2049P 1676 +-3.13925814734167,-3.13925814734167,1.,0.865824083693529,1., 2049P 1677 +0.865824083693519,1.,0.865824083693529,1.,136.882006921691, 2049P 1678 +-118.69865621105,7.11812499999999,136.8810299142, 2049P 1679 +-119.507771971375,7.11812499999999,137.581582336708, 2049P 1680 +-119.912612151531,7.11812499999999,138.282134759216, 2049P 1681 +-120.317452331688,7.11812499999999,138.982687181724, 2049P 1682 +-119.912612151531,7.11812499999999,139.683239604231, 2049P 1683 +-119.507771971375,7.11812499999999,139.68226259674, 2049P 1684 +-118.69865621105,7.11812499999999,-6.28326580027831, 2049P 1685 +-3.13925814734167,0.,0.,0.; 2049P 1686 +126,6,2,0,0,0,0,-6.28328621059597,-6.28328621059597, 2051P 1687 +-6.28328621059597,-5.2350795389254,-5.2350795389254, 2051P 1688 +-4.18687286725483,-4.18687286725483,-3.13866619558426, 2051P 1689 +-3.13866619558426,-3.13866619558426,1.,0.865773013439842,1., 2051P 1690 +0.865773013439768,1.,0.865773013439842,1.,63.4808744198821, 2051P 1691 +-118.698656211056,8.73625,63.4820994522559,-117.889349843306, 2051P 1692 +8.73625,62.7814230367476,-117.484342610857,8.73625, 2051P 1693 +62.0807466212394,-117.079335378408,8.73625,61.3800702057312, 2051P 1694 +-117.484342610857,8.73625,60.679393790223,-117.889349843306, 2051P 1695 +8.73625,60.6806188225967,-118.698656211056,8.73625, 2051P 1696 +-6.28328621059597,-3.13866619558426,0.,0.,0.; 2051P 1697 +126,1,1,0,0,1,0,0.,0.,0.1618125,0.1618125,1.,1., 2053P 1698 +60.6806188225967,-118.698656211056,8.73625,60.6806188225967, 2053P 1699 +-118.698656211056,7.118125,0.,0.1618125,0.,0.,0.; 2053P 1700 +126,6,2,0,0,0,0,-6.28328621059597,-6.28328621059597, 2055P 1701 +-6.28328621059597,-5.2350795389254,-5.2350795389254, 2055P 1702 +-4.18687286725483,-4.18687286725483,-3.13866619558426, 2055P 1703 +-3.13866619558426,-3.13866619558426,1.,0.865773013439842,1., 2055P 1704 +0.865773013439768,1.,0.865773013439842,1.,63.4808744198821, 2055P 1705 +-118.698656211056,7.118125,63.4820994522559,-117.889349843306, 2055P 1706 +7.118125,62.7814230367476,-117.484342610857,7.118125, 2055P 1707 +62.0807466212394,-117.079335378408,7.118125,61.3800702057312, 2055P 1708 +-117.484342610857,7.118125,60.679393790223,-117.889349843306, 2055P 1709 +7.118125,60.6806188225967,-118.698656211056,7.118125, 2055P 1710 +-6.28328621059597,-3.13866619558426,0.,0.,0.; 2055P 1711 +126,1,1,0,0,1,0,0.,0.,0.1618125,0.1618125,1.,1., 2057P 1712 +63.4808744198821,-118.698656211056,8.73625,63.4808744198821, 2057P 1713 +-118.698656211056,7.118125,0.,0.1618125,0.,0.,0.; 2057P 1714 +126,6,2,0,0,0,0,-6.28328621058691,-6.28328621058691, 2059P 1715 +-6.28328621058691,-5.23507953892236,-5.23507953892236, 2059P 1716 +-4.18687286725781,-4.18687286725781,-3.13866619559326, 2059P 1717 +-3.13866619559326,-3.13866619559326,1.,0.865773013441318,1., 2059P 1718 +0.865773013441294,1.,0.865773013441318,1.,60.6806188225967, 2059P 1719 +-118.698656211056,8.73625,60.6793937902303,-119.507962578801, 2059P 1720 +8.73625,61.3800702057349,-119.912969811245,8.73625, 2059P 1721 +62.0807466212394,-120.317977043689,8.73625,62.781423036744, 2059P 1722 +-119.912969811245,8.73625,63.4820994522485,-119.507962578801, 2059P 1723 +8.73625,63.4808744198821,-118.698656211056,8.73625, 2059P 1724 +-6.28328621058691,-3.13866619559326,0.,0.,0.; 2059P 1725 +126,6,2,0,0,0,0,-6.28328621058691,-6.28328621058691, 2061P 1726 +-6.28328621058691,-5.23507953892236,-5.23507953892236, 2061P 1727 +-4.18687286725781,-4.18687286725781,-3.13866619559326, 2061P 1728 +-3.13866619559326,-3.13866619559326,1.,0.865773013441318,1., 2061P 1729 +0.865773013441294,1.,0.865773013441318,1.,60.6806188225967, 2061P 1730 +-118.698656211056,7.118125,60.6793937902303,-119.507962578801, 2061P 1731 +7.118125,61.3800702057349,-119.912969811245,7.118125, 2061P 1732 +62.0807466212394,-120.317977043689,7.118125,62.781423036744, 2061P 1733 +-119.912969811245,7.118125,63.4820994522485,-119.507962578801, 2061P 1734 +7.118125,63.4808744198821,-118.698656211056,7.118125, 2061P 1735 +-6.28328621058691,-3.13866619559326,0.,0.,0.; 2061P 1736 +126,6,2,0,0,0,0,-6.28326580028397,-6.28326580028397, 2063P 1737 +-6.28326580028397,-5.23526324930132,-5.23526324930132, 2063P 1738 +-4.18726069831867,-4.18726069831867,-3.13925814733601, 2063P 1739 +-3.13925814733601,-3.13925814733601,1.,0.865824083692607,1., 2063P 1740 +0.865824083692642,1.,0.865824083692673,1.,60.9078068409501, 2063P 1741 +-62.1212017504367,8.73625,60.9087838484459,-61.3120859901078, 2063P 1742 +8.73625,60.2082314259358,-60.9072458099485,8.73625, 2063P 1743 +59.5076790034257,-60.5024056297891,8.73625,58.8071265809156, 2063P 1744 +-60.9072458099485,8.73625,58.1065741584055,-61.3120859901078, 2063P 1745 +8.73625,58.1075511659012,-62.1212017504367,8.73625, 2063P 1746 +-6.28326580028397,-3.13925814733601,0.,0.,0.; 2063P 1747 +126,1,1,0,0,1,0,0.,0.,0.1618125,0.1618125,1.,1., 2065P 1748 +58.1075511659012,-62.1212017504367,8.73625,58.1075511659012, 2065P 1749 +-62.1212017504367,7.118125,0.,0.1618125,0.,0.,0.; 2065P 1750 +126,6,2,0,0,0,0,-6.28326580028397,-6.28326580028397, 2067P 1751 +-6.28326580028397,-5.23526324930132,-5.23526324930132, 2067P 1752 +-4.18726069831867,-4.18726069831867,-3.13925814733601, 2067P 1753 +-3.13925814733601,-3.13925814733601,1.,0.865824083692607,1., 2067P 1754 +0.865824083692642,1.,0.865824083692673,1.,60.9078068409501, 2067P 1755 +-62.1212017504367,7.118125,60.9087838484459,-61.3120859901078, 2067P 1756 +7.118125,60.2082314259358,-60.9072458099485,7.118125, 2067P 1757 +59.5076790034257,-60.5024056297891,7.118125,58.8071265809156, 2067P 1758 +-60.9072458099485,7.118125,58.1065741584055,-61.3120859901078, 2067P 1759 +7.118125,58.1075511659012,-62.1212017504367,7.118125, 2067P 1760 +-6.28326580028397,-3.13925814733601,0.,0.,0.; 2067P 1761 +126,1,1,0,0,1,0,0.,0.,0.1618125,0.1618125,1.,1., 2069P 1762 +60.9078068409501,-62.1212017504367,8.73625,60.9078068409501, 2069P 1763 +-62.1212017504367,7.118125,0.,0.1618125,0.,0.,0.; 2069P 1764 +126,6,2,0,0,0,0,-6.2832658002726,-6.2832658002726, 2071P 1765 +-6.2832658002726,-5.23526324929753,-5.23526324929753, 2071P 1766 +-4.18726069832246,-4.18726069832246,-3.13925814734738, 2071P 1767 +-3.13925814734738,-3.13925814734738,1.,0.86582408369451,1., 2071P 1768 +0.865824083694544,1.,0.86582408369451,1.,58.1075511659012, 2071P 1769 +-62.1212017504367,8.73625,58.1065741584147,-62.9303175107585, 2071P 1770 +8.73625,58.8071265809202,-63.3351576909116,8.73625, 2071P 1771 +59.5076790034257,-63.7399978710648,8.73625,60.2082314259312, 2071P 1772 +-63.3351576909116,8.73625,60.9087838484367,-62.9303175107585, 2071P 1773 +8.73625,60.9078068409501,-62.1212017504367,8.73625, 2071P 1774 +-6.2832658002726,-3.13925814734738,0.,0.,0.; 2071P 1775 +126,6,2,0,0,0,0,-6.2832658002726,-6.2832658002726, 2073P 1776 +-6.2832658002726,-5.23526324929753,-5.23526324929753, 2073P 1777 +-4.18726069832246,-4.18726069832246,-3.13925814734738, 2073P 1778 +-3.13925814734738,-3.13925814734738,1.,0.86582408369451,1., 2073P 1779 +0.865824083694544,1.,0.86582408369451,1.,58.1075511659012, 2073P 1780 +-62.1212017504367,7.118125,58.1065741584147,-62.9303175107585, 2073P 1781 +7.118125,58.8071265809202,-63.3351576909116,7.118125, 2073P 1782 +59.5076790034257,-63.7399978710648,7.118125,60.2082314259312, 2073P 1783 +-63.3351576909116,7.118125,60.9087838484367,-62.9303175107585, 2073P 1784 +7.118125,60.9078068409501,-62.1212017504367,7.118125, 2073P 1785 +-6.2832658002726,-3.13925814734738,0.,0.,0.; 2073P 1786 +126,1,1,0,0,1,0,0.,0.,1.29791011810403,1.29791011810403,1.,1., 2075P 1787 +140.806868895161,-121.223895544679,8.73624999999999, 2075P 1788 +154.808074294198,-121.223878124069,8.73624999999999,0., 2075P 1789 +1.29791011810403,0.,0.,0.; 2075P 1790 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806868895161, 2077P 1791 +-121.223895544679,8.73624999999999,140.806868895161, 2077P 1792 +-121.223895544679,7.11812499999999,0.,0.15,0.,0.,0.; 2077P 1793 +126,1,1,0,0,1,0,-1.29791011810403,-1.29791011810403,0.,0.,1.,1., 2079P 1794 +154.808074294198,-121.223878124069,7.11812499999999, 2079P 1795 +140.806868895161,-121.223895544679,7.11812499999999, 2079P 1796 +-1.29791011810403,0.,0.,0.,0.; 2079P 1797 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2081P 1798 +-121.223878124069,8.73624999999999,154.808074294198, 2081P 1799 +-121.223878124069,7.11812499999999,0.,0.15,0.,0.,0.; 2081P 1800 +126,1,1,0,0,1,0,0.,0.,0.0554439671834324,0.0554439671834324,1., 2083P 1801 +1.,154.808074294198,-121.223878124069,8.73624999999999, 2083P 1802 +154.808074294198,-121.821979920061,8.73624999999999,0., 2083P 1803 +0.0554439671834324,0.,0.,0.; 2083P 1804 +126,1,1,0,0,1,0,-0.0554439671834324,-0.0554439671834324,0.,0., 2085P 1805 +1.,1.,154.808074294198,-121.821979920061,7.11812499999999, 2085P 1806 +154.808074294198,-121.223878124069,7.11812499999999, 2085P 1807 +-0.0554439671834324,0.,0.,0.,0.; 2085P 1808 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2087P 1809 +-121.821979920061,8.73624999999999,154.808074294198, 2087P 1810 +-121.821979920061,7.11812499999999,0.,0.15,0.,0.,0.; 2087P 1811 +126,1,1,0,0,1,0,0.,0.,0.0740926997042853,0.0740926997042853,1., 2089P 1812 +1.,154.808074294198,-121.821979920061,8.73624999999999, 2089P 1813 +155.607349292068,-121.82199734067,8.73624999999999,0., 2089P 1814 +0.0740926997042853,0.,0.,0.; 2089P 1815 +126,1,1,0,0,1,0,-0.0740926997042853,-0.0740926997042853,0.,0., 2091P 1816 +1.,1.,155.607349292068,-121.82199734067,7.11812499999999, 2091P 1817 +154.808074294198,-121.821979920061,7.11812499999999, 2091P 1818 +-0.0740926997042853,0.,0.,0.,0.; 2091P 1819 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,155.607349292068, 2093P 1820 +-121.82199734067,8.73624999999999,155.607349292068, 2093P 1821 +-121.82199734067,7.11812499999999,0.,0.15,0.,0.,0.; 2093P 1822 +126,1,1,0,0,1,0,0.,0.,1.1867621866862,1.1867621866862,1.,1., 2095P 1823 +155.607349292068,-121.82199734067,8.73624999999999, 2095P 1824 +155.607349292068,-134.624194429548,8.73624999999999,0., 2095P 1825 +1.1867621866862,0.,0.,0.; 2095P 1826 +126,1,1,0,0,1,0,-1.1867621866862,-1.1867621866862,0.,0.,1.,1., 2097P 1827 +155.607349292068,-134.624194429548,7.11812499999999, 2097P 1828 +155.607349292068,-121.82199734067,7.11812499999999, 2097P 1829 +-1.1867621866862,0.,0.,0.,0.; 2097P 1830 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,155.607349292068, 2099P 1831 +-134.624194429548,8.73624999999999,155.607349292068, 2099P 1832 +-134.624194429548,7.11812499999999,0.,0.15,0.,0.,0.; 2099P 1833 +126,1,1,0,0,1,0,0.,0.,0.0740926997042853,0.0740926997042853,1., 2101P 1834 +1.,155.607349292068,-134.624194429548,8.73624999999999, 2101P 1835 +154.808074294198,-134.624177008938,8.73624999999999,0., 2101P 1836 +0.0740926997042853,0.,0.,0.; 2101P 1837 +126,1,1,0,0,1,0,-0.0740926997042853,-0.0740926997042853,0.,0., 2103P 1838 +1.,1.,154.808074294198,-134.624177008938,7.11812499999999, 2103P 1839 +155.607349292068,-134.624194429548,7.11812499999999, 2103P 1840 +-0.0740926997042853,0.,0.,0.,0.; 2103P 1841 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2105P 1842 +-134.624177008938,8.73624999999999,154.808074294198, 2105P 1843 +-134.624177008938,7.11812499999999,0.,0.15,0.,0.,0.; 2105P 1844 +126,1,1,0,0,1,0,0.,0.,0.055571543375649,0.055571543375649,1.,1., 2107P 1845 +154.808074294198,-134.624177008938,8.73624999999999, 2107P 1846 +154.808074294198,-135.223655033103,8.73624999999999,0., 2107P 1847 +0.055571543375649,0.,0.,0.; 2107P 1848 +126,1,1,0,0,1,0,-0.055571543375649,-0.055571543375649,0.,0.,1., 2109P 1849 +1.,154.808074294198,-135.223655033103,7.11812499999999, 2109P 1850 +154.808074294198,-134.624177008938,7.11812499999999, 2109P 1851 +-0.055571543375649,0.,0.,0.,0.; 2109P 1852 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2111P 1853 +-135.223655033103,8.73624999999999,154.808074294198, 2111P 1854 +-135.223655033103,7.11812499999999,0.,0.15,0.,0.,0.; 2111P 1855 +126,1,1,0,0,1,0,0.,0.,1.2979097143809,1.2979097143809,1.,1., 2113P 1856 +154.808074294198,-135.223655033103,8.73624999999999, 2113P 1857 +140.806873250314,-135.223655033103,8.73624999999999,0., 2113P 1858 +1.2979097143809,0.,0.,0.; 2113P 1859 +126,1,1,0,0,1,0,-1.2979097143809,-1.2979097143809,0.,0.,1.,1., 2115P 1860 +140.806873250314,-135.223655033103,7.11812499999999, 2115P 1861 +154.808074294198,-135.223655033103,7.11812499999999, 2115P 1862 +-1.2979097143809,0.,0.,0.,0.; 2115P 1863 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806873250314, 2117P 1864 +-135.223655033103,8.73624999999999,140.806873250314, 2117P 1865 +-135.223655033103,7.11812499999999,0.,0.15,0.,0.,0.; 2117P 1866 +126,1,1,0,0,1,0,0.,0.,0.055571543377119,0.055571543377119,1.,1., 2119P 1867 +140.806873250314,-135.223655033103,8.73624999999999, 2119P 1868 +140.806868895161,-134.624177008938,8.73624999999999,0., 2119P 1869 +0.055571543377119,0.,0.,0.; 2119P 1870 +126,1,1,0,0,1,0,-0.055571543377119,-0.055571543377119,0.,0.,1., 2121P 1871 +1.,140.806868895161,-134.624177008938,7.11812499999999, 2121P 1872 +140.806873250314,-135.223655033103,7.11812499999999, 2121P 1873 +-0.055571543377119,0.,0.,0.,0.; 2121P 1874 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806868895161, 2123P 1875 +-134.624177008938,8.73624999999999,140.806868895161, 2123P 1876 +-134.624177008938,7.11812499999999,0.,0.15,0.,0.,0.; 2123P 1877 +126,1,1,0,0,1,0,0.,0.,0.0740874512990315,0.0740874512990315,1., 2125P 1878 +1.,140.806868895161,-134.624177008938,8.73624999999999, 2125P 1879 +140.007650514273,-134.624177008938,8.73624999999999,0., 2125P 1880 +0.0740874512990315,0.,0.,0.; 2125P 1881 +126,1,1,0,0,1,0,-0.0740874512990315,-0.0740874512990315,0.,0., 2127P 1882 +1.,1.,140.007650514273,-134.624177008938,7.11812499999999, 2127P 1883 +140.806868895161,-134.624177008938,7.11812499999999, 2127P 1884 +-0.0740874512990315,0.,0.,0.,0.; 2127P 1885 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.007650514273, 2129P 1886 +-134.624177008938,8.73624999999999,140.007650514273, 2129P 1887 +-134.624177008938,7.11812499999999,0.,0.15,0.,0.,0.; 2129P 1888 +126,1,1,0,0,1,0,0.,0.,1.18676218668627,1.18676218668627,1.,1., 2131P 1889 +140.007650514273,-134.624177008938,8.73624999999999, 2131P 1890 +140.007654869426,-121.821979920061,8.73624999999999,0., 2131P 1891 +1.18676218668627,0.,0.,0.; 2131P 1892 +126,1,1,0,0,1,0,-1.18676218668627,-1.18676218668627,0.,0.,1.,1., 2133P 1893 +140.007654869426,-121.821979920061,7.11812499999999, 2133P 1894 +140.007650514273,-134.624177008938,7.11812499999999, 2133P 1895 +-1.18676218668627,0.,0.,0.,0.; 2133P 1896 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.007654869426, 2135P 1897 +-121.821979920061,8.73624999999999,140.007654869426, 2135P 1898 +-121.821979920061,7.11812499999999,0.,0.15,0.,0.,0.; 2135P 1899 +126,1,1,0,0,1,0,0.,0.,0.0740874513166314,0.0740874513166314,1., 2137P 1900 +1.,140.007654869426,-121.821979920061,8.73624999999999, 2137P 1901 +140.806873250314,-121.82199734067,8.73624999999999,0., 2137P 1902 +0.0740874513166314,0.,0.,0.; 2137P 1903 +126,1,1,0,0,1,0,-0.0740874513166314,-0.0740874513166314,0.,0., 2139P 1904 +1.,1.,140.806873250314,-121.82199734067,7.11812499999999, 2139P 1905 +140.007654869426,-121.821979920061,7.11812499999999, 2139P 1906 +-0.0740874513166314,0.,0.,0.,0.; 2139P 1907 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806873250314, 2141P 1908 +-121.82199734067,8.73624999999999,140.806873250314, 2141P 1909 +-121.82199734067,7.11812499999999,0.,0.15,0.,0.,0.; 2141P 1910 +126,1,1,0,0,1,0,0.,0.,0.0554439671848987,0.0554439671848987,1., 2143P 1911 +1.,140.806873250314,-121.82199734067,8.73624999999999, 2143P 1912 +140.806868895161,-121.223895544679,8.73624999999999,0., 2143P 1913 +0.0554439671848987,0.,0.,0.; 2143P 1914 +126,1,1,0,0,1,0,-0.0554439671848987,-0.0554439671848987,0.,0., 2145P 1915 +1.,1.,140.806868895161,-121.223895544679,7.11812499999999, 2145P 1916 +140.806873250314,-121.82199734067,7.11812499999999, 2145P 1917 +-0.0554439671848987,0.,0.,0.,0.; 2145P 1918 +126,1,1,0,0,1,0,0.,0.,1.29788872083129,1.29788872083129,1.,1., 2147P 1919 +121.756696066765,-121.223895544679,8.73624999999999, 2147P 1920 +135.757670642722,-121.223878124069,8.73624999999999,0., 2147P 1921 +1.29788872083129,0.,0.,0.; 2147P 1922 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 2149P 1923 +-121.223895544679,8.73624999999999,121.756696066765, 2149P 1924 +-121.223895544679,7.11812499999999,0.,0.15,0.,0.,0.; 2149P 1925 +126,1,1,0,0,1,0,-1.29788872083129,-1.29788872083129,0.,0.,1.,1., 2151P 1926 +135.757670642722,-121.223878124069,7.11812499999999, 2151P 1927 +121.756696066765,-121.223895544679,7.118125,-1.29788872083129, 2151P 1928 +0.,0.,0.,0.; 2151P 1929 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 2153P 1930 +-121.223878124069,8.73624999999999,135.757670642722, 2153P 1931 +-121.223878124069,7.11812499999999,0.,0.15,0.,0.,0.; 2153P 1932 +126,1,1,0,0,1,0,0.,0.,0.0554439671834324,0.0554439671834324,1., 2155P 1933 +1.,135.757670642722,-121.223878124069,8.73624999999999, 2155P 1934 +135.757670642722,-121.821979920061,8.73624999999999,0., 2155P 1935 +0.0554439671834324,0.,0.,0.; 2155P 1936 +126,1,1,0,0,1,0,-0.0554439671834324,-0.0554439671834324,0.,0., 2157P 1937 +1.,1.,135.757670642722,-121.821979920061,7.11812499999999, 2157P 1938 +135.757670642722,-121.223878124069,7.11812499999999, 2157P 1939 +-0.0554439671834324,0.,0.,0.,0.; 2157P 1940 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 2159P 1941 +-121.821979920061,8.73624999999999,135.757670642722, 2159P 1942 +-121.821979920061,7.11812499999999,0.,0.15,0.,0.,0.; 2159P 1943 +126,1,1,0,0,1,0,0.,0.,0.0740967369255563,0.0740967369255563,1., 2161P 1944 +1.,135.757670642722,-121.821979920061,8.73624999999999, 2161P 1945 +136.556989192117,-121.82199734067,8.73624999999999,0., 2161P 1946 +0.0740967369255563,0.,0.,0.; 2161P 1947 +126,1,1,0,0,1,0,-0.0740967369255563,-0.0740967369255563,0.,0., 2163P 1948 +1.,1.,136.556989192117,-121.82199734067,7.11812499999999, 2163P 1949 +135.757670642722,-121.821979920061,7.11812499999999, 2163P 1950 +-0.0740967369255563,0.,0.,0.,0.; 2163P 1951 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,136.556989192117, 2165P 1952 +-121.82199734067,8.73624999999999,136.556989192117, 2165P 1953 +-121.82199734067,7.11812499999999,0.,0.15,0.,0.,0.; 2165P 1954 +126,1,1,0,0,1,0,0.,0.,1.1867621866862,1.1867621866862,1.,1., 2167P 1955 +136.556989192117,-121.82199734067,8.73624999999999, 2167P 1956 +136.556989192117,-134.624194429548,8.73624999999999,0., 2167P 1957 +1.1867621866862,0.,0.,0.; 2167P 1958 +126,1,1,0,0,1,0,-1.1867621866862,-1.1867621866862,0.,0.,1.,1., 2169P 1959 +136.556989192117,-134.624194429548,7.11812499999999, 2169P 1960 +136.556989192117,-121.82199734067,7.11812499999999, 2169P 1961 +-1.1867621866862,0.,0.,0.,0.; 2169P 1962 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,136.556989192117, 2171P 1963 +-134.624194429548,8.73624999999999,136.556989192117, 2171P 1964 +-134.624194429548,7.11812499999999,0.,0.15,0.,0.,0.; 2171P 1965 +126,1,1,0,0,1,0,0.,0.,0.0740967369255563,0.0740967369255563,1., 2173P 1966 +1.,136.556989192117,-134.624194429548,8.73624999999999, 2173P 1967 +135.757670642722,-134.624177008938,8.73624999999999,0., 2173P 1968 +0.0740967369255563,0.,0.,0.; 2173P 1969 +126,1,1,0,0,1,0,-0.0740967369255563,-0.0740967369255563,0.,0., 2175P 1970 +1.,1.,135.757670642722,-134.624177008938,7.11812499999999, 2175P 1971 +136.556989192117,-134.624194429548,7.11812499999999, 2175P 1972 +-0.0740967369255563,0.,0.,0.,0.; 2175P 1973 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 2177P 1974 +-134.624177008938,8.73624999999999,135.757670642722, 2177P 1975 +-134.624177008938,7.11812499999999,0.,0.15,0.,0.,0.; 2177P 1976 +126,1,1,0,0,1,0,0.,0.,0.055571543375649,0.055571543375649,1.,1., 2179P 1977 +135.757670642722,-134.624177008938,8.73624999999999, 2179P 1978 +135.757670642722,-135.223655033103,8.73624999999999,0., 2179P 1979 +0.055571543375649,0.,0.,0.; 2179P 1980 +126,1,1,0,0,1,0,-0.055571543375649,-0.055571543375649,0.,0.,1., 2181P 1981 +1.,135.757670642722,-135.223655033103,7.11812499999999, 2181P 1982 +135.757670642722,-134.624177008938,7.11812499999999, 2181P 1983 +-0.055571543375649,0.,0.,0.,0.; 2181P 1984 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 2183P 1985 +-135.223655033103,8.73624999999999,135.757670642722, 2183P 1986 +-135.223655033103,7.11812499999999,0.,0.15,0.,0.,0.; 2183P 1987 +126,1,1,0,0,1,0,0.,0.,1.29788872083028,1.29788872083028,1.,1., 2185P 1988 +135.757670642722,-135.223655033103,8.73624999999999, 2185P 1989 +121.756696066765,-135.223655033103,8.73624999999999,0., 2185P 1990 +1.29788872083028,0.,0.,0.; 2185P 1991 +126,1,1,0,0,1,0,-1.29788872083028,-1.29788872083028,0.,0.,1.,1., 2187P 1992 +121.756696066765,-135.223655033103,7.118125,135.757670642722, 2187P 1993 +-135.223655033103,7.11812499999999,-1.29788872083028,0.,0.,0., 2187P 1994 +0.; 2187P 1995 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 2189P 1996 +-135.223655033103,8.73624999999999,121.756696066765, 2189P 1997 +-135.223655033103,7.11812499999999,0.,0.15,0.,0.,0.; 2189P 1998 +126,1,1,0,0,1,0,0.,0.,0.0555715433756525,0.0555715433756525,1., 2191P 1999 +1.,121.756696066765,-135.223655033103,8.73624999999999, 2191P 2000 +121.756696066765,-134.624177008938,8.73624999999999,0., 2191P 2001 +0.0555715433756525,0.,0.,0.; 2191P 2002 +126,1,1,0,0,1,0,-0.0555715433756525,-0.0555715433756525,0.,0., 2193P 2003 +1.,1.,121.756696066765,-134.624177008938,7.118125, 2193P 2004 +121.756696066765,-135.223655033103,7.118125,-0.0555715433756525, 2193P 2005 +0.,0.,0.,0.; 2193P 2006 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 2195P 2007 +-134.624177008938,8.73624999999999,121.756696066765, 2195P 2008 +-134.624177008938,7.11812499999999,0.,0.15,0.,0.,0.; 2195P 2009 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 2197P 2010 +1.,121.756696066765,-134.624177008938,8.73624999999999, 2197P 2011 +120.957281704017,-134.624177008938,8.73624999999999,0., 2197P 2012 +0.0741056187947589,0.,0.,0.; 2197P 2013 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 2199P 2014 +1.,1.,120.957281704017,-134.624177008938,7.118125, 2199P 2015 +121.756696066765,-134.624177008938,7.118125,-0.0741056187947589, 2199P 2016 +0.,0.,0.,0.; 2199P 2017 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,120.957281704017, 2201P 2018 +-134.624177008938,8.73624999999999,120.957281704017, 2201P 2019 +-134.624177008938,7.11812499999999,0.,0.15,0.,0.,0.; 2201P 2020 +126,1,1,0,0,1,0,0.,0.,1.1867621866862,1.1867621866862,1.,1., 2203P 2021 +120.957281704017,-134.624177008938,8.73624999999999, 2203P 2022 +120.957281704017,-121.821979920061,8.73624999999999,0., 2203P 2023 +1.1867621866862,0.,0.,0.; 2203P 2024 +126,1,1,0,0,1,0,-1.1867621866862,-1.1867621866862,0.,0.,1.,1., 2205P 2025 +120.957281704017,-121.821979920061,7.118125,120.957281704017, 2205P 2026 +-134.624177008938,7.118125,-1.1867621866862,0.,0.,0.,0.; 2205P 2027 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,120.957281704017, 2207P 2028 +-121.821979920061,8.73624999999999,120.957281704017, 2207P 2029 +-121.821979920061,7.11812499999999,0.,0.15,0.,0.,0.; 2207P 2030 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2209P 2031 +1.,120.957281704017,-121.821979920061,8.73624999999999, 2209P 2032 +121.756696066765,-121.82199734067,8.73624999999999,0., 2209P 2033 +0.0741056188123544,0.,0.,0.; 2209P 2034 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2211P 2035 +1.,1.,121.756696066765,-121.82199734067,7.118125, 2211P 2036 +120.957281704017,-121.821979920061,7.118125,-0.0741056188123544, 2211P 2037 +0.,0.,0.,0.; 2211P 2038 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 2213P 2039 +-121.82199734067,8.73624999999999,121.756696066765, 2213P 2040 +-121.82199734067,7.11812499999999,0.,0.15,0.,0.,0.; 2213P 2041 +126,1,1,0,0,1,0,0.,0.,0.0554439671834288,0.0554439671834288,1., 2215P 2042 +1.,121.756696066765,-121.82199734067,8.73624999999999, 2215P 2043 +121.756696066765,-121.223895544679,8.73624999999999,0., 2215P 2044 +0.0554439671834288,0.,0.,0.; 2215P 2045 +126,1,1,0,0,1,0,-0.0554439671834288,-0.0554439671834288,0.,0., 2217P 2046 +1.,1.,121.756696066765,-121.223895544679,7.118125, 2217P 2047 +121.756696066765,-121.82199734067,7.118125,-0.0554439671834288, 2217P 2048 +0.,0.,0.,0.; 2217P 2049 +126,1,1,0,0,1,0,0.,0.,1.29788831710916,1.29788831710916,1.,1., 2219P 2050 +102.706327256509,-121.223895544679,8.73624999999999, 2219P 2051 +116.707297477313,-121.223878124069,8.73624999999999,0., 2219P 2052 +1.29788831710916,0.,0.,0.; 2219P 2053 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 2221P 2054 +-121.223895544679,8.73624999999999,102.706327256509, 2221P 2055 +-121.223895544679,7.118125,0.,0.15,0.,0.,0.; 2221P 2056 +126,1,1,0,0,1,0,-1.29788831710916,-1.29788831710916,0.,0.,1.,1., 2223P 2057 +116.707297477313,-121.223878124069,7.118125,102.706327256509, 2223P 2058 +-121.223895544679,7.118125,-1.29788831710916,0.,0.,0.,0.; 2223P 2059 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 2225P 2060 +-121.223878124069,8.73624999999999,116.707297477313, 2225P 2061 +-121.223878124069,7.11812499999999,0.,0.15,0.,0.,0.; 2225P 2062 +126,1,1,0,0,1,0,0.,0.,0.0554439671834324,0.0554439671834324,1., 2227P 2063 +1.,116.707297477313,-121.223878124069,8.73624999999999, 2227P 2064 +116.707297477313,-121.821979920061,8.73624999999999,0., 2227P 2065 +0.0554439671834324,0.,0.,0.; 2227P 2066 +126,1,1,0,0,1,0,-0.0554439671834324,-0.0554439671834324,0.,0., 2229P 2067 +1.,1.,116.707297477313,-121.821979920061,7.118125, 2229P 2068 +116.707297477313,-121.223878124069,7.118125,-0.0554439671834324, 2229P 2069 +0.,0.,0.,0.; 2229P 2070 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 2231P 2071 +-121.821979920061,8.73624999999999,116.707297477313, 2231P 2072 +-121.821979920061,7.11812499999999,0.,0.15,0.,0.,0.; 2231P 2073 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2233P 2074 +1.,116.707297477313,-121.821979920061,8.73624999999999, 2233P 2075 +117.506711840062,-121.82199734067,8.73624999999999,0., 2233P 2076 +0.0741056188123544,0.,0.,0.; 2233P 2077 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2235P 2078 +1.,1.,117.506711840062,-121.82199734067,7.118125, 2235P 2079 +116.707297477313,-121.821979920061,7.118125,-0.0741056188123544, 2235P 2080 +0.,0.,0.,0.; 2235P 2081 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,117.506711840062, 2237P 2082 +-121.82199734067,8.73624999999999,117.506711840062, 2237P 2083 +-121.82199734067,7.11812499999999,0.,0.15,0.,0.,0.; 2237P 2084 +126,1,1,0,0,1,0,0.,0.,1.18676218668648,1.18676218668648,1.,1., 2239P 2085 +117.506711840062,-121.82199734067,8.73624999999999, 2239P 2086 +117.506720550367,-134.624194429548,8.73624999999999,0., 2239P 2087 +1.18676218668648,0.,0.,0.; 2239P 2088 +126,1,1,0,0,1,0,-1.18676218668648,-1.18676218668648,0.,0.,1.,1., 2241P 2089 +117.506720550367,-134.624194429548,7.118125,117.506711840062, 2241P 2090 +-121.82199734067,7.118125,-1.18676218668648,0.,0.,0.,0.; 2241P 2091 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,117.506720550367, 2243P 2092 +-134.624194429548,8.73624999999999,117.506720550367, 2243P 2093 +-134.624194429548,7.11812499999999,0.,0.15,0.,0.,0.; 2243P 2094 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2245P 2095 +1.,117.506720550367,-134.624194429548,8.73624999999999, 2245P 2096 +116.707306187618,-134.624177008938,8.73624999999999,0., 2245P 2097 +0.0741056188123544,0.,0.,0.; 2245P 2098 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2247P 2099 +1.,1.,116.707306187618,-134.624177008938,7.118125, 2247P 2100 +117.506720550367,-134.624194429548,7.118125,-0.0741056188123544, 2247P 2101 +0.,0.,0.,0.; 2247P 2102 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707306187618, 2249P 2103 +-134.624177008938,8.73624999999999,116.707306187618, 2249P 2104 +-134.624177008938,7.11812499999999,0.,0.15,0.,0.,0.; 2249P 2105 +126,1,1,0,0,1,0,0.,0.,0.055571543381515,0.055571543381515,1.,1., 2251P 2106 +116.707306187618,-134.624177008938,8.73624999999999, 2251P 2107 +116.707297477313,-135.223655033103,8.73624999999999,0., 2251P 2108 +0.055571543381515,0.,0.,0.; 2251P 2109 +126,1,1,0,0,1,0,-0.055571543381515,-0.055571543381515,0.,0.,1., 2253P 2110 +1.,116.707297477313,-135.223655033103,7.118125,116.707306187618, 2253P 2111 +-134.624177008938,7.118125,-0.055571543381515,0.,0.,0.,0.; 2253P 2112 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 2255P 2113 +-135.223655033103,8.73624999999999,116.707297477313, 2255P 2114 +-135.223655033103,7.11812499999999,0.,0.15,0.,0.,0.; 2255P 2115 +126,1,1,0,0,1,0,0.,0.,1.29788831710816,1.29788831710816,1.,1., 2257P 2116 +116.707297477313,-135.223655033103,8.73624999999999, 2257P 2117 +102.706327256509,-135.223655033103,8.73624999999999,0., 2257P 2118 +1.29788831710816,0.,0.,0.; 2257P 2119 +126,1,1,0,0,1,0,-1.29788831710816,-1.29788831710816,0.,0.,1.,1., 2259P 2120 +102.706327256509,-135.223655033103,7.118125,116.707297477313, 2259P 2121 +-135.223655033103,7.118125,-1.29788831710816,0.,0.,0.,0.; 2259P 2122 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 2261P 2123 +-135.223655033103,8.73624999999999,102.706327256509, 2261P 2124 +-135.223655033103,7.118125,0.,0.15,0.,0.,0.; 2261P 2125 +126,1,1,0,0,1,0,0.,0.,0.0555715433756525,0.0555715433756525,1., 2263P 2126 +1.,102.706327256509,-135.223655033103,8.73624999999999, 2263P 2127 +102.706327256509,-134.624177008938,8.73624999999999,0., 2263P 2128 +0.0555715433756525,0.,0.,0.; 2263P 2129 +126,1,1,0,0,1,0,-0.0555715433756525,-0.0555715433756525,0.,0., 2265P 2130 +1.,1.,102.706327256509,-134.624177008938,7.118125, 2265P 2131 +102.706327256509,-135.223655033103,7.118125,-0.0555715433756525, 2265P 2132 +0.,0.,0.,0.; 2265P 2133 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 2267P 2134 +-134.624177008938,8.73624999999999,102.706327256509, 2267P 2135 +-134.624177008938,7.118125,0.,0.15,0.,0.,0.; 2267P 2136 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 2269P 2137 +1.,102.706327256509,-134.624177008938,8.73624999999999, 2269P 2138 +101.90691289376,-134.624177008938,8.73624999999999,0., 2269P 2139 +0.0741056187947589,0.,0.,0.; 2269P 2140 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 2271P 2141 +1.,1.,101.90691289376,-134.624177008938,7.118125, 2271P 2142 +102.706327256509,-134.624177008938,7.118125,-0.0741056187947589, 2271P 2143 +0.,0.,0.,0.; 2271P 2144 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,101.90691289376, 2273P 2145 +-134.624177008938,8.73624999999999,101.90691289376, 2273P 2146 +-134.624177008938,7.118125,0.,0.15,0.,0.,0.; 2273P 2147 +126,1,1,0,0,1,0,0.,0.,1.1867621866862,1.1867621866862,1.,1., 2275P 2148 +101.90691289376,-134.624177008938,8.73624999999999, 2275P 2149 +101.90691289376,-121.821979920061,8.73624999999999,0., 2275P 2150 +1.1867621866862,0.,0.,0.; 2275P 2151 +126,1,1,0,0,1,0,-1.1867621866862,-1.1867621866862,0.,0.,1.,1., 2277P 2152 +101.90691289376,-121.821979920061,7.118125,101.90691289376, 2277P 2153 +-134.624177008938,7.118125,-1.1867621866862,0.,0.,0.,0.; 2277P 2154 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,101.90691289376, 2279P 2155 +-121.821979920061,8.73624999999999,101.90691289376, 2279P 2156 +-121.821979920061,7.118125,0.,0.15,0.,0.,0.; 2279P 2157 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2281P 2158 +1.,101.90691289376,-121.821979920061,8.73624999999999, 2281P 2159 +102.706327256509,-121.82199734067,8.73624999999999,0., 2281P 2160 +0.0741056188123544,0.,0.,0.; 2281P 2161 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2283P 2162 +1.,1.,102.706327256509,-121.82199734067,7.118125, 2283P 2163 +101.90691289376,-121.821979920061,7.118125,-0.0741056188123544, 2283P 2164 +0.,0.,0.,0.; 2283P 2165 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 2285P 2166 +-121.82199734067,8.73624999999999,102.706327256509, 2285P 2167 +-121.82199734067,7.118125,0.,0.15,0.,0.,0.; 2285P 2168 +126,1,1,0,0,1,0,0.,0.,0.0554439671834288,0.0554439671834288,1., 2287P 2169 +1.,102.706327256509,-121.82199734067,8.73624999999999, 2287P 2170 +102.706327256509,-121.223895544679,8.73624999999999,0., 2287P 2171 +0.0554439671834288,0.,0.,0.; 2287P 2172 +126,1,1,0,0,1,0,-0.0554439671834288,-0.0554439671834288,0.,0., 2289P 2173 +1.,1.,102.706327256509,-121.223895544679,7.118125, 2289P 2174 +102.706327256509,-121.82199734067,7.118125,-0.0554439671834288, 2289P 2175 +0.,0.,0.,0.; 2289P 2176 +126,1,1,0,0,1,0,0.,0.,1.29788831710916,1.29788831710916,1.,1., 2291P 2177 +83.6559584462526,-121.223895544679,8.73625,97.6569286670568, 2291P 2178 +-121.223878124069,8.73624999999999,0.,1.29788831710916,0.,0.,0.; 2291P 2179 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 2293P 2180 +-121.223895544679,8.73625,83.6559584462526,-121.223895544679, 2293P 2181 +7.118125,0.,0.15,0.,0.,0.; 2293P 2182 +126,1,1,0,0,1,0,-1.29788831710916,-1.29788831710916,0.,0.,1.,1., 2295P 2183 +97.6569286670568,-121.223878124069,7.118125,83.6559584462526, 2295P 2184 +-121.223895544679,7.118125,-1.29788831710916,0.,0.,0.,0.; 2295P 2185 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 2297P 2186 +-121.223878124069,8.73624999999999,97.6569286670568, 2297P 2187 +-121.223878124069,7.118125,0.,0.15,0.,0.,0.; 2297P 2188 +126,1,1,0,0,1,0,0.,0.,0.0554439671834324,0.0554439671834324,1., 2299P 2189 +1.,97.6569286670568,-121.223878124069,8.73624999999999, 2299P 2190 +97.6569286670568,-121.821979920061,8.73624999999999,0., 2299P 2191 +0.0554439671834324,0.,0.,0.; 2299P 2192 +126,1,1,0,0,1,0,-0.0554439671834324,-0.0554439671834324,0.,0., 2301P 2193 +1.,1.,97.6569286670568,-121.821979920061,7.118125, 2301P 2194 +97.6569286670568,-121.223878124069,7.118125,-0.0554439671834324, 2301P 2195 +0.,0.,0.,0.; 2301P 2196 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 2303P 2197 +-121.821979920061,8.73624999999999,97.6569286670568, 2303P 2198 +-121.821979920061,7.118125,0.,0.15,0.,0.,0.; 2303P 2199 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2305P 2200 +1.,97.6569286670568,-121.821979920061,8.73624999999999, 2305P 2201 +98.4563430298053,-121.82199734067,8.73624999999999,0., 2305P 2202 +0.0741056188123544,0.,0.,0.; 2305P 2203 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2307P 2204 +1.,1.,98.4563430298053,-121.82199734067,7.118125, 2307P 2205 +97.6569286670568,-121.821979920061,7.118125,-0.0741056188123544, 2307P 2206 +0.,0.,0.,0.; 2307P 2207 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,98.4563430298053, 2309P 2208 +-121.82199734067,8.73624999999999,98.4563430298053, 2309P 2209 +-121.82199734067,7.118125,0.,0.15,0.,0.,0.; 2309P 2210 +126,1,1,0,0,1,0,0.,0.,1.1867621866862,1.1867621866862,1.,1., 2311P 2211 +98.4563430298053,-121.82199734067,8.73624999999999, 2311P 2212 +98.4563430298053,-134.624194429548,8.73624999999999,0., 2311P 2213 +1.1867621866862,0.,0.,0.; 2311P 2214 +126,1,1,0,0,1,0,-1.1867621866862,-1.1867621866862,0.,0.,1.,1., 2313P 2215 +98.4563430298053,-134.624194429548,7.118125,98.4563430298053, 2313P 2216 +-121.82199734067,7.118125,-1.1867621866862,0.,0.,0.,0.; 2313P 2217 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,98.4563430298053, 2315P 2218 +-134.624194429548,8.73624999999999,98.4563430298053, 2315P 2219 +-134.624194429548,7.118125,0.,0.15,0.,0.,0.; 2315P 2220 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2317P 2221 +1.,98.4563430298053,-134.624194429548,8.73624999999999, 2317P 2222 +97.6569286670568,-134.624177008938,8.73624999999999,0., 2317P 2223 +0.0741056188123544,0.,0.,0.; 2317P 2224 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2319P 2225 +1.,1.,97.6569286670568,-134.624177008938,7.118125, 2319P 2226 +98.4563430298053,-134.624194429548,7.118125,-0.0741056188123544, 2319P 2227 +0.,0.,0.,0.; 2319P 2228 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 2321P 2229 +-134.624177008938,8.73624999999999,97.6569286670568, 2321P 2230 +-134.624177008938,7.118125,0.,0.15,0.,0.,0.; 2321P 2231 +126,1,1,0,0,1,0,0.,0.,0.055571543375649,0.055571543375649,1.,1., 2323P 2232 +97.6569286670568,-134.624177008938,8.73624999999999, 2323P 2233 +97.6569286670568,-135.223655033103,8.73624999999999,0., 2323P 2234 +0.055571543375649,0.,0.,0.; 2323P 2235 +126,1,1,0,0,1,0,-0.055571543375649,-0.055571543375649,0.,0.,1., 2325P 2236 +1.,97.6569286670568,-135.223655033103,7.118125,97.6569286670568, 2325P 2237 +-134.624177008938,7.118125,-0.055571543375649,0.,0.,0.,0.; 2325P 2238 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 2327P 2239 +-135.223655033103,8.73624999999999,97.6569286670568, 2327P 2240 +-135.223655033103,7.118125,0.,0.15,0.,0.,0.; 2327P 2241 +126,1,1,0,0,1,0,0.,0.,1.29788912455241,1.29788912455241,1.,1., 2329P 2242 +97.6569286670568,-135.223655033103,8.73624999999999, 2329P 2243 +83.6559497359477,-135.223655033103,8.73625,0.,1.29788912455241, 2329P 2244 +0.,0.,0.; 2329P 2245 +126,1,1,0,0,1,0,-1.29788912455241,-1.29788912455241,0.,0.,1.,1., 2331P 2246 +83.6559497359477,-135.223655033103,7.118125,97.6569286670568, 2331P 2247 +-135.223655033103,7.118125,-1.29788912455241,0.,0.,0.,0.; 2331P 2248 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559497359477, 2333P 2249 +-135.223655033103,8.73625,83.6559497359477,-135.223655033103, 2333P 2250 +7.118125,0.,0.15,0.,0.,0.; 2333P 2251 +126,1,1,0,0,1,0,0.,0.,0.0555715433815185,0.0555715433815185,1., 2335P 2252 +1.,83.6559497359477,-135.223655033103,8.73625,83.6559584462526, 2335P 2253 +-134.624177008938,8.73625,0.,0.0555715433815185,0.,0.,0.; 2335P 2254 +126,1,1,0,0,1,0,-0.0555715433815185,-0.0555715433815185,0.,0., 2337P 2255 +1.,1.,83.6559584462526,-134.624177008938,7.118125, 2337P 2256 +83.6559497359477,-135.223655033103,7.118125,-0.0555715433815185, 2337P 2257 +0.,0.,0.,0.; 2337P 2258 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 2339P 2259 +-134.624177008938,8.73625,83.6559584462526,-134.624177008938, 2339P 2260 +7.118125,0.,0.15,0.,0.,0.; 2339P 2261 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 2341P 2262 +1.,83.6559584462526,-134.624177008938,8.73625,82.8565440835041, 2341P 2263 +-134.624177008938,8.73625,0.,0.0741056187947589,0.,0.,0.; 2341P 2264 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 2343P 2265 +1.,1.,82.8565440835041,-134.624177008938,7.118125, 2343P 2266 +83.6559584462526,-134.624177008938,7.118125,-0.0741056187947589, 2343P 2267 +0.,0.,0.,0.; 2343P 2268 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,82.8565440835042, 2345P 2269 +-134.624177008938,8.73625,82.8565440835042,-134.624177008938, 2345P 2270 +7.118125,0.,0.15,0.,0.,0.; 2345P 2271 +126,1,1,0,0,1,0,0.,0.,1.1867621866862,1.1867621866862,1.,1., 2347P 2272 +82.8565440835042,-134.624177008938,8.73625,82.8565440835042, 2347P 2273 +-121.821979920061,8.73625,0.,1.1867621866862,0.,0.,0.; 2347P 2274 +126,1,1,0,0,1,0,-1.1867621866862,-1.1867621866862,0.,0.,1.,1., 2349P 2275 +82.8565440835042,-121.821979920061,7.118125,82.8565440835042, 2349P 2276 +-134.624177008938,7.118125,-1.1867621866862,0.,0.,0.,0.; 2349P 2277 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,82.8565440835042, 2351P 2278 +-121.821979920061,8.73625,82.8565440835042,-121.821979920061, 2351P 2279 +7.118125,0.,0.15,0.,0.,0.; 2351P 2280 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2353P 2281 +1.,82.8565440835042,-121.821979920061,8.73625,83.6559584462526, 2353P 2282 +-121.82199734067,8.73625,0.,0.0741056188123544,0.,0.,0.; 2353P 2283 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2355P 2284 +1.,1.,83.6559584462526,-121.82199734067,7.118125, 2355P 2285 +82.8565440835042,-121.821979920061,7.118125,-0.0741056188123544, 2355P 2286 +0.,0.,0.,0.; 2355P 2287 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 2357P 2288 +-121.82199734067,8.73625,83.6559584462526,-121.82199734067, 2357P 2289 +7.118125,0.,0.15,0.,0.,0.; 2357P 2290 +126,1,1,0,0,1,0,0.,0.,0.0554439671834288,0.0554439671834288,1., 2359P 2291 +1.,83.6559584462526,-121.82199734067,8.73625,83.6559584462526, 2359P 2292 +-121.223895544679,8.73625,0.,0.0554439671834288,0.,0.,0.; 2359P 2293 +126,1,1,0,0,1,0,-0.0554439671834288,-0.0554439671834288,0.,0., 2361P 2294 +1.,1.,83.6559584462526,-121.223895544679,7.118125, 2361P 2295 +83.6559584462526,-121.82199734067,7.118125,-0.0554439671834288, 2361P 2296 +0.,0.,0.,0.; 2361P 2297 +126,1,1,0,0,1,0,0.,0.,1.29788831710916,1.29788831710916,1.,1., 2363P 2298 +64.6055896359963,-121.223895544679,8.73625,78.6065598568005, 2363P 2299 +-121.223878124069,8.73625,0.,1.29788831710916,0.,0.,0.; 2363P 2300 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 2365P 2301 +-121.223895544679,8.73625,64.6055896359963,-121.223895544679, 2365P 2302 +7.118125,0.,0.15,0.,0.,0.; 2365P 2303 +126,1,1,0,0,1,0,-1.29788831710916,-1.29788831710916,0.,0.,1.,1., 2367P 2304 +78.6065598568005,-121.223878124069,7.118125,64.6055896359963, 2367P 2305 +-121.223895544679,7.118125,-1.29788831710916,0.,0.,0.,0.; 2367P 2306 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 2369P 2307 +-121.223878124069,8.73625,78.6065598568005,-121.223878124069, 2369P 2308 +7.118125,0.,0.15,0.,0.,0.; 2369P 2309 +126,1,1,0,0,1,0,0.,0.,0.0554439671834324,0.0554439671834324,1., 2371P 2310 +1.,78.6065598568005,-121.223878124069,8.73625,78.6065598568005, 2371P 2311 +-121.821979920061,8.73625,0.,0.0554439671834324,0.,0.,0.; 2371P 2312 +126,1,1,0,0,1,0,-0.0554439671834324,-0.0554439671834324,0.,0., 2373P 2313 +1.,1.,78.6065598568005,-121.821979920061,7.118125, 2373P 2314 +78.6065598568005,-121.223878124069,7.118125,-0.0554439671834324, 2373P 2315 +0.,0.,0.,0.; 2373P 2316 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 2375P 2317 +-121.821979920061,8.73625,78.6065598568005,-121.821979920061, 2375P 2318 +7.118125,0.,0.15,0.,0.,0.; 2375P 2319 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2377P 2320 +1.,78.6065598568005,-121.821979920061,8.73625,79.405974219549, 2377P 2321 +-121.82199734067,8.73625,0.,0.0741056188123544,0.,0.,0.; 2377P 2322 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2379P 2323 +1.,1.,79.405974219549,-121.82199734067,7.118125, 2379P 2324 +78.6065598568005,-121.821979920061,7.118125,-0.0741056188123544, 2379P 2325 +0.,0.,0.,0.; 2379P 2326 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,79.4059742195489, 2381P 2327 +-121.82199734067,8.73625,79.4059742195489,-121.82199734067, 2381P 2328 +7.118125,0.,0.15,0.,0.,0.; 2381P 2329 +126,1,1,0,0,1,0,0.,0.,1.1867621866862,1.1867621866862,1.,1., 2383P 2330 +79.4059742195489,-121.82199734067,8.73625,79.4059742195489, 2383P 2331 +-134.624194429548,8.73625,0.,1.1867621866862,0.,0.,0.; 2383P 2332 +126,1,1,0,0,1,0,-1.1867621866862,-1.1867621866862,0.,0.,1.,1., 2385P 2333 +79.4059742195489,-134.624194429548,7.118125,79.4059742195489, 2385P 2334 +-121.82199734067,7.118125,-1.1867621866862,0.,0.,0.,0.; 2385P 2335 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,79.4059742195489, 2387P 2336 +-134.624194429548,8.73625,79.4059742195489,-134.624194429548, 2387P 2337 +7.118125,0.,0.15,0.,0.,0.; 2387P 2338 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2389P 2339 +1.,79.4059742195489,-134.624194429548,8.73625,78.6065598568005, 2389P 2340 +-134.624177008938,8.73625,0.,0.0741056188123544,0.,0.,0.; 2389P 2341 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2391P 2342 +1.,1.,78.6065598568005,-134.624177008938,7.118125, 2391P 2343 +79.4059742195489,-134.624194429548,7.118125,-0.0741056188123544, 2391P 2344 +0.,0.,0.,0.; 2391P 2345 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 2393P 2346 +-134.624177008938,8.73625,78.6065598568005,-134.624177008938, 2393P 2347 +7.118125,0.,0.15,0.,0.,0.; 2393P 2348 +126,1,1,0,0,1,0,0.,0.,0.055571543375649,0.055571543375649,1.,1., 2395P 2349 +78.6065598568005,-134.624177008938,8.73625,78.6065598568005, 2395P 2350 +-135.223655033103,8.73625,0.,0.055571543375649,0.,0.,0.; 2395P 2351 +126,1,1,0,0,1,0,-0.055571543375649,-0.055571543375649,0.,0.,1., 2397P 2352 +1.,78.6065598568005,-135.223655033103,7.118125,78.6065598568005, 2397P 2353 +-134.624177008938,7.118125,-0.055571543375649,0.,0.,0.,0.; 2397P 2354 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 2399P 2355 +-135.223655033103,8.73625,78.6065598568005,-135.223655033103, 2399P 2356 +7.118125,0.,0.15,0.,0.,0.; 2399P 2357 +126,1,1,0,0,1,0,0.,0.,1.29788831710816,1.29788831710816,1.,1., 2401P 2358 +78.6065598568005,-135.223655033103,8.73625,64.6055896359963, 2401P 2359 +-135.223655033103,8.73625,0.,1.29788831710816,0.,0.,0.; 2401P 2360 +126,1,1,0,0,1,0,-1.29788831710816,-1.29788831710816,0.,0.,1.,1., 2403P 2361 +64.6055896359963,-135.223655033103,7.118125,78.6065598568005, 2403P 2362 +-135.223655033103,7.118125,-1.29788831710816,0.,0.,0.,0.; 2403P 2363 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 2405P 2364 +-135.223655033103,8.73625,64.6055896359963,-135.223655033103, 2405P 2365 +7.118125,0.,0.15,0.,0.,0.; 2405P 2366 +126,1,1,0,0,1,0,0.,0.,0.0555715433756525,0.0555715433756525,1., 2407P 2367 +1.,64.6055896359963,-135.223655033103,8.73625,64.6055896359963, 2407P 2368 +-134.624177008938,8.73625,0.,0.0555715433756525,0.,0.,0.; 2407P 2369 +126,1,1,0,0,1,0,-0.0555715433756525,-0.0555715433756525,0.,0., 2409P 2370 +1.,1.,64.6055896359963,-134.624177008938,7.118125, 2409P 2371 +64.6055896359963,-135.223655033103,7.118125,-0.0555715433756525, 2409P 2372 +0.,0.,0.,0.; 2409P 2373 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 2411P 2374 +-134.624177008938,8.73625,64.6055896359963,-134.624177008938, 2411P 2375 +7.118125,0.,0.15,0.,0.,0.; 2411P 2376 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 2413P 2377 +1.,64.6055896359963,-134.624177008938,8.73625,63.8061752732478, 2413P 2378 +-134.624177008938,8.73625,0.,0.0741056187947589,0.,0.,0.; 2413P 2379 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 2415P 2380 +1.,1.,63.8061752732478,-134.624177008938,7.118125, 2415P 2381 +64.6055896359963,-134.624177008938,7.118125,-0.0741056187947589, 2415P 2382 +0.,0.,0.,0.; 2415P 2383 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,63.8061752732478, 2417P 2384 +-134.624177008938,8.73625,63.8061752732478,-134.624177008938, 2417P 2385 +7.118125,0.,0.15,0.,0.,0.; 2417P 2386 +126,1,1,0,0,1,0,0.,0.,1.1867621866862,1.1867621866862,1.,1., 2419P 2387 +63.8061752732478,-134.624177008938,8.73625,63.8061752732478, 2419P 2388 +-121.821979920061,8.73625,0.,1.1867621866862,0.,0.,0.; 2419P 2389 +126,1,1,0,0,1,0,-1.1867621866862,-1.1867621866862,0.,0.,1.,1., 2421P 2390 +63.8061752732478,-121.821979920061,7.118125,63.8061752732478, 2421P 2391 +-134.624177008938,7.118125,-1.1867621866862,0.,0.,0.,0.; 2421P 2392 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,63.8061752732478, 2423P 2393 +-121.821979920061,8.73625,63.8061752732478,-121.821979920061, 2423P 2394 +7.118125,0.,0.15,0.,0.,0.; 2423P 2395 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2425P 2396 +1.,63.8061752732478,-121.821979920061,8.73625,64.6055896359963, 2425P 2397 +-121.82199734067,8.73625,0.,0.0741056188123544,0.,0.,0.; 2425P 2398 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2427P 2399 +1.,1.,64.6055896359963,-121.82199734067,7.118125, 2427P 2400 +63.8061752732478,-121.821979920061,7.118125,-0.0741056188123544, 2427P 2401 +0.,0.,0.,0.; 2427P 2402 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 2429P 2403 +-121.82199734067,8.73625,64.6055896359963,-121.82199734067, 2429P 2404 +7.118125,0.,0.15,0.,0.,0.; 2429P 2405 +126,1,1,0,0,1,0,0.,0.,0.0554439671834288,0.0554439671834288,1., 2431P 2406 +1.,64.6055896359963,-121.82199734067,8.73625,64.6055896359963, 2431P 2407 +-121.223895544679,8.73625,0.,0.0554439671834288,0.,0.,0.; 2431P 2408 +126,1,1,0,0,1,0,-0.0554439671834288,-0.0554439671834288,0.,0., 2433P 2409 +1.,1.,64.6055896359963,-121.223895544679,7.118125, 2433P 2410 +64.6055896359963,-121.82199734067,7.118125,-0.0554439671834288, 2433P 2411 +0.,0.,0.,0.; 2433P 2412 +126,1,1,0,0,1,0,0.,0.,1.29779546101989,1.29779546101989,1.,1., 2435P 2413 +45.556222510803,-121.223895544679,8.73625,59.5561910465442, 2435P 2414 +-121.223878124069,8.73625,0.,1.29779546101989,0.,0.,0.; 2435P 2415 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 2437P 2416 +-121.223895544679,8.73625,45.556222510803,-121.223895544679, 2437P 2417 +7.118125,0.,0.15,0.,0.,0.; 2437P 2418 +126,1,1,0,0,1,0,-1.29779546101989,-1.29779546101989,0.,0.,1.,1., 2439P 2419 +59.5561910465442,-121.223878124069,7.118125,45.556222510803, 2439P 2420 +-121.223895544679,7.118125,-1.29779546101989,0.,0.,0.,0.; 2439P 2421 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 2441P 2422 +-121.223878124069,8.73625,59.5561910465442,-121.223878124069, 2441P 2423 +7.118125,0.,0.15,0.,0.,0.; 2441P 2424 +126,1,1,0,0,1,0,0.,0.,0.0554439671834324,0.0554439671834324,1., 2443P 2425 +1.,59.5561910465442,-121.223878124069,8.73625,59.5561910465442, 2443P 2426 +-121.821979920061,8.73625,0.,0.0554439671834324,0.,0.,0.; 2443P 2427 +126,1,1,0,0,1,0,-0.0554439671834324,-0.0554439671834324,0.,0., 2445P 2428 +1.,1.,59.5561910465442,-121.821979920061,7.118125, 2445P 2429 +59.5561910465442,-121.223878124069,7.118125,-0.0554439671834324, 2445P 2430 +0.,0.,0.,0.; 2445P 2431 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 2447P 2432 +-121.821979920061,8.73625,59.5561910465442,-121.821979920061, 2447P 2433 +7.118125,0.,0.15,0.,0.,0.; 2447P 2434 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2449P 2435 +1.,59.5561910465442,-121.821979920061,8.73625,60.3556054092927, 2449P 2436 +-121.82199734067,8.73625,0.,0.0741056188123544,0.,0.,0.; 2449P 2437 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2451P 2438 +1.,1.,60.3556054092927,-121.82199734067,7.118125, 2451P 2439 +59.5561910465442,-121.821979920061,7.118125,-0.0741056188123544, 2451P 2440 +0.,0.,0.,0.; 2451P 2441 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,60.3556054092926, 2453P 2442 +-121.82199734067,8.73625,60.3556054092926,-121.82199734067, 2453P 2443 +7.118125,0.,0.15,0.,0.,0.; 2453P 2444 +126,1,1,0,0,1,0,0.,0.,1.1867621866862,1.1867621866862,1.,1., 2455P 2445 +60.3556054092926,-121.82199734067,8.73625,60.3556054092926, 2455P 2446 +-134.624194429548,8.73625,0.,1.1867621866862,0.,0.,0.; 2455P 2447 +126,1,1,0,0,1,0,-1.1867621866862,-1.1867621866862,0.,0.,1.,1., 2457P 2448 +60.3556054092926,-134.624194429548,7.118125,60.3556054092926, 2457P 2449 +-121.82199734067,7.118125,-1.1867621866862,0.,0.,0.,0.; 2457P 2450 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,60.3556054092926, 2459P 2451 +-134.624194429548,8.73625,60.3556054092926,-134.624194429548, 2459P 2452 +7.118125,0.,0.15,0.,0.,0.; 2459P 2453 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2461P 2454 +1.,60.3556054092926,-134.624194429548,8.73625,59.5561910465442, 2461P 2455 +-134.624177008938,8.73625,0.,0.0741056188123544,0.,0.,0.; 2461P 2456 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2463P 2457 +1.,1.,59.5561910465442,-134.624177008938,7.118125, 2463P 2458 +60.3556054092926,-134.624194429548,7.118125,-0.0741056188123544, 2463P 2459 +0.,0.,0.,0.; 2463P 2460 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 2465P 2461 +-134.624177008938,8.73625,59.5561910465442,-134.624177008938, 2465P 2462 +7.118125,0.,0.15,0.,0.,0.; 2465P 2463 +126,1,1,0,0,1,0,0.,0.,0.055571543375649,0.055571543375649,1.,1., 2467P 2464 +59.5561910465442,-134.624177008938,8.73625,59.5561910465442, 2467P 2465 +-135.223655033103,8.73625,0.,0.055571543375649,0.,0.,0.; 2467P 2466 +126,1,1,0,0,1,0,-0.055571543375649,-0.055571543375649,0.,0.,1., 2469P 2467 +1.,59.5561910465442,-135.223655033103,7.118125,59.5561910465442, 2469P 2468 +-134.624177008938,7.118125,-0.055571543375649,0.,0.,0.,0.; 2469P 2469 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 2471P 2470 +-135.223655033103,8.73625,59.5561910465442,-135.223655033103, 2471P 2471 +7.118125,0.,0.15,0.,0.,0.; 2471P 2472 +126,1,1,0,0,1,0,0.,0.,1.29779546101888,1.29779546101888,1.,1., 2473P 2473 +59.5561910465442,-135.223655033103,8.73625,45.556222510803, 2473P 2474 +-135.223655033103,8.73625,0.,1.29779546101888,0.,0.,0.; 2473P 2475 +126,1,1,0,0,1,0,-1.29779546101888,-1.29779546101888,0.,0.,1.,1., 2475P 2476 +45.556222510803,-135.223655033103,7.11812500000001, 2475P 2477 +59.5561910465442,-135.223655033103,7.118125,-1.29779546101888, 2475P 2478 +0.,0.,0.,0.; 2475P 2479 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 2477P 2480 +-135.223655033103,8.73625,45.556222510803,-135.223655033103, 2477P 2481 +7.118125,0.,0.15,0.,0.,0.; 2477P 2482 +126,1,1,0,0,1,0,0.,0.,0.0555715433756525,0.0555715433756525,1., 2479P 2483 +1.,45.556222510803,-135.223655033103,8.73625,45.556222510803, 2479P 2484 +-134.624177008938,8.73625,0.,0.0555715433756525,0.,0.,0.; 2479P 2485 +126,1,1,0,0,1,0,-0.0555715433756525,-0.0555715433756525,0.,0., 2481P 2486 +1.,1.,45.556222510803,-134.624177008938,7.118125, 2481P 2487 +45.556222510803,-135.223655033103,7.118125,-0.0555715433756525, 2481P 2488 +0.,0.,0.,0.; 2481P 2489 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 2483P 2490 +-134.624177008938,8.73625,45.556222510803,-134.624177008938, 2483P 2491 +7.118125,0.,0.15,0.,0.,0.; 2483P 2492 +126,1,1,0,0,1,0,0.,0.,0.0741621398925787,0.0741621398925787,1., 2485P 2493 +1.,45.556222510803,-134.624177008938,8.73625,44.7561984267118, 2485P 2494 +-134.624177008938,8.73625,0.,0.0741621398925787,0.,0.,0.; 2485P 2495 +126,1,1,0,0,1,0,-0.0741621398925787,-0.0741621398925787,0.,0., 2487P 2496 +1.,1.,44.7561984267118,-134.624177008938,7.118125, 2487P 2497 +45.556222510803,-134.624177008938,7.118125,-0.0741621398925787, 2487P 2498 +0.,0.,0.,0.; 2487P 2499 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,44.7561984267118, 2489P 2500 +-134.624177008938,8.73625,44.7561984267118,-134.624177008938, 2489P 2501 +7.118125,0.,0.15,0.,0.,0.; 2489P 2502 +126,1,1,0,0,1,0,0.,0.,1.1867621866862,1.1867621866862,1.,1., 2491P 2503 +44.7561984267118,-134.624177008938,8.73625,44.7561984267118, 2491P 2504 +-121.821979920061,8.73625,0.,1.1867621866862,0.,0.,0.; 2491P 2505 +126,1,1,0,0,1,0,-1.1867621866862,-1.1867621866862,0.,0.,1.,1., 2493P 2506 +44.7561984267118,-121.821979920061,7.118125,44.7561984267118, 2493P 2507 +-134.624177008938,7.118125,-1.1867621866862,0.,0.,0.,0.; 2493P 2508 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,44.7561984267118, 2495P 2509 +-121.821979920061,8.73625,44.7561984267118,-121.821979920061, 2495P 2510 +7.118125,0.,0.15,0.,0.,0.; 2495P 2511 +126,1,1,0,0,1,0,0.,0.,0.0741621399101609,0.0741621399101609,1., 2497P 2512 +1.,44.7561984267118,-121.821979920061,8.73625,45.556222510803, 2497P 2513 +-121.82199734067,8.73625,0.,0.0741621399101609,0.,0.,0.; 2497P 2514 +126,1,1,0,0,1,0,-0.0741621399101609,-0.0741621399101609,0.,0., 2499P 2515 +1.,1.,45.556222510803,-121.82199734067,7.118125, 2499P 2516 +44.7561984267118,-121.821979920061,7.118125,-0.0741621399101609, 2499P 2517 +0.,0.,0.,0.; 2499P 2518 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 2501P 2519 +-121.82199734067,8.73625,45.556222510803,-121.82199734067, 2501P 2520 +7.118125,0.,0.15,0.,0.,0.; 2501P 2521 +126,1,1,0,0,1,0,0.,0.,0.0554439671834288,0.0554439671834288,1., 2503P 2522 +1.,45.556222510803,-121.82199734067,8.73625,45.556222510803, 2503P 2523 +-121.223895544679,8.73625,0.,0.0554439671834288,0.,0.,0.; 2503P 2524 +126,1,1,0,0,1,0,-0.0554439671834288,-0.0554439671834288,0.,0., 2505P 2525 +1.,1.,45.556222510803,-121.223895544679,7.118125, 2505P 2526 +45.556222510803,-121.82199734067,7.118125,-0.0554439671834288, 2505P 2527 +0.,0.,0.,0.; 2505P 2528 +126,1,1,0,0,1,0,0.,0.,1.29791011810403,1.29791011810403,1.,1., 2507P 2529 +140.806868895161,-102.173622547777,8.73624999999999, 2507P 2530 +154.808074294198,-102.173605127167,8.73624999999999,0., 2507P 2531 +1.29791011810403,0.,0.,0.; 2507P 2532 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806868895161, 2509P 2533 +-102.173622547777,8.73624999999999,140.806868895161, 2509P 2534 +-102.173622547777,7.11812499999999,0.,0.15,0.,0.,0.; 2509P 2535 +126,1,1,0,0,1,0,-1.29791011810403,-1.29791011810403,0.,0.,1.,1., 2511P 2536 +154.808074294198,-102.173605127167,7.11812499999999, 2511P 2537 +140.806868895161,-102.173622547777,7.11812499999999, 2511P 2538 +-1.29791011810403,0.,0.,0.,0.; 2511P 2539 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2513P 2540 +-102.173605127167,8.73624999999999,154.808074294198, 2513P 2541 +-102.173605127167,7.11812499999999,0.,0.15,0.,0.,0.; 2513P 2542 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2515P 2543 +1.,154.808074294198,-102.173605127167,8.73624999999999, 2515P 2544 +154.808074294198,-102.772908945234,8.73624999999999,0., 2515P 2545 +0.0555553944905611,0.,0.,0.; 2515P 2546 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2517P 2547 +1.,1.,154.808074294198,-102.772908945234,7.11812499999999, 2517P 2548 +154.808074294198,-102.173605127167,7.11812499999999, 2517P 2549 +-0.0555553944905611,0.,0.,0.,0.; 2517P 2550 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2519P 2551 +-102.772908945234,8.73624999999999,154.808074294198, 2519P 2552 +-102.772908945234,7.11812499999999,0.,0.15,0.,0.,0.; 2519P 2553 +126,1,1,0,0,1,0,0.,0.,0.0740926997042853,0.0740926997042853,1., 2521P 2554 +1.,154.808074294198,-102.772908945234,8.73624999999999, 2521P 2555 +155.607349292068,-102.772926365844,8.73624999999999,0., 2521P 2556 +0.0740926997042853,0.,0.,0.; 2521P 2557 +126,1,1,0,0,1,0,-0.0740926997042853,-0.0740926997042853,0.,0., 2523P 2558 +1.,1.,155.607349292068,-102.772926365844,7.11812499999999, 2523P 2559 +154.808074294198,-102.772908945234,7.11812499999999, 2523P 2560 +-0.0740926997042853,0.,0.,0.,0.; 2523P 2561 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,155.607349292068, 2525P 2562 +-102.772926365844,8.73624999999999,155.607349292068, 2525P 2563 +-102.772926365844,7.11812499999999,0.,0.15,0.,0.,0.; 2525P 2564 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 2527P 2565 +155.607349292068,-102.772926365844,8.73624999999999, 2527P 2566 +155.607349292068,-115.573782067767,8.73624999999999,0., 2527P 2567 +1.186637840271,0.,0.,0.; 2527P 2568 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 2529P 2569 +155.607349292068,-115.573782067767,7.11812499999999, 2529P 2570 +155.607349292068,-102.772926365844,7.11812499999999, 2529P 2571 +-1.186637840271,0.,0.,0.,0.; 2529P 2572 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,155.607349292068, 2531P 2573 +-115.573782067767,8.73624999999999,155.607349292068, 2531P 2574 +-115.573782067767,7.11812499999999,0.,0.15,0.,0.,0.; 2531P 2575 +126,1,1,0,0,1,0,0.,0.,0.0740926997042853,0.0740926997042853,1., 2533P 2576 +1.,155.607349292068,-115.573782067767,8.73624999999999, 2533P 2577 +154.808074294198,-115.573764647157,8.73624999999999,0., 2533P 2578 +0.0740926997042853,0.,0.,0.; 2533P 2579 +126,1,1,0,0,1,0,-0.0740926997042853,-0.0740926997042853,0.,0., 2535P 2580 +1.,1.,154.808074294198,-115.573764647157,7.11812499999999, 2535P 2581 +155.607349292068,-115.573782067767,7.11812499999999, 2535P 2582 +-0.0740926997042853,0.,0.,0.,0.; 2535P 2583 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2537P 2584 +-115.573764647157,8.73624999999999,154.808074294198, 2537P 2585 +-115.573764647157,7.11812499999999,0.,0.15,0.,0.,0.; 2537P 2586 +126,1,1,0,0,1,0,0.,0.,0.0555747731526672,0.0555747731526672,1., 2539P 2587 +1.,154.808074294198,-115.573764647157,8.73624999999999, 2539P 2588 +154.808074294198,-116.173277512542,8.73624999999999,0., 2539P 2589 +0.0555747731526672,0.,0.,0.; 2539P 2590 +126,1,1,0,0,1,0,-0.0555747731526672,-0.0555747731526672,0.,0., 2541P 2591 +1.,1.,154.808074294198,-116.173277512542,7.11812499999999, 2541P 2592 +154.808074294198,-115.573764647157,7.11812499999999, 2541P 2593 +-0.0555747731526672,0.,0.,0.,0.; 2541P 2594 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2543P 2595 +-116.173277512542,8.73624999999999,154.808074294198, 2543P 2596 +-116.173277512542,7.11812499999999,0.,0.15,0.,0.,0.; 2543P 2597 +126,1,1,0,0,1,0,0.,0.,1.2979097143809,1.2979097143809,1.,1., 2545P 2598 +154.808074294198,-116.173277512542,8.73624999999999, 2545P 2599 +140.806873250314,-116.173277512542,8.73624999999999,0., 2545P 2600 +1.2979097143809,0.,0.,0.; 2545P 2601 +126,1,1,0,0,1,0,-1.2979097143809,-1.2979097143809,0.,0.,1.,1., 2547P 2602 +140.806873250314,-116.173277512542,7.11812499999999, 2547P 2603 +154.808074294198,-116.173277512542,7.11812499999999, 2547P 2604 +-1.2979097143809,0.,0.,0.,0.; 2547P 2605 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806873250314, 2549P 2606 +-116.173277512542,8.73624999999999,140.806873250314, 2549P 2607 +-116.173277512542,7.11812499999999,0.,0.15,0.,0.,0.; 2549P 2608 +126,1,1,0,0,1,0,0.,0.,0.0555747731541372,0.0555747731541372,1., 2551P 2609 +1.,140.806873250314,-116.173277512542,8.73624999999999, 2551P 2610 +140.806868895161,-115.573764647157,8.73624999999999,0., 2551P 2611 +0.0555747731541372,0.,0.,0.; 2551P 2612 +126,1,1,0,0,1,0,-0.0555747731541372,-0.0555747731541372,0.,0., 2553P 2613 +1.,1.,140.806868895161,-115.573764647157,7.11812499999999, 2553P 2614 +140.806873250314,-116.173277512542,7.11812499999999, 2553P 2615 +-0.0555747731541372,0.,0.,0.,0.; 2553P 2616 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806868895161, 2555P 2617 +-115.573764647157,8.73624999999999,140.806868895161, 2555P 2618 +-115.573764647157,7.11812499999999,0.,0.15,0.,0.,0.; 2555P 2619 +126,1,1,0,0,1,0,0.,0.,0.0740874512990315,0.0740874512990315,1., 2557P 2620 +1.,140.806868895161,-115.573764647157,8.73624999999999, 2557P 2621 +140.007650514273,-115.573764647157,8.73624999999999,0., 2557P 2622 +0.0740874512990315,0.,0.,0.; 2557P 2623 +126,1,1,0,0,1,0,-0.0740874512990315,-0.0740874512990315,0.,0., 2559P 2624 +1.,1.,140.007650514273,-115.573764647157,7.11812499999999, 2559P 2625 +140.806868895161,-115.573764647157,7.11812499999999, 2559P 2626 +-0.0740874512990315,0.,0.,0.,0.; 2559P 2627 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.007650514273, 2561P 2628 +-115.573764647157,8.73624999999999,140.007650514273, 2561P 2629 +-115.573764647157,7.11812499999999,0.,0.15,0.,0.,0.; 2561P 2630 +126,1,1,0,0,1,0,0.,0.,1.18663784027107,1.18663784027107,1.,1., 2563P 2631 +140.007650514273,-115.573764647157,8.73624999999999, 2563P 2632 +140.007654869426,-102.772908945234,8.73624999999999,0., 2563P 2633 +1.18663784027107,0.,0.,0.; 2563P 2634 +126,1,1,0,0,1,0,-1.18663784027107,-1.18663784027107,0.,0.,1.,1., 2565P 2635 +140.007654869426,-102.772908945234,7.11812499999999, 2565P 2636 +140.007650514273,-115.573764647157,7.11812499999999, 2565P 2637 +-1.18663784027107,0.,0.,0.,0.; 2565P 2638 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.007654869426, 2567P 2639 +-102.772908945234,8.73624999999999,140.007654869426, 2567P 2640 +-102.772908945234,7.11812499999999,0.,0.15,0.,0.,0.; 2567P 2641 +126,1,1,0,0,1,0,0.,0.,0.0740874513166314,0.0740874513166314,1., 2569P 2642 +1.,140.007654869426,-102.772908945234,8.73624999999999, 2569P 2643 +140.806873250314,-102.772926365844,8.73624999999999,0., 2569P 2644 +0.0740874513166314,0.,0.,0.; 2569P 2645 +126,1,1,0,0,1,0,-0.0740874513166314,-0.0740874513166314,0.,0., 2571P 2646 +1.,1.,140.806873250314,-102.772926365844,7.11812499999999, 2571P 2647 +140.007654869426,-102.772908945234,7.11812499999999, 2571P 2648 +-0.0740874513166314,0.,0.,0.,0.; 2571P 2649 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806873250314, 2573P 2650 +-102.772926365844,8.73624999999999,140.806873250314, 2573P 2651 +-102.772926365844,7.11812499999999,0.,0.15,0.,0.,0.; 2573P 2652 +126,1,1,0,0,1,0,0.,0.,0.0555553944920281,0.0555553944920281,1., 2575P 2653 +1.,140.806873250314,-102.772926365844,8.73624999999999, 2575P 2654 +140.806868895161,-102.173622547777,8.73624999999999,0., 2575P 2655 +0.0555553944920281,0.,0.,0.; 2575P 2656 +126,1,1,0,0,1,0,-0.0555553944920281,-0.0555553944920281,0.,0., 2577P 2657 +1.,1.,140.806868895161,-102.173622547777,7.11812499999999, 2577P 2658 +140.806873250314,-102.772926365844,7.11812499999999, 2577P 2659 +-0.0555553944920281,0.,0.,0.,0.; 2577P 2660 +126,1,1,0,0,1,0,0.,0.,1.29788872083129,1.29788872083129,1.,1., 2579P 2661 +121.756696066765,-102.173622547777,8.73624999999999, 2579P 2662 +135.757670642722,-102.173605127167,8.73624999999999,0., 2579P 2663 +1.29788872083129,0.,0.,0.; 2579P 2664 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 2581P 2665 +-102.173622547777,8.73624999999999,121.756696066765, 2581P 2666 +-102.173622547777,7.11812499999999,0.,0.15,0.,0.,0.; 2581P 2667 +126,1,1,0,0,1,0,-1.29788872083129,-1.29788872083129,0.,0.,1.,1., 2583P 2668 +135.757670642722,-102.173605127167,7.11812499999999, 2583P 2669 +121.756696066765,-102.173622547777,7.118125,-1.29788872083129, 2583P 2670 +0.,0.,0.,0.; 2583P 2671 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 2585P 2672 +-102.173605127167,8.73624999999999,135.757670642722, 2585P 2673 +-102.173605127167,7.11812499999999,0.,0.15,0.,0.,0.; 2585P 2674 +126,1,1,0,0,1,0,0.,0.,0.0681531397501622,0.0681531397501622,1., 2587P 2675 +1.,135.757670642722,-102.173605127167,8.73624999999999, 2587P 2676 +135.757670642722,-102.908807122222,8.73624999999999,0., 2587P 2677 +0.0681531397501622,0.,0.,0.; 2587P 2678 +126,1,1,0,0,1,0,-0.0681531397501622,-0.0681531397501622,0.,0., 2589P 2679 +1.,1.,135.757670642722,-102.908807122222,7.11812499999999, 2589P 2680 +135.757670642722,-102.173605127167,7.11812499999999, 2589P 2681 +-0.0681531397501622,0.,0.,0.,0.; 2589P 2682 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 2591P 2683 +-102.908807122222,8.73624999999999,135.757670642722, 2591P 2684 +-102.908807122222,7.11812499999999,0.,0.15,0.,0.,0.; 2591P 2685 +126,1,1,0,0,1,0,0.,0.,0.0740967369079586,0.0740967369079586,1., 2593P 2686 +1.,135.757670642722,-102.908807122222,8.73624999999999, 2593P 2687 +136.556989192117,-102.908807122222,8.73624999999999,0., 2593P 2688 +0.0740967369079586,0.,0.,0.; 2593P 2689 +126,1,1,0,0,1,0,-0.0740967369079586,-0.0740967369079586,0.,0., 2595P 2690 +1.,1.,136.556989192117,-102.908807122222,7.11812499999999, 2595P 2691 +135.757670642722,-102.908807122222,7.11812499999999, 2595P 2692 +-0.0740967369079586,0.,0.,0.,0.; 2595P 2693 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,136.556989192117, 2597P 2694 +-102.908807122222,8.73624999999999,136.556989192117, 2597P 2695 +-102.908807122222,7.11812499999999,0.,0.15,0.,0.,0.; 2597P 2696 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 2599P 2697 +136.556989192117,-102.908807122222,8.73624999999999, 2599P 2698 +136.556989192117,-115.709662824145,8.73624999999999,0., 2599P 2699 +1.186637840271,0.,0.,0.; 2599P 2700 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 2601P 2701 +136.556989192117,-115.709662824145,7.11812499999999, 2601P 2702 +136.556989192117,-102.908807122222,7.11812499999999, 2601P 2703 +-1.186637840271,0.,0.,0.,0.; 2601P 2704 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,136.556989192117, 2603P 2705 +-115.709662824145,8.73624999999999,136.556989192117, 2603P 2706 +-115.709662824145,7.11812499999999,0.,0.15,0.,0.,0.; 2603P 2707 +126,1,1,0,0,1,0,0.,0.,0.0740967369079586,0.0740967369079586,1., 2605P 2708 +1.,136.556989192117,-115.709662824145,8.73624999999999, 2605P 2709 +135.757670642722,-115.709662824145,8.73624999999999,0., 2605P 2710 +0.0740967369079586,0.,0.,0.; 2605P 2711 +126,1,1,0,0,1,0,-0.0740967369079586,-0.0740967369079586,0.,0., 2607P 2712 +1.,1.,135.757670642722,-115.709662824145,7.11812499999999, 2607P 2713 +136.556989192117,-115.709662824145,7.11812499999999, 2607P 2714 +-0.0740967369079586,0.,0.,0.,0.; 2607P 2715 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 2609P 2716 +-115.709662824145,8.73624999999999,135.757670642722, 2609P 2717 +-115.709662824145,7.11812499999999,0.,0.15,0.,0.,0.; 2609P 2718 +126,1,1,0,0,1,0,0.,0.,0.0431191380818667,0.0431191380818667,1., 2611P 2719 +1.,135.757670642722,-115.709662824145,8.73624999999999, 2611P 2720 +135.757670642722,-116.174810526203,8.73624999999999,0., 2611P 2721 +0.0431191380818667,0.,0.,0.; 2611P 2722 +126,1,1,0,0,1,0,-0.0431191380818667,-0.0431191380818667,0.,0., 2613P 2723 +1.,1.,135.757670642722,-116.174810526203,7.11812499999999, 2613P 2724 +135.757670642722,-115.709662824145,7.11812499999999, 2613P 2725 +-0.0431191380818667,0.,0.,0.,0.; 2613P 2726 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 2615P 2727 +-116.174810526203,8.73624999999999,135.757670642722, 2615P 2728 +-116.174810526203,7.11812499999999,0.,0.15,0.,0.,0.; 2615P 2729 +126,1,1,0,0,1,0,0.,0.,1.29788872083028,1.29788872083028,1.,1., 2617P 2730 +135.757670642722,-116.174810526203,8.73624999999999, 2617P 2731 +121.756696066765,-116.174810526203,8.73624999999999,0., 2617P 2732 +1.29788872083028,0.,0.,0.; 2617P 2733 +126,1,1,0,0,1,0,-1.29788872083028,-1.29788872083028,0.,0.,1.,1., 2619P 2734 +121.756696066765,-116.174810526203,7.118125,135.757670642722, 2619P 2735 +-116.174810526203,7.11812499999999,-1.29788872083028,0.,0.,0., 2619P 2736 +0.; 2619P 2737 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 2621P 2738 +-116.174810526203,8.73624999999999,121.756696066765, 2621P 2739 +-116.174810526203,7.11812499999999,0.,0.15,0.,0.,0.; 2621P 2740 +126,1,1,0,0,1,0,0.,0.,0.0555747731526708,0.0555747731526708,1., 2623P 2741 +1.,121.756696066765,-116.174810526203,8.73624999999999, 2623P 2742 +121.756696066765,-115.575297660819,8.73624999999999,0., 2623P 2743 +0.0555747731526708,0.,0.,0.; 2623P 2744 +126,1,1,0,0,1,0,-0.0555747731526708,-0.0555747731526708,0.,0., 2625P 2745 +1.,1.,121.756696066765,-115.575297660819,7.118125, 2625P 2746 +121.756696066765,-116.174810526203,7.118125,-0.0555747731526708, 2625P 2747 +0.,0.,0.,0.; 2625P 2748 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 2627P 2749 +-115.575297660819,8.73624999999999,121.756696066765, 2627P 2750 +-115.575297660819,7.11812499999999,0.,0.15,0.,0.,0.; 2627P 2751 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 2629P 2752 +1.,121.756696066765,-115.575297660819,8.73624999999999, 2629P 2753 +120.957281704017,-115.575297660819,8.73624999999999,0., 2629P 2754 +0.0741056187947589,0.,0.,0.; 2629P 2755 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 2631P 2756 +1.,1.,120.957281704017,-115.575297660819,7.118125, 2631P 2757 +121.756696066765,-115.575297660819,7.118125,-0.0741056187947589, 2631P 2758 +0.,0.,0.,0.; 2631P 2759 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,120.957281704017, 2633P 2760 +-115.575297660819,8.73624999999999,120.957281704017, 2633P 2761 +-115.575297660819,7.11812499999999,0.,0.15,0.,0.,0.; 2633P 2762 +126,1,1,0,0,1,0,0.,0.,1.1867799504598,1.1867799504598,1.,1., 2635P 2763 +120.957281704017,-115.575297660819,8.73624999999999, 2635P 2764 +120.957281704017,-102.772908945234,8.73624999999999,0., 2635P 2765 +1.1867799504598,0.,0.,0.; 2635P 2766 +126,1,1,0,0,1,0,-1.1867799504598,-1.1867799504598,0.,0.,1.,1., 2637P 2767 +120.957281704017,-102.772908945234,7.118125,120.957281704017, 2637P 2768 +-115.575297660819,7.118125,-1.1867799504598,0.,0.,0.,0.; 2637P 2769 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,120.957281704017, 2639P 2770 +-102.772908945234,8.73624999999999,120.957281704017, 2639P 2771 +-102.772908945234,7.11812499999999,0.,0.15,0.,0.,0.; 2639P 2772 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2641P 2773 +1.,120.957281704017,-102.772908945234,8.73624999999999, 2641P 2774 +121.756696066765,-102.772926365844,8.73624999999999,0., 2641P 2775 +0.0741056188123544,0.,0.,0.; 2641P 2776 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2643P 2777 +1.,1.,121.756696066765,-102.772926365844,7.118125, 2643P 2778 +120.957281704017,-102.772908945234,7.118125,-0.0741056188123544, 2643P 2779 +0.,0.,0.,0.; 2643P 2780 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 2645P 2781 +-102.772926365844,8.73624999999999,121.756696066765, 2645P 2782 +-102.772926365844,7.11812499999999,0.,0.15,0.,0.,0.; 2645P 2783 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2647P 2784 +1.,121.756696066765,-102.772926365844,8.73624999999999, 2647P 2785 +121.756696066765,-102.173622547777,8.73624999999999,0., 2647P 2786 +0.0555553944905611,0.,0.,0.; 2647P 2787 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2649P 2788 +1.,1.,121.756696066765,-102.173622547777,7.118125, 2649P 2789 +121.756696066765,-102.772926365844,7.118125,-0.0555553944905611, 2649P 2790 +0.,0.,0.,0.; 2649P 2791 +126,1,1,0,0,1,0,0.,0.,1.29788831710916,1.29788831710916,1.,1., 2651P 2792 +102.706327256509,-102.173622547777,8.73624999999999, 2651P 2793 +116.707297477313,-102.173605127167,8.73624999999999,0., 2651P 2794 +1.29788831710916,0.,0.,0.; 2651P 2795 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 2653P 2796 +-102.173622547777,8.73624999999999,102.706327256509, 2653P 2797 +-102.173622547777,7.118125,0.,0.15,0.,0.,0.; 2653P 2798 +126,1,1,0,0,1,0,-1.29788831710916,-1.29788831710916,0.,0.,1.,1., 2655P 2799 +116.707297477313,-102.173605127167,7.118125,102.706327256509, 2655P 2800 +-102.173622547777,7.118125,-1.29788831710916,0.,0.,0.,0.; 2655P 2801 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 2657P 2802 +-102.173605127167,8.73624999999999,116.707297477313, 2657P 2803 +-102.173605127167,7.11812499999999,0.,0.15,0.,0.,0.; 2657P 2804 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2659P 2805 +1.,116.707297477313,-102.173605127167,8.73624999999999, 2659P 2806 +116.707297477313,-102.772908945234,8.73624999999999,0., 2659P 2807 +0.0555553944905611,0.,0.,0.; 2659P 2808 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2661P 2809 +1.,1.,116.707297477313,-102.772908945234,7.118125, 2661P 2810 +116.707297477313,-102.173605127167,7.118125,-0.0555553944905611, 2661P 2811 +0.,0.,0.,0.; 2661P 2812 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 2663P 2813 +-102.772908945234,8.73624999999999,116.707297477313, 2663P 2814 +-102.772908945234,7.11812499999999,0.,0.15,0.,0.,0.; 2663P 2815 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2665P 2816 +1.,116.707297477313,-102.772908945234,8.73624999999999, 2665P 2817 +117.506711840062,-102.772926365844,8.73624999999999,0., 2665P 2818 +0.0741056188123544,0.,0.,0.; 2665P 2819 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2667P 2820 +1.,1.,117.506711840062,-102.772926365844,7.118125, 2667P 2821 +116.707297477313,-102.772908945234,7.118125,-0.0741056188123544, 2667P 2822 +0.,0.,0.,0.; 2667P 2823 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,117.506711840062, 2669P 2824 +-102.772926365844,8.73624999999999,117.506711840062, 2669P 2825 +-102.772926365844,7.11812499999999,0.,0.15,0.,0.,0.; 2669P 2826 +126,1,1,0,0,1,0,0.,0.,1.18663784027127,1.18663784027127,1.,1., 2671P 2827 +117.506711840062,-102.772926365844,8.73624999999999, 2671P 2828 +117.506720550367,-115.573782067767,8.73624999999999,0., 2671P 2829 +1.18663784027127,0.,0.,0.; 2671P 2830 +126,1,1,0,0,1,0,-1.18663784027127,-1.18663784027127,0.,0.,1.,1., 2673P 2831 +117.506720550367,-115.573782067767,7.118125,117.506711840062, 2673P 2832 +-102.772926365844,7.118125,-1.18663784027127,0.,0.,0.,0.; 2673P 2833 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,117.506720550367, 2675P 2834 +-115.573782067767,8.73624999999999,117.506720550367, 2675P 2835 +-115.573782067767,7.11812499999999,0.,0.15,0.,0.,0.; 2675P 2836 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2677P 2837 +1.,117.506720550367,-115.573782067767,8.73624999999999, 2677P 2838 +116.707306187618,-115.573764647157,8.73624999999999,0., 2677P 2839 +0.0741056188123544,0.,0.,0.; 2677P 2840 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2679P 2841 +1.,1.,116.707306187618,-115.573764647157,7.118125, 2679P 2842 +117.506720550367,-115.573782067767,7.118125,-0.0741056188123544, 2679P 2843 +0.,0.,0.,0.; 2679P 2844 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707306187618, 2681P 2845 +-115.573764647157,8.73624999999999,116.707306187618, 2681P 2846 +-115.573764647157,7.11812499999999,0.,0.15,0.,0.,0.; 2681P 2847 +126,1,1,0,0,1,0,0.,0.,0.0555747731585329,0.0555747731585329,1., 2683P 2848 +1.,116.707306187618,-115.573764647157,8.73624999999999, 2683P 2849 +116.707297477313,-116.173277512542,8.73624999999999,0., 2683P 2850 +0.0555747731585329,0.,0.,0.; 2683P 2851 +126,1,1,0,0,1,0,-0.0555747731585329,-0.0555747731585329,0.,0., 2685P 2852 +1.,1.,116.707297477313,-116.173277512542,7.118125, 2685P 2853 +116.707306187618,-115.573764647157,7.118125,-0.0555747731585329, 2685P 2854 +0.,0.,0.,0.; 2685P 2855 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 2687P 2856 +-116.173277512542,8.73624999999999,116.707297477313, 2687P 2857 +-116.173277512542,7.11812499999999,0.,0.15,0.,0.,0.; 2687P 2858 +126,1,1,0,0,1,0,0.,0.,1.29788831710816,1.29788831710816,1.,1., 2689P 2859 +116.707297477313,-116.173277512542,8.73624999999999, 2689P 2860 +102.706327256509,-116.173277512542,8.73624999999999,0., 2689P 2861 +1.29788831710816,0.,0.,0.; 2689P 2862 +126,1,1,0,0,1,0,-1.29788831710816,-1.29788831710816,0.,0.,1.,1., 2691P 2863 +102.706327256509,-116.173277512542,7.118125,116.707297477313, 2691P 2864 +-116.173277512542,7.118125,-1.29788831710816,0.,0.,0.,0.; 2691P 2865 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 2693P 2866 +-116.173277512542,8.73624999999999,102.706327256509, 2693P 2867 +-116.173277512542,7.118125,0.,0.15,0.,0.,0.; 2693P 2868 +126,1,1,0,0,1,0,0.,0.,0.0555747731526708,0.0555747731526708,1., 2695P 2869 +1.,102.706327256509,-116.173277512542,8.73624999999999, 2695P 2870 +102.706327256509,-115.573764647157,8.73624999999999,0., 2695P 2871 +0.0555747731526708,0.,0.,0.; 2695P 2872 +126,1,1,0,0,1,0,-0.0555747731526708,-0.0555747731526708,0.,0., 2697P 2873 +1.,1.,102.706327256509,-115.573764647157,7.118125, 2697P 2874 +102.706327256509,-116.173277512542,7.118125,-0.0555747731526708, 2697P 2875 +0.,0.,0.,0.; 2697P 2876 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 2699P 2877 +-115.573764647157,8.73624999999999,102.706327256509, 2699P 2878 +-115.573764647157,7.118125,0.,0.15,0.,0.,0.; 2699P 2879 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 2701P 2880 +1.,102.706327256509,-115.573764647157,8.73624999999999, 2701P 2881 +101.90691289376,-115.573764647157,8.73624999999999,0., 2701P 2882 +0.0741056187947589,0.,0.,0.; 2701P 2883 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 2703P 2884 +1.,1.,101.90691289376,-115.573764647157,7.118125, 2703P 2885 +102.706327256509,-115.573764647157,7.118125,-0.0741056187947589, 2703P 2886 +0.,0.,0.,0.; 2703P 2887 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,101.90691289376, 2705P 2888 +-115.573764647157,8.73624999999999,101.90691289376, 2705P 2889 +-115.573764647157,7.118125,0.,0.15,0.,0.,0.; 2705P 2890 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 2707P 2891 +101.90691289376,-115.573764647157,8.73624999999999, 2707P 2892 +101.90691289376,-102.772908945234,8.73624999999999,0., 2707P 2893 +1.186637840271,0.,0.,0.; 2707P 2894 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 2709P 2895 +101.90691289376,-102.772908945234,7.118125,101.90691289376, 2709P 2896 +-115.573764647157,7.118125,-1.186637840271,0.,0.,0.,0.; 2709P 2897 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,101.90691289376, 2711P 2898 +-102.772908945234,8.73624999999999,101.90691289376, 2711P 2899 +-102.772908945234,7.118125,0.,0.15,0.,0.,0.; 2711P 2900 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2713P 2901 +1.,101.90691289376,-102.772908945234,8.73624999999999, 2713P 2902 +102.706327256509,-102.772926365844,8.73624999999999,0., 2713P 2903 +0.0741056188123544,0.,0.,0.; 2713P 2904 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2715P 2905 +1.,1.,102.706327256509,-102.772926365844,7.118125, 2715P 2906 +101.90691289376,-102.772908945234,7.118125,-0.0741056188123544, 2715P 2907 +0.,0.,0.,0.; 2715P 2908 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 2717P 2909 +-102.772926365844,8.73624999999999,102.706327256509, 2717P 2910 +-102.772926365844,7.118125,0.,0.15,0.,0.,0.; 2717P 2911 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2719P 2912 +1.,102.706327256509,-102.772926365844,8.73624999999999, 2719P 2913 +102.706327256509,-102.173622547777,8.73624999999999,0., 2719P 2914 +0.0555553944905611,0.,0.,0.; 2719P 2915 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2721P 2916 +1.,1.,102.706327256509,-102.173622547777,7.118125, 2721P 2917 +102.706327256509,-102.772926365844,7.118125,-0.0555553944905611, 2721P 2918 +0.,0.,0.,0.; 2721P 2919 +126,1,1,0,0,1,0,0.,0.,1.29788831710916,1.29788831710916,1.,1., 2723P 2920 +83.6559584462526,-102.173622547777,8.73625,97.6569286670568, 2723P 2921 +-102.173605127167,8.73624999999999,0.,1.29788831710916,0.,0.,0.; 2723P 2922 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 2725P 2923 +-102.173622547777,8.73625,83.6559584462526,-102.173622547777, 2725P 2924 +7.118125,0.,0.15,0.,0.,0.; 2725P 2925 +126,1,1,0,0,1,0,-1.29788831710916,-1.29788831710916,0.,0.,1.,1., 2727P 2926 +97.6569286670568,-102.173605127167,7.118125,83.6559584462526, 2727P 2927 +-102.173622547777,7.118125,-1.29788831710916,0.,0.,0.,0.; 2727P 2928 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 2729P 2929 +-102.173605127167,8.73624999999999,97.6569286670568, 2729P 2930 +-102.173605127167,7.118125,0.,0.15,0.,0.,0.; 2729P 2931 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2731P 2932 +1.,97.6569286670568,-102.173605127167,8.73624999999999, 2731P 2933 +97.6569286670568,-102.772908945234,8.73624999999999,0., 2731P 2934 +0.0555553944905611,0.,0.,0.; 2731P 2935 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2733P 2936 +1.,1.,97.6569286670568,-102.772908945234,7.118125, 2733P 2937 +97.6569286670568,-102.173605127167,7.118125,-0.0555553944905611, 2733P 2938 +0.,0.,0.,0.; 2733P 2939 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 2735P 2940 +-102.772908945234,8.73624999999999,97.6569286670568, 2735P 2941 +-102.772908945234,7.118125,0.,0.15,0.,0.,0.; 2735P 2942 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2737P 2943 +1.,97.6569286670568,-102.772908945234,8.73624999999999, 2737P 2944 +98.4563430298053,-102.772926365844,8.73624999999999,0., 2737P 2945 +0.0741056188123544,0.,0.,0.; 2737P 2946 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2739P 2947 +1.,1.,98.4563430298053,-102.772926365844,7.118125, 2739P 2948 +97.6569286670568,-102.772908945234,7.118125,-0.0741056188123544, 2739P 2949 +0.,0.,0.,0.; 2739P 2950 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,98.4563430298053, 2741P 2951 +-102.772926365844,8.73624999999999,98.4563430298053, 2741P 2952 +-102.772926365844,7.118125,0.,0.15,0.,0.,0.; 2741P 2953 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 2743P 2954 +98.4563430298053,-102.772926365844,8.73624999999999, 2743P 2955 +98.4563430298053,-115.573782067767,8.73624999999999,0., 2743P 2956 +1.186637840271,0.,0.,0.; 2743P 2957 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 2745P 2958 +98.4563430298053,-115.573782067767,7.118125,98.4563430298053, 2745P 2959 +-102.772926365844,7.118125,-1.186637840271,0.,0.,0.,0.; 2745P 2960 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,98.4563430298053, 2747P 2961 +-115.573782067767,8.73624999999999,98.4563430298053, 2747P 2962 +-115.573782067767,7.118125,0.,0.15,0.,0.,0.; 2747P 2963 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2749P 2964 +1.,98.4563430298053,-115.573782067767,8.73624999999999, 2749P 2965 +97.6569286670568,-115.573764647157,8.73624999999999,0., 2749P 2966 +0.0741056188123544,0.,0.,0.; 2749P 2967 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2751P 2968 +1.,1.,97.6569286670568,-115.573764647157,7.118125, 2751P 2969 +98.4563430298053,-115.573782067767,7.118125,-0.0741056188123544, 2751P 2970 +0.,0.,0.,0.; 2751P 2971 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 2753P 2972 +-115.573764647157,8.73624999999999,97.6569286670568, 2753P 2973 +-115.573764647157,7.118125,0.,0.15,0.,0.,0.; 2753P 2974 +126,1,1,0,0,1,0,0.,0.,0.0555747731526672,0.0555747731526672,1., 2755P 2975 +1.,97.6569286670568,-115.573764647157,8.73624999999999, 2755P 2976 +97.6569286670568,-116.173277512542,8.73624999999999,0., 2755P 2977 +0.0555747731526672,0.,0.,0.; 2755P 2978 +126,1,1,0,0,1,0,-0.0555747731526672,-0.0555747731526672,0.,0., 2757P 2979 +1.,1.,97.6569286670568,-116.173277512542,7.118125, 2757P 2980 +97.6569286670568,-115.573764647157,7.118125,-0.0555747731526672, 2757P 2981 +0.,0.,0.,0.; 2757P 2982 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 2759P 2983 +-116.173277512542,8.73624999999999,97.6569286670568, 2759P 2984 +-116.173277512542,7.118125,0.,0.15,0.,0.,0.; 2759P 2985 +126,1,1,0,0,1,0,0.,0.,1.29788912455241,1.29788912455241,1.,1., 2761P 2986 +97.6569286670568,-116.173277512542,8.73624999999999, 2761P 2987 +83.6559497359477,-116.173277512542,8.73625,0.,1.29788912455241, 2761P 2988 +0.,0.,0.; 2761P 2989 +126,1,1,0,0,1,0,-1.29788912455241,-1.29788912455241,0.,0.,1.,1., 2763P 2990 +83.6559497359477,-116.173277512542,7.118125,97.6569286670568, 2763P 2991 +-116.173277512542,7.118125,-1.29788912455241,0.,0.,0.,0.; 2763P 2992 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559497359477, 2765P 2993 +-116.173277512542,8.73625,83.6559497359477,-116.173277512542, 2765P 2994 +7.118125,0.,0.15,0.,0.,0.; 2765P 2995 +126,1,1,0,0,1,0,0.,0.,0.0555747731585365,0.0555747731585365,1., 2767P 2996 +1.,83.6559497359477,-116.173277512542,8.73625,83.6559584462526, 2767P 2997 +-115.573764647157,8.73625,0.,0.0555747731585365,0.,0.,0.; 2767P 2998 +126,1,1,0,0,1,0,-0.0555747731585365,-0.0555747731585365,0.,0., 2769P 2999 +1.,1.,83.6559584462526,-115.573764647157,7.118125, 2769P 3000 +83.6559497359477,-116.173277512542,7.118125,-0.0555747731585365, 2769P 3001 +0.,0.,0.,0.; 2769P 3002 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 2771P 3003 +-115.573764647157,8.73625,83.6559584462526,-115.573764647157, 2771P 3004 +7.118125,0.,0.15,0.,0.,0.; 2771P 3005 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 2773P 3006 +1.,83.6559584462526,-115.573764647157,8.73625,82.8565440835041, 2773P 3007 +-115.573764647157,8.73625,0.,0.0741056187947589,0.,0.,0.; 2773P 3008 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 2775P 3009 +1.,1.,82.8565440835041,-115.573764647157,7.118125, 2775P 3010 +83.6559584462526,-115.573764647157,7.118125,-0.0741056187947589, 2775P 3011 +0.,0.,0.,0.; 2775P 3012 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,82.8565440835042, 2777P 3013 +-115.573764647157,8.73625,82.8565440835042,-115.573764647157, 2777P 3014 +7.118125,0.,0.15,0.,0.,0.; 2777P 3015 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 2779P 3016 +82.8565440835042,-115.573764647157,8.73625,82.8565440835042, 2779P 3017 +-102.772908945234,8.73625,0.,1.186637840271,0.,0.,0.; 2779P 3018 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 2781P 3019 +82.8565440835042,-102.772908945234,7.118125,82.8565440835042, 2781P 3020 +-115.573764647157,7.118125,-1.186637840271,0.,0.,0.,0.; 2781P 3021 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,82.8565440835042, 2783P 3022 +-102.772908945234,8.73625,82.8565440835042,-102.772908945234, 2783P 3023 +7.118125,0.,0.15,0.,0.,0.; 2783P 3024 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2785P 3025 +1.,82.8565440835042,-102.772908945234,8.73625,83.6559584462526, 2785P 3026 +-102.772926365844,8.73625,0.,0.0741056188123544,0.,0.,0.; 2785P 3027 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2787P 3028 +1.,1.,83.6559584462526,-102.772926365844,7.118125, 2787P 3029 +82.8565440835042,-102.772908945234,7.118125,-0.0741056188123544, 2787P 3030 +0.,0.,0.,0.; 2787P 3031 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 2789P 3032 +-102.772926365844,8.73625,83.6559584462526,-102.772926365844, 2789P 3033 +7.118125,0.,0.15,0.,0.,0.; 2789P 3034 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2791P 3035 +1.,83.6559584462526,-102.772926365844,8.73625,83.6559584462526, 2791P 3036 +-102.173622547777,8.73625,0.,0.0555553944905611,0.,0.,0.; 2791P 3037 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2793P 3038 +1.,1.,83.6559584462526,-102.173622547777,7.118125, 2793P 3039 +83.6559584462526,-102.772926365844,7.118125,-0.0555553944905611, 2793P 3040 +0.,0.,0.,0.; 2793P 3041 +126,1,1,0,0,1,0,0.,0.,1.29788831710916,1.29788831710916,1.,1., 2795P 3042 +64.6055896359963,-102.173622547777,8.73625,78.6065598568005, 2795P 3043 +-102.173605127167,8.73625,0.,1.29788831710916,0.,0.,0.; 2795P 3044 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 2797P 3045 +-102.173622547777,8.73625,64.6055896359963,-102.173622547777, 2797P 3046 +7.118125,0.,0.15,0.,0.,0.; 2797P 3047 +126,1,1,0,0,1,0,-1.29788831710916,-1.29788831710916,0.,0.,1.,1., 2799P 3048 +78.6065598568005,-102.173605127167,7.118125,64.6055896359963, 2799P 3049 +-102.173622547777,7.118125,-1.29788831710916,0.,0.,0.,0.; 2799P 3050 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 2801P 3051 +-102.173605127167,8.73625,78.6065598568005,-102.173605127167, 2801P 3052 +7.118125,0.,0.15,0.,0.,0.; 2801P 3053 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2803P 3054 +1.,78.6065598568005,-102.173605127167,8.73625,78.6065598568005, 2803P 3055 +-102.772908945234,8.73625,0.,0.0555553944905611,0.,0.,0.; 2803P 3056 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2805P 3057 +1.,1.,78.6065598568005,-102.772908945234,7.118125, 2805P 3058 +78.6065598568005,-102.173605127167,7.118125,-0.0555553944905611, 2805P 3059 +0.,0.,0.,0.; 2805P 3060 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 2807P 3061 +-102.772908945234,8.73625,78.6065598568005,-102.772908945234, 2807P 3062 +7.118125,0.,0.15,0.,0.,0.; 2807P 3063 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2809P 3064 +1.,78.6065598568005,-102.772908945234,8.73625,79.405974219549, 2809P 3065 +-102.772926365844,8.73625,0.,0.0741056188123544,0.,0.,0.; 2809P 3066 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2811P 3067 +1.,1.,79.405974219549,-102.772926365844,7.118125, 2811P 3068 +78.6065598568005,-102.772908945234,7.118125,-0.0741056188123544, 2811P 3069 +0.,0.,0.,0.; 2811P 3070 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,79.4059742195489, 2813P 3071 +-102.772926365844,8.73625,79.4059742195489,-102.772926365844, 2813P 3072 +7.118125,0.,0.15,0.,0.,0.; 2813P 3073 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 2815P 3074 +79.4059742195489,-102.772926365844,8.73625,79.4059742195489, 2815P 3075 +-115.573782067767,8.73625,0.,1.186637840271,0.,0.,0.; 2815P 3076 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 2817P 3077 +79.4059742195489,-115.573782067767,7.118125,79.4059742195489, 2817P 3078 +-102.772926365844,7.118125,-1.186637840271,0.,0.,0.,0.; 2817P 3079 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,79.4059742195489, 2819P 3080 +-115.573782067767,8.73625,79.4059742195489,-115.573782067767, 2819P 3081 +7.118125,0.,0.15,0.,0.,0.; 2819P 3082 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2821P 3083 +1.,79.4059742195489,-115.573782067767,8.73625,78.6065598568005, 2821P 3084 +-115.573764647157,8.73625,0.,0.0741056188123544,0.,0.,0.; 2821P 3085 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2823P 3086 +1.,1.,78.6065598568005,-115.573764647157,7.118125, 2823P 3087 +79.4059742195489,-115.573782067767,7.118125,-0.0741056188123544, 2823P 3088 +0.,0.,0.,0.; 2823P 3089 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 2825P 3090 +-115.573764647157,8.73625,78.6065598568005,-115.573764647157, 2825P 3091 +7.118125,0.,0.15,0.,0.,0.; 2825P 3092 +126,1,1,0,0,1,0,0.,0.,0.0555747731526672,0.0555747731526672,1., 2827P 3093 +1.,78.6065598568005,-115.573764647157,8.73625,78.6065598568005, 2827P 3094 +-116.173277512542,8.73625,0.,0.0555747731526672,0.,0.,0.; 2827P 3095 +126,1,1,0,0,1,0,-0.0555747731526672,-0.0555747731526672,0.,0., 2829P 3096 +1.,1.,78.6065598568005,-116.173277512542,7.118125, 2829P 3097 +78.6065598568005,-115.573764647157,7.118125,-0.0555747731526672, 2829P 3098 +0.,0.,0.,0.; 2829P 3099 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 2831P 3100 +-116.173277512542,8.73625,78.6065598568005,-116.173277512542, 2831P 3101 +7.118125,0.,0.15,0.,0.,0.; 2831P 3102 +126,1,1,0,0,1,0,0.,0.,1.29788831710816,1.29788831710816,1.,1., 2833P 3103 +78.6065598568005,-116.173277512542,8.73625,64.6055896359963, 2833P 3104 +-116.173277512542,8.73625,0.,1.29788831710816,0.,0.,0.; 2833P 3105 +126,1,1,0,0,1,0,-1.29788831710816,-1.29788831710816,0.,0.,1.,1., 2835P 3106 +64.6055896359963,-116.173277512542,7.118125,78.6065598568005, 2835P 3107 +-116.173277512542,7.118125,-1.29788831710816,0.,0.,0.,0.; 2835P 3108 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 2837P 3109 +-116.173277512542,8.73625,64.6055896359963,-116.173277512542, 2837P 3110 +7.118125,0.,0.15,0.,0.,0.; 2837P 3111 +126,1,1,0,0,1,0,0.,0.,0.0555747731526708,0.0555747731526708,1., 2839P 3112 +1.,64.6055896359963,-116.173277512542,8.73625,64.6055896359963, 2839P 3113 +-115.573764647157,8.73625,0.,0.0555747731526708,0.,0.,0.; 2839P 3114 +126,1,1,0,0,1,0,-0.0555747731526708,-0.0555747731526708,0.,0., 2841P 3115 +1.,1.,64.6055896359963,-115.573764647157,7.118125, 2841P 3116 +64.6055896359963,-116.173277512542,7.118125,-0.0555747731526708, 2841P 3117 +0.,0.,0.,0.; 2841P 3118 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 2843P 3119 +-115.573764647157,8.73625,64.6055896359963,-115.573764647157, 2843P 3120 +7.118125,0.,0.15,0.,0.,0.; 2843P 3121 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 2845P 3122 +1.,64.6055896359963,-115.573764647157,8.73625,63.8061752732478, 2845P 3123 +-115.573764647157,8.73625,0.,0.0741056187947589,0.,0.,0.; 2845P 3124 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 2847P 3125 +1.,1.,63.8061752732478,-115.573764647157,7.118125, 2847P 3126 +64.6055896359963,-115.573764647157,7.118125,-0.0741056187947589, 2847P 3127 +0.,0.,0.,0.; 2847P 3128 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,63.8061752732478, 2849P 3129 +-115.573764647157,8.73625,63.8061752732478,-115.573764647157, 2849P 3130 +7.118125,0.,0.15,0.,0.,0.; 2849P 3131 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 2851P 3132 +63.8061752732478,-115.573764647157,8.73625,63.8061752732478, 2851P 3133 +-102.772908945234,8.73625,0.,1.186637840271,0.,0.,0.; 2851P 3134 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 2853P 3135 +63.8061752732478,-102.772908945234,7.118125,63.8061752732478, 2853P 3136 +-115.573764647157,7.118125,-1.186637840271,0.,0.,0.,0.; 2853P 3137 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,63.8061752732478, 2855P 3138 +-102.772908945234,8.73625,63.8061752732478,-102.772908945234, 2855P 3139 +7.118125,0.,0.15,0.,0.,0.; 2855P 3140 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2857P 3141 +1.,63.8061752732478,-102.772908945234,8.73625,64.6055896359963, 2857P 3142 +-102.772926365844,8.73625,0.,0.0741056188123544,0.,0.,0.; 2857P 3143 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2859P 3144 +1.,1.,64.6055896359963,-102.772926365844,7.118125, 2859P 3145 +63.8061752732478,-102.772908945234,7.118125,-0.0741056188123544, 2859P 3146 +0.,0.,0.,0.; 2859P 3147 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 2861P 3148 +-102.772926365844,8.73625,64.6055896359963,-102.772926365844, 2861P 3149 +7.118125,0.,0.15,0.,0.,0.; 2861P 3150 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2863P 3151 +1.,64.6055896359963,-102.772926365844,8.73625,64.6055896359963, 2863P 3152 +-102.173622547777,8.73625,0.,0.0555553944905611,0.,0.,0.; 2863P 3153 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2865P 3154 +1.,1.,64.6055896359963,-102.173622547777,7.118125, 2865P 3155 +64.6055896359963,-102.772926365844,7.118125,-0.0555553944905611, 2865P 3156 +0.,0.,0.,0.; 2865P 3157 +126,1,1,0,0,1,0,0.,0.,1.29779546101989,1.29779546101989,1.,1., 2867P 3158 +45.556222510803,-102.173622547777,8.73625,59.5561910465442, 2867P 3159 +-102.173605127167,8.73625,0.,1.29779546101989,0.,0.,0.; 2867P 3160 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 2869P 3161 +-102.173622547777,8.73625,45.556222510803,-102.173622547777, 2869P 3162 +7.118125,0.,0.15,0.,0.,0.; 2869P 3163 +126,1,1,0,0,1,0,-1.29779546101989,-1.29779546101989,0.,0.,1.,1., 2871P 3164 +59.5561910465442,-102.173605127167,7.118125,45.556222510803, 2871P 3165 +-102.173622547777,7.118125,-1.29779546101989,0.,0.,0.,0.; 2871P 3166 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 2873P 3167 +-102.173605127167,8.73625,59.5561910465442,-102.173605127167, 2873P 3168 +7.118125,0.,0.15,0.,0.,0.; 2873P 3169 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2875P 3170 +1.,59.5561910465442,-102.173605127167,8.73625,59.5561910465442, 2875P 3171 +-102.772908945234,8.73625,0.,0.0555553944905611,0.,0.,0.; 2875P 3172 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2877P 3173 +1.,1.,59.5561910465442,-102.772908945234,7.118125, 2877P 3174 +59.5561910465442,-102.173605127167,7.118125,-0.0555553944905611, 2877P 3175 +0.,0.,0.,0.; 2877P 3176 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 2879P 3177 +-102.772908945234,8.73625,59.5561910465442,-102.772908945234, 2879P 3178 +7.118125,0.,0.15,0.,0.,0.; 2879P 3179 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2881P 3180 +1.,59.5561910465442,-102.772908945234,8.73625,60.3556054092927, 2881P 3181 +-102.772926365844,8.73625,0.,0.0741056188123544,0.,0.,0.; 2881P 3182 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2883P 3183 +1.,1.,60.3556054092927,-102.772926365844,7.118125, 2883P 3184 +59.5561910465442,-102.772908945234,7.118125,-0.0741056188123544, 2883P 3185 +0.,0.,0.,0.; 2883P 3186 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,60.3556054092926, 2885P 3187 +-102.772926365844,8.73625,60.3556054092926,-102.772926365844, 2885P 3188 +7.118125,0.,0.15,0.,0.,0.; 2885P 3189 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 2887P 3190 +60.3556054092926,-102.772926365844,8.73625,60.3556054092926, 2887P 3191 +-115.573782067767,8.73625,0.,1.186637840271,0.,0.,0.; 2887P 3192 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 2889P 3193 +60.3556054092926,-115.573782067767,7.118125,60.3556054092926, 2889P 3194 +-102.772926365844,7.118125,-1.186637840271,0.,0.,0.,0.; 2889P 3195 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,60.3556054092926, 2891P 3196 +-115.573782067767,8.73625,60.3556054092926,-115.573782067767, 2891P 3197 +7.118125,0.,0.15,0.,0.,0.; 2891P 3198 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 2893P 3199 +1.,60.3556054092926,-115.573782067767,8.73625,59.5561910465442, 2893P 3200 +-115.573764647157,8.73625,0.,0.0741056188123544,0.,0.,0.; 2893P 3201 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 2895P 3202 +1.,1.,59.5561910465442,-115.573764647157,7.118125, 2895P 3203 +60.3556054092926,-115.573782067767,7.118125,-0.0741056188123544, 2895P 3204 +0.,0.,0.,0.; 2895P 3205 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 2897P 3206 +-115.573764647157,8.73625,59.5561910465442,-115.573764647157, 2897P 3207 +7.118125,0.,0.15,0.,0.,0.; 2897P 3208 +126,1,1,0,0,1,0,0.,0.,0.0555747731526672,0.0555747731526672,1., 2899P 3209 +1.,59.5561910465442,-115.573764647157,8.73625,59.5561910465442, 2899P 3210 +-116.173277512542,8.73625,0.,0.0555747731526672,0.,0.,0.; 2899P 3211 +126,1,1,0,0,1,0,-0.0555747731526672,-0.0555747731526672,0.,0., 2901P 3212 +1.,1.,59.5561910465442,-116.173277512542,7.118125, 2901P 3213 +59.5561910465442,-115.573764647157,7.118125,-0.0555747731526672, 2901P 3214 +0.,0.,0.,0.; 2901P 3215 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 2903P 3216 +-116.173277512542,8.73625,59.5561910465442,-116.173277512542, 2903P 3217 +7.118125,0.,0.15,0.,0.,0.; 2903P 3218 +126,1,1,0,0,1,0,0.,0.,1.29779546101888,1.29779546101888,1.,1., 2905P 3219 +59.5561910465442,-116.173277512542,8.73625,45.556222510803, 2905P 3220 +-116.173277512542,8.73625,0.,1.29779546101888,0.,0.,0.; 2905P 3221 +126,1,1,0,0,1,0,-1.29779546101888,-1.29779546101888,0.,0.,1.,1., 2907P 3222 +45.556222510803,-116.173277512542,7.11812500000001, 2907P 3223 +59.5561910465442,-116.173277512542,7.118125,-1.29779546101888, 2907P 3224 +0.,0.,0.,0.; 2907P 3225 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 2909P 3226 +-116.173277512542,8.73625,45.556222510803,-116.173277512542, 2909P 3227 +7.118125,0.,0.15,0.,0.,0.; 2909P 3228 +126,1,1,0,0,1,0,0.,0.,0.0555747731526708,0.0555747731526708,1., 2911P 3229 +1.,45.556222510803,-116.173277512542,8.73625,45.556222510803, 2911P 3230 +-115.573764647157,8.73625,0.,0.0555747731526708,0.,0.,0.; 2911P 3231 +126,1,1,0,0,1,0,-0.0555747731526708,-0.0555747731526708,0.,0., 2913P 3232 +1.,1.,45.556222510803,-115.573764647157,7.118125, 2913P 3233 +45.556222510803,-116.173277512542,7.118125,-0.0555747731526708, 2913P 3234 +0.,0.,0.,0.; 2913P 3235 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 2915P 3236 +-115.573764647157,8.73625,45.556222510803,-115.573764647157, 2915P 3237 +7.118125,0.,0.15,0.,0.,0.; 2915P 3238 +126,1,1,0,0,1,0,0.,0.,0.0741621398925787,0.0741621398925787,1., 2917P 3239 +1.,45.556222510803,-115.573764647157,8.73625,44.7561984267118, 2917P 3240 +-115.573764647157,8.73625,0.,0.0741621398925787,0.,0.,0.; 2917P 3241 +126,1,1,0,0,1,0,-0.0741621398925787,-0.0741621398925787,0.,0., 2919P 3242 +1.,1.,44.7561984267118,-115.573764647157,7.118125, 2919P 3243 +45.556222510803,-115.573764647157,7.118125,-0.0741621398925787, 2919P 3244 +0.,0.,0.,0.; 2919P 3245 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,44.7561984267118, 2921P 3246 +-115.573764647157,8.73625,44.7561984267118,-115.573764647157, 2921P 3247 +7.118125,0.,0.15,0.,0.,0.; 2921P 3248 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 2923P 3249 +44.7561984267118,-115.573764647157,8.73625,44.7561984267118, 2923P 3250 +-102.772908945234,8.73625,0.,1.186637840271,0.,0.,0.; 2923P 3251 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 2925P 3252 +44.7561984267118,-102.772908945234,7.118125,44.7561984267118, 2925P 3253 +-115.573764647157,7.118125,-1.186637840271,0.,0.,0.,0.; 2925P 3254 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,44.7561984267118, 2927P 3255 +-102.772908945234,8.73625,44.7561984267118,-102.772908945234, 2927P 3256 +7.118125,0.,0.15,0.,0.,0.; 2927P 3257 +126,1,1,0,0,1,0,0.,0.,0.0741621399101609,0.0741621399101609,1., 2929P 3258 +1.,44.7561984267118,-102.772908945234,8.73625,45.556222510803, 2929P 3259 +-102.772926365844,8.73625,0.,0.0741621399101609,0.,0.,0.; 2929P 3260 +126,1,1,0,0,1,0,-0.0741621399101609,-0.0741621399101609,0.,0., 2931P 3261 +1.,1.,45.556222510803,-102.772926365844,7.118125, 2931P 3262 +44.7561984267118,-102.772908945234,7.118125,-0.0741621399101609, 2931P 3263 +0.,0.,0.,0.; 2931P 3264 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 2933P 3265 +-102.772926365844,8.73625,45.556222510803,-102.772926365844, 2933P 3266 +7.118125,0.,0.15,0.,0.,0.; 2933P 3267 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2935P 3268 +1.,45.556222510803,-102.772926365844,8.73625,45.556222510803, 2935P 3269 +-102.173622547777,8.73625,0.,0.0555553944905611,0.,0.,0.; 2935P 3270 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2937P 3271 +1.,1.,45.556222510803,-102.173622547777,7.118125, 2937P 3272 +45.556222510803,-102.772926365844,7.118125,-0.0555553944905611, 2937P 3273 +0.,0.,0.,0.; 2937P 3274 +126,1,1,0,0,1,0,0.,0.,1.29791011810303,1.29791011810303,1.,1., 2939P 3275 +140.806868895161,-83.1232450272155,8.73624999999999, 2939P 3276 +154.808074294198,-83.1232450272155,8.73624999999999,0., 2939P 3277 +1.29791011810303,0.,0.,0.; 2939P 3278 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806868895161, 2941P 3279 +-83.1232450272155,8.73624999999999,140.806868895161, 2941P 3280 +-83.1232450272155,7.11812499999999,0.,0.15,0.,0.,0.; 2941P 3281 +126,1,1,0,0,1,0,-1.29791011810303,-1.29791011810303,0.,0.,1.,1., 2943P 3282 +154.808074294198,-83.1232450272155,7.11812499999999, 2943P 3283 +140.806868895161,-83.1232450272155,7.11812499999999, 2943P 3284 +-1.29791011810303,0.,0.,0.,0.; 2943P 3285 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2945P 3286 +-83.1232450272156,8.73624999999999,154.808074294198, 2945P 3287 +-83.1232450272156,7.11812499999999,0.,0.15,0.,0.,0.; 2945P 3288 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2947P 3289 +1.,154.808074294198,-83.1232450272156,8.73624999999999, 2947P 3290 +154.808074294198,-83.7225488452825,8.73624999999999,0., 2947P 3291 +0.0555553944905611,0.,0.,0.; 2947P 3292 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2949P 3293 +1.,1.,154.808074294198,-83.7225488452825,7.11812499999999, 2949P 3294 +154.808074294198,-83.1232450272156,7.11812499999999, 2949P 3295 +-0.0555553944905611,0.,0.,0.,0.; 2949P 3296 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2951P 3297 +-83.7225488452825,8.73624999999999,154.808074294198, 2951P 3298 +-83.7225488452825,7.11812499999999,0.,0.15,0.,0.,0.; 2951P 3299 +126,1,1,0,0,1,0,0.,0.,0.0740926996866866,0.0740926996866866,1., 2953P 3300 +1.,154.808074294198,-83.7225488452825,8.73624999999999, 2953P 3301 +155.607349292068,-83.7225488452825,8.73624999999999,0., 2953P 3302 +0.0740926996866866,0.,0.,0.; 2953P 3303 +126,1,1,0,0,1,0,-0.0740926996866866,-0.0740926996866866,0.,0., 2955P 3304 +1.,1.,155.607349292068,-83.7225488452825,7.11812499999999, 2955P 3305 +154.808074294198,-83.7225488452825,7.11812499999999, 2955P 3306 +-0.0740926996866866,0.,0.,0.,0.; 2955P 3307 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,155.607349292068, 2957P 3308 +-83.7225488452825,8.73624999999999,155.607349292068, 2957P 3309 +-83.7225488452825,7.11812499999999,0.,0.15,0.,0.,0.; 2957P 3310 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 2959P 3311 +155.607349292068,-83.7225488452825,8.73624999999999, 2959P 3312 +155.607349292068,-96.5234045472058,8.73624999999999,0., 2959P 3313 +1.186637840271,0.,0.,0.; 2959P 3314 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 2961P 3315 +155.607349292068,-96.5234045472058,7.11812499999999, 2961P 3316 +155.607349292068,-83.7225488452825,7.11812499999999, 2961P 3317 +-1.186637840271,0.,0.,0.,0.; 2961P 3318 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,155.607349292068, 2963P 3319 +-96.5234045472058,8.73624999999999,155.607349292068, 2963P 3320 +-96.5234045472058,7.11812499999999,0.,0.15,0.,0.,0.; 2963P 3321 +126,1,1,0,0,1,0,0.,0.,0.0740926996866866,0.0740926996866866,1., 2965P 3322 +1.,155.607349292068,-96.5234045472058,8.73624999999999, 2965P 3323 +154.808074294198,-96.5234045472058,8.73624999999999,0., 2965P 3324 +0.0740926996866866,0.,0.,0.; 2965P 3325 +126,1,1,0,0,1,0,-0.0740926996866866,-0.0740926996866866,0.,0., 2967P 3326 +1.,1.,154.808074294198,-96.5234045472058,7.11812499999999, 2967P 3327 +155.607349292068,-96.5234045472058,7.11812499999999, 2967P 3328 +-0.0740926996866866,0.,0.,0.,0.; 2967P 3329 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2969P 3330 +-96.5234045472058,8.73624999999999,154.808074294198, 2969P 3331 +-96.5234045472058,7.11812499999999,0.,0.15,0.,0.,0.; 2969P 3332 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 2971P 3333 +1.,154.808074294198,-96.5234045472058,8.73624999999999, 2971P 3334 +154.808074294198,-97.1227083652728,8.73624999999999,0., 2971P 3335 +0.0555553944905611,0.,0.,0.; 2971P 3336 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 2973P 3337 +1.,1.,154.808074294198,-97.1227083652728,7.11812499999999, 2973P 3338 +154.808074294198,-96.5234045472058,7.11812499999999, 2973P 3339 +-0.0555553944905611,0.,0.,0.,0.; 2973P 3340 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 2975P 3341 +-97.1227083652727,8.73624999999999,154.808074294198, 2975P 3342 +-97.1227083652727,7.11812499999999,0.,0.15,0.,0.,0.; 2975P 3343 +126,1,1,0,0,1,0,0.,0.,1.2979097143809,1.2979097143809,1.,1., 2977P 3344 +154.808074294198,-97.1227083652727,8.73624999999999, 2977P 3345 +140.806873250314,-97.1227083652727,8.73624999999999,0., 2977P 3346 +1.2979097143809,0.,0.,0.; 2977P 3347 +126,1,1,0,0,1,0,-1.2979097143809,-1.2979097143809,0.,0.,1.,1., 2979P 3348 +140.806873250314,-97.1227083652727,7.11812499999999, 2979P 3349 +154.808074294198,-97.1227083652727,7.11812499999999, 2979P 3350 +-1.2979097143809,0.,0.,0.,0.; 2979P 3351 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806873250314, 2981P 3352 +-97.1227083652727,8.73624999999999,140.806873250314, 2981P 3353 +-97.1227083652727,7.11812499999999,0.,0.15,0.,0.,0.; 2981P 3354 +126,1,1,0,0,1,0,0.,0.,0.0555553944920281,0.0555553944920281,1., 2983P 3355 +1.,140.806873250314,-97.1227083652727,8.73624999999999, 2983P 3356 +140.806868895161,-96.5234045472058,8.73624999999999,0., 2983P 3357 +0.0555553944920281,0.,0.,0.; 2983P 3358 +126,1,1,0,0,1,0,-0.0555553944920281,-0.0555553944920281,0.,0., 2985P 3359 +1.,1.,140.806868895161,-96.5234045472058,7.11812499999999, 2985P 3360 +140.806873250314,-97.1227083652727,7.11812499999999, 2985P 3361 +-0.0555553944920281,0.,0.,0.,0.; 2985P 3362 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806868895161, 2987P 3363 +-96.5234045472058,8.73624999999999,140.806868895161, 2987P 3364 +-96.5234045472058,7.11812499999999,0.,0.15,0.,0.,0.; 2987P 3365 +126,1,1,0,0,1,0,0.,0.,0.0740874512990315,0.0740874512990315,1., 2989P 3366 +1.,140.806868895161,-96.5234045472058,8.73624999999999, 2989P 3367 +140.007650514273,-96.5234045472058,8.73624999999999,0., 2989P 3368 +0.0740874512990315,0.,0.,0.; 2989P 3369 +126,1,1,0,0,1,0,-0.0740874512990315,-0.0740874512990315,0.,0., 2991P 3370 +1.,1.,140.007650514273,-96.5234045472058,7.11812499999999, 2991P 3371 +140.806868895161,-96.5234045472058,7.11812499999999, 2991P 3372 +-0.0740874512990315,0.,0.,0.,0.; 2991P 3373 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.007650514273, 2993P 3374 +-96.5234045472058,8.73624999999999,140.007650514273, 2993P 3375 +-96.5234045472058,7.11812499999999,0.,0.15,0.,0.,0.; 2993P 3376 +126,1,1,0,0,1,0,0.,0.,1.18663784027107,1.18663784027107,1.,1., 2995P 3377 +140.007650514273,-96.5234045472058,8.73624999999999, 2995P 3378 +140.007654869426,-83.7225488452825,8.73624999999999,0., 2995P 3379 +1.18663784027107,0.,0.,0.; 2995P 3380 +126,1,1,0,0,1,0,-1.18663784027107,-1.18663784027107,0.,0.,1.,1., 2997P 3381 +140.007654869426,-83.7225488452825,7.11812499999999, 2997P 3382 +140.007650514273,-96.5234045472058,7.11812499999999, 2997P 3383 +-1.18663784027107,0.,0.,0.,0.; 2997P 3384 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.007654869426, 2999P 3385 +-83.7225488452825,8.73624999999999,140.007654869426, 2999P 3386 +-83.7225488452825,7.11812499999999,0.,0.15,0.,0.,0.; 2999P 3387 +126,1,1,0,0,1,0,0.,0.,0.0740874512990315,0.0740874512990315,1., 3001P 3388 +1.,140.007654869426,-83.7225488452825,8.73624999999999, 3001P 3389 +140.806873250314,-83.7225488452825,8.73624999999999,0., 3001P 3390 +0.0740874512990315,0.,0.,0.; 3001P 3391 +126,1,1,0,0,1,0,-0.0740874512990315,-0.0740874512990315,0.,0., 3003P 3392 +1.,1.,140.806873250314,-83.7225488452825,7.11812499999999, 3003P 3393 +140.007654869426,-83.7225488452825,7.11812499999999, 3003P 3394 +-0.0740874512990315,0.,0.,0.,0.; 3003P 3395 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806873250314, 3005P 3396 +-83.7225488452825,8.73624999999999,140.806873250314, 3005P 3397 +-83.7225488452825,7.11812499999999,0.,0.15,0.,0.,0.; 3005P 3398 +126,1,1,0,0,1,0,0.,0.,0.0555553944920281,0.0555553944920281,1., 3007P 3399 +1.,140.806873250314,-83.7225488452825,8.73624999999999, 3007P 3400 +140.806868895161,-83.1232450272155,8.73624999999999,0., 3007P 3401 +0.0555553944920281,0.,0.,0.; 3007P 3402 +126,1,1,0,0,1,0,-0.0555553944920281,-0.0555553944920281,0.,0., 3009P 3403 +1.,1.,140.806868895161,-83.1232450272155,7.11812499999999, 3009P 3404 +140.806873250314,-83.7225488452825,7.11812499999999, 3009P 3405 +-0.0555553944920281,0.,0.,0.,0.; 3009P 3406 +126,1,1,0,0,1,0,0.,0.,1.29788872083028,1.29788872083028,1.,1., 3011P 3407 +121.756696066765,-83.1232450272155,8.73624999999999, 3011P 3408 +135.757670642722,-83.1232450272155,8.73624999999999,0., 3011P 3409 +1.29788872083028,0.,0.,0.; 3011P 3410 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 3013P 3411 +-83.1232450272155,8.73624999999999,121.756696066765, 3013P 3412 +-83.1232450272155,7.11812499999999,0.,0.15,0.,0.,0.; 3013P 3413 +126,1,1,0,0,1,0,-1.29788872083028,-1.29788872083028,0.,0.,1.,1., 3015P 3414 +135.757670642722,-83.1232450272155,7.11812499999999, 3015P 3415 +121.756696066765,-83.1232450272155,7.118125,-1.29788872083028, 3015P 3416 +0.,0.,0.,0.; 3015P 3417 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 3017P 3418 +-83.1232450272156,8.73624999999999,135.757670642722, 3017P 3419 +-83.1232450272156,7.11812499999999,0.,0.15,0.,0.,0.; 3017P 3420 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3019P 3421 +1.,135.757670642722,-83.1232450272156,8.73624999999999, 3019P 3422 +135.757670642722,-83.7225488452825,8.73624999999999,0., 3019P 3423 +0.0555553944905611,0.,0.,0.; 3019P 3424 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3021P 3425 +1.,1.,135.757670642722,-83.7225488452825,7.11812499999999, 3021P 3426 +135.757670642722,-83.1232450272156,7.11812499999999, 3021P 3427 +-0.0555553944905611,0.,0.,0.,0.; 3021P 3428 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 3023P 3429 +-83.7225488452825,8.73624999999999,135.757670642722, 3023P 3430 +-83.7225488452825,7.11812499999999,0.,0.15,0.,0.,0.; 3023P 3431 +126,1,1,0,0,1,0,0.,0.,0.0740967369079586,0.0740967369079586,1., 3025P 3432 +1.,135.757670642722,-83.7225488452825,8.73624999999999, 3025P 3433 +136.556989192117,-83.7225488452825,8.73624999999999,0., 3025P 3434 +0.0740967369079586,0.,0.,0.; 3025P 3435 +126,1,1,0,0,1,0,-0.0740967369079586,-0.0740967369079586,0.,0., 3027P 3436 +1.,1.,136.556989192117,-83.7225488452825,7.11812499999999, 3027P 3437 +135.757670642722,-83.7225488452825,7.11812499999999, 3027P 3438 +-0.0740967369079586,0.,0.,0.,0.; 3027P 3439 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,136.556989192117, 3029P 3440 +-83.7225488452825,8.73624999999999,136.556989192117, 3029P 3441 +-83.7225488452825,7.11812499999999,0.,0.15,0.,0.,0.; 3029P 3442 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 3031P 3443 +136.556989192117,-83.7225488452825,8.73624999999999, 3031P 3444 +136.556989192117,-96.5234045472058,8.73624999999999,0., 3031P 3445 +1.186637840271,0.,0.,0.; 3031P 3446 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 3033P 3447 +136.556989192117,-96.5234045472058,7.11812499999999, 3033P 3448 +136.556989192117,-83.7225488452825,7.11812499999999, 3033P 3449 +-1.186637840271,0.,0.,0.,0.; 3033P 3450 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,136.556989192117, 3035P 3451 +-96.5234045472058,8.73624999999999,136.556989192117, 3035P 3452 +-96.5234045472058,7.11812499999999,0.,0.15,0.,0.,0.; 3035P 3453 +126,1,1,0,0,1,0,0.,0.,0.0740967369079586,0.0740967369079586,1., 3037P 3454 +1.,136.556989192117,-96.5234045472058,8.73624999999999, 3037P 3455 +135.757670642722,-96.5234045472058,8.73624999999999,0., 3037P 3456 +0.0740967369079586,0.,0.,0.; 3037P 3457 +126,1,1,0,0,1,0,-0.0740967369079586,-0.0740967369079586,0.,0., 3039P 3458 +1.,1.,135.757670642722,-96.5234045472058,7.11812499999999, 3039P 3459 +136.556989192117,-96.5234045472058,7.11812499999999, 3039P 3460 +-0.0740967369079586,0.,0.,0.,0.; 3039P 3461 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 3041P 3462 +-96.5234045472058,8.73624999999999,135.757670642722, 3041P 3463 +-96.5234045472058,7.11812499999999,0.,0.15,0.,0.,0.; 3041P 3464 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3043P 3465 +1.,135.757670642722,-96.5234045472058,8.73624999999999, 3043P 3466 +135.757670642722,-97.1227083652728,8.73624999999999,0., 3043P 3467 +0.0555553944905611,0.,0.,0.; 3043P 3468 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3045P 3469 +1.,1.,135.757670642722,-97.1227083652728,7.11812499999999, 3045P 3470 +135.757670642722,-96.5234045472058,7.11812499999999, 3045P 3471 +-0.0555553944905611,0.,0.,0.,0.; 3045P 3472 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 3047P 3473 +-97.1227083652727,8.73624999999999,135.757670642722, 3047P 3474 +-97.1227083652727,7.11812499999999,0.,0.15,0.,0.,0.; 3047P 3475 +126,1,1,0,0,1,0,0.,0.,1.29788872083028,1.29788872083028,1.,1., 3049P 3476 +135.757670642722,-97.1227083652727,8.73624999999999, 3049P 3477 +121.756696066765,-97.1227083652727,8.73624999999999,0., 3049P 3478 +1.29788872083028,0.,0.,0.; 3049P 3479 +126,1,1,0,0,1,0,-1.29788872083028,-1.29788872083028,0.,0.,1.,1., 3051P 3480 +121.756696066765,-97.1227083652727,7.118125,135.757670642722, 3051P 3481 +-97.1227083652727,7.11812499999999,-1.29788872083028,0.,0.,0., 3051P 3482 +0.; 3051P 3483 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 3053P 3484 +-97.1227083652727,8.73624999999999,121.756696066765, 3053P 3485 +-97.1227083652727,7.11812499999999,0.,0.15,0.,0.,0.; 3053P 3486 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3055P 3487 +1.,121.756696066765,-97.1227083652727,8.73624999999999, 3055P 3488 +121.756696066765,-96.5234045472058,8.73624999999999,0., 3055P 3489 +0.0555553944905611,0.,0.,0.; 3055P 3490 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3057P 3491 +1.,1.,121.756696066765,-96.5234045472058,7.118125, 3057P 3492 +121.756696066765,-97.1227083652727,7.118125,-0.0555553944905611, 3057P 3493 +0.,0.,0.,0.; 3057P 3494 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 3059P 3495 +-96.5234045472058,8.73624999999999,121.756696066765, 3059P 3496 +-96.5234045472058,7.11812499999999,0.,0.15,0.,0.,0.; 3059P 3497 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3061P 3498 +1.,121.756696066765,-96.5234045472058,8.73624999999999, 3061P 3499 +120.957281704017,-96.5234045472058,8.73624999999999,0., 3061P 3500 +0.0741056187947589,0.,0.,0.; 3061P 3501 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3063P 3502 +1.,1.,120.957281704017,-96.5234045472058,7.118125, 3063P 3503 +121.756696066765,-96.5234045472058,7.118125,-0.0741056187947589, 3063P 3504 +0.,0.,0.,0.; 3063P 3505 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,120.957281704017, 3065P 3506 +-96.5234045472058,8.73624999999999,120.957281704017, 3065P 3507 +-96.5234045472058,7.11812499999999,0.,0.15,0.,0.,0.; 3065P 3508 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 3067P 3509 +120.957281704017,-96.5234045472058,8.73624999999999, 3067P 3510 +120.957281704017,-83.7225488452825,8.73624999999999,0., 3067P 3511 +1.186637840271,0.,0.,0.; 3067P 3512 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 3069P 3513 +120.957281704017,-83.7225488452825,7.118125,120.957281704017, 3069P 3514 +-96.5234045472058,7.118125,-1.186637840271,0.,0.,0.,0.; 3069P 3515 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,120.957281704017, 3071P 3516 +-83.7225488452825,8.73624999999999,120.957281704017, 3071P 3517 +-83.7225488452825,7.11812499999999,0.,0.15,0.,0.,0.; 3071P 3518 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3073P 3519 +1.,120.957281704017,-83.7225488452825,8.73624999999999, 3073P 3520 +121.756696066765,-83.7225488452825,8.73624999999999,0., 3073P 3521 +0.0741056187947589,0.,0.,0.; 3073P 3522 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3075P 3523 +1.,1.,121.756696066765,-83.7225488452825,7.118125, 3075P 3524 +120.957281704017,-83.7225488452825,7.118125,-0.0741056187947589, 3075P 3525 +0.,0.,0.,0.; 3075P 3526 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 3077P 3527 +-83.7225488452825,8.73624999999999,121.756696066765, 3077P 3528 +-83.7225488452825,7.11812499999999,0.,0.15,0.,0.,0.; 3077P 3529 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3079P 3530 +1.,121.756696066765,-83.7225488452825,8.73624999999999, 3079P 3531 +121.756696066765,-83.1232450272155,8.73624999999999,0., 3079P 3532 +0.0555553944905611,0.,0.,0.; 3079P 3533 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3081P 3534 +1.,1.,121.756696066765,-83.1232450272155,7.118125, 3081P 3535 +121.756696066765,-83.7225488452825,7.118125,-0.0555553944905611, 3081P 3536 +0.,0.,0.,0.; 3081P 3537 +126,1,1,0,0,1,0,0.,0.,1.29788831710816,1.29788831710816,1.,1., 3083P 3538 +102.706327256509,-83.1232450272155,8.73624999999999, 3083P 3539 +116.707297477313,-83.1232450272155,8.73624999999999,0., 3083P 3540 +1.29788831710816,0.,0.,0.; 3083P 3541 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 3085P 3542 +-83.1232450272155,8.73624999999999,102.706327256509, 3085P 3543 +-83.1232450272155,7.118125,0.,0.15,0.,0.,0.; 3085P 3544 +126,1,1,0,0,1,0,-1.29788831710816,-1.29788831710816,0.,0.,1.,1., 3087P 3545 +116.707297477313,-83.1232450272155,7.118125,102.706327256509, 3087P 3546 +-83.1232450272155,7.118125,-1.29788831710816,0.,0.,0.,0.; 3087P 3547 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 3089P 3548 +-83.1232450272156,8.73624999999999,116.707297477313, 3089P 3549 +-83.1232450272156,7.11812499999999,0.,0.15,0.,0.,0.; 3089P 3550 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3091P 3551 +1.,116.707297477313,-83.1232450272156,8.73624999999999, 3091P 3552 +116.707297477313,-83.7225488452825,8.73624999999999,0., 3091P 3553 +0.0555553944905611,0.,0.,0.; 3091P 3554 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3093P 3555 +1.,1.,116.707297477313,-83.7225488452825,7.118125, 3093P 3556 +116.707297477313,-83.1232450272156,7.118125,-0.0555553944905611, 3093P 3557 +0.,0.,0.,0.; 3093P 3558 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 3095P 3559 +-83.7225488452825,8.73624999999999,116.707297477313, 3095P 3560 +-83.7225488452825,7.11812499999999,0.,0.15,0.,0.,0.; 3095P 3561 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3097P 3562 +1.,116.707297477313,-83.7225488452825,8.73624999999999, 3097P 3563 +117.506711840062,-83.7225488452825,8.73624999999999,0., 3097P 3564 +0.0741056187947589,0.,0.,0.; 3097P 3565 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3099P 3566 +1.,1.,117.506711840062,-83.7225488452825,7.118125, 3099P 3567 +116.707297477313,-83.7225488452825,7.118125,-0.0741056187947589, 3099P 3568 +0.,0.,0.,0.; 3099P 3569 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,117.506711840062, 3101P 3570 +-83.7225488452825,8.73624999999999,117.506711840062, 3101P 3571 +-83.7225488452825,7.11812499999999,0.,0.15,0.,0.,0.; 3101P 3572 +126,1,1,0,0,1,0,0.,0.,1.18663784027127,1.18663784027127,1.,1., 3103P 3573 +117.506711840062,-83.7225488452825,8.73624999999999, 3103P 3574 +117.506720550367,-96.5234045472058,8.73624999999999,0., 3103P 3575 +1.18663784027127,0.,0.,0.; 3103P 3576 +126,1,1,0,0,1,0,-1.18663784027127,-1.18663784027127,0.,0.,1.,1., 3105P 3577 +117.506720550367,-96.5234045472058,7.118125,117.506711840062, 3105P 3578 +-83.7225488452825,7.118125,-1.18663784027127,0.,0.,0.,0.; 3105P 3579 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,117.506720550367, 3107P 3580 +-96.5234045472058,8.73624999999999,117.506720550367, 3107P 3581 +-96.5234045472058,7.11812499999999,0.,0.15,0.,0.,0.; 3107P 3582 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3109P 3583 +1.,117.506720550367,-96.5234045472058,8.73624999999999, 3109P 3584 +116.707306187618,-96.5234045472058,8.73624999999999,0., 3109P 3585 +0.0741056187947589,0.,0.,0.; 3109P 3586 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3111P 3587 +1.,1.,116.707306187618,-96.5234045472058,7.118125, 3111P 3588 +117.506720550367,-96.5234045472058,7.118125,-0.0741056187947589, 3111P 3589 +0.,0.,0.,0.; 3111P 3590 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707306187618, 3113P 3591 +-96.5234045472058,8.73624999999999,116.707306187618, 3113P 3592 +-96.5234045472058,7.11812499999999,0.,0.15,0.,0.,0.; 3113P 3593 +126,1,1,0,0,1,0,0.,0.,0.0555553944964288,0.0555553944964288,1., 3115P 3594 +1.,116.707306187618,-96.5234045472058,8.73624999999999, 3115P 3595 +116.707297477313,-97.1227083652728,8.73624999999999,0., 3115P 3596 +0.0555553944964288,0.,0.,0.; 3115P 3597 +126,1,1,0,0,1,0,-0.0555553944964288,-0.0555553944964288,0.,0., 3117P 3598 +1.,1.,116.707297477313,-97.1227083652728,7.118125, 3117P 3599 +116.707306187618,-96.5234045472058,7.118125,-0.0555553944964288, 3117P 3600 +0.,0.,0.,0.; 3117P 3601 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 3119P 3602 +-97.1227083652727,8.73624999999999,116.707297477313, 3119P 3603 +-97.1227083652727,7.11812499999999,0.,0.15,0.,0.,0.; 3119P 3604 +126,1,1,0,0,1,0,0.,0.,1.29788831710816,1.29788831710816,1.,1., 3121P 3605 +116.707297477313,-97.1227083652727,8.73624999999999, 3121P 3606 +102.706327256509,-97.1227083652727,8.73624999999999,0., 3121P 3607 +1.29788831710816,0.,0.,0.; 3121P 3608 +126,1,1,0,0,1,0,-1.29788831710816,-1.29788831710816,0.,0.,1.,1., 3123P 3609 +102.706327256509,-97.1227083652727,7.118125,116.707297477313, 3123P 3610 +-97.1227083652727,7.118125,-1.29788831710816,0.,0.,0.,0.; 3123P 3611 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 3125P 3612 +-97.1227083652727,8.73624999999999,102.706327256509, 3125P 3613 +-97.1227083652727,7.118125,0.,0.15,0.,0.,0.; 3125P 3614 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3127P 3615 +1.,102.706327256509,-97.1227083652727,8.73624999999999, 3127P 3616 +102.706327256509,-96.5234045472058,8.73624999999999,0., 3127P 3617 +0.0555553944905611,0.,0.,0.; 3127P 3618 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3129P 3619 +1.,1.,102.706327256509,-96.5234045472058,7.118125, 3129P 3620 +102.706327256509,-97.1227083652727,7.118125,-0.0555553944905611, 3129P 3621 +0.,0.,0.,0.; 3129P 3622 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 3131P 3623 +-96.5234045472058,8.73624999999999,102.706327256509, 3131P 3624 +-96.5234045472058,7.118125,0.,0.15,0.,0.,0.; 3131P 3625 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3133P 3626 +1.,102.706327256509,-96.5234045472058,8.73624999999999, 3133P 3627 +101.90691289376,-96.5234045472058,8.73624999999999,0., 3133P 3628 +0.0741056187947589,0.,0.,0.; 3133P 3629 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3135P 3630 +1.,1.,101.90691289376,-96.5234045472058,7.118125, 3135P 3631 +102.706327256509,-96.5234045472058,7.118125,-0.0741056187947589, 3135P 3632 +0.,0.,0.,0.; 3135P 3633 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,101.90691289376, 3137P 3634 +-96.5234045472058,8.73624999999999,101.90691289376, 3137P 3635 +-96.5234045472058,7.118125,0.,0.15,0.,0.,0.; 3137P 3636 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 3139P 3637 +101.90691289376,-96.5234045472058,8.73624999999999, 3139P 3638 +101.90691289376,-83.7225488452825,8.73624999999999,0., 3139P 3639 +1.186637840271,0.,0.,0.; 3139P 3640 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 3141P 3641 +101.90691289376,-83.7225488452825,7.118125,101.90691289376, 3141P 3642 +-96.5234045472058,7.118125,-1.186637840271,0.,0.,0.,0.; 3141P 3643 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,101.90691289376, 3143P 3644 +-83.7225488452825,8.73624999999999,101.90691289376, 3143P 3645 +-83.7225488452825,7.118125,0.,0.15,0.,0.,0.; 3143P 3646 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3145P 3647 +1.,101.90691289376,-83.7225488452825,8.73624999999999, 3145P 3648 +102.706327256509,-83.7225488452825,8.73624999999999,0., 3145P 3649 +0.0741056187947589,0.,0.,0.; 3145P 3650 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3147P 3651 +1.,1.,102.706327256509,-83.7225488452825,7.118125, 3147P 3652 +101.90691289376,-83.7225488452825,7.118125,-0.0741056187947589, 3147P 3653 +0.,0.,0.,0.; 3147P 3654 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 3149P 3655 +-83.7225488452825,8.73624999999999,102.706327256509, 3149P 3656 +-83.7225488452825,7.118125,0.,0.15,0.,0.,0.; 3149P 3657 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3151P 3658 +1.,102.706327256509,-83.7225488452825,8.73624999999999, 3151P 3659 +102.706327256509,-83.1232450272155,8.73624999999999,0., 3151P 3660 +0.0555553944905611,0.,0.,0.; 3151P 3661 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3153P 3662 +1.,1.,102.706327256509,-83.1232450272155,7.118125, 3153P 3663 +102.706327256509,-83.7225488452825,7.118125,-0.0555553944905611, 3153P 3664 +0.,0.,0.,0.; 3153P 3665 +126,1,1,0,0,1,0,0.,0.,1.29788831710816,1.29788831710816,1.,1., 3155P 3666 +83.6559584462526,-83.1232450272155,8.73625,97.6569286670568, 3155P 3667 +-83.1232450272155,8.73624999999999,0.,1.29788831710816,0.,0.,0.; 3155P 3668 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 3157P 3669 +-83.1232450272155,8.73625,83.6559584462526,-83.1232450272155, 3157P 3670 +7.118125,0.,0.15,0.,0.,0.; 3157P 3671 +126,1,1,0,0,1,0,-1.29788831710816,-1.29788831710816,0.,0.,1.,1., 3159P 3672 +97.6569286670568,-83.1232450272155,7.118125,83.6559584462526, 3159P 3673 +-83.1232450272155,7.118125,-1.29788831710816,0.,0.,0.,0.; 3159P 3674 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 3161P 3675 +-83.1232450272156,8.73624999999999,97.6569286670568, 3161P 3676 +-83.1232450272156,7.118125,0.,0.15,0.,0.,0.; 3161P 3677 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3163P 3678 +1.,97.6569286670568,-83.1232450272156,8.73624999999999, 3163P 3679 +97.6569286670568,-83.7225488452825,8.73624999999999,0., 3163P 3680 +0.0555553944905611,0.,0.,0.; 3163P 3681 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3165P 3682 +1.,1.,97.6569286670568,-83.7225488452825,7.118125, 3165P 3683 +97.6569286670568,-83.1232450272156,7.118125,-0.0555553944905611, 3165P 3684 +0.,0.,0.,0.; 3165P 3685 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 3167P 3686 +-83.7225488452825,8.73624999999999,97.6569286670568, 3167P 3687 +-83.7225488452825,7.118125,0.,0.15,0.,0.,0.; 3167P 3688 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3169P 3689 +1.,97.6569286670568,-83.7225488452825,8.73624999999999, 3169P 3690 +98.4563430298053,-83.7225488452825,8.73624999999999,0., 3169P 3691 +0.0741056187947589,0.,0.,0.; 3169P 3692 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3171P 3693 +1.,1.,98.4563430298053,-83.7225488452825,7.118125, 3171P 3694 +97.6569286670568,-83.7225488452825,7.118125,-0.0741056187947589, 3171P 3695 +0.,0.,0.,0.; 3171P 3696 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,98.4563430298053, 3173P 3697 +-83.7225488452825,8.73624999999999,98.4563430298053, 3173P 3698 +-83.7225488452825,7.118125,0.,0.15,0.,0.,0.; 3173P 3699 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 3175P 3700 +98.4563430298053,-83.7225488452825,8.73624999999999, 3175P 3701 +98.4563430298053,-96.5234045472058,8.73624999999999,0., 3175P 3702 +1.186637840271,0.,0.,0.; 3175P 3703 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 3177P 3704 +98.4563430298053,-96.5234045472058,7.118125,98.4563430298053, 3177P 3705 +-83.7225488452825,7.118125,-1.186637840271,0.,0.,0.,0.; 3177P 3706 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,98.4563430298053, 3179P 3707 +-96.5234045472058,8.73624999999999,98.4563430298053, 3179P 3708 +-96.5234045472058,7.118125,0.,0.15,0.,0.,0.; 3179P 3709 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3181P 3710 +1.,98.4563430298053,-96.5234045472058,8.73624999999999, 3181P 3711 +97.6569286670568,-96.5234045472058,8.73624999999999,0., 3181P 3712 +0.0741056187947589,0.,0.,0.; 3181P 3713 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3183P 3714 +1.,1.,97.6569286670568,-96.5234045472058,7.118125, 3183P 3715 +98.4563430298053,-96.5234045472058,7.118125,-0.0741056187947589, 3183P 3716 +0.,0.,0.,0.; 3183P 3717 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 3185P 3718 +-96.5234045472058,8.73624999999999,97.6569286670568, 3185P 3719 +-96.5234045472058,7.118125,0.,0.15,0.,0.,0.; 3185P 3720 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3187P 3721 +1.,97.6569286670568,-96.5234045472058,8.73624999999999, 3187P 3722 +97.6569286670568,-97.1227083652728,8.73624999999999,0., 3187P 3723 +0.0555553944905611,0.,0.,0.; 3187P 3724 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3189P 3725 +1.,1.,97.6569286670568,-97.1227083652728,7.118125, 3189P 3726 +97.6569286670568,-96.5234045472058,7.118125,-0.0555553944905611, 3189P 3727 +0.,0.,0.,0.; 3189P 3728 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 3191P 3729 +-97.1227083652727,8.73624999999999,97.6569286670568, 3191P 3730 +-97.1227083652727,7.118125,0.,0.15,0.,0.,0.; 3191P 3731 +126,1,1,0,0,1,0,0.,0.,1.29788912455241,1.29788912455241,1.,1., 3193P 3732 +97.6569286670568,-97.1227083652727,8.73624999999999, 3193P 3733 +83.6559497359477,-97.1227083652727,8.73625,0.,1.29788912455241, 3193P 3734 +0.,0.,0.; 3193P 3735 +126,1,1,0,0,1,0,-1.29788912455241,-1.29788912455241,0.,0.,1.,1., 3195P 3736 +83.6559497359477,-97.1227083652727,7.118125,97.6569286670568, 3195P 3737 +-97.1227083652727,7.118125,-1.29788912455241,0.,0.,0.,0.; 3195P 3738 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559497359477, 3197P 3739 +-97.1227083652727,8.73625,83.6559497359477,-97.1227083652727, 3197P 3740 +7.118125,0.,0.15,0.,0.,0.; 3197P 3741 +126,1,1,0,0,1,0,0.,0.,0.0555553944964288,0.0555553944964288,1., 3199P 3742 +1.,83.6559497359477,-97.1227083652727,8.73625,83.6559584462526, 3199P 3743 +-96.5234045472058,8.73625,0.,0.0555553944964288,0.,0.,0.; 3199P 3744 +126,1,1,0,0,1,0,-0.0555553944964288,-0.0555553944964288,0.,0., 3201P 3745 +1.,1.,83.6559584462526,-96.5234045472058,7.118125, 3201P 3746 +83.6559497359477,-97.1227083652727,7.118125,-0.0555553944964288, 3201P 3747 +0.,0.,0.,0.; 3201P 3748 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 3203P 3749 +-96.5234045472058,8.73625,83.6559584462526,-96.5234045472058, 3203P 3750 +7.118125,0.,0.15,0.,0.,0.; 3203P 3751 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3205P 3752 +1.,83.6559584462526,-96.5234045472058,8.73625,82.8565440835041, 3205P 3753 +-96.5234045472058,8.73625,0.,0.0741056187947589,0.,0.,0.; 3205P 3754 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3207P 3755 +1.,1.,82.8565440835041,-96.5234045472058,7.118125, 3207P 3756 +83.6559584462526,-96.5234045472058,7.118125,-0.0741056187947589, 3207P 3757 +0.,0.,0.,0.; 3207P 3758 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,82.8565440835042, 3209P 3759 +-96.5234045472058,8.73625,82.8565440835042,-96.5234045472058, 3209P 3760 +7.118125,0.,0.15,0.,0.,0.; 3209P 3761 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 3211P 3762 +82.8565440835042,-96.5234045472058,8.73625,82.8565440835042, 3211P 3763 +-83.7225488452825,8.73625,0.,1.186637840271,0.,0.,0.; 3211P 3764 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 3213P 3765 +82.8565440835042,-83.7225488452825,7.118125,82.8565440835042, 3213P 3766 +-96.5234045472058,7.118125,-1.186637840271,0.,0.,0.,0.; 3213P 3767 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,82.8565440835042, 3215P 3768 +-83.7225488452825,8.73625,82.8565440835042,-83.7225488452825, 3215P 3769 +7.118125,0.,0.15,0.,0.,0.; 3215P 3770 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3217P 3771 +1.,82.8565440835042,-83.7225488452825,8.73625,83.6559584462526, 3217P 3772 +-83.7225488452825,8.73625,0.,0.0741056187947589,0.,0.,0.; 3217P 3773 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3219P 3774 +1.,1.,83.6559584462526,-83.7225488452825,7.118125, 3219P 3775 +82.8565440835042,-83.7225488452825,7.118125,-0.0741056187947589, 3219P 3776 +0.,0.,0.,0.; 3219P 3777 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 3221P 3778 +-83.7225488452825,8.73625,83.6559584462526,-83.7225488452825, 3221P 3779 +7.118125,0.,0.15,0.,0.,0.; 3221P 3780 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3223P 3781 +1.,83.6559584462526,-83.7225488452825,8.73625,83.6559584462526, 3223P 3782 +-83.1232450272155,8.73625,0.,0.0555553944905611,0.,0.,0.; 3223P 3783 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3225P 3784 +1.,1.,83.6559584462526,-83.1232450272155,7.118125, 3225P 3785 +83.6559584462526,-83.7225488452825,7.118125,-0.0555553944905611, 3225P 3786 +0.,0.,0.,0.; 3225P 3787 +126,1,1,0,0,1,0,0.,0.,1.29788831710816,1.29788831710816,1.,1., 3227P 3788 +64.6055896359963,-83.1232450272155,8.73625,78.6065598568005, 3227P 3789 +-83.1232450272155,8.73625,0.,1.29788831710816,0.,0.,0.; 3227P 3790 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 3229P 3791 +-83.1232450272155,8.73625,64.6055896359963,-83.1232450272155, 3229P 3792 +7.118125,0.,0.15,0.,0.,0.; 3229P 3793 +126,1,1,0,0,1,0,-1.29788831710816,-1.29788831710816,0.,0.,1.,1., 3231P 3794 +78.6065598568005,-83.1232450272155,7.118125,64.6055896359963, 3231P 3795 +-83.1232450272155,7.118125,-1.29788831710816,0.,0.,0.,0.; 3231P 3796 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 3233P 3797 +-83.1232450272156,8.73625,78.6065598568005,-83.1232450272156, 3233P 3798 +7.118125,0.,0.15,0.,0.,0.; 3233P 3799 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3235P 3800 +1.,78.6065598568005,-83.1232450272156,8.73625,78.6065598568005, 3235P 3801 +-83.7225488452825,8.73625,0.,0.0555553944905611,0.,0.,0.; 3235P 3802 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3237P 3803 +1.,1.,78.6065598568005,-83.7225488452825,7.118125, 3237P 3804 +78.6065598568005,-83.1232450272156,7.118125,-0.0555553944905611, 3237P 3805 +0.,0.,0.,0.; 3237P 3806 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 3239P 3807 +-83.7225488452825,8.73625,78.6065598568005,-83.7225488452825, 3239P 3808 +7.118125,0.,0.15,0.,0.,0.; 3239P 3809 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3241P 3810 +1.,78.6065598568005,-83.7225488452825,8.73625,79.405974219549, 3241P 3811 +-83.7225488452825,8.73625,0.,0.0741056187947589,0.,0.,0.; 3241P 3812 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3243P 3813 +1.,1.,79.405974219549,-83.7225488452825,7.118125, 3243P 3814 +78.6065598568005,-83.7225488452825,7.118125,-0.0741056187947589, 3243P 3815 +0.,0.,0.,0.; 3243P 3816 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,79.4059742195489, 3245P 3817 +-83.7225488452825,8.73625,79.4059742195489,-83.7225488452825, 3245P 3818 +7.118125,0.,0.15,0.,0.,0.; 3245P 3819 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 3247P 3820 +79.4059742195489,-83.7225488452825,8.73625,79.4059742195489, 3247P 3821 +-96.5234045472058,8.73625,0.,1.186637840271,0.,0.,0.; 3247P 3822 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 3249P 3823 +79.4059742195489,-96.5234045472058,7.118125,79.4059742195489, 3249P 3824 +-83.7225488452825,7.118125,-1.186637840271,0.,0.,0.,0.; 3249P 3825 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,79.4059742195489, 3251P 3826 +-96.5234045472058,8.73625,79.4059742195489,-96.5234045472058, 3251P 3827 +7.118125,0.,0.15,0.,0.,0.; 3251P 3828 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3253P 3829 +1.,79.4059742195489,-96.5234045472058,8.73625,78.6065598568005, 3253P 3830 +-96.5234045472058,8.73625,0.,0.0741056187947589,0.,0.,0.; 3253P 3831 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3255P 3832 +1.,1.,78.6065598568005,-96.5234045472058,7.118125, 3255P 3833 +79.4059742195489,-96.5234045472058,7.118125,-0.0741056187947589, 3255P 3834 +0.,0.,0.,0.; 3255P 3835 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 3257P 3836 +-96.5234045472058,8.73625,78.6065598568005,-96.5234045472058, 3257P 3837 +7.118125,0.,0.15,0.,0.,0.; 3257P 3838 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3259P 3839 +1.,78.6065598568005,-96.5234045472058,8.73625,78.6065598568005, 3259P 3840 +-97.1227083652728,8.73625,0.,0.0555553944905611,0.,0.,0.; 3259P 3841 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3261P 3842 +1.,1.,78.6065598568005,-97.1227083652728,7.118125, 3261P 3843 +78.6065598568005,-96.5234045472058,7.118125,-0.0555553944905611, 3261P 3844 +0.,0.,0.,0.; 3261P 3845 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 3263P 3846 +-97.1227083652727,8.73625,78.6065598568005,-97.1227083652727, 3263P 3847 +7.118125,0.,0.15,0.,0.,0.; 3263P 3848 +126,1,1,0,0,1,0,0.,0.,1.29788831710816,1.29788831710816,1.,1., 3265P 3849 +78.6065598568005,-97.1227083652727,8.73625,64.6055896359963, 3265P 3850 +-97.1227083652727,8.73625,0.,1.29788831710816,0.,0.,0.; 3265P 3851 +126,1,1,0,0,1,0,-1.29788831710816,-1.29788831710816,0.,0.,1.,1., 3267P 3852 +64.6055896359963,-97.1227083652727,7.118125,78.6065598568005, 3267P 3853 +-97.1227083652727,7.118125,-1.29788831710816,0.,0.,0.,0.; 3267P 3854 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 3269P 3855 +-97.1227083652727,8.73625,64.6055896359963,-97.1227083652727, 3269P 3856 +7.118125,0.,0.15,0.,0.,0.; 3269P 3857 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3271P 3858 +1.,64.6055896359963,-97.1227083652727,8.73625,64.6055896359963, 3271P 3859 +-96.5234045472058,8.73625,0.,0.0555553944905611,0.,0.,0.; 3271P 3860 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3273P 3861 +1.,1.,64.6055896359963,-96.5234045472058,7.118125, 3273P 3862 +64.6055896359963,-97.1227083652727,7.118125,-0.0555553944905611, 3273P 3863 +0.,0.,0.,0.; 3273P 3864 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 3275P 3865 +-96.5234045472058,8.73625,64.6055896359963,-96.5234045472058, 3275P 3866 +7.118125,0.,0.15,0.,0.,0.; 3275P 3867 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3277P 3868 +1.,64.6055896359963,-96.5234045472058,8.73625,63.8061752732478, 3277P 3869 +-96.5234045472058,8.73625,0.,0.0741056187947589,0.,0.,0.; 3277P 3870 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3279P 3871 +1.,1.,63.8061752732478,-96.5234045472058,7.118125, 3279P 3872 +64.6055896359963,-96.5234045472058,7.118125,-0.0741056187947589, 3279P 3873 +0.,0.,0.,0.; 3279P 3874 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,63.8061752732478, 3281P 3875 +-96.5234045472058,8.73625,63.8061752732478,-96.5234045472058, 3281P 3876 +7.118125,0.,0.15,0.,0.,0.; 3281P 3877 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 3283P 3878 +63.8061752732478,-96.5234045472058,8.73625,63.8061752732478, 3283P 3879 +-83.7225488452825,8.73625,0.,1.186637840271,0.,0.,0.; 3283P 3880 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 3285P 3881 +63.8061752732478,-83.7225488452825,7.118125,63.8061752732478, 3285P 3882 +-96.5234045472058,7.118125,-1.186637840271,0.,0.,0.,0.; 3285P 3883 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,63.8061752732478, 3287P 3884 +-83.7225488452825,8.73625,63.8061752732478,-83.7225488452825, 3287P 3885 +7.118125,0.,0.15,0.,0.,0.; 3287P 3886 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3289P 3887 +1.,63.8061752732478,-83.7225488452825,8.73625,64.6055896359963, 3289P 3888 +-83.7225488452825,8.73625,0.,0.0741056187947589,0.,0.,0.; 3289P 3889 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3291P 3890 +1.,1.,64.6055896359963,-83.7225488452825,7.118125, 3291P 3891 +63.8061752732478,-83.7225488452825,7.118125,-0.0741056187947589, 3291P 3892 +0.,0.,0.,0.; 3291P 3893 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 3293P 3894 +-83.7225488452825,8.73625,64.6055896359963,-83.7225488452825, 3293P 3895 +7.118125,0.,0.15,0.,0.,0.; 3293P 3896 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3295P 3897 +1.,64.6055896359963,-83.7225488452825,8.73625,64.6055896359963, 3295P 3898 +-83.1232450272155,8.73625,0.,0.0555553944905611,0.,0.,0.; 3295P 3899 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3297P 3900 +1.,1.,64.6055896359963,-83.1232450272155,7.118125, 3297P 3901 +64.6055896359963,-83.7225488452825,7.118125,-0.0555553944905611, 3297P 3902 +0.,0.,0.,0.; 3297P 3903 +126,1,1,0,0,1,0,0.,0.,1.29779546101888,1.29779546101888,1.,1., 3299P 3904 +45.556222510803,-83.1232450272155,8.73625,59.5561910465442, 3299P 3905 +-83.1232450272155,8.73625,0.,1.29779546101888,0.,0.,0.; 3299P 3906 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 3301P 3907 +-83.1232450272155,8.73625,45.556222510803,-83.1232450272155, 3301P 3908 +7.118125,0.,0.15,0.,0.,0.; 3301P 3909 +126,1,1,0,0,1,0,-1.29779546101888,-1.29779546101888,0.,0.,1.,1., 3303P 3910 +59.5561910465442,-83.1232450272155,7.118125,45.556222510803, 3303P 3911 +-83.1232450272155,7.118125,-1.29779546101888,0.,0.,0.,0.; 3303P 3912 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 3305P 3913 +-83.1232450272156,8.73625,59.5561910465442,-83.1232450272156, 3305P 3914 +7.118125,0.,0.15,0.,0.,0.; 3305P 3915 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3307P 3916 +1.,59.5561910465442,-83.1232450272156,8.73625,59.5561910465442, 3307P 3917 +-83.7225488452825,8.73625,0.,0.0555553944905611,0.,0.,0.; 3307P 3918 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3309P 3919 +1.,1.,59.5561910465442,-83.7225488452825,7.118125, 3309P 3920 +59.5561910465442,-83.1232450272156,7.118125,-0.0555553944905611, 3309P 3921 +0.,0.,0.,0.; 3309P 3922 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 3311P 3923 +-83.7225488452825,8.73625,59.5561910465442,-83.7225488452825, 3311P 3924 +7.118125,0.,0.15,0.,0.,0.; 3311P 3925 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3313P 3926 +1.,59.5561910465442,-83.7225488452825,8.73625,60.3556054092927, 3313P 3927 +-83.7225488452825,8.73625,0.,0.0741056187947589,0.,0.,0.; 3313P 3928 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3315P 3929 +1.,1.,60.3556054092927,-83.7225488452825,7.118125, 3315P 3930 +59.5561910465442,-83.7225488452825,7.118125,-0.0741056187947589, 3315P 3931 +0.,0.,0.,0.; 3315P 3932 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,60.3556054092926, 3317P 3933 +-83.7225488452825,8.73625,60.3556054092926,-83.7225488452825, 3317P 3934 +7.118125,0.,0.15,0.,0.,0.; 3317P 3935 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 3319P 3936 +60.3556054092926,-83.7225488452825,8.73625,60.3556054092926, 3319P 3937 +-96.5234045472058,8.73625,0.,1.186637840271,0.,0.,0.; 3319P 3938 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 3321P 3939 +60.3556054092926,-96.5234045472058,7.118125,60.3556054092926, 3321P 3940 +-83.7225488452825,7.118125,-1.186637840271,0.,0.,0.,0.; 3321P 3941 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,60.3556054092926, 3323P 3942 +-96.5234045472058,8.73625,60.3556054092926,-96.5234045472058, 3323P 3943 +7.118125,0.,0.15,0.,0.,0.; 3323P 3944 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3325P 3945 +1.,60.3556054092926,-96.5234045472058,8.73625,59.5561910465442, 3325P 3946 +-96.5234045472058,8.73625,0.,0.0741056187947589,0.,0.,0.; 3325P 3947 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3327P 3948 +1.,1.,59.5561910465442,-96.5234045472058,7.118125, 3327P 3949 +60.3556054092926,-96.5234045472058,7.118125,-0.0741056187947589, 3327P 3950 +0.,0.,0.,0.; 3327P 3951 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 3329P 3952 +-96.5234045472058,8.73625,59.5561910465442,-96.5234045472058, 3329P 3953 +7.118125,0.,0.15,0.,0.,0.; 3329P 3954 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3331P 3955 +1.,59.5561910465442,-96.5234045472058,8.73625,59.5561910465442, 3331P 3956 +-97.1227083652728,8.73625,0.,0.0555553944905611,0.,0.,0.; 3331P 3957 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3333P 3958 +1.,1.,59.5561910465442,-97.1227083652728,7.118125, 3333P 3959 +59.5561910465442,-96.5234045472058,7.118125,-0.0555553944905611, 3333P 3960 +0.,0.,0.,0.; 3333P 3961 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5561910465442, 3335P 3962 +-97.1227083652727,8.73625,59.5561910465442,-97.1227083652727, 3335P 3963 +7.118125,0.,0.15,0.,0.,0.; 3335P 3964 +126,1,1,0,0,1,0,0.,0.,1.29779546101888,1.29779546101888,1.,1., 3337P 3965 +59.5561910465442,-97.1227083652727,8.73625,45.556222510803, 3337P 3966 +-97.1227083652727,8.73625,0.,1.29779546101888,0.,0.,0.; 3337P 3967 +126,1,1,0,0,1,0,-1.29779546101888,-1.29779546101888,0.,0.,1.,1., 3339P 3968 +45.556222510803,-97.1227083652727,7.11812500000001, 3339P 3969 +59.5561910465442,-97.1227083652727,7.118125,-1.29779546101888, 3339P 3970 +0.,0.,0.,0.; 3339P 3971 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 3341P 3972 +-97.1227083652727,8.73625,45.556222510803,-97.1227083652727, 3341P 3973 +7.118125,0.,0.15,0.,0.,0.; 3341P 3974 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3343P 3975 +1.,45.556222510803,-97.1227083652727,8.73625,45.556222510803, 3343P 3976 +-96.5234045472058,8.73625,0.,0.0555553944905611,0.,0.,0.; 3343P 3977 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3345P 3978 +1.,1.,45.556222510803,-96.5234045472058,7.118125, 3345P 3979 +45.556222510803,-97.1227083652727,7.118125,-0.0555553944905611, 3345P 3980 +0.,0.,0.,0.; 3345P 3981 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 3347P 3982 +-96.5234045472058,8.73625,45.556222510803,-96.5234045472058, 3347P 3983 +7.118125,0.,0.15,0.,0.,0.; 3347P 3984 +126,1,1,0,0,1,0,0.,0.,0.0741621398925787,0.0741621398925787,1., 3349P 3985 +1.,45.556222510803,-96.5234045472058,8.73625,44.7561984267118, 3349P 3986 +-96.5234045472058,8.73625,0.,0.0741621398925787,0.,0.,0.; 3349P 3987 +126,1,1,0,0,1,0,-0.0741621398925787,-0.0741621398925787,0.,0., 3351P 3988 +1.,1.,44.7561984267118,-96.5234045472058,7.118125, 3351P 3989 +45.556222510803,-96.5234045472058,7.118125,-0.0741621398925787, 3351P 3990 +0.,0.,0.,0.; 3351P 3991 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,44.7561984267118, 3353P 3992 +-96.5234045472058,8.73625,44.7561984267118,-96.5234045472058, 3353P 3993 +7.118125,0.,0.15,0.,0.,0.; 3353P 3994 +126,1,1,0,0,1,0,0.,0.,1.186637840271,1.186637840271,1.,1., 3355P 3995 +44.7561984267118,-96.5234045472058,8.73625,44.7561984267118, 3355P 3996 +-83.7225488452825,8.73625,0.,1.186637840271,0.,0.,0.; 3355P 3997 +126,1,1,0,0,1,0,-1.186637840271,-1.186637840271,0.,0.,1.,1., 3357P 3998 +44.7561984267118,-83.7225488452825,7.118125,44.7561984267118, 3357P 3999 +-96.5234045472058,7.118125,-1.186637840271,0.,0.,0.,0.; 3357P 4000 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,44.7561984267118, 3359P 4001 +-83.7225488452825,8.73625,44.7561984267118,-83.7225488452825, 3359P 4002 +7.118125,0.,0.15,0.,0.,0.; 3359P 4003 +126,1,1,0,0,1,0,0.,0.,0.0741621398925787,0.0741621398925787,1., 3361P 4004 +1.,44.7561984267118,-83.7225488452825,8.73625,45.556222510803, 3361P 4005 +-83.7225488452825,8.73625,0.,0.0741621398925787,0.,0.,0.; 3361P 4006 +126,1,1,0,0,1,0,-0.0741621398925787,-0.0741621398925787,0.,0., 3363P 4007 +1.,1.,45.556222510803,-83.7225488452825,7.118125, 3363P 4008 +44.7561984267118,-83.7225488452825,7.118125,-0.0741621398925787, 3363P 4009 +0.,0.,0.,0.; 3363P 4010 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.556222510803, 3365P 4011 +-83.7225488452825,8.73625,45.556222510803,-83.7225488452825, 3365P 4012 +7.118125,0.,0.15,0.,0.,0.; 3365P 4013 +126,1,1,0,0,1,0,0.,0.,0.0555553944905611,0.0555553944905611,1., 3367P 4014 +1.,45.556222510803,-83.7225488452825,8.73625,45.556222510803, 3367P 4015 +-83.1232450272155,8.73625,0.,0.0555553944905611,0.,0.,0.; 3367P 4016 +126,1,1,0,0,1,0,-0.0555553944905611,-0.0555553944905611,0.,0., 3369P 4017 +1.,1.,45.556222510803,-83.1232450272155,7.118125, 3369P 4018 +45.556222510803,-83.7225488452825,7.118125,-0.0555553944905611, 3369P 4019 +0.,0.,0.,0.; 3369P 4020 +126,1,1,0,0,1,0,0.,0.,1.29791011810303,1.29791011810303,1.,1., 3371P 4021 +140.806868895161,-64.0711428662849,8.73624999999999, 3371P 4022 +154.808074294198,-64.0711428662849,8.73624999999999,0., 3371P 4023 +1.29791011810303,0.,0.,0.; 3371P 4024 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806868895161, 3373P 4025 +-64.0711428662849,8.73624999999999,140.806868895161, 3373P 4026 +-64.0711428662849,7.11812499999999,0.,0.15,0.,0.,0.; 3373P 4027 +126,1,1,0,0,1,0,-1.29791011810303,-1.29791011810303,0.,0.,1.,1., 3375P 4028 +154.808074294198,-64.0711428662849,7.11812499999999, 3375P 4029 +140.806868895161,-64.0711428662849,7.11812499999999, 3375P 4030 +-1.29791011810303,0.,0.,0.,0.; 3375P 4031 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 3377P 4032 +-64.0711428662849,8.73624999999999,154.808074294198, 3377P 4033 +-64.0711428662849,7.11812499999999,0.,0.15,0.,0.,0.; 3377P 4034 +126,1,1,0,0,1,0,0.,0.,0.0557168833414714,0.0557168833414714,1., 3379P 4035 +1.,154.808074294198,-64.0711428662849,8.73624999999999, 3379P 4036 +154.808074294198,-64.672188745331,8.73624999999999,0., 3379P 4037 +0.0557168833414714,0.,0.,0.; 3379P 4038 +126,1,1,0,0,1,0,-0.0557168833414714,-0.0557168833414714,0.,0., 3381P 4039 +1.,1.,154.808074294198,-64.672188745331,7.11812499999999, 3381P 4040 +154.808074294198,-64.0711428662849,7.11812499999999, 3381P 4041 +-0.0557168833414714,0.,0.,0.,0.; 3381P 4042 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 3383P 4043 +-64.672188745331,8.73624999999999,154.808074294198, 3383P 4044 +-64.672188745331,7.11812499999999,0.,0.15,0.,0.,0.; 3383P 4045 +126,1,1,0,0,1,0,0.,0.,0.0740926997042853,0.0740926997042853,1., 3385P 4046 +1.,154.808074294198,-64.672188745331,8.73624999999999, 3385P 4047 +155.607349292068,-64.6721713247213,8.73624999999999,0., 3385P 4048 +0.0740926997042853,0.,0.,0.; 3385P 4049 +126,1,1,0,0,1,0,-0.0740926997042853,-0.0740926997042853,0.,0., 3387P 4050 +1.,1.,155.607349292068,-64.6721713247213,7.11812499999999, 3387P 4051 +154.808074294198,-64.672188745331,7.11812499999999, 3387P 4052 +-0.0740926997042853,0.,0.,0.,0.; 3387P 4053 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,155.607349292068, 3389P 4054 +-64.6721713247213,8.73624999999999,155.607349292068, 3389P 4055 +-64.6721713247213,7.11812499999999,0.,0.15,0.,0.,0.; 3389P 4056 +126,1,1,0,0,1,0,0.,0.,1.18650703430176,1.18650703430176,1.,1., 3391P 4057 +155.607349292068,-64.6721713247213,8.73624999999999, 3391P 4058 +155.607349292068,-77.4716159572515,8.73624999999999,0., 3391P 4059 +1.18650703430176,0.,0.,0.; 3391P 4060 +126,1,1,0,0,1,0,-1.18650703430176,-1.18650703430176,0.,0.,1.,1., 3393P 4061 +155.607349292068,-77.4716159572515,7.11812499999999, 3393P 4062 +155.607349292068,-64.6721713247213,7.11812499999999, 3393P 4063 +-1.18650703430176,0.,0.,0.,0.; 3393P 4064 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,155.607349292068, 3395P 4065 +-77.4716159572515,8.73624999999999,155.607349292068, 3395P 4066 +-77.4716159572515,7.11812499999999,0.,0.15,0.,0.,0.; 3395P 4067 +126,1,1,0,0,1,0,0.,0.,0.0740926997042853,0.0740926997042853,1., 3397P 4068 +1.,155.607349292068,-77.4716159572515,8.73624999999999, 3397P 4069 +154.808074294198,-77.4716333778612,8.73624999999999,0., 3397P 4070 +0.0740926997042853,0.,0.,0.; 3397P 4071 +126,1,1,0,0,1,0,-0.0740926997042853,-0.0740926997042853,0.,0., 3399P 4072 +1.,1.,154.808074294198,-77.4716333778612,7.11812499999999, 3399P 4073 +155.607349292068,-77.4716159572515,7.11812499999999, 3399P 4074 +-0.0740926997042853,0.,0.,0.,0.; 3399P 4075 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 3401P 4076 +-77.4716333778613,8.73624999999999,154.808074294198, 3401P 4077 +-77.4716333778613,7.11812499999999,0.,0.15,0.,0.,0.; 3401P 4078 +126,1,1,0,0,1,0,0.,0.,0.0556862004597996,0.0556862004597996,1., 3403P 4079 +1.,154.808074294198,-77.4716333778613,8.73624999999999, 3403P 4080 +154.808074294198,-78.0723482653214,8.73624999999999,0., 3403P 4081 +0.0556862004597996,0.,0.,0.; 3403P 4082 +126,1,1,0,0,1,0,-0.0556862004597996,-0.0556862004597996,0.,0., 3405P 4083 +1.,1.,154.808074294198,-78.0723482653214,7.11812499999999, 3405P 4084 +154.808074294198,-77.4716333778613,7.11812499999999, 3405P 4085 +-0.0556862004597996,0.,0.,0.,0.; 3405P 4086 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,154.808074294198, 3407P 4087 +-78.0723482653214,8.73624999999999,154.808074294198, 3407P 4088 +-78.0723482653214,7.11812499999999,0.,0.15,0.,0.,0.; 3407P 4089 +126,1,1,0,0,1,0,0.,0.,1.2979097143819,1.2979097143819,1.,1., 3409P 4090 +154.808074294198,-78.0723482653214,8.73624999999999, 3409P 4091 +140.806873250314,-78.0723308447116,8.73624999999999,0., 3409P 4092 +1.2979097143819,0.,0.,0.; 3409P 4093 +126,1,1,0,0,1,0,-1.2979097143819,-1.2979097143819,0.,0.,1.,1., 3411P 4094 +140.806873250314,-78.0723308447116,7.11812499999999, 3411P 4095 +154.808074294198,-78.0723482653214,7.11812499999999, 3411P 4096 +-1.2979097143819,0.,0.,0.,0.; 3411P 4097 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806873250314, 3413P 4098 +-78.0723308447116,8.73624999999999,140.806873250314, 3413P 4099 +-78.0723308447116,7.11812499999999,0.,0.15,0.,0.,0.; 3413P 4100 +126,1,1,0,0,1,0,0.,0.,0.0556862004612666,0.0556862004612666,1., 3415P 4101 +1.,140.806873250314,-78.0723308447116,8.73624999999999, 3415P 4102 +140.806868895161,-77.4716159572514,8.73624999999999,0., 3415P 4103 +0.0556862004612666,0.,0.,0.; 3415P 4104 +126,1,1,0,0,1,0,-0.0556862004612666,-0.0556862004612666,0.,0., 3417P 4105 +1.,1.,140.806868895161,-77.4716159572514,7.11812499999999, 3417P 4106 +140.806873250314,-78.0723308447116,7.11812499999999, 3417P 4107 +-0.0556862004612666,0.,0.,0.,0.; 3417P 4108 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806868895161, 3419P 4109 +-77.4716159572515,8.73624999999999,140.806868895161, 3419P 4110 +-77.4716159572515,7.11812499999999,0.,0.15,0.,0.,0.; 3419P 4111 +126,1,1,0,0,1,0,0.,0.,0.0740874513166314,0.0740874513166314,1., 3421P 4112 +1.,140.806868895161,-77.4716159572515,8.73624999999999, 3421P 4113 +140.007650514273,-77.4716333778613,8.73624999999999,0., 3421P 4114 +0.0740874513166314,0.,0.,0.; 3421P 4115 +126,1,1,0,0,1,0,-0.0740874513166314,-0.0740874513166314,0.,0., 3423P 4116 +1.,1.,140.007650514273,-77.4716333778613,7.11812499999999, 3423P 4117 +140.806868895161,-77.4716159572515,7.11812499999999, 3423P 4118 +-0.0740874513166314,0.,0.,0.,0.; 3423P 4119 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.007650514273, 3425P 4120 +-77.4716333778613,8.73624999999999,140.007650514273, 3425P 4121 +-77.4716333778613,7.11812499999999,0.,0.15,0.,0.,0.; 3425P 4122 +126,1,1,0,0,1,0,0.,0.,1.18652964274096,1.18652964274096,1.,1., 3427P 4123 +140.007650514273,-77.4716333778613,8.73624999999999, 3427P 4124 +140.007654869426,-64.671944856794,8.73624999999999,0., 3427P 4125 +1.18652964274096,0.,0.,0.; 3427P 4126 +126,1,1,0,0,1,0,-1.18652964274096,-1.18652964274096,0.,0.,1.,1., 3429P 4127 +140.007654869426,-64.671944856794,7.11812499999999, 3429P 4128 +140.007650514273,-77.4716333778613,7.11812499999999, 3429P 4129 +-1.18652964274096,0.,0.,0.,0.; 3429P 4130 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.007654869426, 3431P 4131 +-64.6719448567939,8.73624999999999,140.007654869426, 3431P 4132 +-64.6719448567939,7.11812499999999,0.,0.15,0.,0.,0.; 3431P 4133 +126,1,1,0,0,1,0,0.,0.,0.0740874512990315,0.0740874512990315,1., 3433P 4134 +1.,140.007654869426,-64.6719448567939,8.73624999999999, 3433P 4135 +140.806873250314,-64.6719448567939,8.73624999999999,0., 3433P 4136 +0.0740874512990315,0.,0.,0.; 3433P 4137 +126,1,1,0,0,1,0,-0.0740874512990315,-0.0740874512990315,0.,0., 3435P 4138 +1.,1.,140.806873250314,-64.6719448567939,7.11812499999999, 3435P 4139 +140.007654869426,-64.6719448567939,7.11812499999999, 3435P 4140 +-0.0740874512990315,0.,0.,0.,0.; 3435P 4141 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,140.806873250314, 3437P 4142 +-64.6719448567939,8.73624999999999,140.806873250314, 3437P 4143 +-64.6719448567939,7.11812499999999,0.,0.15,0.,0.,0.; 3437P 4144 +126,1,1,0,0,1,0,0.,0.,0.0556942749038067,0.0556942749038067,1., 3439P 4145 +1.,140.806873250314,-64.6719448567939,8.73624999999999, 3439P 4146 +140.806868895161,-64.0711428662849,8.73624999999999,0., 3439P 4147 +0.0556942749038067,0.,0.,0.; 3439P 4148 +126,1,1,0,0,1,0,-0.0556942749038067,-0.0556942749038067,0.,0., 3441P 4149 +1.,1.,140.806868895161,-64.0711428662849,7.11812499999999, 3441P 4150 +140.806873250314,-64.6719448567939,7.11812499999999, 3441P 4151 +-0.0556942749038067,0.,0.,0.,0.; 3441P 4152 +126,1,1,0,0,1,0,0.,0.,1.29788872083028,1.29788872083028,1.,1., 3443P 4153 +121.756696066765,-64.0711428662849,8.73624999999999, 3443P 4154 +135.757670642722,-64.0711428662849,8.73624999999999,0., 3443P 4155 +1.29788872083028,0.,0.,0.; 3443P 4156 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 3445P 4157 +-64.0711428662849,8.73624999999999,121.756696066765, 3445P 4158 +-64.0711428662849,7.11812499999999,0.,0.15,0.,0.,0.; 3445P 4159 +126,1,1,0,0,1,0,-1.29788872083028,-1.29788872083028,0.,0.,1.,1., 3447P 4160 +135.757670642722,-64.0711428662849,7.11812499999999, 3447P 4161 +121.756696066765,-64.0711428662849,7.118125,-1.29788872083028, 3447P 4162 +0.,0.,0.,0.; 3447P 4163 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 3449P 4164 +-64.0711428662849,8.73624999999999,135.757670642722, 3449P 4165 +-64.0711428662849,7.11812499999999,0.,0.15,0.,0.,0.; 3449P 4166 +126,1,1,0,0,1,0,0.,0.,0.0684050623575843,0.0684050623575843,1., 3451P 4167 +1.,135.757670642722,-64.0711428662849,8.73624999999999, 3451P 4168 +135.757670642722,-64.8090624764673,8.73624999999999,0., 3451P 4169 +0.0684050623575843,0.,0.,0.; 3451P 4170 +126,1,1,0,0,1,0,-0.0684050623575843,-0.0684050623575843,0.,0., 3453P 4171 +1.,1.,135.757670642722,-64.8090624764673,7.11812499999999, 3453P 4172 +135.757670642722,-64.0711428662849,7.11812499999999, 3453P 4173 +-0.0684050623575843,0.,0.,0.,0.; 3453P 4174 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 3455P 4175 +-64.8090624764674,8.73624999999999,135.757670642722, 3455P 4176 +-64.8090624764674,7.11812499999999,0.,0.15,0.,0.,0.; 3455P 4177 +126,1,1,0,0,1,0,0.,0.,0.0740967369255563,0.0740967369255563,1., 3457P 4178 +1.,135.757670642722,-64.8090624764674,8.73624999999999, 3457P 4179 +136.556989192117,-64.8090450558576,8.73624999999999,0., 3457P 4180 +0.0740967369255563,0.,0.,0.; 3457P 4181 +126,1,1,0,0,1,0,-0.0740967369255563,-0.0740967369255563,0.,0., 3459P 4182 +1.,1.,136.556989192117,-64.8090450558576,7.11812499999999, 3459P 4183 +135.757670642722,-64.8090624764674,7.11812499999999, 3459P 4184 +-0.0740967369255563,0.,0.,0.,0.; 3459P 4185 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,136.556989192117, 3461P 4186 +-64.8090450558576,8.73624999999999,136.556989192117, 3461P 4187 +-64.8090450558576,7.11812499999999,0.,0.15,0.,0.,0.; 3461P 4188 +126,1,1,0,0,1,0,0.,0.,1.18650703430176,1.18650703430176,1.,1., 3463P 4189 +136.556989192117,-64.8090450558576,8.73624999999999, 3463P 4190 +136.556989192117,-77.6084896883878,8.73624999999999,0., 3463P 4191 +1.18650703430176,0.,0.,0.; 3463P 4192 +126,1,1,0,0,1,0,-1.18650703430176,-1.18650703430176,0.,0.,1.,1., 3465P 4193 +136.556989192117,-77.6084896883878,7.11812499999999, 3465P 4194 +136.556989192117,-64.8090450558576,7.11812499999999, 3465P 4195 +-1.18650703430176,0.,0.,0.,0.; 3465P 4196 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,136.556989192117, 3467P 4197 +-77.6084896883878,8.73624999999999,136.556989192117, 3467P 4198 +-77.6084896883878,7.11812499999999,0.,0.15,0.,0.,0.; 3467P 4199 +126,1,1,0,0,1,0,0.,0.,0.0740967369255563,0.0740967369255563,1., 3469P 4200 +1.,136.556989192117,-77.6084896883878,8.73624999999999, 3469P 4201 +135.757670642722,-77.6085071089976,8.73624999999999,0., 3469P 4202 +0.0740967369255563,0.,0.,0.; 3469P 4203 +126,1,1,0,0,1,0,-0.0740967369255563,-0.0740967369255563,0.,0., 3471P 4204 +1.,1.,135.757670642722,-77.6085071089976,7.11812499999999, 3471P 4205 +136.556989192117,-77.6084896883878,7.11812499999999, 3471P 4206 +-0.0740967369255563,0.,0.,0.,0.; 3471P 4207 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 3473P 4208 +-77.6085071089976,8.73624999999999,135.757670642722, 3473P 4209 +-77.6085071089976,7.11812499999999,0.,0.15,0.,0.,0.; 3473P 4210 +126,1,1,0,0,1,0,0.,0.,0.0429980214436831,0.0429980214436831,1., 3475P 4211 +1.,135.757670642722,-77.6085071089976,8.73624999999999, 3475P 4212 +135.757670642722,-78.0723482653213,8.73624999999999,0., 3475P 4213 +0.0429980214436831,0.,0.,0.; 3475P 4214 +126,1,1,0,0,1,0,-0.0429980214436831,-0.0429980214436831,0.,0., 3477P 4215 +1.,1.,135.757670642722,-78.0723482653213,7.11812499999999, 3477P 4216 +135.757670642722,-77.6085071089976,7.11812499999999, 3477P 4217 +-0.0429980214436831,0.,0.,0.,0.; 3477P 4218 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,135.757670642722, 3479P 4219 +-78.0723482653213,8.73624999999999,135.757670642722, 3479P 4220 +-78.0723482653213,7.11812499999999,0.,0.15,0.,0.,0.; 3479P 4221 +126,1,1,0,0,1,0,0.,0.,1.29788872083129,1.29788872083129,1.,1., 3481P 4222 +135.757670642722,-78.0723482653213,8.73624999999999, 3481P 4223 +121.756696066765,-78.0723308447116,8.73624999999999,0., 3481P 4224 +1.29788872083129,0.,0.,0.; 3481P 4225 +126,1,1,0,0,1,0,-1.29788872083129,-1.29788872083129,0.,0.,1.,1., 3483P 4226 +121.756696066765,-78.0723308447116,7.118125,135.757670642722, 3483P 4227 +-78.0723482653213,7.11812499999999,-1.29788872083129,0.,0.,0., 3483P 4228 +0.; 3483P 4229 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 3485P 4230 +-78.0723308447116,8.73624999999999,121.756696066765, 3485P 4231 +-78.0723308447116,7.11812499999999,0.,0.15,0.,0.,0.; 3485P 4232 +126,1,1,0,0,1,0,0.,0.,0.0556862004598031,0.0556862004598031,1., 3487P 4233 +1.,121.756696066765,-78.0723308447116,8.73624999999999, 3487P 4234 +121.756696066765,-77.4716159572514,8.73624999999999,0., 3487P 4235 +0.0556862004598031,0.,0.,0.; 3487P 4236 +126,1,1,0,0,1,0,-0.0556862004598031,-0.0556862004598031,0.,0., 3489P 4237 +1.,1.,121.756696066765,-77.4716159572514,7.118125, 3489P 4238 +121.756696066765,-78.0723308447116,7.118125,-0.0556862004598031, 3489P 4239 +0.,0.,0.,0.; 3489P 4240 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 3491P 4241 +-77.4716159572515,8.73624999999999,121.756696066765, 3491P 4242 +-77.4716159572515,7.11812499999999,0.,0.15,0.,0.,0.; 3491P 4243 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3493P 4244 +1.,121.756696066765,-77.4716159572515,8.73624999999999, 3493P 4245 +120.957281704017,-77.4716333778613,8.73624999999999,0., 3493P 4246 +0.0741056188123544,0.,0.,0.; 3493P 4247 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3495P 4248 +1.,1.,120.957281704017,-77.4716333778613,7.118125, 3495P 4249 +121.756696066765,-77.4716159572515,7.118125,-0.0741056188123544, 3495P 4250 +0.,0.,0.,0.; 3495P 4251 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,120.957281704017, 3497P 4252 +-77.4716333778613,8.73624999999999,120.957281704017, 3497P 4253 +-77.4716333778613,7.11812499999999,0.,0.15,0.,0.,0.; 3497P 4254 +126,1,1,0,0,1,0,0.,0.,1.18652964274089,1.18652964274089,1.,1., 3499P 4255 +120.957281704017,-77.4716333778613,8.73624999999999, 3499P 4256 +120.957281704017,-64.671944856794,8.73624999999999,0., 3499P 4257 +1.18652964274089,0.,0.,0.; 3499P 4258 +126,1,1,0,0,1,0,-1.18652964274089,-1.18652964274089,0.,0.,1.,1., 3501P 4259 +120.957281704017,-64.671944856794,7.118125,120.957281704017, 3501P 4260 +-77.4716333778613,7.118125,-1.18652964274089,0.,0.,0.,0.; 3501P 4261 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,120.957281704017, 3503P 4262 +-64.6719448567939,8.73624999999999,120.957281704017, 3503P 4263 +-64.6719448567939,7.11812499999999,0.,0.15,0.,0.,0.; 3503P 4264 +126,1,1,0,0,1,0,0.,0.,0.0741056187947589,0.0741056187947589,1., 3505P 4265 +1.,120.957281704017,-64.6719448567939,8.73624999999999, 3505P 4266 +121.756696066765,-64.6719448567939,8.73624999999999,0., 3505P 4267 +0.0741056187947589,0.,0.,0.; 3505P 4268 +126,1,1,0,0,1,0,-0.0741056187947589,-0.0741056187947589,0.,0., 3507P 4269 +1.,1.,121.756696066765,-64.6719448567939,7.118125, 3507P 4270 +120.957281704017,-64.6719448567939,7.118125,-0.0741056187947589, 3507P 4271 +0.,0.,0.,0.; 3507P 4272 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,121.756696066765, 3509P 4273 +-64.6719448567939,8.73624999999999,121.756696066765, 3509P 4274 +-64.6719448567939,7.11812499999999,0.,0.15,0.,0.,0.; 3509P 4275 +126,1,1,0,0,1,0,0.,0.,0.0556942749023435,0.0556942749023435,1., 3511P 4276 +1.,121.756696066765,-64.6719448567939,8.73624999999999, 3511P 4277 +121.756696066765,-64.0711428662849,8.73624999999999,0., 3511P 4278 +0.0556942749023435,0.,0.,0.; 3511P 4279 +126,1,1,0,0,1,0,-0.0556942749023435,-0.0556942749023435,0.,0., 3513P 4280 +1.,1.,121.756696066765,-64.0711428662849,7.118125, 3513P 4281 +121.756696066765,-64.6719448567939,7.118125,-0.0556942749023435, 3513P 4282 +0.,0.,0.,0.; 3513P 4283 +126,1,1,0,0,1,0,0.,0.,1.29788831710916,1.29788831710916,1.,1., 3515P 4284 +102.706327256509,-64.0713519136024,8.73624999999999, 3515P 4285 +116.707297477313,-64.0713693342122,8.73624999999999,0., 3515P 4286 +1.29788831710916,0.,0.,0.; 3515P 4287 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 3517P 4288 +-64.0713519136024,8.73624999999999,102.706327256509, 3517P 4289 +-64.0713519136024,7.118125,0.,0.15,0.,0.,0.; 3517P 4290 +126,1,1,0,0,1,0,-1.29788831710916,-1.29788831710916,0.,0.,1.,1., 3519P 4291 +116.707297477313,-64.0713693342122,7.118125,102.706327256509, 3519P 4292 +-64.0713519136024,7.118125,-1.29788831710916,0.,0.,0.,0.; 3519P 4293 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 3521P 4294 +-64.0713693342122,8.73624999999999,116.707297477313, 3521P 4295 +-64.0713693342122,7.11812499999999,0.,0.15,0.,0.,0.; 3521P 4296 +126,1,1,0,0,1,0,0.,0.,0.0556958897908544,0.0556958897908544,1., 3523P 4297 +1.,116.707297477313,-64.0713693342122,8.73624999999999, 3523P 4298 +116.707297477313,-64.672188745331,8.73624999999999,0., 3523P 4299 +0.0556958897908544,0.,0.,0.; 3523P 4300 +126,1,1,0,0,1,0,-0.0556958897908544,-0.0556958897908544,0.,0., 3525P 4301 +1.,1.,116.707297477313,-64.672188745331,7.118125, 3525P 4302 +116.707297477313,-64.0713693342122,7.118125,-0.0556958897908544, 3525P 4303 +0.,0.,0.,0.; 3525P 4304 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 3527P 4305 +-64.6721887453311,8.73624999999999,116.707297477313, 3527P 4306 +-64.6721887453311,7.11812499999999,0.,0.15,0.,0.,0.; 3527P 4307 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3529P 4308 +1.,116.707297477313,-64.6721887453311,8.73624999999999, 3529P 4309 +117.506711840062,-64.6721713247213,8.73624999999999,0., 3529P 4310 +0.0741056188123544,0.,0.,0.; 3529P 4311 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3531P 4312 +1.,1.,117.506711840062,-64.6721713247213,7.118125, 3531P 4313 +116.707297477313,-64.6721887453311,7.118125,-0.0741056188123544, 3531P 4314 +0.,0.,0.,0.; 3531P 4315 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,117.506711840062, 3533P 4316 +-64.6721713247213,8.73624999999999,117.506711840062, 3533P 4317 +-64.6721713247213,7.11812499999999,0.,0.15,0.,0.,0.; 3533P 4318 +126,1,1,0,0,1,0,0.,0.,1.18650703430203,1.18650703430203,1.,1., 3535P 4319 +117.506711840062,-64.6721713247213,8.73624999999999, 3535P 4320 +117.506720550367,-77.4716159572515,8.73624999999999,0., 3535P 4321 +1.18650703430203,0.,0.,0.; 3535P 4322 +126,1,1,0,0,1,0,-1.18650703430203,-1.18650703430203,0.,0.,1.,1., 3537P 4323 +117.506720550367,-77.4716159572515,7.118125,117.506711840062, 3537P 4324 +-64.6721713247213,7.118125,-1.18650703430203,0.,0.,0.,0.; 3537P 4325 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,117.506720550367, 3539P 4326 +-77.4716159572515,8.73624999999999,117.506720550367, 3539P 4327 +-77.4716159572515,7.11812499999999,0.,0.15,0.,0.,0.; 3539P 4328 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3541P 4329 +1.,117.506720550367,-77.4716159572515,8.73624999999999, 3541P 4330 +116.707306187618,-77.4716333778612,8.73624999999999,0., 3541P 4331 +0.0741056188123544,0.,0.,0.; 3541P 4332 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3543P 4333 +1.,1.,116.707306187618,-77.4716333778612,7.118125, 3543P 4334 +117.506720550367,-77.4716159572515,7.118125,-0.0741056188123544, 3543P 4335 +0.,0.,0.,0.; 3543P 4336 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707306187618, 3545P 4337 +-77.4716333778613,8.73624999999999,116.707306187618, 3545P 4338 +-77.4716333778613,7.11812499999999,0.,0.15,0.,0.,0.; 3545P 4339 +126,1,1,0,0,1,0,0.,0.,0.0556862004656535,0.0556862004656535,1., 3547P 4340 +1.,116.707306187618,-77.4716333778613,8.73624999999999, 3547P 4341 +116.707297477313,-78.0723482653214,8.73624999999999,0., 3547P 4342 +0.0556862004656535,0.,0.,0.; 3547P 4343 +126,1,1,0,0,1,0,-0.0556862004656535,-0.0556862004656535,0.,0., 3549P 4344 +1.,1.,116.707297477313,-78.0723482653214,7.118125, 3549P 4345 +116.707306187618,-77.4716333778613,7.118125,-0.0556862004656535, 3549P 4346 +0.,0.,0.,0.; 3549P 4347 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,116.707297477313, 3551P 4348 +-78.0723482653214,8.73624999999999,116.707297477313, 3551P 4349 +-78.0723482653214,7.11812499999999,0.,0.15,0.,0.,0.; 3551P 4350 +126,1,1,0,0,1,0,0.,0.,1.29788831710916,1.29788831710916,1.,1., 3553P 4351 +116.707297477313,-78.0723482653214,8.73624999999999, 3553P 4352 +102.706327256509,-78.0723308447116,8.73624999999999,0., 3553P 4353 +1.29788831710916,0.,0.,0.; 3553P 4354 +126,1,1,0,0,1,0,-1.29788831710916,-1.29788831710916,0.,0.,1.,1., 3555P 4355 +102.706327256509,-78.0723308447116,7.118125,116.707297477313, 3555P 4356 +-78.0723482653214,7.118125,-1.29788831710916,0.,0.,0.,0.; 3555P 4357 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 3557P 4358 +-78.0723308447116,8.73624999999999,102.706327256509, 3557P 4359 +-78.0723308447116,7.118125,0.,0.15,0.,0.,0.; 3557P 4360 +126,1,1,0,0,1,0,0.,0.,0.0556862004598031,0.0556862004598031,1., 3559P 4361 +1.,102.706327256509,-78.0723308447116,8.73624999999999, 3559P 4362 +102.706327256509,-77.4716159572514,8.73624999999999,0., 3559P 4363 +0.0556862004598031,0.,0.,0.; 3559P 4364 +126,1,1,0,0,1,0,-0.0556862004598031,-0.0556862004598031,0.,0., 3561P 4365 +1.,1.,102.706327256509,-77.4716159572514,7.118125, 3561P 4366 +102.706327256509,-78.0723308447116,7.118125,-0.0556862004598031, 3561P 4367 +0.,0.,0.,0.; 3561P 4368 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 3563P 4369 +-77.4716159572515,8.73624999999999,102.706327256509, 3563P 4370 +-77.4716159572515,7.118125,0.,0.15,0.,0.,0.; 3563P 4371 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3565P 4372 +1.,102.706327256509,-77.4716159572515,8.73624999999999, 3565P 4373 +101.90691289376,-77.4716333778613,8.73624999999999,0., 3565P 4374 +0.0741056188123544,0.,0.,0.; 3565P 4375 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3567P 4376 +1.,1.,101.90691289376,-77.4716333778613,7.118125, 3567P 4377 +102.706327256509,-77.4716159572515,7.118125,-0.0741056188123544, 3567P 4378 +0.,0.,0.,0.; 3567P 4379 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,101.90691289376, 3569P 4380 +-77.4716333778613,8.73624999999999,101.90691289376, 3569P 4381 +-77.4716333778613,7.118125,0.,0.15,0.,0.,0.; 3569P 4382 +126,1,1,0,0,1,0,0.,0.,1.18650703430176,1.18650703430176,1.,1., 3571P 4383 +101.90691289376,-77.4716333778613,8.73624999999999, 3571P 4384 +101.90691289376,-64.672188745331,8.73624999999999,0., 3571P 4385 +1.18650703430176,0.,0.,0.; 3571P 4386 +126,1,1,0,0,1,0,-1.18650703430176,-1.18650703430176,0.,0.,1.,1., 3573P 4387 +101.90691289376,-64.672188745331,7.118125,101.90691289376, 3573P 4388 +-77.4716333778613,7.118125,-1.18650703430176,0.,0.,0.,0.; 3573P 4389 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,101.90691289376, 3575P 4390 +-64.672188745331,8.73624999999999,101.90691289376, 3575P 4391 +-64.672188745331,7.118125,0.,0.15,0.,0.,0.; 3575P 4392 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3577P 4393 +1.,101.90691289376,-64.672188745331,8.73624999999999, 3577P 4394 +102.706327256509,-64.6721713247213,8.73624999999999,0., 3577P 4395 +0.0741056188123544,0.,0.,0.; 3577P 4396 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3579P 4397 +1.,1.,102.706327256509,-64.6721713247213,7.118125, 3579P 4398 +101.90691289376,-64.672188745331,7.118125,-0.0741056188123544, 3579P 4399 +0.,0.,0.,0.; 3579P 4400 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,102.706327256509, 3581P 4401 +-64.6721713247213,8.73624999999999,102.706327256509, 3581P 4402 +-64.6721713247213,7.118125,0.,0.15,0.,0.,0.; 3581P 4403 +126,1,1,0,0,1,0,0.,0.,0.0556958897908544,0.0556958897908544,1., 3583P 4404 +1.,102.706327256509,-64.6721713247213,8.73624999999999, 3583P 4405 +102.706327256509,-64.0713519136024,8.73624999999999,0., 3583P 4406 +0.0556958897908544,0.,0.,0.; 3583P 4407 +126,1,1,0,0,1,0,-0.0556958897908544,-0.0556958897908544,0.,0., 3585P 4408 +1.,1.,102.706327256509,-64.0713519136024,7.118125, 3585P 4409 +102.706327256509,-64.6721713247213,7.118125,-0.0556958897908544, 3585P 4410 +0.,0.,0.,0.; 3585P 4411 +126,1,1,0,0,1,0,0.,0.,1.29788831710916,1.29788831710916,1.,1., 3587P 4412 +83.6559584462526,-64.0713519136024,8.73625,97.6569286670568, 3587P 4413 +-64.0713693342122,8.73624999999999,0.,1.29788831710916,0.,0.,0.; 3587P 4414 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 3589P 4415 +-64.0713519136024,8.73625,83.6559584462526,-64.0713519136024, 3589P 4416 +7.118125,0.,0.15,0.,0.,0.; 3589P 4417 +126,1,1,0,0,1,0,-1.29788831710916,-1.29788831710916,0.,0.,1.,1., 3591P 4418 +97.6569286670568,-64.0713693342122,7.118125,83.6559584462526, 3591P 4419 +-64.0713519136024,7.118125,-1.29788831710916,0.,0.,0.,0.; 3591P 4420 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 3593P 4421 +-64.0713693342122,8.73624999999999,97.6569286670568, 3593P 4422 +-64.0713693342122,7.118125,0.,0.15,0.,0.,0.; 3593P 4423 +126,1,1,0,0,1,0,0.,0.,0.0556958897908544,0.0556958897908544,1., 3595P 4424 +1.,97.6569286670568,-64.0713693342122,8.73624999999999, 3595P 4425 +97.6569286670568,-64.672188745331,8.73624999999999,0., 3595P 4426 +0.0556958897908544,0.,0.,0.; 3595P 4427 +126,1,1,0,0,1,0,-0.0556958897908544,-0.0556958897908544,0.,0., 3597P 4428 +1.,1.,97.6569286670568,-64.672188745331,7.118125, 3597P 4429 +97.6569286670568,-64.0713693342122,7.118125,-0.0556958897908544, 3597P 4430 +0.,0.,0.,0.; 3597P 4431 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 3599P 4432 +-64.6721887453311,8.73624999999999,97.6569286670568, 3599P 4433 +-64.6721887453311,7.118125,0.,0.15,0.,0.,0.; 3599P 4434 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3601P 4435 +1.,97.6569286670568,-64.6721887453311,8.73624999999999, 3601P 4436 +98.4563430298053,-64.6721713247213,8.73624999999999,0., 3601P 4437 +0.0741056188123544,0.,0.,0.; 3601P 4438 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3603P 4439 +1.,1.,98.4563430298053,-64.6721713247213,7.118125, 3603P 4440 +97.6569286670568,-64.6721887453311,7.118125,-0.0741056188123544, 3603P 4441 +0.,0.,0.,0.; 3603P 4442 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,98.4563430298053, 3605P 4443 +-64.6721713247213,8.73624999999999,98.4563430298053, 3605P 4444 +-64.6721713247213,7.118125,0.,0.15,0.,0.,0.; 3605P 4445 +126,1,1,0,0,1,0,0.,0.,1.18650703430176,1.18650703430176,1.,1., 3607P 4446 +98.4563430298053,-64.6721713247213,8.73624999999999, 3607P 4447 +98.4563430298053,-77.4716159572515,8.73624999999999,0., 3607P 4448 +1.18650703430176,0.,0.,0.; 3607P 4449 +126,1,1,0,0,1,0,-1.18650703430176,-1.18650703430176,0.,0.,1.,1., 3609P 4450 +98.4563430298053,-77.4716159572515,7.118125,98.4563430298053, 3609P 4451 +-64.6721713247213,7.118125,-1.18650703430176,0.,0.,0.,0.; 3609P 4452 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,98.4563430298053, 3611P 4453 +-77.4716159572515,8.73624999999999,98.4563430298053, 3611P 4454 +-77.4716159572515,7.118125,0.,0.15,0.,0.,0.; 3611P 4455 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3613P 4456 +1.,98.4563430298053,-77.4716159572515,8.73624999999999, 3613P 4457 +97.6569286670568,-77.4716333778612,8.73624999999999,0., 3613P 4458 +0.0741056188123544,0.,0.,0.; 3613P 4459 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3615P 4460 +1.,1.,97.6569286670568,-77.4716333778612,7.118125, 3615P 4461 +98.4563430298053,-77.4716159572515,7.118125,-0.0741056188123544, 3615P 4462 +0.,0.,0.,0.; 3615P 4463 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 3617P 4464 +-77.4716333778613,8.73624999999999,97.6569286670568, 3617P 4465 +-77.4716333778613,7.118125,0.,0.15,0.,0.,0.; 3617P 4466 +126,1,1,0,0,1,0,0.,0.,0.0556862004597996,0.0556862004597996,1., 3619P 4467 +1.,97.6569286670568,-77.4716333778613,8.73624999999999, 3619P 4468 +97.6569286670568,-78.0723482653214,8.73624999999999,0., 3619P 4469 +0.0556862004597996,0.,0.,0.; 3619P 4470 +126,1,1,0,0,1,0,-0.0556862004597996,-0.0556862004597996,0.,0., 3621P 4471 +1.,1.,97.6569286670568,-78.0723482653214,7.118125, 3621P 4472 +97.6569286670568,-77.4716333778613,7.118125,-0.0556862004597996, 3621P 4473 +0.,0.,0.,0.; 3621P 4474 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,97.6569286670568, 3623P 4475 +-78.0723482653214,8.73624999999999,97.6569286670568, 3623P 4476 +-78.0723482653214,7.118125,0.,0.15,0.,0.,0.; 3623P 4477 +126,1,1,0,0,1,0,0.,0.,1.29788912455341,1.29788912455341,1.,1., 3625P 4478 +97.6569286670568,-78.0723482653214,8.73624999999999, 3625P 4479 +83.6559497359477,-78.0723308447116,8.73625,0.,1.29788912455341, 3625P 4480 +0.,0.,0.; 3625P 4481 +126,1,1,0,0,1,0,-1.29788912455341,-1.29788912455341,0.,0.,1.,1., 3627P 4482 +83.6559497359477,-78.0723308447116,7.118125,97.6569286670568, 3627P 4483 +-78.0723482653214,7.118125,-1.29788912455341,0.,0.,0.,0.; 3627P 4484 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559497359477, 3629P 4485 +-78.0723308447116,8.73625,83.6559497359477,-78.0723308447116, 3629P 4486 +7.118125,0.,0.15,0.,0.,0.; 3629P 4487 +126,1,1,0,0,1,0,0.,0.,0.055686200465657,0.055686200465657,1.,1., 3631P 4488 +83.6559497359477,-78.0723308447116,8.73625,83.6559584462526, 3631P 4489 +-77.4716159572514,8.73625,0.,0.055686200465657,0.,0.,0.; 3631P 4490 +126,1,1,0,0,1,0,-0.055686200465657,-0.055686200465657,0.,0.,1., 3633P 4491 +1.,83.6559584462526,-77.4716159572514,7.118125,83.6559497359477, 3633P 4492 +-78.0723308447116,7.118125,-0.055686200465657,0.,0.,0.,0.; 3633P 4493 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 3635P 4494 +-77.4716159572515,8.73625,83.6559584462526,-77.4716159572515, 3635P 4495 +7.118125,0.,0.15,0.,0.,0.; 3635P 4496 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3637P 4497 +1.,83.6559584462526,-77.4716159572515,8.73625,82.8565440835041, 3637P 4498 +-77.4716333778613,8.73625,0.,0.0741056188123544,0.,0.,0.; 3637P 4499 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3639P 4500 +1.,1.,82.8565440835041,-77.4716333778613,7.118125, 3639P 4501 +83.6559584462526,-77.4716159572515,7.118125,-0.0741056188123544, 3639P 4502 +0.,0.,0.,0.; 3639P 4503 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,82.8565440835042, 3641P 4504 +-77.4716333778613,8.73625,82.8565440835042,-77.4716333778613, 3641P 4505 +7.118125,0.,0.15,0.,0.,0.; 3641P 4506 +126,1,1,0,0,1,0,0.,0.,1.18650703430176,1.18650703430176,1.,1., 3643P 4507 +82.8565440835042,-77.4716333778613,8.73625,82.8565440835042, 3643P 4508 +-64.672188745331,8.73625,0.,1.18650703430176,0.,0.,0.; 3643P 4509 +126,1,1,0,0,1,0,-1.18650703430176,-1.18650703430176,0.,0.,1.,1., 3645P 4510 +82.8565440835042,-64.672188745331,7.118125,82.8565440835042, 3645P 4511 +-77.4716333778613,7.118125,-1.18650703430176,0.,0.,0.,0.; 3645P 4512 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,82.8565440835042, 3647P 4513 +-64.672188745331,8.73625,82.8565440835042,-64.672188745331, 3647P 4514 +7.118125,0.,0.15,0.,0.,0.; 3647P 4515 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3649P 4516 +1.,82.8565440835042,-64.672188745331,8.73625,83.6559584462526, 3649P 4517 +-64.6721713247213,8.73625,0.,0.0741056188123544,0.,0.,0.; 3649P 4518 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3651P 4519 +1.,1.,83.6559584462526,-64.6721713247213,7.118125, 3651P 4520 +82.8565440835042,-64.672188745331,7.118125,-0.0741056188123544, 3651P 4521 +0.,0.,0.,0.; 3651P 4522 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,83.6559584462526, 3653P 4523 +-64.6721713247213,8.73625,83.6559584462526,-64.6721713247213, 3653P 4524 +7.118125,0.,0.15,0.,0.,0.; 3653P 4525 +126,1,1,0,0,1,0,0.,0.,0.0556958897908544,0.0556958897908544,1., 3655P 4526 +1.,83.6559584462526,-64.6721713247213,8.73625,83.6559584462526, 3655P 4527 +-64.0713519136024,8.73625,0.,0.0556958897908544,0.,0.,0.; 3655P 4528 +126,1,1,0,0,1,0,-0.0556958897908544,-0.0556958897908544,0.,0., 3657P 4529 +1.,1.,83.6559584462526,-64.0713519136024,7.118125, 3657P 4530 +83.6559584462526,-64.6721713247213,7.118125,-0.0556958897908544, 3657P 4531 +0.,0.,0.,0.; 3657P 4532 +126,1,1,0,0,1,0,0.,0.,1.29788831710916,1.29788831710916,1.,1., 3659P 4533 +64.6055896359963,-64.0713519136024,8.73625,78.6065598568005, 3659P 4534 +-64.0713693342122,8.73625,0.,1.29788831710916,0.,0.,0.; 3659P 4535 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 3661P 4536 +-64.0713519136024,8.73625,64.6055896359963,-64.0713519136024, 3661P 4537 +7.118125,0.,0.15,0.,0.,0.; 3661P 4538 +126,1,1,0,0,1,0,-1.29788831710916,-1.29788831710916,0.,0.,1.,1., 3663P 4539 +78.6065598568005,-64.0713693342122,7.118125,64.6055896359963, 3663P 4540 +-64.0713519136024,7.118125,-1.29788831710916,0.,0.,0.,0.; 3663P 4541 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 3665P 4542 +-64.0713693342122,8.73625,78.6065598568005,-64.0713693342122, 3665P 4543 +7.118125,0.,0.15,0.,0.,0.; 3665P 4544 +126,1,1,0,0,1,0,0.,0.,0.0556958897908544,0.0556958897908544,1., 3667P 4545 +1.,78.6065598568005,-64.0713693342122,8.73625,78.6065598568005, 3667P 4546 +-64.672188745331,8.73625,0.,0.0556958897908544,0.,0.,0.; 3667P 4547 +126,1,1,0,0,1,0,-0.0556958897908544,-0.0556958897908544,0.,0., 3669P 4548 +1.,1.,78.6065598568005,-64.672188745331,7.118125, 3669P 4549 +78.6065598568005,-64.0713693342122,7.118125,-0.0556958897908544, 3669P 4550 +0.,0.,0.,0.; 3669P 4551 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 3671P 4552 +-64.6721887453311,8.73625,78.6065598568005,-64.6721887453311, 3671P 4553 +7.118125,0.,0.15,0.,0.,0.; 3671P 4554 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3673P 4555 +1.,78.6065598568005,-64.6721887453311,8.73625,79.405974219549, 3673P 4556 +-64.6721713247213,8.73625,0.,0.0741056188123544,0.,0.,0.; 3673P 4557 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3675P 4558 +1.,1.,79.405974219549,-64.6721713247213,7.118125, 3675P 4559 +78.6065598568005,-64.6721887453311,7.118125,-0.0741056188123544, 3675P 4560 +0.,0.,0.,0.; 3675P 4561 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,79.4059742195489, 3677P 4562 +-64.6721713247213,8.73625,79.4059742195489,-64.6721713247213, 3677P 4563 +7.118125,0.,0.15,0.,0.,0.; 3677P 4564 +126,1,1,0,0,1,0,0.,0.,1.18650703430176,1.18650703430176,1.,1., 3679P 4565 +79.4059742195489,-64.6721713247213,8.73625,79.4059742195489, 3679P 4566 +-77.4716159572515,8.73625,0.,1.18650703430176,0.,0.,0.; 3679P 4567 +126,1,1,0,0,1,0,-1.18650703430176,-1.18650703430176,0.,0.,1.,1., 3681P 4568 +79.4059742195489,-77.4716159572515,7.118125,79.4059742195489, 3681P 4569 +-64.6721713247213,7.118125,-1.18650703430176,0.,0.,0.,0.; 3681P 4570 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,79.4059742195489, 3683P 4571 +-77.4716159572515,8.73625,79.4059742195489,-77.4716159572515, 3683P 4572 +7.118125,0.,0.15,0.,0.,0.; 3683P 4573 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3685P 4574 +1.,79.4059742195489,-77.4716159572515,8.73625,78.6065598568005, 3685P 4575 +-77.4716333778612,8.73625,0.,0.0741056188123544,0.,0.,0.; 3685P 4576 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3687P 4577 +1.,1.,78.6065598568005,-77.4716333778612,7.118125, 3687P 4578 +79.4059742195489,-77.4716159572515,7.118125,-0.0741056188123544, 3687P 4579 +0.,0.,0.,0.; 3687P 4580 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 3689P 4581 +-77.4716333778613,8.73625,78.6065598568005,-77.4716333778613, 3689P 4582 +7.118125,0.,0.15,0.,0.,0.; 3689P 4583 +126,1,1,0,0,1,0,0.,0.,0.0556862004597996,0.0556862004597996,1., 3691P 4584 +1.,78.6065598568005,-77.4716333778613,8.73625,78.6065598568005, 3691P 4585 +-78.0723482653214,8.73625,0.,0.0556862004597996,0.,0.,0.; 3691P 4586 +126,1,1,0,0,1,0,-0.0556862004597996,-0.0556862004597996,0.,0., 3693P 4587 +1.,1.,78.6065598568005,-78.0723482653214,7.118125, 3693P 4588 +78.6065598568005,-77.4716333778613,7.118125,-0.0556862004597996, 3693P 4589 +0.,0.,0.,0.; 3693P 4590 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,78.6065598568005, 3695P 4591 +-78.0723482653214,8.73625,78.6065598568005,-78.0723482653214, 3695P 4592 +7.118125,0.,0.15,0.,0.,0.; 3695P 4593 +126,1,1,0,0,1,0,0.,0.,1.29788831710916,1.29788831710916,1.,1., 3697P 4594 +78.6065598568005,-78.0723482653214,8.73625,64.6055896359963, 3697P 4595 +-78.0723308447116,8.73625,0.,1.29788831710916,0.,0.,0.; 3697P 4596 +126,1,1,0,0,1,0,-1.29788831710916,-1.29788831710916,0.,0.,1.,1., 3699P 4597 +64.6055896359963,-78.0723308447116,7.118125,78.6065598568005, 3699P 4598 +-78.0723482653214,7.118125,-1.29788831710916,0.,0.,0.,0.; 3699P 4599 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 3701P 4600 +-78.0723308447116,8.73625,64.6055896359963,-78.0723308447116, 3701P 4601 +7.118125,0.,0.15,0.,0.,0.; 3701P 4602 +126,1,1,0,0,1,0,0.,0.,0.0556862004598031,0.0556862004598031,1., 3703P 4603 +1.,64.6055896359963,-78.0723308447116,8.73625,64.6055896359963, 3703P 4604 +-77.4716159572514,8.73625,0.,0.0556862004598031,0.,0.,0.; 3703P 4605 +126,1,1,0,0,1,0,-0.0556862004598031,-0.0556862004598031,0.,0., 3705P 4606 +1.,1.,64.6055896359963,-77.4716159572514,7.118125, 3705P 4607 +64.6055896359963,-78.0723308447116,7.118125,-0.0556862004598031, 3705P 4608 +0.,0.,0.,0.; 3705P 4609 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 3707P 4610 +-77.4716159572515,8.73625,64.6055896359963,-77.4716159572515, 3707P 4611 +7.118125,0.,0.15,0.,0.,0.; 3707P 4612 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3709P 4613 +1.,64.6055896359963,-77.4716159572515,8.73625,63.8061752732478, 3709P 4614 +-77.4716333778613,8.73625,0.,0.0741056188123544,0.,0.,0.; 3709P 4615 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3711P 4616 +1.,1.,63.8061752732478,-77.4716333778613,7.118125, 3711P 4617 +64.6055896359963,-77.4716159572515,7.118125,-0.0741056188123544, 3711P 4618 +0.,0.,0.,0.; 3711P 4619 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,63.8061752732478, 3713P 4620 +-77.4716333778613,8.73625,63.8061752732478,-77.4716333778613, 3713P 4621 +7.118125,0.,0.15,0.,0.,0.; 3713P 4622 +126,1,1,0,0,1,0,0.,0.,1.18650703430176,1.18650703430176,1.,1., 3715P 4623 +63.8061752732478,-77.4716333778613,8.73625,63.8061752732478, 3715P 4624 +-64.672188745331,8.73625,0.,1.18650703430176,0.,0.,0.; 3715P 4625 +126,1,1,0,0,1,0,-1.18650703430176,-1.18650703430176,0.,0.,1.,1., 3717P 4626 +63.8061752732478,-64.672188745331,7.118125,63.8061752732478, 3717P 4627 +-77.4716333778613,7.118125,-1.18650703430176,0.,0.,0.,0.; 3717P 4628 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,63.8061752732478, 3719P 4629 +-64.672188745331,8.73625,63.8061752732478,-64.672188745331, 3719P 4630 +7.118125,0.,0.15,0.,0.,0.; 3719P 4631 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3721P 4632 +1.,63.8061752732478,-64.672188745331,8.73625,64.6055896359963, 3721P 4633 +-64.6721713247213,8.73625,0.,0.0741056188123544,0.,0.,0.; 3721P 4634 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3723P 4635 +1.,1.,64.6055896359963,-64.6721713247213,7.118125, 3723P 4636 +63.8061752732478,-64.672188745331,7.118125,-0.0741056188123544, 3723P 4637 +0.,0.,0.,0.; 3723P 4638 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,64.6055896359963, 3725P 4639 +-64.6721713247213,8.73625,64.6055896359963,-64.6721713247213, 3725P 4640 +7.118125,0.,0.15,0.,0.,0.; 3725P 4641 +126,1,1,0,0,1,0,0.,0.,0.0556958897908544,0.0556958897908544,1., 3727P 4642 +1.,64.6055896359963,-64.6721713247213,8.73625,64.6055896359963, 3727P 4643 +-64.0713519136024,8.73625,0.,0.0556958897908544,0.,0.,0.; 3727P 4644 +126,1,1,0,0,1,0,-0.0556958897908544,-0.0556958897908544,0.,0., 3729P 4645 +1.,1.,64.6055896359963,-64.0713519136024,7.118125, 3729P 4646 +64.6055896359963,-64.6721713247213,7.118125,-0.0556958897908544, 3729P 4647 +0.,0.,0.,0.; 3729P 4648 +126,1,1,0,0,1,0,0.,0.,1.29779626846414,1.29779626846414,1.,1., 3731P 4649 +45.5564838199499,-64.0713519136024,8.73625,59.5564610659959, 3731P 4650 +-64.0713693342122,8.73625,0.,1.29779626846414,0.,0.,0.; 3731P 4651 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.5564838199499, 3733P 4652 +-64.0713519136024,8.73625,45.5564838199499,-64.0713519136024, 3733P 4653 +7.118125,0.,0.15,0.,0.,0.; 3733P 4654 +126,1,1,0,0,1,0,-1.29779626846414,-1.29779626846414,0.,0.,1.,1., 3735P 4655 +59.5564610659959,-64.0713693342122,7.118125,45.5564838199499, 3735P 4656 +-64.0713519136024,7.118125,-1.29779626846414,0.,0.,0.,0.; 3735P 4657 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5564610659959, 3737P 4658 +-64.0713693342122,8.73625,59.5564610659959,-64.0713693342122, 3737P 4659 +7.118125,0.,0.15,0.,0.,0.; 3737P 4660 +126,1,1,0,0,1,0,0.,0.,0.0556958897908544,0.0556958897908544,1., 3739P 4661 +1.,59.5564610659959,-64.0713693342122,8.73625,59.5564610659959, 3739P 4662 +-64.672188745331,8.73625,0.,0.0556958897908544,0.,0.,0.; 3739P 4663 +126,1,1,0,0,1,0,-0.0556958897908544,-0.0556958897908544,0.,0., 3741P 4664 +1.,1.,59.5564610659959,-64.672188745331,7.118125, 3741P 4665 +59.5564610659959,-64.0713693342122,7.118125,-0.0556958897908544, 3741P 4666 +0.,0.,0.,0.; 3741P 4667 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5564610659959, 3743P 4668 +-64.6721887453311,8.73625,59.5564610659959,-64.6721887453311, 3743P 4669 +7.118125,0.,0.15,0.,0.,0.; 3743P 4670 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3745P 4671 +1.,59.5564610659959,-64.6721887453311,8.73625,60.3558754287444, 3745P 4672 +-64.6721713247213,8.73625,0.,0.0741056188123544,0.,0.,0.; 3745P 4673 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3747P 4674 +1.,1.,60.3558754287444,-64.6721713247213,7.118125, 3747P 4675 +59.5564610659959,-64.6721887453311,7.118125,-0.0741056188123544, 3747P 4676 +0.,0.,0.,0.; 3747P 4677 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,60.3558754287444, 3749P 4678 +-64.6721713247213,8.73625,60.3558754287444,-64.6721713247213, 3749P 4679 +7.118125,0.,0.15,0.,0.,0.; 3749P 4680 +126,1,1,0,0,1,0,0.,0.,1.18650703430176,1.18650703430176,1.,1., 3751P 4681 +60.3558754287444,-64.6721713247213,8.73625,60.3558754287444, 3751P 4682 +-77.4716159572515,8.73625,0.,1.18650703430176,0.,0.,0.; 3751P 4683 +126,1,1,0,0,1,0,-1.18650703430176,-1.18650703430176,0.,0.,1.,1., 3753P 4684 +60.3558754287444,-77.4716159572515,7.118125,60.3558754287444, 3753P 4685 +-64.6721713247213,7.118125,-1.18650703430176,0.,0.,0.,0.; 3753P 4686 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,60.3558754287444, 3755P 4687 +-77.4716159572515,8.73625,60.3558754287444,-77.4716159572515, 3755P 4688 +7.118125,0.,0.15,0.,0.,0.; 3755P 4689 +126,1,1,0,0,1,0,0.,0.,0.0741056188123544,0.0741056188123544,1., 3757P 4690 +1.,60.3558754287444,-77.4716159572515,8.73625,59.5564610659959, 3757P 4691 +-77.4716333778612,8.73625,0.,0.0741056188123544,0.,0.,0.; 3757P 4692 +126,1,1,0,0,1,0,-0.0741056188123544,-0.0741056188123544,0.,0., 3759P 4693 +1.,1.,59.5564610659959,-77.4716333778612,7.118125, 3759P 4694 +60.3558754287444,-77.4716159572515,7.118125,-0.0741056188123544, 3759P 4695 +0.,0.,0.,0.; 3759P 4696 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5564610659959, 3761P 4697 +-77.4716333778613,8.73625,59.5564610659959,-77.4716333778613, 3761P 4698 +7.118125,0.,0.15,0.,0.,0.; 3761P 4699 +126,1,1,0,0,1,0,0.,0.,0.0556862004597996,0.0556862004597996,1., 3763P 4700 +1.,59.5564610659959,-77.4716333778613,8.73625,59.5564610659959, 3763P 4701 +-78.0723482653214,8.73625,0.,0.0556862004597996,0.,0.,0.; 3763P 4702 +126,1,1,0,0,1,0,-0.0556862004597996,-0.0556862004597996,0.,0., 3765P 4703 +1.,1.,59.5564610659959,-78.0723482653214,7.118125, 3765P 4704 +59.5564610659959,-77.4716333778613,7.118125,-0.0556862004597996, 3765P 4705 +0.,0.,0.,0.; 3765P 4706 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,59.5564610659959, 3767P 4707 +-78.0723482653214,8.73625,59.5564610659959,-78.0723482653214, 3767P 4708 +7.118125,0.,0.15,0.,0.,0.; 3767P 4709 +126,1,1,0,0,1,0,0.,0.,1.29779626846414,1.29779626846414,1.,1., 3769P 4710 +59.5564610659959,-78.0723482653214,8.73625,45.5564838199499, 3769P 4711 +-78.0723308447116,8.73625,0.,1.29779626846414,0.,0.,0.; 3769P 4712 +126,1,1,0,0,1,0,-1.29779626846414,-1.29779626846414,0.,0.,1.,1., 3771P 4713 +45.5564838199499,-78.0723308447116,7.11812500000001, 3771P 4714 +59.5564610659959,-78.0723482653214,7.118125,-1.29779626846414, 3771P 4715 +0.,0.,0.,0.; 3771P 4716 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.5564838199499, 3773P 4717 +-78.0723308447116,8.73625,45.5564838199499,-78.0723308447116, 3773P 4718 +7.118125,0.,0.15,0.,0.,0.; 3773P 4719 +126,1,1,0,0,1,0,0.,0.,0.0556862004598031,0.0556862004598031,1., 3775P 4720 +1.,45.5564838199499,-78.0723308447116,8.73625,45.5564838199499, 3775P 4721 +-77.4716159572514,8.73625,0.,0.0556862004598031,0.,0.,0.; 3775P 4722 +126,1,1,0,0,1,0,-0.0556862004598031,-0.0556862004598031,0.,0., 3777P 4723 +1.,1.,45.5564838199499,-77.4716159572514,7.118125, 3777P 4724 +45.5564838199499,-78.0723308447116,7.118125,-0.0556862004598031, 3777P 4725 +0.,0.,0.,0.; 3777P 4726 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.5564838199499, 3779P 4727 +-77.4716159572515,8.73625,45.5564838199499,-77.4716159572515, 3779P 4728 +7.118125,0.,0.15,0.,0.,0.; 3779P 4729 +126,1,1,0,0,1,0,0.,0.,0.0741621399101609,0.0741621399101609,1., 3781P 4730 +1.,45.5564838199499,-77.4716159572515,8.73625,44.7564597358587, 3781P 4731 +-77.4716333778613,8.73625,0.,0.0741621399101609,0.,0.,0.; 3781P 4732 +126,1,1,0,0,1,0,-0.0741621399101609,-0.0741621399101609,0.,0., 3783P 4733 +1.,1.,44.7564597358587,-77.4716333778613,7.118125, 3783P 4734 +45.5564838199499,-77.4716159572515,7.118125,-0.0741621399101609, 3783P 4735 +0.,0.,0.,0.; 3783P 4736 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,44.7564597358587, 3785P 4737 +-77.4716333778613,8.73625,44.7564597358587,-77.4716333778613, 3785P 4738 +7.118125,0.,0.15,0.,0.,0.; 3785P 4739 +126,1,1,0,0,1,0,0.,0.,1.18650703430286,1.18650703430286,1.,1., 3787P 4740 +44.7564597358587,-77.4716333778613,8.73625,44.7564771564685, 3787P 4741 +-64.672188745331,8.73625,0.,1.18650703430286,0.,0.,0.; 3787P 4742 +126,1,1,0,0,1,0,-1.18650703430286,-1.18650703430286,0.,0.,1.,1., 3789P 4743 +44.7564771564685,-64.672188745331,7.118125,44.7564597358587, 3789P 4744 +-77.4716333778613,7.118125,-1.18650703430286,0.,0.,0.,0.; 3789P 4745 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,44.7564771564685, 3791P 4746 +-64.672188745331,8.73625,44.7564771564685,-64.672188745331, 3791P 4747 +7.118125,0.,0.15,0.,0.,0.; 3791P 4748 +126,1,1,0,0,1,0,0.,0.,0.0741621399101609,0.0741621399101609,1., 3793P 4749 +1.,44.7564771564685,-64.672188745331,8.73625,45.5565012405597, 3793P 4750 +-64.6721713247213,8.73625,0.,0.0741621399101609,0.,0.,0.; 3793P 4751 +126,1,1,0,0,1,0,-0.0741621399101609,-0.0741621399101609,0.,0., 3795P 4752 +1.,1.,45.5565012405597,-64.6721713247213,7.118125, 3795P 4753 +44.7564771564685,-64.672188745331,7.118125,-0.0741621399101609, 3795P 4754 +0.,0.,0.,0.; 3795P 4755 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,45.5565012405597, 3797P 4756 +-64.6721713247213,8.73625,45.5565012405597,-64.6721713247213, 3797P 4757 +7.118125,0.,0.15,0.,0.,0.; 3797P 4758 +126,1,1,0,0,1,0,0.,0.,0.055695889814266,0.055695889814266,1.,1., 3799P 4759 +45.5565012405597,-64.6721713247213,8.73625,45.5564838199499, 3799P 4760 +-64.0713519136024,8.73625,0.,0.055695889814266,0.,0.,0.; 3799P 4761 +126,1,1,0,0,1,0,-0.055695889814266,-0.055695889814266,0.,0.,1., 3801P 4762 +1.,45.5564838199499,-64.0713519136024,7.118125,45.5565012405597, 3801P 4763 +-64.6721713247213,7.118125,-0.055695889814266,0.,0.,0.,0.; 3801P 4764 +126,2,2,0,0,0,0,0.,0.,0.,1.53806598054936,1.53806598054936, 3803P 4765 +1.53806598054936,1.,0.718583503390014,1.,155.763761628875, 3803P 4766 +-53.5475075752323,8.73624999999999,157.701439739527, 3803P 4767 +-53.5475075752323,8.73624999999999,157.764849292068, 3803P 4768 +-55.4841478849295,8.73624999999999,0.,1.53806598054936,0.,0.,0.; 3803P 4769 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,157.764849292068, 3805P 4770 +-55.4841478849295,8.73624999999999,157.764849292068, 3805P 4771 +-55.4841478849295,7.11812499999999,0.,0.15,0.,0.,0.; 3805P 4772 +126,2,2,0,0,0,0,0.,0.,0.,1.53806598054936,1.53806598054936, 3807P 4773 +1.53806598054936,1.,0.718583503390014,1.,155.763761628875, 3807P 4774 +-53.5475075752323,7.11812499999999,157.701439739527, 3807P 4775 +-53.5475075752323,7.11812499999999,157.764849292068, 3807P 4776 +-55.4841478849295,7.11812499999999,0.,1.53806598054936,0.,0.,0.; 3807P 4777 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,155.763761628875, 3809P 4778 +-53.5475075752323,8.73624999999999,155.763761628875, 3809P 4779 +-53.5475075752323,7.11812499999999,0.,0.15,0.,0.,0.; 3809P 4780 +126,1,1,0,0,1,0,0.,0.,10.304761256663,10.304761256663,1.,1., 3811P 4781 +44.6011495726228,-53.5475075752323,8.73625,155.763761628875, 3811P 4782 +-53.5475075752323,8.73624999999999,0.,10.304761256663,0.,0.,0.; 3811P 4783 +126,1,1,0,0,1,0,0.,0.,10.304761256663,10.304761256663,1.,1., 3813P 4784 +44.6011495726228,-53.5475075752323,7.118125,155.763761628875, 3813P 4785 +-53.5475075752323,7.11812499999999,0.,10.304761256663,0.,0.,0.; 3813P 4786 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,44.6011495726228, 3815P 4787 +-53.5475075752323,8.73625,44.6011495726228,-53.5475075752323, 3815P 4788 +7.118125,0.,0.15,0.,0.,0.; 3815P 4789 +126,2,2,0,0,0,0,0.,0.,0.,1.57079496575076,1.57079496575076, 3817P 4790 +1.57079496575076,1.,0.707107262388153,1.,42.5989895726247, 3817P 4791 +-55.5496648502041,8.73625,42.5989922976491,-53.5475075752323, 3817P 4792 +8.73625,44.6011495726228,-53.5475075752324,8.73625,0., 3817P 4793 +1.57079496575076,0.,0.,0.; 3817P 4794 +126,2,2,0,0,0,0,0.,0.,0.,1.57079496575076,1.57079496575076, 3819P 4795 +1.57079496575076,1.,0.707107262388153,1.,42.5989895726247, 3819P 4796 +-55.5496648502041,7.118125,42.5989922976491,-53.5475075752323, 3819P 4797 +7.118125,44.6011495726228,-53.5475075752324,7.118125,0., 3819P 4798 +1.57079496575076,0.,0.,0.; 3819P 4799 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,42.5989895726247, 3821P 4800 +-55.5496648502042,8.73625,42.5989895726247,-55.5496648502042, 3821P 4801 +7.118125,0.,0.15,0.,0.,0.; 3821P 4802 +126,1,1,0,0,1,0,0.,0.,7.61968862441745,7.61968862441745,1.,1., 3823P 4803 +42.5989922976492,-137.747055886107,8.73625,42.5989895726247, 3823P 4804 +-55.5496648502041,8.73625,0.,7.61968862441745,0.,0.,0.; 3823P 4805 +126,1,1,0,0,1,0,0.,0.,7.61968862441745,7.61968862441745,1.,1., 3825P 4806 +42.5989922976492,-137.747055886107,7.118125,42.5989895726247, 3825P 4807 +-55.5496648502041,7.118125,0.,7.61968862441745,0.,0.,0.; 3825P 4808 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,42.5989922976492, 3827P 4809 +-137.747055886107,8.73625,42.5989922976492,-137.747055886107, 3827P 4810 +7.118125,0.,0.15,0.,0.,0.; 3827P 4811 +126,2,2,0,0,0,0,0.,0.,0.,1.57079632679493,1.57079632679493, 3829P 4812 +1.57079632679493,1.,0.707106781186538,1.,44.6011522976492, 3829P 4813 +-139.749215886107,8.73625,42.5989922976492,-139.749215886107, 3829P 4814 +8.73625,42.5989922976492,-137.747055886107,8.73625,0., 3829P 4815 +1.57079632679493,0.,0.,0.; 3829P 4816 +126,2,2,0,0,0,0,0.,0.,0.,1.57079632679493,1.57079632679493, 3831P 4817 +1.57079632679493,1.,0.707106781186538,1.,44.6011522976492, 3831P 4818 +-139.749215886107,7.118125,42.5989922976492,-139.749215886107, 3831P 4819 +7.118125,42.5989922976492,-137.747055886107,7.118125,0., 3831P 4820 +1.57079632679493,0.,0.,0.; 3831P 4821 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,44.6011522976492, 3833P 4822 +-139.749215886107,8.73625,44.6011522976492,-139.749215886107, 3833P 4823 +7.118125,0.,0.15,0.,0.,0.; 3833P 4824 +126,1,1,0,0,1,0,0.,0.,10.3047578082426,10.3047578082426,1.,1., 3835P 4825 +155.763727154066,-139.749215886107,8.73624999999999, 3835P 4826 +44.6011522976492,-139.749215886107,8.73625,0.,10.3047578082426, 3835P 4827 +0.,0.,0.; 3835P 4828 +126,1,1,0,0,1,0,0.,0.,10.3047578082426,10.3047578082426,1.,1., 3837P 4829 +155.763727154066,-139.749215886107,7.11812499999999, 3837P 4830 +44.6011522976492,-139.749215886107,7.118125,0.,10.3047578082426, 3837P 4831 +0.,0.,0.; 3837P 4832 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,155.763727154066, 3839P 4833 +-139.749215886107,8.73624999999999,155.763727154066, 3839P 4834 +-139.749215886107,7.11812499999999,0.,0.15,0.,0.,0.; 3839P 4835 +126,4,2,0,0,0,0,0.,0.,0.,0.785406772727343,0.785406772727343, 3841P 4836 +1.57081354545469,1.57081354545469,1.57081354545469,1., 3841P 4837 +0.923877885178717,1.,0.923877885178737,1.,157.76588715377, 3841P 4838 +-137.747021411595,8.73624999999999,157.765901433754, 3841P 4839 +-138.576353334882,8.73624999999999,157.179480255615, 3841P 4840 +-139.162784610495,8.73624999999999,156.593059077476, 3841P 4841 +-139.749215886107,8.73624999999999,155.763727154066, 3841P 4842 +-139.749215886107,8.73624999999999,0.,1.57081354545469,0.,0.,0.; 3841P 4843 +126,4,2,0,0,0,0,0.,0.,0.,0.785406772727343,0.785406772727343, 3843P 4844 +1.57081354545469,1.57081354545469,1.57081354545469,1., 3843P 4845 +0.923877885178717,1.,0.923877885178737,1.,157.76588715377, 3843P 4846 +-137.747021411595,7.11812499999999,157.765901433754, 3843P 4847 +-138.576353334882,7.11812499999999,157.179480255615, 3843P 4848 +-139.162784610495,7.11812499999999,156.593059077476, 3843P 4849 +-139.749215886107,7.11812499999999,155.763727154066, 3843P 4850 +-139.749215886107,7.11812499999999,0.,1.57081354545469,0.,0.,0.; 3843P 4851 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,157.76588715377, 3845P 4852 +-137.747021411595,8.73624999999999,157.76588715377, 3845P 4853 +-137.747021411595,7.11812499999999,0.,0.15,0.,0.,0.; 3845P 4854 +126,1,1,0,0,1,0,0.,0.,5.58752310204211,5.58752310204211,1.,1., 3847P 4855 +157.764849292068,-77.4716159572515,8.73624999999999, 3847P 4856 +157.76588715377,-137.747021411595,8.73624999999999,0., 3847P 4857 +5.58752310204211,0.,0.,0.; 3847P 4858 +126,1,1,0,0,1,0,0.,0.,5.58752310204211,5.58752310204211,1.,1., 3849P 4859 +157.764849292068,-77.4716159572515,7.11812499999999, 3849P 4860 +157.76588715377,-137.747021411595,7.11812499999999,0., 3849P 4861 +5.58752310204211,0.,0.,0.; 3849P 4862 +126,1,1,0,0,1,0,0.,0.,0.15,0.15,1.,1.,157.764849292068, 3851P 4863 +-77.4716159572515,8.73624999999999,157.764849292068, 3851P 4864 +-77.4716159572515,7.11812499999999,0.,0.15,0.,0.,0.; 3851P 4865 +126,1,1,0,0,1,0,-0.851617485069212,-0.851617485069212, 3853P 4866 +1.18661825744036,1.18661825744036,1.,1.,157.764849292068, 3853P 4867 +-55.4841478849295,8.73624999999999,157.764849292068, 3853P 4868 +-77.4716159572515,8.73624999999999,-0.851617485069212, 3853P 4869 +1.18661825744036,0.,0.,0.; 3853P 4870 +126,1,1,0,0,1,0,-0.851617485069212,-0.851617485069212, 3855P 4871 +1.18661825744036,1.18661825744036,1.,1.,157.764849292068, 3855P 4872 +-55.4841478849295,7.11812499999999,157.764849292068, 3855P 4873 +-77.4716159572515,7.11812499999999,-0.851617485069212, 3855P 4874 +1.18661825744036,0.,0.,0.; 3855P 4875 +126,1,1,0,0,1,0,0.873529002643732,0.873529002643732, 3857P 4876 +1.71776728389373,1.71776728389373,1.,1.,83.9631823855374, 3857P 4877 +-224.118941783543,-7.49999999999994,83.9631823855374, 3857P 4878 +-232.561324596043,-7.49999999999994,0.873529002643732, 3857P 4879 +1.71776728389373,0.,0.,0.; 3857P 4880 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,83.9631823855374, 3859P 4881 +-224.118941783543,-7.49999999999994,83.9631823855374, 3859P 4882 +-224.118941783543,-8.49999999999994,0.,0.1,0.,0.,0.; 3859P 4883 +126,1,1,0,0,1,0,0.,0.,0.84423828125,0.84423828125,1.,1., 3861P 4884 +83.9631823855374,-224.118941783543,-8.49999999999993, 3861P 4885 +83.9631823855374,-232.561324596043,-8.49999999999993,0., 3861P 4886 +0.84423828125,0.,0.,0.; 3861P 4887 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,83.9631823855374, 3863P 4888 +-232.561324596043,-7.49999999999994,83.9631823855374, 3863P 4889 +-232.561324596043,-8.49999999999994,0.,0.1,0.,0.,0.; 3863P 4890 +126,1,1,0,0,1,0,-0.110430982629394,-0.110430982629394, 3865P 4891 +2.40519401737061,2.40519401737061,1.,1.,58.8069323855374, 3865P 4892 +-224.118941783543,-7.49999999999996,83.9631823855374, 3865P 4893 +-224.118941783543,-7.49999999999995,-0.110430982629394, 3865P 4894 +2.40519401737061,0.,0.,0.; 3865P 4895 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,58.8069323855374, 3867P 4896 +-224.118941783543,-7.49999999999996,58.8069323855374, 3867P 4897 +-224.118941783543,-8.49999999999996,0.,0.1,0.,0.,0.; 3867P 4898 +126,1,1,0,0,1,0,0.,0.,2.515625,2.515625,1.,1.,58.8069323855374, 3869P 4899 +-224.118941783543,-8.49999999999997,83.9631823855374, 3869P 4900 +-224.118941783543,-8.49999999999996,0.,2.515625,0.,0.,0.; 3869P 4901 +126,1,1,0,0,1,0,-1.18921513798127,-1.18921513798127, 3871P 4902 +2.93627314326873,2.93627314326873,1.,1.,58.8069323855374, 3871P 4903 +-182.864058971043,-7.49999999999996,58.8069323855374, 3871P 4904 +-224.118941783543,-7.49999999999996,-1.18921513798127, 3871P 4905 +2.93627314326873,0.,0.,0.; 3871P 4906 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,58.8069323855374, 3873P 4907 +-182.864058971043,-7.49999999999996,58.8069323855374, 3873P 4908 +-182.864058971043,-8.49999999999996,0.,0.1,0.,0.,0.; 3873P 4909 +126,1,1,0,0,1,0,0.,0.,4.12548828125,4.12548828125,1.,1., 3875P 4910 +58.8069323855374,-182.864058971043,-8.49999999999997, 3875P 4911 +58.8069323855374,-224.118941783543,-8.49999999999997,0., 3875P 4912 +4.12548828125,0.,0.,0.; 3875P 4913 +126,1,1,0,0,1,0,-0.616290357629394,-0.616290357629394, 3877P 4914 +0.395428392370606,0.395428392370606,1.,1.,48.6897448855374, 3877P 4915 +-182.864058971043,-7.49999999999996,58.8069323855374, 3877P 4916 +-182.864058971043,-7.49999999999995,-0.616290357629394, 3877P 4917 +0.395428392370606,0.,0.,0.; 3877P 4918 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,48.6897448855374, 3879P 4919 +-182.864058971043,-7.49999999999996,48.6897448855374, 3879P 4920 +-182.864058971043,-8.49999999999996,0.,0.1,0.,0.,0.; 3879P 4921 +126,1,1,0,0,1,0,0.,0.,1.01171875,1.01171875,1.,1., 3881P 4922 +48.6897448855374,-182.864058971043,-8.49999999999997, 3881P 4923 +58.8069323855374,-182.864058971043,-8.49999999999997,0., 3881P 4924 +1.01171875,0.,0.,0.; 3881P 4925 +126,1,1,0,0,1,0,-1.29564814326873,-1.29564814326873, 3883P 4926 +3.67407841923127,3.67407841923127,1.,1.,48.6897448855374, 3883P 4927 +-232.561324596043,-7.49999999999996,48.6897448855374, 3883P 4928 +-182.864058971043,-7.49999999999996,-1.29564814326873, 3883P 4929 +3.67407841923127,0.,0.,0.; 3883P 4930 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,48.6897448855374, 3885P 4931 +-232.561324596043,-7.49999999999996,48.6897448855374, 3885P 4932 +-232.561324596043,-8.49999999999996,0.,0.1,0.,0.,0.; 3885P 4933 +126,1,1,0,0,1,0,0.,0.,4.9697265625,4.9697265625,1.,1., 3887P 4934 +48.6897448855374,-232.561324596043,-8.49999999999997, 3887P 4935 +48.6897448855374,-182.864058971043,-8.49999999999997,0., 3887P 4936 +4.9697265625,0.,0.,0.; 3887P 4937 +126,1,1,0,0,1,0,-1.1473815173706,-1.1473815173706, 3889P 4938 +2.37996223262939,2.37996223262939,1.,1.,83.9631823855374, 3889P 4939 +-232.561324596043,-7.49999999999995,48.6897448855374, 3889P 4940 +-232.561324596043,-7.49999999999996,-1.1473815173706, 3889P 4941 +2.37996223262939,0.,0.,0.; 3889P 4942 +126,1,1,0,0,1,0,0.,0.,3.52734375,3.52734375,1.,1., 3891P 4943 +83.9631823855374,-232.561324596043,-8.49999999999993, 3891P 4944 +48.6897448855374,-232.561324596043,-8.49999999999994,0., 3891P 4945 +3.52734375,0.,0.,0.; 3891P 4946 +126,6,2,0,0,0,0,3.13917765423161,3.13917765423161, 3893P 4947 +3.13917765423161,4.18718020521427,4.18718020521427, 3893P 4948 +5.23518275619693,5.23518275619693,6.28318530717959, 3893P 4949 +6.28318530717959,6.28318530717959,1.,0.865824083692505,1., 3893P 4950 +0.865824083692489,1.,0.865824083692615,1.,18.9406505609936, 3893P 4951 +-172.121201750437,-7.49999999999996,18.9396735534978, 3893P 4952 +-171.312085990108,-7.49999999999996,19.6402259760079, 3893P 4953 +-170.907245809948,-7.49999999999996,20.340778398518, 3893P 4954 +-170.502405629789,-7.49999999999996,21.0413308210281, 3893P 4955 +-170.907245809948,-7.49999999999996,21.7418832435383, 3893P 4956 +-171.312085990108,-7.49999999999996,21.7409062360425, 3893P 4957 +-172.121201750437,-7.49999999999996,3.13917765423161, 3893P 4958 +6.28318530717959,0.,0.,0.; 3893P 4959 +126,1,1,0,0,1,0,1.623625,1.623625,2.033625,2.033625,1.,1., 3895P 4960 +18.9406505609936,-172.121201750437,-7.49999999999997, 3895P 4961 +18.9406505609936,-172.121201750437,-11.6,1.623625,2.033625,0., 3895P 4962 +0.,0.; 3895P 4963 +126,6,2,0,0,0,0,0.,0.,0.,1.04800255098266,1.04800255098266, 3897P 4964 +2.09600510196532,2.09600510196532,3.14400765294798, 3897P 4965 +3.14400765294798,3.14400765294798,1.,0.865824083692615,1., 3897P 4966 +0.865824083692489,1.,0.865824083692505,1.,21.7409062360425, 3897P 4967 +-172.121201750437,-11.6,21.7418832435383,-171.312085990108, 3897P 4968 +-11.6,21.0413308210281,-170.907245809948,-11.6,20.340778398518, 3897P 4969 +-170.502405629789,-11.6,19.6402259760079,-170.907245809948, 3897P 4970 +-11.6,18.9396735534978,-171.312085990108,-11.6,18.9406505609936, 3897P 4971 +-172.121201750437,-11.6,0.,3.14400765294798,0.,0.,0.; 3897P 4972 +126,1,1,0,0,1,0,1.623625,1.623625,2.033625,2.033625,1.,1., 3899P 4973 +21.7409062360425,-172.121201750437,-7.49999999999997, 3899P 4974 +21.7409062360425,-172.121201750437,-11.6,1.623625,2.033625,0., 3899P 4975 +0.,0.; 3899P 4976 +126,6,2,0,0,0,0,3.13917765425437,3.13917765425437, 3901P 4977 +3.13917765425437,4.18718020522943,4.18718020522943, 3901P 4978 +5.2351827562045,5.2351827562045,6.28318530717956, 3901P 4979 +6.28318530717956,6.28318530717956,1.,0.865824083694517,1., 3901P 4980 +0.865824083694691,1.,0.865824083694548,1.,21.7409062360425, 3901P 4981 +-172.121201750437,-7.49999999999996,21.7418832435291, 3901P 4982 +-172.930317510758,-7.49999999999996,21.0413308210236, 3901P 4983 +-173.335157690912,-7.49999999999996,20.3407783985181, 3901P 4984 +-173.739997871065,-7.49999999999996,19.6402259760126, 3901P 4985 +-173.335157690912,-7.49999999999996,18.939673553507, 3901P 4986 +-172.930317510759,-7.49999999999996,18.9406505609936, 3901P 4987 +-172.121201750437,-7.49999999999996,3.13917765425437, 3901P 4988 +6.28318530717956,0.,0.,0.; 3901P 4989 +126,6,2,0,0,0,0,2.53741645654159D-14,2.53741645654159D-14, 3903P 4990 +2.53741645654159D-14,1.04800255097509,1.04800255097509, 3903P 4991 +2.09600510195016,2.09600510195016,3.14400765292522, 3903P 4992 +3.14400765292522,3.14400765292522,1.,0.86582408369456,1., 3903P 4993 +0.865824083694691,1.,0.865824083694517,1.,18.9406505609936, 3903P 4994 +-172.121201750437,-11.6,18.939673553507,-172.930317510759,-11.6, 3903P 4995 +19.6402259760125,-173.335157690912,-11.6,20.3407783985181, 3903P 4996 +-173.739997871065,-11.6,21.0413308210236,-173.335157690912, 3903P 4997 +-11.6,21.7418832435291,-172.930317510758,-11.6,21.7409062360425, 3903P 4998 +-172.121201750437,-11.6,2.53741645654159D-14,3.14400765292522, 3903P 4999 +0.,0.,0.; 3903P 5000 +126,6,2,0,0,0,0,3.13917765424305,3.13917765424305, 3905P 5001 +3.13917765424305,4.1871802052219,4.1871802052219, 3905P 5002 +5.23518275620074,5.23518275620074,6.28318530717959, 3905P 5003 +6.28318530717959,6.28318530717959,1.,0.86582408369356,1., 3905P 5004 +0.865824083693437,1.,0.865824083693555,1.,97.7151063167837, 3905P 5005 +-190.598023114196,-7.49999999999996,97.7141293092926, 3905P 5006 +-189.78890735387,-7.49999999999996,98.4146817318004, 3905P 5007 +-189.384067173714,-7.49999999999996,99.1152341543082, 3905P 5008 +-188.979226993558,-7.49999999999996,99.815786576816, 3905P 5009 +-189.384067173714,-7.49999999999996,100.516338999324, 3905P 5010 +-189.78890735387,-7.49999999999996,100.515361991833, 3905P 5011 +-190.598023114196,-7.49999999999996,3.13917765424305, 3905P 5012 +6.28318530717959,0.,0.,0.; 3905P 5013 +126,1,1,0,0,1,0,1.623625,1.623625,2.033625,2.033625,1.,1., 3907P 5014 +97.7151063167837,-190.598023114196,-7.49999999999994, 3907P 5015 +97.7151063167837,-190.598023114196,-11.5999999999999,1.623625, 3907P 5016 +2.033625,0.,0.,0.; 3907P 5017 +126,6,2,0,0,0,0,0.,0.,0.,1.04800255097885,1.04800255097885, 3909P 5018 +2.09600510195769,2.09600510195769,3.14400765293654, 3909P 5019 +3.14400765293654,3.14400765293654,1.,0.865824083693555,1., 3909P 5020 +0.865824083693437,1.,0.86582408369356,1.,100.515361991833, 3909P 5021 +-190.598023114196,-11.6,100.516338999324,-189.78890735387,-11.6, 3909P 5022 +99.815786576816,-189.384067173714,-11.6,99.1152341543082, 3909P 5023 +-188.979226993558,-11.6,98.4146817318004,-189.384067173714, 3909P 5024 +-11.6,97.7141293092926,-189.78890735387,-11.6,97.7151063167837, 3909P 5025 +-190.598023114196,-11.6,0.,3.14400765293654,0.,0.,0.; 3909P 5026 +126,1,1,0,0,1,0,1.623625,1.623625,2.033625,2.033625,1.,1., 3911P 5027 +100.515361991833,-190.598023114196,-7.49999999999994, 3911P 5028 +100.515361991833,-190.598023114196,-11.5999999999999,1.623625, 3911P 5029 +2.033625,0.,0.,0.; 3911P 5030 +126,6,2,0,0,0,0,3.13917765424295,3.13917765424295, 3913P 5031 +3.13917765424295,4.18718020522184,4.18718020522184, 3913P 5032 +5.23518275620074,5.23518275620074,6.28318530717964, 3913P 5033 +6.28318530717964,6.28318530717964,1.,0.86582408369357,1., 3913P 5034 +0.865824083693601,1.,0.865824083693503,1.,100.515361991833, 3913P 5035 +-190.598023114196,-7.49999999999996,100.516338999324, 3913P 5036 +-191.407138874521,-7.49999999999996,99.815786576816, 3913P 5037 +-191.811979054677,-7.49999999999996,99.1152341543081, 3913P 5038 +-192.216819234834,-7.49999999999996,98.4146817318003, 3913P 5039 +-191.811979054677,-7.49999999999996,97.7141293092924, 3913P 5040 +-191.407138874521,-7.49999999999996,97.7151063167837, 3913P 5041 +-190.598023114196,-7.49999999999996,3.13917765424295, 3913P 5042 +6.28318530717964,0.,0.,0.; 3913P 5043 +126,6,2,0,0,0,0,-5.0748329130831D-14,-5.0748329130831D-14, 3915P 5044 +-5.0748329130831D-14,1.04800255097885,1.04800255097885, 3915P 5045 +2.09600510195774,2.09600510195774,3.14400765293664, 3915P 5046 +3.14400765293664,3.14400765293664,1.,0.865824083693503,1., 3915P 5047 +0.865824083693601,1.,0.865824083693605,1.,97.7151063167837, 3915P 5048 +-190.598023114196,-11.6,97.7141293092924,-191.407138874521, 3915P 5049 +-11.6,98.4146817318003,-191.811979054677,-11.6,99.1152341543081, 3915P 5050 +-192.216819234834,-11.6,99.8157865768159,-191.811979054677, 3915P 5051 +-11.6,100.516338999324,-191.407138874521,-11.6,100.515361991833, 3915P 5052 +-190.598023114196,-11.6,-5.0748329130831D-14,3.14400765293664, 3915P 5053 +0.,0.,0.; 3915P 5054 +126,2,2,0,0,0,0,-1.15918194829754,-1.15918194829754, 3917P 5055 +-1.15918194829754,-0.0292778092733589,-0.0292778092733589, 3917P 5056 +-0.0292778092733589,1.,0.844614262194451,1.,4.43314110940288, 3917P 5057 +-167.842837467805,5.50000000000003,2.97957034725773, 3917P 5058 +-167.208278396419,5.50000000000003,2.93314110940286, 3917P 5059 +-165.622914872961,5.50000000000003,-1.15918194829754, 3917P 5060 +-0.0292778092733589,0.,0.,0.; 3917P 5061 +126,1,1,0,0,1,0,-1.5,-1.5,-0.2,-0.2,1.,1.,4.43314110940286, 3919P 5062 +-167.842837467805,-7.49999999999997,4.43314110940285, 3919P 5063 +-167.842837467805,5.50000000000003,-1.5,-0.2,0.,0.,0.; 3919P 5064 +126,2,2,0,0,0,0,-1.15918194829754,-1.15918194829754, 3921P 5065 +-1.15918194829754,-0.0292778092733589,-0.0292778092733589, 3921P 5066 +-0.0292778092733589,1.,0.844614262194451,1.,4.43314110940287, 3921P 5067 +-167.842837467805,-7.49999999999997,2.97957034725773, 3921P 5068 +-167.208278396419,-7.49999999999997,2.93314110940286, 3921P 5069 +-165.622914872961,-7.49999999999997,-1.15918194829754, 3921P 5070 +-0.0292778092733589,0.,0.,0.; 3921P 5071 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,2.93314110940287, 3923P 5072 +-165.622914872961,5.50000000000003,2.93314110940287, 3923P 5073 +-165.622914872961,-7.49999999999997,0.2,1.5,0.,0.,0.; 3923P 5074 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,114.304136640482, 3925P 5075 +-248.749215886107,5.50000000000006,114.304136640482, 3925P 5076 +-248.749215886107,-7.49999999999994,0.2,1.5,0.,0.,0.; 3925P 5077 +126,1,1,0,0,1,0,-10.8869873393078,-10.8869873393078, 3927P 5078 +-0.22927014633397,-0.22927014633397,1.,1.,114.304136640482, 3927P 5079 +-248.749215886107,-7.49999999999995,7.72696471074416, 3927P 5080 +-248.749215886107,-7.49999999999997,-10.8869873393078, 3927P 5081 +-0.22927014633397,0.,0.,0.; 3927P 5082 +126,1,1,0,0,1,0,-1.5,-1.5,-0.2,-0.2,1.,1.,7.72696471074419, 3929P 5083 +-248.749215886107,-7.49999999999997,7.72696471074418, 3929P 5084 +-248.749215886107,5.50000000000003,-1.5,-0.2,0.,0.,0.; 3929P 5085 +126,1,1,0,0,1,0,-8.10792303602294,-8.10792303602294, 3931P 5086 +2.54979415695085,2.54979415695085,1.,1.,7.72696471074415, 3931P 5087 +-248.749215886107,5.50000000000003,114.304136640482, 3931P 5088 +-248.749215886107,5.50000000000006,-8.10792303602294, 3931P 5089 +2.54979415695085,0.,0.,0.; 3931P 5090 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,4.43214272479956, 3933P 5091 +-245.454337167255,5.50000000000003,4.43214272479957, 3933P 5092 +-245.454337167255,-7.49999999999997,0.2,1.5,0.,0.,0.; 3933P 5093 +126,1,1,0,0,1,0,-5.79827126090288,-5.79827126090288,0.,0.,1.,1., 3935P 5094 +4.43214272479954,-245.454337167255,-7.49999999999997, 3935P 5095 +4.43314110940289,-187.471624566822,-7.49999999999997, 3935P 5096 +-5.79827126090288,0.,0.,0.,0.; 3935P 5097 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,4.43314110940289, 3937P 5098 +-187.471624566822,5.50000000000003,4.43314110940289, 3937P 5099 +-187.471624566822,-7.49999999999997,0.2,1.5,0.,0.,0.; 3937P 5100 +126,1,1,0,0,1,0,-3.97255884800442,-3.97255884800442, 3939P 5101 +1.82571241289845,1.82571241289845,1.,1.,4.43314110940289, 3939P 5102 +-187.471624566822,5.50000000000003,4.43214272479954, 3939P 5103 +-245.454337167255,5.50000000000003,-3.97255884800442, 3939P 5104 +1.82571241289845,0.,0.,0.; 3939P 5105 +126,2,2,0,0,0,0,1.5707963267949,1.5707963267949,1.5707963267949, 3941P 5106 +2.72951060528473,2.72951060528473,2.72951060528473,1., 3941P 5107 +0.836814780130269,1.,5.4342287725957,-163.047507575232, 3941P 5108 +5.50000000000003,7.07126702638247,-163.047507575232, 3941P 5109 +5.50000000000003,7.72693023593538,-164.547507575232, 3941P 5110 +5.50000000000003,1.5707963267949,2.72951060528473,0.,0.,0.; 3941P 5111 +126,1,1,0,0,1,0,0.978120675558471,0.978120675558471, 3943P 5112 +2.54979601694251,2.54979601694251,1.,1.,23.4436836497758, 3943P 5113 +-164.547507575232,5.50000000000003,7.7269302359354, 3943P 5114 +-164.547507575232,5.50000000000003,0.978120675558471, 3943P 5115 +2.54979601694251,0.,0.,0.; 3943P 5116 +126,1,1,0,0,1,0,2.10504270777188,2.10504270777188, 3945P 5117 +2.25504270777187,2.25504270777187,1.,1.,23.4436836497758, 3945P 5118 +-164.547507575232,5.50000000000003,23.4436836497758, 3945P 5119 +-163.047507575232,5.50000000000003,2.10504270777188, 3945P 5120 +2.25504270777187,0.,0.,0.; 3945P 5121 +126,1,1,0,0,1,0,-2.77906616327648,-2.77906616327648, 3947P 5122 +-0.978120675558472,-0.978120675558472,1.,1.,5.43422877259571, 3947P 5123 +-163.047507575232,5.50000000000003,23.4436836497758, 3947P 5124 +-163.047507575232,5.50000000000003,-2.77906616327648, 3947P 5125 +-0.978120675558472,0.,0.,0.; 3947P 5126 +126,2,2,0,0,0,0,1.72186597884763D-5,1.72186597884763D-5, 3949P 5127 +1.72186597884763D-5,1.15873149714963,1.15873149714963, 3949P 5128 +1.15873149714963,1.,0.836814780130323,1.,2.93210324777536, 3949P 5129 +-247.747012802266,5.50000000000003,2.93213143538011, 3949P 5130 +-246.109974548721,5.50000000000003,4.43214272479955, 3949P 5131 +-245.454337167255,5.50000000000003,1.72186597884763D-5, 3949P 5132 +1.15873149714963,0.,0.,0.; 3949P 5133 +126,1,1,0,0,1,0,-2.92171556809407,-2.92171556809407, 3951P 5134 +-0.958836858192392,-0.958836858192392,1.,1.,4.43314110940287, 3951P 5135 +-167.842837467805,5.50000000000003,4.43314110940288, 3951P 5136 +-187.471624566822,5.50000000000003,-2.92171556809407, 3951P 5137 +-0.958836858192392,0.,0.,0.; 3951P 5138 +126,1,1,0,0,1,0,0.958837288670924,0.958837288670924, 3953P 5139 +3.14370739710002,3.14370739710002,1.,1.,2.9331411094029, 3953P 5140 +-187.471615957251,5.50000000000003,2.93314110940288, 3953P 5141 +-165.622914872961,5.50000000000003,0.958837288670924, 3953P 5142 +3.14370739710002,0.,0.,0.; 3953P 5143 +126,1,1,0,0,1,0,-2.054982559236,-2.054982559236, 3955P 5144 +3.97255712615894,3.97255712615894,1.,1.,2.93210324777536, 3955P 5145 +-247.747012802266,5.50000000000003,2.9331411094029, 3955P 5146 +-187.471615957251,5.50000000000003,-2.054982559236, 3955P 5147 +3.97255712615894,0.,0.,0.; 3955P 5148 +126,2,2,0,0,0,0,-1.5707963267949,-1.5707963267949, 3957P 5149 +-1.5707963267949,-0.412082048305059,-0.412082048305059, 3957P 5150 +-0.412082048305059,1.,0.836814780130369,1.,116.596838103822, 3957P 5151 +-250.249215886107,5.50000000000007,114.959799850035, 3957P 5152 +-250.249215886107,5.50000000000007,114.304136640482, 3957P 5153 +-248.749215886107,5.50000000000007,-1.5707963267949, 3957P 5154 +-0.412082048305059,0.,0.,0.; 3957P 5155 +126,2,2,0,0,0,0,-2.72951060528471,-2.72951060528471, 3959P 5156 +-2.72951060528471,-1.5707963267949,-1.5707963267949, 3959P 5157 +-1.5707963267949,1.,0.83681478013024,1.,7.72696471074414, 3959P 5158 +-248.749215886107,5.50000000000003,7.0713015011912, 3959P 5159 +-250.249215886107,5.50000000000003,5.43426324740444, 3959P 5160 +-250.249215886107,5.50000000000003,-2.72951060528471, 3959P 5161 +-1.5707963267949,0.,0.,0.; 3959P 5162 +126,1,1,0,0,1,0,-2.77906430328482,-2.77906430328482, 3961P 5163 +8.33719318235691,8.33719318235691,1.,1.,116.596838103822, 3961P 5164 +-250.249215886107,5.50000000000006,5.43426324740444, 3961P 5165 +-250.249215886107,5.50000000000003,-2.77906430328482, 3961P 5166 +8.33719318235691,0.,0.,0.; 3961P 5167 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,7.7269302359354, 3963P 5168 +-164.547507575232,5.50000000000003,7.7269302359354, 3963P 5169 +-164.547507575232,-7.49999999999997,0.2,1.5,0.,0.,0.; 3963P 5170 +126,1,1,0,0,1,0,-10.8869910592913,-10.8869910592913, 3965P 5171 +-9.31531571790723,-9.31531571790723,1.,1.,7.7269302359354, 3965P 5172 +-164.547507575232,-7.49999999999996,23.4436836497758, 3965P 5173 +-164.547507575232,-7.49999999999996,-10.8869910592913, 3965P 5174 +-9.31531571790723,0.,0.,0.; 3965P 5175 +126,1,1,0,0,1,0,-0.75,-0.75,0.55,0.55,1.,1.,23.4436836497758, 3967P 5176 +-164.547507575232,-7.49999999999997,23.4436836497758, 3967P 5177 +-164.547507575232,5.50000000000003,-0.75,0.55,0.,0.,0.; 3967P 5178 +126,1,1,0,0,1,0,-1.5,-1.5,-0.2,-0.2,1.,1.,114.304139365509, 3969P 5179 +-164.547507575232,-7.49999999999994,114.304139365509, 3969P 5180 +-164.547507575232,5.50000000000006,-1.5,-0.2,0.,0.,0.; 3969P 5181 +126,1,1,0,0,1,0,-8.10792489601484,-8.10792489601484, 3971P 5182 +-7.23888737412926,-7.23888737412926,1.,1.,114.304139365509, 3971P 5183 +-164.547507575232,5.50000000000005,105.613764146653, 3971P 5184 +-164.547507575232,5.50000000000005,-8.10792489601484, 3971P 5185 +-7.23888737412926,0.,0.,0.; 3971P 5186 +126,1,1,0,0,1,0,-0.2,-0.2,1.1,1.1,1.,1.,105.613764146653, 3973P 5187 +-164.547507575232,5.50000000000006,105.613764146653, 3973P 5188 +-164.547507575232,-7.49999999999994,-0.2,1.1,0.,0.,0.; 3973P 5189 +126,1,1,0,0,1,0,-1.0983076682195,-1.0983076682195, 3975P 5190 +-0.229270146333919,-0.229270146333919,1.,1.,105.613764146653, 3975P 5191 +-164.547507575232,-7.49999999999994,114.304139365509, 3975P 5192 +-164.547507575232,-7.49999999999994,-1.0983076682195, 3975P 5193 +-0.229270146333919,0.,0.,0.; 3975P 5194 +126,2,2,0,0,0,0,1.98287840825217,1.98287840825217, 3977P 5195 +1.98287840825217,3.14159265358978,3.14159265358978, 3977P 5196 +3.14159265358978,1.,0.83681478920549,1.,117.59899817983, 3977P 5197 +-245.454354455992,5.50000000000007,119.098998103822, 3977P 5198 +-246.11001769155,5.50000000000007,119.098998103822, 3977P 5199 +-247.747055886107,5.50000000000007,1.98287840825217, 3977P 5200 +3.14159265358978,0.,0.,0.; 3977P 5201 +126,1,1,0,0,1,0,-2.05493493947419,-2.05493493947419, 3979P 5202 +6.16480416245852,6.16480416245852,1.,1.,119.099000828846, 3979P 5203 +-165.54966486678,5.50000000000007,119.098998103822, 3979P 5204 +-247.747055886107,5.50000000000007,-2.05493493947419, 3979P 5205 +6.16480416245852,0.,0.,0.; 3979P 5206 +126,2,2,0,0,0,0,-3.14159373603537,-3.14159373603537, 3981P 5207 +-3.14159373603537,-1.98287834194696,-1.98287834194696, 3981P 5208 +-1.98287834194696,1.,0.836814474742864,1.,119.099000828846, 3981P 5209 +-165.54966486678,5.50000000000007,119.099002600853, 3981P 5210 +-167.186705113691,5.50000000000007,117.599000752838, 3981P 5211 +-167.842369071796,5.50000000000007,-3.14159373603537, 3981P 5212 +-1.98287834194696,0.,0.,0.; 3981P 5213 +126,1,1,0,0,1,0,-5.93553402441977,-5.93553402441977, 3983P 5214 +1.82566451399977,1.82566451399977,1.,1.,117.59899817983, 3983P 5215 +-245.454354455992,5.50000000000007,117.599000752838, 3983P 5216 +-167.842369071796,5.50000000000007,-5.93553402441977, 3983P 5217 +1.82566451399977,0.,0.,0.; 3983P 5218 +126,2,2,0,0,0,0,0.412082048305129,0.412082048305129, 3985P 5219 +0.412082048305129,1.57079632679488,1.57079632679488, 3985P 5220 +1.57079632679488,1.,0.836814780130278,1.,114.304139365509, 3985P 5221 +-164.547507575232,5.50000000000007,114.959802575062, 3985P 5222 +-163.047507575233,5.50000000000007,116.596840828848, 3985P 5223 +-163.047507575233,5.50000000000007,0.412082048305129, 3985P 5224 +1.57079632679488,0.,0.,0.; 3985P 5225 +126,1,1,0,0,1,0,7.23888737412926,7.23888737412926, 3987P 5226 +8.33719504234876,8.33719504234876,1.,1.,105.613764146653, 3987P 5227 +-163.047507575232,5.50000000000005,116.596840828848, 3987P 5228 +-163.047507575232,5.50000000000005,7.23888737412926, 3987P 5229 +8.33719504234876,0.,0.,0.; 3987P 5230 +126,1,1,0,0,1,0,-2.25504270777187,-2.25504270777187, 3989P 5231 +-2.10504270777188,-2.10504270777188,1.,1.,105.613764146653, 3989P 5232 +-163.047507575232,5.50000000000005,105.613764146653, 3989P 5233 +-164.547507575232,5.50000000000005,-2.25504270777187, 3989P 5234 +-2.10504270777188,0.,0.,0.; 3989P 5235 +126,6,2,0,0,0,0,3.13925814733116,3.13925814733116, 3991P 5236 +3.13925814733116,4.18720703624771,4.18720703624771, 3991P 5237 +5.23515592516426,5.23515592516426,6.28310481408081, 3991P 5238 +6.28310481408081,6.28310481408081,1.,0.865837508248997,1., 3991P 5239 +0.865837508248987,1.,0.865837508249069,1.,21.4157277366876, 3991P 5240 +-228.698656211065,-7.49999999999997,21.4147507896972, 3991P 5241 +-227.831805396136,-7.49999999999997,22.1653032159716, 3991P 5242 +-227.39809772364,-7.49999999999997,22.915855642246, 3991P 5243 +-226.964390051143,-7.49999999999997,23.6664080685249, 3991P 5244 +-227.398097723632,-7.49999999999997,24.4169604948039, 3991P 5245 +-227.83180539612,-7.49999999999997,24.4159835478226, 3991P 5246 +-228.69865621105,-7.49999999999997,3.13925814733116, 3991P 5247 +6.28310481408081,0.,0.,0.; 3991P 5248 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,21.4157277366876, 3993P 5249 +-228.698656211065,-7.49999999999997,21.4157277366876, 3993P 5250 +-228.698656211065,-11.6,1.5,1.91,0.,0.,0.; 3993P 5251 +126,6,2,0,0,0,0,-6.28310481408081,-6.28310481408081, 3995P 5252 +-6.28310481408081,-5.23515592516426,-5.23515592516426, 3995P 5253 +-4.18720703624771,-4.18720703624771,-3.13925814733116, 3995P 5254 +-3.13925814733116,-3.13925814733116,1.,0.865837508249069,1., 3995P 5255 +0.865837508248987,1.,0.865837508248997,1.,24.4159835478226, 3995P 5256 +-228.69865621105,-11.6,24.4169604948039,-227.83180539612,-11.6, 3995P 5257 +23.6664080685249,-227.398097723632,-11.6,22.915855642246, 3995P 5258 +-226.964390051143,-11.6,22.1653032159716,-227.39809772364,-11.6, 3995P 5259 +21.4147507896972,-227.831805396136,-11.6,21.4157277366876, 3995P 5260 +-228.698656211065,-11.6,-6.28310481408081,-3.13925814733116,0., 3995P 5261 +0.,0.; 3995P 5262 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,24.4159835478226, 3997P 5263 +-228.69865621105,-7.49999999999997,24.4159835478226, 3997P 5264 +-228.69865621105,-11.6,1.5,1.91,0.,0.,0.; 3997P 5265 +126,6,2,0,0,0,0,3.13925814734168,3.13925814734168, 3999P 5266 +3.13925814734168,4.18720703625123,4.18720703625123, 3999P 5267 +5.23515592516079,5.23515592516079,6.28310481407034, 3999P 5268 +6.28310481407034,6.28310481407034,1.,0.865837508250833,1., 3999P 5269 +0.865837508250854,1.,0.865837508250777,1.,24.4159835478226, 3999P 5270 +-228.69865621105,-7.49999999999997,24.4169604948039, 3999P 5271 +-229.565507025972,-7.49999999999997,23.666408068534, 3999P 5272 +-229.999214698462,-7.49999999999997,22.9158556422641, 3999P 5273 +-230.432922370953,-7.49999999999997,22.1653032159898, 3999P 5274 +-229.99921469847,-7.49999999999997,21.4147507897154, 3999P 5275 +-229.565507025988,-7.49999999999997,21.4157277366876, 3999P 5276 +-228.698656211065,-7.49999999999997,3.13925814734168, 3999P 5277 +6.28310481407034,0.,0.,0.; 3999P 5278 +126,6,2,0,0,0,0,-6.28310481407037,-6.28310481407037, 4001P 5279 +-6.28310481407037,-5.2351559251608,-5.2351559251608, 4001P 5280 +-4.18720703625122,-4.18720703625122,-3.13925814734165, 4001P 5281 +-3.13925814734165,-3.13925814734165,1.,0.865837508250796,1., 4001P 5282 +0.865837508250931,1.,0.865837508250911,1.,21.4157277366876, 4001P 5283 +-228.698656211065,-11.6,21.4147507897153,-229.565507025988, 4001P 5284 +-11.6,22.1653032159898,-229.99921469847,-11.6,22.9158556422642, 4001P 5285 +-230.432922370953,-11.6,23.666408068534,-229.999214698462,-11.6, 4001P 5286 +24.4169604948039,-229.565507025972,-11.6,24.4159835478226, 4001P 5287 +-228.69865621105,-11.6,-6.28310481407037,-3.13925814734165,0., 4001P 5288 +0.,0.; 4001P 5289 +126,6,2,0,0,0,0,3.13866619557958,3.13866619557958, 4003P 5290 +3.13866619557958,4.18680559830898,4.18680559830898, 4003P 5291 +5.23494500103838,5.23494500103838,6.28308440376778, 4003P 5292 +6.28308440376778,6.28308440376778,1.,0.865789844880318,1., 4003P 5293 +0.865789844880317,1.,0.865789844880318,1.,97.617115874664, 4003P 5294 +-228.698656211057,-7.49999999999994,97.6158909373877, 4003P 5295 +-227.831614772873,-7.49999999999994,98.3665673588096, 4003P 5296 +-227.397740060174,-7.49999999999994,99.1172437802314, 4003P 5297 +-226.963865347475,-7.49999999999994,99.8679202016533, 4003P 5298 +-227.397740060174,-7.49999999999994,100.618596623075, 4003P 5299 +-227.831614772873,-7.49999999999994,100.617371685799, 4003P 5300 +-228.698656211057,-7.49999999999994,3.13866619557958, 4003P 5301 +6.28308440376778,0.,0.,0.; 4003P 5302 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,97.6171158746639, 4005P 5303 +-228.698656211057,-7.49999999999994,97.6171158746639, 4005P 5304 +-228.698656211057,-11.5999999999999,1.5,1.91,0.,0.,0.; 4005P 5305 +126,6,2,0,0,0,0,-6.28308440376778,-6.28308440376778, 4007P 5306 +-6.28308440376778,-5.23494500103838,-5.23494500103838, 4007P 5307 +-4.18680559830898,-4.18680559830898,-3.13866619557958, 4007P 5308 +-3.13866619557958,-3.13866619557958,1.,0.865789844880318,1., 4007P 5309 +0.865789844880317,1.,0.865789844880318,1.,100.617371685799, 4007P 5310 +-228.698656211057,-11.5999999999999,100.618596623075, 4007P 5311 +-227.831614772873,-11.5999999999999,99.8679202016533, 4007P 5312 +-227.397740060174,-11.5999999999999,99.1172437802314, 4007P 5313 +-226.963865347475,-11.5999999999999,98.3665673588096, 4007P 5314 +-227.397740060174,-11.5999999999999,97.6158909373877, 4007P 5315 +-227.831614772873,-11.5999999999999,97.617115874664, 4007P 5316 +-228.698656211057,-11.5999999999999,-6.28308440376778, 4007P 5317 +-3.13866619557958,0.,0.,0.; 4007P 5318 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,100.617371685799, 4009P 5319 +-228.698656211057,-7.49999999999994,100.617371685799, 4009P 5320 +-228.698656211057,-11.5999999999999,1.5,1.91,0.,0.,0.; 4009P 5321 +126,6,2,0,0,0,0,3.13866619559787,3.13866619559787, 4011P 5322 +3.13866619559787,4.18680559832114,4.18680559832114, 4011P 5323 +5.2349450010444,5.2349450010444,6.28308440376766, 4011P 5324 +6.28308440376766,6.28308440376766,1.,0.865789844881819,1., 4011P 5325 +0.865789844881894,1.,0.865789844881819,1.,100.617371685799, 4011P 5326 +-228.698656211057,-7.49999999999994,100.618596623067, 4011P 5327 +-229.565697649234,-7.49999999999994,99.8679202016493, 4011P 5328 +-229.999572361928,-7.49999999999994,99.1172437802314, 4011P 5329 +-230.433447074621,-7.49999999999994,98.3665673588136, 4011P 5330 +-229.999572361928,-7.49999999999994,97.6158909373957, 4011P 5331 +-229.565697649234,-7.49999999999994,97.617115874664, 4011P 5332 +-228.698656211057,-7.49999999999994,3.13866619559787, 4011P 5333 +6.28308440376766,0.,0.,0.; 4011P 5334 +126,6,2,0,0,0,0,-6.2830844037677,-6.2830844037677, 4013P 5335 +-6.2830844037677,-5.23494500104441,-5.23494500104441, 4013P 5336 +-4.18680559832112,-4.18680559832112,-3.13866619559783, 4013P 5337 +-3.13866619559783,-3.13866619559783,1.,0.865789844881757,1., 4013P 5338 +0.865789844882047,1.,0.865789844881757,1.,97.617115874664, 4013P 5339 +-228.698656211056,-11.5999999999999,97.6158909373956, 4013P 5340 +-229.565697649234,-11.5999999999999,98.3665673588135, 4013P 5341 +-229.999572361928,-11.5999999999999,99.1172437802314, 4013P 5342 +-230.433447074621,-11.5999999999999,99.8679202016494, 4013P 5343 +-229.999572361928,-11.5999999999999,100.618596623067, 4013P 5344 +-229.565697649234,-11.5999999999999,100.617371685799, 4013P 5345 +-228.698656211056,-11.5999999999999,-6.2830844037677, 4013P 5346 +-3.13866619559783,0.,0.,0.; 4013P 5347 +126,6,2,0,0,0,0,3.13925814733116,3.13925814733116, 4015P 5348 +3.13925814733116,4.18720703624771,4.18720703624771, 4015P 5349 +5.23515592516426,5.23515592516426,6.28310481408081, 4015P 5350 +6.28310481408081,6.28310481408081,1.,0.865837508248997,1., 4015P 5351 +0.865837508248987,1.,0.865837508249069,1.,21.4157277366876, 4015P 5352 +-190.598023114212,-7.49999999999997,21.4147507896972, 4015P 5353 +-189.731172299282,-7.49999999999997,22.1653032159716, 4015P 5354 +-189.297464626786,-7.49999999999997,22.915855642246, 4015P 5355 +-188.863756954289,-7.49999999999997,23.6664080685249, 4015P 5356 +-189.297464626778,-7.49999999999997,24.4169604948039, 4015P 5357 +-189.731172299267,-7.49999999999997,24.4159835478226, 4015P 5358 +-190.598023114196,-7.49999999999997,3.13925814733116, 4015P 5359 +6.28310481408081,0.,0.,0.; 4015P 5360 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,21.4157277366876, 4017P 5361 +-190.598023114212,-7.49999999999997,21.4157277366876, 4017P 5362 +-190.598023114212,-11.6,1.5,1.91,0.,0.,0.; 4017P 5363 +126,6,2,0,0,0,0,-6.28310481408081,-6.28310481408081, 4019P 5364 +-6.28310481408081,-5.23515592516426,-5.23515592516426, 4019P 5365 +-4.18720703624771,-4.18720703624771,-3.13925814733116, 4019P 5366 +-3.13925814733116,-3.13925814733116,1.,0.865837508249069,1., 4019P 5367 +0.865837508248987,1.,0.865837508248997,1.,24.4159835478226, 4019P 5368 +-190.598023114196,-11.6,24.4169604948039,-189.731172299267, 4019P 5369 +-11.6,23.6664080685249,-189.297464626778,-11.6,22.915855642246, 4019P 5370 +-188.863756954289,-11.6,22.1653032159716,-189.297464626786, 4019P 5371 +-11.6,21.4147507896972,-189.731172299282,-11.6,21.4157277366876, 4019P 5372 +-190.598023114212,-11.6,-6.28310481408081,-3.13925814733116,0., 4019P 5373 +0.,0.; 4019P 5374 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,24.4159835478226, 4021P 5375 +-190.598023114196,-7.49999999999997,24.4159835478226, 4021P 5376 +-190.598023114196,-11.6,1.5,1.91,0.,0.,0.; 4021P 5377 +126,6,2,0,0,0,0,3.13925814734168,3.13925814734168, 4023P 5378 +3.13925814734168,4.18720703625123,4.18720703625123, 4023P 5379 +5.23515592516079,5.23515592516079,6.28310481407034, 4023P 5380 +6.28310481407034,6.28310481407034,1.,0.865837508250833,1., 4023P 5381 +0.865837508250854,1.,0.865837508250777,1.,24.4159835478226, 4023P 5382 +-190.598023114196,-7.49999999999997,24.4169604948039, 4023P 5383 +-191.464873929118,-7.49999999999997,23.666408068534, 4023P 5384 +-191.898581601608,-7.49999999999997,22.9158556422641, 4023P 5385 +-192.332289274099,-7.49999999999997,22.1653032159898, 4023P 5386 +-191.898581601616,-7.49999999999997,21.4147507897154, 4023P 5387 +-191.464873929134,-7.49999999999997,21.4157277366876, 4023P 5388 +-190.598023114212,-7.49999999999997,3.13925814734168, 4023P 5389 +6.28310481407034,0.,0.,0.; 4023P 5390 +126,6,2,0,0,0,0,-6.28310481407034,-6.28310481407034, 4025P 5391 +-6.28310481407034,-5.23515592516079,-5.23515592516079, 4025P 5392 +-4.18720703625123,-4.18720703625123,-3.13925814734168, 4025P 5393 +-3.13925814734168,-3.13925814734168,1.,0.865837508250777,1., 4025P 5394 +0.865837508250854,1.,0.865837508250833,1.,21.4157277366876, 4025P 5395 +-190.598023114212,-11.6,21.4147507897154,-191.464873929134, 4025P 5396 +-11.6,22.1653032159898,-191.898581601616,-11.6,22.9158556422641, 4025P 5397 +-192.332289274099,-11.6,23.666408068534,-191.898581601608,-11.6, 4025P 5398 +24.4169604948039,-191.464873929118,-11.6,24.4159835478226, 4025P 5399 +-190.598023114196,-11.6,-6.28310481407034,-3.13925814734168,0., 4025P 5400 +0.,0.; 4025P 5401 +126,6,2,0,0,0,0,3.13925814731996,3.13925814731996, 4027P 5402 +3.13925814731996,4.1872070362402,4.1872070362402, 4027P 5403 +5.23515592516045,5.23515592516045,6.28310481408069, 4027P 5404 +6.28310481408069,6.28310481408069,1.,0.865837508248116,1., 4027P 5405 +0.865837508248067,1.,0.865837508248112,1.,100.190183492478, 4027P 5406 +-172.121201750453,-7.49999999999994,100.189206545482, 4027P 5407 +-171.25435093552,-7.49999999999994,100.939758971759, 4027P 5408 +-170.82064326302,-7.49999999999994,101.690311398036, 4027P 5409 +-170.38693559052,-7.49999999999994,102.440863824317, 4027P 5410 +-170.820643263012,-7.49999999999994,103.191416250599, 4027P 5411 +-171.254350935504,-7.49999999999994,103.190439303613, 4027P 5412 +-172.121201750437,-7.49999999999994,3.13925814731996, 4027P 5413 +6.28310481408069,0.,0.,0.; 4027P 5414 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,100.190183492478, 4029P 5415 +-172.121201750453,-7.49999999999994,100.190183492478, 4029P 5416 +-172.121201750453,-11.5999999999999,1.5,1.91,0.,0.,0.; 4029P 5417 +126,6,2,0,0,0,0,-6.28310481408069,-6.28310481408069, 4031P 5418 +-6.28310481408069,-5.23515592516045,-5.23515592516045, 4031P 5419 +-4.1872070362402,-4.1872070362402,-3.13925814731996, 4031P 5420 +-3.13925814731996,-3.13925814731996,1.,0.865837508248112,1., 4031P 5421 +0.865837508248067,1.,0.865837508248116,1.,103.190439303613, 4031P 5422 +-172.121201750437,-11.5999999999999,103.191416250599, 4031P 5423 +-171.254350935504,-11.5999999999999,102.440863824317, 4031P 5424 +-170.820643263012,-11.5999999999999,101.690311398036, 4031P 5425 +-170.38693559052,-11.5999999999999,100.939758971759, 4031P 5426 +-170.82064326302,-11.5999999999999,100.189206545482, 4031P 5427 +-171.25435093552,-11.5999999999999,100.190183492478, 4031P 5428 +-172.121201750453,-11.5999999999999,-6.28310481408069, 4031P 5429 +-3.13925814731996,0.,0.,0.; 4031P 5430 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,103.190439303613, 4033P 5431 +-172.121201750437,-7.49999999999994,103.190439303613, 4033P 5432 +-172.121201750437,-11.5999999999999,1.5,1.91,0.,0.,0.; 4033P 5433 +126,6,2,0,0,0,0,3.13925814735297,3.13925814735297, 4035P 5434 +3.13925814735297,4.1872070362588,4.1872070362588, 4035P 5435 +5.23515592516463,5.23515592516463,6.28310481407046, 4035P 5436 +6.28310481407046,6.28310481407046,1.,0.865837508251611,1., 4035P 5437 +0.865837508251546,1.,0.865837508251607,1.,103.190439303613, 4035P 5438 +-172.121201750437,-7.49999999999994,103.191416250589, 4035P 5439 +-172.988052565356,-7.49999999999994,102.440863824322, 4035P 5440 +-173.421760237843,-7.49999999999994,101.690311398054, 4035P 5441 +-173.85546791033,-7.49999999999994,100.939758971782, 4035P 5442 +-173.421760237851,-7.49999999999994,100.18920654551, 4035P 5443 +-172.988052565371,-7.49999999999994,100.190183492478, 4035P 5444 +-172.121201750453,-7.49999999999994,3.13925814735297, 4035P 5445 +6.28310481407046,0.,0.,0.; 4035P 5446 +126,6,2,0,0,0,0,-6.28310481407046,-6.28310481407046, 4037P 5447 +-6.28310481407046,-5.23515592516463,-5.23515592516463, 4037P 5448 +-4.1872070362588,-4.1872070362588,-3.13925814735297, 4037P 5449 +-3.13925814735297,-3.13925814735297,1.,0.865837508251607,1., 4037P 5450 +0.865837508251546,1.,0.865837508251611,1.,100.190183492478, 4037P 5451 +-172.121201750453,-11.5999999999999,100.18920654551, 4037P 5452 +-172.988052565371,-11.5999999999999,100.939758971782, 4037P 5453 +-173.421760237851,-11.5999999999999,101.690311398054, 4037P 5454 +-173.85546791033,-11.5999999999999,102.440863824322, 4037P 5455 +-173.421760237843,-11.5999999999999,103.191416250589, 4037P 5456 +-172.988052565356,-11.5999999999999,103.190439303613, 4037P 5457 +-172.121201750437,-11.5999999999999,-6.28310481407046, 4037P 5458 +-3.13925814735297,0.,0.,0.; 4037P 5459 +126,1,1,0,0,1,0,-2.57991060542639,-2.57991060542639, 4039P 5460 +-1.17773192390871,-1.17773192390871,1.,1.,105.613764146653, 4039P 5461 +-164.547507575232,-7.49999999999995,91.5919773314763, 4039P 5462 +-164.547507575232,-7.49999999999995,-2.57991060542639, 4039P 5463 +-1.17773192390871,0.,0.,0.; 4039P 5464 +126,1,1,0,0,1,0,0.8,0.8,1.21,1.21,1.,1.,105.613764146653, 4041P 5465 +-164.547507575232,-7.49999999999993,105.613764146653, 4041P 5466 +-164.547507575232,-11.5999999999999,0.8,1.21,0.,0.,0.; 4041P 5467 +126,1,1,0,0,1,0,1.17773192390871,1.17773192390871, 4043P 5468 +2.57991060542639,2.57991060542639,1.,1.,91.5919773314763, 4043P 5469 +-164.547507575232,-11.6,105.613764146653,-164.547507575232, 4043P 5470 +-11.5999999999999,1.17773192390871,2.57991060542639,0.,0.,0.; 4043P 5471 +126,1,1,0,0,1,0,0.45,0.45,0.86,0.86,1.,1.,91.5919773314763, 4045P 5472 +-164.547507575232,-7.49999999999994,91.5919773314763, 4045P 5473 +-164.547507575232,-11.5999999999999,0.45,0.86,0.,0.,0.; 4045P 5474 +126,1,1,0,0,1,0,-0.2,-0.2,0.2,0.2,1.,1.,105.613764146653, 4047P 5475 +-163.047507575232,5.50000000000006,105.613764146653, 4047P 5476 +-163.047507575232,1.50000000000006,-0.2,0.2,0.,0.,0.; 4047P 5477 +126,1,1,0,0,1,0,0.0749999999999993,0.0749999999999993, 4049P 5478 +0.724999999999998,0.724999999999998,1.,1.,105.613764146653, 4049P 5479 +-163.047507575232,1.50000000000007,105.613764146653, 4049P 5480 +-156.547507575232,1.50000000000007,0.0749999999999993, 4049P 5481 +0.724999999999998,0.,0.,0.; 4049P 5482 +126,1,1,0,0,1,0,-1.51,-1.51,-0.2,-0.2,1.,1.,105.613764146653, 4051P 5483 +-156.547507575232,-11.5999999999999,105.613764146653, 4051P 5484 +-156.547507575232,1.50000000000006,-1.51,-0.2,0.,0.,0.; 4051P 5485 +126,1,1,0,0,1,0,2.10504270777188,2.10504270777188, 4053P 5486 +2.90504270777187,2.90504270777187,1.,1.,105.613764146653, 4053P 5487 +-164.547507575232,-11.5999999999999,105.613764146653, 4053P 5488 +-156.547507575232,-11.5999999999999,2.10504270777188, 4053P 5489 +2.90504270777187,0.,0.,0.; 4053P 5490 +126,1,1,0,0,1,0,-7.99046868143113,-7.99046868143113, 4055P 5491 +-0.229270143011589,-0.229270143011589,1.,1.,117.599000752838, 4055P 5492 +-167.842369071796,-7.49999999999994,117.59899817983, 4055P 5493 +-245.454354455992,-7.49999999999994,-7.99046868143113, 4055P 5494 +-0.229270143011589,0.,0.,0.; 4055P 5495 +126,2,2,0,0,0,0,-3.14159259057679,-3.14159259057679, 4057P 5496 +-3.14159259057679,-1.98287834194696,-1.98287834194696, 4057P 5497 +-1.98287834194696,0.999999677363267,0.83681463606139,1., 4057P 5498 +119.099000828848,-165.549667575233,-7.49999999999994, 4057P 5499 +119.099000828847,-167.18670588825,-7.49999999999994, 4057P 5500 +117.599000752838,-167.842369071796,-7.49999999999994, 4057P 5501 +-3.14159259057679,-1.98287834194696,0.,0.,0.; 4057P 5502 +126,4,2,0,0,0,0,0.412082048305129,0.412082048305129, 4059P 5503 +0.412082048305129,1.77683680972467,1.77683680972467, 4059P 5504 +3.14159157114422,3.14159157114422,3.14159157114422,1., 4059P 5505 +0.776075642357578,1.,0.776075642357596,1.,114.304139365509, 4059P 5506 +-164.547507575232,-7.49999999999994,115.118495569018, 4059P 5507 +-162.684456106938,-7.49999999999994,117.108747098487, 4059P 5508 +-163.100431646069,-7.49999999999994,119.098998627955, 4059P 5509 +-163.516407185201,-7.49999999999994,119.099000828846, 4059P 5510 +-165.54966486678,-7.49999999999994,0.412082048305129, 4059P 5511 +3.14159157114422,0.,0.,0.; 4059P 5512 +126,1,1,0,0,1,0,-4.21636997194452,-4.21636997194452, 4061P 5513 +-2.50048634973718,-2.50048634973718,1.,1.,74.4331411094029, 4061P 5514 +-164.547507575232,-7.49999999999995,91.5919773314763, 4061P 5515 +-164.547507575232,-7.49999999999994,-4.21636997194452, 4061P 5516 +-2.50048634973718,0.,0.,0.; 4061P 5517 +126,1,1,0,0,1,0,-2.45504270777187,-2.45504270777187, 4063P 5518 +-1.75504270777187,-1.75504270777187,1.,1.,74.4331411094029, 4063P 5519 +-164.547507575232,-7.49999999999996,74.4331411094029, 4063P 5520 +-171.547507575232,-7.49999999999996,-2.45504270777187, 4063P 5521 +-1.75504270777187,0.,0.,0.; 4063P 5522 +126,1,1,0,0,1,0,-1.67087945356388,-1.67087945356388, 4065P 5523 +0.329120546436124,0.329120546436124,1.,1.,74.4331411094029, 4065P 5524 +-171.547507575232,-7.49999999999995,54.4331411094029, 4065P 5525 +-171.547507575231,-7.49999999999996,-1.67087945356388, 4065P 5526 +0.329120546436124,0.,0.,0.; 4065P 5527 +126,1,1,0,0,1,0,1.40504270777187,1.40504270777187, 4067P 5528 +2.10504270777187,2.10504270777187,1.,1.,54.4331411094029, 4067P 5529 +-171.547507575231,-7.49999999999996,54.4331411094029, 4067P 5530 +-164.547507575232,-7.49999999999996,1.40504270777187, 4067P 5531 +2.10504270777187,0.,0.,0.; 4067P 5532 +126,1,1,0,0,1,0,-7.61515214233563,-7.61515214233563, 4069P 5533 +-6.21636997194452,-6.21636997194452,1.,1.,40.4453194054918, 4069P 5534 +-164.547507575232,-7.49999999999996,54.4331411094029, 4069P 5535 +-164.547507575232,-7.49999999999995,-7.61515214233563, 4069P 5536 +-6.21636997194452,0.,0.,0.; 4069P 5537 +126,1,1,0,0,1,0,1.12851163163168,1.12851163163168, 4071P 5538 +2.82867520720327,2.82867520720327,1.,1.,40.4453194054917, 4071P 5539 +-164.547507575232,-7.49999999999996,23.4436836497758, 4071P 5540 +-164.547507575232,-7.49999999999996,1.12851163163168, 4071P 5541 +2.82867520720327,0.,0.,0.; 4071P 5542 +126,4,2,0,0,0,0,-6.25390749790614,-6.25390749790614, 4073P 5543 +-6.25390749790614,-4.9037910999005,-4.9037910999005, 4073P 5544 +-3.55367470189486,-3.55367470189486,-3.55367470189486,1., 4073P 5545 +0.780670581409548,1.,0.780670581409585,1.,2.93314110940287, 4073P 5546 +-165.476420277504,-7.49999999999997,2.99177706791294, 4073P 5547 +-163.474248497833,-7.49999999999997,4.95822887324418, 4073P 5548 +-163.093200852189,-7.49999999999997,6.92468067857541, 4073P 5549 +-162.712153206546,-7.49999999999997,7.72693023593538, 4073P 5550 +-164.547507575232,-7.49999999999997,-6.25390749790614, 4073P 5551 +-3.55367470189486,0.,0.,0.; 4073P 5552 +126,1,1,0,0,1,0,2.18487010842909,2.18487010842909, 4075P 5553 +2.19951956797476,2.19951956797476,1.,1.,2.93314110940288, 4075P 5554 +-165.622914872961,-7.49999999999997,2.93314110940288, 4075P 5555 +-165.476420277504,-7.49999999999997,2.18487010842909, 4075P 5556 +2.19951956797476,0.,0.,0.; 4075P 5557 +126,1,1,0,0,1,0,-2.19683051976291,-2.19683051976291, 4077P 5558 +-0.233951809861228,-0.233951809861228,1.,1.,4.43314110940287, 4077P 5559 +-187.471624566822,-7.49999999999997,4.43314110940286, 4077P 5560 +-167.842837467805,-7.49999999999997,-2.19683051976291, 4077P 5561 +-0.233951809861228,0.,0.,0.; 4077P 5562 +126,6,2,0,0,0,0,-9.01269591246431,-9.01269591246431, 4079P 5563 +-9.01269591246431,-7.71661521165286,-7.71661521165286, 4079P 5564 +-6.42053451084141,-6.42053451084141,-5.12445381002996, 4079P 5565 +-5.12445381002996,-5.12445381002996,1.,0.797268222513898,1., 4079P 5566 +0.797268222513902,1.,0.797268222513904,1.,7.72696471074416, 4079P 5567 +-248.749215886107,-7.49999999999997,6.96821249566285, 4079P 5568 +-250.485058779287,-7.49999999999997,5.09163041069214, 4079P 5569 +-250.22564568775,-7.49999999999997,3.21504832572143, 4079P 5570 +-249.966232596213,-7.49999999999997,2.95566754645106, 4079P 5571 +-248.089646044774,-7.49999999999997,2.69628676718068, 4079P 5572 +-246.213059493336,-7.49999999999997,4.43214272479953, 4079P 5573 +-245.454337167255,-7.49999999999997,-9.01269591246431, 4079P 5574 +-5.12445381002996,0.,0.,0.; 4079P 5575 +126,6,2,0,0,0,0,-4.30030689892742,-4.30030689892742, 4081P 5576 +-4.30030689892742,-3.00423194871996,-3.00423194871996, 4081P 5577 +-1.7081569985125,-1.7081569985125,-0.412082048305046, 4081P 5578 +-0.412082048305046,-0.412082048305046,1.,0.797269958115279,1., 4081P 5579 +0.797269958115353,1.,0.797269958115315,1.,117.59899817983, 4081P 5580 +-245.454354455992,-7.49999999999994,119.334830676844, 4081P 5581 +-246.213102195359,-7.49999999999994,119.07542986441, 4081P 5582 +-248.089674551596,-7.49999999999994,118.816029051977, 4081P 5583 +-249.966246907834,-7.49999999999994,116.93945668714, 4081P 5584 +-250.225647658055,-7.49999999999994,115.062884322303, 4081P 5585 +-250.485048408276,-7.49999999999994,114.304136640482, 4081P 5586 +-248.749215886107,-7.49999999999994,-4.30030689892742, 4081P 5587 +-0.412082048305046,0.,0.,0.; 4081P 5588 +126,1,1,0,0,1,0,0.8,0.8,1.21,1.21,1.,1.,40.4453194054918, 4083P 5589 +-164.547507575232,-7.49999999999997,40.4453194054918, 4083P 5590 +-164.547507575232,-11.6,0.8,1.21,0.,0.,0.; 4083P 5591 +126,1,1,0,0,1,0,-2.82867520720327,-2.82867520720327, 4085P 5592 +-1.12851163163168,-1.12851163163168,1.,1.,23.4436836497758, 4085P 5593 +-164.547507575232,-11.6,40.4453194054917,-164.547507575232, 4085P 5594 +-11.6,-2.82867520720327,-1.12851163163168,0.,0.,0.; 4085P 5595 +126,1,1,0,0,1,0,0.45,0.45,0.86,0.86,1.,1.,23.4436836497758, 4087P 5596 +-164.547507575232,-7.49999999999996,23.4436836497758, 4087P 5597 +-164.547507575232,-11.6,0.45,0.86,0.,0.,0.; 4087P 5598 +126,1,1,0,0,1,0,-0.199999999999999,-0.199999999999999,1.1,1.1, 4089P 5599 +1.,1.,40.4453194054918,-164.547507575232,5.50000000000003, 4089P 5600 +40.4453194054918,-164.547507575232,-7.49999999999997, 4089P 5601 +-0.199999999999999,1.1,0.,0.,0.; 4089P 5602 +126,1,1,0,0,1,0,-2.25504270777188,-2.25504270777188, 4091P 5603 +-2.10504270777188,-2.10504270777188,1.,1.,40.4453194054918, 4091P 5604 +-163.047507575232,5.50000000000003,40.4453194054918, 4091P 5605 +-164.547507575232,5.50000000000003,-2.25504270777188, 4091P 5606 +-2.10504270777188,0.,0.,0.; 4091P 5607 +126,1,1,0,0,1,0,-0.199999999999999,-0.199999999999999, 4093P 5608 +0.200000000000001,0.200000000000001,1.,1.,40.4453194054918, 4093P 5609 +-163.047507575232,5.50000000000003,40.4453194054918, 4093P 5610 +-163.047507575232,1.50000000000003,-0.199999999999999, 4093P 5611 +0.200000000000001,0.,0.,0.; 4093P 5612 +126,1,1,0,0,1,0,0.0749999999999993,0.0749999999999993, 4095P 5613 +0.724999999999998,0.724999999999998,1.,1.,40.4453194054918, 4095P 5614 +-163.047507575232,1.50000000000003,40.4453194054918, 4095P 5615 +-156.547507575232,1.50000000000003,0.0749999999999993, 4095P 5616 +0.724999999999998,0.,0.,0.; 4095P 5617 +126,1,1,0,0,1,0,-1.51,-1.51,-0.2,-0.2,1.,1.,40.4453194054918, 4097P 5618 +-156.547507575232,-11.6,40.4453194054918,-156.547507575232, 4097P 5619 +1.50000000000004,-1.51,-0.2,0.,0.,0.; 4097P 5620 +126,1,1,0,0,1,0,2.10504270777188,2.10504270777188, 4099P 5621 +2.90504270777187,2.90504270777187,1.,1.,40.4453194054918, 4099P 5622 +-164.547507575232,-11.6,40.4453194054918,-156.547507575232, 4099P 5623 +-11.6,2.10504270777188,2.90504270777187,0.,0.,0.; 4099P 5624 +126,1,1,0,0,1,0,-2.6006363194306,-2.6006363194306, 4101P 5625 +-0.900472743859004,-0.900472743859004,1.,1.,40.4453194054918, 4101P 5626 +-156.547507575232,1.50000000000004,23.4436836497758, 4101P 5627 +-156.547507575232,1.50000000000003,-2.6006363194306, 4101P 5628 +-0.900472743859004,0.,0.,0.; 4101P 5629 +126,1,1,0,0,1,0,0.900472743859004,0.900472743859004, 4103P 5630 +2.6006363194306,2.6006363194306,1.,1.,23.4436836497758, 4103P 5631 +-163.047507575232,1.50000000000003,40.4453194054918, 4103P 5632 +-163.047507575232,1.50000000000004,0.900472743859004, 4103P 5633 +2.6006363194306,0.,0.,0.; 4103P 5634 +126,1,1,0,0,1,0,0.0749999999999957,0.0749999999999957, 4105P 5635 +0.724999999999998,0.724999999999998,1.,1.,23.4436836497758, 4105P 5636 +-163.047507575232,1.50000000000003,23.4436836497758, 4105P 5637 +-156.547507575232,1.50000000000003,0.0749999999999957, 4105P 5638 +0.724999999999998,0.,0.,0.; 4105P 5639 +126,1,1,0,0,1,0,-6.31006610946171,-6.31006610946171, 4107P 5640 +-4.90788742794403,-4.90788742794403,1.,1.,105.613764146653, 4107P 5641 +-156.547507575232,1.50000000000004,91.5919773314763, 4107P 5642 +-156.547507575232,1.50000000000004,-6.31006610946171, 4107P 5643 +-4.90788742794403,0.,0.,0.; 4107P 5644 +126,1,1,0,0,1,0,4.90788742794403,4.90788742794403, 4109P 5645 +6.31006610946171,6.31006610946171,1.,1.,91.5919773314763, 4109P 5646 +-163.047507575232,1.50000000000004,105.613764146653, 4109P 5647 +-163.047507575232,1.50000000000004,4.90788742794403, 4109P 5648 +6.31006610946171,0.,0.,0.; 4109P 5649 +126,1,1,0,0,1,0,0.0750000000000028,0.0750000000000028, 4111P 5650 +0.724999999999998,0.724999999999998,1.,1.,91.5919773314763, 4111P 5651 +-163.047507575232,1.50000000000007,91.5919773314763, 4111P 5652 +-156.547507575232,1.50000000000007,0.0750000000000028, 4111P 5653 +0.724999999999998,0.,0.,0.; 4111P 5654 +126,1,1,0,0,1,0,0.722042900013125,0.722042900013125, 4113P 5655 +5.83670869261158,5.83670869261158,1.,1.,40.4453194054918, 4113P 5656 +-163.047507575232,5.50000000000003,91.5919773314763, 4113P 5657 +-163.047507575232,5.50000000000004,0.722042900013125, 4113P 5658 +5.83670869261158,0.,0.,0.; 4113P 5659 +126,1,1,0,0,1,0,0.15,0.15,0.549999999999998,0.549999999999998, 4115P 5660 +1.,1.,91.5919773314763,-163.047507575232,1.50000000000007, 4115P 5661 +91.5919773314763,-163.047507575232,5.50000000000004,0.15, 4115P 5662 +0.549999999999998,0.,0.,0.; 4115P 5663 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,116.596840828848, 4117P 5664 +-163.047507575232,7.50000000000006,116.596840828848, 4117P 5665 +-163.047507575232,5.50000000000006,0.,0.2,0.,0.,0.; 4117P 5666 +126,1,1,0,0,1,0,-2.77906616327648,-2.77906616327648, 4119P 5667 +8.33719504234876,8.33719504234876,1.,1.,5.43422877259571, 4119P 5668 +-163.047507575232,7.50000000000002,116.596840828848, 4119P 5669 +-163.047507575232,7.50000000000005,-2.77906616327648, 4119P 5670 +8.33719504234876,0.,0.,0.; 4119P 5671 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,5.43422877259573, 4121P 5672 +-163.047507575232,7.50000000000003,5.43422877259573, 4121P 5673 +-163.047507575232,5.50000000000003,0.,0.2,0.,0.,0.; 4121P 5674 +126,1,1,0,0,1,0,0.9,0.9,1.3,1.3,1.,1.,23.4436836497758, 4123P 5675 +-163.047507575232,1.50000000000003,23.4436836497758, 4123P 5676 +-163.047507575232,5.50000000000002,0.9,1.3,0.,0.,0.; 4123P 5677 +126,1,1,0,0,1,0,-2.83004270777188,-2.83004270777188, 4125P 5678 +-2.03004270777188,-2.03004270777188,1.,1.,23.4436836497758, 4125P 5679 +-156.547507575232,-11.6,23.4436836497758,-164.547507575232, 4125P 5680 +-11.6,-2.83004270777188,-2.03004270777188,0.,0.,0.; 4125P 5681 +126,1,1,0,0,1,0,-0.15,-0.15,1.16,1.16,1.,1.,23.4436836497758, 4127P 5682 +-156.547507575232,1.50000000000003,23.4436836497758, 4127P 5683 +-156.547507575232,-11.6,-0.15,1.16,0.,0.,0.; 4127P 5684 +126,1,1,0,0,1,0,-2.90504270777187,-2.90504270777187, 4129P 5685 +-2.10504270777188,-2.10504270777188,1.,1.,91.5919773314763, 4129P 5686 +-156.547507575232,-11.5999999999999,91.5919773314763, 4129P 5687 +-164.547507575232,-11.5999999999999,-2.90504270777187, 4129P 5688 +-2.10504270777188,0.,0.,0.; 4129P 5689 +126,1,1,0,0,1,0,-0.15,-0.15,1.16,1.16,1.,1.,91.5919773314763, 4131P 5690 +-156.547507575232,1.50000000000006,91.5919773314763, 4131P 5691 +-156.547507575232,-11.5999999999999,-0.15,1.16,0.,0.,0.; 4131P 5692 +126,1,1,0,0,1,0,2.10504270777188,2.10504270777188, 4133P 5693 +2.25504270777187,2.25504270777187,1.,1.,91.5919773314763, 4133P 5694 +-164.547507575232,5.50000000000004,91.5919773314763, 4133P 5695 +-163.047507575232,5.50000000000004,2.10504270777188, 4133P 5696 +2.25504270777187,0.,0.,0.; 4133P 5697 +126,1,1,0,0,1,0,-0.75,-0.75,0.549999999999998,0.549999999999998, 4135P 5698 +1.,1.,91.5919773314763,-164.547507575232,-7.49999999999994, 4135P 5699 +91.5919773314763,-164.547507575232,5.50000000000004,-0.75, 4135P 5700 +0.549999999999998,0.,0.,0.; 4135P 5701 +126,1,1,0,0,1,0,-0.75,-0.75,0.549999999999999,0.549999999999999, 4137P 5702 +1.,1.,54.4331411094029,-164.547507575232,-7.49999999999996, 4137P 5703 +54.4331411094029,-164.547507575232,5.50000000000004,-0.75, 4137P 5704 +0.549999999999999,0.,0.,0.; 4137P 5705 +126,1,1,0,0,1,0,-2.12082507040424,-2.12082507040424, 4139P 5706 +-0.722042900013125,-0.722042900013125,1.,1.,54.4331411094029, 4139P 5707 +-164.547507575232,5.50000000000004,40.4453194054918, 4139P 5708 +-164.547507575232,5.50000000000003,-2.12082507040424, 4139P 5709 +-0.722042900013125,0.,0.,0.; 4139P 5710 +126,1,1,0,0,1,0,-2.10504270777183,-2.10504270777183, 4141P 5711 +-1.40504270777192,-1.40504270777192,1.,1.,54.4331411094029, 4141P 5712 +-164.547507575232,5.50000000000003,54.4331411094029, 4141P 5713 +-171.547507575231,5.50000000000003,-2.10504270777183, 4141P 5714 +-1.40504270777192,0.,0.,0.; 4141P 5715 +126,1,1,0,0,1,0,-0.329120546436126,-0.329120546436126, 4143P 5716 +1.67087945356387,1.67087945356387,1.,1.,54.4331411094029, 4143P 5717 +-171.547507575231,5.50000000000003,74.4331411094029, 4143P 5718 +-171.547507575232,5.50000000000004,-0.329120546436126, 4143P 5719 +1.67087945356387,0.,0.,0.; 4143P 5720 +126,1,1,0,0,1,0,1.75504270777192,1.75504270777192, 4145P 5721 +2.45504270777183,2.45504270777183,1.,1.,74.4331411094029, 4145P 5722 +-171.547507575232,5.50000000000004,74.4331411094029, 4145P 5723 +-164.547507575232,5.50000000000004,1.75504270777192, 4145P 5724 +2.45504270777183,0.,0.,0.; 4145P 5725 +126,1,1,0,0,1,0,-5.83670869261158,-5.83670869261158, 4147P 5726 +-4.12082507040424,-4.12082507040424,1.,1.,91.5919773314763, 4147P 5727 +-164.547507575232,5.50000000000004,74.4331411094029, 4147P 5728 +-164.547507575232,5.50000000000004,-5.83670869261158, 4147P 5729 +-4.12082507040424,0.,0.,0.; 4147P 5730 +126,1,1,0,0,1,0,-0.55,-0.55,0.75,0.75,1.,1.,74.4331411094029, 4149P 5731 +-164.547507575232,5.50000000000004,74.4331411094029, 4149P 5732 +-164.547507575232,-7.49999999999996,-0.55,0.75,0.,0.,0.; 4149P 5733 +126,1,1,0,0,1,0,0.,0.,1.3,1.3,1.,1.,74.4331411094029, 4151P 5734 +-171.547507575232,-7.49999999999996,74.4331411094029, 4151P 5735 +-171.547507575232,5.50000000000004,0.,1.3,0.,0.,0.; 4151P 5736 +126,1,1,0,0,1,0,0.,0.,1.3,1.3,1.,1.,54.4331411094029, 4153P 5737 +-171.547507575231,-7.49999999999996,54.4331411094029, 4153P 5738 +-171.547507575231,5.50000000000004,0.,1.3,0.,0.,0.; 4153P 5739 +126,1,1,0,0,1,0,-1.5,-1.5,-0.2,-0.2,1.,1.,117.59899817983, 4155P 5740 +-245.454354455992,-7.49999999999994,117.59899817983, 4155P 5741 +-245.454354455992,5.50000000000006,-1.5,-0.2,0.,0.,0.; 4155P 5742 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,117.599000752838, 4157P 5743 +-167.842369071796,5.50000000000006,117.599000752838, 4157P 5744 +-167.842369071796,-7.49999999999994,0.2,1.5,0.,0.,0.; 4157P 5745 +126,1,1,0,0,1,0,0.958837288670924,0.958837288670924, 4159P 5746 +3.15835685664568,3.15835685664568,1.,1.,2.9331411094029, 4159P 5747 +-187.471615957251,7.50000000000003,2.93314110940288, 4159P 5748 +-165.476420277504,7.50000000000003,0.958837288670924, 4159P 5749 +3.15835685664568,0.,0.,0.; 4159P 5750 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,2.9331411094029, 4161P 5751 +-187.471615957251,7.50000000000003,2.9331411094029, 4161P 5752 +-187.471615957251,5.50000000000003,0.,0.2,0.,0.,0.; 4161P 5753 +126,1,1,0,0,1,0,0.,0.,1.5,1.5,1.,1.,2.93314110940287, 4163P 5754 +-165.476420277504,7.50000000000003,2.93314110940287, 4163P 5755 +-165.476420277504,-7.49999999999997,0.,1.5,0.,0.,0.; 4163P 5756 +126,1,1,0,0,1,0,-2.054982559236,-2.054982559236, 4165P 5757 +3.97255712615894,3.97255712615894,1.,1.,2.93210324777536, 4165P 5758 +-247.747012802266,7.50000000000003,2.9331411094029, 4165P 5759 +-187.471615957251,7.50000000000003,-2.054982559236, 4165P 5760 +3.97255712615894,0.,0.,0.; 4165P 5761 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,2.93210324777537, 4167P 5762 +-247.747012802266,7.50000000000003,2.93210324777537, 4167P 5763 +-247.747012802266,5.50000000000003,0.,0.2,0.,0.,0.; 4167P 5764 +126,4,2,0,0,0,0,-1.57081354545468,-1.57081354545468, 4169P 5765 +-1.57081354545468,-0.785406772727342,-0.785406772727342,0.,0., 4169P 5766 +0.,1.,0.923877885178856,1.,0.923877885178848,1., 4169P 5767 +5.43426324740444,-250.249215886107,7.50000000000003, 4169P 5768 +4.39782202118939,-250.249215886107,7.50000000000003, 4169P 5769 +3.66495371141794,-249.516334957217,7.50000000000003, 4169P 5770 +2.93208540164649,-248.783454028327,7.50000000000003, 4169P 5771 +2.93210324777536,-247.747012802266,7.50000000000003, 4169P 5772 +-1.57081354545468,0.,0.,0.,0.; 4169P 5773 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,5.43426324740444, 4171P 5774 +-250.249215886107,7.50000000000003,5.43426324740444, 4171P 5775 +-250.249215886107,5.50000000000003,0.,0.2,0.,0.,0.; 4171P 5776 +126,1,1,0,0,1,0,-2.77906430328482,-2.77906430328482, 4173P 5777 +8.33719318235691,8.33719318235691,1.,1.,116.596838103822, 4173P 5778 +-250.249215886107,7.50000000000007,5.43426324740444, 4173P 5779 +-250.249215886107,7.50000000000004,-2.77906430328482, 4173P 5780 +8.33719318235691,0.,0.,0.; 4173P 5781 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,116.596838103822, 4175P 5782 +-250.249215886107,7.50000000000006,116.596838103822, 4175P 5783 +-250.249215886107,5.50000000000006,0.,0.2,0.,0.,0.; 4175P 5784 +126,2,2,0,0,0,0,-1.5707963267949,-1.5707963267949, 4177P 5785 +-1.5707963267949,0.,0.,0.,1.,0.707106781186533,1., 4177P 5786 +119.098998103822,-247.747055886107,7.50000000000006, 4177P 5787 +119.098998103822,-250.249215886107,7.50000000000006, 4177P 5788 +116.596838103822,-250.249215886107,7.50000000000006, 4177P 5789 +-1.5707963267949,0.,0.,0.,0.; 4177P 5790 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,119.098998103822, 4179P 5791 +-247.747055886107,7.50000000000006,119.098998103822, 4179P 5792 +-247.747055886107,5.50000000000006,0.,0.2,0.,0.,0.; 4179P 5793 +126,1,1,0,0,1,0,-2.05493493947419,-2.05493493947419, 4181P 5794 +6.16480416245852,6.16480416245852,1.,1.,119.099000828846, 4181P 5795 +-165.54966486678,7.50000000000006,119.098998103822, 4181P 5796 +-247.747055886107,7.50000000000006,-2.05493493947419, 4181P 5797 +6.16480416245852,0.,0.,0.; 4181P 5798 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,119.099000828846, 4183P 5799 +-165.54966486678,7.50000000000006,119.099000828846, 4183P 5800 +-165.54966486678,5.50000000000006,0.,0.2,0.,0.,0.; 4183P 5801 +126,2,2,0,0,0,0,-1.57079524434933,-1.57079524434933, 4185P 5802 +-1.57079524434933,0.,0.,0.,1.,0.707107163888751,1., 4185P 5803 +116.596840828848,-163.047507575233,7.50000000000006, 4185P 5804 +119.098998120397,-163.047507575233,7.50000000000006, 4185P 5805 +119.099000828846,-165.54966486678,7.50000000000006, 4185P 5806 +-1.57079524434933,0.,0.,0.,0.; 4185P 5807 +126,2,2,0,0,0,0,-1.54151851752146,-1.54151851752146, 4187P 5808 +-1.54151851752146,0.,0.,0.,1.,0.71738191595478,1., 4187P 5809 +2.93314110940286,-165.476420277504,7.50000000000003, 4187P 5810 +3.00427467840082,-163.047507575232,7.50000000000003, 4187P 5811 +5.4342287725957,-163.047507575232,7.50000000000003, 4187P 5812 +-1.54151851752146,0.,0.,0.,0.; 4187P 5813 +126,2,2,0,0,0,0,0.,0.,0.,1.55536115200856,1.55536115200856, 4189P 5814 +1.55536115200856,1.,0.712542827450542,1.,5.4342287725957, 4189P 5815 +-156.547507575232,7.50000000000003,-3.43004274316727, 4189P 5816 +-156.547507575232,7.50000000000002,-3.56685889059713, 4189P 5817 +-165.410723179457,7.50000000000002,0.,1.55536115200856,0.,0.,0.; 4189P 5818 +126,1,1,0,0,1,0,7.15168754189355D-31,7.15168754189355D-31, 4191P 5819 +2.20608325126057,2.20608325126057,1.,1.,-3.56685889059712, 4191P 5820 +-165.410723179457,7.50000000000003,-3.5668588905971, 4191P 5821 +-187.471555692063,7.50000000000003,7.15168754189355D-31, 4191P 5822 +2.20608325126057,0.,0.,0.; 4191P 5823 +126,1,1,0,0,1,0,0.,0.,6.02753451978495,6.02753451978495,1.,1., 4193P 5824 +-3.56685889059712,-187.471555692063,7.50000000000003, 4193P 5825 +-3.56789675126108,-247.746900880977,7.50000000000003,0., 4193P 5826 +6.02753451978495,0.,0.,0.; 4193P 5827 +126,4,2,0,0,0,0,0.,0.,0.,0.785406772727353,0.785406772727353, 4195P 5828 +1.57081354545471,1.57081354545471,1.57081354545471,1., 4195P 5829 +0.92387788517878,1.,0.92387788517879,1.,-3.56789675126107, 4195P 5830 +-247.746900880977,7.50000000000002,-3.56796095727013, 4195P 5831 +-251.475763043109,7.50000000000002,-0.931279936275423, 4195P 5832 +-254.112489464608,7.50000000000003,1.70540108471928, 4195P 5833 +-256.749215886107,7.50000000000003,5.43426324740445, 4195P 5834 +-256.749215886107,7.50000000000003,0.,1.57081354545471,0.,0.,0.; 4195P 5835 +126,1,1,0,0,1,0,0.,0.,11.1162574856417,11.1162574856417,1.,1., 4197P 5836 +5.43426324740444,-256.749215886107,7.50000000000003, 4197P 5837 +116.596838103822,-256.749215886107,7.50000000000005,0., 4197P 5838 +11.1162574856417,0.,0.,0.; 4197P 5839 +126,2,2,0,0,0,0,0.,0.,0.,1.57079632679491,1.57079632679491, 4199P 5840 +1.57079632679491,1.,0.707106781186541,1.,116.596838103822, 4199P 5841 +-256.749215886107,7.50000000000006,125.598998103822, 4199P 5842 +-256.749215886107,7.50000000000006,125.598998103822, 4199P 5843 +-247.747055886107,7.50000000000006,0.,1.57079632679491,0.,0.,0.; 4199P 5844 +126,1,1,0,0,1,0,0.,0.,8.21973908038377,8.21973908038377,1.,1., 4201P 5845 +125.598998103822,-247.747055886107,7.50000000000006, 4201P 5846 +125.599000828846,-165.54966508227,7.50000000000006,0., 4201P 5847 +8.21973908038377,0.,0.,0.; 4201P 5848 +126,2,2,0,0,0,0,0.,0.,0.,1.57079604986551,1.57079604986551, 4203P 5849 +1.57079604986551,1.,0.707106879095863,1.,125.599000828846, 4203P 5850 +-165.54966508227,7.50000000000006,125.598998335884, 4203P 5851 +-156.547507575234,7.50000000000006,116.596840828848, 4203P 5852 +-156.547507575234,7.50000000000006,0.,1.57079604986551,0.,0.,0.; 4203P 5853 +126,1,1,0,0,1,0,0.,0.,11.1162612056252,11.1162612056252,1.,1., 4205P 5854 +116.596840828848,-156.547507575232,7.50000000000006, 4205P 5855 +5.43422877259571,-156.547507575232,7.50000000000003,0., 4205P 5856 +11.1162612056252,0.,0.,0.; 4205P 5857 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,-3.56685889059712, 4207P 5858 +-165.410723179457,7.50000000000003,-3.56685889059711, 4207P 5859 +-165.410723179457,-11.6,0.,1.91,0.,0.,0.; 4207P 5860 +126,1,1,0,0,1,0,-2.20608325126057,-2.20608325126057,0.,0.,1.,1., 4209P 5861 +-3.5668588905971,-187.471555692063,-11.6,-3.56685889059712, 4209P 5862 +-165.410723179457,-11.6,-2.20608325126057,0.,0.,0.,0.; 4209P 5863 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,-3.56685889059712, 4211P 5864 +-187.471555692063,7.50000000000003,-3.56685889059711, 4211P 5865 +-187.471555692063,-11.6,0.,1.91,0.,0.,0.; 4211P 5866 +126,1,1,0,0,1,0,-6.02753451978495,-6.02753451978495,0.,0.,1.,1., 4213P 5867 +-3.56789675126108,-247.746900880977,-11.6,-3.56685889059712, 4213P 5868 +-187.471555692063,-11.6,-6.02753451978495,0.,0.,0.,0.; 4213P 5869 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,-3.56789675126109, 4215P 5870 +-247.746900880977,7.50000000000003,-3.56789675126108, 4215P 5871 +-247.746900880977,-11.6,0.,1.91,0.,0.,0.; 4215P 5872 +126,4,2,0,0,0,0,-1.57081354545471,-1.57081354545471, 4217P 5873 +-1.57081354545471,-0.785406772727353,-0.785406772727353,0.,0., 4217P 5874 +0.,1.,0.92387788517879,1.,0.92387788517878,1.,5.43426324740445, 4217P 5875 +-256.749215886107,-11.6,1.70540108471928,-256.749215886107, 4217P 5876 +-11.6,-0.931279936275423,-254.112489464608,-11.6, 4217P 5877 +-3.56796095727013,-251.475763043109,-11.6,-3.56789675126107, 4217P 5878 +-247.746900880977,-11.6,-1.57081354545471,0.,0.,0.,0.; 4217P 5879 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,5.43426324740444, 4219P 5880 +-256.749215886107,7.50000000000003,5.43426324740445, 4219P 5881 +-256.749215886107,-11.6,0.,1.91,0.,0.,0.; 4219P 5882 +126,1,1,0,0,1,0,-11.1162574856417,-11.1162574856417,0.,0.,1.,1., 4221P 5883 +116.596838103822,-256.749215886107,-11.5999999999999, 4221P 5884 +5.43426324740444,-256.749215886107,-11.6,-11.1162574856417,0., 4221P 5885 +0.,0.,0.; 4221P 5886 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,116.596838103822, 4223P 5887 +-256.749215886107,7.50000000000006,116.596838103822, 4223P 5888 +-256.749215886107,-11.5999999999999,0.,1.91,0.,0.,0.; 4223P 5889 +126,2,2,0,0,0,0,-1.57079632679491,-1.57079632679491, 4225P 5890 +-1.57079632679491,0.,0.,0.,1.,0.707106781186541,1., 4225P 5891 +125.598998103822,-247.747055886107,-11.5999999999999, 4225P 5892 +125.598998103822,-256.749215886107,-11.5999999999999, 4225P 5893 +116.596838103822,-256.749215886107,-11.5999999999999, 4225P 5894 +-1.57079632679491,0.,0.,0.,0.; 4225P 5895 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,125.598998103822, 4227P 5896 +-247.747055886107,7.50000000000006,125.598998103822, 4227P 5897 +-247.747055886107,-11.5999999999999,0.,1.91,0.,0.,0.; 4227P 5898 +126,1,1,0,0,1,0,-8.21973908038377,-8.21973908038377,0.,0.,1.,1., 4229P 5899 +125.599000828846,-165.54966508227,-11.5999999999999, 4229P 5900 +125.598998103822,-247.747055886107,-11.5999999999999, 4229P 5901 +-8.21973908038377,0.,0.,0.,0.; 4229P 5902 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,125.599000828846, 4231P 5903 +-165.54966508227,7.50000000000006,125.599000828846, 4231P 5904 +-165.54966508227,-11.5999999999999,0.,1.91,0.,0.,0.; 4231P 5905 +126,2,2,0,0,0,0,-1.57079604986551,-1.57079604986551, 4233P 5906 +-1.57079604986551,0.,0.,0.,1.,0.707106879095863,1., 4233P 5907 +116.596840828848,-156.547507575234,-11.5999999999999, 4233P 5908 +125.598998335884,-156.547507575234,-11.5999999999999, 4233P 5909 +125.599000828846,-165.54966508227,-11.5999999999999, 4233P 5910 +-1.57079604986551,0.,0.,0.,0.; 4233P 5911 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,116.596840828848, 4235P 5912 +-156.547507575232,7.50000000000006,116.596840828848, 4235P 5913 +-156.547507575232,-11.5999999999999,0.,1.91,0.,0.,0.; 4235P 5914 +126,1,1,0,0,1,0,-7.61515214233563,-7.61515214233563, 4237P 5915 +-2.50048634973717,-2.50048634973717,1.,1.,40.4453194054918, 4237P 5916 +-156.547507575232,-11.6,91.5919773314763,-156.547507575232, 4237P 5917 +-11.5999999999999,-7.61515214233563,-2.50048634973717,0.,0.,0.; 4237P 5918 +126,1,1,0,0,1,0,-11.1162612056252,-11.1162612056252, 4239P 5919 +-9.31531571790722,-9.31531571790722,1.,1.,5.43422877259571, 4239P 5920 +-156.547507575232,-11.6,23.4436836497758,-156.547507575232, 4239P 5921 +-11.6,-11.1162612056252,-9.31531571790722,0.,0.,0.; 4239P 5922 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,5.43422877259573, 4241P 5923 +-156.547507575232,7.50000000000003,5.43422877259574, 4241P 5924 +-156.547507575232,-11.6,0.,1.91,0.,0.,0.; 4241P 5925 +126,1,1,0,0,1,0,-1.09830766821949,-1.09830766821949,0.,0.,1.,1., 4243P 5926 +105.613764146653,-156.547507575232,-11.5999999999999, 4243P 5927 +116.596840828848,-156.547507575232,-11.5999999999999, 4243P 5928 +-1.09830766821949,0.,0.,0.,0.; 4243P 5929 +126,2,2,0,0,0,0,-1.55536115200856,-1.55536115200856, 4245P 5930 +-1.55536115200856,0.,0.,0.,1.,0.712542827450542,1., 4245P 5931 +-3.56685889059713,-165.410723179457,-11.6,-3.43004274316727, 4245P 5932 +-156.547507575232,-11.6,5.4342287725957,-156.547507575232,-11.6, 4245P 5933 +-1.55536115200856,0.,0.,0.,0.; 4245P 5934 +126,1,1,0,0,1,0,4.455,4.455,5.755,5.755,1.,1.,220.752682252201, 4247P 5935 +-164.547507575232,-7.5,220.752682252201,-164.547507575232,5.5, 4247P 5936 +4.455,5.755,0.,0.,0.; 4247P 5937 +126,1,1,0,0,1,0,-4.83608912419324,-4.83608912419324, 4249P 5938 +-4.12082507040424,-4.12082507040424,1.,1.,220.752682252201, 4249P 5939 +-164.547507575232,5.5,213.600041714311,-164.547507575232,5.5, 4249P 5940 +-4.83608912419324,-4.12082507040424,0.,0.,0.; 4249P 5941 +126,1,1,0,0,1,0,-0.55,-0.55,0.75,0.75,1.,1.,213.600041714311, 4251P 5942 +-164.547507575232,5.5,213.600041714311,-164.547507575232,-7.5, 4251P 5943 +-0.55,0.75,0.,0.,0.; 4251P 5944 +126,1,1,0,0,1,0,-4.21636997194452,-4.21636997194452, 4253P 5945 +-3.50110591815552,-3.50110591815552,1.,1.,213.600041714311, 4253P 5946 +-164.547507575232,-7.5,220.752682252201,-164.547507575232,-7.5, 4253P 5947 +-4.21636997194452,-3.50110591815552,0.,0.,0.; 4253P 5948 +126,1,1,0,0,1,0,2.03004270777188,2.03004270777188, 4255P 5949 +2.18004270777188,2.18004270777188,1.,1.,220.752682252201, 4255P 5950 +-164.547507575232,5.5,220.752682252201,-163.047507575232,5.5, 4255P 5951 +2.03004270777188,2.18004270777188,0.,0.,0.; 4255P 5952 +126,1,1,0,0,1,0,-0.277957099986875,-0.277957099986875, 4257P 5953 +4.83608912419324,4.83608912419324,1.,1.,169.612220010399, 4257P 5954 +-163.047507575232,5.5,220.752682252201,-163.047507575232,5.5, 4257P 5955 +-0.277957099986875,4.83608912419324,0.,0.,0.; 4257P 5956 +126,1,1,0,0,1,0,-2.25504270777188,-2.25504270777188, 4259P 5957 +-2.10504270777188,-2.10504270777188,1.,1.,169.612220010399, 4259P 5958 +-163.047507575232,5.5,169.612220010399,-164.547507575232,5.5, 4259P 5959 +-2.25504270777188,-2.10504270777188,0.,0.,0.; 4259P 5960 +126,1,1,0,0,1,0,-2.12082507040424,-2.12082507040424, 4261P 5961 +0.277957099986875,0.277957099986875,1.,1.,193.600041714311, 4261P 5962 +-164.547507575232,5.5,169.612220010399,-164.547507575232,5.5, 4261P 5963 +-2.12082507040424,0.277957099986875,0.,0.,0.; 4261P 5964 +126,1,1,0,0,1,0,-2.10504270777183,-2.10504270777183, 4263P 5965 +-1.40504270777192,-1.40504270777192,1.,1.,193.600041714311, 4263P 5966 +-164.547507575232,5.5,193.600041714311,-171.547507575231,5.5, 4263P 5967 +-2.10504270777183,-1.40504270777192,0.,0.,0.; 4263P 5968 +126,1,1,0,0,1,0,-0.329120546436126,-0.329120546436126, 4265P 5969 +1.67087945356387,1.67087945356387,1.,1.,193.600041714311, 4265P 5970 +-171.547507575231,5.5,213.600041714311,-171.547507575232,5.5, 4265P 5971 +-0.329120546436126,1.67087945356387,0.,0.,0.; 4265P 5972 +126,1,1,0,0,1,0,1.75504270777192,1.75504270777192, 4267P 5973 +2.45504270777183,2.45504270777183,1.,1.,213.600041714311, 4267P 5974 +-171.547507575232,5.5,213.600041714311,-164.547507575232,5.5, 4267P 5975 +1.75504270777192,2.45504270777183,0.,0.,0.; 4267P 5976 +126,1,1,0,0,1,0,3.90726785952569,3.90726785952569, 4269P 5977 +5.61006610946171,5.61006610946171,1.,1.,220.752682252201, 4269P 5978 +-163.047507575232,1.5,237.780664751561,-163.047507575232,1.5, 4269P 5979 +3.90726785952569,5.61006610946171,0.,0.,0.; 4269P 5980 +126,1,1,0,0,1,0,-0.2,-0.2,0.2,0.2,1.,1.,237.780664751561, 4271P 5981 +-163.047507575232,5.5,237.780664751561,-163.047507575232,1.5, 4271P 5982 +-0.2,0.2,0.,0.,0.; 4271P 5983 +126,1,1,0,0,1,0,6.53888737412926,6.53888737412926, 4273P 5984 +8.33719504234876,8.33719504234876,1.,1.,237.780664751561, 4273P 5985 +-163.047507575232,5.5,255.763741433756,-163.047507575232,5.5, 4273P 5986 +6.53888737412926,8.33719504234876,0.,0.,0.; 4273P 5987 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,255.763741433756, 4275P 5988 +-163.047507575232,7.5,255.763741433756,-163.047507575232,5.5,0., 4275P 5989 +0.2,0.,0.,0.; 4275P 5990 +126,1,1,0,0,1,0,-2.77906616327648,-2.77906616327648, 4277P 5991 +8.33719504234876,8.33719504234876,1.,1.,144.601129377503, 4277P 5992 +-163.047507575232,7.5,255.763741433756,-163.047507575232,7.5, 4277P 5993 +-2.77906616327648,8.33719504234876,0.,0.,0.; 4277P 5994 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,144.601129377503, 4279P 5995 +-163.047507575232,7.5,144.601129377503,-163.047507575232,5.5,0., 4279P 5996 +0.2,0.,0.,0.; 4279P 5997 +126,1,1,0,0,1,0,-2.77906616327648,-2.77906616327648, 4281P 5998 +-1.6807553499229,-1.6807553499229,1.,1.,144.601129377503, 4281P 5999 +-163.047507575232,5.5,155.584237511039,-163.047507575232,5.5, 4281P 6000 +-2.77906616327648,-1.6807553499229,0.,0.,0.; 4281P 6001 +126,1,1,0,0,1,0,0.,0.,0.4,0.4,1.,1.,155.584237511039, 4283P 6002 +-163.047507575232,1.5,155.584237511039,-163.047507575232,5.5,0., 4283P 6003 +0.4,0.,0.,0.; 4283P 6004 +126,1,1,0,0,1,0,0.19783806949458,0.19783806949458, 4285P 6005 +1.6006363194306,1.6006363194306,1.,1.,155.584237511039, 4285P 6006 +-163.047507575232,1.5,169.612220010399,-163.047507575232,1.5, 4285P 6007 +0.19783806949458,1.6006363194306,0.,0.,0.; 4285P 6008 +126,1,1,0,0,1,0,-0.2,-0.2,0.2,0.2,1.,1.,169.612220010399, 4287P 6009 +-163.047507575232,5.5,169.612220010399,-163.047507575232,1.5, 4287P 6010 +-0.2,0.2,0.,0.,0.; 4287P 6011 +126,1,1,0,0,1,0,0.,0.,0.4,0.4,1.,1.,220.752682252201, 4289P 6012 +-163.047507575232,1.5,220.752682252201,-163.047507575232,5.5,0., 4289P 6013 +0.4,0.,0.,0.; 4289P 6014 +126,1,1,0,0,1,0,-2.50504270777187,-2.50504270777187, 4291P 6015 +-1.70504270777188,-1.70504270777188,1.,1.,155.584237511039, 4291P 6016 +-156.547507575232,-11.6,155.584237511039,-164.547507575232, 4291P 6017 +-11.6,-2.50504270777187,-1.70504270777188,0.,0.,0.; 4291P 6018 +126,1,1,0,0,1,0,-5.355,-5.355,-4.045,-4.045,1.,1., 4293P 6019 +155.584237511039,-156.547507575232,1.49999999999999, 4293P 6020 +155.584237511039,-156.547507575232,-11.6,-5.355,-4.045,0.,0.,0.; 4293P 6021 +126,1,1,0,0,1,0,-0.79999999999999,-0.79999999999999, 4295P 6022 +-0.149999999999991,-0.149999999999991,1.,1.,155.584237511039, 4295P 6023 +-156.547507575232,1.49999999999999,155.584237511039, 4295P 6024 +-163.047507575232,1.49999999999999,-0.79999999999999, 4295P 6025 +-0.149999999999991,0.,0.,0.; 4295P 6026 +126,1,1,0,0,1,0,2.03004270777188,2.03004270777188, 4297P 6027 +2.18004270777188,2.18004270777188,1.,1.,155.584237511039, 4297P 6028 +-164.547507575232,5.5,155.584237511039,-163.047507575232,5.5, 4297P 6029 +2.03004270777188,2.18004270777188,0.,0.,0.; 4297P 6030 +126,1,1,0,0,1,0,4.455,4.455,5.755,5.755,1.,1.,155.584237511039, 4299P 6031 +-164.547507575232,-7.5,155.584237511039,-164.547507575232,5.5, 4299P 6032 +4.455,5.755,0.,0.,0.; 4299P 6033 +126,1,1,0,0,1,0,10.,10.,10.41,10.41,1.,1.,155.584237511039, 4301P 6034 +-164.547507575232,-11.6,155.584237511039,-164.547507575232,-7.5, 4301P 6035 +10.,10.41,0.,0.,0.; 4301P 6036 +126,1,1,0,0,1,0,-2.50504270777188,-2.50504270777188, 4303P 6037 +-1.70504270777188,-1.70504270777188,1.,1.,220.752682252201, 4303P 6038 +-156.547507575232,-11.6,220.752682252201,-164.547507575232, 4303P 6039 +-11.6,-2.50504270777188,-1.70504270777188,0.,0.,0.; 4303P 6040 +126,1,1,0,0,1,0,-5.355,-5.355,-4.045,-4.045,1.,1., 4305P 6041 +220.752682252201,-156.547507575232,1.5,220.752682252201, 4305P 6042 +-156.547507575232,-11.6,-5.355,-4.045,0.,0.,0.; 4305P 6043 +126,1,1,0,0,1,0,-0.799999999999992,-0.799999999999992, 4307P 6044 +-0.149999999999991,-0.149999999999991,1.,1.,220.752682252201, 4307P 6045 +-156.547507575232,1.5,220.752682252201,-163.047507575232,1.5, 4307P 6046 +-0.799999999999992,-0.149999999999991,0.,0.,0.; 4307P 6047 +126,1,1,0,0,1,0,10.,10.,10.41,10.41,1.,1.,220.752682252201, 4309P 6048 +-164.547507575232,-11.6,220.752682252201,-164.547507575232,-7.5, 4309P 6049 +10.,10.41,0.,0.,0.; 4309P 6050 +126,1,1,0,0,1,0,1.6807553499229,1.6807553499229, 4311P 6051 +2.54979601694251,2.54979601694251,1.,1.,155.584237511039, 4311P 6052 +-164.547507575232,5.5,146.893830840843,-164.547507575232,5.5, 4311P 6053 +1.6807553499229,2.54979601694251,0.,0.,0.; 4311P 6054 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,146.893830840843, 4313P 6055 +-164.547507575232,5.5,146.893830840843,-164.547507575232,-7.5, 4313P 6056 +0.2,1.5,0.,0.,0.; 4313P 6057 +126,1,1,0,0,1,0,-10.8869910592913,-10.8869910592913, 4315P 6058 +-10.0179503922717,-10.0179503922717,1.,1.,146.893830840843, 4315P 6059 +-164.547507575232,-7.5,155.584237511039,-164.547507575232,-7.5, 4315P 6060 +-10.8869910592913,-10.0179503922717,0.,0.,0.; 4315P 6061 +126,1,1,0,0,1,0,-1.6006363194306,-1.6006363194306, 4317P 6062 +-0.19783806949458,-0.19783806949458,1.,1.,169.612220010399, 4317P 6063 +-156.547507575232,1.5,155.584237511039,-156.547507575232,1.5, 4317P 6064 +-1.6006363194306,-0.19783806949458,0.,0.,0.; 4317P 6065 +126,1,1,0,0,1,0,-11.1162612056252,-11.1162612056252, 4319P 6066 +-10.0179503922716,-10.0179503922716,1.,1.,144.601129377503, 4319P 6067 +-156.547507575232,-11.6,155.584237511039,-156.547507575232, 4319P 6068 +-11.6,-11.1162612056252,-10.0179503922716,0.,0.,0.; 4319P 6069 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,144.601129377503, 4321P 6070 +-156.547507575232,7.5,144.601129377503,-156.547507575232,-11.6, 4321P 6071 +0.,1.91,0.,0.,0.; 4321P 6072 +126,1,1,0,0,1,0,0.,0.,11.1162612056252,11.1162612056252,1.,1., 4323P 6073 +255.763741433756,-156.547507575232,7.5,144.601129377503, 4323P 6074 +-156.547507575232,7.5,0.,11.1162612056252,0.,0.,0.; 4323P 6075 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,255.763741433756, 4325P 6076 +-156.547507575232,7.5,255.763741433756,-156.547507575232,-11.6, 4325P 6077 +0.,1.91,0.,0.,0.; 4325P 6078 +126,1,1,0,0,1,0,-1.79830766821949,-1.79830766821949,0.,0.,1.,1., 4327P 6079 +237.780664751561,-156.547507575232,-11.6,255.763741433756, 4327P 6080 +-156.547507575232,-11.6,-1.79830766821949,0.,0.,0.,0.; 4327P 6081 +126,1,1,0,0,1,0,-1.51,-1.51,-0.2,-0.2,1.,1.,237.780664751561, 4329P 6082 +-156.547507575232,-11.6,237.780664751561,-156.547507575232,1.5, 4329P 6083 +-1.51,-0.2,0.,0.,0.; 4329P 6084 +126,1,1,0,0,1,0,-5.61006610946171,-5.61006610946171, 4331P 6085 +-3.90726785952569,-3.90726785952569,1.,1.,237.780664751561, 4331P 6086 +-156.547507575232,1.5,220.752682252201,-156.547507575232,1.5, 4331P 6087 +-5.61006610946171,-3.90726785952569,0.,0.,0.; 4331P 6088 +126,1,1,0,0,1,0,-8.61515214233562,-8.61515214233562, 4333P 6089 +-3.50110591815551,-3.50110591815551,1.,1.,169.612220010399, 4333P 6090 +-156.547507575232,-11.6,220.752682252201,-156.547507575232, 4333P 6091 +-11.6,-8.61515214233562,-3.50110591815551,0.,0.,0.; 4333P 6092 +126,1,1,0,0,1,0,-1.51,-1.51,-0.2,-0.2,1.,1.,169.612220010399, 4335P 6093 +-156.547507575232,-11.6,169.612220010399,-156.547507575232,1.5, 4335P 6094 +-1.51,-0.2,0.,0.,0.; 4335P 6095 +126,1,1,0,0,1,0,-3.5313098815677,-3.5313098815677, 4337P 6096 +-2.12851163163167,-2.12851163163167,1.,1.,155.584237511039, 4337P 6097 +-164.547507575232,-11.6,169.612220010399,-164.547507575232, 4337P 6098 +-11.6,-3.5313098815677,-2.12851163163167,0.,0.,0.; 4337P 6099 +126,1,1,0,0,1,0,2.10504270777188,2.10504270777188, 4339P 6100 +2.90504270777188,2.90504270777188,1.,1.,169.612220010399, 4339P 6101 +-164.547507575232,-11.6,169.612220010399,-156.547507575232, 4339P 6102 +-11.6,2.10504270777188,2.90504270777188,0.,0.,0.; 4339P 6103 +126,1,1,0,0,1,0,0.177112355490372,0.177112355490372, 4341P 6104 +1.87991060542639,1.87991060542639,1.,1.,220.752682252201, 4341P 6105 +-164.547507575232,-11.6,237.780664751561,-164.547507575232, 4341P 6106 +-11.6,0.177112355490372,1.87991060542639,0.,0.,0.; 4341P 6107 +126,1,1,0,0,1,0,2.10504270777188,2.10504270777188, 4343P 6108 +2.90504270777187,2.90504270777187,1.,1.,237.780664751561, 4343P 6109 +-164.547507575232,-11.6,237.780664751561,-156.547507575232, 4343P 6110 +-11.6,2.10504270777188,2.90504270777187,0.,0.,0.; 4343P 6111 +126,2,2,0,0,0,0,-1.57079604986551,-1.57079604986551, 4345P 6112 +-1.57079604986551,0.,0.,0.,1.,0.707106879095859,1., 4345P 6113 +255.763741433756,-156.547507575234,-11.6,264.765898940792, 4345P 6114 +-156.547507575234,-11.6,264.765901433754,-165.54966508227,-11.6, 4345P 6115 +-1.57079604986551,0.,0.,0.,0.; 4345P 6116 +126,1,1,0,0,1,0,-8.21973908038377,-8.21973908038377,0.,0.,1.,1., 4347P 6117 +264.765901433754,-165.54966508227,-11.6,264.765898708729, 4347P 6118 +-247.747055886107,-11.6,-8.21973908038377,0.,0.,0.,0.; 4347P 6119 +126,2,2,0,0,0,0,-1.57079632679491,-1.57079632679491, 4349P 6120 +-1.57079632679491,0.,0.,0.,1.,0.707106781186549,1., 4349P 6121 +264.765898708729,-247.747055886107,-11.6,264.765898708729, 4349P 6122 +-256.749215886107,-11.6,255.763738708729,-256.749215886107, 4349P 6123 +-11.6,-1.57079632679491,0.,0.,0.,0.; 4349P 6124 +126,1,1,0,0,1,0,-11.1162574856417,-11.1162574856417,0.,0.,1.,1., 4351P 6125 +255.763738708729,-256.749215886107,-11.6,144.601163852312, 4351P 6126 +-256.749215886107,-11.6,-11.1162574856417,0.,0.,0.,0.; 4351P 6127 +126,4,2,0,0,0,0,-1.57081354545471,-1.57081354545471, 4353P 6128 +-1.57081354545471,-0.785406772727353,-0.785406772727353,0.,0., 4353P 6129 +0.,1.,0.923877885178803,1.,0.923877885178792,1., 4353P 6130 +144.601163852312,-256.749215886107,-11.6,140.872301689627, 4353P 6131 +-256.749215886107,-11.6,138.235620668632,-254.112489464608, 4353P 6132 +-11.6,135.598939647638,-251.475763043109,-11.6,135.599003853647, 4353P 6133 +-247.746900880977,-11.6,-1.57081354545471,0.,0.,0.,0.; 4353P 6134 +126,1,1,0,0,1,0,-6.02753451978495,-6.02753451978495,0.,0.,1.,1., 4355P 6135 +135.599003853647,-247.746900880977,-11.6,135.600041714311, 4355P 6136 +-187.471555692063,-11.6,-6.02753451978495,0.,0.,0.,0.; 4355P 6137 +126,1,1,0,0,1,0,-2.20608325126057,-2.20608325126057,0.,0.,1.,1., 4357P 6138 +135.600041714311,-187.471555692063,-11.6,135.600041714311, 4357P 6139 +-165.410723179457,-11.6,-2.20608325126057,0.,0.,0.,0.; 4357P 6140 +126,2,2,0,0,0,0,-1.55536115200856,-1.55536115200856, 4359P 6141 +-1.55536115200856,0.,0.,0.,1.,0.712542827450536,1., 4359P 6142 +135.600041714311,-165.410723179457,-11.6,135.73685786174, 4359P 6143 +-156.547507575232,-11.6,144.601129377503,-156.547507575232, 4359P 6144 +-11.6,-1.55536115200856,0.,0.,0.,0.; 4359P 6145 +126,6,2,0,0,0,0,-6.28310481407046,-6.28310481407046, 4361P 6146 +-6.28310481407046,-5.23515592516463,-5.23515592516463, 4361P 6147 +-4.1872070362588,-4.1872070362588,-3.13925814735297, 4361P 6148 +-3.13925814735297,-3.13925814735297,1.,0.865837508251788,1., 4361P 6149 +0.865837508251546,1.,0.865837508251611,1.,239.357084097385, 4361P 6150 +-172.121201750453,-11.6,239.356107150418,-172.988052565371, 4361P 6151 +-11.6,240.10665957669,-173.421760237851,-11.6,240.857212002962, 4361P 6152 +-173.85546791033,-11.6,241.607764429229,-173.421760237843,-11.6, 4361P 6153 +242.358316855497,-172.988052565356,-11.6,242.35733990852, 4361P 6154 +-172.121201750437,-11.6,-6.28310481407046,-3.13925814735297,0., 4361P 6155 +0.,0.; 4361P 6156 +126,6,2,0,0,0,0,-6.28310481408069,-6.28310481408069, 4363P 6157 +-6.28310481408069,-5.23515592516045,-5.23515592516045, 4363P 6158 +-4.1872070362402,-4.1872070362402,-3.13925814731996, 4363P 6159 +-3.13925814731996,-3.13925814731996,1.,0.865837508248292,1., 4363P 6160 +0.865837508248067,1.,0.865837508248116,1.,242.35733990852, 4363P 6161 +-172.121201750437,-11.6,242.358316855506,-171.254350935504, 4363P 6162 +-11.6,241.607764429225,-170.820643263012,-11.6,240.857212002944, 4363P 6163 +-170.38693559052,-11.6,240.106659576667,-170.82064326302,-11.6, 4363P 6164 +239.35610715039,-171.25435093552,-11.6,239.357084097385, 4363P 6165 +-172.121201750453,-11.6,-6.28310481408069,-3.13925814731996,0., 4363P 6166 +0.,0.; 4363P 6167 +126,6,2,0,0,0,0,-6.28310481407034,-6.28310481407034, 4365P 6168 +-6.28310481407034,-5.23515592516079,-5.23515592516079, 4365P 6169 +-4.18720703625123,-4.18720703625123,-3.13925814734168, 4365P 6170 +-3.13925814734168,-3.13925814734168,1.,0.865837508250881,1., 4365P 6171 +0.865837508250855,1.,0.865837508250857,1.,160.582628341595, 4365P 6172 +-190.598023114212,-11.6,160.581651394623,-191.464873929134, 4365P 6173 +-11.6,161.332203820897,-191.898581601616,-11.6,162.082756247172, 4365P 6174 +-192.332289274099,-11.6,162.833308673442,-191.898581601608, 4365P 6175 +-11.6,163.583861099711,-191.464873929118,-11.6,163.58288415273, 4365P 6176 +-190.598023114196,-11.6,-6.28310481407034,-3.13925814734168,0., 4365P 6177 +0.,0.; 4365P 6178 +126,6,2,0,0,0,0,-6.28310481408081,-6.28310481408081, 4367P 6179 +-6.28310481408081,-5.23515592516426,-5.23515592516426, 4367P 6180 +-4.18720703624771,-4.18720703624771,-3.13925814733116, 4367P 6181 +-3.13925814733116,-3.13925814733116,1.,0.86583750824897,1., 4367P 6182 +0.865837508248987,1.,0.865837508248909,1.,163.58288415273, 4367P 6183 +-190.598023114196,-11.6,163.583861099712,-189.731172299267, 4367P 6184 +-11.6,162.833308673433,-189.297464626778,-11.6,162.082756247154, 4367P 6185 +-188.863756954289,-11.6,161.332203820879,-189.297464626786, 4367P 6186 +-11.6,160.581651394605,-189.731172299282,-11.6,160.582628341595, 4367P 6187 +-190.598023114212,-11.6,-6.28310481408081,-3.13925814733116,0., 4367P 6188 +0.,0.; 4367P 6189 +126,6,2,0,0,0,0,-6.2830844037677,-6.2830844037677, 4369P 6190 +-6.2830844037677,-5.23494500104441,-5.23494500104441, 4369P 6191 +-4.18680559832112,-4.18680559832112,-3.13866619559783, 4369P 6192 +-3.13866619559783,-3.13866619559783,1.,0.865789844881724,1., 4369P 6193 +0.865789844882047,1.,0.865789844881724,1.,236.784016479572, 4369P 6194 +-228.698656211056,-11.6,236.782791542303,-229.565697649234, 4369P 6195 +-11.6,237.533467963721,-229.999572361928,-11.6,238.284144385139, 4369P 6196 +-230.433447074621,-11.6,239.034820806557,-229.999572361928, 4369P 6197 +-11.6,239.785497227975,-229.565697649234,-11.6,239.784272290707, 4369P 6198 +-228.698656211056,-11.6,-6.2830844037677,-3.13866619559783,0., 4369P 6199 +0.,0.; 4369P 6200 +126,6,2,0,0,0,0,-6.28308440376778,-6.28308440376778, 4371P 6201 +-6.28308440376778,-5.23494500103838,-5.23494500103838, 4371P 6202 +-4.18680559830898,-4.18680559830898,-3.13866619557958, 4371P 6203 +-3.13866619557958,-3.13866619557958,1.,0.865789844880162,1., 4371P 6204 +0.865789844880317,1.,0.865789844880162,1.,239.784272290707, 4371P 6205 +-228.698656211057,-11.6,239.785497227983,-227.831614772873, 4371P 6206 +-11.6,239.034820806561,-227.397740060174,-11.6,238.284144385139, 4371P 6207 +-226.963865347475,-11.6,237.533467963717,-227.397740060174, 4371P 6208 +-11.6,236.782791542295,-227.831614772873,-11.6,236.784016479572, 4371P 6209 +-228.698656211057,-11.6,-6.28308440376778,-3.13866619557958,0., 4371P 6210 +0.,0.; 4371P 6211 +126,6,2,0,0,0,0,-6.28310481407037,-6.28310481407037, 4373P 6212 +-6.28310481407037,-5.2351559251608,-5.2351559251608, 4373P 6213 +-4.18720703625122,-4.18720703625122,-3.13925814734165, 4373P 6214 +-3.13925814734165,-3.13925814734165,1.,0.865837508250947,1., 4373P 6215 +0.865837508251063,1.,0.865837508251028,1.,160.582628341595, 4373P 6216 +-228.698656211065,-11.6,160.581651394623,-229.565507025988, 4373P 6217 +-11.6,161.332203820897,-229.99921469847,-11.6,162.082756247172, 4373P 6218 +-230.432922370953,-11.6,162.833308673442,-229.999214698462, 4373P 6219 +-11.6,163.583861099712,-229.565507025972,-11.6,163.58288415273, 4373P 6220 +-228.69865621105,-11.6,-6.28310481407037,-3.13925814734165,0., 4373P 6221 +0.,0.; 4373P 6222 +126,6,2,0,0,0,0,-6.28310481408081,-6.28310481408081, 4375P 6223 +-6.28310481408081,-5.23515592516426,-5.23515592516426, 4375P 6224 +-4.18720703624771,-4.18720703624771,-3.13925814733116, 4375P 6225 +-3.13925814733116,-3.13925814733116,1.,0.86583750824897,1., 4375P 6226 +0.865837508248987,1.,0.865837508248909,1.,163.58288415273, 4375P 6227 +-228.69865621105,-11.6,163.583861099712,-227.83180539612,-11.6, 4375P 6228 +162.833308673433,-227.398097723632,-11.6,162.082756247154, 4375P 6229 +-226.964390051143,-11.6,161.332203820879,-227.39809772364,-11.6, 4375P 6230 +160.581651394605,-227.831805396136,-11.6,160.582628341595, 4375P 6231 +-228.698656211065,-11.6,-6.28310481408081,-3.13925814733116,0., 4375P 6232 +0.,0.; 4375P 6233 +126,6,2,0,0,0,0,-5.0748329130831D-14,-5.0748329130831D-14, 4377P 6234 +-5.0748329130831D-14,1.04800255097885,1.04800255097885, 4377P 6235 +2.09600510195774,2.09600510195774,3.14400765293664, 4377P 6236 +3.14400765293664,3.14400765293664,1.,0.865824083693706,1., 4377P 6237 +0.865824083693601,1.,0.865824083693605,1.,236.882006921691, 4377P 6238 +-190.598023114196,-11.6,236.8810299142,-191.407138874521,-11.6, 4377P 6239 +237.581582336708,-191.811979054677,-11.6,238.282134759216, 4377P 6240 +-192.216819234834,-11.6,238.982687181724,-191.811979054677, 4377P 6241 +-11.6,239.683239604231,-191.407138874521,-11.6,239.68226259674, 4377P 6242 +-190.598023114196,-11.6,-5.0748329130831D-14,3.14400765293664, 4377P 6243 +0.,0.,0.; 4377P 6244 +126,6,2,0,0,0,0,0.,0.,0.,1.04800255097885,1.04800255097885, 4379P 6245 +2.09600510195769,2.09600510195769,3.14400765293654, 4379P 6246 +3.14400765293654,3.14400765293654,1.,0.865824083693493,1., 4379P 6247 +0.865824083693437,1.,0.865824083693657,1.,239.68226259674, 4379P 6248 +-190.598023114196,-11.6,239.683239604231,-189.78890735387,-11.6, 4379P 6249 +238.982687181724,-189.384067173714,-11.6,238.282134759216, 4379P 6250 +-188.979226993558,-11.6,237.581582336708,-189.384067173714, 4379P 6251 +-11.6,236.8810299142,-189.78890735387,-11.6,236.882006921691, 4379P 6252 +-190.598023114196,-11.6,0.,3.14400765293654,0.,0.,0.; 4379P 6253 +126,6,2,0,0,0,0,2.53741645654159D-14,2.53741645654159D-14, 4381P 6254 +2.53741645654159D-14,1.04800255097509,1.04800255097509, 4381P 6255 +2.09600510195016,2.09600510195016,3.14400765292522, 4381P 6256 +3.14400765292522,3.14400765292522,1.,0.865824083694492,1., 4381P 6257 +0.865824083694691,1.,0.865824083694451,1.,158.107551165901, 4381P 6258 +-172.121201750437,-11.6,158.106574158415,-172.930317510759, 4381P 6259 +-11.6,158.80712658092,-173.335157690912,-11.6,159.507679003426, 4381P 6260 +-173.739997871065,-11.6,160.208231425931,-173.335157690912, 4381P 6261 +-11.6,160.908783848437,-172.930317510758,-11.6,160.90780684095, 4381P 6262 +-172.121201750437,-11.6,2.53741645654159D-14,3.14400765292522, 4381P 6263 +0.,0.,0.; 4381P 6264 +126,6,2,0,0,0,0,0.,0.,0.,1.04800255098266,1.04800255098266, 4383P 6265 +2.09600510196532,2.09600510196532,3.14400765294798, 4383P 6266 +3.14400765294798,3.14400765294798,1.,0.865824083692465,1., 4383P 6267 +0.865824083692489,1.,0.865824083692486,1.,160.90780684095, 4383P 6268 +-172.121201750437,-11.6,160.908783848446,-171.312085990108, 4383P 6269 +-11.6,160.208231425936,-170.907245809948,-11.6,159.507679003426, 4383P 6270 +-170.502405629789,-11.6,158.807126580916,-170.907245809948, 4383P 6271 +-11.6,158.106574158405,-171.312085990108,-11.6,158.107551165901, 4383P 6272 +-172.121201750437,-11.6,0.,3.14400765294798,0.,0.,0.; 4383P 6273 +126,1,1,0,0,1,0,0.091322211691871,0.091322211691871, 4385P 6274 +0.993665961691871,0.993665961691871,1.,1.,198.356008409196, 4385P 6275 +-187.660756010089,-7.5,189.332570909196,-187.660756010089,-7.5, 4385P 6276 +0.091322211691871,0.993665961691871,0.,0.,0.; 4385P 6277 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,198.356008409196, 4387P 6278 +-187.660756010089,-7.5,198.356008409196,-187.660756010089,-8.5, 4387P 6279 +0.,0.1,0.,0.,0.; 4387P 6280 +126,1,1,0,0,1,0,0.,0.,0.90234375,0.90234375,1.,1., 4389P 6281 +198.356008409196,-187.660756010089,-8.5,189.332570909196, 4389P 6282 +-187.660756010089,-8.5,0.,0.90234375,0.,0.,0.; 4389P 6283 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,189.332570909196, 4391P 6284 +-187.660756010089,-7.5,189.332570909196,-187.660756010089,-8.5, 4391P 6285 +0.,0.1,0.,0.,0.; 4391P 6286 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.281631211376139,0.844152403739511, 4393P 6287 +0.844152403739511,0.844152403739511,0.844152403739511,1.,1.,1., 4393P 6288 +1.,1.,206.793508409196,-187.856068510089,-7.5,205.856214479556, 4393P 6289 +-187.800454535029,-7.5,203.046799571848,-187.633758981298,-7.5, 4393P 6290 +200.231830522622,-187.649960043727,-7.5,198.356008409196, 4393P 6291 +-187.660756010089,-7.5,0.,0.844152403739511,0.,0.,0.; 4393P 6292 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,206.793508409196, 4395P 6293 +-187.856068510089,-7.5,206.793508409196,-187.856068510089,-8.5, 4395P 6294 +0.,0.1,0.,0.,0.; 4395P 6295 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.281631211376139,0.844152403739511, 4397P 6296 +0.844152403739511,0.844152403739511,0.844152403739511,1.,1.,1., 4397P 6297 +1.,1.,206.793508409196,-187.856068510089,-8.5,205.856214479556, 4397P 6298 +-187.800454535029,-8.5,203.046799571848,-187.633758981298,-8.5, 4397P 6299 +200.231830522622,-187.649960043727,-8.5,198.356008409196, 4397P 6300 +-187.660756010089,-8.5,0.,0.844152403739511,0.,0.,0.; 4397P 6301 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.235880783034421,0.497778933126644, 4399P 6302 +0.497778933126644,0.497778933126644,0.497778933126644,1.,1.,1., 4399P 6303 +1.,1.,211.148977159196,-190.102162260089,-7.5,210.559416215435, 4399P 6304 +-189.560844484626,-7.5,209.315266463925,-188.418502233228,-7.5, 4399P 6305 +207.662882757985,-188.049967147936,-7.5,206.793508409196, 4399P 6306 +-187.856068510089,-7.5,0.,0.497778933126644,0.,0.,0.; 4399P 6307 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,211.148977159196, 4401P 6308 +-190.102162260089,-7.5,211.148977159196,-190.102162260089,-8.5, 4401P 6309 +0.,0.1,0.,0.,0.; 4401P 6310 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.235880783034421,0.497778933126644, 4403P 6311 +0.497778933126644,0.497778933126644,0.497778933126644,1.,1.,1., 4403P 6312 +1.,1.,211.148977159196,-190.102162260089,-8.5,210.559416215435, 4403P 6313 +-189.560844484626,-8.5,209.315266463925,-188.418502233228,-8.5, 4403P 6314 +207.662882757985,-188.049967147936,-8.5,206.793508409196, 4403P 6315 +-187.856068510089,-8.5,0.,0.497778933126644,0.,0.,0.; 4403P 6316 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.264063113962396,0.499964111306824, 4405P 6317 +0.499964111306824,0.499964111306824,0.499964111306824,1.,1.,1., 4405P 6318 +1.,1.,212.691945909196,-194.770131010089,-7.5,212.643437973881, 4405P 6319 +-193.871965743153,-7.5,212.551595435151,-192.171423805461,-7.5, 4405P 6320 +211.598623495598,-190.765518704879,-7.5,211.148977159196, 4405P 6321 +-190.102162260089,-7.5,0.,0.499964111306824,0.,0.,0.; 4405P 6322 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,212.691945909196, 4407P 6323 +-194.770131010089,-7.5,212.691945909196,-194.770131010089,-8.5, 4407P 6324 +0.,0.1,0.,0.,0.; 4407P 6325 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.264063113962396,0.499964111306824, 4409P 6326 +0.499964111306824,0.499964111306824,0.499964111306824,1.,1.,1., 4409P 6327 +1.,1.,212.691945909196,-194.770131010089,-8.5,212.643437973881, 4409P 6328 +-193.871965743153,-8.5,212.551595435151,-192.171423805461,-8.5, 4409P 6329 +211.598623495598,-190.765518704879,-8.5,211.148977159196, 4409P 6330 +-190.102162260089,-8.5,0.,0.499964111306824,0.,0.,0.; 4409P 6331 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.212397292504592,0.450534415924653, 4411P 6332 +0.450534415924653,0.450534415924653,0.450534415924653,1.,1.,1., 4411P 6333 +1.,1.,211.520070909196,-199.067006010089,-7.5,211.861566257095, 4411P 6334 +-198.436165560765,-7.5,212.585941814299,-197.098034881101,-7.5, 4411P 6335 +212.655290538983,-195.575101594424,-7.5,212.691945909196, 4411P 6336 +-194.770131010089,-7.5,0.,0.450534415924653,0.,0.,0.; 4411P 6337 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,211.520070909196, 4413P 6338 +-199.067006010089,-7.5,211.520070909196,-199.067006010089,-8.5, 4413P 6339 +0.,0.1,0.,0.,0.; 4413P 6340 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.212397292504592,0.450534415924653, 4415P 6341 +0.450534415924653,0.450534415924653,0.450534415924653,1.,1.,1., 4415P 6342 +1.,1.,211.520070909196,-199.067006010089,-8.5,211.861566257095, 4415P 6343 +-198.436165560765,-8.5,212.585941814299,-197.098034881101,-8.5, 4415P 6344 +212.655290538983,-195.575101594424,-8.5,212.691945909196, 4415P 6345 +-194.770131010089,-8.5,0.,0.450534415924653,0.,0.,0.; 4415P 6346 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.207906922422302,0.410291107118963, 4417P 6347 +0.410291107118963,0.410291107118963,0.410291107118963,1.,1.,1., 4417P 6348 +1.,1.,208.277883409196,-201.488881010089,-7.5,208.927838177421, 4417P 6349 +-201.216133860944,-7.5,210.210482633534,-200.677884684425,-7.5, 4417P 6350 +211.087476419098,-199.599125342313,-7.5,211.520070909196, 4417P 6351 +-199.067006010089,-7.5,0.,0.410291107118963,0.,0.,0.; 4417P 6352 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,208.277883409196, 4419P 6353 +-201.488881010089,-7.5,208.277883409196,-201.488881010089,-8.5, 4419P 6354 +0.,0.1,0.,0.,0.; 4419P 6355 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.207906922422302,0.410291107118963, 4421P 6356 +0.410291107118963,0.410291107118963,0.410291107118963,1.,1.,1., 4421P 6357 +1.,1.,208.277883409196,-201.488881010089,-8.5,208.927838177421, 4421P 6358 +-201.216133860944,-8.5,210.210482633534,-200.677884684425,-8.5, 4421P 6359 +211.087476419098,-199.599125342313,-8.5,211.520070909196, 4421P 6360 +-199.067006010089,-8.5,0.,0.410291107118963,0.,0.,0.; 4421P 6361 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.676009828575057,1.04309862016124, 4423P 6362 +1.04309862016124,1.04309862016124,1.04309862016124,1.,1.,1.,1., 4423P 6363 +1.,197.887258409196,-202.192006010089,-7.5,200.147189290955, 4423P 6364 +-202.219319929824,-7.5,203.634314307158,-202.261465932413,-7.5, 4423P 6365 +207.069106365723,-201.689994183538,-7.5,208.277883409196, 4423P 6366 +-201.488881010089,-7.5,0.,1.04309862016124,0.,0.,0.; 4423P 6367 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,197.887258409196, 4425P 6368 +-202.192006010089,-7.5,197.887258409196,-202.192006010089,-8.5, 4425P 6369 +0.,0.1,0.,0.,0.; 4425P 6370 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.676009828575057,1.04309862016124, 4427P 6371 +1.04309862016124,1.04309862016124,1.04309862016124,1.,1.,1.,1., 4427P 6372 +1.,197.887258409196,-202.192006010089,-8.5,200.147189290955, 4427P 6373 +-202.219319929824,-8.5,203.634314307158,-202.261465932413,-8.5, 4427P 6374 +207.069106365723,-201.689994183538,-8.5,208.277883409196, 4427P 6375 +-201.488881010089,-8.5,0.,1.04309862016124,0.,0.,0.; 4427P 6376 +126,1,1,0,0,1,0,-0.542494086691871,-0.542494086691871, 4429P 6377 +0.312974663308129,0.312974663308129,1.,1.,189.332570909196, 4429P 6378 +-202.192006010089,-7.5,197.887258409196,-202.192006010089,-7.5, 4429P 6379 +-0.542494086691871,0.312974663308129,0.,0.,0.; 4429P 6380 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,189.332570909196, 4431P 6381 +-202.192006010089,-7.5,189.332570909196,-202.192006010089,-8.5, 4431P 6382 +0.,0.1,0.,0.,0.; 4431P 6383 +126,1,1,0,0,1,0,0.,0.,0.85546875,0.85546875,1.,1., 4433P 6384 +189.332570909196,-202.192006010089,-8.5,197.887258409196, 4433P 6385 +-202.192006010089,-8.5,0.,0.85546875,0.,0.,0.; 4433P 6386 +126,1,1,0,0,1,0,-0.949380286028976,-0.949380286028976, 4435P 6387 +0.503744713971024,0.503744713971024,1.,1.,189.332570909196, 4435P 6388 +-187.660756010089,-7.5,189.332570909196,-202.192006010089,-7.5, 4435P 6389 +-0.949380286028976,0.503744713971024,0.,0.,0.; 4435P 6390 +126,1,1,0,0,1,0,0.,0.,1.453125,1.453125,1.,1.,189.332570909196, 4437P 6391 +-187.660756010089,-8.5,189.332570909196,-202.192006010089,-8.5, 4437P 6392 +0.,1.453125,0.,0.,0.; 4437P 6393 +126,1,1,0,0,1,0,0.234213463971024,0.234213463971024, 4439P 6394 +2.62483846397102,2.62483846397102,1.,1.,189.332570909196, 4439P 6395 +-211.332631010089,-7.5,189.332570909196,-235.238881010089,-7.5, 4439P 6396 +0.234213463971024,2.62483846397102,0.,0.,0.; 4439P 6397 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,189.332570909196, 4441P 6398 +-211.332631010089,-7.5,189.332570909196,-211.332631010089,-8.5, 4441P 6399 +0.,0.1,0.,0.,0.; 4441P 6400 +126,1,1,0,0,1,0,0.,0.,2.390625,2.390625,1.,1.,189.332570909196, 4443P 6401 +-211.332631010089,-8.5,189.332570909196,-235.238881010089,-8.5, 4443P 6402 +0.,2.390625,0.,0.,0.; 4443P 6403 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,189.332570909196, 4445P 6404 +-235.238881010089,-7.5,189.332570909196,-235.238881010089,-8.5, 4445P 6405 +0.,0.1,0.,0.,0.; 4445P 6406 +126,1,1,0,0,1,0,0.425306586691871,0.425306586691871, 4447P 6407 +0.659681586691871,0.659681586691871,1.,1.,191.676320909196, 4447P 6408 +-211.332631010089,-7.5,189.332570909196,-211.332631010089,-7.5, 4447P 6409 +0.425306586691871,0.659681586691871,0.,0.,0.; 4447P 6410 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,191.676320909196, 4449P 6411 +-211.332631010089,-7.5,191.676320909196,-211.332631010089,-8.5, 4449P 6412 +0.,0.1,0.,0.,0.; 4449P 6413 +126,1,1,0,0,1,0,0.,0.,0.234375,0.234375,1.,1.,191.676320909196, 4451P 6414 +-211.332631010089,-8.5,189.332570909196,-211.332631010089,-8.5, 4451P 6415 +0.,0.234375,0.,0.,0.; 4451P 6416 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.242178147658386,0.58728108987376, 4453P 6417 +0.58728108987376,0.58728108987376,0.58728108987376,1.,1.,1.,1., 4453P 6418 +1.,197.496633409196,-211.977162260089,-7.5,196.708785715842, 4453P 6419 +-211.790577691044,-7.5,194.798258046518,-211.338110818527,-7.5, 4453P 6420 +192.831842297831,-211.334659249473,-7.5,191.676320909196, 4453P 6421 +-211.332631010089,-7.5,0.,0.58728108987376,0.,0.,0.; 4453P 6422 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,197.496633409196, 4455P 6423 +-211.977162260089,-7.5,197.496633409196,-211.977162260089,-8.5, 4455P 6424 +0.,0.1,0.,0.,0.; 4455P 6425 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.242178147658386,0.58728108987376, 4457P 6426 +0.58728108987376,0.58728108987376,0.58728108987376,1.,1.,1.,1., 4457P 6427 +1.,197.496633409196,-211.977162260089,-8.5,196.708785715842, 4457P 6428 +-211.790577691044,-8.5,194.798258046518,-211.338110818527,-8.5, 4457P 6429 +192.831842297831,-211.334659249473,-8.5,191.676320909196, 4457P 6430 +-211.332631010089,-8.5,0.,0.58728108987376,0.,0.,0.; 4457P 6431 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.223607224245692,0.424515823966796, 4459P 6432 +0.424515823966796,0.424515823966796,0.424515823966796,1.,1.,1., 4459P 6433 +1.,1.,200.973195909196,-214.359974760089,-7.5,200.436343293178, 4459P 6434 +-213.832788618144,-7.5,199.417134582878,-212.831931601172,-7.5, 4459P 6435 +198.113566785881,-212.251744615522,-7.5,197.496633409196, 4459P 6436 +-211.977162260089,-7.5,0.,0.424515823966796,0.,0.,0.; 4459P 6437 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,200.973195909196, 4461P 6438 +-214.359974760089,-7.5,200.973195909196,-214.359974760089,-8.5, 4461P 6439 +0.,0.1,0.,0.,0.; 4461P 6440 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.223607224245692,0.424515823966796, 4463P 6441 +0.424515823966796,0.424515823966796,0.424515823966796,1.,1.,1., 4463P 6442 +1.,1.,200.973195909196,-214.359974760089,-8.5,200.436343293178, 4463P 6443 +-213.832788618144,-8.5,199.417134582878,-212.831931601172,-8.5, 4463P 6444 +198.113566785881,-212.251744615522,-8.5,197.496633409196, 4463P 6445 +-211.977162260089,-8.5,0.,0.424515823966796,0.,0.,0.; 4463P 6446 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.661084667802499,1.03970923338266, 4465P 6447 +1.03970923338266,1.03970923338266,1.03970923338266,1.,1.,1.,1., 4465P 6448 +1.,207.066945909196,-222.777943510089,-7.5,205.853212488561, 4465P 6449 +-220.936425355574,-7.5,203.94433469157,-218.04021020804,-7.5, 4465P 6450 +201.766342156981,-215.342414541706,-7.5,200.973195909196, 4465P 6451 +-214.359974760089,-7.5,0.,1.03970923338266,0.,0.,0.; 4465P 6452 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,207.066945909196, 4467P 6453 +-222.777943510089,-7.5,207.066945909196,-222.777943510089,-8.5, 4467P 6454 +0.,0.1,0.,0.,0.; 4467P 6455 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.661084667802499,1.03970923338266, 4469P 6456 +1.03970923338266,1.03970923338266,1.03970923338266,1.,1.,1.,1., 4469P 6457 +1.,207.066945909196,-222.777943510089,-8.5,205.853212488561, 4469P 6458 +-220.936425355574,-8.5,203.94433469157,-218.04021020804,-8.5, 4469P 6459 +201.766342156981,-215.342414541706,-8.5,200.973195909196, 4469P 6460 +-214.359974760089,-8.5,0.,1.03970923338266,0.,0.,0.; 4469P 6461 +126,1,1,0,0,1,0,-1.61176105695361,-1.61176105695361, 4471P 6462 +-0.111247432325258,-0.111247432325258,1.,1.,215.426320909196, 4471P 6463 +-235.238881010089,-7.5,207.066945909196,-222.777943510089,-7.5, 4471P 6464 +-1.61176105695361,-0.111247432325258,0.,0.,0.; 4471P 6465 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,215.426320909196, 4473P 6466 +-235.238881010089,-7.5,215.426320909196,-235.238881010089,-8.5, 4473P 6467 +0.,0.1,0.,0.,0.; 4473P 6468 +126,1,1,0,0,1,0,0.,0.,1.50051362462835,1.50051362462835,1.,1., 4475P 6469 +215.426320909196,-235.238881010089,-8.5,207.066945909196, 4475P 6470 +-222.777943510089,-8.5,0.,1.50051362462835,0.,0.,0.; 4475P 6471 +126,1,1,0,0,1,0,-1.45359966330813,-1.45359966330813, 4477P 6472 +-0.070787163308129,-0.070787163308129,1.,1.,229.254445909196, 4477P 6473 +-235.238881010089,-7.5,215.426320909196,-235.238881010089,-7.5, 4477P 6474 +-1.45359966330813,-0.070787163308129,0.,0.,0.; 4477P 6475 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,229.254445909196, 4479P 6476 +-235.238881010089,-7.5,229.254445909196,-235.238881010089,-8.5, 4479P 6477 +0.,0.1,0.,0.,0.; 4479P 6478 +126,1,1,0,0,1,0,0.,0.,1.3828125,1.3828125,1.,1., 4481P 6479 +229.254445909196,-235.238881010089,-8.5,215.426320909196, 4481P 6480 +-235.238881010089,-8.5,0.,1.3828125,0.,0.,0.; 4481P 6481 +126,1,1,0,0,1,0,1.32396066373505,1.32396066373505, 4483P 6482 +2.64191922549176,2.64191922549176,1.,1.,222.262258409196, 4483P 6483 +-224.067006010089,-7.5,229.254445909196,-235.238881010089,-7.5, 4483P 6484 +1.32396066373505,2.64191922549176,0.,0.,0.; 4483P 6485 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,222.262258409196, 4485P 6486 +-224.067006010089,-7.5,222.262258409196,-224.067006010089,-8.5, 4485P 6487 +0.,0.1,0.,0.,0.; 4485P 6488 +126,1,1,0,0,1,0,0.,0.,1.31795856175671,1.31795856175671,1.,1., 4487P 6489 +222.262258409196,-224.067006010089,-8.5,229.254445909196, 4487P 6490 +-235.238881010089,-8.5,0.,1.31795856175671,0.,0.,0.; 4487P 6491 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.462736337436351,1.14014998210771, 4489P 6492 +1.14014998210771,1.14014998210771,1.14014998210771,1.,1.,1.,1., 4489P 6493 +1.,215.680227159196,-214.770131010089,-7.5,216.657814949634, 4489P 6494 +-215.965086764049,-7.5,219.066522914849,-218.90937419357,-7.5, 4489P 6495 +221.071194285368,-222.144734836071,-7.5,222.262258409196, 4489P 6496 +-224.067006010089,-7.5,0.,1.14014998210771,0.,0.,0.; 4489P 6497 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,215.680227159196, 4491P 6498 +-214.770131010089,-7.5,215.680227159196,-214.770131010089,-8.5, 4491P 6499 +0.,0.1,0.,0.,0.; 4491P 6500 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.462736337436351,1.14014998210771, 4493P 6501 +1.14014998210771,1.14014998210771,1.14014998210771,1.,1.,1.,1., 4493P 6502 +1.,215.680227159196,-214.770131010089,-8.5,216.657814949634, 4493P 6503 +-215.965086764049,-8.5,219.066522914849,-218.90937419357,-8.5, 4493P 6504 +221.071194285368,-222.144734836071,-8.5,222.262258409196, 4493P 6505 +-224.067006010089,-8.5,0.,1.14014998210771,0.,0.,0.; 4493P 6506 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.412099250560617,0.785781181487306, 4495P 6507 +0.785781181487306,0.785781181487306,0.785781181487306,1.,1.,1., 4495P 6508 +1.,1.,209.488820909196,-209.965443510089,-7.5,210.662083255283, 4495P 6509 +-210.689085359138,-7.5,212.899232367418,-212.068908657398,-7.5, 4495P 6510 +214.783943791004,-213.899557402522,-7.5,215.680227159196, 4495P 6511 +-214.770131010089,-7.5,0.,0.785781181487306,0.,0.,0.; 4495P 6512 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,209.488820909196, 4497P 6513 +-209.965443510089,-7.5,209.488820909196,-209.965443510089,-8.5, 4497P 6514 +0.,0.1,0.,0.,0.; 4497P 6515 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.412099250560617,0.785781181487306, 4499P 6516 +0.785781181487306,0.785781181487306,0.785781181487306,1.,1.,1., 4499P 6517 +1.,1.,209.488820909196,-209.965443510089,-8.5,210.662083255283, 4499P 6518 +-210.689085359138,-8.5,212.899232367418,-212.068908657398,-8.5, 4499P 6519 +214.783943791004,-213.899557402522,-8.5,215.680227159196, 4499P 6520 +-214.770131010089,-8.5,0.,0.785781181487306,0.,0.,0.; 4499P 6521 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.58357780873946,1.26971165673407, 4501P 6522 +1.26971165673407,1.26971165673407,1.26971165673407,1.,1.,1.,1., 4501P 6523 +1.,220.816945909196,-204.672474760089,-7.5,219.30946855557, 4501P 6524 +-205.953780785553,-7.5,216.029594750405,-208.741565331179,-7.5, 4501P 6525 +211.783402108826,-209.536092499316,-7.5,209.488820909196, 4501P 6526 +-209.965443510089,-7.5,0.,1.26971165673407,0.,0.,0.; 4501P 6527 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,220.816945909196, 4503P 6528 +-204.672474760089,-7.5,220.816945909196,-204.672474760089,-8.5, 4503P 6529 +0.,0.1,0.,0.,0.; 4503P 6530 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.58357780873946,1.26971165673407, 4505P 6531 +1.26971165673407,1.26971165673407,1.26971165673407,1.,1.,1.,1., 4505P 6532 +1.,220.816945909196,-204.672474760089,-8.5,219.30946855557, 4505P 6533 +-205.953780785553,-8.5,216.029594750405,-208.741565331179,-8.5, 4505P 6534 +211.783402108826,-209.536092499316,-8.5,209.488820909196, 4505P 6535 +-209.965443510089,-8.5,0.,1.26971165673407,0.,0.,0.; 4505P 6536 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.595955416925639,1.15039635746486, 4507P 6537 +1.15039635746486,1.15039635746486,1.15039635746486,1.,1.,1.,1., 4507P 6538 +1.,224.606008409196,-194.027943510089,-7.5,224.472199977234, 4507P 6539 +-196.055393519306,-7.5,224.213904258538,-199.969060614703,-7.5, 4507P 6540 +221.921692259118,-203.14284764226,-7.5,220.816945909196, 4507P 6541 +-204.672474760089,-7.5,0.,1.15039635746486,0.,0.,0.; 4507P 6542 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,224.606008409196, 4509P 6543 +-194.027943510089,-7.5,224.606008409196,-194.027943510089,-8.5, 4509P 6544 +0.,0.1,0.,0.,0.; 4509P 6545 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.595955416925639,1.15039635746486, 4511P 6546 +1.15039635746486,1.15039635746486,1.15039635746486,1.,1.,1.,1., 4511P 6547 +1.,224.606008409196,-194.027943510089,-8.5,224.472199977234, 4511P 6548 +-196.055393519306,-8.5,224.213904258538,-199.969060614703,-8.5, 4511P 6549 +221.921692259118,-203.14284764226,-8.5,220.816945909196, 4511P 6550 +-204.672474760089,-8.5,0.,1.15039635746486,0.,0.,0.; 4511P 6551 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.462557773590166,0.946106124712921, 4513P 6552 +0.946106124712921,0.946106124712921,0.946106124712921,1.,1.,1., 4513P 6553 +1.,1.,222.106008409196,-185.004506010089,-7.5,222.835074753493, 4513P 6554 +-186.384818489344,-7.5,224.326292009032,-189.208081150147,-7.5, 4513P 6555 +224.51140065161,-192.397733878194,-7.5,224.606008409196, 4513P 6556 +-194.027943510089,-7.5,0.,0.946106124712921,0.,0.,0.; 4513P 6557 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,222.106008409196, 4515P 6558 +-185.004506010089,-7.5,222.106008409196,-185.004506010089,-8.5, 4515P 6559 +0.,0.1,0.,0.,0.; 4515P 6560 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.462557773590166,0.946106124712921, 4517P 6561 +0.946106124712921,0.946106124712921,0.946106124712921,1.,1.,1., 4517P 6562 +1.,1.,222.106008409196,-185.004506010089,-8.5,222.835074753493, 4517P 6563 +-186.384818489344,-8.5,224.326292009032,-189.208081150147,-8.5, 4517P 6564 +224.51140065161,-192.397733878194,-8.5,224.606008409196, 4517P 6565 +-194.027943510089,-8.5,0.,0.946106124712921,0.,0.,0.; 4517P 6566 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.431517432398868,0.875191282358429, 4519P 6567 +0.875191282358429,0.875191282358429,0.875191282358429,1.,1.,1., 4519P 6568 +1.,1.,215.445852159196,-179.516224760089,-7.5,216.769000336918, 4519P 6569 +-180.1395665842,-7.5,219.45257152887,-181.403810597143,-7.5, 4519P 6570 +221.213376913017,-183.793211270963,-7.5,222.106008409196, 4519P 6571 +-185.004506010089,-7.5,0.,0.875191282358429,0.,0.,0.; 4519P 6572 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,215.445852159196, 4521P 6573 +-179.516224760089,-7.5,215.445852159196,-179.516224760089,-8.5, 4521P 6574 +0.,0.1,0.,0.,0.; 4521P 6575 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.431517432398868,0.875191282358429, 4523P 6576 +0.875191282358429,0.875191282358429,0.875191282358429,1.,1.,1., 4523P 6577 +1.,1.,215.445852159196,-179.516224760089,-8.5,216.769000336918, 4523P 6578 +-180.1395665842,-8.5,219.45257152887,-181.403810597143,-8.5, 4523P 6579 +221.213376913017,-183.793211270963,-8.5,222.106008409196, 4523P 6580 +-185.004506010089,-8.5,0.,0.875191282358429,0.,0.,0.; 4523P 6581 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.793418719026967,1.34714989356346, 4525P 6582 +1.34714989356346,1.34714989356346,1.34714989356346,1.,1.,1.,1., 4525P 6583 +1.,202.106008409196,-177.973256010089,-7.5,204.763886597037, 4525P 6584 +-177.976937713112,-7.5,209.276712211041,-177.983188896397,-7.5, 4525P 6585 +213.648767024992,-179.069647768159,-7.5,215.445852159196, 4525P 6586 +-179.516224760089,-7.5,0.,1.34714989356346,0.,0.,0.; 4525P 6587 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,202.106008409196, 4527P 6588 +-177.973256010089,-7.5,202.106008409196,-177.973256010089,-8.5, 4527P 6589 +0.,0.1,0.,0.,0.; 4527P 6590 +126,4,3,0,0,1,0,0.,0.,0.,0.,0.793418719026967,1.34714989356346, 4529P 6591 +1.34714989356346,1.34714989356346,1.34714989356346,1.,1.,1.,1., 4529P 6592 +1.,202.106008409196,-177.973256010089,-8.5,204.763886597037, 4529P 6593 +-177.976937713112,-8.5,209.276712211041,-177.983188896397,-8.5, 4529P 6594 +213.648767024992,-179.069647768159,-8.5,215.445852159196, 4529P 6595 +-179.516224760089,-8.5,0.,1.34714989356346,0.,0.,0.; 4529P 6596 +126,1,1,0,0,1,0,-1.12061908669187,-1.12061908669187, 4531P 6597 +1.31297466330813,1.31297466330813,1.,1.,177.770070909196, 4531P 6598 +-177.973256010089,-7.5,202.106008409196,-177.973256010089,-7.5, 4531P 6599 +-1.12061908669187,1.31297466330813,0.,0.,0.; 4531P 6600 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,177.770070909196, 4533P 6601 +-177.973256010089,-7.5,177.770070909196,-177.973256010089,-8.5, 4533P 6602 +0.,0.1,0.,0.,0.; 4533P 6603 +126,1,1,0,0,1,0,0.,0.,2.43359375,2.43359375,1.,1., 4535P 6604 +177.770070909196,-177.973256010089,-8.5,202.106008409196, 4535P 6605 +-177.973256010089,-8.5,0.,2.43359375,0.,0.,0.; 4535P 6606 +126,1,1,0,0,1,0,-1.42952596397102,-1.42952596397102, 4537P 6607 +4.29703653602898,4.29703653602898,1.,1.,177.770070909196, 4537P 6608 +-235.238881010089,-7.5,177.770070909196,-177.973256010089,-7.5, 4537P 6609 +-1.42952596397102,4.29703653602898,0.,0.,0.; 4537P 6610 +126,1,1,0,0,1,0,0.,0.,0.1,0.1,1.,1.,177.770070909196, 4539P 6611 +-235.238881010089,-7.5,177.770070909196,-235.238881010089,-8.5, 4539P 6612 +0.,0.1,0.,0.,0.; 4539P 6613 +126,1,1,0,0,1,0,0.,0.,5.7265625,5.7265625,1.,1., 4541P 6614 +177.770070909196,-235.238881010089,-8.5,177.770070909196, 4541P 6615 +-177.973256010089,-8.5,0.,5.7265625,0.,0.,0.; 4541P 6616 +126,1,1,0,0,1,0,0.542494086691871,0.542494086691871, 4543P 6617 +1.69874408669187,1.69874408669187,1.,1.,189.332570909196, 4543P 6618 +-235.238881010089,-7.5,177.770070909196,-235.238881010089,-7.5, 4543P 6619 +0.542494086691871,1.69874408669187,0.,0.,0.; 4543P 6620 +126,1,1,0,0,1,0,0.,0.,1.15625,1.15625,1.,1.,189.332570909196, 4545P 6621 +-235.238881010089,-8.5,177.770070909196,-235.238881010089,-8.5, 4545P 6622 +0.,1.15625,0.,0.,0.; 4545P 6623 +126,1,1,0,0,1,0,-7.99046868143113,-7.99046868143113, 4547P 6624 +-0.229270143011589,-0.229270143011589,1.,1.,256.765901357746, 4547P 6625 +-167.842369071796,-7.5,256.765898784737,-245.454354455992,-7.5, 4547P 6626 +-7.99046868143113,-0.229270143011589,0.,0.,0.; 4547P 6627 +126,2,2,0,0,0,0,-3.14159259057679,-3.14159259057679, 4549P 6628 +-3.14159259057679,-1.98287834194696,-1.98287834194696, 4549P 6629 +-1.98287834194696,0.999999677363267,0.836814636061334,1., 4549P 6630 +258.265901433755,-165.549667575233,-7.5,258.265901433755, 4549P 6631 +-167.18670588825,-7.5,256.765901357746,-167.842369071796,-7.5, 4549P 6632 +-3.14159259057679,-1.98287834194696,0.,0.,0.; 4549P 6633 +126,4,2,0,0,0,0,0.412082048305129,0.412082048305129, 4551P 6634 +0.412082048305129,1.77683680972467,1.77683680972467, 4551P 6635 +3.14159157114422,3.14159157114422,3.14159157114422,1., 4551P 6636 +0.776075642357549,1.,0.776075642357572,1.,253.471039970417, 4551P 6637 +-164.547507575232,-7.5,254.285396173926,-162.684456106938,-7.5, 4551P 6638 +256.275647703394,-163.100431646069,-7.5,258.265899232863, 4551P 6639 +-163.516407185201,-7.5,258.265901433754,-165.54966486678,-7.5, 4551P 6640 +0.412082048305129,3.14159157114422,0.,0.,0.; 4551P 6641 +126,1,1,0,0,1,0,-1.7983076682195,-1.7983076682195, 4553P 6642 +-0.229270146333917,-0.229270146333917,1.,1.,237.780664751561, 4553P 6643 +-164.547507575232,-7.5,253.471039970417,-164.547507575232,-7.5, 4553P 6644 +-1.7983076682195,-0.229270146333917,0.,0.,0.; 4553P 6645 +126,1,1,0,0,1,0,-1.87991060542639,-1.87991060542639, 4555P 6646 +-0.177112355490372,-0.177112355490372,1.,1.,237.780664751561, 4555P 6647 +-164.547507575232,-7.5,220.752682252201,-164.547507575232,-7.5, 4555P 6648 +-1.87991060542639,-0.177112355490372,0.,0.,0.; 4555P 6649 +126,1,1,0,0,1,0,-2.45504270777187,-2.45504270777187, 4557P 6650 +-1.75504270777187,-1.75504270777187,1.,1.,213.600041714311, 4557P 6651 +-164.547507575232,-7.5,213.600041714311,-171.547507575232,-7.5, 4557P 6652 +-2.45504270777187,-1.75504270777187,0.,0.,0.; 4557P 6653 +126,1,1,0,0,1,0,-1.67087945356388,-1.67087945356388, 4559P 6654 +0.329120546436124,0.329120546436124,1.,1.,213.600041714311, 4559P 6655 +-171.547507575232,-7.5,193.600041714311,-171.547507575231,-7.5, 4559P 6656 +-1.67087945356388,0.329120546436124,0.,0.,0.; 4559P 6657 +126,1,1,0,0,1,0,1.40504270777187,1.40504270777187, 4561P 6658 +2.10504270777187,2.10504270777187,1.,1.,193.600041714311, 4561P 6659 +-171.547507575231,-7.5,193.600041714311,-164.547507575232,-7.5, 4561P 6660 +1.40504270777187,2.10504270777187,0.,0.,0.; 4561P 6661 +126,1,1,0,0,1,0,-8.61515214233563,-8.61515214233563, 4563P 6662 +-6.21636997194452,-6.21636997194452,1.,1.,169.612220010399, 4563P 6663 +-164.547507575232,-7.5,193.600041714311,-164.547507575232,-7.5, 4563P 6664 +-8.61515214233563,-6.21636997194452,0.,0.,0.; 4563P 6665 +126,1,1,0,0,1,0,2.12851163163167,2.12851163163167, 4565P 6666 +3.5313098815677,3.5313098815677,1.,1.,169.612220010399, 4565P 6667 +-164.547507575232,-7.5,155.584237511039,-164.547507575232,-7.5, 4565P 6668 +2.12851163163167,3.5313098815677,0.,0.,0.; 4565P 6669 +126,4,2,0,0,0,0,-6.25390749790614,-6.25390749790614, 4567P 6670 +-6.25390749790614,-4.9037910999005,-4.9037910999005, 4567P 6671 +-3.55367470189486,-3.55367470189486,-3.55367470189486,1., 4567P 6672 +0.78067058140956,1.,0.780670581409572,1.,142.100041714311, 4567P 6673 +-165.476420277504,-7.5,142.158677672821,-163.474248497833,-7.5, 4567P 6674 +144.125129478152,-163.093200852189,-7.5,146.091581283483, 4567P 6675 +-162.712153206546,-7.5,146.893830840843,-164.547507575232,-7.5, 4567P 6676 +-6.25390749790614,-3.55367470189486,0.,0.,0.; 4567P 6677 +126,1,1,0,0,1,0,2.18487010842909,2.18487010842909, 4569P 6678 +2.19951956797476,2.19951956797476,1.,1.,142.100041714311, 4569P 6679 +-165.622914872961,-7.5,142.100041714311,-165.476420277504,-7.5, 4569P 6680 +2.18487010842909,2.19951956797476,0.,0.,0.; 4569P 6681 +126,2,2,0,0,0,0,-1.15918194829754,-1.15918194829754, 4571P 6682 +-1.15918194829754,-0.0292778092733589,-0.0292778092733589, 4571P 6683 +-0.0292778092733589,1.,0.844614262194479,1.,143.600041714311, 4571P 6684 +-167.842837467805,-7.5,142.146470952165,-167.208278396419,-7.5, 4571P 6685 +142.100041714311,-165.622914872961,-7.5,-1.15918194829754, 4571P 6686 +-0.0292778092733589,0.,0.,0.; 4571P 6687 +126,1,1,0,0,1,0,-2.19683051976291,-2.19683051976291, 4573P 6688 +-0.233951809861228,-0.233951809861228,1.,1.,143.600041714311, 4573P 6689 +-187.471624566822,-7.5,143.600041714311,-167.842837467805,-7.5, 4573P 6690 +-2.19683051976291,-0.233951809861228,0.,0.,0.; 4573P 6691 +126,1,1,0,0,1,0,-5.79827126090288,-5.79827126090288,0.,0.,1.,1., 4575P 6692 +143.599043329707,-245.454337167255,-7.5,143.600041714311, 4575P 6693 +-187.471624566822,-7.5,-5.79827126090288,0.,0.,0.,0.; 4575P 6694 +126,6,2,0,0,0,0,-9.01269591246431,-9.01269591246431, 4577P 6695 +-9.01269591246431,-7.71661521165286,-7.71661521165286, 4577P 6696 +-6.42053451084141,-6.42053451084141,-5.12445381002996, 4577P 6697 +-5.12445381002996,-5.12445381002996,1.,0.797268222513902,1., 4577P 6698 +0.797268222513893,1.,0.797268222513928,1.,146.893865315652, 4577P 6699 +-248.749215886107,-7.5,146.13511310057,-250.485058779287,-7.5, 4577P 6700 +144.2585310156,-250.22564568775,-7.5,142.381948930629, 4577P 6701 +-249.966232596213,-7.5,142.122568151359,-248.089646044774,-7.5, 4577P 6702 +141.863187372088,-246.213059493336,-7.5,143.599043329707, 4577P 6703 +-245.454337167255,-7.5,-9.01269591246431,-5.12445381002996,0., 4577P 6704 +0.,0.; 4577P 6705 +126,1,1,0,0,1,0,-10.8869873393078,-10.8869873393078, 4579P 6706 +-0.22927014633397,-0.22927014633397,1.,1.,253.47103724539, 4579P 6707 +-248.749215886107,-7.5,146.893865315652,-248.749215886107,-7.5, 4579P 6708 +-10.8869873393078,-0.22927014633397,0.,0.,0.; 4579P 6709 +126,6,2,0,0,0,0,-4.30030689892742,-4.30030689892742, 4581P 6710 +-4.30030689892742,-3.00423194871996,-3.00423194871996, 4581P 6711 +-1.7081569985125,-1.7081569985125,-0.412082048305046, 4581P 6712 +-0.412082048305046,-0.412082048305046,1.,0.79726995811531,1., 4581P 6713 +0.797269958115373,1.,0.797269958115304,1.,256.765898784737, 4581P 6714 +-245.454354455992,-7.5,258.501731281752,-246.213102195359,-7.5, 4581P 6715 +258.242330469318,-248.089674551596,-7.5,257.982929656885, 4581P 6716 +-249.966246907834,-7.5,256.106357292048,-250.225647658055,-7.5, 4581P 6717 +254.22978492721,-250.485048408276,-7.5,253.47103724539, 4581P 6718 +-248.749215886107,-7.5,-4.30030689892742,-0.412082048305046,0., 4581P 6719 +0.,0.; 4581P 6720 +126,6,2,0,0,0,0,3.13925814735297,3.13925814735297, 4583P 6721 +3.13925814735297,4.1872070362588,4.1872070362588, 4583P 6722 +5.23515592516463,5.23515592516463,6.28310481407046, 4583P 6723 +6.28310481407046,6.28310481407046,1.,0.865837508251611,1., 4583P 6724 +0.865837508251546,1.,0.865837508251788,1.,242.35733990852, 4583P 6725 +-172.121201750437,-7.5,242.358316855497,-172.988052565356,-7.5, 4583P 6726 +241.607764429229,-173.421760237843,-7.5,240.857212002962, 4583P 6727 +-173.85546791033,-7.5,240.10665957669,-173.421760237851,-7.5, 4583P 6728 +239.356107150418,-172.988052565371,-7.5,239.357084097385, 4583P 6729 +-172.121201750453,-7.5,3.13925814735297,6.28310481407046,0.,0., 4583P 6730 +0.; 4583P 6731 +126,6,2,0,0,0,0,3.13925814731996,3.13925814731996, 4585P 6732 +3.13925814731996,4.1872070362402,4.1872070362402, 4585P 6733 +5.23515592516045,5.23515592516045,6.28310481408069, 4585P 6734 +6.28310481408069,6.28310481408069,1.,0.865837508248116,1., 4585P 6735 +0.865837508248067,1.,0.865837508248292,1.,239.357084097385, 4585P 6736 +-172.121201750453,-7.5,239.35610715039,-171.25435093552,-7.5, 4585P 6737 +240.106659576667,-170.82064326302,-7.5,240.857212002944, 4585P 6738 +-170.38693559052,-7.5,241.607764429225,-170.820643263012,-7.5, 4585P 6739 +242.358316855506,-171.254350935504,-7.5,242.35733990852, 4585P 6740 +-172.121201750437,-7.5,3.13925814731996,6.28310481408069,0.,0., 4585P 6741 +0.; 4585P 6742 +126,6,2,0,0,0,0,3.13925814734168,3.13925814734168, 4587P 6743 +3.13925814734168,4.18720703625123,4.18720703625123, 4587P 6744 +5.23515592516079,5.23515592516079,6.28310481407034, 4587P 6745 +6.28310481407034,6.28310481407034,1.,0.865837508250857,1., 4587P 6746 +0.865837508250855,1.,0.865837508250881,1.,163.58288415273, 4587P 6747 +-190.598023114196,-7.5,163.583861099711,-191.464873929118,-7.5, 4587P 6748 +162.833308673442,-191.898581601608,-7.5,162.082756247172, 4587P 6749 +-192.332289274099,-7.5,161.332203820897,-191.898581601616,-7.5, 4587P 6750 +160.581651394623,-191.464873929134,-7.5,160.582628341595, 4587P 6751 +-190.598023114212,-7.5,3.13925814734168,6.28310481407034,0.,0., 4587P 6752 +0.; 4587P 6753 +126,6,2,0,0,0,0,3.13925814733116,3.13925814733116, 4589P 6754 +3.13925814733116,4.18720703624771,4.18720703624771, 4589P 6755 +5.23515592516426,5.23515592516426,6.28310481408081, 4589P 6756 +6.28310481408081,6.28310481408081,1.,0.865837508248909,1., 4589P 6757 +0.865837508248987,1.,0.86583750824897,1.,160.582628341595, 4589P 6758 +-190.598023114212,-7.5,160.581651394605,-189.731172299282,-7.5, 4589P 6759 +161.332203820879,-189.297464626786,-7.5,162.082756247154, 4589P 6760 +-188.863756954289,-7.5,162.833308673433,-189.297464626778,-7.5, 4589P 6761 +163.583861099712,-189.731172299267,-7.5,163.58288415273, 4589P 6762 +-190.598023114196,-7.5,3.13925814733116,6.28310481408081,0.,0., 4589P 6763 +0.; 4589P 6764 +126,6,2,0,0,0,0,3.13866619559787,3.13866619559787, 4591P 6765 +3.13866619559787,4.18680559832114,4.18680559832114, 4591P 6766 +5.2349450010444,5.2349450010444,6.28308440376766, 4591P 6767 +6.28308440376766,6.28308440376766,1.,0.865789844881696,1., 4591P 6768 +0.865789844881894,1.,0.865789844881696,1.,239.784272290707, 4591P 6769 +-228.698656211057,-7.5,239.785497227975,-229.565697649234,-7.5, 4591P 6770 +239.034820806557,-229.999572361928,-7.5,238.284144385139, 4591P 6771 +-230.433447074621,-7.5,237.533467963721,-229.999572361928,-7.5, 4591P 6772 +236.782791542303,-229.565697649234,-7.5,236.784016479572, 4591P 6773 +-228.698656211057,-7.5,3.13866619559787,6.28308440376766,0.,0., 4591P 6774 +0.; 4591P 6775 +126,6,2,0,0,0,0,3.13866619557958,3.13866619557958, 4593P 6776 +3.13866619557958,4.18680559830898,4.18680559830898, 4593P 6777 +5.23494500103838,5.23494500103838,6.28308440376778, 4593P 6778 +6.28308440376778,6.28308440376778,1.,0.865789844880162,1., 4593P 6779 +0.865789844880317,1.,0.865789844880162,1.,236.784016479572, 4593P 6780 +-228.698656211057,-7.5,236.782791542295,-227.831614772873,-7.5, 4593P 6781 +237.533467963717,-227.397740060174,-7.5,238.284144385139, 4593P 6782 +-226.963865347475,-7.5,239.034820806561,-227.397740060174,-7.5, 4593P 6783 +239.785497227983,-227.831614772873,-7.5,239.784272290707, 4593P 6784 +-228.698656211057,-7.5,3.13866619557958,6.28308440376778,0.,0., 4593P 6785 +0.; 4593P 6786 +126,6,2,0,0,0,0,3.13925814734168,3.13925814734168, 4595P 6787 +3.13925814734168,4.18720703625123,4.18720703625123, 4595P 6788 +5.23515592516079,5.23515592516079,6.28310481407034, 4595P 6789 +6.28310481407034,6.28310481407034,1.,0.865837508250857,1., 4595P 6790 +0.865837508250855,1.,0.865837508250881,1.,163.58288415273, 4595P 6791 +-228.69865621105,-7.5,163.583861099711,-229.565507025972,-7.5, 4595P 6792 +162.833308673442,-229.999214698462,-7.5,162.082756247172, 4595P 6793 +-230.432922370953,-7.5,161.332203820897,-229.99921469847,-7.5, 4595P 6794 +160.581651394623,-229.565507025988,-7.5,160.582628341595, 4595P 6795 +-228.698656211065,-7.5,3.13925814734168,6.28310481407034,0.,0., 4595P 6796 +0.; 4595P 6797 +126,6,2,0,0,0,0,3.13925814733116,3.13925814733116, 4597P 6798 +3.13925814733116,4.18720703624771,4.18720703624771, 4597P 6799 +5.23515592516426,5.23515592516426,6.28310481408081, 4597P 6800 +6.28310481408081,6.28310481408081,1.,0.865837508248909,1., 4597P 6801 +0.865837508248987,1.,0.86583750824897,1.,160.582628341595, 4597P 6802 +-228.698656211065,-7.5,160.581651394605,-227.831805396136,-7.5, 4597P 6803 +161.332203820879,-227.39809772364,-7.5,162.082756247154, 4597P 6804 +-226.964390051143,-7.5,162.833308673433,-227.398097723632,-7.5, 4597P 6805 +163.583861099712,-227.83180539612,-7.5,163.58288415273, 4597P 6806 +-228.69865621105,-7.5,3.13925814733116,6.28310481408081,0.,0., 4597P 6807 +0.; 4597P 6808 +126,6,2,0,0,0,0,3.13917765424295,3.13917765424295, 4599P 6809 +3.13917765424295,4.18718020522184,4.18718020522184, 4599P 6810 +5.23518275620074,5.23518275620074,6.28318530717964, 4599P 6811 +6.28318530717964,6.28318530717964,1.,0.865824083693605,1., 4599P 6812 +0.865824083693601,1.,0.865824083693706,1.,239.68226259674, 4599P 6813 +-190.598023114196,-7.50000000000001,239.683239604231, 4599P 6814 +-191.407138874521,-7.50000000000001,238.982687181724, 4599P 6815 +-191.811979054677,-7.50000000000001,238.282134759216, 4599P 6816 +-192.216819234834,-7.50000000000001,237.581582336708, 4599P 6817 +-191.811979054677,-7.50000000000001,236.8810299142, 4599P 6818 +-191.407138874521,-7.50000000000001,236.882006921691, 4599P 6819 +-190.598023114196,-7.50000000000001,3.13917765424295, 4599P 6820 +6.28318530717964,0.,0.,0.; 4599P 6821 +126,6,2,0,0,0,0,3.13917765424305,3.13917765424305, 4601P 6822 +3.13917765424305,4.1871802052219,4.1871802052219, 4601P 6823 +5.23518275620074,5.23518275620074,6.28318530717959, 4601P 6824 +6.28318530717959,6.28318530717959,1.,0.865824083693657,1., 4601P 6825 +0.865824083693437,1.,0.865824083693493,1.,236.882006921691, 4601P 6826 +-190.598023114196,-7.50000000000001,236.8810299142, 4601P 6827 +-189.78890735387,-7.50000000000001,237.581582336708, 4601P 6828 +-189.384067173714,-7.50000000000001,238.282134759216, 4601P 6829 +-188.979226993558,-7.50000000000001,238.982687181724, 4601P 6830 +-189.384067173714,-7.50000000000001,239.683239604231, 4601P 6831 +-189.78890735387,-7.50000000000001,239.68226259674, 4601P 6832 +-190.598023114196,-7.50000000000001,3.13917765424305, 4601P 6833 +6.28318530717959,0.,0.,0.; 4601P 6834 +126,6,2,0,0,0,0,3.13917765425437,3.13917765425437, 4603P 6835 +3.13917765425437,4.18718020522943,4.18718020522943, 4603P 6836 +5.2351827562045,5.2351827562045,6.28318530717956, 4603P 6837 +6.28318530717956,6.28318530717956,1.,0.865824083694451,1., 4603P 6838 +0.865824083694691,1.,0.865824083694492,1.,160.90780684095, 4603P 6839 +-172.121201750437,-7.5,160.908783848437,-172.930317510758,-7.5, 4603P 6840 +160.208231425931,-173.335157690912,-7.5,159.507679003426, 4603P 6841 +-173.739997871065,-7.5,158.80712658092,-173.335157690912,-7.5, 4603P 6842 +158.106574158415,-172.930317510759,-7.5,158.107551165901, 4603P 6843 +-172.121201750437,-7.5,3.13917765425437,6.28318530717956,0.,0., 4603P 6844 +0.; 4603P 6845 +126,6,2,0,0,0,0,3.13917765423161,3.13917765423161, 4605P 6846 +3.13917765423161,4.18718020521427,4.18718020521427, 4605P 6847 +5.23518275619693,5.23518275619693,6.28318530717959, 4605P 6848 +6.28318530717959,6.28318530717959,1.,0.865824083692486,1., 4605P 6849 +0.865824083692489,1.,0.865824083692465,1.,158.107551165901, 4605P 6850 +-172.121201750437,-7.5,158.106574158405,-171.312085990108,-7.5, 4605P 6851 +158.807126580916,-170.907245809948,-7.5,159.507679003426, 4605P 6852 +-170.502405629789,-7.5,160.208231425936,-170.907245809948,-7.5, 4605P 6853 +160.908783848446,-171.312085990108,-7.5,160.90780684095, 4605P 6854 +-172.121201750437,-7.5,3.13917765423161,6.28318530717959,0.,0., 4605P 6855 +0.; 4605P 6856 +126,1,1,0,0,1,0,1.623625,1.623625,2.033625,2.033625,1.,1., 4607P 6857 +158.107551165901,-172.121201750437,-7.5,158.107551165901, 4607P 6858 +-172.121201750437,-11.6,1.623625,2.033625,0.,0.,0.; 4607P 6859 +126,1,1,0,0,1,0,1.623625,1.623625,2.033625,2.033625,1.,1., 4609P 6860 +160.90780684095,-172.121201750437,-7.5,160.90780684095, 4609P 6861 +-172.121201750437,-11.6,1.623625,2.033625,0.,0.,0.; 4609P 6862 +126,1,1,0,0,1,0,1.623625,1.623625,2.033625,2.033625,1.,1., 4611P 6863 +236.882006921691,-190.598023114196,-7.5,236.882006921691, 4611P 6864 +-190.598023114196,-11.6,1.623625,2.033625,0.,0.,0.; 4611P 6865 +126,1,1,0,0,1,0,1.623625,1.623625,2.033625,2.033625,1.,1., 4613P 6866 +239.68226259674,-190.598023114196,-7.5,239.68226259674, 4613P 6867 +-190.598023114196,-11.6,1.623625,2.033625,0.,0.,0.; 4613P 6868 +126,2,2,0,0,0,0,-1.15918194829754,-1.15918194829754, 4615P 6869 +-1.15918194829754,-0.0292778092733589,-0.0292778092733589, 4615P 6870 +-0.0292778092733589,1.,0.84461426219442,1.,143.600041714311, 4615P 6871 +-167.842837467805,5.5,142.146470952165,-167.208278396419,5.5, 4615P 6872 +142.100041714311,-165.622914872961,5.5,-1.15918194829754, 4615P 6873 +-0.0292778092733589,0.,0.,0.; 4615P 6874 +126,1,1,0,0,1,0,-1.5,-1.5,-0.2,-0.2,1.,1.,143.600041714311, 4617P 6875 +-167.842837467805,-7.5,143.600041714311,-167.842837467805,5.5, 4617P 6876 +-1.5,-0.2,0.,0.,0.; 4617P 6877 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,142.100041714311, 4619P 6878 +-165.622914872961,5.5,142.100041714311,-165.622914872961,-7.5, 4619P 6879 +0.2,1.5,0.,0.,0.; 4619P 6880 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,253.47103724539, 4621P 6881 +-248.749215886107,5.5,253.47103724539,-248.749215886107,-7.5, 4621P 6882 +0.2,1.5,0.,0.,0.; 4621P 6883 +126,1,1,0,0,1,0,-1.5,-1.5,-0.2,-0.2,1.,1.,146.893865315652, 4623P 6884 +-248.749215886107,-7.5,146.893865315652,-248.749215886107,5.5, 4623P 6885 +-1.5,-0.2,0.,0.,0.; 4623P 6886 +126,1,1,0,0,1,0,-8.10792303602294,-8.10792303602294, 4625P 6887 +2.54979415695085,2.54979415695085,1.,1.,146.893865315652, 4625P 6888 +-248.749215886107,5.5,253.47103724539,-248.749215886107,5.5, 4625P 6889 +-8.10792303602294,2.54979415695085,0.,0.,0.; 4625P 6890 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,143.599043329707, 4627P 6891 +-245.454337167255,5.5,143.599043329707,-245.454337167255,-7.5, 4627P 6892 +0.2,1.5,0.,0.,0.; 4627P 6893 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,143.600041714311, 4629P 6894 +-187.471624566822,5.5,143.600041714311,-187.471624566822,-7.5, 4629P 6895 +0.2,1.5,0.,0.,0.; 4629P 6896 +126,1,1,0,0,1,0,-3.97255884800442,-3.97255884800442, 4631P 6897 +1.82571241289845,1.82571241289845,1.,1.,143.600041714311, 4631P 6898 +-187.471624566822,5.5,143.599043329707,-245.454337167255,5.5, 4631P 6899 +-3.97255884800442,1.82571241289845,0.,0.,0.; 4631P 6900 +126,2,2,0,0,0,0,1.5707963267949,1.5707963267949,1.5707963267949, 4633P 6901 +2.72951060528473,2.72951060528473,2.72951060528473,1., 4633P 6902 +0.836814780130264,1.,144.601129377503,-163.047507575232,5.5, 4633P 6903 +146.23816763129,-163.047507575232,5.5,146.893830840843, 4633P 6904 +-164.547507575232,5.5,1.5707963267949,2.72951060528473,0.,0.,0.; 4633P 6905 +126,2,2,0,0,0,0,1.72186597884763D-5,1.72186597884763D-5, 4635P 6906 +1.72186597884763D-5,1.15873149714963,1.15873149714963, 4635P 6907 +1.15873149714963,1.,0.836814780130337,1.,142.099003852683, 4635P 6908 +-247.747012802266,5.5,142.099032040288,-246.109974548721,5.5, 4635P 6909 +143.599043329707,-245.454337167255,5.5,1.72186597884763D-5, 4635P 6910 +1.15873149714963,0.,0.,0.; 4635P 6911 +126,1,1,0,0,1,0,-2.92171556809407,-2.92171556809407, 4637P 6912 +-0.958836858192392,-0.958836858192392,1.,1.,143.600041714311, 4637P 6913 +-167.842837467805,5.5,143.600041714311,-187.471624566822,5.5, 4637P 6914 +-2.92171556809407,-0.958836858192392,0.,0.,0.; 4637P 6915 +126,1,1,0,0,1,0,0.958837288670924,0.958837288670924, 4639P 6916 +3.14370739710002,3.14370739710002,1.,1.,142.100041714311, 4639P 6917 +-187.471615957251,5.5,142.100041714311,-165.622914872961,5.5, 4639P 6918 +0.958837288670924,3.14370739710002,0.,0.,0.; 4639P 6919 +126,1,1,0,0,1,0,-2.054982559236,-2.054982559236, 4641P 6920 +3.97255712615894,3.97255712615894,1.,1.,142.099003852683, 4641P 6921 +-247.747012802266,5.5,142.100041714311,-187.471615957251,5.5, 4641P 6922 +-2.054982559236,3.97255712615894,0.,0.,0.; 4641P 6923 +126,2,2,0,0,0,0,-1.5707963267949,-1.5707963267949, 4643P 6924 +-1.5707963267949,-0.412082048305059,-0.412082048305059, 4643P 6925 +-0.412082048305059,1.,0.836814780130349,1.,255.763738708729, 4643P 6926 +-250.249215886107,5.5,254.126700454943,-250.249215886107,5.5, 4643P 6927 +253.47103724539,-248.749215886107,5.5,-1.5707963267949, 4643P 6928 +-0.412082048305059,0.,0.,0.; 4643P 6929 +126,2,2,0,0,0,0,-2.72951060528471,-2.72951060528471, 4645P 6930 +-2.72951060528471,-1.5707963267949,-1.5707963267949, 4645P 6931 +-1.5707963267949,1.,0.83681478013024,1.,146.893865315652, 4645P 6932 +-248.749215886107,5.5,146.238202106099,-250.249215886107,5.5, 4645P 6933 +144.601163852312,-250.249215886107,5.5,-2.72951060528471, 4645P 6934 +-1.5707963267949,0.,0.,0.; 4645P 6935 +126,1,1,0,0,1,0,-2.77906430328482,-2.77906430328482, 4647P 6936 +8.33719318235691,8.33719318235691,1.,1.,255.763738708729, 4647P 6937 +-250.249215886107,5.5,144.601163852312,-250.249215886107,5.5, 4647P 6938 +-2.77906430328482,8.33719318235691,0.,0.,0.; 4647P 6939 +126,1,1,0,0,1,0,-1.5,-1.5,-0.2,-0.2,1.,1.,253.471039970417, 4649P 6940 +-164.547507575232,-7.5,253.471039970417,-164.547507575232,5.5, 4649P 6941 +-1.5,-0.2,0.,0.,0.; 4649P 6942 +126,1,1,0,0,1,0,-8.10792489601484,-8.10792489601484, 4651P 6943 +-6.53888737412926,-6.53888737412926,1.,1.,253.471039970417, 4651P 6944 +-164.547507575232,5.5,237.780664751561,-164.547507575232,5.5, 4651P 6945 +-8.10792489601484,-6.53888737412926,0.,0.,0.; 4651P 6946 +126,1,1,0,0,1,0,-0.2,-0.2,1.1,1.1,1.,1.,237.780664751561, 4653P 6947 +-164.547507575232,5.5,237.780664751561,-164.547507575232,-7.5, 4653P 6948 +-0.2,1.1,0.,0.,0.; 4653P 6949 +126,2,2,0,0,0,0,1.98287840825217,1.98287840825217, 4655P 6950 +1.98287840825217,3.14159265358978,3.14159265358978, 4655P 6951 +3.14159265358978,1.,0.836814789205546,1.,256.765898784737, 4655P 6952 +-245.454354455992,5.5,258.265898708729,-246.11001769155,5.5, 4655P 6953 +258.265898708729,-247.747055886107,5.5,1.98287840825217, 4655P 6954 +3.14159265358978,0.,0.,0.; 4655P 6955 +126,1,1,0,0,1,0,-2.05493493947419,-2.05493493947419, 4657P 6956 +6.16480416245852,6.16480416245852,1.,1.,258.265901433754, 4657P 6957 +-165.54966486678,5.5,258.265898708729,-247.747055886107,5.5, 4657P 6958 +-2.05493493947419,6.16480416245852,0.,0.,0.; 4657P 6959 +126,2,2,0,0,0,0,-3.14159373603537,-3.14159373603537, 4659P 6960 +-3.14159373603537,-1.98287834194696,-1.98287834194696, 4659P 6961 +-1.98287834194696,1.,0.836814474742808,1.,258.265901433754, 4659P 6962 +-165.54966486678,5.5,258.265903205761,-167.186705113691,5.5, 4659P 6963 +256.765901357746,-167.842369071796,5.5,-3.14159373603537, 4659P 6964 +-1.98287834194696,0.,0.,0.; 4659P 6965 +126,1,1,0,0,1,0,-5.93553402441977,-5.93553402441977, 4661P 6966 +1.82566451399977,1.82566451399977,1.,1.,256.765898784737, 4661P 6967 +-245.454354455992,5.5,256.765901357746,-167.842369071796,5.5, 4661P 6968 +-5.93553402441977,1.82566451399977,0.,0.,0.; 4661P 6969 +126,2,2,0,0,0,0,0.412082048305129,0.412082048305129, 4663P 6970 +0.412082048305129,1.57079632679488,1.57079632679488, 4663P 6971 +1.57079632679488,1.,0.836814780130332,1.,253.471039970417, 4663P 6972 +-164.547507575232,5.5,254.126703179969,-163.047507575233,5.5, 4663P 6973 +255.763741433756,-163.047507575233,5.5,0.412082048305129, 4663P 6974 +1.57079632679488,0.,0.,0.; 4663P 6975 +126,1,1,0,0,1,0,-2.25504270777187,-2.25504270777187, 4665P 6976 +-2.10504270777188,-2.10504270777188,1.,1.,237.780664751561, 4665P 6977 +-163.047507575232,5.5,237.780664751561,-164.547507575232,5.5, 4665P 6978 +-2.25504270777187,-2.10504270777188,0.,0.,0.; 4665P 6979 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,160.582628341595, 4667P 6980 +-228.698656211065,-7.5,160.582628341595,-228.698656211065,-11.6, 4667P 6981 +1.5,1.91,0.,0.,0.; 4667P 6982 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,163.58288415273, 4669P 6983 +-228.69865621105,-7.5,163.58288415273,-228.69865621105,-11.6, 4669P 6984 +1.5,1.91,0.,0.,0.; 4669P 6985 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,236.784016479572, 4671P 6986 +-228.698656211057,-7.5,236.784016479572,-228.698656211057,-11.6, 4671P 6987 +1.5,1.91,0.,0.,0.; 4671P 6988 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,239.784272290707, 4673P 6989 +-228.698656211057,-7.5,239.784272290707,-228.698656211057,-11.6, 4673P 6990 +1.5,1.91,0.,0.,0.; 4673P 6991 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,160.582628341595, 4675P 6992 +-190.598023114212,-7.5,160.582628341595,-190.598023114212,-11.6, 4675P 6993 +1.5,1.91,0.,0.,0.; 4675P 6994 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,163.58288415273, 4677P 6995 +-190.598023114196,-7.5,163.58288415273,-190.598023114196,-11.6, 4677P 6996 +1.5,1.91,0.,0.,0.; 4677P 6997 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,239.357084097385, 4679P 6998 +-172.121201750453,-7.5,239.357084097385,-172.121201750453,-11.6, 4679P 6999 +1.5,1.91,0.,0.,0.; 4679P 7000 +126,1,1,0,0,1,0,1.5,1.5,1.91,1.91,1.,1.,242.35733990852, 4681P 7001 +-172.121201750437,-7.5,242.35733990852,-172.121201750437,-11.6, 4681P 7002 +1.5,1.91,0.,0.,0.; 4681P 7003 +126,1,1,0,0,1,0,0.8,0.8,1.21,1.21,1.,1.,237.780664751561, 4683P 7004 +-164.547507575232,-7.5,237.780664751561,-164.547507575232,-11.6, 4683P 7005 +0.8,1.21,0.,0.,0.; 4683P 7006 +126,1,1,0,0,1,0,0.0749999999999993,0.0749999999999993, 4685P 7007 +0.724999999999998,0.724999999999998,1.,1.,237.780664751561, 4685P 7008 +-163.047507575232,1.5,237.780664751561,-156.547507575232,1.5, 4685P 7009 +0.0749999999999993,0.724999999999998,0.,0.,0.; 4685P 7010 +126,1,1,0,0,1,0,0.8,0.8,1.21,1.21,1.,1.,169.612220010399, 4687P 7011 +-164.547507575232,-7.5,169.612220010399,-164.547507575232,-11.6, 4687P 7012 +0.8,1.21,0.,0.,0.; 4687P 7013 +126,1,1,0,0,1,0,-0.2,-0.2,1.1,1.1,1.,1.,169.612220010399, 4689P 7014 +-164.547507575232,5.5,169.612220010399,-164.547507575232,-7.5, 4689P 7015 +-0.2,1.1,0.,0.,0.; 4689P 7016 +126,1,1,0,0,1,0,0.0749999999999993,0.0749999999999993, 4691P 7017 +0.724999999999998,0.724999999999998,1.,1.,169.612220010399, 4691P 7018 +-163.047507575232,1.5,169.612220010399,-156.547507575232,1.5, 4691P 7019 +0.0749999999999993,0.724999999999998,0.,0.,0.; 4691P 7020 +126,1,1,0,0,1,0,-0.75,-0.75,0.55,0.55,1.,1.,193.600041714311, 4693P 7021 +-164.547507575232,-7.5,193.600041714311,-164.547507575232,5.5, 4693P 7022 +-0.75,0.55,0.,0.,0.; 4693P 7023 +126,1,1,0,0,1,0,0.,0.,1.3,1.3,1.,1.,213.600041714311, 4695P 7024 +-171.547507575232,-7.5,213.600041714311,-171.547507575232,5.5, 4695P 7025 +0.,1.3,0.,0.,0.; 4695P 7026 +126,1,1,0,0,1,0,0.,0.,1.3,1.3,1.,1.,193.600041714311, 4697P 7027 +-171.547507575231,-7.5,193.600041714311,-171.547507575231,5.5, 4697P 7028 +0.,1.3,0.,0.,0.; 4697P 7029 +126,1,1,0,0,1,0,-1.5,-1.5,-0.2,-0.2,1.,1.,256.765898784737, 4699P 7030 +-245.454354455992,-7.5,256.765898784737,-245.454354455992,5.5, 4699P 7031 +-1.5,-0.2,0.,0.,0.; 4699P 7032 +126,1,1,0,0,1,0,0.2,0.2,1.5,1.5,1.,1.,256.765901357746, 4701P 7033 +-167.842369071796,5.5,256.765901357746,-167.842369071796,-7.5, 4701P 7034 +0.2,1.5,0.,0.,0.; 4701P 7035 +126,1,1,0,0,1,0,0.958837288670924,0.958837288670924, 4703P 7036 +3.15835685664568,3.15835685664568,1.,1.,142.100041714311, 4703P 7037 +-187.471615957251,7.5,142.100041714311,-165.476420277504,7.5, 4703P 7038 +0.958837288670924,3.15835685664568,0.,0.,0.; 4703P 7039 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,142.100041714311, 4705P 7040 +-187.471615957251,7.5,142.100041714311,-187.471615957251,5.5,0., 4705P 7041 +0.2,0.,0.,0.; 4705P 7042 +126,1,1,0,0,1,0,0.,0.,1.5,1.5,1.,1.,142.100041714311, 4707P 7043 +-165.476420277504,7.5,142.100041714311,-165.476420277504,-7.5, 4707P 7044 +0.,1.5,0.,0.,0.; 4707P 7045 +126,1,1,0,0,1,0,-2.054982559236,-2.054982559236, 4709P 7046 +3.97255712615894,3.97255712615894,1.,1.,142.099003852683, 4709P 7047 +-247.747012802266,7.5,142.100041714311,-187.471615957251,7.5, 4709P 7048 +-2.054982559236,3.97255712615894,0.,0.,0.; 4709P 7049 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,142.099003852683, 4711P 7050 +-247.747012802266,7.5,142.099003852683,-247.747012802266,5.5,0., 4711P 7051 +0.2,0.,0.,0.; 4711P 7052 +126,4,2,0,0,0,0,-1.57081354545468,-1.57081354545468, 4713P 7053 +-1.57081354545468,-0.785406772727342,-0.785406772727342,0.,0., 4713P 7054 +0.,1.,0.92387788517883,1.,0.923877885178821,1.,144.601163852312, 4713P 7055 +-250.249215886107,7.5,143.564722626097,-250.249215886107,7.5, 4713P 7056 +142.831854316326,-249.516334957217,7.5,142.098986006554, 4713P 7057 +-248.783454028327,7.5,142.099003852683,-247.747012802266,7.5, 4713P 7058 +-1.57081354545468,0.,0.,0.,0.; 4713P 7059 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,144.601163852312, 4715P 7060 +-250.249215886107,7.5,144.601163852312,-250.249215886107,5.5,0., 4715P 7061 +0.2,0.,0.,0.; 4715P 7062 +126,1,1,0,0,1,0,-2.77906430328482,-2.77906430328482, 4717P 7063 +8.33719318235691,8.33719318235691,1.,1.,255.763738708729, 4717P 7064 +-250.249215886107,7.5,144.601163852312,-250.249215886107,7.5, 4717P 7065 +-2.77906430328482,8.33719318235691,0.,0.,0.; 4717P 7066 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,255.763738708729, 4719P 7067 +-250.249215886107,7.5,255.763738708729,-250.249215886107,5.5,0., 4719P 7068 +0.2,0.,0.,0.; 4719P 7069 +126,2,2,0,0,0,0,-1.5707963267949,-1.5707963267949, 4721P 7070 +-1.5707963267949,0.,0.,0.,1.,0.707106781186518,1., 4721P 7071 +258.265898708729,-247.747055886107,7.5,258.265898708729, 4721P 7072 +-250.249215886107,7.5,255.763738708729,-250.249215886107,7.5, 4721P 7073 +-1.5707963267949,0.,0.,0.,0.; 4721P 7074 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,258.265898708729, 4723P 7075 +-247.747055886107,7.5,258.265898708729,-247.747055886107,5.5,0., 4723P 7076 +0.2,0.,0.,0.; 4723P 7077 +126,1,1,0,0,1,0,-2.05493493947419,-2.05493493947419, 4725P 7078 +6.16480416245852,6.16480416245852,1.,1.,258.265901433754, 4725P 7079 +-165.54966486678,7.5,258.265898708729,-247.747055886107,7.5, 4725P 7080 +-2.05493493947419,6.16480416245852,0.,0.,0.; 4725P 7081 +126,1,1,0,0,1,0,0.,0.,0.2,0.2,1.,1.,258.265901433754, 4727P 7082 +-165.54966486678,7.5,258.265901433754,-165.54966486678,5.5,0., 4727P 7083 +0.2,0.,0.,0.; 4727P 7084 +126,2,2,0,0,0,0,-1.57079524434933,-1.57079524434933, 4729P 7085 +-1.57079524434933,0.,0.,0.,1.,0.707107163888743,1., 4729P 7086 +255.763741433756,-163.047507575233,7.5,258.265898725305, 4729P 7087 +-163.047507575233,7.5,258.265901433754,-165.54966486678,7.5, 4729P 7088 +-1.57079524434933,0.,0.,0.,0.; 4729P 7089 +126,2,2,0,0,0,0,-1.54151851752146,-1.54151851752146, 4731P 7090 +-1.54151851752146,0.,0.,0.,1.,0.717381915954777,1., 4731P 7091 +142.100041714311,-165.476420277504,7.5,142.171175283308, 4731P 7092 +-163.047507575232,7.5,144.601129377503,-163.047507575232,7.5, 4731P 7093 +-1.54151851752146,0.,0.,0.,0.; 4731P 7094 +126,2,2,0,0,0,0,0.,0.,0.,1.55536115200856,1.55536115200856, 4733P 7095 +1.55536115200856,1.,0.712542827450536,1.,144.601129377503, 4733P 7096 +-156.547507575232,7.5,135.73685786174,-156.547507575232,7.5, 4733P 7097 +135.600041714311,-165.410723179457,7.5,0.,1.55536115200856,0., 4733P 7098 +0.,0.; 4733P 7099 +126,1,1,0,0,1,0,7.15168754189355D-31,7.15168754189355D-31, 4735P 7100 +2.20608325126057,2.20608325126057,1.,1.,135.600041714311, 4735P 7101 +-165.410723179457,7.5,135.600041714311,-187.471555692063,7.5, 4735P 7102 +7.15168754189355D-31,2.20608325126057,0.,0.,0.; 4735P 7103 +126,1,1,0,0,1,0,0.,0.,6.02753451978495,6.02753451978495,1.,1., 4737P 7104 +135.600041714311,-187.471555692063,7.5,135.599003853647, 4737P 7105 +-247.746900880977,7.5,0.,6.02753451978495,0.,0.,0.; 4737P 7106 +126,4,2,0,0,0,0,0.,0.,0.,0.785406772727353,0.785406772727353, 4739P 7107 +1.57081354545471,1.57081354545471,1.57081354545471,1., 4739P 7108 +0.923877885178792,1.,0.923877885178803,1.,135.599003853647, 4739P 7109 +-247.746900880977,7.5,135.598939647638,-251.475763043109,7.5, 4739P 7110 +138.235620668632,-254.112489464608,7.5,140.872301689627, 4739P 7111 +-256.749215886107,7.5,144.601163852312,-256.749215886107,7.5,0., 4739P 7112 +1.57081354545471,0.,0.,0.; 4739P 7113 +126,1,1,0,0,1,0,0.,0.,11.1162574856417,11.1162574856417,1.,1., 4741P 7114 +144.601163852312,-256.749215886107,7.5,255.763738708729, 4741P 7115 +-256.749215886107,7.5,0.,11.1162574856417,0.,0.,0.; 4741P 7116 +126,2,2,0,0,0,0,0.,0.,0.,1.57079632679491,1.57079632679491, 4743P 7117 +1.57079632679491,1.,0.707106781186549,1.,255.763738708729, 4743P 7118 +-256.749215886107,7.5,264.765898708729,-256.749215886107,7.5, 4743P 7119 +264.765898708729,-247.747055886107,7.5,0.,1.57079632679491,0., 4743P 7120 +0.,0.; 4743P 7121 +126,1,1,0,0,1,0,0.,0.,8.21973908038377,8.21973908038377,1.,1., 4745P 7122 +264.765898708729,-247.747055886107,7.5,264.765901433754, 4745P 7123 +-165.54966508227,7.5,0.,8.21973908038377,0.,0.,0.; 4745P 7124 +126,2,2,0,0,0,0,0.,0.,0.,1.57079604986551,1.57079604986551, 4747P 7125 +1.57079604986551,1.,0.707106879095859,1.,264.765901433754, 4747P 7126 +-165.54966508227,7.5,264.765898940792,-156.547507575234,7.5, 4747P 7127 +255.763741433756,-156.547507575234,7.5,0.,1.57079604986551,0., 4747P 7128 +0.,0.; 4747P 7129 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,135.600041714311, 4749P 7130 +-165.410723179457,7.5,135.600041714311,-165.410723179457,-11.6, 4749P 7131 +0.,1.91,0.,0.,0.; 4749P 7132 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,135.600041714311, 4751P 7133 +-187.471555692063,7.5,135.600041714311,-187.471555692063,-11.6, 4751P 7134 +0.,1.91,0.,0.,0.; 4751P 7135 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,135.599003853647, 4753P 7136 +-247.746900880977,7.5,135.599003853647,-247.746900880977,-11.6, 4753P 7137 +0.,1.91,0.,0.,0.; 4753P 7138 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,144.601163852312, 4755P 7139 +-256.749215886107,7.5,144.601163852312,-256.749215886107,-11.6, 4755P 7140 +0.,1.91,0.,0.,0.; 4755P 7141 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,255.763738708729, 4757P 7142 +-256.749215886107,7.5,255.763738708729,-256.749215886107,-11.6, 4757P 7143 +0.,1.91,0.,0.,0.; 4757P 7144 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,264.765898708729, 4759P 7145 +-247.747055886107,7.5,264.765898708729,-247.747055886107,-11.6, 4759P 7146 +0.,1.91,0.,0.,0.; 4759P 7147 +126,1,1,0,0,1,0,0.,0.,1.91,1.91,1.,1.,264.765901433754, 4761P 7148 +-165.54966508227,7.5,264.765901433754,-165.54966508227,-11.6,0., 4761P 7149 +1.91,0.,0.,0.; 4761P 7150 +128,1,6,1,2,0,0,0,0,0,-1.14300985890878D-16, 4763P 7151 +-1.14300985890878D-16,1.07865733739701,1.07865733739701, 4763P 7152 +3.1392581473417,3.1392581473417,3.1392581473417, 4763P 7153 +4.18726069832056,4.18726069832056,5.23526324929942, 4763P 7154 +5.23526324929942,6.28326580027829,6.28326580027829, 4763P 7155 +6.28326580027829,1.,1.,0.865824083693581,0.865824083693581,1., 4763P 7156 +1.,0.865824083693581,0.865824083693581,1.,1.,0.865824083693581, 4763P 7157 +0.865824083693581,1.,1.,136.882006921691,-80.5980231141957, 4763P 7158 +8.73624999999999,136.882006921691,-80.5980231141957, 4763P 7159 +7.11812499999999,136.8810299142,-79.7889073538704, 4763P 7160 +8.73624999999999,136.8810299142,-79.7889073538704, 4763P 7161 +7.11812499999999,137.581582336708,-79.3840671737142, 4763P 7162 +8.73624999999999,137.581582336708,-79.3840671737142, 4763P 7163 +7.11812499999999,138.282134759216,-78.9792269935579, 4763P 7164 +8.73624999999999,138.282134759216,-78.9792269935579, 4763P 7165 +7.11812499999999,138.982687181724,-79.3840671737142, 4763P 7166 +8.73624999999999,138.982687181724,-79.3840671737142, 4763P 7167 +7.11812499999999,139.683239604231,-79.7889073538704, 4763P 7168 +8.73624999999999,139.683239604231,-79.7889073538704, 4763P 7169 +7.11812499999999,139.68226259674,-80.5980231141957, 4763P 7170 +8.73624999999999,139.68226259674,-80.5980231141957, 4763P 7171 +7.11812499999999,-1.14300985890878D-16,1.07865733739701, 4763P 7172 +3.1392581473417,6.28326580027829; 4763P 7173 +128,1,6,1,2,0,0,0,0,0,-1.14300985890878D-16, 4765P 7174 +-1.14300985890878D-16,1.07865733739701,1.07865733739701, 4765P 7175 +3.13925814734167,3.13925814734167,3.13925814734167, 4765P 7176 +4.18726069832055,4.18726069832055,5.23526324929943, 4765P 7177 +5.23526324929943,6.28326580027831,6.28326580027831, 4765P 7178 +6.28326580027831,1.,1.,0.865824083693577,0.865824083693577,1., 4765P 7179 +1.,0.865824083693577,0.865824083693577,1.,1.,0.865824083693577, 4765P 7180 +0.865824083693577,1.,1.,139.68226259674,-80.5980231141957, 4765P 7181 +8.73624999999999,139.68226259674,-80.5980231141957, 4765P 7182 +7.11812499999999,139.683239604231,-81.4071388745211, 4765P 7183 +8.73624999999999,139.683239604231,-81.4071388745211, 4765P 7184 +7.11812499999999,138.982687181724,-81.8119790546774, 4765P 7185 +8.73624999999999,138.982687181724,-81.8119790546774, 4765P 7186 +7.11812499999999,138.282134759216,-82.2168192348336, 4765P 7187 +8.73624999999999,138.282134759216,-82.2168192348336, 4765P 7188 +7.11812499999999,137.581582336708,-81.8119790546774, 4765P 7189 +8.73624999999999,137.581582336708,-81.8119790546774, 4765P 7190 +7.11812499999999,136.8810299142,-81.4071388745211, 4765P 7191 +8.73624999999999,136.8810299142,-81.4071388745211, 4765P 7192 +7.11812499999999,136.882006921691,-80.5980231141957, 4765P 7193 +8.73624999999999,136.882006921691,-80.5980231141957, 4765P 7194 +7.11812499999999,-1.14300985890878D-16,1.07865733739701, 4765P 7195 +3.13925814734167,6.28326580027831; 4765P 7196 +128,1,6,1,2,0,0,0,0,0,-1.14300985890878D-16, 4767P 7197 +-1.14300985890878D-16,1.07865733739701,1.07865733739701, 4767P 7198 +3.1392581473417,3.1392581473417,3.1392581473417, 4767P 7199 +4.18726069832056,4.18726069832056,5.23526324929942, 4767P 7200 +5.23526324929942,6.28326580027829,6.28326580027829, 4767P 7201 +6.28326580027829,1.,1.,0.865824083693581,0.865824083693581,1., 4767P 7202 +1.,0.865824083693581,0.865824083693581,1.,1.,0.865824083693581, 4767P 7203 +0.865824083693581,1.,1.,136.882006921691,-118.69865621105, 4767P 7204 +8.73624999999999,136.882006921691,-118.69865621105, 4767P 7205 +7.11812499999999,136.8810299142,-117.889540450724, 4767P 7206 +8.73624999999999,136.8810299142,-117.889540450724, 4767P 7207 +7.11812499999999,137.581582336708,-117.484700270568, 4767P 7208 +8.73624999999999,137.581582336708,-117.484700270568, 4767P 7209 +7.11812499999999,138.282134759216,-117.079860090412, 4767P 7210 +8.73624999999999,138.282134759216,-117.079860090412, 4767P 7211 +7.11812499999999,138.982687181724,-117.484700270568, 4767P 7212 +8.73624999999999,138.982687181724,-117.484700270568, 4767P 7213 +7.11812499999999,139.683239604231,-117.889540450724, 4767P 7214 +8.73624999999999,139.683239604231,-117.889540450724, 4767P 7215 +7.11812499999999,139.68226259674,-118.69865621105, 4767P 7216 +8.73624999999999,139.68226259674,-118.69865621105, 4767P 7217 +7.11812499999999,-1.14300985890878D-16,1.07865733739701, 4767P 7218 +3.1392581473417,6.28326580027829; 4767P 7219 +128,1,6,1,2,0,0,0,0,0,-1.14300985890878D-16, 4769P 7220 +-1.14300985890878D-16,1.07865733739701,1.07865733739701, 4769P 7221 +3.13925814734167,3.13925814734167,3.13925814734167, 4769P 7222 +4.18726069832055,4.18726069832055,5.23526324929943, 4769P 7223 +5.23526324929943,6.28326580027831,6.28326580027831, 4769P 7224 +6.28326580027831,1.,1.,0.865824083693577,0.865824083693577,1., 4769P 7225 +1.,0.865824083693577,0.865824083693577,1.,1.,0.865824083693577, 4769P 7226 +0.865824083693577,1.,1.,139.68226259674,-118.69865621105, 4769P 7227 +8.73624999999999,139.68226259674,-118.69865621105, 4769P 7228 +7.11812499999999,139.683239604231,-119.507771971375, 4769P 7229 +8.73624999999999,139.683239604231,-119.507771971375, 4769P 7230 +7.11812499999999,138.982687181724,-119.912612151531, 4769P 7231 +8.73624999999999,138.982687181724,-119.912612151531, 4769P 7232 +7.11812499999999,138.282134759216,-120.317452331688, 4769P 7233 +8.73624999999999,138.282134759216,-120.317452331688, 4769P 7234 +7.11812499999999,137.581582336708,-119.912612151531, 4769P 7235 +8.73624999999999,137.581582336708,-119.912612151531, 4769P 7236 +7.11812499999999,136.8810299142,-119.507771971375, 4769P 7237 +8.73624999999999,136.8810299142,-119.507771971375, 4769P 7238 +7.11812499999999,136.882006921691,-118.69865621105, 4769P 7239 +8.73624999999999,136.882006921691,-118.69865621105, 4769P 7240 +7.11812499999999,-1.14300985890878D-16,1.07865733739701, 4769P 7241 +3.13925814734167,6.28326580027831; 4769P 7242 +128,1,6,1,2,0,0,0,0,0,-1.14300941237118D-16, 4771P 7243 +-1.14300941237118D-16,1.07865694595434,1.07865694595434, 4771P 7244 +3.13866619558426,3.13866619558426,3.13866619558426, 4771P 7245 +4.18687286725483,4.18687286725483,5.2350795389254, 4771P 7246 +5.2350795389254,6.28328621059597,6.28328621059597, 4771P 7247 +6.28328621059597,1.,1.,0.865773013439831,0.865773013439831,1., 4771P 7248 +1.,0.865773013439831,0.865773013439831,1.,1.,0.865773013439831, 4771P 7249 +0.865773013439831,1.,1.,60.6806188225967,-118.698656211056, 4771P 7250 +8.73625,60.6806188225967,-118.698656211056,7.118125, 4771P 7251 +60.679393790223,-117.889349843306,8.73625,60.679393790223, 4771P 7252 +-117.889349843306,7.118125,61.3800702057312,-117.484342610857, 4771P 7253 +8.73625,61.3800702057312,-117.484342610857,7.118125, 4771P 7254 +62.0807466212394,-117.079335378408,8.73625,62.0807466212394, 4771P 7255 +-117.079335378408,7.118125,62.7814230367476,-117.484342610857, 4771P 7256 +8.73625,62.7814230367476,-117.484342610857,7.118125, 4771P 7257 +63.4820994522559,-117.889349843306,8.73625,63.4820994522559, 4771P 7258 +-117.889349843306,7.118125,63.4808744198821,-118.698656211056, 4771P 7259 +8.73625,63.4808744198821,-118.698656211056,7.118125, 4771P 7260 +-1.14300941237118D-16,1.07865694595434,3.13866619558426, 4771P 7261 +6.28328621059597; 4771P 7262 +128,1,6,1,2,0,0,0,0,0,-1.14300941237119D-16, 4773P 7263 +-1.14300941237119D-16,1.07865694595435,1.07865694595435, 4773P 7264 +3.13866619559326,3.13866619559326,3.13866619559326, 4773P 7265 +4.18687286725781,4.18687286725781,5.23507953892236, 4773P 7266 +5.23507953892236,6.28328621058691,6.28328621058691, 4773P 7267 +6.28328621058691,1.,1.,0.865773013441338,0.865773013441338,1., 4773P 7268 +1.,0.865773013441338,0.865773013441338,1.,1.,0.865773013441338, 4773P 7269 +0.865773013441338,1.,1.,63.4808744198821,-118.698656211056, 4773P 7270 +8.73625,63.4808744198821,-118.698656211056,7.118125, 4773P 7271 +63.4820994522485,-119.507962578801,8.73625,63.4820994522485, 4773P 7272 +-119.507962578801,7.118125,62.781423036744,-119.912969811245, 4773P 7273 +8.73625,62.781423036744,-119.912969811245,7.118125, 4773P 7274 +62.0807466212394,-120.317977043689,8.73625,62.0807466212394, 4773P 7275 +-120.317977043689,7.118125,61.3800702057349,-119.912969811245, 4773P 7276 +8.73625,61.3800702057349,-119.912969811245,7.118125, 4773P 7277 +60.6793937902303,-119.507962578801,8.73625,60.6793937902303, 4773P 7278 +-119.507962578801,7.118125,60.6806188225967,-118.698656211056, 4773P 7279 +8.73625,60.6806188225967,-118.698656211056,7.118125, 4773P 7280 +-1.14300941237119D-16,1.07865694595435,3.13866619559326, 4773P 7281 +6.28328621058691; 4773P 7282 +128,1,6,1,2,0,0,0,0,0,-1.14300985890877D-16, 4775P 7283 +-1.14300985890877D-16,1.078657337397,1.078657337397, 4775P 7284 +3.13925814733601,3.13925814733601,3.13925814733601, 4775P 7285 +4.18726069831867,4.18726069831867,5.23526324930132, 4775P 7286 +5.23526324930132,6.28326580028397,6.28326580028397, 4775P 7287 +6.28326580028397,1.,1.,0.865824083692633,0.865824083692633,1., 4775P 7288 +1.,0.865824083692633,0.865824083692633,1.,1.,0.865824083692633, 4775P 7289 +0.865824083692633,1.,1.,58.1075511659013,-62.1212017504367, 4775P 7290 +8.73625,58.1075511659013,-62.1212017504367,7.118125, 4775P 7291 +58.1065741584055,-61.3120859901078,8.73625,58.1065741584055, 4775P 7292 +-61.3120859901078,7.118125,58.8071265809156,-60.9072458099485, 4775P 7293 +8.73625,58.8071265809156,-60.9072458099485,7.118125, 4775P 7294 +59.5076790034257,-60.5024056297891,8.73625,59.5076790034257, 4775P 7295 +-60.5024056297891,7.118125,60.2082314259358,-60.9072458099485, 4775P 7296 +8.73625,60.2082314259358,-60.9072458099485,7.118125, 4775P 7297 +60.9087838484459,-61.3120859901078,8.73625,60.9087838484459, 4775P 7298 +-61.3120859901078,7.118125,60.9078068409501,-62.1212017504367, 4775P 7299 +8.73625,60.9078068409501,-62.1212017504367,7.118125, 4775P 7300 +-1.14300985890877D-16,1.078657337397,3.13925814733601, 4775P 7301 +6.28326580028397; 4775P 7302 +128,1,6,1,2,0,0,0,0,0,-1.14300985890879D-16, 4777P 7303 +-1.14300985890879D-16,1.07865733739701,1.07865733739701, 4777P 7304 +3.13925814734738,3.13925814734738,3.13925814734738, 4777P 7305 +4.18726069832246,4.18726069832246,5.23526324929753, 4777P 7306 +5.23526324929753,6.2832658002726,6.2832658002726, 4777P 7307 +6.2832658002726,1.,1.,0.865824083694529,0.865824083694529,1.,1., 4777P 7308 +0.865824083694529,0.865824083694529,1.,1.,0.865824083694529, 4777P 7309 +0.865824083694529,1.,1.,60.9078068409501,-62.1212017504367, 4777P 7310 +8.73625,60.9078068409501,-62.1212017504367,7.118125, 4777P 7311 +60.9087838484367,-62.9303175107585,8.73625,60.9087838484367, 4777P 7312 +-62.9303175107585,7.118125,60.2082314259312,-63.3351576909116, 4777P 7313 +8.73625,60.2082314259312,-63.3351576909116,7.118125, 4777P 7314 +59.5076790034257,-63.7399978710648,8.73625,59.5076790034257, 4777P 7315 +-63.7399978710648,7.118125,58.8071265809202,-63.3351576909116, 4777P 7316 +8.73625,58.8071265809202,-63.3351576909116,7.118125, 4777P 7317 +58.1065741584147,-62.9303175107585,8.73625,58.1065741584147, 4777P 7318 +-62.9303175107585,7.118125,58.1075511659013,-62.1212017504367, 4777P 7319 +8.73625,58.1075511659013,-62.1212017504367,7.118125, 4777P 7320 +-1.14300985890879D-16,1.07865733739701,3.13925814734738, 4777P 7321 +6.2832658002726; 4777P 7322 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4779P 7323 +1.29891011810403,1.29891011810403,-0.00100000000000011, 4779P 7324 +-0.00100000000000011,0.151,0.151,1.,1.,1.,1.,154.818861794198, 4779P 7325 +-121.223878110647,8.74703749999999,140.796081395161, 4779P 7326 +-121.223895558101,8.74703749999999,154.818861794198, 4779P 7327 +-121.223878110647,7.10733749999999,140.796081395161, 4779P 7328 +-121.223895558101,7.10733749999999,-0.00100000000000002, 4779P 7329 +1.29891011810403,-0.00100000000000011,0.151; 4779P 7330 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4781P 7331 +0.0564439671834306,0.0564439671834306,-0.001,-0.001,0.151,0.151, 4781P 7332 +1.,1.,1.,1.,154.808074294198,-121.832767420061,8.74703749999999, 4781P 7333 +154.808074294198,-121.213090624069,8.74703749999999, 4781P 7334 +154.808074294198,-121.832767420061,7.10733749999999, 4781P 7335 +154.808074294198,-121.213090624069,7.10733749999999, 4781P 7336 +-0.00100000000000178,0.0564439671834306,-0.001,0.151; 4781P 7337 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4783P 7338 +0.0750926997042853,0.0750926997042853,-0.001,-0.001,0.151,0.151, 4783P 7339 +1.,1.,1.,1.,155.618136792065,-121.82199757579,8.74703749999999, 4783P 7340 +154.7972867942,-121.821979684942,8.74703749999999, 4783P 7341 +155.618136792065,-121.82199757579,7.10733749999999, 4783P 7342 +154.7972867942,-121.821979684942,7.10733749999999, 4783P 7343 +-0.00100000000000002,0.0750926997042853,-0.001,0.151; 4783P 7344 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.1877621866862, 4785P 7345 +1.1877621866862,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4785P 7346 +155.607349292068,-134.634981929548,8.74703749999999, 4785P 7347 +155.607349292068,-121.81120984067,8.74703749999999, 4785P 7348 +155.607349292068,-134.634981929548,7.10733749999999, 4785P 7349 +155.607349292068,-121.81120984067,7.10733749999999,-0.001, 4785P 7350 +1.1877621866862,-0.001,0.151; 4785P 7351 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4787P 7352 +0.0750926997042836,0.0750926997042836,-0.00100000000000001, 4787P 7353 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,154.7972867942, 4787P 7354 +-134.624176773819,8.74703749999999,155.618136792065, 4787P 7355 +-134.624194664667,8.74703749999999,154.7972867942, 4787P 7356 +-134.624176773819,7.10733749999999,155.618136792065, 4787P 7357 +-134.624194664667,7.10733749999999,-0.00100000000000178, 4787P 7358 +0.0750926997042836,-0.00100000000000001,0.151; 4787P 7359 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.056571543375649, 4789P 7360 +0.056571543375649,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4789P 7361 +154.808074294198,-135.234442533103,8.74703749999999, 4789P 7362 +154.808074294198,-134.613389508938,8.74703749999999, 4789P 7363 +154.808074294198,-135.234442533103,7.10733749999999, 4789P 7364 +154.808074294198,-134.613389508938,7.10733749999999,-0.001, 4789P 7365 +0.056571543375649,-0.001,0.151; 4789P 7366 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.2989097143809, 4791P 7367 +1.2989097143809,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4791P 7368 +140.796085750314,-135.223655033103,8.74703749999999, 4791P 7369 +154.818861794198,-135.223655033103,8.74703749999999, 4791P 7370 +140.796085750314,-135.223655033103,7.10733749999999, 4791P 7371 +154.818861794198,-135.223655033103,7.10733749999999,-0.001, 4791P 7372 +1.2989097143809,-0.001,0.151; 4791P 7373 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565715433771185, 4793P 7374 +0.0565715433771185,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4793P 7375 +140.806868816791,-134.613389508938,8.74703749999999, 4793P 7376 +140.806873328684,-135.234442533103,8.74703749999999, 4793P 7377 +140.806868816791,-134.613389508938,7.10733749999999, 4793P 7378 +140.806873328684,-135.234442533103,7.10733749999999,-0.001, 4793P 7379 +0.0565715433771185,-0.001,0.151; 4793P 7380 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0750874512990324, 4795P 7381 +0.0750874512990324,-0.00100000000000011,-0.00100000000000011, 4795P 7382 +0.151,0.151,1.,1.,1.,1.,139.996863014273,-134.624177008938, 4795P 7383 +8.74703749999999,140.817656395161,-134.624177008938, 4795P 7384 +8.74703749999999,139.996863014273,-134.624177008938, 4795P 7385 +7.10733749999999,140.817656395161,-134.624177008938, 4795P 7386 +7.10733749999999,-0.001,0.0750874512990324,-0.00100000000000011, 4795P 7387 +0.151; 4795P 7388 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18776218668627, 4797P 7389 +1.18776218668627,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4797P 7390 +140.007654873095,-121.811192420061,8.74703749999999, 4797P 7391 +140.007650510603,-134.634964508938,8.74703749999999, 4797P 7392 +140.007654873095,-121.811192420061,7.10733749999999, 4797P 7393 +140.007650510603,-134.634964508938,7.10733749999999,-0.001, 4797P 7394 +1.18776218668627,-0.001,0.151; 4797P 7395 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4799P 7396 +0.075087451316632,0.075087451316632,-0.001,-0.001,0.151,0.151, 4799P 7397 +1.,1.,1.,1.,140.817660750311,-121.821997575806,8.74703749999999, 4799P 7398 +139.996867369428,-121.821979684925,8.74703749999999, 4799P 7399 +140.817660750311,-121.821997575806,7.10733749999999, 4799P 7400 +139.996867369428,-121.821979684925,7.10733749999999, 4799P 7401 +-0.00100000000000002,0.075087451316632,-0.001,0.151; 4799P 7402 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0564439671849002, 4801P 7403 +0.0564439671849002,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4801P 7404 +140.806868816611,-121.21310804468,8.74703749999999, 4801P 7405 +140.806873328864,-121.83278484067,8.74703749999999, 4801P 7406 +140.806868816611,-121.21310804468,7.10733749999999, 4801P 7407 +140.806873328864,-121.83278484067,7.10733749999999,-0.001, 4801P 7408 +0.0564439671849002,-0.001,0.151; 4801P 7409 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4803P 7410 +1.29888872083129,1.29888872083129,-0.00100000000000009, 4803P 7411 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,135.768458142722, 4803P 7412 +-121.223878110647,8.74703749999999,121.745908566765, 4803P 7413 +-121.223895558102,8.74703749999999,135.768458142722, 4803P 7414 +-121.223878110647,7.10733749999999,121.745908566765, 4803P 7415 +-121.223895558102,7.10733749999999,-0.00100000000000002, 4803P 7416 +1.29888872083129,-0.00100000000000009,0.151; 4803P 7417 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4805P 7418 +0.0564439671834306,0.0564439671834306,-0.001,-0.001,0.151,0.151, 4805P 7419 +1.,1.,1.,1.,135.757670642722,-121.832767420061,8.74703749999999, 4805P 7420 +135.757670642722,-121.213090624069,8.74703749999999, 4805P 7421 +135.757670642722,-121.832767420061,7.10733749999999, 4805P 7422 +135.757670642722,-121.213090624069,7.10733749999999, 4805P 7423 +-0.00100000000000178,0.0564439671834306,-0.001,0.151; 4805P 7424 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4807P 7425 +0.0750967369255578,0.0750967369255578,-0.001,-0.001,0.151,0.151, 4807P 7426 +1.,1.,1.,1.,136.567776692114,-121.821997575777,8.74703749999999, 4807P 7427 +135.746883142724,-121.821979684954,8.74703749999999, 4807P 7428 +136.567776692114,-121.821997575777,7.10733749999999, 4807P 7429 +135.746883142724,-121.821979684954,7.10733749999999, 4807P 7430 +-0.00100000000000002,0.0750967369255578,-0.001,0.151; 4807P 7431 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.1877621866862, 4809P 7432 +1.1877621866862,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4809P 7433 +136.556989192117,-134.634981929548,8.74703749999999, 4809P 7434 +136.556989192117,-121.81120984067,8.74703749999999, 4809P 7435 +136.556989192117,-134.634981929548,7.10733749999999, 4809P 7436 +136.556989192117,-121.81120984067,7.10733749999999,-0.001, 4809P 7437 +1.1877621866862,-0.001,0.151; 4809P 7438 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0750967369255578, 4811P 7439 +0.0750967369255578,-0.00100000000000001,-0.00100000000000001, 4811P 7440 +0.151,0.151,1.,1.,1.,1.,135.746883142724,-134.624176773832, 4811P 7441 +8.74703749999999,136.567776692114,-134.624194664654, 4811P 7442 +8.74703749999999,135.746883142724,-134.624176773832, 4811P 7443 +7.10733749999999,136.567776692114,-134.624194664654, 4811P 7444 +7.10733749999999,-0.001,0.0750967369255578,-0.00100000000000001, 4811P 7445 +0.151; 4811P 7446 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.056571543375649, 4813P 7447 +0.056571543375649,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4813P 7448 +135.757670642722,-135.234442533103,8.74703749999999, 4813P 7449 +135.757670642722,-134.613389508938,8.74703749999999, 4813P 7450 +135.757670642722,-135.234442533103,7.10733749999999, 4813P 7451 +135.757670642722,-134.613389508938,7.10733749999999,-0.001, 4813P 7452 +0.056571543375649,-0.001,0.151; 4813P 7453 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888872083028, 4815P 7454 +1.29888872083028,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4815P 7455 +121.745908566765,-135.223655033103,8.74703749999999, 4815P 7456 +135.768458142722,-135.223655033103,8.74703749999999, 4815P 7457 +121.745908566765,-135.223655033103,7.10733749999999, 4815P 7458 +135.768458142722,-135.223655033103,7.10733749999999,-0.001, 4815P 7459 +1.29888872083028,-0.001,0.151; 4815P 7460 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565715433756525, 4817P 7461 +0.0565715433756525,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4817P 7462 +121.756696066765,-134.613389508938,8.74703749999999, 4817P 7463 +121.756696066765,-135.234442533103,8.74703749999999, 4817P 7464 +121.756696066765,-134.613389508938,7.10733749999999, 4817P 7465 +121.756696066765,-135.234442533103,7.10733749999999,-0.001, 4817P 7466 +0.0565715433756525,-0.001,0.151; 4817P 7467 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0751056187947589, 4819P 7468 +0.0751056187947589,-0.00100000000000001,-0.00100000000000001, 4819P 7469 +0.151,0.151,1.,1.,1.,1.,120.946494204017,-134.624177008938, 4819P 7470 +8.74703749999999,121.767483566765,-134.624177008938, 4819P 7471 +8.74703749999999,120.946494204017,-134.624177008938, 4819P 7472 +7.10733749999999,121.767483566765,-134.624177008938, 4819P 7473 +7.10733749999999,-0.001,0.0751056187947589,-0.00100000000000001, 4819P 7474 +0.151; 4819P 7475 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.1877621866862, 4821P 7476 +1.1877621866862,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4821P 7477 +120.957281704017,-121.811192420061,8.74703749999999, 4821P 7478 +120.957281704017,-134.634964508938,8.74703749999999, 4821P 7479 +120.957281704017,-121.811192420061,7.10733749999999, 4821P 7480 +120.957281704017,-134.634964508938,7.10733749999999,-0.001, 4821P 7481 +1.1877621866862,-0.001,0.151; 4821P 7482 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4823P 7483 +0.0751056188123538,0.0751056188123538,-0.001,-0.001,0.151,0.151, 4823P 7484 +1.,1.,1.,1.,121.767483566763,-121.821997575749,8.74703749999999, 4823P 7485 +120.946494204019,-121.821979684983,8.74703749999999, 4823P 7486 +121.767483566763,-121.821997575749,7.10733749999999, 4823P 7487 +120.946494204019,-121.821979684983,7.10733749999999, 4823P 7488 +-0.00100000000000002,0.0751056188123538,-0.001,0.151; 4823P 7489 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0564439671834303, 4825P 7490 +0.0564439671834303,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4825P 7491 +121.756696066765,-121.213108044679,8.74703749999999, 4825P 7492 +121.756696066765,-121.83278484067,8.74703749999999, 4825P 7493 +121.756696066765,-121.213108044679,7.10733749999999, 4825P 7494 +121.756696066765,-121.83278484067,7.10733749999999,-0.001, 4825P 7495 +0.0564439671834303,-0.001,0.151; 4825P 7496 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4827P 7497 +1.29888831710916,1.29888831710916,-0.00100000000000009, 4827P 7498 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,116.718084977313, 4827P 7499 +-121.223878110647,8.74703749999999,102.695539756509, 4827P 7500 +-121.223895558102,8.7470375,116.718084977313,-121.223878110647, 4827P 7501 +7.10733749999999,102.695539756509,-121.223895558102, 4827P 7502 +7.10733749999999,-0.00100000000000002,1.29888831710916, 4827P 7503 +-0.00100000000000009,0.151; 4827P 7504 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4829P 7505 +0.0564439671834306,0.0564439671834306,-0.001,-0.001,0.151,0.151, 4829P 7506 +1.,1.,1.,1.,116.707297477313,-121.832767420061,8.74703749999999, 4829P 7507 +116.707297477313,-121.213090624069,8.74703749999999, 4829P 7508 +116.707297477313,-121.832767420061,7.10733749999999, 4829P 7509 +116.707297477313,-121.213090624069,7.10733749999999, 4829P 7510 +-0.00100000000000178,0.0564439671834306,-0.001,0.151; 4829P 7511 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4831P 7512 +0.0751056188123572,0.0751056188123572,-0.001,-0.001,0.151,0.151, 4831P 7513 +1.,1.,1.,1.,117.517499340059,-121.821997575749,8.74703749999999, 4831P 7514 +116.696509977316,-121.821979684983,8.74703749999999, 4831P 7515 +117.517499340059,-121.821997575749,7.10733749999999, 4831P 7516 +116.696509977316,-121.821979684983,7.10733749999999, 4831P 7517 +-0.00100000000000002,0.0751056188123572,-0.001,0.151; 4831P 7518 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18776218668648, 4833P 7519 +1.18776218668648,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4833P 7520 +117.506720557706,-134.634981929548,8.74703749999999, 4833P 7521 +117.506711832722,-121.81120984067,8.74703749999999, 4833P 7522 +117.506720557706,-134.634981929548,7.10733749999999, 4833P 7523 +117.506711832722,-121.81120984067,7.10733749999999,-0.001, 4833P 7524 +1.18776218668648,-0.001,0.151; 4833P 7525 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0751056188123538, 4835P 7526 +0.0751056188123538,-0.00100000000000001,-0.00100000000000001, 4835P 7527 +0.151,0.151,1.,1.,1.,1.,116.696518687621,-134.62417677386, 4835P 7528 +8.74703749999999,117.517508050364,-134.624194664626, 4835P 7529 +8.74703749999999,116.696518687621,-134.62417677386, 4835P 7530 +7.10733749999999,117.517508050364,-134.624194664626, 4835P 7531 +7.10733749999999,-0.001,0.0751056188123538,-0.00100000000000001, 4835P 7532 +0.151; 4835P 7533 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565715433815147, 4837P 7534 +0.0565715433815147,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4837P 7535 +116.707297320573,-135.234442533102,8.74703749999999, 4837P 7536 +116.707306344358,-134.613389508939,8.74703749999999, 4837P 7537 +116.707297320573,-135.234442533102,7.10733749999999, 4837P 7538 +116.707306344358,-134.613389508939,7.10733749999999,-0.001, 4837P 7539 +0.0565715433815147,-0.001,0.151; 4837P 7540 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888831710816, 4839P 7541 +1.29888831710816,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4839P 7542 +102.695539756509,-135.223655033103,8.7470375,116.718084977313, 4839P 7543 +-135.223655033103,8.74703749999999,102.695539756509, 4839P 7544 +-135.223655033103,7.10733749999999,116.718084977313, 4839P 7545 +-135.223655033103,7.10733749999999,-0.001,1.29888831710816, 4839P 7546 +-0.001,0.151; 4839P 7547 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565715433756525, 4841P 7548 +0.0565715433756525,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4841P 7549 +102.706327256509,-134.613389508938,8.7470375,102.706327256509, 4841P 7550 +-135.234442533103,8.7470375,102.706327256509,-134.613389508938, 4841P 7551 +7.10733749999999,102.706327256509,-135.234442533103, 4841P 7552 +7.10733749999999,-0.001,0.0565715433756525,-0.001,0.151; 4841P 7553 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4843P 7554 +0.0751056187947571,0.0751056187947571,-0.00100000000000001, 4843P 7555 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,101.89612539376, 4843P 7556 +-134.624177008938,8.7470375,102.717114756509,-134.624177008938, 4843P 7557 +8.7470375,101.89612539376,-134.624177008938,7.10733749999999, 4843P 7558 +102.717114756509,-134.624177008938,7.10733749999999, 4843P 7559 +-0.00100000000000178,0.0751056187947571,-0.00100000000000001, 4843P 7560 +0.151; 4843P 7561 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.1877621866862, 4845P 7562 +1.1877621866862,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4845P 7563 +101.90691289376,-121.811192420061,8.7470375,101.90691289376, 4845P 7564 +-134.634964508938,8.7470375,101.90691289376,-121.811192420061, 4845P 7565 +7.10733749999999,101.90691289376,-134.634964508938, 4845P 7566 +7.10733749999999,-0.001,1.1877621866862,-0.001,0.151; 4845P 7567 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4847P 7568 +0.0751056188123521,0.0751056188123521,-0.001,-0.001,0.151,0.151, 4847P 7569 +1.,1.,1.,1.,102.717114756506,-121.821997575749,8.7470375, 4847P 7570 +101.896125393763,-121.821979684983,8.7470375,102.717114756506, 4847P 7571 +-121.821997575749,7.10733749999999,101.896125393763, 4847P 7572 +-121.821979684983,7.10733749999999,-0.00100000000000178, 4847P 7573 +0.0751056188123521,-0.001,0.151; 4847P 7574 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0564439671834303, 4849P 7575 +0.0564439671834303,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4849P 7576 +102.706327256509,-121.213108044679,8.7470375,102.706327256509, 4849P 7577 +-121.83278484067,8.7470375,102.706327256509,-121.213108044679, 4849P 7578 +7.10733749999999,102.706327256509,-121.83278484067, 4849P 7579 +7.10733749999999,-0.001,0.0564439671834303,-0.001,0.151; 4849P 7580 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4851P 7581 +1.29888831710916,1.29888831710916,-0.00100000000000009, 4851P 7582 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,97.6677161670568, 4851P 7583 +-121.223878110647,8.7470375,83.6451709462526,-121.223895558102, 4851P 7584 +8.7470375,97.6677161670568,-121.223878110647,7.10733749999999, 4851P 7585 +83.6451709462526,-121.223895558102,7.1073375, 4851P 7586 +-0.00100000000000002,1.29888831710916,-0.00100000000000009, 4851P 7587 +0.151; 4851P 7588 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4853P 7589 +0.0564439671834306,0.0564439671834306,-0.001,-0.001,0.151,0.151, 4853P 7590 +1.,1.,1.,1.,97.6569286670568,-121.832767420061,8.7470375, 4853P 7591 +97.6569286670568,-121.213090624069,8.7470375,97.6569286670568, 4853P 7592 +-121.832767420061,7.10733749999999,97.6569286670568, 4853P 7593 +-121.213090624069,7.10733749999999,-0.00100000000000178, 4853P 7594 +0.0564439671834306,-0.001,0.151; 4853P 7595 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4855P 7596 +0.0751056188123537,0.0751056188123537,-0.001,-0.001,0.151,0.151, 4855P 7597 +1.,1.,1.,1.,98.4671305298027,-121.821997575749,8.7470375, 4855P 7598 +97.6461411670594,-121.821979684983,8.7470375,98.4671305298027, 4855P 7599 +-121.821997575749,7.10733749999999,97.6461411670594, 4855P 7600 +-121.821979684983,7.10733749999999,-0.00100000000000178, 4855P 7601 +0.0751056188123537,-0.001,0.151; 4855P 7602 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.1877621866862, 4857P 7603 +1.1877621866862,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4857P 7604 +98.4563430298053,-134.634981929548,8.7470375,98.4563430298053, 4857P 7605 +-121.81120984067,8.7470375,98.4563430298053,-134.634981929548, 4857P 7606 +7.10733749999999,98.4563430298053,-121.81120984067, 4857P 7607 +7.10733749999999,-0.001,1.1877621866862,-0.001,0.151; 4857P 7608 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4859P 7609 +0.0751056188123537,0.0751056188123537,-0.00100000000000001, 4859P 7610 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,97.6461411670594, 4859P 7611 +-134.62417677386,8.7470375,98.4671305298027,-134.624194664626, 4859P 7612 +8.7470375,97.6461411670594,-134.62417677386,7.10733749999999, 4859P 7613 +98.4671305298027,-134.624194664626,7.10733749999999, 4859P 7614 +-0.00100000000000178,0.0751056188123537,-0.00100000000000001, 4859P 7615 +0.151; 4859P 7616 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.056571543375649, 4861P 7617 +0.056571543375649,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4861P 7618 +97.6569286670568,-135.234442533103,8.7470375,97.6569286670568, 4861P 7619 +-134.613389508938,8.7470375,97.6569286670568,-135.234442533103, 4861P 7620 +7.10733749999999,97.6569286670568,-134.613389508938, 4861P 7621 +7.10733749999999,-0.001,0.056571543375649,-0.001,0.151; 4861P 7622 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888912455241, 4863P 7623 +1.29888912455241,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4863P 7624 +83.6451622359477,-135.223655033103,8.7470375,97.6677161670568, 4863P 7625 +-135.223655033103,8.7470375,83.6451622359477,-135.223655033103, 4863P 7626 +7.1073375,97.6677161670569,-135.223655033103,7.1073375,-0.001, 4863P 7627 +1.29888912455241,-0.001,0.151; 4863P 7628 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.056571543381518, 4865P 7629 +0.056571543381518,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4865P 7630 +83.655958602993,-134.613389508939,8.7470375,83.6559495792073, 4865P 7631 +-135.234442533102,8.7470375,83.655958602993,-134.613389508939, 4865P 7632 +7.1073375,83.6559495792073,-135.234442533102,7.1073375,-0.001, 4865P 7633 +0.056571543381518,-0.001,0.151; 4865P 7634 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000165,-0.00100000000000165, 4867P 7635 +0.0751056187947571,0.0751056187947571,-0.00100000000000001, 4867P 7636 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,82.8457565835041, 4867P 7637 +-134.624177008938,8.7470375,83.6667459462526,-134.624177008938, 4867P 7638 +8.7470375,82.8457565835041,-134.624177008938,7.1073375, 4867P 7639 +83.6667459462526,-134.624177008938,7.1073375, 4867P 7640 +-0.00100000000000165,0.0751056187947571,-0.00100000000000001, 4867P 7641 +0.151; 4867P 7642 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.1877621866862, 4869P 7643 +1.1877621866862,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4869P 7644 +82.8565440835042,-121.811192420061,8.7470375,82.8565440835042, 4869P 7645 +-134.634964508938,8.7470375,82.8565440835042,-121.811192420061, 4869P 7646 +7.1073375,82.8565440835042,-134.634964508938,7.1073375,-0.001, 4869P 7647 +1.1877621866862,-0.001,0.151; 4869P 7648 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4871P 7649 +0.0751056188123521,0.0751056188123521,-0.001,-0.001,0.151,0.151, 4871P 7650 +1.,1.,1.,1.,83.66674594625,-121.821997575749,8.7470375, 4871P 7651 +82.8457565835067,-121.821979684983,8.7470375,83.66674594625, 4871P 7652 +-121.821997575749,7.1073375,82.8457565835067,-121.821979684983, 4871P 7653 +7.1073375,-0.00100000000000178,0.0751056188123521,-0.001,0.151; 4871P 7654 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0564439671834303, 4873P 7655 +0.0564439671834303,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4873P 7656 +83.6559584462526,-121.213108044679,8.7470375,83.6559584462526, 4873P 7657 +-121.83278484067,8.7470375,83.6559584462526,-121.213108044679, 4873P 7658 +7.1073375,83.6559584462526,-121.83278484067,7.1073375,-0.001, 4873P 7659 +0.0564439671834303,-0.001,0.151; 4873P 7660 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4875P 7661 +1.29888831710916,1.29888831710916,-0.00100000000000009, 4875P 7662 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,78.6173473568005, 4875P 7663 +-121.223878110647,8.7470375,64.5948021359963,-121.223895558102, 4875P 7664 +8.7470375,78.6173473568005,-121.223878110647,7.1073375, 4875P 7665 +64.5948021359963,-121.223895558102,7.1073375, 4875P 7666 +-0.00100000000000002,1.29888831710916,-0.00100000000000009, 4875P 7667 +0.151; 4875P 7668 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4877P 7669 +0.0564439671834306,0.0564439671834306,-0.001,-0.001,0.151,0.151, 4877P 7670 +1.,1.,1.,1.,78.6065598568005,-121.832767420061,8.7470375, 4877P 7671 +78.6065598568005,-121.213090624069,8.7470375,78.6065598568005, 4877P 7672 +-121.832767420061,7.1073375,78.6065598568005,-121.213090624069, 4877P 7673 +7.1073375,-0.00100000000000178,0.0564439671834306,-0.001,0.151; 4877P 7674 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 4879P 7675 +0.0751056188123521,0.0751056188123521,-0.001,-0.001,0.151,0.151, 4879P 7676 +1.,1.,1.,1.,79.4167617195464,-121.821997575749,8.7470375, 4879P 7677 +78.5957723568031,-121.821979684983,8.7470375,79.4167617195464, 4879P 7678 +-121.821997575749,7.1073375,78.5957723568031,-121.821979684983, 4879P 7679 +7.1073375,-0.00100000000000266,0.0751056188123521,-0.001,0.151; 4879P 7680 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.1877621866862, 4881P 7681 +1.1877621866862,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4881P 7682 +79.4059742195489,-134.634981929548,8.7470375,79.4059742195489, 4881P 7683 +-121.81120984067,8.7470375,79.4059742195489,-134.634981929548, 4881P 7684 +7.1073375,79.4059742195489,-121.81120984067,7.1073375,-0.001, 4881P 7685 +1.1877621866862,-0.001,0.151; 4881P 7686 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 4883P 7687 +0.0751056188123522,0.0751056188123522,-0.00100000000000001, 4883P 7688 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,78.595772356803, 4883P 7689 +-134.62417677386,8.7470375,79.4167617195464,-134.624194664626, 4883P 7690 +8.7470375,78.595772356803,-134.62417677386,7.1073375, 4883P 7691 +79.4167617195464,-134.624194664626,7.1073375, 4883P 7692 +-0.00100000000000266,0.0751056188123522,-0.00100000000000001, 4883P 7693 +0.151; 4883P 7694 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.056571543375649, 4885P 7695 +0.056571543375649,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4885P 7696 +78.6065598568005,-135.234442533103,8.7470375,78.6065598568005, 4885P 7697 +-134.613389508938,8.7470375,78.6065598568005,-135.234442533103, 4885P 7698 +7.1073375,78.6065598568005,-134.613389508938,7.1073375,-0.001, 4885P 7699 +0.056571543375649,-0.001,0.151; 4885P 7700 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888831710816, 4887P 7701 +1.29888831710816,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4887P 7702 +64.5948021359963,-135.223655033103,8.7470375,78.6173473568005, 4887P 7703 +-135.223655033103,8.7470375,64.5948021359963,-135.223655033103, 4887P 7704 +7.1073375,78.6173473568005,-135.223655033103,7.1073375,-0.001, 4887P 7705 +1.29888831710816,-0.001,0.151; 4887P 7706 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565715433756525, 4889P 7707 +0.0565715433756525,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4889P 7708 +64.6055896359963,-134.613389508938,8.7470375,64.6055896359963, 4889P 7709 +-135.234442533103,8.7470375,64.6055896359963,-134.613389508938, 4889P 7710 +7.1073375,64.6055896359963,-135.234442533103,7.1073375,-0.001, 4889P 7711 +0.0565715433756525,-0.001,0.151; 4889P 7712 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000247,-0.00100000000000247, 4891P 7713 +0.0751056187947571,0.0751056187947571,-0.00100000000000001, 4891P 7714 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,63.7953877732478, 4891P 7715 +-134.624177008938,8.7470375,64.6163771359963,-134.624177008938, 4891P 7716 +8.7470375,63.7953877732478,-134.624177008938,7.1073375, 4891P 7717 +64.6163771359963,-134.624177008938,7.1073375, 4891P 7718 +-0.00100000000000247,0.0751056187947571,-0.00100000000000001, 4891P 7719 +0.151; 4891P 7720 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.1877621866862, 4893P 7721 +1.1877621866862,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4893P 7722 +63.8061752732478,-121.811192420061,8.7470375,63.8061752732478, 4893P 7723 +-134.634964508938,8.7470375,63.8061752732478,-121.811192420061, 4893P 7724 +7.1073375,63.8061752732478,-134.634964508938,7.1073375,-0.001, 4893P 7725 +1.1877621866862,-0.001,0.151; 4893P 7726 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 4895P 7727 +0.0751056188123521,0.0751056188123521,-0.001,-0.001,0.151,0.151, 4895P 7728 +1.,1.,1.,1.,64.6163771359937,-121.821997575749,8.7470375, 4895P 7729 +63.7953877732504,-121.821979684983,8.7470375,64.6163771359937, 4895P 7730 +-121.821997575749,7.1073375,63.7953877732504,-121.821979684983, 4895P 7731 +7.1073375,-0.00100000000000266,0.0751056188123521,-0.001,0.151; 4895P 7732 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0564439671834303, 4897P 7733 +0.0564439671834303,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4897P 7734 +64.6055896359963,-121.213108044679,8.7470375,64.6055896359963, 4897P 7735 +-121.83278484067,8.7470375,64.6055896359963,-121.213108044679, 4897P 7736 +7.1073375,64.6055896359963,-121.83278484067,7.1073375,-0.001, 4897P 7737 +0.0564439671834303,-0.001,0.151; 4897P 7738 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4899P 7739 +1.29879546101989,1.29879546101989,-0.001,-0.001,0.151,0.151,1., 4899P 7740 +1.,1.,1.,59.5669785465442,-121.223878110646,8.7470375, 4899P 7741 +45.545435010803,-121.223895558102,8.7470375,59.5669785465442, 4899P 7742 +-121.223878110646,7.1073375,45.545435010803,-121.223895558102, 4899P 7743 +7.1073375,-0.00100000000000002,1.29879546101989,-0.001,0.151; 4899P 7744 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4901P 7745 +0.0564439671834306,0.0564439671834306,-0.001,-0.001,0.151,0.151, 4901P 7746 +1.,1.,1.,1.,59.5561910465442,-121.832767420061,8.7470375, 4901P 7747 +59.5561910465442,-121.213090624069,8.7470375,59.5561910465442, 4901P 7748 +-121.832767420061,7.1073375,59.5561910465442,-121.213090624069, 4901P 7749 +7.1073375,-0.00100000000000178,0.0564439671834306,-0.001,0.151; 4901P 7750 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 4903P 7751 +0.0751056188123521,0.0751056188123521,-0.00100000000000011, 4903P 7752 +-0.00100000000000011,0.151,0.151,1.,1.,1.,1.,60.3663929092901, 4903P 7753 +-121.821997575749,8.7470375,59.5454035465468,-121.821979684983, 4903P 7754 +8.7470375,60.3663929092901,-121.821997575749,7.1073375, 4903P 7755 +59.5454035465468,-121.821979684983,7.1073375, 4903P 7756 +-0.00100000000000266,0.0751056188123521,-0.00100000000000011, 4903P 7757 +0.151; 4903P 7758 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.1877621866862, 4905P 7759 +1.1877621866862,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4905P 7760 +60.3556054092926,-134.634981929548,8.7470375,60.3556054092926, 4905P 7761 +-121.81120984067,8.7470375,60.3556054092926,-134.634981929548, 4905P 7762 +7.1073375,60.3556054092926,-121.81120984067,7.1073375,-0.001, 4905P 7763 +1.1877621866862,-0.001,0.151; 4905P 7764 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 4907P 7765 +0.0751056188123522,0.0751056188123522,-0.001,-0.001,0.151,0.151, 4907P 7766 +1.,1.,1.,1.,59.5454035465467,-134.62417677386,8.7470375, 4907P 7767 +60.3663929092901,-134.624194664626,8.7470375,59.5454035465467, 4907P 7768 +-134.62417677386,7.1073375,60.3663929092901,-134.624194664626, 4907P 7769 +7.1073375,-0.00100000000000266,0.0751056188123522,-0.001,0.151; 4907P 7770 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.056571543375649, 4909P 7771 +0.056571543375649,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4909P 7772 +59.5561910465442,-135.234442533103,8.7470375,59.5561910465442, 4909P 7773 +-134.613389508938,8.7470375,59.5561910465442,-135.234442533103, 4909P 7774 +7.1073375,59.5561910465442,-134.613389508938,7.1073375,-0.001, 4909P 7775 +0.056571543375649,-0.001,0.151; 4909P 7776 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29879546101888, 4911P 7777 +1.29879546101888,-0.00100000000000011,-0.00100000000000011, 4911P 7778 +0.151,0.151,1.,1.,1.,1.,45.545435010803,-135.223655033103, 4911P 7779 +8.7470375,59.5669785465442,-135.223655033103,8.7470375, 4911P 7780 +45.545435010803,-135.223655033103,7.1073375,59.5669785465442, 4911P 7781 +-135.223655033103,7.1073375,-0.001,1.29879546101888, 4911P 7782 +-0.00100000000000011,0.151; 4911P 7783 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565715433756525, 4913P 7784 +0.0565715433756525,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4913P 7785 +45.556222510803,-134.613389508938,8.7470375,45.556222510803, 4913P 7786 +-135.234442533103,8.7470375,45.556222510803,-134.613389508938, 4913P 7787 +7.1073375,45.556222510803,-135.234442533103,7.1073375,-0.001, 4913P 7788 +0.0565715433756525,-0.001,0.151; 4913P 7789 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0751621398925796, 4915P 7790 +0.0751621398925796,-0.00100000000000001,-0.00100000000000001, 4915P 7791 +0.151,0.151,1.,1.,1.,1.,44.7454109267118,-134.624177008938, 4915P 7792 +8.7470375,45.567010010803,-134.624177008938,8.7470375, 4915P 7793 +44.7454109267118,-134.624177008938,7.1073375,45.567010010803, 4915P 7794 +-134.624177008938,7.1073375,-0.001,0.0751621398925796, 4915P 7795 +-0.00100000000000001,0.151; 4915P 7796 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.1877621866862, 4917P 7797 +1.1877621866862,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4917P 7798 +44.7561984267118,-121.811192420061,8.7470375,44.7561984267118, 4917P 7799 +-134.634964508938,8.7470375,44.7561984267118,-121.811192420061, 4917P 7800 +7.1073375,44.7561984267118,-134.634964508938,7.1073375,-0.001, 4917P 7801 +1.1877621866862,-0.001,0.151; 4917P 7802 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4919P 7803 +0.0751621399101629,0.0751621399101629,-0.001,-0.001,0.151,0.151, 4919P 7804 +1.,1.,1.,1.,45.5670100108004,-121.821997575569,8.7470375, 4919P 7805 +44.7454109267143,-121.821979685162,8.7470375,45.5670100108004, 4919P 7806 +-121.821997575569,7.1073375,44.7454109267143,-121.821979685162, 4919P 7807 +7.1073375,-0.00100000000000002,0.0751621399101629,-0.001,0.151; 4919P 7808 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0564439671834303, 4921P 7809 +0.0564439671834303,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4921P 7810 +45.556222510803,-121.213108044679,8.7470375,45.556222510803, 4921P 7811 +-121.83278484067,8.7470375,45.556222510803,-121.213108044679, 4921P 7812 +7.1073375,45.556222510803,-121.83278484067,7.1073375,-0.001, 4921P 7813 +0.0564439671834303,-0.001,0.151; 4921P 7814 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4923P 7815 +1.29891011810403,1.29891011810403,-0.00100000000000011, 4923P 7816 +-0.00100000000000011,0.151,0.151,1.,1.,1.,1.,154.818861794198, 4923P 7817 +-102.173605113745,8.74703749999999,140.796081395161, 4923P 7818 +-102.173622561199,8.74703749999999,154.818861794198, 4923P 7819 +-102.173605113745,7.10733749999999,140.796081395161, 4923P 7820 +-102.173622561199,7.10733749999999,-0.00100000000000002, 4923P 7821 +1.29891011810403,-0.00100000000000011,0.151; 4923P 7822 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4925P 7823 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 4925P 7824 +1.,1.,1.,1.,154.808074294198,-102.783696445234,8.74703749999999, 4925P 7825 +154.808074294198,-102.162817627167,8.74703749999999, 4925P 7826 +154.808074294198,-102.783696445234,7.10733749999999, 4925P 7827 +154.808074294198,-102.162817627167,7.10733749999999, 4925P 7828 +-0.00100000000000178,0.0565553944905594,-0.001,0.151; 4925P 7829 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4927P 7830 +0.0750926997042859,0.0750926997042859,-0.001,-0.001,0.151,0.151, 4927P 7831 +1.,1.,1.,1.,155.618136792065,-102.772926600963,8.74703749999999, 4927P 7832 +154.7972867942,-102.772908710115,8.74703749999999, 4927P 7833 +155.618136792065,-102.772926600963,7.10733749999999, 4927P 7834 +154.7972867942,-102.772908710115,7.10733749999999, 4927P 7835 +-0.00100000000000002,0.0750926997042859,-0.001,0.151; 4927P 7836 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 4929P 7837 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4929P 7838 +155.607349292068,-115.584569567767,8.74703749999999, 4929P 7839 +155.607349292068,-102.762138865844,8.74703749999999, 4929P 7840 +155.607349292068,-115.584569567767,7.10733749999999, 4929P 7841 +155.607349292068,-102.762138865844,7.10733749999999,-0.001, 4929P 7842 +1.187637840271,-0.001,0.151; 4929P 7843 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4931P 7844 +0.0750926997042836,0.0750926997042836,-0.00100000000000001, 4931P 7845 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,154.7972867942, 4931P 7846 +-115.573764412038,8.74703749999999,155.618136792065, 4931P 7847 +-115.573782302886,8.74703749999999,154.7972867942, 4931P 7848 +-115.573764412038,7.10733749999999,155.618136792065, 4931P 7849 +-115.573782302886,7.10733749999999,-0.00100000000000178, 4931P 7850 +0.0750926997042836,-0.00100000000000001,0.151; 4931P 7851 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565747731526666, 4933P 7852 +0.0565747731526666,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4933P 7853 +154.808074294198,-116.184065012542,8.74703749999999, 4933P 7854 +154.808074294198,-115.562977147157,8.74703749999999, 4933P 7855 +154.808074294198,-116.184065012542,7.10733749999999, 4933P 7856 +154.808074294198,-115.562977147157,7.10733749999999,-0.001, 4933P 7857 +0.0565747731526666,-0.001,0.151; 4933P 7858 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.2989097143809, 4935P 7859 +1.2989097143809,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4935P 7860 +140.796085750314,-116.173277512542,8.74703749999999, 4935P 7861 +154.818861794198,-116.173277512542,8.74703749999999, 4935P 7862 +140.796085750314,-116.173277512542,7.10733749999999, 4935P 7863 +154.818861794198,-116.173277512542,7.10733749999999,-0.001, 4935P 7864 +1.2989097143809,-0.001,0.151; 4935P 7865 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4937P 7866 +0.0565747731541363,0.0565747731541363,-0.001,-0.001,0.151,0.151, 4937P 7867 +1.,1.,1.,1.,140.806868816796,-115.562977147158,8.74703749999999, 4937P 7868 +140.80687332868,-116.184065012541,8.74703749999999, 4937P 7869 +140.806868816796,-115.562977147158,7.10733749999999, 4937P 7870 +140.80687332868,-116.184065012541,7.10733749999999, 4937P 7871 +-0.00100000000000178,0.0565747731541363,-0.001,0.151; 4937P 7872 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0750874512990324, 4939P 7873 +0.0750874512990324,-0.00100000000000011,-0.00100000000000011, 4939P 7874 +0.151,0.151,1.,1.,1.,1.,139.996863014273,-115.573764647157, 4939P 7875 +8.74703749999999,140.817656395161,-115.573764647157, 4939P 7876 +8.74703749999999,139.996863014273,-115.573764647157, 4939P 7877 +7.10733749999999,140.817656395161,-115.573764647157, 4939P 7878 +7.10733749999999,-0.001,0.0750874512990324,-0.00100000000000011, 4939P 7879 +0.151; 4939P 7880 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18763784027106, 4941P 7881 +1.18763784027106,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4941P 7882 +140.007654873096,-102.762121445234,8.74703749999999, 4941P 7883 +140.007650510603,-115.584552147157,8.74703749999999, 4941P 7884 +140.007654873096,-102.762121445234,7.10733749999999, 4941P 7885 +140.007650510603,-115.584552147157,7.10733749999999,-0.001, 4941P 7886 +1.18763784027106,-0.001,0.151; 4941P 7887 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4943P 7888 +0.075087451316632,0.075087451316632,-0.001,-0.001,0.151,0.151, 4943P 7889 +1.,1.,1.,1.,140.817660750311,-102.772926600979,8.74703749999999, 4943P 7890 +139.996867369428,-102.772908710098,8.74703749999999, 4943P 7891 +140.817660750311,-102.772926600979,7.10733749999999, 4943P 7892 +139.996867369428,-102.772908710098,7.10733749999999, 4943P 7893 +-0.00100000000000002,0.075087451316632,-0.001,0.151; 4943P 7894 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944920294, 4945P 7895 +0.0565553944920294,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4945P 7896 +140.806868816768,-102.162835047777,8.74703749999999, 4945P 7897 +140.806873328707,-102.783713865843,8.74703749999999, 4945P 7898 +140.806868816768,-102.162835047777,7.10733749999999, 4945P 7899 +140.806873328707,-102.783713865843,7.10733749999999,-0.001, 4945P 7900 +0.0565553944920294,-0.001,0.151; 4945P 7901 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4947P 7902 +1.29888872083129,1.29888872083129,-0.00100000000000009, 4947P 7903 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,135.768458142722, 4947P 7904 +-102.173605113745,8.74703749999999,121.745908566765, 4947P 7905 +-102.173622561199,8.74703749999999,135.768458142722, 4947P 7906 +-102.173605113745,7.10733749999999,121.745908566765, 4947P 7907 +-102.173622561199,7.10733749999999,-0.00100000000000002, 4947P 7908 +1.29888872083129,-0.00100000000000009,0.151; 4947P 7909 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.069153139750164, 4949P 7910 +0.069153139750164,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4949P 7911 +135.757670642722,-102.919594622222,8.74703749999999, 4949P 7912 +135.757670642722,-102.162817627167,8.74703749999999, 4949P 7913 +135.757670642722,-102.919594622222,7.10733749999999, 4949P 7914 +135.757670642722,-102.162817627167,7.10733749999999,-0.001, 4949P 7915 +0.069153139750164,-0.001,0.151; 4949P 7916 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4951P 7917 +0.0750967369079582,0.0750967369079582,-0.001,-0.001,0.151,0.151, 4951P 7918 +1.,1.,1.,1.,136.567776692117,-102.908807122222,8.74703749999999, 4951P 7919 +135.746883142722,-102.908807122222,8.74703749999999, 4951P 7920 +136.567776692117,-102.908807122222,7.10733749999999, 4951P 7921 +135.746883142722,-102.908807122222,7.10733749999999, 4951P 7922 +-0.00100000000000002,0.0750967369079582,-0.001,0.151; 4951P 7923 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 4953P 7924 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4953P 7925 +136.556989192117,-115.720450324145,8.74703749999999, 4953P 7926 +136.556989192117,-102.898019622222,8.74703749999999, 4953P 7927 +136.556989192117,-115.720450324145,7.10733749999999, 4953P 7928 +136.556989192117,-102.898019622222,7.10733749999999,-0.001, 4953P 7929 +1.187637840271,-0.001,0.151; 4953P 7930 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0750967369079582, 4955P 7931 +0.0750967369079582,-0.00100000000000001,-0.00100000000000001, 4955P 7932 +0.151,0.151,1.,1.,1.,1.,135.746883142722,-115.709662824145, 4955P 7933 +8.74703749999999,136.567776692117,-115.709662824145, 4955P 7934 +8.74703749999999,135.746883142722,-115.709662824145, 4955P 7935 +7.10733749999999,136.567776692117,-115.709662824145, 4955P 7936 +7.10733749999999,-0.001,0.0750967369079582,-0.00100000000000001, 4955P 7937 +0.151; 4955P 7938 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0441191380818669, 4957P 7939 +0.0441191380818669,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4957P 7940 +135.757670642722,-116.185598026203,8.74703749999999, 4957P 7941 +135.757670642722,-115.698875324145,8.74703749999999, 4957P 7942 +135.757670642722,-116.185598026203,7.10733749999999, 4957P 7943 +135.757670642722,-115.698875324145,7.10733749999999,-0.001, 4957P 7944 +0.0441191380818669,-0.001,0.151; 4957P 7945 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888872083028, 4959P 7946 +1.29888872083028,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4959P 7947 +121.745908566765,-116.174810526203,8.74703749999999, 4959P 7948 +135.768458142722,-116.174810526203,8.74703749999999, 4959P 7949 +121.745908566765,-116.174810526203,7.10733749999999, 4959P 7950 +135.768458142722,-116.174810526203,7.10733749999999,-0.001, 4959P 7951 +1.29888872083028,-0.001,0.151; 4959P 7952 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4961P 7953 +0.0565747731526699,0.0565747731526699,-0.001,-0.001,0.151,0.151, 4961P 7954 +1.,1.,1.,1.,121.756696066765,-115.564510160819,8.74703749999999, 4961P 7955 +121.756696066765,-116.185598026203,8.74703749999999, 4961P 7956 +121.756696066765,-115.564510160819,7.10733749999999, 4961P 7957 +121.756696066765,-116.185598026203,7.10733749999999, 4961P 7958 +-0.00100000000000178,0.0565747731526699,-0.001,0.151; 4961P 7959 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0751056187947582, 4963P 7960 +0.0751056187947582,-0.00100000000000001,-0.00100000000000001, 4963P 7961 +0.151,0.151,1.,1.,1.,1.,120.946494204017,-115.575297660819, 4963P 7962 +8.74703749999999,121.767483566765,-115.575297660819, 4963P 7963 +8.74703749999999,120.946494204017,-115.575297660819, 4963P 7964 +7.10733749999999,121.767483566765,-115.575297660819, 4963P 7965 +7.10733749999999,-0.001,0.0751056187947582,-0.00100000000000001, 4963P 7966 +0.151; 4963P 7967 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.1877799504598, 4965P 7968 +1.1877799504598,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4965P 7969 +120.957281704017,-102.762121445234,8.74703749999999, 4965P 7970 +120.957281704017,-115.586085160819,8.74703749999999, 4965P 7971 +120.957281704017,-102.762121445234,7.10733749999999, 4965P 7972 +120.957281704017,-115.586085160819,7.10733749999999,-0.001, 4965P 7973 +1.1877799504598,-0.001,0.151; 4965P 7974 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4967P 7975 +0.0751056188123538,0.0751056188123538,-0.001,-0.001,0.151,0.151, 4967P 7976 +1.,1.,1.,1.,121.767483566763,-102.772926600922,8.74703749999999, 4967P 7977 +120.946494204019,-102.772908710156,8.74703749999999, 4967P 7978 +121.767483566763,-102.772926600922,7.10733749999999, 4967P 7979 +120.946494204019,-102.772908710156,7.10733749999999, 4967P 7980 +-0.00100000000000002,0.0751056188123538,-0.001,0.151; 4967P 7981 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944905629, 4969P 7982 +0.0565553944905629,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4969P 7983 +121.756696066765,-102.162835047777,8.74703749999999, 4969P 7984 +121.756696066765,-102.783713865844,8.74703749999999, 4969P 7985 +121.756696066765,-102.162835047777,7.10733749999999, 4969P 7986 +121.756696066765,-102.783713865844,7.10733749999999,-0.001, 4969P 7987 +0.0565553944905629,-0.001,0.151; 4969P 7988 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4971P 7989 +1.29888831710916,1.29888831710916,-0.00100000000000009, 4971P 7990 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,116.718084977313, 4971P 7991 +-102.173605113745,8.74703749999999,102.695539756509, 4971P 7992 +-102.173622561199,8.7470375,116.718084977313,-102.173605113745, 4971P 7993 +7.10733749999999,102.695539756509,-102.173622561199, 4971P 7994 +7.10733749999999,-0.00100000000000002,1.29888831710916, 4971P 7995 +-0.00100000000000009,0.151; 4971P 7996 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4973P 7997 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 4973P 7998 +1.,1.,1.,1.,116.707297477313,-102.783696445234,8.74703749999999, 4973P 7999 +116.707297477313,-102.162817627167,8.74703749999999, 4973P 8000 +116.707297477313,-102.783696445234,7.10733749999999, 4973P 8001 +116.707297477313,-102.162817627167,7.10733749999999, 4973P 8002 +-0.00100000000000178,0.0565553944905594,-0.001,0.151; 4973P 8003 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4975P 8004 +0.0751056188123572,0.0751056188123572,-0.001,-0.001,0.151,0.151, 4975P 8005 +1.,1.,1.,1.,117.517499340059,-102.772926600922,8.74703749999999, 4975P 8006 +116.696509977316,-102.772908710156,8.74703749999999, 4975P 8007 +117.517499340059,-102.772926600922,7.10733749999999, 4975P 8008 +116.696509977316,-102.772908710156,7.10733749999999, 4975P 8009 +-0.00100000000000002,0.0751056188123572,-0.001,0.151; 4975P 8010 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18763784027127, 4977P 8011 +1.18763784027127,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4977P 8012 +117.506720557707,-115.584569567767,8.74703749999999, 4977P 8013 +117.506711832721,-102.762138865844,8.74703749999999, 4977P 8014 +117.506720557707,-115.584569567767,7.10733749999999, 4977P 8015 +117.506711832721,-102.762138865844,7.10733749999999,-0.001, 4977P 8016 +1.18763784027127,-0.001,0.151; 4977P 8017 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0751056188123554, 4979P 8018 +0.0751056188123554,-0.00100000000000001,-0.00100000000000001, 4979P 8019 +0.151,0.151,1.,1.,1.,1.,116.696518687621,-115.573764412079, 4979P 8020 +8.74703749999999,117.517508050364,-115.573782302845, 4979P 8021 +8.74703749999999,116.696518687621,-115.573764412079, 4979P 8022 +7.10733749999999,117.517508050364,-115.573782302845, 4979P 8023 +7.10733749999999,-0.001,0.0751056188123554,-0.00100000000000001, 4979P 8024 +0.151; 4979P 8025 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565747731585322, 4981P 8026 +0.0565747731585322,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4981P 8027 +116.707297320582,-116.184065012541,8.74703749999999, 4981P 8028 +116.707306344349,-115.562977147158,8.74703749999999, 4981P 8029 +116.707297320582,-116.184065012541,7.10733749999999, 4981P 8030 +116.707306344349,-115.562977147158,7.10733749999999,-0.001, 4981P 8031 +0.0565747731585322,-0.001,0.151; 4981P 8032 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888831710816, 4983P 8033 +1.29888831710816,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4983P 8034 +102.695539756509,-116.173277512542,8.7470375,116.718084977313, 4983P 8035 +-116.173277512542,8.74703749999999,102.695539756509, 4983P 8036 +-116.173277512542,7.10733749999999,116.718084977313, 4983P 8037 +-116.173277512542,7.10733749999999,-0.001,1.29888831710816, 4983P 8038 +-0.001,0.151; 4983P 8039 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4985P 8040 +0.0565747731526699,0.0565747731526699,-0.001,-0.001,0.151,0.151, 4985P 8041 +1.,1.,1.,1.,102.706327256509,-115.562977147157,8.7470375, 4985P 8042 +102.706327256509,-116.184065012542,8.7470375,102.706327256509, 4985P 8043 +-115.562977147157,7.10733749999999,102.706327256509, 4985P 8044 +-116.184065012542,7.10733749999999,-0.00100000000000178, 4985P 8045 +0.0565747731526699,-0.001,0.151; 4985P 8046 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4987P 8047 +0.0751056187947571,0.0751056187947571,-0.00100000000000001, 4987P 8048 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,101.89612539376, 4987P 8049 +-115.573764647157,8.7470375,102.717114756509,-115.573764647157, 4987P 8050 +8.7470375,101.89612539376,-115.573764647157,7.10733749999999, 4987P 8051 +102.717114756509,-115.573764647157,7.10733749999999, 4987P 8052 +-0.00100000000000178,0.0751056187947571,-0.00100000000000001, 4987P 8053 +0.151; 4987P 8054 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 4989P 8055 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4989P 8056 +101.90691289376,-102.762121445234,8.7470375,101.90691289376, 4989P 8057 +-115.584552147157,8.7470375,101.90691289376,-102.762121445234, 4989P 8058 +7.10733749999999,101.90691289376,-115.584552147157, 4989P 8059 +7.10733749999999,-0.001,1.187637840271,-0.001,0.151; 4989P 8060 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4991P 8061 +0.0751056188123521,0.0751056188123521,-0.001,-0.001,0.151,0.151, 4991P 8062 +1.,1.,1.,1.,102.717114756506,-102.772926600922,8.7470375, 4991P 8063 +101.896125393763,-102.772908710156,8.7470375,102.717114756506, 4991P 8064 +-102.772926600922,7.10733749999999,101.896125393763, 4991P 8065 +-102.772908710156,7.10733749999999,-0.00100000000000178, 4991P 8066 +0.0751056188123521,-0.001,0.151; 4991P 8067 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944905629, 4993P 8068 +0.0565553944905629,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 4993P 8069 +102.706327256509,-102.162835047777,8.7470375,102.706327256509, 4993P 8070 +-102.783713865844,8.7470375,102.706327256509,-102.162835047777, 4993P 8071 +7.10733749999999,102.706327256509,-102.783713865844, 4993P 8072 +7.10733749999999,-0.001,0.0565553944905629,-0.001,0.151; 4993P 8073 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 4995P 8074 +1.29888831710916,1.29888831710916,-0.00100000000000009, 4995P 8075 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,97.6677161670568, 4995P 8076 +-102.173605113745,8.7470375,83.6451709462526,-102.173622561199, 4995P 8077 +8.7470375,97.6677161670568,-102.173605113745,7.10733749999999, 4995P 8078 +83.6451709462526,-102.173622561199,7.1073375, 4995P 8079 +-0.00100000000000002,1.29888831710916,-0.00100000000000009, 4995P 8080 +0.151; 4995P 8081 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4997P 8082 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 4997P 8083 +1.,1.,1.,1.,97.6569286670568,-102.783696445234,8.7470375, 4997P 8084 +97.6569286670568,-102.162817627167,8.7470375,97.6569286670568, 4997P 8085 +-102.783696445234,7.10733749999999,97.6569286670568, 4997P 8086 +-102.162817627167,7.10733749999999,-0.00100000000000178, 4997P 8087 +0.0565553944905594,-0.001,0.151; 4997P 8088 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 4999P 8089 +0.0751056188123521,0.0751056188123521,-0.001,-0.001,0.151,0.151, 4999P 8090 +1.,1.,1.,1.,98.4671305298027,-102.772926600922,8.7470375, 4999P 8091 +97.6461411670594,-102.772908710156,8.7470375,98.4671305298027, 4999P 8092 +-102.772926600922,7.10733749999999,97.6461411670594, 4999P 8093 +-102.772908710156,7.10733749999999,-0.00100000000000178, 4999P 8094 +0.0751056188123521,-0.001,0.151; 4999P 8095 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5001P 8096 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5001P 8097 +98.4563430298053,-115.584569567767,8.7470375,98.4563430298053, 5001P 8098 +-102.762138865844,8.7470375,98.4563430298053,-115.584569567767, 5001P 8099 +7.10733749999999,98.4563430298053,-102.762138865844, 5001P 8100 +7.10733749999999,-0.001,1.187637840271,-0.001,0.151; 5001P 8101 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5003P 8102 +0.0751056188123522,0.0751056188123522,-0.00100000000000001, 5003P 8103 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,97.6461411670594, 5003P 8104 +-115.573764412079,8.7470375,98.4671305298027,-115.573782302845, 5003P 8105 +8.7470375,97.6461411670594,-115.573764412079,7.10733749999999, 5003P 8106 +98.4671305298027,-115.573782302845,7.10733749999999, 5003P 8107 +-0.00100000000000178,0.0751056188123522,-0.00100000000000001, 5003P 8108 +0.151; 5003P 8109 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565747731526666, 5005P 8110 +0.0565747731526666,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5005P 8111 +97.6569286670568,-116.184065012542,8.7470375,97.6569286670568, 5005P 8112 +-115.562977147157,8.7470375,97.6569286670568,-116.184065012542, 5005P 8113 +7.10733749999999,97.6569286670568,-115.562977147157, 5005P 8114 +7.10733749999999,-0.001,0.0565747731526666,-0.001,0.151; 5005P 8115 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888912455241, 5007P 8116 +1.29888912455241,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5007P 8117 +83.6451622359477,-116.173277512542,8.7470375,97.6677161670568, 5007P 8118 +-116.173277512542,8.7470375,83.6451622359477,-116.173277512542, 5007P 8119 +7.1073375,97.6677161670569,-116.173277512542,7.1073375,-0.001, 5007P 8120 +1.29888912455241,-0.001,0.151; 5007P 8121 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5009P 8122 +0.0565747731585355,0.0565747731585355,-0.001,-0.001,0.151,0.151, 5009P 8123 +1.,1.,1.,1.,83.6559586029839,-115.562977147158,8.7470375, 5009P 8124 +83.6559495792164,-116.184065012541,8.7470375,83.6559586029839, 5009P 8125 +-115.562977147158,7.1073375,83.6559495792164,-116.184065012541, 5009P 8126 +7.1073375,-0.00100000000000178,0.0565747731585355,-0.001,0.151; 5009P 8127 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000165,-0.00100000000000165, 5011P 8128 +0.0751056187947571,0.0751056187947571,-0.00100000000000001, 5011P 8129 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,82.8457565835041, 5011P 8130 +-115.573764647157,8.7470375,83.6667459462526,-115.573764647157, 5011P 8131 +8.7470375,82.8457565835041,-115.573764647157,7.1073375, 5011P 8132 +83.6667459462526,-115.573764647157,7.1073375, 5011P 8133 +-0.00100000000000165,0.0751056187947571,-0.00100000000000001, 5011P 8134 +0.151; 5011P 8135 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5013P 8136 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5013P 8137 +82.8565440835042,-102.762121445234,8.7470375,82.8565440835042, 5013P 8138 +-115.584552147157,8.7470375,82.8565440835042,-102.762121445234, 5013P 8139 +7.1073375,82.8565440835042,-115.584552147157,7.1073375,-0.001, 5013P 8140 +1.187637840271,-0.001,0.151; 5013P 8141 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5015P 8142 +0.0751056188123521,0.0751056188123521,-0.001,-0.001,0.151,0.151, 5015P 8143 +1.,1.,1.,1.,83.66674594625,-102.772926600922,8.7470375, 5015P 8144 +82.8457565835067,-102.772908710156,8.7470375,83.66674594625, 5015P 8145 +-102.772926600922,7.1073375,82.8457565835067,-102.772908710156, 5015P 8146 +7.1073375,-0.00100000000000178,0.0751056188123521,-0.001,0.151; 5015P 8147 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944905629, 5017P 8148 +0.0565553944905629,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5017P 8149 +83.6559584462526,-102.162835047777,8.7470375,83.6559584462526, 5017P 8150 +-102.783713865844,8.7470375,83.6559584462526,-102.162835047777, 5017P 8151 +7.1073375,83.6559584462526,-102.783713865844,7.1073375,-0.001, 5017P 8152 +0.0565553944905629,-0.001,0.151; 5017P 8153 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5019P 8154 +1.29888831710916,1.29888831710916,-0.00100000000000009, 5019P 8155 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,78.6173473568005, 5019P 8156 +-102.173605113745,8.7470375,64.5948021359963,-102.173622561199, 5019P 8157 +8.7470375,78.6173473568005,-102.173605113745,7.1073375, 5019P 8158 +64.5948021359963,-102.173622561199,7.1073375, 5019P 8159 +-0.00100000000000002,1.29888831710916,-0.00100000000000009, 5019P 8160 +0.151; 5019P 8161 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5021P 8162 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5021P 8163 +1.,1.,1.,1.,78.6065598568005,-102.783696445234,8.7470375, 5021P 8164 +78.6065598568005,-102.162817627167,8.7470375,78.6065598568005, 5021P 8165 +-102.783696445234,7.1073375,78.6065598568005,-102.162817627167, 5021P 8166 +7.1073375,-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5021P 8167 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 5023P 8168 +0.0751056188123528,0.0751056188123528,-0.001,-0.001,0.151,0.151, 5023P 8169 +1.,1.,1.,1.,79.4167617195464,-102.772926600922,8.7470375, 5023P 8170 +78.5957723568031,-102.772908710156,8.7470375,79.4167617195464, 5023P 8171 +-102.772926600922,7.1073375,78.5957723568031,-102.772908710156, 5023P 8172 +7.1073375,-0.00100000000000266,0.0751056188123528,-0.001,0.151; 5023P 8173 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5025P 8174 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5025P 8175 +79.4059742195489,-115.584569567767,8.7470375,79.4059742195489, 5025P 8176 +-102.762138865844,8.7470375,79.4059742195489,-115.584569567767, 5025P 8177 +7.1073375,79.4059742195489,-102.762138865844,7.1073375,-0.001, 5025P 8178 +1.187637840271,-0.001,0.151; 5025P 8179 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 5027P 8180 +0.0751056188123522,0.0751056188123522,-0.00100000000000001, 5027P 8181 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,78.595772356803, 5027P 8182 +-115.573764412079,8.7470375,79.4167617195464,-115.573782302845, 5027P 8183 +8.7470375,78.595772356803,-115.573764412079,7.1073375, 5027P 8184 +79.4167617195464,-115.573782302845,7.1073375, 5027P 8185 +-0.00100000000000266,0.0751056188123522,-0.00100000000000001, 5027P 8186 +0.151; 5027P 8187 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565747731526666, 5029P 8188 +0.0565747731526666,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5029P 8189 +78.6065598568005,-116.184065012542,8.7470375,78.6065598568005, 5029P 8190 +-115.562977147157,8.7470375,78.6065598568005,-116.184065012542, 5029P 8191 +7.1073375,78.6065598568005,-115.562977147157,7.1073375,-0.001, 5029P 8192 +0.0565747731526666,-0.001,0.151; 5029P 8193 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888831710816, 5031P 8194 +1.29888831710816,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5031P 8195 +64.5948021359963,-116.173277512542,8.7470375,78.6173473568005, 5031P 8196 +-116.173277512542,8.7470375,64.5948021359963,-116.173277512542, 5031P 8197 +7.1073375,78.6173473568005,-116.173277512542,7.1073375,-0.001, 5031P 8198 +1.29888831710816,-0.001,0.151; 5031P 8199 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5033P 8200 +0.0565747731526699,0.0565747731526699,-0.001,-0.001,0.151,0.151, 5033P 8201 +1.,1.,1.,1.,64.6055896359963,-115.562977147157,8.7470375, 5033P 8202 +64.6055896359963,-116.184065012542,8.7470375,64.6055896359963, 5033P 8203 +-115.562977147157,7.1073375,64.6055896359963,-116.184065012542, 5033P 8204 +7.1073375,-0.00100000000000178,0.0565747731526699,-0.001,0.151; 5033P 8205 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000247,-0.00100000000000247, 5035P 8206 +0.0751056187947571,0.0751056187947571,-0.00100000000000001, 5035P 8207 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,63.7953877732478, 5035P 8208 +-115.573764647157,8.7470375,64.6163771359963,-115.573764647157, 5035P 8209 +8.7470375,63.7953877732478,-115.573764647157,7.1073375, 5035P 8210 +64.6163771359963,-115.573764647157,7.1073375, 5035P 8211 +-0.00100000000000247,0.0751056187947571,-0.00100000000000001, 5035P 8212 +0.151; 5035P 8213 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5037P 8214 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5037P 8215 +63.8061752732478,-102.762121445234,8.7470375,63.8061752732478, 5037P 8216 +-115.584552147157,8.7470375,63.8061752732478,-102.762121445234, 5037P 8217 +7.1073375,63.8061752732478,-115.584552147157,7.1073375,-0.001, 5037P 8218 +1.187637840271,-0.001,0.151; 5037P 8219 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 5039P 8220 +0.0751056188123521,0.0751056188123521,-0.001,-0.001,0.151,0.151, 5039P 8221 +1.,1.,1.,1.,64.6163771359937,-102.772926600922,8.7470375, 5039P 8222 +63.7953877732504,-102.772908710156,8.7470375,64.6163771359937, 5039P 8223 +-102.772926600922,7.1073375,63.7953877732504,-102.772908710156, 5039P 8224 +7.1073375,-0.00100000000000266,0.0751056188123521,-0.001,0.151; 5039P 8225 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944905629, 5041P 8226 +0.0565553944905629,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5041P 8227 +64.6055896359963,-102.162835047777,8.7470375,64.6055896359963, 5041P 8228 +-102.783713865844,8.7470375,64.6055896359963,-102.162835047777, 5041P 8229 +7.1073375,64.6055896359963,-102.783713865844,7.1073375,-0.001, 5041P 8230 +0.0565553944905629,-0.001,0.151; 5041P 8231 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5043P 8232 +1.29879546101989,1.29879546101989,-0.001,-0.001,0.151,0.151,1., 5043P 8233 +1.,1.,1.,59.5669785465442,-102.173605113744,8.7470375, 5043P 8234 +45.545435010803,-102.1736225612,8.7470375,59.5669785465442, 5043P 8235 +-102.173605113744,7.1073375,45.545435010803,-102.1736225612, 5043P 8236 +7.1073375,-0.00100000000000002,1.29879546101989,-0.001,0.151; 5043P 8237 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5045P 8238 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5045P 8239 +1.,1.,1.,1.,59.5561910465442,-102.783696445234,8.7470375, 5045P 8240 +59.5561910465442,-102.162817627167,8.7470375,59.5561910465442, 5045P 8241 +-102.783696445234,7.1073375,59.5561910465442,-102.162817627167, 5045P 8242 +7.1073375,-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5045P 8243 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000249,-0.00100000000000249, 5047P 8244 +0.0751056188123528,0.0751056188123528,-0.00100000000000011, 5047P 8245 +-0.00100000000000011,0.151,0.151,1.,1.,1.,1.,60.3663929092901, 5047P 8246 +-102.772926600922,8.7470375,59.5454035465467,-102.772908710156, 5047P 8247 +8.7470375,60.3663929092901,-102.772926600922,7.1073375, 5047P 8248 +59.5454035465467,-102.772908710156,7.1073375, 5047P 8249 +-0.00100000000000249,0.0751056188123528,-0.00100000000000011, 5047P 8250 +0.151; 5047P 8251 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5049P 8252 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5049P 8253 +60.3556054092926,-115.584569567767,8.7470375,60.3556054092926, 5049P 8254 +-102.762138865844,8.7470375,60.3556054092926,-115.584569567767, 5049P 8255 +7.1073375,60.3556054092926,-102.762138865844,7.1073375,-0.001, 5049P 8256 +1.187637840271,-0.001,0.151; 5049P 8257 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000247,-0.00100000000000247, 5051P 8258 +0.0751056188123528,0.0751056188123528,-0.001,-0.001,0.151,0.151, 5051P 8259 +1.,1.,1.,1.,59.5454035465467,-115.573764412079,8.7470375, 5051P 8260 +60.3663929092901,-115.573782302845,8.7470375,59.5454035465467, 5051P 8261 +-115.573764412079,7.1073375,60.3663929092901,-115.573782302845, 5051P 8262 +7.1073375,-0.00100000000000247,0.0751056188123528,-0.001,0.151; 5051P 8263 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565747731526666, 5053P 8264 +0.0565747731526666,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5053P 8265 +59.5561910465442,-116.184065012542,8.7470375,59.5561910465442, 5053P 8266 +-115.562977147157,8.7470375,59.5561910465442,-116.184065012542, 5053P 8267 +7.1073375,59.5561910465442,-115.562977147157,7.1073375,-0.001, 5053P 8268 +0.0565747731526666,-0.001,0.151; 5053P 8269 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29879546101888, 5055P 8270 +1.29879546101888,-0.00100000000000011,-0.00100000000000011, 5055P 8271 +0.151,0.151,1.,1.,1.,1.,45.545435010803,-116.173277512542, 5055P 8272 +8.7470375,59.5669785465442,-116.173277512542,8.7470375, 5055P 8273 +45.545435010803,-116.173277512542,7.1073375,59.5669785465442, 5055P 8274 +-116.173277512542,7.1073375,-0.001,1.29879546101888, 5055P 8275 +-0.00100000000000011,0.151; 5055P 8276 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5057P 8277 +0.0565747731526699,0.0565747731526699,-0.001,-0.001,0.151,0.151, 5057P 8278 +1.,1.,1.,1.,45.556222510803,-115.562977147157,8.7470375, 5057P 8279 +45.556222510803,-116.184065012542,8.7470375,45.556222510803, 5057P 8280 +-115.562977147157,7.1073375,45.556222510803,-116.184065012542, 5057P 8281 +7.1073375,-0.00100000000000178,0.0565747731526699,-0.001,0.151; 5057P 8282 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0751621398925796, 5059P 8283 +0.0751621398925796,-0.00100000000000001,-0.00100000000000001, 5059P 8284 +0.151,0.151,1.,1.,1.,1.,44.7454109267118,-115.573764647157, 5059P 8285 +8.7470375,45.567010010803,-115.573764647157,8.7470375, 5059P 8286 +44.7454109267118,-115.573764647157,7.1073375,45.567010010803, 5059P 8287 +-115.573764647157,7.1073375,-0.001,0.0751621398925796, 5059P 8288 +-0.00100000000000001,0.151; 5059P 8289 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5061P 8290 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5061P 8291 +44.7561984267118,-102.762121445234,8.7470375,44.7561984267118, 5061P 8292 +-115.584552147157,8.7470375,44.7561984267118,-102.762121445234, 5061P 8293 +7.1073375,44.7561984267118,-115.584552147157,7.1073375,-0.001, 5061P 8294 +1.187637840271,-0.001,0.151; 5061P 8295 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5063P 8296 +0.075162139910162,0.075162139910162,-0.001,-0.001,0.151,0.151, 5063P 8297 +1.,1.,1.,1.,45.5670100108004,-102.772926600743,8.7470375, 5063P 8298 +44.7454109267143,-102.772908710335,8.7470375,45.5670100108004, 5063P 8299 +-102.772926600743,7.1073375,44.7454109267143,-102.772908710335, 5063P 8300 +7.1073375,-0.00100000000000002,0.075162139910162,-0.001,0.151; 5063P 8301 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944905629, 5065P 8302 +0.0565553944905629,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5065P 8303 +45.556222510803,-102.162835047777,8.7470375,45.556222510803, 5065P 8304 +-102.783713865844,8.7470375,45.556222510803,-102.162835047777, 5065P 8305 +7.1073375,45.556222510803,-102.783713865844,7.1073375,-0.001, 5065P 8306 +0.0565553944905629,-0.001,0.151; 5065P 8307 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5067P 8308 +1.29891011810303,1.29891011810303,-0.00100000000000011, 5067P 8309 +-0.00100000000000011,0.151,0.151,1.,1.,1.,1.,154.818861794198, 5067P 8310 +-83.1232450272156,8.74703749999999,140.796081395161, 5067P 8311 +-83.1232450272155,8.74703749999999,154.818861794198, 5067P 8312 +-83.1232450272156,7.10733749999999,140.796081395161, 5067P 8313 +-83.1232450272155,7.10733749999999,-0.00100000000000002, 5067P 8314 +1.29891011810303,-0.00100000000000011,0.151; 5067P 8315 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5069P 8316 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5069P 8317 +1.,1.,1.,1.,154.808074294198,-83.7333363452825,8.74703749999999, 5069P 8318 +154.808074294198,-83.1124575272156,8.74703749999999, 5069P 8319 +154.808074294198,-83.7333363452825,7.10733749999999, 5069P 8320 +154.808074294198,-83.1124575272156,7.10733749999999, 5069P 8321 +-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5069P 8322 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5071P 8323 +0.0750926996866866,0.0750926996866866,-0.001,-0.001,0.151,0.151, 5071P 8324 +1.,1.,1.,1.,155.618136792068,-83.7225488452825,8.74703749999999, 5071P 8325 +154.797286794198,-83.7225488452825,8.74703749999999, 5071P 8326 +155.618136792068,-83.7225488452825,7.10733749999999, 5071P 8327 +154.797286794198,-83.7225488452825,7.10733749999999, 5071P 8328 +-0.00100000000000002,0.0750926996866866,-0.001,0.151; 5071P 8329 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5073P 8330 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5073P 8331 +155.607349292068,-96.5341920472058,8.74703749999999, 5073P 8332 +155.607349292068,-83.7117613452824,8.74703749999999, 5073P 8333 +155.607349292068,-96.5341920472058,7.10733749999999, 5073P 8334 +155.607349292068,-83.7117613452824,7.10733749999999,-0.001, 5073P 8335 +1.187637840271,-0.001,0.151; 5073P 8336 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5075P 8337 +0.0750926996866857,0.0750926996866857,-0.00100000000000001, 5075P 8338 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,154.797286794198, 5075P 8339 +-96.5234045472058,8.74703749999999,155.618136792068, 5075P 8340 +-96.5234045472058,8.74703749999999,154.797286794198, 5075P 8341 +-96.5234045472058,7.10733749999999,155.618136792068, 5075P 8342 +-96.5234045472058,7.10733749999999,-0.00100000000000178, 5075P 8343 +0.0750926996866857,-0.00100000000000001,0.151; 5075P 8344 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5077P 8345 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5077P 8346 +1.,1.,1.,1.,154.808074294198,-97.1334958652727,8.74703749999999, 5077P 8347 +154.808074294198,-96.5126170472058,8.74703749999999, 5077P 8348 +154.808074294198,-97.1334958652727,7.10733749999999, 5077P 8349 +154.808074294198,-96.5126170472059,7.10733749999999, 5077P 8350 +-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5077P 8351 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.2989097143809, 5079P 8352 +1.2989097143809,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5079P 8353 +140.796085750314,-97.1227083652727,8.74703749999999, 5079P 8354 +154.818861794198,-97.1227083652727,8.74703749999999, 5079P 8355 +140.796085750314,-97.1227083652727,7.10733749999999, 5079P 8356 +154.818861794198,-97.1227083652727,7.10733749999999,-0.001, 5079P 8357 +1.2989097143809,-0.001,0.151; 5079P 8358 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000165,-0.00100000000000165, 5081P 8359 +0.0565553944920266,0.0565553944920266,-0.001,-0.001,0.151,0.151, 5081P 8360 +1.,1.,1.,1.,140.806868816768,-96.5126170472061,8.74703749999999, 5081P 8361 +140.806873328707,-97.1334958652725,8.74703749999999, 5081P 8362 +140.806868816768,-96.5126170472061,7.10733749999999, 5081P 8363 +140.806873328707,-97.1334958652725,7.10733749999999, 5081P 8364 +-0.00100000000000165,0.0565553944920266,-0.001,0.151; 5081P 8365 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0750874512990324, 5083P 8366 +0.0750874512990324,-0.00100000000000011,-0.00100000000000011, 5083P 8367 +0.151,0.151,1.,1.,1.,1.,139.996863014273,-96.5234045472058, 5083P 8368 +8.74703749999999,140.817656395161,-96.5234045472058, 5083P 8369 +8.74703749999999,139.996863014273,-96.5234045472058, 5083P 8370 +7.10733749999999,140.817656395161,-96.5234045472058, 5083P 8371 +7.10733749999999,-0.001,0.0750874512990324,-0.00100000000000011, 5083P 8372 +0.151; 5083P 8373 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18763784027107, 5085P 8374 +1.18763784027107,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5085P 8375 +140.007654873096,-83.7117613452825,8.74703749999999, 5085P 8376 +140.007650510603,-96.5341920472058,8.74703749999999, 5085P 8377 +140.007654873096,-83.7117613452825,7.10733749999999, 5085P 8378 +140.007650510603,-96.5341920472059,7.10733749999999,-0.001, 5085P 8379 +1.18763784027107,-0.001,0.151; 5085P 8380 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5087P 8381 +0.0750874512990324,0.0750874512990324,-0.001,-0.001,0.151,0.151, 5087P 8382 +1.,1.,1.,1.,140.817660750314,-83.7225488452825,8.74703749999999, 5087P 8383 +139.996867369426,-83.7225488452825,8.74703749999999, 5087P 8384 +140.817660750314,-83.7225488452825,7.10733749999999, 5087P 8385 +139.996867369426,-83.7225488452825,7.10733749999999, 5087P 8386 +-0.00100000000000002,0.0750874512990324,-0.001,0.151; 5087P 8387 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944920294, 5089P 8388 +0.0565553944920294,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5089P 8389 +140.806868816768,-83.1124575272158,8.74703749999999, 5089P 8390 +140.806873328707,-83.7333363452822,8.74703749999999, 5089P 8391 +140.806868816768,-83.1124575272158,7.10733749999999, 5089P 8392 +140.806873328707,-83.7333363452822,7.10733749999999,-0.001, 5089P 8393 +0.0565553944920294,-0.001,0.151; 5089P 8394 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5091P 8395 +1.29888872083028,1.29888872083028,-0.00100000000000009, 5091P 8396 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,135.768458142722, 5091P 8397 +-83.1232450272156,8.74703749999999,121.745908566765, 5091P 8398 +-83.1232450272155,8.74703749999999,135.768458142722, 5091P 8399 +-83.1232450272156,7.10733749999999,121.745908566765, 5091P 8400 +-83.1232450272155,7.10733749999999,-0.00100000000000002, 5091P 8401 +1.29888872083028,-0.00100000000000009,0.151; 5091P 8402 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5093P 8403 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5093P 8404 +1.,1.,1.,1.,135.757670642722,-83.7333363452825,8.74703749999999, 5093P 8405 +135.757670642722,-83.1124575272156,8.74703749999999, 5093P 8406 +135.757670642722,-83.7333363452825,7.10733749999999, 5093P 8407 +135.757670642722,-83.1124575272156,7.10733749999999, 5093P 8408 +-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5093P 8409 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5095P 8410 +0.0750967369079582,0.0750967369079582,-0.001,-0.001,0.151,0.151, 5095P 8411 +1.,1.,1.,1.,136.567776692117,-83.7225488452825,8.74703749999999, 5095P 8412 +135.746883142722,-83.7225488452825,8.74703749999999, 5095P 8413 +136.567776692117,-83.7225488452825,7.10733749999999, 5095P 8414 +135.746883142722,-83.7225488452825,7.10733749999999, 5095P 8415 +-0.00100000000000002,0.0750967369079582,-0.001,0.151; 5095P 8416 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5097P 8417 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5097P 8418 +136.556989192117,-96.5341920472058,8.74703749999999, 5097P 8419 +136.556989192117,-83.7117613452825,8.74703749999999, 5097P 8420 +136.556989192117,-96.5341920472058,7.10733749999999, 5097P 8421 +136.556989192117,-83.7117613452825,7.10733749999999,-0.001, 5097P 8422 +1.187637840271,-0.001,0.151; 5097P 8423 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0750967369079582, 5099P 8424 +0.0750967369079582,-0.00100000000000001,-0.00100000000000001, 5099P 8425 +0.151,0.151,1.,1.,1.,1.,135.746883142722,-96.5234045472058, 5099P 8426 +8.74703749999999,136.567776692117,-96.5234045472058, 5099P 8427 +8.74703749999999,135.746883142722,-96.5234045472058, 5099P 8428 +7.10733749999999,136.567776692117,-96.5234045472058, 5099P 8429 +7.10733749999999,-0.001,0.0750967369079582,-0.00100000000000001, 5099P 8430 +0.151; 5099P 8431 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5101P 8432 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5101P 8433 +1.,1.,1.,1.,135.757670642722,-97.1334958652727,8.74703749999999, 5101P 8434 +135.757670642722,-96.5126170472058,8.74703749999999, 5101P 8435 +135.757670642722,-97.1334958652727,7.10733749999999, 5101P 8436 +135.757670642722,-96.5126170472059,7.10733749999999, 5101P 8437 +-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5101P 8438 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888872083028, 5103P 8439 +1.29888872083028,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5103P 8440 +121.745908566765,-97.1227083652727,8.74703749999999, 5103P 8441 +135.768458142722,-97.1227083652727,8.74703749999999, 5103P 8442 +121.745908566765,-97.1227083652727,7.10733749999999, 5103P 8443 +135.768458142722,-97.1227083652727,7.10733749999999,-0.001, 5103P 8444 +1.29888872083028,-0.001,0.151; 5103P 8445 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5105P 8446 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5105P 8447 +1.,1.,1.,1.,121.756696066765,-96.5126170472058,8.74703749999999, 5105P 8448 +121.756696066765,-97.1334958652727,8.74703749999999, 5105P 8449 +121.756696066765,-96.5126170472058,7.10733749999999, 5105P 8450 +121.756696066765,-97.1334958652727,7.10733749999999, 5105P 8451 +-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5105P 8452 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0751056187947589, 5107P 8453 +0.0751056187947589,-0.00100000000000001,-0.00100000000000001, 5107P 8454 +0.151,0.151,1.,1.,1.,1.,120.946494204017,-96.5234045472058, 5107P 8455 +8.74703749999999,121.767483566765,-96.5234045472058, 5107P 8456 +8.74703749999999,120.946494204017,-96.5234045472058, 5107P 8457 +7.10733749999999,121.767483566765,-96.5234045472058, 5107P 8458 +7.10733749999999,-0.001,0.0751056187947589,-0.00100000000000001, 5107P 8459 +0.151; 5107P 8460 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5109P 8461 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5109P 8462 +120.957281704017,-83.7117613452825,8.74703749999999, 5109P 8463 +120.957281704017,-96.5341920472058,8.74703749999999, 5109P 8464 +120.957281704017,-83.7117613452825,7.10733749999999, 5109P 8465 +120.957281704017,-96.5341920472058,7.10733749999999,-0.001, 5109P 8466 +1.187637840271,-0.001,0.151; 5109P 8467 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5111P 8468 +0.0751056187947589,0.0751056187947589,-0.001,-0.001,0.151,0.151, 5111P 8469 +1.,1.,1.,1.,121.767483566765,-83.7225488452825,8.74703749999999, 5111P 8470 +120.946494204017,-83.7225488452825,8.74703749999999, 5111P 8471 +121.767483566765,-83.7225488452825,7.10733749999999, 5111P 8472 +120.946494204017,-83.7225488452825,7.10733749999999, 5111P 8473 +-0.00100000000000002,0.0751056187947589,-0.001,0.151; 5111P 8474 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944905625, 5113P 8475 +0.0565553944905625,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5113P 8476 +121.756696066765,-83.1124575272155,8.74703749999999, 5113P 8477 +121.756696066765,-83.7333363452825,8.74703749999999, 5113P 8478 +121.756696066765,-83.1124575272155,7.10733749999999, 5113P 8479 +121.756696066765,-83.7333363452825,7.10733749999999,-0.001, 5113P 8480 +0.0565553944905625,-0.001,0.151; 5113P 8481 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5115P 8482 +1.29888831710816,1.29888831710816,-0.00100000000000009, 5115P 8483 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,116.718084977313, 5115P 8484 +-83.1232450272156,8.74703749999999,102.695539756509, 5115P 8485 +-83.1232450272155,8.7470375,116.718084977313,-83.1232450272156, 5115P 8486 +7.10733749999999,102.695539756509,-83.1232450272155, 5115P 8487 +7.10733749999999,-0.00100000000000002,1.29888831710816, 5115P 8488 +-0.00100000000000009,0.151; 5115P 8489 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5117P 8490 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5117P 8491 +1.,1.,1.,1.,116.707297477313,-83.7333363452825,8.74703749999999, 5117P 8492 +116.707297477313,-83.1124575272156,8.74703749999999, 5117P 8493 +116.707297477313,-83.7333363452825,7.10733749999999, 5117P 8494 +116.707297477313,-83.1124575272156,7.10733749999999, 5117P 8495 +-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5117P 8496 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5119P 8497 +0.0751056187947606,0.0751056187947606,-0.001,-0.001,0.151,0.151, 5119P 8498 +1.,1.,1.,1.,117.517499340062,-83.7225488452825,8.74703749999999, 5119P 8499 +116.696509977313,-83.7225488452825,8.74703749999999, 5119P 8500 +117.517499340062,-83.7225488452825,7.10733749999999, 5119P 8501 +116.696509977313,-83.7225488452825,7.10733749999999, 5119P 8502 +-0.00100000000000002,0.0751056187947606,-0.001,0.151; 5119P 8503 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18763784027127, 5121P 8504 +1.18763784027127,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5121P 8505 +117.506720557707,-96.5341920472058,8.74703749999999, 5121P 8506 +117.506711832721,-83.7117613452824,8.74703749999999, 5121P 8507 +117.506720557707,-96.5341920472058,7.10733749999999, 5121P 8508 +117.506711832721,-83.7117613452824,7.10733749999999,-0.001, 5121P 8509 +1.18763784027127,-0.001,0.151; 5121P 8510 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0751056187947589, 5123P 8511 +0.0751056187947589,-0.00100000000000001,-0.00100000000000001, 5123P 8512 +0.151,0.151,1.,1.,1.,1.,116.696518687618,-96.5234045472058, 5123P 8513 +8.74703749999999,117.517508050367,-96.5234045472058, 5123P 8514 +8.74703749999999,116.696518687618,-96.5234045472058, 5123P 8515 +7.10733749999999,117.517508050367,-96.5234045472058, 5123P 8516 +7.10733749999999,-0.001,0.0751056187947589,-0.00100000000000001, 5123P 8517 +0.151; 5123P 8518 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5125P 8519 +0.0565553944964269,0.0565553944964269,-0.001,-0.001,0.151,0.151, 5125P 8520 +1.,1.,1.,1.,116.707297320527,-97.1334958652716,8.74703749999999, 5125P 8521 +116.707306344404,-96.512617047207,8.74703749999999, 5125P 8522 +116.707297320527,-97.1334958652716,7.10733749999999, 5125P 8523 +116.707306344404,-96.512617047207,7.10733749999999, 5125P 8524 +-0.00100000000000178,0.0565553944964269,-0.001,0.151; 5125P 8525 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888831710816, 5127P 8526 +1.29888831710816,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5127P 8527 +102.695539756509,-97.1227083652727,8.7470375,116.718084977313, 5127P 8528 +-97.1227083652727,8.74703749999999,102.695539756509, 5127P 8529 +-97.1227083652727,7.10733749999999,116.718084977313, 5127P 8530 +-97.1227083652727,7.10733749999999,-0.001,1.29888831710816, 5127P 8531 +-0.001,0.151; 5127P 8532 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5129P 8533 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5129P 8534 +1.,1.,1.,1.,102.706327256509,-96.5126170472058,8.7470375, 5129P 8535 +102.706327256509,-97.1334958652727,8.7470375,102.706327256509, 5129P 8536 +-96.5126170472058,7.10733749999999,102.706327256509, 5129P 8537 +-97.1334958652727,7.10733749999999,-0.00100000000000178, 5129P 8538 +0.0565553944905594,-0.001,0.151; 5129P 8539 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5131P 8540 +0.0751056187947571,0.0751056187947571,-0.00100000000000001, 5131P 8541 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,101.89612539376, 5131P 8542 +-96.5234045472058,8.7470375,102.717114756509,-96.5234045472058, 5131P 8543 +8.7470375,101.89612539376,-96.5234045472058,7.10733749999999, 5131P 8544 +102.717114756509,-96.5234045472058,7.10733749999999, 5131P 8545 +-0.00100000000000178,0.0751056187947571,-0.00100000000000001, 5131P 8546 +0.151; 5131P 8547 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5133P 8548 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5133P 8549 +101.90691289376,-83.7117613452825,8.7470375,101.90691289376, 5133P 8550 +-96.5341920472058,8.7470375,101.90691289376,-83.7117613452825, 5133P 8551 +7.10733749999999,101.90691289376,-96.5341920472058, 5133P 8552 +7.10733749999999,-0.001,1.187637840271,-0.001,0.151; 5133P 8553 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5135P 8554 +0.0751056187947571,0.0751056187947571,-0.001,-0.001,0.151,0.151, 5135P 8555 +1.,1.,1.,1.,102.717114756509,-83.7225488452825,8.7470375, 5135P 8556 +101.89612539376,-83.7225488452825,8.7470375,102.717114756509, 5135P 8557 +-83.7225488452825,7.10733749999999,101.89612539376, 5135P 8558 +-83.7225488452825,7.10733749999999,-0.00100000000000178, 5135P 8559 +0.0751056187947571,-0.001,0.151; 5135P 8560 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944905625, 5137P 8561 +0.0565553944905625,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5137P 8562 +102.706327256509,-83.1124575272155,8.7470375,102.706327256509, 5137P 8563 +-83.7333363452825,8.7470375,102.706327256509,-83.1124575272155, 5137P 8564 +7.10733749999999,102.706327256509,-83.7333363452825, 5137P 8565 +7.10733749999999,-0.001,0.0565553944905625,-0.001,0.151; 5137P 8566 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5139P 8567 +1.29888831710816,1.29888831710816,-0.00100000000000009, 5139P 8568 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,97.6677161670568, 5139P 8569 +-83.1232450272156,8.7470375,83.6451709462526,-83.1232450272155, 5139P 8570 +8.7470375,97.6677161670568,-83.1232450272156,7.10733749999999, 5139P 8571 +83.6451709462526,-83.1232450272155,7.1073375, 5139P 8572 +-0.00100000000000002,1.29888831710816,-0.00100000000000009, 5139P 8573 +0.151; 5139P 8574 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5141P 8575 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5141P 8576 +1.,1.,1.,1.,97.6569286670568,-83.7333363452825,8.7470375, 5141P 8577 +97.6569286670568,-83.1124575272156,8.7470375,97.6569286670568, 5141P 8578 +-83.7333363452825,7.10733749999999,97.6569286670568, 5141P 8579 +-83.1124575272156,7.10733749999999,-0.00100000000000178, 5141P 8580 +0.0565553944905594,-0.001,0.151; 5141P 8581 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5143P 8582 +0.0751056187947571,0.0751056187947571,-0.001,-0.001,0.151,0.151, 5143P 8583 +1.,1.,1.,1.,98.4671305298053,-83.7225488452825,8.7470375, 5143P 8584 +97.6461411670568,-83.7225488452825,8.7470375,98.4671305298053, 5143P 8585 +-83.7225488452825,7.10733749999999,97.6461411670568, 5143P 8586 +-83.7225488452825,7.10733749999999,-0.00100000000000178, 5143P 8587 +0.0751056187947571,-0.001,0.151; 5143P 8588 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5145P 8589 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5145P 8590 +98.4563430298053,-96.5341920472058,8.7470375,98.4563430298053, 5145P 8591 +-83.7117613452825,8.7470375,98.4563430298053,-96.5341920472058, 5145P 8592 +7.10733749999999,98.4563430298053,-83.7117613452825, 5145P 8593 +7.10733749999999,-0.001,1.187637840271,-0.001,0.151; 5145P 8594 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5147P 8595 +0.0751056187947566,0.0751056187947566,-0.00100000000000001, 5147P 8596 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,97.6461411670568, 5147P 8597 +-96.5234045472058,8.7470375,98.4671305298053,-96.5234045472058, 5147P 8598 +8.7470375,97.6461411670568,-96.5234045472058,7.10733749999999, 5147P 8599 +98.4671305298053,-96.5234045472058,7.10733749999999, 5147P 8600 +-0.00100000000000178,0.0751056187947566,-0.00100000000000001, 5147P 8601 +0.151; 5147P 8602 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5149P 8603 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5149P 8604 +1.,1.,1.,1.,97.6569286670568,-97.1334958652727,8.7470375, 5149P 8605 +97.6569286670568,-96.5126170472058,8.7470375,97.6569286670568, 5149P 8606 +-97.1334958652727,7.10733749999999,97.6569286670568, 5149P 8607 +-96.5126170472059,7.10733749999999,-0.00100000000000178, 5149P 8608 +0.0565553944905594,-0.001,0.151; 5149P 8609 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888912455241, 5151P 8610 +1.29888912455241,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5151P 8611 +83.6451622359477,-97.1227083652727,8.7470375,97.6677161670568, 5151P 8612 +-97.1227083652727,8.7470375,83.6451622359477,-97.1227083652727, 5151P 8613 +7.1073375,97.6677161670569,-97.1227083652727,7.1073375,-0.001, 5151P 8614 +1.29888912455241,-0.001,0.151; 5151P 8615 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5153P 8616 +0.0565553944964269,0.0565553944964269,-0.001,-0.001,0.151,0.151, 5153P 8617 +1.,1.,1.,1.,83.6559586030385,-96.512617047207,8.7470375, 5153P 8618 +83.6559495791618,-97.1334958652716,8.7470375,83.6559586030385, 5153P 8619 +-96.512617047207,7.1073375,83.6559495791617,-97.1334958652716, 5153P 8620 +7.1073375,-0.00100000000000178,0.0565553944964269,-0.001,0.151; 5153P 8621 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000165,-0.00100000000000165, 5155P 8622 +0.0751056187947571,0.0751056187947571,-0.00100000000000001, 5155P 8623 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,82.8457565835041, 5155P 8624 +-96.5234045472058,8.7470375,83.6667459462526,-96.5234045472058, 5155P 8625 +8.7470375,82.8457565835041,-96.5234045472058,7.1073375, 5155P 8626 +83.6667459462526,-96.5234045472058,7.1073375, 5155P 8627 +-0.00100000000000165,0.0751056187947571,-0.00100000000000001, 5155P 8628 +0.151; 5155P 8629 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5157P 8630 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5157P 8631 +82.8565440835042,-83.7117613452825,8.7470375,82.8565440835042, 5157P 8632 +-96.5341920472058,8.7470375,82.8565440835042,-83.7117613452825, 5157P 8633 +7.1073375,82.8565440835042,-96.5341920472058,7.1073375,-0.001, 5157P 8634 +1.187637840271,-0.001,0.151; 5157P 8635 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5159P 8636 +0.0751056187947571,0.0751056187947571,-0.001,-0.001,0.151,0.151, 5159P 8637 +1.,1.,1.,1.,83.6667459462526,-83.7225488452825,8.7470375, 5159P 8638 +82.8457565835041,-83.7225488452825,8.7470375,83.6667459462526, 5159P 8639 +-83.7225488452825,7.1073375,82.8457565835041,-83.7225488452825, 5159P 8640 +7.1073375,-0.00100000000000178,0.0751056187947571,-0.001,0.151; 5159P 8641 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944905625, 5161P 8642 +0.0565553944905625,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5161P 8643 +83.6559584462526,-83.1124575272155,8.7470375,83.6559584462526, 5161P 8644 +-83.7333363452825,8.7470375,83.6559584462526,-83.1124575272155, 5161P 8645 +7.1073375,83.6559584462526,-83.7333363452825,7.1073375,-0.001, 5161P 8646 +0.0565553944905625,-0.001,0.151; 5161P 8647 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5163P 8648 +1.29888831710816,1.29888831710816,-0.00100000000000009, 5163P 8649 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,78.6173473568005, 5163P 8650 +-83.1232450272156,8.7470375,64.5948021359962,-83.1232450272155, 5163P 8651 +8.7470375,78.6173473568005,-83.1232450272156,7.1073375, 5163P 8652 +64.5948021359962,-83.1232450272155,7.1073375, 5163P 8653 +-0.00100000000000002,1.29888831710816,-0.00100000000000009, 5163P 8654 +0.151; 5163P 8655 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5165P 8656 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5165P 8657 +1.,1.,1.,1.,78.6065598568005,-83.7333363452825,8.7470375, 5165P 8658 +78.6065598568005,-83.1124575272156,8.7470375,78.6065598568005, 5165P 8659 +-83.7333363452825,7.1073375,78.6065598568005,-83.1124575272156, 5165P 8660 +7.1073375,-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5165P 8661 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 5167P 8662 +0.0751056187947565,0.0751056187947565,-0.001,-0.001,0.151,0.151, 5167P 8663 +1.,1.,1.,1.,79.416761719549,-83.7225488452825,8.7470375, 5167P 8664 +78.5957723568005,-83.7225488452825,8.7470375,79.416761719549, 5167P 8665 +-83.7225488452825,7.1073375,78.5957723568005,-83.7225488452825, 5167P 8666 +7.1073375,-0.00100000000000266,0.0751056187947565,-0.001,0.151; 5167P 8667 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5169P 8668 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5169P 8669 +79.4059742195489,-96.5341920472058,8.7470375,79.4059742195489, 5169P 8670 +-83.7117613452825,8.7470375,79.4059742195489,-96.5341920472058, 5169P 8671 +7.1073375,79.4059742195489,-83.7117613452825,7.1073375,-0.001, 5169P 8672 +1.187637840271,-0.001,0.151; 5169P 8673 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 5171P 8674 +0.0751056187947566,0.0751056187947566,-0.00100000000000001, 5171P 8675 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,78.5957723568005, 5171P 8676 +-96.5234045472058,8.7470375,79.4167617195489,-96.5234045472058, 5171P 8677 +8.7470375,78.5957723568005,-96.5234045472058,7.1073375, 5171P 8678 +79.4167617195489,-96.5234045472058,7.1073375, 5171P 8679 +-0.00100000000000266,0.0751056187947566,-0.00100000000000001, 5171P 8680 +0.151; 5171P 8681 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5173P 8682 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5173P 8683 +1.,1.,1.,1.,78.6065598568005,-97.1334958652727,8.7470375, 5173P 8684 +78.6065598568005,-96.5126170472058,8.7470375,78.6065598568005, 5173P 8685 +-97.1334958652727,7.1073375,78.6065598568005,-96.5126170472059, 5173P 8686 +7.1073375,-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5173P 8687 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888831710816, 5175P 8688 +1.29888831710816,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5175P 8689 +64.5948021359963,-97.1227083652727,8.7470375,78.6173473568005, 5175P 8690 +-97.1227083652727,8.7470375,64.5948021359963,-97.1227083652727, 5175P 8691 +7.1073375,78.6173473568005,-97.1227083652727,7.1073375,-0.001, 5175P 8692 +1.29888831710816,-0.001,0.151; 5175P 8693 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5177P 8694 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5177P 8695 +1.,1.,1.,1.,64.6055896359963,-96.5126170472058,8.7470375, 5177P 8696 +64.6055896359963,-97.1334958652727,8.7470375,64.6055896359963, 5177P 8697 +-96.5126170472058,7.1073375,64.6055896359963,-97.1334958652727, 5177P 8698 +7.1073375,-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5177P 8699 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000247,-0.00100000000000247, 5179P 8700 +0.0751056187947571,0.0751056187947571,-0.00100000000000001, 5179P 8701 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,63.7953877732478, 5179P 8702 +-96.5234045472058,8.7470375,64.6163771359963,-96.5234045472058, 5179P 8703 +8.7470375,63.7953877732478,-96.5234045472058,7.1073375, 5179P 8704 +64.6163771359963,-96.5234045472058,7.1073375, 5179P 8705 +-0.00100000000000247,0.0751056187947571,-0.00100000000000001, 5179P 8706 +0.151; 5179P 8707 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5181P 8708 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5181P 8709 +63.8061752732478,-83.7117613452825,8.7470375,63.8061752732478, 5181P 8710 +-96.5341920472058,8.7470375,63.8061752732478,-83.7117613452825, 5181P 8711 +7.1073375,63.8061752732478,-96.5341920472058,7.1073375,-0.001, 5181P 8712 +1.187637840271,-0.001,0.151; 5181P 8713 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 5183P 8714 +0.0751056187947571,0.0751056187947571,-0.001,-0.001,0.151,0.151, 5183P 8715 +1.,1.,1.,1.,64.6163771359963,-83.7225488452825,8.7470375, 5183P 8716 +63.7953877732478,-83.7225488452825,8.7470375,64.6163771359963, 5183P 8717 +-83.7225488452825,7.1073375,63.7953877732478,-83.7225488452825, 5183P 8718 +7.1073375,-0.00100000000000266,0.0751056187947571,-0.001,0.151; 5183P 8719 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944905625, 5185P 8720 +0.0565553944905625,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5185P 8721 +64.6055896359963,-83.1124575272155,8.7470375,64.6055896359963, 5185P 8722 +-83.7333363452825,8.7470375,64.6055896359963,-83.1124575272155, 5185P 8723 +7.1073375,64.6055896359963,-83.7333363452825,7.1073375,-0.001, 5185P 8724 +0.0565553944905625,-0.001,0.151; 5185P 8725 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5187P 8726 +1.29879546101888,1.29879546101888,-0.001,-0.001,0.151,0.151,1., 5187P 8727 +1.,1.,1.,59.5669785465442,-83.1232450272156,8.7470375, 5187P 8728 +45.545435010803,-83.1232450272155,8.7470375,59.5669785465442, 5187P 8729 +-83.1232450272156,7.1073375,45.545435010803,-83.1232450272155, 5187P 8730 +7.1073375,-0.00100000000000002,1.29879546101888,-0.001,0.151; 5187P 8731 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5189P 8732 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5189P 8733 +1.,1.,1.,1.,59.5561910465442,-83.7333363452825,8.7470375, 5189P 8734 +59.5561910465442,-83.1124575272156,8.7470375,59.5561910465442, 5189P 8735 +-83.7333363452825,7.1073375,59.5561910465442,-83.1124575272156, 5189P 8736 +7.1073375,-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5189P 8737 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 5191P 8738 +0.0751056187947571,0.0751056187947571,-0.00100000000000011, 5191P 8739 +-0.00100000000000011,0.151,0.151,1.,1.,1.,1.,60.3663929092927, 5191P 8740 +-83.7225488452825,8.7470375,59.5454035465442,-83.7225488452825, 5191P 8741 +8.7470375,60.3663929092927,-83.7225488452825,7.1073375, 5191P 8742 +59.5454035465442,-83.7225488452825,7.1073375, 5191P 8743 +-0.00100000000000266,0.0751056187947571,-0.00100000000000011, 5191P 8744 +0.151; 5191P 8745 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5193P 8746 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5193P 8747 +60.3556054092926,-96.5341920472058,8.7470375,60.3556054092926, 5193P 8748 +-83.7117613452825,8.7470375,60.3556054092926,-96.5341920472058, 5193P 8749 +7.1073375,60.3556054092926,-83.7117613452825,7.1073375,-0.001, 5193P 8750 +1.187637840271,-0.001,0.151; 5193P 8751 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000247,-0.00100000000000247, 5195P 8752 +0.0751056187947571,0.0751056187947571,-0.001,-0.001,0.151,0.151, 5195P 8753 +1.,1.,1.,1.,59.5454035465442,-96.5234045472058,8.7470375, 5195P 8754 +60.3663929092926,-96.5234045472058,8.7470375,59.5454035465442, 5195P 8755 +-96.5234045472058,7.1073375,60.3663929092926,-96.5234045472058, 5195P 8756 +7.1073375,-0.00100000000000247,0.0751056187947571,-0.001,0.151; 5195P 8757 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5197P 8758 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5197P 8759 +1.,1.,1.,1.,59.5561910465442,-97.1334958652727,8.7470375, 5197P 8760 +59.5561910465442,-96.5126170472058,8.7470375,59.5561910465442, 5197P 8761 +-97.1334958652727,7.1073375,59.5561910465442,-96.5126170472059, 5197P 8762 +7.1073375,-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5197P 8763 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29879546101888, 5199P 8764 +1.29879546101888,-0.00100000000000011,-0.00100000000000011, 5199P 8765 +0.151,0.151,1.,1.,1.,1.,45.545435010803,-97.1227083652727, 5199P 8766 +8.7470375,59.5669785465442,-97.1227083652727,8.7470375, 5199P 8767 +45.545435010803,-97.1227083652727,7.1073375,59.5669785465442, 5199P 8768 +-97.1227083652727,7.1073375,-0.001,1.29879546101888, 5199P 8769 +-0.00100000000000011,0.151; 5199P 8770 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5201P 8771 +0.0565553944905594,0.0565553944905594,-0.001,-0.001,0.151,0.151, 5201P 8772 +1.,1.,1.,1.,45.556222510803,-96.5126170472058,8.7470375, 5201P 8773 +45.556222510803,-97.1334958652727,8.7470375,45.556222510803, 5201P 8774 +-96.5126170472058,7.1073375,45.556222510803,-97.1334958652727, 5201P 8775 +7.1073375,-0.00100000000000178,0.0565553944905594,-0.001,0.151; 5201P 8776 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0751621398925796, 5203P 8777 +0.0751621398925796,-0.00100000000000001,-0.00100000000000001, 5203P 8778 +0.151,0.151,1.,1.,1.,1.,44.7454109267118,-96.5234045472058, 5203P 8779 +8.7470375,45.567010010803,-96.5234045472058,8.7470375, 5203P 8780 +44.7454109267118,-96.5234045472058,7.1073375,45.567010010803, 5203P 8781 +-96.5234045472058,7.1073375,-0.001,0.0751621398925796, 5203P 8782 +-0.00100000000000001,0.151; 5203P 8783 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.187637840271, 5205P 8784 +1.187637840271,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5205P 8785 +44.7561984267118,-83.7117613452825,8.7470375,44.7561984267118, 5205P 8786 +-96.5341920472058,8.7470375,44.7561984267118,-83.7117613452825, 5205P 8787 +7.1073375,44.7561984267118,-96.5341920472058,7.1073375,-0.001, 5205P 8788 +1.187637840271,-0.001,0.151; 5205P 8789 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5207P 8790 +0.0751621398925796,0.0751621398925796,-0.001,-0.001,0.151,0.151, 5207P 8791 +1.,1.,1.,1.,45.567010010803,-83.7225488452825,8.7470375, 5207P 8792 +44.7454109267118,-83.7225488452825,8.7470375,45.567010010803, 5207P 8793 +-83.7225488452825,7.1073375,44.7454109267118,-83.7225488452825, 5207P 8794 +7.1073375,-0.00100000000000002,0.0751621398925796,-0.001,0.151; 5207P 8795 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0565553944905625, 5209P 8796 +0.0565553944905625,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5209P 8797 +45.556222510803,-83.1124575272155,8.7470375,45.556222510803, 5209P 8798 +-83.7333363452825,8.7470375,45.556222510803,-83.1124575272155, 5209P 8799 +7.1073375,45.556222510803,-83.7333363452825,7.1073375,-0.001, 5209P 8800 +0.0565553944905625,-0.001,0.151; 5209P 8801 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5211P 8802 +1.29891011810303,1.29891011810303,-0.00100000000000011, 5211P 8803 +-0.00100000000000011,0.151,0.151,1.,1.,1.,1.,154.818861794198, 5211P 8804 +-64.0711428662849,8.74703749999999,140.796081395161, 5211P 8805 +-64.0711428662849,8.74703749999999,154.818861794198, 5211P 8806 +-64.0711428662849,7.10733749999999,140.796081395161, 5211P 8807 +-64.0711428662849,7.10733749999999,-0.00100000000000002, 5211P 8808 +1.29891011810303,-0.00100000000000011,0.151; 5211P 8809 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000089,-0.00100000000000089, 5213P 8810 +0.0567168833414705,0.0567168833414705,-0.001,-0.001,0.151,0.151, 5213P 8811 +1.,1.,1.,1.,154.808074294198,-64.682976245331,8.74703749999999, 5213P 8812 +154.808074294198,-64.0603553662849,8.74703749999999, 5213P 8813 +154.808074294198,-64.682976245331,7.10733749999999, 5213P 8814 +154.808074294198,-64.0603553662849,7.10733749999999, 5213P 8815 +-0.00100000000000089,0.0567168833414705,-0.001,0.151; 5213P 8816 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5215P 8817 +0.0750926997042853,0.0750926997042853,-0.001,-0.001,0.151,0.151, 5215P 8818 +1.,1.,1.,1.,155.618136792065,-64.6721710896021,8.74703749999999, 5215P 8819 +154.7972867942,-64.6721889804501,8.74703749999999, 5215P 8820 +155.618136792065,-64.6721710896021,7.10733749999999, 5215P 8821 +154.7972867942,-64.6721889804501,7.10733749999999, 5215P 8822 +-0.00100000000000002,0.0750926997042853,-0.001,0.151; 5215P 8823 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5217P 8824 +1.18750703430176,1.18750703430176,-0.001,-0.001,0.151,0.151,1., 5217P 8825 +1.,1.,1.,155.607349292068,-77.4824034572515,8.74703749999999, 5217P 8826 +155.607349292068,-64.6613838247213,8.74703749999999, 5217P 8827 +155.607349292068,-77.4824034572515,7.10733749999999, 5217P 8828 +155.607349292068,-64.6613838247213,7.10733749999999, 5217P 8829 +-0.00100000000000178,1.18750703430176,-0.001,0.151; 5217P 8830 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5219P 8831 +0.0750926997042836,0.0750926997042836,-0.00100000000000001, 5219P 8832 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,154.7972867942, 5219P 8833 +-77.4716336129804,8.74703749999999,155.618136792065, 5219P 8834 +-77.4716157221324,8.74703749999999,154.7972867942, 5219P 8835 +-77.4716336129804,7.10733749999999,155.618136792065, 5219P 8836 +-77.4716157221324,7.10733749999999,-0.00100000000000178, 5219P 8837 +0.0750926997042836,-0.00100000000000001,0.151; 5219P 8838 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000089,-0.00100000000000089, 5221P 8839 +0.0566862004597987,0.0566862004597987,-0.001,-0.001,0.151,0.151, 5221P 8840 +1.,1.,1.,1.,154.808074294198,-78.0831357653214,8.74703749999999, 5221P 8841 +154.808074294198,-77.4608458778613,8.74703749999999, 5221P 8842 +154.808074294198,-78.0831357653214,7.10733749999999, 5221P 8843 +154.808074294198,-77.4608458778613,7.10733749999999, 5221P 8844 +-0.00100000000000089,0.0566862004597987,-0.001,0.151; 5221P 8845 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.2989097143819, 5223P 8846 +1.2989097143819,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5223P 8847 +140.796085750314,-78.0723308312895,8.74703749999999, 5223P 8848 +154.818861794198,-78.0723482787434,8.74703749999999, 5223P 8849 +140.796085750314,-78.0723308312895,7.10733749999999, 5223P 8850 +154.818861794198,-78.0723482787434,7.10733749999999,-0.001, 5223P 8851 +1.2989097143819,-0.001,0.151; 5223P 8852 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000082,-0.00100000000000082, 5225P 8853 +0.0566862004612659,0.0566862004612659,-0.001,-0.001,0.151,0.151, 5225P 8854 +1.,1.,1.,1.,140.806868816953,-77.4608284572517,8.74703749999999, 5225P 8855 +140.806873328523,-78.0831183447113,8.74703749999999, 5225P 8856 +140.806868816953,-77.4608284572517,7.10733749999999, 5225P 8857 +140.806873328523,-78.0831183447113,7.10733749999999, 5225P 8858 +-0.00100000000000082,0.0566862004612659,-0.001,0.151; 5225P 8859 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0750874513166321, 5227P 8860 +0.0750874513166321,-0.00100000000000011,-0.00100000000000011, 5227P 8861 +0.151,0.151,1.,1.,1.,1.,139.996863014276,-77.471633612997, 5227P 8862 +8.74703749999999,140.817656395159,-77.4716157221157, 5227P 8863 +8.74703749999999,139.996863014276,-77.471633612997, 5227P 8864 +7.10733749999999,140.817656395159,-77.4716157221157, 5227P 8865 +7.10733749999999,-0.001,0.0750874513166321,-0.00100000000000011, 5227P 8866 +0.151; 5227P 8867 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18752964274096, 5229P 8868 +1.18752964274096,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5229P 8869 +140.007654873096,-64.6611573567939,8.74703749999999, 5229P 8870 +140.007650510603,-77.4824208778613,8.74703749999999, 5229P 8871 +140.007654873096,-64.6611573567939,7.10733749999999, 5229P 8872 +140.007650510603,-77.4824208778613,7.10733749999999,-0.001, 5229P 8873 +1.18752964274096,-0.001,0.151; 5229P 8874 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5231P 8875 +0.0750874512990324,0.0750874512990324,-0.001,-0.001,0.151,0.151, 5231P 8876 +1.,1.,1.,1.,140.817660750314,-64.6719448567939,8.74703749999999, 5231P 8877 +139.996867369426,-64.6719448567939,8.74703749999999, 5231P 8878 +140.817660750314,-64.6719448567939,7.10733749999999, 5231P 8879 +139.996867369426,-64.6719448567939,7.10733749999999, 5231P 8880 +-0.00100000000000002,0.0750874512990324,-0.001,0.151; 5231P 8881 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5233P 8882 +0.0566942749038051,0.0566942749038051,-0.001,-0.001,0.151,0.151, 5233P 8883 +1.,1.,1.,1.,140.806868816964,-64.0603553662852,8.74703749999999, 5233P 8884 +140.806873328511,-64.6827323567937,8.74703749999999, 5233P 8885 +140.806868816964,-64.0603553662852,7.10733749999999, 5233P 8886 +140.806873328511,-64.6827323567937,7.10733749999999, 5233P 8887 +-0.00100000000000178,0.0566942749038051,-0.001,0.151; 5233P 8888 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5235P 8889 +1.29888872083028,1.29888872083028,-0.00100000000000009, 5235P 8890 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,135.768458142722, 5235P 8891 +-64.0711428662849,8.74703749999999,121.745908566765, 5235P 8892 +-64.0711428662849,8.74703749999999,135.768458142722, 5235P 8893 +-64.0711428662849,7.10733749999999,121.745908566765, 5235P 8894 +-64.0711428662849,7.10733749999999,-0.00100000000000002, 5235P 8895 +1.29888872083028,-0.00100000000000009,0.151; 5235P 8896 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0694050623575851, 5237P 8897 +0.0694050623575851,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5237P 8898 +135.757670642722,-64.8198499764674,8.74703749999999, 5237P 8899 +135.757670642722,-64.0603553662849,8.74703749999999, 5237P 8900 +135.757670642722,-64.8198499764674,7.10733749999999, 5237P 8901 +135.757670642722,-64.0603553662849,7.10733749999999,-0.001, 5237P 8902 +0.0694050623575851,-0.001,0.151; 5237P 8903 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5239P 8904 +0.0750967369255561,0.0750967369255561,-0.001,-0.001,0.151,0.151, 5239P 8905 +1.,1.,1.,1.,136.567776692114,-64.8090448207513,8.74703749999999, 5239P 8906 +135.746883142724,-64.8090627115737,8.74703749999999, 5239P 8907 +136.567776692114,-64.8090448207513,7.10733749999999, 5239P 8908 +135.746883142724,-64.8090627115737,7.10733749999999, 5239P 8909 +-0.00100000000000002,0.0750967369255561,-0.001,0.151; 5239P 8910 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5241P 8911 +1.18750703430176,1.18750703430176,-0.001,-0.001,0.151,0.151,1., 5241P 8912 +1.,1.,1.,136.556989192117,-77.6192771883878,8.74703749999999, 5241P 8913 +136.556989192117,-64.7982575558576,8.74703749999999, 5241P 8914 +136.556989192117,-77.6192771883878,7.10733749999999, 5241P 8915 +136.556989192117,-64.7982575558576,7.10733749999999, 5241P 8916 +-0.00100000000000178,1.18750703430176,-0.001,0.151; 5241P 8917 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0750967369255578, 5243P 8918 +0.0750967369255578,-0.00100000000000001,-0.00100000000000001, 5243P 8919 +0.151,0.151,1.,1.,1.,1.,135.746883142724,-77.6085073441039, 5243P 8920 +8.74703749999999,136.567776692114,-77.6084894532815, 5243P 8921 +8.74703749999999,135.746883142724,-77.6085073441039, 5243P 8922 +7.10733749999999,136.567776692114,-77.6084894532815, 5243P 8923 +7.10733749999999,-0.001,0.0750967369255578,-0.00100000000000001, 5243P 8924 +0.151; 5243P 8925 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5245P 8926 +0.0439980214436811,0.0439980214436811,-0.001,-0.001,0.151,0.151, 5245P 8927 +1.,1.,1.,1.,135.757670642722,-78.0831357653213,8.74703749999999, 5245P 8928 +135.757670642722,-77.5977196089976,8.74703749999999, 5245P 8929 +135.757670642722,-78.0831357653213,7.10733749999999, 5245P 8930 +135.757670642722,-77.5977196089976,7.10733749999999, 5245P 8931 +-0.00100000000000178,0.0439980214436811,-0.001,0.151; 5245P 8932 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888872083129, 5247P 8933 +1.29888872083129,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5247P 8934 +121.745908566765,-78.0723308312893,8.74703749999999, 5247P 8935 +135.768458142722,-78.0723482787436,8.74703749999999, 5247P 8936 +121.745908566765,-78.0723308312893,7.10733749999999, 5247P 8937 +135.768458142722,-78.0723482787436,7.10733749999999,-0.001, 5247P 8938 +1.29888872083129,-0.001,0.151; 5247P 8939 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000082,-0.00100000000000082, 5249P 8940 +0.0566862004598022,0.0566862004598022,-0.001,-0.001,0.151,0.151, 5249P 8941 +1.,1.,1.,1.,121.756696066765,-77.4608284572515,8.74703749999999, 5249P 8942 +121.756696066765,-78.0831183447116,8.74703749999999, 5249P 8943 +121.756696066765,-77.4608284572515,7.10733749999999, 5249P 8944 +121.756696066765,-78.0831183447116,7.10733749999999, 5249P 8945 +-0.00100000000000082,0.0566862004598022,-0.001,0.151; 5249P 8946 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0751056188123554, 5251P 8947 +0.0751056188123554,-0.00100000000000001,-0.00100000000000001, 5251P 8948 +0.151,0.151,1.,1.,1.,1.,120.946494204019,-77.4716336129394, 5251P 8949 +8.74703749999999,121.767483566763,-77.4716157221733, 5251P 8950 +8.74703749999999,120.946494204019,-77.4716336129394, 5251P 8951 +7.10733749999999,121.767483566763,-77.4716157221733, 5251P 8952 +7.10733749999999,-0.001,0.0751056188123554,-0.00100000000000001, 5251P 8953 +0.151; 5251P 8954 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18752964274089, 5253P 8955 +1.18752964274089,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5253P 8956 +120.957281704017,-64.6611573567939,8.74703749999999, 5253P 8957 +120.957281704017,-77.4824208778613,8.74703749999999, 5253P 8958 +120.957281704017,-64.6611573567939,7.10733749999999, 5253P 8959 +120.957281704017,-77.4824208778613,7.10733749999999,-0.001, 5253P 8960 +1.18752964274089,-0.001,0.151; 5253P 8961 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5255P 8962 +0.0751056187947589,0.0751056187947589,-0.001,-0.001,0.151,0.151, 5255P 8963 +1.,1.,1.,1.,121.767483566765,-64.6719448567939,8.74703749999999, 5255P 8964 +120.946494204017,-64.6719448567939,8.74703749999999, 5255P 8965 +121.767483566765,-64.6719448567939,7.10733749999999, 5255P 8966 +120.946494204017,-64.6719448567939,7.10733749999999, 5255P 8967 +-0.00100000000000002,0.0751056187947589,-0.001,0.151; 5255P 8968 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5257P 8969 +0.0566942749023418,0.0566942749023418,-0.001,-0.001,0.151,0.151, 5257P 8970 +1.,1.,1.,1.,121.756696066765,-64.0603553662849,8.74703749999999, 5257P 8971 +121.756696066765,-64.6827323567939,8.74703749999999, 5257P 8972 +121.756696066765,-64.0603553662849,7.10733749999999, 5257P 8973 +121.756696066765,-64.6827323567939,7.10733749999999, 5257P 8974 +-0.00100000000000178,0.0566942749023418,-0.001,0.151; 5257P 8975 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5259P 8976 +1.29888831710916,1.29888831710916,-0.00100000000000009, 5259P 8977 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,116.718084977313, 5259P 8978 +-64.0713693476345,8.74703749999999,102.695539756509, 5259P 8979 +-64.0713519001801,8.7470375,116.718084977313,-64.0713693476345, 5259P 8980 +7.10733749999999,102.695539756509,-64.0713519001801, 5259P 8981 +7.10733749999999,-0.00100000000000002,1.29888831710916, 5259P 8982 +-0.00100000000000009,0.151; 5259P 8983 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0566958897908597, 5261P 8984 +0.0566958897908597,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5261P 8985 +116.707297477313,-64.6829762453311,8.74703749999999, 5261P 8986 +116.707297477313,-64.0605818342122,8.74703749999999, 5261P 8987 +116.707297477313,-64.6829762453311,7.10733749999999, 5261P 8988 +116.707297477313,-64.0605818342122,7.10733749999999,-0.001, 5261P 8989 +0.0566958897908597,-0.001,0.151; 5261P 8990 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5263P 8991 +0.0751056188123554,0.0751056188123554,-0.001,-0.001,0.151,0.151, 5263P 8992 +1.,1.,1.,1.,117.517499340059,-64.6721710896431,8.74703749999999, 5263P 8993 +116.696509977316,-64.6721889804092,8.74703749999999, 5263P 8994 +117.517499340059,-64.6721710896431,7.10733749999999, 5263P 8995 +116.696509977316,-64.6721889804092,7.10733749999999, 5263P 8996 +-0.00100000000000002,0.0751056188123554,-0.001,0.151; 5263P 8997 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000165,-0.00100000000000165, 5265P 8998 +1.18750703430203,1.18750703430203,-0.001,-0.001,0.151,0.151,1., 5265P 8999 +1.,1.,1.,117.506720557708,-77.4824034572515,8.74703749999999, 5265P 9000 +117.50671183272,-64.6613838247212,8.74703749999999, 5265P 9001 +117.506720557708,-77.4824034572515,7.10733749999999, 5265P 9002 +117.50671183272,-64.6613838247212,7.10733749999999, 5265P 9003 +-0.00100000000000165,1.18750703430203,-0.001,0.151; 5265P 9004 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0751056188123554, 5267P 9005 +0.0751056188123554,-0.00100000000000001,-0.00100000000000001, 5267P 9006 +0.151,0.151,1.,1.,1.,1.,116.696518687621,-77.4716336129394, 5267P 9007 +8.74703749999999,117.517508050364,-77.4716157221734, 5267P 9008 +8.74703749999999,116.696518687621,-77.4716336129394, 5267P 9009 +7.10733749999999,117.517508050364,-77.4716157221734, 5267P 9010 +7.10733749999999,-0.001,0.0751056188123554,-0.00100000000000001, 5267P 9011 +0.151; 5267P 9012 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000089,-0.00100000000000089, 5269P 9013 +0.0566862004656526,0.0566862004656526,-0.001,-0.001,0.151,0.151, 5269P 9014 +1.,1.,1.,1.,116.707297320895,-78.0831357653202,8.74703749999999, 5269P 9015 +116.707306344036,-77.4608458778624,8.74703749999999, 5269P 9016 +116.707297320895,-78.0831357653202,7.10733749999999, 5269P 9017 +116.707306344036,-77.4608458778624,7.10733749999999, 5269P 9018 +-0.00100000000000089,0.0566862004656526,-0.001,0.151; 5269P 9019 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888831710916, 5271P 9020 +1.29888831710916,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5271P 9021 +102.695539756509,-78.0723308312893,8.7470375,116.718084977313, 5271P 9022 +-78.0723482787436,8.74703749999999,102.695539756509, 5271P 9023 +-78.0723308312893,7.10733749999999,116.718084977313, 5271P 9024 +-78.0723482787436,7.10733749999999,-0.001,1.29888831710916, 5271P 9025 +-0.001,0.151; 5271P 9026 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000082,-0.00100000000000082, 5273P 9027 +0.0566862004598022,0.0566862004598022,-0.001,-0.001,0.151,0.151, 5273P 9028 +1.,1.,1.,1.,102.706327256509,-77.4608284572515,8.7470375, 5273P 9029 +102.706327256509,-78.0831183447116,8.7470375,102.706327256509, 5273P 9030 +-77.4608284572515,7.10733749999999,102.706327256509, 5273P 9031 +-78.0831183447116,7.10733749999999,-0.00100000000000082, 5273P 9032 +0.0566862004598022,-0.001,0.151; 5273P 9033 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5275P 9034 +0.0751056188123522,0.0751056188123522,-0.00100000000000001, 5275P 9035 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,101.896125393763, 5275P 9036 +-77.4716336129394,8.7470375,102.717114756506,-77.4716157221733, 5275P 9037 +8.7470375,101.896125393763,-77.4716336129394,7.10733749999999, 5275P 9038 +102.717114756506,-77.4716157221733,7.10733749999999, 5275P 9039 +-0.00100000000000178,0.0751056188123522,-0.00100000000000001, 5275P 9040 +0.151; 5275P 9041 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18750703430176, 5277P 9042 +1.18750703430176,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5277P 9043 +101.90691289376,-64.661401245331,8.7470375,101.90691289376, 5277P 9044 +-77.4824208778613,8.7470375,101.90691289376,-64.661401245331, 5277P 9045 +7.10733749999999,101.90691289376,-77.4824208778613, 5277P 9046 +7.10733749999999,-0.001,1.18750703430176,-0.001,0.151; 5277P 9047 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5279P 9048 +0.0751056188123521,0.0751056188123521,-0.001,-0.001,0.151,0.151, 5279P 9049 +1.,1.,1.,1.,102.717114756506,-64.6721710896431,8.7470375, 5279P 9050 +101.896125393763,-64.6721889804091,8.7470375,102.717114756506, 5279P 9051 +-64.6721710896431,7.10733749999999,101.896125393763, 5279P 9052 +-64.6721889804091,7.10733749999999,-0.00100000000000178, 5279P 9053 +0.0751056188123521,-0.001,0.151; 5279P 9054 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0566958897908557, 5281P 9055 +0.0566958897908557,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5281P 9056 +102.706327256509,-64.0605644136024,8.7470375,102.706327256509, 5281P 9057 +-64.6829588247213,8.7470375,102.706327256509,-64.0605644136024, 5281P 9058 +7.10733749999999,102.706327256509,-64.6829588247213, 5281P 9059 +7.10733749999999,-0.001,0.0566958897908557,-0.001,0.151; 5281P 9060 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5283P 9061 +1.29888831710916,1.29888831710916,-0.00100000000000009, 5283P 9062 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,97.6677161670568, 5283P 9063 +-64.0713693476345,8.7470375,83.6451709462526,-64.0713519001801, 5283P 9064 +8.7470375,97.6677161670568,-64.0713693476345,7.10733749999999, 5283P 9065 +83.6451709462526,-64.0713519001801,7.1073375, 5283P 9066 +-0.00100000000000002,1.29888831710916,-0.00100000000000009, 5283P 9067 +0.151; 5283P 9068 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0566958897908597, 5285P 9069 +0.0566958897908597,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5285P 9070 +97.6569286670568,-64.6829762453311,8.7470375,97.6569286670568, 5285P 9071 +-64.0605818342122,8.7470375,97.6569286670568,-64.6829762453311, 5285P 9072 +7.10733749999999,97.6569286670568,-64.0605818342122, 5285P 9073 +7.10733749999999,-0.001,0.0566958897908597,-0.001,0.151; 5285P 9074 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5287P 9075 +0.0751056188123537,0.0751056188123537,-0.001,-0.001,0.151,0.151, 5287P 9076 +1.,1.,1.,1.,98.4671305298027,-64.6721710896431,8.7470375, 5287P 9077 +97.6461411670594,-64.6721889804092,8.7470375,98.4671305298027, 5287P 9078 +-64.6721710896431,7.10733749999999,97.6461411670594, 5287P 9079 +-64.6721889804092,7.10733749999999,-0.00100000000000178, 5287P 9080 +0.0751056188123537,-0.001,0.151; 5287P 9081 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5289P 9082 +1.18750703430176,1.18750703430176,-0.001,-0.001,0.151,0.151,1., 5289P 9083 +1.,1.,1.,98.4563430298053,-77.4824034572515,8.7470375, 5289P 9084 +98.4563430298053,-64.6613838247213,8.7470375,98.4563430298053, 5289P 9085 +-77.4824034572515,7.10733749999999,98.4563430298053, 5289P 9086 +-64.6613838247213,7.10733749999999,-0.00100000000000178, 5289P 9087 +1.18750703430176,-0.001,0.151; 5289P 9088 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000165,-0.00100000000000165, 5291P 9089 +0.0751056188123537,0.0751056188123537,-0.00100000000000001, 5291P 9090 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,97.6461411670594, 5291P 9091 +-77.4716336129394,8.7470375,98.4671305298027,-77.4716157221734, 5291P 9092 +8.7470375,97.6461411670594,-77.4716336129394,7.10733749999999, 5291P 9093 +98.4671305298027,-77.4716157221734,7.10733749999999, 5291P 9094 +-0.00100000000000165,0.0751056188123537,-0.00100000000000001, 5291P 9095 +0.151; 5291P 9096 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000089,-0.00100000000000089, 5293P 9097 +0.0566862004597987,0.0566862004597987,-0.001,-0.001,0.151,0.151, 5293P 9098 +1.,1.,1.,1.,97.6569286670568,-78.0831357653214,8.7470375, 5293P 9099 +97.6569286670568,-77.4608458778613,8.7470375,97.6569286670568, 5293P 9100 +-78.0831357653214,7.10733749999999,97.6569286670568, 5293P 9101 +-77.4608458778613,7.10733749999999,-0.00100000000000089, 5293P 9102 +0.0566862004597987,-0.001,0.151; 5293P 9103 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888912455341, 5295P 9104 +1.29888912455341,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5295P 9105 +83.6451622359477,-78.0723308312893,8.7470375,97.6677161670568, 5295P 9106 +-78.0723482787436,8.7470375,83.6451622359477,-78.0723308312893, 5295P 9107 +7.1073375,97.6677161670569,-78.0723482787436,7.1073375,-0.001, 5295P 9108 +1.29888912455341,-0.001,0.151; 5295P 9109 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000089,-0.00100000000000089, 5297P 9110 +0.0566862004656559,0.0566862004656559,-0.001,-0.001,0.151,0.151, 5297P 9111 +1.,1.,1.,1.,83.6559586026702,-77.4608284572526,8.7470375, 5297P 9112 +83.6559495795301,-78.0831183447104,8.7470375,83.6559586026702, 5297P 9113 +-77.4608284572526,7.1073375,83.65594957953,-78.0831183447104, 5297P 9114 +7.1073375,-0.00100000000000089,0.0566862004656559,-0.001,0.151; 5297P 9115 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5299P 9116 +0.0751056188123522,0.0751056188123522,-0.00100000000000001, 5299P 9117 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,82.8457565835067, 5299P 9118 +-77.4716336129394,8.7470375,83.66674594625,-77.4716157221733, 5299P 9119 +8.7470375,82.8457565835067,-77.4716336129394,7.1073375, 5299P 9120 +83.66674594625,-77.4716157221733,7.1073375,-0.00100000000000178, 5299P 9121 +0.0751056188123522,-0.00100000000000001,0.151; 5299P 9122 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18750703430176, 5301P 9123 +1.18750703430176,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5301P 9124 +82.8565440835042,-64.661401245331,8.7470375,82.8565440835042, 5301P 9125 +-77.4824208778613,8.7470375,82.8565440835042,-64.661401245331, 5301P 9126 +7.1073375,82.8565440835042,-77.4824208778613,7.1073375,-0.001, 5301P 9127 +1.18750703430176,-0.001,0.151; 5301P 9128 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5303P 9129 +0.0751056188123521,0.0751056188123521,-0.001,-0.001,0.151,0.151, 5303P 9130 +1.,1.,1.,1.,83.66674594625,-64.6721710896431,8.7470375, 5303P 9131 +82.8457565835067,-64.6721889804091,8.7470375,83.66674594625, 5303P 9132 +-64.6721710896431,7.1073375,82.8457565835067,-64.6721889804091, 5303P 9133 +7.1073375,-0.00100000000000178,0.0751056188123521,-0.001,0.151; 5303P 9134 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0566958897908557, 5305P 9135 +0.0566958897908557,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5305P 9136 +83.6559584462526,-64.0605644136024,8.7470375,83.6559584462526, 5305P 9137 +-64.6829588247213,8.7470375,83.6559584462526,-64.0605644136024, 5305P 9138 +7.1073375,83.6559584462526,-64.6829588247213,7.1073375,-0.001, 5305P 9139 +0.0566958897908557,-0.001,0.151; 5305P 9140 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5307P 9141 +1.29888831710916,1.29888831710916,-0.00100000000000009, 5307P 9142 +-0.00100000000000009,0.151,0.151,1.,1.,1.,1.,78.6173473568005, 5307P 9143 +-64.0713693476345,8.7470375,64.5948021359963,-64.0713519001801, 5307P 9144 +8.7470375,78.6173473568005,-64.0713693476345,7.1073375, 5307P 9145 +64.5948021359963,-64.0713519001801,7.1073375, 5307P 9146 +-0.00100000000000002,1.29888831710916,-0.00100000000000009, 5307P 9147 +0.151; 5307P 9148 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0566958897908597, 5309P 9149 +0.0566958897908597,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5309P 9150 +78.6065598568005,-64.6829762453311,8.7470375,78.6065598568005, 5309P 9151 +-64.0605818342122,8.7470375,78.6065598568005,-64.6829762453311, 5309P 9152 +7.1073375,78.6065598568005,-64.0605818342122,7.1073375,-0.001, 5309P 9153 +0.0566958897908597,-0.001,0.151; 5309P 9154 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 5311P 9155 +0.0751056188123521,0.0751056188123521,-0.001,-0.001,0.151,0.151, 5311P 9156 +1.,1.,1.,1.,79.4167617195464,-64.6721710896431,8.7470375, 5311P 9157 +78.5957723568031,-64.6721889804092,8.7470375,79.4167617195464, 5311P 9158 +-64.6721710896431,7.1073375,78.5957723568031,-64.6721889804092, 5311P 9159 +7.1073375,-0.00100000000000266,0.0751056188123521,-0.001,0.151; 5311P 9160 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5313P 9161 +1.18750703430176,1.18750703430176,-0.001,-0.001,0.151,0.151,1., 5313P 9162 +1.,1.,1.,79.4059742195489,-77.4824034572515,8.7470375, 5313P 9163 +79.4059742195489,-64.6613838247213,8.7470375,79.4059742195489, 5313P 9164 +-77.4824034572515,7.1073375,79.4059742195489,-64.6613838247213, 5313P 9165 +7.1073375,-0.00100000000000178,1.18750703430176,-0.001,0.151; 5313P 9166 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 5315P 9167 +0.0751056188123522,0.0751056188123522,-0.00100000000000001, 5315P 9168 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,78.595772356803, 5315P 9169 +-77.4716336129394,8.7470375,79.4167617195464,-77.4716157221734, 5315P 9170 +8.7470375,78.595772356803,-77.4716336129394,7.1073375, 5315P 9171 +79.4167617195464,-77.4716157221734,7.1073375, 5315P 9172 +-0.00100000000000266,0.0751056188123522,-0.00100000000000001, 5315P 9173 +0.151; 5315P 9174 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000089,-0.00100000000000089, 5317P 9175 +0.0566862004597987,0.0566862004597987,-0.001,-0.001,0.151,0.151, 5317P 9176 +1.,1.,1.,1.,78.6065598568005,-78.0831357653214,8.7470375, 5317P 9177 +78.6065598568005,-77.4608458778613,8.7470375,78.6065598568005, 5317P 9178 +-78.0831357653214,7.1073375,78.6065598568005,-77.4608458778613, 5317P 9179 +7.1073375,-0.00100000000000089,0.0566862004597987,-0.001,0.151; 5317P 9180 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29888831710916, 5319P 9181 +1.29888831710916,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5319P 9182 +64.5948021359963,-78.0723308312893,8.7470375,78.6173473568005, 5319P 9183 +-78.0723482787436,8.7470375,64.5948021359963,-78.0723308312893, 5319P 9184 +7.1073375,78.6173473568005,-78.0723482787436,7.1073375,-0.001, 5319P 9185 +1.29888831710916,-0.001,0.151; 5319P 9186 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000082,-0.00100000000000082, 5321P 9187 +0.0566862004598022,0.0566862004598022,-0.001,-0.001,0.151,0.151, 5321P 9188 +1.,1.,1.,1.,64.6055896359963,-77.4608284572515,8.7470375, 5321P 9189 +64.6055896359963,-78.0831183447116,8.7470375,64.6055896359963, 5321P 9190 +-77.4608284572515,7.1073375,64.6055896359963,-78.0831183447116, 5321P 9191 +7.1073375,-0.00100000000000082,0.0566862004598022,-0.001,0.151; 5321P 9192 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000266,-0.00100000000000266, 5323P 9193 +0.0751056188123522,0.0751056188123522,-0.00100000000000001, 5323P 9194 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,63.7953877732504, 5323P 9195 +-77.4716336129394,8.7470375,64.6163771359937,-77.4716157221733, 5323P 9196 +8.7470375,63.7953877732504,-77.4716336129394,7.1073375, 5323P 9197 +64.6163771359937,-77.4716157221733,7.1073375, 5323P 9198 +-0.00100000000000266,0.0751056188123522,-0.00100000000000001, 5323P 9199 +0.151; 5323P 9200 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18750703430176, 5325P 9201 +1.18750703430176,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5325P 9202 +63.8061752732478,-64.661401245331,8.7470375,63.8061752732478, 5325P 9203 +-77.4824208778613,8.7470375,63.8061752732478,-64.661401245331, 5325P 9204 +7.1073375,63.8061752732478,-77.4824208778613,7.1073375,-0.001, 5325P 9205 +1.18750703430176,-0.001,0.151; 5325P 9206 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000249,-0.00100000000000249, 5327P 9207 +0.0751056188123528,0.0751056188123528,-0.001,-0.001,0.151,0.151, 5327P 9208 +1.,1.,1.,1.,64.6163771359937,-64.6721710896431,8.7470375, 5327P 9209 +63.7953877732504,-64.6721889804091,8.7470375,64.6163771359937, 5327P 9210 +-64.6721710896431,7.1073375,63.7953877732504,-64.6721889804091, 5327P 9211 +7.1073375,-0.00100000000000249,0.0751056188123528,-0.001,0.151; 5327P 9212 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0566958897908557, 5329P 9213 +0.0566958897908557,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5329P 9214 +64.6055896359963,-64.0605644136024,8.7470375,64.6055896359963, 5329P 9215 +-64.6829588247213,8.7470375,64.6055896359963,-64.0605644136024, 5329P 9216 +7.1073375,64.6055896359963,-64.6829588247213,7.1073375,-0.001, 5329P 9217 +0.0566958897908557,-0.001,0.151; 5329P 9218 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5331P 9219 +1.29879626846414,1.29879626846414,-0.001,-0.001,0.151,0.151,1., 5331P 9220 +1.,1.,1.,59.5672485659959,-64.0713693476354,8.7470375, 5331P 9221 +45.5456963199499,-64.0713519001792,8.7470375,59.5672485659959, 5331P 9222 +-64.0713693476354,7.1073375,45.5456963199499,-64.0713519001792, 5331P 9223 +7.1073375,-0.00100000000000002,1.29879626846414,-0.001,0.151; 5331P 9224 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0566958897908597, 5333P 9225 +0.0566958897908597,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5333P 9226 +59.5564610659959,-64.6829762453311,8.7470375,59.5564610659959, 5333P 9227 +-64.0605818342122,8.7470375,59.5564610659959,-64.6829762453311, 5333P 9228 +7.1073375,59.5564610659959,-64.0605818342122,7.1073375,-0.001, 5333P 9229 +0.0566958897908597,-0.001,0.151; 5333P 9230 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000089,-0.00100000000000089, 5335P 9231 +0.0751056188123538,0.0751056188123538,-0.00100000000000011, 5335P 9232 +-0.00100000000000011,0.151,0.151,1.,1.,1.,1.,60.3666629287418, 5335P 9233 +-64.6721710896431,8.7470375,59.5456735659985,-64.6721889804092, 5335P 9234 +8.7470375,60.3666629287418,-64.6721710896431,7.1073375, 5335P 9235 +59.5456735659985,-64.6721889804092,7.1073375, 5335P 9236 +-0.00100000000000089,0.0751056188123538,-0.00100000000000011, 5335P 9237 +0.151; 5335P 9238 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5337P 9239 +1.18750703430176,1.18750703430176,-0.001,-0.001,0.151,0.151,1., 5337P 9240 +1.,1.,1.,60.3558754287444,-77.4824034572515,8.7470375, 5337P 9241 +60.3558754287444,-64.6613838247213,8.7470375,60.3558754287444, 5337P 9242 +-77.4824034572515,7.1073375,60.3558754287444,-64.6613838247213, 5337P 9243 +7.1073375,-0.00100000000000178,1.18750703430176,-0.001,0.151; 5337P 9244 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000089,-0.00100000000000089, 5339P 9245 +0.0751056188123538,0.0751056188123538,-0.001,-0.001,0.151,0.151, 5339P 9246 +1.,1.,1.,1.,59.5456735659985,-77.4716336129394,8.7470375, 5339P 9247 +60.3666629287418,-77.4716157221734,8.7470375,59.5456735659985, 5339P 9248 +-77.4716336129394,7.1073375,60.3666629287418,-77.4716157221734, 5339P 9249 +7.1073375,-0.00100000000000089,0.0751056188123538,-0.001,0.151; 5339P 9250 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000089,-0.00100000000000089, 5341P 9251 +0.0566862004597987,0.0566862004597987,-0.001,-0.001,0.151,0.151, 5341P 9252 +1.,1.,1.,1.,59.5564610659959,-78.0831357653214,8.7470375, 5341P 9253 +59.5564610659959,-77.4608458778613,8.7470375,59.5564610659959, 5341P 9254 +-78.0831357653214,7.1073375,59.5564610659959,-77.4608458778613, 5341P 9255 +7.1073375,-0.00100000000000089,0.0566862004597987,-0.001,0.151; 5341P 9256 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.29879626846414, 5343P 9257 +1.29879626846414,-0.00100000000000011,-0.00100000000000011, 5343P 9258 +0.151,0.151,1.,1.,1.,1.,45.5456963199499,-78.0723308312883, 5343P 9259 +8.7470375,59.5672485659959,-78.0723482787446,8.7470375, 5343P 9260 +45.5456963199499,-78.0723308312883,7.1073375,59.5672485659959, 5343P 9261 +-78.0723482787446,7.1073375,-0.001,1.29879626846414, 5343P 9262 +-0.00100000000000011,0.151; 5343P 9263 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000082,-0.00100000000000082, 5345P 9264 +0.0566862004598022,0.0566862004598022,-0.001,-0.001,0.151,0.151, 5345P 9265 +1.,1.,1.,1.,45.5564838199499,-77.4608284572515,8.7470375, 5345P 9266 +45.5564838199499,-78.0831183447116,8.7470375,45.5564838199499, 5345P 9267 +-77.4608284572515,7.1073375,45.5564838199499,-78.0831183447116, 5345P 9268 +7.1073375,-0.00100000000000082,0.0566862004598022,-0.001,0.151; 5345P 9269 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000089,-0.00100000000000089, 5347P 9270 +0.0751621399101601,0.0751621399101601,-0.00100000000000001, 5347P 9271 +-0.00100000000000001,0.151,0.151,1.,1.,1.,1.,44.7456722358612, 5347P 9272 +-77.4716336127602,8.7470375,45.5672713199473,-77.4716157223525, 5347P 9273 +8.7470375,44.7456722358612,-77.4716336127602,7.1073375, 5347P 9274 +45.5672713199473,-77.4716157223525,7.1073375, 5347P 9275 +-0.00100000000000089,0.0751621399101601,-0.00100000000000001, 5347P 9276 +0.151; 5347P 9277 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.18750703430286, 5349P 9278 +1.18750703430286,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5349P 9279 +44.7564771711507,-64.661401245331,8.7470375,44.7564597211764, 5349P 9280 +-77.4824208778613,8.7470375,44.7564771711507,-64.661401245331, 5349P 9281 +7.1073375,44.7564597211764,-77.4824208778613,7.1073375,-0.001, 5349P 9282 +1.18750703430286,-0.001,0.151; 5349P 9283 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000089,-0.00100000000000089, 5351P 9284 +0.0751621399101601,0.0751621399101601,-0.001,-0.001,0.151,0.151, 5351P 9285 +1.,1.,1.,1.,45.5672887405571,-64.6721710898223,8.7470375, 5351P 9286 +44.745689656471,-64.67218898023,8.7470375,45.5672887405571, 5351P 9287 +-64.6721710898223,7.1073375,44.745689656471,-64.67218898023, 5351P 9288 +7.1073375,-0.00100000000000089,0.0751621399101601,-0.001,0.151; 5351P 9289 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.0566958898142677, 5353P 9290 +0.0566958898142677,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5353P 9291 +45.556483507169,-64.0605644136069,8.7470375,45.5565015533406, 5353P 9292 +-64.6829588247167,8.7470375,45.556483507169,-64.0605644136069, 5353P 9293 +7.1073375,45.5565015533406,-64.6829588247167,7.1073375,-0.001, 5353P 9294 +0.0566958898142677,-0.001,0.151; 5353P 9295 +128,1,2,1,2,0,0,0,0,0,-1.22399089060933D-16, 5355P 9296 +-1.22399089060933D-16,0.808189655172426,0.808189655172426,0.,0., 5355P 9297 +0.,1.53806598054936,1.53806598054936,1.53806598054936,1.,1., 5355P 9298 +0.718583503390008,0.718583503390008,1.,1.,155.763761628875, 5355P 9299 +-53.5475075752323,7.11812499999999,155.763761628875, 5355P 9300 +-53.5475075752323,8.73624999999999,157.701439739527, 5355P 9301 +-53.5475075752323,7.11812499999999,157.701439739527, 5355P 9302 +-53.5475075752323,8.73624999999999,157.764849292068, 5355P 9303 +-55.4841478849295,7.11812499999999,157.764849292068, 5355P 9304 +-55.4841478849295,8.73624999999999,-1.22399089060933D-16, 5355P 9305 +0.808189655172426,0.,1.53806598054936; 5355P 9306 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,10.305761256663, 5357P 9307 +10.305761256663,-0.00100000000000003,-0.00100000000000003,0.151, 5357P 9308 +0.151,1.,1.,1.,1.,44.5903620726228,-53.5475075752323,8.7470375, 5357P 9309 +155.774549128875,-53.5475075752323,8.74703749999999, 5357P 9310 +44.5903620726228,-53.5475075752323,7.1073375,155.774549128875, 5357P 9311 +-53.5475075752323,7.10733749999999,-0.001,10.305761256663, 5357P 9312 +-0.00100000000000003,0.151; 5357P 9313 +128,1,2,1,2,0,0,0,0,0,-2.17306280968065D-30, 5359P 9314 +-2.17306280968065D-30,0.808189655172443,0.808189655172443, 5359P 9315 +-1.25985272984906D-14,-1.25985272984906D-14, 5359P 9316 +-1.25985272984906D-14,1.57079496575076,1.57079496575076, 5359P 9317 +1.57079496575076,1.,1.,0.707107262388147,0.707107262388147,1., 5359P 9318 +1.,42.5989895726247,-55.5496648502041,7.118125,42.5989895726247, 5359P 9319 +-55.5496648502041,8.73625,42.5989922976491,-53.5475075752323, 5359P 9320 +7.118125,42.5989922976491,-53.5475075752323,8.73625, 5359P 9321 +44.6011495726228,-53.5475075752324,7.118125,44.6011495726228, 5359P 9322 +-53.5475075752324,8.73625,-2.17306280968065D-30, 5359P 9323 +0.808189655172443,-1.25985272984906D-14,1.57079496575076; 5359P 9324 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,7.62068862441746, 5361P 9325 +7.62068862441746,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5361P 9326 +42.5989922980068,-137.757843386107,8.7470375,42.5989895722671, 5361P 9327 +-55.5388773502041,8.7470375,42.5989922980068,-137.757843386107, 5361P 9328 +7.1073375,42.5989895722671,-55.5388773502041,7.1073375,-0.001, 5361P 9329 +7.62068862441746,-0.001,0.151; 5361P 9330 +128,1,2,1,2,0,0,0,0,0,-1.0865314048403D-30,-1.0865314048403D-30, 5363P 9331 +0.808189655172426,0.808189655172426,5.99711237284094D-16, 5363P 9332 +5.99711237284094D-16,5.99711237284094D-16,1.57079632679492, 5363P 9333 +1.57079632679492,1.57079632679492,1.,1.,0.707106781186538, 5363P 9334 +0.707106781186538,1.,1.,44.6011522976492,-139.749215886107, 5363P 9335 +7.118125,44.6011522976492,-139.749215886107,8.73625, 5363P 9336 +42.5989922976492,-139.749215886107,7.118125,42.5989922976492, 5363P 9337 +-139.749215886107,8.73625,42.5989922976492,-137.747055886107, 5363P 9338 +7.118125,42.5989922976492,-137.747055886107,8.73625, 5363P 9339 +-1.0865314048403D-30,0.808189655172426,5.99711237284094D-16, 5363P 9340 +1.57079632679492; 5363P 9341 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5365P 9342 +10.3057578082426,10.3057578082426,-0.001,-0.001,0.151,0.151,1., 5365P 9343 +1.,1.,1.,155.774514654066,-139.749215886107,8.74703749999999, 5365P 9344 +44.5903647976492,-139.749215886107,8.7470375,155.774514654066, 5365P 9345 +-139.749215886107,7.10733749999999,44.5903647976492, 5365P 9346 +-139.749215886107,7.1073375,-0.00100000000000002, 5365P 9347 +10.3057578082426,-0.001,0.151; 5365P 9348 +128,1,4,1,2,0,0,0,0,0,-1.22464679896581D-16, 5367P 9349 +-1.22464679896581D-16,0.808189655172408,0.808189655172408, 5367P 9350 +2.97223250293513D-15,2.97223250293513D-15,2.97223250293513D-15, 5367P 9351 +0.785406772727348,0.785406772727348,1.57081354545469, 5367P 9352 +1.57081354545469,1.57081354545469,1.,1.,0.92387788517877, 5367P 9353 +0.92387788517877,1.,1.,0.92387788517877,0.92387788517877,1.,1., 5367P 9354 +157.76588715377,-137.747021411595,7.11812499999999, 5367P 9355 +157.76588715377,-137.747021411595,8.73624999999999, 5367P 9356 +157.765901433754,-138.576353334882,7.11812499999999, 5367P 9357 +157.765901433754,-138.576353334882,8.73624999999999, 5367P 9358 +157.179480255615,-139.162784610495,7.11812499999999, 5367P 9359 +157.179480255615,-139.162784610495,8.73624999999999, 5367P 9360 +156.593059077476,-139.749215886107,7.11812499999999, 5367P 9361 +156.593059077476,-139.749215886107,8.73624999999999, 5367P 9362 +155.763727154066,-139.749215886107,7.11812499999999, 5367P 9363 +155.763727154066,-139.749215886107,8.73624999999999, 5367P 9364 +-1.22464679896581D-16,0.808189655172408,2.97223250293513D-15, 5367P 9365 +1.57081354545469; 5367P 9366 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,5.58852310204211, 5369P 9367 +5.58852310204211,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5369P 9368 +157.764849106322,-77.4608284572531,8.74703749999999, 5369P 9369 +157.765887339516,-137.757808911594,8.74703749999999, 5369P 9370 +157.764849106322,-77.4608284572531,7.10733749999999, 5369P 9371 +157.765887339516,-137.757808911594,7.10733749999999,-0.001, 5369P 9372 +5.58852310204211,-0.001,0.151; 5369P 9373 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,2.03923574250957, 5371P 9374 +2.03923574250957,-0.001,-0.001,0.151,0.151,1.,1.,1.,1., 5371P 9375 +157.764849292068,-55.4733603849295,8.74703749999999, 5371P 9376 +157.764849292068,-77.4824034572515,8.74703749999999, 5371P 9377 +157.764849292068,-55.4733603849295,7.10733749999999, 5371P 9378 +157.764849292068,-77.4824034572515,7.10733749999999,-0.001, 5371P 9379 +2.03923574250957,-0.001,0.151; 5371P 9380 +128,1,1,1,1,0,0,1,0,0,-5.33898035415141,-5.33898035415141, 5373P 9381 +5.33897903042604,5.33897903042604,-3.99644418590382, 5373P 9382 +-3.99644418590382,3.99644418590383,3.99644418590383,1.,1.,1.,1., 5373P 9383 +157.776688933754,-139.760003386107,7.11812499999999, 5373P 9384 +42.5882020726247,-139.760003386107,7.118125,157.776688933754, 5373P 9385 +-53.5367200752323,7.11812499999999,42.5882020726247, 5373P 9386 +-53.5367200752323,7.118125,-5.33898035415141,5.33897903042604, 5373P 9387 +-3.99644418590382,3.99644418590383; 5373P 9388 +128,1,1,1,1,0,0,1,0,0,-5.33898035415141,-5.33898035415141, 5375P 9389 +5.33897903042604,5.33897903042604,-3.99644418590382, 5375P 9390 +-3.99644418590382,3.99644418590383,3.99644418590383,1.,1.,1.,1., 5375P 9391 +42.5882020726247,-139.760003386107,8.73625,157.776688933754, 5375P 9392 +-139.760003386107,8.73624999999999,42.5882020726247, 5375P 9393 +-53.5367200752323,8.73625,157.776688933754,-53.5367200752323, 5375P 9394 +8.73624999999999,-5.33898035415141,5.33897903042604, 5375P 9395 +-3.99644418590382,3.99644418590383; 5375P 9396 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.84523828125,0.84523828125, 5377P 9397 +-0.001,-0.001,0.101,0.101,1.,1.,1.,1.,83.9631823855374, 5377P 9398 +-232.571324596043,-7.48999999999994,83.9631823855374, 5377P 9399 +-224.108941783543,-7.48999999999994,83.9631823855374, 5377P 9400 +-232.571324596043,-8.50999999999994,83.9631823855374, 5377P 9401 +-224.108941783543,-8.50999999999994,-0.001,0.84523828125,-0.001, 5377P 9402 +0.101; 5377P 9403 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5379P 9404 +2.516625,2.516625,-0.00100000000000116,-0.00100000000000116, 5379P 9405 +0.101000000000001,0.101000000000001,1.,1.,1.,1., 5379P 9406 +83.9731823855374,-224.118941783543,-7.48999999999994, 5379P 9407 +58.7969323855374,-224.118941783543,-7.48999999999994, 5379P 9408 +83.9731823855374,-224.118941783543,-8.50999999999996, 5379P 9409 +58.7969323855374,-224.118941783543,-8.50999999999997, 5379P 9410 +-0.00100000000000002,2.516625,-0.00100000000000116, 5379P 9411 +0.101000000000001; 5379P 9412 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,4.12648828125,4.12648828125, 5381P 9413 +-0.001,-0.001,0.101000000000001,0.101000000000001,1.,1.,1.,1., 5381P 9414 +58.8069323855374,-224.128941783543,-7.48999999999996, 5381P 9415 +58.8069323855374,-182.854058971043,-7.48999999999996, 5381P 9416 +58.8069323855374,-224.128941783543,-8.50999999999997, 5381P 9417 +58.8069323855374,-182.854058971043,-8.50999999999997,-0.001, 5381P 9418 +4.12648828125,-0.001,0.101000000000001; 5381P 9419 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5383P 9420 +1.01271875,1.01271875,-0.001,-0.001,0.101000000000001, 5383P 9421 +0.101000000000001,1.,1.,1.,1.,58.8169323855374, 5383P 9422 +-182.864058971043,-7.48999999999995,48.6797448855374, 5383P 9423 +-182.864058971043,-7.48999999999996,58.8169323855374, 5383P 9424 +-182.864058971043,-8.50999999999997,48.6797448855374, 5383P 9425 +-182.864058971043,-8.50999999999997,-0.00100000000000002, 5383P 9426 +1.01271875,-0.001,0.101000000000001; 5383P 9427 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,4.9707265625,4.9707265625, 5385P 9428 +-0.001,-0.001,0.101000000000001,0.101000000000001,1.,1.,1.,1., 5385P 9429 +48.6897448855374,-182.854058971043,-7.48999999999996, 5385P 9430 +48.6897448855374,-232.571324596043,-7.48999999999996, 5385P 9431 +48.6897448855374,-182.854058971043,-8.50999999999997, 5385P 9432 +48.6897448855374,-232.571324596043,-8.50999999999997,-0.001, 5385P 9433 +4.9707265625,-0.001,0.101000000000001; 5385P 9434 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,3.52834375,3.52834375, 5387P 9435 +-0.001,-0.001,0.101000000000001,0.101000000000001,1.,1.,1.,1., 5387P 9436 +48.6797448855374,-232.561324596043,-7.48999999999995, 5387P 9437 +83.9731823855374,-232.561324596043,-7.48999999999994, 5387P 9438 +48.6797448855374,-232.561324596043,-8.50999999999996, 5387P 9439 +83.9731823855374,-232.561324596043,-8.50999999999995,-0.001, 5387P 9440 +3.52834375,-0.001,0.101000000000001; 5387P 9441 +128,1,1,1,1,0,0,1,0,0,-1.764671875,-1.764671875,1.764671875, 5389P 9442 +1.764671875,-2.48586328125,-2.48586328125,2.48586328125, 5389P 9443 +2.48586328125,1.,1.,1.,1.,48.6797448855374,-232.571324596043, 5389P 9444 +-8.49999999999996,83.9731823855374,-232.571324596043, 5389P 9445 +-8.49999999999995,48.6797448855374,-182.854058971043, 5389P 9446 +-8.49999999999996,83.9731823855374,-182.854058971043, 5389P 9447 +-8.49999999999995,-1.764671875,1.764671875,-2.48586328125, 5389P 9448 +2.48586328125; 5389P 9449 +128,1,6,1,2,0,0,0,0,0,11.5962540906493,11.5962540906493, 5391P 9450 +14.5245559935925,14.5245559935925,3.13917765423161, 5391P 9451 +3.13917765423161,3.13917765423161,4.18718020521427, 5391P 9452 +4.18718020521427,5.23518275619693,5.23518275619693, 5391P 9453 +6.28318530717959,6.28318530717959,6.28318530717959,1.,1., 5391P 9454 +0.865824083692631,0.865824083692631,1.,1.,0.865824083692631, 5391P 9455 +0.865824083692631,1.,1.,0.865824083692631,0.865824083692631,1., 5391P 9456 +1.,18.9406505609936,-172.121201750437,-7.49999999999996, 5391P 9457 +18.9406505609936,-172.121201750437,-11.6,18.9396735534978, 5391P 9458 +-171.312085990108,-7.49999999999996,18.9396735534978, 5391P 9459 +-171.312085990108,-11.6,19.6402259760079,-170.907245809948, 5391P 9460 +-7.49999999999996,19.6402259760079,-170.907245809948,-11.6, 5391P 9461 +20.340778398518,-170.502405629789,-7.49999999999996, 5391P 9462 +20.340778398518,-170.502405629789,-11.6,21.0413308210281, 5391P 9463 +-170.907245809948,-7.49999999999996,21.0413308210281, 5391P 9464 +-170.907245809948,-11.6,21.7418832435383,-171.312085990108, 5391P 9465 +-7.49999999999996,21.7418832435383,-171.312085990108,-11.6, 5391P 9466 +21.7409062360425,-172.121201750437,-7.49999999999996, 5391P 9467 +21.7409062360425,-172.121201750437,-11.6,11.5962540906493, 5391P 9468 +14.5245559935925,3.13917765423161,6.28318530717959; 5391P 9469 +128,1,6,1,2,0,0,0,0,0,11.5962540906495,11.5962540906495, 5393P 9470 +14.5245559935927,14.5245559935927,3.13917765425437, 5393P 9471 +3.13917765425437,3.13917765425437,4.18718020522942, 5393P 9472 +4.18718020522942,5.23518275620448,5.23518275620448, 5393P 9473 +6.28318530717956,6.28318530717956,6.28318530717956,1.,1., 5393P 9474 +0.865824083694531,0.865824083694531,1.,1.,0.865824083694531, 5393P 9475 +0.865824083694531,1.,1.,0.865824083694531,0.865824083694531,1., 5393P 9476 +1.,21.7409062360425,-172.121201750437,-7.49999999999996, 5393P 9477 +21.7409062360425,-172.121201750437,-11.6,21.7418832435291, 5393P 9478 +-172.930317510758,-7.49999999999996,21.7418832435291, 5393P 9479 +-172.930317510758,-11.6,21.0413308210236,-173.335157690912, 5393P 9480 +-7.49999999999996,21.0413308210236,-173.335157690912,-11.6, 5393P 9481 +20.3407783985181,-173.739997871065,-7.49999999999996, 5393P 9482 +20.3407783985181,-173.739997871065,-11.6,19.6402259760126, 5393P 9483 +-173.335157690912,-7.49999999999996,19.6402259760126, 5393P 9484 +-173.335157690912,-11.6,18.939673553507,-172.930317510759, 5393P 9485 +-7.49999999999996,18.939673553507,-172.930317510759,-11.6, 5393P 9486 +18.9406505609936,-172.121201750437,-7.49999999999996, 5393P 9487 +18.9406505609936,-172.121201750437,-11.6,11.5962540906495, 5393P 9488 +14.5245559935927,3.13917765425437,6.28318530717956; 5393P 9489 +128,1,6,1,2,0,0,0,0,0,11.5962540906494,11.5962540906494, 5395P 9490 +14.5245559935926,14.5245559935926,3.13917765424305, 5395P 9491 +3.13917765424305,3.13917765424305,4.18718020522189, 5395P 9492 +4.18718020522189,5.23518275620074,5.23518275620074, 5395P 9493 +6.28318530717959,6.28318530717959,6.28318530717959,1.,1., 5395P 9494 +0.865824083693586,0.865824083693586,1.,1.,0.865824083693586, 5395P 9495 +0.865824083693586,1.,1.,0.865824083693586,0.865824083693586,1., 5395P 9496 +1.,97.7151063167837,-190.598023114196,-7.49999999999994, 5395P 9497 +97.7151063167837,-190.598023114196,-11.6,97.7141293092926, 5395P 9498 +-189.78890735387,-7.49999999999994,97.7141293092926, 5395P 9499 +-189.78890735387,-11.6,98.4146817318004,-189.384067173714, 5395P 9500 +-7.49999999999994,98.4146817318004,-189.384067173714,-11.6, 5395P 9501 +99.1152341543082,-188.979226993558,-7.49999999999994, 5395P 9502 +99.1152341543082,-188.979226993558,-11.6,99.815786576816, 5395P 9503 +-189.384067173714,-7.49999999999994,99.815786576816, 5395P 9504 +-189.384067173714,-11.6,100.516338999324,-189.78890735387, 5395P 9505 +-7.49999999999994,100.516338999324,-189.78890735387,-11.6, 5395P 9506 +100.515361991833,-190.598023114196,-7.49999999999994, 5395P 9507 +100.515361991833,-190.598023114196,-11.6,11.5962540906494, 5395P 9508 +14.5245559935926,3.13917765424305,6.28318530717959; 5395P 9509 +128,1,6,1,2,0,0,0,0,0,11.5962540906494,11.5962540906494, 5397P 9510 +14.5245559935926,14.5245559935926,3.13917765424295, 5397P 9511 +3.13917765424295,3.13917765424295,4.18718020522186, 5397P 9512 +4.18718020522186,5.23518275620077,5.23518275620077, 5397P 9513 +6.28318530717964,6.28318530717964,6.28318530717964,1.,1., 5397P 9514 +0.865824083693573,0.865824083693573,1.,1.,0.865824083693573, 5397P 9515 +0.865824083693573,1.,1.,0.865824083693573,0.865824083693573,1., 5397P 9516 +1.,100.515361991833,-190.598023114196,-7.49999999999994, 5397P 9517 +100.515361991833,-190.598023114196,-11.6,100.516338999324, 5397P 9518 +-191.407138874521,-7.49999999999994,100.516338999324, 5397P 9519 +-191.407138874521,-11.6,99.815786576816,-191.811979054677, 5397P 9520 +-7.49999999999994,99.815786576816,-191.811979054677,-11.6, 5397P 9521 +99.1152341543081,-192.216819234834,-7.49999999999994, 5397P 9522 +99.1152341543081,-192.216819234834,-11.6,98.4146817318003, 5397P 9523 +-191.811979054677,-7.49999999999994,98.4146817318003, 5397P 9524 +-191.811979054677,-11.6,97.7141293092925,-191.407138874521, 5397P 9525 +-7.49999999999994,97.7141293092925,-191.407138874521,-11.6, 5397P 9526 +97.7151063167837,-190.598023114196,-7.49999999999994, 5397P 9527 +97.7151063167837,-190.598023114196,-11.6,11.5962540906494, 5397P 9528 +14.5245559935926,3.13917765424295,6.28318530717964; 5397P 9529 +128,1,2,1,2,0,0,0,0,0,0.799309396681273,0.799309396681273, 5399P 9530 +5.99482047510957,5.99482047510957,-1.15918194829754, 5399P 9531 +-1.15918194829754,-1.15918194829754,-0.0292778092733589, 5399P 9532 +-0.0292778092733589,-0.0292778092733589,1.,1.,0.844614262194488, 5399P 9533 +0.844614262194488,1.,1.,4.43314110940288,-167.842837467805, 5399P 9534 +5.50000000000003,4.43314110940289,-167.842837467805, 5399P 9535 +-7.49999999999997,2.97957034725773,-167.208278396419, 5399P 9536 +5.50000000000003,2.97957034725773,-167.208278396419, 5399P 9537 +-7.49999999999997,2.93314110940286,-165.622914872961, 5399P 9538 +5.50000000000003,2.93314110940287,-165.622914872961, 5399P 9539 +-7.49999999999997,0.799309396681273,5.99482047510957, 5399P 9540 +-1.15918194829754,-0.0292778092733589; 5399P 9541 +128,1,1,1,1,0,0,1,0,0,0.228270146333974,0.228270146333974, 5401P 9542 +10.8879873393078,10.8879873393078,0.199,0.199,1.501,1.501,1.,1., 5401P 9543 +1.,1.,7.71696471074415,-248.749215886107,5.51000000000004, 5401P 9544 +114.314136640482,-248.749215886107,5.51000000000006, 5401P 9545 +7.71696471074415,-248.749215886107,-7.50999999999997, 5401P 9546 +114.314136640482,-248.749215886107,-7.50999999999995, 5401P 9547 +0.228270146333974,10.8879873393078,0.199,1.501; 5401P 9548 +128,1,1,1,1,0,0,1,0,0,0.228270146333972,0.228270146333972, 5403P 9549 +6.02854140723685,6.02854140723685,0.198999999999999, 5403P 9550 +0.198999999999999,1.501,1.501,1.,1.,1.,1.,4.43314128158948, 5403P 9551 +-187.461624566824,5.51000000000003,4.43214255261294, 5403P 9552 +-245.464337167254,5.51000000000003,4.43314128158948, 5403P 9553 +-187.461624566824,-7.50999999999997,4.43214255261294, 5403P 9554 +-245.464337167254,-7.50999999999997,0.228270146333972, 5403P 9555 +6.02854140723685,0.198999999999999,1.501; 5403P 9556 +128,1,1,1,1,0,0,1,0,0,3.75618683883495,3.75618683883495, 5405P 9557 +5.55913232655296,5.55913232655296,-4.36108541554375, 5405P 9558 +-4.36108541554375,-4.20908541554375,-4.20908541554375,1.,1.,1., 5405P 9559 +1.,23.4536836497758,-163.037507575232,5.50000000000002, 5405P 9560 +5.4242287725957,-163.037507575232,5.50000000000002, 5405P 9561 +23.4536836497758,-164.557507575232,5.50000000000002, 5405P 9562 +5.4242287725957,-164.557507575232,5.50000000000002, 5405P 9563 +3.75618683883495,5.55913232655296,-4.36108541554375, 5405P 9564 +-4.20908541554375; 5405P 9565 +128,1,1,1,1,0,0,1,0,0,5.65724109287224,5.65724109287224, 5407P 9566 +5.809344879035,5.809344879035,-4.10354468577093, 5407P 9567 +-4.10354468577093,4.11086510715957,4.11086510715957,1.,1.,1.,1., 5407P 9568 +4.44314110940289,-165.612914872961,5.50000000000002, 5407P 9569 +2.92210324777535,-165.612914872961,5.50000000000002, 5407P 9570 +4.44314110940289,-247.757012802266,5.50000000000002, 5407P 9571 +2.92210324777535,-247.757012802266,5.50000000000002, 5407P 9572 +5.65724109287224,5.809344879035,-4.10354468577093, 5407P 9573 +4.11086510715957; 5407P 9574 +128,1,1,1,1,0,0,1,0,0,-5.55912860656964,-5.55912860656964, 5409P 9575 +5.55912887907209,5.55912887907209,4.20908541554374, 5409P 9576 +4.20908541554374,4.36108541554375,4.36108541554375,1.,1.,1.,1., 5409P 9577 +116.606838103822,-248.739215886107,5.50000000000005, 5409P 9578 +5.42426324740444,-248.739215886107,5.50000000000002, 5409P 9579 +116.606838103822,-250.259215886107,5.50000000000005, 5409P 9580 +5.42426324740443,-250.259215886107,5.50000000000002, 5409P 9581 +-5.55912860656964,5.55912887907209,4.20908541554374, 5409P 9582 +4.36108541554375; 5409P 9583 +128,1,1,1,1,0,0,1,0,0,0.228270146333966,0.228270146333966, 5411P 9584 +1.80194548771801,1.80194548771801,0.199,0.199,1.501,1.501,1.,1., 5411P 9585 +1.,1.,23.4536836497758,-164.547507575232,5.51000000000003, 5411P 9586 +7.71693023593539,-164.547507575232,5.51000000000003, 5411P 9587 +23.4536836497758,-164.547507575232,-7.50999999999997, 5411P 9588 +7.7169302359354,-164.547507575232,-7.50999999999998, 5411P 9589 +0.228270146333966,1.80194548771801,0.199,1.501; 5411P 9590 +128,1,1,1,1,0,0,1,0,0,10.0169535374057,10.0169535374057, 5413P 9591 +10.8879910592913,10.8879910592913,0.198999999999999, 5413P 9592 +0.198999999999999,1.501,1.501,1.,1.,1.,1.,114.314139365509, 5413P 9593 +-164.547507575232,5.51000000000006,105.603764146653, 5413P 9594 +-164.547507575232,5.51000000000006,114.314139365509, 5413P 9595 +-164.547507575232,-7.50999999999994,105.603764146653, 5413P 9596 +-164.547507575232,-7.50999999999994,10.0169535374057, 5413P 9597 +10.8879910592913,0.198999999999999,1.501; 5413P 9598 +128,1,1,1,1,0,0,1,0,0,-5.80934505627278,-5.80934505627278, 5415P 9599 +-5.65734461417044,-5.65734461417044,-4.11086968638896, 5415P 9600 +-4.11086968638896,4.11086941554375,4.11086941554375,1.,1.,1.,1., 5415P 9601 +119.109002600853,-165.53966486678,5.50000000000005, 5415P 9602 +117.58899817983,-165.53966486678,5.50000000000005, 5415P 9603 +119.109002600853,-247.757055886107,5.50000000000005, 5415P 9604 +117.58899817983,-247.757055886107,5.50000000000005, 5415P 9605 +-5.80934505627278,-5.65734461417044,-4.11086968638896, 5415P 9606 +4.11086941554375; 5415P 9607 +128,1,1,1,1,0,0,1,0,0,-5.55912887907228,-5.55912887907228, 5417P 9608 +-4.45882121085278,-4.45882121085278,-4.36108541554375, 5417P 9609 +-4.36108541554375,-4.20908541554375,-4.20908541554375,1.,1.,1., 5417P 9610 +1.,116.606840828848,-163.037507575232,5.50000000000005, 5417P 9611 +105.603764146653,-163.037507575232,5.50000000000004, 5417P 9612 +116.606840828848,-164.557507575232,5.50000000000005, 5417P 9613 +105.603764146653,-164.557507575232,5.50000000000004, 5417P 9614 +-5.55912887907228,-4.45882121085278,-4.36108541554375, 5417P 9615 +-4.20908541554375; 5417P 9616 +128,1,6,1,2,0,0,0,0,0,10.7132996449142,10.7132996449142, 5419P 9617 +13.6416015478574,13.6416015478574,3.13925814733116, 5419P 9618 +3.13925814733116,3.13925814733116,4.18720703624771, 5419P 9619 +4.18720703624771,5.23515592516426,5.23515592516426, 5419P 9620 +6.28310481408081,6.28310481408081,6.28310481408081,1.,1., 5419P 9621 +0.865837508249046,0.865837508249046,1.,1.,0.865837508249046, 5419P 9622 +0.865837508249046,1.,1.,0.865837508249046,0.865837508249046,1., 5419P 9623 +1.,21.4157277366876,-228.698656211065,-7.49999999999997, 5419P 9624 +21.4157277366876,-228.698656211065,-11.6,21.4147507896972, 5419P 9625 +-227.831805396136,-7.49999999999997,21.4147507896972, 5419P 9626 +-227.831805396136,-11.6,22.1653032159716,-227.39809772364, 5419P 9627 +-7.49999999999997,22.1653032159716,-227.39809772364,-11.6, 5419P 9628 +22.915855642246,-226.964390051143,-7.49999999999997, 5419P 9629 +22.915855642246,-226.964390051143,-11.6,23.6664080685249, 5419P 9630 +-227.398097723632,-7.49999999999997,23.6664080685249, 5419P 9631 +-227.398097723632,-11.6,24.4169604948039,-227.83180539612, 5419P 9632 +-7.49999999999997,24.4169604948039,-227.83180539612,-11.6, 5419P 9633 +24.4159835478226,-228.69865621105,-7.49999999999997, 5419P 9634 +24.4159835478226,-228.69865621105,-11.6,10.7132996449142, 5419P 9635 +13.6416015478574,3.13925814733116,6.28310481408081; 5419P 9636 +128,1,6,1,2,0,0,0,0,0,10.7132996449144,10.7132996449144, 5421P 9637 +13.6416015478576,13.6416015478576,3.13925814734165, 5421P 9638 +3.13925814734165,3.13925814734165,4.18720703625122, 5421P 9639 +4.18720703625122,5.23515592516079,5.23515592516079, 5421P 9640 +6.28310481407037,6.28310481407037,6.28310481407037,1.,1., 5421P 9641 +0.865837508250792,0.865837508250792,1.,1.,0.865837508250792, 5421P 9642 +0.865837508250792,1.,1.,0.865837508250792,0.865837508250792,1., 5421P 9643 +1.,24.4159835478226,-228.69865621105,-7.49999999999997, 5421P 9644 +24.4159835478226,-228.69865621105,-11.6,24.4169604948039, 5421P 9645 +-229.565507025972,-7.49999999999997,24.4169604948039, 5421P 9646 +-229.565507025972,-11.6,23.666408068534,-229.999214698462, 5421P 9647 +-7.49999999999997,23.666408068534,-229.999214698462,-11.6, 5421P 9648 +22.9158556422642,-230.432922370953,-7.49999999999997, 5421P 9649 +22.9158556422642,-230.432922370953,-11.6,22.1653032159897, 5421P 9650 +-229.99921469847,-7.49999999999997,22.1653032159897, 5421P 9651 +-229.99921469847,-11.6,21.4147507897153,-229.565507025988, 5421P 9652 +-7.49999999999997,21.4147507897153,-229.565507025988,-11.6, 5421P 9653 +21.4157277366876,-228.698656211065,-7.49999999999997, 5421P 9654 +21.4157277366876,-228.698656211065,-11.6,10.7132996449144, 5421P 9655 +13.6416015478576,3.13925814734165,6.28310481407037; 5421P 9656 +128,1,6,1,2,0,0,0,0,0,10.7132954794018,10.7132954794018, 5423P 9657 +13.6415962437716,13.6415962437716,3.13866619557958, 5423P 9658 +3.13866619557958,3.13866619557958,4.18680559830898, 5423P 9659 +4.18680559830898,5.23494500103838,5.23494500103838, 5423P 9660 +6.28308440376778,6.28308440376778,6.28308440376778,1.,1., 5423P 9661 +0.865789844880249,0.865789844880249,1.,1.,0.865789844880249, 5423P 9662 +0.865789844880249,1.,1.,0.865789844880249,0.865789844880249,1., 5423P 9663 +1.,97.617115874664,-228.698656211057,-7.49999999999994, 5423P 9664 +97.617115874664,-228.698656211057,-11.5999999999999, 5423P 9665 +97.6158909373877,-227.831614772873,-7.49999999999994, 5423P 9666 +97.6158909373877,-227.831614772873,-11.5999999999999, 5423P 9667 +98.3665673588096,-227.397740060174,-7.49999999999994, 5423P 9668 +98.3665673588096,-227.397740060174,-11.5999999999999, 5423P 9669 +99.1172437802314,-226.963865347475,-7.49999999999994, 5423P 9670 +99.1172437802314,-226.963865347475,-11.5999999999999, 5423P 9671 +99.8679202016534,-227.397740060174,-7.49999999999994, 5423P 9672 +99.8679202016534,-227.397740060174,-11.5999999999999, 5423P 9673 +100.618596623075,-227.831614772873,-7.49999999999994, 5423P 9674 +100.618596623075,-227.831614772873,-11.5999999999999, 5423P 9675 +100.617371685799,-228.698656211057,-7.49999999999994, 5423P 9676 +100.617371685799,-228.698656211057,-11.5999999999999, 5423P 9677 +10.7132954794018,13.6415962437716,3.13866619557958, 5423P 9678 +6.28308440376778; 5423P 9679 +128,1,6,1,2,0,0,0,0,0,10.7132954794019,10.7132954794019, 5425P 9680 +13.6415962437718,13.6415962437718,3.13866619559783, 5425P 9681 +3.13866619559783,3.13866619559783,4.18680559832112, 5425P 9682 +4.18680559832112,5.23494500104441,5.23494500104441, 5425P 9683 +6.2830844037677,6.2830844037677,6.2830844037677,1.,1., 5425P 9684 +0.865789844881778,0.865789844881778,1.,1.,0.865789844881778, 5425P 9685 +0.865789844881778,1.,1.,0.865789844881778,0.865789844881778,1., 5425P 9686 +1.,100.617371685799,-228.698656211056,-7.49999999999994, 5425P 9687 +100.617371685799,-228.698656211056,-11.5999999999999, 5425P 9688 +100.618596623067,-229.565697649234,-7.49999999999994, 5425P 9689 +100.618596623067,-229.565697649234,-11.5999999999999, 5425P 9690 +99.8679202016494,-229.999572361928,-7.49999999999994, 5425P 9691 +99.8679202016494,-229.999572361928,-11.5999999999999, 5425P 9692 +99.1172437802314,-230.433447074621,-7.49999999999994, 5425P 9693 +99.1172437802314,-230.433447074621,-11.5999999999999, 5425P 9694 +98.3665673588135,-229.999572361928,-7.49999999999994, 5425P 9695 +98.3665673588135,-229.999572361928,-11.5999999999999, 5425P 9696 +97.6158909373956,-229.565697649234,-7.49999999999994, 5425P 9697 +97.6158909373956,-229.565697649234,-11.5999999999999, 5425P 9698 +97.617115874664,-228.698656211056,-7.49999999999994, 5425P 9699 +97.617115874664,-228.698656211056,-11.5999999999999, 5425P 9700 +10.7132954794019,13.6415962437718,3.13866619559783, 5425P 9701 +6.2830844037677; 5425P 9702 +128,1,6,1,2,0,0,0,0,0,10.7132996449142,10.7132996449142, 5427P 9703 +13.6416015478574,13.6416015478574,3.13925814733116, 5427P 9704 +3.13925814733116,3.13925814733116,4.18720703624771, 5427P 9705 +4.18720703624771,5.23515592516426,5.23515592516426, 5427P 9706 +6.28310481408081,6.28310481408081,6.28310481408081,1.,1., 5427P 9707 +0.865837508249046,0.865837508249046,1.,1.,0.865837508249046, 5427P 9708 +0.865837508249046,1.,1.,0.865837508249046,0.865837508249046,1., 5427P 9709 +1.,21.4157277366876,-190.598023114212,-7.49999999999997, 5427P 9710 +21.4157277366876,-190.598023114212,-11.6,21.4147507896972, 5427P 9711 +-189.731172299282,-7.49999999999997,21.4147507896972, 5427P 9712 +-189.731172299282,-11.6,22.1653032159716,-189.297464626786, 5427P 9713 +-7.49999999999997,22.1653032159716,-189.297464626786,-11.6, 5427P 9714 +22.915855642246,-188.863756954289,-7.49999999999997, 5427P 9715 +22.915855642246,-188.863756954289,-11.6,23.6664080685249, 5427P 9716 +-189.297464626778,-7.49999999999997,23.6664080685249, 5427P 9717 +-189.297464626778,-11.6,24.4169604948039,-189.731172299267, 5427P 9718 +-7.49999999999997,24.4169604948039,-189.731172299267,-11.6, 5427P 9719 +24.4159835478226,-190.598023114196,-7.49999999999997, 5427P 9720 +24.4159835478226,-190.598023114196,-11.6,10.7132996449142, 5427P 9721 +13.6416015478574,3.13925814733116,6.28310481408081; 5427P 9722 +128,1,6,1,2,0,0,0,0,0,10.7132996449144,10.7132996449144, 5429P 9723 +13.6416015478576,13.6416015478576,3.13925814734168, 5429P 9724 +3.13925814734168,3.13925814734168,4.18720703625123, 5429P 9725 +4.18720703625123,5.23515592516079,5.23515592516079, 5429P 9726 +6.28310481407034,6.28310481407034,6.28310481407034,1.,1., 5429P 9727 +0.865837508250795,0.865837508250795,1.,1.,0.865837508250795, 5429P 9728 +0.865837508250795,1.,1.,0.865837508250795,0.865837508250795,1., 5429P 9729 +1.,24.4159835478226,-190.598023114196,-7.49999999999997, 5429P 9730 +24.4159835478226,-190.598023114196,-11.6,24.4169604948039, 5429P 9731 +-191.464873929118,-7.49999999999997,24.4169604948039, 5429P 9732 +-191.464873929118,-11.6,23.666408068534,-191.898581601608, 5429P 9733 +-7.49999999999997,23.666408068534,-191.898581601608,-11.6, 5429P 9734 +22.9158556422642,-192.332289274099,-7.49999999999997, 5429P 9735 +22.9158556422642,-192.332289274099,-11.6,22.1653032159898, 5429P 9736 +-191.898581601616,-7.49999999999997,22.1653032159898, 5429P 9737 +-191.898581601616,-11.6,21.4147507897154,-191.464873929134, 5429P 9738 +-7.49999999999997,21.4147507897154,-191.464873929134,-11.6, 5429P 9739 +21.4157277366876,-190.598023114211,-7.49999999999997, 5429P 9740 +21.4157277366876,-190.598023114211,-11.6,10.7132996449144, 5429P 9741 +13.6416015478576,3.13925814734168,6.28310481407034; 5429P 9742 +128,1,6,1,2,0,0,0,0,0,10.7132996449141,10.7132996449141, 5431P 9743 +13.6416015478573,13.6416015478573,3.13925814731996, 5431P 9744 +3.13925814731996,3.13925814731996,4.1872070362402, 5431P 9745 +4.1872070362402,5.23515592516045,5.23515592516045, 5431P 9746 +6.28310481408069,6.28310481408069,6.28310481408069,1.,1., 5431P 9747 +0.865837508248121,0.865837508248121,1.,1.,0.865837508248121, 5431P 9748 +0.865837508248121,1.,1.,0.865837508248121,0.865837508248121,1., 5431P 9749 +1.,100.190183492478,-172.121201750453,-7.49999999999994, 5431P 9750 +100.190183492478,-172.121201750453,-11.5999999999999, 5431P 9751 +100.189206545482,-171.25435093552,-7.49999999999994, 5431P 9752 +100.189206545482,-171.25435093552,-11.5999999999999, 5431P 9753 +100.939758971759,-170.82064326302,-7.49999999999994, 5431P 9754 +100.939758971759,-170.82064326302,-11.5999999999999, 5431P 9755 +101.690311398036,-170.38693559052,-7.49999999999994, 5431P 9756 +101.690311398036,-170.38693559052,-11.5999999999999, 5431P 9757 +102.440863824317,-170.820643263012,-7.49999999999994, 5431P 9758 +102.440863824317,-170.820643263012,-11.5999999999999, 5431P 9759 +103.191416250599,-171.254350935504,-7.49999999999994, 5431P 9760 +103.191416250599,-171.254350935504,-11.5999999999999, 5431P 9761 +103.190439303613,-172.121201750437,-7.49999999999994, 5431P 9762 +103.190439303613,-172.121201750437,-11.5999999999999, 5431P 9763 +10.7132996449141,13.6416015478573,3.13925814731996, 5431P 9764 +6.28310481408069; 5431P 9765 +128,1,6,1,2,0,0,0,0,0,10.7132996449144,10.7132996449144, 5433P 9766 +13.6416015478577,13.6416015478577,3.13925814735297, 5433P 9767 +3.13925814735297,3.13925814735297,4.1872070362588, 5433P 9768 +4.1872070362588,5.23515592516463,5.23515592516463, 5433P 9769 +6.28310481407046,6.28310481407046,6.28310481407046,1.,1., 5433P 9770 +0.865837508251727,0.865837508251727,1.,1.,0.865837508251727, 5433P 9771 +0.865837508251727,1.,1.,0.865837508251727,0.865837508251727,1., 5433P 9772 +1.,103.190439303613,-172.121201750437,-7.49999999999994, 5433P 9773 +103.190439303613,-172.121201750437,-11.5999999999999, 5433P 9774 +103.191416250589,-172.988052565356,-7.49999999999994, 5433P 9775 +103.191416250589,-172.988052565356,-11.5999999999999, 5433P 9776 +102.440863824322,-173.421760237843,-7.49999999999994, 5433P 9777 +102.440863824322,-173.421760237843,-11.5999999999999, 5433P 9778 +101.690311398054,-173.85546791033,-7.49999999999994, 5433P 9779 +101.690311398054,-173.85546791033,-11.5999999999999, 5433P 9780 +100.939758971782,-173.421760237851,-7.49999999999994, 5433P 9781 +100.939758971782,-173.421760237851,-11.5999999999999, 5433P 9782 +100.18920654551,-172.988052565371,-7.49999999999994, 5433P 9783 +100.18920654551,-172.988052565371,-11.5999999999999, 5433P 9784 +100.190183492478,-172.121201750453,-7.49999999999994, 5433P 9785 +100.190183492478,-172.121201750453,-11.5999999999999, 5433P 9786 +10.7132996449144,13.6416015478577,3.13925814735297, 5433P 9787 +6.28310481407046; 5433P 9788 +128,1,1,1,1,0,0,1,0,0,-0.701000000000003,-0.701000000000003, 5435P 9789 +0.703178681517682,0.703178681517682,0.899,0.899,1.311,1.311,1., 5435P 9790 +1.,1.,1.,91.5819773314763,-164.547507575232,-7.48999999999993, 5435P 9791 +105.623764146653,-164.547507575232,-7.48999999999993, 5435P 9792 +91.5819773314763,-164.547507575232,-11.61,105.623764146653, 5435P 9793 +-164.547507575232,-11.6099999999999,-0.701000000000003, 5435P 9794 +0.703178681517682,0.899,1.311; 5435P 9795 +128,1,1,1,1,0,0,1,0,0,-0.601,-0.601,1.111,1.111,-0.001,-0.001, 5437P 9796 +0.800999999999997,0.800999999999997,1.,1.,1.,1., 5437P 9797 +105.613764146653,-164.557507575232,-11.6099999999999, 5437P 9798 +105.613764146653,-164.557507575232,5.51000000000006, 5437P 9799 +105.613764146653,-156.537507575232,-11.6099999999999, 5437P 9800 +105.613764146653,-156.537507575232,5.51000000000006,-0.601, 5437P 9801 +1.111,-0.001,0.800999999999997; 5437P 9802 +128,1,1,1,1,0,0,1,0,0,-5.83292786387186,-5.83292786387186, 5439P 9803 +5.83292652709446,5.83292652709446,-4.39739056237306, 5439P 9804 +-4.39739056237306,4.38466970486183,4.38466970486183,1.,1.,1.,1., 5439P 9805 +119.344830676844,-162.674456106938,-7.49999999999994, 5439P 9806 +2.68628676718068,-162.674456106938,-7.49999999999997, 5439P 9807 +119.344830676844,-250.495058779287,-7.49999999999994, 5439P 9808 +2.68628676718068,-250.495058779287,-7.49999999999997, 5439P 9809 +-5.83292786387186,5.83292652709446,-4.39739056237306, 5439P 9810 +4.38466970486183; 5439P 9811 +128,1,1,1,1,0,0,1,0,0,0.198999999999999,0.198999999999999, 5441P 9812 +1.9011635755716,1.9011635755716,0.898999999999999, 5441P 9813 +0.898999999999999,1.311,1.311,1.,1.,1.,1.,23.4336836497758, 5441P 9814 +-164.547507575232,-7.48999999999996,40.4553194054918, 5441P 9815 +-164.547507575232,-7.48999999999996,23.4336836497758, 5441P 9816 +-164.547507575232,-11.61,40.4553194054918,-164.547507575232, 5441P 9817 +-11.61,0.198999999999999,1.9011635755716,0.898999999999999, 5441P 9818 +1.311; 5441P 9819 +128,1,1,1,1,0,0,1,0,0,-0.600999999999999,-0.600999999999999, 5443P 9820 +1.111,1.111,-0.001,-0.001,0.801000000000001,0.801000000000001, 5443P 9821 +1.,1.,1.,1.,40.4453194054918,-164.557507575232,-11.61, 5443P 9822 +40.4453194054918,-164.557507575232,5.51000000000003, 5443P 9823 +40.4453194054918,-156.537507575232,-11.61,40.4453194054918, 5443P 9824 +-156.537507575232,5.51000000000003,-0.600999999999999,1.111, 5443P 9825 +-0.001,0.801000000000001; 5443P 9826 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000133,-0.00100000000000133, 5445P 9827 +1.7011635755716,1.7011635755716,-0.00100000000000355, 5445P 9828 +-0.00100000000000355,0.651,0.651,1.,1.,1.,1.,40.4553194054918, 5445P 9829 +-163.057507575232,1.50000000000003,23.4336836497758, 5445P 9830 +-163.057507575232,1.50000000000003,40.4553194054918, 5445P 9831 +-156.537507575232,1.50000000000003,23.4336836497758, 5445P 9832 +-156.537507575232,1.50000000000003,-0.00100000000000133, 5445P 9833 +1.7011635755716,-0.00100000000000355,0.651; 5445P 9834 +128,1,1,1,1,0,0,1,0,0,1.199,1.199,2.60317868151768, 5447P 9835 +2.60317868151768,-0.001,-0.001,0.650999999999999, 5447P 9836 +0.650999999999999,1.,1.,1.,1.,105.623764146653, 5447P 9837 +-163.057507575232,1.50000000000005,91.5819773314763, 5447P 9838 +-163.057507575232,1.50000000000005,105.623764146653, 5447P 9839 +-156.537507575232,1.50000000000005,91.5819773314763, 5447P 9840 +-156.537507575232,1.50000000000005,1.199,2.60317868151768, 5447P 9841 +-0.001,0.650999999999999; 5447P 9842 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000189,-0.00100000000000189, 5449P 9843 +11.1172612056252,11.1172612056252,-0.00100000000000083, 5449P 9844 +-0.00100000000000083,0.601000000000001,0.601000000000001,1.,1., 5449P 9845 +1.,1.,116.606840828848,-163.047507575232,7.51000000000006, 5449P 9846 +5.42422877259571,-163.047507575232,7.51000000000003, 5449P 9847 +116.606840828848,-163.047507575232,1.49000000000005, 5449P 9848 +5.42422877259571,-163.047507575232,1.49000000000002, 5449P 9849 +-0.00100000000000189,11.1172612056252,-0.00100000000000083, 5449P 9850 +0.601000000000001; 5449P 9851 +128,1,1,1,1,0,0,1,0,0,-0.411,-0.411,1.301,1.301,-0.001,-0.001, 5451P 9852 +0.801000000000001,0.801000000000001,1.,1.,1.,1., 5451P 9853 +23.4436836497758,-164.557507575232,5.51000000000003, 5451P 9854 +23.4436836497758,-164.557507575232,-11.61,23.4436836497758, 5451P 9855 +-156.537507575232,5.51000000000003,23.4436836497758, 5451P 9856 +-156.537507575232,-11.61,-0.411,1.301,-0.001,0.801000000000001; 5451P 9857 +128,1,1,1,1,0,0,1,0,0,-0.411000000000001,-0.411000000000001, 5453P 9858 +1.301,1.301,-0.001,-0.001,0.800999999999997,0.800999999999997, 5453P 9859 +1.,1.,1.,1.,91.5919773314763,-164.557507575232,5.51000000000004, 5453P 9860 +91.5919773314763,-164.557507575232,-11.6099999999999, 5453P 9861 +91.5919773314763,-156.537507575232,5.51000000000004, 5453P 9862 +91.5919773314763,-156.537507575232,-11.6099999999999, 5453P 9863 +-0.411000000000001,1.301,-0.001,0.800999999999997; 5453P 9864 +128,1,1,1,1,0,0,1,0,0,3.5001090632896,3.5001090632896, 5455P 9865 +4.90089123368072,4.90089123368072,0.199,0.199,1.501,1.501,1.,1., 5455P 9866 +1.,1.,54.4431411094029,-164.547507575232,5.51000000000004, 5455P 9867 +40.4353194054918,-164.547507575232,5.51000000000003, 5455P 9868 +54.4431411094029,-164.547507575232,-7.50999999999997, 5455P 9869 +40.4353194054918,-164.547507575232,-7.50999999999997, 5455P 9870 +3.5001090632896,4.90089123368072,0.199,1.501; 5455P 9871 +128,1,1,1,1,0,0,1,0,0,-3.0586425293351,-3.0586425293351, 5457P 9872 +2.05802326326335,2.05802326326335,-4.36108541554375, 5457P 9873 +-4.36108541554375,-3.50908541554383,-3.50908541554383,1.,1.,1., 5457P 9874 +1.,91.6019773314763,-163.037507575232,5.50000000000004, 5457P 9875 +40.4353194054918,-163.037507575232,5.50000000000003, 5457P 9876 +91.6019773314763,-171.557507575232,5.50000000000004, 5457P 9877 +40.4353194054918,-171.557507575232,5.50000000000003, 5457P 9878 +-3.0586425293351,2.05802326326335,-4.36108541554375, 5457P 9879 +-3.50908541554383; 5457P 9880 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.700999999999999, 5459P 9881 +0.700999999999999,-0.001,-0.001,1.301,1.301,1.,1.,1.,1., 5459P 9882 +74.4331411094029,-171.557507575232,-7.50999999999996, 5459P 9883 +74.4331411094029,-164.537507575232,-7.50999999999996, 5459P 9884 +74.4331411094029,-171.557507575232,5.51000000000004, 5459P 9885 +74.4331411094029,-164.537507575232,5.51000000000004,-0.001, 5459P 9886 +0.700999999999999,-0.001,1.301; 5459P 9887 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5461P 9888 +2.001,2.001,-0.00100000000000049,-0.00100000000000049,1.301, 5461P 9889 +1.301,1.,1.,1.,1.,54.4231411094029,-171.547507575231, 5461P 9890 +-7.50999999999996,74.4431411094029,-171.547507575232, 5461P 9891 +-7.50999999999996,54.4231411094029,-171.547507575231, 5461P 9892 +5.51000000000004,74.4431411094029,-171.547507575232, 5461P 9893 +5.51000000000004,-0.00100000000000178,2.001, 5461P 9894 +-0.00100000000000049,1.301; 5461P 9895 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.700999999999999, 5463P 9896 +0.700999999999999,-0.001,-0.001,1.301,1.301,1.,1.,1.,1., 5463P 9897 +54.4331411094029,-164.537507575232,-7.50999999999996, 5463P 9898 +54.4331411094029,-171.557507575232,-7.50999999999996, 5463P 9899 +54.4331411094029,-164.537507575232,5.51000000000004, 5463P 9900 +54.4331411094029,-171.557507575232,5.51000000000004,-0.001, 5463P 9901 +0.700999999999999,-0.001,1.301; 5463P 9902 +128,1,1,1,1,0,0,1,0,0,0.228270425474422,0.228270425474422, 5465P 9903 +7.99146896389396,7.99146896389396,0.198999999999999, 5465P 9904 +0.198999999999999,1.501,1.501,1.,1.,1.,1.,117.598998179498, 5465P 9905 +-245.464354455991,5.51000000000007,117.599000753169, 5465P 9906 +-167.832369071796,5.51000000000007,117.598998179498, 5465P 9907 +-245.464354455991,-7.50999999999994,117.599000753169, 5465P 9908 +-167.832369071796,-7.50999999999994,0.228270425474422, 5465P 9909 +7.99146896389396,0.198999999999999,1.501; 5465P 9910 +128,1,1,1,1,0,0,1,0,0,6.89889123368072,6.89889123368072, 5467P 9911 +8.61677485588806,8.61677485588806,0.199,0.199,1.501,1.501,1.,1., 5467P 9912 +1.,1.,91.6019773314763,-164.547507575232,5.51000000000005, 5467P 9913 +74.4231411094029,-164.547507575232,5.51000000000004, 5467P 9914 +91.6019773314763,-164.547507575232,-7.50999999999995, 5467P 9915 +74.4231411094029,-164.547507575232,-7.50999999999996, 5467P 9916 +6.89889123368072,8.61677485588806,0.199,1.501; 5467P 9917 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.96387870990168, 5469P 9918 +1.96387870990168,0.198999999999999,0.198999999999999,1.501, 5469P 9919 +1.501,1.,1.,1.,1.,4.43314110940287,-167.832837467805, 5469P 9920 +5.51000000000003,4.43314110940289,-187.481624566822, 5469P 9921 +5.51000000000003,4.43314110940288,-167.832837467805, 5469P 9922 +-7.50999999999997,4.43314110940289,-187.481624566822, 5469P 9923 +-7.50999999999997,-0.001,1.96387870990168,0.198999999999999, 5469P 9924 +1.501; 5469P 9925 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,2.20051956797476, 5471P 9926 +2.20051956797476,-0.001,-0.001,1.501,1.501,1.,1.,1.,1., 5471P 9927 +2.93314110940289,-165.466420277504,7.51000000000003, 5471P 9928 +2.9331411094029,-187.481615957251,7.51000000000003, 5471P 9929 +2.93314110940289,-165.466420277504,-7.50999999999997, 5471P 9930 +2.93314110940291,-187.481615957251,-7.50999999999997,-0.001, 5471P 9931 +2.20051956797476,-0.001,1.501; 5471P 9932 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000355,-0.00100000000000355, 5473P 9933 +6.02853968539494,6.02853968539494,-0.001,-0.001,0.201,0.201,1., 5473P 9934 +1.,1.,1.,2.93314128158951,-187.461615957253,7.51000000000003, 5473P 9935 +2.93210307558876,-247.757012802264,7.51000000000003, 5473P 9936 +2.93314128158951,-187.461615957253,5.49000000000003, 5473P 9937 +2.93210307558876,-247.757012802264,5.49000000000003, 5473P 9938 +-0.00100000000000355,6.02853968539494,-0.001,0.201; 5473P 9939 +128,1,6,1,2,0,0,0,0,0,-2.44929359793162D-16, 5475P 9940 +-2.44929359793162D-16,5.99482047510948,5.99482047510948, 5475P 9941 +-2.72952782394451,-2.72952782394451,-2.72952782394451, 5475P 9942 +-1.43344712313306,-1.43344712313306,-0.137366422321606, 5475P 9943 +-0.137366422321606,1.15871427848985,1.15871427848985, 5475P 9944 +1.15871427848985,1.,1.,0.797268222513888,0.797268222513888,1., 5475P 9945 +1.,0.797268222513888,0.797268222513888,1.,1.,0.797268222513888, 5475P 9946 +0.797268222513888,1.,1.,7.72696471074416,-248.749215886107, 5475P 9947 +7.50000000000003,7.72696471074416,-248.749215886107, 5475P 9948 +-7.49999999999997,6.96821249566286,-250.485058779287, 5475P 9949 +7.50000000000003,6.96821249566286,-250.485058779287, 5475P 9950 +-7.49999999999997,5.09163041069214,-250.22564568775, 5475P 9951 +7.50000000000003,5.09163041069214,-250.22564568775, 5475P 9952 +-7.49999999999997,3.21504832572142,-249.966232596213, 5475P 9953 +7.50000000000003,3.21504832572142,-249.966232596213, 5475P 9954 +-7.49999999999997,2.95566754645106,-248.089646044774, 5475P 9955 +7.50000000000003,2.95566754645106,-248.089646044774, 5475P 9956 +-7.49999999999997,2.69628676718069,-246.213059493336, 5475P 9957 +7.50000000000003,2.6962867671807,-246.213059493336, 5475P 9958 +-7.49999999999997,4.43214272479956,-245.454337167255, 5475P 9959 +7.50000000000003,4.43214272479956,-245.454337167255, 5475P 9960 +-7.49999999999997,-2.44929359793162D-16,5.99482047510948, 5475P 9961 +-2.72952782394451,1.15871427848985; 5475P 9962 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,11.1172574856417, 5477P 9963 +11.1172574856417,-0.00100000000000078,-0.00100000000000078, 5477P 9964 +0.201000000000001,0.201000000000001,1.,1.,1.,1., 5477P 9965 +5.42426324740445,-250.249215886107,7.51000000000004, 5477P 9966 +116.606838103822,-250.249215886107,7.51000000000007, 5477P 9967 +5.42426324740445,-250.249215886107,5.49000000000003, 5477P 9968 +116.606838103822,-250.249215886107,5.49000000000005,-0.001, 5477P 9969 +11.1172574856417,-0.00100000000000078,0.201000000000001; 5477P 9970 +128,1,6,1,2,0,0,0,0,0,-2.17420625539854D-16, 5479P 9971 +-2.17420625539854D-16,5.99482047510955,5.99482047510955, 5479P 9972 +-2.72951057213252,-2.72951057213252,-2.72951057213252, 5479P 9973 +-1.43343562192506,-1.43343562192506,-0.1373606717176, 5479P 9974 +-0.1373606717176,1.15871427848986,1.15871427848986, 5479P 9975 +1.15871427848986,1.,1.,0.797269958115333,0.797269958115333,1., 5479P 9976 +1.,0.797269958115333,0.797269958115333,1.,1.,0.797269958115333, 5479P 9977 +0.797269958115333,1.,1.,117.59899817983,-245.454354455992, 5479P 9978 +7.50000000000006,117.59899817983,-245.454354455992, 5479P 9979 +-7.49999999999994,119.334830676844,-246.213102195359, 5479P 9980 +7.50000000000006,119.334830676844,-246.213102195359, 5479P 9981 +-7.49999999999994,119.07542986441,-248.089674551596, 5479P 9982 +7.50000000000006,119.07542986441,-248.089674551596, 5479P 9983 +-7.49999999999994,118.816029051977,-249.966246907834, 5479P 9984 +7.50000000000006,118.816029051977,-249.966246907834, 5479P 9985 +-7.49999999999994,116.93945668714,-250.225647658055, 5479P 9986 +7.50000000000006,116.93945668714,-250.225647658055, 5479P 9987 +-7.49999999999994,115.062884322303,-250.485048408276, 5479P 9988 +7.50000000000006,115.062884322303,-250.485048408276, 5479P 9989 +-7.49999999999994,114.304136640482,-248.749215886107, 5479P 9990 +7.50000000000006,114.304136640482,-248.749215886107, 5479P 9991 +-7.49999999999994,-2.17420625539854D-16,5.99482047510955, 5479P 9992 +-2.72951057213252,1.15871427848986; 5479P 9993 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,8.22073910193271, 5481P 9994 +8.22073910193271,-0.001,-0.001,0.201,0.201,1.,1.,1.,1., 5481P 9995 +119.09899810349,-247.757055886107,7.51000000000006, 5481P 9996 +119.099000829178,-165.53966486678,7.51000000000006, 5481P 9997 +119.09899810349,-247.757055886107,5.49000000000006, 5481P 9998 +119.099000829178,-165.53966486678,5.49000000000006,-0.001, 5481P 9999 +8.22073910193271,-0.001,0.201; 5481P 10000 +128,1,6,1,2,0,0,0,0,0,-2.17420701633559D-16, 5483P 10001 +-2.17420701633559D-16,5.99482047511063,5.99482047511063, 5483P 10002 +-2.72950952283909,-2.72950952283909,-2.72950952283909, 5483P 10003 +-1.43343455052993,-1.43343455052993,-0.137359578220759, 5483P 10004 +-0.137359578220759,1.15871539408841,1.15871539408841, 5483P 10005 +1.15871539408841,1.,1.,0.797269951444785,0.797269951444785,1., 5483P 10006 +1.,0.797269951444785,0.797269951444785,1.,1.,0.797269951444785, 5483P 10007 +0.797269951444785,1.,1.,114.304139365509,-164.547507575232, 5483P 10008 +7.50000000000006,114.304139365509,-164.547507575232, 5483P 10009 +-7.49999999999994,115.062887064753,-162.811675013205, 5483P 10010 +7.50000000000006,115.062887064753,-162.811675013205, 5483P 10011 +-7.49999999999994,116.939459466948,-163.071075810858, 5483P 10012 +7.50000000000006,116.939459466948,-163.071075810858, 5483P 10013 +-7.49999999999994,118.816031869142,-163.330476608511, 5483P 10014 +7.50000000000006,118.816031869142,-163.330476608511, 5483P 10015 +-7.49999999999994,119.075432604581,-165.207049019306, 5483P 10016 +7.50000000000006,119.075432604581,-165.207049019306, 5483P 10017 +-7.49999999999994,119.33483334002,-167.083621430101, 5483P 10018 +7.50000000000006,119.33483334002,-167.083621430101, 5483P 10019 +-7.49999999999994,117.599000752838,-167.842369071796, 5483P 10020 +7.50000000000006,117.599000752838,-167.842369071796, 5483P 10021 +-7.49999999999994,-2.17420701633559D-16,5.99482047511063, 5483P 10022 +-2.72950952283909,1.15871539408841; 5483P 10023 +128,1,4,1,2,0,0,0,0,0,-2.44824391814757D-16, 5485P 10024 +-2.44824391814757D-16,5.99482047510955,5.99482047510955, 5485P 10025 +-1.54151851752146,-1.54151851752146,-1.54151851752146, 5485P 10026 +-0.191402119515813,-0.191402119515813,1.15871427848983, 5485P 10027 +1.15871427848983,1.15871427848983,1.,1.,0.780670581409592, 5485P 10028 +0.780670581409592,1.,1.,0.780670581409592,0.780670581409592,1., 5485P 10029 +1.,2.93314110940286,-165.476420277504,7.50000000000003, 5485P 10030 +2.93314110940286,-165.476420277504,-7.49999999999997, 5485P 10031 +2.99177706791293,-163.474248497833,7.50000000000003, 5485P 10032 +2.99177706791294,-163.474248497833,-7.49999999999997, 5485P 10033 +4.95822887324418,-163.093200852189,7.50000000000003, 5485P 10034 +4.95822887324418,-163.093200852189,-7.49999999999997, 5485P 10035 +6.92468067857542,-162.712153206546,7.50000000000003, 5485P 10036 +6.92468067857543,-162.712153206546,-7.49999999999997, 5485P 10037 +7.72693023593539,-164.547507575232,7.50000000000003, 5485P 10038 +7.7269302359354,-164.547507575232,-7.49999999999997, 5485P 10039 +-2.44824391814757D-16,5.99482047510955,-1.54151851752146, 5485P 10040 +1.15871427848983; 5485P 10041 +128,1,1,1,1,0,0,1,0,0,-6.45934487907209,-6.45934487907209, 5487P 10042 +6.45935129953954,6.45935129953954,-5.01108541554375, 5487P 10043 +-5.01108541554375,5.01108541554375,5.01108541554375,1.,1.,1.,1., 5487P 10044 +125.609000828846,-156.537507575232,7.50000000000006, 5487P 10045 +-3.57796095727013,-156.537507575232,7.50000000000003, 5487P 10046 +125.609000828846,-256.759215886107,7.50000000000006, 5487P 10047 +-3.57796095727013,-256.759215886107,7.50000000000003, 5487P 10048 +-6.45934487907209,6.45935129953954,-5.01108541554375, 5487P 10049 +5.01108541554375; 5487P 10050 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,2.20708325126057, 5489P 10051 +2.20708325126057,-0.001,-0.001,1.911,1.911,1.,1.,1.,1., 5489P 10052 +-3.56685889059712,-187.481555692063,7.51000000000003, 5489P 10053 +-3.56685889059714,-165.400723179457,7.51000000000003, 5489P 10054 +-3.56685889059711,-187.481555692063,-11.61,-3.56685889059713, 5489P 10055 +-165.400723179457,-11.61,-0.001,2.20708325126057,-0.001,1.911; 5489P 10056 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,6.02853451978495, 5491P 10057 +6.02853451978495,-0.001,-0.001,1.911,1.911,1.,1.,1.,1., 5491P 10058 +-3.56789692344769,-247.756900880975,7.51000000000003, 5491P 10059 +-3.56685871841052,-187.461555692064,7.51000000000003, 5491P 10060 +-3.56789692344768,-247.756900880975,-11.61,-3.56685871841052, 5491P 10061 +-187.461555692064,-11.61,-0.001,6.02853451978495,-0.001,1.911; 5491P 10062 +128,1,4,1,2,0,0,0,0,0,-2.44929359793162D-16, 5493P 10063 +-2.44929359793162D-16,2.12171301109956,2.12171301109956, 5493P 10064 +-1.57081354545471,-1.57081354545471,-1.57081354545471, 5493P 10065 +-0.785406772727353,-0.785406772727353,0.,0.,0.,1.,1., 5493P 10066 +0.923877885178768,0.923877885178768,1.,1.,0.923877885178768, 5493P 10067 +0.923877885178768,1.,1.,5.43426324740446,-256.749215886107, 5493P 10068 +-11.6,5.43426324740445,-256.749215886107,7.50000000000003, 5493P 10069 +1.70540108471929,-256.749215886107,-11.6,1.70540108471929, 5493P 10070 +-256.749215886107,7.50000000000003,-0.931279936275416, 5493P 10071 +-254.112489464608,-11.6,-0.931279936275421,-254.112489464608, 5493P 10072 +7.50000000000003,-3.56796095727012,-251.475763043109,-11.6, 5493P 10073 +-3.56796095727013,-251.475763043109,7.50000000000003, 5493P 10074 +-3.56789675126107,-247.746900880977,-11.6,-3.56789675126107, 5493P 10075 +-247.746900880977,7.50000000000003,-2.44929359793162D-16, 5493P 10076 +2.12171301109956,-1.57081354545471,0.; 5493P 10077 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,11.1172574856417, 5495P 10078 +11.1172574856417,-0.001,-0.001,1.911,1.911,1.,1.,1.,1., 5495P 10079 +116.606838103822,-256.749215886107,7.51000000000006, 5495P 10080 +5.42426324740443,-256.749215886107,7.51000000000003, 5495P 10081 +116.606838103822,-256.749215886107,-11.6099999999999, 5495P 10082 +5.42426324740443,-256.749215886107,-11.61,-0.001, 5495P 10083 +11.1172574856417,-0.001,1.911; 5495P 10084 +128,1,2,1,2,0,0,0,0,0,-2.95981068971121D-17, 5497P 10085 +-2.95981068971121D-17,2.12171301109957,2.12171301109957, 5497P 10086 +-1.57079632679491,-1.57079632679491,-1.57079632679491, 5497P 10087 +2.4929260496087D-15,2.4929260496087D-15,2.4929260496087D-15,1., 5497P 10088 +1.,0.707106781186542,0.707106781186542,1.,1.,125.598998103822, 5497P 10089 +-247.747055886107,-11.5999999999999,125.598998103822, 5497P 10090 +-247.747055886107,7.50000000000006,125.598998103822, 5497P 10091 +-256.749215886107,-11.5999999999999,125.598998103822, 5497P 10092 +-256.749215886107,7.50000000000006,116.596838103822, 5497P 10093 +-256.749215886107,-11.5999999999999,116.596838103822, 5497P 10094 +-256.749215886107,7.50000000000006,-2.95981068971121D-17, 5497P 10095 +2.12171301109957,-1.57079632679491,2.4929260496087D-15; 5497P 10096 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000355,-0.00100000000000355, 5499P 10097 +8.22073908038377,8.22073908038377,-0.001,-0.001,1.911,1.911,1., 5499P 10098 +1.,1.,1.,125.599000829178,-165.53966508227,7.51000000000006, 5499P 10099 +125.59899810349,-247.757055886107,7.51000000000006, 5499P 10100 +125.599000829178,-165.53966508227,-11.6099999999999, 5499P 10101 +125.59899810349,-247.757055886107,-11.6099999999999, 5499P 10102 +-0.00100000000000355,8.22073908038377,-0.001,1.911; 5499P 10103 +128,1,2,1,2,0,0,0,0,0,-2.95981225633938D-17, 5501P 10104 +-2.95981225633938D-17,2.12171301109993,2.12171301109993, 5501P 10105 +-1.57079604986551,-1.57079604986551,-1.57079604986551, 5501P 10106 +4.70460948958054D-22,4.70460948958054D-22,4.70460948958054D-22, 5501P 10107 +1.,1.,0.707106879095863,0.707106879095863,1.,1., 5501P 10108 +116.596840828848,-156.547507575234,-11.5999999999999, 5501P 10109 +116.596840828848,-156.547507575234,7.50000000000006, 5501P 10110 +125.598998335884,-156.547507575234,-11.5999999999999, 5501P 10111 +125.598998335884,-156.547507575234,7.50000000000006, 5501P 10112 +125.599000828846,-165.54966508227,-11.5999999999999, 5501P 10113 +125.599000828846,-165.54966508227,7.50000000000006, 5501P 10114 +-2.95981225633938D-17,2.12171301109993,-1.57079604986551, 5501P 10115 +4.70460948958054D-22; 5501P 10116 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000233,-0.00100000000000233, 5503P 10117 +11.1172612056252,11.1172612056252,-0.00100000000000087, 5503P 10118 +-0.00100000000000087,1.911,1.911,1.,1.,1.,1.,5.42422877259571, 5503P 10119 +-156.547507575232,7.51000000000004,116.606840828848, 5503P 10120 +-156.547507575232,7.51000000000006,5.42422877259571, 5503P 10121 +-156.547507575232,-11.61,116.606840828848,-156.547507575232, 5503P 10122 +-11.61,-0.00100000000000233,11.1172612056252, 5503P 10123 +-0.00100000000000087,1.911; 5503P 10124 +128,1,2,1,2,0,0,0,0,0,-2.44900183857515D-16, 5505P 10125 +-2.44900183857515D-16,2.12171301109957,2.12171301109957, 5505P 10126 +-1.55536115200856,-1.55536115200856,-1.55536115200856, 5505P 10127 +2.95988436008734D-15,2.95988436008734D-15,2.95988436008734D-15, 5505P 10128 +1.,1.,0.712542827450537,0.712542827450537,1.,1., 5505P 10129 +-3.56685889059712,-165.410723179457,-11.6,-3.56685889059713, 5505P 10130 +-165.410723179457,7.50000000000003,-3.43004274316728, 5505P 10131 +-156.547507575232,-11.6,-3.43004274316728,-156.547507575232, 5505P 10132 +7.50000000000003,5.43422877259571,-156.547507575232,-11.6, 5505P 10133 +5.4342287725957,-156.547507575232,7.50000000000003, 5505P 10134 +-2.44900183857515D-16,2.12171301109957,-1.55536115200856, 5505P 10135 +2.95988436008734D-15; 5505P 10136 +128,1,1,1,1,0,0,1,0,0,-6.45934487907209,-6.45934487907209, 5507P 10137 +6.45935129953954,6.45935129953954,-5.01108541554375, 5507P 10138 +-5.01108541554375,5.01108541554375,5.01108541554375,1.,1.,1.,1., 5507P 10139 +-3.57796095727013,-156.537507575232,-11.6,125.609000828846, 5507P 10140 +-156.537507575232,-11.5999999999999,-3.57796095727014, 5507P 10141 +-256.759215886107,-11.6,125.609000828846,-256.759215886107, 5507P 10142 +-11.5999999999999,-6.45934487907209,6.45935129953954, 5507P 10143 +-5.01108541554375,5.01108541554375; 5507P 10144 +128,1,1,1,1,0,0,1,0,0,6.89889123368072,6.89889123368072, 5509P 10145 +7.61615528746972,7.61615528746972,0.199,0.199,1.501,1.501,1.,1., 5509P 10146 +1.,1.,220.762682252201,-164.547507575232,5.51,213.590041714311, 5509P 10147 +-164.547507575232,5.51,220.762682252201,-164.547507575232,-7.51, 5509P 10148 +213.590041714311,-164.547507575232,-7.51,6.89889123368072, 5509P 10149 +7.61615528746972,0.199,1.501; 5509P 10150 +128,1,1,1,1,0,0,1,0,0,-2.05802296091676,-2.05802296091676, 5511P 10151 +3.05802326326335,3.05802326326335,-4.36108541554375, 5511P 10152 +-4.36108541554375,-3.50908541554383,-3.50908541554383,1.,1.,1., 5511P 10153 +1.,220.762682252201,-163.037507575232,5.5,169.602220010399, 5511P 10154 +-163.037507575232,5.5,220.762682252201,-171.557507575232,5.5, 5511P 10155 +169.602220010399,-171.557507575232,5.5,-2.05802296091676, 5511P 10156 +3.05802326326335,-4.36108541554375,-3.50908541554383; 5511P 10157 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5513P 10158 +11.1172612056252,11.1172612056252,-0.001,-0.001,0.601,0.601,1., 5513P 10159 +1.,1.,1.,255.773741433756,-163.047507575232,7.51, 5513P 10160 +144.591129377503,-163.047507575232,7.51,255.773741433756, 5513P 10161 +-163.047507575232,1.49,144.591129377503,-163.047507575232,1.49, 5513P 10162 +-0.00100000000000178,11.1172612056252,-0.001,0.601; 5513P 10163 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000355,-0.00100000000000355, 5515P 10164 +0.800999999999997,0.800999999999997,9.999,9.999,11.711,11.711, 5515P 10165 +1.,1.,1.,1.,155.584237511039,-164.557507575232,-11.61, 5515P 10166 +155.584237511039,-156.537507575232,-11.61,155.584237511039, 5515P 10167 +-164.557507575232,5.50999999999998,155.584237511039, 5515P 10168 +-156.537507575232,5.50999999999998,-0.00100000000000355, 5515P 10169 +0.800999999999997,9.999,11.711; 5515P 10170 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.800999999999999, 5517P 10171 +0.800999999999999,9.999,9.999,11.711,11.711,1.,1.,1.,1., 5517P 10172 +220.752682252201,-164.557507575232,-11.61,220.752682252201, 5517P 10173 +-156.537507575232,-11.61,220.752682252201,-164.557507575232, 5517P 10174 +5.51,220.752682252201,-156.537507575232,5.51,-0.001, 5517P 10175 +0.800999999999999,9.999,11.711; 5517P 10176 +128,1,1,1,1,0,0,1,0,0,0.228270146333967,0.228270146333967, 5519P 10177 +1.09931081335358,1.09931081335358,0.199,0.199,1.501,1.501,1.,1., 5519P 10178 +1.,1.,155.594237511039,-164.547507575232,5.51,146.883830840843, 5519P 10179 +-164.547507575232,5.51,155.594237511039,-164.547507575232,-7.51, 5519P 10180 +146.883830840843,-164.547507575232,-7.51,0.228270146333967, 5519P 10181 +1.09931081335358,0.199,1.501; 5519P 10182 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000178,-0.00100000000000178, 5521P 10183 +11.1172612056252,11.1172612056252,-0.001,-0.001,1.911,1.911,1., 5521P 10184 +1.,1.,1.,144.591129377503,-156.547507575232,7.51, 5521P 10185 +255.773741433756,-156.547507575232,7.51,144.591129377503, 5521P 10186 +-156.547507575232,-11.61,255.773741433756,-156.547507575232, 5521P 10187 +-11.61,-0.00100000000000178,11.1172612056252,-0.001,1.911; 5521P 10188 +128,1,1,1,1,0,0,1,0,0,-6.45934487907209,-6.45934487907209, 5523P 10189 +6.45935129953954,6.45935129953954,-5.01108541554375, 5523P 10190 +-5.01108541554375,5.01108541554375,5.01108541554375,1.,1.,1.,1., 5523P 10191 +135.588939647638,-156.537507575232,-11.6,264.775901433754, 5523P 10192 +-156.537507575232,-11.6,135.588939647638,-256.759215886107, 5523P 10193 +-11.6,264.775901433754,-256.759215886107,-11.6, 5523P 10194 +-6.45934487907209,6.45935129953954,-5.01108541554375, 5523P 10195 +5.01108541554375; 5523P 10196 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.90334375,0.90334375, 5525P 10197 +-0.001,-0.001,0.101,0.101,1.,1.,1.,1.,189.322570909196, 5525P 10198 +-187.660756010089,-7.49,198.366008409196,-187.660756010089, 5525P 10199 +-7.49,189.322570909196,-187.660756010089,-8.51,198.366008409196, 5525P 10200 +-187.660756010089,-8.51,-0.001,0.90334375,-0.001,0.101; 5525P 10201 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.562521192363372, 5527P 10202 +0.844152403739511,0.844152403739511,0.844152403739511, 5527P 10203 +0.844152403739511,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5527P 10204 +198.356008409196,-187.660756010089,-7.5,200.231830522622, 5527P 10205 +-187.649960043727,-7.5,203.046799571848,-187.633758981298,-7.5, 5527P 10206 +205.856214479556,-187.800454535029,-7.5,206.793508409196, 5527P 10207 +-187.856068510089,-7.5,198.356008409196,-187.660756010089,-8.5, 5527P 10208 +200.231830522622,-187.649960043727,-8.5,203.046799571848, 5527P 10209 +-187.633758981298,-8.5,205.856214479556,-187.800454535029,-8.5, 5527P 10210 +206.793508409196,-187.856068510089,-8.5,0.,0.844152403739511,0., 5527P 10211 +0.1; 5527P 10212 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.261898150092223, 5529P 10213 +0.497778933126644,0.497778933126644,0.497778933126644, 5529P 10214 +0.497778933126644,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5529P 10215 +206.793508409196,-187.856068510089,-7.5,207.662882757985, 5529P 10216 +-188.049967147936,-7.5,209.315266463925,-188.418502233228,-7.5, 5529P 10217 +210.559416215435,-189.560844484626,-7.5,211.148977159196, 5529P 10218 +-190.102162260089,-7.5,206.793508409196,-187.856068510089,-8.5, 5529P 10219 +207.662882757985,-188.049967147936,-8.5,209.315266463925, 5529P 10220 +-188.418502233228,-8.5,210.559416215435,-189.560844484626,-8.5, 5529P 10221 +211.148977159196,-190.102162260089,-8.5,0.,0.497778933126644,0., 5529P 10222 +0.1; 5529P 10223 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.235900997344428, 5531P 10224 +0.499964111306824,0.499964111306824,0.499964111306824, 5531P 10225 +0.499964111306824,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5531P 10226 +211.148977159196,-190.102162260089,-7.5,211.598623495598, 5531P 10227 +-190.765518704879,-7.5,212.551595435151,-192.171423805461,-7.5, 5531P 10228 +212.643437973881,-193.871965743153,-7.5,212.691945909196, 5531P 10229 +-194.770131010089,-7.5,211.148977159196,-190.102162260089,-8.5, 5531P 10230 +211.598623495598,-190.765518704879,-8.5,212.551595435151, 5531P 10231 +-192.171423805461,-8.5,212.643437973881,-193.871965743153,-8.5, 5531P 10232 +212.691945909196,-194.770131010089,-8.5,0.,0.499964111306824,0., 5531P 10233 +0.1; 5531P 10234 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.238137123420061, 5533P 10235 +0.450534415924653,0.450534415924653,0.450534415924653, 5533P 10236 +0.450534415924653,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5533P 10237 +212.691945909196,-194.770131010089,-7.5,212.655290538983, 5533P 10238 +-195.575101594424,-7.5,212.585941814299,-197.098034881101,-7.5, 5533P 10239 +211.861566257095,-198.436165560765,-7.5,211.520070909196, 5533P 10240 +-199.067006010089,-7.5,212.691945909196,-194.770131010089,-8.5, 5533P 10241 +212.655290538983,-195.575101594424,-8.5,212.585941814299, 5533P 10242 +-197.098034881101,-8.5,211.861566257095,-198.436165560765,-8.5, 5533P 10243 +211.520070909196,-199.067006010089,-8.5,0.,0.450534415924653,0., 5533P 10244 +0.1; 5533P 10245 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.202384184696661, 5535P 10246 +0.410291107118963,0.410291107118963,0.410291107118963, 5535P 10247 +0.410291107118963,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5535P 10248 +211.520070909196,-199.067006010089,-7.5,211.087476419098, 5535P 10249 +-199.599125342313,-7.5,210.210482633534,-200.677884684425,-7.5, 5535P 10250 +208.927838177421,-201.216133860944,-7.5,208.277883409196, 5535P 10251 +-201.488881010089,-7.5,211.520070909196,-199.067006010089,-8.5, 5535P 10252 +211.087476419098,-199.599125342313,-8.5,210.210482633534, 5535P 10253 +-200.677884684425,-8.5,208.927838177421,-201.216133860944,-8.5, 5535P 10254 +208.277883409196,-201.488881010089,-8.5,0.,0.410291107118963,0., 5535P 10255 +0.1; 5535P 10256 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.367088791586182, 5537P 10257 +1.04309862016124,1.04309862016124,1.04309862016124, 5537P 10258 +1.04309862016124,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5537P 10259 +208.277883409196,-201.488881010089,-7.5,207.069106365723, 5537P 10260 +-201.689994183538,-7.5,203.634314307158,-202.261465932413,-7.5, 5537P 10261 +200.147189290955,-202.219319929824,-7.5,197.887258409196, 5537P 10262 +-202.192006010089,-7.5,208.277883409196,-201.488881010089,-8.5, 5537P 10263 +207.069106365723,-201.689994183538,-8.5,203.634314307158, 5537P 10264 +-202.261465932413,-8.5,200.147189290955,-202.219319929824,-8.5, 5537P 10265 +197.887258409196,-202.192006010089,-8.5,0.,1.04309862016124,0., 5537P 10266 +0.1; 5537P 10267 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.85646875,0.85646875, 5539P 10268 +-0.001,-0.001,0.101,0.101,1.,1.,1.,1.,197.897258409196, 5539P 10269 +-202.192006010089,-7.49,189.322570909196,-202.192006010089, 5539P 10270 +-7.49,197.897258409196,-202.192006010089,-8.51,189.322570909196, 5539P 10271 +-202.192006010089,-8.51,-0.001,0.85646875,-0.001,0.101; 5539P 10272 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.454125,1.454125,-0.001, 5541P 10273 +-0.001,0.101,0.101,1.,1.,1.,1.,189.332570909196, 5541P 10274 +-202.202006010089,-7.49,189.332570909196,-187.650756010089, 5541P 10275 +-7.49,189.332570909196,-202.202006010089,-8.51,189.332570909196, 5541P 10276 +-187.650756010089,-8.51,-0.001,1.454125,-0.001,0.101; 5541P 10277 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,2.391625,2.391625,-0.001, 5543P 10278 +-0.001,0.101,0.101,1.,1.,1.,1.,189.332570909196, 5543P 10279 +-235.248881010089,-7.49,189.332570909196,-211.322631010089, 5543P 10280 +-7.49,189.332570909196,-235.248881010089,-8.51,189.332570909196, 5543P 10281 +-211.322631010089,-8.51,-0.001,2.391625,-0.001,0.101; 5543P 10282 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.235375,0.235375,-0.001, 5545P 10283 +-0.001,0.101,0.101,1.,1.,1.,1.,189.322570909196, 5545P 10284 +-211.332631010089,-7.49,191.686320909196,-211.332631010089, 5545P 10285 +-7.49,189.322570909196,-211.332631010089,-8.51,191.686320909196, 5545P 10286 +-211.332631010089,-8.51,-0.001,0.235375,-0.001,0.101; 5545P 10287 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.345102942215374, 5547P 10288 +0.58728108987376,0.58728108987376,0.58728108987376, 5547P 10289 +0.58728108987376,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5547P 10290 +191.676320909196,-211.332631010089,-7.5,192.831842297831, 5547P 10291 +-211.334659249473,-7.5,194.798258046518,-211.338110818527,-7.5, 5547P 10292 +196.708785715842,-211.790577691044,-7.5,197.496633409196, 5547P 10293 +-211.977162260089,-7.5,191.676320909196,-211.332631010089,-8.5, 5547P 10294 +192.831842297831,-211.334659249473,-8.5,194.798258046518, 5547P 10295 +-211.338110818527,-8.5,196.708785715842,-211.790577691044,-8.5, 5547P 10296 +197.496633409196,-211.977162260089,-8.5,0.,0.58728108987376,0., 5547P 10297 +0.1; 5547P 10298 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.200908599721103, 5549P 10299 +0.424515823966796,0.424515823966796,0.424515823966796, 5549P 10300 +0.424515823966796,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5549P 10301 +197.496633409196,-211.977162260089,-7.5,198.113566785881, 5549P 10302 +-212.251744615522,-7.5,199.417134582878,-212.831931601172,-7.5, 5549P 10303 +200.436343293178,-213.832788618144,-7.5,200.973195909196, 5549P 10304 +-214.359974760089,-7.5,197.496633409196,-211.977162260089,-8.5, 5549P 10305 +198.113566785881,-212.251744615522,-8.5,199.417134582878, 5549P 10306 +-212.831931601172,-8.5,200.436343293178,-213.832788618144,-8.5, 5549P 10307 +200.973195909196,-214.359974760089,-8.5,0.,0.424515823966796,0., 5549P 10308 +0.1; 5549P 10309 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.378624565580162, 5551P 10310 +1.03970923338266,1.03970923338266,1.03970923338266, 5551P 10311 +1.03970923338266,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5551P 10312 +200.973195909196,-214.359974760089,-7.5,201.766342156981, 5551P 10313 +-215.342414541706,-7.5,203.94433469157,-218.04021020804,-7.5, 5551P 10314 +205.853212488561,-220.936425355574,-7.5,207.066945909196, 5551P 10315 +-222.777943510089,-7.5,200.973195909196,-214.359974760089,-8.5, 5551P 10316 +201.766342156981,-215.342414541706,-8.5,203.94433469157, 5551P 10317 +-218.04021020804,-8.5,205.853212488561,-220.936425355574,-8.5, 5551P 10318 +207.066945909196,-222.777943510089,-8.5,0.,1.03970923338266,0., 5551P 10319 +0.1; 5551P 10320 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.50151362462835, 5553P 10321 +1.50151362462835,-0.001,-0.001,0.101,0.101,1.,1.,1.,1., 5553P 10322 +207.061374900134,-222.769639062002,-7.49,215.431891918257, 5553P 10323 +-235.247185458177,-7.49,207.061374900134,-222.769639062002, 5553P 10324 +-8.51,215.431891918257,-235.247185458177,-8.51,-0.001, 5553P 10325 +1.50151362462835,-0.001,0.101; 5553P 10326 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.3838125,1.3838125,-0.001, 5555P 10327 +-0.001,0.101,0.101,1.,1.,1.,1.,215.416320909196, 5555P 10328 +-235.238881010089,-7.49,229.264445909196,-235.238881010089, 5555P 10329 +-7.49,215.416320909196,-235.238881010089,-8.51,229.264445909196, 5555P 10330 +-235.238881010089,-8.51,-0.001,1.3838125,-0.001,0.101; 5555P 10331 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.31895856175671, 5557P 10332 +1.31895856175671,-0.001,-0.001,0.101,0.101,1.,1.,1.,1., 5557P 10333 +229.259751225844,-235.247357661271,-7.49,222.256953092547, 5557P 10334 +-224.058529358908,-7.49,229.259751225844,-235.247357661271, 5557P 10335 +-8.51,222.256953092547,-224.058529358908,-8.51,-0.001, 5557P 10336 +1.31895856175671,-0.001,0.101; 5557P 10337 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.677413644671362, 5559P 10338 +1.14014998210771,1.14014998210771,1.14014998210771, 5559P 10339 +1.14014998210771,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5559P 10340 +222.262258409196,-224.067006010089,-7.5,221.071194285368, 5559P 10341 +-222.144734836071,-7.5,219.066522914849,-218.90937419357,-7.5, 5559P 10342 +216.657814949634,-215.965086764049,-7.5,215.680227159196, 5559P 10343 +-214.770131010089,-7.5,222.262258409196,-224.067006010089,-8.5, 5559P 10344 +221.071194285368,-222.144734836071,-8.5,219.066522914849, 5559P 10345 +-218.90937419357,-8.5,216.657814949634,-215.965086764049,-8.5, 5559P 10346 +215.680227159196,-214.770131010089,-8.5,0.,1.14014998210771,0., 5559P 10347 +0.1; 5559P 10348 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.373681930926689, 5561P 10349 +0.785781181487306,0.785781181487306,0.785781181487306, 5561P 10350 +0.785781181487306,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5561P 10351 +215.680227159196,-214.770131010089,-7.5,214.783943791004, 5561P 10352 +-213.899557402522,-7.5,212.899232367418,-212.068908657398,-7.5, 5561P 10353 +210.662083255283,-210.689085359138,-7.5,209.488820909196, 5561P 10354 +-209.965443510089,-7.5,215.680227159196,-214.770131010089,-8.5, 5561P 10355 +214.783943791004,-213.899557402522,-8.5,212.899232367418, 5561P 10356 +-212.068908657398,-8.5,210.662083255283,-210.689085359138,-8.5, 5561P 10357 +209.488820909196,-209.965443510089,-8.5,0.,0.785781181487306,0., 5561P 10358 +0.1; 5561P 10359 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.686133847994611, 5563P 10360 +1.26971165673407,1.26971165673407,1.26971165673407, 5563P 10361 +1.26971165673407,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5563P 10362 +209.488820909196,-209.965443510089,-7.5,211.783402108826, 5563P 10363 +-209.536092499316,-7.5,216.029594750405,-208.741565331179,-7.5, 5563P 10364 +219.30946855557,-205.953780785553,-7.5,220.816945909196, 5563P 10365 +-204.672474760089,-7.5,209.488820909196,-209.965443510089,-8.5, 5563P 10366 +211.783402108826,-209.536092499316,-8.5,216.029594750405, 5563P 10367 +-208.741565331179,-8.5,219.30946855557,-205.953780785553,-8.5, 5563P 10368 +220.816945909196,-204.672474760089,-8.5,0.,1.26971165673407,0., 5563P 10369 +0.1; 5563P 10370 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.554440940539225, 5565P 10371 +1.15039635746486,1.15039635746486,1.15039635746486, 5565P 10372 +1.15039635746486,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5565P 10373 +220.816945909196,-204.672474760089,-7.5,221.921692259118, 5565P 10374 +-203.14284764226,-7.5,224.213904258538,-199.969060614703,-7.5, 5565P 10375 +224.472199977234,-196.055393519306,-7.5,224.606008409196, 5565P 10376 +-194.027943510089,-7.5,220.816945909196,-204.672474760089,-8.5, 5565P 10377 +221.921692259118,-203.14284764226,-8.5,224.213904258538, 5565P 10378 +-199.969060614703,-8.5,224.472199977234,-196.055393519306,-8.5, 5565P 10379 +224.606008409196,-194.027943510089,-8.5,0.,1.15039635746486,0., 5565P 10380 +0.1; 5565P 10381 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.483548351122755, 5567P 10382 +0.946106124712921,0.946106124712921,0.946106124712921, 5567P 10383 +0.946106124712921,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5567P 10384 +224.606008409196,-194.027943510089,-7.5,224.51140065161, 5567P 10385 +-192.397733878194,-7.5,224.326292009032,-189.208081150147,-7.5, 5567P 10386 +222.835074753493,-186.384818489344,-7.5,222.106008409196, 5567P 10387 +-185.004506010089,-7.5,224.606008409196,-194.027943510089,-8.5, 5567P 10388 +224.51140065161,-192.397733878194,-8.5,224.326292009032, 5567P 10389 +-189.208081150147,-8.5,222.835074753493,-186.384818489344,-8.5, 5567P 10390 +222.106008409196,-185.004506010089,-8.5,0.,0.946106124712921,0., 5567P 10391 +0.1; 5567P 10392 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.443673849959561, 5569P 10393 +0.875191282358429,0.875191282358429,0.875191282358429, 5569P 10394 +0.875191282358429,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5569P 10395 +222.106008409196,-185.004506010089,-7.5,221.213376913017, 5569P 10396 +-183.793211270963,-7.5,219.45257152887,-181.403810597143,-7.5, 5569P 10397 +216.769000336918,-180.1395665842,-7.5,215.445852159196, 5569P 10398 +-179.516224760089,-7.5,222.106008409196,-185.004506010089,-8.5, 5569P 10399 +221.213376913017,-183.793211270963,-8.5,219.45257152887, 5569P 10400 +-181.403810597143,-8.5,216.769000336918,-180.1395665842,-8.5, 5569P 10401 +215.445852159196,-179.516224760089,-8.5,0.,0.875191282358429,0., 5569P 10402 +0.1; 5569P 10403 +128,4,1,3,1,0,0,1,0,0,0.,0.,0.,0.,0.553731174536493, 5571P 10404 +1.34714989356346,1.34714989356346,1.34714989356346, 5571P 10405 +1.34714989356346,0.,0.,0.1,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,1., 5571P 10406 +215.445852159196,-179.516224760089,-7.5,213.648767024992, 5571P 10407 +-179.069647768159,-7.5,209.276712211041,-177.983188896397,-7.5, 5571P 10408 +204.763886597037,-177.976937713112,-7.5,202.106008409196, 5571P 10409 +-177.973256010089,-7.5,215.445852159196,-179.516224760089,-8.5, 5571P 10410 +213.648767024992,-179.069647768159,-8.5,209.276712211041, 5571P 10411 +-177.983188896397,-8.5,204.763886597037,-177.976937713112,-8.5, 5571P 10412 +202.106008409196,-177.973256010089,-8.5,0.,1.34714989356346,0., 5571P 10413 +0.1; 5571P 10414 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,2.43459375,2.43459375, 5573P 10415 +-0.001,-0.001,0.101,0.101,1.,1.,1.,1.,202.116008409196, 5573P 10416 +-177.973256010089,-7.49,177.760070909196,-177.973256010089, 5573P 10417 +-7.49,202.116008409196,-177.973256010089,-8.51,177.760070909196, 5573P 10418 +-177.973256010089,-8.51,-0.001,2.43459375,-0.001,0.101; 5573P 10419 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,5.7275625,5.7275625,-0.001, 5575P 10420 +-0.001,0.101,0.101,1.,1.,1.,1.,177.770070909196, 5575P 10421 +-177.963256010089,-7.49,177.770070909196,-235.248881010089, 5575P 10422 +-7.49,177.770070909196,-177.963256010089,-8.51,177.770070909196, 5575P 10423 +-235.248881010089,-8.51,-0.001,5.7275625,-0.001,0.101; 5575P 10424 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.15725,1.15725,-0.001, 5577P 10425 +-0.001,0.101,0.101,1.,1.,1.,1.,177.760070909196, 5577P 10426 +-235.238881010089,-7.49,189.342570909196,-235.238881010089, 5577P 10427 +-7.49,177.760070909196,-235.238881010089,-8.51,189.342570909196, 5577P 10428 +-235.238881010089,-8.51,-0.001,1.15725,-0.001,0.101; 5577P 10429 +128,1,1,1,1,0,0,1,0,0,-2.57521875,-2.57521875,2.57521875, 5579P 10430 +2.57521875,-2.86428125,-2.86428125,2.86428125,2.86428125,1.,1., 5579P 10431 +1.,1.,229.264445909196,-177.963256010089,-8.5,177.760070909196, 5579P 10432 +-177.963256010089,-8.5,229.264445909196,-235.248881010089,-8.5, 5579P 10433 +177.760070909196,-235.248881010089,-8.5,-2.57521875,2.57521875, 5579P 10434 +-2.86428125,2.86428125; 5579P 10435 +128,1,1,1,1,0,0,1,0,0,-5.83292786387186,-5.83292786387186, 5581P 10436 +5.83292652709446,5.83292652709446,-4.39739056237306, 5581P 10437 +-4.39739056237306,4.38466970486183,4.38466970486183,1.,1.,1.,1., 5581P 10438 +258.511731281752,-162.674456106938,-7.5,141.853187372088, 5581P 10439 +-162.674456106938,-7.5,258.511731281752,-250.495058779287,-7.5, 5581P 10440 +141.853187372088,-250.495058779287,-7.5,-5.83292786387186, 5581P 10441 +5.83292652709446,-4.39739056237306,4.38466970486183; 5581P 10442 +128,1,6,1,2,0,0,0,0,0,11.5962540906493,11.5962540906493, 5583P 10443 +14.5245559935925,14.5245559935925,3.13917765423161, 5583P 10444 +3.13917765423161,3.13917765423161,4.18718020521427, 5583P 10445 +4.18718020521427,5.23518275619693,5.23518275619693, 5583P 10446 +6.28318530717959,6.28318530717959,6.28318530717959,1.,1., 5583P 10447 +0.865824083692631,0.865824083692631,1.,1.,0.865824083692631, 5583P 10448 +0.865824083692631,1.,1.,0.865824083692631,0.865824083692631,1., 5583P 10449 +1.,158.107551165901,-172.121201750437,-7.5,158.107551165901, 5583P 10450 +-172.121201750437,-11.6,158.106574158405,-171.312085990108,-7.5, 5583P 10451 +158.106574158405,-171.312085990108,-11.6,158.807126580916, 5583P 10452 +-170.907245809948,-7.5,158.807126580916,-170.907245809948,-11.6, 5583P 10453 +159.507679003426,-170.502405629789,-7.5,159.507679003426, 5583P 10454 +-170.502405629789,-11.6,160.208231425936,-170.907245809948,-7.5, 5583P 10455 +160.208231425936,-170.907245809948,-11.6,160.908783848446, 5583P 10456 +-171.312085990108,-7.5,160.908783848446,-171.312085990108,-11.6, 5583P 10457 +160.90780684095,-172.121201750437,-7.5,160.90780684095, 5583P 10458 +-172.121201750437,-11.6,11.5962540906493,14.5245559935925, 5583P 10459 +3.13917765423161,6.28318530717959; 5583P 10460 +128,1,6,1,2,0,0,0,0,0,11.5962540906495,11.5962540906495, 5585P 10461 +14.5245559935927,14.5245559935927,3.13917765425437, 5585P 10462 +3.13917765425437,3.13917765425437,4.18718020522942, 5585P 10463 +4.18718020522942,5.23518275620448,5.23518275620448, 5585P 10464 +6.28318530717956,6.28318530717956,6.28318530717956,1.,1., 5585P 10465 +0.865824083694531,0.865824083694531,1.,1.,0.865824083694531, 5585P 10466 +0.865824083694531,1.,1.,0.865824083694531,0.865824083694531,1., 5585P 10467 +1.,160.90780684095,-172.121201750437,-7.5,160.90780684095, 5585P 10468 +-172.121201750437,-11.6,160.908783848437,-172.930317510758,-7.5, 5585P 10469 +160.908783848437,-172.930317510758,-11.6,160.208231425931, 5585P 10470 +-173.335157690912,-7.5,160.208231425931,-173.335157690912,-11.6, 5585P 10471 +159.507679003426,-173.739997871065,-7.5,159.507679003426, 5585P 10472 +-173.739997871065,-11.6,158.80712658092,-173.335157690912,-7.5, 5585P 10473 +158.80712658092,-173.335157690912,-11.6,158.106574158415, 5585P 10474 +-172.930317510759,-7.5,158.106574158415,-172.930317510759,-11.6, 5585P 10475 +158.107551165901,-172.121201750437,-7.5,158.107551165901, 5585P 10476 +-172.121201750437,-11.6,11.5962540906495,14.5245559935927, 5585P 10477 +3.13917765425437,6.28318530717956; 5585P 10478 +128,1,6,1,2,0,0,0,0,0,11.5962540906494,11.5962540906494, 5587P 10479 +14.5245559935926,14.5245559935926,3.13917765424305, 5587P 10480 +3.13917765424305,3.13917765424305,4.18718020522189, 5587P 10481 +4.18718020522189,5.23518275620074,5.23518275620074, 5587P 10482 +6.28318530717959,6.28318530717959,6.28318530717959,1.,1., 5587P 10483 +0.865824083693586,0.865824083693586,1.,1.,0.865824083693586, 5587P 10484 +0.865824083693586,1.,1.,0.865824083693586,0.865824083693586,1., 5587P 10485 +1.,236.882006921691,-190.598023114196,-7.5,236.882006921691, 5587P 10486 +-190.598023114196,-11.6,236.8810299142,-189.78890735387,-7.5, 5587P 10487 +236.8810299142,-189.78890735387,-11.6,237.581582336708, 5587P 10488 +-189.384067173714,-7.5,237.581582336708,-189.384067173714,-11.6, 5587P 10489 +238.282134759216,-188.979226993558,-7.5,238.282134759216, 5587P 10490 +-188.979226993558,-11.6,238.982687181724,-189.384067173714,-7.5, 5587P 10491 +238.982687181724,-189.384067173714,-11.6,239.683239604231, 5587P 10492 +-189.78890735387,-7.5,239.683239604231,-189.78890735387,-11.6, 5587P 10493 +239.68226259674,-190.598023114196,-7.5,239.68226259674, 5587P 10494 +-190.598023114196,-11.6,11.5962540906494,14.5245559935926, 5587P 10495 +3.13917765424305,6.28318530717959; 5587P 10496 +128,1,6,1,2,0,0,0,0,0,11.5962540906494,11.5962540906494, 5589P 10497 +14.5245559935926,14.5245559935926,3.13917765424295, 5589P 10498 +3.13917765424295,3.13917765424295,4.18718020522186, 5589P 10499 +4.18718020522186,5.23518275620077,5.23518275620077, 5589P 10500 +6.28318530717964,6.28318530717964,6.28318530717964,1.,1., 5589P 10501 +0.865824083693573,0.865824083693573,1.,1.,0.865824083693573, 5589P 10502 +0.865824083693573,1.,1.,0.865824083693573,0.865824083693573,1., 5589P 10503 +1.,239.68226259674,-190.598023114196,-7.5,239.68226259674, 5589P 10504 +-190.598023114196,-11.6,239.683239604231,-191.407138874521,-7.5, 5589P 10505 +239.683239604231,-191.407138874521,-11.6,238.982687181724, 5589P 10506 +-191.811979054677,-7.5,238.982687181724,-191.811979054677,-11.6, 5589P 10507 +238.282134759216,-192.216819234834,-7.5,238.282134759216, 5589P 10508 +-192.216819234834,-11.6,237.581582336708,-191.811979054677,-7.5, 5589P 10509 +237.581582336708,-191.811979054677,-11.6,236.8810299142, 5589P 10510 +-191.407138874521,-7.5,236.8810299142,-191.407138874521,-11.6, 5589P 10511 +236.882006921691,-190.598023114196,-7.5,236.882006921691, 5589P 10512 +-190.598023114196,-11.6,11.5962540906494,14.5245559935926, 5589P 10513 +3.13917765424295,6.28318530717964; 5589P 10514 +128,1,2,1,2,0,0,0,0,0,0.799309396681276,0.799309396681276, 5591P 10515 +5.99482047510957,5.99482047510957,-1.15918194829754, 5591P 10516 +-1.15918194829754,-1.15918194829754,-0.029277809273359, 5591P 10517 +-0.029277809273359,-0.029277809273359,1.,1.,0.844614262194489, 5591P 10518 +0.844614262194489,1.,1.,143.600041714311,-167.842837467805,5.5, 5591P 10519 +143.600041714311,-167.842837467805,-7.5,142.146470952165, 5591P 10520 +-167.208278396419,5.5,142.146470952165,-167.208278396419,-7.5, 5591P 10521 +142.10004171431,-165.622914872961,5.5,142.10004171431, 5591P 10522 +-165.622914872961,-7.5,0.799309396681276,5.99482047510957, 5591P 10523 +-1.15918194829754,-0.029277809273359; 5591P 10524 +128,1,1,1,1,0,0,1,0,0,0.228270146333974,0.228270146333974, 5593P 10525 +10.8879873393078,10.8879873393078,0.199,0.199,1.501,1.501,1.,1., 5593P 10526 +1.,1.,146.883865315652,-248.749215886107,5.51,253.48103724539, 5593P 10527 +-248.749215886107,5.51,146.883865315652,-248.749215886107,-7.51, 5593P 10528 +253.48103724539,-248.749215886107,-7.51,0.228270146333974, 5593P 10529 +10.8879873393078,0.199,1.501; 5593P 10530 +128,1,1,1,1,0,0,1,0,0,0.228270146333972,0.228270146333972, 5595P 10531 +6.02854140723685,6.02854140723685,0.199,0.199,1.501,1.501,1.,1., 5595P 10532 +1.,1.,143.600041886497,-187.461624566824,5.51,143.599043157521, 5595P 10533 +-245.464337167254,5.51,143.600041886497,-187.461624566824,-7.51, 5595P 10534 +143.599043157521,-245.464337167254,-7.51,0.228270146333972, 5595P 10535 +6.02854140723685,0.199,1.501; 5595P 10536 +128,1,1,1,1,0,0,1,0,0,4.45882151319937,4.45882151319937, 5597P 10537 +5.55913232655296,5.55913232655296,-4.36108541554375, 5597P 10538 +-4.36108541554375,-4.20908541554375,-4.20908541554375,1.,1.,1., 5597P 10539 +1.,155.594237511039,-163.037507575232,5.5,144.591129377503, 5597P 10540 +-163.037507575232,5.5,155.594237511039,-164.557507575232,5.5, 5597P 10541 +144.591129377503,-164.557507575232,5.5,4.45882151319937, 5597P 10542 +5.55913232655296,-4.36108541554375,-4.20908541554375; 5597P 10543 +128,1,1,1,1,0,0,1,0,0,5.65724109287224,5.65724109287224, 5599P 10544 +5.80934487903499,5.80934487903499,-4.10354468577093, 5599P 10545 +-4.10354468577093,4.11086510715957,4.11086510715957,1.,1.,1.,1., 5599P 10546 +143.610041714311,-165.612914872961,5.5,142.089003852683, 5599P 10547 +-165.612914872961,5.5,143.610041714311,-247.757012802266,5.5, 5599P 10548 +142.089003852683,-247.757012802266,5.5,5.65724109287224, 5599P 10549 +5.80934487903499,-4.10354468577093,4.11086510715957; 5599P 10550 +128,1,1,1,1,0,0,1,0,0,-5.55912860656964,-5.55912860656964, 5601P 10551 +5.55912887907209,5.55912887907209,4.20908541554374, 5601P 10552 +4.20908541554374,4.36108541554375,4.36108541554375,1.,1.,1.,1., 5601P 10553 +255.773738708729,-248.739215886107,5.5,144.591163852312, 5601P 10554 +-248.739215886107,5.5,255.773738708729,-250.259215886107,5.5, 5601P 10555 +144.591163852312,-250.259215886107,5.5,-5.55912860656964, 5601P 10556 +5.55912887907209,4.20908541554374,4.36108541554375; 5601P 10557 +128,1,1,1,1,0,0,1,0,0,9.31695353740574,9.31695353740574, 5603P 10558 +10.8879910592913,10.8879910592913,0.199,0.199,1.501,1.501,1.,1., 5603P 10559 +1.,1.,253.481039970417,-164.547507575232,5.51,237.770664751561, 5603P 10560 +-164.547507575232,5.51,253.481039970417,-164.547507575232,-7.51, 5603P 10561 +237.770664751561,-164.547507575232,-7.51,9.31695353740574, 5603P 10562 +10.8879910592913,0.199,1.501; 5603P 10563 +128,1,1,1,1,0,0,1,0,0,-5.80934505627278,-5.80934505627278, 5605P 10564 +-5.65734461417045,-5.65734461417045,-4.11086968638896, 5605P 10565 +-4.11086968638896,4.11086941554375,4.11086941554375,1.,1.,1.,1., 5605P 10566 +258.275903205761,-165.53966486678,5.5,256.755898784737, 5605P 10567 +-165.53966486678,5.5,258.275903205761,-247.757055886107,5.5, 5605P 10568 +256.755898784737,-247.757055886107,5.5,-5.80934505627278, 5605P 10569 +-5.65734461417045,-4.11086968638896,4.11086941554375; 5605P 10570 +128,1,1,1,1,0,0,1,0,0,-5.55912887907228,-5.55912887907228, 5607P 10571 +-3.75882121085278,-3.75882121085278,-4.36108541554375, 5607P 10572 +-4.36108541554375,-4.20908541554375,-4.20908541554375,1.,1.,1., 5607P 10573 +1.,255.773741433756,-163.037507575232,5.5,237.770664751561, 5607P 10574 +-163.037507575232,5.5,255.773741433756,-164.557507575232,5.5, 5607P 10575 +237.770664751561,-164.557507575232,5.5,-5.55912887907228, 5607P 10576 +-3.75882121085278,-4.36108541554375,-4.20908541554375; 5607P 10577 +128,1,6,1,2,0,0,0,0,0,10.7132996449142,10.7132996449142, 5609P 10578 +13.6416015478574,13.6416015478574,3.13925814733116, 5609P 10579 +3.13925814733116,3.13925814733116,4.18720703624771, 5609P 10580 +4.18720703624771,5.23515592516426,5.23515592516426, 5609P 10581 +6.28310481408081,6.28310481408081,6.28310481408081,1.,1., 5609P 10582 +0.865837508249046,0.865837508249046,1.,1.,0.865837508249046, 5609P 10583 +0.865837508249046,1.,1.,0.865837508249046,0.865837508249046,1., 5609P 10584 +1.,160.582628341595,-228.698656211065,-7.5,160.582628341595, 5609P 10585 +-228.698656211065,-11.6,160.581651394605,-227.831805396136,-7.5, 5609P 10586 +160.581651394605,-227.831805396136,-11.6,161.332203820879, 5609P 10587 +-227.39809772364,-7.5,161.332203820879,-227.39809772364,-11.6, 5609P 10588 +162.082756247154,-226.964390051143,-7.5,162.082756247154, 5609P 10589 +-226.964390051143,-11.6,162.833308673433,-227.398097723632,-7.5, 5609P 10590 +162.833308673433,-227.398097723632,-11.6,163.583861099712, 5609P 10591 +-227.83180539612,-7.5,163.583861099712,-227.83180539612,-11.6, 5609P 10592 +163.58288415273,-228.69865621105,-7.5,163.58288415273, 5609P 10593 +-228.69865621105,-11.6,10.7132996449142,13.6416015478574, 5609P 10594 +3.13925814733116,6.28310481408081; 5609P 10595 +128,1,6,1,2,0,0,0,0,0,10.7132996449144,10.7132996449144, 5611P 10596 +13.6416015478576,13.6416015478576,3.13925814734165, 5611P 10597 +3.13925814734165,3.13925814734165,4.18720703625122, 5611P 10598 +4.18720703625122,5.23515592516079,5.23515592516079, 5611P 10599 +6.28310481407037,6.28310481407037,6.28310481407037,1.,1., 5611P 10600 +0.865837508250792,0.865837508250792,1.,1.,0.865837508250792, 5611P 10601 +0.865837508250792,1.,1.,0.865837508250792,0.865837508250792,1., 5611P 10602 +1.,163.58288415273,-228.69865621105,-7.5,163.58288415273, 5611P 10603 +-228.69865621105,-11.6,163.583861099712,-229.565507025972,-7.5, 5611P 10604 +163.583861099712,-229.565507025972,-11.6,162.833308673442, 5611P 10605 +-229.999214698462,-7.5,162.833308673442,-229.999214698462,-11.6, 5611P 10606 +162.082756247172,-230.432922370953,-7.5,162.082756247172, 5611P 10607 +-230.432922370953,-11.6,161.332203820897,-229.99921469847,-7.5, 5611P 10608 +161.332203820897,-229.99921469847,-11.6,160.581651394623, 5611P 10609 +-229.565507025988,-7.5,160.581651394623,-229.565507025988,-11.6, 5611P 10610 +160.582628341595,-228.698656211065,-7.5,160.582628341595, 5611P 10611 +-228.698656211065,-11.6,10.7132996449144,13.6416015478576, 5611P 10612 +3.13925814734165,6.28310481407037; 5611P 10613 +128,1,6,1,2,0,0,0,0,0,10.7132954794018,10.7132954794018, 5613P 10614 +13.6415962437716,13.6415962437716,3.13866619557958, 5613P 10615 +3.13866619557958,3.13866619557958,4.18680559830898, 5613P 10616 +4.18680559830898,5.23494500103838,5.23494500103838, 5613P 10617 +6.28308440376778,6.28308440376778,6.28308440376778,1.,1., 5613P 10618 +0.865789844880249,0.865789844880249,1.,1.,0.865789844880249, 5613P 10619 +0.865789844880249,1.,1.,0.865789844880249,0.865789844880249,1., 5613P 10620 +1.,236.784016479572,-228.698656211057,-7.5,236.784016479572, 5613P 10621 +-228.698656211057,-11.6,236.782791542295,-227.831614772873,-7.5, 5613P 10622 +236.782791542295,-227.831614772873,-11.6,237.533467963717, 5613P 10623 +-227.397740060174,-7.5,237.533467963717,-227.397740060174,-11.6, 5613P 10624 +238.284144385139,-226.963865347475,-7.5,238.284144385139, 5613P 10625 +-226.963865347475,-11.6,239.034820806561,-227.397740060174,-7.5, 5613P 10626 +239.034820806561,-227.397740060174,-11.6,239.785497227983, 5613P 10627 +-227.831614772873,-7.5,239.785497227983,-227.831614772873,-11.6, 5613P 10628 +239.784272290707,-228.698656211057,-7.5,239.784272290707, 5613P 10629 +-228.698656211057,-11.6,10.7132954794018,13.6415962437716, 5613P 10630 +3.13866619557958,6.28308440376778; 5613P 10631 +128,1,6,1,2,0,0,0,0,0,10.7132954794019,10.7132954794019, 5615P 10632 +13.6415962437718,13.6415962437718,3.13866619559783, 5615P 10633 +3.13866619559783,3.13866619559783,4.18680559832112, 5615P 10634 +4.18680559832112,5.23494500104441,5.23494500104441, 5615P 10635 +6.2830844037677,6.2830844037677,6.2830844037677,1.,1., 5615P 10636 +0.865789844881778,0.865789844881778,1.,1.,0.865789844881778, 5615P 10637 +0.865789844881778,1.,1.,0.865789844881778,0.865789844881778,1., 5615P 10638 +1.,239.784272290707,-228.698656211056,-7.5,239.784272290707, 5615P 10639 +-228.698656211056,-11.6,239.785497227975,-229.565697649234,-7.5, 5615P 10640 +239.785497227975,-229.565697649234,-11.6,239.034820806557, 5615P 10641 +-229.999572361928,-7.5,239.034820806557,-229.999572361928,-11.6, 5615P 10642 +238.284144385139,-230.433447074621,-7.5,238.284144385139, 5615P 10643 +-230.433447074621,-11.6,237.533467963721,-229.999572361928,-7.5, 5615P 10644 +237.533467963721,-229.999572361928,-11.6,236.782791542303, 5615P 10645 +-229.565697649234,-7.5,236.782791542303,-229.565697649234,-11.6, 5615P 10646 +236.784016479572,-228.698656211056,-7.5,236.784016479572, 5615P 10647 +-228.698656211056,-11.6,10.7132954794019,13.6415962437718, 5615P 10648 +3.13866619559783,6.2830844037677; 5615P 10649 +128,1,6,1,2,0,0,0,0,0,10.7132996449142,10.7132996449142, 5617P 10650 +13.6416015478574,13.6416015478574,3.13925814733116, 5617P 10651 +3.13925814733116,3.13925814733116,4.18720703624771, 5617P 10652 +4.18720703624771,5.23515592516426,5.23515592516426, 5617P 10653 +6.28310481408081,6.28310481408081,6.28310481408081,1.,1., 5617P 10654 +0.865837508249046,0.865837508249046,1.,1.,0.865837508249046, 5617P 10655 +0.865837508249046,1.,1.,0.865837508249046,0.865837508249046,1., 5617P 10656 +1.,160.582628341595,-190.598023114212,-7.5,160.582628341595, 5617P 10657 +-190.598023114212,-11.6,160.581651394605,-189.731172299282,-7.5, 5617P 10658 +160.581651394605,-189.731172299282,-11.6,161.332203820879, 5617P 10659 +-189.297464626786,-7.5,161.332203820879,-189.297464626786,-11.6, 5617P 10660 +162.082756247154,-188.863756954289,-7.5,162.082756247154, 5617P 10661 +-188.863756954289,-11.6,162.833308673433,-189.297464626778,-7.5, 5617P 10662 +162.833308673433,-189.297464626778,-11.6,163.583861099712, 5617P 10663 +-189.731172299267,-7.5,163.583861099712,-189.731172299267,-11.6, 5617P 10664 +163.58288415273,-190.598023114196,-7.5,163.58288415273, 5617P 10665 +-190.598023114196,-11.6,10.7132996449142,13.6416015478574, 5617P 10666 +3.13925814733116,6.28310481408081; 5617P 10667 +128,1,6,1,2,0,0,0,0,0,10.7132996449144,10.7132996449144, 5619P 10668 +13.6416015478576,13.6416015478576,3.13925814734168, 5619P 10669 +3.13925814734168,3.13925814734168,4.18720703625123, 5619P 10670 +4.18720703625123,5.23515592516079,5.23515592516079, 5619P 10671 +6.28310481407034,6.28310481407034,6.28310481407034,1.,1., 5619P 10672 +0.865837508250795,0.865837508250795,1.,1.,0.865837508250795, 5619P 10673 +0.865837508250795,1.,1.,0.865837508250795,0.865837508250795,1., 5619P 10674 +1.,163.58288415273,-190.598023114196,-7.5,163.58288415273, 5619P 10675 +-190.598023114196,-11.6,163.583861099711,-191.464873929118,-7.5, 5619P 10676 +163.583861099711,-191.464873929118,-11.6,162.833308673442, 5619P 10677 +-191.898581601608,-7.5,162.833308673442,-191.898581601608,-11.6, 5619P 10678 +162.082756247172,-192.332289274099,-7.5,162.082756247172, 5619P 10679 +-192.332289274099,-11.6,161.332203820897,-191.898581601616,-7.5, 5619P 10680 +161.332203820897,-191.898581601616,-11.6,160.581651394623, 5619P 10681 +-191.464873929134,-7.5,160.581651394623,-191.464873929134,-11.6, 5619P 10682 +160.582628341595,-190.598023114211,-7.5,160.582628341595, 5619P 10683 +-190.598023114211,-11.6,10.7132996449144,13.6416015478576, 5619P 10684 +3.13925814734168,6.28310481407034; 5619P 10685 +128,1,6,1,2,0,0,0,0,0,10.7132996449141,10.7132996449141, 5621P 10686 +13.6416015478573,13.6416015478573,3.13925814731996, 5621P 10687 +3.13925814731996,3.13925814731996,4.1872070362402, 5621P 10688 +4.1872070362402,5.23515592516045,5.23515592516045, 5621P 10689 +6.28310481408069,6.28310481408069,6.28310481408069,1.,1., 5621P 10690 +0.865837508248121,0.865837508248121,1.,1.,0.865837508248121, 5621P 10691 +0.865837508248121,1.,1.,0.865837508248121,0.865837508248121,1., 5621P 10692 +1.,239.357084097385,-172.121201750453,-7.5,239.357084097385, 5621P 10693 +-172.121201750453,-11.6,239.35610715039,-171.25435093552,-7.5, 5621P 10694 +239.35610715039,-171.25435093552,-11.6,240.106659576667, 5621P 10695 +-170.82064326302,-7.5,240.106659576667,-170.82064326302,-11.6, 5621P 10696 +240.857212002944,-170.38693559052,-7.5,240.857212002944, 5621P 10697 +-170.38693559052,-11.6,241.607764429225,-170.820643263012,-7.5, 5621P 10698 +241.607764429225,-170.820643263012,-11.6,242.358316855506, 5621P 10699 +-171.254350935504,-7.5,242.358316855506,-171.254350935504,-11.6, 5621P 10700 +242.35733990852,-172.121201750437,-7.5,242.35733990852, 5621P 10701 +-172.121201750437,-11.6,10.7132996449141,13.6416015478573, 5621P 10702 +3.13925814731996,6.28310481408069; 5621P 10703 +128,1,6,1,2,0,0,0,0,0,10.7132996449144,10.7132996449144, 5623P 10704 +13.6416015478577,13.6416015478577,3.13925814735297, 5623P 10705 +3.13925814735297,3.13925814735297,4.1872070362588, 5623P 10706 +4.1872070362588,5.23515592516463,5.23515592516463, 5623P 10707 +6.28310481407046,6.28310481407046,6.28310481407046,1.,1., 5623P 10708 +0.865837508251727,0.865837508251727,1.,1.,0.865837508251727, 5623P 10709 +0.865837508251727,1.,1.,0.865837508251727,0.865837508251727,1., 5623P 10710 +1.,242.35733990852,-172.121201750437,-7.5,242.35733990852, 5623P 10711 +-172.121201750437,-11.6,242.358316855497,-172.988052565356,-7.5, 5623P 10712 +242.358316855497,-172.988052565356,-11.6,241.607764429229, 5623P 10713 +-173.421760237843,-7.5,241.607764429229,-173.421760237843,-11.6, 5623P 10714 +240.857212002962,-173.85546791033,-7.5,240.857212002962, 5623P 10715 +-173.85546791033,-11.6,240.10665957669,-173.421760237851,-7.5, 5623P 10716 +240.10665957669,-173.421760237851,-11.6,239.356107150418, 5623P 10717 +-172.988052565371,-7.5,239.356107150418,-172.988052565371,-11.6, 5623P 10718 +239.357084097385,-172.121201750453,-7.5,239.357084097385, 5623P 10719 +-172.121201750453,-11.6,10.7132996449144,13.6416015478577, 5623P 10720 +3.13925814735297,6.28310481407046; 5623P 10721 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000002,-0.00100000000000002, 5625P 10722 +1.70379824993602,1.70379824993602,0.899,0.899,1.311,1.311,1.,1., 5625P 10723 +1.,1.,220.742682252201,-164.547507575232,-7.49,237.790664751561, 5625P 10724 +-164.547507575232,-7.49,220.742682252201,-164.547507575232, 5625P 10725 +-11.61,237.790664751561,-164.547507575232,-11.61, 5625P 10726 +-0.00100000000000002,1.70379824993602,0.899,1.311; 5625P 10727 +128,1,1,1,1,0,0,1,0,0,-0.601,-0.601,1.111,1.111,-0.001,-0.001, 5627P 10728 +0.800999999999997,0.800999999999997,1.,1.,1.,1., 5627P 10729 +237.780664751561,-164.557507575232,-11.61,237.780664751561, 5627P 10730 +-164.557507575232,5.51,237.780664751561,-156.537507575232, 5627P 10731 +-11.61,237.780664751561,-156.537507575232,5.51,-0.601,1.111, 5627P 10732 +-0.001,0.800999999999997; 5627P 10733 +128,1,1,1,1,0,0,1,0,0,-1.25194932661626,-1.25194932661626, 5629P 10734 +1.08598817338374,1.08598817338374,-1.90191976533037, 5629P 10735 +-1.90191976533037,-0.439172788111116,-0.439172788111116,1.,1., 5629P 10736 +1.,1.,212.701945909196,-187.629164077365,-7.5,189.322570909196, 5629P 10737 +-187.629164077365,-7.5,212.701945909196,-202.256633849558,-7.5, 5629P 10738 +189.322570909196,-202.256633849558,-7.5,-1.25194932661626, 5629P 10739 +1.08598817338374,-1.90191976533037,-0.439172788111116; 5629P 10740 +128,1,1,1,1,0,0,1,0,0,1.199,1.199,2.60379824993602, 5631P 10741 +2.60379824993602,0.899,0.899,1.311,1.311,1.,1.,1.,1., 5631P 10742 +155.574237511039,-164.547507575232,-7.49,169.622220010399, 5631P 10743 +-164.547507575232,-7.49,155.574237511039,-164.547507575232, 5631P 10744 +-11.61,169.622220010399,-164.547507575232,-11.61,1.199, 5631P 10745 +2.60379824993602,0.899,1.311; 5631P 10746 +128,1,1,1,1,0,0,1,0,0,-0.601,-0.601,1.111,1.111,-0.001,-0.001, 5633P 10747 +0.801000000000001,0.801000000000001,1.,1.,1.,1., 5633P 10748 +169.612220010399,-164.557507575232,-11.61,169.612220010399, 5633P 10749 +-164.557507575232,5.51,169.612220010399,-156.537507575232, 5633P 10750 +-11.61,169.612220010399,-156.537507575232,5.51,-0.601,1.111, 5633P 10751 +-0.001,0.801000000000001; 5633P 10752 +128,1,1,1,1,0,0,1,0,0,-0.703634674364426,-0.703634674364426, 5635P 10753 +0.701163575571597,0.701163575571597,-0.00100000000000378, 5635P 10754 +-0.00100000000000378,0.651,0.651,1.,1.,1.,1.,169.622220010399, 5635P 10755 +-163.057507575232,1.5,155.574237511039,-163.057507575232,1.5, 5635P 10756 +169.622220010399,-156.537507575232,1.5,155.574237511039, 5635P 10757 +-156.537507575232,1.5,-0.703634674364426,0.701163575571597, 5635P 10758 +-0.00100000000000378,0.651; 5635P 10759 +128,1,1,1,1,0,0,1,0,0,0.198380431581659,0.198380431581659, 5637P 10760 +1.90317868151768,1.90317868151768,-0.001,-0.001,0.651,0.651,1., 5637P 10761 +1.,1.,1.,237.790664751561,-163.057507575232,1.5, 5637P 10762 +220.742682252201,-163.057507575232,1.5,237.790664751561, 5637P 10763 +-156.537507575232,1.5,220.742682252201,-156.537507575232,1.5, 5637P 10764 +0.198380431581659,1.90317868151768,-0.001,0.651; 5637P 10765 +128,1,1,1,1,0,0,1,0,0,2.5001090632896,2.5001090632896, 5639P 10766 +4.90089123368072,4.90089123368072,0.199,0.199,1.501,1.501,1.,1., 5639P 10767 +1.,1.,193.610041714311,-164.547507575232,5.51,169.602220010399, 5639P 10768 +-164.547507575232,5.51,193.610041714311,-164.547507575232,-7.51, 5639P 10769 +169.602220010399,-164.547507575232,-7.51,2.5001090632896, 5639P 10770 +4.90089123368072,0.199,1.501; 5639P 10771 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.700999999999999, 5641P 10772 +0.700999999999999,-0.001,-0.001,1.301,1.301,1.,1.,1.,1., 5641P 10773 +213.600041714311,-171.557507575232,-7.51,213.600041714311, 5641P 10774 +-164.537507575232,-7.51,213.600041714311,-171.557507575232,5.51, 5641P 10775 +213.600041714311,-164.537507575232,5.51,-0.001, 5641P 10776 +0.700999999999999,-0.001,1.301; 5641P 10777 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000355,-0.00100000000000355, 5643P 10778 +2.001,2.001,-0.001,-0.001,1.301,1.301,1.,1.,1.,1., 5643P 10779 +193.590041714311,-171.547507575231,-7.51,213.610041714311, 5643P 10780 +-171.547507575232,-7.51,193.590041714311,-171.547507575231,5.51, 5643P 10781 +213.610041714311,-171.547507575232,5.51,-0.00100000000000355, 5643P 10782 +2.001,-0.001,1.301; 5643P 10783 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,0.700999999999999, 5645P 10784 +0.700999999999999,-0.001,-0.001,1.301,1.301,1.,1.,1.,1., 5645P 10785 +193.600041714311,-164.537507575232,-7.51,193.600041714311, 5645P 10786 +-171.557507575232,-7.51,193.600041714311,-164.537507575232,5.51, 5645P 10787 +193.600041714311,-171.557507575232,5.51,-0.001, 5645P 10788 +0.700999999999999,-0.001,1.301; 5645P 10789 +128,1,1,1,1,0,0,1,0,0,0.228270425474422,0.228270425474422, 5647P 10790 +7.99146896389396,7.99146896389396,0.199,0.199,1.501,1.501,1.,1., 5647P 10791 +1.,1.,256.765898784406,-245.464354455991,5.51,256.765901358077, 5647P 10792 +-167.832369071796,5.51,256.765898784406,-245.464354455991,-7.51, 5647P 10793 +256.765901358077,-167.832369071796,-7.51,0.228270425474422, 5647P 10794 +7.99146896389396,0.199,1.501; 5647P 10795 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,1.96387870990168, 5649P 10796 +1.96387870990168,0.199,0.199,1.501,1.501,1.,1.,1.,1., 5649P 10797 +143.600041714311,-167.832837467805,5.51,143.600041714311, 5649P 10798 +-187.481624566822,5.51,143.600041714311,-167.832837467805,-7.51, 5649P 10799 +143.600041714311,-187.481624566822,-7.51,-0.001, 5649P 10800 +1.96387870990168,0.199,1.501; 5649P 10801 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,2.20051956797476, 5651P 10802 +2.20051956797476,-0.001,-0.001,1.501,1.501,1.,1.,1.,1., 5651P 10803 +142.100041714311,-165.466420277504,7.51,142.100041714311, 5651P 10804 +-187.481615957251,7.51,142.100041714311,-165.466420277504,-7.51, 5651P 10805 +142.100041714311,-187.481615957251,-7.51,-0.001, 5651P 10806 +2.20051956797476,-0.001,1.501; 5651P 10807 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000355,-0.00100000000000355, 5653P 10808 +6.02853968539494,6.02853968539494,-0.001,-0.001,0.201,0.201,1., 5653P 10809 +1.,1.,1.,142.100041886497,-187.461615957253,7.51, 5653P 10810 +142.099003680496,-247.757012802264,7.51,142.100041886497, 5653P 10811 +-187.461615957253,5.49,142.099003680496,-247.757012802264,5.49, 5653P 10812 +-0.00100000000000355,6.02853968539494,-0.001,0.201; 5653P 10813 +128,1,6,1,2,0,0,0,0,0,0.,0.,5.99482047510948,5.99482047510948, 5655P 10814 +-2.72952782394451,-2.72952782394451,-2.72952782394451, 5655P 10815 +-1.43344712313306,-1.43344712313306,-0.137366422321605, 5655P 10816 +-0.137366422321605,1.15871427848985,1.15871427848985, 5655P 10817 +1.15871427848985,1.,1.,0.797268222513888,0.797268222513888,1., 5655P 10818 +1.,0.797268222513888,0.797268222513888,1.,1.,0.797268222513888, 5655P 10819 +0.797268222513888,1.,1.,146.893865315652,-248.749215886107,7.5, 5655P 10820 +146.893865315652,-248.749215886107,-7.5,146.13511310057, 5655P 10821 +-250.485058779287,7.5,146.13511310057,-250.485058779287,-7.5, 5655P 10822 +144.2585310156,-250.22564568775,7.5,144.2585310156, 5655P 10823 +-250.22564568775,-7.5,142.381948930629,-249.966232596213,7.5, 5655P 10824 +142.381948930629,-249.966232596213,-7.5,142.122568151359, 5655P 10825 +-248.089646044774,7.5,142.122568151359,-248.089646044774,-7.5, 5655P 10826 +141.863187372088,-246.213059493336,7.5,141.863187372088, 5655P 10827 +-246.213059493336,-7.5,143.599043329707,-245.454337167255,7.5, 5655P 10828 +143.599043329707,-245.454337167255,-7.5,0.,5.99482047510948, 5655P 10829 +-2.72952782394451,1.15871427848985; 5655P 10830 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,11.1172574856417, 5657P 10831 +11.1172574856417,-0.001,-0.001,0.201,0.201,1.,1.,1.,1., 5657P 10832 +144.591163852312,-250.249215886107,7.51,255.773738708729, 5657P 10833 +-250.249215886107,7.51,144.591163852312,-250.249215886107,5.49, 5657P 10834 +255.773738708729,-250.249215886107,5.49,-0.001,11.1172574856417, 5657P 10835 +-0.001,0.201; 5657P 10836 +128,1,6,1,2,0,0,0,0,0,0.,0.,5.99482047510955,5.99482047510955, 5659P 10837 +-2.72951057213252,-2.72951057213252,-2.72951057213252, 5659P 10838 +-1.43343562192506,-1.43343562192506,-0.1373606717176, 5659P 10839 +-0.1373606717176,1.15871427848986,1.15871427848986, 5659P 10840 +1.15871427848986,1.,1.,0.797269958115333,0.797269958115333,1., 5659P 10841 +1.,0.797269958115333,0.797269958115333,1.,1.,0.797269958115333, 5659P 10842 +0.797269958115333,1.,1.,256.765898784737,-245.454354455992,7.5, 5659P 10843 +256.765898784737,-245.454354455992,-7.5,258.501731281752, 5659P 10844 +-246.213102195359,7.5,258.501731281752,-246.213102195359,-7.5, 5659P 10845 +258.242330469318,-248.089674551596,7.5,258.242330469318, 5659P 10846 +-248.089674551596,-7.5,257.982929656885,-249.966246907834,7.5, 5659P 10847 +257.982929656885,-249.966246907834,-7.5,256.106357292048, 5659P 10848 +-250.225647658055,7.5,256.106357292048,-250.225647658055,-7.5, 5659P 10849 +254.22978492721,-250.485048408276,7.5,254.22978492721, 5659P 10850 +-250.485048408276,-7.5,253.47103724539,-248.749215886107,7.5, 5659P 10851 +253.47103724539,-248.749215886107,-7.5,0.,5.99482047510955, 5659P 10852 +-2.72951057213252,1.15871427848986; 5659P 10853 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,8.22073910193271, 5661P 10854 +8.22073910193271,-0.001,-0.001,0.201,0.201,1.,1.,1.,1., 5661P 10855 +258.265898708398,-247.757055886107,7.51,258.265901434085, 5661P 10856 +-165.53966486678,7.51,258.265898708398,-247.757055886107,5.49, 5661P 10857 +258.265901434085,-165.53966486678,5.49,-0.001,8.22073910193271, 5661P 10858 +-0.001,0.201; 5661P 10859 +128,1,6,1,2,0,0,0,0,0,0.,0.,5.99482047511063,5.99482047511063, 5663P 10860 +-2.72950952283909,-2.72950952283909,-2.72950952283909, 5663P 10861 +-1.43343455052993,-1.43343455052993,-0.137359578220763, 5663P 10862 +-0.137359578220763,1.1587153940884,1.1587153940884, 5663P 10863 +1.1587153940884,1.,1.,0.797269951444786,0.797269951444786,1.,1., 5663P 10864 +0.797269951444786,0.797269951444786,1.,1.,0.797269951444786, 5663P 10865 +0.797269951444786,1.,1.,253.471039970417,-164.547507575232,7.5, 5663P 10866 +253.471039970417,-164.547507575232,-7.5,254.22978766966, 5663P 10867 +-162.811675013205,7.5,254.22978766966,-162.811675013205,-7.5, 5663P 10868 +256.106360071855,-163.071075810858,7.5,256.106360071855, 5663P 10869 +-163.071075810858,-7.5,257.98293247405,-163.330476608511,7.5, 5663P 10870 +257.98293247405,-163.330476608511,-7.5,258.242333209489, 5663P 10871 +-165.207049019306,7.5,258.242333209489,-165.207049019306,-7.5, 5663P 10872 +258.501733944928,-167.083621430101,7.5,258.501733944928, 5663P 10873 +-167.083621430101,-7.5,256.765901357746,-167.842369071796,7.5, 5663P 10874 +256.765901357746,-167.842369071796,-7.5,0.,5.99482047511063, 5663P 10875 +-2.72950952283909,1.1587153940884; 5663P 10876 +128,1,4,1,2,0,0,0,0,0,0.,0.,5.99482047510955,5.99482047510955, 5665P 10877 +-1.54151851752146,-1.54151851752146,-1.54151851752146, 5665P 10878 +-0.191402119515813,-0.191402119515813,1.15871427848983, 5665P 10879 +1.15871427848983,1.15871427848983,1.,1.,0.780670581409592, 5665P 10880 +0.780670581409592,1.,1.,0.780670581409592,0.780670581409592,1., 5665P 10881 +1.,142.100041714311,-165.476420277504,7.5,142.100041714311, 5665P 10882 +-165.476420277504,-7.5,142.158677672821,-163.474248497833,7.5, 5665P 10883 +142.158677672821,-163.474248497833,-7.5,144.125129478152, 5665P 10884 +-163.093200852189,7.5,144.125129478152,-163.093200852189,-7.5, 5665P 10885 +146.091581283483,-162.712153206546,7.5,146.091581283483, 5665P 10886 +-162.712153206546,-7.5,146.893830840843,-164.547507575232,7.5, 5665P 10887 +146.893830840843,-164.547507575232,-7.5,0.,5.99482047510955, 5665P 10888 +-1.54151851752146,1.15871427848983; 5665P 10889 +128,1,1,1,1,0,0,1,0,0,-6.45934487907209,-6.45934487907209, 5667P 10890 +6.45935129953954,6.45935129953954,-5.01108541554375, 5667P 10891 +-5.01108541554375,5.01108541554375,5.01108541554375,1.,1.,1.,1., 5667P 10892 +264.775901433754,-156.537507575232,7.5,135.588939647638, 5667P 10893 +-156.537507575232,7.5,264.775901433754,-256.759215886107,7.5, 5667P 10894 +135.588939647638,-256.759215886107,7.5,-6.45934487907209, 5667P 10895 +6.45935129953954,-5.01108541554375,5.01108541554375; 5667P 10896 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,2.20708325126057, 5669P 10897 +2.20708325126057,-0.001,-0.001,1.911,1.911,1.,1.,1.,1., 5669P 10898 +135.600041714311,-187.481555692063,7.51,135.600041714311, 5669P 10899 +-165.400723179457,7.51,135.600041714311,-187.481555692063, 5669P 10900 +-11.61,135.600041714311,-165.400723179457,-11.61,-0.001, 5669P 10901 +2.20708325126057,-0.001,1.911; 5669P 10902 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,6.02853451978495, 5671P 10903 +6.02853451978495,-0.001,-0.001,1.911,1.911,1.,1.,1.,1., 5671P 10904 +135.59900368146,-247.756900880975,7.51,135.600041886497, 5671P 10905 +-187.461555692064,7.51,135.59900368146,-247.756900880975,-11.61, 5671P 10906 +135.600041886497,-187.461555692064,-11.61,-0.001, 5671P 10907 +6.02853451978495,-0.001,1.911; 5671P 10908 +128,1,4,1,2,0,0,0,0,0,0.,0.,2.12171301109956,2.12171301109956, 5673P 10909 +-1.57081354545471,-1.57081354545471,-1.57081354545471, 5673P 10910 +-0.785406772727353,-0.785406772727353,7.52737518332756D-21, 5673P 10911 +7.52737518332756D-21,7.52737518332756D-21,1.,1., 5673P 10912 +0.923877885178768,0.923877885178768,1.,1.,0.923877885178768, 5673P 10913 +0.923877885178768,1.,1.,144.601163852312,-256.749215886107, 5673P 10914 +-11.6,144.601163852312,-256.749215886107,7.5,140.872301689627, 5673P 10915 +-256.749215886107,-11.6,140.872301689627,-256.749215886107,7.5, 5673P 10916 +138.235620668632,-254.112489464608,-11.6,138.235620668632, 5673P 10917 +-254.112489464608,7.5,135.598939647638,-251.475763043109,-11.6, 5673P 10918 +135.598939647638,-251.475763043109,7.5,135.599003853647, 5673P 10919 +-247.746900880977,-11.6,135.599003853647,-247.746900880977,7.5, 5673P 10920 +0.,2.12171301109956,-1.57081354545471,7.52737518332756D-21; 5673P 10921 +128,1,1,1,1,0,0,1,0,0,-0.001,-0.001,11.1172574856417, 5675P 10922 +11.1172574856417,-0.001,-0.001,1.911,1.911,1.,1.,1.,1., 5675P 10923 +255.773738708729,-256.749215886107,7.51,144.591163852312, 5675P 10924 +-256.749215886107,7.51,255.773738708729,-256.749215886107, 5675P 10925 +-11.61,144.591163852312,-256.749215886107,-11.61,-0.001, 5675P 10926 +11.1172574856417,-0.001,1.911; 5675P 10927 +128,1,2,1,2,0,0,0,0,0,0.,0.,2.12171301109957,2.12171301109957, 5677P 10928 +-1.57079632679491,-1.57079632679491,-1.57079632679491, 5677P 10929 +1.97325624005823D-15,1.97325624005823D-15,1.97325624005823D-15, 5677P 10930 +1.,1.,0.707106781186542,0.707106781186542,1.,1., 5677P 10931 +264.765898708729,-247.747055886107,-11.6,264.765898708729, 5677P 10932 +-247.747055886107,7.5,264.765898708729,-256.749215886107,-11.6, 5677P 10933 +264.765898708729,-256.749215886107,7.5,255.763738708729, 5677P 10934 +-256.749215886107,-11.6,255.763738708729,-256.749215886107,7.5, 5677P 10935 +0.,2.12171301109957,-1.57079632679491,1.97325624005823D-15; 5677P 10936 +128,1,1,1,1,0,0,1,0,0,-0.00100000000000355,-0.00100000000000355, 5679P 10937 +8.22073908038377,8.22073908038377,-0.001,-0.001,1.911,1.911,1., 5679P 10938 +1.,1.,1.,264.765901434085,-165.53966508227,7.51, 5679P 10939 +264.765898708398,-247.757055886107,7.51,264.765901434085, 5679P 10940 +-165.53966508227,-11.61,264.765898708398,-247.757055886107, 5679P 10941 +-11.61,-0.00100000000000355,8.22073908038377,-0.001,1.911; 5679P 10942 +128,1,2,1,2,0,0,0,0,0,0.,0.,2.12171301109993,2.12171301109993, 5681P 10943 +-1.57079604986551,-1.57079604986551,-1.57079604986551, 5681P 10944 +4.70460948958054D-22,4.70460948958054D-22,4.70460948958054D-22, 5681P 10945 +1.,1.,0.707106879095864,0.707106879095864,1.,1., 5681P 10946 +255.763741433756,-156.547507575234,-11.6,255.763741433756, 5681P 10947 +-156.547507575234,7.5,264.765898940792,-156.547507575234,-11.6, 5681P 10948 +264.765898940792,-156.547507575234,7.5,264.765901433754, 5681P 10949 +-165.54966508227,-11.6,264.765901433754,-165.54966508227,7.5,0., 5681P 10950 +2.12171301109993,-1.57079604986551,4.70460948958054D-22; 5681P 10951 +128,1,2,1,2,0,0,0,0,0,0.,0.,2.12171301109957,2.12171301109957, 5683P 10952 +-1.55536115200856,-1.55536115200856,-1.55536115200856, 5683P 10953 +2.95988436008734D-15,2.95988436008734D-15,2.95988436008734D-15, 5683P 10954 +1.,1.,0.712542827450537,0.712542827450537,1.,1., 5683P 10955 +135.600041714311,-165.410723179457,-11.6,135.600041714311, 5683P 10956 +-165.410723179457,7.5,135.73685786174,-156.547507575232,-11.6, 5683P 10957 +135.73685786174,-156.547507575232,7.5,144.601129377503, 5683P 10958 +-156.547507575232,-11.6,144.601129377503,-156.547507575232,7.5, 5683P 10959 +0.,2.12171301109957,-1.55536115200856,2.95988436008734D-15; 5683P 10960 +502,610,139.68226259674,-80.5980231141957,8.73624999999999, 5685P 10961 +136.882006921691,-80.5980231141957,8.73624999999999, 5685P 10962 +136.882006921691,-80.5980231141957,7.11812499999999, 5685P 10963 +139.68226259674,-80.5980231141957,7.11812499999999, 5685P 10964 +139.68226259674,-118.69865621105,8.73624999999999, 5685P 10965 +136.882006921691,-118.69865621105,8.73624999999999, 5685P 10966 +136.882006921691,-118.69865621105,7.11812499999999, 5685P 10967 +139.68226259674,-118.69865621105,7.11812499999999, 5685P 10968 +63.4808744198821,-118.698656211056,8.73625,60.6806188225967, 5685P 10969 +-118.698656211056,8.73625,60.6806188225967,-118.698656211056, 5685P 10970 +7.118125,63.4808744198821,-118.698656211056,7.118125, 5685P 10971 +60.9078068409501,-62.1212017504367,8.73625,58.1075511659012, 5685P 10972 +-62.1212017504367,8.73625,58.1075511659012,-62.1212017504367, 5685P 10973 +7.118125,60.9078068409501,-62.1212017504367,7.118125, 5685P 10974 +140.806868895161,-121.223895544679,8.73624999999999, 5685P 10975 +154.808074294198,-121.223878124069,8.73624999999999, 5685P 10976 +140.806868895161,-121.223895544679,7.11812499999999, 5685P 10977 +154.808074294198,-121.223878124069,7.11812499999999, 5685P 10978 +154.808074294198,-121.821979920061,8.73624999999999, 5685P 10979 +154.808074294198,-121.821979920061,7.11812499999999, 5685P 10980 +155.607349292068,-121.82199734067,8.73624999999999, 5685P 10981 +155.607349292068,-121.82199734067,7.11812499999999, 5685P 10982 +155.607349292068,-134.624194429548,8.73624999999999, 5685P 10983 +155.607349292068,-134.624194429548,7.11812499999999, 5685P 10984 +154.808074294198,-134.624177008938,8.73624999999999, 5685P 10985 +154.808074294198,-134.624177008938,7.11812499999999, 5685P 10986 +154.808074294198,-135.223655033103,8.73624999999999, 5685P 10987 +154.808074294198,-135.223655033103,7.11812499999999, 5685P 10988 +140.806873250314,-135.223655033103,8.73624999999999, 5685P 10989 +140.806873250314,-135.223655033103,7.11812499999999, 5685P 10990 +140.806868895161,-134.624177008938,8.73624999999999, 5685P 10991 +140.806868895161,-134.624177008938,7.11812499999999, 5685P 10992 +140.007650514273,-134.624177008938,8.73624999999999, 5685P 10993 +140.007650514273,-134.624177008938,7.11812499999999, 5685P 10994 +140.007654869426,-121.821979920061,8.73624999999999, 5685P 10995 +140.007654869426,-121.821979920061,7.11812499999999, 5685P 10996 +140.806873250314,-121.82199734067,8.73624999999999, 5685P 10997 +140.806873250314,-121.82199734067,7.11812499999999, 5685P 10998 +121.756696066765,-121.223895544679,8.73624999999999, 5685P 10999 +135.757670642722,-121.223878124069,8.73624999999999, 5685P 11000 +121.756696066765,-121.223895544679,7.118125,135.757670642722, 5685P 11001 +-121.223878124069,7.11812499999999,135.757670642722, 5685P 11002 +-121.821979920061,8.73624999999999,135.757670642722, 5685P 11003 +-121.821979920061,7.11812499999999,136.556989192117, 5685P 11004 +-121.82199734067,8.73624999999999,136.556989192117, 5685P 11005 +-121.82199734067,7.11812499999999,136.556989192117, 5685P 11006 +-134.624194429548,8.73624999999999,136.556989192117, 5685P 11007 +-134.624194429548,7.11812499999999,135.757670642722, 5685P 11008 +-134.624177008938,8.73624999999999,135.757670642722, 5685P 11009 +-134.624177008938,7.11812499999999,135.757670642722, 5685P 11010 +-135.223655033103,8.73624999999999,135.757670642722, 5685P 11011 +-135.223655033103,7.11812499999999,121.756696066765, 5685P 11012 +-135.223655033103,8.73624999999999,121.756696066765, 5685P 11013 +-135.223655033103,7.118125,121.756696066765,-134.624177008938, 5685P 11014 +8.73624999999999,121.756696066765,-134.624177008938,7.118125, 5685P 11015 +120.957281704017,-134.624177008938,8.73624999999999, 5685P 11016 +120.957281704017,-134.624177008938,7.118125,120.957281704017, 5685P 11017 +-121.821979920061,8.73624999999999,120.957281704017, 5685P 11018 +-121.821979920061,7.118125,121.756696066765,-121.82199734067, 5685P 11019 +8.73624999999999,121.756696066765,-121.82199734067,7.118125, 5685P 11020 +102.706327256509,-121.223895544679,8.73624999999999, 5685P 11021 +116.707297477313,-121.223878124069,8.73624999999999, 5685P 11022 +102.706327256509,-121.223895544679,7.118125,116.707297477313, 5685P 11023 +-121.223878124069,7.118125,116.707297477313,-121.821979920061, 5685P 11024 +8.73624999999999,116.707297477313,-121.821979920061,7.118125, 5685P 11025 +117.506711840062,-121.82199734067,8.73624999999999, 5685P 11026 +117.506711840062,-121.82199734067,7.118125,117.506720550367, 5685P 11027 +-134.624194429548,8.73624999999999,117.506720550367, 5685P 11028 +-134.624194429548,7.118125,116.707306187618,-134.624177008938, 5685P 11029 +8.73624999999999,116.707306187618,-134.624177008938,7.118125, 5685P 11030 +116.707297477313,-135.223655033103,8.73624999999999, 5685P 11031 +116.707297477313,-135.223655033103,7.118125,102.706327256509, 5685P 11032 +-135.223655033103,8.73624999999999,102.706327256509, 5685P 11033 +-135.223655033103,7.118125,102.706327256509,-134.624177008938, 5685P 11034 +8.73624999999999,102.706327256509,-134.624177008938,7.118125, 5685P 11035 +101.90691289376,-134.624177008938,8.73624999999999, 5685P 11036 +101.90691289376,-134.624177008938,7.118125,101.90691289376, 5685P 11037 +-121.821979920061,8.73624999999999,101.90691289376, 5685P 11038 +-121.821979920061,7.118125,102.706327256509,-121.82199734067, 5685P 11039 +8.73624999999999,102.706327256509,-121.82199734067,7.118125, 5685P 11040 +83.6559584462526,-121.223895544679,8.73625,97.6569286670568, 5685P 11041 +-121.223878124069,8.73624999999999,83.6559584462526, 5685P 11042 +-121.223895544679,7.118125,97.6569286670568,-121.223878124069, 5685P 11043 +7.118125,97.6569286670568,-121.821979920061,8.73624999999999, 5685P 11044 +97.6569286670568,-121.821979920061,7.118125,98.4563430298053, 5685P 11045 +-121.82199734067,8.73624999999999,98.4563430298053, 5685P 11046 +-121.82199734067,7.118125,98.4563430298053,-134.624194429548, 5685P 11047 +8.73624999999999,98.4563430298053,-134.624194429548,7.118125, 5685P 11048 +97.6569286670568,-134.624177008938,8.73624999999999, 5685P 11049 +97.6569286670568,-134.624177008938,7.118125,97.6569286670568, 5685P 11050 +-135.223655033103,8.73624999999999,97.6569286670568, 5685P 11051 +-135.223655033103,7.118125,83.6559497359477,-135.223655033103, 5685P 11052 +8.73625,83.6559497359477,-135.223655033103,7.118125, 5685P 11053 +83.6559584462526,-134.624177008938,8.73625,83.6559584462526, 5685P 11054 +-134.624177008938,7.118125,82.8565440835042,-134.624177008938, 5685P 11055 +8.73625,82.8565440835042,-134.624177008938,7.118125, 5685P 11056 +82.8565440835042,-121.821979920061,8.73625,82.8565440835042, 5685P 11057 +-121.821979920061,7.118125,83.6559584462526,-121.82199734067, 5685P 11058 +8.73625,83.6559584462526,-121.82199734067,7.118125, 5685P 11059 +64.6055896359963,-121.223895544679,8.73625,78.6065598568005, 5685P 11060 +-121.223878124069,8.73625,64.6055896359963,-121.223895544679, 5685P 11061 +7.118125,78.6065598568005,-121.223878124069,7.118125, 5685P 11062 +78.6065598568005,-121.821979920061,8.73625,78.6065598568005, 5685P 11063 +-121.821979920061,7.118125,79.4059742195489,-121.82199734067, 5685P 11064 +8.73625,79.4059742195489,-121.82199734067,7.118125, 5685P 11065 +79.4059742195489,-134.624194429548,8.73625,79.4059742195489, 5685P 11066 +-134.624194429548,7.118125,78.6065598568005,-134.624177008938, 5685P 11067 +8.73625,78.6065598568005,-134.624177008938,7.118125, 5685P 11068 +78.6065598568005,-135.223655033103,8.73625,78.6065598568005, 5685P 11069 +-135.223655033103,7.118125,64.6055896359963,-135.223655033103, 5685P 11070 +8.73625,64.6055896359963,-135.223655033103,7.118125, 5685P 11071 +64.6055896359963,-134.624177008938,8.73625,64.6055896359963, 5685P 11072 +-134.624177008938,7.118125,63.8061752732478,-134.624177008938, 5685P 11073 +8.73625,63.8061752732478,-134.624177008938,7.118125, 5685P 11074 +63.8061752732478,-121.821979920061,8.73625,63.8061752732478, 5685P 11075 +-121.821979920061,7.118125,64.6055896359963,-121.82199734067, 5685P 11076 +8.73625,64.6055896359963,-121.82199734067,7.118125, 5685P 11077 +45.556222510803,-121.223895544679,8.73625,59.5561910465442, 5685P 11078 +-121.223878124069,8.73625,45.556222510803,-121.223895544679, 5685P 11079 +7.118125,59.5561910465442,-121.223878124069,7.118125, 5685P 11080 +59.5561910465442,-121.821979920061,8.73625,59.5561910465442, 5685P 11081 +-121.821979920061,7.118125,60.3556054092926,-121.82199734067, 5685P 11082 +8.73625,60.3556054092926,-121.82199734067,7.118125, 5685P 11083 +60.3556054092926,-134.624194429548,8.73625,60.3556054092926, 5685P 11084 +-134.624194429548,7.118125,59.5561910465442,-134.624177008938, 5685P 11085 +8.73625,59.5561910465442,-134.624177008938,7.118125, 5685P 11086 +59.5561910465442,-135.223655033103,8.73625,59.5561910465442, 5685P 11087 +-135.223655033103,7.118125,45.556222510803,-135.223655033103, 5685P 11088 +8.73625,45.556222510803,-135.223655033103,7.118125, 5685P 11089 +45.556222510803,-134.624177008938,8.73625,45.556222510803, 5685P 11090 +-134.624177008938,7.118125,44.7561984267118,-134.624177008938, 5685P 11091 +8.73625,44.7561984267118,-134.624177008938,7.118125, 5685P 11092 +44.7561984267118,-121.821979920061,8.73625,44.7561984267118, 5685P 11093 +-121.821979920061,7.118125,45.556222510803,-121.82199734067, 5685P 11094 +8.73625,45.556222510803,-121.82199734067,7.118125, 5685P 11095 +140.806868895161,-102.173622547777,8.73624999999999, 5685P 11096 +154.808074294198,-102.173605127167,8.73624999999999, 5685P 11097 +140.806868895161,-102.173622547777,7.11812499999999, 5685P 11098 +154.808074294198,-102.173605127167,7.11812499999999, 5685P 11099 +154.808074294198,-102.772908945234,8.73624999999999, 5685P 11100 +154.808074294198,-102.772908945234,7.11812499999999, 5685P 11101 +155.607349292068,-102.772926365844,8.73624999999999, 5685P 11102 +155.607349292068,-102.772926365844,7.11812499999999, 5685P 11103 +155.607349292068,-115.573782067767,8.73624999999999, 5685P 11104 +155.607349292068,-115.573782067767,7.11812499999999, 5685P 11105 +154.808074294198,-115.573764647157,8.73624999999999, 5685P 11106 +154.808074294198,-115.573764647157,7.11812499999999, 5685P 11107 +154.808074294198,-116.173277512542,8.73624999999999, 5685P 11108 +154.808074294198,-116.173277512542,7.11812499999999, 5685P 11109 +140.806873250314,-116.173277512542,8.73624999999999, 5685P 11110 +140.806873250314,-116.173277512542,7.11812499999999, 5685P 11111 +140.806868895161,-115.573764647157,8.73624999999999, 5685P 11112 +140.806868895161,-115.573764647157,7.11812499999999, 5685P 11113 +140.007650514273,-115.573764647157,8.73624999999999, 5685P 11114 +140.007650514273,-115.573764647157,7.11812499999999, 5685P 11115 +140.007654869426,-102.772908945234,8.73624999999999, 5685P 11116 +140.007654869426,-102.772908945234,7.11812499999999, 5685P 11117 +140.806873250314,-102.772926365844,8.73624999999999, 5685P 11118 +140.806873250314,-102.772926365844,7.11812499999999, 5685P 11119 +121.756696066765,-102.173622547777,8.73624999999999, 5685P 11120 +135.757670642722,-102.173605127167,8.73624999999999, 5685P 11121 +121.756696066765,-102.173622547777,7.118125,135.757670642722, 5685P 11122 +-102.173605127167,7.11812499999999,135.757670642722, 5685P 11123 +-102.908807122222,8.73624999999999,135.757670642722, 5685P 11124 +-102.908807122222,7.11812499999999,136.556989192117, 5685P 11125 +-102.908807122222,8.73624999999999,136.556989192117, 5685P 11126 +-102.908807122222,7.11812499999999,136.556989192117, 5685P 11127 +-115.709662824145,8.73624999999999,136.556989192117, 5685P 11128 +-115.709662824145,7.11812499999999,135.757670642722, 5685P 11129 +-115.709662824145,8.73624999999999,135.757670642722, 5685P 11130 +-115.709662824145,7.11812499999999,135.757670642722, 5685P 11131 +-116.174810526203,8.73624999999999,135.757670642722, 5685P 11132 +-116.174810526203,7.11812499999999,121.756696066765, 5685P 11133 +-116.174810526203,8.73624999999999,121.756696066765, 5685P 11134 +-116.174810526203,7.118125,121.756696066765,-115.575297660819, 5685P 11135 +8.73624999999999,121.756696066765,-115.575297660819,7.118125, 5685P 11136 +120.957281704017,-115.575297660819,8.73624999999999, 5685P 11137 +120.957281704017,-115.575297660819,7.118125,120.957281704017, 5685P 11138 +-102.772908945234,8.73624999999999,120.957281704017, 5685P 11139 +-102.772908945234,7.118125,121.756696066765,-102.772926365844, 5685P 11140 +8.73624999999999,121.756696066765,-102.772926365844,7.118125, 5685P 11141 +102.706327256509,-102.173622547777,8.73624999999999, 5685P 11142 +116.707297477313,-102.173605127167,8.73624999999999, 5685P 11143 +102.706327256509,-102.173622547777,7.118125,116.707297477313, 5685P 11144 +-102.173605127167,7.118125,116.707297477313,-102.772908945234, 5685P 11145 +8.73624999999999,116.707297477313,-102.772908945234,7.118125, 5685P 11146 +117.506711840062,-102.772926365844,8.73624999999999, 5685P 11147 +117.506711840062,-102.772926365844,7.118125,117.506720550367, 5685P 11148 +-115.573782067767,8.73624999999999,117.506720550367, 5685P 11149 +-115.573782067767,7.118125,116.707306187618,-115.573764647157, 5685P 11150 +8.73624999999999,116.707306187618,-115.573764647157,7.118125, 5685P 11151 +116.707297477313,-116.173277512542,8.73624999999999, 5685P 11152 +116.707297477313,-116.173277512542,7.118125,102.706327256509, 5685P 11153 +-116.173277512542,8.73624999999999,102.706327256509, 5685P 11154 +-116.173277512542,7.118125,102.706327256509,-115.573764647157, 5685P 11155 +8.73624999999999,102.706327256509,-115.573764647157,7.118125, 5685P 11156 +101.90691289376,-115.573764647157,8.73624999999999, 5685P 11157 +101.90691289376,-115.573764647157,7.118125,101.90691289376, 5685P 11158 +-102.772908945234,8.73624999999999,101.90691289376, 5685P 11159 +-102.772908945234,7.118125,102.706327256509,-102.772926365844, 5685P 11160 +8.73624999999999,102.706327256509,-102.772926365844,7.118125, 5685P 11161 +83.6559584462526,-102.173622547777,8.73625,97.6569286670568, 5685P 11162 +-102.173605127167,8.73624999999999,83.6559584462526, 5685P 11163 +-102.173622547777,7.118125,97.6569286670568,-102.173605127167, 5685P 11164 +7.118125,97.6569286670568,-102.772908945234,8.73624999999999, 5685P 11165 +97.6569286670568,-102.772908945234,7.118125,98.4563430298053, 5685P 11166 +-102.772926365844,8.73624999999999,98.4563430298053, 5685P 11167 +-102.772926365844,7.118125,98.4563430298053,-115.573782067767, 5685P 11168 +8.73624999999999,98.4563430298053,-115.573782067767,7.118125, 5685P 11169 +97.6569286670568,-115.573764647157,8.73624999999999, 5685P 11170 +97.6569286670568,-115.573764647157,7.118125,97.6569286670568, 5685P 11171 +-116.173277512542,8.73624999999999,97.6569286670568, 5685P 11172 +-116.173277512542,7.118125,83.6559497359477,-116.173277512542, 5685P 11173 +8.73625,83.6559497359477,-116.173277512542,7.118125, 5685P 11174 +83.6559584462526,-115.573764647157,8.73625,83.6559584462526, 5685P 11175 +-115.573764647157,7.118125,82.8565440835042,-115.573764647157, 5685P 11176 +8.73625,82.8565440835042,-115.573764647157,7.118125, 5685P 11177 +82.8565440835042,-102.772908945234,8.73625,82.8565440835042, 5685P 11178 +-102.772908945234,7.118125,83.6559584462526,-102.772926365844, 5685P 11179 +8.73625,83.6559584462526,-102.772926365844,7.118125, 5685P 11180 +64.6055896359963,-102.173622547777,8.73625,78.6065598568005, 5685P 11181 +-102.173605127167,8.73625,64.6055896359963,-102.173622547777, 5685P 11182 +7.118125,78.6065598568005,-102.173605127167,7.118125, 5685P 11183 +78.6065598568005,-102.772908945234,8.73625,78.6065598568005, 5685P 11184 +-102.772908945234,7.118125,79.4059742195489,-102.772926365844, 5685P 11185 +8.73625,79.4059742195489,-102.772926365844,7.118125, 5685P 11186 +79.4059742195489,-115.573782067767,8.73625,79.4059742195489, 5685P 11187 +-115.573782067767,7.118125,78.6065598568005,-115.573764647157, 5685P 11188 +8.73625,78.6065598568005,-115.573764647157,7.118125, 5685P 11189 +78.6065598568005,-116.173277512542,8.73625,78.6065598568005, 5685P 11190 +-116.173277512542,7.118125,64.6055896359963,-116.173277512542, 5685P 11191 +8.73625,64.6055896359963,-116.173277512542,7.118125, 5685P 11192 +64.6055896359963,-115.573764647157,8.73625,64.6055896359963, 5685P 11193 +-115.573764647157,7.118125,63.8061752732478,-115.573764647157, 5685P 11194 +8.73625,63.8061752732478,-115.573764647157,7.118125, 5685P 11195 +63.8061752732478,-102.772908945234,8.73625,63.8061752732478, 5685P 11196 +-102.772908945234,7.118125,64.6055896359963,-102.772926365844, 5685P 11197 +8.73625,64.6055896359963,-102.772926365844,7.118125, 5685P 11198 +45.556222510803,-102.173622547777,8.73625,59.5561910465442, 5685P 11199 +-102.173605127167,8.73625,45.556222510803,-102.173622547777, 5685P 11200 +7.118125,59.5561910465442,-102.173605127167,7.118125, 5685P 11201 +59.5561910465442,-102.772908945234,8.73625,59.5561910465442, 5685P 11202 +-102.772908945234,7.118125,60.3556054092926,-102.772926365844, 5685P 11203 +8.73625,60.3556054092926,-102.772926365844,7.118125, 5685P 11204 +60.3556054092926,-115.573782067767,8.73625,60.3556054092926, 5685P 11205 +-115.573782067767,7.118125,59.5561910465442,-115.573764647157, 5685P 11206 +8.73625,59.5561910465442,-115.573764647157,7.118125, 5685P 11207 +59.5561910465442,-116.173277512542,8.73625,59.5561910465442, 5685P 11208 +-116.173277512542,7.118125,45.556222510803,-116.173277512542, 5685P 11209 +8.73625,45.556222510803,-116.173277512542,7.118125, 5685P 11210 +45.556222510803,-115.573764647157,8.73625,45.556222510803, 5685P 11211 +-115.573764647157,7.118125,44.7561984267118,-115.573764647157, 5685P 11212 +8.73625,44.7561984267118,-115.573764647157,7.118125, 5685P 11213 +44.7561984267118,-102.772908945234,8.73625,44.7561984267118, 5685P 11214 +-102.772908945234,7.118125,45.556222510803,-102.772926365844, 5685P 11215 +8.73625,45.556222510803,-102.772926365844,7.118125, 5685P 11216 +140.806868895161,-83.1232450272155,8.73624999999999, 5685P 11217 +154.808074294198,-83.1232450272156,8.73624999999999, 5685P 11218 +140.806868895161,-83.1232450272155,7.11812499999999, 5685P 11219 +154.808074294198,-83.1232450272156,7.11812499999999, 5685P 11220 +154.808074294198,-83.7225488452825,8.73624999999999, 5685P 11221 +154.808074294198,-83.7225488452825,7.11812499999999, 5685P 11222 +155.607349292068,-83.7225488452825,8.73624999999999, 5685P 11223 +155.607349292068,-83.7225488452825,7.11812499999999, 5685P 11224 +155.607349292068,-96.5234045472058,8.73624999999999, 5685P 11225 +155.607349292068,-96.5234045472058,7.11812499999999, 5685P 11226 +154.808074294198,-96.5234045472058,8.73624999999999, 5685P 11227 +154.808074294198,-96.5234045472058,7.11812499999999, 5685P 11228 +154.808074294198,-97.1227083652727,8.73624999999999, 5685P 11229 +154.808074294198,-97.1227083652727,7.11812499999999, 5685P 11230 +140.806873250314,-97.1227083652727,8.73624999999999, 5685P 11231 +140.806873250314,-97.1227083652727,7.11812499999999, 5685P 11232 +140.806868895161,-96.5234045472058,8.73624999999999, 5685P 11233 +140.806868895161,-96.5234045472058,7.11812499999999, 5685P 11234 +140.007650514273,-96.5234045472058,8.73624999999999, 5685P 11235 +140.007650514273,-96.5234045472058,7.11812499999999, 5685P 11236 +140.007654869426,-83.7225488452825,8.73624999999999, 5685P 11237 +140.007654869426,-83.7225488452825,7.11812499999999, 5685P 11238 +140.806873250314,-83.7225488452825,8.73624999999999, 5685P 11239 +140.806873250314,-83.7225488452825,7.11812499999999, 5685P 11240 +121.756696066765,-83.1232450272155,8.73624999999999, 5685P 11241 +135.757670642722,-83.1232450272156,8.73624999999999, 5685P 11242 +121.756696066765,-83.1232450272155,7.118125,135.757670642722, 5685P 11243 +-83.1232450272156,7.11812499999999,135.757670642722, 5685P 11244 +-83.7225488452825,8.73624999999999,135.757670642722, 5685P 11245 +-83.7225488452825,7.11812499999999,136.556989192117, 5685P 11246 +-83.7225488452825,8.73624999999999,136.556989192117, 5685P 11247 +-83.7225488452825,7.11812499999999,136.556989192117, 5685P 11248 +-96.5234045472058,8.73624999999999,136.556989192117, 5685P 11249 +-96.5234045472058,7.11812499999999,135.757670642722, 5685P 11250 +-96.5234045472058,8.73624999999999,135.757670642722, 5685P 11251 +-96.5234045472058,7.11812499999999,135.757670642722, 5685P 11252 +-97.1227083652727,8.73624999999999,135.757670642722, 5685P 11253 +-97.1227083652727,7.11812499999999,121.756696066765, 5685P 11254 +-97.1227083652727,8.73624999999999,121.756696066765, 5685P 11255 +-97.1227083652727,7.118125,121.756696066765,-96.5234045472058, 5685P 11256 +8.73624999999999,121.756696066765,-96.5234045472058,7.118125, 5685P 11257 +120.957281704017,-96.5234045472058,8.73624999999999, 5685P 11258 +120.957281704017,-96.5234045472058,7.118125,120.957281704017, 5685P 11259 +-83.7225488452825,8.73624999999999,120.957281704017, 5685P 11260 +-83.7225488452825,7.118125,121.756696066765,-83.7225488452825, 5685P 11261 +8.73624999999999,121.756696066765,-83.7225488452825,7.118125, 5685P 11262 +102.706327256509,-83.1232450272155,8.73624999999999, 5685P 11263 +116.707297477313,-83.1232450272156,8.73624999999999, 5685P 11264 +102.706327256509,-83.1232450272155,7.118125,116.707297477313, 5685P 11265 +-83.1232450272156,7.118125,116.707297477313,-83.7225488452825, 5685P 11266 +8.73624999999999,116.707297477313,-83.7225488452825,7.118125, 5685P 11267 +117.506711840062,-83.7225488452825,8.73624999999999, 5685P 11268 +117.506711840062,-83.7225488452825,7.118125,117.506720550367, 5685P 11269 +-96.5234045472058,8.73624999999999,117.506720550367, 5685P 11270 +-96.5234045472058,7.118125,116.707306187618,-96.5234045472058, 5685P 11271 +8.73624999999999,116.707306187618,-96.5234045472058,7.118125, 5685P 11272 +116.707297477313,-97.1227083652727,8.73624999999999, 5685P 11273 +116.707297477313,-97.1227083652727,7.118125,102.706327256509, 5685P 11274 +-97.1227083652727,8.73624999999999,102.706327256509, 5685P 11275 +-97.1227083652727,7.118125,102.706327256509,-96.5234045472058, 5685P 11276 +8.73624999999999,102.706327256509,-96.5234045472058,7.118125, 5685P 11277 +101.90691289376,-96.5234045472058,8.73624999999999, 5685P 11278 +101.90691289376,-96.5234045472058,7.118125,101.90691289376, 5685P 11279 +-83.7225488452825,8.73624999999999,101.90691289376, 5685P 11280 +-83.7225488452825,7.118125,102.706327256509,-83.7225488452825, 5685P 11281 +8.73624999999999,102.706327256509,-83.7225488452825,7.118125, 5685P 11282 +83.6559584462526,-83.1232450272155,8.73625,97.6569286670568, 5685P 11283 +-83.1232450272156,8.73624999999999,83.6559584462526, 5685P 11284 +-83.1232450272155,7.118125,97.6569286670568,-83.1232450272156, 5685P 11285 +7.118125,97.6569286670568,-83.7225488452825,8.73624999999999, 5685P 11286 +97.6569286670568,-83.7225488452825,7.118125,98.4563430298053, 5685P 11287 +-83.7225488452825,8.73624999999999,98.4563430298053, 5685P 11288 +-83.7225488452825,7.118125,98.4563430298053,-96.5234045472058, 5685P 11289 +8.73624999999999,98.4563430298053,-96.5234045472058,7.118125, 5685P 11290 +97.6569286670568,-96.5234045472058,8.73624999999999, 5685P 11291 +97.6569286670568,-96.5234045472058,7.118125,97.6569286670568, 5685P 11292 +-97.1227083652727,8.73624999999999,97.6569286670568, 5685P 11293 +-97.1227083652727,7.118125,83.6559497359477,-97.1227083652727, 5685P 11294 +8.73625,83.6559497359477,-97.1227083652727,7.118125, 5685P 11295 +83.6559584462526,-96.5234045472058,8.73625,83.6559584462526, 5685P 11296 +-96.5234045472058,7.118125,82.8565440835042,-96.5234045472058, 5685P 11297 +8.73625,82.8565440835042,-96.5234045472058,7.118125, 5685P 11298 +82.8565440835042,-83.7225488452825,8.73625,82.8565440835042, 5685P 11299 +-83.7225488452825,7.118125,83.6559584462526,-83.7225488452825, 5685P 11300 +8.73625,83.6559584462526,-83.7225488452825,7.118125, 5685P 11301 +64.6055896359963,-83.1232450272155,8.73625,78.6065598568005, 5685P 11302 +-83.1232450272156,8.73625,64.6055896359963,-83.1232450272155, 5685P 11303 +7.118125,78.6065598568005,-83.1232450272156,7.118125, 5685P 11304 +78.6065598568005,-83.7225488452825,8.73625,78.6065598568005, 5685P 11305 +-83.7225488452825,7.118125,79.4059742195489,-83.7225488452825, 5685P 11306 +8.73625,79.4059742195489,-83.7225488452825,7.118125, 5685P 11307 +79.4059742195489,-96.5234045472058,8.73625,79.4059742195489, 5685P 11308 +-96.5234045472058,7.118125,78.6065598568005,-96.5234045472058, 5685P 11309 +8.73625,78.6065598568005,-96.5234045472058,7.118125, 5685P 11310 +78.6065598568005,-97.1227083652727,8.73625,78.6065598568005, 5685P 11311 +-97.1227083652727,7.118125,64.6055896359963,-97.1227083652727, 5685P 11312 +8.73625,64.6055896359963,-97.1227083652727,7.118125, 5685P 11313 +64.6055896359963,-96.5234045472058,8.73625,64.6055896359963, 5685P 11314 +-96.5234045472058,7.118125,63.8061752732478,-96.5234045472058, 5685P 11315 +8.73625,63.8061752732478,-96.5234045472058,7.118125, 5685P 11316 +63.8061752732478,-83.7225488452825,8.73625,63.8061752732478, 5685P 11317 +-83.7225488452825,7.118125,64.6055896359963,-83.7225488452825, 5685P 11318 +8.73625,64.6055896359963,-83.7225488452825,7.118125, 5685P 11319 +45.556222510803,-83.1232450272155,8.73625,59.5561910465442, 5685P 11320 +-83.1232450272156,8.73625,45.556222510803,-83.1232450272155, 5685P 11321 +7.118125,59.5561910465442,-83.1232450272156,7.118125, 5685P 11322 +59.5561910465442,-83.7225488452825,8.73625,59.5561910465442, 5685P 11323 +-83.7225488452825,7.118125,60.3556054092926,-83.7225488452825, 5685P 11324 +8.73625,60.3556054092926,-83.7225488452825,7.118125, 5685P 11325 +60.3556054092926,-96.5234045472058,8.73625,60.3556054092926, 5685P 11326 +-96.5234045472058,7.118125,59.5561910465442,-96.5234045472058, 5685P 11327 +8.73625,59.5561910465442,-96.5234045472058,7.118125, 5685P 11328 +59.5561910465442,-97.1227083652727,8.73625,59.5561910465442, 5685P 11329 +-97.1227083652727,7.118125,45.556222510803,-97.1227083652727, 5685P 11330 +8.73625,45.556222510803,-97.1227083652727,7.118125, 5685P 11331 +45.556222510803,-96.5234045472058,8.73625,45.556222510803, 5685P 11332 +-96.5234045472058,7.118125,44.7561984267118,-96.5234045472058, 5685P 11333 +8.73625,44.7561984267118,-96.5234045472058,7.118125, 5685P 11334 +44.7561984267118,-83.7225488452825,8.73625,44.7561984267118, 5685P 11335 +-83.7225488452825,7.118125,45.556222510803,-83.7225488452825, 5685P 11336 +8.73625,45.556222510803,-83.7225488452825,7.118125, 5685P 11337 +140.806868895161,-64.0711428662849,8.73624999999999, 5685P 11338 +154.808074294198,-64.0711428662849,8.73624999999999, 5685P 11339 +140.806868895161,-64.0711428662849,7.11812499999999, 5685P 11340 +154.808074294198,-64.0711428662849,7.11812499999999, 5685P 11341 +154.808074294198,-64.672188745331,8.73624999999999, 5685P 11342 +154.808074294198,-64.672188745331,7.11812499999999, 5685P 11343 +155.607349292068,-64.6721713247213,8.73624999999999, 5685P 11344 +155.607349292068,-64.6721713247213,7.11812499999999, 5685P 11345 +155.607349292068,-77.4716159572515,8.73624999999999, 5685P 11346 +155.607349292068,-77.4716159572515,7.11812499999999, 5685P 11347 +154.808074294198,-77.4716333778613,8.73624999999999, 5685P 11348 +154.808074294198,-77.4716333778613,7.11812499999999, 5685P 11349 +154.808074294198,-78.0723482653214,8.73624999999999, 5685P 11350 +154.808074294198,-78.0723482653214,7.11812499999999, 5685P 11351 +140.806873250314,-78.0723308447116,8.73624999999999, 5685P 11352 +140.806873250314,-78.0723308447116,7.11812499999999, 5685P 11353 +140.806868895161,-77.4716159572515,8.73624999999999, 5685P 11354 +140.806868895161,-77.4716159572515,7.11812499999999, 5685P 11355 +140.007650514273,-77.4716333778613,8.73624999999999, 5685P 11356 +140.007650514273,-77.4716333778613,7.11812499999999, 5685P 11357 +140.007654869426,-64.6719448567939,8.73624999999999, 5685P 11358 +140.007654869426,-64.6719448567939,7.11812499999999, 5685P 11359 +140.806873250314,-64.6719448567939,8.73624999999999, 5685P 11360 +140.806873250314,-64.6719448567939,7.11812499999999, 5685P 11361 +121.756696066765,-64.0711428662849,8.73624999999999, 5685P 11362 +135.757670642722,-64.0711428662849,8.73624999999999, 5685P 11363 +121.756696066765,-64.0711428662849,7.118125,135.757670642722, 5685P 11364 +-64.0711428662849,7.11812499999999,135.757670642722, 5685P 11365 +-64.8090624764674,8.73624999999999,135.757670642722, 5685P 11366 +-64.8090624764674,7.11812499999999,136.556989192117, 5685P 11367 +-64.8090450558576,8.73624999999999,136.556989192117, 5685P 11368 +-64.8090450558576,7.11812499999999,136.556989192117, 5685P 11369 +-77.6084896883878,8.73624999999999,136.556989192117, 5685P 11370 +-77.6084896883878,7.11812499999999,135.757670642722, 5685P 11371 +-77.6085071089976,8.73624999999999,135.757670642722, 5685P 11372 +-77.6085071089976,7.11812499999999,135.757670642722, 5685P 11373 +-78.0723482653213,8.73624999999999,135.757670642722, 5685P 11374 +-78.0723482653213,7.11812499999999,121.756696066765, 5685P 11375 +-78.0723308447116,8.73624999999999,121.756696066765, 5685P 11376 +-78.0723308447116,7.118125,121.756696066765,-77.4716159572515, 5685P 11377 +8.73624999999999,121.756696066765,-77.4716159572515,7.118125, 5685P 11378 +120.957281704017,-77.4716333778613,8.73624999999999, 5685P 11379 +120.957281704017,-77.4716333778613,7.118125,120.957281704017, 5685P 11380 +-64.6719448567939,8.73624999999999,120.957281704017, 5685P 11381 +-64.6719448567939,7.118125,121.756696066765,-64.6719448567939, 5685P 11382 +8.73624999999999,121.756696066765,-64.6719448567939,7.118125, 5685P 11383 +102.706327256509,-64.0713519136024,8.73624999999999, 5685P 11384 +116.707297477313,-64.0713693342122,8.73624999999999, 5685P 11385 +102.706327256509,-64.0713519136024,7.118125,116.707297477313, 5685P 11386 +-64.0713693342122,7.118125,116.707297477313,-64.6721887453311, 5685P 11387 +8.73624999999999,116.707297477313,-64.6721887453311,7.118125, 5685P 11388 +117.506711840062,-64.6721713247213,8.73624999999999, 5685P 11389 +117.506711840062,-64.6721713247213,7.118125,117.506720550367, 5685P 11390 +-77.4716159572515,8.73624999999999,117.506720550367, 5685P 11391 +-77.4716159572515,7.118125,116.707306187618,-77.4716333778613, 5685P 11392 +8.73624999999999,116.707306187618,-77.4716333778613,7.118125, 5685P 11393 +116.707297477313,-78.0723482653214,8.73624999999999, 5685P 11394 +116.707297477313,-78.0723482653214,7.118125,102.706327256509, 5685P 11395 +-78.0723308447116,8.73624999999999,102.706327256509, 5685P 11396 +-78.0723308447116,7.118125,102.706327256509,-77.4716159572515, 5685P 11397 +8.73624999999999,102.706327256509,-77.4716159572515,7.118125, 5685P 11398 +101.90691289376,-77.4716333778613,8.73624999999999, 5685P 11399 +101.90691289376,-77.4716333778613,7.118125,101.90691289376, 5685P 11400 +-64.672188745331,8.73624999999999,101.90691289376, 5685P 11401 +-64.672188745331,7.118125,102.706327256509,-64.6721713247213, 5685P 11402 +8.73624999999999,102.706327256509,-64.6721713247213,7.118125, 5685P 11403 +83.6559584462526,-64.0713519136024,8.73625,97.6569286670568, 5685P 11404 +-64.0713693342122,8.73624999999999,83.6559584462526, 5685P 11405 +-64.0713519136024,7.118125,97.6569286670568,-64.0713693342122, 5685P 11406 +7.118125,97.6569286670568,-64.6721887453311,8.73624999999999, 5685P 11407 +97.6569286670568,-64.6721887453311,7.118125,98.4563430298053, 5685P 11408 +-64.6721713247213,8.73624999999999,98.4563430298053, 5685P 11409 +-64.6721713247213,7.118125,98.4563430298053,-77.4716159572515, 5685P 11410 +8.73624999999999,98.4563430298053,-77.4716159572515,7.118125, 5685P 11411 +97.6569286670568,-77.4716333778613,8.73624999999999, 5685P 11412 +97.6569286670568,-77.4716333778613,7.118125,97.6569286670568, 5685P 11413 +-78.0723482653214,8.73624999999999,97.6569286670568, 5685P 11414 +-78.0723482653214,7.118125,83.6559497359477,-78.0723308447116, 5685P 11415 +8.73625,83.6559497359477,-78.0723308447116,7.118125, 5685P 11416 +83.6559584462526,-77.4716159572515,8.73625,83.6559584462526, 5685P 11417 +-77.4716159572515,7.118125,82.8565440835042,-77.4716333778613, 5685P 11418 +8.73625,82.8565440835042,-77.4716333778613,7.118125, 5685P 11419 +82.8565440835042,-64.672188745331,8.73625,82.8565440835042, 5685P 11420 +-64.672188745331,7.118125,83.6559584462526,-64.6721713247213, 5685P 11421 +8.73625,83.6559584462526,-64.6721713247213,7.118125, 5685P 11422 +64.6055896359963,-64.0713519136024,8.73625,78.6065598568005, 5685P 11423 +-64.0713693342122,8.73625,64.6055896359963,-64.0713519136024, 5685P 11424 +7.118125,78.6065598568005,-64.0713693342122,7.118125, 5685P 11425 +78.6065598568005,-64.6721887453311,8.73625,78.6065598568005, 5685P 11426 +-64.6721887453311,7.118125,79.4059742195489,-64.6721713247213, 5685P 11427 +8.73625,79.4059742195489,-64.6721713247213,7.118125, 5685P 11428 +79.4059742195489,-77.4716159572515,8.73625,79.4059742195489, 5685P 11429 +-77.4716159572515,7.118125,78.6065598568005,-77.4716333778613, 5685P 11430 +8.73625,78.6065598568005,-77.4716333778613,7.118125, 5685P 11431 +78.6065598568005,-78.0723482653214,8.73625,78.6065598568005, 5685P 11432 +-78.0723482653214,7.118125,64.6055896359963,-78.0723308447116, 5685P 11433 +8.73625,64.6055896359963,-78.0723308447116,7.118125, 5685P 11434 +64.6055896359963,-77.4716159572515,8.73625,64.6055896359963, 5685P 11435 +-77.4716159572515,7.118125,63.8061752732478,-77.4716333778613, 5685P 11436 +8.73625,63.8061752732478,-77.4716333778613,7.118125, 5685P 11437 +63.8061752732478,-64.672188745331,8.73625,63.8061752732478, 5685P 11438 +-64.672188745331,7.118125,64.6055896359963,-64.6721713247213, 5685P 11439 +8.73625,64.6055896359963,-64.6721713247213,7.118125, 5685P 11440 +45.5564838199499,-64.0713519136024,8.73625,59.5564610659959, 5685P 11441 +-64.0713693342122,8.73625,45.5564838199499,-64.0713519136024, 5685P 11442 +7.118125,59.5564610659959,-64.0713693342122,7.118125, 5685P 11443 +59.5564610659959,-64.6721887453311,8.73625,59.5564610659959, 5685P 11444 +-64.6721887453311,7.118125,60.3558754287444,-64.6721713247213, 5685P 11445 +8.73625,60.3558754287444,-64.6721713247213,7.118125, 5685P 11446 +60.3558754287444,-77.4716159572515,8.73625,60.3558754287444, 5685P 11447 +-77.4716159572515,7.118125,59.5564610659959,-77.4716333778613, 5685P 11448 +8.73625,59.5564610659959,-77.4716333778613,7.118125, 5685P 11449 +59.5564610659959,-78.0723482653214,8.73625,59.5564610659959, 5685P 11450 +-78.0723482653214,7.118125,45.5564838199499,-78.0723308447116, 5685P 11451 +8.73625,45.5564838199499,-78.0723308447116,7.118125, 5685P 11452 +45.5564838199499,-77.4716159572515,8.73625,45.5564838199499, 5685P 11453 +-77.4716159572515,7.118125,44.7564597358587,-77.4716333778613, 5685P 11454 +8.73625,44.7564597358587,-77.4716333778613,7.118125, 5685P 11455 +44.7564771564685,-64.672188745331,8.73625,44.7564771564685, 5685P 11456 +-64.672188745331,7.118125,45.5565012405597,-64.6721713247213, 5685P 11457 +8.73625,45.5565012405597,-64.6721713247213,7.118125, 5685P 11458 +155.763761628875,-53.5475075752323,8.73624999999999, 5685P 11459 +157.764849292068,-55.4841478849295,8.73624999999999, 5685P 11460 +157.764849292068,-55.4841478849295,7.11812499999999, 5685P 11461 +155.763761628875,-53.5475075752323,7.11812499999999, 5685P 11462 +44.6011495726228,-53.5475075752323,8.73625,44.6011495726228, 5685P 11463 +-53.5475075752323,7.118125,42.5989895726247,-55.5496648502042, 5685P 11464 +8.73625,42.5989895726247,-55.5496648502042,7.118125, 5685P 11465 +42.5989922976492,-137.747055886107,8.73625,42.5989922976492, 5685P 11466 +-137.747055886107,7.118125,44.6011522976492,-139.749215886107, 5685P 11467 +8.73625,44.6011522976492,-139.749215886107,7.118125, 5685P 11468 +155.763727154066,-139.749215886107,8.73624999999999, 5685P 11469 +155.763727154066,-139.749215886107,7.11812499999999, 5685P 11470 +157.76588715377,-137.747021411595,8.73624999999999, 5685P 11471 +157.76588715377,-137.747021411595,7.11812499999999, 5685P 11472 +157.764849292068,-77.4716159572515,8.73624999999999, 5685P 11473 +157.764849292068,-77.4716159572515,7.11812499999999; 5685P 11474 +502,129,83.9631823855374,-224.118941783543,-7.49999999999994, 5687P 11475 +83.9631823855374,-232.561324596043,-7.49999999999994, 5687P 11476 +83.9631823855374,-224.118941783543,-8.49999999999993, 5687P 11477 +83.9631823855374,-232.561324596043,-8.49999999999993, 5687P 11478 +58.8069323855374,-224.118941783543,-7.49999999999996, 5687P 11479 +58.8069323855374,-224.118941783543,-8.49999999999997, 5687P 11480 +58.8069323855374,-182.864058971043,-7.49999999999996, 5687P 11481 +58.8069323855374,-182.864058971043,-8.49999999999997, 5687P 11482 +48.6897448855374,-182.864058971043,-7.49999999999996, 5687P 11483 +48.6897448855374,-182.864058971043,-8.49999999999997, 5687P 11484 +48.6897448855374,-232.561324596043,-7.49999999999996, 5687P 11485 +48.6897448855374,-232.561324596043,-8.49999999999997, 5687P 11486 +18.9406505609936,-172.121201750437,-7.49999999999997, 5687P 11487 +21.7409062360425,-172.121201750437,-7.49999999999997, 5687P 11488 +18.9406505609936,-172.121201750437,-11.6,21.7409062360425, 5687P 11489 +-172.121201750437,-11.6,97.7151063167837,-190.598023114196, 5687P 11490 +-7.49999999999994,100.515361991833,-190.598023114196, 5687P 11491 +-7.49999999999994,97.7151063167837,-190.598023114196, 5687P 11492 +-11.5999999999999,100.515361991833,-190.598023114196, 5687P 11493 +-11.5999999999999,4.43314110940289,-167.842837467805, 5687P 11494 +5.50000000000003,2.93314110940287,-165.622914872961, 5687P 11495 +5.50000000000003,4.43314110940285,-167.842837467805, 5687P 11496 +-7.49999999999997,2.93314110940287,-165.622914872961, 5687P 11497 +-7.49999999999997,114.304136640482,-248.749215886107, 5687P 11498 +5.50000000000007,114.304136640482,-248.749215886107, 5687P 11499 +-7.49999999999994,7.72696471074415,-248.749215886107, 5687P 11500 +-7.49999999999997,7.72696471074415,-248.749215886107, 5687P 11501 +5.50000000000003,4.43214272479956,-245.454337167255, 5687P 11502 +5.50000000000003,4.43214272479953,-245.454337167255, 5687P 11503 +-7.49999999999997,4.43314110940289,-187.471624566822, 5687P 11504 +-7.49999999999997,4.43314110940289,-187.471624566822, 5687P 11505 +5.50000000000003,5.43422877259573,-163.047507575232, 5687P 11506 +5.50000000000003,7.7269302359354,-164.547507575232, 5687P 11507 +5.50000000000003,23.4436836497758,-164.547507575232, 5687P 11508 +5.50000000000003,23.4436836497758,-163.047507575232, 5687P 11509 +5.50000000000003,2.93210324777537,-247.747012802266, 5687P 11510 +5.50000000000003,2.9331411094029,-187.471615957251, 5687P 11511 +5.50000000000003,116.596838103822,-250.249215886107, 5687P 11512 +5.50000000000007,5.43426324740444,-250.249215886107, 5687P 11513 +5.50000000000003,7.7269302359354,-164.547507575232, 5687P 11514 +-7.49999999999997,23.4436836497758,-164.547507575232, 5687P 11515 +-7.49999999999997,114.304139365509,-164.547507575232, 5687P 11516 +-7.49999999999994,114.304139365509,-164.547507575232, 5687P 11517 +5.50000000000007,105.613764146653,-164.547507575232, 5687P 11518 +5.50000000000005,105.613764146653,-164.547507575232, 5687P 11519 +-7.49999999999994,117.59899817983,-245.454354455992, 5687P 11520 +5.50000000000007,119.098998103822,-247.747055886107, 5687P 11521 +5.50000000000007,119.099000828846,-165.54966486678, 5687P 11522 +5.50000000000007,117.599000752838,-167.842369071796, 5687P 11523 +5.50000000000007,116.596840828848,-163.047507575232, 5687P 11524 +5.50000000000007,105.613764146653,-163.047507575232, 5687P 11525 +5.50000000000005,21.4157277366876,-228.698656211065, 5687P 11526 +-7.49999999999997,24.4159835478226,-228.69865621105, 5687P 11527 +-7.49999999999997,21.4157277366876,-228.698656211065,-11.6, 5687P 11528 +24.4159835478226,-228.69865621105,-11.6,97.6171158746639, 5687P 11529 +-228.698656211057,-7.49999999999994,100.617371685799, 5687P 11530 +-228.698656211057,-7.49999999999994,97.6171158746639, 5687P 11531 +-228.698656211057,-11.5999999999999,100.617371685799, 5687P 11532 +-228.698656211057,-11.5999999999999,21.4157277366876, 5687P 11533 +-190.598023114212,-7.49999999999997,24.4159835478226, 5687P 11534 +-190.598023114196,-7.49999999999997,21.4157277366876, 5687P 11535 +-190.598023114212,-11.6,24.4159835478226,-190.598023114196, 5687P 11536 +-11.6,100.190183492478,-172.121201750453,-7.49999999999994, 5687P 11537 +103.190439303613,-172.121201750437,-7.49999999999994, 5687P 11538 +100.190183492478,-172.121201750453,-11.5999999999999, 5687P 11539 +103.190439303613,-172.121201750437,-11.5999999999999, 5687P 11540 +91.5919773314763,-164.547507575232,-7.49999999999994, 5687P 11541 +105.613764146653,-164.547507575232,-11.5999999999999, 5687P 11542 +91.5919773314763,-164.547507575232,-11.5999999999999, 5687P 11543 +105.613764146653,-163.047507575232,1.50000000000007, 5687P 11544 +105.613764146653,-156.547507575232,1.50000000000007, 5687P 11545 +105.613764146653,-156.547507575232,-11.5999999999999, 5687P 11546 +117.599000752838,-167.842369071796,-7.49999999999994, 5687P 11547 +117.59899817983,-245.454354455992,-7.49999999999994, 5687P 11548 +119.099000828848,-165.549667575232,-7.49999999999994, 5687P 11549 +74.4331411094029,-164.547507575232,-7.49999999999996, 5687P 11550 +74.4331411094029,-171.547507575232,-7.49999999999996, 5687P 11551 +54.4331411094029,-171.547507575231,-7.49999999999996, 5687P 11552 +54.4331411094029,-164.547507575232,-7.49999999999996, 5687P 11553 +40.4453194054918,-164.547507575232,-7.49999999999997, 5687P 11554 +2.93314110940287,-165.476420277504,-7.49999999999997, 5687P 11555 +40.4453194054918,-164.547507575232,-11.6,23.4436836497758, 5687P 11556 +-164.547507575232,-11.6,40.4453194054918,-164.547507575232, 5687P 11557 +5.50000000000003,40.4453194054918,-163.047507575232, 5687P 11558 +5.50000000000003,40.4453194054918,-163.047507575232, 5687P 11559 +1.50000000000003,40.4453194054918,-156.547507575232, 5687P 11560 +1.50000000000003,40.4453194054918,-156.547507575232,-11.6, 5687P 11561 +23.4436836497758,-156.547507575232,1.50000000000003, 5687P 11562 +23.4436836497758,-163.047507575232,1.50000000000003, 5687P 11563 +91.5919773314763,-156.547507575232,1.50000000000007, 5687P 11564 +91.5919773314763,-163.047507575232,1.50000000000007, 5687P 11565 +91.5919773314763,-163.047507575232,5.50000000000004, 5687P 11566 +116.596840828848,-163.047507575232,7.50000000000006, 5687P 11567 +5.43422877259573,-163.047507575232,7.50000000000003, 5687P 11568 +23.4436836497758,-156.547507575232,-11.6,91.5919773314763, 5687P 11569 +-156.547507575232,-11.5999999999999,91.5919773314763, 5687P 11570 +-164.547507575232,5.50000000000004,54.4331411094029, 5687P 11571 +-164.547507575232,5.50000000000004,54.4331411094029, 5687P 11572 +-171.547507575231,5.50000000000004,74.4331411094029, 5687P 11573 +-171.547507575232,5.50000000000004,74.4331411094029, 5687P 11574 +-164.547507575232,5.50000000000004,2.9331411094029, 5687P 11575 +-187.471615957251,7.50000000000003,2.93314110940287, 5687P 11576 +-165.476420277504,7.50000000000003,2.93210324777537, 5687P 11577 +-247.747012802266,7.50000000000003,5.43426324740444, 5687P 11578 +-250.249215886107,7.50000000000003,116.596838103822, 5687P 11579 +-250.249215886107,7.50000000000006,119.098998103822, 5687P 11580 +-247.747055886107,7.50000000000006,119.099000828846, 5687P 11581 +-165.54966486678,7.50000000000006,5.43422877259573, 5687P 11582 +-156.547507575232,7.50000000000003,-3.56685889059712, 5687P 11583 +-165.410723179457,7.50000000000003,-3.56685889059712, 5687P 11584 +-187.471555692063,7.50000000000003,-3.56789675126109, 5687P 11585 +-247.746900880977,7.50000000000003,5.43426324740444, 5687P 11586 +-256.749215886107,7.50000000000003,116.596838103822, 5687P 11587 +-256.749215886107,7.50000000000006,125.598998103822, 5687P 11588 +-247.747055886107,7.50000000000006,125.599000828846, 5687P 11589 +-165.54966508227,7.50000000000006,116.596840828848, 5687P 11590 +-156.547507575232,7.50000000000006,-3.56685889059712, 5687P 11591 +-165.410723179457,-11.6,-3.56685889059712,-187.471555692063, 5687P 11592 +-11.6,-3.56789675126109,-247.746900880977,-11.6, 5687P 11593 +5.43426324740444,-256.749215886107,-11.6,116.596838103822, 5687P 11594 +-256.749215886107,-11.5999999999999,125.598998103822, 5687P 11595 +-247.747055886107,-11.5999999999999,125.599000828846, 5687P 11596 +-165.54966508227,-11.5999999999999,116.596840828848, 5687P 11597 +-156.547507575232,-11.5999999999999,5.43422877259573, 5687P 11598 +-156.547507575232,-11.6; 5687P 11599 +502,171,220.752682252201,-164.547507575232,-7.5, 5689P 11600 +220.752682252201,-164.547507575232,5.5,213.600041714311, 5689P 11601 +-164.547507575232,5.5,213.600041714311,-164.547507575232,-7.5, 5689P 11602 +220.752682252201,-163.047507575232,5.5,169.612220010399, 5689P 11603 +-163.047507575232,5.5,169.612220010399,-164.547507575232,5.5, 5689P 11604 +193.600041714311,-164.547507575232,5.5,193.600041714311, 5689P 11605 +-171.547507575231,5.5,213.600041714311,-171.547507575232,5.5, 5689P 11606 +220.752682252201,-163.047507575232,1.5,237.780664751561, 5689P 11607 +-163.047507575232,1.5,237.780664751561,-163.047507575232,5.5, 5689P 11608 +255.763741433756,-163.047507575232,5.5,255.763741433756, 5689P 11609 +-163.047507575232,7.5,144.601129377503,-163.047507575232,7.5, 5689P 11610 +144.601129377503,-163.047507575232,5.5,155.584237511039, 5689P 11611 +-163.047507575232,5.5,155.584237511039,-163.047507575232,1.5, 5689P 11612 +169.612220010399,-163.047507575232,1.5,155.584237511039, 5689P 11613 +-156.547507575232,-11.6,155.584237511039,-164.547507575232, 5689P 11614 +-11.6,155.584237511039,-156.547507575232,1.49999999999999, 5689P 11615 +155.584237511039,-164.547507575232,5.5,155.584237511039, 5689P 11616 +-164.547507575232,-7.5,220.752682252201,-156.547507575232,-11.6, 5689P 11617 +220.752682252201,-164.547507575232,-11.6,220.752682252201, 5689P 11618 +-156.547507575232,1.5,146.893830840843,-164.547507575232,5.5, 5689P 11619 +146.893830840843,-164.547507575232,-7.5,169.612220010399, 5689P 11620 +-156.547507575232,1.5,144.601129377503,-156.547507575232,-11.6, 5689P 11621 +144.601129377503,-156.547507575232,7.5,255.763741433756, 5689P 11622 +-156.547507575232,7.5,255.763741433756,-156.547507575232,-11.6, 5689P 11623 +237.780664751561,-156.547507575232,-11.6,237.780664751561, 5689P 11624 +-156.547507575232,1.5,169.612220010399,-156.547507575232,-11.6, 5689P 11625 +169.612220010399,-164.547507575232,-11.6,237.780664751561, 5689P 11626 +-164.547507575232,-11.6,264.765901433754,-165.54966508227,-11.6, 5689P 11627 +264.765898708729,-247.747055886107,-11.6,255.763738708729, 5689P 11628 +-256.749215886107,-11.6,144.601163852312,-256.749215886107, 5689P 11629 +-11.6,135.599003853647,-247.746900880977,-11.6,135.600041714311, 5689P 11630 +-187.471555692063,-11.6,135.600041714311,-165.410723179457, 5689P 11631 +-11.6,239.357084097385,-172.121201750453,-11.6,242.35733990852, 5689P 11632 +-172.121201750437,-11.6,160.582628341595,-190.598023114212, 5689P 11633 +-11.6,163.58288415273,-190.598023114196,-11.6,236.784016479572, 5689P 11634 +-228.698656211057,-11.6,239.784272290707,-228.698656211057, 5689P 11635 +-11.6,160.582628341595,-228.698656211065,-11.6,163.58288415273, 5689P 11636 +-228.69865621105,-11.6,236.882006921691,-190.598023114196,-11.6, 5689P 11637 +239.68226259674,-190.598023114196,-11.6,158.107551165901, 5689P 11638 +-172.121201750437,-11.6,160.90780684095,-172.121201750437,-11.6, 5689P 11639 +198.356008409196,-187.660756010089,-7.5,189.332570909196, 5689P 11640 +-187.660756010089,-7.5,198.356008409196,-187.660756010089,-8.5, 5689P 11641 +189.332570909196,-187.660756010089,-8.5,206.793508409196, 5689P 11642 +-187.856068510089,-7.5,206.793508409196,-187.856068510089,-8.5, 5689P 11643 +211.148977159196,-190.102162260089,-7.5,211.148977159196, 5689P 11644 +-190.102162260089,-8.5,212.691945909196,-194.770131010089,-7.5, 5689P 11645 +212.691945909196,-194.770131010089,-8.5,211.520070909196, 5689P 11646 +-199.067006010089,-7.5,211.520070909196,-199.067006010089,-8.5, 5689P 11647 +208.277883409196,-201.488881010089,-7.5,208.277883409196, 5689P 11648 +-201.488881010089,-8.5,197.887258409196,-202.192006010089,-7.5, 5689P 11649 +197.887258409196,-202.192006010089,-8.5,189.332570909196, 5689P 11650 +-202.192006010089,-7.5,189.332570909196,-202.192006010089,-8.5, 5689P 11651 +189.332570909196,-211.332631010089,-7.5,189.332570909196, 5689P 11652 +-235.238881010089,-7.5,189.332570909196,-211.332631010089,-8.5, 5689P 11653 +189.332570909196,-235.238881010089,-8.5,191.676320909196, 5689P 11654 +-211.332631010089,-7.5,191.676320909196,-211.332631010089,-8.5, 5689P 11655 +197.496633409196,-211.977162260089,-7.5,197.496633409196, 5689P 11656 +-211.977162260089,-8.5,200.973195909196,-214.359974760089,-7.5, 5689P 11657 +200.973195909196,-214.359974760089,-8.5,207.066945909196, 5689P 11658 +-222.777943510089,-7.5,207.066945909196,-222.777943510089,-8.5, 5689P 11659 +215.426320909196,-235.238881010089,-7.5,215.426320909196, 5689P 11660 +-235.238881010089,-8.5,229.254445909196,-235.238881010089,-7.5, 5689P 11661 +229.254445909196,-235.238881010089,-8.5,222.262258409196, 5689P 11662 +-224.067006010089,-7.5,222.262258409196,-224.067006010089,-8.5, 5689P 11663 +215.680227159196,-214.770131010089,-7.5,215.680227159196, 5689P 11664 +-214.770131010089,-8.5,209.488820909196,-209.965443510089,-7.5, 5689P 11665 +209.488820909196,-209.965443510089,-8.5,220.816945909196, 5689P 11666 +-204.672474760089,-7.5,220.816945909196,-204.672474760089,-8.5, 5689P 11667 +224.606008409196,-194.027943510089,-7.5,224.606008409196, 5689P 11668 +-194.027943510089,-8.5,222.106008409196,-185.004506010089,-7.5, 5689P 11669 +222.106008409196,-185.004506010089,-8.5,215.445852159196, 5689P 11670 +-179.516224760089,-7.5,215.445852159196,-179.516224760089,-8.5, 5689P 11671 +202.106008409196,-177.973256010089,-7.5,202.106008409196, 5689P 11672 +-177.973256010089,-8.5,177.770070909196,-177.973256010089,-7.5, 5689P 11673 +177.770070909196,-177.973256010089,-8.5,177.770070909196, 5689P 11674 +-235.238881010089,-7.5,177.770070909196,-235.238881010089,-8.5, 5689P 11675 +256.765901357746,-167.842369071796,-7.5,256.765898784737, 5689P 11676 +-245.454354455992,-7.5,258.265901433755,-165.549667575232,-7.5, 5689P 11677 +253.471039970417,-164.547507575232,-7.5,237.780664751561, 5689P 11678 +-164.547507575232,-7.5,213.600041714311,-171.547507575232,-7.5, 5689P 11679 +193.600041714311,-171.547507575231,-7.5,193.600041714311, 5689P 11680 +-164.547507575232,-7.5,169.612220010399,-164.547507575232,-7.5, 5689P 11681 +142.100041714311,-165.476420277504,-7.5,142.100041714311, 5689P 11682 +-165.622914872961,-7.5,143.600041714311,-167.842837467805,-7.5, 5689P 11683 +143.600041714311,-187.471624566822,-7.5,143.599043329707, 5689P 11684 +-245.454337167255,-7.5,146.893865315652,-248.749215886107,-7.5, 5689P 11685 +253.47103724539,-248.749215886107,-7.5,242.35733990852, 5689P 11686 +-172.121201750437,-7.5,239.357084097385,-172.121201750453,-7.5, 5689P 11687 +163.58288415273,-190.598023114196,-7.5,160.582628341595, 5689P 11688 +-190.598023114212,-7.5,239.784272290707,-228.698656211057,-7.5, 5689P 11689 +236.784016479572,-228.698656211057,-7.5,163.58288415273, 5689P 11690 +-228.69865621105,-7.5,160.582628341595,-228.698656211065,-7.5, 5689P 11691 +239.68226259674,-190.598023114196,-7.5,236.882006921691, 5689P 11692 +-190.598023114196,-7.5,160.90780684095,-172.121201750437,-7.5, 5689P 11693 +158.107551165901,-172.121201750437,-7.5,143.600041714311, 5689P 11694 +-167.842837467805,5.5,142.100041714311,-165.622914872961,5.5, 5689P 11695 +253.47103724539,-248.749215886107,5.5,146.893865315652, 5689P 11696 +-248.749215886107,5.5,143.599043329707,-245.454337167255,5.5, 5689P 11697 +143.600041714311,-187.471624566822,5.5,142.099003852683, 5689P 11698 +-247.747012802266,5.5,142.100041714311,-187.471615957251,5.5, 5689P 11699 +255.763738708729,-250.249215886107,5.5,144.601163852312, 5689P 11700 +-250.249215886107,5.5,253.471039970417,-164.547507575232,5.5, 5689P 11701 +237.780664751561,-164.547507575232,5.5,256.765898784737, 5689P 11702 +-245.454354455992,5.5,258.265898708729,-247.747055886107,5.5, 5689P 11703 +258.265901433754,-165.54966486678,5.5,256.765901357746, 5689P 11704 +-167.842369071796,5.5,142.100041714311,-187.471615957251,7.5, 5689P 11705 +142.100041714311,-165.476420277504,7.5,142.099003852683, 5689P 11706 +-247.747012802266,7.5,144.601163852312,-250.249215886107,7.5, 5689P 11707 +255.763738708729,-250.249215886107,7.5,258.265898708729, 5689P 11708 +-247.747055886107,7.5,258.265901433754,-165.54966486678,7.5, 5689P 11709 +135.600041714311,-165.410723179457,7.5,135.600041714311, 5689P 11710 +-187.471555692063,7.5,135.599003853647,-247.746900880977,7.5, 5689P 11711 +144.601163852312,-256.749215886107,7.5,255.763738708729, 5689P 11712 +-256.749215886107,7.5,264.765898708729,-247.747055886107,7.5, 5689P 11713 +264.765901433754,-165.54966508227,7.5; 5689P 11714 +504,915,2027,5685,1,5685,2,2029,5685,2,5685,3,2031,5685,4,5685, 5691P 11715 +3,2033,5685,1,5685,4,2035,5685,2,5685,1,2037,5685,3,5685,4,2039, 5691P 11716 +5685,5,5685,6,2041,5685,6,5685,7,2043,5685,8,5685,7,2045,5685,5, 5691P 11717 +5685,8,2047,5685,6,5685,5,2049,5685,7,5685,8,2051,5685,9,5685, 5691P 11718 +10,2053,5685,10,5685,11,2055,5685,12,5685,11,2057,5685,9,5685, 5691P 11719 +12,2059,5685,10,5685,9,2061,5685,11,5685,12,2063,5685,13,5685, 5691P 11720 +14,2065,5685,14,5685,15,2067,5685,16,5685,15,2069,5685,13,5685, 5691P 11721 +16,2071,5685,14,5685,13,2073,5685,15,5685,16,2075,5685,17,5685, 5691P 11722 +18,2077,5685,17,5685,19,2079,5685,20,5685,19,2081,5685,18,5685, 5691P 11723 +20,2083,5685,18,5685,21,2085,5685,22,5685,20,2087,5685,21,5685, 5691P 11724 +22,2089,5685,21,5685,23,2091,5685,24,5685,22,2093,5685,23,5685, 5691P 11725 +24,2095,5685,23,5685,25,2097,5685,26,5685,24,2099,5685,25,5685, 5691P 11726 +26,2101,5685,25,5685,27,2103,5685,28,5685,26,2105,5685,27,5685, 5691P 11727 +28,2107,5685,27,5685,29,2109,5685,30,5685,28,2111,5685,29,5685, 5691P 11728 +30,2113,5685,29,5685,31,2115,5685,32,5685,30,2117,5685,31,5685, 5691P 11729 +32,2119,5685,31,5685,33,2121,5685,34,5685,32,2123,5685,33,5685, 5691P 11730 +34,2125,5685,33,5685,35,2127,5685,36,5685,34,2129,5685,35,5685, 5691P 11731 +36,2131,5685,35,5685,37,2133,5685,38,5685,36,2135,5685,37,5685, 5691P 11732 +38,2137,5685,37,5685,39,2139,5685,40,5685,38,2141,5685,39,5685, 5691P 11733 +40,2143,5685,39,5685,17,2145,5685,19,5685,40,2147,5685,41,5685, 5691P 11734 +42,2149,5685,41,5685,43,2151,5685,44,5685,43,2153,5685,42,5685, 5691P 11735 +44,2155,5685,42,5685,45,2157,5685,46,5685,44,2159,5685,45,5685, 5691P 11736 +46,2161,5685,45,5685,47,2163,5685,48,5685,46,2165,5685,47,5685, 5691P 11737 +48,2167,5685,47,5685,49,2169,5685,50,5685,48,2171,5685,49,5685, 5691P 11738 +50,2173,5685,49,5685,51,2175,5685,52,5685,50,2177,5685,51,5685, 5691P 11739 +52,2179,5685,51,5685,53,2181,5685,54,5685,52,2183,5685,53,5685, 5691P 11740 +54,2185,5685,53,5685,55,2187,5685,56,5685,54,2189,5685,55,5685, 5691P 11741 +56,2191,5685,55,5685,57,2193,5685,58,5685,56,2195,5685,57,5685, 5691P 11742 +58,2197,5685,57,5685,59,2199,5685,60,5685,58,2201,5685,59,5685, 5691P 11743 +60,2203,5685,59,5685,61,2205,5685,62,5685,60,2207,5685,61,5685, 5691P 11744 +62,2209,5685,61,5685,63,2211,5685,64,5685,62,2213,5685,63,5685, 5691P 11745 +64,2215,5685,63,5685,41,2217,5685,43,5685,64,2219,5685,65,5685, 5691P 11746 +66,2221,5685,65,5685,67,2223,5685,68,5685,67,2225,5685,66,5685, 5691P 11747 +68,2227,5685,66,5685,69,2229,5685,70,5685,68,2231,5685,69,5685, 5691P 11748 +70,2233,5685,69,5685,71,2235,5685,72,5685,70,2237,5685,71,5685, 5691P 11749 +72,2239,5685,71,5685,73,2241,5685,74,5685,72,2243,5685,73,5685, 5691P 11750 +74,2245,5685,73,5685,75,2247,5685,76,5685,74,2249,5685,75,5685, 5691P 11751 +76,2251,5685,75,5685,77,2253,5685,78,5685,76,2255,5685,77,5685, 5691P 11752 +78,2257,5685,77,5685,79,2259,5685,80,5685,78,2261,5685,79,5685, 5691P 11753 +80,2263,5685,79,5685,81,2265,5685,82,5685,80,2267,5685,81,5685, 5691P 11754 +82,2269,5685,81,5685,83,2271,5685,84,5685,82,2273,5685,83,5685, 5691P 11755 +84,2275,5685,83,5685,85,2277,5685,86,5685,84,2279,5685,85,5685, 5691P 11756 +86,2281,5685,85,5685,87,2283,5685,88,5685,86,2285,5685,87,5685, 5691P 11757 +88,2287,5685,87,5685,65,2289,5685,67,5685,88,2291,5685,89,5685, 5691P 11758 +90,2293,5685,89,5685,91,2295,5685,92,5685,91,2297,5685,90,5685, 5691P 11759 +92,2299,5685,90,5685,93,2301,5685,94,5685,92,2303,5685,93,5685, 5691P 11760 +94,2305,5685,93,5685,95,2307,5685,96,5685,94,2309,5685,95,5685, 5691P 11761 +96,2311,5685,95,5685,97,2313,5685,98,5685,96,2315,5685,97,5685, 5691P 11762 +98,2317,5685,97,5685,99,2319,5685,100,5685,98,2321,5685,99,5685, 5691P 11763 +100,2323,5685,99,5685,101,2325,5685,102,5685,100,2327,5685,101, 5691P 11764 +5685,102,2329,5685,101,5685,103,2331,5685,104,5685,102,2333, 5691P 11765 +5685,103,5685,104,2335,5685,103,5685,105,2337,5685,106,5685,104, 5691P 11766 +2339,5685,105,5685,106,2341,5685,105,5685,107,2343,5685,108, 5691P 11767 +5685,106,2345,5685,107,5685,108,2347,5685,107,5685,109,2349, 5691P 11768 +5685,110,5685,108,2351,5685,109,5685,110,2353,5685,109,5685,111, 5691P 11769 +2355,5685,112,5685,110,2357,5685,111,5685,112,2359,5685,111, 5691P 11770 +5685,89,2361,5685,91,5685,112,2363,5685,113,5685,114,2365,5685, 5691P 11771 +113,5685,115,2367,5685,116,5685,115,2369,5685,114,5685,116,2371, 5691P 11772 +5685,114,5685,117,2373,5685,118,5685,116,2375,5685,117,5685,118, 5691P 11773 +2377,5685,117,5685,119,2379,5685,120,5685,118,2381,5685,119, 5691P 11774 +5685,120,2383,5685,119,5685,121,2385,5685,122,5685,120,2387, 5691P 11775 +5685,121,5685,122,2389,5685,121,5685,123,2391,5685,124,5685,122, 5691P 11776 +2393,5685,123,5685,124,2395,5685,123,5685,125,2397,5685,126, 5691P 11777 +5685,124,2399,5685,125,5685,126,2401,5685,125,5685,127,2403, 5691P 11778 +5685,128,5685,126,2405,5685,127,5685,128,2407,5685,127,5685,129, 5691P 11779 +2409,5685,130,5685,128,2411,5685,129,5685,130,2413,5685,129, 5691P 11780 +5685,131,2415,5685,132,5685,130,2417,5685,131,5685,132,2419, 5691P 11781 +5685,131,5685,133,2421,5685,134,5685,132,2423,5685,133,5685,134, 5691P 11782 +2425,5685,133,5685,135,2427,5685,136,5685,134,2429,5685,135, 5691P 11783 +5685,136,2431,5685,135,5685,113,2433,5685,115,5685,136,2435, 5691P 11784 +5685,137,5685,138,2437,5685,137,5685,139,2439,5685,140,5685,139, 5691P 11785 +2441,5685,138,5685,140,2443,5685,138,5685,141,2445,5685,142, 5691P 11786 +5685,140,2447,5685,141,5685,142,2449,5685,141,5685,143,2451, 5691P 11787 +5685,144,5685,142,2453,5685,143,5685,144,2455,5685,143,5685,145, 5691P 11788 +2457,5685,146,5685,144,2459,5685,145,5685,146,2461,5685,145, 5691P 11789 +5685,147,2463,5685,148,5685,146,2465,5685,147,5685,148,2467, 5691P 11790 +5685,147,5685,149,2469,5685,150,5685,148,2471,5685,149,5685,150, 5691P 11791 +2473,5685,149,5685,151,2475,5685,152,5685,150,2477,5685,151, 5691P 11792 +5685,152,2479,5685,151,5685,153,2481,5685,154,5685,152,2483, 5691P 11793 +5685,153,5685,154,2485,5685,153,5685,155,2487,5685,156,5685,154, 5691P 11794 +2489,5685,155,5685,156,2491,5685,155,5685,157,2493,5685,158, 5691P 11795 +5685,156,2495,5685,157,5685,158,2497,5685,157,5685,159,2499, 5691P 11796 +5685,160,5685,158,2501,5685,159,5685,160,2503,5685,159,5685,137, 5691P 11797 +2505,5685,139,5685,160,2507,5685,161,5685,162,2509,5685,161, 5691P 11798 +5685,163,2511,5685,164,5685,163,2513,5685,162,5685,164,2515, 5691P 11799 +5685,162,5685,165,2517,5685,166,5685,164,2519,5685,165,5685,166, 5691P 11800 +2521,5685,165,5685,167,2523,5685,168,5685,166,2525,5685,167, 5691P 11801 +5685,168,2527,5685,167,5685,169,2529,5685,170,5685,168,2531, 5691P 11802 +5685,169,5685,170,2533,5685,169,5685,171,2535,5685,172,5685,170, 5691P 11803 +2537,5685,171,5685,172,2539,5685,171,5685,173,2541,5685,174, 5691P 11804 +5685,172,2543,5685,173,5685,174,2545,5685,173,5685,175,2547, 5691P 11805 +5685,176,5685,174,2549,5685,175,5685,176,2551,5685,175,5685,177, 5691P 11806 +2553,5685,178,5685,176,2555,5685,177,5685,178,2557,5685,177, 5691P 11807 +5685,179,2559,5685,180,5685,178,2561,5685,179,5685,180,2563, 5691P 11808 +5685,179,5685,181,2565,5685,182,5685,180,2567,5685,181,5685,182, 5691P 11809 +2569,5685,181,5685,183,2571,5685,184,5685,182,2573,5685,183, 5691P 11810 +5685,184,2575,5685,183,5685,161,2577,5685,163,5685,184,2579, 5691P 11811 +5685,185,5685,186,2581,5685,185,5685,187,2583,5685,188,5685,187, 5691P 11812 +2585,5685,186,5685,188,2587,5685,186,5685,189,2589,5685,190, 5691P 11813 +5685,188,2591,5685,189,5685,190,2593,5685,189,5685,191,2595, 5691P 11814 +5685,192,5685,190,2597,5685,191,5685,192,2599,5685,191,5685,193, 5691P 11815 +2601,5685,194,5685,192,2603,5685,193,5685,194,2605,5685,193, 5691P 11816 +5685,195,2607,5685,196,5685,194,2609,5685,195,5685,196,2611, 5691P 11817 +5685,195,5685,197,2613,5685,198,5685,196,2615,5685,197,5685,198, 5691P 11818 +2617,5685,197,5685,199,2619,5685,200,5685,198,2621,5685,199, 5691P 11819 +5685,200,2623,5685,199,5685,201,2625,5685,202,5685,200,2627, 5691P 11820 +5685,201,5685,202,2629,5685,201,5685,203,2631,5685,204,5685,202, 5691P 11821 +2633,5685,203,5685,204,2635,5685,203,5685,205,2637,5685,206, 5691P 11822 +5685,204,2639,5685,205,5685,206,2641,5685,205,5685,207,2643, 5691P 11823 +5685,208,5685,206,2645,5685,207,5685,208,2647,5685,207,5685,185, 5691P 11824 +2649,5685,187,5685,208,2651,5685,209,5685,210,2653,5685,209, 5691P 11825 +5685,211,2655,5685,212,5685,211,2657,5685,210,5685,212,2659, 5691P 11826 +5685,210,5685,213,2661,5685,214,5685,212,2663,5685,213,5685,214, 5691P 11827 +2665,5685,213,5685,215,2667,5685,216,5685,214,2669,5685,215, 5691P 11828 +5685,216,2671,5685,215,5685,217,2673,5685,218,5685,216,2675, 5691P 11829 +5685,217,5685,218,2677,5685,217,5685,219,2679,5685,220,5685,218, 5691P 11830 +2681,5685,219,5685,220,2683,5685,219,5685,221,2685,5685,222, 5691P 11831 +5685,220,2687,5685,221,5685,222,2689,5685,221,5685,223,2691, 5691P 11832 +5685,224,5685,222,2693,5685,223,5685,224,2695,5685,223,5685,225, 5691P 11833 +2697,5685,226,5685,224,2699,5685,225,5685,226,2701,5685,225, 5691P 11834 +5685,227,2703,5685,228,5685,226,2705,5685,227,5685,228,2707, 5691P 11835 +5685,227,5685,229,2709,5685,230,5685,228,2711,5685,229,5685,230, 5691P 11836 +2713,5685,229,5685,231,2715,5685,232,5685,230,2717,5685,231, 5691P 11837 +5685,232,2719,5685,231,5685,209,2721,5685,211,5685,232,2723, 5691P 11838 +5685,233,5685,234,2725,5685,233,5685,235,2727,5685,236,5685,235, 5691P 11839 +2729,5685,234,5685,236,2731,5685,234,5685,237,2733,5685,238, 5691P 11840 +5685,236,2735,5685,237,5685,238,2737,5685,237,5685,239,2739, 5691P 11841 +5685,240,5685,238,2741,5685,239,5685,240,2743,5685,239,5685,241, 5691P 11842 +2745,5685,242,5685,240,2747,5685,241,5685,242,2749,5685,241, 5691P 11843 +5685,243,2751,5685,244,5685,242,2753,5685,243,5685,244,2755, 5691P 11844 +5685,243,5685,245,2757,5685,246,5685,244,2759,5685,245,5685,246, 5691P 11845 +2761,5685,245,5685,247,2763,5685,248,5685,246,2765,5685,247, 5691P 11846 +5685,248,2767,5685,247,5685,249,2769,5685,250,5685,248,2771, 5691P 11847 +5685,249,5685,250,2773,5685,249,5685,251,2775,5685,252,5685,250, 5691P 11848 +2777,5685,251,5685,252,2779,5685,251,5685,253,2781,5685,254, 5691P 11849 +5685,252,2783,5685,253,5685,254,2785,5685,253,5685,255,2787, 5691P 11850 +5685,256,5685,254,2789,5685,255,5685,256,2791,5685,255,5685,233, 5691P 11851 +2793,5685,235,5685,256,2795,5685,257,5685,258,2797,5685,257, 5691P 11852 +5685,259,2799,5685,260,5685,259,2801,5685,258,5685,260,2803, 5691P 11853 +5685,258,5685,261,2805,5685,262,5685,260,2807,5685,261,5685,262, 5691P 11854 +2809,5685,261,5685,263,2811,5685,264,5685,262,2813,5685,263, 5691P 11855 +5685,264,2815,5685,263,5685,265,2817,5685,266,5685,264,2819, 5691P 11856 +5685,265,5685,266,2821,5685,265,5685,267,2823,5685,268,5685,266, 5691P 11857 +2825,5685,267,5685,268,2827,5685,267,5685,269,2829,5685,270, 5691P 11858 +5685,268,2831,5685,269,5685,270,2833,5685,269,5685,271,2835, 5691P 11859 +5685,272,5685,270,2837,5685,271,5685,272,2839,5685,271,5685,273, 5691P 11860 +2841,5685,274,5685,272,2843,5685,273,5685,274,2845,5685,273, 5691P 11861 +5685,275,2847,5685,276,5685,274,2849,5685,275,5685,276,2851, 5691P 11862 +5685,275,5685,277,2853,5685,278,5685,276,2855,5685,277,5685,278, 5691P 11863 +2857,5685,277,5685,279,2859,5685,280,5685,278,2861,5685,279, 5691P 11864 +5685,280,2863,5685,279,5685,257,2865,5685,259,5685,280,2867, 5691P 11865 +5685,281,5685,282,2869,5685,281,5685,283,2871,5685,284,5685,283, 5691P 11866 +2873,5685,282,5685,284,2875,5685,282,5685,285,2877,5685,286, 5691P 11867 +5685,284,2879,5685,285,5685,286,2881,5685,285,5685,287,2883, 5691P 11868 +5685,288,5685,286,2885,5685,287,5685,288,2887,5685,287,5685,289, 5691P 11869 +2889,5685,290,5685,288,2891,5685,289,5685,290,2893,5685,289, 5691P 11870 +5685,291,2895,5685,292,5685,290,2897,5685,291,5685,292,2899, 5691P 11871 +5685,291,5685,293,2901,5685,294,5685,292,2903,5685,293,5685,294, 5691P 11872 +2905,5685,293,5685,295,2907,5685,296,5685,294,2909,5685,295, 5691P 11873 +5685,296,2911,5685,295,5685,297,2913,5685,298,5685,296,2915, 5691P 11874 +5685,297,5685,298,2917,5685,297,5685,299,2919,5685,300,5685,298, 5691P 11875 +2921,5685,299,5685,300,2923,5685,299,5685,301,2925,5685,302, 5691P 11876 +5685,300,2927,5685,301,5685,302,2929,5685,301,5685,303,2931, 5691P 11877 +5685,304,5685,302,2933,5685,303,5685,304,2935,5685,303,5685,281, 5691P 11878 +2937,5685,283,5685,304,2939,5685,305,5685,306,2941,5685,305, 5691P 11879 +5685,307,2943,5685,308,5685,307,2945,5685,306,5685,308,2947, 5691P 11880 +5685,306,5685,309,2949,5685,310,5685,308,2951,5685,309,5685,310, 5691P 11881 +2953,5685,309,5685,311,2955,5685,312,5685,310,2957,5685,311, 5691P 11882 +5685,312,2959,5685,311,5685,313,2961,5685,314,5685,312,2963, 5691P 11883 +5685,313,5685,314,2965,5685,313,5685,315,2967,5685,316,5685,314, 5691P 11884 +2969,5685,315,5685,316,2971,5685,315,5685,317,2973,5685,318, 5691P 11885 +5685,316,2975,5685,317,5685,318,2977,5685,317,5685,319,2979, 5691P 11886 +5685,320,5685,318,2981,5685,319,5685,320,2983,5685,319,5685,321, 5691P 11887 +2985,5685,322,5685,320,2987,5685,321,5685,322,2989,5685,321, 5691P 11888 +5685,323,2991,5685,324,5685,322,2993,5685,323,5685,324,2995, 5691P 11889 +5685,323,5685,325,2997,5685,326,5685,324,2999,5685,325,5685,326, 5691P 11890 +3001,5685,325,5685,327,3003,5685,328,5685,326,3005,5685,327, 5691P 11891 +5685,328,3007,5685,327,5685,305,3009,5685,307,5685,328,3011, 5691P 11892 +5685,329,5685,330,3013,5685,329,5685,331,3015,5685,332,5685,331, 5691P 11893 +3017,5685,330,5685,332,3019,5685,330,5685,333,3021,5685,334, 5691P 11894 +5685,332,3023,5685,333,5685,334,3025,5685,333,5685,335,3027, 5691P 11895 +5685,336,5685,334,3029,5685,335,5685,336,3031,5685,335,5685,337, 5691P 11896 +3033,5685,338,5685,336,3035,5685,337,5685,338,3037,5685,337, 5691P 11897 +5685,339,3039,5685,340,5685,338,3041,5685,339,5685,340,3043, 5691P 11898 +5685,339,5685,341,3045,5685,342,5685,340,3047,5685,341,5685,342, 5691P 11899 +3049,5685,341,5685,343,3051,5685,344,5685,342,3053,5685,343, 5691P 11900 +5685,344,3055,5685,343,5685,345,3057,5685,346,5685,344,3059, 5691P 11901 +5685,345,5685,346,3061,5685,345,5685,347,3063,5685,348,5685,346, 5691P 11902 +3065,5685,347,5685,348,3067,5685,347,5685,349,3069,5685,350, 5691P 11903 +5685,348,3071,5685,349,5685,350,3073,5685,349,5685,351,3075, 5691P 11904 +5685,352,5685,350,3077,5685,351,5685,352,3079,5685,351,5685,329, 5691P 11905 +3081,5685,331,5685,352,3083,5685,353,5685,354,3085,5685,353, 5691P 11906 +5685,355,3087,5685,356,5685,355,3089,5685,354,5685,356,3091, 5691P 11907 +5685,354,5685,357,3093,5685,358,5685,356,3095,5685,357,5685,358, 5691P 11908 +3097,5685,357,5685,359,3099,5685,360,5685,358,3101,5685,359, 5691P 11909 +5685,360,3103,5685,359,5685,361,3105,5685,362,5685,360,3107, 5691P 11910 +5685,361,5685,362,3109,5685,361,5685,363,3111,5685,364,5685,362, 5691P 11911 +3113,5685,363,5685,364,3115,5685,363,5685,365,3117,5685,366, 5691P 11912 +5685,364,3119,5685,365,5685,366,3121,5685,365,5685,367,3123, 5691P 11913 +5685,368,5685,366,3125,5685,367,5685,368,3127,5685,367,5685,369, 5691P 11914 +3129,5685,370,5685,368,3131,5685,369,5685,370,3133,5685,369, 5691P 11915 +5685,371,3135,5685,372,5685,370,3137,5685,371,5685,372,3139, 5691P 11916 +5685,371,5685,373,3141,5685,374,5685,372,3143,5685,373,5685,374, 5691P 11917 +3145,5685,373,5685,375,3147,5685,376,5685,374,3149,5685,375, 5691P 11918 +5685,376,3151,5685,375,5685,353,3153,5685,355,5685,376,3155, 5691P 11919 +5685,377,5685,378,3157,5685,377,5685,379,3159,5685,380,5685,379, 5691P 11920 +3161,5685,378,5685,380,3163,5685,378,5685,381,3165,5685,382, 5691P 11921 +5685,380,3167,5685,381,5685,382,3169,5685,381,5685,383,3171, 5691P 11922 +5685,384,5685,382,3173,5685,383,5685,384,3175,5685,383,5685,385, 5691P 11923 +3177,5685,386,5685,384,3179,5685,385,5685,386,3181,5685,385, 5691P 11924 +5685,387,3183,5685,388,5685,386,3185,5685,387,5685,388,3187, 5691P 11925 +5685,387,5685,389,3189,5685,390,5685,388,3191,5685,389,5685,390, 5691P 11926 +3193,5685,389,5685,391,3195,5685,392,5685,390,3197,5685,391, 5691P 11927 +5685,392,3199,5685,391,5685,393,3201,5685,394,5685,392,3203, 5691P 11928 +5685,393,5685,394,3205,5685,393,5685,395,3207,5685,396,5685,394, 5691P 11929 +3209,5685,395,5685,396,3211,5685,395,5685,397,3213,5685,398, 5691P 11930 +5685,396,3215,5685,397,5685,398,3217,5685,397,5685,399,3219, 5691P 11931 +5685,400,5685,398,3221,5685,399,5685,400,3223,5685,399,5685,377, 5691P 11932 +3225,5685,379,5685,400,3227,5685,401,5685,402,3229,5685,401, 5691P 11933 +5685,403,3231,5685,404,5685,403,3233,5685,402,5685,404,3235, 5691P 11934 +5685,402,5685,405,3237,5685,406,5685,404,3239,5685,405,5685,406, 5691P 11935 +3241,5685,405,5685,407,3243,5685,408,5685,406,3245,5685,407, 5691P 11936 +5685,408,3247,5685,407,5685,409,3249,5685,410,5685,408,3251, 5691P 11937 +5685,409,5685,410,3253,5685,409,5685,411,3255,5685,412,5685,410, 5691P 11938 +3257,5685,411,5685,412,3259,5685,411,5685,413,3261,5685,414, 5691P 11939 +5685,412,3263,5685,413,5685,414,3265,5685,413,5685,415,3267, 5691P 11940 +5685,416,5685,414,3269,5685,415,5685,416,3271,5685,415,5685,417, 5691P 11941 +3273,5685,418,5685,416,3275,5685,417,5685,418,3277,5685,417, 5691P 11942 +5685,419,3279,5685,420,5685,418,3281,5685,419,5685,420,3283, 5691P 11943 +5685,419,5685,421,3285,5685,422,5685,420,3287,5685,421,5685,422, 5691P 11944 +3289,5685,421,5685,423,3291,5685,424,5685,422,3293,5685,423, 5691P 11945 +5685,424,3295,5685,423,5685,401,3297,5685,403,5685,424,3299, 5691P 11946 +5685,425,5685,426,3301,5685,425,5685,427,3303,5685,428,5685,427, 5691P 11947 +3305,5685,426,5685,428,3307,5685,426,5685,429,3309,5685,430, 5691P 11948 +5685,428,3311,5685,429,5685,430,3313,5685,429,5685,431,3315, 5691P 11949 +5685,432,5685,430,3317,5685,431,5685,432,3319,5685,431,5685,433, 5691P 11950 +3321,5685,434,5685,432,3323,5685,433,5685,434,3325,5685,433, 5691P 11951 +5685,435,3327,5685,436,5685,434,3329,5685,435,5685,436,3331, 5691P 11952 +5685,435,5685,437,3333,5685,438,5685,436,3335,5685,437,5685,438, 5691P 11953 +3337,5685,437,5685,439,3339,5685,440,5685,438,3341,5685,439, 5691P 11954 +5685,440,3343,5685,439,5685,441,3345,5685,442,5685,440,3347, 5691P 11955 +5685,441,5685,442,3349,5685,441,5685,443,3351,5685,444,5685,442, 5691P 11956 +3353,5685,443,5685,444,3355,5685,443,5685,445,3357,5685,446, 5691P 11957 +5685,444,3359,5685,445,5685,446,3361,5685,445,5685,447,3363, 5691P 11958 +5685,448,5685,446,3365,5685,447,5685,448,3367,5685,447,5685,425, 5691P 11959 +3369,5685,427,5685,448,3371,5685,449,5685,450,3373,5685,449, 5691P 11960 +5685,451,3375,5685,452,5685,451,3377,5685,450,5685,452,3379, 5691P 11961 +5685,450,5685,453,3381,5685,454,5685,452,3383,5685,453,5685,454, 5691P 11962 +3385,5685,453,5685,455,3387,5685,456,5685,454,3389,5685,455, 5691P 11963 +5685,456,3391,5685,455,5685,457,3393,5685,458,5685,456,3395, 5691P 11964 +5685,457,5685,458,3397,5685,457,5685,459,3399,5685,460,5685,458, 5691P 11965 +3401,5685,459,5685,460,3403,5685,459,5685,461,3405,5685,462, 5691P 11966 +5685,460,3407,5685,461,5685,462,3409,5685,461,5685,463,3411, 5691P 11967 +5685,464,5685,462,3413,5685,463,5685,464,3415,5685,463,5685,465, 5691P 11968 +3417,5685,466,5685,464,3419,5685,465,5685,466,3421,5685,465, 5691P 11969 +5685,467,3423,5685,468,5685,466,3425,5685,467,5685,468,3427, 5691P 11970 +5685,467,5685,469,3429,5685,470,5685,468,3431,5685,469,5685,470, 5691P 11971 +3433,5685,469,5685,471,3435,5685,472,5685,470,3437,5685,471, 5691P 11972 +5685,472,3439,5685,471,5685,449,3441,5685,451,5685,472,3443, 5691P 11973 +5685,473,5685,474,3445,5685,473,5685,475,3447,5685,476,5685,475, 5691P 11974 +3449,5685,474,5685,476,3451,5685,474,5685,477,3453,5685,478, 5691P 11975 +5685,476,3455,5685,477,5685,478,3457,5685,477,5685,479,3459, 5691P 11976 +5685,480,5685,478,3461,5685,479,5685,480,3463,5685,479,5685,481, 5691P 11977 +3465,5685,482,5685,480,3467,5685,481,5685,482,3469,5685,481, 5691P 11978 +5685,483,3471,5685,484,5685,482,3473,5685,483,5685,484,3475, 5691P 11979 +5685,483,5685,485,3477,5685,486,5685,484,3479,5685,485,5685,486, 5691P 11980 +3481,5685,485,5685,487,3483,5685,488,5685,486,3485,5685,487, 5691P 11981 +5685,488,3487,5685,487,5685,489,3489,5685,490,5685,488,3491, 5691P 11982 +5685,489,5685,490,3493,5685,489,5685,491,3495,5685,492,5685,490, 5691P 11983 +3497,5685,491,5685,492,3499,5685,491,5685,493,3501,5685,494, 5691P 11984 +5685,492,3503,5685,493,5685,494,3505,5685,493,5685,495,3507, 5691P 11985 +5685,496,5685,494,3509,5685,495,5685,496,3511,5685,495,5685,473, 5691P 11986 +3513,5685,475,5685,496,3515,5685,497,5685,498,3517,5685,497, 5691P 11987 +5685,499,3519,5685,500,5685,499,3521,5685,498,5685,500,3523, 5691P 11988 +5685,498,5685,501,3525,5685,502,5685,500,3527,5685,501,5685,502, 5691P 11989 +3529,5685,501,5685,503,3531,5685,504,5685,502,3533,5685,503, 5691P 11990 +5685,504,3535,5685,503,5685,505,3537,5685,506,5685,504,3539, 5691P 11991 +5685,505,5685,506,3541,5685,505,5685,507,3543,5685,508,5685,506, 5691P 11992 +3545,5685,507,5685,508,3547,5685,507,5685,509,3549,5685,510, 5691P 11993 +5685,508,3551,5685,509,5685,510,3553,5685,509,5685,511,3555, 5691P 11994 +5685,512,5685,510,3557,5685,511,5685,512,3559,5685,511,5685,513, 5691P 11995 +3561,5685,514,5685,512,3563,5685,513,5685,514,3565,5685,513, 5691P 11996 +5685,515,3567,5685,516,5685,514,3569,5685,515,5685,516,3571, 5691P 11997 +5685,515,5685,517,3573,5685,518,5685,516,3575,5685,517,5685,518, 5691P 11998 +3577,5685,517,5685,519,3579,5685,520,5685,518,3581,5685,519, 5691P 11999 +5685,520,3583,5685,519,5685,497,3585,5685,499,5685,520,3587, 5691P 12000 +5685,521,5685,522,3589,5685,521,5685,523,3591,5685,524,5685,523, 5691P 12001 +3593,5685,522,5685,524,3595,5685,522,5685,525,3597,5685,526, 5691P 12002 +5685,524,3599,5685,525,5685,526,3601,5685,525,5685,527,3603, 5691P 12003 +5685,528,5685,526,3605,5685,527,5685,528,3607,5685,527,5685,529, 5691P 12004 +3609,5685,530,5685,528,3611,5685,529,5685,530,3613,5685,529, 5691P 12005 +5685,531,3615,5685,532,5685,530,3617,5685,531,5685,532,3619, 5691P 12006 +5685,531,5685,533,3621,5685,534,5685,532,3623,5685,533,5685,534, 5691P 12007 +3625,5685,533,5685,535,3627,5685,536,5685,534,3629,5685,535, 5691P 12008 +5685,536,3631,5685,535,5685,537,3633,5685,538,5685,536,3635, 5691P 12009 +5685,537,5685,538,3637,5685,537,5685,539,3639,5685,540,5685,538, 5691P 12010 +3641,5685,539,5685,540,3643,5685,539,5685,541,3645,5685,542, 5691P 12011 +5685,540,3647,5685,541,5685,542,3649,5685,541,5685,543,3651, 5691P 12012 +5685,544,5685,542,3653,5685,543,5685,544,3655,5685,543,5685,521, 5691P 12013 +3657,5685,523,5685,544,3659,5685,545,5685,546,3661,5685,545, 5691P 12014 +5685,547,3663,5685,548,5685,547,3665,5685,546,5685,548,3667, 5691P 12015 +5685,546,5685,549,3669,5685,550,5685,548,3671,5685,549,5685,550, 5691P 12016 +3673,5685,549,5685,551,3675,5685,552,5685,550,3677,5685,551, 5691P 12017 +5685,552,3679,5685,551,5685,553,3681,5685,554,5685,552,3683, 5691P 12018 +5685,553,5685,554,3685,5685,553,5685,555,3687,5685,556,5685,554, 5691P 12019 +3689,5685,555,5685,556,3691,5685,555,5685,557,3693,5685,558, 5691P 12020 +5685,556,3695,5685,557,5685,558,3697,5685,557,5685,559,3699, 5691P 12021 +5685,560,5685,558,3701,5685,559,5685,560,3703,5685,559,5685,561, 5691P 12022 +3705,5685,562,5685,560,3707,5685,561,5685,562,3709,5685,561, 5691P 12023 +5685,563,3711,5685,564,5685,562,3713,5685,563,5685,564,3715, 5691P 12024 +5685,563,5685,565,3717,5685,566,5685,564,3719,5685,565,5685,566, 5691P 12025 +3721,5685,565,5685,567,3723,5685,568,5685,566,3725,5685,567, 5691P 12026 +5685,568,3727,5685,567,5685,545,3729,5685,547,5685,568,3731, 5691P 12027 +5685,569,5685,570,3733,5685,569,5685,571,3735,5685,572,5685,571, 5691P 12028 +3737,5685,570,5685,572,3739,5685,570,5685,573,3741,5685,574, 5691P 12029 +5685,572,3743,5685,573,5685,574,3745,5685,573,5685,575,3747, 5691P 12030 +5685,576,5685,574,3749,5685,575,5685,576,3751,5685,575,5685,577, 5691P 12031 +3753,5685,578,5685,576,3755,5685,577,5685,578,3757,5685,577, 5691P 12032 +5685,579,3759,5685,580,5685,578,3761,5685,579,5685,580,3763, 5691P 12033 +5685,579,5685,581,3765,5685,582,5685,580,3767,5685,581,5685,582, 5691P 12034 +3769,5685,581,5685,583,3771,5685,584,5685,582,3773,5685,583, 5691P 12035 +5685,584,3775,5685,583,5685,585,3777,5685,586,5685,584,3779, 5691P 12036 +5685,585,5685,586,3781,5685,585,5685,587,3783,5685,588,5685,586, 5691P 12037 +3785,5685,587,5685,588,3787,5685,587,5685,589,3789,5685,590, 5691P 12038 +5685,588,3791,5685,589,5685,590,3793,5685,589,5685,591,3795, 5691P 12039 +5685,592,5685,590,3797,5685,591,5685,592,3799,5685,591,5685,569, 5691P 12040 +3801,5685,571,5685,592,3803,5685,593,5685,594,3805,5685,594, 5691P 12041 +5685,595,3807,5685,596,5685,595,3809,5685,593,5685,596,3811, 5691P 12042 +5685,597,5685,593,3813,5685,598,5685,596,3815,5685,597,5685,598, 5691P 12043 +3817,5685,599,5685,597,3819,5685,600,5685,598,3821,5685,599, 5691P 12044 +5685,600,3823,5685,601,5685,599,3825,5685,602,5685,600,3827, 5691P 12045 +5685,601,5685,602,3829,5685,603,5685,601,3831,5685,604,5685,602, 5691P 12046 +3833,5685,603,5685,604,3835,5685,605,5685,603,3837,5685,606, 5691P 12047 +5685,604,3839,5685,605,5685,606,3841,5685,607,5685,605,3843, 5691P 12048 +5685,608,5685,606,3845,5685,607,5685,608,3847,5685,609,5685,607, 5691P 12049 +3849,5685,610,5685,608,3851,5685,609,5685,610,3853,5685,594, 5691P 12050 +5685,609,3855,5685,595,5685,610; 5691P 12051 +504,195,3857,5687,1,5687,2,3859,5687,1,5687,3,3861,5687,3,5687, 5693P 12052 +4,3863,5687,2,5687,4,3865,5687,5,5687,1,3867,5687,5,5687,6,3869, 5693P 12053 +5687,6,5687,3,3871,5687,7,5687,5,3873,5687,7,5687,8,3875,5687,8, 5693P 12054 +5687,6,3877,5687,9,5687,7,3879,5687,9,5687,10,3881,5687,10,5687, 5693P 12055 +8,3883,5687,11,5687,9,3885,5687,11,5687,12,3887,5687,12,5687,10, 5693P 12056 +3889,5687,2,5687,11,3891,5687,4,5687,12,3893,5687,13,5687,14, 5693P 12057 +3895,5687,13,5687,15,3897,5687,16,5687,15,3899,5687,14,5687,16, 5693P 12058 +3901,5687,14,5687,13,3903,5687,15,5687,16,3905,5687,17,5687,18, 5693P 12059 +3907,5687,17,5687,19,3909,5687,20,5687,19,3911,5687,18,5687,20, 5693P 12060 +3913,5687,18,5687,17,3915,5687,19,5687,20,3917,5687,21,5687,22, 5693P 12061 +3919,5687,23,5687,21,3921,5687,23,5687,24,3923,5687,22,5687,24, 5693P 12062 +3925,5687,25,5687,26,3927,5687,26,5687,27,3929,5687,27,5687,28, 5693P 12063 +3931,5687,28,5687,25,3933,5687,29,5687,30,3935,5687,30,5687,31, 5693P 12064 +3937,5687,32,5687,31,3939,5687,32,5687,29,3941,5687,33,5687,34, 5693P 12065 +3943,5687,35,5687,34,3945,5687,35,5687,36,3947,5687,33,5687,36, 5693P 12066 +3949,5687,37,5687,29,3951,5687,21,5687,32,3953,5687,38,5687,22, 5693P 12067 +3955,5687,37,5687,38,3957,5687,39,5687,25,3959,5687,28,5687,40, 5693P 12068 +3961,5687,39,5687,40,3963,5687,34,5687,41,3965,5687,41,5687,42, 5693P 12069 +3967,5687,42,5687,35,3969,5687,43,5687,44,3971,5687,44,5687,45, 5693P 12070 +3973,5687,45,5687,46,3975,5687,46,5687,43,3977,5687,47,5687,48, 5693P 12071 +3979,5687,49,5687,48,3981,5687,49,5687,50,3983,5687,47,5687,50, 5693P 12072 +3985,5687,44,5687,51,3987,5687,52,5687,51,3989,5687,52,5687,45, 5693P 12073 +3991,5687,53,5687,54,3993,5687,53,5687,55,3995,5687,56,5687,55, 5693P 12074 +3997,5687,54,5687,56,3999,5687,54,5687,53,4001,5687,55,5687,56, 5693P 12075 +4003,5687,57,5687,58,4005,5687,57,5687,59,4007,5687,60,5687,59, 5693P 12076 +4009,5687,58,5687,60,4011,5687,58,5687,57,4013,5687,59,5687,60, 5693P 12077 +4015,5687,61,5687,62,4017,5687,61,5687,63,4019,5687,64,5687,63, 5693P 12078 +4021,5687,62,5687,64,4023,5687,62,5687,61,4025,5687,63,5687,64, 5693P 12079 +4027,5687,65,5687,66,4029,5687,65,5687,67,4031,5687,68,5687,67, 5693P 12080 +4033,5687,66,5687,68,4035,5687,66,5687,65,4037,5687,67,5687,68, 5693P 12081 +4039,5687,46,5687,69,4041,5687,46,5687,70,4043,5687,71,5687,70, 5693P 12082 +4045,5687,69,5687,71,4047,5687,52,5687,72,4049,5687,72,5687,73, 5693P 12083 +4051,5687,74,5687,73,4053,5687,70,5687,74,4055,5687,75,5687,76, 5693P 12084 +4057,5687,77,5687,75,4059,5687,43,5687,77,4061,5687,78,5687,69, 5693P 12085 +4063,5687,78,5687,79,4065,5687,79,5687,80,4067,5687,80,5687,81, 5693P 12086 +4069,5687,82,5687,81,4071,5687,82,5687,42,4073,5687,83,5687,41, 5693P 12087 +4075,5687,24,5687,83,4077,5687,31,5687,23,4079,5687,27,5687,30, 5693P 12088 +4081,5687,76,5687,26,4083,5687,82,5687,84,4085,5687,85,5687,84, 5693P 12089 +4087,5687,42,5687,85,4089,5687,86,5687,82,4091,5687,87,5687,86, 5693P 12090 +4093,5687,87,5687,88,4095,5687,88,5687,89,4097,5687,90,5687,89, 5693P 12091 +4099,5687,84,5687,90,4101,5687,89,5687,91,4103,5687,92,5687,88, 5693P 12092 +4105,5687,92,5687,91,4107,5687,73,5687,93,4109,5687,94,5687,72, 5693P 12093 +4111,5687,94,5687,93,4113,5687,87,5687,95,4115,5687,94,5687,95, 5693P 12094 +4117,5687,96,5687,51,4119,5687,97,5687,96,4121,5687,97,5687,33, 5693P 12095 +4123,5687,92,5687,36,4125,5687,98,5687,85,4127,5687,91,5687,98, 5693P 12096 +4129,5687,99,5687,71,4131,5687,93,5687,99,4133,5687,100,5687,95, 5693P 12097 +4135,5687,69,5687,100,4137,5687,81,5687,101,4139,5687,101,5687, 5693P 12098 +86,4141,5687,101,5687,102,4143,5687,102,5687,103,4145,5687,103, 5693P 12099 +5687,104,4147,5687,100,5687,104,4149,5687,104,5687,78,4151,5687, 5693P 12100 +79,5687,103,4153,5687,80,5687,102,4155,5687,76,5687,47,4157, 5693P 12101 +5687,50,5687,75,4159,5687,105,5687,106,4161,5687,105,5687,38, 5693P 12102 +4163,5687,106,5687,83,4165,5687,107,5687,105,4167,5687,107,5687, 5693P 12103 +37,4169,5687,108,5687,107,4171,5687,108,5687,40,4173,5687,109, 5693P 12104 +5687,108,4175,5687,109,5687,39,4177,5687,110,5687,109,4179,5687, 5693P 12105 +110,5687,48,4181,5687,111,5687,110,4183,5687,111,5687,49,4185, 5693P 12106 +5687,96,5687,111,4187,5687,106,5687,97,4189,5687,112,5687,113, 5693P 12107 +4191,5687,113,5687,114,4193,5687,114,5687,115,4195,5687,115, 5693P 12108 +5687,116,4197,5687,116,5687,117,4199,5687,117,5687,118,4201, 5693P 12109 +5687,118,5687,119,4203,5687,119,5687,120,4205,5687,120,5687,112, 5693P 12110 +4207,5687,113,5687,121,4209,5687,122,5687,121,4211,5687,114, 5693P 12111 +5687,122,4213,5687,123,5687,122,4215,5687,115,5687,123,4217, 5693P 12112 +5687,124,5687,123,4219,5687,116,5687,124,4221,5687,125,5687,124, 5693P 12113 +4223,5687,117,5687,125,4225,5687,126,5687,125,4227,5687,118, 5693P 12114 +5687,126,4229,5687,127,5687,126,4231,5687,119,5687,127,4233, 5693P 12115 +5687,128,5687,127,4235,5687,120,5687,128,4237,5687,90,5687,99, 5693P 12116 +4239,5687,129,5687,98,4241,5687,112,5687,129,4243,5687,74,5687, 5693P 12117 +128,4245,5687,121,5687,129; 5693P 12118 +504,258,4247,5689,1,5689,2,4249,5689,2,5689,3,4251,5689,3,5689, 5695P 12119 +4,4253,5689,4,5689,1,4255,5689,2,5689,5,4257,5689,6,5689,5,4259, 5695P 12120 +5689,6,5689,7,4261,5689,8,5689,7,4263,5689,8,5689,9,4265,5689,9, 5695P 12121 +5689,10,4267,5689,10,5689,3,4269,5689,11,5689,12,4271,5689,13, 5695P 12122 +5689,12,4273,5689,13,5689,14,4275,5689,15,5689,14,4277,5689,16, 5695P 12123 +5689,15,4279,5689,16,5689,17,4281,5689,17,5689,18,4283,5689,19, 5695P 12124 +5689,18,4285,5689,19,5689,20,4287,5689,6,5689,20,4289,5689,11, 5695P 12125 +5689,5,4291,5689,21,5689,22,4293,5689,23,5689,21,4295,5689,23, 5695P 12126 +5689,19,4297,5689,24,5689,18,4299,5689,25,5689,24,4301,5689,22, 5695P 12127 +5689,25,4303,5689,26,5689,27,4305,5689,28,5689,26,4307,5689,28, 5695P 12128 +5689,11,4309,5689,27,5689,1,4311,5689,24,5689,29,4313,5689,29, 5695P 12129 +5689,30,4315,5689,30,5689,25,4317,5689,31,5689,23,4319,5689,32, 5695P 12130 +5689,21,4321,5689,33,5689,32,4323,5689,34,5689,33,4325,5689,34, 5695P 12131 +5689,35,4327,5689,36,5689,35,4329,5689,36,5689,37,4331,5689,37, 5695P 12132 +5689,28,4333,5689,38,5689,26,4335,5689,38,5689,31,4337,5689,22, 5695P 12133 +5689,39,4339,5689,39,5689,38,4341,5689,27,5689,40,4343,5689,40, 5695P 12134 +5689,36,4345,5689,35,5689,41,4347,5689,41,5689,42,4349,5689,42, 5695P 12135 +5689,43,4351,5689,43,5689,44,4353,5689,44,5689,45,4355,5689,45, 5695P 12136 +5689,46,4357,5689,46,5689,47,4359,5689,47,5689,32,4361,5689,48, 5695P 12137 +5689,49,4363,5689,49,5689,48,4365,5689,50,5689,51,4367,5689,51, 5695P 12138 +5689,50,4369,5689,52,5689,53,4371,5689,53,5689,52,4373,5689,54, 5695P 12139 +5689,55,4375,5689,55,5689,54,4377,5689,56,5689,57,4379,5689,57, 5695P 12140 +5689,56,4381,5689,58,5689,59,4383,5689,59,5689,58,4385,5689,60, 5695P 12141 +5689,61,4387,5689,60,5689,62,4389,5689,62,5689,63,4391,5689,61, 5695P 12142 +5689,63,4393,5689,64,5689,60,4395,5689,64,5689,65,4397,5689,65, 5695P 12143 +5689,62,4399,5689,66,5689,64,4401,5689,66,5689,67,4403,5689,67, 5695P 12144 +5689,65,4405,5689,68,5689,66,4407,5689,68,5689,69,4409,5689,69, 5695P 12145 +5689,67,4411,5689,70,5689,68,4413,5689,70,5689,71,4415,5689,71, 5695P 12146 +5689,69,4417,5689,72,5689,70,4419,5689,72,5689,73,4421,5689,73, 5695P 12147 +5689,71,4423,5689,74,5689,72,4425,5689,74,5689,75,4427,5689,75, 5695P 12148 +5689,73,4429,5689,76,5689,74,4431,5689,76,5689,77,4433,5689,77, 5695P 12149 +5689,75,4435,5689,61,5689,76,4437,5689,63,5689,77,4439,5689,78, 5695P 12150 +5689,79,4441,5689,78,5689,80,4443,5689,80,5689,81,4445,5689,79, 5695P 12151 +5689,81,4447,5689,82,5689,78,4449,5689,82,5689,83,4451,5689,83, 5695P 12152 +5689,80,4453,5689,84,5689,82,4455,5689,84,5689,85,4457,5689,85, 5695P 12153 +5689,83,4459,5689,86,5689,84,4461,5689,86,5689,87,4463,5689,87, 5695P 12154 +5689,85,4465,5689,88,5689,86,4467,5689,88,5689,89,4469,5689,89, 5695P 12155 +5689,87,4471,5689,90,5689,88,4473,5689,90,5689,91,4475,5689,91, 5695P 12156 +5689,89,4477,5689,92,5689,90,4479,5689,92,5689,93,4481,5689,93, 5695P 12157 +5689,91,4483,5689,94,5689,92,4485,5689,94,5689,95,4487,5689,95, 5695P 12158 +5689,93,4489,5689,96,5689,94,4491,5689,96,5689,97,4493,5689,97, 5695P 12159 +5689,95,4495,5689,98,5689,96,4497,5689,98,5689,99,4499,5689,99, 5695P 12160 +5689,97,4501,5689,100,5689,98,4503,5689,100,5689,101,4505,5689, 5695P 12161 +101,5689,99,4507,5689,102,5689,100,4509,5689,102,5689,103,4511, 5695P 12162 +5689,103,5689,101,4513,5689,104,5689,102,4515,5689,104,5689,105, 5695P 12163 +4517,5689,105,5689,103,4519,5689,106,5689,104,4521,5689,106, 5695P 12164 +5689,107,4523,5689,107,5689,105,4525,5689,108,5689,106,4527, 5695P 12165 +5689,108,5689,109,4529,5689,109,5689,107,4531,5689,110,5689,108, 5695P 12166 +4533,5689,110,5689,111,4535,5689,111,5689,109,4537,5689,112, 5695P 12167 +5689,110,4539,5689,112,5689,113,4541,5689,113,5689,111,4543, 5695P 12168 +5689,79,5689,112,4545,5689,81,5689,113,4547,5689,114,5689,115, 5695P 12169 +4549,5689,116,5689,114,4551,5689,117,5689,116,4553,5689,118, 5695P 12170 +5689,117,4555,5689,118,5689,1,4557,5689,4,5689,119,4559,5689, 5695P 12171 +119,5689,120,4561,5689,120,5689,121,4563,5689,122,5689,121,4565, 5695P 12172 +5689,122,5689,25,4567,5689,123,5689,30,4569,5689,124,5689,123, 5695P 12173 +4571,5689,125,5689,124,4573,5689,126,5689,125,4575,5689,127, 5695P 12174 +5689,126,4577,5689,128,5689,127,4579,5689,129,5689,128,4581, 5695P 12175 +5689,115,5689,129,4583,5689,130,5689,131,4585,5689,131,5689,130, 5695P 12176 +4587,5689,132,5689,133,4589,5689,133,5689,132,4591,5689,134, 5695P 12177 +5689,135,4593,5689,135,5689,134,4595,5689,136,5689,137,4597, 5695P 12178 +5689,137,5689,136,4599,5689,138,5689,139,4601,5689,139,5689,138, 5695P 12179 +4603,5689,140,5689,141,4605,5689,141,5689,140,4607,5689,141, 5695P 12180 +5689,58,4609,5689,140,5689,59,4611,5689,139,5689,56,4613,5689, 5695P 12181 +138,5689,57,4615,5689,142,5689,143,4617,5689,125,5689,142,4619, 5695P 12182 +5689,143,5689,124,4621,5689,144,5689,129,4623,5689,128,5689,145, 5695P 12183 +4625,5689,145,5689,144,4627,5689,146,5689,127,4629,5689,147, 5695P 12184 +5689,126,4631,5689,147,5689,146,4633,5689,17,5689,29,4635,5689, 5695P 12185 +148,5689,146,4637,5689,142,5689,147,4639,5689,149,5689,143,4641, 5695P 12186 +5689,148,5689,149,4643,5689,150,5689,144,4645,5689,145,5689,151, 5695P 12187 +4647,5689,150,5689,151,4649,5689,117,5689,152,4651,5689,152, 5695P 12188 +5689,153,4653,5689,153,5689,118,4655,5689,154,5689,155,4657, 5695P 12189 +5689,156,5689,155,4659,5689,156,5689,157,4661,5689,154,5689,157, 5695P 12190 +4663,5689,152,5689,14,4665,5689,13,5689,153,4667,5689,137,5689, 5695P 12191 +54,4669,5689,136,5689,55,4671,5689,135,5689,52,4673,5689,134, 5695P 12192 +5689,53,4675,5689,133,5689,50,4677,5689,132,5689,51,4679,5689, 5695P 12193 +131,5689,48,4681,5689,130,5689,49,4683,5689,118,5689,40,4685, 5695P 12194 +5689,12,5689,37,4687,5689,122,5689,39,4689,5689,7,5689,122,4691, 5695P 12195 +5689,20,5689,31,4693,5689,121,5689,8,4695,5689,119,5689,10,4697, 5695P 12196 +5689,120,5689,9,4699,5689,115,5689,154,4701,5689,157,5689,114, 5695P 12197 +4703,5689,158,5689,159,4705,5689,158,5689,149,4707,5689,159, 5695P 12198 +5689,123,4709,5689,160,5689,158,4711,5689,160,5689,148,4713, 5695P 12199 +5689,161,5689,160,4715,5689,161,5689,151,4717,5689,162,5689,161, 5695P 12200 +4719,5689,162,5689,150,4721,5689,163,5689,162,4723,5689,163, 5695P 12201 +5689,155,4725,5689,164,5689,163,4727,5689,164,5689,156,4729, 5695P 12202 +5689,15,5689,164,4731,5689,159,5689,16,4733,5689,33,5689,165, 5695P 12203 +4735,5689,165,5689,166,4737,5689,166,5689,167,4739,5689,167, 5695P 12204 +5689,168,4741,5689,168,5689,169,4743,5689,169,5689,170,4745, 5695P 12205 +5689,170,5689,171,4747,5689,171,5689,34,4749,5689,165,5689,47, 5695P 12206 +4751,5689,166,5689,46,4753,5689,167,5689,45,4755,5689,168,5689, 5695P 12207 +44,4757,5689,169,5689,43,4759,5689,170,5689,42,4761,5689,171, 5695P 12208 +5689,41; 5695P 12209 +406,1,5Hplate; 5697P 12210 +406,1,4Hleft; 5699P 12211 +406,1,5Hright; 5701P 12212 +314,96.078431372549,96.078431372549,96.4705882352941,25HAluminum 5703P 12213 + - Brushed Linear; 5703P 12214 +314,85.8823529411765,74.5098039215686,60.3921568627451,18H3D Oak 5705P 12215 + - Semigloss; 5705P 12216 +314,62.7450980392157,62.7450980392157,62.7450980392157,13HSteel 5707P 12217 +- Satin; 5707P 12218 +S 1G 3D 5708P 12218 T 1 diff --git a/keyboards/lets_split/imgs/letssplitv2.svg b/keyboards/lets_split/imgs/letssplitv2.svg new file mode 100644 index 00000000..d33706df --- /dev/null +++ b/keyboards/lets_split/imgs/letssplitv2.svg @@ -0,0 +1,4077 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/keyboards/lets_split/imgs/plate.stl b/keyboards/lets_split/imgs/plate.stl new file mode 100644 index 00000000..c8e36adc Binary files /dev/null and b/keyboards/lets_split/imgs/plate.stl differ diff --git a/keyboards/lets_split/imgs/right.stl b/keyboards/lets_split/imgs/right.stl new file mode 100644 index 00000000..31c7aeb6 Binary files /dev/null and b/keyboards/lets_split/imgs/right.stl differ diff --git a/keyboards/lets_split/keymaps/OLED_sample/Makefile b/keyboards/lets_split/keymaps/OLED_sample/Makefile new file mode 100644 index 00000000..90616d1f --- /dev/null +++ b/keyboards/lets_split/keymaps/OLED_sample/Makefile @@ -0,0 +1,25 @@ + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +ONEHAND_ENABLE = no # Enable one-hand typing + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/lets_split/keymaps/OLED_sample/config.h b/keyboards/lets_split/keymaps/OLED_sample/config.h new file mode 100644 index 00000000..353ea368 --- /dev/null +++ b/keyboards/lets_split/keymaps/OLED_sample/config.h @@ -0,0 +1,45 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#define USE_I2C +//#define USE_SERIAL +//#define MASTER_RIGHT +#define FLIP_HALF + +#define SSD1306OLED + + +#define PREVENT_STUCK_MODIFIERS +#define TAPPING_FORCE_HOLD +#define TAPPING_TERM 100 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 6 +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + + + + +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" +#endif \ No newline at end of file diff --git a/keyboards/lets_split/keymaps/default/keymap.c b/keyboards/lets_split/keymaps/OLED_sample/keymap.c similarity index 69% rename from keyboards/lets_split/keymaps/default/keymap.c rename to keyboards/lets_split/keymaps/OLED_sample/keymap.c index 0d2d94b6..072b825a 100644 --- a/keyboards/lets_split/keymaps/default/keymap.c +++ b/keyboards/lets_split/keymaps/OLED_sample/keymap.c @@ -1,9 +1,18 @@ #include "lets_split.h" +#include "bootloader.h" #include "action_layer.h" #include "eeconfig.h" +#include "tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/Peripheral/TWI.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif extern keymap_config_t keymap_config; +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; + + // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them @@ -22,11 +31,27 @@ enum custom_keycodes { LOWER, RAISE, ADJUST, + BACKLIT, + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL, +}; + +enum macro_keycodes { + KC_SAMPLEMACRO, }; + // Fillers to make layering more clear #define _______ KC_TRNS #define XXXXXXX KC_NO +//Macros +#define M_SAMPLE M(KC_SAMPLEMACRO) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -132,7 +157,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ADJUST] = KEYMAP( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, RESET, _______, M_SAMPLE, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ @@ -141,17 +166,38 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; + #ifdef AUDIO_ENABLE + +float tone_startup[][2] = SONG(STARTUP_SOUND); float tone_qwerty[][2] = SONG(QWERTY_SOUND); float tone_dvorak[][2] = SONG(DVORAK_SOUND); float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_plover[][2] = SONG(PLOVER_SOUND); +float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); #endif +// define variables for reactive RGB +bool TOG_STATUS = false; +int RGB_current_mode; + void persistant_default_layer_set(uint16_t default_layer) { eeconfig_update_default_layer(default_layer); default_layer_set(default_layer); } +// Setting ADJUST layer RGB back to default +void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { + rgblight_mode(RGB_current_mode); + layer_on(layer3); + } else { + layer_off(layer3); + } +} + bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: @@ -183,32 +229,128 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { break; case LOWER: if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + rgblight_mode(16); + } layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); } else { + rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change + TOG_STATUS = false; layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); } return false; break; case RAISE: if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + rgblight_mode(15); + } layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); } else { + rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); + TOG_STATUS = false; + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); } return false; break; - case ADJUST: + case BACKLIT: if (record->event.pressed) { - layer_on(_ADJUST); + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif } else { - layer_off(_ADJUST); + unregister_code(KC_RSFT); + } + return false; + break; + //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released + case RGB_MOD: + if (record->event.pressed) { + rgblight_mode(RGB_current_mode); + rgblight_step(); + RGB_current_mode = rgblight_config.mode; } return false; break; } return true; -} \ No newline at end of file +} + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif + RGB_current_mode = rgblight_config.mode; +} + +//SSD1306 OLED init and update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED +void matrix_master_OLED_init (void) { + TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); + iota_gfx_init(); // turns on the display +} + +void matrix_scan_user(void) { + iota_gfx_task(); // this is what updates the display continuously +} +#endif + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif + +/* + * Macro definition + */ +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + + switch (id) { + case KC_SAMPLEMACRO: + if (record->event.pressed){ + return MACRO (I(10), T(H), T(E), T(L), T(L), T(O), T(SPACE), T(W), T(O), T(R), T(L), T(D), END); + } + + } + + return MACRO_NONE; +} diff --git a/keyboards/lets_split/keymaps/OLED_sample/readme.md b/keyboards/lets_split/keymaps/OLED_sample/readme.md new file mode 100644 index 00000000..02888855 --- /dev/null +++ b/keyboards/lets_split/keymaps/OLED_sample/readme.md @@ -0,0 +1,25 @@ +SSD1306 OLED Display via I2C +====== + +Features +-------- + +Some features supported by the firmware: + + +* I2C connection between the two halves is required as the OLED display will use this connection as well. Note this + requires pull-up resistors on the data and clock lines. +* OLED display will connect from either side + + +Wiring +------ + + +Work in progress... + + +OLED Configuration +------------------------------- + +Work in progress... diff --git a/keyboards/lets_split/keymaps/hexwire/Makefile b/keyboards/lets_split/keymaps/hexwire/Makefile new file mode 100644 index 00000000..1e576127 --- /dev/null +++ b/keyboards/lets_split/keymaps/hexwire/Makefile @@ -0,0 +1,5 @@ +RGBLIGHT_ENABLE = yes + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/lets_split/keymaps/hexwire/README.md b/keyboards/lets_split/keymaps/hexwire/README.md new file mode 100644 index 00000000..edf2b662 --- /dev/null +++ b/keyboards/lets_split/keymaps/hexwire/README.md @@ -0,0 +1,108 @@ +Hexwire's Let's Split Layout +============================ + +### Changes from default layout + +- Main layer + - The right space bar key has been changed to backspace, as I only hit space with my left thumb + - Backtick is at the lower right and also serves goes to the 3rd function layer when held + - Enter key acts as shift when held + - Escape key acts as control when held + - Minus key at upper right +- Lower layer + - Numbers are on the lower layer, to make it easier to use a numpad on the right hand + - Arrow keys + - Straight and curly brackets in the middle two columns + - Screenshot keys for MacOS +- Upper layer + - Symbols are on the upper layer + - Media keys + - Page Up/Down, Home/End +- 3rd function layer + - Function keys + +## Layouts + +### Qwerty + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS, +|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, +|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, X4 , +|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Colemak + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,MINS, +|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , R , S , T , D , H , N , E , I , O ,QUOT, +|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , K , M ,COMM,DOT ,SLSH, X4 , +|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Dvorak + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS, +|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , O , E , U , I , D , H , R , N , S ,SLSH, +|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT,SCLN, Q , J , K , X , B , M , W , V , Z , X4 , +|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Lower + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , +|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL ,CAPP,LEFT,RGHT, UP ,LBRC, RBRC, P4 , P5 , P6 ,PLUS,PIPE, +|----+----+----+----+----+----| |----+----+----+----+----+----| + ,CPYP, , ,DOWN,LCBR, RCBR, P1 , P2 , P3 ,MINS, , +|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , DEL , , P0 ,PDOT, , +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Raise + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, , +|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, EQL ,HOME, , , ,BSLS, +|----+----+----+----+----+----| |----+----+----+----+----+----| + MUTE,MSTP,MPLY,VOLD,PGDN,MINS, PLUS,END , , , , , +|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### 3rd function layer + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , +|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , , +|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , , +|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` diff --git a/keyboards/lets_split/keymaps/hexwire/config.h b/keyboards/lets_split/keymaps/hexwire/config.h new file mode 100644 index 00000000..9c8c6d7f --- /dev/null +++ b/keyboards/lets_split/keymaps/hexwire/config.h @@ -0,0 +1,70 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + + +#define USE_SERIAL + +#define TAPPING_TERM 150 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 8 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 + +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" + #define COMPACT_KEYMAP( \ + k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \ + k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \ + k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \ + k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \ + ) \ + { \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05 }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15 }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25 }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35 }, \ + { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45 }, \ + { KC_##k50, KC_##k51, KC_##k52, KC_##k53, KC_##k54, KC_##k55 }, \ + { KC_##k60, KC_##k61, KC_##k62, KC_##k63, KC_##k64, KC_##k65 }, \ + { KC_##k70, KC_##k71, KC_##k72, KC_##k73, KC_##k74, KC_##k75 } \ + } +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" + #define COMPACT_KEYMAP( \ + k00, k01, k02, k03, k04, k05, k45, k44, k43, k42, k41, k40, \ + k10, k11, k12, k13, k14, k15, k55, k54, k53, k52, k51, k50, \ + k20, k21, k22, k23, k24, k25, k65, k64, k63, k62, k61, k60, \ + k30, k31, k32, k33, k34, k35, k75, k74, k73, k72, k71, k70 \ + ) \ + { \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05 }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15 }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25 }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35 }, \ + { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45 }, \ + { KC_##k50, KC_##k51, KC_##k52, KC_##k53, KC_##k54, KC_##k55 }, \ + { KC_##k60, KC_##k61, KC_##k62, KC_##k63, KC_##k64, KC_##k65 }, \ + { KC_##k70, KC_##k71, KC_##k72, KC_##k73, KC_##k74, KC_##k75 } \ + } +#endif +#ifdef SUBPROJECT_rev2fliphalf + #include "../../rev2fliphalf/config.h" +#endif diff --git a/keyboards/lets_split/keymaps/hexwire/keymap.c b/keyboards/lets_split/keymaps/hexwire/keymap.c new file mode 100644 index 00000000..f8370490 --- /dev/null +++ b/keyboards/lets_split/keymaps/hexwire/keymap.c @@ -0,0 +1,205 @@ +#include "lets_split.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _FN3 5 +#define _FN4 6 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + FN3, + FN4, + ADJUST, +}; + +#define KC_ KC_TRNS +#define _______ KC_TRNS + +#define KC_CAPW LGUI(LSFT(KC_3)) // Capture whole screen +#define KC_CPYW LGUI(LSFT(LCTL(KC_3))) // Copy whole screen +#define KC_CAPP LGUI(LSFT(KC_4)) // Capture portion of screen +#define KC_CPYP LGUI(LSFT(LCTL(KC_4))) // Copy portion of screen +#define KC_X0 MT(MOD_LCTL, KC_ESC) +#define KC_X1 LOWER +#define KC_X2 RAISE +#define KC_X3 LT(_FN3, KC_GRV) +#define KC_X4 MT(MOD_LSFT, KC_ENT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, X4 , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), + + [_COLEMAK] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , R , S , T , D , H , N , E , I , O ,QUOT, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , K , M ,COMM,DOT ,SLSH, X4 , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), + + [_DVORAK] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , O , E , U , I , D , H , R , N , S ,SLSH, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT,SCLN, Q , J , K , X , B , M , W , V , Z , X4 , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), + + [_LOWER] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL ,CAPP,LEFT,RGHT, UP ,LBRC, RBRC, P4 , P5 , P6 ,PLUS,PIPE, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,CPYP, , ,DOWN,LCBR, RCBR, P1 , P2 , P3 ,MINS, , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , DEL , , P0 ,PDOT, , + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), + + [_RAISE] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, EQL ,HOME, , , ,BSLS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + MUTE,MSTP,MPLY,VOLD,PGDN,MINS, PLUS,END , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), + + [_FN3] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ + [_ADJUST] = KEYMAP( \ + _______, RESET , RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, _______, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) + + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/lets_split/keymaps/i2c/config.h b/keyboards/lets_split/keymaps/i2c/config.h index 2671fabf..01354273 100644 --- a/keyboards/lets_split/keymaps/i2c/config.h +++ b/keyboards/lets_split/keymaps/i2c/config.h @@ -14,89 +14,18 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ - -#ifndef CONFIG_H -#define CONFIG_H - -#include "config_common.h" - -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x3060 -#define DEVICE_VER 0x0001 -#define MANUFACTURER Wootpatoot -#define PRODUCT Lets Split -#define DESCRIPTION A split keyboard for the cheap makers - -/* key matrix size */ -// Rows are doubled-up -#define MATRIX_ROWS 8 -#define MATRIX_COLS 6 - -// wiring of each half -#define MATRIX_ROW_PINS { B5, B4, E6, D7 } -#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 } - -#define CATERINA_BOOTLOADER - #define USE_I2C -// Use serial if not using I2C -#ifndef USE_I2C -# define USE_SERIAL -#endif - +#define MASTER_LEFT +// #define _MASTER_RIGHT // #define EE_HANDS -#define I2C_MASTER_LEFT -// #define I2C_MASTER_RIGHT - -/* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW - -/* define if matrix has ghost */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ -// #define BACKLIGHT_LEVELS 3 - -/* Set 0 if debouncing isn't needed */ -#define DEBOUNCING_DELAY 5 - -/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ -#define LOCKING_SUPPORT_ENABLE -/* Locking resynchronize hack */ -#define LOCKING_RESYNC_ENABLE - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - -/* ws2812 RGB LED */ -#define RGB_DI_PIN D4 -#define RGBLIGHT_TIMER -#define RGBLED_NUM 8 // Number of LEDs -#define RGBLIGHT_HUE_STEP 10 -#define RGBLIGHT_SAT_STEP 17 -#define RGBLIGHT_VAL_STEP 17 - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ -// #define NO_DEBUG - -/* disable print */ -// #define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT -//#define NO_ACTION_MACRO -//#define NO_ACTION_FUNCTION - +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" +#endif +#ifdef SUBPROJECT_rev2fliphalf + #include "../../rev2fliphalf/config.h" #endif diff --git a/keyboards/lets_split/keymaps/serial/config.h b/keyboards/lets_split/keymaps/serial/config.h index f4d900ac..ba271d1a 100644 --- a/keyboards/lets_split/keymaps/serial/config.h +++ b/keyboards/lets_split/keymaps/serial/config.h @@ -15,88 +15,20 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CONFIG_H -#define CONFIG_H -#include "config_common.h" - -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x3060 -#define DEVICE_VER 0x0001 -#define MANUFACTURER Wootpatoot -#define PRODUCT Lets Split -#define DESCRIPTION A split keyboard for the cheap makers - -/* key matrix size */ -// Rows are doubled-up -#define MATRIX_ROWS 8 -#define MATRIX_COLS 6 - -// wiring of each half -#define MATRIX_ROW_PINS { B5, B4, E6, D7 } -#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 } - -#define CATERINA_BOOTLOADER - -// #define USE_I2C - -// Use serial if not using I2C -#ifndef USE_I2C -# define USE_SERIAL -#endif +#define USE_SERIAL +#define MASTER_LEFT +// #define _MASTER_RIGHT // #define EE_HANDS -#define I2C_MASTER_LEFT -// #define I2C_MASTER_RIGHT - -/* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW - -/* define if matrix has ghost */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ -// #define BACKLIGHT_LEVELS 3 - -/* Set 0 if debouncing isn't needed */ -#define DEBOUNCING_DELAY 5 - -/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ -#define LOCKING_SUPPORT_ENABLE -/* Locking resynchronize hack */ -#define LOCKING_RESYNC_ENABLE - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - -/* ws2812 RGB LED */ -#define RGB_DI_PIN D4 -#define RGBLIGHT_TIMER -#define RGBLED_NUM 8 // Number of LEDs -#define RGBLIGHT_HUE_STEP 10 -#define RGBLIGHT_SAT_STEP 17 -#define RGBLIGHT_VAL_STEP 17 - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ -// #define NO_DEBUG - -/* disable print */ -// #define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT -//#define NO_ACTION_MACRO -//#define NO_ACTION_FUNCTION +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" +#endif +#ifdef SUBPROJECT_rev2fliphalf + #include "../../rev2fliphalf/config.h" #endif diff --git a/keyboards/lets_split/keymaps/smt/config.h b/keyboards/lets_split/keymaps/smt/config.h new file mode 100644 index 00000000..ba271d1a --- /dev/null +++ b/keyboards/lets_split/keymaps/smt/config.h @@ -0,0 +1,34 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + + +#define USE_SERIAL + +#define MASTER_LEFT +// #define _MASTER_RIGHT +// #define EE_HANDS + + +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" +#endif +#ifdef SUBPROJECT_rev2fliphalf + #include "../../rev2fliphalf/config.h" +#endif diff --git a/keyboards/lets_split/keymaps/smt/keymap.c b/keyboards/lets_split/keymaps/smt/keymap.c new file mode 100644 index 00000000..c4bdb7eb --- /dev/null +++ b/keyboards/lets_split/keymaps/smt/keymap.c @@ -0,0 +1,219 @@ +#include "lets_split.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Custom macros +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) +#define MEH_GRV MEH_T(KC_GRV) // Tap for Backtick, hold for Meh (Ctrl+Alt+Shift) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | S | D | F | G | | H | J | K | L | ; | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------' `-----------------------------------------' + */ +[_QWERTY] = KEYMAP( \ + HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, \ + MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Colemak + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | R | S | T | D | | H | N | E | I | O | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------' `-----------------------------------------' + */ +[_COLEMAK] = KEYMAP( \ + HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, \ + MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Dvorak + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | O | E | U | I | | D | H | T | N | S | - | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------' `-----------------------------------------' + */ +[_DVORAK] = KEYMAP( \ + HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ + MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | 0 | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | $ | F1 | F2 | F3 | F4 | F5 | | F6 | 4 | 5 | 6 | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 | 1 | 2 | 3 | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------' `-----------------------------------------' + */ +[_LOWER] = KEYMAP( \ + ALL_T(KC_0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + CTL_T(KC_DLR), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, _______, _______, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | _ | ? | + | { | } | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | - | / | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Home |PageDn|PageUp| End | + * `-----------------------------------------' `-----------------------------------------' + */ +[_RAISE] = KEYMAP( \ + ALL_T(KC_TILD), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + _______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, SFT_T(KC_BSLS), \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | | Reset| | | | | | | | | | | Reset| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ +[_ADJUST] = KEYMAP( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} diff --git a/keyboards/lets_split/keymaps/smt/readme.md b/keyboards/lets_split/keymaps/smt/readme.md new file mode 100644 index 00000000..20bc662f --- /dev/null +++ b/keyboards/lets_split/keymaps/smt/readme.md @@ -0,0 +1,88 @@ +# smt's Let's Split keymap + +This keymap is ported from my Planck keymap. + + +## Qwerty + +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Esc | A | S | D | F | G | | H | J | K | L | ; | " | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------' `-----------------------------------------' +``` + +## Colemak + +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Esc | A | R | S | T | D | | H | N | E | I | O | " | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------' `-----------------------------------------' +``` + +## Dvorak + +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Esc | A | O | E | U | I | | D | H | T | N | S | - | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------' `-----------------------------------------' +``` + +## Lower + +``` +,-----------------------------------------. ,-----------------------------------------. +| 0 | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| $ | F1 | F2 | F3 | F4 | F5 | | F6 | 4 | 5 | 6 | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | F7 | F8 | F9 | F10 | F11 | | F12 | 1 | 2 | 3 | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | Next | Vol- | Vol+ | Play | +`-----------------------------------------' `-----------------------------------------' +``` + +## Raise + +``` +,-----------------------------------------. ,-----------------------------------------. +| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | _ | ? | + | { | } | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | - | / | = | [ | ] | \ | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | Home |PageDn|PageUp| End | +`-----------------------------------------' `-----------------------------------------' +``` + +## Adjust (Lower + Raise) + +``` +,-----------------------------------------. ,-----------------------------------------. +| | Reset| | | | | | | | | | | Reset| +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | |Aud on|Audoff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | | | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | | | | | +`-----------------------------------------' `-----------------------------------------' +``` diff --git a/keyboards/lets_split/lets_split.c b/keyboards/lets_split/lets_split.c index c505d3a6..117b727a 100644 --- a/keyboards/lets_split/lets_split.c +++ b/keyboards/lets_split/lets_split.c @@ -1,32 +1 @@ -#include "lets_split.h" - -#ifdef AUDIO_ENABLE - float tone_startup[][2] = SONG(STARTUP_SOUND); - float tone_goodbye[][2] = SONG(GOODBYE_SOUND); -#endif - -void matrix_init_kb(void) { - - #ifdef AUDIO_ENABLE - _delay_ms(20); // gets rid of tick - PLAY_NOTE_ARRAY(tone_startup, false, 0); - #endif - - // // green led on - // DDRD |= (1<<5); - // PORTD &= ~(1<<5); - - // // orange led on - // DDRB |= (1<<0); - // PORTB &= ~(1<<0); - - matrix_init_user(); -}; - -void shutdown_user(void) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_goodbye, false, 0); - _delay_ms(150); - stop_all_notes(); - #endif -} +#include "lets_split.h" \ No newline at end of file diff --git a/keyboards/lets_split/lets_split.h b/keyboards/lets_split/lets_split.h index fe7ae076..0de308c7 100644 --- a/keyboards/lets_split/lets_split.h +++ b/keyboards/lets_split/lets_split.h @@ -1,25 +1,16 @@ #ifndef LETS_SPLIT_H #define LETS_SPLIT_H -#include "quantum.h" - -void promicro_bootloader_jmp(bool program); +#ifdef SUBPROJECT_rev1 + #include "rev1.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "rev2.h" +#endif +#ifdef SUBPROJECT_rev2fliphalf + #include "rev2fliphalf.h" +#endif -#define KEYMAP( \ - k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \ - k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \ - k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \ - k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \ - ) \ - { \ - { k00, k01, k02, k03, k04, k05 }, \ - { k10, k11, k12, k13, k14, k15 }, \ - { k20, k21, k22, k23, k24, k25 }, \ - { k30, k31, k32, k33, k34, k35 }, \ - { k40, k41, k42, k43, k44, k45 }, \ - { k50, k51, k52, k53, k54, k55 }, \ - { k60, k61, k62, k63, k64, k65 }, \ - { k70, k71, k72, k73, k74, k75 } \ - } +#include "quantum.h" #endif \ No newline at end of file diff --git a/keyboards/lets_split/matrix.c b/keyboards/lets_split/matrix.c index 13896900..81dfb144 100644 --- a/keyboards/lets_split/matrix.c +++ b/keyboards/lets_split/matrix.c @@ -226,9 +226,7 @@ uint8_t matrix_scan(void) TXLED0; error_count = 0; } - matrix_scan_quantum(); - return ret; } diff --git a/keyboards/lets_split/readme.md b/keyboards/lets_split/readme.md index 6e296737..ecce3f41 100644 --- a/keyboards/lets_split/readme.md +++ b/keyboards/lets_split/readme.md @@ -6,9 +6,45 @@ This readme and most of the code are from https://github.com/ahtn/tmk_keyboard/ Split keyboard firmware for Arduino Pro Micro or other ATmega32u4 based boards. + +## First Time Setup + +Download or clone the whole firmware and navigate to the keyboards/lets_split directory. Once your dev env is setup, you'll be able to generate the default .hex using: + +``` +$ make rev2 +``` + +You will see a lot of output and if everything worked correctly you will see the built hex files: + +``` +lets_split_rev2_serial.hex +lets_split_rev2_i2c.hex +``` + +If you would like to use one of the alternative keymaps, or create your own, copy one of the existing [keymaps](keymaps/) and run make like so: + + +``` +$ make rev2-YOUR_KEYMAP_NAME +``` + +If everything worked correctly you will see a file: + +``` +lets_split_rev2_YOUR_KEYMAP_NAME.hex +``` + +For more information on customizing keymaps, take a look at the primary documentation for [Customizing Your Keymap](/readme.md##customizing-your-keymap) in the main readme.md. + +### Let's split 1.0 +If you have a first generation Let's Split you will need to use the revision 1 code. To do so, use `rev1` in all your commands instead. + Features -------- +For the full Quantum Mechanical Keyboard feature list, see [the parent readme.md](/readme.md). + Some features supported by the firmware: * Either half can connect to the computer via USB, or both halves can be used @@ -62,7 +98,7 @@ unnecessary in simple use cases. Notes on Software Configuration ------------------------------- -Configuring the firmware is similar to any other TMK project. One thing +Configuring the firmware is similar to any other QMK project. One thing to note is that `MATIX_ROWS` in `config.h` is the total number of rows between the two halves, i.e. if your split keyboard has 4 rows in each half, then `MATRIX_ROWS=8`. @@ -70,33 +106,59 @@ the two halves, i.e. if your split keyboard has 4 rows in each half, then Also the current implementation assumes a maximum of 8 columns, but it would not be very difficult to adapt it to support more if required. - Flashing +------- +From the keymap directory run `make SUBPROJECT-KEYMAP-avrdude` for automatic serial port resolution and flashing. +Example: `make rev2-serial-avrdude` + + +Choosing which board to plug the USB cable into (choosing Master) -------- +Because the two boards are identical, the firmware has logic to differentiate the left and right board. + +It uses two strategies to figure things out: look at the EEPROM (memory on the chip) or looks if the current board has the usb cable. + +The EEPROM approach requires additional setup (flashing the eeeprom) but allows you to swap the usb cable to either side. + +The USB cable approach is easier to setup and if you just want the usb cable on the left board, you do not need to do anything extra. + +### Setting the left hand as master +If you always plug the usb cable into the left board, nothing extra is needed as this is the default. Comment out `EE_HANDS` and comment out `I2C_MASTER_RIGHT` or `MASTER_RIGHT` if for some reason it was set. +### Setting the right hand as master +If you always plug the usb cable into the right board, add an extra flag to your `config.h` +``` + #define MASTER_RIGHT +``` + +### Setting EE_hands to use either hands as master If you define `EE_HANDS` in your `config.h`, you will need to set the -EEPROM for the left and right halves. The EEPROM is used to store whether the +EEPROM for the left and right halves. + +The EEPROM is used to store whether the half is left handed or right handed. This makes it so that the same firmware file will run on both hands instead of having to flash left and right handed versions of the firmware to each half. To flash the EEPROM file for the left half run: ``` -make eeprom-left +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep +// or the equivalent in dfu-programmer + ``` and similarly for right half ``` -make eeprom-right +avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep +// or the equivalent in dfu-programmer ``` -After you have flashed the EEPROM for the first time, you then need to program -the flash memory: -``` -make program -``` +NOTE: replace `$(COM_PORT)` with the port of your device (e.g. `/dev/ttyACM0`) + +After you have flashed the EEPROM, you then need to set `EE_HANDS` in your config.h, rebuild the hex files and reflash. + Note that you need to program both halves, but you have the option of using different keymaps for each half. You could program the left half with a QWERTY -layout and the right half with a Colemak layout. Then if you connect the left -half to a computer by USB the keyboard will use QWERTY and Colemak when the +layout and the right half with a Colemak layout using bootmagic's default layout option. +Then if you connect the left half to a computer by USB the keyboard will use QWERTY and Colemak when the right half is connected. diff --git a/keyboards/lets_split/rev1/Makefile b/keyboards/lets_split/rev1/Makefile new file mode 100644 index 00000000..4e2a6f00 --- /dev/null +++ b/keyboards/lets_split/rev1/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif \ No newline at end of file diff --git a/keyboards/lets_split/rev1/config.h b/keyboards/lets_split/rev1/config.h new file mode 100644 index 00000000..5fb87cf5 --- /dev/null +++ b/keyboards/lets_split/rev1/config.h @@ -0,0 +1,91 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x3060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Wootpatoot +#define PRODUCT Lets Split v1 +#define DESCRIPTION A split keyboard for the cheap makers + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 8 +#define MATRIX_COLS 6 + +// wiring of each half +#define MATRIX_ROW_PINS { B5, B4, E6, D7 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 } +// #define MATRIX_COL_PINS { B3, B1, F7, F6, F5, F4 } //uncomment this line and comment line above if you need to reverse left-to-right key order + + +#define CATERINA_BOOTLOADER + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +// #define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN D3 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 16 // Number of LEDs +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +// #define NO_DEBUG + +/* disable print */ +// #define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/lets_split/rev1/rev1.c b/keyboards/lets_split/rev1/rev1.c new file mode 100644 index 00000000..c505d3a6 --- /dev/null +++ b/keyboards/lets_split/rev1/rev1.c @@ -0,0 +1,32 @@ +#include "lets_split.h" + +#ifdef AUDIO_ENABLE + float tone_startup[][2] = SONG(STARTUP_SOUND); + float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + +void matrix_init_kb(void) { + + #ifdef AUDIO_ENABLE + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); + #endif + + // // green led on + // DDRD |= (1<<5); + // PORTD &= ~(1<<5); + + // // orange led on + // DDRB |= (1<<0); + // PORTB &= ~(1<<0); + + matrix_init_user(); +}; + +void shutdown_user(void) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); + #endif +} diff --git a/keyboards/lets_split/rev1/rev1.h b/keyboards/lets_split/rev1/rev1.h new file mode 100644 index 00000000..4667c9fb --- /dev/null +++ b/keyboards/lets_split/rev1/rev1.h @@ -0,0 +1,28 @@ +#ifndef REV1_H +#define REV1_H + +#include "../lets_split.h" + +//void promicro_bootloader_jmp(bool program); +#include "quantum.h" + +//void promicro_bootloader_jmp(bool program); + +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \ + k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \ + k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \ + k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05 }, \ + { k10, k11, k12, k13, k14, k15 }, \ + { k20, k21, k22, k23, k24, k25 }, \ + { k30, k31, k32, k33, k34, k35 }, \ + { k40, k41, k42, k43, k44, k45 }, \ + { k50, k51, k52, k53, k54, k55 }, \ + { k60, k61, k62, k63, k64, k65 }, \ + { k70, k71, k72, k73, k74, k75 } \ + } + +#endif \ No newline at end of file diff --git a/keyboards/lets_split/rev1/rules.mk b/keyboards/lets_split/rev1/rules.mk new file mode 100644 index 00000000..a0825b4e --- /dev/null +++ b/keyboards/lets_split/rev1/rules.mk @@ -0,0 +1,5 @@ +BACKLIGHT_ENABLE = no + +ifndef QUANTUM_DIR + include ../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/lets_split/rev2/Makefile b/keyboards/lets_split/rev2/Makefile new file mode 100644 index 00000000..4e2a6f00 --- /dev/null +++ b/keyboards/lets_split/rev2/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif \ No newline at end of file diff --git a/keyboards/lets_split/rev2/config.h b/keyboards/lets_split/rev2/config.h new file mode 100644 index 00000000..b34d7c00 --- /dev/null +++ b/keyboards/lets_split/rev2/config.h @@ -0,0 +1,91 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x3060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Wootpatoot +#define PRODUCT Lets Split v2 +#define DESCRIPTION A split keyboard for the cheap makers + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 8 +#define MATRIX_COLS 6 + +// wiring of each half +#define MATRIX_ROW_PINS { D7, E6, B4, B5 } +#define MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 } +// #define MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6 } //uncomment this line and comment line above if you need to reverse left-to-right key order + +#define CATERINA_BOOTLOADER + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +// #define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN D3 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 12 // Number of LEDs +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +// #define NO_DEBUG + +/* disable print */ +// #define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + + +#endif \ No newline at end of file diff --git a/keyboards/lets_split/rev2/rev2.c b/keyboards/lets_split/rev2/rev2.c new file mode 100644 index 00000000..8bfa171d --- /dev/null +++ b/keyboards/lets_split/rev2/rev2.c @@ -0,0 +1,40 @@ +#include "lets_split.h" + +#ifdef AUDIO_ENABLE + float tone_startup[][2] = SONG(STARTUP_SOUND); + float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + +#ifdef SSD1306OLED +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + led_set_user(usb_led); +} +#endif + +void matrix_init_kb(void) { + + #ifdef AUDIO_ENABLE + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); + #endif + + // // green led on + // DDRD |= (1<<5); + // PORTD &= ~(1<<5); + + // // orange led on + // DDRB |= (1<<0); + // PORTB &= ~(1<<0); + + matrix_init_user(); +}; + +void shutdown_user(void) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); + #endif +} + diff --git a/keyboards/lets_split/rev2/rev2.h b/keyboards/lets_split/rev2/rev2.h new file mode 100644 index 00000000..05473136 --- /dev/null +++ b/keyboards/lets_split/rev2/rev2.h @@ -0,0 +1,71 @@ +#ifndef REV2_H +#define REV2_H + +#include "../lets_split.h" + +//void promicro_bootloader_jmp(bool program); +#include "quantum.h" + + +#ifdef USE_I2C +#include +#ifdef __AVR__ +#include +#include +#endif +#ifdef SSD1306OLED +extern bool iota_gfx_init(void); +extern void iota_gfx_task(void); +extern bool iota_gfx_off(void); +extern bool iota_gfx_on(void); +extern void iota_gfx_flush(void); +extern void iota_gfx_write_char(uint8_t c); +extern void iota_gfx_write(const char *data); +extern void iota_gfx_write_P(const char *data); +extern void iota_gfx_clear_screen(void); +#endif +#endif + +//void promicro_bootloader_jmp(bool program); + +#ifndef FLIP_HALF +//Standard Keymap +#define KEYMAP( \ + k40, k41, k42, k43, k44, k45, k05, k04, k03, k02, k01, k00, \ + k50, k51, k52, k53, k54, k55, k15, k14, k13, k12, k11, k10, \ + k60, k61, k62, k63, k64, k65, k25, k24, k23, k22, k21, k20, \ + k70, k71, k72, k73, k74, k75, k35, k34, k33, k32, k31, k30 \ + ) \ + { \ + { k45, k44, k43, k42, k41, k40 }, \ + { k55, k54, k53, k52, k51, k50 }, \ + { k65, k64, k63, k62, k61, k60 }, \ + { k75, k74, k73, k72, k71, k70 }, \ + { k00, k01, k02, k03, k04, k05 }, \ + { k10, k11, k12, k13, k14, k15 }, \ + { k20, k21, k22, k23, k24, k25 }, \ + { k30, k31, k32, k33, k34, k35 } \ + } + +#else +// Keymap with one side flipped +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \ + k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \ + k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \ + k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \ + ) \ + { \ + { k00, k01, k02, k03, k04, k05 }, \ + { k10, k11, k12, k13, k14, k15 }, \ + { k20, k21, k22, k23, k24, k25 }, \ + { k30, k31, k32, k33, k34, k35 }, \ + { k45, k44, k43, k42, k41, k40 }, \ + { k55, k54, k53, k52, k51, k50 }, \ + { k65, k64, k63, k62, k61, k60 }, \ + { k75, k74, k73, k72, k71, k70 } \ + } +#endif + + +#endif \ No newline at end of file diff --git a/keyboards/lets_split/rev2/rules.mk b/keyboards/lets_split/rev2/rules.mk new file mode 100644 index 00000000..80a942d0 --- /dev/null +++ b/keyboards/lets_split/rev2/rules.mk @@ -0,0 +1,5 @@ +BACKLIGHT_ENABLE = no + +ifndef QUANTUM_DIR + include ../../../Makefile +endif diff --git a/keyboards/lets_split/rules.mk b/keyboards/lets_split/rules.mk index 6fde8a44..ff159e0f 100644 --- a/keyboards/lets_split/rules.mk +++ b/keyboards/lets_split/rules.mk @@ -1,7 +1,8 @@ SRC += matrix.c \ i2c.c \ split_util.c \ - serial.c + serial.c\ + ssd1306.c # MCU name #MCU = at90usb1287 @@ -63,11 +64,12 @@ COMMAND_ENABLE ?= yes # Commands for debug and configuration NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality MIDI_ENABLE ?= no # MIDI controls -AUDIO_ENABLE ?= yes # Audio output on port C6 +AUDIO_ENABLE ?= no # Audio output on port C6 UNICODE_ENABLE ?= no # Unicode BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. - +RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SUBPROJECT_rev1 ?= yes +USE_I2C ?= yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend diff --git a/keyboards/lets_split/split_util.c b/keyboards/lets_split/split_util.c index 46192179..46586fbc 100644 --- a/keyboards/lets_split/split_util.c +++ b/keyboards/lets_split/split_util.c @@ -21,7 +21,8 @@ static void setup_handedness(void) { #ifdef EE_HANDS isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); #else - #ifdef I2C_MASTER_RIGHT + // I2c_MASTER_RIGHT ish deprecate use MASTER_RIGHT instead since this works for both serial and i2c: + #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) isLeftHand = !has_usb(); #else isLeftHand = has_usb(); @@ -32,6 +33,9 @@ static void setup_handedness(void) { static void keyboard_master_setup(void) { #ifdef USE_I2C i2c_master_init(); +#ifdef SSD1306OLED + matrix_master_OLED_init (); +#endif #else serial_master_init(); #endif diff --git a/keyboards/lets_split/split_util.h b/keyboards/lets_split/split_util.h index 6b896679..3ae76c20 100644 --- a/keyboards/lets_split/split_util.h +++ b/keyboards/lets_split/split_util.h @@ -19,4 +19,6 @@ void split_keyboard_setup(void); bool has_usb(void); void keyboard_slave_loop(void); +void matrix_master_OLED_init (void); + #endif diff --git a/keyboards/lets_split/ssd1306.c b/keyboards/lets_split/ssd1306.c new file mode 100644 index 00000000..3c7816bb --- /dev/null +++ b/keyboards/lets_split/ssd1306.c @@ -0,0 +1,468 @@ +#include "config.h" +#include "i2c.h" +#include +#include +#include +#include "print.h" +#include "lets_split.h" +#include "common/glcdfont.c" +#ifdef ADAFRUIT_BLE_ENABLE +#include "adafruit_ble.h" +#endif +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#endif +#include "sendchar.h" +#include "pincontrol.h" + +//assign the right code to your layers +#define _BASE 0 +#define _LOWER 8 +#define _RAISE 16 +#define _FNLAYER 64 +#define _NUMLAY 128 +#define _NLOWER 136 +#define _NFNLAYER 192 +#define _MOUSECURSOR 256 +#define _ADJUST 65560 + +// Set this to 1 to help diagnose early startup problems +// when testing power-on with ble. Turn it off otherwise, +// as the latency of printing most of the debug info messes +// with the matrix scan, causing keys to drop. +#define DEBUG_TO_SCREEN 0 + +// Controls the SSD1306 128x32 OLED display via i2c + +#define i2cAddress 0x3C + +#define DisplayHeight 32 +#define DisplayWidth 128 + +#define FontHeight 8 +#define FontWidth 6 + +#define MatrixRows (DisplayHeight / FontHeight) +#define MatrixCols (DisplayWidth / FontWidth) + +struct CharacterMatrix { + uint8_t display[MatrixRows][MatrixCols]; + uint8_t *cursor; + bool dirty; +}; + +static struct CharacterMatrix display; +//static uint16_t last_battery_update; +//static uint32_t vbat; +//#define BatteryUpdateInterval 10000 /* milliseconds */ +#define ScreenOffInterval 300000 /* milliseconds */ +#if DEBUG_TO_SCREEN +static uint8_t displaying; +#endif +static uint16_t last_flush; + +enum ssd1306_cmds { + DisplayOff = 0xAE, + DisplayOn = 0xAF, + + SetContrast = 0x81, + DisplayAllOnResume = 0xA4, + + DisplayAllOn = 0xA5, + NormalDisplay = 0xA6, + InvertDisplay = 0xA7, + SetDisplayOffset = 0xD3, + SetComPins = 0xda, + SetVComDetect = 0xdb, + SetDisplayClockDiv = 0xD5, + SetPreCharge = 0xd9, + SetMultiPlex = 0xa8, + SetLowColumn = 0x00, + SetHighColumn = 0x10, + SetStartLine = 0x40, + + SetMemoryMode = 0x20, + ColumnAddr = 0x21, + PageAddr = 0x22, + + ComScanInc = 0xc0, + ComScanDec = 0xc8, + SegRemap = 0xa0, + SetChargePump = 0x8d, + ExternalVcc = 0x01, + SwitchCapVcc = 0x02, + + ActivateScroll = 0x2f, + DeActivateScroll = 0x2e, + SetVerticalScrollArea = 0xa3, + RightHorizontalScroll = 0x26, + LeftHorizontalScroll = 0x27, + VerticalAndRightHorizontalScroll = 0x29, + VerticalAndLeftHorizontalScroll = 0x2a, +}; + + +// Write command sequence. +// Returns true on success. +static inline bool _send_cmd1(uint8_t cmd) { + bool res = false; + + if (i2c_start_write(i2cAddress)) { + xprintf("failed to start write to %d\n", i2cAddress); + goto done; + } + + if (i2c_master_write(0x0 /* command byte follows */)) { + print("failed to write control byte\n"); + + goto done; + } + + if (i2c_master_write(cmd)) { + xprintf("failed to write command %d\n", cmd); + goto done; + } + res = true; +done: + i2c_master_stop(); + return res; +} + +// Write 2-byte command sequence. +// Returns true on success +static inline bool _send_cmd2(uint8_t cmd, uint8_t opr) { + if (!_send_cmd1(cmd)) { + return false; + } + return _send_cmd1(opr); +} + +// Write 3-byte command sequence. +// Returns true on success +static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) { + if (!_send_cmd1(cmd)) { + return false; + } + if (!_send_cmd1(opr1)) { + return false; + } + return _send_cmd1(opr2); +} + +#define send_cmd1(c) if (!_send_cmd1(c)) {goto done;} +#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {goto done;} +#define send_cmd3(c,o1,o2) if (!_send_cmd3(c,o1,o2)) {goto done;} + +static void matrix_clear(struct CharacterMatrix *matrix); + +static void clear_display(void) { + matrix_clear(&display); + + // Clear all of the display bits (there can be random noise + // in the RAM on startup) + send_cmd3(PageAddr, 0, (DisplayHeight / 8) - 1); + send_cmd3(ColumnAddr, 0, DisplayWidth - 1); + + if (i2c_start_write(i2cAddress)) { + goto done; + } + if (i2c_master_write(0x40)) { + // Data mode + goto done; + } + for (uint8_t row = 0; row < MatrixRows; ++row) { + for (uint8_t col = 0; col < DisplayWidth; ++col) { + i2c_master_write(0); + } + } + + display.dirty = false; + +done: + i2c_master_stop(); +} + +#if DEBUG_TO_SCREEN +#undef sendchar +static int8_t capture_sendchar(uint8_t c) { + sendchar(c); + iota_gfx_write_char(c); + + if (!displaying) { + iota_gfx_flush(); + } + return 0; +} +#endif + +bool iota_gfx_init(void) { + bool success = false; + + send_cmd1(DisplayOff); + send_cmd2(SetDisplayClockDiv, 0x80); + send_cmd2(SetMultiPlex, DisplayHeight - 1); + + send_cmd2(SetDisplayOffset, 0); + + + send_cmd1(SetStartLine | 0x0); + send_cmd2(SetChargePump, 0x14 /* Enable */); + send_cmd2(SetMemoryMode, 0 /* horizontal addressing */); + +/// Flips the display orientation 0 degrees + send_cmd1(SegRemap | 0x1); + send_cmd1(ComScanDec); +/* +// the following Flip the display orientation 180 degrees + send_cmd1(SegRemap); + send_cmd1(ComScanInc); +// end flip */ + send_cmd2(SetComPins, 0x2); + send_cmd2(SetContrast, 0x8f); + send_cmd2(SetPreCharge, 0xf1); + send_cmd2(SetVComDetect, 0x40); + send_cmd1(DisplayAllOnResume); + send_cmd1(NormalDisplay); + send_cmd1(DeActivateScroll); + send_cmd1(DisplayOn); + + send_cmd2(SetContrast, 0); // Dim + + clear_display(); + + success = true; + + iota_gfx_flush(); + +#if DEBUG_TO_SCREEN + print_set_sendchar(capture_sendchar); +#endif + +done: + return success; +} + +bool iota_gfx_off(void) { + bool success = false; + + send_cmd1(DisplayOff); + success = true; + +done: + return success; +} + +bool iota_gfx_on(void) { + bool success = false; + + send_cmd1(DisplayOn); + success = true; + +done: + return success; +} + +static void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) { + *matrix->cursor = c; + ++matrix->cursor; + + if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) { + // We went off the end; scroll the display upwards by one line + memmove(&matrix->display[0], &matrix->display[1], + MatrixCols * (MatrixRows - 1)); + matrix->cursor = &matrix->display[MatrixRows - 1][0]; + memset(matrix->cursor, ' ', MatrixCols); + } +} + +static void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) { + matrix->dirty = true; + + if (c == '\n') { + // Clear to end of line from the cursor and then move to the + // start of the next line + uint8_t cursor_col = (matrix->cursor - &matrix->display[0][0]) % MatrixCols; + + while (cursor_col++ < MatrixCols) { + matrix_write_char_inner(matrix, ' '); + } + return; + } + + matrix_write_char_inner(matrix, c); +} + +void iota_gfx_write_char(uint8_t c) { + matrix_write_char(&display, c); +} + +static void matrix_write(struct CharacterMatrix *matrix, const char *data) { + const char *end = data + strlen(data); + while (data < end) { + matrix_write_char(matrix, *data); + ++data; + } +} + +void iota_gfx_write(const char *data) { + matrix_write(&display, data); +} + +static void matrix_write_P(struct CharacterMatrix *matrix, const char *data) { + while (true) { + uint8_t c = pgm_read_byte(data); + if (c == 0) { + return; + } + matrix_write_char(matrix, c); + ++data; + } +} + +void iota_gfx_write_P(const char *data) { + matrix_write_P(&display, data); +} + +static void matrix_clear(struct CharacterMatrix *matrix) { + memset(matrix->display, ' ', sizeof(matrix->display)); + matrix->cursor = &matrix->display[0][0]; + matrix->dirty = true; +} + +void iota_gfx_clear_screen(void) { + matrix_clear(&display); +} + +static void matrix_render(struct CharacterMatrix *matrix) { + last_flush = timer_read(); + iota_gfx_on(); +#if DEBUG_TO_SCREEN + ++displaying; +#endif + + // Move to the home position + send_cmd3(PageAddr, 0, MatrixRows - 1); + send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1); + + if (i2c_start_write(i2cAddress)) { + goto done; + } + if (i2c_master_write(0x40)) { + // Data mode + goto done; + } + + for (uint8_t row = 0; row < MatrixRows; ++row) { + for (uint8_t col = 0; col < MatrixCols; ++col) { + const uint8_t *glyph = font + (matrix->display[row][col] * (FontWidth - 1)); + + for (uint8_t glyphCol = 0; glyphCol < FontWidth - 1; ++glyphCol) { + uint8_t colBits = pgm_read_byte(glyph + glyphCol); + i2c_master_write(colBits); + } + + // 1 column of space between chars (it's not included in the glyph) + i2c_master_write(0); + } + } + + matrix->dirty = false; + +done: + i2c_master_stop(); +#if DEBUG_TO_SCREEN + --displaying; +#endif +} + +void iota_gfx_flush(void) { + matrix_render(&display); +} + +static void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +static void render_status_info(void) { +#if DEBUG_TO_SCREEN + if (debug_enable) { + return; + } +#endif + + struct CharacterMatrix matrix; + + matrix_clear(&matrix); + matrix_write_P(&matrix, PSTR("USB: ")); +#ifdef PROTOCOL_LUFA + switch (USB_DeviceState) { + case DEVICE_STATE_Unattached: + matrix_write_P(&matrix, PSTR("Unattached")); + break; + case DEVICE_STATE_Suspended: + matrix_write_P(&matrix, PSTR("Suspended")); + break; + case DEVICE_STATE_Configured: + matrix_write_P(&matrix, PSTR("Connected")); + break; + case DEVICE_STATE_Powered: + matrix_write_P(&matrix, PSTR("Powered")); + break; + case DEVICE_STATE_Default: + matrix_write_P(&matrix, PSTR("Default")); + break; + case DEVICE_STATE_Addressed: + matrix_write_P(&matrix, PSTR("Addressed")); + break; + default: + matrix_write_P(&matrix, PSTR("Invalid")); + } +#endif + +// Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below + + char buf[40]; + snprintf(buf,sizeof(buf), "Undef-%ld", layer_state); + matrix_write_P(&matrix, PSTR("\n\nLayer: ")); + switch (layer_state) { + case _BASE: + matrix_write_P(&matrix, PSTR("Default")); + break; + case _RAISE: + matrix_write_P(&matrix, PSTR("Raise")); + break; + case _LOWER: + matrix_write_P(&matrix, PSTR("Lower")); + break; + case _ADJUST: + matrix_write_P(&matrix, PSTR("ADJUST")); + break; + default: + matrix_write(&matrix, buf); + } + + // Host Keyboard LED Status + char led[40]; + snprintf(led, sizeof(led), "\n%s %s %s", + (host_keyboard_leds() & (1< ScreenOffInterval) { + iota_gfx_off(); + } +} diff --git a/keyboards/maxipad/Makefile b/keyboards/maxipad/Makefile new file mode 100644 index 00000000..4e2a6f00 --- /dev/null +++ b/keyboards/maxipad/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif \ No newline at end of file diff --git a/keyboards/maxipad/config.h b/keyboards/maxipad/config.h new file mode 100644 index 00000000..d7a5ef56 --- /dev/null +++ b/keyboards/maxipad/config.h @@ -0,0 +1,95 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER wootpatoot +#define PRODUCT maxipad +#define DESCRIPTION A custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 6 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +//Pro micro pinout + #define MATRIX_ROW_PINS { B6, B2, B3, B1, F7 } + #define MATRIX_COL_PINS { F4, C6, D7, F5, B4, B5 } + #define UNUSED_PINS +//Teensy 2 pinout + //#define MATRIX_ROW_PINS { B6, F7, B2, B3, B1 } + //#define MATRIX_COL_PINS { F6, C6, D7, F5, B4, B5 } + //#define UNUSED_PINS + + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/maxipad/keymaps/default/keymap.c b/keyboards/maxipad/keymaps/default/keymap.c new file mode 100644 index 00000000..227cef7d --- /dev/null +++ b/keyboards/maxipad/keymaps/default/keymap.c @@ -0,0 +1,26 @@ +#include "maxipad.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( /* Base */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, \ + MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, \ + KC_LCTL, KC_LALT, MO(1), KC_ENT,KC_GRV,KC_SPC \ +), +[1] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, \ + KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC \ +), +}; + +const uint16_t PROGMEM fn_actions[] = { +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // MACRODOWN only works in this function +{ + return MACRO_NONE; +}; \ No newline at end of file diff --git a/keyboards/maxipad/maxipad.c b/keyboards/maxipad/maxipad.c new file mode 100644 index 00000000..a193b112 --- /dev/null +++ b/keyboards/maxipad/maxipad.c @@ -0,0 +1 @@ +#include "maxipad.h" \ No newline at end of file diff --git a/keyboards/maxipad/maxipad.h b/keyboards/maxipad/maxipad.h new file mode 100644 index 00000000..4d8c6428 --- /dev/null +++ b/keyboards/maxipad/maxipad.h @@ -0,0 +1,25 @@ +#ifndef MAXIPAD_H +#define MAXIPAD_H + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. +// The following is an example using the Planck MIT layout +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, \ + k10, k11, k12, k13, k14, k15, \ + k20, k21, k22, k23, k24, k25, \ + k30, k31, k32, k33, k34, k35, \ + k40, k41, k42, k43, k44, k45 \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05 }, \ + { k10, k11, k12, k13, k14, k15 }, \ + { k20, k21, k22, k23, k24, k25 }, \ + { k30, k31, k32, k33, k34, k35 }, \ + { k40, k41, k42, k43, k44, k45 } \ +} + +#endif diff --git a/keyboards/maxipad/readme.md b/keyboards/maxipad/readme.md new file mode 100644 index 00000000..861ea2b0 --- /dev/null +++ b/keyboards/maxipad/readme.md @@ -0,0 +1,29 @@ +Maxipad keyboard firmware + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme.md](/readme.md). + +If you are using a pro micro then make sure to enable USE_PRO_MICRO in the makefile +Change the config.h pinout to match your mcu!! + +Download or clone the whole firmware and navigate to the keyboards/maxipad folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make`. + + +### Other Keymaps +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` and see keymap document (you can find in top readme.md) and existent keymap files. + + +To build the firmware binary hex file with a keymap just do `make` with a keymap like this: + +``` +$ make [default|jack|] +``` + +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/maxipad/rules.mk b/keyboards/maxipad/rules.mk new file mode 100644 index 00000000..a5c73915 --- /dev/null +++ b/keyboards/maxipad/rules.mk @@ -0,0 +1,76 @@ + + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +# SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend +# NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +# BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality +# MIDI_ENABLE ?= YES # MIDI controls +# UNICODE_ENABLE ?= YES # Unicode +# BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID +USE_PRO_MICRO ?= yes +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 diff --git a/keyboards/phantom/config.h b/keyboards/phantom/config.h index 983a1d73..71a33498 100644 --- a/keyboards/phantom/config.h +++ b/keyboards/phantom/config.h @@ -63,7 +63,7 @@ along with this program. If not, see . /* Underlight configuration */ #define RGB_DI_PIN E2 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 20 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/planck/config.h b/keyboards/planck/config.h index 4dd1d22a..5cf96bb8 100644 --- a/keyboards/planck/config.h +++ b/keyboards/planck/config.h @@ -36,6 +36,8 @@ along with this program. If not, see . #define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } #define UNUSED_PINS +#define AUDIO_VOICES + #define BACKLIGHT_PIN B7 /* COL2ROW or ROW2COL */ diff --git a/keyboards/planck/keymaps/bone2planck/Makefile b/keyboards/planck/keymaps/bone2planck/Makefile index 581e08cd..39635192 100644 --- a/keyboards/planck/keymaps/bone2planck/Makefile +++ b/keyboards/planck/keymaps/bone2planck/Makefile @@ -1,18 +1,16 @@ - - # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +COMMAND_ENABLE = no # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = yes # Audio output on port C6 +AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. diff --git a/keyboards/planck/keymaps/bone2planck/config.h b/keyboards/planck/keymaps/bone2planck/config.h index 60aff6db..3e9e692d 100644 --- a/keyboards/planck/keymaps/bone2planck/config.h +++ b/keyboards/planck/keymaps/bone2planck/config.h @@ -1,7 +1,8 @@ #ifndef CONFIG_USER_H #define CONFIG_USER_H -#endif #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS \ No newline at end of file +#define PREVENT_STUCK_MODIFIERS + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/bone2planck/keymap.c b/keyboards/planck/keymaps/bone2planck/keymap.c index 69d164b8..5f77acf9 100644 --- a/keyboards/planck/keymaps/bone2planck/keymap.c +++ b/keyboards/planck/keymaps/bone2planck/keymap.c @@ -7,11 +7,12 @@ // for intellisense, has to be commented for building /* #include "..\..\..\..\quantum\keymap_extras\keymap_german.h" -#include "..\..\..\..\quantum\keymap_common.h" #include "..\..\..\..\tmk_core\common\keycode.h" */ + #define _______ KC_TRNS +#define XXXXXXX KC_NO /* This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout. It has "üäöß" as it is optimized for a mix of German & English. @@ -23,11 +24,11 @@ Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Bone2 +/* Bone2 (adapted) * ,-----------------------------------------------------------------------------------. -* | Q | J | D | U | A | X | P | H | L | M | W | ẞ | +* | ß | J | D | U | A | X | P | H | L | M | W | Q | * |------+------+------+------+------+-------------+------+------+------+------+------| -* |M1/Tab| C | T | I | E | O | B | N | R | S | G |M1/Ent| //hold for M1, tap for Tab/Enter +* | M1 | C | T | I | E | O | B | N | R | S | G |M1/Ent| //hold for M1, tap for Enter * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| F | V | Ãœ | Ä | Ö | Y | Z | , | . | K |Shift | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -35,20 +36,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [0] = { - { DE_Q, DE_J, DE_D, DE_U, DE_A, DE_X, DE_P, DE_H, DE_L, DE_M, DE_W, DE_SS }, - { LT(1,KC_TAB), DE_C, DE_T, DE_I, DE_E, DE_O, DE_B, DE_N, DE_R, DE_S, DE_G, LT(1,KC_ENT) }, + { DE_SS, DE_J, DE_D, DE_U, DE_A, DE_X, DE_P, DE_H, DE_L, DE_M, DE_W, DE_Q }, + //{ LT(1,KC_TAB), DE_C, DE_T, DE_I, DE_E, DE_O, DE_B, DE_N, DE_R, DE_S, DE_G, LT(1,KC_ENT) }, + { MO(1), DE_C, DE_T, DE_I, DE_E, DE_O, DE_B, DE_N, DE_R, DE_S, DE_G, LT(1,KC_ENT) }, { KC_LSFT, DE_F, DE_V, DE_UE, DE_AE, DE_OE, DE_Y, DE_Z, DE_COMM, DE_DOT, DE_K, KC_LSFT }, { KC_LCTL, KC_RGUI, KC_LALT, MO(4), MO(2), KC_SPC, KC_SPC, MO(2), MO(4), KC_RALT, KC_ESC, KC_RCTL } }, /* M1 Special Characters -very ergonomic placement for coding +* very ergonomic placement for coding * ,-----------------------------------------------------------------------------------. * | ° | @ | _ | [ | ] | ^ | ! | < | > | = | & | ´ | * |------+------+------+------+------+-------------+------+------+------+------+------| -* |M1/Tab| \ | / | { | } | * | ? | ( | ) | - | : |M1/Ent| //hold for M1, tap for Tab/Enter +* | M1 | \ | / | { | } | * | ? | ( | ) | - | : |M1/Ent| //hold for M1, tap for Enter * |------+------+------+------+------+------|------+------+------+------+------+------| -* | Shift| # | $ | | | ~ | € | + | % | " | ' | ; |Shift | +* | Shift| # | ~ | | | $ | € | + | % | " | ' | ; |Shift | * |------+------+------+------+------+------+------+------+------+------+------+------| * | Ctrl | GUI | Alt | M4 | M2 | Space | M2 | M4 | Alt | Esc | Ctrl | * `-----------------------------------------------------------------------------------' @@ -56,56 +58,55 @@ very ergonomic placement for coding [1] = { { DE_RING, DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LESS, DE_MORE, DE_EQL, DE_AMPR, DE_ACUT }, { _______, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QST, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, _______ }, - { _______, DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_EURO, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, _______ }, + { _______, DE_HASH, DE_TILD, DE_PIPE, DE_DLR, DE_EURO, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } }, -/* Navigation & Number Blocks -very easy to get used to & intuituve placement +/* M2 Navigation & Number Blocks +* very easy to get used to & intuituve placement * ,-----------------------------------------------------------------------------------. * | | PgUp | Bksp | Up | DEL | PgDn | | 7 | 8 | 9 | | Ins | * |------+------+------+------+------+-------------+------+------+------+------+------| -* | Tab | Home | Lft | Down | Right| End | . | 4 | 5 | 6 | , | Enter| +* | Tab | Home | Lft | Down | Right| End | | 4 | 5 | 6 | . | Enter| * |------+------+------+------+------+------|------+------+------+------+------+------| -* | Shift| | Tab | | Enter| | 0 | 1 | 2 | 3 | ; |Shift | +* | Shift| | Tab | | Enter| | 0 | 1 | 2 | 3 | , |Shift | * |------+------+------+------+------+------+------+------+------+------+------+------| * | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Alt | Esc | Ctrl | * `-----------------------------------------------------------------------------------' */ [2] = { - { KC_NO, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_NO, DE_7, DE_8, DE_9, KC_NO, KC_INS }, - { KC_TAB, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, DE_DOT, DE_4, DE_5, DE_6, DE_COMM, KC_ENT }, - { _______, KC_NO, KC_TAB, KC_NO, KC_ENT, KC_NO, DE_0, DE_1, DE_2, DE_3, DE_SCLN, _______ }, + { XXXXXXX, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, XXXXXXX, DE_7, DE_8, DE_9, XXXXXXX, KC_INS }, + { KC_TAB, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, DE_4, DE_5, DE_6, DE_DOT, KC_ENT }, + { _______, XXXXXXX, KC_TAB, XXXXXXX, KC_ENT, XXXXXXX, DE_0, DE_1, DE_2, DE_3, DE_COMM, _______ }, { _______, _______, _______, MO(3), _______, _______, _______, _______, MO(3), _______, _______, _______ } }, -/* Flipped Navigation & Number Blocks for one handed use -accessed by sliding from M2 to M3 with thumb +/* M3 Switched Navigation & Number Blocks for one handed use +* accessed by sliding from M2 to M3 with thumb * ,-----------------------------------------------------------------------------------. -* | Ins | | 7 | 8 | 9 | | PgUp | Bksp | Up | DEL | PgDn | | +* | Ins | | 7 | 8 | 9 | | PgUp | Bksp | Up | DEL | PgDn | | * |------+------+------+------+------+-------------+------+------+------+------+------| -* | Tab | . | 4 | 5 | 6 | , | Home | Left | Down | Right| End | Enter| +* | Tab | | 4 | 5 | 6 | . | Home | Left | Down | Right| End | Enter| * |------+------+------+------+------+------|------+------+------+------+------+------| -* | Shift| 0 | 1 | 2 | 3 | ; | | Tab | Ins | Enter| |Shift | +* | Shift| 0 | 1 | 2 | 3 | , | | Tab | | Enter| |Shift | * |------+------+------+------+------+------+------+------+------+------+------+------| * | Ctrl | GUI | Alt | M3 | | Space | | M3 | Alt | Esc | Ctrl | * `-----------------------------------------------------------------------------------' */ [3] = { - { KC_INS, KC_NO, DE_7, DE_8, DE_9, KC_NO, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_NO }, - { _______, DE_DOT, DE_4, DE_5, DE_6, DE_COMM, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______ }, - { _______, DE_0, DE_1, DE_2, DE_3, DE_SCLN, KC_NO, KC_TAB, KC_INS, KC_ENT, KC_NO, _______ }, - { _______, _______, _______, _______, KC_NO, _______, _______, KC_NO, _______, _______, _______, _______ } + { KC_INS, XXXXXXX, DE_7, DE_8, DE_9, XXXXXXX, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, XXXXXXX }, + { _______, XXXXXXX, DE_4, DE_5, DE_6, DE_DOT, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______ }, + { _______, DE_0, DE_1, DE_2, DE_3, DE_COMM, XXXXXXX, KC_TAB, XXXXXXX, KC_ENT, XXXXXXX, _______ }, + { _______, _______, _______, _______, XXXXXXX, _______, _______, XXXXXXX, _______, _______, _______, _______ } }, -/* Function & Media Keys -slide from m4 to m5 to access flipped version +/* M4 Function & Media Keys * ,-----------------------------------------------------------------------------------. * | | | Print|Scroll|Pause | | | F7 | F8 | F9 | F12 | | * |------+------+------+------+------+-------------+------+------+------+------+------| -* | | | Mute | Vol- | Vol+ | | ³ | F4 | F5 | F6 | F11 | | +* | Tab | | Mute | Vol- | Vol+ | | ³ | F4 | F5 | F6 | F11 | Enter| * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| | Prev | Play | Next | | ² | F1 | F2 | F3 | F10 |Shift | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -113,18 +114,19 @@ slide from m4 to m5 to access flipped version * `-----------------------------------------------------------------------------------' */ [4] = { - { KC_NO, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F12, KC_NO }, - { KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, KC_NO }, - { _______, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, _______ }, + { XXXXXXX, XXXXXXX, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, XXXXXXX }, + { KC_TAB, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, KC_ENT }, + { _______, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, _______ }, { _______, _______, _______, _______, MO(5), _______, _______, MO(5), _______, _______, _______, _______ } }, -/* flipped Function & Media Keys +/* M5 Switched Function & Media Keys| +* accessed by sliding from M4 to M5 with thumb * ,-----------------------------------------------------------------------------------. * | | | F7 | F8 | F9 | F12 | | Print|Scroll| Pause| | | * |------+------+------+------+------+-------------+------+------+------+------+------| -* | | ³ | F4 | F5 | F6 | F11 | | Mute | Vol- | Vol+ | | | +* | Tab | ³ | F4 | F5 | F6 | F11 | | Mute | Vol- | Vol+ | | Enter| * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| ² | F1 | F2 | F3 | F10 | | Prev | Play | Next | |Shift | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -132,13 +134,14 @@ slide from m4 to m5 to access flipped version * `-----------------------------------------------------------------------------------' */ [5] = { - { KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F12, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_NO, KC_NO }, - { KC_NO, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO }, - { _______, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, _______ }, - { _______, _______, _______, KC_NO, _______, _______, _______, _______, KC_NO, _______, _______, _______ } + { XXXXXXX, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, XXXXXXX, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX }, + { _______, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, _______ }, + { _______, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, _______ }, + { _______, _______, _______, XXXXXXX, _______, _______, _______, _______, XXXXXXX, _______, _______, _______ } } }; + const uint16_t PROGMEM fn_actions[] = { }; diff --git a/keyboards/planck/keymaps/bone2planck/readme.md b/keyboards/planck/keymaps/bone2planck/readme.md index 3c425efd..be22eabd 100644 --- a/keyboards/planck/keymaps/bone2planck/readme.md +++ b/keyboards/planck/keymaps/bone2planck/readme.md @@ -1,8 +1,96 @@ -check keymap.c to the layers +Bone2Planck +===================================== -This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout. +This layout tries to emulate the Bone2 variant of Neo2, and is intended to be used with a German QWERTZ softwarelayout. It has "üäöß" as it is optimized for a mix of German & English. -My favourite features are the placement of the special characters often used for programming right on the home row -and the number & navigation block combo, so you never have to move your hands from their home position. +The special character layer and the navigation & number block layer are inspired by the Neo2 layers, +designed to keep the fingers near the home row. -Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone \ No newline at end of file +Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone + +To build, run "make" from within the \bone2planck folder. + +## Bone2 (adapted) Base Layer +``` + ,-----------------------------------------------------------------------------------. + | ß | J | D | U | A | X | P | H | L | M | W | Q | + |------+------+------+------+------+-------------+------+------+------+------+------| + | M1 | C | T | I | E | O | B | N | R | S | G |M1/Ent| hold: M1, tap: Enter + |------+------+------+------+------+------|------+------+------+------+------+------| + | Shift| F | V | Ãœ | Ä | Ö | Y | Z | , | . | K |Shift | + |------+------+------+------+------+------+------+------+------+------+------+------| + | Ctrl | GUI | Alt | M4 | M2 | Space | M2 | M4 | Alt | Esc | Ctrl | + `-----------------------------------------------------------------------------------' +``` + +## M1 Special Characters + very ergonomic placement for coding +``` + ,-----------------------------------------------------------------------------------. + | ° | @ | _ | [ | ] | ^ | ! | < | > | = | & | ´ | + |------+------+------+------+------+-------------+------+------+------+------+------| + | M1 | \ | / | { | } | * | ? | ( | ) | - | : |M1/Ent| hold: M1, tap: Enter + |------+------+------+------+------+------|------+------+------+------+------+------| + | Shift| # | ~ | | | $ | € | + | % | " | ' | ; |Shift | + |------+------+------+------+------+------+------+------+------+------+------+------| + | Ctrl | GUI | Alt | M4 | M2 | Space | M2 | M4 | Alt | Esc | Ctrl | + `-----------------------------------------------------------------------------------' +``` + +## M2 Navigation & Number Blocks + very easy to get used to & intuituve placement +``` + ,-----------------------------------------------------------------------------------. + | | PgUp | Bksp | Up | DEL | PgDn | | 7 | 8 | 9 | | Ins | + |------+------+------+------+------+-------------+------+------+------+------+------| + | Tab | Home | Lft | Down | Right| End | | 4 | 5 | 6 | . | Enter| + |------+------+------+------+------+------|------+------+------+------+------+------| + | Shift| | Tab | | Enter| | 0 | 1 | 2 | 3 | , |Shift | + |------+------+------+------+------+------+------+------+------+------+------+------| + | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Alt | Esc | Ctrl | + `-----------------------------------------------------------------------------------' +``` + +## M4 Function & Media Keys +``` + ,-----------------------------------------------------------------------------------. + | | | Print|Scroll|Pause | | | F7 | F8 | F9 | F12 | | + |------+------+------+------+------+-------------+------+------+------+------+------| + | Tab | | Mute | Vol- | Vol+ | | ³ | F4 | F5 | F6 | F11 | Enter| + |------+------+------+------+------+------|------+------+------+------+------+------| + | Shift| | Prev | Play | Next | | ² | F1 | F2 | F3 | F10 |Shift | + |------+------+------+------+------+------+------+------+------+------+------+------| + | Ctrl | GUI | Alt | M4 | M5 | Space | M5 | M4 | Alt | Esc | Ctrl | + `-----------------------------------------------------------------------------------' +``` + + +##Switched layers for one handed access: + +### M3 Switched Navigation & Number Blocks + accessed by sliding from M2 to M3 with thumb +``` + ,-----------------------------------------------------------------------------------. + | Ins | | 7 | 8 | 9 | | PgUp | Bksp | Up | DEL | PgDn | | + |------+------+------+------+------+-------------+------+------+------+------+------| + | Tab | | 4 | 5 | 6 | . | Home | Left | Down | Right| End | Enter| + |------+------+------+------+------+------|------+------+------+------+------+------| + | Shift| 0 | 1 | 2 | 3 | , | | Tab | | Enter| |Shift | + |------+------+------+------+------+------+------+------+------+------+------+------| + | Ctrl | GUI | Alt | M3 | | Space | | M3 | Alt | Esc | Ctrl | + `-----------------------------------------------------------------------------------' +``` + +### M5 Switched Function & Media Keys + accessed by sliding from M4 to M5 with thumb +``` + ,-----------------------------------------------------------------------------------. + | | | F7 | F8 | F9 | F12 | | Print|Scroll| Pause| | | + |------+------+------+------+------+-------------+------+------+------+------+------| + | Tab | ³ | F4 | F5 | F6 | F11 | | Mute | Vol- | Vol+ | | Enter| + |------+------+------+------+------+------|------+------+------+------+------+------| + | Shift| ² | F1 | F2 | F3 | F10 | | Prev | Play | Next | |Shift | + |------+------+------+------+------+------+------+------+------+------+------+------| + | Ctrl | GUI | Alt | | M5 | Space | M5 | | Alt | Esc | Ctrl | + `-----------------------------------------------------------------------------------' +``` \ No newline at end of file diff --git a/keyboards/planck/keymaps/brandon/Makefile b/keyboards/planck/keymaps/brandon/Makefile index 581e08cd..cf2c31f0 100644 --- a/keyboards/planck/keymaps/brandon/Makefile +++ b/keyboards/planck/keymaps/brandon/Makefile @@ -1,4 +1,6 @@ - +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options # change to "no" to disable the options, or define them in the Makefile in diff --git a/keyboards/planck/keymaps/callum/keymap.c b/keyboards/planck/keymaps/callum/keymap.c index 4d015171..aede27df 100644 --- a/keyboards/planck/keymaps/callum/keymap.c +++ b/keyboards/planck/keymaps/callum/keymap.c @@ -7,22 +7,19 @@ extern keymap_config_t keymap_config; -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. #define _BASE 0 #define _MOVE 1 #define _SYMB 2 #define _MOUSE 3 #define _FUNC 4 +#define ENDASH LALT(KC_MINS) +#define POUND LALT(KC_3) +#define H(X) LALT(LCTL(X)) enum planck_keycodes { MOVE = SAFE_RANGE, SYMB, - FUNC, - BELOW, - ABOVE + FUNC }; // Fillers to make layering more clear @@ -51,20 +48,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* MOVE * ,-----------------------------------------------------------------------------------. - * | Esc | | Cmd-L| Up | Cmd-R| | | Cmd-L| Up | Cmd-R| | Esc | + * | H(3) | H(F1)| H(F2)| H(F3)| H(F4)| H(F5)| H(8) | Home | Up | End | H(7) | Esc | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Del | Caps | Left | Down | Right| | | Left | Down | Right| Caps | Del | + * | H(4) | H(F6)| H(F7)| H(F8)| H(F9)|H(F10)| H(9) | Left | Down | Right| Caps | Del | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | Pg Up| Pg Dn| Above| | Pg Dn| Pg Up| | | | + * | |H(F11)|H(F12)| H(0) | H(1) | H(2) | H(A) | Pg Dn| Pg Up| H(5) | H(6) | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | Below| | | | | | | + * | | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ [_MOVE] = { - {KC_ESC, XXXXXXX, LGUI(KC_LEFT), KC_UP, LGUI(KC_RGHT), XXXXXXX, XXXXXXX, LGUI(KC_LEFT), KC_UP, LGUI(KC_RGHT), XXXXXXX, KC_ESC }, - {KC_DEL, KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_CAPS, KC_DEL }, - {_______, XXXXXXX, XXXXXXX, KC_PGUP, KC_PGDN, ABOVE, XXXXXXX, KC_PGDN, KC_PGUP, XXXXXXX, XXXXXXX, _______}, - {_______, _______, _______, _______, _______, BELOW, _______, _______, _______, _______, _______, _______} + {H(KC_3), H(KC_F1),H(KC_F2),H(KC_F3),H(KC_F4),H(KC_F5),H(KC_8), KC_HOME, KC_UP, KC_END, H(KC_7), KC_ESC }, + {H(KC_4), H(KC_F6),H(KC_F7),H(KC_F8),H(KC_F9),H(KC_F10),H(KC_9),KC_LEFT, KC_DOWN, KC_RGHT, KC_CAPS, KC_DEL }, + {_______, H(KC_F11),H(KC_F12),H(KC_0),H(KC_1),H(KC_2), H(KC_A), KC_PGDN, KC_PGUP, H(KC_5), H(KC_6), _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} }, /* SYMB @@ -79,8 +76,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_SYMB] = { - {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, LALT(KC_MINS)}, - {KC_DEL, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, LALT(KC_3)}, + {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, ENDASH }, + {KC_DEL, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, POUND }, {_______, KC_TILD, KC_GRV, KC_PLUS, KC_EQL, KC_PIPE, KC_BSLS, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} }, @@ -117,7 +114,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FUNC] = { {RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_VOLU}, {XXXXXXX, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_VOLD}, - {_______, KC_F21, KC_F22, KC_F23, KC_F24, XXXXXXX, XXXXXXX, KC_POWER, XXXXXXX, XXXXXXX, XXXXXXX, _______}, + {_______, KC_F21, KC_F22, KC_F23, KC_F24, XXXXXXX, XXXXXXX, KC_POWER,XXXXXXX, XXXXXXX, XXXXXXX, _______}, {_______, _______, _______, _______, KC_MPRV, KC_MUTE, KC_MPLY, KC_MNXT, _______, _______, _______, _______} } @@ -153,30 +150,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - case BELOW: - if (record->event.pressed) { - register_code(KC_LGUI); - register_code(KC_RGHT); - unregister_code(KC_RGHT); - unregister_code(KC_LGUI); - register_code(KC_ENT); - unregister_code(KC_ENT); - } - return false; - break; - case ABOVE: - if (record->event.pressed) { - register_code(KC_LGUI); - register_code(KC_LEFT); - unregister_code(KC_LEFT); - unregister_code(KC_LGUI); - register_code(KC_ENT); - unregister_code(KC_ENT); - register_code(KC_UP); - unregister_code(KC_UP); - } - return false; - break; } return true; } diff --git a/keyboards/planck/keymaps/callum/readme.md b/keyboards/planck/keymaps/callum/readme.md index 0baeba46..4d4e5cdd 100644 --- a/keyboards/planck/keymaps/callum/readme.md +++ b/keyboards/planck/keymaps/callum/readme.md @@ -2,11 +2,11 @@ This is a layout for the grid planck, built with a few ideals in mind: -- Minimal response times should be maintained. Keys that react differently depending on whether they are tapped or held, keys that react differently if they are double tapped, etc. should be avoided – they inevitably send their keycode later than a normal key – interrupting the immediate feedback from the screen. Therefore we restrict ourselves to chording as our only means of getting more than one symbol out of a single physical key. +- Consistent and minimal response times should be maintained. Keys that react differently depending on whether they are tapped or held, keys that react differently if they are double tapped, etc. should be avoided – they inevitably send their keycode later than a normal key – interrupting the immediate feedback from the screen. Therefore we restrict ourselves to chording as our only means of getting more than one symbol out of a single physical key. - The hands should never need to leave the home position. The usual culprit for this is the arrow cluster, so the arrow cluster should be as close to home as possible. - There should be two of every modifier (one on each side), otherwise certain long key combinations become hard to make. -We have five layers. A `BASE` layer, in colemak; a `MOVE` layer, with an arrow cluster and other movement keys; a `SYMB` layer, with numbers and symbols; a `FUNC` layer, with function keys and media keys; and a `MOUSE` layer, with mouse emulation. +We have five layers. A `BASE` layer, in colemak; a `MOVE` layer, with an arrow cluster, other movement keys, and hotkeys; a `SYMB` layer, with numbers and symbols; a `FUNC` layer, with function keys and media keys; and a `MOUSE` layer, with mouse emulation. The `MOUSE` layer is activated by holding the Move and Symb keys simultaniously. ``` /* BASE @@ -23,13 +23,13 @@ We have five layers. A `BASE` layer, in colemak; a `MOVE` layer, with an arrow c /* MOVE * ,-----------------------------------------------------------------------------------. - * | Esc | | Cmd-L| Up | Cmd-R| | | Cmd-L| Up | Cmd-R| | Esc | + * | H(3) | H(F1)| H(F2)| H(F3)| H(F4)| H(F5)| H(8) | Home | Up | End | H(7) | Esc | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Del | Caps | Left | Down | Right| | | Left | Down | Right| Caps | Del | + * | H(4) | H(F6)| H(F7)| H(F8)| H(F9)|H(F10)| H(9) | Left | Down | Right| Caps | Del | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | Pg Up| Pg Dn| Above| | Pg Dn| Pg Up| | | | + * | |H(F11)|H(F12)| H(0) | H(1) | H(2) | H(A) | Pg Dn| Pg Up| H(5) | H(6) | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | Below| | | | | | | + * | | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ @@ -63,7 +63,7 @@ We have five layers. A `BASE` layer, in colemak; a `MOVE` layer, with an arrow c * |------+------+------+------+------+------+------+------+------+------+------+------| * | | F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | Vol- | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | F21 | F22 | F23 | F24 | | | Lock | | | | | + * | | F21 | F22 | F23 | F24 | | | Power| | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | Prev | Mute | Play | Next | | | | | * `-----------------------------------------------------------------------------------' diff --git a/keyboards/planck/keymaps/cbbrowne/Makefile b/keyboards/planck/keymaps/cbbrowne/Makefile index 581e08cd..19e5c2a8 100644 --- a/keyboards/planck/keymaps/cbbrowne/Makefile +++ b/keyboards/planck/keymaps/cbbrowne/Makefile @@ -5,21 +5,22 @@ # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = yes # Audio output on port C6 +AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +API_SYSEX_ENABLE = no # Enable SYSEX API (+5390) # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/planck/keymaps/cbbrowne/config.h b/keyboards/planck/keymaps/cbbrowne/config.h index 1e04ba61..3a4ee907 100644 --- a/keyboards/planck/keymaps/cbbrowne/config.h +++ b/keyboards/planck/keymaps/cbbrowne/config.h @@ -1,6 +1,13 @@ #ifndef CONFIG_USER_H #define CONFIG_USER_H +#ifndef NO_DEBUG +#define NO_DEBUG +#endif +#ifndef NO_PRINT +#define NO_PRINT +#endif + #include "../../config.h" #define LEADER_TIMEOUT 300 diff --git a/keyboards/planck/keymaps/cbbrowne/keymap.c b/keyboards/planck/keymaps/cbbrowne/keymap.c index 7f1601af..0448a8d1 100644 --- a/keyboards/planck/keymaps/cbbrowne/keymap.c +++ b/keyboards/planck/keymaps/cbbrowne/keymap.c @@ -62,6 +62,7 @@ - How about Alt-F1 thru Alt-F8? - What's the keystroke to get from X to console these days? - A layer for doing console switching would not be a bad idea + - I haven't got page-up/page-down, let's have that... */ enum layers { @@ -94,6 +95,7 @@ enum macro_id { #define SHIFTQUOTE MT(MOD_RSFT, KC_QUOT) #define ALTRIGHT MT(MOD_LALT, KC_RGHT) #define MVERSION M(M_VERSION) +#define ALTSLASH LALT(KC_SLSH) /* Note that Planck has dimensions 4 rows x 12 columns */ @@ -108,15 +110,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }, [_RAISE] = { /* RAISE */ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, QWERTY, KEYPAD, KEYPAD, RESET, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + {_______, KC_4, KC_5, KC_6, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {_______, KC_7, KC_8, KC_9, _______, _______, _______, QWERTY, KEYPAD, KEYPAD, ALTSLASH,_______}, + {_______, KC_0, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_HOME, KC_END, KC_PGUP} }, [_LOWER] = { /* LOWER */ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, {_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, QWERTY, KEYPAD, KEYPAD, RESET, _______}, - {_______, KEYPAD, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, QWERTY, KEYPAD, KEYPAD, ALTSLASH, _______}, + {_______, KEYPAD, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_HOME, KC_END, KC_PGUP} }, [_KEYPAD] = { /* Key Pad */ {KC_ESC, USERNAME, MVERSION, KC_F10, KC_F11, KC_F12, KC_PGUP, KC_KP_ENTER, KC_7, KC_8, KC_9, KC_BSPC}, diff --git a/keyboards/planck/keymaps/dbroqua/config.h b/keyboards/planck/keymaps/dbroqua/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/planck/keymaps/dbroqua/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/default/Makefile b/keyboards/planck/keymaps/default/Makefile index 0f495388..457a3d01 100644 --- a/keyboards/planck/keymaps/default/Makefile +++ b/keyboards/planck/keymaps/default/Makefile @@ -1,25 +1,3 @@ - - -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = yes # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - ifndef QUANTUM_DIR include ../../../../Makefile endif diff --git a/keyboards/planck/keymaps/default/config.h b/keyboards/planck/keymaps/default/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/planck/keymaps/default/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/default/keymap.c b/keyboards/planck/keymaps/default/keymap.c index 5f71ae7d..d149019f 100644 --- a/keyboards/planck/keymaps/default/keymap.c +++ b/keyboards/planck/keymaps/default/keymap.c @@ -14,13 +14,16 @@ extern keymap_config_t keymap_config; // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. -#define _QWERTY 0 -#define _COLEMAK 1 -#define _DVORAK 2 -#define _LOWER 3 -#define _RAISE 4 -#define _PLOVER 5 -#define _ADJUST 16 + +enum planck_layers { + _QWERTY, + _COLEMAK, + _DVORAK, + _LOWER, + _RAISE, + _PLOVER, + _ADJUST +}; enum planck_keycodes { QWERTY = SAFE_RANGE, @@ -99,16 +102,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+-------------+------+------+------+------+------| * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ [_LOWER] = { - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, - {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, + {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, /* Raise @@ -117,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+-------------+------+------+------+------+------| * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' @@ -125,7 +128,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RAISE] = { {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, @@ -135,7 +138,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+-------------+------+------+------+------+------| * | | S | T | P | H | * | * | F | P | L | T | D | * |------+------+------+------+------+------|------+------+------+------+------+------| - * |TogOut| S | K | W | R | * | * | R | B | G | S | Z | + * | | S | K | W | R | * | * | R | B | G | S | Z | * |------+------+------+------+------+------+------+------+------+------+------+------| * | Exit | | | A | O | | E | U | | | | * `-----------------------------------------------------------------------------------' @@ -160,7 +163,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ADJUST] = { - {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL }, {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______}, {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} diff --git a/keyboards/clueboard/keymaps/max/Makefile b/keyboards/planck/keymaps/espynn/Makefile similarity index 63% rename from keyboards/clueboard/keymaps/max/Makefile rename to keyboards/planck/keymaps/espynn/Makefile index 950dadf8..44a030ba 100644 --- a/keyboards/clueboard/keymaps/max/Makefile +++ b/keyboards/planck/keymaps/espynn/Makefile @@ -42,8 +42,22 @@ # change to "no" to disable the options, or define them in the makefile.mk in # the appropriate keymap folder that will get included automatically # -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/planck/keymaps/espynn/keyboard-layout.jpg b/keyboards/planck/keymaps/espynn/keyboard-layout.jpg new file mode 100644 index 00000000..c5e438f6 Binary files /dev/null and b/keyboards/planck/keymaps/espynn/keyboard-layout.jpg differ diff --git a/keyboards/planck/keymaps/espynn/keymap.c b/keyboards/planck/keymaps/espynn/keymap.c new file mode 100644 index 00000000..a24ad9d4 --- /dev/null +++ b/keyboards/planck/keymaps/espynn/keymap.c @@ -0,0 +1,151 @@ +#include "planck.h" +#include "action_layer.h" +#include "eeconfig.h" +#ifdef BACKLIGHT_ENABLE + #include "backlight.h" +#endif +#define PREVENT_STUCK_MODIFIERS +extern keymap_config_t keymap_config; + +// Symbolic names for macro IDs. +#define _QWERTY 0 // QUERTY layer +#define _LOWER 1 // Lower layer +#define _RAISE 2 // Raise layer +#define _CUSTOM 3 // Custom layer (LOWER + RAISE) +#define _BL 4 // Backlight +#define _CUS0 5 // Mobile# +#define _CUS1 6 // signature +#define _CUS2 7 // macro 2 +#define _CUS3 8 // macro 3 +#define _CUS4 9 // macro 4 +#define _CUS5 10 // email +#define _COPY 11 // copy +#define _PASTE 12 // paste +#define _CUT 13 // cut + +// Macro shortcuts. +#define QWERTY M(_LOWER) +#define LOWER M(_LOWER) +#define RAISE M(_RAISE) +#define CUSTOM M(_CUSTOM) +#define BL M(_BL) +#define CUS0 M(_CUS0) +#define CUS1 M(_CUS1) +#define CUS2 M(_CUS2) +#define CUS3 M(_CUS3) +#define CUS4 M(_CUS4) +#define CUS5 M(_CUS5) +#define COPY M(_COPY) +#define PASTE M(_PASTE) +#define CUT M(_CUT) + +// Func macro definitions. +#define LWR_PGDN FUNC(0) // Tap for PgDn, hold for LOWER +#define RSE_PGUP FUNC(1) // Tap for PgUp, hold for RAISE +#define CTL_CAPS FUNC(2) // Tap for Caps, hold for Ctrl (DOESN'T SEEM TO WORK) +#define SFT_ENT FUNC(3) // Tap for Enter, hold for Shift +#define ZM_NRM FUNC(4) // Zoom normal +#define ZM_IN FUNC(5) // Zoom out +#define ZM_OUT FUNC(6) // Zoom in + +// Enable these functions using FUNC(n) macro. +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_TAP_KEY(_LOWER, KC_PGDN), + [1] = ACTION_LAYER_TAP_KEY(_RAISE, KC_PGUP), + [2] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_CAPS), + [3] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), + [4] = ACTION_MODS_KEY(MOD_LCTL, KC_0), + [5] = ACTION_MODS_KEY(MOD_LCTL, KC_MINS), + [6] = ACTION_MODS_KEY(MOD_LCTL, KC_PLUS), + [7] = ACTION_MODS_KEY(MOD_LCTL, KC_UNDS), + }; + +// This config can be found at Keyboard layout editor site: https://goo.gl/cF7uIO +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_QWERTY] = { /* QWERTY */ + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_DEL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT}, + {KC_LCTL, KC_ESC, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[_LOWER] = { /* LOWER */ + {KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_UNDS, KC_LPRN, KC_RPRN, KC_LCBR, KC_RCBR, KC_MINS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_QUOT, KC_DQT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, ZM_NRM, ZM_IN, ZM_OUT, KC_TRNS, KC_PGDN, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} +}, +[_RAISE] = { /* RAISE */ + {KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_UNDS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_EQL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PLUS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS, KC_PIPE, KC_GRV, KC_TILD, S(KC_COMM), S(KC_DOT), KC_BSLS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_PGUP, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[_CUSTOM] = { /* CUSTOM */ + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, CUS0, CUS3, CUS4, KC_TRNS, KC_F12, KC_TRNS}, + {KC_TRNS, KC_TRNS, CUT, COPY, PASTE, CUS1, CUS5, CUS2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {BL, RESET, LALT(LCTL(KC_DEL)), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} +} +}; + +// Set a layer persistantly. +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +// Macro actions for each corresponding ID. +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case _RAISE: // Raised layer. + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _CUSTOM); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _CUSTOM); + } + break; + case _LOWER: // Lowered layer. + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _CUSTOM); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _CUSTOM); + } + break; + case _BL: // Backlight + if (record->event.pressed) { + register_code(KC_RSFT); +#ifdef BACKLIGHT_ENABLE + backlight_step(); +#endif + } else { + unregister_code(KC_RSFT); + } + break; + case _CUS0: // enter your mobile# here + return MACRODOWN(T(9), T(9), T(9), T(MINS),T(9), T(9), T(9), T(MINS),T(9), T(9), T(9), T(9),END); + case _CUS1: // signature line for email + return MACRODOWN(T(ENT), T(ENT), T(MINS), T(J), T(W), END); + case _CUS2: // Custom macro 2 + return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_L), UP(KC_LSFT), END ); + case _CUS3: // custom macro 3 + return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_F), UP(KC_LSFT), END ); + case _CUS4: // custom macro 4 + return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_I), UP(KC_LSFT), END ); + case _CUS5: // Enter your email here + return MACRODOWN( TYPE(KC_F), + DOWN(KC_LSFT), TYPE(KC_2), UP(KC_LSFT), + TYPE(KC_G), TYPE(KC_M), TYPE(KC_A), TYPE(KC_I), TYPE(KC_L), TYPE(KC_DOT), TYPE(KC_C), TYPE(KC_O), TYPE(KC_M), END ); + case _CUT: //cut macro + return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_X), UP(KC_LCTL), END ); + case _COPY: // copy macro + return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_C), UP(KC_LCTL), END ); + case _PASTE: // paste macro + return MACRODOWN( DOWN(KC_LCTL), TYPE(KC_V), UP(KC_LCTL), END ); + }; + return MACRO_NONE; +} \ No newline at end of file diff --git a/keyboards/planck/keymaps/espynn/layout.json b/keyboards/planck/keymaps/espynn/layout.json new file mode 100644 index 00000000..ccdf2afd --- /dev/null +++ b/keyboards/planck/keymaps/espynn/layout.json @@ -0,0 +1,290 @@ +[ + { + "backcolor": "#858585", + "name": "Planck 40%", + "author": "James Folkert", + "notes": "# Espynn's keymap for Planck Ortholinear 40% Mechanical Keyboard\nAdded several custom functions to the keymap from the \"ab\" map. Special thanks to \"mollat\" for demonstration of macros in their keymap.c\n \n\n![Layout](keyboard-layout.png \"Practical Keymap\")\n\n* Online keyboard layout editor: http://goo.gl/mlLAFZ\n\n# Notes\n* Front legend text is the custom layer (both raise and lower)\n* Holding is denoted by down arrow, for example, right shift is an enter button when tapped, shift when held\n* Simultaneous RAISE+LOWER enters CUSTOM layer. Several custom keymaps are here\n* I disregarded the advice of Jack and used macros for passwords. I accept my fate.\n* RAISE and LOWER also acts as PgUp and PgDn when tapped.\n* [CapsLock] also acts as [Ctrl] key when you press and hold. It is convenient for GNU Emacs users. (not sure if this works)\n* Bracket/ paran/ brace keys are placed in the center of the keyboard for programmer's convenience.", + "background": { + "name": "Aluminium brushed", + "style": "background-image: url('/bg/metal/aluminum_texture1642.jpg');" + }, + "switchMount": "cherry", + "switchBrand": "cherry", + "switchType": "MX1A-A1xx", + "pcb": true, + "plate": true + }, + [ + { + "fa": [ + 2, + 2, + 0, + 0 + ] + }, + "!\n1\n\n\nF1\n\n\n\n\n", + "@\n2\n\n\nF2\n\n\n\n\nQ", + "#\n3\n\n\nF3\n\n\n\n\nW", + "$\n4\n\n\nF4\n\n\n\n\nE", + "%\n5\n\n\nF5\n\n\n\n\nR", + "^\n6\n\n\nF6\n\n\n\n\nT", + "&\n7\n\n\nF7\n\n\n\n\nY", + "*\n8\n\n\nF8\n\n\n\n\nU", + "(\n9\n\n\nF9\n\n\n\n\nI", + { + "fa": [ + 2, + 0, + 0, + 0 + ] + }, + ")\n0\n\n\nF10\n\n\n\n\nO", + { + "fa": [ + 2, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + "_\n-\n\n\nF11\n\n\n\n\nP", + { + "a": 7, + "f": 3 + }, + "" + ], + [ + { + "f": 3 + }, + "", + { + "f": 3 + }, + "A", + { + "f": 3 + }, + "S", + { + "a": 4, + "f": 3 + }, + "=\n_\n\n\n\n\n\n\n\nD", + { + "t": "#ff0000", + "f": 3 + }, + "\n(\n\n\n\n\n\n\n\nF", + { + "t": "#000000", + "f": 3 + }, + "\n)\n\n\n\n\n\n\n\nG", + { + "f": 3 + }, + "\n{\n\n\nMacro0\n\n\n\n\nH", + { + "t": "#ff0000", + "f": 3 + }, + "\n}\n\n\nMacro3\n\n\n\n\nJ", + { + "t": "#000000", + "f": 3 + }, + "+\n-\n\n\nMacro4\n\n\n\n\nK", + { + "a": 7, + "f": 3 + }, + "L", + { + "a": 6, + "fa": [ + 2, + 2, + 2 + ] + }, + "\n\n:\n\nF12\n\n\n\n;", + { + "a": 7, + "fa": [ + 9 + ] + }, + "" + ], + [ + { + "f": 3 + }, + "Shift", + { + "f": 3 + }, + "Z", + { + "f": 3 + }, + "X\n\n\n\nCut", + { + "f": 3 + }, + "C\n\n\n\nCopy", + { + "a": 4, + "fa": [ + 2, + 2, + 0, + 0 + ] + }, + "\\\n[\n\n\nPaste\n\n\n\n\nV", + "|\n]\n\n\nMacro1\n\n\n\n\nB", + "`\n'\n\n\nMacro5\n\n\n\n\nN", + "~\n\"\n\n\nMacro2\n\n\n\n\nM", + { + "fa": [ + 2, + 2, + 0, + 0, + 0, + 0, + 0, + 2 + ] + }, + "<\n\n\n\n\n\n\n<\n\n,", + { + "fa": [ + 2, + 2, + 0 + ] + }, + ">\n\n\n\n\n\n\n>\n\n.", + { + "fa": [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 2 + ] + }, + "\\\n\n\n\n\n\n\n?\n\n/", + { + "fa": [ + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 2, + 9 + ] + }, + "\n\n\nShift\n\n\n\n\n\n\nShift" + ], + [ + { + "a": 7 + }, + "Ctrl\n\n\n\nBLight", + { + "a": 4, + "fa": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 2, + 9, + 9 + ] + }, + "\nZNorm\n\n\nRESET\n\n\n\n\n", + { + "fa": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 2, + 9, + 6 + ] + }, + "\nZIn\n\n\nc.a.del\n\n\n\n\n", + { + "fa": [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 2, + 9, + 9 + ] + }, + "\nZOut\n\n\n\n\n\n\n\n", + { + "a": 7, + "fa": [ + 9 + ] + }, + "⇓", + { + "a": 4, + "fa": [ + 9, + 5, + 5 + ], + "w": 2 + }, + "\n\n", + { + "a": 7 + }, + "⇑", + { + "a": 4, + "fa": [ + 2 + ] + }, + "\n\n\n\n\n\n\n\n\n←", + "\n\n\n\n\n\n\n\n\n↓", + "\n\n\n\n\n\n\n\n\n↑", + "\n\n\n\n\n\n\n\n\n→" + ] +] \ No newline at end of file diff --git a/keyboards/planck/keymaps/espynn/readme.md b/keyboards/planck/keymaps/espynn/readme.md new file mode 100644 index 00000000..ea84cf95 --- /dev/null +++ b/keyboards/planck/keymaps/espynn/readme.md @@ -0,0 +1,24 @@ +# Espynn's keymap for Planck Ortholinear 40% Mechanical Keyboard +Created by James Folkert: https://twitter.com/trekloFsemaJ +Added several custom functions to the keymap from the "ab" map. Special thanks to "mollat" for demonstration of macros in their keymap.c + + +![Layout](keyboard-layout.jpg "Practical Keymap") + + +* Online keyboard layout editor: http://www.keyboard-layout-editor.com/ +* [JSON of raw layout] (layout.json "JSON of raw layout") + +# Notes +* Simultaneous RAISE+LOWER enters CUSTOM layer. Several custom keymaps are here +* I disregarded the advice of Jack and used macros for passwords. I accept my fate. These have been abstracted to macros 2, 3, and 4 +* add your mobile and email to the keymap before make +* RAISE and LOWER also acts as PgUp and PgDn when tapped. +* Bracket/ paran/ brace keys are placed in the center of the keyboard for programmer's convenience. + +## changes +* Removed some unneeded keys from raise and lower layers +* moved the + and = signs, backspace is now more intuitive +* moved all the Function keys to CUSTOM layer +* added ctrl alt del to CUSTOM layer +* simplified the layout picture greatly \ No newline at end of file diff --git a/keyboards/planck/keymaps/experimental/config.h b/keyboards/planck/keymaps/experimental/config.h index 52acd190..492490ca 100644 --- a/keyboards/planck/keymaps/experimental/config.h +++ b/keyboards/planck/keymaps/experimental/config.h @@ -9,9 +9,32 @@ /* ws2812 RGB LED */ #define RGB_DI_PIN B1 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 8 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + #endif diff --git a/keyboards/planck/keymaps/impossible/Makefile b/keyboards/planck/keymaps/impossible/Makefile index 581e08cd..cf2c31f0 100644 --- a/keyboards/planck/keymaps/impossible/Makefile +++ b/keyboards/planck/keymaps/impossible/Makefile @@ -1,4 +1,6 @@ - +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options # change to "no" to disable the options, or define them in the Makefile in diff --git a/keyboards/planck/keymaps/impossible/config.h b/keyboards/planck/keymaps/impossible/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/planck/keymaps/impossible/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/jeebak/Makefile b/keyboards/planck/keymaps/jeebak/Makefile index 581e08cd..cf2c31f0 100644 --- a/keyboards/planck/keymaps/jeebak/Makefile +++ b/keyboards/planck/keymaps/jeebak/Makefile @@ -1,4 +1,6 @@ - +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options # change to "no" to disable the options, or define them in the Makefile in diff --git a/keyboards/planck/keymaps/jeebak/config.h b/keyboards/planck/keymaps/jeebak/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/planck/keymaps/jeebak/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/jeremy-dev/keymap.c b/keyboards/planck/keymaps/jeremy-dev/keymap.c new file mode 100644 index 00000000..e7ed09b1 --- /dev/null +++ b/keyboards/planck/keymaps/jeremy-dev/keymap.c @@ -0,0 +1,180 @@ +// This is the personal keymap of Jeremy Cowgar (@jcowgar). It is written for the programmer. + +// Configuration options +#define PREVENT_STUCK_MODIFIERS + +#include "planck.h" +#include "action_layer.h" +#include "eeconfig.h" + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +enum my_layers { + ALPH = 0, + NUMS, + CURS, + SYMB, + FKEY +}; + +// Each macro gets a name for readability. +enum my_keycodes { + MY_ABVE = SAFE_RANGE, + MY_BELW, + MY_TERM, + MY_DEQL, // /= + MY_MEQL, // *= + MY_SEQL, // -= + MY_PEQL, // += + MY_NEQL, // != + MY_LTGT, // <> + MY_DPIP, // || + MY_DAMP, // && +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [ALPH] = { + {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P}, + {KC_A, KC_S, KC_D, KC_F, KC_G, KC_LPRN, KC_RPRN, KC_H, KC_J, KC_K, KC_L, KC_SCLN}, + {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_LCBR, KC_RCBR, KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH)}, + {CTL_T(KC_TAB), OSL(FKEY), OSL(NUMS), OSL(SYMB), KC_SPC, ALT_T(KC_BSPC), GUI_T(KC_DELT), KC_ENT, OSL(SYMB), OSL(CURS), TG(CURS), CTL_T(KC_ESC)} + }, + [NUMS] = { + {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_COMM, KC_7, KC_8, KC_9, KC_SLSH}, + {KC_LSFT, KC_LGUI, KC_LALT, KC_LCTL, KC_NO, KC_TRNS, KC_TRNS, KC_LPRN, KC_4, KC_5, KC_6, KC_ASTR}, + {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_RPRN, KC_1, KC_2, KC_3, KC_MINS}, + {KC_NO, KC_NO, KC_TRNS, TG(NUMS), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_0, KC_DOT, KC_EQL, KC_PLUS} + }, + [CURS] = { + {KC_MPLY, KC_BSPC, KC_UP, KC_DELT, KC_PGUP, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, + {KC_VOLU, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_TRNS, KC_TRNS, KC_NO, KC_LCTL, KC_LALT, KC_LGUI, KC_LSFT}, + {KC_VOLD, KC_NO, MY_ABVE, MY_TERM, KC_NO, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_LSFT}, + {KC_MUTE, KC_NO, MY_BELW, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_NO} + }, + [SYMB] = { + {MY_DEQL, MY_MEQL, MY_SEQL, MY_PEQL, MY_NEQL, KC_NO, KC_NO, MY_LTGT, KC_LABK, KC_RABK, KC_COLN, KC_DLR}, + {KC_SLSH, KC_ASTR, KC_MINS, KC_PLUS, KC_EQL, KC_NO, KC_PIPE, MY_DPIP, KC_GRV, KC_QUOT, KC_DQUO, KC_HASH}, + {KC_BSLS, KC_CIRC, KC_PERC, KC_UNDS, KC_NO, KC_NO, KC_AMPR, MY_DAMP, KC_TILD, KC_AT, KC_EXLM, KC_QUES}, + {KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO} + }, + [FKEY] = { + {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F9, KC_F10, KC_F11, KC_F12}, + {KC_LSFT, KC_LGUI, KC_LALT, KC_LCTL, KC_NO, KC_NO, KC_NO, KC_NO, KC_F5, KC_F6, KC_F7, KC_F8}, + {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4}, + {KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO} + } +}; + +void press_key(uint16_t key) { + register_code(key); + unregister_code(key); +} + +void press_two_keys(uint16_t key1, uint16_t key2) { + register_code(key1); + register_code(key2); + unregister_code(key2); + unregister_code(key1); +} + +void press_three_keys(uint16_t key1, uint16_t key2, uint16_t key3) { + register_code(key1); + register_code(key2); + register_code(key3); + unregister_code(key3); + unregister_code(key2); + unregister_code(key1); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case MY_BELW: + if (record->event.pressed) { + press_two_keys(KC_LGUI, KC_RGHT); + press_key(KC_ENT); + } + + return false; + + case MY_ABVE: + if (record->event.pressed) { + press_two_keys(KC_LGUI, KC_LEFT); + press_key(KC_ENT); + press_key(KC_UP); + } + + return false; + + case MY_TERM: + if (record->event.pressed) { + press_three_keys(KC_LGUI, KC_LSFT, KC_ENT); + } + + return false; + + case MY_DEQL: // /= + if (record->event.pressed) { + press_key(KC_SLSH); + press_key(KC_EQL); + } + + return false; + + case MY_MEQL: // *= + if (record->event.pressed) { + press_two_keys(KC_LSFT, KC_ASTR); + press_key(KC_EQL); + } + + return false; + + case MY_SEQL: // -= + if (record->event.pressed) { + press_key(KC_MINS); + press_key(KC_EQL); + } + + return false; + + case MY_PEQL: // += + if (record->event.pressed) { + press_two_keys(KC_LSFT, KC_PLUS); + press_key(KC_EQL); + } + + return false; + + case MY_NEQL: // != + if (record->event.pressed) { + press_two_keys(KC_LSFT, KC_EXLM); + press_key(KC_EQL); + } + + return false; + + case MY_LTGT: // <> + if (record->event.pressed) { + press_two_keys(KC_LSFT, KC_LABK); + press_two_keys(KC_LSFT, KC_RABK); + } + + return false; + + case MY_DPIP: // || + if (record->event.pressed) { + press_two_keys(KC_LSFT, KC_PIPE); + press_two_keys(KC_LSFT, KC_PIPE); + } + + return false; + + case MY_DAMP: // && + if (record->event.pressed) { + press_two_keys(KC_LSFT, KC_AMPR); + press_two_keys(KC_LSFT, KC_AMPR); + } + + return false; + } + + return true; +} diff --git a/keyboards/planck/keymaps/jeremy-dev/readme.md b/keyboards/planck/keymaps/jeremy-dev/readme.md new file mode 100644 index 00000000..b6a402d6 --- /dev/null +++ b/keyboards/planck/keymaps/jeremy-dev/readme.md @@ -0,0 +1,85 @@ +Jeremy Cowgar's Planck Keymap +============================= + +I am a programmer by trade and suffer from the beginning stages of RSI. As a programmer, I use letters, symbols and cursor navigation most often. To prevent strange finger gymnastics, I wrote a script to rank which non-letter characters occurred in my primary source projects most often and then placed these characters in the easiest to reach locations, within reason and for me. I made heavy use of momentary layer toggling. + +Layers +------ + +The key mapping is made up of 5 layers: Letters, Symbols, Navigation, Numbers, and Function Keys. + +The layout can be viewed visually at: + +http://www.keyboard-layout-editor.com/#/gists/319474e5e2d199e583371ed1d2aec316 + +* Purple buttons are dual function keys. +* Green buttons are layer momentary toggle keys. +* Red buttons are layer persistent toggle keys. + +The keys have multiple symbols: + +* Upper left: standard layer, the letter layer +* Upper right: function layer +* Lower left: navigation layer +* Lower right: symbol layer + +The symbols in the layout editor are not entirely clear. + +The Z and ? keys double as shift keys. Hold for a shift, tap for a Z or ? + +The bottom row from left to right: + +* Tab when pressed, Control when held. It also is the volume mute key when in the "Navigation" layer +* Function layer momentary toggle +* Number layer momentary toggle +* Symbol layer momentary toggle. When in the "Number" layer, this key also makes the "Number" layer sticky for using the 10 key for quite a bit of entry +* Space +* Backspace when tapped, Option when held +* Delete when tapped, Command when held +* Return +* Symbol layer momentary toggle. When in the "Number" layer, key also is the zero key. +* Navigation layer momentary toggle +* Navigation layer toggle. This was included for when you are browsing a website, document or otherwise wish to stay in navigation mode. When in the "Number" layer, the key is the = symbol +* Escape when pressed, Control when held. When in the "Number" layer, the key is the + symbol + +General Notes +------------- + +The letter layer is separated by 2 center rows of keys. This spreads the hands out a little further which helps not twist the wrists as much. The 2 center rows are [], (), [], and Ctrl and Alt keys. + +The symbol layer keys are accessed by the thumbs. They are the closest to the thumbs, instead of the number toggle, because in my code I found I used symbols much more often than numbers. There are two symbol layer keys because the symbols spread across the right and left half of the keyboard. Thus, some symbols are easier hit with the left hand modifier or right hand modifier. + +The number layer key is only accessible by the left thumb because all of the number keys are on the right side of the keyboard. When in the number layer, you can press the key to the right to make that layer sticky when you are going to do a lot of number entry. + +The function layer key is only accessible by the left thumb because all of the function keys are on the right side of the keyboard. + +The navigation layer key is only accessible by the right thumb because all of the navigation keys are on the left side of the keyboard. You can press the key to the right of the navigation layer to make the navigation layer sticky when you are doing a lot of navigation, reading a web page for example. + +When using the number or navigation layers, the same hand that accesses the momentary layer toggle key also has the 4 primary modifiers under their home row. + +* Pointer finger is control +* Middle finger is option +* Ring finger is command +* Pinky finger is shift + +This is so you can easily press Cmd+Shift+F4 or when navigating, select text or words of text by pressing Shift+Control, for example. + +Some keys are duplicated. For example, () are available in easy to reach locations while in the Number layer because they are often used in math. + +The symbol layer has additional helpers for programming including a single keys that enter /=, \*=, -=, +=, !=, <>, ||, and &&. It also includes three special Return keys on the left: + +* Up CR which moves the cursor up, to the end of the line and then presses CR +* Down CR which moves the cursor to the end of the line and then presses CR +* Right ; which moves the cursor to the end of the line and presses ; for C styled languages, such as JavaScript which is a primary language I use + +Word of Warning +--------------- + +I have been using the keymap for some time now and believe it to be a good keymap. There are a few things through the week that I wonder if it would have been better if this key were moved to that location. + +This keymap may change for further optimization. + +Please Give Feedback! +--------------------- + +I am very interested in your feedback. Send me a message here on GitHub, r/jcowgar or @jcowgar. diff --git a/keyboards/planck/keymaps/jhenahan/Makefile b/keyboards/planck/keymaps/jhenahan/Makefile index de01ad24..83da2a7f 100644 --- a/keyboards/planck/keymaps/jhenahan/Makefile +++ b/keyboards/planck/keymaps/jhenahan/Makefile @@ -1,4 +1,6 @@ - +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options # change to "no" to disable the options, or define them in the Makefile in diff --git a/keyboards/planck/keymaps/jhenahan/config.h b/keyboards/planck/keymaps/jhenahan/config.h index cd3adc41..1e42b92b 100644 --- a/keyboards/planck/keymaps/jhenahan/config.h +++ b/keyboards/planck/keymaps/jhenahan/config.h @@ -6,4 +6,27 @@ #define FORCE_NKRO #define WORKMAN_SOUND COLEMAK_SOUND +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + #endif diff --git a/keyboards/planck/keymaps/joe/Makefile b/keyboards/planck/keymaps/joe/Makefile index 581e08cd..b2ca4194 100644 --- a/keyboards/planck/keymaps/joe/Makefile +++ b/keyboards/planck/keymaps/joe/Makefile @@ -1,3 +1,6 @@ +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options @@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/planck/keymaps/khord/Makefile b/keyboards/planck/keymaps/khord/Makefile new file mode 100644 index 00000000..f0ed9e8d --- /dev/null +++ b/keyboards/planck/keymaps/khord/Makefile @@ -0,0 +1,4 @@ +TAP_DANCE_ENABLE = yes +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/planck/keymaps/khord/config.h b/keyboards/planck/keymaps/khord/config.h new file mode 100644 index 00000000..008f3a5c --- /dev/null +++ b/keyboards/planck/keymaps/khord/config.h @@ -0,0 +1,93 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define MANUFACTURER Ortholinear Keyboards +#define PRODUCT The Planck Keyboard +#define DESCRIPTION A compact ortholinear keyboard + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* Planck PCB default pin-out */ +#define MATRIX_ROW_PINS { D0, D5, B5, B6 } +#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } +#define UNUSED_PINS + +#define AUDIO_VOICES + +#define BACKLIGHT_PIN B7 + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* Tap Dance */ +#define TAPPING_TERM 150 + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#ifdef SUBPROJECT_rev3 + #include "rev3/config.h" +#endif +#ifdef SUBPROJECT_rev4 + #include "rev4/config.h" +#endif + +#endif diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c new file mode 100644 index 00000000..8001a098 --- /dev/null +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -0,0 +1,336 @@ +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, +// this is the style you want to emulate. + +#include "planck.h" +#include "action_layer.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _PLOVER 5 +#define _ADJUST 16 + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + PLOVER, + LOWER, + RAISE, + BACKLIT, + EXT_PLV +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Tap Dance Declarations +enum { + ESC_CAP = 0, + LFT_HOM, + DWN_PDN, + UPP_PUP, + RGT_END +}; + +// Dylan's additions +#define C_A_DEL LALT(LCTL(KC_DEL)) +#define C_A_INS LALT(LCTL(KC_INS)) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = { + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC }, + {TD(ESC_CAP), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT)}, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT } +}, + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = { + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = { + {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, + {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | END | HOME |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = { + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, + {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_END, KC_HOME, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |PG DN |PG UP |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGDN, KC_PGUP, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Plover layer (http://opensteno.org) + * ,-----------------------------------------------------------------------------------. + * | # | # | # | # | # | # | # | # | # | # | # | # | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | S | T | P | H | * | * | F | P | L | T | D | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |TogOut| S | K | W | R | * | * | R | B | G | S | Z | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Exit | | | A | O | | E | U | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_PLOVER] = { + {KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 }, + {XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC}, + {XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX} +}, + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = { + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______}, + {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, C_A_INS, C_A_DEL} +} + + +}; + + +qk_tap_dance_action_t tap_dance_actions[] = { + [ESC_CAP] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS), + [LFT_HOM] = ACTION_TAP_DANCE_DOUBLE(KC_LEFT, KC_HOME), + [DWN_PDN] = ACTION_TAP_DANCE_DOUBLE(KC_DOWN, KC_PGDN), + [UPP_PUP] = ACTION_TAP_DANCE_DOUBLE(KC_UP, KC_PGUP), + [RGT_END] = ACTION_TAP_DANCE_DOUBLE(KC_RGHT, KC_END) +}; + +#ifdef AUDIO_ENABLE + +float tone_startup[][2] = SONG(SONIC_RING); //plug in +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_plover[][2] = SONG(PLOVER_SOUND); +float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); +float music_scale[][2] = SONG(ZELDA_PUZZLE); //music mode + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + case PLOVER: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_NOTE_ARRAY(tone_plover, false, 0); + #endif + layer_off(_RAISE); + layer_off(_LOWER); + layer_off(_ADJUST); + layer_on(_PLOVER); + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + } + return false; + break; + case EXT_PLV: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); + #endif + layer_off(_PLOVER); + } + return false; + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif +} + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif diff --git a/keyboards/planck/keymaps/leo/Makefile b/keyboards/planck/keymaps/leo/Makefile index 581e08cd..b2ca4194 100644 --- a/keyboards/planck/keymaps/leo/Makefile +++ b/keyboards/planck/keymaps/leo/Makefile @@ -1,3 +1,6 @@ +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options @@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/planck/keymaps/lucas/Makefile b/keyboards/planck/keymaps/lucas/Makefile index 581e08cd..b2ca4194 100644 --- a/keyboards/planck/keymaps/lucas/Makefile +++ b/keyboards/planck/keymaps/lucas/Makefile @@ -1,3 +1,6 @@ +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options @@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/planck/keymaps/luke/Makefile b/keyboards/planck/keymaps/luke/Makefile new file mode 100644 index 00000000..84768687 --- /dev/null +++ b/keyboards/planck/keymaps/luke/Makefile @@ -0,0 +1,25 @@ + + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = yes # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/planck/keymaps/luke/keymap.c b/keyboards/planck/keymaps/luke/keymap.c new file mode 100644 index 00000000..26dcb451 --- /dev/null +++ b/keyboards/planck/keymaps/luke/keymap.c @@ -0,0 +1,355 @@ +/* + * A keyboard layout for the gridded planck. + * + * Copyright (C) 2017 Luke Silva + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + * + * This layout uses colemak by default, and is designed for programming, with easy access to symbols + * through either double purpose modifiers or colemak style rolling for commonly used symbol clusters + * Eg: compare colemak 'this' to '(){\n}' on the symbol layer. + * + * The layout also supports a range of multilingual characters, covering those + * needed for French, German, Swedish and likely some other European Languages. + * In the future full support for Colemak's multilingual deadkeys may be introduced. + * + * The multilingual characters are inputted through QMK's unicode engine, using + * the Linux input method by default, however this can be changed at runtime. + * + */ + + +#include "planck.h" + +#define _______ KC_TRNS +#define XXXXXXX KC_NO + + +// Layers +#define _COLEMAK 0 +#define _QWERTY 1 +#define _SYM 2 +#define _NUM 3 +#define _GR 4 +#define _GR_S 5 +#define _ADJ 6 +#define _NAV 7 +#define _PLOVER 8 + +// Macro ID numbers +#define M_ALT_HASH 1 +#define M_GR_DASH 2 +#define M_SYM_LPRN 3 +#define M_NAV_UNDS 4 +#define M_NUM_RPRN 5 +#define M_CTRL_DLR 6 +#define M_LCBR_ENT 7 +#define M_PLOVER 8 +#define M_EXT_PLV 9 +#define M_WINDOWS 10 +#define M_LINUX 11 +#define M_OSX 12 +#define M_FUNCTION 13 +#define M_THEN 14 +#define M_CATCH 15 + +// Macro keys +#define ALT_HASH MACROTAP(M_ALT_HASH) // tap for #, hold for Alt +#define GR_DASH MACROTAP(M_GR_DASH) // tap for -, hold for GR layer a-class-name +#define SYM_LPRN MACROTAP(M_SYM_LPRN) // tap for (, hold for symbols layer if() +#define NAV_UNDS MACROTAP(M_NAV_UNDS) // tap for _, hold for navigation layer snake_case_variable +#define NUM_RPRN MACROTAP(M_NUM_RPRN) // tap for ), hold for numbers layer else if() +#define CTRL_DLR MACROTAP(M_CTRL_DLR) // tap for $, hold for ctrl $php_is_really_weird +#define LCBR_ENT M(M_LCBR_ENT) // {\n easier code formatting +#define PLOVER M(M_PLOVER) // PHROPB (plover) or ERFVIK(qwerty) starts plover +#define EXT_PLV M(M_EXT_PLV) // PHRO*F (plover) or ERFVYU(qwerty) stops plover +#define WINDOWS M(M_WINDOWS) // Sets Unicode handler to windows +#define LINUX M(M_LINUX) // Sets Unicode handler to linux +#define OSX M(M_OSX) // Sets Unicode handler to OSX +#define FUNCTION M(M_FUNCTION) +#define THEN M(M_THEN) +#define CATCH M(M_CATCH) + + +// Renames of QMK keys... (would have otherwise been a macro) +#define QWERTY DF(_QWERTY) +#define COLEMAK DF(_COLEMAK) + + + + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ;: | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Bksp | A | R | S | T | D | H | N | E | I | O | '" | + * |------+------+------+------+------+------+------+------+------+------+------+------`---. + * |Shift=| Z | X | C | V | B | K | M | ,< | .> | /? |Shift/Ent | + * |------+------+------+------+------+------+------+------+------+------+------+----------| + * |CtCaps|GUIF4 | Alt# | Gr- | Sym( | Nav_ |Space | Num) |Ctrl$ | F11 | F12 |Nav toggle| + * `---------------------------------------------------------------------------------------' + */ + +[_COLEMAK] = { + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {SFT_T(KC_EQL), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT) }, + {CTL_T(KC_CAPS), KC_LGUI, ALT_HASH, GR_DASH, SYM_LPRN, NAV_UNDS, KC_SPC, NUM_RPRN, CTRL_DLR, KC_F11, KC_F12, TG(_NAV)} +}, + + + +/* QWERTY + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Bksp | A | S | D | F | G | H | J | K | L | ;: | '" | + * |------+------+------+------+------+------+------+------+------+------+------+------`---. + * |Shift=| Z | X | C | V | B | N | M | ,< | .> | /? |Shift/Ent | + * |------+------+------+------+------+------+------+------+------+------+------+----------| + * |CtCaps|GUIF4 | Alt# | Gr- | Sym( | Nav_ |Space | Num) |Ctrl$ | F11 | F12 |Nav toggle| + * `---------------------------------------------------------------------------------------' + */ + +[_QWERTY] = { + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT) }, + {CTL_T(KC_CAPS), KC_LGUI, KC_LALT, GR_DASH, SYM_LPRN,KC_SPC, KC_SPC, NUM_RPRN, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT} +}, + + +/* Symbols + * ,-----------------------------------------------------------------------------------. + * | Tab | ` | @ | / | * | ^ | % | : | + | - | Del | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | [ | ; | } | ( | " | ' | ) | {\n | ! | ] | \ | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Shift | . | { | < | > | ~ | X2 | = | & | | | ? |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | Sym | _ |Space | NUM | X2 | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_SYM] = { + {KC_TAB, KC_GRV, KC_AT, KC_SLSH, KC_ASTR, KC_CIRC, KC_PERC, KC_COLN, KC_PLUS, KC_MINS, KC_DEL, KC_BSPC}, + {FUNCTION,KC_LBRC, KC_SCLN, KC_RCBR, KC_LPRN, KC_DQT, KC_QUOT, KC_RPRN, LCBR_ENT,KC_EXLM, KC_RBRC, KC_BSLS}, + {KC_LSFT, KC_DOT, KC_LCBR, KC_LABK, KC_RABK, KC_TILD, _______, KC_EQL, KC_AMPR, KC_PIPE, KC_QUES, KC_ENT }, + {THEN, CATCH, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______} +}, + + +/* Numbers + * ,-----------------------------------------------------------------------------------. + * | Tab | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Bksp | x | D | E | F | + | - | 4 | 5 | 6 | 0 |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Shift | ( | A | B | C | * | / | 1 | 2 | 3 | ) |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | GR | SYM | _ |Space | NUM | 0 | . | f | | + * `-----------------------------------------------------------------------------------' + */ + +[_NUM] = { + {KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_BSPC, KC_X, S(KC_D), S(KC_E), S(KC_F), KC_PLUS, KC_MINS, KC_4, KC_5, KC_6, KC_0, KC_ENT }, + {KC_LSFT, KC_LPRN, S(KC_A), S(KC_B), S(KC_C), KC_ASTR, KC_SLSH, KC_1, KC_2, KC_3, KC_RPRN, KC_ENT }, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_F, _______} +}, + + +/* Gr layer / international keys + * ,-----------------------------------------------------------------------------------. + * | | ä | Ã¥ | | ¢£ | €¥ | | ë | ê | ü | ù | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | â | à | ß | | | | è | é | ï | ö | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | æ | ô | ç | Å“ | | | û | « | » | î | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_GR] = { + {_______, UC(0xE4),UC(0xE5), _______,UC(0xA2), UC(0x20AC),_______,UC(0xEB),UC(0xEA),UC(0xFC),UC(0xF9), _______}, + {_______, UC(0xE2),UC(0xE0),UC(0xDF), _______, _______, _______,UC(0xE8),UC(0xE9),UC(0xEF),UC(0xF6), _______}, + {MO(_GR_S),UC(0xE6),UC(0xF4),UC(0xE7),UC(0x153),_______, _______,UC(0xFB),UC(0xAB),UC(0xBB),UC(0xEE), MO(_GR_S)}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +}, + +// Shifted layer of the above +[_GR_S] = { + {_______, UC(0xC4),UC(0xC5), _______, UC(0xA3), UC(0xA5),_______, UC(0xCB),UC(0xCA),UC(0xDC),UC(0xD9),_______}, + {_______, UC(0xC2),UC(0xC0), UC(0xDF),_______, _______, _______, UC(0xC8),UC(0xC9),UC(0xCF),UC(0xD6),_______}, + {MO(_GR_S),UC(0xC6),UC(0xD4), UC(0xC7),UC(0x152),_______, _______, UC(0xDB),UC(0xAB),UC(0xBB),UC(0xCE),MO(_GR_S)}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +}, + + +/* Adjust Layer (Gr + Num) + * ,-----------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+-------------+------+------+------+------+------+------+------+------+------| + * | | |Prntscr| ESC |VOLUP | PLAY | PREV |QWERTY|COLEMAK|PLOVER| | | + * |------+-------------+------+------+------+------+------+------+------+------+------| + * | | |BACKLIT| INS |VOLDWN| MUTE | NEXT | WIND |LINUX | OSX | | | + * |------+-------------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_ADJ] = { + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 }, + {XXXXXXX, XXXXXXX, KC_PSCR, KC_ESC, KC_VOLU, KC_MPLY, KC_MPRV, QWERTY, COLEMAK, PLOVER, XXXXXXX, XXXXXXX}, + {XXXXXXX, XXXXXXX, BL_STEP, KC_INS, KC_VOLD, KC_MUTE, KC_MNXT, WINDOWS, LINUX, OSX, XXXXXXX, XXXXXXX}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +}, + + +/* Navigation + * ,-----------------------------------------------------------------------------------. + * | | | BTN3 | BTN2 | BTN1 | | ACL0 | HOME | PGDN | PGUP | END | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | |MSLEFT| MSDN | MSUP |MSRGHT| | ACL1 | LEFT | DOWN | UP | RGHT |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | |WHLEFT| WHDN | WHUP |WHRGHT| | ACL2 |C-LEFT|C-PGDN|C-PGUP|C-RGHT|Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | _ |Space | ACL0 | ACL1 | ACL2 | |TGLNAV| + * `-----------------------------------------------------------------------------------' + */ + +[_NAV] = { + {XXXXXXX, XXXXXXX, KC_BTN3, KC_BTN2, KC_BTN1, XXXXXXX, KC_ACL0, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_BSPC}, + {XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX, KC_ACL1, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_ENT }, + {XXXXXXX, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, XXXXXXX, KC_ACL2, LCTL(KC_LEFT), LCTL(KC_PGDN), LCTL(KC_PGUP), LCTL(KC_RIGHT), KC_ENT }, + {_______, _______, _______, _______, _______, _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______} +}, + +/* Plover Layer + * ,-----------------------------------------------------------------------------------. + * | | S | T | P | H | * | * | F | P | L | T | D | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |TogOut| S | K | W | R | * | * | R | B | G | S | Z | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | # | # | # | # | # | # | # | # | # | # | # | # | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Exit | | | # | A | O | E | U | | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_PLOVER] = { + {XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC}, + {XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 }, + {EXT_PLV, XXXXXXX, XXXXXXX, KC_1, KC_C, KC_V, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} +} + + +}; + +const uint16_t PROGMEM fn_actions[] = { +}; + + +void matrix_init_user(){ + set_unicode_input_mode(UC_LNX); +} + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case M_ALT_HASH: + return MACRO_TAP_SHFT_KEY_HOLD_MOD(record, 3, LALT); + case M_GR_DASH: + { + const macro_t* macro = MACRO_TAP_HOLD_LAYER(record, MACRO(T(MINS)), _GR); + update_tri_layer(_NUM, _GR, _ADJ); + return macro; + } + case M_SYM_LPRN: + return MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, 9, _SYM); + case M_NAV_UNDS: + return MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, MINS, _NAV); + case M_NUM_RPRN: + { + const macro_t* macro = MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, 0, _NUM); + update_tri_layer(_NUM, _GR, _ADJ); + return macro; + } + case M_CTRL_DLR: + return MACRO_TAP_SHFT_KEY_HOLD_MOD(record, 4, LCTL); + case M_LCBR_ENT: + return MACRODOWN(I(10), D(LSFT), T(LBRC), U(LSFT), T(ENT), END); + case M_PLOVER: + if (record->event.pressed) { + layer_and(0); + layer_on(_PLOVER); + default_layer_set(_PLOVER); + + // Starts plover + return MACRO(I(10), D(E), D(R), D(F), D(V), D(I), D(K), U(E), U(R), U(F), U(V), U(I), U(K), END); + } + break; + case M_EXT_PLV: + if (!record->event.pressed) { + layer_off(_PLOVER); + default_layer_set(_COLEMAK); + + //Pauses plover + return MACRO(I(10), D(E), D(R), D(F), D(V), D(Y), D(U), U(E), U(R), U(F), U(V), U(Y), U(U), END); + } + break; + case M_WINDOWS: + set_unicode_input_mode(UC_WIN); + break; + case M_LINUX: + set_unicode_input_mode(UC_LNX); + break; + case M_OSX: + set_unicode_input_mode(UC_OSX); + break; + case M_FUNCTION: + if (record->event.pressed) { + SEND_STRING("function"); + } + break; + case M_THEN: + if (record->event.pressed) { + SEND_STRING("then"); + } + break; + case M_CATCH: + if (record->event.pressed) { + SEND_STRING("catch"); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/planck/keymaps/luke/readme.md b/keyboards/planck/keymaps/luke/readme.md new file mode 100644 index 00000000..3a4824b5 --- /dev/null +++ b/keyboards/planck/keymaps/luke/readme.md @@ -0,0 +1,2 @@ +# A more basic Planck Layout for copying + diff --git a/keyboards/planck/keymaps/mitch/Makefile b/keyboards/planck/keymaps/mitch/Makefile new file mode 100644 index 00000000..7955003d --- /dev/null +++ b/keyboards/planck/keymaps/mitch/Makefile @@ -0,0 +1,5 @@ +SUBPROJECT = rev3 + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/planck/keymaps/mitch/config.h b/keyboards/planck/keymaps/mitch/config.h new file mode 100644 index 00000000..73bc50bc --- /dev/null +++ b/keyboards/planck/keymaps/mitch/config.h @@ -0,0 +1,2 @@ +#include "../../config.h" +#define PREVENT_STUCK_MODIFIERS diff --git a/keyboards/planck/keymaps/mitch/keymap.c b/keyboards/planck/keymaps/mitch/keymap.c new file mode 100644 index 00000000..79b5204f --- /dev/null +++ b/keyboards/planck/keymaps/mitch/keymap.c @@ -0,0 +1,70 @@ +#include "keymap.h" +#include "quantum.h" + +#define QWERTY 0 +#define LOWER 1 +#define RAISE 2 + +// Alias to make layering more clear +#define _______ KC_TRNS + +// In MacOS, switch between windows within an application +#define GUI_GRV LGUI(KC_GRV) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Ctl | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Esc | Del | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[QWERTY] = { + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_ENT) }, + {KC_ESC, KC_DEL, KC_LALT, KC_LGUI, MO(1), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | GUIGR| | | | | | | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Caps | | Mute | Vol- | Vol+ | | Bksp | $ | % | ^ | | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | ! | @ | # | \ |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | Enter | | | PgUp | PgUn | | + * `-----------------------------------------------------------------------------------' + */ +[LOWER] = { + {GUI_GRV, _______, _______, _______, _______, _______, _______, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, + {KC_CAPS, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_BSPC, KC_DLR, KC_PERC, KC_CIRC, KC_PIPE, KC_PIPE}, + {_______, _______, _______, _______, _______, _______, _______, KC_EXLM, KC_AT, KC_HASH, KC_BSLS, KC_ENT}, + {_______, _______, _______, _______, _______, KC_ENT, KC_ENT, _______, _______, KC_PGDN, KC_PGUP, _______} +}, + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | ` | ~ | ( | ) | | | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | [ | ] | { | } | | | 4 | 5 | 6 | | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | - | _ | = | + | | | 1 | 2 | 3 | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | Enter | | | | | | + * `-----------------------------------------------------------------------------------' + */ + +[RAISE] = { + {KC_GRV, KC_GRV, KC_TILD, KC_LPRN, KC_RPRN, _______, _______, KC_7, KC_8, KC_9, KC_0, _______}, + {_______, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______, _______, KC_4, KC_5, KC_6, _______, KC_BSLS}, + {_______, KC_MINS, KC_UNDS, KC_EQL, KC_PLUS, _______, _______, KC_1, KC_2, KC_3, _______, KC_ENT}, + {_______, _______, _______, _______, _______, KC_ENT, KC_ENT, _______, _______, KC_PGDN, KC_PGUP, _______} +} +}; diff --git a/keyboards/planck/keymaps/mitch/readme.md b/keyboards/planck/keymaps/mitch/readme.md new file mode 100644 index 00000000..3869304f --- /dev/null +++ b/keyboards/planck/keymaps/mitch/readme.md @@ -0,0 +1,26 @@ +## Flashing Keyboard + +1. Install `dfu` tools: + + brew tap osx-cross/avr + brew install avr-libc + brew install dfu-programmer + +2. Move to this directory. +3. Hit the reset button on the keyboard. +4. run `make dfu`. + +## The Keymap + +This keymap is designed for a rev3 Planck Keyboard. + +The default layer is QWERTY. The raise layer has a ten key on the right +and common programming punctuation on the left. The lower layer provides the +rest of the symbols, mostly mapped with the ten key numbers. + +The normal right shift key uses the `MT` macro to trigger Enter on tap and right +shift when held. + +This keymap sets the `PREVENT_STUCK_MODIFIERS` flag to avoid the occasional WTF +moments when using a modifier keys and accidentally releasing them after moving +to a new layer. diff --git a/keyboards/planck/keymaps/mollat/Makefile b/keyboards/planck/keymaps/mollat/Makefile index 581e08cd..b2ca4194 100644 --- a/keyboards/planck/keymaps/mollat/Makefile +++ b/keyboards/planck/keymaps/mollat/Makefile @@ -1,3 +1,6 @@ +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options @@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/planck/keymaps/nico/Makefile b/keyboards/planck/keymaps/nico/Makefile index 581e08cd..b2ca4194 100644 --- a/keyboards/planck/keymaps/nico/Makefile +++ b/keyboards/planck/keymaps/nico/Makefile @@ -1,3 +1,6 @@ +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options @@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/planck/keymaps/premek/Makefile b/keyboards/planck/keymaps/premek/Makefile index 0f495388..b2ca4194 100644 --- a/keyboards/planck/keymaps/premek/Makefile +++ b/keyboards/planck/keymaps/premek/Makefile @@ -1,3 +1,6 @@ +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options diff --git a/keyboards/planck/keymaps/premek/config.h b/keyboards/planck/keymaps/premek/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/planck/keymaps/premek/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/priyadi/Makefile b/keyboards/planck/keymaps/priyadi/Makefile index aa211d2f..27c2638e 100644 --- a/keyboards/planck/keymaps/priyadi/Makefile +++ b/keyboards/planck/keymaps/priyadi/Makefile @@ -1,5 +1,3 @@ - - # Build Options # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically @@ -8,15 +6,17 @@ BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +COMMAND_ENABLE = no # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = yes # Audio output on port C6 +AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes # Unicode map BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +API_SYSEX_ENABLE = no +FAUXCLICKY_ENABLE = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/planck/keymaps/priyadi/config.h b/keyboards/planck/keymaps/priyadi/config.h new file mode 100644 index 00000000..82e4a25c --- /dev/null +++ b/keyboards/planck/keymaps/priyadi/config.h @@ -0,0 +1,39 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#define PRIYADI_PLANCK + +/* bootmagic salt key */ +#define BOOTMAGIC_KEY_SALT KC_ESC + +/* skip bootmagic and eeconfig */ +#define BOOTMAGIC_KEY_SKIP KC_SPACE + +#define PREVENT_STUCK_MODIFIERS + +#define UNICODE_TYPE_DELAY 0 + +#define LAYOUT_DVORAK +#define LAYOUT_COLEMAK +#define LAYOUT_NORMAN +#define LAYOUT_WORKMAN + +#define DOUBLESPACE_LAYER_ENABLE + // #define TOLELOT_ENABLE + +#define KEYMAP( \ + k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \ + k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \ + k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \ + k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c \ +) \ +{ \ + {k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c}, \ + {k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c}, \ + {k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c}, \ + {k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c} \ +} + +#endif diff --git a/keyboards/planck/keymaps/priyadi/keymap.c b/keyboards/planck/keymaps/priyadi/keymap.c index 6e7f4e73..bb3a2e92 100644 --- a/keyboards/planck/keymaps/priyadi/keymap.c +++ b/keyboards/planck/keymaps/priyadi/keymap.c @@ -1,447 +1 @@ -// This is the canonical layout file for the Quantum project. If you want to add another keyboard, -// this is the style you want to emulate. - -#include "planck.h" -#include "action_layer.h" -#ifdef AUDIO_ENABLE - #include "audio.h" - #include "musical_notes.h" -#endif -#include "eeconfig.h" -#include "process_unicode.h" -#include "quantum.h" - -extern keymap_config_t keymap_config; - -enum layers { - _QWERTY, - _COLEMAK, - _WORKMAN, - _PUNC, - _NUM, - _FUNC, - _EMOJI, - _GUI, -}; - -enum planck_keycodes { - // layouts - QWERTY = SAFE_RANGE, - COLEMAK, - WORKMAN, - - // layer switchers - PUNC, - NUM, - FUNC, - EMOJI, - GUI, - - // os switchers - LINUX, - WIN, - OSX, -}; - -// Fillers to make layering clearer - -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -// unicode map - -enum unicode_name { - GRIN, // grinning face 😊 - TJOY, // tears of joy 😂 - SMILE, // grining face with smiling eyes 😠- HEART, // heart ⤠- EYERT, // smiling face with heart shaped eyes 😠- CRY, // crying face 😭 - SMEYE, // smiling face with smiling eyes 😊 - UNAMU, // unamused 😒 - KISS, // kiss 😘 - HART2, // two hearts 💕 - WEARY, // weary 😩 - OKHND, // ok hand sign 👌 - PENSV, // pensive 😔 - SMIRK, // smirk 😠- RECYC, // recycle â™» - WINK, // wink 😉 - THMUP, // thumb up 👠- THMDN, // thumb down 👎 - PRAY, // pray 🙠- PHEW, // relieved 😌 - MUSIC, // musical notes - FLUSH, // flushed 😳 - CELEB, // celebration 🙌 - CRY2, // crying face 😢 - COOL, // smile with sunglasses 😎 - NOEVS, // see no evil - NOEVH, // hear no evil - NOEVK, // speak no evil - POO, // pile of poo - EYES, // eyes - VIC, // victory hand - BHART, // broken heart - SLEEP, // sleeping face - SMIL2, // smiling face with open mouth & sweat - HUNRD, // 100 - CONFU, // confused - TONGU, // face with tongue & winking eye - DISAP, // disappointed - YUMMY, // face savoring delicious food - CLAP, // hand clapping - FEAR, // face screaming in fear - HORNS, // smiling face with horns - HALO, // smiling face with halo - BYE, // waving hand - SUN, // sun - MOON, // moon - SKULL, // skull -}; - -const uint32_t PROGMEM unicode_map[] = { - [GRIN] = 0x1F600, - [TJOY] = 0x1F602, - [SMILE] = 0x1F601, - [HEART] = 0x2764, - [EYERT] = 0x1f60d, - [CRY] = 0x1f62d, - [SMEYE] = 0x1F60A, - [UNAMU] = 0x1F612, - [KISS] = 0x1F618, - [HART2] = 0x1F495, - [WEARY] = 0x1F629, - [OKHND] = 0x1F44C, - [PENSV] = 0x1F614, - [SMIRK] = 0x1F60F, - [RECYC] = 0x267B, - [WINK] = 0x1F609, - [THMUP] = 0x1F44D, - [THMDN] = 0x1F44E, - [PRAY] = 0x1F64F, - [PHEW] = 0x1F60C, - [MUSIC] = 0x1F3B6, - [FLUSH] = 0x1F633, - [CELEB] = 0x1F64C, - [CRY2] = 0x1F622, - [COOL] = 0x1F60E, - [NOEVS] = 0x1F648, - [NOEVH] = 0x1F649, - [NOEVK] = 0x1F64A, - [POO] = 0x1F4A9, - [EYES] = 0x1F440, - [VIC] = 0x270C, - [BHART] = 0x1F494, - [SLEEP] = 0x1F634, - [SMIL2] = 0x1F605, - [HUNRD] = 0x1F4AF, - [CONFU] = 0x1F615, - [TONGU] = 0x1F61C, - [DISAP] = 0x1F61E, - [YUMMY] = 0x1F60B, - [CLAP] = 0x1F44F, - [FEAR] = 0x1F631, - [HORNS] = 0x1F608, - [HALO] = 0x1F607, - [BYE] = 0x1F44B, - [SUN] = 0x2600, - [MOON] = 0x1F314, - [SKULL] = 0x1F480, -}; - - -// hybrid shift - = -// #undef KC_LSFT -// #define KC_LSFT MT(MOD_LSFT, KC_MINS) -// #undef KC_RSFT -// #define KC_RSFT MT(MOD_LSFT, KC_EQL) - - -// hybrid right-gui & scroll lock (mapped to Compose in OS) -#undef KC_RCTL -#define KC_RCTL MT(MOD_LCTL, KC_SLCK) - -// keymaps - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; |Enter | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | Alt | Punc | Num | Space | Func |Emoji |AltGr | GUI | Ctrl | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = { - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT }, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, - {KC_LCTL, KC_LGUI, KC_LALT, PUNC, NUM, KC_SPC, KC_SPC, FUNC, EMOJI, KC_RALT, KC_RGUI, KC_RCTL} -}, - -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O |Enter | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | Alt | Punc | Num | Space | Func |Emoji |AltGr | GUI | Ctrl | - * `-----------------------------------------------------------------------------------' - */ -[_COLEMAK] = { - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT }, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, - {KC_LCTL, KC_LGUI, KC_LALT, PUNC, NUM, KC_SPC, KC_SPC, FUNC, EMOJI, KC_RALT, KC_RGUI, KC_RCTL} -}, - -/* Workman - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | Alt | Punc | Num | Space | Func |Emoji |AltGr | GUI | Ctrl | - * `-----------------------------------------------------------------------------------' - */ -[_WORKMAN] = { - {KC_TAB, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_SCLN, KC_BSPC}, - {KC_ESC, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, KC_ENT }, - {KC_LSFT, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, - {KC_LCTL, KC_LGUI, KC_LALT, PUNC, NUM, KC_SPC, KC_SPC, FUNC, EMOJI, KC_RALT, KC_RGUI, KC_RCTL} -}, - -/* Punc - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | ` | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | \ | - | = | < | > | ( | ) | ' | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | _ | + | { | } | [ | ] | " | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_PUNC] = { - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_GRV }, - {XXXXXXX, XXXXXXX, KC_BSLS, KC_MINS, KC_EQL, KC_LABK, KC_RABK, KC_LPRN, KC_RPRN, KC_QUOT, XXXXXXX, XXXXXXX}, - {XXXXXXX, XXXXXXX, KC_PIPE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_DQUO, XXXXXXX, XXXXXXX}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, - -/* Num - * ,-----------------------------------------------------------------------------------. - * | ^ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | @ | A | B | C | ( | ) | 4 | 5 | 6 | : |Enter | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | & | # | D | E | F | [ | ] | 1 | 2 | 3 | / | * | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | x | | | 0 | , | . | + | - | - * `-----------------------------------------------------------------------------------' - */ -[_NUM] = { - {KC_CIRC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - { KC_ESC, KC_AT, S(KC_A), S(KC_B), S(KC_C), KC_LPRN, KC_RPRN, KC_4, KC_5, KC_6, KC_COLN, KC_ENT}, - {KC_AMPR, KC_HASH, S(KC_D), S(KC_E), S(KC_F), KC_LBRC, KC_RBRC, KC_1, KC_2, KC_3, KC_SLSH, KC_ASTR}, - {_______, _______, _______, KC_X, _______, KC_SPC, KC_SPC, KC_0, KC_COMM, KC_DOT, KC_PLUS, KC_MINS} -}, - -/* Func - * ,-----------------------------------------------------------------------------------. - * | | F1 | F2 | F3 | F4 | | | PgUp | Up | PgDn | PgUp | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | Ins | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F9 | F10 | F11 | F12 | | | | Home | End | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_FUNC] = { - {XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL}, - {XXXXXXX, KC_F5, KC_F6, KC_F7, KC_F8,KC_PSCREEN,XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_INS}, - {_______, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, - -/* Emoji - * ,-----------------------------------------------------------------------------------. - * | | | | | | | | | | | | | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_EMOJI] = { - {X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW)}, - {X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS)}, - {X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH)}, - { X(POO), X(EYES),X(HUNRD), _______,X(SKULL),X(HORNS), X(HALO), X(FEAR), _______,X(YUMMY),X(DISAP),X(NOEVK)} -}, - -/* GUI - * ,-----------------------------------------------------------------------------------. - * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * |Linux | | Vol- | Mute | Vol+ | | | D- | | D+ | |Qwerty| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Win | | Prev | Play | Next | | | | | | |Colmak| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | OSX | | | | | BL- | BL+ | | | | |Workmn| - * `-----------------------------------------------------------------------------------' - */ -[_GUI] = { - {_______, LGUI(KC_1),LGUI(KC_2),LGUI(KC_3),LGUI(KC_4),LGUI(KC_5),LGUI(KC_6),LGUI(KC_7),LGUI(KC_8),LGUI(KC_9),LGUI(KC_0), _______}, - { LINUX, _______, KC_VOLD, KC_MUTE, KC_VOLU,_______,_______,KC_WWW_BACK,_______,KC_WWW_FORWARD,_______, QWERTY}, - { WIN, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, _______, _______, _______, COLEMAK}, - { OSX, _______, _______, _______, _______, BL_DEC, BL_INC, _______, _______, _______, _______, WORKMAN} -}, - -}; - -#ifdef AUDIO_ENABLE -float tone_startup[][2] = SONG(STARTUP_SOUND); -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -float tone_workman[][2] = SONG(DVORAK_SOUND); -float tone_goodbye[][2] = SONG(GOODBYE_SOUND); -float tone_linux[][2] = SONG(CAPS_LOCK_ON_SOUND); -float tone_windows[][2] = SONG(SCROLL_LOCK_ON_SOUND); -float tone_osx[][2] = SONG(NUM_LOCK_ON_SOUND); -float tone_click[][2] = SONG(MUSICAL_NOTE(_F3, 2)); -#endif - -void persistant_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - // faux clicky - if (record->event.pressed) PLAY_NOTE_ARRAY(tone_click, false, 0); - - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_qwerty, false, 0); - #endif - persistant_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_colemak, false, 0); - #endif - persistant_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case WORKMAN: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_workman, false, 0); - #endif - persistant_default_layer_set(1UL<<_WORKMAN); - } - return false; - break; - case PUNC: - if (record->event.pressed) { - layer_on(_PUNC); - update_tri_layer(_PUNC, _EMOJI, _GUI); - } else { - layer_off(_PUNC); - update_tri_layer(_PUNC, _EMOJI, _GUI); - } - return false; - break; - case EMOJI: - if (record->event.pressed) { - layer_on(_EMOJI); - update_tri_layer(_PUNC, _EMOJI, _GUI); - } else { - layer_off(_EMOJI); - update_tri_layer(_PUNC, _EMOJI, _GUI); - } - return false; - break; - case NUM: - if (record->event.pressed) { - layer_on(_NUM); - } else { - layer_off(_NUM); - } - return false; - break; - case FUNC: - if (record->event.pressed) { - layer_on(_FUNC); - } else { - layer_off(_FUNC); - } - return false; - break; - case LINUX: - set_unicode_input_mode(UC_LNX); - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_linux, false, 0); - #endif - return false; - break; - case WIN: - set_unicode_input_mode(UC_WINC); - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_windows, false, 0); - #endif - return false; - break; - case OSX: - set_unicode_input_mode(UC_OSX); - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_osx, false, 0); - #endif - return false; - break; - } - return true; -} - -void matrix_init_user(void) { - #ifdef AUDIO_ENABLE - startup_user(); - #endif - set_unicode_input_mode(UC_LNX); -} - -#ifdef AUDIO_ENABLE - -void startup_user() -{ - _delay_ms(20); // gets rid of tick - PLAY_NOTE_ARRAY(tone_startup, false, 0); -} - -void shutdown_user() -{ - PLAY_NOTE_ARRAY(tone_goodbye, false, 0); - _delay_ms(150); - stop_all_notes(); -} - -#endif \ No newline at end of file +#include "../../../handwired/promethium/keymaps/priyadi/keymap.c" \ No newline at end of file diff --git a/keyboards/planck/keymaps/pvc/Makefile b/keyboards/planck/keymaps/pvc/Makefile index b2ff961f..c92ca1bf 100644 --- a/keyboards/planck/keymaps/pvc/Makefile +++ b/keyboards/planck/keymaps/pvc/Makefile @@ -1,3 +1,6 @@ +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options # change to "no" to disable the options, or define them in the Makefile in @@ -21,4 +24,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/planck/keymaps/sgoodwin/Makefile b/keyboards/planck/keymaps/sgoodwin/Makefile index 581e08cd..9081c6d3 100644 --- a/keyboards/planck/keymaps/sgoodwin/Makefile +++ b/keyboards/planck/keymaps/sgoodwin/Makefile @@ -1,3 +1,6 @@ +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options @@ -16,10 +19,11 @@ AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +API_SYSEX_ENABLE = no # Disable extra stuff for ergodoxen # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/planck/keymaps/sgoodwin/config.h b/keyboards/planck/keymaps/sgoodwin/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/planck/keymaps/sgoodwin/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/smt/Makefile b/keyboards/planck/keymaps/smt/Makefile new file mode 100644 index 00000000..457a3d01 --- /dev/null +++ b/keyboards/planck/keymaps/smt/Makefile @@ -0,0 +1,3 @@ +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/planck/keymaps/smt/config.h b/keyboards/planck/keymaps/smt/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/planck/keymaps/smt/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/smt/keymap.c b/keyboards/planck/keymaps/smt/keymap.c new file mode 100644 index 00000000..708f699d --- /dev/null +++ b/keyboards/planck/keymaps/smt/keymap.c @@ -0,0 +1,265 @@ +#include "planck.h" +#include "action_layer.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + BACKLIT +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Custom macros +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) +#define MEH_GRV MEH_T(KC_GRV) // Tap for Backtick, hold for Meh (Ctrl+Alt+Shift) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = { + {HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = { + {HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | - | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = { + {HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, + {CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = { + {ALL_T(KC_0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, + {CTL_T(KC_DLR), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, _______, _______}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | _ | ? | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | - | / | = | [ | ] | \ | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Home |PageDn|PageUp| End | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = { + {ALL_T(KC_TILD), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, + {_______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {_______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, SFT_T(KC_BSLS)}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END} +}, + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Reset| + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = { + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET}, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, + {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +} + + +}; + +#ifdef AUDIO_ENABLE + +float tone_startup[][2] = SONG(STARTUP_SOUND); +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif +} + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif diff --git a/keyboards/planck/keymaps/smt/readme.md b/keyboards/planck/keymaps/smt/readme.md new file mode 100644 index 00000000..dc7c9cf9 --- /dev/null +++ b/keyboards/planck/keymaps/smt/readme.md @@ -0,0 +1,124 @@ +# smt's Planck keymap + +This keymap is primarily based on the default Planck keymap. + +Notable differences from the default are: + +- **[Mod-Tap](https://github.com/jackhumbert/qmk_firmware/wiki#fun-with-modifier-keys) keys** + + - `Esc/Ctrl` + + I am experimenting with using Left Shift as a mod-tap key for Escape, similar to how I use the Enter key. It's set up like this on my Minivan, so in the interest of consistency... + + - `Enter/Shift` + + I use both the left and right shift keys when I type. When I want to modify a key with shift, I hold shift with the hand opposite the one typing the key. In the default keymap, Enter is where shift would be on a standard keyboard layout. Oh, muscle memory. + + - `Tab/Hyper` (Super+Ctrl+Shift+Alt) + + It's great to be able to use Tab as a custom modifier key. I tend to use [Hyper](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/) commands for various OS-specific operations depending on what machine I'm working on. + + - `Backtick/Meh` (Ctrl+Shift+Alt) + + Why use backtick in the lower left corner? I use it as my tmux prefix key, so I need to type it more frequently than most people. Putting it on the base layer works well for me. The "Meh" mapping is just a less-cool "Hyper"; the same, just without Super. + +- **Swapped responsibilities of "lower" and "raise" layers** + + I prefer to use symbols via the "raise" layer, and numbers via the "lower" layer. + +- **Removed Plover layer** + + I don't intend to use stenography anytime soon, so Plover just didn't have a place in my keymap. + + +## Qwerty + +``` +,-----------------------------------------------------------------------------------. +| Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | S | D | F | G | H | J | K | L | ; | " | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| Z | X | C | V | B | N | M | , | . | / |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + +## Colemak + +``` +,-----------------------------------------------------------------------------------. +| Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | R | S | T | D | H | N | E | I | O | " | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| Z | X | C | V | B | K | M | , | . | / |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + +## Dvorak + +``` +,-----------------------------------------------------------------------------------. +| Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | O | E | U | I | D | H | T | N | S | - | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + +## Lower + +This is where I put the number row, a numpad cluster, function keys, and media controls. + +``` +,-----------------------------------------------------------------------------------. +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | +|------+------+------+------+------+-------------+------+------+------+------+------| +| $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | | | +|------+------+------+------+------+------|------+------+------+------+------+------| +| | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | | | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | | | | Next | Vol- | Vol+ | Play | +`-----------------------------------------------------------------------------------' +``` + +## Raise + +As a developer, it makes the most sense for me to group all the commonly-used symbols that don't fit on the main layer. In particular, having the dual-column of parens-braces-brackets really helps a lot. I've also added cursorkeys to correspond to the arrows. + +I haven't completely filled this layer, which leaves room for future mappings and macros. + +``` +,-----------------------------------------------------------------------------------. +| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | +|------+------+------+------+------+-------------+------+------+------+------+------| +| | | | | | | _ | ? | + | { | } | | | +|------+------+------+------+------+------|------+------+------+------+------+------| +| | | | | | | - | / | = | [ | ] | \ | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | | | | | Home |PageDn|PageUp| End | +`-----------------------------------------------------------------------------------' +``` + +## Adjust (Lower + Raise) + +Utility layer. This is where I'd switch between Qwerty and Dvorak, ~~fool around with~~ adjust the audio/music settings, or put the Planck into bootloader mode. + +``` +,-----------------------------------------------------------------------------------. +| | Reset| | | | | | | | | | Reset| +|------+------+------+------+------+-------------+------+------+------+------+------| +| | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | +|------+------+------+------+------+------|------+------+------+------+------+------| +| |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | | | | | | | | +`-----------------------------------------------------------------------------------' +``` diff --git a/keyboards/planck/keymaps/tak3over/Makefile b/keyboards/planck/keymaps/tak3over/Makefile index 581e08cd..b2ca4194 100644 --- a/keyboards/planck/keymaps/tak3over/Makefile +++ b/keyboards/planck/keymaps/tak3over/Makefile @@ -1,3 +1,6 @@ +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) # Build Options @@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/planck/keymaps/thermal_printer/Makefile b/keyboards/planck/keymaps/thermal_printer/Makefile new file mode 100644 index 00000000..9477d117 --- /dev/null +++ b/keyboards/planck/keymaps/thermal_printer/Makefile @@ -0,0 +1,29 @@ +# Please remove if no longer applicable +$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD) +$(warning Please disable some options in the Makefile to resolve) + + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = yes # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +PRINTING_ENABLE = yes + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/planck/keymaps/thermal_printer/config.h b/keyboards/planck/keymaps/thermal_printer/config.h new file mode 100644 index 00000000..bcd09893 --- /dev/null +++ b/keyboards/planck/keymaps/thermal_printer/config.h @@ -0,0 +1,46 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +# define SERIAL_UART_BAUD 19200 +# define SERIAL_UART_DATA UDR1 +# define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1) +# define SERIAL_UART_RXD_VECT USART1_RX_vect +# define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1)) +# define SERIAL_UART_INIT() do { \ + /* baud rate */ \ + UBRR1L = SERIAL_UART_UBRR; \ + /* baud rate */ \ + UBRR1H = SERIAL_UART_UBRR >> 8; \ + /* enable TX */ \ + UCSR1B = _BV(TXEN1); \ + /* 8-bit data */ \ + UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \ + sei(); \ + } while(0) + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + + #endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/thermal_printer/keymap.c b/keyboards/planck/keymaps/thermal_printer/keymap.c new file mode 100644 index 00000000..e8805973 --- /dev/null +++ b/keyboards/planck/keymaps/thermal_printer/keymap.c @@ -0,0 +1,314 @@ +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, +// this is the style you want to emulate. + +#include "planck.h" +#include "action_layer.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _PLOVER 5 +#define _ADJUST 16 + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + PLOVER, + LOWER, + RAISE, + BACKLIT, + EXT_PLV +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = { + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = { + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = { + {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, + {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = { + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, + {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Plover layer (http://opensteno.org) + * ,-----------------------------------------------------------------------------------. + * | # | # | # | # | # | # | # | # | # | # | # | # | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | S | T | P | H | * | * | F | P | L | T | D | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |TogOut| S | K | W | R | * | * | R | B | G | S | Z | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Exit | | | A | O | | E | U | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_PLOVER] = { + {KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 }, + {XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC}, + {XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX} +}, + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | Print|no prnt | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = { + {_______, RESET, _______, PRINT_ON, PRINT_OFF, _______, _______, _______, _______, _______, _______, KC_DEL}, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______}, + {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +} + + +}; + +#ifdef AUDIO_ENABLE + +float tone_startup[][2] = SONG(STARTUP_SOUND); +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_plover[][2] = SONG(PLOVER_SOUND); +float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + case PLOVER: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_NOTE_ARRAY(tone_plover, false, 0); + #endif + layer_off(_RAISE); + layer_off(_LOWER); + layer_off(_ADJUST); + layer_on(_PLOVER); + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + } + return false; + break; + case EXT_PLV: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); + #endif + layer_off(_PLOVER); + } + return false; + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif +} + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif diff --git a/keyboards/planck/keymaps/thermal_printer/readme.md b/keyboards/planck/keymaps/thermal_printer/readme.md new file mode 100644 index 00000000..de9680b4 --- /dev/null +++ b/keyboards/planck/keymaps/thermal_printer/readme.md @@ -0,0 +1,2 @@ +# The Default Planck Layout + diff --git a/keyboards/planck/keymaps/unicode/config.h b/keyboards/planck/keymaps/unicode/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/planck/keymaps/unicode/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/unicode/keymap.c b/keyboards/planck/keymaps/unicode/keymap.c index d73e7e09..1b4ca8ed 100644 --- a/keyboards/planck/keymaps/unicode/keymap.c +++ b/keyboards/planck/keymaps/unicode/keymap.c @@ -195,24 +195,20 @@ const uint16_t PROGMEM fn_actions[] = { }; #ifdef AUDIO_ENABLE -float tone_startup[][2] = { - {440.0*pow(2.0,(31)/12.0), 12}, - {440.0*pow(2.0,(28)/12.0), 8}, - {440.0*pow(2.0,(19)/12.0), 8}, - {440.0*pow(2.0,(24)/12.0), 8}, - {440.0*pow(2.0,(28)/12.0), 20} -}; +float tone_startup[][2] = SONG(STARTUP_SOUND); float tone_qwerty[][2] = SONG(QWERTY_SOUND); float tone_dvorak[][2] = SONG(DVORAK_SOUND); float tone_colemak[][2] = SONG(COLEMAK_SOUND); float tone_plover[][2] = SONG(PLOVER_SOUND); float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); -float goodbye[][2] = SONG(GOODBYE_SOUND); +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); #endif + void persistant_default_layer_set(uint16_t default_layer) { eeconfig_update_default_layer(default_layer); default_layer_set(default_layer); @@ -309,18 +305,35 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) }; void matrix_init_user(void) { - #ifdef AUDIO_ENABLE - _delay_ms(20); // stops the tick - PLAY_NOTE_ARRAY(tone_startup, false, 0); - #endif + #ifdef AUDIO_ENABLE + startup_user(); + #endif } #ifdef AUDIO_ENABLE -void play_goodbye_tone() + +void startup_user() { - PLAY_NOTE_ARRAY(goodbye, false, 0); - _delay_ms(150); + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); } -#endif +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif diff --git a/keyboards/planck/keymaps/vifon/Makefile b/keyboards/planck/keymaps/vifon/Makefile index 838cb4e8..15a7b736 100644 --- a/keyboards/planck/keymaps/vifon/Makefile +++ b/keyboards/planck/keymaps/vifon/Makefile @@ -7,7 +7,7 @@ BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) +CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality diff --git a/keyboards/planck/keymaps/vifon/config.h b/keyboards/planck/keymaps/vifon/config.h index 9cb0634f..a08b37cb 100644 --- a/keyboards/planck/keymaps/vifon/config.h +++ b/keyboards/planck/keymaps/vifon/config.h @@ -81,6 +81,11 @@ along with this program. If not, see . /* prevent the modifiers from being stuck, sacrificing some memory */ #define PREVENT_STUCK_MODIFIERS +/* A larger buffer for the dynamic macros as this keymap is not taking + * up that much memory. + */ +#define DYNAMIC_MACRO_SIZE 256 + #ifdef SUBPROJECT_rev3 #include "rev3/config.h" #endif diff --git a/keyboards/planck/keymaps/vifon/keymap.c b/keyboards/planck/keymaps/vifon/keymap.c index 80c4a516..ee0c0ac3 100644 --- a/keyboards/planck/keymaps/vifon/keymap.c +++ b/keyboards/planck/keymaps/vifon/keymap.c @@ -62,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_PPG] = { /* Pure Pro: Gaming */ {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, DF(_RS), _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, XXXXXXX, _______, KM_RS , _______, _______, KM_LW , _______, _______, _______, _______}, }, [_NM] = { /* Numeric */ @@ -90,7 +90,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {_______, _______, KC_LGUI, KC_LALT, _______, _______, _______, _______, _______, _______, _______, _______} }, [_DYN]= { /* special */ - {_______, DYN_REC_START1, DYN_MACRO_PLAY1, _______, _______, _______, _______, _______, KC_INS, _______, KC_PSCR, KC_PAUS}, + {_______, DYN_REC_START1, DYN_MACRO_PLAY1, _______, _______, _______, _______, KC_APP, KC_INS, _______, KC_PSCR, KC_PAUS}, {_______, DYN_REC_START2, DYN_MACRO_PLAY2, _______, _______, _______, _______, _______, _______, KC_CAPS, KC_SLCK, KC_NLCK}, {KM_SHLK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} diff --git a/keyboards/planck/keymaps/xyverz/config.h b/keyboards/planck/keymaps/xyverz/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/planck/keymaps/xyverz/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/yale/Makefile b/keyboards/planck/keymaps/yale/Makefile new file mode 100644 index 00000000..581e08cd --- /dev/null +++ b/keyboards/planck/keymaps/yale/Makefile @@ -0,0 +1,25 @@ + + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = yes # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/yale/config.h b/keyboards/planck/keymaps/yale/config.h new file mode 100644 index 00000000..8a916bbd --- /dev/null +++ b/keyboards/planck/keymaps/yale/config.h @@ -0,0 +1,11 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#define PREVENT_STUCK_MODIFIERS + +#endif + + + diff --git a/keyboards/planck/keymaps/yale/keymap.c b/keyboards/planck/keymaps/yale/keymap.c new file mode 100644 index 00000000..f2280778 --- /dev/null +++ b/keyboards/planck/keymaps/yale/keymap.c @@ -0,0 +1,108 @@ +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, +// this is the style you want to emulate. +// + +#include "planck.h" +#ifdef BACKLIGHT_ENABLE + #include "backlight.h" +#endif + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _NUM 5 +#define _FUNC 6 +#define _NAV 7 + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* _QWERTY + * ,-----------------------------------------------------------------------------------. + * | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * |Ctrl/Tab| A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Alt | GUI | GUI | Num | Space | FN | GUI | Alt | Ctrl | Enter| + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = { + {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {CTL_T(KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, + {KC_LCTL, KC_LALT, KC_LGUI, KC_LGUI, MO(_NUM), KC_SPC, KC_SPC, MO(_FUNC), KC_RGUI, KC_RALT, KC_RCTL, KC_ENT} +}, + +/* _NUM + * ,-----------------------------------------------------------------------------------. + * | ___ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ____ | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Ctrl | ` | [ | { | ( | / | \ | ) | } | ] | - | = | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | ____ | ! | @ | # | $ | % | ^ | & | * | _ | + | ____ | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ____ | ___ | ___ | ___ | XXXX | ______ | ____ | ____ | ____ | __ | ____ | + * `-----------------------------------------------------------------------------------' + */ +[_NUM] = { + {_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______}, + {KC_LCTL, KC_GRV, KC_LBRC, KC_LCBR, KC_LPRN, KC_SLSH, KC_BSLS, KC_RPRN, KC_RCBR, KC_RBRC, KC_MINS, KC_EQL}, + {_______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_UNDS, KC_PLUS, _______}, + {_______, _______, _______, _______, _______, _______, _______, MO(_NAV), _______, _______, _______, _______} +}, + +/* _FUNC + * ,-----------------------------------------------------------------------------------. + * | ____ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ____ | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ____ |Shift | Ctrl | Alt | GUI | ____ | Left | Down | Up |Right | Del | ____ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | ____ |Light | ____ | Vol- | Prev | Play | Mute | Next | Vol+ | ____ | ____ | ____ | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ____ | ____ | ____ | ____ | ____ | _____ | XXXX | ____ | ____ | ____ | ____ | + * `-----------------------------------------------------------------------------------' + */ +[_FUNC] = { + {_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______}, + {_______, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_DEL, _______}, + {_______, M(0), _______, KC_VOLD, KC_MPRV, KC_MPLY, KC_MUTE, KC_MNXT, KC_VOLU, _______, _______, _______}, + {_______, _______, _______, _______, MO(_NAV), _______, _______, _______, _______, _______, _______, _______} +}, + +[_NAV] = { + {KC_MS_ACCEL2, KC_FN1, KC_FN2, KC_FN3, KC_FN4, XXXXXXX, XXXXXXX, KC_WH_D, KC_WH_U, XXXXXXX, XXXXXXX, XXXXXXX}, + {KC_MS_ACCEL1, KC_MS_BTN4, KC_MS_BTN3, KC_MS_BTN2, KC_MS_BTN1, XXXXXXX, KC_MS_LEFT, KC_MS_DOWN, KC_MS_UP, KC_MS_RIGHT, XXXXXXX, XXXXXXX}, + {KC_MS_ACCEL0, KC_FN9, KC_FN10, KC_FN11, KC_FN12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, + {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} +}, + +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/planck/keymaps/yale/yale_layout_picture.jpg b/keyboards/planck/keymaps/yale/yale_layout_picture.jpg new file mode 100644 index 00000000..ab9c6b4e Binary files /dev/null and b/keyboards/planck/keymaps/yale/yale_layout_picture.jpg differ diff --git a/keyboards/planck/keymaps/yang/config.h b/keyboards/planck/keymaps/yang/config.h index feb5a119..4ed19d76 100644 --- a/keyboards/planck/keymaps/yang/config.h +++ b/keyboards/planck/keymaps/yang/config.h @@ -5,7 +5,7 @@ /* ws2812 RGB LED */ #define RGB_DI_PIN D1 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 28 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_mitch.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_mitch.c deleted file mode 100644 index e5a86b40..00000000 --- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_mitch.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "keymap.h" - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP( - TAB, Q, W, E, R, T, Y, U, I, O, P, BSPC, - LCTL, A, S, D, F, G, H, J, K, L, SCLN, QUOT, - LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN3, - ESC, DEL, LALT, LGUI, FN2, SPC, FN1, LEFT, DOWN, UP, RGHT), -[1] = KEYMAP( - GRV, GRV, FN22, FN19, FN10, TRNS, TRNS, 7, 8, 9, 0, BSPC, - TRNS, LBRC, RBRC, FN23, FN24, TRNS, TRNS, 4, 5, 6, TRNS, BSLS, - TRNS, MINS, FN20, EQL, FN21, TRNS, TRNS, 1, 2, 3, TRNS, ENT, - TRNS, TRNS, TRNS, TRNS, TRNS, SPC, FN1, TRNS, PGDN, PGUP, TRNS), -[2] = KEYMAP( - FN26, FN10, FN11, FN12, FN13, FN14, FN15, FN17, FN18, FN19, FN10, DEL, - TRNS, TRNS, MUTE, VOLD, VOLU, TRNS, BSPC, FN14, FN15, FN16, TRNS, FN25, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN11, FN12, FN13, TRNS, ENT, - TRNS, TRNS, TRNS, TRNS, FN2, ENT, TRNS, TRNS, PGDN, PGUP, TRNS), -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(1), // Switch layer raise - [2] = ACTION_LAYER_MOMENTARY(2), // Switch layer lower - - [3] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // Right shift serves as Enter on tap - - // Numeric shift modifiers - [10] = ACTION_MODS_KEY(MOD_LSFT, KC_0), - [11] = ACTION_MODS_KEY(MOD_LSFT, KC_1), - [12] = ACTION_MODS_KEY(MOD_LSFT, KC_2), - [13] = ACTION_MODS_KEY(MOD_LSFT, KC_3), - [14] = ACTION_MODS_KEY(MOD_LSFT, KC_4), - [15] = ACTION_MODS_KEY(MOD_LSFT, KC_5), - [16] = ACTION_MODS_KEY(MOD_LSFT, KC_6), - [17] = ACTION_MODS_KEY(MOD_LSFT, KC_7), - [18] = ACTION_MODS_KEY(MOD_LSFT, KC_8), - [19] = ACTION_MODS_KEY(MOD_LSFT, KC_9), - - // Other shift modifiers - [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // _ - [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // + - [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // ~ - [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // { - [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // } - [25] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // | - - // Switch windows in app - [26] = ACTION_MODS_KEY(MOD_LGUI, KC_GRV), -}; diff --git a/keyboards/planck/out.txt b/keyboards/planck/out.txt deleted file mode 100644 index 644a6a77..00000000 --- a/keyboards/planck/out.txt +++ /dev/null @@ -1,66 +0,0 @@ --------- begin -------- -avr-gcc.exe (AVR_8_bit_GNU_Toolchain_3.5.0_1662) 4.9.2 -Copyright (C) 2014 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -Compiling: ../../keyboards/planck/planck.c [OK] -Compiling: ../../keyboards/planck/keymaps/experimental/keymap.c [WARNINGS] - | - | ../../keyboards/planck/keymaps/experimental/keymap.c: In function 'action_get_macro': - | ../../keyboards/planck/keymaps/experimental/keymap.c:227:17: warning: implicit declaration of function 'breathing_speed_set' [-Wimplicit-function-declaration] - | breathing_speed_set(2); - | ^ - | ../../keyboards/planck/keymaps/experimental/keymap.c:228:17: warning: implicit declaration of function 'breathing_pulse' [-Wimplicit-function-declaration] - | breathing_pulse(); - | ^ - | -Compiling: ../../quantum/quantum.c [OK] -Compiling: ../../quantum/keymap.c [OK] -Compiling: ../../quantum/keycode_config.c [OK] -Compiling: ../../quantum/matrix.c [OK] -Compiling: ../../quantum/audio/audio.c [OK] -Compiling: ../../quantum/audio/voices.c [OK] -Compiling: ../../quantum/audio/luts.c [OK] -Compiling: ../../tmk_core/protocol/lufa/lufa.c [OK] -Compiling: ../../tmk_core/protocol/lufa/descriptor.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Class/Common/HIDParser.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/ConfigDescriptors.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/DeviceStandardReq.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/Events.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/HostStandardReq.c [OK] -Compiling: ../../tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/USB/Core/USBTask.c [OK] -Compiling: ../../tmk_core/common/host.c [OK] -Compiling: ../../tmk_core/common/keyboard.c [OK] -Compiling: ../../tmk_core/common/action.c [OK] -Compiling: ../../tmk_core/common/action_tapping.c [OK] -Compiling: ../../tmk_core/common/action_macro.c [OK] -Compiling: ../../tmk_core/common/action_layer.c [OK] -Compiling: ../../tmk_core/common/action_util.c [OK] -Compiling: ../../tmk_core/common/print.c [OK] -Compiling: ../../tmk_core/common/debug.c [OK] -Compiling: ../../tmk_core/common/util.c [OK] -Compiling: ../../tmk_core/common/avr/suspend.c [OK] -Assembling: ../../tmk_core/common/avr/xprintf.S [OK] -Compiling: ../../tmk_core/common/avr/timer.c [OK] -Compiling: ../../tmk_core/common/avr/bootloader.c [OK] -Compiling: ../../tmk_core/common/magic.c [OK] -Compiling: ../../tmk_core/common/avr/eeconfig.c [OK] -Compiling: ../../tmk_core/common/mousekey.c [OK] -Compiling: ../../tmk_core/common/command.c [OK] -Compiling: ../../tmk_core/common/backlight.c [OK] -Linking: .build/planck_experimental.elf [ERRORS] - | - | .build/obj_planck_experimental/keyboards/planck/keymaps/experimental/keymap.o: In function `action_get_macro': - | C:\Users\Fred Wales\Documents\Programming\qmk_firmware\keyboards\planck/../../keyboards/planck/keymaps/experimental/keymap.c:240: undefined reference to `breathing_speed_set' - | C:\Users\Fred Wales\Documents\Programming\qmk_firmware\keyboards\planck/../../keyboards/planck/keymaps/experimental/keymap.c:241: undefined reference to `breathing_pulse' - | collect2.exe: error: ld returned 1 exit status - | diff --git a/keyboards/planck/planck.c b/keyboards/planck/planck.c index 645b450d..3980b02f 100644 --- a/keyboards/planck/planck.c +++ b/keyboards/planck/planck.c @@ -16,4 +16,4 @@ void matrix_init_kb(void) { PORTE |= (1<<6); matrix_init_user(); -} \ No newline at end of file +} diff --git a/keyboards/planck/rev3/Makefile b/keyboards/planck/rev3/Makefile new file mode 100644 index 00000000..191c6bb6 --- /dev/null +++ b/keyboards/planck/rev3/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/planck/rules.mk b/keyboards/planck/rules.mk index 25db53a3..6776062f 100644 --- a/keyboards/planck/rules.mk +++ b/keyboards/planck/rules.mk @@ -51,17 +51,18 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) CONSOLE_ENABLE ?= no # Console for debug(+400) -COMMAND_ENABLE ?= yes # Commands for debug and configuration +COMMAND_ENABLE ?= no # Commands for debug and configuration NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality -MIDI_ENABLE ?= no # MIDI controls -AUDIO_ENABLE ?= no # Audio output on port C6 +MIDI_ENABLE ?= yes # MIDI controls +AUDIO_ENABLE ?= yes # Audio output on port C6 UNICODE_ENABLE ?= no # Unicode BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. +API_SYSEX_ENABLE = no # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend \ No newline at end of file +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend diff --git a/keyboards/preonic/config.h b/keyboards/preonic/config.h index 3fb978c2..239c29eb 100644 --- a/keyboards/preonic/config.h +++ b/keyboards/preonic/config.h @@ -37,6 +37,8 @@ along with this program. If not, see . #define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } #define UNUSED_PINS +#define AUDIO_VOICES + #define BACKLIGHT_PIN B7 /* COL2ROW or ROW2COL */ @@ -63,7 +65,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D1 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 28 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/preonic/keymaps/CMD-Preonic/config.h b/keyboards/preonic/keymaps/CMD-Preonic/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/preonic/keymaps/CMD-Preonic/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/preonic/keymaps/default/Makefile b/keyboards/preonic/keymaps/default/Makefile index 581e08cd..3d4659ce 100644 --- a/keyboards/preonic/keymaps/default/Makefile +++ b/keyboards/preonic/keymaps/default/Makefile @@ -1,25 +1,3 @@ - - -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = yes # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - ifndef QUANTUM_DIR include ../../../../Makefile endif \ No newline at end of file diff --git a/keyboards/preonic/keymaps/default/config.h b/keyboards/preonic/keymaps/default/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/preonic/keymaps/default/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/preonic/keymaps/default/keymap.c b/keyboards/preonic/keymaps/default/keymap.c index 78b4997a..3313af94 100644 --- a/keyboards/preonic/keymaps/default/keymap.c +++ b/keyboards/preonic/keymaps/default/keymap.c @@ -9,12 +9,15 @@ // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. -#define _QWERTY 0 -#define _COLEMAK 1 -#define _DVORAK 2 -#define _LOWER 3 -#define _RAISE 4 -#define _ADJUST 16 + +enum preonic_layers { + _QWERTY, + _COLEMAK, + _DVORAK, + _LOWER, + _RAISE, + _ADJUST +}; enum preonic_keycodes { QWERTY = SAFE_RANGE, diff --git a/keyboards/preonic/keymaps/kinesis/config.h b/keyboards/preonic/keymaps/kinesis/config.h index 086baa84..e6099ceb 100644 --- a/keyboards/preonic/keymaps/kinesis/config.h +++ b/keyboards/preonic/keymaps/kinesis/config.h @@ -63,7 +63,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D1 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 28 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/preonic/keymaps/smt/Makefile b/keyboards/preonic/keymaps/smt/Makefile new file mode 100644 index 00000000..3d4659ce --- /dev/null +++ b/keyboards/preonic/keymaps/smt/Makefile @@ -0,0 +1,3 @@ +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/preonic/keymaps/smt/config.h b/keyboards/preonic/keymaps/smt/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/preonic/keymaps/smt/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/preonic/keymaps/smt/keymap.c b/keyboards/preonic/keymaps/smt/keymap.c new file mode 100644 index 00000000..a10deb75 --- /dev/null +++ b/keyboards/preonic/keymaps/smt/keymap.c @@ -0,0 +1,286 @@ +#include "preonic.h" +#include "action_layer.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif +#include "eeconfig.h" + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum preonic_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + BACKLIT +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Custom macros +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) +#define MEH_GRV MEH_T(KC_GRV) // Tap for Backtick, hold for Meh (Ctrl+Alt+Shift) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | - | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, + {CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = { + {ALL_T(KC_GRV), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, + {ALL_T(KC_0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, + {CTL_T(KC_DLR), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, _______, _______}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | _ | ? | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | - | / | = | [ | ] | \ | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Home |PageDn|PageUp| End | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = { + {ALL_T(KC_TILD), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, + {ALL_T(KC_TILD), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, + {_______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {_______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, SFT_T(KC_BSLS)}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END} +}, + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Reset| | | | | | | | | | Reset| + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = { + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET}, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, + {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +} + + +}; + +#ifdef AUDIO_ENABLE +float tone_startup[][2] = { + {NOTE_B5, 20}, + {NOTE_B6, 8}, + {NOTE_DS6, 20}, + {NOTE_B6, 8} +}; + +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); + +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +#endif + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +}; + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif +} + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif diff --git a/keyboards/preonic/keymaps/smt/readme.md b/keyboards/preonic/keymaps/smt/readme.md new file mode 100644 index 00000000..2ec2603f --- /dev/null +++ b/keyboards/preonic/keymaps/smt/readme.md @@ -0,0 +1,136 @@ +# smt's Preonic keymap + +This keymap is primarily based on the default Preonic keymap, which in turn is derived from Planck's default. + +Notable differences from the default are: + +- **[Mod-Tap](https://github.com/jackhumbert/qmk_firmware/wiki#fun-with-modifier-keys) keys** + + - `Esc/Ctrl` + + I am experimenting with using Left Shift as a mod-tap key for Escape, similar to how I use the Enter key. It's set up like this on my Minivan, so in the interest of consistency... + + - `Enter/Shift` + + I use both the left and right shift keys when I type. When I want to modify a key with shift, I hold shift with the hand opposite the one typing the key. In the default keymap, Enter is where shift would be on a standard keyboard layout. Oh, muscle memory. + + - `Tab/Hyper` (Super+Ctrl+Shift+Alt) + + It's great to be able to use Tab as a custom modifier key. I tend to use [Hyper](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/) commands for various OS-specific operations depending on what machine I'm working on. + + - `Backtick/Meh` (Ctrl+Shift+Alt) + + Why use backtick in the lower left corner? I use it as my tmux prefix key, so I need to type it more frequently than most people. Putting it on the base layer works well for me. The "Meh" mapping is just a less-cool "Hyper"; the same, just without Super. + +- **Swapped responsibilities of "lower" and "raise" layers** + + I prefer to use symbols via the "raise" layer, and numbers via the "lower" layer. + +- **Removed Plover layer** + + I don't intend to use stenography anytime soon, so Plover just didn't have a place in my keymap. + + +## Qwerty + +``` +,-----------------------------------------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | +|------+------+------+------+------+------+------+------+------+------+------+------| +| Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | S | D | F | G | H | J | K | L | ; | " | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| Z | X | C | V | B | N | M | , | . | / |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + +## Colemak + +``` +,-----------------------------------------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | +|------+------+------+------+------+------+------+------+------+------+------+------| +| Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | R | S | T | D | H | N | E | I | O | " | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| Z | X | C | V | B | K | M | , | . | / |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + +## Dvorak + +``` +,-----------------------------------------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | +|------+------+------+------+------+------+------+------+------+------+------+------| +| Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | O | E | U | I | D | H | T | N | S | - | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + +## Lower + +This is where I put the number row, a numpad cluster, function keys, and media controls. Like the "Raise" layer, the top row is redundant to help with Planck compatibility. + +``` +,-----------------------------------------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | +|------+------+------+------+------+------+------+------+------+------+------+------| +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | +|------+------+------+------+------+-------------+------+------+------+------+------| +| $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | | | +|------+------+------+------+------+------|------+------+------+------+------+------| +| | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | | | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | | | | Next | Vol- | Vol+ | Play | +`-----------------------------------------------------------------------------------' +``` + +## Raise + +As a developer, it makes the most sense for me to group all the commonly-used symbols that don't fit on the main layer. In particular, having the dual-column of parens-braces-brackets really helps a lot. I've also added cursorkeys to correspond to the arrows. + +I haven't completely filled this layer, which leaves room for future mappings and macros. + +``` +,-----------------------------------------------------------------------------------. +| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | +|------+------+------+------+------+-------------+------+------+------+------+------| +| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | +|------+------+------+------+------+-------------+------+------+------+------+------| +| | | | | | | _ | ? | + | { | } | | | +|------+------+------+------+------+------|------+------+------+------+------+------| +| | | | | | | - | / | = | [ | ] | \ | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | | | | | Home |PageDn|PageUp| End | +`-----------------------------------------------------------------------------------' +``` + +## Adjust (Lower + Raise) + +Utility layer. This is where I'd switch between Qwerty and Dvorak, ~~fool around with~~ adjust the audio/music settings, or put the Preonic into bootloader mode. + +``` +,-----------------------------------------------------------------------------------. +| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | Reset| | | | | | | | | | Reset| +|------+------+------+------+------+-------------+------+------+------+------+------| +| | | |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | +|------+------+------+------+------+------|------+------+------+------+------+------| +| |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | | +|------+------+------+------+------+------+------+------+------+------+------+------| +| | | | | | | | | | | | +`-----------------------------------------------------------------------------------' +``` diff --git a/keyboards/preonic/rules.mk b/keyboards/preonic/rules.mk index d0f3a3a1..6be5b55b 100644 --- a/keyboards/preonic/rules.mk +++ b/keyboards/preonic/rules.mk @@ -53,17 +53,18 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) CONSOLE_ENABLE ?= no # Console for debug(+400) -COMMAND_ENABLE ?= yes # Commands for debug and configuration +COMMAND_ENABLE ?= no # Commands for debug and configuration NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality -MIDI_ENABLE ?= no # MIDI controls -AUDIO_ENABLE ?= no # Audio output on port C6 +MIDI_ENABLE ?= yes # MIDI controls +AUDIO_ENABLE ?= yes # Audio output on port C6 UNICODE_ENABLE ?= no # Unicode BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. +API_SYSEX_ENABLE ?= no # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/ps2avrGB/Makefile b/keyboards/ps2avrGB/Makefile new file mode 100644 index 00000000..57b2ef62 --- /dev/null +++ b/keyboards/ps2avrGB/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif diff --git a/keyboards/ps2avrGB/README.md b/keyboards/ps2avrGB/README.md new file mode 100644 index 00000000..f8360aec --- /dev/null +++ b/keyboards/ps2avrGB/README.md @@ -0,0 +1,61 @@ +ps2avrGB keyboard firmware +========================== + +This is a port of the QMK firmware for boards that are based on the +ps2avrGB firmware, like the [ps2avrGB +keyboard](https://www.keyclack.com/product/gb-ps2avrgb/) or the ones sold +by [Winkeyless](http://winkeyless.kr/product/ps2avrgb-parts/). + +Note that this is a complete replacement for the firmware, so you won't be +using Bootmapper Client to change any keyboard settings, since not all the +USB report options are supported. + +## Supported Boards + +Only the [B.mini X2](http://winkeyless.kr/product/b-mini-x2-pcb/) has been +tested so far (since it's the only one I own). But other boards that use +the ps2avrGB firmware should work as well. + +## Installing + +First, install the requirements. These commands are for OSX, but all you +need is the AVR toolchain and `bootloadHID` for flashing: + +``` +$ brew cask install crosspack-avr +$ brew install --HEAD https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb +``` + +In order to use the `./program` script, which can reboot the board into +the bootloader, you'll need Python 2 with PyUSB installed: + +``` +$ pip install pyusb +``` + +Then, with the keyboard plugged in, simply run this command from the +`qmk_firmware` directory: + +``` +$ make ps2avrGB-program +``` + +If you prefer, you can just build it and flash the firmware directly with +`bootloadHID` if you boot the board while holding down `L_Ctrl` to keep it +in the bootloader: + +``` +$ make ps2avrGB +$ bootloadHID -r ps2avrGB_default.hex +``` + +## Troubleshooting + +From my experience, it's really hard to brick these boards. But these +tricks have been useful when it got stuck in a weird scenario. + +1. Try plugging the board in while pressing `L_Ctrl`. This will force it + to boot only the bootloader without loading the firmware. Once this is + done, just reflash the board with the original firmware. +2. Sometimes USB hubs can act weird, so try connecting the board directly + to your computer or plugging/unplugging the USB hub. diff --git a/keyboards/ps2avrGB/config.h b/keyboards/ps2avrGB/config.h new file mode 100644 index 00000000..b5c696f3 --- /dev/null +++ b/keyboards/ps2avrGB/config.h @@ -0,0 +1,38 @@ +/* +Copyright 2017 Luiz Ribeiro + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#define VENDOR_ID 0x20A0 +#define PRODUCT_ID 0x422D +// TODO: share these strings with usbconfig.h +// Edit usbconfig.h to change these. +#define MANUFACTURER winkeyless.kr +#define PRODUCT ps2avrGB + +/* matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 15 + +#define NO_UART 1 +#define BOOTLOADHID_BOOTLOADER 1 + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + +#endif diff --git a/keyboards/ps2avrGB/keymaps/default/keymap.c b/keyboards/ps2avrGB/keymaps/default/keymap.c new file mode 100644 index 00000000..5c66cde5 --- /dev/null +++ b/keyboards/ps2avrGB/keymaps/default/keymap.c @@ -0,0 +1,32 @@ +/* +Copyright 2017 Luiz Ribeiro + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "ps2avrGB.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + KEYMAP( \ + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,HOME,END, \ + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, DEL, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, INS, \ + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, PGUP,\ + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT, UP, PGDN,\ + LCTL,LALT,LGUI, SPC, RGUI,RALT,RCTL,LEFT,DOWN,RGHT \ + ), +}; + +const uint16_t PROGMEM fn_actions[] = { +}; diff --git a/keyboards/ps2avrGB/matrix.c b/keyboards/ps2avrGB/matrix.c new file mode 100644 index 00000000..beaa54c4 --- /dev/null +++ b/keyboards/ps2avrGB/matrix.c @@ -0,0 +1,104 @@ +/* +Copyright 2017 Luiz Ribeiro + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include +#include + +#include "matrix.h" + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif + +static uint8_t debouncing = DEBOUNCE; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +void matrix_init(void) { + // all outputs for rows high + DDRB = 0xFF; + PORTB = 0xFF; + // all inputs for columns + DDRA = 0x00; + DDRC &= ~(0x111111<<2); + DDRD &= ~(1<> 1) & 0x55) | ((x << 1) & 0xaa); + x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc); + x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0); + return x; +} + +uint8_t matrix_scan(void) { + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + matrix_set_row_status(row); + _delay_us(5); + + matrix_row_t cols = ( + // cols 0..7, PORTA 0 -> 7 + (~PINA) & 0xFF + ) | ( + // cols 8..13, PORTC 7 -> 0 + bit_reverse((~PINC) & 0xFF) << 8 + ) | ( + // col 14, PORTD 7 + ((~PIND) & (1 << PIND7)) << 7 + ); + + if (matrix_debouncing[row] != cols) { + matrix_debouncing[row] = cols; + debouncing = DEBOUNCE; + } + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + return 1; +} + +inline matrix_row_t matrix_get_row(uint8_t row) { + return matrix[row]; +} + +void matrix_print(void) { +} diff --git a/keyboards/ps2avrGB/program b/keyboards/ps2avrGB/program new file mode 100755 index 00000000..a88d9cd9 --- /dev/null +++ b/keyboards/ps2avrGB/program @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# Copyright 2017 Luiz Ribeiro +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import print_function + +import os +import sys +import time +import usb + +if len(sys.argv) < 2: + print('Usage: %s ' % sys.argv[0]) + sys.exit(1) + +print('Searching for ps2avrGB... ', end='') + +dev = usb.core.find(idVendor=0x20A0, idProduct=0x422D) +if dev is None: + raise ValueError('Device not found') + +print('Found', end='\n\n') + +print('Device Information:') +print(' idVendor: %d (0x%04x)' % (dev.idVendor, dev.idVendor)) +print(' idProduct: %d (0x%04x)' % (dev.idProduct, dev.idProduct)) +print('Manufacturer: %s' % (dev.iManufacturer)) +print('Serial: %s' % (dev.iSerialNumber)) +print('Product: %s' % (dev.iProduct), end='\n\n') + +print('Transferring control to bootloader... ', end='') + +dev.set_configuration() + +request_type = usb.util.build_request_type( + usb.util.CTRL_OUT, + usb.util.CTRL_TYPE_CLASS, + usb.util.CTRL_RECIPIENT_DEVICE) + +USBRQ_HID_SET_REPORT = 0x09 +HID_REPORT_OPTION = 0x0301 + + +try: + dev.ctrl_transfer( + request_type, + USBRQ_HID_SET_REPORT, + HID_REPORT_OPTION, + 0, + [0, 0, 0xFF] + [0] * 5 + ) +except usb.core.USBError: + # for some reason I keep getting USBError, but it works! + pass + +# wait a bit until bootloader starts up +time.sleep(2) + +print('OK') +print('Programming...') +if os.system('bootloadHID -r "%s"' % sys.argv[1]) == 0: + print('\nDone!') diff --git a/keyboards/ps2avrGB/ps2avrGB.c b/keyboards/ps2avrGB/ps2avrGB.c new file mode 100644 index 00000000..e69de29b diff --git a/keyboards/ps2avrGB/ps2avrGB.h b/keyboards/ps2avrGB/ps2avrGB.h new file mode 100644 index 00000000..6432e3be --- /dev/null +++ b/keyboards/ps2avrGB/ps2avrGB.h @@ -0,0 +1,43 @@ +/* +Copyright 2017 Luiz Ribeiro + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef KEYMAP_COMMON_H +#define KEYMAP_COMMON_H + +#include "keycode.h" +#include "action.h" + +#define KEYMAP( \ + K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, \ + K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, \ + K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, \ + K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KD2, KE0, \ + K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, \ + K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96 \ +) \ +{ \ + { KC_##K00, KC_##K10, KC_##K20, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KB0, KC_##KC0, KC_##KD0, KC_##KE0 }, \ + { KC_##K01, KC_##K11, KC_##K21, KC_##K31, KC_##K41, KC_##K51, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA1, KC_##KB1, KC_NO, KC_##KD1, KC_##KE1 }, \ + { KC_##K02, KC_##K12, KC_##K22, KC_##K32, KC_##K42, KC_##K52, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA2, KC_##KB2, KC_NO, KC_##KD2, KC_##KE2 }, \ + { KC_##K03, KC_##K13, KC_##K23, KC_##K33, KC_##K43, KC_##K53, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA3, KC_##KB3, KC_##KC3, KC_##KD3, KC_NO }, \ + { KC_##K04, KC_##K14, KC_##K24, KC_##K34, KC_##K44, KC_##K54, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA4, KC_##KB4, KC_##KC4, KC_NO, KC_##KE4 }, \ + { KC_##K05, KC_NO, KC_##K25, KC_##K35, KC_##K45, KC_##K55, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KB5, KC_##KC5, KC_##KD5, KC_##KE5 }, \ + { KC_##K06, KC_##K16, KC_##K26, KC_##K36, KC_##K46, KC_##K56, KC_##K66, KC_##K76, KC_##K86, KC_##K96, KC_##KA6, KC_##KB6, KC_##KC6, KC_##KD6, KC_##KE6 }, \ + { KC_##K07, KC_##K17, KC_##K27, KC_##K37, KC_##K47, KC_##K57, KC_##K67, KC_##K77, KC_NO, KC_NO, KC_##KA7, KC_##KB7, KC_##KC7, KC_##KD7, KC_##KE7 } \ +} + +#endif diff --git a/keyboards/ps2avrGB/rules.mk b/keyboards/ps2avrGB/rules.mk new file mode 100644 index 00000000..e2b5922e --- /dev/null +++ b/keyboards/ps2avrGB/rules.mk @@ -0,0 +1,43 @@ +# Copyright 2017 Luiz Ribeiro +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# MCU name +MCU = atmega32a +PROTOCOL = VUSB + +# unsupported features for now +NO_UART = yes +NO_SUSPEND_POWER_DOWN = yes +BACKLIGHT_ENABLE = no + +# processor frequency +F_CPU = 12000000 + +# build options +BOOTMAGIC_ENABLE = yes +MOUSEKEY_ENABLE = yes +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = yes +COMMAND_ENABLE = yes + +OPT_DEFS = -DDEBUG_LEVEL=0 +OPT_DEFS += -DBOOTLOADER_SIZE=2048 + +# custom matrix setup +CUSTOM_MATRIX = yes +SRC = matrix.c + +# programming options +PROGRAM_CMD = ./keyboards/ps2avrGB/program $(TARGET).hex diff --git a/keyboards/ps2avrGB/usbconfig.h b/keyboards/ps2avrGB/usbconfig.h new file mode 100644 index 00000000..d2d848fc --- /dev/null +++ b/keyboards/ps2avrGB/usbconfig.h @@ -0,0 +1,396 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +#include "config.h" + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 3 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 1 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 500 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 1 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 1 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF) +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF) +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x02 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r' +#define USB_CFG_VENDOR_NAME_LEN 13 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B' +#define USB_CFG_DEVICE_NAME_LEN 8 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 /* HID */ +#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */ +#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */ +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +#define usbMsgPtr_t unsigned short +/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to + * a scalar type here because gcc generates slightly shorter code for scalar + * arithmetics than for pointer arithmetics. Remove this define for backward + * type compatibility or define it to an 8 bit type if you use data in RAM only + * and all RAM is below 256 bytes (tiny memory model in IAR CC). + */ + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +/* Set INT1 for D- falling edge to count SOF */ +/* #define USB_INTR_CFG EICRA */ +#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10)) +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE EIMSK */ +#define USB_INTR_ENABLE_BIT INT1 +/* #define USB_INTR_PENDING EIFR */ +#define USB_INTR_PENDING_BIT INTF1 +#define USB_INTR_VECTOR INT1_vect + +#endif /* __usbconfig_h_included__ */ diff --git a/keyboards/readme.md b/keyboards/readme.md index 81a23c7e..5b7b2820 100644 --- a/keyboards/readme.md +++ b/keyboards/readme.md @@ -39,6 +39,7 @@ These keyboards are part of the QMK repository, but their manufacturers are not * [Bantam44](/keyboards/bantam44) — It is a 44-key 40% staggered keyboard. * [Ergodox Infinity](/keyboards/ergodox) - Ergonomic Split Keyboard by Input Club. * [GH60](/keyboards/gh60) — A 60% Geekhack community-driven project. +* [GON NerD](/keyboards/gonnerd) — Korean custom 60% PCB * [Happy Hacking Keyboard](/keyboards/hhkb) — The Happy Hacking keyboard can be hacked with a custom controller to run QMK. * [Infinity 60%](/keyboards/infinity60) - — Compact community keyboard by Input Club. * [JD45](/keyboards/jd45) — Another Geekhack community project, designed by jdcarpe. @@ -51,5 +52,6 @@ These keyboards are part of the QMK repository, but their manufacturers are not * [S60-x](/keyboards/s60-x) — DIY compact keyboard designed by VinnyCordeiro for Sentraq. * [Satan](/keyboards/satan) — A GH60 variant. * [SixKeyBoard](/keyboards/sixkeyboard) — A 6-key keyboard made by TechKeys. -* [TheVan 44](/keyboars/tv44) — A 44-key staggered keybard by Evangs. +* [TheVan 44](/keyboards/tv44) — A 44-key staggered keybard by Evangs. +* [WhiteFox](/keyboards/whitefox) — A 65% keyboard designed as a partnership by matt3o, Massdrop and Input Club * [Vision Division](/keyboards/vision_division) — Full Size / Split Linear Keyboard by IBNobody. diff --git a/keyboards/roadkit/Makefile b/keyboards/roadkit/Makefile new file mode 100644 index 00000000..4e2a6f00 --- /dev/null +++ b/keyboards/roadkit/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif \ No newline at end of file diff --git a/keyboards/roadkit/config.h b/keyboards/roadkit/config.h new file mode 100644 index 00000000..9596f7f3 --- /dev/null +++ b/keyboards/roadkit/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEAE +#define PRODUCT_ID 0x8846 +#define DEVICE_VER 0x0001 +#define MANUFACTURER TheVan Keyboards +#define PRODUCT Roadkit Micro +#define DESCRIPTION keyboard firmware for Roadkit Micro + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 4 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { F0, F5, D7, B4 } +#define MATRIX_COL_PINS { F1, F4, D6, D4 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/roadkit/keymaps/default/Makefile b/keyboards/roadkit/keymaps/default/Makefile new file mode 100644 index 00000000..f4671a9d --- /dev/null +++ b/keyboards/roadkit/keymaps/default/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/roadkit/keymaps/default/config.h b/keyboards/roadkit/keymaps/default/config.h new file mode 100644 index 00000000..df06a262 --- /dev/null +++ b/keyboards/roadkit/keymaps/default/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif \ No newline at end of file diff --git a/keyboards/roadkit/keymaps/default/keymap.c b/keyboards/roadkit/keymaps/default/keymap.c new file mode 100644 index 00000000..3fc18915 --- /dev/null +++ b/keyboards/roadkit/keymaps/default/keymap.c @@ -0,0 +1,49 @@ +#include "roadkit.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. + +#define _NP 0 + +// Macro name shortcuts +#define NUMPAD M(_NP) + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_NP] = /* Numpad */ + KEYMAP(KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, \ + KC_KP_4, KC_KP_5, KC_KP_6, \ + KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, \ + KC_KP_0, KC_KP_DOT), +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case _NP: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_NP); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/roadkit/keymaps/default/readme.md b/keyboards/roadkit/keymaps/default/readme.md new file mode 100644 index 00000000..5984a71d --- /dev/null +++ b/keyboards/roadkit/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for roadkit diff --git a/keyboards/roadkit/keymaps/singles/Makefile b/keyboards/roadkit/keymaps/singles/Makefile new file mode 100644 index 00000000..f4671a9d --- /dev/null +++ b/keyboards/roadkit/keymaps/singles/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/roadkit/keymaps/singles/config.h b/keyboards/roadkit/keymaps/singles/config.h new file mode 100644 index 00000000..df06a262 --- /dev/null +++ b/keyboards/roadkit/keymaps/singles/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif \ No newline at end of file diff --git a/keyboards/roadkit/keymaps/singles/keymap.c b/keyboards/roadkit/keymaps/singles/keymap.c new file mode 100644 index 00000000..5ee7a752 --- /dev/null +++ b/keyboards/roadkit/keymaps/singles/keymap.c @@ -0,0 +1,61 @@ +#include "roadkit.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. + +#define _NP 0 +#define _L1 1 + +// Macro name shortcuts +#define NUMPAD M(_NP) +#define LAYER1 M(_L1) + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_NP] = /* Numpad */ + SINGLES_KEYMAP(KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, \ + KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_MINUS, \ + KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, \ + KC_KP_0, KC_KP_DOT, TG(_L1), KC_BSPC), + [_L1] = /* LAYER 1 */ + SINGLES_KEYMAP(KC_NUMLOCK, KC_TRNS, KC_TRNS, KC_VOLU, \ + KC_TRNS, KC_UP, KC_TRNS, KC_VOLD, \ + KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case _L1: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_L1); + } + break; + case _NP: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_NP); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/roadkit/keymaps/singles/readme.md b/keyboards/roadkit/keymaps/singles/readme.md new file mode 100644 index 00000000..48ea4a8b --- /dev/null +++ b/keyboards/roadkit/keymaps/singles/readme.md @@ -0,0 +1,3 @@ +# The singles keymap for roadkit + +This keymap has a base layer with numpad functionality, and then a second layer with some additional keys. The user is encouraged to develop their own keymap using this as a starting point. diff --git a/keyboards/roadkit/readme.md b/keyboards/roadkit/readme.md new file mode 100644 index 00000000..d7480a16 --- /dev/null +++ b/keyboards/roadkit/readme.md @@ -0,0 +1,32 @@ +roadkit keyboard firmware +====================== + +## Quantum MK Firmware + +For the full Quantum feature list, see [the QMK Wiki](https://github.com/qmk/qmk_firmware/wiki). + +## Building + +Download or clone the whole firmware and navigate to the `keyboards/roadkit` folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex. You can then use the programmer of your choice to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make default`. For the roadkit, the default layout is a standard numpad layout. + +### Singles + +The singles layout for the roadkit corresponds to the configuration where only 1u keys are used and there are 16 of them on the board. To build the singles keymap, run `make singles`. + +### Other Keymaps + +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. + +To build the firmware binary hex file with a keymap just do `make` with a keymap like this: + +``` +$ make [default|jack|] +``` + +Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` diff --git a/keyboards/roadkit/roadkit.c b/keyboards/roadkit/roadkit.c new file mode 100644 index 00000000..26e0c51e --- /dev/null +++ b/keyboards/roadkit/roadkit.c @@ -0,0 +1,28 @@ +#include "roadkit.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/roadkit/roadkit.h b/keyboards/roadkit/roadkit.h new file mode 100644 index 00000000..b10e5740 --- /dev/null +++ b/keyboards/roadkit/roadkit.h @@ -0,0 +1,33 @@ +#ifndef ROADKIT_H +#define ROADKIT_H + +#include "quantum.h" + +// This is a shortcut to help you visually see your layout. +#define KEYMAP( \ + K00, K01, K02, K03, \ + K10, K11, K12, \ + K20, K21, K22, K23, \ + K30, K32 \ +) \ +{ \ + { K00, K01, K02, K03 }, \ + { K10, K11, K12, KC_NO }, \ + { K20, K21, K22, K23 }, \ + { K30, KC_NO, K32, KC_NO } \ +} + +#define SINGLES_KEYMAP( \ + K00, K01, K02, K03, \ + K10, K11, K12, K13, \ + K20, K21, K22, K23, \ + K30, K31, K32, K33 \ +) \ +{ \ + { K00, K01, K02, K03 }, \ + { K10, K11, K12, K13 }, \ + { K20, K21, K22, K23 }, \ + { K30, K31, K32, K33 } \ +} + +#endif diff --git a/keyboards/roadkit/rules.mk b/keyboards/roadkit/rules.mk new file mode 100644 index 00000000..dbba6bac --- /dev/null +++ b/keyboards/roadkit/rules.mk @@ -0,0 +1,69 @@ + + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= yes # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 diff --git a/keyboards/s60-x/readme.md b/keyboards/s60-x/readme.md index 94ce8292..408ad13a 100644 --- a/keyboards/s60-x/readme.md +++ b/keyboards/s60-x/readme.md @@ -13,7 +13,7 @@ You only need to flash them onto your keyboard, which is explained below, there' ## Flashing your keyboard The recommended programs for flashing your keyboard are [Atmel FLIP](http://www.atmel.com/tools/FLIP.aspx) (Windows) and [dfu-programmer](http://dfu-programmer.sourceforge.net/) (Linux/Windows). -[QMK Firmware Flasher](https://github.com/jackhumbert/qmk_firmware_flasher/releases) may work, as the S60-X keyboard uses the ATMega32U4 microcontroller, but it is untested. Use at your own risk. +[QMK Firmware Flasher](https://github.com/qmk/qmk_firmware_flasher/releases) may work, as the S60-X keyboard uses the ATMega32U4 microcontroller, but it is untested. Use at your own risk. [Easy AVR USB Keyboard Firmware](https://deskthority.net/wiki/Easy_AVR_USB_Keyboard_Firmware) also supports S60-X, but it is completely unrelated to TMK firmware. Use at your own risk. diff --git a/keyboards/satan/config.h b/keyboards/satan/config.h index 7e9f91cc..eb357b39 100644 --- a/keyboards/satan/config.h +++ b/keyboards/satan/config.h @@ -67,7 +67,7 @@ along with this program. If not, see . */ #define RGB_DI_PIN E2 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 8 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/satan/keymaps/admiralStrokers/Makefile b/keyboards/satan/keymaps/admiralStrokers/Makefile new file mode 100644 index 00000000..61dfedeb --- /dev/null +++ b/keyboards/satan/keymaps/admiralStrokers/Makefile @@ -0,0 +1,24 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Enables your LED to breathe while your computer is sleeping. +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODEMAP_ENABLE = no # This allows sending unicode symbols using X() in your keymap. +UNICODE_ENABLE =no # Unicode +UCIS_ENABLE = no # Keep in mind that not all will work (See WinCompose for details on Windows). +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no# Breathing sleep LED during USB suspend +API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/satan/keymaps/admiralStrokers/config.h b/keyboards/satan/keymaps/admiralStrokers/config.h new file mode 100644 index 00000000..d0338fb7 --- /dev/null +++ b/keyboards/satan/keymaps/admiralStrokers/config.h @@ -0,0 +1,96 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H_ADMSTROK +#define CONFIG_H_ADMSTROK + +#include "config_common.h" +#include "../../config.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0003 +#define MANUFACTURER SATAN +#define PRODUCT GH60 +#define DESCRIPTION QMK keyboard firmware for Satan GH60 with WS2812 support + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +// ROWS: Top to bottom, COLS: Left to right + +#define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 } +#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B7, D4, B1, B0, B5, B4, D7, D6, B3 } +#define UNUSED_PINS + +#define BACKLIGHT_PIN B6 + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* Backlight configuration */ +#define BACKLIGHT_LEVELS 4 + +/* Underlight configuration */ +#define RGB_DI_PIN E2 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 8 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + +#define DISABLE_SPACE_CADET_ROLLOVER + + + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/satan/keymaps/admiralStrokers/keymap.c b/keyboards/satan/keymaps/admiralStrokers/keymap.c new file mode 100644 index 00000000..b6dc29c6 --- /dev/null +++ b/keyboards/satan/keymaps/admiralStrokers/keymap.c @@ -0,0 +1,195 @@ +#include "satan.h" + +static uint16_t key_timer; + +bool checktime(void){ + return (timer_elapsed(key_timer) < 150) ? true : false; + }; + +// general keydefs +#define norm 0 // Default layer +#define elev 1 // Layer directional keys +#define supr 2 // F-keys and mediakeys +#define spac 3 // +#define FNO1 4 // +#define FNO2 5 // +#define FNO3 6 // +#define MAC0 M(0) // +#define MAC1 M(1) // +#define MAC2 M(2) // +#define MAC3 M(3) // +#define MAC4 M(4) // +#define MAC5 M(5) // +#define MAC6 M(6) // +#define MAC7 M(7) // +#define MAC8 M(8) // +#define MAC9 M(9) // +#define GRAV KC_GRV // +#define MEDI F(FNO1)// + +// General shortenings +#define ESCA KC_ESC +#define MINS KC_MINS +#define EQUL KC_EQL +#define BSPC KC_BSPC +#define DELE KC_DEL +#define LBRC KC_LBRC +#define RBRC KC_RBRC +#define ALTR KC_RALT +#define SCLN KC_SCLN +#define QUOT KC_QUOT +#define NUHS KC_NUHS +#define ENTE KC_ENT +#define NUBS KC_NUBS // Less/ greater sign +#define COMM KC_COMM // Comma +#define FSTO KC_DOT // Full stop +#define SLSH KC_SLSH +#define ALTL KC_LALT +#define GUIL KC_LGUI +#define GUIR KC_RGUI +#define MENO KC_MENU +// The F-row/layer: +#define FK01 KC_F1 +#define FK02 KC_F2 +#define FK03 KC_F3 +#define FK04 KC_F4 +#define FK05 KC_F5 +#define FK06 KC_F6 +#define FK07 KC_F7 +#define FK08 KC_F8 +#define FK09 KC_F9 +#define FK10 KC_F10 +#define FK11 KC_F11 +#define FK12 KC_F12 +#define FK13 KC_F13 +#define FK14 KC_F14 +// Special Actions and Media Keys +#define INSE KC_INS // Insert here +#define HOME KC_HOME // Go to beginning of line +#define ENDI KC_END // go to end of line +#define PSCR KC_PSCR // Print Screen +#define SLCK KC_SLCK // go to end of line +#define PGDN KC_PGDN // go to end of line +#define PGUP KC_PGUP // go to end of line +#define PLPS KC_MPLY // Play/Pause +#define PAUS KC_PAUS // Pause button +#define MUTE KC_MUTE // Mute sound +#define VOLU KC_VOLU // Volume increase +#define VOLD KC_VOLD // Volume decrease +#define MNXT KC_MNXT // next track +#define MPRV KC_MPRV // prev track +#define MSTP KC_MSTP // stop playing +#define MSEL KC_MSEL // Select media (Start playing it) +#define MAIL KC_MAIL // Open default mail app +#define CALC KC_CALC // Open default calculator app +#define MYCM KC_MYCM // Open default file manager +//#define LILO KC_XXXXXX // Reserved for later +//#define LIHI KC_XXXXXX // Reserved for later + + +// dual-role shortcuts +#define DUTB LT(elev, KC_TAB) // `tabs` layer on hold and tab on tap +#define DUSP LT(spac, KC_SPACE) // `spce` layer on hold and space on tap +#define LOCK LGUI(KC_L) // lock computer (win) + +// Space Admiral Strokers +#define SADL MAC0 // Hold for lshift and { on tap +#define SADR MAC1 // Hold for rshift and } on tap +#define CADL MAC2 // Hold for lctrl and [ on tap +#define CADR MAC3 // Hold for rctrl and ] on tap + +// arrow cluster duality bottom right corner +#define ARLF ALT_T(KC_LEFT) // Left arrow +#define ARRT CTL_T(KC_RIGHT)// Right arrow +#define ARUP SFT_T(KC_UP) // Up arrow +#define ARDN GUI_T(KC_DOWN) // Down arrow + +// brackets +#define NOCL RALT(KC_7) // [ +#define NOCR RALT(KC_0) // ] +#define NOPL LSFT(KC_8) // ( +#define NOPR LSFT(KC_9) // ) +#define NOAL KC_NUBS // < +#define NOAR LSFT(KC_NUBS) // > +#define NOBL RALT(KC_8) // [ +#define NOBR RALT(KC_9) // ] + +// increase readability +#define XXXX KC_TRNS +#define DEAD KC_NO +#define SCAN KC_TRNS // Scandinavian keys, the Row 5 key 5 is actually Row 1 key 15 on the PCB + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[ norm ] = KEYMAP( // Normal scandinavian mapping (danish has QUOT and SCLN wapped) + GRAV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, MINS, EQUL, BSPC, DELE,\ + DUTB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, LBRC, RBRC, DEAD,\ + ALTR, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, SCLN, QUOT, NUHS, ENTE,\ + SADL, NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, COMM, FSTO, SLSH, SADR, DEAD,\ + CADL, ALTL, GUIL, DUSP, GUIR, MEDI, MENO, CADR), + +[ elev ] = KEYMAP( // The f-Row (with f13-14), Special keys and media keys + LOCK, FK01, FK02, FK03, FK04, FK05, FK06, FK07, FK08, FK09, FK10, FK11, FK12, FK13, FK14,\ + XXXX, XXXX, XXXX, XXXX, MAIL, XXXX, XXXX, HOME, INSE, PSCR, SLCK, PAUS, PGUP, XXXX,\ + XXXX, XXXX, XXXX, XXXX, MYCM, XXXX, XXXX, MPRV, PAUS, MNXT, XXXX, XXXX, PGDN, ENDI,\ + XXXX, XXXX, XXXX, XXXX, CALC, XXXX, XXXX, XXXX, MUTE, VOLD, VOLU, XXXX, ARUP, DEAD,\ + XXXX, XXXX, XXXX, PLPS, XXXX, ARLF, ARDN, ARRT), + +[ spac ] = KEYMAP( // The space controls (by pressing space) + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DEAD,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX), + +[ supr ] = KEYMAP( // Additional layer for later use. + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DEAD,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX), +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function + switch(id) { + case 0: //MAC0 - Hold for lshift and { on tap + if (record->event.pressed) { + key_timer = timer_read(); + return MACRO(D(LSFT), END ); + } else { + return checktime() ? MACRO(U(LSFT),D(RALT),T(7),U(RALT),END): MACRO(U(LSFT),END); + }; break; + case 1: //MAC1 - Hold for rshift and } on tap + if (record->event.pressed) { + key_timer = timer_read(); + return MACRO(D(RSFT), END ); + } else { + return checktime() ? MACRO(U(RSFT),D(RALT),T(0),U(RALT),END): MACRO(U(RSFT),END); + }; break; + case 2: //MAC2 - Hold for lctrl and [ on tap + if (record->event.pressed) { + key_timer = timer_read(); + return MACRO(D(LCTL), END ); + } else {return checktime() ? MACRO(U(LCTL),D(RALT),T(8),U(RALT),END):MACRO(U(LCTL),END); + }; break; + case 3: //MAC3 - Hold for rctrl and ] on tap + if (record->event.pressed) { + key_timer = timer_read(); + return MACRO(D(RCTL), END ); + } else { + return checktime() ? MACRO(U(RCTL),D(RALT),T(9),U(RALT),END):MACRO(U(RCTL),END); + }; break; + case 4: //MAC4 reserved for later. + if (record->event.pressed) { } else { }; break; + case 5: //MAC5 reserved for later. + if (record->event.pressed) { } else { }; break; + case 6: //MAC6 reserved for later. + if (record->event.pressed) { } else { }; break; + } return MACRO_NONE; +}; +/* + Later use: + void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } + enum function_id { }; + const uint16_t PROGMEM fn_actions[] = { }; + +*/ diff --git a/keyboards/satan/keymaps/admiralStrokers/readme.md b/keyboards/satan/keymaps/admiralStrokers/readme.md new file mode 100644 index 00000000..9b30caf3 --- /dev/null +++ b/keyboards/satan/keymaps/admiralStrokers/readme.md @@ -0,0 +1,13 @@ +# Admiral Strokers keymap +## For the Satan GH60 PCB +The Admiral STN60 is a layout for users of the satan GH60, optimized with some nice features such as mod tap for brackets (Similar to Space Cadett), space mod for F-row/ layer with easy to access media and control keys. The layout below is just as an example and is ISO based, ANSI and JIS layouts will be included later. + +`````` +[ _tmp ] = KEYMAP( // Copy this to get started. SCAN is scandinavian layout specific. +XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ +XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DEAD,\ +XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, SCAN, XXXX,\ +XXXX, SCAN, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DEAD,\ +XXXX, XXXX, XXXX, XXXX, SCAN, XXXX, XXXX, XXXX, XXXX),\ + +``` diff --git a/keyboards/satan/keymaps/dbroqua/keymap.c b/keyboards/satan/keymaps/dbroqua/keymap.c new file mode 100644 index 00000000..5b921e02 --- /dev/null +++ b/keyboards/satan/keymaps/dbroqua/keymap.c @@ -0,0 +1,152 @@ +#include "satan.h" +#include "action_layer.h" +#include "rgblight.h" + +#define _DEFAULT 0 +#define _FN 1 +#define _SFX 2 + +enum planck_keycodes { + DEFAULT = SAFE_RANGE +}; + +// Fillers to make layering more clear +#define ______ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Qwerty gui/alt/space/alt/gui + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Bksp | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | RShift | FN | + * |-----------------------------------------------------------------------------------------+ + * |LGUI | LAlt | Space | RAlt |RGUI | + * `-----------------------------------------------------------------' + */ + [_DEFAULT] = KEYMAP_HHKB( /* Basic QWERTY */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN), \ + ______, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, ______, ______ \ + ), + +/* FN Layer + * ,-----------------------------------------------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del | + * |-----------------------------------------------------------------------------------------+ + * | CAPS | BL- | BL+ | BL | | | | | Psc | Slck| Paus| Up | | | + * |-----------------------------------------------------------------------------------------+ + * | | Vol-| Vol+| Mute| | | * | / | Home| PgUp| Left|Right| | + * |-----------------------------------------------------------------------------------------+ + * | | Prev| Play| Next| | | + | - | End |PgDn| Down| | | + * |-----------------------------------------------------------------------------------------+ + * | | | | Stop | | + * `-----------------------------------------------------------------' + */ + [_FN] = KEYMAP_HHKB( /* Layer 1 */ + TG(_SFX), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \ + KC_CAPS, ______, ______, ______, ______, ______, ______, ______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, ______, ______, \ + ______, KC_VOLD,KC_VOLU,KC_MUTE,______, ______, KC_PAST,KC_PSLS,KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, ______, \ + ______, KC_MPRV,KC_MPLY,KC_MNXT,______, ______, KC_PPLS,KC_PMNS,KC_END, KC_PGDN, KC_DOWN, ______, ______, \ + ______, ______, ______, ______, KC_MSTP, ______, ______, ______ \ + ), + +/* SFX Layer + * ,-----------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | BL- | BL+ | BL | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | RGBT| RGBM| | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | + * `-----------------------------------------------------------------' + */ + [_SFX] = KEYMAP_HHKB( + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ + ______, BL_DEC, BL_INC, BL_TOGG,______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ + ______, F(0), F(1), ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ + ______, F(2), F(3), F(4), F(5), F(6), F(7), ______, ______, ______, ______, ______, ______, \ + ______, ______, ______, ______, ______, ______, ______, ______ \ + ) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + return MACRO_NONE; +}; + +enum function_id { + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(RGBLED_TOGGLE), + [1] = ACTION_FUNCTION(RGBLED_STEP_MODE), + [2] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), + [3] = ACTION_FUNCTION(RGBLED_DECREASE_HUE), + [4] = ACTION_FUNCTION(RGBLED_INCREASE_SAT), + [5] = ACTION_FUNCTION(RGBLED_DECREASE_SAT), + [6] = ACTION_FUNCTION(RGBLED_INCREASE_VAL), + [7] = ACTION_FUNCTION(RGBLED_DECREASE_VAL) +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + switch (id) { + case RGBLED_TOGGLE: + if (record->event.pressed) { + rgblight_toggle(); + } + break; + case RGBLED_INCREASE_HUE: + if (record->event.pressed) { + rgblight_increase_hue(); + } + break; + case RGBLED_DECREASE_HUE: + if (record->event.pressed) { + rgblight_decrease_hue(); + } + break; + case RGBLED_INCREASE_SAT: + if (record->event.pressed) { + rgblight_increase_sat(); + } + break; + case RGBLED_DECREASE_SAT: + if (record->event.pressed) { + rgblight_decrease_sat(); + } + break; + case RGBLED_INCREASE_VAL: + if (record->event.pressed) { + rgblight_increase_val(); + } + break; + case RGBLED_DECREASE_VAL: + if (record->event.pressed) { + rgblight_decrease_val(); + } + break; + case RGBLED_STEP_MODE: + if (record->event.pressed) { + rgblight_step(); + } + break; + } +} \ No newline at end of file diff --git a/keyboards/satan/keymaps/dbroqua/readme.md b/keyboards/satan/keymaps/dbroqua/readme.md new file mode 100644 index 00000000..39e71bee --- /dev/null +++ b/keyboards/satan/keymaps/dbroqua/readme.md @@ -0,0 +1,9 @@ +# Dbroqua HHKB like Layout + +Like the HHKB but with a Satan GH60 PCB :D. + +# Programming Instructions: +Enter into programming mode and run the following command. +``` +$ sudo KEYMAP=dbroqua_hhkb make dfu +``` \ No newline at end of file diff --git a/keyboards/satan/keymaps/midi/Makefile b/keyboards/satan/keymaps/midi/Makefile new file mode 100644 index 00000000..89c34b39 --- /dev/null +++ b/keyboards/satan/keymaps/midi/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = yes # MIDI support (+2400 to 4200, depending on config) +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/satan/keymaps/midi/config.h b/keyboards/satan/keymaps/midi/config.h new file mode 100644 index 00000000..8e10b04e --- /dev/null +++ b/keyboards/satan/keymaps/midi/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/satan/keymaps/midi/keymap.c b/keyboards/satan/keymaps/midi/keymap.c new file mode 100644 index 00000000..8378b4e4 --- /dev/null +++ b/keyboards/satan/keymaps/midi/keymap.c @@ -0,0 +1,77 @@ +#include "satan.h" + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _ML 1 + +// readability +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |Midi|Ctrl | + * `-----------------------------------------------------------' + */ +[_BL] = KEYMAP_ANSI( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, TG(_ML), KC_RCTL), + +#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) +/* Keymap _ML: MIDI Layer (Advanced) + * ,------------------------------------------------------------------------. + * | Exit | | | | | | | | | | | | | | + * |------------------------------------------------------------------------| + * | Ch+ | | C# | D# | | F# | G# | A# | | C# | D# | | | | + * |------------------------------------------------------------------------| + * | Mod | C | D | E | F | G | A | B | C | D | E | F | | + * |------------------------------------------------------------------------| + * | Sustain |Oct-|Oct+|Mod-|Mod+| | | |Tns-|Tns+|Tns0| Sustain | + * |------------------------------------------------------------------------| + * | | | | All notes off | | | | | + * `------------------------------------------------------------------------' + */ +[_ML] = KEYMAP_ANSI( + TG(_ML), MI_VEL_1, MI_VEL_2, MI_VEL_3, MI_VEL_4, MI_VEL_5, MI_VEL_6, MI_VEL_7, MI_VEL_8, MI_VEL_9, MI_VEL_10, XXXXXXX, XXXXXXX, XXXXXXX, \ + MI_CHU, XXXXXXX, MI_Cs, MI_Ds, XXXXXXX, MI_Fs, MI_Gs, MI_As, XXXXXXX, MI_Cs_1, MI_Ds_1, XXXXXXX, XXXXXXX, XXXXXXX, \ + MI_MOD, MI_C, MI_D, MI_E, MI_F, MI_G, MI_A, MI_B, MI_C_1, MI_D_1, MI_E_1, MI_F_1, _______, \ + MI_SUS, MI_OCTD, MI_OCTU, MI_MODSD, MI_MODSU, XXXXXXX, XXXXXXX, XXXXXXX, MI_TRNSD, MI_TRNSU, MI_TRNS_0, MI_SUS, \ + _______, _______, _______, MI_ALLOFF, _______, _______, _______, _______), +#elif defined(MIDI_ENABLE) && defined(MIDI_BASIC) +/* Keymap _ML: MIDI Layer (Advanced) + * ,------------------------------------------------------------------------. + * | Exit | | | | | | | | | | | | | | + * |------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |------------------------------------------------------------------------| + * | | | | | | | | | | | | | | + * |------------------------------------------------------------------------| + * | |MuOn|MuOf|MiOn|MiOf| | | | | | | | + * |------------------------------------------------------------------------| + * | | | | | | | | | + * `------------------------------------------------------------------------' + */ + +[_ML] = KEYMAP_ANSI( + TG(_ML), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______), +#endif +}; \ No newline at end of file diff --git a/keyboards/satan/keymaps/midi/readme.md b/keyboards/satan/keymaps/midi/readme.md new file mode 100644 index 00000000..87844a85 --- /dev/null +++ b/keyboards/satan/keymaps/midi/readme.md @@ -0,0 +1 @@ +# Satan GH60 layout demonstrating MIDI key mapping diff --git a/keyboards/satan/keymaps/sethbc/keymap.c b/keyboards/satan/keymaps/sethbc/keymap.c index 82c77908..93610258 100644 --- a/keyboards/satan/keymaps/sethbc/keymap.c +++ b/keyboards/satan/keymaps/sethbc/keymap.c @@ -32,21 +32,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FL), \ - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_MENU, KC_RCTL), [_FL] = KEYMAP_HHKB( #ifdef RGBLIGHT_ENABLE KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RESET, \ - KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, KC_DEL, \ - _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ - _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______), - #else - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RESET, \ KC_CAPS, _______, RGB_TOG,RGB_MOD,RGB_HUI, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, KC_DEL, \ _______, KC_VOLD, RGB_HUD,RGB_SAI,RGB_SAD, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ _______, RGB_VAI,RGB_VAD,_______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______), + #else + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RESET, \ + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, KC_DEL, \ + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ + _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______), #endif }; diff --git a/keyboards/satan/keymaps/smt/Makefile b/keyboards/satan/keymaps/smt/Makefile new file mode 100644 index 00000000..0c9ae824 --- /dev/null +++ b/keyboards/satan/keymaps/smt/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/satan/keymaps/smt/keymap.c b/keyboards/satan/keymaps/smt/keymap.c new file mode 100644 index 00000000..d9084991 --- /dev/null +++ b/keyboards/satan/keymaps/smt/keymap.c @@ -0,0 +1,141 @@ +#include "satan.h" + + +// Used for SHIFT_ESC +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _FUNC 3 + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK +}; + +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Custom macros +#define ALT_GRV ALT_T(KC_GRV) // Tap for Backtick, hold for Alt +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Shift+Alt) +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _QWERTY: (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |Fn |Ctrl | + * `-----------------------------------------------------------' + */ +[_QWERTY] = KEYMAP_ANSI( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, \ + CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_FUNC),KC_RCTL), + + /* Keymap _COLEMAK: (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \ | + * |-----------------------------------------------------------| + * |CAPS | A| R| S| T| D| H| N| E| I| O| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| K| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |Fn |Ctrl | + * `-----------------------------------------------------------' + */ +[_COLEMAK] = KEYMAP_ANSI( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN,KC_LBRC, KC_RBRC,KC_BSLS, \ + CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O ,KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_FUNC),KC_RCTL), + + /* Keymap _DVORAK: (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| [| ]|Backsp | + * |-----------------------------------------------------------| + * |HypTb| '| ,| .| P| Y| F| G| C| R| L| /| =| \ | + * |-----------------------------------------------------------| + * |CtrlEsc| A| O| E| U| I| D| H| T| N| S| -|Return | + * |-----------------------------------------------------------| + * |Shift | ;| Q| J| K| X| B| M| W| V| Z|ShiftEnter| + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |Fn |Ctrl | + * `-----------------------------------------------------------' + */ +[_DVORAK] = KEYMAP_ANSI( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC,KC_BSPC, \ + HPR_TAB, KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, \ + CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, \ + KC_LSFT, KC_SCLN,KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_FUNC),KC_RCTL), + + /* Keymap _FUNC: Function Layer + * ,-----------------------------------------------------------. + * | | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | + * |-----------------------------------------------------------| + * | |Hom| UP|End| | | |Qwt|Cmk|Dvk| |BL-|BL+|BL | + * |-----------------------------------------------------------| + * | |LFT| DN| RT| | |LFT| DN| UP| RT|Vo+|Pg+| | + * |-----------------------------------------------------------| + * | | | |Prv|Ply|Nxt| | | |Vo-|Pg-| | + * |-----------------------------------------------------------| + * |RESET| | | | | | | | + * `-----------------------------------------------------------' + */ +[_FUNC] = KEYMAP_ANSI( + _______,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_DEL, \ + _______,KC_HOME,KC_UP ,KC_END ,_______,_______,_______,QWERTY ,COLEMAK,DVORAK ,_______,BL_DEC ,BL_INC ,BL_TOGG, \ + _______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,KC_LEFT,KC_DOWN,KC_UP ,KC_RGHT,KC_VOLU,KC_PGUP ,_______, \ + _______ ,_______,_______,KC_MPRV,KC_MPLY,KC_MNXT,_______,_______,_______,KC_VOLD,KC_PGDN ,_______, \ + RESET ,_______,_______ ,_______ ,_______,_______,_______,_______ + ) +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + } + return true; +} diff --git a/keyboards/satan/keymaps/smt/readme.md b/keyboards/satan/keymaps/smt/readme.md new file mode 100644 index 00000000..7b706d60 --- /dev/null +++ b/keyboards/satan/keymaps/smt/readme.md @@ -0,0 +1 @@ +# smt's Satan GH60 layout diff --git a/keyboards/satan/keymaps/unxmaal/Makefile b/keyboards/satan/keymaps/unxmaal/Makefile new file mode 100644 index 00000000..ee94a67b --- /dev/null +++ b/keyboards/satan/keymaps/unxmaal/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/satan/keymaps/unxmaal/README.md b/keyboards/satan/keymaps/unxmaal/README.md new file mode 100644 index 00000000..50ad0cf1 --- /dev/null +++ b/keyboards/satan/keymaps/unxmaal/README.md @@ -0,0 +1,20 @@ +Unxmaal's GH60 Satan Layout +===================== +* Mostly stolen from /u/robotmaxtron + +##Quantum MK Firmware +For the full Quantum feature list, see the parent readme.md. + +* Standard Mac ANSI layout +* Spacebar acts as space when tapped, Fn when held +* Menu acts as menu when tapped, Fn2 when held +* Layer1: + * Top row = `~, F1-F12, Del + * JKIL = arrow cluster +* Layer2: + * Top row = media controls + * JKIL = PgDn/Up/Home/Insert + * Backspace = Reset + +### Additional Credits +Keymap has been based on various keymaps available from the QMK Repo for the GH60-SATAN and KC60 keyboards. \ No newline at end of file diff --git a/keyboards/satan/keymaps/unxmaal/keymap.c b/keyboards/satan/keymaps/unxmaal/keymap.c new file mode 100644 index 00000000..657602de --- /dev/null +++ b/keyboards/satan/keymaps/unxmaal/keymap.c @@ -0,0 +1,119 @@ +#include "satan.h" + + +// Used for SHIFT_ESC +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _AL 1 +#define _FL 2 + +#define _______ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ANSI Base, Mac style + * ,-----------------------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| = | Backsp | + * |-----------------------------------------------------------------------------| + * |Tab | Q | W | E | R | T | Y | U | I| O| P| [| ]| \| + * |-----------------------------------------------------------------------------| + * |Caps/Fn | A| S| D| F| G| H| J| K| L| ;| '| Enter | + * |-----------------------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /| Shift | + * |-----------------------------------------------------------------------------| + * |Fn|Alt |Gui | Space(tapped), Fn(held) |Gui |Alt |Menu(tapped, Fn2(held)|Ctrl| + * `-----------------------------------------------------------------------------' + */ +[_BL] = KEYMAP_ANSI( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + MO(_AL), KC_LALT,KC_LGUI, LT(_AL,KC_SPACE), KC_RGUI, KC_RALT, LT(_FL,KC_MENU), KC_RCTL), + /* + * Pok3r style arrow cluster + * ,-----------------------------------------------------------. + * |`~ | F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12|DEL | + * |-----------------------------------------------------------| + * | | | | | | | | |Up| | | | | | + * |-----------------------------------------------------------| + * | | | | | | | |Left|Down|Right| | | | + * |-----------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + */ +[_AL] = KEYMAP_ANSI( + KC_GRV, KC_F1, KC_F2,KC_F3,KC_F4,KC_F5,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_F11,KC_F12,KC_DELETE, \ + KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_UP,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_LEFT,KC_DOWN,KC_RGHT,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS), + /* Keymap _FL: Function Layer + * ,-----------------------------------------------------------. + * | | | | | | | | | | | | | | RESET| + * |-----------------------------------------------------------| + * | | | | | | | | | | | |BL-|BL+|BL | + * |-----------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | | RGB on|RGB step|Hue+|Hue- |Sat+|Sat-|Val+| Val-| | | | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + */ +[_FL] = KEYMAP_ANSI( + #ifdef RGBLIGHT_ENABLE + _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC,BL_INC, BL_TOGG, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, \ + _______,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______,_______, \ + _______,_______,_______, _______, _______,_______,_______, _______), + #else + _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC, BL_INC,BL_TOGG, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______, _______, _______,_______,_______,_______), + #endif +}; + +enum function_id { + SHIFT_ESC, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(SHIFT_ESC), +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t shift_esc_shift_mask; + switch (id) { + case SHIFT_ESC: + shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (shift_esc_shift_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (shift_esc_shift_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/subatomic/keymaps/default/config.h b/keyboards/subatomic/keymaps/default/config.h new file mode 100644 index 00000000..4c615819 --- /dev/null +++ b/keyboards/subatomic/keymaps/default/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/subatomic/keymaps/default/keymap.c b/keyboards/subatomic/keymaps/default/keymap.c new file mode 100644 index 00000000..628ade9b --- /dev/null +++ b/keyboards/subatomic/keymaps/default/keymap.c @@ -0,0 +1,280 @@ +#include "subatomic.h" +#include "action_layer.h" +#include "eeconfig.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum subatomic_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + BACKLIT +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-------------------------------------------------------------------------------------------------. + * | Ins | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | - | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | = | Esc | A | S | D | F | G | H | J | K | L | ; | " |Enter | + * |------+------+------+------+------+------+------|------+------+------+------+------+------+------| + * | Pg Up| Shift| Z | X | C | V | B | N | M | , | . | / | Home | End | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Pg Dn| Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up | Right| \ | + * `-------------------------------------------------------------------------------------------------' + */ +[_QWERTY] = { + {KC_TRNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_TRNS}, + {KC_TRNS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, KC_TRNS}, + {KC_TRNS, KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_TRNS}, + {KC_TRNS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, KC_TRNS}, + {KC_TRNS, BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS} +}, + +/* Colemak + * ,-------------------------------------------------------------------------------------------------. + * | Ins | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | - | Tab | Q | W | F | P | G | J | L | U | Y | ; | [ | ] | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | = | Esc | A | R | S | T | D | H | N | E | I | O | " |Enter | + * |------+------+------+------+------+------+------|------+------+------+------+------+------+------| + * | Pg Up| Shift| Z | X | C | V | B | K | M | , | . | / | Home | End | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Pg Dn| Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up | Right| \ | + * `-------------------------------------------------------------------------------------------------' + */ +[_COLEMAK] = { + {KC_TRNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_TRNS}, + {KC_TRNS, KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL, KC_TRNS}, + {KC_TRNS, KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_TRNS}, + {KC_TRNS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, KC_TRNS}, + {KC_TRNS, BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS} +}, + +/* Dvorak + * ,-------------------------------------------------------------------------------------------------. + * | Ins | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | [ | Tab | " | , | . | P | Y | F | G | C | R | L | / | = | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | ] | Esc | A | O | E | U | I | D | H | T | N | S | - |Enter | + * |------+------+------+------+------+------+------|------+------+------+------+------+------+------| + * | Pg Up| Shift| ; | Q | J | K | X | B | M | W | V | Z | Home | End | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Pg Dn| Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up | Right| \ | + * `-------------------------------------------------------------------------------------------------' + */ +[_DVORAK] = { + {KC_TRNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_TRNS}, + {KC_TRNS, KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, KC_TRNS}, + {KC_TRNS, KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, KC_TRNS}, + {KC_TRNS, KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT, KC_TRNS}, + {KC_TRNS, BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS} +}, + +/* Lower + * ,-------------------------------------------------------------------------------------------------. + * | | ~ | F1 | F3 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | _ | Tab | ! | @ | # | $ | % | ^ | & | * | ( | ) | { | } | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | + | Esc | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------+------|------+------+------+------+------+------+------| + * | | Shift| F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Next | Vol- | Vol+ | Play | | + * `-------------------------------------------------------------------------------------------------' + */ +[_LOWER] = { + {KC_TRNS, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, KC_TRNS}, + {KC_TRNS, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, KC_TRNS}, + {KC_TRNS, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS}, + {KC_TRNS, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______,KC_TRNS}, + {KC_TRNS, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, KC_TRNS} +}, + +/* Raise + * ,-------------------------------------------------------------------------------------------------. + * | | ~ | F1 | F3 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | _ | Tab | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | { | } | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | + | Esc | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | | | + * |------+------+------+------+------+------+------|------+------+------+------+------+------+------| + * | | Shift| F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Next | Vol- | Vol+ | | Play | + * `-------------------------------------------------------------------------------------------------' + */ +[_RAISE] = { + {KC_TRNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_TRNS}, + {KC_TRNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_TRNS}, + {KC_TRNS, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, KC_TRNS}, + {KC_TRNS, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, KC_TRNS}, + {KC_TRNS, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, KC_TRNS} +}, + +/* Adjust (Lower + Raise) + * ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | Reset| | | | | | | | | | | | + * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| + * | | | | |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | | + * |------+------+------+------+------+------+------|------+------+------+------+------+------+------| + * | | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-------------------------------------------------------------------------------------------------' + */ +[_ADJUST] = { + {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS}, + {KC_TRNS, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, KC_TRNS}, + {KC_TRNS, _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, KC_TRNS}, + {KC_TRNS, _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, KC_TRNS}, + {KC_TRNS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_TRNS} +} + + +}; + +#ifdef AUDIO_ENABLE +float tone_startup[][2] = { + {NOTE_B5, 20}, + {NOTE_B6, 8}, + {NOTE_DS6, 20}, + {NOTE_B6, 8} +}; + +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); + +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +#endif + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +}; + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif +} + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif diff --git a/keyboards/tada68/config.h b/keyboards/tada68/config.h index 5d875793..19cf9c9b 100644 --- a/keyboards/tada68/config.h +++ b/keyboards/tada68/config.h @@ -67,7 +67,7 @@ along with this program. If not, see . */ /*#define RGB_DI_PIN E2 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 2 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/tada68/keymaps/default/keymap.c b/keyboards/tada68/keymaps/default/keymap.c index da57c034..f28116e0 100644 --- a/keyboards/tada68/keymaps/default/keymap.c +++ b/keyboards/tada68/keymaps/default/keymap.c @@ -1,9 +1,5 @@ #include "tada68.h" - -// Used for SHIFT_ESC -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them @@ -36,63 +32,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap _FL: Function Layer * ,----------------------------------------------------------------. - * | | | | | | | | | | | | | | RESET| | + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |Ins | * |----------------------------------------------------------------| - * | | | | | | | | | | | |BL-|BL+|BL | | + * | | |Up | | | | | | | | | | | |Hme | * |----------------------------------------------------------------| - * | | | | | | | | | | | | | | + * | |<- |Dn | ->| | | | | | | | | |End | * |----------------------------------------------------------------| - * | | F1|F2 | F3|F4 | F5| F6| F7| F8| | | | | | + * | | | |Bl-|BL |BL+| |VU-|VU+|MUT| |MouseL|MsU|Rck | * |----------------------------------------------------------------| - * | | | | | | | | | | | + * | | | | | | | |MsL|MsD|MsR | * `----------------------------------------------------------------' */ [_FL] = KEYMAP_ANSI( - #ifdef RGBLIGHT_ENABLE - _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET,_______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC,BL_INC, BL_TOGG,_______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______, \ - _______,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______,_______,_______,_______, \ - _______,_______,_______, _______, _______,_______,_______,_______,_______, _______), - #else - _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET,_______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC,BL_INC, BL_TOGG,_______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ - _______,_______,_______, _______, _______,_______,_______,_______,_______, _______), - #endif -}; - -/*enum function_id { - //SHIFT_ESC, + _______, KC_F1 ,KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS , \ + _______,_______,KC_UP, _______,_______,_______,_______,_______,_______,_______,_______, BL_DEC,BL_INC, BL_TOGG,KC_HOME, \ + _______,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,_______,_______,_______,_______,_______,_______, _______,KC_END, \ + _______,_______,_______,BL_DEC, BL_TOGG,BL_INC, _______,KC_VOLD,KC_VOLU,KC_MUTE,_______,KC_BTN1, KC_MS_U, KC_BTN2, \ + _______,_______,_______, _______, _______,_______,_______,KC_MS_L,KC_MS_D, KC_MS_R), }; - -const uint16_t PROGMEM fn_actions[] = { - //[0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -}*/ diff --git a/keyboards/tada68/keymaps/default/readme.md b/keyboards/tada68/keymaps/default/readme.md index 36760d6b..53412d7c 100644 --- a/keyboards/tada68/keymaps/default/readme.md +++ b/keyboards/tada68/keymaps/default/readme.md @@ -1 +1,3 @@ # default TADA68 layout + +This layout replicates the default factory layout of the TADA68. diff --git a/keyboards/tada68/readme.md b/keyboards/tada68/readme.md index 552fdea5..dbe2fdca 100644 --- a/keyboards/tada68/readme.md +++ b/keyboards/tada68/readme.md @@ -1,4 +1,15 @@ TADA68 keyboard firmware -====================== +======================== -TODO: to be updated. +1) from the keyboards/tada68 directory run: +``` +$ make flashbin +``` + +2) hit the reset button on the TADA, the lights will start flashing. + +3) You'll see a new drive on your computer called TADA68. Backup the original factory `FLASH.BIN` file thats inside it. + +4) Delete `FLASH.BIN` from the TADA drive and copy `tada68_default.bin` that was generated at the root of the qmk directory into the TADA drive. + +5) Hit ESC on the keyboard. The lights will stop flashing and your firmware is loaded! \ No newline at end of file diff --git a/keyboards/tv44/keymaps/default/keymap.c b/keyboards/tv44/keymaps/default/keymap.c index f3f989f2..b9fe33a7 100644 --- a/keyboards/tv44/keymaps/default/keymap.c +++ b/keyboards/tv44/keymaps/default/keymap.c @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QW] = { /* Qwerty */ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC }, {MO(_L1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, MO(_L1) }, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_F, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(_L2) }, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(_L2) }, {KC_LCTL, MO(_L2), KC_LGUI, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_RALT, KC_ESC, XXXXXXX, TG(_L3) } }, [_DV] = { /* Dvorak */ diff --git a/keyboards/tv44/keymaps/smt/Makefile b/keyboards/tv44/keymaps/smt/Makefile new file mode 100644 index 00000000..f4671a9d --- /dev/null +++ b/keyboards/tv44/keymaps/smt/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/tv44/keymaps/smt/config.h b/keyboards/tv44/keymaps/smt/config.h new file mode 100644 index 00000000..f8f0a507 --- /dev/null +++ b/keyboards/tv44/keymaps/smt/config.h @@ -0,0 +1,36 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/** + *TV44 keymap definition macro + */ +#define KEYMAP_TV44( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, \ + K13, K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, \ + K25, K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, \ + K37, K38, K39, K40, K41, K42, K43, K44 \ +) { \ + { K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, }, \ + { K13, K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, }, \ + { K25, K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, }, \ + { K37, K38, K39, K40, KC_NO, KC_NO, KC_NO, K41, K42, K43, KC_NO, K44 } \ +} + +/** + *TV45 keymap definition macro (arrows layout) + */ +#define KEYMAP_TV45( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, \ + K13, K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, \ + K25, K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, \ + K37, K38, K39, K40, K41, K42, K43, K44, K45 \ +) { \ + { K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, }, \ + { K13, K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, }, \ + { K25, K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, }, \ + { K37, K38, K39, K40, KC_NO, KC_NO, KC_NO, K41, K42, K43, K44, K45 } \ +} + +#endif diff --git a/keyboards/tv44/keymaps/smt/keyboard-layout-minivan.png b/keyboards/tv44/keymaps/smt/keyboard-layout-minivan.png new file mode 100644 index 00000000..2dca67fb Binary files /dev/null and b/keyboards/tv44/keymaps/smt/keyboard-layout-minivan.png differ diff --git a/keyboards/tv44/keymaps/smt/keymap.c b/keyboards/tv44/keymaps/smt/keymap.c new file mode 100644 index 00000000..532e74de --- /dev/null +++ b/keyboards/tv44/keymaps/smt/keymap.c @@ -0,0 +1,232 @@ +#include "tv44.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +// Keycodes +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + BACKLIT +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Custom macros +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) +#define ALT_GRV ALT_T(KC_GRV) // Tap for Backtick, hold for Alt (Ctrl+Alt+Shift) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * + * ,---------+------+------+------+------+------+------+------+------+------+------+---------. + * |Hyper/Tab| Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |---------`------`------`------`------`------`------`------`------`------`------`---------| + * | Ctrl/Esc | A | S | D | F | G | H | J | K | L | ; | ' | + * |----------`------`------`------`------`------`------`------`------`------`------`--------| + * | Shift | Z | X | C | V | B | N | M | , | . | / |Sft/Ent| + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-------| + * | Alt/` | GUI | Lower | Space | Space | Raise | GUI | Alt | Ctrl | + * `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' + */ +[_QWERTY] = KEYMAP_TV45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/ + HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC , +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/ + CTL_ESC , KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + ALT_GRV , KC_LGUI , LOWER , KC_SPC , KC_SPC , RAISE , KC_RGUI, KC_RALT, KC_RCTL ), +/*`---------+---------------+---------+-------^^^------+-------^^^-------+----------+--------+--------+--------------'*/ + +/* Colemak + * ,---------+------+------+------+------+------+------+------+------+------+------+---------. + * |Hyper/Tab| Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |---------`------`------`------`------`------`------`------`------`------`------`---------| + * | Ctrl/Esc | A | R | S | T | D | H | N | E | I | O | ' | + * |----------`------`------`------`------`------`------`------`------`------`------`--------| + * | Shift | Z | X | C | V | B | K | M | , | . | / |Sft/Ent| + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-------| + * | Alt/` | GUI | Lower | Space | Space | Raise | GUI | Alt | Ctrl | + * `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' + */ +[_COLEMAK] = KEYMAP_TV45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/ + HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC , +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/ + CTL_ESC , KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + ALT_GRV , KC_LGUI , LOWER , KC_SPC , KC_SPC , RAISE , KC_RGUI, KC_RALT, KC_RCTL ), +/*`---------+---------------+---------+-------^^^------+-------^^^-------+----------+--------+--------+--------------'*/ + +/* Dvorak + * ,---------+------+------+------+------+------+------+------+------+------+------+---------. + * |Hyper/Tab| ' | , | . | P | Y | F | G | C | R | L | Bksp | + * |---------`------`------`------`------`------`------`------`------`------`------`---------| + * | Ctrl/Esc | A | O | E | U | I | D | H | T | N | S | - | + * |----------`------`------`------`------`------`------`------`------`------`------`--------| + * | Shift | ; | Q | J | K | X | B | M | W | V | Z |Sft/Ent| + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-------| + * | Alt/` | GUI | Lower | Space | Space | Raise | GUI | Alt | Ctrl | + * `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' + */ +[_DVORAK] = KEYMAP_TV45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/ + HPR_TAB,KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC , +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/ + CTL_ESC , KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + KC_LSFT , KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + ALT_GRV , KC_LGUI , LOWER , KC_SPC , KC_SPC , RAISE , KC_RGUI, KC_RALT, KC_RCTL ), +/*`---------+---------------+---------+-------^^^------+-------^^^-------+----------+--------+--------+--------------'*/ + +/* Lower + * ,---------+------+------+------+------+------+------+------+------+------+------+---------. + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |---------`------`------`------`------`------`------`------`------`------`------`---------| + * | $ | 4 | 5 | 6 | . | + | * | 4 | 5 | 6 | . | PageUp | + * |----------`------`------`------`------`------`------`------`------`------`------`--------| + * | = | 7 | 8 | 9 | 0 | - | / | 1 | 2 | 3 | Up |PageDn | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-------| + * | Brite | | | Home | End | | Left | Down | Right | + * `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' + */ +[_LOWER] = KEYMAP_TV45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/ +ALL_T(KC_0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL , +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/ +CTL_T(KC_DLR), KC_4, KC_5, KC_6, KC_DOT, KC_PLUS, KC_ASTR, KC_4, KC_5, KC_6, KC_DOT, KC_PGUP , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ +SFT_T(KC_EQL), KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_SLSH, KC_1, KC_2, KC_3, KC_UP, SFT_T(KC_PGDN), +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ +ALT_T(BACKLIT), _______ , _______ , KC_HOME , KC_END , _______ , KC_LEFT, KC_DOWN, KC_RGHT ), +/*`---------+---------------+---------+-------^^^------+-------^^^-------+----------+--------+--------+--------------'*/ + +/* Raise + * ,---------+------+------+------+------+------+------+------+------+------+------+---------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |---------`------`------`------`------`------`------`------`------`------`------`---------| + * | F1 | F2 | F3 | F4 | F5 | F6 | _ | ? | + | { | } | | + * |----------`------`------`------`------`------`------`------`------`------`------`--------| + * | F7 | F8 | F9 | F10 | F11 | F12 | - | / | = | [ | ] | | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-------| + * | Brite | | | Play | Next | | Mute | Vol- | Vol+ | + * `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' + */ +[_RAISE] = KEYMAP_TV45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/ +ALL_T(KC_TILD),KC_EXLM,KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL , +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/ +CTL_T(KC_F1), KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + SFT_T(KC_F7), KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, SFT_T(KC_BSLS), +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ +ALT_T(BACKLIT), _______ , _______ , KC_MPLY , KC_MNXT , _______ , KC_MUTE, KC_VOLD, KC_VOLU ), +/*`---------+---------------+---------+-------^^^------+-------^^^-------+----------+--------+--------+--------------'*/ + +/* Adjust (Lower + Raise) + * ,---------+------+------+------+------+------+------+------+------+------+------+---------. + * | | Reset| | | | | | | | | | Reset | + * |---------`------`------`------`------`------`------`------`------`------`------`---------| + * | | | | | |AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |----------`------`------`------`------`------`------`------`------`------`------`--------| + * | | | | | | | | | | | | | + * |-----------`------`------`------`------`-----'-------`------`------`------`------`-------| + * | | | | | | | | | | + * `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' + */ +[_ADJUST] = KEYMAP_TV45( +/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/ + _______, RESET , _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET , +/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/ + _______ ,_______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______ , +/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ + _______ ,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , +/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ + _______ , _______ , _______ , _______ , _______ , _______ , _______, _______, _______ ), +/*`---------+---------------+---------+-------^^^------+-------^^^-------+----------+--------+--------+--------------'*/ +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +} diff --git a/keyboards/tv44/keymaps/smt/readme.md b/keyboards/tv44/keymaps/smt/readme.md new file mode 100644 index 00000000..647eb897 --- /dev/null +++ b/keyboards/tv44/keymaps/smt/readme.md @@ -0,0 +1,126 @@ +# smt's TV44 keymap + +This keymap is based on a combination of my Planck keymap and [jeebak's TV44 layout](https://github.com/qmk/qmk_firmware/tree/master/keyboards/tv44/keymaps/jeebak). I removed the macros and TouchCursor/MouseCursor layers, because I'm just not ready for that level of mind-mapping. + +I had been using something close to the default Minivan layout, but after spending a bit of time with the Planck and Preonic, I decided it would be better for me to try to standardize to some degree, where possible. + +Also, it's worth noting that my Minivan is one with the "arrows" layout, which has a 45th key, so I had to define a new KEYMAP_TV45 macro in config.h. In spite of this, the 45-key Minivan is still technically considered a "TV44" as far as I know. + +![smt's TV44 keymap](keyboard-layout-minivan.png) + +## Notable features (most of which can be found in my or jeebak's respective keymap file): + +1. **Shift/Enter** + + I use both the left and right shift keys when I type. When I want to modify a key with shift, I hold shift with the hand opposite the one typing the key. In the default keymap, Enter is where shift would be on a standard keyboard layout. Oh, muscle memory. + + Thankfully, QMK supports [mod-tap](https://github.com/jackhumbert/qmk_firmware/wiki#fun-with-modifier-keys) keys, and this allows me to set the Enter key to send a modifier (MOD_LSFT) when held, and KC_ENT when tapped. Awesome! + +2. **Hyper/Tab** + + This key modifies with "Hyper" (see [Brett Terpstra's post](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/) on this) when held, and outputs the code for Tab when tapped. On the Mac, I use KeyboardMaestro to remap my hyper-keys to do a lot of crazy things. + +3. **Ctrl/Escape** + + I set up another mod-tap, this time for the Escape key that would act as a Control modifier when held. + +4. **Alt/Backtick** + + I don't currently have LEDs on most of my keyboards, and I certainly don't want LED controls on the base layer of a 40%. + + So, why use backtick in the lower left corner? I use it as my tmux prefix key, so I need to type it more frequently than most people. Putting it on the base layer works well for my use case, and it's consistent with where I place it in my Planck and Preonic keymaps. + + I also like Alt in that position, so it works well as yet another mod-tap key. + + +## Layers + +### Qwerty + +``` +,---------+------+------+------+------+------+------+------+------+------+------+---------. +|Hyper/Tab| Q | W | E | R | T | Y | U | I | O | P | Bksp | +|---------`------`------`------`------`------`------`------`------`------`------`---------| +| Ctrl/Esc | A | S | D | F | G | H | J | K | L | ; | ' | +|----------`------`------`------`------`------`------`------`------`------`------`--------| +| Shift | Z | X | C | V | B | N | M | , | . | / |Sft/Ent| +|-----------`------`------`------`------`-----'-------`------`------`------`------`-------| +| Alt/` | GUI | Lower | Space | Space | Raise | GUI | Alt | Ctrl | + `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' +``` + +### Colemak + +``` +,---------+------+------+------+------+------+------+------+------+------+------+---------. +|Hyper/Tab| Q | W | F | P | G | J | L | U | Y | ; | Bksp | +|---------`------`------`------`------`------`------`------`------`------`------`---------| +| Ctrl/Esc | A | R | S | T | D | H | N | E | I | O | ' | +|----------`------`------`------`------`------`------`------`------`------`------`--------| +| Shift | Z | X | C | V | B | K | M | , | . | / |Sft/Ent| +|-----------`------`------`------`------`-----'-------`------`------`------`------`-------| +| Alt/` | GUI | Lower | Space | Space | Raise | GUI | Alt | Ctrl | + `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' +``` + +### Dvorak + +``` +,---------+------+------+------+------+------+------+------+------+------+------+---------. +|Hyper/Tab| ' | , | . | P | Y | F | G | C | R | L | Bksp | +|---------`------`------`------`------`------`------`------`------`------`------`---------| +| Ctrl/Esc | A | O | E | U | I | D | H | T | N | S | - | +|----------`------`------`------`------`------`------`------`------`------`------`--------| +| Shift | ; | Q | J | K | X | B | M | W | V | Z |Sft/Ent| +|-----------`------`------`------`------`-----'-------`------`------`------`------`-------| +| Alt/` | GUI | Lower | Space | Space | Raise | GUI | Alt | Ctrl | + `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' +``` + +### Lower + +This is where I put the number row, two numpad clusters, common arithmetic operators, and cursorkeys: Arrow cluster, Home/End, Page Up/Page Down. `0` and `$` are also placed on the left side for convenient access to beginning-of-line and end-of-line Vim commands. BRITE has been moved here from the base layer. + +``` +,---------+------+------+------+------+------+------+------+------+------+------+---------. +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | +|---------`------`------`------`------`------`------`------`------`------`------`---------| +| $ | 4 | 5 | 6 | . | + | * | 4 | 5 | 6 | . | PageUp | +|----------`------`------`------`------`------`------`------`------`------`------`--------| +| = | 7 | 8 | 9 | 0 | - | / | 1 | 2 | 3 | Up |PageDn | +|-----------`------`------`------`------`-----'-------`------`------`------`------`-------| +| Brite | | | Home | End | | Left | Down | Right | + `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' +``` + +### Raise + +As a developer, it makes the most sense for me to group all the commonly-used symbols that don't fit on the main layer. In particular, having the dual-column of parens-braces-brackets helps me keep them straight. I've dropped basic media controls onto this layer as well. + +``` +,---------+------+------+------+------+------+------+------+------+------+------+---------. +| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | +|---------`------`------`------`------`------`------`------`------`------`------`---------| +| F1 | F2 | F3 | F4 | F5 | F6 | _ | ? | + | { | } | | | +|----------`------`------`------`------`------`------`------`------`------`------`--------| +| F7 | F8 | F9 | F10 | F11 | F12 | - | / | = | [ | ] | \ | +|-----------`------`------`------`------`-----'-------`------`------`------`------`-------| +| Brite | | | Play | Next | | Mute | Vol- | Vol+ | + `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' +``` + +### Adjust (Lower + Raise) + +Utility layer. There isn't much here; it's mainly for swapping the default keymap between Qwerty and Dvorak, or putting the keyboard into flash mode via the Reset key. + +``` +,---------+------+------+------+------+------+------+------+------+------+------+---------. +| | Reset| | | | | | | | | | Del | +|---------`------`------`------`------`------`------`------`------`------`------`---------| +| | | | | |AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | +|----------`------`------`------`------`------`------`------`------`------`------`--------| +| | | | | | | | | | | | | +|-----------`------`------`------`------`-----'-------`------`------`------`------`-------| +| | | | | | | | | | + `-------+---------+--------+-----^^^------+-----^^^------+---------+------+------+-------' +``` diff --git a/keyboards/vision_division/config.h b/keyboards/vision_division/config.h index 1f8466a5..5798d91a 100644 --- a/keyboards/vision_division/config.h +++ b/keyboards/vision_division/config.h @@ -31,7 +31,9 @@ along with this program. If not, see . #define BACKLIGHT_LEVELS 3 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ -#define DEBOUNCING_DELAY 5 +#define DEBOUNCING_DELAY 0 + +#define MATRIX_MASKED /* define if matrix has ghost (lacks anti-ghosting diodes) */ //#define MATRIX_HAS_GHOST diff --git a/keyboards/vision_division/keymaps/default/Makefile b/keyboards/vision_division/keymaps/default/Makefile index 5a930e85..28060947 100644 --- a/keyboards/vision_division/keymaps/default/Makefile +++ b/keyboards/vision_division/keymaps/default/Makefile @@ -2,7 +2,7 @@ # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) @@ -18,4 +18,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/vision_division/keymaps/default/keymap.c b/keyboards/vision_division/keymaps/default/keymap.c index 64118abd..3282761c 100644 --- a/keyboards/vision_division/keymaps/default/keymap.c +++ b/keyboards/vision_division/keymaps/default/keymap.c @@ -121,6 +121,7 @@ enum keyboard_macros { #define M_CP_CT M(MACRO_COPY_CUT) +#define M_COPY KC_FN1 #define SC_UNDO LCTL(KC_Z) #define SC_REDO LCTL(KC_Y) @@ -141,35 +142,46 @@ enum keyboard_macros { #define ________________ _______, _______ #define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX +const matrix_row_t matrix_mask[MATRIX_ROWS] = +{ +// 1098765432109876543210987654321 + 0b0000000001111111101111011111111, + 0b0000000001111111111111111111111, + 0b0000000001111111111111111111111, + 0b0000000001111111111111111111111, + 0b0000000001010111111111111111111, + 0b0000000001111101111111101011111, +}; + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* LAYER = LAYER_QWERTY .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. - | FN | PRINT | SCR LK | PAUSE | | F1 | F2 | F3 | F4 | XXXXXX | F5 | F6 | F7 | F8 | XXXXXX | F9 | F10 | F11 | F12 | | VOL DN | MUTE | VOL UP | BACKLT | + | VOL DN | MUTE | VOL UP | BACKLT | | F1 | F2 | F3 | F4 | XXXXXX | F5 | F6 | F7 | F8 | XXXXXX | F9 | F10 | F11 | F12 | | PRINT | SCR LK | PAUSE | FN | '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. - | M1 | INS | HOME | PG UP | | ESC | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | = | BACKSP | | NUM LK | KP / | KP * | KP - | + | NUM LK | KP / | KP * | KP - | | ESC | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | = | BACKSP | | INS | HOME | PG UP | M1 | |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------|--------|--------+--------| - | M2 | DEL | END | PG DN | | TAB | TAB | Q | W | E | R | T | Y | U | I | O | P | - | \ | | KP 7 | KP 8 | KP 9 | KP + | + | KP 7 | KP 8 | KP 9 | KP + | | TAB | TAB | Q | W | E | R | T | Y | U | I | O | P | - | \ | | DEL | END | PG DN | M2 | |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| o |--------|--------|--------+--------| - | M3 | UL | UP | UR | | CAP LK | BACKSP | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | o | KP 4 | KP 5 | KP 6 | KP + | + | KP 4 | KP 5 | KP 6 | KP + | | CAP LK | BACKSP | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | o | CP/CT | UNDO | PASTE | M3 | |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| o |--------|--------|--------+--------| - | M4 | LEFT | CP/CT | RIGHT | | LSHIFT | LSHIFT | Z | X | C | V | B | N | M | , | . | / | RSHIFT | RSHIFT | | KP 1 | KP 2 | KP 3 | KP Ent | + | KP 1 | KP 2 | KP 3 | KP Ent | | LSHIFT | LSHIFT | Z | X | C | V | B | N | M | , | . | / | RSHIFT | RSHIFT | | XXXXXX | UP | XXXXXX | M4 | |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------|--------|--------+--------| - | M5 | DL | DOWN | DR | | LCTRL | XXXXXX | XXXXXX | LWIN | LALT | LOWER | SPACE . SPACE | UPPER | OSHIFT | RALT | APP | XXXXXX | RCTRL | | KP 0 | KP , | KP . | KP Ent | + | KP 0 | KP , | KP . | KP Ent | | LCTRL | XXXXXX | LWIN | XXXXXX | LALT | UPPER | SPACE . SPACE | LOWER | OSHIFT | RALT | APP | XXXXXX | RCTRL | | LEFT | DOWN | RIGHT | M5 | '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' */ KEYMAP(LAYER_QWERTY, \ - M_HELP , KC_PSCR, KC_SLCK, KC_PAUS, KC_F1 , KC_F2 , KC_F3 , KC_F4 , XXXXXXX, KC_F5 , KC_F6 , KC_F7 , KC_F8 , XXXXXXX, KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_VOLD, KC_MUTE, KC_VOLU, M_BACKL, \ - M_M1 , KC_INS , KC_HOME, KC_PGUP, KC_ESC , KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL , KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ - M_M2 , KC_DEL , KC_END , KC_PGDN, KC_TAB , KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_MINS, KC_BSLS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, \ - M_M3 , M_UL , KC_UP , M_UR , KC_CAPS, KC_BSPC, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_ENT , KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, \ - M_M4 , KC_LEFT, M_CP_CT, KC_RGHT, KC_LSFT, KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT, KC_RSFT, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, \ - M_M5 , M_DL , KC_DOWN, M_DR , KC_LCTL, XXXXXXX, XXXXXXX, KC_LGUI, KC_LALT, M_LOWER, KC_SPC , KC_SPC , M_UPPER, OS_SHFT, KC_RALT, KC_APP , XXXXXXX, KC_RCTL, KC_KP_0, KC_PCMM, KC_PDOT, KC_PENT \ + KC_VOLD, KC_MUTE, KC_VOLU, M_BACKL, KC_F1 , KC_F2 , KC_F3 , KC_F4 , XXXXXXX, KC_F5 , KC_F6 , KC_F7 , KC_F8 , XXXXXXX, KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_PSCR, KC_SLCK, KC_PAUS, M_HELP , \ + KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_ESC , KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL , KC_BSPC, KC_INS , KC_HOME, KC_PGUP, M_M1 , \ + KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, KC_TAB , KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_MINS, KC_BSLS, KC_DEL , KC_END , KC_PGDN, M_M2 , \ + KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_CAPS, KC_BSPC, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_ENT , M_CP_CT, SC_UNDO, SC_PSTE, M_M3 , \ + KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, KC_LSFT, KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT, KC_RSFT, XXXXXXX, KC_UP , XXXXXXX, M_M4 , \ + KC_KP_0, KC_PCMM, KC_PDOT, KC_PENT, KC_LCTL, XXXXXXX, KC_LGUI, XXXXXXX, KC_LALT, M_UPPER, KC_SPC , KC_SPC , M_LOWER, OS_SHFT, KC_RALT, KC_APP , XXXXXXX, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, M_M5 \ ), /* LAYER = LAYER_LOWER .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. - | ______ | ______ | ______ | ______ | | F13 | F14 | F15 | F16 | XXXXXX | F17 | F18 | F19 | F20 | XXXXXX | F21 | F22 | F23 | F24 | | ______ | MUTE A | ______ | ______ | + | ______ | MUTE A | ______ | ______ | | F13 | F14 | F15 | F16 | XXXXXX | F17 | F18 | F19 | F20 | XXXXXX | F21 | F22 | F23 | F24 | | ______ | ______ | ______ | ______ | '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | @@ -180,20 +192,20 @@ KEYMAP(LAYER_QWERTY, \ |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| o |--------|--------|--------+--------| | ______ | ______ | ______ | ______ | | ______ | ______ | | | & | ! | ~ | ; | : | = | < | > | ? | ______ | ______ | | ______ | ______ | ______ | ______ | |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------|--------|--------+--------| - | ______ | ______ | ______ | ______ | | ______ | XXXXXX | XXXXXX | ______ | ______ | ______ | ______ . ______ | LOWER | ______ | ______ | ______ | XXXXXX | ______ | | ______ | ______ | ______ | ______ | + | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | ______ | ______ | ______ . ______ | LOWER | ______ | ______ | ______ | XXXXXX | ______ | | ______ | ______ | ______ | ______ | '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' */ KEYMAP(LAYER_LOWER, \ - _______, _______, _______, _______, KC_F13 , KC_F14 , KC_F15 , KC_F16 , XXXXXXX, KC_F17 , KC_F18 , KC_F19 , KC_F20 , XXXXXXX, KC_F21 , KC_F22 , KC_F23 , KC_F24 , _______, M_MUTEA, _______, _______, \ + _______, M_MUTEA, _______, _______, KC_F13 , KC_F14 , KC_F15 , KC_F16 , XXXXXXX, KC_F17 , KC_F18 , KC_F19 , KC_F20 , XXXXXXX, KC_F21 , KC_F22 , KC_F23 , KC_F24 , _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, KC_DLR , KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT , _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, KC_CIRC, KC_ASTR, KC_PLUS, KC_MINS, KC_SLSH, KC_BSLS, KC_UNDS, KC_QUOT, KC_DQT , KC_GRV , _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SCLN, KC_COLN, KC_EQL , KC_LT , KC_GT , KC_QUES, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, M_LOWER, _______, _______, _______, XXXXXXX, _______, _______, _______, _______, _______ \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, M_LOWER, _______, _______, _______, XXXXXXX, _______, _______, _______, _______, _______ \ ), /* LAYER = LAYER_UPPER .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. - | ______ | ______ | ______ | ______ | | F13 | F14 | F15 | F16 | XXXXXX | F17 | F18 | F19 | F20 | XXXXXX | F21 | F22 | F23 | F24 | | ______ | MUTE A | ______ | ______ | + | ______ | MUTE A | ______ | ______ | | F13 | F14 | F15 | F16 | XXXXXX | F17 | F18 | F19 | F20 | XXXXXX | F21 | F22 | F23 | F24 | | ______ | ______ | ______ | ______ | '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | @@ -204,44 +216,44 @@ KEYMAP(LAYER_LOWER, \ |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| o |--------|--------|--------+--------| | ______ | ______ | ______ | ______ | | ______ | ______ | F9 | F10 | F11 | F12 | SCR LK | KP 0 | KP 1 | KP 2 | KP 3 | KP Ent | ______ | ______ | | ______ | ______ | ______ | ______ | |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------|--------|--------+--------| - | ______ | ______ | ______ | ______ | | ______ | XXXXXX | XXXXXX | ______ | ______ | UPPER | KP 0 . KP 0 | ______ | RALT | KP . | KP Ent | XXXXXX | ______ | | ______ | ______ | ______ | ______ | + | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | ______ | UPPER | KP 0 . KP 0 | ______ | RALT | KP . | KP Ent | XXXXXX | ______ | | ______ | ______ | ______ | ______ | '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' */ KEYMAP(LAYER_UPPER, \ - _______, _______, _______, _______, KC_F13 , KC_F14 , KC_F15 , KC_F16 , XXXXXXX, KC_F17 , KC_F18 , KC_F19 , KC_F20 , XXXXXXX, KC_F21 , KC_F22 , KC_F23 , KC_F24 , _______, M_MUTEA, _______, _______, \ + _______, M_MUTEA, _______, _______, KC_F13 , KC_F14 , KC_F15 , KC_F16 , XXXXXXX, KC_F17 , KC_F18 , KC_F19 , KC_F20 , XXXXXXX, KC_F21 , KC_F22 , KC_F23 , KC_F24 , _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_NLCK, KC_PSLS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_CAPS, KC_PAST, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_SLCK, KC_KP_0, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, M_UPPER, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, XXXXXXX, _______, _______, _______, _______, _______ \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, M_UPPER, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, XXXXXXX, _______, _______, _______, _______, _______ \ ), /* LAYER = LAYER_MOUSE .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. - | MS BT1 | MS AC0 | MS WHU | MS AC2 | | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | + | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | | MS AC0 | MS WHU | MS AC2 | MS BT1 | |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------|--------|--------+--------| - | MS BT2 | MS WHL | MS WHD | MS WHU | | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | + | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | | MS WHL | MS WHD | MS WHU | MS BT2 | |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| o |--------|--------|--------+--------| - | MS BT3 | MS UL | MS U | MS UR | | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | o | ______ | ______ | ______ | ______ | + | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | o | MS BT1 | MS BT2 | MS BT3 | MS BT3 | |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| o |--------|--------|--------+--------| - | MS BT4 | MS L | MS BT1 | MS R | | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | + | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | | XXXXXX | MS U | XXXXXX | MS BT4 | |--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------|--------|--------+--------| - | MS BT5 | MS DL | MS D | MS DR | | ______ | ______ | ______ | ______ | ______ | ______ | ______ . ______ | ______ | ______ | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | + | ______ | ______ | ______ | ______ | | ______ | ______ | ______ | ______ | ______ | ______ | ______ . ______ | ______ | ______ | ______ | ______ | ______ | ______ | | MS L | MS D | MS R | MS BT5 | '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' */ KEYMAP(LAYER_MOUSE, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - KC_BTN1, KC_ACL0, KC_WH_U, KC_ACL2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - KC_BTN2, KC_WH_L, KC_WH_D, KC_WH_U, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - KC_BTN3, M_MS_UL, KC_MS_U, M_MS_UR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - KC_BTN4, KC_MS_L, KC_BTN1, KC_MS_R, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - KC_BTN5, M_MS_DL, KC_MS_D, M_MS_DR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ACL0, KC_WH_U, KC_ACL2, KC_BTN1, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_U, KC_BTN2, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN3, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_MS_U, XXXXXXX, KC_BTN4, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5 \ ), /* LAYER = LAYER_ADJUST .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. - | XXXXXX | XXXXXX | XXXXXX | XXXXXX | | HELP 1 | HELP 2 | HELP 3 | HELP 4 | XXXXXX | HELP 5 | HELP 6 | HELP 7 | HELP 8 | XXXXXX | HELP 9 | HELP 0 | XXXXXX | XXXXXX | | VOICE- | AUDIO | VOICE+ | MUSIC | + | VOICE- | AUDIO | VOICE+ | MUSIC | | HELP 1 | HELP 2 | HELP 3 | HELP 4 | XXXXXX | HELP 5 | HELP 6 | HELP 7 | HELP 8 | XXXXXX | HELP 9 | HELP 0 | XXXXXX | XXXXXX | | XXXXXX | XXXXXX | XXXXXX | XXXXXX | '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' .-----------------------------------. .-----------------------------------------------------------------------------------------------------------------------------. .-----------------------------------. | XXXXXX | XXXXXX | XXXXXX | XXXXXX | | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | | XXXXXX | XXXXXX | XXXXXX | XXXXXX | @@ -256,14 +268,13 @@ KEYMAP(LAYER_MOUSE, \ '-----------------------------------' '-----------------------------------------------------------------------------------------------------------------------------' '-----------------------------------' */ KEYMAP(LAYER_ADJUST, \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_HELP1, M_HELP2, M_HELP3, M_HELP4, XXXXXXX, M_HELP5, M_HELP6, M_HELP7, M_HELP8, XXXXXXX, M_HELP9, M_HELP0, XXXXXXX, XXXXXXX, MUV_DE , AU_TOG , MUV_IN , MU_TOG , \ + MUV_DE , AU_TOG , MUV_IN , MU_TOG , M_HELP1, M_HELP2, M_HELP3, M_HELP4, XXXXXXX, M_HELP5, M_HELP6, M_HELP7, M_HELP8, XXXXXXX, M_HELP9, M_HELP0, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , XXXXXXX, M_MOUSE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_UPPER, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \ ), - }; #ifdef AUDIO_ENABLE @@ -296,6 +307,7 @@ void persistant_default_layer_set(uint16_t default_layer) const uint16_t PROGMEM fn_actions[] = { [0] = ACTION_MODS_ONESHOT(MOD_LSFT), + [1] = ACTION_MACRO_TAP(MACRO_COPY_CUT), }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) @@ -305,68 +317,84 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) switch(id) { - case MACRO_HELP_1: - if (record->event.pressed) - { - uprint("H1"); - } - break; - - case MACRO_HELP_2: - if (record->event.pressed) - { - uprint("H2"); - } - break; - - case MACRO_HELP_3: - if (record->event.pressed) - { - uprint("H3"); - } - break; - - case MACRO_HELP_4: - if (record->event.pressed) - { - uprint("H4"); - } - break; - - case MACRO_HELP_5: - if (record->event.pressed) - { - uprint("H5"); - } - break; - - case MACRO_HELP_6: - if (record->event.pressed) - { - uprint("H6"); - } - break; - - case MACRO_HELP_7: - if (record->event.pressed) - { - uprint("H7"); - } - break; - - case MACRO_HELP_8: - if (record->event.pressed) - { - uprint("H8"); - } - break; - - case MACRO_HELP_9: - if (record->event.pressed) - { - uprint("H9"); - } - break; + case MACRO_COPY_CUT: + if (record->event.pressed) { + register_code(KC_LCTL); + if (record->tap.count == 1) { + register_code(KC_C); + unregister_code(KC_C); + } + else if (record->tap.count == 2) { + register_code(KC_X); + unregister_code(KC_X); + } + unregister_code(KC_LCTL); + } + break; + + + // case MACRO_HELP_1: + // if (record->event.pressed) + // { + // uprint("H1"); + // } + // break; + + // case MACRO_HELP_2: + // if (record->event.pressed) + // { + // uprint("H2"); + // } + // break; + + // case MACRO_HELP_3: + // if (record->event.pressed) + // { + // uprint("H3"); + // } + // break; + + // case MACRO_HELP_4: + // if (record->event.pressed) + // { + // uprint("H4"); + // } + // break; + + // case MACRO_HELP_5: + // if (record->event.pressed) + // { + // uprint("H5"); + // } + // break; + + // case MACRO_HELP_6: + // if (record->event.pressed) + // { + // uprint("H6"); + // } + // break; + + // case MACRO_HELP_7: + // if (record->event.pressed) + // { + // uprint("H7"); + // } + // break; + + // case MACRO_HELP_8: + // if (record->event.pressed) + // { + // uprint("H8"); + // } + // break; + + // case MACRO_HELP_9: + // if (record->event.pressed) + // { + // uprint("H9"); + // } + // break; case MACRO_BREATH_TOGGLE: if (record->event.pressed) @@ -566,12 +594,12 @@ void led_set_user(uint8_t usb_led) void startup_user() { _delay_ms(10); // gets rid of tick - PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO); + // PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO); } void shutdown_user() { - PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO); + // PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO); _delay_ms(2000); stop_all_notes(); } diff --git a/keyboards/whitefox/Makefile b/keyboards/whitefox/Makefile new file mode 100644 index 00000000..4e2a6f00 --- /dev/null +++ b/keyboards/whitefox/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif \ No newline at end of file diff --git a/keyboards/whitefox/bootloader_defs.h b/keyboards/whitefox/bootloader_defs.h new file mode 100644 index 00000000..c67153be --- /dev/null +++ b/keyboards/whitefox/bootloader_defs.h @@ -0,0 +1 @@ +#define KIIBOHD_BOOTLOADER diff --git a/keyboards/whitefox/chconf.h b/keyboards/whitefox/chconf.h new file mode 100644 index 00000000..d9114ec8 --- /dev/null +++ b/keyboards/whitefox/chconf.h @@ -0,0 +1,524 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 32 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 100000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 0 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 20 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/* Use __WFI in the idle thread for waiting. Does lower the power + * consumption. */ +#define CORTEX_ENABLE_WFI_IDLE TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM FALSE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY FALSE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS TRUE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK FALSE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboards/whitefox/config.h b/keyboards/whitefox/config.h new file mode 100644 index 00000000..b7116341 --- /dev/null +++ b/keyboards/whitefox/config.h @@ -0,0 +1,78 @@ +/* +Copyright 2015 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#define PREVENT_STUCK_MODIFIERS + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0F0F +#define DEVICE_VER 0x0001 +/* in python2: list(u"whatever".encode('utf-16-le')) */ +/* at most 32 characters or the ugly hack in usb_main.c borks */ +#define MANUFACTURER "Input Club" +#define USBSTR_MANUFACTURER 'I', '\x00', 'n', '\x00', 'p', '\x00', 'u', '\x00', 't', '\x00', ' ', '\x00', 'C', '\x00', 'l', '\x00', 'u', '\x00', 'b', '\x00' +#define PRODUCT "WhiteFox/QMK" +#define USBSTR_PRODUCT 'W', '\x00', 'h', '\x00', 'i', '\x00', 't', '\x00', 'e', '\x00', 'F', '\x00', 'o', '\x00', 'x', '\x00', ' ', '\x00' + +/* key matrix size */ +#define MATRIX_ROWS 9 +#define MATRIX_COLS 8 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 6 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +//#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +//#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* Keymap for Infinity prototype */ +//#define INFINITY_PROTOTYPE + +/* Keymap for Infinity 1.1a (first revision with LED support) */ +//#define INFINITY_LED + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/whitefox/halconf.h b/keyboards/whitefox/halconf.h new file mode 100644 index 00000000..46b37a4f --- /dev/null +++ b/keyboards/whitefox/halconf.h @@ -0,0 +1,353 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB TRUE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 256 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* _HALCONF_H_ */ + +/** @} */ diff --git a/keyboards/whitefox/keymaps/default/keymap.c b/keyboards/whitefox/keymaps/default/keymap.c new file mode 100644 index 00000000..714f9065 --- /dev/null +++ b/keyboards/whitefox/keymaps/default/keymap.c @@ -0,0 +1,51 @@ +/* +Copyright 2015 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include "whitefox.h" + +const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Layer 0: Default Layer + * ,---------------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|Ins| + * |---------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs|Del| + * |---------------------------------------------------------------| + * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Enter |PgU| + * |---------------------------------------------------------------| + * |Shif| | Z| X| C| V| B| N| M| ,| .| /|Shift |Up |PgD| + * |---------------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Fn0 |Alt |Gui | |Lef|Dow|Rig| + * `---------------------------------------------------------------' + */ + [0] = KEYMAP( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_GRV, KC_INS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, KC_DEL, \ + KC_CAPS,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_NUHS,KC_ENT, KC_PGUP,\ + KC_LSFT,KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT, KC_UP, KC_PGDN,\ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_FN0, KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT \ + ), + [1] = KEYMAP( \ + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,KC_TRNS,KC_MUTE,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS, KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_VOLU,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_PGUP,KC_VOLD,\ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_HOME,KC_PGDN,KC_END \ + ), +}; + +const uint16_t fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(1), +}; diff --git a/keyboards/whitefox/keymaps/matt3o/keymap.c b/keyboards/whitefox/keymaps/matt3o/keymap.c new file mode 100644 index 00000000..4455886a --- /dev/null +++ b/keyboards/whitefox/keymaps/matt3o/keymap.c @@ -0,0 +1,92 @@ +/* +Copyright 2015 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include "whitefox.h" + +const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Layer 0: Default Layer + * ,---------------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|Ins| + * |---------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs|Del| + * |---------------------------------------------------------------| + * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Enter |PgU| + * |---------------------------------------------------------------| + * |Shif| | Z| X| C| V| B| N| M| ,| .| /|Shift |Up |PgD| + * |---------------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Fn0 |Alt |Gui | |Lef|Dow|Rig| + * `---------------------------------------------------------------' + */ + [0] = KEYMAP( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_GRV, KC_MUTE,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, KC_DEL, \ + KC_FN0, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_NUHS,KC_ENT, KC_PGUP,\ + KC_LSFT,KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT, KC_UP, KC_PGDN,\ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_FN1, KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT \ + ), + [1] = KEYMAP( \ + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_DEL , KC_INS ,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_VOLU,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_PGUP,KC_VOLD,\ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_HOME,KC_PGDN,KC_END \ + ), + [2] = KEYMAP( \ + KC_SLEP,KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_FN2, \ + KC_TRNS,KC_TRNS,KC_FN5 ,KC_FN6 ,KC_TRNS,KC_FN7 ,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_TRNS,KC_TRNS,KC_TRNS, KC_FN3, \ + KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,KC_FN4 ,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_CALC,KC_TRNS,KC_TRNS,KC_TRNS,KC_MAIL,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS \ + ), +}; + +/* Give numbers some descriptive names */ +#define ACTION_LEDS_ALL 1 +#define ACTION_LEDS_GAME 2 + +const uint16_t fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(1), + [1] = ACTION_LAYER_MOMENTARY(2), + [2] = ACTION_FUNCTION(ACTION_LEDS_ALL), + [3] = ACTION_FUNCTION(ACTION_LEDS_GAME), + + [4] = ACTION_USAGE_CONSUMER(0x1B4), + [5] = ACTION_USAGE_CONSUMER(0x196), + [6] = ACTION_USAGE_CONSUMER(0x1A6), + [7] = ACTION_USAGE_CONSUMER(0x1A0), + +}; + +/* custom action function */ +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + /* + (void)opt; + switch(id) { + case ACTION_LEDS_ALL: + if(record->event.pressed) { + // signal the LED controller thread + chMBPost(&led_mailbox, LED_MSG_GAME_TOGGLE, TIME_IMMEDIATE); + } + break; + case ACTION_LEDS_GAME: + if(record->event.pressed) { + // signal the LED controller thread + chMBPost(&led_mailbox, LED_MSG_ALL_TOGGLE, TIME_IMMEDIATE); + } + break; + } + */ +} diff --git a/keyboards/kc60/led.c b/keyboards/whitefox/led.c similarity index 71% rename from keyboards/kc60/led.c rename to keyboards/whitefox/led.c index 50659d72..aed66c7c 100644 --- a/keyboards/kc60/led.c +++ b/keyboards/whitefox/led.c @@ -1,31 +1,24 @@ /* Copyright 2012 Jun Wako + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include -#include "stdint.h" +#include "hal.h" + #include "led.h" -void led_set(uint8_t usb_led) -{ - if (usb_led & (1< +#include +#include +#include "hal.h" +#include "timer.h" +#include "wait.h" +#include "print.h" +#include "matrix.h" + + +/* + * Matt3o's WhiteFox + * Column pins are input with internal pull-down. Row pins are output and strobe with high. + * Key is high or 1 when it turns on. + * + * col: { PTD0, PTD1, PTD4, PTD5, PTD6, PTD7, PTC1, PTC2 } + * row: { PTB2, PTB3, PTB18, PTB19, PTC0, PTC8, PTC9, PTC10, PTC11 } + */ +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; +static bool debouncing = false; +static uint16_t debouncing_time = 0; + + +void matrix_init(void) +{ +//debug_matrix = true; + /* Column(sense) */ + palSetPadMode(GPIOD, 0, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOD, 1, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOD, 4, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOD, 5, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOD, 6, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOD, 7, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOC, 1, PAL_MODE_INPUT_PULLDOWN); + palSetPadMode(GPIOC, 2, PAL_MODE_INPUT_PULLDOWN); + + /* Row(strobe) */ + palSetPadMode(GPIOB, 2, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 3, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 18, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 19, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOC, 0, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOC, 8, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOC, 9, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOC, 10, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOC, 11, PAL_MODE_OUTPUT_PUSHPULL); + + memset(matrix, 0, MATRIX_ROWS); + memset(matrix_debouncing, 0, MATRIX_ROWS); +} + +uint8_t matrix_scan(void) +{ + for (int row = 0; row < MATRIX_ROWS; row++) { + matrix_row_t data = 0; + + // strobe row + switch (row) { + case 0: palSetPad(GPIOB, 2); break; + case 1: palSetPad(GPIOB, 3); break; + case 2: palSetPad(GPIOB, 18); break; + case 3: palSetPad(GPIOB, 19); break; + case 4: palSetPad(GPIOC, 0); break; + case 5: palSetPad(GPIOC, 8); break; + case 6: palSetPad(GPIOC, 9); break; + case 7: palSetPad(GPIOC, 10); break; + case 8: palSetPad(GPIOC, 11); break; + } + + wait_us(20); // need wait to settle pin state + + // read col data: { PTD0, PTD1, PTD4, PTD5, PTD6, PTD7, PTC1, PTC2 } + data = ((palReadPort(GPIOC) & 0x06UL) << 5) | + ((palReadPort(GPIOD) & 0xF0UL) >> 2) | + (palReadPort(GPIOD) & 0x03UL); + + // un-strobe row + switch (row) { + case 0: palClearPad(GPIOB, 2); break; + case 1: palClearPad(GPIOB, 3); break; + case 2: palClearPad(GPIOB, 18); break; + case 3: palClearPad(GPIOB, 19); break; + case 4: palClearPad(GPIOC, 0); break; + case 5: palClearPad(GPIOC, 8); break; + case 6: palClearPad(GPIOC, 9); break; + case 7: palClearPad(GPIOC, 10); break; + case 8: palClearPad(GPIOC, 11); break; + } + + if (matrix_debouncing[row] != data) { + matrix_debouncing[row] = data; + debouncing = true; + debouncing_time = timer_read(); + } + } + + if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) { + for (int row = 0; row < MATRIX_ROWS; row++) { + matrix[row] = matrix_debouncing[row]; + } + debouncing = false; + } + return 1; +} + +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & (1</os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +# - For Teensies, FAMILY = KINETIS and SERIES is either +# KL2x (LC) or K20x (3.0,3.1,3.2). +# - For Infinity KB, SERIES = K20x +MCU_FAMILY = KINETIS +MCU_SERIES = K20x + +# Linker script to use +# - it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +# - NOTE: a custom ld script is needed for EEPROM on Teensy LC +# - LDSCRIPT = +# - MKL26Z64 for Teensy LC +# - MK20DX128 for Teensy 3.0 +# - MK20DX256 for Teensy 3.1 and 3.2 +# - MK20DX128BLDR4 for Infinity with Kiibohd bootloader +# - MK20DX256BLDR8 for Infinity ErgoDox with Kiibohd bootloader +MCU_LDSCRIPT = MK20DX256BLDR8 + +# Startup code to use +# - it should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/ +# - STARTUP = +# - kl2x for Teensy LC +# - k20x5 for Teensy 3.0 and Infinity KB +# - k20x7 for Teensy 3.1 and 3.2 +MCU_STARTUP = k20x7 + +# Board: it should exist either in /os/hal/boards/ +# or /boards +# - BOARD = +# - PJRC_TEENSY_LC for Teensy LC +# - PJRC_TEENSY_3 for Teensy 3.0 +# - PJRC_TEENSY_3_1 for Teensy 3.1 or 3.2 +# - MCHCK_K20 for Infinity KB +BOARD = PJRC_TEENSY_3_1 + +# Cortex version +# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4 +MCU = cortex-m4 + +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +# I.e. 6 for Teensy LC; 7 for Teensy 3.x +ARMV = 7 + +# Vector table for application +# 0x00000000-0x00001000 area is occupied by bootlaoder.*/ +# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB +#OPT_DEFS = -DCORTEX_VTOR_INIT=0x00001000 +OPT_DEFS = + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration +## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.) +MOUSEKEY_ENABLE ?= yes # Mouse keys +EXTRAKEY_ENABLE ?= yes # Audio control and System control +#CONSOLE_ENABLE ?= yes # Console for debug +COMMAND_ENABLE ?= yes # Commands for debug and configuration +#SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend +NKRO_ENABLE ?= yes # USB Nkey Rollover +CUSTOM_MATRIX ?= yes # Custom matrix file diff --git a/keyboards/whitefox/whitefox.c b/keyboards/whitefox/whitefox.c new file mode 100644 index 00000000..d35bf833 --- /dev/null +++ b/keyboards/whitefox/whitefox.c @@ -0,0 +1,17 @@ +/* +Copyright 2012,2013 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include "whitefox.h" diff --git a/keyboards/whitefox/whitefox.h b/keyboards/whitefox/whitefox.h new file mode 100644 index 00000000..3b3c6bd2 --- /dev/null +++ b/keyboards/whitefox/whitefox.h @@ -0,0 +1,54 @@ +/* +Copyright 2014 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#ifndef WHITEFOX_H +#define WHITEFOX_H + +#include "quantum.h" + +/* WhiteFox + * ,---------------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|Ins| + * |---------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs|Del| + * |---------------------------------------------------------------| + * |CapsL | A| S| D| F| G| H| J| K| L| ;| '|Enter |PgU| + * |---------------------------------------------------------------| + * |Shif| | Z| X| C| V| B| N| M| ,| .| /|Shift |Up |PgD| + * |---------------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |App |Alt |Gui | |Lef|Dow|Rig| + * `---------------------------------------------------------------' + */ + +#define KEYMAP( \ + K00, K10, K20, K30, K40, K50, K60, K70, K80, K01, K11, K21, K31, K41, K51, K61, \ + K71, K81, K02, K12, K22, K32, K42, K52, K62, K72, K82, K03, K13, K23, K33, \ + K43, K53, K63, K73, K83, K04, K14, K24, K34, K44, K54, K64, K74, K84, K05, \ + K15, K25, K35, K45, K55, K65, K75, K85, K06, K16, K26, K36, K46, K56, K66, \ + K76, K86, K07, K17, K27, K37, K47, K57, K67, K77 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K40, K41, K42, K43, K44, K45, K46, K47 }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K60, K61, K62, K63, K64, K65, K66, K67 }, \ + { K70, K71, K72, K73, K74, K75, K76, K77 }, \ + { K80, K81, K82, K83, K84, K85, K86, KC_NO } \ +} + +#endif diff --git a/keyboards/xd60/Makefile b/keyboards/xd60/Makefile new file mode 100644 index 00000000..57b2ef62 --- /dev/null +++ b/keyboards/xd60/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif diff --git a/keyboards/xd60/config.h b/keyboards/xd60/config.h new file mode 100644 index 00000000..4bbaec88 --- /dev/null +++ b/keyboards/xd60/config.h @@ -0,0 +1,79 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER XIUDI +#define PRODUCT XD60v2 +#define DESCRIPTION XD60 v2 Keyboard PCB by XIUDI + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 } +#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 } +#define UNUSED_PINS + +/* Backlight Setup */ +#define BACKLIGHT_PIN F5 +#define BACKLIGHT_LEVELS 6 + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* RGB Underglow + * F6 PIN for XD60v2 that has pre-soldered WS2812 LEDs + */ +#define RGB_DI_PIN F6 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 6 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +#endif diff --git a/keyboards/xd60/keymaps/cheese/README.md b/keyboards/xd60/keymaps/cheese/README.md new file mode 100644 index 00000000..8a5b97c0 --- /dev/null +++ b/keyboards/xd60/keymaps/cheese/README.md @@ -0,0 +1,13 @@ +# cheese's Layout +Customized xd60 keymap + +![Base Layout](base_layout.png "Base Layout") +![Fn Layout](fn_layout.png "Fn Layout") + +## Programming Instructions: +`cd` into keymap directory, `make dfu` + +## Features +- Media keys and movement keys setup like on the pok3r +- Lower right movement keys setup like on the fc660m (fn+direction for home/end/page up and down) +- Caps lock can be triggered by pressing both shift keys at the same time (and deactivated the same way) diff --git a/keyboards/xd60/keymaps/cheese/base_layout.png b/keyboards/xd60/keymaps/cheese/base_layout.png new file mode 100644 index 00000000..211c4c73 Binary files /dev/null and b/keyboards/xd60/keymaps/cheese/base_layout.png differ diff --git a/keyboards/xd60/keymaps/cheese/fn_layout.png b/keyboards/xd60/keymaps/cheese/fn_layout.png new file mode 100644 index 00000000..fe5ae99e Binary files /dev/null and b/keyboards/xd60/keymaps/cheese/fn_layout.png differ diff --git a/keyboards/xd60/keymaps/cheese/keymap.c b/keyboards/xd60/keymaps/cheese/keymap.c new file mode 100644 index 00000000..25919a41 --- /dev/null +++ b/keyboards/xd60/keymaps/cheese/keymap.c @@ -0,0 +1,67 @@ +#include "xd60.h" +#include "action_layer.h" + +// Each layer gets a name for readability. +// The underscores don't mean anything - you can +// have a layer called STUFF or any other name. +// Layer names don't all need to be of the same +// length, and you can also skip them entirely +// and just use numbers. +#define _BL 0 +#define _FL 1 +#define _LS 2 +#define _RS 3 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |FUNCTION| A| S| D| F| G| H| J| K| L| ;| '|Return| + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |FN|Left|Up|Down|Right| + * `-----------------------------------------------------------' + */ + [_BL] = KEYMAP( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + MO(_FL), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ + F(0), KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, F(1), F(1), F(1), \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FL), KC_LEFT, KC_UP, KC_DOWN, KC_RIGHT), + +// Function Layer + [_FL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, \ + KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_CALC, KC_INS, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, \ + KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_APP, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_PGDN, KC_END), + +// Left Shift Layer + [_LS] = KEYMAP( + KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CAPS, KC_CAPS, KC_CAPS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Right Shift Layer + [_RS] = KEYMAP( + KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + +// Custom Actions +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MODS(_LS, MOD_LSFT), + [1] = ACTION_LAYER_MODS(_RS, MOD_RSFT), +}; diff --git a/keyboards/xd60/keymaps/default/keymap.c b/keyboards/xd60/keymaps/default/keymap.c new file mode 100644 index 00000000..11be9afc --- /dev/null +++ b/keyboards/xd60/keymaps/default/keymap.c @@ -0,0 +1,46 @@ +#include "xd60.h" +#include "action_layer.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + // 0: Base Layer + KEYMAP( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ + KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, F(0), KC_LEFT, KC_DOWN, KC_RIGHT), + + // 1: Function Layer + KEYMAP( + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14, \ + KC_NO, KC_WH_U, KC_UP, KC_WH_D, KC_BSPC,KC_HOME,KC_CALC,KC_NO, KC_INS, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL, \ + KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT,KC_DEL, KC_END, KC_PGDN,KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, \ + KC_LSFT, KC_NO, KC_NO, KC_APP, BL_STEP,KC_NO, KC_NO, KC_VOLD,KC_VOLU,KC_MUTE, KC_END, KC_PGDN, KC_RSFT, KC_PGUP, KC_INS, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, F(0), KC_HOME, KC_PGDOWN,KC_END), + +}; + +// Custom Actions +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay +}; + +// Macros +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { register_code(KC_RSFT); } + else { unregister_code(KC_RSFT); } + break; + } + + return MACRO_NONE; +}; + +// Loop +void matrix_scan_user(void) { + // Empty +}; diff --git a/keyboards/xd60/keymaps/default/readme.md b/keyboards/xd60/keymaps/default/readme.md new file mode 100644 index 00000000..d2a87bd7 --- /dev/null +++ b/keyboards/xd60/keymaps/default/readme.md @@ -0,0 +1,9 @@ +# Default Keymap for XIUDI's 60% XD60 PCB + +![Default Keymap for XD60](https://img.alicdn.com/imgextra/i1/1713761720/TB2K0gTalPxQeBjy1XcXXXHzVXa_!!1713761720.png) + +## Additional Notes +Default Keymap for XD60 as indicated on the original sale page. + +## Build +To build the default keymap, simply run `make xd60-default`. diff --git a/keyboards/xd60/keymaps/stanleylai/keymap.c b/keyboards/xd60/keymaps/stanleylai/keymap.c new file mode 100644 index 00000000..feb2cd1b --- /dev/null +++ b/keyboards/xd60/keymaps/stanleylai/keymap.c @@ -0,0 +1,55 @@ +#include "xd60.h" +#include "action_layer.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + // 0: Base Layer + KEYMAP( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ + F(0), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ + KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, F(1), KC_UP, KC_DEL, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT), + + // 1: Function Layer + KEYMAP( + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14, \ + KC_CAPS, KC_MPRV, KC_UP, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_DEL, \ + F(0), KC_LEFT, KC_DOWN, KC_RIGHT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_ENT, \ + KC_LSFT, KC_NO, KC_VOLD, KC_MUTE, KC_VOLU,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGUP, KC_INS, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_MPLY, KC_RGUI, KC_RALT, KC_HOME, KC_PGDOWN,KC_END), + + // 2: RGB Layer + KEYMAP( + KC_NO, BL_TOGG, BL_STEP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, RGB_TOG, RGB_MOD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, RGB_HUI, RGB_SAI, RGB_VAI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_NO, RGB_HUD, RGB_SAD, RGB_VAD,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, F(1), KC_NO, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), + +}; + +// Custom Actions +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(1), // to Function Layer + [1] = ACTION_LAYER_MOMENTARY(2), // to RGB Layer +}; + +// Macros +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { register_code(KC_RSFT); } + else { unregister_code(KC_RSFT); } + break; + } + + return MACRO_NONE; +}; + +// Loop +void matrix_scan_user(void) { + // Empty +}; diff --git a/keyboards/xd60/readme.md b/keyboards/xd60/readme.md new file mode 100644 index 00000000..224498ca --- /dev/null +++ b/keyboards/xd60/readme.md @@ -0,0 +1,17 @@ +# QMK Firmware for XIUDI's 60% XD60 PCB + +![Top View of a pair of XD60 Keyboard](./xd60.JPG) + +## Quantum MK Firmware +For the full Quantum feature list, see [the parent readme.md](/readme.md). + +## Additional Notes +The XD60 is essentially a GH60 rev. C, with support for a right-hand arrow cluster. Includes full compatibility with GH60 expansion boards. Board also supports in-switch LEDs (two-pin, single colour), as well as WS2182 LED strips for underglow lighting. Default keymap included, matching configuration on sale page. + +Version 2 PCBs include 6 soldered on RGB underglow LEDs on the bottom, and are labelled "XD60v2" on the top. They are otherwise identical to v1 PCBs. + +## Known Issues +In-switch backlight LEDs seem to only support 1 brightness level. + +## Build +To build the default keymap, simply run `make xd60-default`. diff --git a/keyboards/xd60/rules.mk b/keyboards/xd60/rules.mk new file mode 100644 index 00000000..174c3ec8 --- /dev/null +++ b/keyboards/xd60/rules.mk @@ -0,0 +1,65 @@ +# MCU name +# MCU = at90usb1287 +MCU = atmega32u4 + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# LUFA specific +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/xd60/xd60.c b/keyboards/xd60/xd60.c new file mode 100644 index 00000000..4307f5f5 --- /dev/null +++ b/keyboards/xd60/xd60.c @@ -0,0 +1,25 @@ +#include "xd60.h" + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + if (usb_led & (1< Copyright (C) 1989, 1991 Free Software Foundation, Inc. +> 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + + +Preamble +-------- + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to most +of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you can +do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a +fee, you must give the recipients all the rights that you have. You must make +sure that they, too, receive or can get the source code. And you must show them +these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer +you this license which gives you legal permission to copy, distribute and/or +modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced by +others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish +to avoid the danger that redistributors of a free program will individually +obtain patent licenses, in effect making the program proprietary. To prevent +this, we have made it clear that any patent must be licensed for everyone's free +use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + + +Terms And Conditions For Copying, Distribution And Modification +--------------------------------------------------------------- + +**0.** This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program or +work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is included without +limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is not +restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +**1.** You may copy and distribute verbatim copies of the Program's source code +as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the Program +a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at +your option offer warranty protection in exchange for a fee. + +**2.** You may modify your copy or copies of the Program or any portion of it, +thus forming a work based on the Program, and copy and distribute such +modifications or work under the terms of Section 1 above, provided that you also +meet all of these conditions: + +* **a)** You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + +* **b)** You must cause any work that you distribute or publish, that in whole + or in part contains or is derived from the Program or any part thereof, to + be licensed as a whole at no charge to all third parties under the terms of + this License. + +* **c)** If the modified program normally reads commands interactively when + run, you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may redistribute + the program under these conditions, and telling the user how to view a copy + of this License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on the Program is + not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, and +its terms, do not apply to those sections when you distribute them as separate +works. But when you distribute the same sections as part of a whole which is a +work based on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the entire whole, +and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on the +Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +**3.** You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and 2 +above provided that you also do one of the following: + +* **a)** Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above on + a medium customarily used for software interchange; or, + +* **b)** Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + +* **c)** Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only for + noncommercial distribution and only if you received the program in object + code or executable form with such an offer, in accord with Subsection b + above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all the +source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code distributed +need not include anything that is normally distributed (in either source or +binary form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component itself +accompanies the executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source code +from the same place counts as distribution of the source code, even though third +parties are not compelled to copy the source along with the object code. + +**4.** You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + +**5.** You are not required to accept this License, since you have not signed +it. However, nothing else grants you permission to modify or distribute the +Program or its derivative works. These actions are prohibited by law if you do +not accept this License. Therefore, by modifying or distributing the Program (or +any work based on the Program), you indicate your acceptance of this License to +do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +**6.** Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these terms and +conditions. You may not impose any further restrictions on the recipients' +exercise of the rights granted herein. You are not responsible for enforcing +compliance by third parties to this License. + +**7.** If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution of +the Program by all those who receive copies directly or indirectly through you, +then the only way you could satisfy both it and this License would be to refrain +entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and the +section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose that +choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +**8.** If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original copyright +holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In such +case, this License incorporates the limitation as if written in the body of this +License. + +**9.** The Free Software Foundation may publish revised and/or new versions of +the General Public License from time to time. Such new versions will be similar +in spirit to the present version, but may differ in detail to address new +problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies +a version number of this License which applies to it and "any later version", +you have the option of following the terms and conditions either of that version +or of any later version published by the Free Software Foundation. If the +Program does not specify a version number of this License, you may choose any +version ever published by the Free Software Foundation. + +**10.** If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of +all derivatives of our free software and of promoting the sharing and reuse of +software generally. + + +No Warranty +----------- + +**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER +OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/license_GPLv3.md b/license_GPLv3.md new file mode 100644 index 00000000..2061be2b --- /dev/null +++ b/license_GPLv3.md @@ -0,0 +1,656 @@ +The GNU General Public License, Version 3, 29 June 2007 (GPLv3) +=============================================================== + +> Copyright © 2007 +> Free Software Foundation, Inc. +> <> + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + + +Preamble +-------- + +The GNU General Public License is a free, copyleft license for software and +other kinds of works. + +The licenses for most software and other practical works are designed to take +away your freedom to share and change the works. By contrast, the GNU General +Public License is intended to guarantee your freedom to share and change all +versions of a program--to make sure it remains free software for all its users. +We, the Free Software Foundation, use the GNU General Public License for most of +our software; it applies also to any other work released this way by its +authors. You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for them if you wish), that you +receive source code or can get it if you want it, that you can change the +software or use pieces of it in new free programs, and that you know you can do +these things. + +To protect your rights, we need to prevent others from denying you these rights +or asking you to surrender the rights. Therefore, you have certain +responsibilities if you distribute copies of the software, or if you modify it: +responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a +fee, you must pass on to the recipients the same freedoms that you received. You +must make sure that they, too, receive or can get the source code. And you must +show them these terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: (1) assert +copyright on the software, and (2) offer you this License giving you legal +permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that there +is no warranty for this free software. For both users' and authors' sake, the +GPL requires that modified versions be marked as changed, so that their problems +will not be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified +versions of the software inside them, although the manufacturer can do so. This +is fundamentally incompatible with the aim of protecting users' freedom to +change the software. The systematic pattern of such abuse occurs in the area of +products for individuals to use, which is precisely where it is most +unacceptable. Therefore, we have designed this version of the GPL to prohibit +the practice for those products. If such problems arise substantially in other +domains, we stand ready to extend this provision to those domains in future +versions of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. States +should not allow patents to restrict development and use of software on +general-purpose computers, but in those that do, we wish to avoid the special +danger that patents applied to a free program could make it effectively +proprietary. To prevent this, the GPL assures that patents cannot be used to +render the program non-free. + +The precise terms and conditions for copying, distribution and modification +follow. + + +TERMS AND CONDITIONS +-------------------- + + +### 0. Definitions. + +"This License refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of works, +such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this License. Each +licensee is addressed as "you". "Licensees" and "recipients" may be individuals +or organizations. + +To "modify" a work means to copy from or adapt all or part of the work in a +fashion requiring copyright permission, other than the making of an exact copy. +The resulting work is called a "modified version" of the earlier work or a work +"based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based on the +Program. + +To "propagate" a work means to do anything with it that, without permission, +would make you directly or secondarily liable for infringement under applicable +copyright law, except executing it on a computer or modifying a private copy. +Propagation includes copying, distribution (with or without modification), +making available to the public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other parties to +make or receive copies. Mere interaction with a user through a computer network, +with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" to the extent +that it includes a convenient and prominently visible feature that (1) displays +an appropriate copyright notice, and (2) tells the user that there is no +warranty for the work (except to the extent that warranties are provided), that +licensees may convey the work under this License, and how to view a copy of this +License. If the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + +### 1. Source Code. + +The "source code" for a work means the preferred form of the work for making +modifications to it. "Object code" means any non-source form of a work. + +A "Standard Interface" means an interface that either is an official standard +defined by a recognized standards body, or, in the case of interfaces specified +for a particular programming language, one that is widely used among developers +working in that language. + +The "System Libraries" of an executable work include anything, other than the +work as a whole, that (a) is included in the normal form of packaging a Major +Component, but which is not part of that Major Component, and (b) serves only to +enable use of the work with that Major Component, or to implement a Standard +Interface for which an implementation is available to the public in source code +form. A "Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system (if any) on +which the executable work runs, or a compiler used to produce the work, or an +object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all the source +code needed to generate, install, and (for an executable work) run the object +code and to modify the work, including scripts to control those activities. +However, it does not include the work's System Libraries, or general-purpose +tools or generally available free programs which are used unmodified in +performing those activities but which are not part of the work. For example, +Corresponding Source includes interface definition files associated with source +files for the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, such as by +intimate data communication or control flow between those subprograms and other +parts of the work. + +The Corresponding Source need not include anything that users can regenerate +automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + + +### 2. Basic Permissions. + +All rights granted under this License are granted for the term of copyright on +the Program, and are irrevocable provided the stated conditions are met. This +License explicitly affirms your unlimited permission to run the unmodified +Program. The output from running a covered work is covered by this License only +if the output, given its content, constitutes a covered work. This License +acknowledges your rights of fair use or other equivalent, as provided by +copyright law. + +You may make, run and propagate covered works that you do not convey, without +conditions so long as your license otherwise remains in force. You may convey +covered works to others for the sole purpose of having them make modifications +exclusively for you, or provide you with facilities for running those works, +provided that you comply with the terms of this License in conveying all +material for which you do not control copyright. Those thus making or running +the covered works for you must do so exclusively on your behalf, under your +direction and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions +stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + + +### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological measure under +any applicable law fulfilling obligations under article 11 of the WIPO copyright +treaty adopted on 20 December 1996, or similar laws prohibiting or restricting +circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention is +effected by exercising rights under this License with respect to the covered +work, and you disclaim any intention to limit operation or modification of the +work as a means of enforcing, against the work's users, your or third parties' +legal rights to forbid circumvention of technological measures. + + +### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you receive it, +in any medium, provided that you conspicuously and appropriately publish on each +copy an appropriate copyright notice; keep intact all notices stating that this +License and any non-permissive terms added in accord with section 7 apply to the +code; keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may +offer support or warranty protection for a fee. + + +### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to produce it +from the Program, in the form of source code under the terms of section 4, +provided that you also meet all of these conditions: + +* **a)** The work must carry prominent notices stating that you modified it, + and giving a relevant date. + +* **b)** The work must carry prominent notices stating that it is released + under this License and any conditions added under section 7. This + requirement modifies the requirement in section 4 to "keep intact all + notices". + +* **c)** You must license the entire work, as a whole, under this License to + anyone who comes into possession of a copy. This License will therefore + apply, along with any applicable section 7 additional terms, to the whole of + the work, and all its parts, regardless of how they are packaged. This + License gives no permission to license the work in any other way, but it + does not invalidate such permission if you have separately received it. + +* **d)** If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your work need not + make them do so. + +A compilation of a covered work with other separate and independent works, +which are not by their nature extensions of the covered work, and which are +not combined with it such as to form a larger program, in or on a volume of +a storage or distribution medium, is called an "aggregate" if the +compilation and its resulting copyright are not used to limit the access or +legal rights of the compilation's users beyond what the individual works +permit. Inclusion of a covered work in an aggregate does not cause this +License to apply to the other parts of the aggregate. + + +### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of sections 4 +and 5, provided that you also convey the machine-readable Corresponding Source +under the terms of this License, in one of these ways: + +* **a)** Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the Corresponding + Source fixed on a durable physical medium customarily used for software + interchange. + +* **b)** Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a written offer, + valid for at least three years and valid for as long as you offer spare + parts or customer support for that product model, to give anyone who + possesses the object code either (1) a copy of the Corresponding Source for + all the software in the product that is covered by this License, on a + durable physical medium customarily used for software interchange, for a + price no more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding Source from a + network server at no charge. + +* **c)** Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This alternative is + allowed only occasionally and noncommercially, and only if you received the + object code with such an offer, in accord with subsection 6b. + +* **d)** Convey the object code by offering access from a designated place + (gratis or for a charge), and offer equivalent access to the Corresponding + Source in the same way through the same place at no further charge. You need + not require recipients to copy the Corresponding Source along with the + object code. If the place to copy the object code is a network server, the + Corresponding Source may be on a different server (operated by you or a + third party) that supports equivalent copying facilities, provided you + maintain clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the Corresponding + Source, you remain obligated to ensure that it is available for as long as + needed to satisfy these requirements. + +* **e)** Convey the object code using peer-to-peer transmission, provided you + inform other peers where the object code and Corresponding Source of the + work are being offered to the general public at no charge under subsection + 6d. + +A separable portion of the object code, whose source code is excluded from +the Corresponding Source as a System Library, need not be included in +conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, or +household purposes, or (2) anything designed or sold for incorporation into +a dwelling. In determining whether a product is a consumer product, doubtful +cases shall be resolved in favor of coverage. For a particular product +received by a particular user, "normally used" refers to a typical or common +use of that class of product, regardless of the status of the particular +user or of the way in which the particular user actually uses, or expects or +is expected to use, the product. A product is a consumer product regardless +of whether the product has substantial commercial, industrial or non- +consumer uses, unless such uses represent the only significant mode of use +of the product. + +"Installation Information" for a User Product means any methods, procedures, +authorization keys, or other information required to install and execute +modified versions of a covered work in that User Product from a modified +version of its Corresponding Source. The information must suffice to ensure +that the continued functioning of the modified object code is in no case +prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as part of +a transaction in which the right of possession and use of the User Product +is transferred to the recipient in perpetuity or for a fixed term +(regardless of how the transaction is characterized), the Corresponding +Source conveyed under this section must be accompanied by the Installation +Information. But this requirement does not apply if neither you nor any +third party retains the ability to install modified object code on the User +Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates for +a work that has been modified or installed by the recipient, or for the User +Product in which it has been modified or installed. Access to a network may +be denied when the modification itself materially and adversely affects the +operation of the network or violates the rules and protocols for +communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in +accord with this section must be in a format that is publicly documented +(and with an implementation available to the public in source code form), +and must require no special password or key for unpacking, reading or +copying. + + +### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this License by +making exceptions from one or more of its conditions. Additional permissions +that are applicable to the entire Program shall be treated as though they were +included in this License, to the extent that they are valid under applicable +law. If additional permissions apply only to part of the Program, that part may +be used separately under those permissions, but the entire Program remains +governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any +additional permissions from that copy, or from any part of it. (Additional +permissions may be written to require their own removal in certain cases when +you modify the work.) You may place additional permissions on material, added by +you to a covered work, for which you have or can give appropriate copyright +permission. + +Notwithstanding any other provision of this License, for material you add to a +covered work, you may (if authorized by the copyright holders of that material) +supplement the terms of this License with terms: + +* **a)** Disclaiming warranty or limiting liability differently from the terms + of sections 15 and 16 of this License; or + +* **b)** Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal Notices + displayed by works containing it; or + +* **c)** Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in reasonable + ways as different from the original version; or + +* **d)** Limiting the use for publicity purposes of names of licensors or + authors of the material; or + +* **e)** Declining to grant rights under trademark law for use of some trade + names, trademarks, or service marks; or + +* **f)** Requiring indemnification of licensors and authors of that material + by anyone who conveys the material (or modified versions of it) with + contractual assumptions of liability to the recipient, for any liability + that these contractual assumptions directly impose on those licensors and + authors. + +All other non-permissive additional terms are considered "further restrictions" +within the meaning of section 10. If the Program as you received it, or any part +of it, contains a notice stating that it is governed by this License along with +a term that is a further restriction, you may remove that term. If a license +document contains a further restriction but permits relicensing or conveying +under this License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does not survive +such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, +in the relevant source files, a statement of the additional terms that apply to +those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a +separately written license, or stated as exceptions; the above requirements +apply either way. + + +### 8. Termination. + +You may not propagate or modify a covered work except as expressly provided +under this License. Any attempt otherwise to propagate or modify it is void, and +will automatically terminate your rights under this License (including any +patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a +particular copyright holder is reinstated (a) provisionally, unless and until +the copyright holder explicitly and finally terminates your license, and (b) +permanently, if the copyright holder fails to notify you of the violation by +some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated +permanently if the copyright holder notifies you of the violation by some +reasonable means, this is the first time you have received notice of violation +of this License (for any work) from that copyright holder, and you cure the +violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of +parties who have received copies or rights from you under this License. If your +rights have been terminated and not permanently reinstated, you do not qualify +to receive new licenses for the same material under section 10. + + +### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy of +the Program. Ancillary propagation of a covered work occurring solely as a +consequence of using peer-to-peer transmission to receive a copy likewise does +not require acceptance. However, nothing other than this License grants you +permission to propagate or modify any covered work. These actions infringe +copyright if you do not accept this License. Therefore, by modifying or +propagating a covered work, you indicate your acceptance of this License to do +so. + + +### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a +license from the original licensors, to run, modify and propagate that work, +subject to this License. You are not responsible for enforcing compliance by +third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered work results +from an entity transaction, each party to that transaction who receives a copy +of the work also receives whatever licenses to the work the party's predecessor +in interest had or could give under the previous paragraph, plus a right to +possession of the Corresponding Source of the work from the predecessor in +interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights +granted or affirmed under this License. For example, you may not impose a +license fee, royalty, or other charge for exercise of rights granted under this +License, and you may not initiate litigation (including a cross-claim or +counterclaim in a lawsuit) alleging that any patent claim is infringed by +making, using, selling, offering for sale, or importing the Program or any +portion of it. + + +### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this License of +the Program or a work on which the Program is based. The work thus licensed is +called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned or +controlled by the contributor, whether already acquired or hereafter acquired, +that would be infringed by some manner, permitted by this License, of making, +using, or selling its contributor version, but do not include claims that would +be infringed only as a consequence of further modification of the contributor +version. For purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent +license under the contributor's essential patent claims, to make, use, sell, +offer for sale, import and otherwise run, modify and propagate the contents of +its contributor version. + +In the following three paragraphs, a "patent license" is any express agreement +or commitment, however denominated, not to enforce a patent (such as an express +permission to practice a patent or covenant not to sue for patent infringement). +To "grant" such a patent license to a party means to make such an agreement or +commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the +Corresponding Source of the work is not available for anyone to copy, free of +charge and under the terms of this License, through a publicly available network +server or other readily accessible means, then you must either (1) cause the +Corresponding Source to be so available, or (2) arrange to deprive yourself of +the benefit of the patent license for this particular work, or (3) arrange, in a +manner consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have actual +knowledge that, but for the patent license, your conveying the covered work in a +country, or your recipient's use of the covered work in a country, would +infringe one or more identifiable patents in that country that you have reason +to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you +convey, or propagate by procuring conveyance of, a covered work, and grant a +patent license to some of the parties receiving the covered work authorizing +them to use, propagate, modify or convey a specific copy of the covered work, +then the patent license you grant is automatically extended to all recipients of +the covered work and works based on it. + +A patent license is "discriminatory" if it does not include within the scope of +its coverage, prohibits the exercise of, or is conditioned on the non- exercise +of one or more of the rights that are specifically granted under this License. +You may not convey a covered work if you are a party to an arrangement with a +third party that is in the business of distributing software, under which you +make payment to the third party based on the extent of your activity of +conveying the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by you (or +copies made from those copies), or (b) primarily for and in connection with +specific products or compilations that contain the covered work, unless you +entered into that arrangement, or that patent license was granted, prior to 28 +March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied +license or other defenses to infringement that may otherwise be available to you +under applicable patent law. + + +### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not excuse +you from the conditions of this License. If you cannot convey a covered work so +as to satisfy simultaneously your obligations under this License and any other +pertinent obligations, then as a consequence you may not convey it at all. For +example, if you agree to terms that obligate you to collect a royalty for +further conveying from those to whom you convey the Program, the only way you +could satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + + +### 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have permission to link +or combine any covered work with a work licensed under version 3 of the GNU +Affero General Public License into a single combined work, and to convey the +resulting work. The terms of this License will continue to apply to the part +which is the covered work, but the special requirements of the GNU Affero +General Public License, section 13, concerning interaction through a network +will apply to the combination as such. + + +### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU +General Public License from time to time. Such new versions will be similar in +spirit to the present version, but may differ in detail to address new problems +or concerns. + +Each version is given a distinguishing version number. If the Program specifies +that a certain numbered version of the GNU General Public License "or any later +version" applies to it, you have the option of following the terms and +conditions either of that numbered version or of any later version published by +the Free Software Foundation. If the Program does not specify a version number +of the GNU General Public License, you may choose any version ever published by +the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the +GNU General Public License can be used, that proxy's public statement of +acceptance of a version permanently authorizes you to choose that version for +the Program. + +Later license versions may give you additional or different permissions. +However, no additional obligations are imposed on any author or copyright holder +as a result of your choosing to follow a later version. + + +### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER +PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE +QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + +### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY +COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS +PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE +THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED +INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE +PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY +HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot +be given local legal effect according to their terms, reviewing courts shall +apply local law that most closely approximates an absolute waiver of all civil +liability in connection with the Program, unless a warranty or assumption of +liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + + +How to Apply These Terms to Your New Programs +--------------------------------------------- + +If you develop a new program, and you want it to be of the greatest possible use +to the public, the best way to achieve this is to make it free software which +everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively state the exclusion of +warranty; and each file should have at least the "copyright" line and a pointer +to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along with + this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice like +this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. + This is free software, and you are welcome to redistribute it under certain + conditions; type 'show c' for details. + +The hypothetical commands 'show w' and 'show c' should show the appropriate +parts of the General Public License. Of course, your program's commands might be +different; for a GUI interface, you would use an "about box". + +You should also get your employer (if you work as a programmer) or school, if +any, to sign a "copyright disclaimer" for the program, if necessary. For more +information on this, and how to apply and follow the GNU GPL, see +<>. + +The GNU General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may consider +it more useful to permit linking proprietary applications with the library. If +this is what you want to do, use the GNU Lesser General Public License instead +of this License. But first, please read +<>. diff --git a/license_Modified_BSD.md b/license_Modified_BSD.md new file mode 100644 index 00000000..3d5f00f2 --- /dev/null +++ b/license_Modified_BSD.md @@ -0,0 +1,32 @@ +This software is licensed with a Modified BSD License. + +All of this is supposed to be Free Software, Open Source, DFSG-free, +GPL-compatible, and OK to use in both free and proprietary applications. +Additions and corrections to this file are welcome. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/quantum/analog.c b/quantum/analog.c index 49b84ee0..1ec38df7 100644 --- a/quantum/analog.c +++ b/quantum/analog.c @@ -1,3 +1,19 @@ +/* Copyright 2015 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + // Simple analog to digitial conversion #include diff --git a/quantum/analog.h b/quantum/analog.h index 9b95a93b..8d93de7d 100644 --- a/quantum/analog.h +++ b/quantum/analog.h @@ -1,3 +1,19 @@ +/* Copyright 2015 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef _analog_h_included__ #define _analog_h_included__ diff --git a/quantum/api.c b/quantum/api.c new file mode 100644 index 00000000..52dfe23e --- /dev/null +++ b/quantum/api.c @@ -0,0 +1,195 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "api.h" +#include "quantum.h" + +void dword_to_bytes(uint32_t dword, uint8_t * bytes) { + bytes[0] = (dword >> 24) & 0xFF; + bytes[1] = (dword >> 16) & 0xFF; + bytes[2] = (dword >> 8) & 0xFF; + bytes[3] = (dword >> 0) & 0xFF; +} + +uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index) { + return ((uint32_t)bytes[index + 0] << 24) | ((uint32_t)bytes[index + 1] << 16) | ((uint32_t)bytes[index + 2] << 8) | (uint32_t)bytes[index + 3]; +} + +__attribute__ ((weak)) +bool process_api_quantum(uint8_t length, uint8_t * data) { + return process_api_keyboard(length, data); +} + +__attribute__ ((weak)) +bool process_api_keyboard(uint8_t length, uint8_t * data) { + return process_api_user(length, data); +} + +__attribute__ ((weak)) +bool process_api_user(uint8_t length, uint8_t * data) { + return true; +} + +void process_api(uint16_t length, uint8_t * data) { + // SEND_STRING("\nRX: "); + // for (uint8_t i = 0; i < length; i++) { + // send_byte(data[i]); + // SEND_STRING(" "); + // } + if (!process_api_quantum(length, data)) + return; + + switch (data[0]) { + case MT_SET_DATA: + switch (data[1]) { + case DT_DEFAULT_LAYER: { + eeconfig_update_default_layer(data[2]); + default_layer_set((uint32_t)(data[2])); + break; + } + case DT_KEYMAP_OPTIONS: { + eeconfig_update_keymap(data[2]); + break; + } + case DT_RGBLIGHT: { + #ifdef RGBLIGHT_ENABLE + uint32_t rgblight = bytes_to_dword(data, 2); + rgblight_update_dword(rgblight); + #endif + break; + } + } + case MT_GET_DATA: + switch (data[1]) { + case DT_HANDSHAKE: { + MT_GET_DATA_ACK(DT_HANDSHAKE, NULL, 0); + break; + } + case DT_DEBUG: { + uint8_t debug_bytes[1] = { eeprom_read_byte(EECONFIG_DEBUG) }; + MT_GET_DATA_ACK(DT_DEBUG, debug_bytes, 1); + break; + } + case DT_DEFAULT_LAYER: { + uint8_t default_bytes[1] = { eeprom_read_byte(EECONFIG_DEFAULT_LAYER) }; + MT_GET_DATA_ACK(DT_DEFAULT_LAYER, default_bytes, 1); + break; + } + case DT_CURRENT_LAYER: { + uint8_t layer_state_bytes[4]; + dword_to_bytes(layer_state, layer_state_bytes); + MT_GET_DATA_ACK(DT_CURRENT_LAYER, layer_state_bytes, 4); + break; + } + case DT_AUDIO: { + #ifdef AUDIO_ENABLE + uint8_t audio_bytes[1] = { eeprom_read_byte(EECONFIG_AUDIO) }; + MT_GET_DATA_ACK(DT_AUDIO, audio_bytes, 1); + #else + MT_GET_DATA_ACK(DT_AUDIO, NULL, 0); + #endif + break; + } + case DT_BACKLIGHT: { + #ifdef BACKLIGHT_ENABLE + uint8_t backlight_bytes[1] = { eeprom_read_byte(EECONFIG_BACKLIGHT) }; + MT_GET_DATA_ACK(DT_BACKLIGHT, backlight_bytes, 1); + #else + MT_GET_DATA_ACK(DT_BACKLIGHT, NULL, 0); + #endif + break; + } + case DT_RGBLIGHT: { + #ifdef RGBLIGHT_ENABLE + uint8_t rgblight_bytes[4]; + dword_to_bytes(eeconfig_read_rgblight(), rgblight_bytes); + MT_GET_DATA_ACK(DT_RGBLIGHT, rgblight_bytes, 4); + #else + MT_GET_DATA_ACK(DT_RGBLIGHT, NULL, 0); + #endif + break; + } + case DT_KEYMAP_OPTIONS: { + uint8_t keymap_bytes[1] = { eeconfig_read_keymap() }; + MT_GET_DATA_ACK(DT_KEYMAP_OPTIONS, keymap_bytes, 1); + break; + } + case DT_KEYMAP_SIZE: { + uint8_t keymap_size[2] = {MATRIX_ROWS, MATRIX_COLS}; + MT_GET_DATA_ACK(DT_KEYMAP_SIZE, keymap_size, 2); + break; + } + // This may be too much + // case DT_KEYMAP: { + // uint8_t keymap_data[MATRIX_ROWS * MATRIX_COLS * 4 + 3]; + // keymap_data[0] = data[2]; + // keymap_data[1] = MATRIX_ROWS; + // keymap_data[2] = MATRIX_COLS; + // for (int i = 0; i < MATRIX_ROWS; i++) { + // for (int j = 0; j < MATRIX_COLS; j++) { + // keymap_data[3 + (i*MATRIX_COLS*2) + (j*2)] = pgm_read_word(&keymaps[data[2]][i][j]) >> 8; + // keymap_data[3 + (i*MATRIX_COLS*2) + (j*2) + 1] = pgm_read_word(&keymaps[data[2]][i][j]) & 0xFF; + // } + // } + // MT_GET_DATA_ACK(DT_KEYMAP, keymap_data, MATRIX_ROWS * MATRIX_COLS * 4 + 3); + // // uint8_t keymap_data[5]; + // // keymap_data[0] = data[2]; + // // keymap_data[1] = data[3]; + // // keymap_data[2] = data[4]; + // // keymap_data[3] = pgm_read_word(&keymaps[data[2]][data[3]][data[4]]) >> 8; + // // keymap_data[4] = pgm_read_word(&keymaps[data[2]][data[3]][data[4]]) & 0xFF; + + // // MT_GET_DATA_ACK(DT_KEYMAP, keymap_data, 5); + // break; + // } + default: + break; + } + break; + case MT_SET_DATA_ACK: + case MT_GET_DATA_ACK: + break; + case MT_SEND_DATA: + break; + case MT_SEND_DATA_ACK: + break; + case MT_EXE_ACTION: + break; + case MT_EXE_ACTION_ACK: + break; + case MT_TYPE_ERROR: + break; + default: ; // command not recognised + SEND_BYTES(MT_TYPE_ERROR, DT_NONE, data, length); + break; + + // #ifdef RGBLIGHT_ENABLE + // case 0x27: ; // RGB LED functions + // switch (*data++) { + // case 0x00: ; // Update HSV + // rgblight_sethsv((data[0] << 8 | data[1]) % 360, data[2], data[3]); + // break; + // case 0x01: ; // Update RGB + // break; + // case 0x02: ; // Update mode + // rgblight_mode(data[0]); + // break; + // } + // break; + // #endif + } + +} diff --git a/quantum/api.h b/quantum/api.h new file mode 100644 index 00000000..efc0ddca --- /dev/null +++ b/quantum/api.h @@ -0,0 +1,75 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _API_H_ +#define _API_H_ + +#include "lufa.h" + +enum MESSAGE_TYPE { + MT_GET_DATA = 0x10, // Get data from keyboard + MT_GET_DATA_ACK = 0x11, // returned data to process (ACK) + MT_SET_DATA = 0x20, // Set data on keyboard + MT_SET_DATA_ACK = 0x21, // returned data to confirm (ACK) + MT_SEND_DATA = 0x30, // Sending data/action from keyboard + MT_SEND_DATA_ACK = 0x31, // returned data/action confirmation (ACK) + MT_EXE_ACTION = 0x40, // executing actions on keyboard + MT_EXE_ACTION_ACK =0x41, // return confirmation/value (ACK) + MT_TYPE_ERROR = 0x80 // type not recofgnised (ACK) +}; + +enum DATA_TYPE { + DT_NONE = 0x00, + DT_HANDSHAKE, + DT_DEFAULT_LAYER, + DT_CURRENT_LAYER, + DT_KEYMAP_OPTIONS, + DT_BACKLIGHT, + DT_RGBLIGHT, + DT_UNICODE, + DT_DEBUG, + DT_AUDIO, + DT_QUANTUM_ACTION, + DT_KEYBOARD_ACTION, + DT_USER_ACTION, + DT_KEYMAP_SIZE, + DT_KEYMAP +}; + +void dword_to_bytes(uint32_t dword, uint8_t * bytes); +uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index); + +#define MT_GET_DATA(data_type, data, length) SEND_BYTES(MT_GET_DATA, data_type, data, length) +#define MT_GET_DATA_ACK(data_type, data, length) SEND_BYTES(MT_GET_DATA_ACK, data_type, data, length) +#define MT_SET_DATA(data_type, data, length) SEND_BYTES(MT_SET_DATA, data_type, data, length) +#define MT_SET_DATA_ACK(data_type, data, length) SEND_BYTES(MT_SET_DATA_ACK, data_type, data, length) +#define MT_SEND_DATA(data_type, data, length) SEND_BYTES(MT_SEND_DATA, data_type, data, length) +#define MT_SEND_DATA_ACK(data_type, data, length) SEND_BYTES(MT_SEND_DATA_ACK, data_type, data, length) +#define MT_EXE_ACTION(data_type, data, length) SEND_BYTES(MT_EXE_ACTION, data_type, data, length) +#define MT_EXE_ACTION_ACK(data_type, data, length) SEND_BYTES(MT_EXE_ACTION_ACK, data_type, data, length) + +void process_api(uint16_t length, uint8_t * data); + +__attribute__ ((weak)) +bool process_api_quantum(uint8_t length, uint8_t * data); + +__attribute__ ((weak)) +bool process_api_keyboard(uint8_t length, uint8_t * data); + +__attribute__ ((weak)) +bool process_api_user(uint8_t length, uint8_t * data); + +#endif diff --git a/quantum/api/api_sysex.c b/quantum/api/api_sysex.c new file mode 100644 index 00000000..6a2ee901 --- /dev/null +++ b/quantum/api/api_sysex.c @@ -0,0 +1,72 @@ +/* Copyright 2016 Jack Humbert, Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "api_sysex.h" +#include "sysex_tools.h" +#include "print.h" + +void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint16_t length) { + // SEND_STRING("\nTX: "); + // for (uint8_t i = 0; i < length; i++) { + // send_byte(bytes[i]); + // SEND_STRING(" "); + // } + if (length > API_SYSEX_MAX_SIZE) { + xprintf("Sysex msg too big %d %d %d", message_type, data_type, length); + return; + } + + + // The buffer size required is calculated as the following + // API_SYSEX_MAX_SIZE is the maximum length + // In addition to that we have a two byte message header consisting of the message_type and data_type + // This has to be encoded with an additional overhead of one byte for every starting 7 bytes + // We just add one extra byte in case it's not divisible by 7 + // Then we have an unencoded header consisting of 4 bytes + // Plus a one byte terminator + const unsigned message_header = 2; + const unsigned unencoded_message = API_SYSEX_MAX_SIZE + message_header; + const unsigned encoding_overhead = unencoded_message / 7 + 1; + const unsigned encoded_size = unencoded_message + encoding_overhead; + const unsigned unencoded_header = 4; + const unsigned terminator = 1; + const unsigned buffer_size = encoded_size + unencoded_header + terminator; + uint8_t buffer[encoded_size + unencoded_header + terminator]; + // The unencoded header + buffer[0] = 0xF0; + buffer[1] = 0x00; + buffer[2] = 0x00; + buffer[3] = 0x00; + + // We copy the message to the end of the array, this way we can do an inplace encoding, using the same + // buffer for both input and output + const unsigned message_size = length + message_header; + uint8_t* unencoded_start = buffer + buffer_size - message_size; + uint8_t* ptr = unencoded_start; + *(ptr++) = message_type; + *(ptr++) = data_type; + memcpy(ptr, bytes, length); + + unsigned encoded_length = sysex_encode(buffer + unencoded_header, unencoded_start, message_size); + unsigned final_size = unencoded_header + encoded_length + terminator; + buffer[final_size - 1] = 0xF7; + midi_send_array(&midi_device, final_size, buffer); + + // SEND_STRING("\nTD: "); + // for (uint8_t i = 0; i < encoded_length + 5; i++) { + // send_byte(buffer[i]); + // SEND_STRING(" "); + // } +} diff --git a/quantum/api/api_sysex.h b/quantum/api/api_sysex.h new file mode 100644 index 00000000..a23f00f5 --- /dev/null +++ b/quantum/api/api_sysex.h @@ -0,0 +1,26 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _API_SYSEX_H_ +#define _API_SYSEX_H_ + +#include "api.h" + +void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint16_t length); + +#define SEND_BYTES(mt, dt, b, l) send_bytes_sysex(mt, dt, b, l) + +#endif diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index ead5fbf3..59707361 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include //#include @@ -77,6 +92,7 @@ static bool audio_initialized = false; audio_config_t audio_config; uint16_t envelope_index = 0; +bool glissando = true; void audio_init() { @@ -88,15 +104,15 @@ void audio_init() } audio_config.raw = eeconfig_read_audio(); - // Set port PC6 (OC3A and /OC4A) as output + // Set port PC6 (OC3A and /OC4A) as output DDRC |= _BV(PORTC6); DISABLE_AUDIO_COUNTER_3_ISR; - // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers - // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 - // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A) - // Clock Select (CS3n) = 0b010 = Clock / 8 + // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers + // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 + // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A) + // Clock Select (CS3n) = 0b010 = Clock / 8 TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); @@ -105,6 +121,8 @@ void audio_init() void stop_all_notes() { + dprintf("audio stop all notes"); + if (!audio_initialized) { audio_init(); } @@ -127,6 +145,8 @@ void stop_all_notes() void stop_note(float freq) { + dprintf("audio stop note freq=%d", (int)freq); + if (playing_note) { if (!audio_initialized) { audio_init(); @@ -182,155 +202,161 @@ float vibrato(float average_freq) { ISR(TIMER3_COMPA_vect) { - float freq; - - if (playing_note) { - if (voices > 0) { - if (polyphony_rate > 0) { - if (voices > 1) { - voice_place %= voices; - if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { - voice_place = (voice_place + 1) % voices; - place = 0.0; - } - } - - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequencies[voice_place]); - } else { - freq = frequencies[voice_place]; - } - #else - freq = frequencies[voice_place]; - #endif - } else { - if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, 440/frequency/12/2); - } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, -440/frequency/12/2); - } else { - frequency = frequencies[voices - 1]; - } - - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequency); - } else { - freq = frequency; - } - #else - freq = frequency; - #endif - } - - if (envelope_index < 65535) { - envelope_index++; - } - - freq = voice_envelope(freq); - - if (freq < 30.517578125) { - freq = 30.52; - } - - TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); - TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); - } - } - - if (playing_notes) { - if (note_frequency > 0) { - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(note_frequency); - } else { - freq = note_frequency; - } - #else - freq = note_frequency; - #endif - - if (envelope_index < 65535) { - envelope_index++; - } - freq = voice_envelope(freq); - - TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); - TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); - } else { - TIMER_3_PERIOD = 0; - TIMER_3_DUTY_CYCLE = 0; - } - - note_position++; - bool end_of_note = false; - if (TIMER_3_PERIOD > 0) { - end_of_note = (note_position >= (note_length / TIMER_3_PERIOD * 0xFFFF)); - } else { - end_of_note = (note_position >= (note_length * 0x7FF)); - } - - if (end_of_note) { - current_note++; - if (current_note >= notes_count) { - if (notes_repeat) { - current_note = 0; - } else { - DISABLE_AUDIO_COUNTER_3_ISR; - DISABLE_AUDIO_COUNTER_3_OUTPUT; - playing_notes = false; - return; - } - } - if (!note_resting && (notes_rest > 0)) { - note_resting = true; - note_frequency = 0; - note_length = notes_rest; - current_note--; - } else { - note_resting = false; - envelope_index = 0; - note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); - } - - note_position = 0; - } - } - - if (!audio_config.enable) { - playing_notes = false; - playing_note = false; - } + float freq; + + if (playing_note) { + if (voices > 0) { + if (polyphony_rate > 0) { + if (voices > 1) { + voice_place %= voices; + if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { + voice_place = (voice_place + 1) % voices; + place = 0.0; + } + } + + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequencies[voice_place]); + } else { + freq = frequencies[voice_place]; + } + #else + freq = frequencies[voice_place]; + #endif + } else { + if (glissando) { + if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, 440/frequency/12/2); + } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, -440/frequency/12/2); + } else { + frequency = frequencies[voices - 1]; + } + } else { + frequency = frequencies[voices - 1]; + } + + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequency); + } else { + freq = frequency; + } + #else + freq = frequency; + #endif + } + + if (envelope_index < 65535) { + envelope_index++; + } + + freq = voice_envelope(freq); + + if (freq < 30.517578125) { + freq = 30.52; + } + + TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); + TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); + } + } + + if (playing_notes) { + if (note_frequency > 0) { + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(note_frequency); + } else { + freq = note_frequency; + } + #else + freq = note_frequency; + #endif + + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); + + TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); + TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); + } else { + TIMER_3_PERIOD = 0; + TIMER_3_DUTY_CYCLE = 0; + } + + note_position++; + bool end_of_note = false; + if (TIMER_3_PERIOD > 0) { + end_of_note = (note_position >= (note_length / TIMER_3_PERIOD * 0xFFFF)); + } else { + end_of_note = (note_position >= (note_length * 0x7FF)); + } + + if (end_of_note) { + current_note++; + if (current_note >= notes_count) { + if (notes_repeat) { + current_note = 0; + } else { + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; + playing_notes = false; + return; + } + } + if (!note_resting && (notes_rest > 0)) { + note_resting = true; + note_frequency = 0; + note_length = notes_rest; + current_note--; + } else { + note_resting = false; + envelope_index = 0; + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + } + + note_position = 0; + } + } + + if (!audio_config.enable) { + playing_notes = false; + playing_note = false; + } } void play_note(float freq, int vol) { + dprintf("audio play note freq=%d vol=%d", (int)freq, vol); + if (!audio_initialized) { audio_init(); } - if (audio_config.enable && voices < 8) { - DISABLE_AUDIO_COUNTER_3_ISR; + if (audio_config.enable && voices < 8) { + DISABLE_AUDIO_COUNTER_3_ISR; - // Cancel notes if notes are playing - if (playing_notes) - stop_all_notes(); + // Cancel notes if notes are playing + if (playing_notes) + stop_all_notes(); - playing_note = true; + playing_note = true; - envelope_index = 0; + envelope_index = 0; - if (freq > 0) { - frequencies[voices] = freq; - volumes[voices] = vol; - voices++; - } + if (freq > 0) { + frequencies[voices] = freq; + volumes[voices] = vol; + voices++; + } ENABLE_AUDIO_COUNTER_3_ISR; ENABLE_AUDIO_COUNTER_3_OUTPUT; - } + } } @@ -341,37 +367,37 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) audio_init(); } - if (audio_config.enable) { + if (audio_config.enable) { - DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_ISR; - // Cancel note if a note is playing - if (playing_note) - stop_all_notes(); + // Cancel note if a note is playing + if (playing_note) + stop_all_notes(); - playing_notes = true; + playing_notes = true; - notes_pointer = np; - notes_count = n_count; - notes_repeat = n_repeat; - notes_rest = n_rest; + notes_pointer = np; + notes_count = n_count; + notes_repeat = n_repeat; + notes_rest = n_rest; - place = 0; - current_note = 0; + place = 0; + current_note = 0; note_frequency = (*notes_pointer)[current_note][0]; note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); - note_position = 0; + note_position = 0; ENABLE_AUDIO_COUNTER_3_ISR; ENABLE_AUDIO_COUNTER_3_OUTPUT; - } + } } bool is_playing_notes(void) { - return playing_notes; + return playing_notes; } bool is_audio_on(void) { diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h index 47f326ea..27fdc2ab 100644 --- a/quantum/audio/audio.h +++ b/quantum/audio/audio.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef AUDIO_H #define AUDIO_H @@ -88,4 +103,4 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) bool is_playing_notes(void); -#endif \ No newline at end of file +#endif diff --git a/quantum/audio/audio_pwm.c b/quantum/audio/audio_pwm.c index f820eec1..ded86ede 100644 --- a/quantum/audio/audio_pwm.c +++ b/quantum/audio/audio_pwm.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include //#include diff --git a/quantum/audio/luts.c b/quantum/audio/luts.c index 9f3de9a0..57f2d592 100644 --- a/quantum/audio/luts.c +++ b/quantum/audio/luts.c @@ -1,3 +1,19 @@ +/* Copyright 2016 IBNobody + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #include #include diff --git a/quantum/audio/luts.h b/quantum/audio/luts.h index 7df3078a..155e34e8 100644 --- a/quantum/audio/luts.h +++ b/quantum/audio/luts.h @@ -1,3 +1,19 @@ +/* Copyright 2016 IBNobody + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #include #include @@ -12,4 +28,4 @@ extern const float vibrato_lut[VIBRATO_LUT_LENGTH]; extern const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH]; -#endif /* LUTS_H */ \ No newline at end of file +#endif /* LUTS_H */ diff --git a/quantum/audio/musical_notes.h b/quantum/audio/musical_notes.h index b08d16a6..a3aaa2f1 100644 --- a/quantum/audio/musical_notes.h +++ b/quantum/audio/musical_notes.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef MUSICAL_NOTES_H #define MUSICAL_NOTES_H @@ -214,4 +230,4 @@ #define NOTE_BF8 NOTE_AS8 -#endif \ No newline at end of file +#endif diff --git a/quantum/audio/song_list.h b/quantum/audio/song_list.h index 623f24f3..db2d1a94 100644 --- a/quantum/audio/song_list.h +++ b/quantum/audio/song_list.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "musical_notes.h" #ifndef SONG_LIST_H @@ -134,4 +149,31 @@ E__NOTE(_E6), \ S__NOTE(_B5), +#define COIN_SOUND \ + E__NOTE(_A5 ), \ + HD_NOTE(_E6 ), + +#define ONE_UP_SOUND \ + Q__NOTE(_E6 ), \ + Q__NOTE(_G6 ), \ + Q__NOTE(_E7 ), \ + Q__NOTE(_C7 ), \ + Q__NOTE(_D7 ), \ + Q__NOTE(_G7 ), + +#define SONIC_RING \ + E__NOTE(_E6), \ + E__NOTE(_G6), \ + HD_NOTE(_C7), + +#define ZELDA_PUZZLE \ + Q__NOTE(_G5), \ + Q__NOTE(_FS5), \ + Q__NOTE(_DS5), \ + Q__NOTE(_A4), \ + Q__NOTE(_GS4), \ + Q__NOTE(_E5), \ + Q__NOTE(_GS5), \ + HD_NOTE(_C6), + #endif diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index 6d4172a0..54ebd423 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "voices.h" #include "audio.h" #include "stdlib.h" @@ -6,6 +21,7 @@ extern uint16_t envelope_index; extern float note_timbre; extern float polyphony_rate; +extern bool glissando; voice_type voice = default_voice; @@ -18,20 +34,132 @@ void voice_iterate() { } void voice_deiterate() { - voice = (voice - 1) % number_of_voices; + voice = (voice - 1 + number_of_voices) % number_of_voices; } float voice_envelope(float frequency) { // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz + __attribute__ ((unused)) uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency)); switch (voice) { case default_voice: + glissando = true; note_timbre = TIMBRE_50; polyphony_rate = 0; break; + #ifdef AUDIO_VOICES + + case something: + glissando = false; + polyphony_rate = 0; + switch (compensated_index) { + case 0 ... 9: + note_timbre = TIMBRE_12; + break; + + case 10 ... 19: + note_timbre = TIMBRE_25; + break; + + case 20 ... 200: + note_timbre = .125 + .125; + break; + + default: + note_timbre = .125; + break; + } + break; + + case drums: + glissando = false; + polyphony_rate = 0; + // switch (compensated_index) { + // case 0 ... 10: + // note_timbre = 0.5; + // break; + // case 11 ... 20: + // note_timbre = 0.5 * (21 - compensated_index) / 10; + // break; + // default: + // note_timbre = 0; + // break; + // } + // frequency = (rand() % (int)(frequency * 1.2 - frequency)) + (frequency * 0.8); + + if (frequency < 80.0) { + + } else if (frequency < 160.0) { + + // Bass drum: 60 - 100 Hz + frequency = (rand() % (int)(40)) + 60; + switch (envelope_index) { + case 0 ... 10: + note_timbre = 0.5; + break; + case 11 ... 20: + note_timbre = 0.5 * (21 - envelope_index) / 10; + break; + default: + note_timbre = 0; + break; + } + + } else if (frequency < 320.0) { + + + // Snare drum: 1 - 2 KHz + frequency = (rand() % (int)(1000)) + 1000; + switch (envelope_index) { + case 0 ... 5: + note_timbre = 0.5; + break; + case 6 ... 20: + note_timbre = 0.5 * (21 - envelope_index) / 15; + break; + default: + note_timbre = 0; + break; + } + + } else if (frequency < 640.0) { + + // Closed Hi-hat: 3 - 5 KHz + frequency = (rand() % (int)(2000)) + 3000; + switch (envelope_index) { + case 0 ... 15: + note_timbre = 0.5; + break; + case 16 ... 20: + note_timbre = 0.5 * (21 - envelope_index) / 5; + break; + default: + note_timbre = 0; + break; + } + + } else if (frequency < 1280.0) { + + // Open Hi-hat: 3 - 5 KHz + frequency = (rand() % (int)(2000)) + 3000; + switch (envelope_index) { + case 0 ... 35: + note_timbre = 0.5; + break; + case 36 ... 50: + note_timbre = 0.5 * (51 - envelope_index) / 15; + break; + default: + note_timbre = 0; + break; + } + + } + break; case butts_fader: + glissando = true; polyphony_rate = 0; switch (compensated_index) { case 0 ... 9: @@ -79,6 +207,7 @@ float voice_envelope(float frequency) { case duty_osc: // This slows the loop down a substantial amount, so higher notes may freeze + glissando = true; polyphony_rate = 0; switch (compensated_index) { default: @@ -93,6 +222,7 @@ float voice_envelope(float frequency) { break; case duty_octave_down: + glissando = true; polyphony_rate = 0; note_timbre = (envelope_index % 2) * .125 + .375 * 2; if ((envelope_index % 4) == 0) @@ -101,6 +231,7 @@ float voice_envelope(float frequency) { note_timbre = 0; break; case delayed_vibrato: + glissando = true; polyphony_rate = 0; note_timbre = TIMBRE_50; #define VOICE_VIBRATO_DELAY 150 @@ -155,11 +286,11 @@ float voice_envelope(float frequency) { // note_timbre = 0.25; // break; + #endif + default: break; } return frequency; } - - diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index b2495b23..9403a6b5 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include @@ -11,6 +26,9 @@ float voice_envelope(float frequency); typedef enum { default_voice, + #ifdef AUDIO_VOICES + something, + drums, butts_fader, octave_crunch, duty_osc, @@ -21,6 +39,7 @@ typedef enum { // duty_fourth_down, // duty_third_down, // duty_fifth_third_down, + #endif number_of_voices // important that this is last } voice_type; @@ -28,4 +47,4 @@ void set_voice(voice_type v); void voice_iterate(void); void voice_deiterate(void); -#endif \ No newline at end of file +#endif diff --git a/quantum/audio/wave.h b/quantum/audio/wave.h index 6ebc3485..f15615dd 100644 --- a/quantum/audio/wave.h +++ b/quantum/audio/wave.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #include #include @@ -262,4 +278,4 @@ const uint8_t sinewave[] PROGMEM= //2048 values 0x76,0x77,0x77,0x77,0x78,0x78,0x78,0x79, 0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7c,0x7c, 0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f -}; \ No newline at end of file +}; diff --git a/quantum/config_common.h b/quantum/config_common.h index 8ed5f4a1..c88e02d9 100644 --- a/quantum/config_common.h +++ b/quantum/config_common.h @@ -1,59 +1,78 @@ +/* Copyright 2015-2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef CONFIG_DEFINITIONS_H #define CONFIG_DEFINITIONS_H /* diode directions */ -#define COL2ROW 0 -#define ROW2COL 1 -/* I/O pins */ -#define B0 0x30 -#define B1 0x31 -#define B2 0x32 -#define B3 0x33 -#define B4 0x34 -#define B5 0x35 -#define B6 0x36 -#define B7 0x37 -#define C0 0x60 -#define C1 0x61 -#define C2 0x62 -#define C3 0x63 -#define C4 0x64 -#define C5 0x65 -#define C6 0x66 -#define C7 0x67 -#define D0 0x90 -#define D1 0x91 -#define D2 0x92 -#define D3 0x93 -#define D4 0x94 -#define D5 0x95 -#define D6 0x96 -#define D7 0x97 -#define E0 0xC0 -#define E1 0xC1 -#define E2 0xC2 -#define E3 0xC3 -#define E4 0xC4 -#define E5 0xC5 -#define E6 0xC6 -#define E7 0xC7 -#define F0 0xF0 -#define F1 0xF1 -#define F2 0xF2 -#define F3 0xF3 -#define F4 0xF4 -#define F5 0xF5 -#define F6 0xF6 -#define F7 0xF7 -#define A0 0x00 -#define A1 0x01 -#define A2 0x02 -#define A3 0x03 -#define A4 0x04 -#define A5 0x05 -#define A6 0x06 -#define A7 0x07 +#define COL2ROW 0 +#define ROW2COL 1 +#define CUSTOM_MATRIX 2 /* Disables built-in matrix scanning code */ +/* I/O pins */ +#ifndef F0 + #define B0 0x30 + #define B1 0x31 + #define B2 0x32 + #define B3 0x33 + #define B4 0x34 + #define B5 0x35 + #define B6 0x36 + #define B7 0x37 + #define C0 0x60 + #define C1 0x61 + #define C2 0x62 + #define C3 0x63 + #define C4 0x64 + #define C5 0x65 + #define C6 0x66 + #define C7 0x67 + #define D0 0x90 + #define D1 0x91 + #define D2 0x92 + #define D3 0x93 + #define D4 0x94 + #define D5 0x95 + #define D6 0x96 + #define D7 0x97 + #define E0 0xC0 + #define E1 0xC1 + #define E2 0xC2 + #define E3 0xC3 + #define E4 0xC4 + #define E5 0xC5 + #define E6 0xC6 + #define E7 0xC7 + #define F0 0xF0 + #define F1 0xF1 + #define F2 0xF2 + #define F3 0xF3 + #define F4 0xF4 + #define F5 0xF5 + #define F6 0xF6 + #define F7 0xF7 + #define A0 0x00 + #define A1 0x01 + #define A2 0x02 + #define A3 0x03 + #define A4 0x04 + #define A5 0x05 + #define A6 0x06 + #define A7 0x07 +#endif /* USART configuration */ #ifdef BLUETOOTH_ENABLE @@ -76,53 +95,9 @@ } while(0) # else # error "USART configuration is needed." +# endif #endif -// I'm fairly sure these aren't needed, but oh well - Jack - -/* - * PS/2 Interrupt configuration - */ -#ifdef PS2_USE_INT -/* uses INT1 for clock line(ATMega32U4) */ -#define PS2_CLOCK_PORT PORTD -#define PS2_CLOCK_PIN PIND -#define PS2_CLOCK_DDR DDRD -#define PS2_CLOCK_BIT 1 - -#define PS2_DATA_PORT PORTD -#define PS2_DATA_PIN PIND -#define PS2_DATA_DDR DDRD -#define PS2_DATA_BIT 0 - -#define PS2_INT_INIT() do { \ - EICRA |= ((1<. + */ + /* Author: Wojciech Siewierski < wojciech dot siewierski at onet dot pl > */ #ifndef DYNAMIC_MACROS_H #define DYNAMIC_MACROS_H diff --git a/quantum/fauxclicky.c b/quantum/fauxclicky.c new file mode 100644 index 00000000..13273e70 --- /dev/null +++ b/quantum/fauxclicky.c @@ -0,0 +1,68 @@ +/* +Copyright 2017 Priyadi Iman Nurcahyo + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include + +__attribute__ ((weak)) +float fauxclicky_pressed_note[2] = MUSICAL_NOTE(_F3, 2); +__attribute__ ((weak)) +float fauxclicky_released_note[2] = MUSICAL_NOTE(_A3, 2); +__attribute__ ((weak)) +float fauxclicky_beep_note[2] = MUSICAL_NOTE(_C3, 2); + +bool fauxclicky_enabled = true; +uint16_t note_start = 0; +bool note_playing = false; +uint16_t note_period = 0; + +void fauxclicky_init() +{ + // Set port PC6 (OC3A and /OC4A) as output + DDRC |= _BV(PORTC6); + + // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers + TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); + TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); +} + +void fauxclicky_stop() +{ + FAUXCLICKY_DISABLE_OUTPUT; + note_playing = false; +} + +void fauxclicky_play(float note[2]) { + if (!fauxclicky_enabled) return; + if (note_playing) fauxclicky_stop(); + FAUXCLICKY_TIMER_PERIOD = (uint16_t)(((float)F_CPU) / (note[0] * FAUXCLICKY_CPU_PRESCALER)); + FAUXCLICKY_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (note[0] * FAUXCLICKY_CPU_PRESCALER)) / 2); + note_playing = true; + note_period = (note[1] / 16) * (60 / (float)FAUXCLICKY_TEMPO) * 100; // check this + note_start = timer_read(); + FAUXCLICKY_ENABLE_OUTPUT; +} + +void fauxclicky_check() { + if (!note_playing) return; + + if (timer_elapsed(note_start) > note_period) { + fauxclicky_stop(); + } +} diff --git a/quantum/fauxclicky.h b/quantum/fauxclicky.h new file mode 100644 index 00000000..109bd0d8 --- /dev/null +++ b/quantum/fauxclicky.h @@ -0,0 +1,99 @@ +/* +Copyright 2017 Priyadi Iman Nurcahyo + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifdef AUDIO_ENABLE +#error "AUDIO_ENABLE and FAUXCLICKY_ENABLE cannot be both enabled" +#endif + +#include "musical_notes.h" +#include "stdbool.h" + +__attribute__ ((weak)) +float fauxclicky_pressed_note[2]; +__attribute__ ((weak)) +float fauxclicky_released_note[2]; +__attribute__ ((weak)) +float fauxclicky_beep_note[2]; + +bool fauxclicky_enabled; + +// +// tempo in BPM +// + +#ifndef FAUXCLICKY_TEMPO +#define FAUXCLICKY_TEMPO TEMPO_DEFAULT +#endif + +// beep on press +#define FAUXCLICKY_ACTION_PRESS fauxclicky_play(fauxclicky_pressed_note) + +// beep on release +#define FAUXCLICKY_ACTION_RELEASE fauxclicky_play(fauxclicky_released_note) + +// general purpose beep +#define FAUXCLICKY_BEEP fauxclicky_play(fauxclicky_beep_note) + +// enable +#define FAUXCLICKY_ON fauxclicky_enabled = true + +// disable +#define FAUXCLICKY_OFF do { \ + fauxclicky_enabled = false; \ + fauxclicky_stop(); \ +} while (0) + +// toggle +#define FAUXCLICKY_TOGGLE do { \ + if (fauxclicky_enabled) { \ + FAUXCLICKY_OFF; \ + } else { \ + FAUXCLICKY_ON; \ + } \ +} while (0) + +// +// pin configuration +// + +#ifndef FAUXCLICKY_CPU_PRESCALER +#define FAUXCLICKY_CPU_PRESCALER 8 +#endif + +#ifndef FAUXCLICKY_ENABLE_OUTPUT +#define FAUXCLICKY_ENABLE_OUTPUT TCCR3A |= _BV(COM3A1); +#endif + +#ifndef FAUXCLICKY_DISABLE_OUTPUT +#define FAUXCLICKY_DISABLE_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0)); +#endif + +#ifndef FAUXCLICKY_TIMER_PERIOD +#define FAUXCLICKY_TIMER_PERIOD ICR3 +#endif + +#ifndef FAUXCLICKY_DUTY_CYCLE +#define FAUXCLICKY_DUTY_CYCLE OCR3A +#endif + +// +// definitions +// + +void fauxclicky_init(void); +void fauxclicky_stop(void); +void fauxclicky_play(float note[2]); +void fauxclicky_check(void); + diff --git a/quantum/keycode_config.c b/quantum/keycode_config.c index 6d90781a..4f7bc525 100644 --- a/quantum/keycode_config.c +++ b/quantum/keycode_config.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "keycode_config.h" extern keymap_config_t keymap_config; @@ -71,4 +87,4 @@ uint16_t keycode_config(uint16_t keycode) { default: return keycode; } -} \ No newline at end of file +} diff --git a/quantum/keycode_config.h b/quantum/keycode_config.h index c15b0d32..293fefec 100644 --- a/quantum/keycode_config.h +++ b/quantum/keycode_config.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "eeconfig.h" #include "keycode.h" diff --git a/quantum/keymap.h b/quantum/keymap.h index a01bbfbd..5d64be19 100644 --- a/quantum/keymap.h +++ b/quantum/keymap.h @@ -1,5 +1,5 @@ /* -Copyright 2012,2013 Jun Wako +Copyright 2012-2016 Jun Wako This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,313 +38,16 @@ along with this program. If not, see . #define RESET QK_RESET #endif -/* translates key to keycode */ +#include "quantum_keycodes.h" + +// translates key to keycode uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); +// translates function id to action +uint16_t keymap_function_id_to_action( uint16_t function_id ); + extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; extern const uint16_t fn_actions[]; -enum quantum_keycodes { - // Ranges used in shortucuts - not to be used directly - QK_TMK = 0x0000, - QK_TMK_MAX = 0x00FF, - QK_MODS = 0x0100, - QK_LCTL = 0x0100, - QK_LSFT = 0x0200, - QK_LALT = 0x0400, - QK_LGUI = 0x0800, - QK_RCTL = 0x1100, - QK_RSFT = 0x1200, - QK_RALT = 0x1400, - QK_RGUI = 0x1800, - QK_MODS_MAX = 0x1FFF, - QK_FUNCTION = 0x2000, - QK_FUNCTION_MAX = 0x2FFF, - QK_MACRO = 0x3000, - QK_MACRO_MAX = 0x3FFF, - QK_LAYER_TAP = 0x4000, - QK_LAYER_TAP_MAX = 0x4FFF, - QK_TO = 0x5000, - QK_TO_MAX = 0x50FF, - QK_MOMENTARY = 0x5100, - QK_MOMENTARY_MAX = 0x51FF, - QK_DEF_LAYER = 0x5200, - QK_DEF_LAYER_MAX = 0x52FF, - QK_TOGGLE_LAYER = 0x5300, - QK_TOGGLE_LAYER_MAX = 0x53FF, - QK_ONE_SHOT_LAYER = 0x5400, - QK_ONE_SHOT_LAYER_MAX = 0x54FF, - QK_ONE_SHOT_MOD = 0x5500, - QK_ONE_SHOT_MOD_MAX = 0x55FF, -#ifndef DISABLE_CHORDING - QK_CHORDING = 0x5600, - QK_CHORDING_MAX = 0x56FF, -#endif - QK_MOD_TAP = 0x6000, - QK_MOD_TAP_MAX = 0x6FFF, - QK_TAP_DANCE = 0x7100, - QK_TAP_DANCE_MAX = 0x71FF, -#ifdef UNICODEMAP_ENABLE - QK_UNICODE_MAP = 0x7800, - QK_UNICODE_MAP_MAX = 0x7FFF, -#endif -#ifdef UNICODE_ENABLE - QK_UNICODE = 0x8000, - QK_UNICODE_MAX = 0xFFFF, -#endif - - // Loose keycodes - to be used directly - - RESET = 0x7000, - DEBUG, - MAGIC_SWAP_CONTROL_CAPSLOCK, - MAGIC_CAPSLOCK_TO_CONTROL, - MAGIC_SWAP_LALT_LGUI, - MAGIC_SWAP_RALT_RGUI, - MAGIC_NO_GUI, - MAGIC_SWAP_GRAVE_ESC, - MAGIC_SWAP_BACKSLASH_BACKSPACE, - MAGIC_HOST_NKRO, - MAGIC_SWAP_ALT_GUI, - MAGIC_UNSWAP_CONTROL_CAPSLOCK, - MAGIC_UNCAPSLOCK_TO_CONTROL, - MAGIC_UNSWAP_LALT_LGUI, - MAGIC_UNSWAP_RALT_RGUI, - MAGIC_UNNO_GUI, - MAGIC_UNSWAP_GRAVE_ESC, - MAGIC_UNSWAP_BACKSLASH_BACKSPACE, - MAGIC_UNHOST_NKRO, - MAGIC_UNSWAP_ALT_GUI, - MAGIC_TOGGLE_NKRO, - - // Leader key -#ifndef DISABLE_LEADER - KC_LEAD, -#endif - - // Audio on/off/toggle - AU_ON, - AU_OFF, - AU_TOG, - - // Music mode on/off/toggle - MU_ON, - MU_OFF, - MU_TOG, - - // Music voice iterate - MUV_IN, - MUV_DE, - - // Midi mode on/off - MIDI_ON, - MIDI_OFF, - - // Backlight functionality - BL_0, - BL_1, - BL_2, - BL_3, - BL_4, - BL_5, - BL_6, - BL_7, - BL_8, - BL_9, - BL_10, - BL_11, - BL_12, - BL_13, - BL_14, - BL_15, - BL_DEC, - BL_INC, - BL_TOGG, - BL_STEP, - - // RGB functionality - RGB_TOG, - RGB_MOD, - RGB_HUI, - RGB_HUD, - RGB_SAI, - RGB_SAD, - RGB_VAI, - RGB_VAD, - - // Left shift, open paren - KC_LSPO, - - // Right shift, close paren - KC_RSPC, - - // always leave at the end - SAFE_RANGE -}; - -// Ability to use mods in layouts -#define LCTL(kc) (kc | QK_LCTL) -#define LSFT(kc) (kc | QK_LSFT) -#define LALT(kc) (kc | QK_LALT) -#define LGUI(kc) (kc | QK_LGUI) -#define RCTL(kc) (kc | QK_RCTL) -#define RSFT(kc) (kc | QK_RSFT) -#define RALT(kc) (kc | QK_RALT) -#define RGUI(kc) (kc | QK_RGUI) - -#define HYPR(kc) (kc | QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI) -#define MEH(kc) (kc | QK_LCTL | QK_LSFT | QK_LALT) -#define LCAG(kc) (kc | QK_LCTL | QK_LALT | QK_LGUI) -#define ALTG(kc) (kc | QK_RCTL | QK_RALT) - -#define MOD_HYPR 0xf -#define MOD_MEH 0x7 - - -// Aliases for shifted symbols -// Each key has a 4-letter code, and some have longer aliases too. -// While the long aliases are descriptive, the 4-letter codes -// make for nicer grid layouts (everything lines up), and are -// the preferred style for Quantum. -#define KC_TILD LSFT(KC_GRV) // ~ -#define KC_TILDE KC_TILD - -#define KC_EXLM LSFT(KC_1) // ! -#define KC_EXCLAIM KC_EXLM - -#define KC_AT LSFT(KC_2) // @ - -#define KC_HASH LSFT(KC_3) // # - -#define KC_DLR LSFT(KC_4) // $ -#define KC_DOLLAR KC_DLR - -#define KC_PERC LSFT(KC_5) // % -#define KC_PERCENT KC_PERC - -#define KC_CIRC LSFT(KC_6) // ^ -#define KC_CIRCUMFLEX KC_CIRC - -#define KC_AMPR LSFT(KC_7) // & -#define KC_AMPERSAND KC_AMPR - -#define KC_ASTR LSFT(KC_8) // * -#define KC_ASTERISK KC_ASTR - -#define KC_LPRN LSFT(KC_9) // ( -#define KC_LEFT_PAREN KC_LPRN - -#define KC_RPRN LSFT(KC_0) // ) -#define KC_RIGHT_PAREN KC_RPRN - -#define KC_UNDS LSFT(KC_MINS) // _ -#define KC_UNDERSCORE KC_UNDS - -#define KC_PLUS LSFT(KC_EQL) // + - -#define KC_LCBR LSFT(KC_LBRC) // { -#define KC_LEFT_CURLY_BRACE KC_LCBR - -#define KC_RCBR LSFT(KC_RBRC) // } -#define KC_RIGHT_CURLY_BRACE KC_RCBR - -#define KC_LABK LSFT(KC_COMM) // < -#define KC_LEFT_ANGLE_BRACKET KC_LABK - -#define KC_RABK LSFT(KC_DOT) // > -#define KC_RIGHT_ANGLE_BRACKET KC_RABK - -#define KC_COLN LSFT(KC_SCLN) // : -#define KC_COLON KC_COLN - -#define KC_PIPE LSFT(KC_BSLS) // | - -#define KC_LT LSFT(KC_COMM) // < - -#define KC_GT LSFT(KC_DOT) // > - -#define KC_QUES LSFT(KC_SLSH) // ? -#define KC_QUESTION KC_QUES - -#define KC_DQT LSFT(KC_QUOT) // " -#define KC_DOUBLE_QUOTE KC_DQT -#define KC_DQUO KC_DQT - -#define KC_DELT KC_DELETE // Del key (four letter code) - -// Alias for function layers than expand past FN31 -#define FUNC(kc) (kc | QK_FUNCTION) - -// Aliases -#define S(kc) LSFT(kc) -#define F(kc) FUNC(kc) - -#define M(kc) (kc | QK_MACRO) - -#define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE) - -// L-ayer, T-ap - 256 keycode max, 16 layer max -#define LT(layer, kc) (kc | QK_LAYER_TAP | ((layer & 0xF) << 8)) - -#define AG_SWAP MAGIC_SWAP_ALT_GUI -#define AG_NORM MAGIC_UNSWAP_ALT_GUI - -#define BL_ON BL_9 -#define BL_OFF BL_0 - -#define MI_ON MIDI_ON -#define MI_OFF MIDI_OFF - -// GOTO layer - 16 layers max -// when: -// ON_PRESS = 1 -// ON_RELEASE = 2 -// Unless you have a good reason not to do so, prefer ON_PRESS (1) as your default. -// In fact, we changed it to assume ON_PRESS for sanity/simplicity. If needed, you can add your own -// keycode modeled after the old version, kept below for this. -/* #define TO(layer, when) (layer | QK_TO | (when << 0x4)) */ -#define TO(layer) (layer | QK_TO | (ON_PRESS << 0x4)) - -// Momentary switch layer - 256 layer max -#define MO(layer) (layer | QK_MOMENTARY) - -// Set default layer - 256 layer max -#define DF(layer) (layer | QK_DEF_LAYER) - -// Toggle to layer - 256 layer max -#define TG(layer) (layer | QK_TOGGLE_LAYER) - -// One-shot layer - 256 layer max -#define OSL(layer) (layer | QK_ONE_SHOT_LAYER) - -// One-shot mod -#define OSM(mod) (mod | QK_ONE_SHOT_MOD) - -// M-od, T-ap - 256 keycode max -#define MT(mod, kc) (kc | QK_MOD_TAP | ((mod & 0xF) << 8)) -#define CTL_T(kc) MT(MOD_LCTL, kc) -#define SFT_T(kc) MT(MOD_LSFT, kc) -#define ALT_T(kc) MT(MOD_LALT, kc) -#define GUI_T(kc) MT(MOD_LGUI, kc) -#define C_S_T(kc) MT((MOD_LCTL | MOD_LSFT), kc) // Control + Shift e.g. for gnome-terminal -#define MEH_T(kc) MT((MOD_LCTL | MOD_LSFT | MOD_LALT), kc) // Meh is a less hyper version of the Hyper key -- doesn't include Win or Cmd, so just alt+shift+ctrl -#define LCAG_T(kc) MT((MOD_LCTL | MOD_LALT | MOD_LGUI), kc) // Left control alt and gui -#define ALL_T(kc) MT((MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI), kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/ - -// Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap -#define KC_HYPR HYPR(KC_NO) -#define KC_MEH MEH(KC_NO) - -#ifdef UNICODE_ENABLE - // For sending unicode codes. - // You may not send codes over 7FFF -- this supports most of UTF8. - // To have a key that sends out Å’, go UC(0x0152) - #define UNICODE(n) (n | QK_UNICODE) - #define UC(n) UNICODE(n) -#endif - -#ifdef UNICODEMAP_ENABLE - #define X(n) (n | QK_UNICODE_MAP) -#endif #endif diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 833e5a8f..6cf4f031 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -1,5 +1,5 @@ /* -Copyright 2012,2013 Jun Wako +Copyright 2012-2017 Jun Wako This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,12 +48,10 @@ action_t action_for_key(uint8_t layer, keypos_t key) action_t action; uint8_t action_layer, when, mod; - // The arm-none-eabi compiler generates out of bounds warnings when using the fn_actions directly for some reason - const uint16_t* actions = fn_actions; switch (keycode) { case KC_FN0 ... KC_FN31: - action.code = pgm_read_word(&actions[FN_INDEX(keycode)]); + action.code = keymap_function_id_to_action(FN_INDEX(keycode)); break; case KC_A ... KC_EXSEL: case KC_LCTRL ... KC_RGUI: @@ -79,10 +77,13 @@ action_t action_for_key(uint8_t layer, keypos_t key) case QK_FUNCTION ... QK_FUNCTION_MAX: ; // Is a shortcut for function action_layer, pull last 12bits // This means we have 4,096 FN macros at our disposal - action.code = pgm_read_word(&actions[(int)keycode & 0xFFF]); + action.code = keymap_function_id_to_action( (int)keycode & 0xFFF ); break; case QK_MACRO ... QK_MACRO_MAX: - action.code = ACTION_MACRO(keycode & 0xFF); + if (keycode & 0x800) // tap macros have upper bit set + action.code = ACTION_MACRO_TAP(keycode & 0xFF); + else + action.code = ACTION_MACRO(keycode & 0xFF); break; case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); @@ -118,8 +119,11 @@ action_t action_for_key(uint8_t layer, keypos_t key) mod = keycode & 0xFF; action.code = ACTION_MODS_ONESHOT(mod); break; + case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: + action.code = ACTION_LAYER_TAP_TOGGLE(keycode & 0xFF); + break; case QK_MOD_TAP ... QK_MOD_TAP_MAX: - action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); + action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0x1F, keycode & 0xFF); break; #ifdef BACKLIGHT_ENABLE case BL_0 ... BL_15: @@ -163,9 +167,17 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } -/* translates key to keycode */ +// translates key to keycode +__attribute__ ((weak)) uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { // Read entire word (16bits) return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); } + +// translates function id to action +__attribute__ ((weak)) +uint16_t keymap_function_id_to_action( uint16_t function_id ) +{ + return pgm_read_word(&fn_actions[function_id]); +} diff --git a/quantum/keymap_extras/keymap_bepo.h b/quantum/keymap_extras/keymap_bepo.h index e5ef3955..013559e9 100644 --- a/quantum/keymap_extras/keymap_bepo.h +++ b/quantum/keymap_extras/keymap_bepo.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Didier Loiseau + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ /* Keymap macros for the French BÉPO layout - http://bepo.fr */ #ifndef KEYMAP_BEPO_H #define KEYMAP_BEPO_H diff --git a/quantum/keymap_extras/keymap_br_abnt2.h b/quantum/keymap_extras/keymap_br_abnt2.h new file mode 100644 index 00000000..b001139d --- /dev/null +++ b/quantum/keymap_extras/keymap_br_abnt2.h @@ -0,0 +1,74 @@ +/* Copyright 2017 Potiguar Faga + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEYMAP_BR_ABNT2_H +#define KEYMAP_BR_ABNT2_H + +#include "keymap_common.h" + +/* Scan codes for the Brazilian ABNT2 keyboard layout */ + +#define BR_CCDL KC_SCLN // Ç same scancode as ;: on US layout +#define BR_SCLN KC_SLSH // ;: same scancode as /? on US layout +#define BR_QUOT KC_GRV // '" same scancode as `~ on US layout +#define BR_TILD KC_QUOT // ~^ dead keys, same scancode as '" on US layout +#define BR_ACUT KC_LBRC // ´` dead keys, same scancode as [{ on US layout +#define BR_LBRC KC_RBRC // [{ same scancode as ]} on US layout +#define BR_RBRC KC_BSLS // ]} same scancode as \| on US layout +#define BR_BSLS KC_NUBS // \| uses the non-US hash scancode (#~, sometimes §±) +#define BR_SLSH KC_INT1 // /? uses the INTL1 scancode + +#define BR_COLN LSFT(BR_SCLN) // shifted : +#define BR_DQT LSFT(BR_QUOT) // shifted " +#define BR_CIRC LSFT(BR_TILD) // shifted ^ (dead key) +#define BR_GRAV LSFT(BR_ACUT) // shifted ` (dead key) +#define BR_LCBR LSFT(BR_LBRC) // shifted { +#define BR_RCBR LSFT(BR_RBRC) // shifted } +#define BR_PIPE LSFT(BR_BSLS) // shifted | +#define BR_QUES LSFT(BR_SLSH) // shifted ? +#define BR_TRMA LSFT(KC_6) // shifted ¨ (dead key - trema accent) + +// On the ABNT2 the keypad comma and the keypad dot scancodes are switched +// (presumably because in Brazil comma is used as the decimal separator) +#define BR_KPDT KC_KP_COMMA // keypad . +#define BR_KPCM KC_KP_DOT // keypad , + +#define BR_1UP LALT(KC_1) // 1 superscript ¹ alt+1 +#define BR_2UP LALT(KC_2) // 2 superscript ² alt+2 +#define BR_3UP LALT(KC_3) // 3 superscript ³ alt+3 +#define BR_PND LALT(KC_4) // Pound sign £ alt+4 +#define BR_CENT LALT(KC_5) // Cent sign ¢ alt+5 +#define BR_NOT LALT(KC_6) // Not sign ¬ alt+6 +#define BR_SECT LALT(KC_EQL) // Section sign § alt+= +#define BR_FORD LALT(BR_LBRC) // Feminine Ordinal Sign ª alt+[ +#define BR_MORD LALT(BR_RBRC) // Masculine Ordinal Sign º alt+] +#define BR_DGRE LALT(BR_SLSH) // Degree sign ° alt+/ + +#define BR_EURO LALT(KC_E) // Euro sign € alt+e +#define BR_NDTD LALT(BR_TILD) // Non-dead key tilde ~ alt+~ +#define BR_NDAC LALT(BR_ACUT) // Non-dead key acute accent ´ alt+´ +#define BR_NDGV LALT(BR_QUOT) // Non-dead key grave accent ` alt+' +#define BR_NDCR LALT(BR_CIRC) // Non-dead key circumflex accent ^ alt+^ (alt+shift+~) +#define BR_NDTR LALT(BR_TRMA) // Non-dead key trema accent ¨ alt+¨ (alt+shift+6) + +// For 101-key keyboard layouts, the ABNT2 layout allows +// the slash and question mark to be typed using alt+q and alt+w. +// The shortcuts are provided here for completeness' sake, +// but it's recommended to use BR_SLSH and BR_QUES instead +#define BR_ASLS LALT(KC_Q) +#define BR_AQST LALT(KC_W) + +#endif diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h index 0bc20c7b..1d45bee3 100644 --- a/quantum/keymap_extras/keymap_canadian_multilingual.h +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Didier Loiseau + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_CANADIAN_MULTILINGUAG_H #define KEYMAP_CANADIAN_MULTILINGUAG_H diff --git a/quantum/keymap_extras/keymap_colemak.h b/quantum/keymap_extras/keymap_colemak.h index b8d61574..2d3f9c06 100644 --- a/quantum/keymap_extras/keymap_colemak.h +++ b/quantum/keymap_extras/keymap_colemak.h @@ -1,3 +1,18 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_COLEMAK_H #define KEYMAP_COLEMAK_H diff --git a/quantum/keymap_extras/keymap_dvorak.h b/quantum/keymap_extras/keymap_dvorak.h index a0feed85..b1d5604b 100644 --- a/quantum/keymap_extras/keymap_dvorak.h +++ b/quantum/keymap_extras/keymap_dvorak.h @@ -1,3 +1,18 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_DVORAK_H #define KEYMAP_DVORAK_H diff --git a/quantum/keymap_extras/keymap_dvp.h b/quantum/keymap_extras/keymap_dvp.h index 83f49a52..50e2d1f4 100644 --- a/quantum/keymap_extras/keymap_dvp.h +++ b/quantum/keymap_extras/keymap_dvp.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Artyom Mironov + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef KEYMAP_DVP_H #define KEYMAP_DVP_H diff --git a/quantum/keymap_extras/keymap_fr_ch.h b/quantum/keymap_extras/keymap_fr_ch.h index 87d4bb24..c0ca832a 100644 --- a/quantum/keymap_extras/keymap_fr_ch.h +++ b/quantum/keymap_extras/keymap_fr_ch.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Vincent Pochet + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_FR_CH #define KEYMAP_FR_CH diff --git a/quantum/keymap_extras/keymap_french.h b/quantum/keymap_extras/keymap_french.h index 834c6965..3308dc5f 100644 --- a/quantum/keymap_extras/keymap_french.h +++ b/quantum/keymap_extras/keymap_french.h @@ -1,10 +1,27 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_FRENCH_H #define KEYMAP_FRENCH_H #include "keymap.h" // Alt gr +#ifndef ALGR #define ALGR(kc) RALT(kc) +#endif #define NO_ALGR KC_RALT // Normal characters @@ -72,7 +89,7 @@ #define FR_PIPE ALGR(KC_6) #define FR_GRV ALGR(KC_7) #define FR_BSLS ALGR(KC_8) -#define FR_CIRC ALGR(KC_9) +#define FR_CCIRC ALGR(KC_9) #define FR_AT ALGR(KC_0) #define FR_RBRC ALGR(FR_RPRN) #define FR_RCBR ALGR(FR_EQL) diff --git a/quantum/keymap_extras/keymap_french_osx.h b/quantum/keymap_extras/keymap_french_osx.h index 004d73ee..ecade3fe 100644 --- a/quantum/keymap_extras/keymap_french_osx.h +++ b/quantum/keymap_extras/keymap_french_osx.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Sébastien Pérochon + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_FRENCH_OSX_H #define KEYMAP_FRENCH_OSX_H @@ -74,4 +89,4 @@ #define FR_PIPE LSFT(LALT(KC_L)) #define FR_BSLS LSFT(LALT(FR_COLN)) -#endif \ No newline at end of file +#endif diff --git a/quantum/keymap_extras/keymap_german.h b/quantum/keymap_extras/keymap_german.h index 7e2e0ed4..e007c26e 100644 --- a/quantum/keymap_extras/keymap_german.h +++ b/quantum/keymap_extras/keymap_german.h @@ -1,3 +1,19 @@ +/* Copyright 2015-2016 Matthias Schmidtt + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef KEYMAP_GERMAN #define KEYMAP_GERMAN diff --git a/quantum/keymap_extras/keymap_german_ch.h b/quantum/keymap_extras/keymap_german_ch.h index b66d582a..8332e00a 100644 --- a/quantum/keymap_extras/keymap_german_ch.h +++ b/quantum/keymap_extras/keymap_german_ch.h @@ -1,3 +1,18 @@ +/* Copyright 2016 heartsekai + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_SWISS_GERMAN #define KEYMAP_SWISS_GERMAN diff --git a/quantum/keymap_extras/keymap_german_osx.h b/quantum/keymap_extras/keymap_german_osx.h index f63f0661..798bb757 100644 --- a/quantum/keymap_extras/keymap_german_osx.h +++ b/quantum/keymap_extras/keymap_german_osx.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Stephen Bösebeck + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_GERMAN_OSX #define KEYMAP_GERMAN_OSX diff --git a/quantum/keymap_extras/keymap_jp.h b/quantum/keymap_extras/keymap_jp.h new file mode 100644 index 00000000..fb74bce8 --- /dev/null +++ b/quantum/keymap_extras/keymap_jp.h @@ -0,0 +1,77 @@ +/* Copyright 2016 h-youhei + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * JP106-layout (Japanese Standard) + * + * For more information, see + * http://www2d.biglobe.ne.jp/~msyk/keyboard/layout/usbkeycode.html + * note: This website is written in Japanese. + */ + + +#ifndef KEYMAP_JP_H +#define KEYMAP_JP_H + + +#include "keymap.h" + + +#define JP_ZHTG KC_GRV // hankaku/zenkaku|kanzi +#define JP_YEN KC_INT3 // yen, | +#define JP_CIRC KC_EQL // ^, ~ +#define JP_AT KC_LBRC // @, ` +#define JP_LBRC KC_RBRC // [, { +#define JP_COLN KC_QUOT // :, * +#define JP_RBRC KC_NUHS // ], } +#define JP_BSLS KC_INT1 // \, _ +#define JP_MHEN KC_INT5 // muhenkan +#define JP_HENK KC_INT4 // henkan +#define JP_KANA KC_INT2 // katakana/hiragana|ro-mazi + + +//Aliases for shifted symbols +#define JP_DQT LSFT(KC_2) // " +#define JP_AMPR LSFT(KC_6) // & +#define JP_QUOT LSFT(KC_7) // ' +#define JP_LPRN LSFT(KC_8) // ( +#define JP_RPRN LSFT(KC_9) // ) +#define JP_EQL LSFT(KC_MINS) // = +#define JP_TILD LSFT(JP_CIRC) // ~ +#define JP_PIPE LSFT(JP_YEN) // | +#define JP_GRV LSFT(JP_AT) // ` +#define JP_LCBR LSFT(JP_LBRC) // { +#define JP_PLUS LSFT(KC_SCLN) // + +#define JP_ASTR LSFT(JP_COLN) // * +#define JP_RCBR LSFT(JP_RBRC) // } +#define JP_UNDS LSFT(JP_BSLS) // _ + + +// These symbols are correspond to US101-layout. +#define JP_MINS KC_MINS // - +#define JP_SCLN KC_SCLN // ; +#define JP_COMM KC_COMM // , +#define JP_DOT KC_DOT // . +#define JP_SLSH KC_SLSH // / +// shifted +#define JP_EXLM KC_EXLM // ! +#define JP_HASH KC_HASH // # +#define JP_DLR KC_DLR // $ +#define JP_PERC KC_PERC // % +#define JP_LT KC_LT // < +#define JP_GT KC_GT // > +#define JP_QUES KC_QUES // ? + + +#endif diff --git a/quantum/keymap_extras/keymap_neo2.h b/quantum/keymap_extras/keymap_neo2.h index 80439af3..174f4a6e 100644 --- a/quantum/keymap_extras/keymap_neo2.h +++ b/quantum/keymap_extras/keymap_neo2.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Matthias Schmitt + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_NEO2 #define KEYMAP_NEO2 diff --git a/quantum/keymap_extras/keymap_nordic.h b/quantum/keymap_extras/keymap_nordic.h index da5c8297..6b34db55 100644 --- a/quantum/keymap_extras/keymap_nordic.h +++ b/quantum/keymap_extras/keymap_nordic.h @@ -1,3 +1,18 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_NORDIC_H #define KEYMAP_NORDIC_H @@ -13,7 +28,7 @@ #define NO_ACUT KC_EQL #define NO_AM KC_LBRC -#define NO_QUOT KC_RBRC +#define NO_QUOT KC_RBRC // this is the "umlaut" char on Nordic keyboards, Apple layout #define NO_AE KC_SCLN #define NO_OSLH KC_QUOT #define NO_APOS KC_NUHS diff --git a/quantum/keymap_extras/keymap_norwegian.h b/quantum/keymap_extras/keymap_norwegian.h index 5c4e8c49..b7128973 100644 --- a/quantum/keymap_extras/keymap_norwegian.h +++ b/quantum/keymap_extras/keymap_norwegian.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_NORWEGIAN_H #define KEYMAP_NORWEGIAN_H diff --git a/quantum/keymap_extras/keymap_plover.h b/quantum/keymap_extras/keymap_plover.h index 9b88f7d8..de6d8c53 100644 --- a/quantum/keymap_extras/keymap_plover.h +++ b/quantum/keymap_extras/keymap_plover.h @@ -1,3 +1,18 @@ +/* Copyright 2016 James Kay + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_PLOVER_H #define KEYMAP_PLOVER_H diff --git a/quantum/keymap_extras/keymap_russian.h b/quantum/keymap_extras/keymap_russian.h deleted file mode 100644 index 237e9abd..00000000 --- a/quantum/keymap_extras/keymap_russian.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef KEYMAP_RUSSIAN_H -#define KEYMAP_RUSSIAN_H - -#include "keymap.h" - -// Normal Chracters // reg SHIFT -#define RU_A KC_F // а and Ð -#define RU_BE KC_COMM // б and Б -#define RU_VE KC_D // в and Ð’ -#define RU_GHE KC_U // г and Г -#define RU_DE KC_L // д and Д -#define RU_IE KC_T // е and Е -#define RU_IO KC_GRV // Ñ‘ and Ð -#define RU_ZHE KC_SCLN // ж and Ж -#define RU_ZE KC_P // з and З -#define RU_I KC_B // и and И -#define RU_SRT_I KC_Q // й and Й -#define RU_KA KC_R // к and К -#define RU_EL KC_K // л and Л -#define RU_EM KC_V // м and Ðœ -#define RU_EN KC_Y // н and Ð -#define RU_O KC_J // о and О -#define RU_PE KC_G // п and П -#define RU_ER KC_H // Ñ€ and Р -#define RU_ES KC_C // Ñ and С -#define RU_TE KC_N // Ñ‚ and Т -#define RU_U KC_E // у and У -#define RU_EF KC_A // Ñ„ and Ф -#define RU_HA KC_LBRC // Ñ… and Ð¥ -#define RU_TSE KC_W // ц and Ц -#define RU_CHE KC_X // ч and Ч -#define RU_SHA KC_I // ш and Ш -#define RU_SHCHA KC_O // щ and Щ -#define RU_HSIGN KC_RBRC // ÑŠ and Ъ -#define RU_YERU KC_S // Ñ‹ and Ы -#define RU_SSIGN KC_M // ÑŒ and Ь -#define RU_E KC_QUOT // Ñ and Э -#define RU_YU KC_DOT // ÑŽ and Ю -#define RU_YA KC_Z // Ñ and Я - -#define RU_1 KC_1 // 1 and ! -#define RU_2 KC_2 // 2 and " -#define RU_3 KC_3 // 3 and â„– -#define RU_4 KC_4 // 4 and ; -#define RU_5 KC_5 // 5 and % -#define RU_6 KC_6 // 6 and : -#define RU_7 KC_7 // 7 and ? -#define RU_8 KC_8 // 8 and * -#define RU_9 KC_9 // 9 and ( -#define RU_0 KC_0 // 0 and ) - -#define RU_MINS KC_MINS // - and _ -#define RU_EQL KC_EQL // = and + -#define RU_BSLS KC_BSLS // \ and / -#define RU_DOT KC_SLSH // . and , - -// Shifted Chracters -#define RU_EXLM LSFT(RU_1) // ! -#define RU_DQUT LSFT(RU_2) // " -#define RU_NMRO LSFT(RU_3) // â„– -#define RU_SCLN LSFT(RU_4) // ; -#define RU_PERC LSFT(RU_5) // % -#define RU_COLN LSFT(RU_6) // : -#define RU_QUES LSFT(RU_7) // ? -#define RU_ASTR LSFT(RU_8) // * -#define RU_LPRN LSFT(RU_9) // ( -#define RU_RPRN LSFT(RU_0) // ) - -#define RU_UNDR LSFT(RU_MINS) // _ -#define RU_PLUS LSFT(RU_EQL) // + -#define RU_SLSH LSFT(RU_BSLS) // / -#define RU_COMM LSFT(RU_DOT) // , - -// Alt Gr-ed characters -#define RU_RUBL RALT(RU_8) // ₽ - -#endif diff --git a/quantum/keymap_extras/keymap_spanish.h b/quantum/keymap_extras/keymap_spanish.h index 4ba568af..3a5787e9 100644 --- a/quantum/keymap_extras/keymap_spanish.h +++ b/quantum/keymap_extras/keymap_spanish.h @@ -1,3 +1,18 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_SPANISH_H #define KEYMAP_SPANISH_H diff --git a/quantum/keymap_extras/keymap_uk.h b/quantum/keymap_extras/keymap_uk.h index 00c87afc..9d02efe0 100644 --- a/quantum/keymap_extras/keymap_uk.h +++ b/quantum/keymap_extras/keymap_uk.h @@ -1,3 +1,18 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_UK_H #define KEYMAP_UK_H diff --git a/quantum/keymap_extras/keymap_unicode_cyrillic.h b/quantum/keymap_extras/keymap_unicode_cyrillic.h deleted file mode 100644 index a40626d9..00000000 --- a/quantum/keymap_extras/keymap_unicode_cyrillic.h +++ /dev/null @@ -1,163 +0,0 @@ -#ifndef KEYMAP_CYRILLIC_H -#define KEYMAP_CYRILLIC_H - -#include "keymap.h" - -/* - * This is based off of - * https://en.wikipedia.org/wiki/Cyrillic_script - * - * Unicode is iffy, a software implementation is preferred - */ - -// Capital Char russian/ukrainian/bulgarian -#define CY_A UC(0x0410) // Ð rus ukr bul -#define CY_BE UC(0x0411) // Б rus ukr bul -#define CY_VE UC(0x0412) // Ð’ rus ukr bul -#define CY_GHE UC(0x0413) // Г rus ukr bul -#define CY_GHEUP UC(0x0490) // Ò ukr -#define CY_DE UC(0x0414) // Д rus ukr bul -#define CY_DJE UC(0x0402) // Ђ -#define CY_GJE UC(0x0403) // Ѓ -#define CY_IE UC(0x0415) // Е rus ukr bul -#define CY_IO UC(0x0401) // Ð rus -#define CY_UIE UC(0x0404) // Є ukr -#define CY_ZHE UC(0x0416) // Ж rus ukr bul -#define CY_ZE UC(0x0417) // З rus ukr bul -#define CY_DZE UC(0x0405) // Ð… -#define CY_I UC(0x0418) // И rus ukr bul -#define CY_B_U_I UC(0x0406) // І ukr -#define CY_YI UC(0x0407) // Ї ukr -#define CY_SRT_I UC(0x0419) // Й rus ukr bul -#define CY_JE UC(0x0408) // Ј -#define CY_KA UC(0x041a) // К rus ukr bul -#define CY_EL UC(0x041b) // Л rus ukr bul -#define CY_LJE UC(0x0409) // Љ -#define CY_EM UC(0x041c) // Ðœ rus ukr bul -#define CY_EN UC(0x041d) // Ð rus ukr bul -#define CY_NJE UC(0x040a) // Њ -#define CY_O UC(0x041e) // О rus ukr bul -#define CY_PE UC(0x041f) // П rus ukr bul -#define CY_ER UC(0x0420) // Р rus ukr bul -#define CY_ES UC(0x0421) // С rus ukr bul -#define CY_TE UC(0x0422) // Т rus ukr bul -#define CY_TSHE UC(0x040b) // Ћ -#define CY_KJE UC(0x040c) // ÐŒ -#define CY_U UC(0x0423) // У rus ukr bul -#define CY_SRT_U UC(0x040e) // ÐŽ -#define CY_EF UC(0x0424) // Ф rus ukr bul -#define CY_HA UC(0x0425) // Ð¥ rus bul -#define CY_TSE UC(0x0426) // Ц rus ukr bul -#define CY_CHE UC(0x0427) // Ч rus ukr bul -#define CY_DZHE UC(0x040f) // Ð -#define CY_SHA UC(0x0428) // Ш rus ukr bul -#define CY_SHCHA UC(0x0429) // Щ rus ukr bul -#define CY_HSIGN UC(0x042a) // Ъ rus bul -#define CY_YERU UC(0x042b) // Ы rus -#define CY_SSIGN UC(0x042c) // Ь rus ukr bul -#define CY_E UC(0x042d) // Э rus -#define CY_YU UC(0x042e) // Ю rus ukr bul -#define CY_YA UC(0x042f) // Я rus ukr bul -// Important Cyrillic non-Slavic letters -#define CY_PALOCHKA UC(0x04c0) // Ó€ -#define CY_SCHWA UC(0x04d8) // Ó˜ -#define CY_GHE_S UC(0x0492) // Ò’ -#define CY_ZE_D UC(0x0498) // Ò˜ -#define CY_ES_D UC(0x04aa) // Òª -#define CY_BR_KA UC(0x04a0) // Ò  -#define CY_ZHE_D UC(0x0496) // Ò– -#define CY_KA_D UC(0x049a) // Òš -#define CY_EN_D UC(0x04a2) // Ò¢ -#define CY_ENGHE UC(0x04a4) // Ò¤ -#define CY_BRD_O UC(0x04e8) // Ó¨ -#define CY_STR_U UC(0x04ae) // Ò® -#define CY_S_U_S UC(0x04b0) // Ò° -#define CY_SHHA UC(0x04ba) // Òº -#define CY_HA_D UC(0x04b2) // Ò² - - -// Small -#define CY_a UC(0x0430) // a rus ukr bul -#define CY_be UC(0x0431) // б rus ukr bul -#define CY_ve UC(0x0432) // в rus ukr bul -#define CY_ghe UC(0x0433) // г rus ukr bul -#define CY_gheup UC(0x0491) // Ò‘ ukr -#define CY_de UC(0x0434) // д rus ukr bul -#define CY_dje UC(0x0452) // Ñ’ -#define CY_gje UC(0x0453) // Ñ“ -#define CY_ie UC(0x0435) // е rus ukr bul -#define CY_io UC(0x0451) // Ñ‘ rus -#define CY_uie UC(0x0454) // Ñ” ukr -#define CY_zhe UC(0x0436) // ж rus ukr bul -#define CY_ze UC(0x0437) // з rus ukr bul -#define CY_dze UC(0x0455) // Ñ• -#define CY_i UC(0x0438) // и rus ukr bul -#define CY_b_u_i UC(0x0456) // Ñ– ukr -#define CY_yi UC(0x0457) // Ñ— ukr -#define CY_srt_i UC(0x0439) // й rus ukr bul -#define CY_je UC(0x0458) // ј -#define CY_ka UC(0x043a) // к rus ukr bul -#define CY_el UC(0x043b) // л rus ukr bul -#define CY_lje UC(0x0459) // Ñ™ -#define CY_em UC(0x043c) // м rus ukr bul -#define CY_en UC(0x043d) // н rus ukr bul -#define CY_nje UC(0x045a) // Ñš -#define CY_o UC(0x043e) // о rus ukr bul -#define CY_pe UC(0x043f) // п rus ukr bul -#define CY_er UC(0x0440) // Ñ€ rus ukr bul -#define CY_es UC(0x0441) // Ñ rus ukr bul -#define CY_te UC(0x0442) // Ñ‚ rus ukr bul -#define CY_tshe UC(0x045b) // Ñ› -#define CY_kje UC(0x045c) // Ñœ -#define CY_u UC(0x0443) // у rus ukr bul -#define CY_srt_u UC(0x045e) // Ñž -#define CY_ef UC(0x0444) // Ñ„ rus ukr bul -#define CY_ha UC(0x0445) // Ñ… rus ukr bul -#define CY_tse UC(0x0446) // ц rus ukr bul -#define CY_che UC(0x0447) // ч rus ukr bul -#define CY_dzhe UC(0x045f) // ÑŸ -#define CY_sha UC(0x0448) // ш rus ukr bul -#define CY_shcha UC(0x0449) // щ rus ukr bul -#define CY_hsign UC(0x044a) // ÑŠ rus bul -#define CY_yeru UC(0x044b) // Ñ‹ rus -#define CY_ssign UC(0x044c) // ÑŒ rus ukr bul -#define CY_e UC(0x044d) // Ñ rus -#define CY_yu UC(0x044e) // ÑŽ rus ukr bul -#define CY_ya UC(0x044f) // Ñ rus ukr bul -// Important Cyrillic non-Slavic letters -#define CY_palochka UC(0x04cf) // Ó -#define CY_schwa UC(0x04d9) // Ó™ -#define CY_ghe_s UC(0x0493) // Ò“ -#define CY_ze_d UC(0x0499) // Ò™ -#define CY_es_d UC(0x04ab) // Ò« -#define CY_br_ka UC(0x04a1) // Ò¡ -#define CY_zhe_d UC(0x0497) // Ò— -#define CY_ka_d UC(0x049b) // Ò› -#define CY_en_d UC(0x04a3) // Ò£ -#define CY_enghe UC(0x04a5) // Ò¥ -#define CY_brd_o UC(0x04e9) // Ó© -#define CY_str_u UC(0x04af) // Ò¯ -#define CY_s_u_s UC(0x04b1) // Ò± -#define CY_shha UC(0x04bb) // Ò» -#define CY_ha_d UC(0x04b3) // Ò³ - - -// Extra -#define CY_slr_ve UC(0x1c80) // á²€ CYRILLIC SMALL LETTER ROUNDED VE -#define CY_ll_de UC(0x1c81) // á² CYRILLIC SMALL LETTER LONG-LEGGED DE -#define CY_ZEMLYA UC(0xa640) // Ꙁ CYRILLIC CAPITAL LETTER ZEMLYA -#define CY_zemlya UC(0xa641) // ê™ CYRILLIC SMALL LETTER ZEMLYA -#define CY_RV_DZE UC(0xa644) // Ꙅ CYRILLIC CAPITAL LETTER REVERSED DZE -#define CY_rv_DZE UC(0xa645) // ê™… CYRILLIC SMALL LETTER REVERSED DZE -#define CY_slw_es UC(0x1c83) // ᲃ CYRILLIC SMALL LETTER WIDE ES -#define CY_st_te UC(0x1c84) // ᲄ CYRILLIC SMALL LETTER TALL TE -#define CY_3l_te UC(0x1c85) // á²… CYRILLIC SMALL LETTER THREE-LEGGED TE -#define CY_thsign UC(0x1c86) // ᲆ CYRILLIC SMALL LETTER TALL HARD SIGN -#define CY_YERUBY UC(0xa650) // ê™ CYRILLIC CAPITAL LETTER YERU WITH BACK YER -#define CY_yeruby UC(0xa651) // ꙑ CYRILLIC SMALL LETTER YERU WITH BACK YER -#define CY_RUBL UC(0x20bd) // ₽ -#define CY_NMRO UC(0x2116) // â„– - -// The letters Zje and Sje are made for other letters and accent marks - -#endif diff --git a/quantum/light_ws2812.c b/quantum/light_ws2812.c index 401845e8..2506e3d8 100755 --- a/quantum/light_ws2812.c +++ b/quantum/light_ws2812.c @@ -7,7 +7,18 @@ * Jan 18th, 2014 v2.0b Initial Version * Nov 29th, 2015 v2.3 Added SK6812RGBW support * -* License: GNU GPL v2 (see License.txt) +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . */ #include "light_ws2812.h" @@ -16,14 +27,128 @@ #include #include "debug.h" +#ifdef RGBW_BB_TWI + +// Port for the I2C +#define I2C_DDR DDRD +#define I2C_PIN PIND +#define I2C_PORT PORTD + +// Pins to be used in the bit banging +#define I2C_CLK 0 +#define I2C_DAT 1 + +#define I2C_DATA_HI()\ +I2C_DDR &= ~ (1 << I2C_DAT);\ +I2C_PORT |= (1 << I2C_DAT); +#define I2C_DATA_LO()\ +I2C_DDR |= (1 << I2C_DAT);\ +I2C_PORT &= ~ (1 << I2C_DAT); + +#define I2C_CLOCK_HI()\ +I2C_DDR &= ~ (1 << I2C_CLK);\ +I2C_PORT |= (1 << I2C_CLK); +#define I2C_CLOCK_LO()\ +I2C_DDR |= (1 << I2C_CLK);\ +I2C_PORT &= ~ (1 << I2C_CLK); + +#define I2C_DELAY 1 + +void I2C_WriteBit(unsigned char c) +{ + if (c > 0) + { + I2C_DATA_HI(); + } + else + { + I2C_DATA_LO(); + } + + I2C_CLOCK_HI(); + _delay_us(I2C_DELAY); + + I2C_CLOCK_LO(); + _delay_us(I2C_DELAY); + + if (c > 0) + { + I2C_DATA_LO(); + } + + _delay_us(I2C_DELAY); +} + +// Inits bitbanging port, must be called before using the functions below +// +void I2C_Init(void) +{ + I2C_PORT &= ~ ((1 << I2C_DAT) | (1 << I2C_CLK)); + + I2C_CLOCK_HI(); + I2C_DATA_HI(); + + _delay_us(I2C_DELAY); +} + +// Send a START Condition +// +void I2C_Start(void) +{ + // set both to high at the same time + I2C_DDR &= ~ ((1 << I2C_DAT) | (1 << I2C_CLK)); + _delay_us(I2C_DELAY); + + I2C_DATA_LO(); + _delay_us(I2C_DELAY); + + I2C_CLOCK_LO(); + _delay_us(I2C_DELAY); +} + +// Send a STOP Condition +// +void I2C_Stop(void) +{ + I2C_CLOCK_HI(); + _delay_us(I2C_DELAY); + + I2C_DATA_HI(); + _delay_us(I2C_DELAY); +} + +// write a byte to the I2C slave device +// +unsigned char I2C_Write(unsigned char c) +{ + for (char i = 0; i < 8; i++) + { + I2C_WriteBit(c & 128); + + c <<= 1; + } + + + I2C_WriteBit(0); + _delay_us(I2C_DELAY); + _delay_us(I2C_DELAY); + + // _delay_us(I2C_DELAY); + //return I2C_ReadBit(); + return 0; +} + + +#endif + // Setleds for standard RGB -void inline ws2812_setleds(struct cRGB *ledarray, uint16_t leds) +void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) { // ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin)); ws2812_setleds_pin(ledarray,leds, _BV(RGB_DI_PIN & 0xF)); } -void inline ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pinmask) +void inline ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask) { // ws2812_DDRREG |= pinmask; // Enable DDR // new universal format (DDR) @@ -34,14 +159,41 @@ void inline ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pin } // Setleds for SK6812RGBW -void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds) +void inline ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t leds) { + + #ifdef RGBW_BB_TWI + uint8_t sreg_prev, twcr_prev; + sreg_prev=SREG; + twcr_prev=TWCR; + cli(); + TWCR &= ~(1<> 4) + 1) |= _BV(RGB_DI_PIN & 0xF); ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(RGB_DI_PIN & 0xF)); - _delay_us(80); + + + #ifndef RGBW_BB_TWI + _delay_us(80); + #endif } void ws2812_sendarray(uint8_t *data,uint16_t datlen) @@ -123,7 +275,7 @@ void inline ws2812_sendarray_mask(uint8_t *data,uint16_t datlen,uint8_t maskhi) cli(); while (datlen--) { - curbyte=*data++; + curbyte=(*data++); asm volatile( " ldi %0,8 \n\t" diff --git a/quantum/light_ws2812.h b/quantum/light_ws2812.h index 54eef22d..60924a0f 100755 --- a/quantum/light_ws2812.h +++ b/quantum/light_ws2812.h @@ -6,8 +6,18 @@ * * Please do not change this file! All configuration is handled in "ws2812_config.h" * - * License: GNU GPL v2 (see License.txt) - + + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #ifndef LIGHT_WS2812_H_ @@ -16,6 +26,14 @@ #include #include //#include "ws2812_config.h" +//#include "i2cmaster.h" + +#ifdef RGBW + #define LED_TYPE struct cRGBW +#else + #define LED_TYPE struct cRGB +#endif + /* * Structure of the LED array @@ -42,9 +60,9 @@ struct cRGBW { uint8_t g; uint8_t r; uint8_t b; uint8_t w;}; * - Wait 50�s to reset the LEDs */ -void ws2812_setleds (struct cRGB *ledarray, uint16_t number_of_leds); -void ws2812_setleds_pin (struct cRGB *ledarray, uint16_t number_of_leds,uint8_t pinmask); -void ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t number_of_leds); +void ws2812_setleds (LED_TYPE *ledarray, uint16_t number_of_leds); +void ws2812_setleds_pin (LED_TYPE *ledarray, uint16_t number_of_leds,uint8_t pinmask); +void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds); /* * Old interface / Internal functions diff --git a/quantum/matrix.c b/quantum/matrix.c index 3174e073..5337e262 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c @@ -1,6 +1,5 @@ /* -Copyright 2012 Jun Wako -Copyright 2014 Jack Humbert +Copyright 2012-2017 Jun Wako, Jack Humbert This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,37 +24,66 @@ along with this program. If not, see . #include "debug.h" #include "util.h" #include "matrix.h" +#include "timer.h" + /* Set 0 if debouncing isn't needed */ #ifndef DEBOUNCING_DELAY # define DEBOUNCING_DELAY 5 #endif -static uint8_t debouncing = DEBOUNCING_DELAY; +#if (DEBOUNCING_DELAY > 0) + static uint16_t debouncing_time; + static bool debouncing = false; +#endif + +#if (MATRIX_COLS <= 8) +# define print_matrix_header() print("\nr/c 01234567\n") +# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop(matrix[i]) +# define ROW_SHIFTER ((uint8_t)1) +#elif (MATRIX_COLS <= 16) +# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n") +# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop16(matrix[i]) +# define ROW_SHIFTER ((uint16_t)1) +#elif (MATRIX_COLS <= 32) +# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") +# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop32(matrix[i]) +# define ROW_SHIFTER ((uint32_t)1) +#endif + +#ifdef MATRIX_MASKED + extern const matrix_row_t matrix_mask[]; +#endif + +#if (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW) static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +#endif /* matrix state(1:on, 0:off) */ static matrix_row_t matrix[MATRIX_ROWS]; + static matrix_row_t matrix_debouncing[MATRIX_ROWS]; -#if DIODE_DIRECTION == ROW2COL - static matrix_row_t matrix_reversed[MATRIX_COLS]; - static matrix_row_t matrix_reversed_debouncing[MATRIX_COLS]; -#endif -#if MATRIX_COLS > 16 - #define SHIFTER 1UL -#else - #define SHIFTER 1 +#if (DIODE_DIRECTION == COL2ROW) + static void init_cols(void); + static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); + static void unselect_rows(void); + static void select_row(uint8_t row); + static void unselect_row(uint8_t row); +#elif (DIODE_DIRECTION == ROW2COL) + static void init_rows(void); + static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); + static void unselect_cols(void); + static void unselect_col(uint8_t col); + static void select_col(uint8_t col); #endif -static matrix_row_t read_cols(void); -static void init_cols(void); -static void unselect_rows(void); -static void select_row(uint8_t row); - __attribute__ ((weak)) void matrix_init_quantum(void) { matrix_init_kb(); @@ -95,7 +123,7 @@ uint8_t matrix_cols(void) { } // void matrix_power_up(void) { -// #if DIODE_DIRECTION == COL2ROW +// #if (DIODE_DIRECTION == COL2ROW) // for (int8_t r = MATRIX_ROWS - 1; r >= 0; --r) { // /* DDRxn */ // _SFR_IO8((row_pins[r] >> 4) + 1) |= _BV(row_pins[r] & 0xF); @@ -105,7 +133,7 @@ uint8_t matrix_cols(void) { // /* PORTxn */ // _SFR_IO8((col_pins[c] >> 4) + 2) |= _BV(col_pins[c] & 0xF); // } -// #else +// #elif (DIODE_DIRECTION == ROW2COL) // for (int8_t c = MATRIX_COLS - 1; c >= 0; --c) { // /* DDRxn */ // _SFR_IO8((col_pins[c] >> 4) + 1) |= _BV(col_pins[c] & 0xF); @@ -119,15 +147,21 @@ uint8_t matrix_cols(void) { // } void matrix_init(void) { + // To use PORTF disable JTAG with writing JTD bit twice within four cycles. - #ifdef __AVR_ATmega32U4__ + #if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega32U4__)) MCUCR |= _BV(JTD); MCUCR |= _BV(JTD); #endif // initialize row and col +#if (DIODE_DIRECTION == COL2ROW) unselect_rows(); init_cols(); +#elif (DIODE_DIRECTION == ROW2COL) + unselect_cols(); + init_rows(); +#endif // initialize matrix state: all keys off for (uint8_t i=0; i < MATRIX_ROWS; i++) { @@ -141,71 +175,60 @@ void matrix_init(void) { uint8_t matrix_scan(void) { -#if DIODE_DIRECTION == COL2ROW - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - select_row(i); - wait_us(30); // without this wait read unstable value. - matrix_row_t cols = read_cols(); - if (matrix_debouncing[i] != cols) { - matrix_debouncing[i] = cols; - if (debouncing) { - debug("bounce!: "); debug_hex(debouncing); debug("\n"); - } - debouncing = DEBOUNCING_DELAY; - } - unselect_rows(); - } +#if (DIODE_DIRECTION == COL2ROW) - if (debouncing) { - if (--debouncing) { - wait_ms(1); - } else { - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - matrix[i] = matrix_debouncing[i]; + // Set row, read cols + for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = read_cols_on_row(matrix_debouncing, current_row); + + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); } - } + +# else + read_cols_on_row(matrix, current_row); +# endif + } -#else - for (uint8_t i = 0; i < MATRIX_COLS; i++) { - select_row(i); - wait_us(30); // without this wait read unstable value. - matrix_row_t rows = read_cols(); - if (matrix_reversed_debouncing[i] != rows) { - matrix_reversed_debouncing[i] = rows; - if (debouncing) { - debug("bounce!: "); debug_hex(debouncing); debug("\n"); + +#elif (DIODE_DIRECTION == ROW2COL) + + // Set col, read rows + for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = read_rows_on_col(matrix_debouncing, current_col); + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); } - debouncing = DEBOUNCING_DELAY; - } - unselect_rows(); +# else + read_rows_on_col(matrix, current_col); +# endif + } - if (debouncing) { - if (--debouncing) { - wait_ms(1); - } else { - for (uint8_t i = 0; i < MATRIX_COLS; i++) { - matrix_reversed[i] = matrix_reversed_debouncing[i]; +#endif + +# if (DEBOUNCING_DELAY > 0) + if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; } + debouncing = false; } - } - for (uint8_t y = 0; y < MATRIX_ROWS; y++) { - matrix_row_t row = 0; - for (uint8_t x = 0; x < MATRIX_COLS; x++) { - row |= ((matrix_reversed[x] & (1<> y) << x; - } - matrix[y] = row; - } -#endif +# endif matrix_scan_quantum(); - return 1; } bool matrix_is_modified(void) { +#if (DEBOUNCING_DELAY > 0) if (debouncing) return false; +#endif return true; } @@ -218,15 +241,22 @@ bool matrix_is_on(uint8_t row, uint8_t col) inline matrix_row_t matrix_get_row(uint8_t row) { + // Matrix mask lets you disable switches in the returned matrix data. For example, if you have a + // switch blocker installed and the switch is always pressed. +#ifdef MATRIX_MASKED + return matrix[row] & matrix_mask[row]; +#else return matrix[row]; +#endif } void matrix_print(void) { - print("\nr/c 0123456789ABCDEF\n"); + print_matrix_header(); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { phex(row); print(": "); - pbin_reverse16(matrix_get_row(row)); + print_matrix_row(row); print("\n"); } } @@ -235,63 +265,148 @@ uint8_t matrix_key_count(void) { uint8_t count = 0; for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - count += bitpop16(matrix[i]); + count += matrix_bitpop(i); } return count; } + + +#if (DIODE_DIRECTION == COL2ROW) + static void init_cols(void) { -#if DIODE_DIRECTION == COL2ROW - for(int x = 0; x < MATRIX_COLS; x++) { - int pin = col_pins[x]; -#else - for(int x = 0; x < MATRIX_ROWS; x++) { - int pin = row_pins[x]; -#endif - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); + for(uint8_t x = 0; x < MATRIX_COLS; x++) { + uint8_t pin = col_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI } } -static matrix_row_t read_cols(void) +static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { - matrix_row_t result = 0; + // Store last value of row prior to reading + matrix_row_t last_row_value = current_matrix[current_row]; -#if DIODE_DIRECTION == COL2ROW - for(int x = 0; x < MATRIX_COLS; x++) { - int pin = col_pins[x]; -#else - for(int x = 0; x < MATRIX_ROWS; x++) { - int pin = row_pins[x]; -#endif - result |= (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) ? 0 : (SHIFTER << x); + // Clear data in matrix row + current_matrix[current_row] = 0; + + // Select row and wait for row selecton to stabilize + select_row(current_row); + wait_us(30); + + // For each col... + for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { + + // Select the col pin to read (active low) + uint8_t pin = col_pins[col_index]; + uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); + + // Populate the matrix row with the state of the col pin + current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); } - return result; + + // Unselect row + unselect_row(current_row); + + return (last_row_value != current_matrix[current_row]); +} + +static void select_row(uint8_t row) +{ + uint8_t pin = row_pins[row]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static void unselect_row(uint8_t row) +{ + uint8_t pin = row_pins[row]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI } static void unselect_rows(void) { -#if DIODE_DIRECTION == COL2ROW - for(int x = 0; x < MATRIX_ROWS; x++) { - int pin = row_pins[x]; -#else - for(int x = 0; x < MATRIX_COLS; x++) { - int pin = col_pins[x]; -#endif - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); + for(uint8_t x = 0; x < MATRIX_ROWS; x++) { + uint8_t pin = row_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI } } -static void select_row(uint8_t row) +#elif (DIODE_DIRECTION == ROW2COL) + +static void init_rows(void) { + for(uint8_t x = 0; x < MATRIX_ROWS; x++) { + uint8_t pin = row_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} -#if DIODE_DIRECTION == COL2ROW - int pin = row_pins[row]; -#else - int pin = col_pins[row]; -#endif - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); +static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) +{ + bool matrix_changed = false; + + // Select col and wait for col selecton to stabilize + select_col(current_col); + wait_us(30); + + // For each row... + for(uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) + { + + // Store last value of row prior to reading + matrix_row_t last_row_value = current_matrix[row_index]; + + // Check row pin state + if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) + { + // Pin LO, set col bit + current_matrix[row_index] |= (ROW_SHIFTER << current_col); + } + else + { + // Pin HI, clear col bit + current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); + } + + // Determine if the matrix changed state + if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) + { + matrix_changed = true; + } + } + + // Unselect col + unselect_col(current_col); + + return matrix_changed; } + +static void select_col(uint8_t col) +{ + uint8_t pin = col_pins[col]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static void unselect_col(uint8_t col) +{ + uint8_t pin = col_pins[col]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static void unselect_cols(void) +{ + for(uint8_t x = 0; x < MATRIX_COLS; x++) { + uint8_t pin = col_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +#endif diff --git a/quantum/pincontrol.h b/quantum/pincontrol.h new file mode 100644 index 00000000..d77977eb --- /dev/null +++ b/quantum/pincontrol.h @@ -0,0 +1,52 @@ +/* Copyright 2016 Wez Furlong + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#pragma once +// Some helpers for controlling gpio pins +#include + +enum { + PinDirectionInput = 0, + PinDirectionOutput = 1, + PinLevelHigh = 1, + PinLevelLow = 0, +}; + +// ex: pinMode(B0, PinDirectionOutput); +static inline void pinMode(uint8_t pin, int mode) { + uint8_t bv = _BV(pin & 0xf); + if (mode == PinDirectionOutput) { + _SFR_IO8((pin >> 4) + 1) |= bv; + } else { + _SFR_IO8((pin >> 4) + 1) &= ~bv; + _SFR_IO8((pin >> 4) + 2) &= ~bv; + } +} + +// ex: digitalWrite(B0, PinLevelHigh); +static inline void digitalWrite(uint8_t pin, int mode) { + uint8_t bv = _BV(pin & 0xf); + if (mode == PinLevelHigh) { + _SFR_IO8((pin >> 4) + 2) |= bv; + } else { + _SFR_IO8((pin >> 4) + 2) &= ~bv; + } +} + +// Return true if the pin is HIGH +// digitalRead(B0) +static inline bool digitalRead(uint8_t pin) { + return _SFR_IO8(pin >> 4) & _BV(pin & 0xf); +} diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c new file mode 100644 index 00000000..0b6380ed --- /dev/null +++ b/quantum/process_keycode/process_audio.c @@ -0,0 +1,62 @@ +#include "audio.h" +#include "process_audio.h" + +static float compute_freq_for_midi_note(uint8_t note) +{ + // https://en.wikipedia.org/wiki/MIDI_tuning_standard + return pow(2.0, (note - 69) / 12.0) * 440.0f; +} + +bool process_audio(uint16_t keycode, keyrecord_t *record) { + + if (keycode == AU_ON && record->event.pressed) { + audio_on(); + return false; + } + + if (keycode == AU_OFF && record->event.pressed) { + audio_off(); + return false; + } + + if (keycode == AU_TOG && record->event.pressed) { + if (is_audio_on()) + { + audio_off(); + } + else + { + audio_on(); + } + return false; + } + + if (keycode == MUV_IN && record->event.pressed) { + voice_iterate(); + music_scale_user(); + return false; + } + + if (keycode == MUV_DE && record->event.pressed) { + voice_deiterate(); + music_scale_user(); + return false; + } + + return true; +} + +void process_audio_noteon(uint8_t note) { + play_note(compute_freq_for_midi_note(note), 0xF); +} + +void process_audio_noteoff(uint8_t note) { + stop_note(compute_freq_for_midi_note(note)); +} + +void process_audio_all_notes_off(void) { + stop_all_notes(); +} + +__attribute__ ((weak)) +void audio_on_user() {} \ No newline at end of file diff --git a/quantum/process_keycode/process_audio.h b/quantum/process_keycode/process_audio.h new file mode 100644 index 00000000..7ac15b73 --- /dev/null +++ b/quantum/process_keycode/process_audio.h @@ -0,0 +1,11 @@ +#ifndef PROCESS_AUDIO_H +#define PROCESS_AUDIO_H + +bool process_audio(uint16_t keycode, keyrecord_t *record); +void process_audio_noteon(uint8_t note); +void process_audio_noteoff(uint8_t note); +void process_audio_all_notes_off(void); + +void audio_on_user(void); + +#endif \ No newline at end of file diff --git a/quantum/process_keycode/process_chording.c b/quantum/process_keycode/process_chording.c index d7814629..6c6ebe30 100644 --- a/quantum/process_keycode/process_chording.c +++ b/quantum/process_keycode/process_chording.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "process_chording.h" bool keys_chord(uint8_t keys[]) { @@ -57,4 +73,4 @@ bool process_chording(uint16_t keycode, keyrecord_t *record) { } } return true; -} \ No newline at end of file +} diff --git a/quantum/process_keycode/process_chording.h b/quantum/process_keycode/process_chording.h index 49c97db3..8c0f4862 100644 --- a/quantum/process_keycode/process_chording.h +++ b/quantum/process_keycode/process_chording.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_CHORDING_H #define PROCESS_CHORDING_H @@ -13,4 +29,4 @@ uint8_t chord_key_down = 0; bool process_chording(uint16_t keycode, keyrecord_t *record); -#endif \ No newline at end of file +#endif diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c new file mode 100644 index 00000000..58d45add --- /dev/null +++ b/quantum/process_keycode/process_combo.c @@ -0,0 +1,150 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "process_combo.h" +#include "print.h" + + +#define COMBO_TIMER_ELAPSED -1 + + +__attribute__ ((weak)) +combo_t key_combos[] = { + +}; + +__attribute__ ((weak)) +void process_combo_event(uint8_t combo_index, bool pressed) { + +} + +static uint8_t current_combo_index = 0; + +static inline void send_combo(uint16_t action, bool pressed) +{ + if (action) { + if (pressed) { + register_code16(action); + } else { + unregister_code16(action); + } + } else { + process_combo_event(current_combo_index, pressed); + } +} + +#define ALL_COMBO_KEYS_ARE_DOWN (((1<state) +#define NO_COMBO_KEYS_ARE_DOWN (0 == combo->state) +#define KEY_STATE_DOWN(key) do{ combo->state |= (1<state &= ~(1<keys; ;++count) { + uint16_t key = pgm_read_word(&keys[count]); + if (keycode == key) index = count; + if (COMBO_END == key) break; + } + + /* Return if not a combo key */ + if (-1 == (int8_t)index) return false; + + /* The combos timer is used to signal whether the combo is active */ + bool is_combo_active = COMBO_TIMER_ELAPSED == combo->timer ? false : true; + + if (record->event.pressed) { + KEY_STATE_DOWN(index); + + if (is_combo_active) { + if (ALL_COMBO_KEYS_ARE_DOWN) { /* Combo was pressed */ + send_combo(combo->keycode, true); + combo->timer = COMBO_TIMER_ELAPSED; + } else { /* Combo key was pressed */ + combo->timer = timer_read(); +#ifdef COMBO_ALLOW_ACTION_KEYS + combo->prev_record = *record; +#else + combo->prev_key = keycode; +#endif + } + } + } else { + if (ALL_COMBO_KEYS_ARE_DOWN) { /* Combo was released */ + send_combo(combo->keycode, false); + } + + if (is_combo_active) { /* Combo key was tapped */ +#ifdef COMBO_ALLOW_ACTION_KEYS + record->event.pressed = true; + process_action(record, store_or_get_action(record->event.pressed, record->event.key)); + record->event.pressed = false; + process_action(record, store_or_get_action(record->event.pressed, record->event.key)); +#else + register_code16(keycode); + send_keyboard_report(); + unregister_code16(keycode); +#endif + combo->timer = 0; + } + + KEY_STATE_UP(index); + } + + if (NO_COMBO_KEYS_ARE_DOWN) { + combo->timer = 0; + } + + return is_combo_active; +} + +bool process_combo(uint16_t keycode, keyrecord_t *record) +{ + bool is_combo_key = false; + + for (current_combo_index = 0; current_combo_index < COMBO_COUNT; ++current_combo_index) { + combo_t *combo = &key_combos[current_combo_index]; + is_combo_key |= process_single_combo(combo, keycode, record); + } + + return !is_combo_key; +} + +void matrix_scan_combo(void) +{ + for (int i = 0; i < COMBO_COUNT; ++i) { + combo_t *combo = &key_combos[i]; + if (combo->timer && + combo->timer != COMBO_TIMER_ELAPSED && + timer_elapsed(combo->timer) > COMBO_TERM) { + + /* This disables the combo, meaning key events for this + * combo will be handled by the next processors in the chain + */ + combo->timer = COMBO_TIMER_ELAPSED; + +#ifdef COMBO_ALLOW_ACTION_KEYS + process_action(&combo->prev_record, + store_or_get_action(combo->prev_record.event.pressed, + combo->prev_record.event.key)); +#else + unregister_code16(combo->prev_key); + register_code16(combo->prev_key); +#endif + } + } +} diff --git a/quantum/process_keycode/process_combo.h b/quantum/process_keycode/process_combo.h new file mode 100644 index 00000000..a5dbd788 --- /dev/null +++ b/quantum/process_keycode/process_combo.h @@ -0,0 +1,59 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef PROCESS_COMBO_H +#define PROCESS_COMBO_H + +#include +#include "progmem.h" +#include "quantum.h" + +typedef struct +{ + const uint16_t *keys; + uint16_t keycode; +#ifdef EXTRA_EXTRA_LONG_COMBOS + uint32_t state; +#elif EXTRA_LONG_COMBOS + uint16_t state; +#else + uint8_t state; +#endif + uint16_t timer; +#ifdef COMBO_ALLOW_ACTION_KEYS + keyrecord_t prev_record; +#else + uint16_t prev_key; +#endif +} combo_t; + + +#define COMBO(ck, ca) {.keys = &(ck)[0], .keycode = (ca)} +#define COMBO_ACTION(ck) {.keys = &(ck)[0]} + +#define COMBO_END 0 +#ifndef COMBO_COUNT +#define COMBO_COUNT 0 +#endif +#ifndef COMBO_TERM +#define COMBO_TERM TAPPING_TERM +#endif + +bool process_combo(uint16_t keycode, keyrecord_t *record); +void matrix_scan_combo(void); +void process_combo_event(uint8_t combo_index, bool pressed); + +#endif diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c index e53d221e..473906d6 100644 --- a/quantum/process_keycode/process_leader.c +++ b/quantum/process_keycode/process_leader.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "process_leader.h" __attribute__ ((weak)) @@ -35,4 +51,4 @@ bool process_leader(uint16_t keycode, keyrecord_t *record) { } } return true; -} \ No newline at end of file +} diff --git a/quantum/process_keycode/process_leader.h b/quantum/process_keycode/process_leader.h index c83db8ab..da7a3d2e 100644 --- a/quantum/process_keycode/process_leader.h +++ b/quantum/process_keycode/process_leader.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_LEADER_H #define PROCESS_LEADER_H @@ -20,4 +36,4 @@ void leader_end(void); #define LEADER_EXTERNS() extern bool leading; extern uint16_t leader_time; extern uint16_t leader_sequence[5]; extern uint8_t leader_sequence_size #define LEADER_DICTIONARY() if (leading && timer_elapsed(leader_time) > LEADER_TIMEOUT) -#endif \ No newline at end of file +#endif diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 577dad43..9184feaa 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -1,68 +1,253 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "process_midi.h" -bool midi_activated = false; -uint8_t midi_starting_note = 0x0C; -int midi_offset = 7; - -bool process_midi(uint16_t keycode, keyrecord_t *record) { - if (keycode == MI_ON && record->event.pressed) { - midi_activated = true; -#ifdef AUDIO_ENABLE - music_scale_user(); -#endif - return false; - } +#ifdef MIDI_ENABLE +#include "midi.h" + +#ifdef MIDI_BASIC + +void process_midi_basic_noteon(uint8_t note) +{ + midi_send_noteon(&midi_device, 0, note, 128); +} + +void process_midi_basic_noteoff(uint8_t note) +{ + midi_send_noteoff(&midi_device, 0, note, 0); +} + +void process_midi_all_notes_off(void) +{ + midi_send_cc(&midi_device, 0, 0x7B, 0); +} + +#endif // MIDI_BASIC + +#ifdef MIDI_ADVANCED + +#include "timer.h" + +static uint8_t tone_status[MIDI_TONE_COUNT]; + +static uint8_t midi_modulation; +static int8_t midi_modulation_step; +static uint16_t midi_modulation_timer; + +inline uint8_t compute_velocity(uint8_t setting) +{ + return (setting + 1) * (128 / (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN + 1)); +} - if (keycode == MI_OFF && record->event.pressed) { - midi_activated = false; - midi_send_cc(&midi_device, 0, 0x7B, 0); - return false; +void midi_init(void) +{ + midi_config.octave = MI_OCT_2 - MIDI_OCTAVE_MIN; + midi_config.transpose = 0; + midi_config.velocity = (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN); + midi_config.channel = 0; + midi_config.modulation_interval = 8; + + for (uint8_t i = 0; i < MIDI_TONE_COUNT; i++) + { + tone_status[i] = MIDI_INVALID_NOTE; } - if (midi_activated) { - if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) { - if (record->event.pressed) { - midi_starting_note++; // Change key - midi_send_cc(&midi_device, 0, 0x7B, 0); - } - return false; - } - if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) { - if (record->event.pressed) { - midi_starting_note--; // Change key - midi_send_cc(&midi_device, 0, 0x7B, 0); - } - return false; - } - if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { - midi_offset++; // Change scale - midi_send_cc(&midi_device, 0, 0x7B, 0); - return false; - } - if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { - midi_offset--; // Change scale - midi_send_cc(&midi_device, 0, 0x7B, 0); - return false; - } - // basic - // uint8_t note = (midi_starting_note + SCALE[record->event.key.col + midi_offset])+12*(MATRIX_ROWS - record->event.key.row); - // advanced - // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+12*(MATRIX_ROWS - record->event.key.row); - // guitar - uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+5*(MATRIX_ROWS - record->event.key.row); - // violin - // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+7*(MATRIX_ROWS - record->event.key.row); - - if (record->event.pressed) { - // midi_send_noteon(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127); - midi_send_noteon(&midi_device, 0, note, 127); - } else { - // midi_send_noteoff(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127); - midi_send_noteoff(&midi_device, 0, note, 127); - } - - if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through - return false; + midi_modulation = 0; + midi_modulation_step = 0; + midi_modulation_timer = 0; +} + +void midi_task(void) +{ + if (timer_elapsed(midi_modulation_timer) < midi_config.modulation_interval) + return; + midi_modulation_timer = timer_read(); + + if (midi_modulation_step != 0) + { + dprintf("midi modulation %d\n", midi_modulation); + midi_send_cc(&midi_device, midi_config.channel, 0x1, midi_modulation); + + if (midi_modulation_step < 0 && midi_modulation < -midi_modulation_step) { + midi_modulation = 0; + midi_modulation_step = 0; + return; + } + + midi_modulation += midi_modulation_step; + + if (midi_modulation > 127) + midi_modulation = 127; } - return true; } + +uint8_t midi_compute_note(uint16_t keycode) +{ + return 12 * midi_config.octave + (keycode - MIDI_TONE_MIN) + midi_config.transpose; +} + +bool process_midi(uint16_t keycode, keyrecord_t *record) +{ + switch (keycode) { + case MIDI_TONE_MIN ... MIDI_TONE_MAX: + { + uint8_t channel = midi_config.channel; + uint8_t tone = keycode - MIDI_TONE_MIN; + uint8_t velocity = compute_velocity(midi_config.velocity); + if (record->event.pressed) { + uint8_t note = midi_compute_note(keycode); + midi_send_noteon(&midi_device, channel, note, velocity); + dprintf("midi noteon channel:%d note:%d velocity:%d\n", channel, note, velocity); + tone_status[tone] = note; + } + else { + uint8_t note = tone_status[tone]; + if (note != MIDI_INVALID_NOTE) + { + midi_send_noteoff(&midi_device, channel, note, velocity); + dprintf("midi noteoff channel:%d note:%d velocity:%d\n", channel, note, velocity); + } + tone_status[tone] = MIDI_INVALID_NOTE; + } + return false; + } + case MIDI_OCTAVE_MIN ... MIDI_OCTAVE_MAX: + if (record->event.pressed) { + midi_config.octave = keycode - MIDI_OCTAVE_MIN; + dprintf("midi octave %d\n", midi_config.octave); + } + return false; + case MI_OCTD: + if (record->event.pressed && midi_config.octave > 0) { + midi_config.octave--; + dprintf("midi octave %d\n", midi_config.octave); + } + return false; + case MI_OCTU: + if (record->event.pressed && midi_config.octave < (MIDI_OCTAVE_MAX - MIDI_OCTAVE_MIN)) { + midi_config.octave++; + dprintf("midi octave %d\n", midi_config.octave); + } + return false; + case MIDI_TRANSPOSE_MIN ... MIDI_TRANSPOSE_MAX: + if (record->event.pressed) { + midi_config.transpose = keycode - MI_TRNS_0; + dprintf("midi transpose %d\n", midi_config.transpose); + } + return false; + case MI_TRNSD: + if (record->event.pressed && midi_config.transpose > (MIDI_TRANSPOSE_MIN - MI_TRNS_0)) { + midi_config.transpose--; + dprintf("midi transpose %d\n", midi_config.transpose); + } + return false; + case MI_TRNSU: + if (record->event.pressed && midi_config.transpose < (MIDI_TRANSPOSE_MAX - MI_TRNS_0)) { + const bool positive = midi_config.transpose > 0; + midi_config.transpose++; + if (positive && midi_config.transpose < 0) + midi_config.transpose--; + dprintf("midi transpose %d\n", midi_config.transpose); + } + return false; + case MIDI_VELOCITY_MIN ... MIDI_VELOCITY_MAX: + if (record->event.pressed) { + midi_config.velocity = keycode - MIDI_VELOCITY_MIN; + dprintf("midi velocity %d\n", midi_config.velocity); + } + return false; + case MI_VELD: + if (record->event.pressed && midi_config.velocity > 0) { + midi_config.velocity--; + dprintf("midi velocity %d\n", midi_config.velocity); + } + return false; + case MI_VELU: + if (record->event.pressed) { + midi_config.velocity++; + dprintf("midi velocity %d\n", midi_config.velocity); + } + return false; + case MIDI_CHANNEL_MIN ... MIDI_CHANNEL_MAX: + if (record->event.pressed) { + midi_config.channel = keycode - MIDI_CHANNEL_MIN; + dprintf("midi channel %d\n", midi_config.channel); + } + return false; + case MI_CHD: + if (record->event.pressed) { + midi_config.channel--; + dprintf("midi channel %d\n", midi_config.channel); + } + return false; + case MI_CHU: + if (record->event.pressed) { + midi_config.channel++; + dprintf("midi channel %d\n", midi_config.channel); + } + return false; + case MI_ALLOFF: + if (record->event.pressed) { + midi_send_cc(&midi_device, midi_config.channel, 0x7B, 0); + dprintf("midi all notes off\n"); + } + return false; + case MI_SUS: + midi_send_cc(&midi_device, midi_config.channel, 0x40, record->event.pressed ? 127 : 0); + dprintf("midi sustain %d\n", record->event.pressed); + return false; + case MI_PORT: + midi_send_cc(&midi_device, midi_config.channel, 0x41, record->event.pressed ? 127 : 0); + dprintf("midi portamento %d\n", record->event.pressed); + return false; + case MI_SOST: + midi_send_cc(&midi_device, midi_config.channel, 0x42, record->event.pressed ? 127 : 0); + dprintf("midi sostenuto %d\n", record->event.pressed); + return false; + case MI_SOFT: + midi_send_cc(&midi_device, midi_config.channel, 0x43, record->event.pressed ? 127 : 0); + dprintf("midi soft %d\n", record->event.pressed); + return false; + case MI_LEG: + midi_send_cc(&midi_device, midi_config.channel, 0x43, record->event.pressed ? 127 : 0); + dprintf("midi legato %d\n", record->event.pressed); + return false; + case MI_MOD: + midi_modulation_step = record->event.pressed ? 1 : -1; + return false; + case MI_MODSD: + if (record->event.pressed) { + midi_config.modulation_interval++; + // prevent overflow + if (midi_config.modulation_interval == 0) + midi_config.modulation_interval--; + dprintf("midi modulation interval %d\n", midi_config.modulation_interval); + } + return false; + case MI_MODSU: + if (record->event.pressed && midi_config.modulation_interval > 0) { + midi_config.modulation_interval--; + dprintf("midi modulation interval %d\n", midi_config.modulation_interval); + } + return false; + }; + + return true; +} + +#endif // MIDI_ADVANCED + +#endif // MIDI_ENABLE diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h index acd4fc1b..ccac8981 100644 --- a/quantum/process_keycode/process_midi.h +++ b/quantum/process_keycode/process_midi.h @@ -1,207 +1,56 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_MIDI_H #define PROCESS_MIDI_H #include "quantum.h" -bool process_midi(uint16_t keycode, keyrecord_t *record); +#ifdef MIDI_ENABLE + +#ifdef MIDI_BASIC +void process_midi_basic_noteon(uint8_t note); +void process_midi_basic_noteoff(uint8_t note); +void process_midi_all_notes_off(void); +#endif -#define MIDI(n) ((n) | 0x6000) -#define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000 +#ifdef MIDI_ADVANCED +typedef union { + uint32_t raw; + struct { + uint8_t octave :4; + int8_t transpose :4; + uint8_t velocity :4; + uint8_t channel :4; + uint8_t modulation_interval :4; + }; +} midi_config_t; + +midi_config_t midi_config; + +void midi_init(void); +void midi_task(void); +bool process_midi(uint16_t keycode, keyrecord_t *record); -#define CHNL(note, channel) (note + (channel << 8)) +#define MIDI_INVALID_NOTE 0xFF +#define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1) -#define SCALE (int8_t []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ - 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \ - 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \ - 0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \ - 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), } +uint8_t midi_compute_note(uint16_t keycode); +#endif // MIDI_ADVANCED -#define N_CN1 (0x600C + (12 * -1) + 0 ) -#define N_CN1S (0x600C + (12 * -1) + 1 ) -#define N_DN1F (0x600C + (12 * -1) + 1 ) -#define N_DN1 (0x600C + (12 * -1) + 2 ) -#define N_DN1S (0x600C + (12 * -1) + 3 ) -#define N_EN1F (0x600C + (12 * -1) + 3 ) -#define N_EN1 (0x600C + (12 * -1) + 4 ) -#define N_FN1 (0x600C + (12 * -1) + 5 ) -#define N_FN1S (0x600C + (12 * -1) + 6 ) -#define N_GN1F (0x600C + (12 * -1) + 6 ) -#define N_GN1 (0x600C + (12 * -1) + 7 ) -#define N_GN1S (0x600C + (12 * -1) + 8 ) -#define N_AN1F (0x600C + (12 * -1) + 8 ) -#define N_AN1 (0x600C + (12 * -1) + 9 ) -#define N_AN1S (0x600C + (12 * -1) + 10) -#define N_BN1F (0x600C + (12 * -1) + 10) -#define N_BN1 (0x600C + (12 * -1) + 11) -#define N_C0 (0x600C + (12 * 0) + 0 ) -#define N_C0S (0x600C + (12 * 0) + 1 ) -#define N_D0F (0x600C + (12 * 0) + 1 ) -#define N_D0 (0x600C + (12 * 0) + 2 ) -#define N_D0S (0x600C + (12 * 0) + 3 ) -#define N_E0F (0x600C + (12 * 0) + 3 ) -#define N_E0 (0x600C + (12 * 0) + 4 ) -#define N_F0 (0x600C + (12 * 0) + 5 ) -#define N_F0S (0x600C + (12 * 0) + 6 ) -#define N_G0F (0x600C + (12 * 0) + 6 ) -#define N_G0 (0x600C + (12 * 0) + 7 ) -#define N_G0S (0x600C + (12 * 0) + 8 ) -#define N_A0F (0x600C + (12 * 0) + 8 ) -#define N_A0 (0x600C + (12 * 0) + 9 ) -#define N_A0S (0x600C + (12 * 0) + 10) -#define N_B0F (0x600C + (12 * 0) + 10) -#define N_B0 (0x600C + (12 * 0) + 11) -#define N_C1 (0x600C + (12 * 1) + 0 ) -#define N_C1S (0x600C + (12 * 1) + 1 ) -#define N_D1F (0x600C + (12 * 1) + 1 ) -#define N_D1 (0x600C + (12 * 1) + 2 ) -#define N_D1S (0x600C + (12 * 1) + 3 ) -#define N_E1F (0x600C + (12 * 1) + 3 ) -#define N_E1 (0x600C + (12 * 1) + 4 ) -#define N_F1 (0x600C + (12 * 1) + 5 ) -#define N_F1S (0x600C + (12 * 1) + 6 ) -#define N_G1F (0x600C + (12 * 1) + 6 ) -#define N_G1 (0x600C + (12 * 1) + 7 ) -#define N_G1S (0x600C + (12 * 1) + 8 ) -#define N_A1F (0x600C + (12 * 1) + 8 ) -#define N_A1 (0x600C + (12 * 1) + 9 ) -#define N_A1S (0x600C + (12 * 1) + 10) -#define N_B1F (0x600C + (12 * 1) + 10) -#define N_B1 (0x600C + (12 * 1) + 11) -#define N_C2 (0x600C + (12 * 2) + 0 ) -#define N_C2S (0x600C + (12 * 2) + 1 ) -#define N_D2F (0x600C + (12 * 2) + 1 ) -#define N_D2 (0x600C + (12 * 2) + 2 ) -#define N_D2S (0x600C + (12 * 2) + 3 ) -#define N_E2F (0x600C + (12 * 2) + 3 ) -#define N_E2 (0x600C + (12 * 2) + 4 ) -#define N_F2 (0x600C + (12 * 2) + 5 ) -#define N_F2S (0x600C + (12 * 2) + 6 ) -#define N_G2F (0x600C + (12 * 2) + 6 ) -#define N_G2 (0x600C + (12 * 2) + 7 ) -#define N_G2S (0x600C + (12 * 2) + 8 ) -#define N_A2F (0x600C + (12 * 2) + 8 ) -#define N_A2 (0x600C + (12 * 2) + 9 ) -#define N_A2S (0x600C + (12 * 2) + 10) -#define N_B2F (0x600C + (12 * 2) + 10) -#define N_B2 (0x600C + (12 * 2) + 11) -#define N_C3 (0x600C + (12 * 3) + 0 ) -#define N_C3S (0x600C + (12 * 3) + 1 ) -#define N_D3F (0x600C + (12 * 3) + 1 ) -#define N_D3 (0x600C + (12 * 3) + 2 ) -#define N_D3S (0x600C + (12 * 3) + 3 ) -#define N_E3F (0x600C + (12 * 3) + 3 ) -#define N_E3 (0x600C + (12 * 3) + 4 ) -#define N_F3 (0x600C + (12 * 3) + 5 ) -#define N_F3S (0x600C + (12 * 3) + 6 ) -#define N_G3F (0x600C + (12 * 3) + 6 ) -#define N_G3 (0x600C + (12 * 3) + 7 ) -#define N_G3S (0x600C + (12 * 3) + 8 ) -#define N_A3F (0x600C + (12 * 3) + 8 ) -#define N_A3 (0x600C + (12 * 3) + 9 ) -#define N_A3S (0x600C + (12 * 3) + 10) -#define N_B3F (0x600C + (12 * 3) + 10) -#define N_B3 (0x600C + (12 * 3) + 11) -#define N_C4 (0x600C + (12 * 4) + 0 ) -#define N_C4S (0x600C + (12 * 4) + 1 ) -#define N_D4F (0x600C + (12 * 4) + 1 ) -#define N_D4 (0x600C + (12 * 4) + 2 ) -#define N_D4S (0x600C + (12 * 4) + 3 ) -#define N_E4F (0x600C + (12 * 4) + 3 ) -#define N_E4 (0x600C + (12 * 4) + 4 ) -#define N_F4 (0x600C + (12 * 4) + 5 ) -#define N_F4S (0x600C + (12 * 4) + 6 ) -#define N_G4F (0x600C + (12 * 4) + 6 ) -#define N_G4 (0x600C + (12 * 4) + 7 ) -#define N_G4S (0x600C + (12 * 4) + 8 ) -#define N_A4F (0x600C + (12 * 4) + 8 ) -#define N_A4 (0x600C + (12 * 4) + 9 ) -#define N_A4S (0x600C + (12 * 4) + 10) -#define N_B4F (0x600C + (12 * 4) + 10) -#define N_B4 (0x600C + (12 * 4) + 11) -#define N_C5 (0x600C + (12 * 5) + 0 ) -#define N_C5S (0x600C + (12 * 5) + 1 ) -#define N_D5F (0x600C + (12 * 5) + 1 ) -#define N_D5 (0x600C + (12 * 5) + 2 ) -#define N_D5S (0x600C + (12 * 5) + 3 ) -#define N_E5F (0x600C + (12 * 5) + 3 ) -#define N_E5 (0x600C + (12 * 5) + 4 ) -#define N_F5 (0x600C + (12 * 5) + 5 ) -#define N_F5S (0x600C + (12 * 5) + 6 ) -#define N_G5F (0x600C + (12 * 5) + 6 ) -#define N_G5 (0x600C + (12 * 5) + 7 ) -#define N_G5S (0x600C + (12 * 5) + 8 ) -#define N_A5F (0x600C + (12 * 5) + 8 ) -#define N_A5 (0x600C + (12 * 5) + 9 ) -#define N_A5S (0x600C + (12 * 5) + 10) -#define N_B5F (0x600C + (12 * 5) + 10) -#define N_B5 (0x600C + (12 * 5) + 11) -#define N_C6 (0x600C + (12 * 6) + 0 ) -#define N_C6S (0x600C + (12 * 6) + 1 ) -#define N_D6F (0x600C + (12 * 6) + 1 ) -#define N_D6 (0x600C + (12 * 6) + 2 ) -#define N_D6S (0x600C + (12 * 6) + 3 ) -#define N_E6F (0x600C + (12 * 6) + 3 ) -#define N_E6 (0x600C + (12 * 6) + 4 ) -#define N_F6 (0x600C + (12 * 6) + 5 ) -#define N_F6S (0x600C + (12 * 6) + 6 ) -#define N_G6F (0x600C + (12 * 6) + 6 ) -#define N_G6 (0x600C + (12 * 6) + 7 ) -#define N_G6S (0x600C + (12 * 6) + 8 ) -#define N_A6F (0x600C + (12 * 6) + 8 ) -#define N_A6 (0x600C + (12 * 6) + 9 ) -#define N_A6S (0x600C + (12 * 6) + 10) -#define N_B6F (0x600C + (12 * 6) + 10) -#define N_B6 (0x600C + (12 * 6) + 11) -#define N_C7 (0x600C + (12 * 7) + 0 ) -#define N_C7S (0x600C + (12 * 7) + 1 ) -#define N_D7F (0x600C + (12 * 7) + 1 ) -#define N_D7 (0x600C + (12 * 7) + 2 ) -#define N_D7S (0x600C + (12 * 7) + 3 ) -#define N_E7F (0x600C + (12 * 7) + 3 ) -#define N_E7 (0x600C + (12 * 7) + 4 ) -#define N_F7 (0x600C + (12 * 7) + 5 ) -#define N_F7S (0x600C + (12 * 7) + 6 ) -#define N_G7F (0x600C + (12 * 7) + 6 ) -#define N_G7 (0x600C + (12 * 7) + 7 ) -#define N_G7S (0x600C + (12 * 7) + 8 ) -#define N_A7F (0x600C + (12 * 7) + 8 ) -#define N_A7 (0x600C + (12 * 7) + 9 ) -#define N_A7S (0x600C + (12 * 7) + 10) -#define N_B7F (0x600C + (12 * 7) + 10) -#define N_B7 (0x600C + (12 * 7) + 11) -#define N_C8 (0x600C + (12 * 8) + 0 ) -#define N_C8S (0x600C + (12 * 8) + 1 ) -#define N_D8F (0x600C + (12 * 8) + 1 ) -#define N_D8 (0x600C + (12 * 8) + 2 ) -#define N_D8S (0x600C + (12 * 8) + 3 ) -#define N_E8F (0x600C + (12 * 8) + 3 ) -#define N_E8 (0x600C + (12 * 8) + 4 ) -#define N_F8 (0x600C + (12 * 8) + 5 ) -#define N_F8S (0x600C + (12 * 8) + 6 ) -#define N_G8F (0x600C + (12 * 8) + 6 ) -#define N_G8 (0x600C + (12 * 8) + 7 ) -#define N_G8S (0x600C + (12 * 8) + 8 ) -#define N_A8F (0x600C + (12 * 8) + 8 ) -#define N_A8 (0x600C + (12 * 8) + 9 ) -#define N_A8S (0x600C + (12 * 8) + 10) -#define N_B8F (0x600C + (12 * 8) + 10) -#define N_B8 (0x600C + (12 * 8) + 11) -#define N_C8 (0x600C + (12 * 8) + 0 ) -#define N_C8S (0x600C + (12 * 8) + 1 ) -#define N_D8F (0x600C + (12 * 8) + 1 ) -#define N_D8 (0x600C + (12 * 8) + 2 ) -#define N_D8S (0x600C + (12 * 8) + 3 ) -#define N_E8F (0x600C + (12 * 8) + 3 ) -#define N_E8 (0x600C + (12 * 8) + 4 ) -#define N_F8 (0x600C + (12 * 8) + 5 ) -#define N_F8S (0x600C + (12 * 8) + 6 ) -#define N_G8F (0x600C + (12 * 8) + 6 ) -#define N_G8 (0x600C + (12 * 8) + 7 ) -#define N_G8S (0x600C + (12 * 8) + 8 ) -#define N_A8F (0x600C + (12 * 8) + 8 ) -#define N_A8 (0x600C + (12 * 8) + 9 ) -#define N_A8S (0x600C + (12 * 8) + 10) -#define N_B8F (0x600C + (12 * 8) + 10) -#define N_B8 (0x600C + (12 * 8) + 11) +#endif // MIDI_ENABLE -#endif \ No newline at end of file +#endif diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c index 2d52e47a..217dca28 100644 --- a/quantum/process_keycode/process_music.c +++ b/quantum/process_keycode/process_music.c @@ -1,43 +1,72 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "process_music.h" +#ifdef AUDIO_ENABLE +#include "process_audio.h" +#endif +#if defined(MIDI_ENABLE) && defined(MIDI_BASIC) +#include "process_midi.h" +#endif + +#if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) + bool music_activated = false; -uint8_t starting_note = 0x0C; -int offset = 7; +uint8_t music_starting_note = 0x0C; +int music_offset = 7; // music sequencer static bool music_sequence_recording = false; static bool music_sequence_recorded = false; static bool music_sequence_playing = false; -static float music_sequence[16] = {0}; +static uint8_t music_sequence[16] = {0}; static uint8_t music_sequence_count = 0; static uint8_t music_sequence_position = 0; static uint16_t music_sequence_timer = 0; static uint16_t music_sequence_interval = 100; -bool process_music(uint16_t keycode, keyrecord_t *record) { +static void music_noteon(uint8_t note) { + #ifdef AUDIO_ENABLE + process_audio_noteon(note); + #endif + #if defined(MIDI_ENABLE) && defined(MIDI_BASIC) + process_midi_basic_noteon(note); + #endif +} - if (keycode == AU_ON && record->event.pressed) { - audio_on(); - return false; - } +static void music_noteoff(uint8_t note) { + #ifdef AUDIO_ENABLE + process_audio_noteoff(note); + #endif + #if defined(MIDI_ENABLE) && defined(MIDI_BASIC) + process_midi_basic_noteoff(note); + #endif +} - if (keycode == AU_OFF && record->event.pressed) { - audio_off(); - return false; - } +void music_all_notes_off(void) { + #ifdef AUDIO_ENABLE + process_audio_all_notes_off(); + #endif + #if defined(MIDI_ENABLE) && defined(MIDI_BASIC) + process_midi_all_notes_off(); + #endif +} - if (keycode == AU_TOG && record->event.pressed) { - if (is_audio_on()) - { - audio_off(); - } - else - { - audio_on(); - } - return false; - } +bool process_music(uint16_t keycode, keyrecord_t *record) { if (keycode == MU_ON && record->event.pressed) { music_on(); @@ -61,22 +90,10 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { return false; } - if (keycode == MUV_IN && record->event.pressed) { - voice_iterate(); - music_scale_user(); - return false; - } - - if (keycode == MUV_DE && record->event.pressed) { - voice_deiterate(); - music_scale_user(); - return false; - } - if (music_activated) { if (keycode == KC_LCTL && record->event.pressed) { // Start recording - stop_all_notes(); + music_all_notes_off(); music_sequence_recording = true; music_sequence_recorded = false; music_sequence_playing = false; @@ -85,7 +102,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { } if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing - stop_all_notes(); + music_all_notes_off(); if (music_sequence_recording) { // was recording music_sequence_recorded = true; } @@ -95,7 +112,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { } if (keycode == KC_LGUI && record->event.pressed && music_sequence_recorded) { // Start playing - stop_all_notes(); + music_all_notes_off(); music_sequence_recording = false; music_sequence_playing = true; music_sequence_position = 0; @@ -115,21 +132,33 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { return false; } - float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)); + #define MUSIC_MODE_GUITAR + + #ifdef MUSIC_MODE_CHROMATIC + uint8_t note = (music_starting_note + record->event.key.col + music_offset - 3)+12*(MATRIX_ROWS - record->event.key.row); + #elif defined(MUSIC_MODE_GUITAR) + uint8_t note = (music_starting_note + record->event.key.col + music_offset + 32)+5*(MATRIX_ROWS - record->event.key.row); + #elif defined(MUSIC_MODE_VIOLIN) + uint8_t note = (music_starting_note + record->event.key.col + music_offset + 32)+7*(MATRIX_ROWS - record->event.key.row); + #else + uint8_t note = (music_starting_note + SCALE[record->event.key.col + music_offset] - 3)+12*(MATRIX_ROWS - record->event.key.row); + #endif + if (record->event.pressed) { - play_note(freq, 0xF); + music_noteon(note); if (music_sequence_recording) { - music_sequence[music_sequence_count] = freq; + music_sequence[music_sequence_count] = note; music_sequence_count++; } } else { - stop_note(freq); + music_noteoff(note); } if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through return false; } - return true; + + return true; } bool is_music_on(void) { @@ -151,26 +180,26 @@ void music_on(void) { void music_off(void) { music_activated = 0; - stop_all_notes(); + music_all_notes_off(); } - -__attribute__ ((weak)) -void music_on_user() {} - -__attribute__ ((weak)) -void audio_on_user() {} - -__attribute__ ((weak)) -void music_scale_user() {} - void matrix_scan_music(void) { if (music_sequence_playing) { if ((music_sequence_timer == 0) || (timer_elapsed(music_sequence_timer) > music_sequence_interval)) { music_sequence_timer = timer_read(); - stop_note(music_sequence[(music_sequence_position - 1 < 0)?(music_sequence_position - 1 + music_sequence_count):(music_sequence_position - 1)]); - play_note(music_sequence[music_sequence_position], 0xF); + uint8_t prev_note = music_sequence[(music_sequence_position - 1 < 0)?(music_sequence_position - 1 + music_sequence_count):(music_sequence_position - 1)]; + uint8_t next_note = music_sequence[music_sequence_position]; + music_noteoff(prev_note); + music_noteon(next_note); music_sequence_position = (music_sequence_position + 1) % music_sequence_count; } } } + +__attribute__ ((weak)) +void music_on_user() {} + +__attribute__ ((weak)) +void music_scale_user() {} + +#endif // defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) \ No newline at end of file diff --git a/quantum/process_keycode/process_music.h b/quantum/process_keycode/process_music.h index 318b3e38..8dfbf041 100644 --- a/quantum/process_keycode/process_music.h +++ b/quantum/process_keycode/process_music.h @@ -1,8 +1,26 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_MUSIC_H #define PROCESS_MUSIC_H #include "quantum.h" +#if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) + bool process_music(uint16_t keycode, keyrecord_t *record); bool is_music_on(void); @@ -10,9 +28,9 @@ void music_toggle(void); void music_on(void); void music_off(void); -void audio_on_user(void); void music_on_user(void); void music_scale_user(void); +void music_all_notes_off(void); void matrix_scan_music(void); @@ -24,4 +42,6 @@ void matrix_scan_music(void); 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), } #endif -#endif \ No newline at end of file +#endif // defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) + +#endif diff --git a/quantum/process_keycode/process_printer.c b/quantum/process_keycode/process_printer.c new file mode 100644 index 00000000..807f7a0b --- /dev/null +++ b/quantum/process_keycode/process_printer.c @@ -0,0 +1,270 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "process_printer.h" +#include "action_util.h" + +bool printing_enabled = false; +uint8_t character_shift = 0; + +void enabled_printing() { + printing_enabled = true; + serial_init(); +} + +void disable_printing() { + printing_enabled = false; +} + +uint8_t shifted_numbers[10] = {0x21, 0x40, 0x23, 0x24, 0x25, 0x5E, 0x26, 0x2A, 0x28, 0x29}; + +// uint8_t keycode_to_ascii[0xFF][2]; + +// keycode_to_ascii[KC_MINS] = {0x2D, 0x5F}; + +void print_char(char c) { + USB_Disable(); + serial_send(c); + USB_Init(); +} + +void print_box_string(uint8_t text[]) { + uint8_t len = strlen(text); + uint8_t out[len * 3 + 8]; + out[0] = 0xDA; + for (uint8_t i = 0; i < len; i++) { + out[i+1] = 0xC4; + } + out[len + 1] = 0xBF; + out[len + 2] = '\n'; + + out[len + 3] = 0xB3; + for (uint8_t i = 0; i < len; i++) { + out[len + 4 + i] = text[i]; + } + out[len * 2 + 4] = 0xB3; + out[len * 2 + 5] = '\n'; + + + out[len * 2 + 6] = 0xC0; + for (uint8_t i = 0; i < len; i++) { + out[len * 2 + 7 + i] = 0xC4; + } + out[len * 3 + 7] = 0xD9; + out[len * 3 + 8] = '\n'; + + print_string(out); +} + +void print_string(char c[]) { + for(uint8_t i = 0; i < strlen(c); i++) + print_char(c[i]); +} + +bool process_printer(uint16_t keycode, keyrecord_t *record) { + if (keycode == PRINT_ON) { + enabled_printing(); + return false; + } + if (keycode == PRINT_OFF) { + disable_printing(); + return false; + } + + if (printing_enabled) { + switch(keycode) { + case KC_EXLM ... KC_RPRN: + case KC_UNDS: + case KC_PLUS: + case KC_LCBR: + case KC_RCBR: + case KC_PIPE: + case KC_TILD: + keycode &= 0xFF; + case KC_LSFT: + case KC_RSFT: + if (record->event.pressed) { + character_shift++; + } else { + character_shift--; + } + return false; + break; + } + + switch(keycode) { + case KC_F1: + if (record->event.pressed) { + print_box_string("This is a line of text!"); + } + return false; + case KC_ESC: + if (record->event.pressed) { + print_char(0x1B); + } + return false; + break; + case KC_SPC: + if (record->event.pressed) { + print_char(0x20); + } + return false; + break; + case KC_A ... KC_Z: + if (record->event.pressed) { + if (character_shift) { + print_char(0x41 + (keycode - KC_A)); + } else { + print_char(0x61 + (keycode - KC_A)); + } + } + return false; + break; + case KC_1 ... KC_0: + if (record->event.pressed) { + if (character_shift) { + print_char(shifted_numbers[keycode - KC_1]); + } else { + print_char(0x30 + ((keycode - KC_1 + 1) % 10)); + } + } + return false; + break; + case KC_ENT: + if (record->event.pressed) { + if (character_shift) { + print_char(0x0C); + } else { + print_char(0x0A); + } + } + return false; + break; + case KC_BSPC: + if (record->event.pressed) { + if (character_shift) { + print_char(0x18); + } else { + print_char(0x1A); + } + } + return false; + break; + case KC_DOT: + if (record->event.pressed) { + if (character_shift) { + print_char(0x3E); + } else { + print_char(0x2E); + } + } + return false; + break; + case KC_COMM: + if (record->event.pressed) { + if (character_shift) { + print_char(0x3C); + } else { + print_char(0x2C); + } + } + return false; + break; + case KC_SLSH: + if (record->event.pressed) { + if (character_shift) { + print_char(0x3F); + } else { + print_char(0x2F); + } + } + return false; + break; + case KC_QUOT: + if (record->event.pressed) { + if (character_shift) { + print_char(0x22); + } else { + print_char(0x27); + } + } + return false; + break; + case KC_GRV: + if (record->event.pressed) { + if (character_shift) { + print_char(0x7E); + } else { + print_char(0x60); + } + } + return false; + break; + case KC_MINS: + if (record->event.pressed) { + if (character_shift) { + print_char(0x5F); + } else { + print_char(0x2D); + } + } + return false; + break; + case KC_EQL: + if (record->event.pressed) { + if (character_shift) { + print_char(0x2B); + } else { + print_char(0x3D); + } + } + return false; + break; + case KC_LBRC: + if (record->event.pressed) { + if (character_shift) { + print_char(0x7B); + } else { + print_char(0x5B); + } + } + return false; + break; + case KC_RBRC: + if (record->event.pressed) { + if (character_shift) { + print_char(0x7D); + } else { + print_char(0x5D); + } + } + return false; + break; + case KC_BSLS: + if (record->event.pressed) { + if (character_shift) { + print_char(0x7C); + } else { + print_char(0x5C); + } + } + return false; + break; + } + } + return true; + +} diff --git a/quantum/process_keycode/process_printer.h b/quantum/process_keycode/process_printer.h new file mode 100644 index 00000000..aa494ac8 --- /dev/null +++ b/quantum/process_keycode/process_printer.h @@ -0,0 +1,24 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef PROCESS_PRINTER_H +#define PROCESS_PRINTER_H + +#include "quantum.h" + +#include "protocol/serial.h" + +#endif diff --git a/quantum/process_keycode/process_printer_bb.c b/quantum/process_keycode/process_printer_bb.c new file mode 100644 index 00000000..55d3b552 --- /dev/null +++ b/quantum/process_keycode/process_printer_bb.c @@ -0,0 +1,276 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "process_printer.h" +#include "action_util.h" + +bool printing_enabled = false; +uint8_t character_shift = 0; + +#define SERIAL_PIN_DDR DDRD +#define SERIAL_PIN_PORT PORTD +#define SERIAL_PIN_MASK _BV(PD3) +#define SERIAL_DELAY 52 + +inline static +void serial_delay(void) { + _delay_us(SERIAL_DELAY); +} + +inline static +void serial_high(void) { + SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +inline static +void serial_low(void) { + SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; +} + +inline static +void serial_output(void) { + SERIAL_PIN_DDR |= SERIAL_PIN_MASK; +} + + +void enabled_printing() { + printing_enabled = true; + serial_output(); + serial_high(); +} + +void disable_printing() { + printing_enabled = false; +} + +uint8_t shifted_numbers[10] = {0x21, 0x40, 0x23, 0x24, 0x25, 0x5E, 0x26, 0x2A, 0x28, 0x29}; + +// uint8_t keycode_to_ascii[0xFF][2]; + +// keycode_to_ascii[KC_MINS] = {0x2D, 0x5F}; + +void print_char(char c) { + uint8_t b = 8; + serial_output(); + while( b-- ) { + if(c & (1 << b)) { + serial_high(); + } else { + serial_low(); + } + serial_delay(); + } +} + +void print_string(char c[]) { + for(uint8_t i = 0; i < strlen(c); i++) + print_char(c[i]); +} + +bool process_printer(uint16_t keycode, keyrecord_t *record) { + if (keycode == PRINT_ON) { + enabled_printing(); + return false; + } + if (keycode == PRINT_OFF) { + disable_printing(); + return false; + } + + if (printing_enabled) { + switch(keycode) { + case KC_EXLM ... KC_RPRN: + case KC_UNDS: + case KC_PLUS: + case KC_LCBR: + case KC_RCBR: + case KC_PIPE: + case KC_TILD: + keycode &= 0xFF; + case KC_LSFT: + case KC_RSFT: + if (record->event.pressed) { + character_shift++; + } else { + character_shift--; + } + return false; + break; + } + + switch(keycode) { + case KC_F1: + if (record->event.pressed) { + print_string("This is a line of text!\n\n\n"); + } + return false; + case KC_ESC: + if (record->event.pressed) { + print_char(0x1B); + } + return false; + break; + case KC_SPC: + if (record->event.pressed) { + print_char(0x20); + } + return false; + break; + case KC_A ... KC_Z: + if (record->event.pressed) { + if (character_shift) { + print_char(0x41 + (keycode - KC_A)); + } else { + print_char(0x61 + (keycode - KC_A)); + } + } + return false; + break; + case KC_1 ... KC_0: + if (record->event.pressed) { + if (character_shift) { + print_char(shifted_numbers[keycode - KC_1]); + } else { + print_char(0x30 + ((keycode - KC_1 + 1) % 10)); + } + } + return false; + break; + case KC_ENT: + if (record->event.pressed) { + if (character_shift) { + print_char(0x0C); + } else { + print_char(0x0A); + } + } + return false; + break; + case KC_BSPC: + if (record->event.pressed) { + if (character_shift) { + print_char(0x18); + } else { + print_char(0x1A); + } + } + return false; + break; + case KC_DOT: + if (record->event.pressed) { + if (character_shift) { + print_char(0x3E); + } else { + print_char(0x2E); + } + } + return false; + break; + case KC_COMM: + if (record->event.pressed) { + if (character_shift) { + print_char(0x3C); + } else { + print_char(0x2C); + } + } + return false; + break; + case KC_SLSH: + if (record->event.pressed) { + if (character_shift) { + print_char(0x3F); + } else { + print_char(0x2F); + } + } + return false; + break; + case KC_QUOT: + if (record->event.pressed) { + if (character_shift) { + print_char(0x22); + } else { + print_char(0x27); + } + } + return false; + break; + case KC_GRV: + if (record->event.pressed) { + if (character_shift) { + print_char(0x7E); + } else { + print_char(0x60); + } + } + return false; + break; + case KC_MINS: + if (record->event.pressed) { + if (character_shift) { + print_char(0x5F); + } else { + print_char(0x2D); + } + } + return false; + break; + case KC_EQL: + if (record->event.pressed) { + if (character_shift) { + print_char(0x2B); + } else { + print_char(0x3D); + } + } + return false; + break; + case KC_LBRC: + if (record->event.pressed) { + if (character_shift) { + print_char(0x7B); + } else { + print_char(0x5B); + } + } + return false; + break; + case KC_RBRC: + if (record->event.pressed) { + if (character_shift) { + print_char(0x7D); + } else { + print_char(0x5D); + } + } + return false; + break; + case KC_BSLS: + if (record->event.pressed) { + if (character_shift) { + print_char(0x7C); + } else { + print_char(0x5C); + } + } + return false; + break; + } + } + return true; + +} diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c index 6ae362c4..68c8425b 100644 --- a/quantum/process_keycode/process_tap_dance.c +++ b/quantum/process_keycode/process_tap_dance.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "quantum.h" #include "action_tapping.h" @@ -43,12 +58,16 @@ static inline void process_tap_dance_action_on_dance_finished (qk_tap_dance_acti if (action->state.finished) return; action->state.finished = true; + add_mods(action->state.oneshot_mods); + send_keyboard_report(); _process_tap_dance_action_fn (&action->state, action->user_data, action->fn.on_dance_finished); } static inline void process_tap_dance_action_on_reset (qk_tap_dance_action_t *action) { _process_tap_dance_action_fn (&action->state, action->user_data, action->fn.on_reset); + del_mods(action->state.oneshot_mods); + send_keyboard_report(); } bool process_tap_dance(uint16_t keycode, keyrecord_t *record) { @@ -70,6 +89,7 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record) { action->state.keycode = keycode; action->state.count++; action->state.timer = timer_read(); + action->state.oneshot_mods = get_oneshot_mods(); process_tap_dance_action_on_each_tap (action); if (last_td && last_td != keycode) { @@ -109,7 +129,7 @@ void matrix_scan_tap_dance () { if (highest_td == -1) return; - for (int i = 0; i <= highest_td; i++) { +for (int i = 0; i <= highest_td; i++) { qk_tap_dance_action_t *action = &tap_dance_actions[i]; if (action->state.count && timer_elapsed (action->state.timer) > TAPPING_TERM) { diff --git a/quantum/process_keycode/process_tap_dance.h b/quantum/process_keycode/process_tap_dance.h index f753cbba..330809f8 100644 --- a/quantum/process_keycode/process_tap_dance.h +++ b/quantum/process_keycode/process_tap_dance.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef PROCESS_TAP_DANCE_H #define PROCESS_TAP_DANCE_H @@ -9,6 +24,7 @@ typedef struct { uint8_t count; + uint8_t oneshot_mods; uint16_t keycode; uint16_t timer; bool interrupted; diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c new file mode 100644 index 00000000..86c0937f --- /dev/null +++ b/quantum/process_keycode/process_ucis.c @@ -0,0 +1,149 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "process_ucis.h" + +qk_ucis_state_t qk_ucis_state; + +void qk_ucis_start(void) { + qk_ucis_state.count = 0; + qk_ucis_state.in_progress = true; + + qk_ucis_start_user(); +} + +__attribute__((weak)) +void qk_ucis_start_user(void) { + unicode_input_start(); + register_hex(0x2328); + unicode_input_finish(); +} + +static bool is_uni_seq(char *seq) { + uint8_t i; + + for (i = 0; seq[i]; i++) { + uint16_t code; + if (('1' <= seq[i]) && (seq[i] <= '0')) + code = seq[i] - '1' + KC_1; + else + code = seq[i] - 'a' + KC_A; + + if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code) + return false; + } + + return (qk_ucis_state.codes[i] == KC_ENT || + qk_ucis_state.codes[i] == KC_SPC); +} + +__attribute__((weak)) +void qk_ucis_symbol_fallback (void) { + for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) { + uint8_t code = qk_ucis_state.codes[i]; + register_code(code); + unregister_code(code); + wait_ms(UNICODE_TYPE_DELAY); + } +} + +void register_ucis(const char *hex) { + for(int i = 0; hex[i]; i++) { + uint8_t kc = 0; + char c = hex[i]; + + switch (c) { + case '0': + kc = KC_0; + break; + case '1' ... '9': + kc = c - '1' + KC_1; + break; + case 'a' ... 'f': + kc = c - 'a' + KC_A; + break; + case 'A' ... 'F': + kc = c - 'A' + KC_A; + break; + } + + if (kc) { + register_code (kc); + unregister_code (kc); + wait_ms (UNICODE_TYPE_DELAY); + } + } +} + +bool process_ucis (uint16_t keycode, keyrecord_t *record) { + uint8_t i; + + if (!qk_ucis_state.in_progress) + return true; + + if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH && + !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) { + return false; + } + + if (!record->event.pressed) + return true; + + qk_ucis_state.codes[qk_ucis_state.count] = keycode; + qk_ucis_state.count++; + + if (keycode == KC_BSPC) { + if (qk_ucis_state.count >= 2) { + qk_ucis_state.count -= 2; + return true; + } else { + qk_ucis_state.count--; + return false; + } + } + + if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) { + bool symbol_found = false; + + for (i = qk_ucis_state.count; i > 0; i--) { + register_code (KC_BSPC); + unregister_code (KC_BSPC); + wait_ms(UNICODE_TYPE_DELAY); + } + + if (keycode == KC_ESC) { + qk_ucis_state.in_progress = false; + return false; + } + + unicode_input_start(); + for (i = 0; ucis_symbol_table[i].symbol; i++) { + if (is_uni_seq (ucis_symbol_table[i].symbol)) { + symbol_found = true; + register_ucis(ucis_symbol_table[i].code + 2); + break; + } + } + if (!symbol_found) { + qk_ucis_symbol_fallback(); + } + unicode_input_finish(); + + qk_ucis_state.in_progress = false; + return false; + } + return true; +} diff --git a/quantum/process_keycode/process_ucis.h b/quantum/process_keycode/process_ucis.h new file mode 100644 index 00000000..3f736a70 --- /dev/null +++ b/quantum/process_keycode/process_ucis.h @@ -0,0 +1,51 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef PROCESS_UCIS_H +#define PROCESS_UCIS_H + +#include "quantum.h" +#include "process_unicode_common.h" + +#ifndef UCIS_MAX_SYMBOL_LENGTH +#define UCIS_MAX_SYMBOL_LENGTH 32 +#endif + +typedef struct { + char *symbol; + char *code; +} qk_ucis_symbol_t; + +typedef struct { + uint8_t count; + uint16_t codes[UCIS_MAX_SYMBOL_LENGTH]; + bool in_progress:1; +} qk_ucis_state_t; + +extern qk_ucis_state_t qk_ucis_state; + +#define UCIS_TABLE(...) {__VA_ARGS__, {NULL, NULL}} +#define UCIS_SYM(name, code) {name, #code} + +extern const qk_ucis_symbol_t ucis_symbol_table[]; + +void qk_ucis_start(void); +void qk_ucis_start_user(void); +void qk_ucis_symbol_fallback (void); +void register_ucis(const char *hex); +bool process_ucis (uint16_t keycode, keyrecord_t *record); + +#endif diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index f42f2553..cecfaeee 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c @@ -1,4 +1,20 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "process_unicode.h" +#include "action_util.h" static uint8_t input_mode; static uint8_t first_flag = 0; @@ -75,6 +91,7 @@ void register_hex(uint16_t hex) { } } + bool process_unicode(uint16_t keycode, keyrecord_t *record) { if (keycode > QK_UNICODE && record->event.pressed) { if (first_flag == 0) { @@ -89,182 +106,3 @@ bool process_unicode(uint16_t keycode, keyrecord_t *record) { return true; } -#ifdef UNICODEMAP_ENABLE -__attribute__((weak)) -const uint32_t PROGMEM unicode_map[] = { -}; - -void register_hex32(uint32_t hex) { - uint8_t onzerostart = 1; - for(int i = 7; i >= 0; i--) { - if (i <= 3) { - onzerostart = 0; - } - uint8_t digit = ((hex >> (i*4)) & 0xF); - if (digit == 0) { - if (onzerostart == 0) { - register_code(hex_to_keycode(digit)); - unregister_code(hex_to_keycode(digit)); - } - } else { - register_code(hex_to_keycode(digit)); - unregister_code(hex_to_keycode(digit)); - onzerostart = 0; - } - } -} - -__attribute__((weak)) -void unicode_map_input_error() {} - -bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { - if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) { - const uint32_t* map = unicode_map; - uint16_t index = keycode & 0x7FF; - uint32_t code = pgm_read_dword_far(&map[index]); - if ((code > 0xFFFF && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) { - // when character is out of range supported by the OS - unicode_map_input_error(); - } else { - unicode_input_start(); - register_hex32(code); - unicode_input_finish(); - } - } - return true; -} -#endif - -#ifdef UCIS_ENABLE -qk_ucis_state_t qk_ucis_state; - -void qk_ucis_start(void) { - qk_ucis_state.count = 0; - qk_ucis_state.in_progress = true; - - qk_ucis_start_user(); -} - -__attribute__((weak)) -void qk_ucis_start_user(void) { - unicode_input_start(); - register_hex(0x2328); - unicode_input_finish(); -} - -static bool is_uni_seq(char *seq) { - uint8_t i; - - for (i = 0; seq[i]; i++) { - uint16_t code; - if (('1' <= seq[i]) && (seq[i] <= '0')) - code = seq[i] - '1' + KC_1; - else - code = seq[i] - 'a' + KC_A; - - if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code) - return false; - } - - return (qk_ucis_state.codes[i] == KC_ENT || - qk_ucis_state.codes[i] == KC_SPC); -} - -__attribute__((weak)) -void qk_ucis_symbol_fallback (void) { - for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) { - uint8_t code = qk_ucis_state.codes[i]; - register_code(code); - unregister_code(code); - wait_ms(UNICODE_TYPE_DELAY); - } -} - -void register_ucis(const char *hex) { - for(int i = 0; hex[i]; i++) { - uint8_t kc = 0; - char c = hex[i]; - - switch (c) { - case '0': - kc = KC_0; - break; - case '1' ... '9': - kc = c - '1' + KC_1; - break; - case 'a' ... 'f': - kc = c - 'a' + KC_A; - break; - case 'A' ... 'F': - kc = c - 'A' + KC_A; - break; - } - - if (kc) { - register_code (kc); - unregister_code (kc); - wait_ms (UNICODE_TYPE_DELAY); - } - } -} - -bool process_ucis (uint16_t keycode, keyrecord_t *record) { - uint8_t i; - - if (!qk_ucis_state.in_progress) - return true; - - if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH && - !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) { - return false; - } - - if (!record->event.pressed) - return true; - - qk_ucis_state.codes[qk_ucis_state.count] = keycode; - qk_ucis_state.count++; - - if (keycode == KC_BSPC) { - if (qk_ucis_state.count >= 2) { - qk_ucis_state.count -= 2; - return true; - } else { - qk_ucis_state.count--; - return false; - } - } - - if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) { - bool symbol_found = false; - - for (i = qk_ucis_state.count; i > 0; i--) { - register_code (KC_BSPC); - unregister_code (KC_BSPC); - wait_ms(UNICODE_TYPE_DELAY); - } - - if (keycode == KC_ESC) { - qk_ucis_state.in_progress = false; - return false; - } - - unicode_input_start(); - for (i = 0; ucis_symbol_table[i].symbol; i++) { - if (is_uni_seq (ucis_symbol_table[i].symbol)) { - symbol_found = true; - register_ucis(ucis_symbol_table[i].code + 2); - break; - } - } - if (!symbol_found) { - qk_ucis_symbol_fallback(); - } - unicode_input_finish(); - - qk_ucis_state.in_progress = false; - return false; - } - return true; -} -#endif diff --git a/quantum/process_keycode/process_unicode.h b/quantum/process_keycode/process_unicode.h index 065eeb5f..c525b74f 100644 --- a/quantum/process_keycode/process_unicode.h +++ b/quantum/process_keycode/process_unicode.h @@ -1,166 +1,24 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef PROCESS_UNICODE_H #define PROCESS_UNICODE_H #include "quantum.h" - -#define UC_OSX 0 // Mac OS X -#define UC_LNX 1 // Linux -#define UC_WIN 2 // Windows 'HexNumpad' -#define UC_BSD 3 // BSD (not implemented) -#define UC_WINC 4 // WinCompose https://github.com/samhocevar/wincompose - -#ifndef UNICODE_TYPE_DELAY -#define UNICODE_TYPE_DELAY 10 -#endif - -void set_unicode_input_mode(uint8_t os_target); -uint8_t get_unicode_input_mode(void); -void unicode_input_start(void); -void unicode_input_finish(void); -void register_hex(uint16_t hex); +#include "process_unicode_common.h" bool process_unicode(uint16_t keycode, keyrecord_t *record); -#ifdef UNICODEMAP_ENABLE -bool process_unicode_map(uint16_t keycode, keyrecord_t *record); -#endif - -#ifdef UCIS_ENABLE -#ifndef UCIS_MAX_SYMBOL_LENGTH -#define UCIS_MAX_SYMBOL_LENGTH 32 -#endif - -typedef struct { - char *symbol; - char *code; -} qk_ucis_symbol_t; - -typedef struct { - uint8_t count; - uint16_t codes[UCIS_MAX_SYMBOL_LENGTH]; - bool in_progress:1; -} qk_ucis_state_t; - -extern qk_ucis_state_t qk_ucis_state; - -#define UCIS_TABLE(...) {__VA_ARGS__, {NULL, NULL}} -#define UCIS_SYM(name, code) {name, #code} - -extern const qk_ucis_symbol_t ucis_symbol_table[]; - -void qk_ucis_start(void); -void qk_ucis_start_user(void); -void qk_ucis_symbol_fallback (void); -void register_ucis(const char *hex); -bool process_ucis (uint16_t keycode, keyrecord_t *record); - -#endif - -#define UC_BSPC UC(0x0008) - -#define UC_SPC UC(0x0020) - -#define UC_EXLM UC(0x0021) -#define UC_DQUT UC(0x0022) -#define UC_HASH UC(0x0023) -#define UC_DLR UC(0x0024) -#define UC_PERC UC(0x0025) -#define UC_AMPR UC(0x0026) -#define UC_QUOT UC(0x0027) -#define UC_LPRN UC(0x0028) -#define UC_RPRN UC(0x0029) -#define UC_ASTR UC(0x002A) -#define UC_PLUS UC(0x002B) -#define UC_COMM UC(0x002C) -#define UC_DASH UC(0x002D) -#define UC_DOT UC(0x002E) -#define UC_SLSH UC(0x002F) - -#define UC_0 UC(0x0030) -#define UC_1 UC(0x0031) -#define UC_2 UC(0x0032) -#define UC_3 UC(0x0033) -#define UC_4 UC(0x0034) -#define UC_5 UC(0x0035) -#define UC_6 UC(0x0036) -#define UC_7 UC(0x0037) -#define UC_8 UC(0x0038) -#define UC_9 UC(0x0039) - -#define UC_COLN UC(0x003A) -#define UC_SCLN UC(0x003B) -#define UC_LT UC(0x003C) -#define UC_EQL UC(0x003D) -#define UC_GT UC(0x003E) -#define UC_QUES UC(0x003F) -#define UC_AT UC(0x0040) - -#define UC_A UC(0x0041) -#define UC_B UC(0x0042) -#define UC_C UC(0x0043) -#define UC_D UC(0x0044) -#define UC_E UC(0x0045) -#define UC_F UC(0x0046) -#define UC_G UC(0x0047) -#define UC_H UC(0x0048) -#define UC_I UC(0x0049) -#define UC_J UC(0x004A) -#define UC_K UC(0x004B) -#define UC_L UC(0x004C) -#define UC_M UC(0x004D) -#define UC_N UC(0x004E) -#define UC_O UC(0x004F) -#define UC_P UC(0x0050) -#define UC_Q UC(0x0051) -#define UC_R UC(0x0052) -#define UC_S UC(0x0053) -#define UC_T UC(0x0054) -#define UC_U UC(0x0055) -#define UC_V UC(0x0056) -#define UC_W UC(0x0057) -#define UC_X UC(0x0058) -#define UC_Y UC(0x0059) -#define UC_Z UC(0x005A) - -#define UC_LBRC UC(0x005B) -#define UC_BSLS UC(0x005C) -#define UC_RBRC UC(0x005D) -#define UC_CIRM UC(0x005E) -#define UC_UNDR UC(0x005F) - -#define UC_GRV UC(0x0060) - -#define UC_a UC(0x0061) -#define UC_b UC(0x0062) -#define UC_c UC(0x0063) -#define UC_d UC(0x0064) -#define UC_e UC(0x0065) -#define UC_f UC(0x0066) -#define UC_g UC(0x0067) -#define UC_h UC(0x0068) -#define UC_i UC(0x0069) -#define UC_j UC(0x006A) -#define UC_k UC(0x006B) -#define UC_l UC(0x006C) -#define UC_m UC(0x006D) -#define UC_n UC(0x006E) -#define UC_o UC(0x006F) -#define UC_p UC(0x0070) -#define UC_q UC(0x0071) -#define UC_r UC(0x0072) -#define UC_s UC(0x0073) -#define UC_t UC(0x0074) -#define UC_u UC(0x0075) -#define UC_v UC(0x0076) -#define UC_w UC(0x0077) -#define UC_x UC(0x0078) -#define UC_y UC(0x0079) -#define UC_z UC(0x007A) - -#define UC_LCBR UC(0x007B) -#define UC_PIPE UC(0x007C) -#define UC_RCBR UC(0x007D) -#define UC_TILD UC(0x007E) -#define UC_DEL UC(0x007F) - #endif diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c new file mode 100644 index 00000000..6012b4f0 --- /dev/null +++ b/quantum/process_keycode/process_unicode_common.c @@ -0,0 +1,101 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "process_unicode_common.h" + +uint8_t mods; + +void set_unicode_input_mode(uint8_t os_target) +{ + input_mode = os_target; +} + +uint8_t get_unicode_input_mode(void) { + return input_mode; +} + +__attribute__((weak)) +void unicode_input_start (void) { + // save current mods + mods = keyboard_report->mods; + + // unregister all mods to start from clean state + if (mods & MOD_BIT(KC_LSFT)) unregister_code(KC_LSFT); + if (mods & MOD_BIT(KC_RSFT)) unregister_code(KC_RSFT); + if (mods & MOD_BIT(KC_LCTL)) unregister_code(KC_LCTL); + if (mods & MOD_BIT(KC_RCTL)) unregister_code(KC_RCTL); + if (mods & MOD_BIT(KC_LALT)) unregister_code(KC_LALT); + if (mods & MOD_BIT(KC_RALT)) unregister_code(KC_RALT); + if (mods & MOD_BIT(KC_LGUI)) unregister_code(KC_LGUI); + if (mods & MOD_BIT(KC_RGUI)) unregister_code(KC_RGUI); + + switch(input_mode) { + case UC_OSX: + register_code(KC_LALT); + break; + case UC_LNX: + register_code(KC_LCTL); + register_code(KC_LSFT); + register_code(KC_U); + unregister_code(KC_U); + unregister_code(KC_LSFT); + unregister_code(KC_LCTL); + break; + case UC_WIN: + register_code(KC_LALT); + register_code(KC_PPLS); + unregister_code(KC_PPLS); + break; + case UC_WINC: + register_code(KC_RALT); + unregister_code(KC_RALT); + register_code(KC_U); + unregister_code(KC_U); + } + wait_ms(UNICODE_TYPE_DELAY); +} + +__attribute__((weak)) +void unicode_input_finish (void) { + switch(input_mode) { + case UC_OSX: + case UC_WIN: + unregister_code(KC_LALT); + break; + case UC_LNX: + register_code(KC_SPC); + unregister_code(KC_SPC); + break; + } + + // reregister previously set mods + if (mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT); + if (mods & MOD_BIT(KC_RSFT)) register_code(KC_RSFT); + if (mods & MOD_BIT(KC_LCTL)) register_code(KC_LCTL); + if (mods & MOD_BIT(KC_RCTL)) register_code(KC_RCTL); + if (mods & MOD_BIT(KC_LALT)) register_code(KC_LALT); + if (mods & MOD_BIT(KC_RALT)) register_code(KC_RALT); + if (mods & MOD_BIT(KC_LGUI)) register_code(KC_LGUI); + if (mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI); +} + +void register_hex(uint16_t hex) { + for(int i = 3; i >= 0; i--) { + uint8_t digit = ((hex >> (i*4)) & 0xF); + register_code(hex_to_keycode(digit)); + unregister_code(hex_to_keycode(digit)); + } +} diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h new file mode 100644 index 00000000..f5be1da5 --- /dev/null +++ b/quantum/process_keycode/process_unicode_common.h @@ -0,0 +1,148 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef PROCESS_UNICODE_COMMON_H +#define PROCESS_UNICODE_COMMON_H + +#include "quantum.h" + +#ifndef UNICODE_TYPE_DELAY +#define UNICODE_TYPE_DELAY 10 +#endif + +__attribute__ ((unused)) +static uint8_t input_mode; + +void set_unicode_input_mode(uint8_t os_target); +uint8_t get_unicode_input_mode(void); +void unicode_input_start(void); +void unicode_input_finish(void); +void register_hex(uint16_t hex); + +#define UC_OSX 0 // Mac OS X +#define UC_LNX 1 // Linux +#define UC_WIN 2 // Windows 'HexNumpad' +#define UC_BSD 3 // BSD (not implemented) +#define UC_WINC 4 // WinCompose https://github.com/samhocevar/wincompose + +#define UC_BSPC UC(0x0008) + +#define UC_SPC UC(0x0020) + +#define UC_EXLM UC(0x0021) +#define UC_DQUT UC(0x0022) +#define UC_HASH UC(0x0023) +#define UC_DLR UC(0x0024) +#define UC_PERC UC(0x0025) +#define UC_AMPR UC(0x0026) +#define UC_QUOT UC(0x0027) +#define UC_LPRN UC(0x0028) +#define UC_RPRN UC(0x0029) +#define UC_ASTR UC(0x002A) +#define UC_PLUS UC(0x002B) +#define UC_COMM UC(0x002C) +#define UC_DASH UC(0x002D) +#define UC_DOT UC(0x002E) +#define UC_SLSH UC(0x002F) + +#define UC_0 UC(0x0030) +#define UC_1 UC(0x0031) +#define UC_2 UC(0x0032) +#define UC_3 UC(0x0033) +#define UC_4 UC(0x0034) +#define UC_5 UC(0x0035) +#define UC_6 UC(0x0036) +#define UC_7 UC(0x0037) +#define UC_8 UC(0x0038) +#define UC_9 UC(0x0039) + +#define UC_COLN UC(0x003A) +#define UC_SCLN UC(0x003B) +#define UC_LT UC(0x003C) +#define UC_EQL UC(0x003D) +#define UC_GT UC(0x003E) +#define UC_QUES UC(0x003F) +#define UC_AT UC(0x0040) + +#define UC_A UC(0x0041) +#define UC_B UC(0x0042) +#define UC_C UC(0x0043) +#define UC_D UC(0x0044) +#define UC_E UC(0x0045) +#define UC_F UC(0x0046) +#define UC_G UC(0x0047) +#define UC_H UC(0x0048) +#define UC_I UC(0x0049) +#define UC_J UC(0x004A) +#define UC_K UC(0x004B) +#define UC_L UC(0x004C) +#define UC_M UC(0x004D) +#define UC_N UC(0x004E) +#define UC_O UC(0x004F) +#define UC_P UC(0x0050) +#define UC_Q UC(0x0051) +#define UC_R UC(0x0052) +#define UC_S UC(0x0053) +#define UC_T UC(0x0054) +#define UC_U UC(0x0055) +#define UC_V UC(0x0056) +#define UC_W UC(0x0057) +#define UC_X UC(0x0058) +#define UC_Y UC(0x0059) +#define UC_Z UC(0x005A) + +#define UC_LBRC UC(0x005B) +#define UC_BSLS UC(0x005C) +#define UC_RBRC UC(0x005D) +#define UC_CIRM UC(0x005E) +#define UC_UNDR UC(0x005F) + +#define UC_GRV UC(0x0060) + +#define UC_a UC(0x0061) +#define UC_b UC(0x0062) +#define UC_c UC(0x0063) +#define UC_d UC(0x0064) +#define UC_e UC(0x0065) +#define UC_f UC(0x0066) +#define UC_g UC(0x0067) +#define UC_h UC(0x0068) +#define UC_i UC(0x0069) +#define UC_j UC(0x006A) +#define UC_k UC(0x006B) +#define UC_l UC(0x006C) +#define UC_m UC(0x006D) +#define UC_n UC(0x006E) +#define UC_o UC(0x006F) +#define UC_p UC(0x0070) +#define UC_q UC(0x0071) +#define UC_r UC(0x0072) +#define UC_s UC(0x0073) +#define UC_t UC(0x0074) +#define UC_u UC(0x0075) +#define UC_v UC(0x0076) +#define UC_w UC(0x0077) +#define UC_x UC(0x0078) +#define UC_y UC(0x0079) +#define UC_z UC(0x007A) + +#define UC_LCBR UC(0x007B) +#define UC_PIPE UC(0x007C) +#define UC_RCBR UC(0x007D) +#define UC_TILD UC(0x007E) +#define UC_DEL UC(0x007F) + +#endif diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c new file mode 100644 index 00000000..0227fbdd --- /dev/null +++ b/quantum/process_keycode/process_unicodemap.c @@ -0,0 +1,72 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "process_unicodemap.h" +#include "process_unicode_common.h" + +__attribute__((weak)) +const uint32_t PROGMEM unicode_map[] = { +}; + +void register_hex32(uint32_t hex) { + bool onzerostart = true; + for(int i = 7; i >= 0; i--) { + if (i <= 3) { + onzerostart = false; + } + uint8_t digit = ((hex >> (i*4)) & 0xF); + if (digit == 0) { + if (!onzerostart) { + register_code(hex_to_keycode(digit)); + unregister_code(hex_to_keycode(digit)); + } + } else { + register_code(hex_to_keycode(digit)); + unregister_code(hex_to_keycode(digit)); + onzerostart = false; + } + } +} + +__attribute__((weak)) +void unicode_map_input_error() {} + +bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { + uint8_t input_mode = get_unicode_input_mode(); + if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) { + const uint32_t* map = unicode_map; + uint16_t index = keycode - QK_UNICODE_MAP; + uint32_t code = pgm_read_dword_far(&map[index]); + if (code > 0xFFFF && code <= 0x10ffff && input_mode == UC_OSX) { + // Convert to UTF-16 surrogate pair + code -= 0x10000; + uint32_t lo = code & 0x3ff; + uint32_t hi = (code & 0xffc00) >> 10; + unicode_input_start(); + register_hex32(hi + 0xd800); + register_hex32(lo + 0xdc00); + unicode_input_finish(); + } else if ((code > 0x10ffff && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) { + // when character is out of range supported by the OS + unicode_map_input_error(); + } else { + unicode_input_start(); + register_hex32(code); + unicode_input_finish(); + } + } + return true; +} diff --git a/quantum/process_keycode/process_unicodemap.h b/quantum/process_keycode/process_unicodemap.h new file mode 100644 index 00000000..929c88c0 --- /dev/null +++ b/quantum/process_keycode/process_unicodemap.h @@ -0,0 +1,25 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef PROCESS_UNICODEMAP_H +#define PROCESS_UNICODEMAP_H + +#include "quantum.h" +#include "process_unicode_common.h" + +void unicode_map_input_error(void); +bool process_unicode_map(uint16_t keycode, keyrecord_t *record); +#endif diff --git a/quantum/quantum.c b/quantum/quantum.c index 098312e6..62d9ef92 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -1,4 +1,34 @@ +/* Copyright 2016-2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "quantum.h" +#ifdef PROTOCOL_LUFA +#include "outputselect.h" +#endif + +#ifndef TAPPING_TERM +#define TAPPING_TERM 200 +#endif + +#include "backlight.h" +extern backlight_config_t backlight_config; + +#ifdef FAUXCLICKY_ENABLE +#include "fauxclicky.h" +#endif static void do_code16 (uint16_t code, void (*f) (uint8_t)) { switch (code) { @@ -17,6 +47,8 @@ static void do_code16 (uint16_t code, void (*f) (uint8_t)) { if (code & QK_LGUI) f(KC_LGUI); + if (code < QK_RMODS_MIN) return; + if (code & QK_RCTL) f(KC_RCTL); if (code & QK_RSFT) @@ -27,14 +59,42 @@ static void do_code16 (uint16_t code, void (*f) (uint8_t)) { f(KC_RGUI); } +static inline void qk_register_weak_mods(uint8_t kc) { + add_weak_mods(MOD_BIT(kc)); + send_keyboard_report(); +} + +static inline void qk_unregister_weak_mods(uint8_t kc) { + del_weak_mods(MOD_BIT(kc)); + send_keyboard_report(); +} + +static inline void qk_register_mods(uint8_t kc) { + add_weak_mods(MOD_BIT(kc)); + send_keyboard_report(); +} + +static inline void qk_unregister_mods(uint8_t kc) { + del_weak_mods(MOD_BIT(kc)); + send_keyboard_report(); +} + void register_code16 (uint16_t code) { - do_code16 (code, register_code); + if (IS_MOD(code) || code == KC_NO) { + do_code16 (code, qk_register_mods); + } else { + do_code16 (code, qk_register_weak_mods); + } register_code (code); } void unregister_code16 (uint16_t code) { unregister_code (code); - do_code16 (code, unregister_code); + if (IS_MOD(code) || code == KC_NO) { + do_code16 (code, qk_unregister_mods); + } else { + do_code16 (code, qk_unregister_weak_mods); + } } __attribute__ ((weak)) @@ -54,8 +114,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { void reset_keyboard(void) { clear_keyboard(); -#ifdef AUDIO_ENABLE - stop_all_notes(); +#if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_ENABLE_BASIC)) + music_all_notes_off(); shutdown_user(); #endif wait_ms(250); @@ -75,6 +135,7 @@ void reset_keyboard(void) { #endif static bool shift_interrupted[2] = {0, 0}; +static uint16_t scs_timer = 0; bool process_record_quantum(keyrecord_t *record) { @@ -108,10 +169,13 @@ bool process_record_quantum(keyrecord_t *record) { if (!( process_record_kb(keycode, record) && - #ifdef MIDI_ENABLE + #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) process_midi(keycode, record) && #endif #ifdef AUDIO_ENABLE + process_audio(keycode, record) && + #endif + #if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) process_music(keycode, record) && #endif #ifdef TAP_DANCE_ENABLE @@ -123,12 +187,18 @@ bool process_record_quantum(keyrecord_t *record) { #ifndef DISABLE_CHORDING process_chording(keycode, record) && #endif + #ifdef COMBO_ENABLE + process_combo(keycode, record) && + #endif #ifdef UNICODE_ENABLE process_unicode(keycode, record) && #endif #ifdef UCIS_ENABLE process_ucis(keycode, record) && #endif + #ifdef PRINTING_ENABLE + process_printer(keycode, record) && + #endif #ifdef UNICODEMAP_ENABLE process_unicode_map(keycode, record) && #endif @@ -152,6 +222,26 @@ bool process_record_quantum(keyrecord_t *record) { } return false; break; + #ifdef FAUXCLICKY_ENABLE + case FC_TOG: + if (record->event.pressed) { + FAUXCLICKY_TOGGLE; + } + return false; + break; + case FC_ON: + if (record->event.pressed) { + FAUXCLICKY_ON; + } + return false; + break; + case FC_OFF: + if (record->event.pressed) { + FAUXCLICKY_OFF; + } + return false; + break; + #endif #ifdef RGBLIGHT_ENABLE case RGB_TOG: if (record->event.pressed) { @@ -202,6 +292,28 @@ bool process_record_quantum(keyrecord_t *record) { return false; break; #endif + #ifdef PROTOCOL_LUFA + case OUT_AUTO: + if (record->event.pressed) { + set_output(OUTPUT_AUTO); + } + return false; + break; + case OUT_USB: + if (record->event.pressed) { + set_output(OUTPUT_USB); + } + return false; + break; + #ifdef BLUETOOTH_ENABLE + case OUT_BT: + if (record->event.pressed) { + set_output(OUTPUT_BLUETOOTH); + } + return false; + break; + #endif + #endif case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO: if (record->event.pressed) { // MAGIC actions (BOOTMAGIC without the boot) @@ -283,6 +395,7 @@ bool process_record_quantum(keyrecord_t *record) { case KC_LSPO: { if (record->event.pressed) { shift_interrupted[0] = false; + scs_timer = timer_read (); register_mods(MOD_BIT(KC_LSFT)); } else { @@ -292,7 +405,7 @@ bool process_record_quantum(keyrecord_t *record) { shift_interrupted[1] = true; } #endif - if (!shift_interrupted[0]) { + if (!shift_interrupted[0] && timer_elapsed(scs_timer) < TAPPING_TERM) { register_code(LSPO_KEY); unregister_code(LSPO_KEY); } @@ -305,6 +418,7 @@ bool process_record_quantum(keyrecord_t *record) { case KC_RSPC: { if (record->event.pressed) { shift_interrupted[1] = false; + scs_timer = timer_read (); register_mods(MOD_BIT(KC_RSFT)); } else { @@ -314,7 +428,7 @@ bool process_record_quantum(keyrecord_t *record) { shift_interrupted[1] = true; } #endif - if (!shift_interrupted[1]) { + if (!shift_interrupted[1] && timer_elapsed(scs_timer) < TAPPING_TERM) { register_code(RSPC_KEY); unregister_code(RSPC_KEY); } @@ -496,6 +610,15 @@ void matrix_scan_quantum() { #ifdef TAP_DANCE_ENABLE matrix_scan_tap_dance(); #endif + + #ifdef COMBO_ENABLE + matrix_scan_combo(); + #endif + + #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN) + backlight_task(); + #endif + matrix_scan_kb(); } @@ -513,34 +636,45 @@ static const uint8_t backlight_pin = BACKLIGHT_PIN; # define COM1x1 COM1A1 # define OCR1x OCR1A #else -# error "Backlight pin not supported - use B5, B6, or B7" +# define NO_BACKLIGHT_CLOCK +#endif + +#ifndef BACKLIGHT_ON_STATE +#define BACKLIGHT_ON_STATE 0 #endif __attribute__ ((weak)) void backlight_init_ports(void) { - // Setup backlight pin as output and output low. + // Setup backlight pin as output and output to on state. // DDRx |= n _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF); - // PORTx &= ~n - _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); + #if BACKLIGHT_ON_STATE == 0 + // PORTx &= ~n + _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); + #else + // PORTx |= n + _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); + #endif - // Use full 16-bit resolution. - ICR1 = 0xFFFF; + #ifndef NO_BACKLIGHT_CLOCK + // Use full 16-bit resolution. + ICR1 = 0xFFFF; - // I could write a wall of text here to explain... but TL;DW - // Go read the ATmega32u4 datasheet. - // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on + // I could write a wall of text here to explain... but TL;DW + // Go read the ATmega32u4 datasheet. + // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on - // Pin PB7 = OCR1C (Timer 1, Channel C) - // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0 - // (i.e. start high, go low when counter matches.) - // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0 - // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 + // Pin PB7 = OCR1C (Timer 1, Channel C) + // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0 + // (i.e. start high, go low when counter matches.) + // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0 + // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1 - TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010; - TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; + TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010; + TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001; + #endif backlight_init(); #ifdef BACKLIGHT_BREATHING @@ -552,30 +686,73 @@ __attribute__ ((weak)) void backlight_set(uint8_t level) { // Prevent backlight blink on lowest level - // PORTx &= ~n - _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); + // #if BACKLIGHT_ON_STATE == 0 + // // PORTx &= ~n + // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); + // #else + // // PORTx |= n + // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); + // #endif if ( level == 0 ) { - // Turn off PWM control on backlight pin, revert to output low. - TCCR1A &= ~(_BV(COM1x1)); - OCR1x = 0x0; - } else if ( level == BACKLIGHT_LEVELS ) { - // Turn on PWM control of backlight pin - TCCR1A |= _BV(COM1x1); - // Set the brightness - OCR1x = 0xFFFF; - } else { - // Turn on PWM control of backlight pin - TCCR1A |= _BV(COM1x1); - // Set the brightness - OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2)); - } + #ifndef NO_BACKLIGHT_CLOCK + // Turn off PWM control on backlight pin, revert to output low. + TCCR1A &= ~(_BV(COM1x1)); + OCR1x = 0x0; + #else + // #if BACKLIGHT_ON_STATE == 0 + // // PORTx |= n + // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); + // #else + // // PORTx &= ~n + // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); + // #endif + #endif + } + #ifndef NO_BACKLIGHT_CLOCK + else if ( level == BACKLIGHT_LEVELS ) { + // Turn on PWM control of backlight pin + TCCR1A |= _BV(COM1x1); + // Set the brightness + OCR1x = 0xFFFF; + } + else { + // Turn on PWM control of backlight pin + TCCR1A |= _BV(COM1x1); + // Set the brightness + OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2)); + } + #endif #ifdef BACKLIGHT_BREATHING breathing_intensity_default(); #endif } +uint8_t backlight_tick = 0; + +void backlight_task(void) { + #ifdef NO_BACKLIGHT_CLOCK + if ((0xFFFF >> ((BACKLIGHT_LEVELS - backlight_config.level) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) { + #if BACKLIGHT_ON_STATE == 0 + // PORTx &= ~n + _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); + #else + // PORTx |= n + _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); + #endif + } else { + #if BACKLIGHT_ON_STATE == 0 + // PORTx |= n + _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); + #else + // PORTx &= ~n + _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); + #endif + } + backlight_tick = (backlight_tick + 1) % 16; + #endif +} #ifdef BACKLIGHT_BREATHING @@ -799,6 +976,64 @@ void backlight_set(uint8_t level) #endif // backlight +// Functions for spitting out values +// + +void send_dword(uint32_t number) { // this might not actually work + uint16_t word = (number >> 16); + send_word(word); + send_word(number & 0xFFFFUL); +} + +void send_word(uint16_t number) { + uint8_t byte = number >> 8; + send_byte(byte); + send_byte(number & 0xFF); +} + +void send_byte(uint8_t number) { + uint8_t nibble = number >> 4; + send_nibble(nibble); + send_nibble(number & 0xF); +} + +void send_nibble(uint8_t number) { + switch (number) { + case 0: + register_code(KC_0); + unregister_code(KC_0); + break; + case 1 ... 9: + register_code(KC_1 + (number - 1)); + unregister_code(KC_1 + (number - 1)); + break; + case 0xA ... 0xF: + register_code(KC_A + (number - 0xA)); + unregister_code(KC_A + (number - 0xA)); + break; + } +} + + +__attribute__((weak)) +uint16_t hex_to_keycode(uint8_t hex) +{ + if (hex == 0x0) { + return KC_0; + } else if (hex < 0xA) { + return KC_1 + (hex - 0x1); + } else { + return KC_A + (hex - 0xA); + } +} + +void api_send_unicode(uint32_t unicode) { +#ifdef API_ENABLE + uint8_t chunk[4]; + dword_to_bytes(unicode, chunk); + MT_SEND_DATA(DT_UNICODE, chunk, 5); +#endif +} __attribute__ ((weak)) void led_set_user(uint8_t usb_led) { diff --git a/quantum/quantum.h b/quantum/quantum.h index 0c604664..2bf18d09 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -1,3 +1,18 @@ +/* Copyright 2016-2017 Erez Zukerman, Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef QUANTUM_H #define QUANTUM_H @@ -15,7 +30,6 @@ #ifdef RGBLIGHT_ENABLE #include "rgblight.h" #endif - #include "action_layer.h" #include "eeconfig.h" #include @@ -36,11 +50,16 @@ extern uint32_t default_layer_state; #ifdef MIDI_ENABLE #include +#ifdef MIDI_ADVANCED #include "process_midi.h" #endif +#endif // MIDI_ENABLE #ifdef AUDIO_ENABLE - #include "audio.h" + #include "process_audio.h" +#endif + +#if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) #include "process_music.h" #endif @@ -57,8 +76,24 @@ extern uint32_t default_layer_state; #include "process_unicode.h" #endif +#ifdef UCIS_ENABLE + #include "process_ucis.h" +#endif + +#ifdef UNICODEMAP_ENABLE + #include "process_unicodemap.h" +#endif + #include "process_tap_dance.h" +#ifdef PRINTING_ENABLE + #include "process_printer.h" +#endif + +#ifdef COMBO_ENABLE + #include "process_combo.h" +#endif + #define SEND_STRING(str) send_string(PSTR(str)) void send_string(const char *str); @@ -88,6 +123,7 @@ void unregister_code16 (uint16_t code); #ifdef BACKLIGHT_ENABLE void backlight_init_ports(void); +void backlight_task(void); #ifdef BACKLIGHT_BREATHING void breathing_enable(void); @@ -106,8 +142,15 @@ void breathing_speed_dec(uint8_t value); #endif #endif +void send_dword(uint32_t number); +void send_word(uint16_t number); +void send_byte(uint8_t number); +void send_nibble(uint8_t number); +uint16_t hex_to_keycode(uint8_t hex); void led_set_user(uint8_t usb_led); void led_set_kb(uint8_t usb_led); +void api_send_unicode(uint32_t unicode); + #endif diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h new file mode 100644 index 00000000..7354ae0d --- /dev/null +++ b/quantum/quantum_keycodes.h @@ -0,0 +1,600 @@ +/* Copyright 2016-2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef QUANTUM_KEYCODES_H +#define QUANTUM_KEYCODES_H + +#ifndef MIDI_ENABLE_STRICT +#define MIDI_ENABLE_STRICT 0 +#endif + +#if !MIDI_ENABLE_STRICT || (defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)) +#ifndef MIDI_TONE_KEYCODE_OCTAVES +#define MIDI_TONE_KEYCODE_OCTAVES 3 +#endif +#endif + +enum quantum_keycodes { + // Ranges used in shortucuts - not to be used directly + QK_TMK = 0x0000, + QK_TMK_MAX = 0x00FF, + QK_MODS = 0x0100, + QK_LCTL = 0x0100, + QK_LSFT = 0x0200, + QK_LALT = 0x0400, + QK_LGUI = 0x0800, + QK_RMODS_MIN = 0x1000, + QK_RCTL = 0x1100, + QK_RSFT = 0x1200, + QK_RALT = 0x1400, + QK_RGUI = 0x1800, + QK_MODS_MAX = 0x1FFF, + QK_FUNCTION = 0x2000, + QK_FUNCTION_MAX = 0x2FFF, + QK_MACRO = 0x3000, + QK_MACRO_MAX = 0x3FFF, + QK_LAYER_TAP = 0x4000, + QK_LAYER_TAP_MAX = 0x4FFF, + QK_TO = 0x5000, + QK_TO_MAX = 0x50FF, + QK_MOMENTARY = 0x5100, + QK_MOMENTARY_MAX = 0x51FF, + QK_DEF_LAYER = 0x5200, + QK_DEF_LAYER_MAX = 0x52FF, + QK_TOGGLE_LAYER = 0x5300, + QK_TOGGLE_LAYER_MAX = 0x53FF, + QK_ONE_SHOT_LAYER = 0x5400, + QK_ONE_SHOT_LAYER_MAX = 0x54FF, + QK_ONE_SHOT_MOD = 0x5500, + QK_ONE_SHOT_MOD_MAX = 0x55FF, +#ifndef DISABLE_CHORDING + QK_CHORDING = 0x5600, + QK_CHORDING_MAX = 0x56FF, +#endif + QK_TAP_DANCE = 0x5700, + QK_TAP_DANCE_MAX = 0x57FF, + QK_LAYER_TAP_TOGGLE = 0x5800, + QK_LAYER_TAP_TOGGLE_MAX = 0x58FF, + QK_MOD_TAP = 0x6000, + QK_MOD_TAP_MAX = 0x7FFF, +#if defined(UNICODEMAP_ENABLE) && defined(UNICODE_ENABLE) + #error "Cannot enable both UNICODEMAP && UNICODE" +#endif +#ifdef UNICODE_ENABLE + QK_UNICODE = 0x8000, + QK_UNICODE_MAX = 0xFFFF, +#endif +#ifdef UNICODEMAP_ENABLE + QK_UNICODE_MAP = 0x8000, + QK_UNICODE_MAP_MAX = 0x83FF, +#endif + + // Loose keycodes - to be used directly + + RESET = 0x5C00, + DEBUG, + MAGIC_SWAP_CONTROL_CAPSLOCK, + MAGIC_CAPSLOCK_TO_CONTROL, + MAGIC_SWAP_LALT_LGUI, + MAGIC_SWAP_RALT_RGUI, + MAGIC_NO_GUI, + MAGIC_SWAP_GRAVE_ESC, + MAGIC_SWAP_BACKSLASH_BACKSPACE, + MAGIC_HOST_NKRO, + MAGIC_SWAP_ALT_GUI, + MAGIC_UNSWAP_CONTROL_CAPSLOCK, + MAGIC_UNCAPSLOCK_TO_CONTROL, + MAGIC_UNSWAP_LALT_LGUI, + MAGIC_UNSWAP_RALT_RGUI, + MAGIC_UNNO_GUI, + MAGIC_UNSWAP_GRAVE_ESC, + MAGIC_UNSWAP_BACKSLASH_BACKSPACE, + MAGIC_UNHOST_NKRO, + MAGIC_UNSWAP_ALT_GUI, + MAGIC_TOGGLE_NKRO, + + // Leader key +#ifndef DISABLE_LEADER + KC_LEAD, +#endif + + // Audio on/off/toggle + AU_ON, + AU_OFF, + AU_TOG, + +#ifdef FAUXCLICKY_ENABLE + // Faux clicky + FC_ON, + FC_OFF, + FC_TOG, +#endif + + // Music mode on/off/toggle + MU_ON, + MU_OFF, + MU_TOG, + + // Music voice iterate + MUV_IN, + MUV_DE, + + // Midi +#if !MIDI_ENABLE_STRICT || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) + MI_ON, // send midi notes when music mode is enabled + MI_OFF, // don't send midi notes when music mode is enabled +#endif + +#if !MIDI_ENABLE_STRICT || (defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)) + MIDI_TONE_MIN, + +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 0 + MI_C = MIDI_TONE_MIN, + MI_Cs, + MI_Db = MI_Cs, + MI_D, + MI_Ds, + MI_Eb = MI_Ds, + MI_E, + MI_F, + MI_Fs, + MI_Gb = MI_Fs, + MI_G, + MI_Gs, + MI_Ab = MI_Gs, + MI_A, + MI_As, + MI_Bb = MI_As, + MI_B, +#endif + +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 1 + MI_C_1, + MI_Cs_1, + MI_Db_1 = MI_Cs_1, + MI_D_1, + MI_Ds_1, + MI_Eb_1 = MI_Ds_1, + MI_E_1, + MI_F_1, + MI_Fs_1, + MI_Gb_1 = MI_Fs_1, + MI_G_1, + MI_Gs_1, + MI_Ab_1 = MI_Gs_1, + MI_A_1, + MI_As_1, + MI_Bb_1 = MI_As_1, + MI_B_1, +#endif + +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 2 + MI_C_2, + MI_Cs_2, + MI_Db_2 = MI_Cs_2, + MI_D_2, + MI_Ds_2, + MI_Eb_2 = MI_Ds_2, + MI_E_2, + MI_F_2, + MI_Fs_2, + MI_Gb_2 = MI_Fs_2, + MI_G_2, + MI_Gs_2, + MI_Ab_2 = MI_Gs_2, + MI_A_2, + MI_As_2, + MI_Bb_2 = MI_As_2, + MI_B_2, +#endif + +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 3 + MI_C_3, + MI_Cs_3, + MI_Db_3 = MI_Cs_3, + MI_D_3, + MI_Ds_3, + MI_Eb_3 = MI_Ds_3, + MI_E_3, + MI_F_3, + MI_Fs_3, + MI_Gb_3 = MI_Fs_3, + MI_G_3, + MI_Gs_3, + MI_Ab_3 = MI_Gs_3, + MI_A_3, + MI_As_3, + MI_Bb_3 = MI_As_3, + MI_B_3, +#endif + +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 4 + MI_C_4, + MI_Cs_4, + MI_Db_4 = MI_Cs_4, + MI_D_4, + MI_Ds_4, + MI_Eb_4 = MI_Ds_4, + MI_E_4, + MI_F_4, + MI_Fs_4, + MI_Gb_4 = MI_Fs_4, + MI_G_4, + MI_Gs_4, + MI_Ab_4 = MI_Gs_4, + MI_A_4, + MI_As_4, + MI_Bb_4 = MI_As_4, + MI_B_4, +#endif + +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 5 + MI_C_5, + MI_Cs_5, + MI_Db_5 = MI_Cs_5, + MI_D_5, + MI_Ds_5, + MI_Eb_5 = MI_Ds_5, + MI_E_5, + MI_F_5, + MI_Fs_5, + MI_Gb_5 = MI_Fs_5, + MI_G_5, + MI_Gs_5, + MI_Ab_5 = MI_Gs_5, + MI_A_5, + MI_As_5, + MI_Bb_5 = MI_As_5, + MI_B_5, +#endif + +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 5 + MIDI_TONE_MAX = MI_B_5, +#elif MIDI_TONE_KEYCODE_OCTAVES > 4 + MIDI_TONE_MAX = MI_B_4, +#elif MIDI_TONE_KEYCODE_OCTAVES > 3 + MIDI_TONE_MAX = MI_B_3, +#elif MIDI_TONE_KEYCODE_OCTAVES > 2 + MIDI_TONE_MAX = MI_B_2, +#elif MIDI_TONE_KEYCODE_OCTAVES > 1 + MIDI_TONE_MAX = MI_B_1, +#elif MIDI_TONE_KEYCODE_OCTAVES > 0 + MIDI_TONE_MAX = MI_B, +#endif + + MIDI_OCTAVE_MIN, + MI_OCT_N2 = MIDI_OCTAVE_MIN, + MI_OCT_N1, + MI_OCT_0, + MI_OCT_1, + MI_OCT_2, + MI_OCT_3, + MI_OCT_4, + MI_OCT_5, + MI_OCT_6, + MI_OCT_7, + MIDI_OCTAVE_MAX = MI_OCT_7, + MI_OCTD, // octave down + MI_OCTU, // octave up + + MIDI_TRANSPOSE_MIN, + MI_TRNS_N6 = MIDI_TRANSPOSE_MIN, + MI_TRNS_N5, + MI_TRNS_N4, + MI_TRNS_N3, + MI_TRNS_N2, + MI_TRNS_N1, + MI_TRNS_0, + MI_TRNS_1, + MI_TRNS_2, + MI_TRNS_3, + MI_TRNS_4, + MI_TRNS_5, + MI_TRNS_6, + MIDI_TRANSPOSE_MAX = MI_TRNS_6, + MI_TRNSD, // transpose down + MI_TRNSU, // transpose up + + MIDI_VELOCITY_MIN, + MI_VEL_1 = MIDI_VELOCITY_MIN, + MI_VEL_2, + MI_VEL_3, + MI_VEL_4, + MI_VEL_5, + MI_VEL_6, + MI_VEL_7, + MI_VEL_8, + MI_VEL_9, + MI_VEL_10, + MIDI_VELOCITY_MAX = MI_VEL_10, + MI_VELD, // velocity down + MI_VELU, // velocity up + + MIDI_CHANNEL_MIN, + MI_CH1 = MIDI_CHANNEL_MIN, + MI_CH2, + MI_CH3, + MI_CH4, + MI_CH5, + MI_CH6, + MI_CH7, + MI_CH8, + MI_CH9, + MI_CH10, + MI_CH11, + MI_CH12, + MI_CH13, + MI_CH14, + MI_CH15, + MI_CH16, + MIDI_CHANNEL_MAX = MI_CH16, + MI_CHD, // previous channel + MI_CHU, // next channel + + MI_ALLOFF, // all notes off + + MI_SUS, // sustain + MI_PORT, // portamento + MI_SOST, // sostenuto + MI_SOFT, // soft pedal + MI_LEG, // legato + + MI_MOD, // modulation + MI_MODSD, // decrease modulation speed + MI_MODSU, // increase modulation speed +#endif // MIDI_ADVANCED + + // Backlight functionality + BL_0, + BL_1, + BL_2, + BL_3, + BL_4, + BL_5, + BL_6, + BL_7, + BL_8, + BL_9, + BL_10, + BL_11, + BL_12, + BL_13, + BL_14, + BL_15, + BL_DEC, + BL_INC, + BL_TOGG, + BL_STEP, + + // RGB functionality + RGB_TOG, + RGB_MOD, + RGB_HUI, + RGB_HUD, + RGB_SAI, + RGB_SAD, + RGB_VAI, + RGB_VAD, + + // Left shift, open paren + KC_LSPO, + + // Right shift, close paren + KC_RSPC, + + // Printing + PRINT_ON, + PRINT_OFF, + + // output selection + OUT_AUTO, + OUT_USB, +#ifdef BLUETOOTH_ENABLE + OUT_BT, +#endif + + // always leave at the end + SAFE_RANGE +}; + +// Ability to use mods in layouts +#define LCTL(kc) (kc | QK_LCTL) +#define LSFT(kc) (kc | QK_LSFT) +#define LALT(kc) (kc | QK_LALT) +#define LGUI(kc) (kc | QK_LGUI) +#define RCTL(kc) (kc | QK_RCTL) +#define RSFT(kc) (kc | QK_RSFT) +#define RALT(kc) (kc | QK_RALT) +#define RGUI(kc) (kc | QK_RGUI) + +#define HYPR(kc) (kc | QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI) +#define MEH(kc) (kc | QK_LCTL | QK_LSFT | QK_LALT) +#define LCAG(kc) (kc | QK_LCTL | QK_LALT | QK_LGUI) +#define ALTG(kc) (kc | QK_RCTL | QK_RALT) +#define SCMD(kc) (kc | QK_LGUI | QK_LSFT) +#define SWIN(kc) SCMD(kc) +#define LCA(kc) (kc | QK_LCTL | QK_LALT) + +#define MOD_HYPR 0xf +#define MOD_MEH 0x7 + + +// Aliases for shifted symbols +// Each key has a 4-letter code, and some have longer aliases too. +// While the long aliases are descriptive, the 4-letter codes +// make for nicer grid layouts (everything lines up), and are +// the preferred style for Quantum. +#define KC_TILD LSFT(KC_GRV) // ~ +#define KC_TILDE KC_TILD + +#define KC_EXLM LSFT(KC_1) // ! +#define KC_EXCLAIM KC_EXLM + +#define KC_AT LSFT(KC_2) // @ + +#define KC_HASH LSFT(KC_3) // # + +#define KC_DLR LSFT(KC_4) // $ +#define KC_DOLLAR KC_DLR + +#define KC_PERC LSFT(KC_5) // % +#define KC_PERCENT KC_PERC + +#define KC_CIRC LSFT(KC_6) // ^ +#define KC_CIRCUMFLEX KC_CIRC + +#define KC_AMPR LSFT(KC_7) // & +#define KC_AMPERSAND KC_AMPR + +#define KC_ASTR LSFT(KC_8) // * +#define KC_ASTERISK KC_ASTR + +#define KC_LPRN LSFT(KC_9) // ( +#define KC_LEFT_PAREN KC_LPRN + +#define KC_RPRN LSFT(KC_0) // ) +#define KC_RIGHT_PAREN KC_RPRN + +#define KC_UNDS LSFT(KC_MINS) // _ +#define KC_UNDERSCORE KC_UNDS + +#define KC_PLUS LSFT(KC_EQL) // + + +#define KC_LCBR LSFT(KC_LBRC) // { +#define KC_LEFT_CURLY_BRACE KC_LCBR + +#define KC_RCBR LSFT(KC_RBRC) // } +#define KC_RIGHT_CURLY_BRACE KC_RCBR + +#define KC_LABK LSFT(KC_COMM) // < +#define KC_LEFT_ANGLE_BRACKET KC_LABK + +#define KC_RABK LSFT(KC_DOT) // > +#define KC_RIGHT_ANGLE_BRACKET KC_RABK + +#define KC_COLN LSFT(KC_SCLN) // : +#define KC_COLON KC_COLN + +#define KC_PIPE LSFT(KC_BSLS) // | + +#define KC_LT LSFT(KC_COMM) // < + +#define KC_GT LSFT(KC_DOT) // > + +#define KC_QUES LSFT(KC_SLSH) // ? +#define KC_QUESTION KC_QUES + +#define KC_DQT LSFT(KC_QUOT) // " +#define KC_DOUBLE_QUOTE KC_DQT +#define KC_DQUO KC_DQT + +#define KC_DELT KC_DELETE // Del key (four letter code) + +// Alias for function layers than expand past FN31 +#define FUNC(kc) (kc | QK_FUNCTION) + +// Aliases +#define S(kc) LSFT(kc) +#define F(kc) FUNC(kc) + +#define M(kc) (kc | QK_MACRO) + +#define MACROTAP(kc) (kc | QK_MACRO | FUNC_TAP<<8) +#define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE) + + +// L-ayer, T-ap - 256 keycode max, 16 layer max +#define LT(layer, kc) (kc | QK_LAYER_TAP | ((layer & 0xF) << 8)) + +#define AG_SWAP MAGIC_SWAP_ALT_GUI +#define AG_NORM MAGIC_UNSWAP_ALT_GUI + +#define BL_ON BL_9 +#define BL_OFF BL_0 + +// GOTO layer - 16 layers max +// when: +// ON_PRESS = 1 +// ON_RELEASE = 2 +// Unless you have a good reason not to do so, prefer ON_PRESS (1) as your default. +// In fact, we changed it to assume ON_PRESS for sanity/simplicity. If needed, you can add your own +// keycode modeled after the old version, kept below for this. +/* #define TO(layer, when) (layer | QK_TO | (when << 0x4)) */ +#define TO(layer) (layer | QK_TO | (ON_PRESS << 0x4)) + +// Momentary switch layer - 256 layer max +#define MO(layer) (layer | QK_MOMENTARY) + +// Set default layer - 256 layer max +#define DF(layer) (layer | QK_DEF_LAYER) + +// Toggle to layer - 256 layer max +#define TG(layer) (layer | QK_TOGGLE_LAYER) + +// One-shot layer - 256 layer max +#define OSL(layer) (layer | QK_ONE_SHOT_LAYER) + +// One-shot mod +#define OSM(mod) (mod | QK_ONE_SHOT_MOD) + +// Layer tap-toggle +#define TT(layer) (layer | QK_LAYER_TAP_TOGGLE) + +// M-od, T-ap - 256 keycode max +#define MT(mod, kc) (kc | QK_MOD_TAP | ((mod & 0x1F) << 8)) + +#define CTL_T(kc) MT(MOD_LCTL, kc) +#define LCTL_T(kc) MT(MOD_LCTL, kc) +#define RCTL_T(kc) MT(MOD_RCTL, kc) + +#define SFT_T(kc) MT(MOD_LSFT, kc) +#define LSFT_T(kc) MT(MOD_LSFT, kc) +#define RSFT_T(kc) MT(MOD_RSFT, kc) + +#define ALT_T(kc) MT(MOD_LALT, kc) +#define LALT_T(kc) MT(MOD_LALT, kc) +#define RALT_T(kc) MT(MOD_RALT, kc) +#define ALGR_T(kc) MT(MOD_RALT, kc) // dual-function AltGR + +#define GUI_T(kc) MT(MOD_LGUI, kc) +#define LGUI_T(kc) MT(MOD_LGUI, kc) +#define RGUI_T(kc) MT(MOD_RGUI, kc) + +#define C_S_T(kc) MT((MOD_LCTL | MOD_LSFT), kc) // Control + Shift e.g. for gnome-terminal +#define MEH_T(kc) MT((MOD_LCTL | MOD_LSFT | MOD_LALT), kc) // Meh is a less hyper version of the Hyper key -- doesn't include Win or Cmd, so just alt+shift+ctrl +#define LCAG_T(kc) MT((MOD_LCTL | MOD_LALT | MOD_LGUI), kc) // Left control alt and gui +#define RCAG_T(kc) MT((MOD_RCTL | MOD_RALT | MOD_RGUI), kc) // Right control alt and gui +#define ALL_T(kc) MT((MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI), kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/ +#define SCMD_T(kc) MT((MOD_LGUI | MOD_LSFT), kc) +#define SWIN_T(kc) SCMD_T(kc) +#define LCA_T(kc) MT((MOD_LCTL | MOD_LALT), kc) // Left control and left alt + +// Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap +#define KC_HYPR HYPR(KC_NO) +#define KC_MEH MEH(KC_NO) + +#ifdef UNICODE_ENABLE + // For sending unicode codes. + // You may not send codes over 7FFF -- this supports most of UTF8. + // To have a key that sends out Œ, go UC(0x0152) + #define UNICODE(n) (n | QK_UNICODE) + #define UC(n) UNICODE(n) +#endif + +#ifdef UNICODEMAP_ENABLE + #define X(n) (n | QK_UNICODE_MAP) +#endif + +#endif // QUANTUM_KEYCODES_H diff --git a/quantum/rgblight.c b/quantum/rgblight.c index d550c586..eff70aae 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -1,3 +1,18 @@ +/* Copyright 2016-2017 Yang Liu + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include @@ -66,14 +81,17 @@ __attribute__ ((weak)) const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20}; __attribute__ ((weak)) const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {100, 50, 20}; +__attribute__ ((weak)) +const uint16_t RGBLED_GRADIENT_RANGES[] PROGMEM = {360, 240, 180, 120, 90}; rgblight_config_t rgblight_config; rgblight_config_t inmem_config; -struct cRGB led[RGBLED_NUM]; -uint8_t rgblight_inited = 0; +LED_TYPE led[RGBLED_NUM]; +uint8_t rgblight_inited = 0; +bool rgblight_timer_enabled = false; -void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1) { +void sethsv(uint16_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) { uint8_t r = 0, g = 0, b = 0, base, color; if (sat == 0) { // Acromatic color (gray). Hue doesn't mind. @@ -124,7 +142,7 @@ void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1) { setrgb(r, g, b, led1); } -void setrgb(uint8_t r, uint8_t g, uint8_t b, struct cRGB *led1) { +void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1) { (*led1).r = r; (*led1).g = g; (*led1).b = b; @@ -141,9 +159,9 @@ void eeconfig_update_rgblight_default(void) { dprintf("eeconfig_update_rgblight_default\n"); rgblight_config.enable = 1; rgblight_config.mode = 1; - rgblight_config.hue = 200; - rgblight_config.sat = 204; - rgblight_config.val = 204; + rgblight_config.hue = 0; + rgblight_config.sat = 255; + rgblight_config.val = 255; eeconfig_update_rgblight(rgblight_config.raw); } void eeconfig_debug_rgblight(void) { @@ -173,7 +191,7 @@ void rgblight_init(void) { } eeconfig_debug_rgblight(); // display current eeprom values - #if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER) + #ifdef RGBLIGHT_ANIMATIONS rgblight_timer_init(); // setup the timer #endif @@ -182,6 +200,19 @@ void rgblight_init(void) { } } +void rgblight_update_dword(uint32_t dword) { + rgblight_config.raw = dword; + eeconfig_update_rgblight(rgblight_config.raw); + if (rgblight_config.enable) + rgblight_mode(rgblight_config.mode); + else { + #ifdef RGBLIGHT_ANIMATIONS + rgblight_timer_disable(); + #endif + rgblight_set(); + } +} + void rgblight_increase(void) { uint8_t mode = 0; if (rgblight_config.mode < RGBLIGHT_MODES) { @@ -205,6 +236,14 @@ void rgblight_step(void) { } rgblight_mode(mode); } +void rgblight_step_reverse(void) { + uint8_t mode = 0; + mode = rgblight_config.mode - 1; + if (mode < 1) { + mode = RGBLIGHT_MODES; + } + rgblight_mode(mode); +} void rgblight_mode(uint8_t mode) { if (!rgblight_config.enable) { @@ -220,19 +259,25 @@ void rgblight_mode(uint8_t mode) { eeconfig_update_rgblight(rgblight_config.raw); xprintf("rgblight mode: %u\n", rgblight_config.mode); if (rgblight_config.mode == 1) { - #if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER) + #ifdef RGBLIGHT_ANIMATIONS rgblight_timer_disable(); #endif - } else if (rgblight_config.mode >= 2 && rgblight_config.mode <= 23) { + } else if (rgblight_config.mode >= 2 && rgblight_config.mode <= 24) { // MODE 2-5, breathing // MODE 6-8, rainbow mood // MODE 9-14, rainbow swirl // MODE 15-20, snake // MODE 21-23, knight - #if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER) + #ifdef RGBLIGHT_ANIMATIONS rgblight_timer_enable(); #endif + } else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) { + // MODE 25-34, static gradient + + #ifdef RGBLIGHT_ANIMATIONS + rgblight_timer_disable(); + #endif } rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val); } @@ -244,7 +289,7 @@ void rgblight_toggle(void) { if (rgblight_config.enable) { rgblight_mode(rgblight_config.mode); } else { - #if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER) + #ifdef RGBLIGHT_ANIMATIONS rgblight_timer_disable(); #endif _delay_ms(50); @@ -252,6 +297,13 @@ void rgblight_toggle(void) { } } +void rgblight_enable(void) { + rgblight_config.enable = 1; + eeconfig_update_rgblight(rgblight_config.raw); + xprintf("rgblight enable: rgblight_config.enable = %u\n", rgblight_config.enable); + rgblight_mode(rgblight_config.mode); +} + void rgblight_increase_hue(void) { uint16_t hue; @@ -307,7 +359,7 @@ void rgblight_decrease_val(void) { void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) { inmem_config.raw = rgblight_config.raw; if (rgblight_config.enable) { - struct cRGB tmp_led; + LED_TYPE tmp_led; sethsv(hue, sat, val, &tmp_led); inmem_config.hue = hue; inmem_config.sat = sat; @@ -329,6 +381,17 @@ void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val) { } else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 14) { // rainbow mood and rainbow swirl, ignore the change of hue hue = rgblight_config.hue; + } else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) { + // static gradient + uint16_t _hue; + int8_t direction = ((rgblight_config.mode - 25) % 2) ? -1 : 1; + uint16_t range = pgm_read_word(&RGBLED_GRADIENT_RANGES[(rgblight_config.mode - 25) / 2]); + for (uint8_t i = 0; i < RGBLED_NUM; i++) { + _hue = (range / RGBLED_NUM * i * direction + hue + 360) % 360; + dprintf("rgblight rainbow set hsv: %u,%u,%d,%u\n", i, _hue, direction, range); + sethsv(_hue, sat, val, (LED_TYPE *)&led[i]); + } + rgblight_set(); } } rgblight_config.hue = hue; @@ -349,68 +412,90 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) { rgblight_set(); } +__attribute__ ((weak)) void rgblight_set(void) { if (rgblight_config.enable) { - ws2812_setleds(led, RGBLED_NUM); + #ifdef RGBW + ws2812_setleds_rgbw(led, RGBLED_NUM); + #else + ws2812_setleds(led, RGBLED_NUM); + #endif } else { for (uint8_t i = 0; i < RGBLED_NUM; i++) { led[i].r = 0; led[i].g = 0; led[i].b = 0; } - ws2812_setleds(led, RGBLED_NUM); + #ifdef RGBW + ws2812_setleds_rgbw(led, RGBLED_NUM); + #else + ws2812_setleds(led, RGBLED_NUM); + #endif } } -#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER) +#ifdef RGBLIGHT_ANIMATIONS // Animation timer -- AVR Timer3 void rgblight_timer_init(void) { - static uint8_t rgblight_timer_is_init = 0; - if (rgblight_timer_is_init) { - return; - } - rgblight_timer_is_init = 1; - /* Timer 3 setup */ - TCCR3B = _BV(WGM32) //CTC mode OCR3A as TOP - | _BV(CS30); //Clock selelct: clk/1 - /* Set TOP value */ - uint8_t sreg = SREG; - cli(); - OCR3AH = (RGBLED_TIMER_TOP >> 8) & 0xff; - OCR3AL = RGBLED_TIMER_TOP & 0xff; - SREG = sreg; + // static uint8_t rgblight_timer_is_init = 0; + // if (rgblight_timer_is_init) { + // return; + // } + // rgblight_timer_is_init = 1; + // /* Timer 3 setup */ + // TCCR3B = _BV(WGM32) // CTC mode OCR3A as TOP + // | _BV(CS30); // Clock selelct: clk/1 + // /* Set TOP value */ + // uint8_t sreg = SREG; + // cli(); + // OCR3AH = (RGBLED_TIMER_TOP >> 8) & 0xff; + // OCR3AL = RGBLED_TIMER_TOP & 0xff; + // SREG = sreg; + + rgblight_timer_enabled = true; } void rgblight_timer_enable(void) { - TIMSK3 |= _BV(OCIE3A); + rgblight_timer_enabled = true; dprintf("TIMER3 enabled.\n"); } void rgblight_timer_disable(void) { - TIMSK3 &= ~_BV(OCIE3A); + rgblight_timer_enabled = false; dprintf("TIMER3 disabled.\n"); } void rgblight_timer_toggle(void) { - TIMSK3 ^= _BV(OCIE3A); + rgblight_timer_enabled ^= rgblight_timer_enabled; dprintf("TIMER3 toggled.\n"); } -ISR(TIMER3_COMPA_vect) { - // mode = 1, static light, do nothing here - if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) { - // mode = 2 to 5, breathing mode - rgblight_effect_breathing(rgblight_config.mode - 2); - } else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 8) { - // mode = 6 to 8, rainbow mood mod - rgblight_effect_rainbow_mood(rgblight_config.mode - 6); - } else if (rgblight_config.mode >= 9 && rgblight_config.mode <= 14) { - // mode = 9 to 14, rainbow swirl mode - rgblight_effect_rainbow_swirl(rgblight_config.mode - 9); - } else if (rgblight_config.mode >= 15 && rgblight_config.mode <= 20) { - // mode = 15 to 20, snake mode - rgblight_effect_snake(rgblight_config.mode - 15); - } else if (rgblight_config.mode >= 21 && rgblight_config.mode <= 23) { - // mode = 21 to 23, knight mode - rgblight_effect_knight(rgblight_config.mode - 21); +void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b) { + rgblight_enable(); + rgblight_mode(1); + rgblight_setrgb(r, g, b); +} + +void rgblight_task(void) { + if (rgblight_timer_enabled) { + // mode = 1, static light, do nothing here + if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) { + // mode = 2 to 5, breathing mode + rgblight_effect_breathing(rgblight_config.mode - 2); + } else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 8) { + // mode = 6 to 8, rainbow mood mod + rgblight_effect_rainbow_mood(rgblight_config.mode - 6); + } else if (rgblight_config.mode >= 9 && rgblight_config.mode <= 14) { + // mode = 9 to 14, rainbow swirl mode + rgblight_effect_rainbow_swirl(rgblight_config.mode - 9); + } else if (rgblight_config.mode >= 15 && rgblight_config.mode <= 20) { + // mode = 15 to 20, snake mode + rgblight_effect_snake(rgblight_config.mode - 15); + } else if (rgblight_config.mode >= 21 && rgblight_config.mode <= 23) { + // mode = 21 to 23, knight mode + rgblight_effect_knight(rgblight_config.mode - 21); + } else if (rgblight_config.mode == 24) { + // mode = 24, christmas mode + rgblight_effect_christmas(); + } } } @@ -449,7 +534,7 @@ void rgblight_effect_rainbow_swirl(uint8_t interval) { last_timer = timer_read(); for (i = 0; i < RGBLED_NUM; i++) { hue = (360 / RGBLED_NUM * i + current_hue) % 360; - sethsv(hue, rgblight_config.sat, rgblight_config.val, &led[i]); + sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]); } rgblight_set(); @@ -486,7 +571,7 @@ void rgblight_effect_snake(uint8_t interval) { k = k + RGBLED_NUM; } if (i == k) { - sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val*(RGBLIGHT_EFFECT_SNAKE_LENGTH-j)/RGBLIGHT_EFFECT_SNAKE_LENGTH), &led[i]); + sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val*(RGBLIGHT_EFFECT_SNAKE_LENGTH-j)/RGBLIGHT_EFFECT_SNAKE_LENGTH), (LED_TYPE *)&led[i]); } } } @@ -506,7 +591,7 @@ void rgblight_effect_knight(uint8_t interval) { static uint16_t last_timer = 0; uint8_t i, j, cur; int8_t k; - struct cRGB preled[RGBLED_NUM]; + LED_TYPE preled[RGBLED_NUM]; static int8_t increment = -1; if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_KNIGHT_INTERVALS[interval])) { return; @@ -525,7 +610,7 @@ void rgblight_effect_knight(uint8_t interval) { k = RGBLED_NUM - 1; } if (i == k) { - sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, &preled[i]); + sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&preled[i]); } } } @@ -555,4 +640,22 @@ void rgblight_effect_knight(uint8_t interval) { } } + +void rgblight_effect_christmas(void) { + static uint16_t current_offset = 0; + static uint16_t last_timer = 0; + uint16_t hue; + uint8_t i; + if (timer_elapsed(last_timer) < RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL) { + return; + } + last_timer = timer_read(); + current_offset = (current_offset + 1) % 2; + for (i = 0; i < RGBLED_NUM; i++) { + hue = 0 + ((i/RGBLIGHT_EFFECT_CHRISTMAS_STEP + current_offset) % 2) * 120; + sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]); + } + rgblight_set(); +} + #endif diff --git a/quantum/rgblight.h b/quantum/rgblight.h index 17f04ffc..92130192 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -1,9 +1,23 @@ +/* Copyright 2017 Yang Liu + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef RGBLIGHT_H #define RGBLIGHT_H - -#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER) - #define RGBLIGHT_MODES 23 +#ifdef RGBLIGHT_ANIMATIONS + #define RGBLIGHT_MODES 34 #else #define RGBLIGHT_MODES 1 #endif @@ -23,6 +37,14 @@ #define RGBLIGHT_EFFECT_DUALKNIGHT_LENGTH 4 #endif +#ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL +#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 1000 +#endif + +#ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP +#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 2 +#endif + #ifndef RGBLIGHT_HUE_STEP #define RGBLIGHT_HUE_STEP 10 #endif @@ -34,12 +56,15 @@ #endif #define RGBLED_TIMER_TOP F_CPU/(256*64) +// #define RGBLED_TIMER_TOP 0xFF10 #include #include #include "eeconfig.h" #include "light_ws2812.h" +extern LED_TYPE led[RGBLED_NUM]; + extern const uint8_t RGBLED_BREATHING_INTERVALS[4] PROGMEM; extern const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[3] PROGMEM; extern const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[3] PROGMEM; @@ -61,9 +86,12 @@ void rgblight_init(void); void rgblight_increase(void); void rgblight_decrease(void); void rgblight_toggle(void); +void rgblight_enable(void); void rgblight_step(void); +void rgblight_step_reverse(void); void rgblight_mode(uint8_t mode); void rgblight_set(void); +void rgblight_update_dword(uint32_t dword); void rgblight_increase_hue(void); void rgblight_decrease_hue(void); void rgblight_increase_sat(void); @@ -78,10 +106,15 @@ void eeconfig_update_rgblight(uint32_t val); void eeconfig_update_rgblight_default(void); void eeconfig_debug_rgblight(void); -void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1); -void setrgb(uint8_t r, uint8_t g, uint8_t b, struct cRGB *led1); +void sethsv(uint16_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1); +void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1); void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val); +#define EZ_RGB(val) rgblight_show_solid_color((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF) +void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b); + +void rgblight_task(void); + void rgblight_timer_init(void); void rgblight_timer_enable(void); void rgblight_timer_disable(void); @@ -91,5 +124,6 @@ void rgblight_effect_rainbow_mood(uint8_t interval); void rgblight_effect_rainbow_swirl(uint8_t interval); void rgblight_effect_snake(uint8_t interval); void rgblight_effect_knight(uint8_t interval); +void rgblight_effect_christmas(void); #endif diff --git a/quantum/serial_link/LICENSE b/quantum/serial_link/LICENSE index d7cc3198..d13cc4b2 100644 --- a/quantum/serial_link/LICENSE +++ b/quantum/serial_link/LICENSE @@ -1,7 +1,5 @@ The MIT License (MIT) -Copyright (c) 2016 Fred Sundvik - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights diff --git a/quantum/template/Makefile b/quantum/template/Makefile index 4e2a6f00..840dc9a2 100644 --- a/quantum/template/Makefile +++ b/quantum/template/Makefile @@ -1,3 +1,18 @@ +# Copyright 2013 Jun Wako +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + ifndef MAKEFILE_INCLUDED include ../../Makefile -endif \ No newline at end of file +endif diff --git a/quantum/template/config.h b/quantum/template/config.h index b02f0c7e..dbca4576 100644 --- a/quantum/template/config.h +++ b/quantum/template/config.h @@ -1,5 +1,5 @@ /* -Copyright 2012 Jun Wako +Copyright 2017 REPLACE_WITH_YOUR_NAME This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -46,7 +46,7 @@ along with this program. If not, see . #define MATRIX_COL_PINS { F1, F0, B0 } #define UNUSED_PINS -/* COL2ROW or ROW2COL */ +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION COL2ROW // #define BACKLIGHT_PIN B7 @@ -159,4 +159,27 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + #endif diff --git a/quantum/template/keymaps/default/Makefile b/quantum/template/keymaps/default/Makefile index f4671a9d..b8879076 100644 --- a/quantum/template/keymaps/default/Makefile +++ b/quantum/template/keymaps/default/Makefile @@ -1,4 +1,20 @@ -# Build Options +# Copyright 2013 Jun Wako +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# QMK Build Options # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # @@ -9,7 +25,7 @@ CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID @@ -18,4 +34,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/quantum/template/keymaps/default/config.h b/quantum/template/keymaps/default/config.h index df06a262..f52a97bb 100644 --- a/quantum/template/keymaps/default/config.h +++ b/quantum/template/keymaps/default/config.h @@ -1,3 +1,19 @@ +/* Copyright 2017 REPLACE_WITH_YOUR_NAME + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef CONFIG_USER_H #define CONFIG_USER_H @@ -5,4 +21,4 @@ // place overrides here -#endif \ No newline at end of file +#endif diff --git a/quantum/template/keymaps/default/keymap.c b/quantum/template/keymaps/default/keymap.c index e28a4723..a123cd7b 100644 --- a/quantum/template/keymaps/default/keymap.c +++ b/quantum/template/keymaps/default/keymap.c @@ -1,3 +1,18 @@ +/* Copyright 2017 REPLACE_WITH_YOUR_NAME + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "%KEYBOARD%.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -41,4 +56,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { void led_set_user(uint8_t usb_led) { -} \ No newline at end of file +} diff --git a/quantum/template/rules.mk b/quantum/template/rules.mk index 55898147..a1f9377d 100644 --- a/quantum/template/rules.mk +++ b/quantum/template/rules.mk @@ -61,7 +61,8 @@ SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work NKRO_ENABLE ?= no # USB Nkey Rollover BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE ?= no # MIDI controls +MIDI_ENABLE ?= no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE ?= no # Unicode BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE ?= no # Audio output on port C6 +FAUXCLICKY_ENABLE ?= no # Use buzzer to emulate clicky switches diff --git a/quantum/template/template.c b/quantum/template/template.c index 5ef34958..97f78865 100644 --- a/quantum/template/template.c +++ b/quantum/template/template.c @@ -1,3 +1,18 @@ +/* Copyright 2017 REPLACE_WITH_YOUR_NAME + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "%KEYBOARD%.h" void matrix_init_kb(void) { diff --git a/quantum/template/template.h b/quantum/template/template.h index cd78a54e..e912188b 100644 --- a/quantum/template/template.h +++ b/quantum/template/template.h @@ -1,3 +1,18 @@ +/* Copyright 2017 REPLACE_WITH_YOUR_NAME + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef %KEYBOARD_UPPERCASE%_H #define %KEYBOARD_UPPERCASE%_H diff --git a/quantum/variable_trace.c b/quantum/variable_trace.c index de580244..713747cf 100644 --- a/quantum/variable_trace.c +++ b/quantum/variable_trace.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "variable_trace.h" #include #include diff --git a/quantum/variable_trace.h b/quantum/variable_trace.h index 46bd8278..dacc1385 100644 --- a/quantum/variable_trace.h +++ b/quantum/variable_trace.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef VARIABLE_TRACE_H #define VARIABLE_TRACE_H diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 54f6faaa..5826d909 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c @@ -53,10 +53,13 @@ SOFTWARE. #define "Visualizer thread priority not defined" #endif +// mods status +#include "action_util.h" static visualizer_keyboard_status_t current_status = { .layer = 0xFFFFFFFF, .default_layer = 0xFFFFFFFF, + .mods = 0xFF, .leds = 0xFFFFFFFF, .suspended = false, }; @@ -64,6 +67,7 @@ static visualizer_keyboard_status_t current_status = { static bool same_status(visualizer_keyboard_status_t* status1, visualizer_keyboard_status_t* status2) { return status1->layer == status2->layer && status1->default_layer == status2->default_layer && + status1->mods == status2->mods && status1->leds == status2->leds && status1->suspended == status2->suspended; } @@ -307,6 +311,45 @@ bool keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_s gdispFlush(); return false; } + +static void format_mods_bitmap_string(uint8_t mods, char* buffer) { + *buffer = ' '; + ++buffer; + + for (int i = 0; i<8; i++) + { + uint32_t mask = (1u << i); + if (mods & mask) { + *buffer = '1'; + } else { + *buffer = '0'; + } + ++buffer; + + if (i==3) { + *buffer = ' '; + ++buffer; + } + } + *buffer = 0; +} + +bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + + const char* title = "Modifier states"; + const char* mods_header = " CSAG CSAG "; + char status_buffer[12]; + + gdispClear(White); + gdispDrawString(0, 0, title, state->font_fixed5x8, Black); + gdispDrawString(0, 10, mods_header, state->font_fixed5x8, Black); + format_mods_bitmap_string(state->status.mods, status_buffer); + gdispDrawString(0, 20, status_buffer, state->font_fixed5x8, Black); + + gdispFlush(); + return false; +} #endif // LCD_ENABLE bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state) { @@ -350,6 +393,7 @@ static DECLARE_THREAD_FUNCTION(visualizerThread, arg) { visualizer_keyboard_status_t initial_status = { .default_layer = 0xFFFFFFFF, .layer = 0xFFFFFFFF, + .mods = 0xFF, .leds = 0xFFFFFFFF, .suspended = false, }; @@ -499,7 +543,18 @@ void update_status(bool changed) { #endif } -void visualizer_update(uint32_t default_state, uint32_t state, uint32_t leds) { +uint8_t visualizer_get_mods() { + uint8_t mods = get_mods(); + +#ifndef NO_ACTION_ONESHOT + if (!has_oneshot_mods_timed_out()) { + mods |= get_oneshot_mods(); + } +#endif + return mods; +} + +void visualizer_update(uint32_t default_state, uint32_t state, uint8_t mods, uint32_t leds) { // Note that there's a small race condition here, the thread could read // a state where one of these are set but not the other. But this should // not really matter as it will be fixed during the next loop step. @@ -523,6 +578,7 @@ void visualizer_update(uint32_t default_state, uint32_t state, uint32_t leds) { visualizer_keyboard_status_t new_status = { .layer = state, .default_layer = default_state, + .mods = mods, .leds = leds, .suspended = current_status.suspended, }; diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index 53e25072..315af502 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h @@ -34,10 +34,14 @@ SOFTWARE. #include "lcd_backlight.h" #endif +// use this function to merget both real_mods and oneshot_mods in a uint16_t +uint8_t visualizer_get_mods(void); + // This need to be called once at the start void visualizer_init(void); // This should be called at every matrix scan -void visualizer_update(uint32_t default_state, uint32_t state, uint32_t leds); +void visualizer_update(uint32_t default_state, uint32_t state, uint8_t mods, uint32_t leds); + // This should be called when the keyboard goes to suspend state void visualizer_suspend(void); // This should be called when the keyboard wakes up from suspend state @@ -61,6 +65,7 @@ struct keyframe_animation_t; typedef struct { uint32_t layer; uint32_t default_layer; + uint8_t mods; uint32_t leds; // See led.h for available statuses bool suspended; } visualizer_keyboard_status_t; @@ -129,6 +134,8 @@ bool keyframe_set_backlight_color(keyframe_animation_t* animation, visualizer_st bool keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_state_t* state); // Displays a bitmap (0/1) of all the currently active layers bool keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); +// Displays a bitmap (0/1) of all the currently active mods +bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); diff --git a/readme.md b/readme.md index d5a259cc..b2dfc5f7 100644 --- a/readme.md +++ b/readme.md @@ -1,10 +1,10 @@ # Quantum Mechanical Keyboard Firmware -[![Build Status](https://travis-ci.org/jackhumbert/qmk_firmware.svg?branch=master)](https://travis-ci.org/jackhumbert/qmk_firmware) +[![Build Status](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware) [![Gitter](https://badges.gitter.im/qmk/qmk_firmware.svg)](https://gitter.im/qmk/qmk_firmware?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) This is a keyboard firmware based on the [tmk_keyboard firmware](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.com), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/). -## Official website +## Official website (currently under construction with the move to the wiki) For an easy-to-read version of this document and the repository, check out [http://qmk.fm](http://qmk.fm). Nicely formatted keyboard and keymap listings are also available there, along with the ability to download .hex files instead of having to setup a build environment and compile them. @@ -23,7 +23,7 @@ The project also includes community support for [lots of other keyboards](/keybo QMK is developed and maintained by Jack Humbert of OLKB with contributions from the community, and of course, [Hasu](https://github.com/tmk). This repo used to be a fork of [TMK](https://github.com/tmk/tmk_keyboard), and we are incredibly grateful for his founding contributions to the firmware. We've had to break the fork due to purely technical reasons - it simply became too different over time, and we've had to start refactoring some of the basic bits and pieces. We are huge fans of TMK and Hasu :) -This documentation is edited and maintained by Erez Zukerman of ErgoDox EZ. If you spot any typos or inaccuracies, please [open an issue](https://github.com/jackhumbert/qmk_firmware/issues/new). +This documentation is edited and maintained by Erez Zukerman of ErgoDox EZ. If you spot any typos or inaccuracies, please [open an issue](https://github.com/qmk/qmk_firmware/issues/new). The OLKB product firmwares are maintained by [Jack Humbert](https://github.com/jackhumbert), the Ergodox EZ by [Erez Zukerman](https://github.com/ezuk), and the Clueboard by [Zach White](https://github.com/skullydazed). @@ -31,1278 +31,9 @@ The OLKB product firmwares are maintained by [Jack Humbert](https://github.com/j This is not a tiny project. While this is the main readme, there are many other files you might want to consult. Here are some points of interest: +* [**The Wiki**](https://github.com/qmk/qmk_firmware/wiki) - the entirety of the readme has been moved here * The readme for your own keyboard: This is found under `keyboards//`. So for the ErgoDox EZ, it's [here](keyboards/ergodox/ez/); for the Planck, it's [here](keyboards/planck/) and so on. * The list of possible keycodes you can use in your keymap is actually spread out in a few different places: * [doc/keycode.txt](doc/keycode.txt) - an explanation of those same keycodes. - * [quantum/keymap.h](quantum/keymap.h) - this is where the QMK-specific aliases are all set up. Things like the Hyper and Meh key, the Leader key, and all of the other QMK innovations. These are also explained and documented below, but `keymap.h` is where they're actually defined. + * [quantum/quantum_keycodes.h](quantum/quantum_keycodes.h) - this is where the QMK-specific aliases are all set up. Things like the Hyper and Meh key, the Leader key, and all of the other QMK innovations. These are also explained and documented below, but `quantum_keycodes.h` is where they're actually defined. * The [TMK documentation](doc/TMK_README.md). QMK is based on TMK, and this explains how it works internally. - -# Getting started - -Before you are able to compile, you'll need to install an environment for AVR development. You'll find the instructions for any OS below. If you find another/better way to set things up from scratch, please consider [making a pull request](https://github.com/jackhumbert/qmk_firmware/pulls) with your changes! - -## Build Environment Setup - -### Windows 10 - -It's still recommended to use the method for Vista and later below. The reason for this is that the Windows 10 Subsystem for Linux lacks [USB support](https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/13355724-unable-to-access-usb-devices-from-bash), so it's not possible to flash the firmware to the keyboard. Please add your vote to the link! - -That said, it's still possible to use it for compilation. And recommended, if you need to compile much, since it's much faster than at least Cygwin (which is also supported, but currently lacking documentation). I haven't tried the method below, so I'm unable to tell. - -Here are the steps - -1. Install the Windows 10 subsystem for Linux, following [these instructions](http://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/). -2. If you have previously cloned the repository using the normal Git bash, you will need to clean up the line endings. If you have cloned it after 20th of August 2016, you are likely fine. To clean up the line endings do the following - 1. Make sure that you have no changes you haven't committed by running `git status`, if you do commit them first - 2. From within the Git bash run `git rm --cached -r .` - 3. Followed by `git reset --hard` -3. Start the "Bash On Ubuntu On Windows" from the start menu -4. With the bash open, navigate to your Git checkout. The harddisk can be accessed from `/mnt` for example `/mnt/c` for the `c:\` drive. -5. Run `sudo util/install_dependencies.sh`. -6. After a while the installation will finish, and you are good to go - -**Note** From time to time, the dependencies might change, so just run `install_dependencies.sh` again if things are not working. - -**Warning:** If you edit Makefiles or shell scripts, make sure you are using an editor that saves the files with Unix line endings. Otherwise the compilation might not work. - - -### Windows (Vista and later) -1. If you have ever installed WinAVR, uninstall it. -2. Install [MHV AVR Tools](https://infernoembedded.com/sites/default/files/project/MHV_AVR_Tools_20131101.exe). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**. -3. If you are going to flash Infinity based keyboards you will need to install dfu-util, refer to the instructions by [Input Club](https://github.com/kiibohd/controller/wiki/Loading-DFU-Firmware). -4. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location. -5. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/jackhumbert/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer. -6. Open the `\util` folder. -7. Double-click on the `1-setup-path-win` batch script to run it. You'll need to accept a User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up. -8. Right-click on the `2-setup-environment-win` batch script, select "Run as administrator", and accept the User Account Control prompt. This part may take a couple of minutes, and you'll need to approve a driver installation, but once it finishes, your environment is complete! - -If you have trouble and want to ask for help, it is useful to generate a *Win_Check_Output.txt* file by running `Win_Check.bat` in the `\util` folder. - -### Mac -If you're using [homebrew,](http://brew.sh/) you can use the following commands: - - brew tap osx-cross/avr - brew install avr-libc - brew install dfu-programmer - -This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line. - -You can also try these instructions: - -1. Install Xcode from the App Store. -2. Install the Command Line Tools from `Xcode->Preferences->Downloads`. -3. Install [DFU-Programmer][dfu-prog]. - -If you are going to flash Infinity based keyboards you will also need dfu-util - - brew install dfu-util - -### Linux - -To ensure you are always up to date, you can just run `sudo util/install_dependencies.sh`. That should always install all the dependencies needed. - -You can also install things manually, but this documentation might not be always up to date with all requirements. - -The current requirements are the following, but not all might be needed depending on what you do. Also note that some systems might not have all the dependencies available as packages, or they might be named differently. - -``` -build-essential -gcc -unzip -wget -zip -gcc-avr -binutils-avr -avr-libc -dfu-programmer -dfu-util -gcc-arm-none-eabi -binutils-arm-none-eabi -libnewlib-arm-none-eabi -git -``` - -Install the dependencies with your favorite package manager. - -Debian/Ubuntu example: - - sudo apt-get update - sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi - -### Docker - -If this is a bit complex for you, Docker might be the turn-key solution you need. After installing [Docker](https://www.docker.com/products/docker), run the following command at the root of the QMK folder to build a keyboard/keymap: - -```bash -# You'll run this every time you want to build a keymap -# modify the keymap and keyboard assigment to compile what you want -# defaults are ergodox/default - -docker run -e keymap=gwen -e keyboard=ergodox --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware - -# On windows docker seems to have issue with VOLUME tag in Dockerfile, and $('pwd') won't print a windows compliant path, use full path instead like this -docker run -e keymap=default -e keyboard=ergobop --rm -v D:/Users/Sacapuces/Documents/Repositories/qmk:/qmk:rw edasque/qmk_firmware - -``` - -This will compile the targetted keyboard/keymap and leave it in your QMK directory for you to flash. - -### Vagrant -If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [VAGRANT_GUIDE file](doc/VAGRANT_GUIDE.md). - -## Verify Your Installation -1. If you haven't already, obtain this repository ([https://github.com/jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware)). You can either download it as a zip file and extract it, or clone it using the command line tool git or the Github Desktop application. -2. Open up a terminal or command prompt and navigate to the `qmk_firmware` folder using the `cd` command. The command prompt will typically open to your home directory. If, for example, you cloned the repository to your Documents folder, then you would type `cd Documents/qmk_firmware`. If you extracted the file from a zip, then it may be named `qmk_firmware-master` instead. -3. To confirm that you're in the correct location, you can display the contents of your current folder using the `dir` command on Windows, or the `ls` command on Linux or Mac. You should see several files, including `readme.md` and a `quantum` folder. From here, you need to navigate to the appropriate folder under `keyboards/`. For example, if you're building for a Planck, run `cd keyboards/planck`. -4. Once you're in the correct keyboard-specific folder, run the `make` command. This should output a lot of information about the build process. More information about the `make` command can be found below. - -# Customizing your keymap - -In every keymap folder, the following files are recommended: - -* `config.h` - the options to configure your keymap -* `keymap.c` - all of your keymap code, required -* `Makefile` - the features of QMK that are enabled, required to run `make` in your keymap folder -* `readme.md` - a description of your keymap, how others might use it, and explanations of features - -## The `make` command - -The `make` command is how you compile the firmware into a .hex file, which can be loaded by a dfu programmer (like dfu-progammer via `make dfu`) or the [Teensy loader](https://www.pjrc.com/teensy/loader.html) (only used with Teensys). - -**NOTE:** To abort a make command press `Ctrl-c` - -The following instruction refers to these folders. - -* The `root` (`/`) folder is the qmk_firmware folder, in which are `doc`, `keyboard`, `quantum`, etc. -* The `keyboard` folder is any keyboard project's folder, like `/keyboards/planck`. -* The `keymap` folder is any keymap's folder, like `/keyboards/planck/keymaps/default`. -* The `subproject` folder is the subproject folder of a keyboard, like `/keyboards/ergodox/ez` - -### Simple instructions for building and uploading a keyboard - -**Most keyboards have more specific instructions in the keyboard specific readme.md file, so please check that first** - -If the `keymap` folder contains a file name `Makefile` - -1. Change the directory to the `keymap` folder -2. Run `make -` - -Otherwise, if there's no `Makefile` in the `keymap` folder - -1. Enter the `keyboard` folder -2. Run `make --` - -In the above commands, replace: - -* `` with the name of your keymap -* `` with the name of the subproject (revision or sub-model of your keyboard). For example, for Ergodox it can be `ez` or `infinity`, and for Planck `rev3` or `rev4`. - * If the keyboard doesn't have a subproject, or if you are happy with the default (defined in `rules.mk` file of the `keyboard` folder), you can leave it out. But remember to also remove the dash (`-`) from the command. -* `` The programmer to use. Most keyboards use `dfu`, but some use `teensy`. Infinity keyboards use `dfu-util`. Check the readme file in the keyboard folder to find out which programmer to use. - * If you don't add `----`, where: - -* `` is the name of the keyboard, for example `planck` - * Use `allkb` to compile all keyboards -* `` is the name of the subproject (revision or sub-model of the keyboard). For example, for Ergodox it can be `ez` or `infinity`, and for Planck `rev3` or `rev4`. - * If the keyboard doesn't have any subprojects, it can be left out - * To compile the default subproject, you can leave it out, or specify `defaultsp` - * Use `allsp` to compile all subprojects -* `` is the name of the keymap, for example `algernon` - * Use `allkm` to compile all keymaps -* `` will be explained in more detail below. - -**Note:** When you leave some parts of the command out, you should also remove the dash (`-`). - -As mentioned above, there are some shortcuts, when you are in a: - -* `keyboard` folder, the command will automatically fill the `` part. So you only need to type `--` -* `subproject` folder, it will fill in both `` and `` -* `keymap` folder, then `` and `` will be filled in. If you need to specify the `` use the following syntax `-` - * Note in order to support this shortcut, the keymap needs its own Makefile (see the example [here](/doc/keymap_makefile_example.mk)) -* `keymap` folder of a `subproject`, then everything except the `` will be filled in - -The `` means the following -* If no target is given, then it's the same as `all` below -* `all` compiles the keyboard and generates a `_.hex` file in whichever folder you run `make` from. These files are ignored by git, so don't worry about deleting them when committing/creating pull requests. -* `dfu`, `teensy` or `dfu-util`, compile and upload the firmware to the keyboard. If the compilation fails, then nothing will be uploaded. The programmer to use depends on the keyboard. For most keyboards it's `dfu`, but for Infinity keyboards you should use `dfu-util`, and `teensy` for standard Teensys. To find out which command you should use for your keyboard, check the keyboard specific readme. **Note** that some operating systems needs root access for these commands to work, so in that case you need to run for example `sudo make dfu`. -* `clean`, cleans the build output folders to make sure that everything is built from scratch. Run this before normal compilation if you have some unexplainable problems. - -Some other targets are supported but, but not important enough to be documented here. Check the source code of the make files for more information. - -You can also add extra options at the end of the make command line, after the target - -* `make COLOR=false` - turns off color output -* `make SILENT=true` - turns off output besides errors/warnings -* `make VERBOSE=true` - outputs all of the gcc stuff (not interesting, unless you need to debug) - -The make command itself also has some additional options, type `make --help` for more information. The most useful is probably `-jx`, which specifies that you want to compile using more than one CPU, the `x` represents the number of CPUs that you want to use. Setting that can greatly reduce the compile times, especially if you are compiling many keyboards/keymaps. I usually set it to one less than the number of CPUs that I have, so that I have some left for doing other things while it's compiling. Note that not all operating systems and make versions supports that option. - -Here are some examples commands - -* `make allkb-allsp-allkm` builds everything (all keyboards, all subprojects, all keymaps). Running just `make` from the `root` will also run this. -* `make` from within a `keyboard` directory, is the same as `make keyboard-allsp-allkm`, which compiles all subprojects and keymaps of the keyboard. **NOTE** that this behaviour has changed. Previously it compiled just the default keymap. -* `make ergodox-infinity-algernon-clean` will clean the build output of the Ergodox Infinity keyboard. This example uses the full syntax and can be run from any folder with a `Makefile` -* `make dfu COLOR=false` from within a keymap folder, builds and uploads the keymap, but without color output. - -## The `Makefile` - -There are 5 different `make` and `Makefile` locations: - -* root (`/`) -* keyboard (`/keyboards//`) -* keymap (`/keyboards//keymaps//`) -* subproject (`/keyboards//`) -* subproject keymap (`/keyboards///keymaps/`) - -The root contains the code used to automatically figure out which keymap or keymaps to compile based on your current directory and commandline arguments. It's considered stable, and shouldn't be modified. The keyboard one will contain the MCU set-up and default settings for your keyboard, and shouldn't be modified unless you are the producer of that keyboard. The keymap Makefile can be modified by users, and is optional. It is included automatically if it exists. You can see an example [here](/doc/keymap_makefile_example.mk) - the last few lines are the most important. The settings you set here will override any defaults set in the keyboard Makefile. **The file is required if you want to run `make` in the keymap folder.** - -For keyboards and subprojects, the make files are split in two parts `Makefile` and `rules.mk`. All settings can be found in the `rules.mk` file, while the `Makefile` is just there for support and including the root `Makefile`. Keymaps contain just one `Makefile` for simplicity. - -### Makefile options - -Set the variables to `no` to disable them, and `yes` to enable them. - -`BOOTMAGIC_ENABLE` - -This allows you to hold a key and the salt key (space by default) and have access to a various EEPROM settings that persist over power loss. It's advised you keep this disabled, as the settings are often changed by accident, and produce confusing results that makes it difficult to debug. It's one of the more common problems encountered in help sessions. - -`MOUSEKEY_ENABLE` - -This gives you control over cursor movements and clicks via keycodes/custom functions. - -`EXTRAKEY_ENABLE` - -This allows you to use the system and audio control key codes. - -`CONSOLE_ENABLE` - -This allows you to print messages that can be read using [`hid_listen`](https://www.pjrc.com/teensy/hid_listen.html). - -By default, all debug (*dprint*) print (*print*, *xprintf*), and user print (*uprint*) messages will be enabled. This will eat up a significant portion of the flash and may make the keyboard .hex file too big to program. - -To disable debug messages (*dprint*) and reduce the .hex file size, include `#define NO_DEBUG` in your `config.h` file. - -To disable print messages (*print*, *xprintf*) and user print messages (*uprint*) and reduce the .hex file size, include `#define NO_PRINT` in your `config.h` file. - -To disable print messages (*print*, *xprintf*) and **KEEP** user print messages (*uprint*), include `#define USER_PRINT` in your `config.h` file. - -To see the text, open `hid_listen` and enjoy looking at your printed messages. - -**NOTE:** Do not include *uprint* messages in anything other than your keymap code. It must not be used within the QMK system framework. Otherwise, you will bloat other people's .hex files. - -`COMMAND_ENABLE` - -This enables magic commands, typically fired with the default magic key combo `LSHIFT+RSHIFT+KEY`. Magic commands include turning on debugging messages (`MAGIC+D`) or temporarily toggling NKRO (`MAGIC+N`). - -`SLEEP_LED_ENABLE` - -Enables your LED to breath while your computer is sleeping. Timer1 is being used here. This feature is largely unused and untested, and needs updating/abstracting. - -`NKRO_ENABLE` - -This allows the keyboard to tell the host OS that up to 248 keys are held down at once (default without NKRO is 6). NKRO is off by default, even if `NKRO_ENABLE` is set. NKRO can be forced by adding `#define FORCE_NKRO` to your config.h or by binding `MAGIC_TOGGLE_NKRO` to a key and then hitting the key. - -`BACKLIGHT_ENABLE` - -This enables your backlight on Timer1 and ports B5, B6, or B7 (for now). You can specify your port by putting this in your `config.h`: - - #define BACKLIGHT_PIN B7 - -`MIDI_ENABLE` - -This enables MIDI sending and receiving with your keyboard. To enter MIDI send mode, you can use the keycode `MI_ON`, and `MI_OFF` to turn it off. This is a largely untested feature, but more information can be found in the `quantum/quantum.c` file. - -`UNICODE_ENABLE` - -This allows you to send unicode symbols via `UC()` in your keymap. Only codes up to 0x7FFF are currently supported. - -`UNICODEMAP_ENABLE` - -This allows sending unicode symbols using `X()` in your keymap. Codes -up to 0xFFFFFFFF are supported, including emojis. You will need to maintain -a separate mapping table in your keymap file. - -Known limitations: -- Under Mac OS, only codes up to 0xFFFF are supported. -- Under Linux ibus, only codes up to 0xFFFFF are supported (but anything important is still under this limit for now). - -Characters out of range supported by the OS will be ignored. - -`BLUETOOTH_ENABLE` - -This allows you to interface with a Bluefruit EZ-key to send keycodes wirelessly. It uses the D2 and D3 pins. - -`AUDIO_ENABLE` - -This allows you output audio on the C6 pin (needs abstracting). See the [audio section](#driving-a-speaker---audio-support) for more information. - -`VARIABLE_TRACE` - -Use this to debug changes to variable values, see the [tracing variables](#tracing-variables) section for more information. - -### Customizing Makefile options on a per-keymap basis - -If your keymap directory has a file called `Makefile` (note the filename), any Makefile options you set in that file will take precedence over other Makefile options for your particular keyboard. - -So let's say your keyboard's makefile has `BACKLIGHT_ENABLE = yes` (or maybe doesn't even list the `BACKLIGHT_ENABLE` option, which would cause it to be off). You want your particular keymap to not have the debug console, so you make a file called `Makefile` and specify `BACKLIGHT_ENABLE = no`. - -You can use the `doc/keymap_makefile_example.md` as a template/starting point. - -## The `config.h` file - -There are 2 `config.h` locations: - -* keyboard (`/keyboards//`) -* keymap (`/keyboards//keymaps//`) - -The keyboard `config.h` is included only if the keymap one doesn't exist. The format to use for your custom one [is here](/doc/keymap_config_h_example.h). If you want to override a setting from the parent `config.h` file, you need to do this: - -```c -#undef MY_SETTING -#define MY_SETTING 4 -``` - -For a value of `4` for this imaginary setting. So we `undef` it first, then `define` it. - -You can then override any settings, rather than having to copy and paste the whole thing. - -# Going beyond the keycodes - -Aside from the [basic keycodes](doc/keycode.txt), your keymap can include shortcuts to common operations. - -## Quick aliases to common actions - -Your keymap can include shortcuts to common operations (called "function actions" in tmk). - -These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk `ACTION_*` functions, please see the [TMK documentation](https://github.com/jackhumbert/qmk_firmware/blob/master/doc/keymap.md#2-action). - -Instead of using `FNx` when defining `ACTION_*` functions, you can use `F(x)` - the benefit here is being able to use more than 32 function actions (up to 4096), if you happen to need them. - -### Switching and toggling layers - -`MO(layer)` - momentary switch to *layer*. As soon as you let go of the key, the layer is deactivated and you pop back out to the previous layer. When you apply this to a key, that same key must be set as `KC_TRNS` on the destination layer. Otherwise, you won't make it back to the original layer when you release the key (and you'll get a keycode sent). You can only switch to layers *above* your current layer. If you're on layer 0 and you use `MO(1)`, that will switch to layer 1 just fine. But if you include `MO(3)` on layer 5, that won't do anything for you -- because layer 3 is lower than layer 5 on the stack. - -`OSL(layer)` - momentary switch to *layer*, as a one-shot operation. So if you have a key that's defined as `OSL(1)`, and you tap that key, then only the very next keystroke would come from layer 1. You would drop back to layer zero immediately after that one keystroke. That's handy if you have a layer full of custom shortcuts -- for example, a dedicated key for closing a window. So you tap your one-shot layer mod, then tap that magic 'close window' key, and keep typing like a boss. Layer 1 would remain active as long as you hold that key down, too (so you can use it like a momentary toggle-layer key with extra powers). - -`LT(layer, kc)` - momentary switch to *layer* when held, and *kc* when tapped. Like `MO()`, this only works upwards in the layer stack (`layer` must be higher than the current layer). - -`TG(layer)` - toggles a layer on or off. As with `MO()`, you should set this key as `KC_TRNS` in the destination layer so that tapping it again actually toggles back to the original layer. Only works upwards in the layer stack. - -`TO(layer)` - Goes to a layer. This code is special, because it lets you go either up or down the stack -- just goes directly to the layer you want. So while other codes only let you go _up_ the stack (from layer 0 to layer 3, for example), `TO(2)` is going to get you to layer 2, no matter where you activate it from -- even if you're currently on layer 5. This gets activated on keydown (as soon as the key is pressed). - - -### Fun with modifier keys - -* `LSFT(kc)` - applies left Shift to *kc* (keycode) - `S(kc)` is an alias -* `RSFT(kc)` - applies right Shift to *kc* -* `LCTL(kc)` - applies left Control to *kc* -* `RCTL(kc)` - applies right Control to *kc* -* `LALT(kc)` - applies left Alt to *kc* -* `RALT(kc)` - applies right Alt to *kc* -* `LGUI(kc)` - applies left GUI (command/win) to *kc* -* `RGUI(kc)` - applies right GUI (command/win) to *kc* -* `HYPR(kc)` - applies Hyper (all modifiers) to *kc* -* `MEH(kc)` - applies Meh (all modifiers except Win/Cmd) to *kc* -* `LCAG(kc)` - applies CtrlAltGui to *kc* - -You can also chain these, like this: - - LALT(LCTL(KC_DEL)) -- this makes a key that sends Alt, Control, and Delete in a single keypress. - -The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols. Their long names are also available and documented in `/quantum/keymap_common.h`. - - KC_TILD ~ - KC_EXLM ! - KC_AT @ - KC_HASH # - KC_DLR $ - KC_PERC % - KC_CIRC ^ - KC_AMPR & - KC_ASTR * - KC_LPRN ( - KC_RPRN ) - KC_UNDS _ - KC_PLUS + - KC_DQUO " - KC_LCBR { - KC_RCBR } - KC_LABK < - KC_RABK > - KC_PIPE | - KC_COLN : - -`OSM(mod)` - this is a "one shot" modifier. So let's say you have your left Shift key defined as `OSM(MOD_LSFT)`. Tap it, let go, and Shift is "on" -- but only for the next character you'll type. So to write "The", you don't need to hold down Shift -- you tap it, tap t, and move on with life. And if you hold down the left Shift key, it just works as a left Shift key, as you would expect (so you could type THE). There's also a magical, secret way to "lock" a modifier by tapping it multiple times. If you want to learn more about that, open an issue. :) - -`MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down. - -These are the values you can use for the `mod` in `MT()` and `OSM()` (right-hand modifiers are not available for `MT()`): - - * MOD_LCTL - * MOD_LSFT - * MOD_LALT - * MOD_LGUI - * MOD_HYPR - * MOD_MEH - -These can also be combined like `MOD_LCTL | MOD_LSFT` e.g. `MT(MOD_LCTL | MOD_LSFT, KC_ESC)` which would activate Control and Shift when held, and send Escape when tapped. - -We've added shortcuts to make common modifier/tap (mod-tap) mappings more compact: - - * `CTL_T(kc)` - is LCTL when held and *kc* when tapped - * `SFT_T(kc)` - is LSFT when held and *kc* when tapped - * `ALT_T(kc)` - is LALT when held and *kc* when tapped - * `GUI_T(kc)` - is LGUI when held and *kc* when tapped - * `ALL_T(kc)` - is Hyper (all mods) when held and *kc* when tapped. To read more about what you can do with a Hyper key, see [this blog post by Brett Terpstra](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/) - * `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped - * `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift. - -## Space Cadet Shift: The future, built in - -Steve Losh [described](http://stevelosh.com/blog/2012/10/a-modern-space-cadet/) the Space Cadet Shift quite well. Essentially, you hit the left Shift on its own, and you get an opening parenthesis; hit the right Shift on its own, and you get the closing one. When hit with other keys, the Shift key keeps working as it always does. Yes, it's as cool as it sounds. - -To use it, use `KC_LSPO` (Left Shift, Parens Open) for your left Shift on your keymap, and `KC_RSPC` (Right Shift, Parens Close) for your right Shift. - -It's defaulted to work on US keyboards, but if your layout uses different keys for parenthesis, you can define those in your `config.h` like this: - - #define LSPO_KEY KC_9 - #define RSPC_KEY KC_0 - -You can also choose between different rollover behaviors of the shift keys by defining: - - #define DISABLE_SPACE_CADET_ROLLOVER - -in your `config.h`. Disabling rollover allows you to use the opposite shift key to cancel the space cadet state in the event of an erroneous press instead of emitting a pair of parentheses when the keys are released. - -The only other thing you're going to want to do is create a `Makefile` in your keymap directory and set the following: - -``` -COMMAND_ENABLE = no # Commands for debug and configuration -``` - -This is just to keep the keyboard from going into command mode when you hold both Shift keys at the same time. - -## The Leader key: A new kind of modifier - -If you've ever used Vim, you know what a Leader key is. If not, you're about to discover a wonderful concept. :) Instead of hitting Alt+Shift+W for example (holding down three keys at the same time), what if you could hit a _sequence_ of keys instead? So you'd hit our special modifier (the Leader key), followed by W and then C (just a rapid succession of keys), and something would happen. - -That's what `KC_LEAD` does. Here's an example: - -1. Pick a key on your keyboard you want to use as the Leader key. Assign it the keycode `KC_LEAD`. This key would be dedicated just for this -- it's a single action key, can't be used for anything else. -2. Include the line `#define LEADER_TIMEOUT 300` somewhere in your keymap.c file, probably near the top. The 300 there is 300ms -- that's how long you have for the sequence of keys following the leader. You can tweak this value for comfort, of course. -3. Within your `matrix_scan_user` function, do something like this: - -``` -LEADER_EXTERNS(); - -void matrix_scan_user(void) { - LEADER_DICTIONARY() { - leading = false; - leader_end(); - - SEQ_ONE_KEY(KC_F) { - register_code(KC_S); - unregister_code(KC_S); - } - SEQ_TWO_KEYS(KC_A, KC_S) { - register_code(KC_H); - unregister_code(KC_H); - } - SEQ_THREE_KEYS(KC_A, KC_S, KC_D) { - register_code(KC_LGUI); - register_code(KC_S); - unregister_code(KC_S); - unregister_code(KC_LGUI); - } - } -} -``` - -As you can see, you have three function. you can use - `SEQ_ONE_KEY` for single-key sequences (Leader followed by just one key), and `SEQ_TWO_KEYS` and `SEQ_THREE_KEYS` for longer sequences. Each of these accepts one or more keycodes as arguments. This is an important point: You can use keycodes from **any layer on your keyboard**. That layer would need to be active for the leader macro to fire, obviously. - -## Tap Dance: A single key can do 3, 5, or 100 different things - -Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/jackhumbert/qmk_firmware/pull/451). Here's how algernon describes the feature: - -With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter. - -To make it clear how this is different from `ACTION_FUNCTION_TAP`, lets explore a certain setup! We want one key to send `Space` on single tap, but `Enter` on double-tap. - -With `ACTION_FUNCTION_TAP`, it is quite a rain-dance to set this up, and has the problem that when the sequence is interrupted, the interrupting key will be send first. Thus, `SPC a` will result in `a SPC` being sent, if they are typed within `TAPPING_TERM`. With the tap dance feature, that'll come out as `SPC a`, correctly. - -The implementation hooks into two parts of the system, to achieve this: into `process_record_quantum()`, and the matrix scan. We need the latter to be able to time out a tap sequence even when a key is not being pressed, so `SPC` alone will time out and register after `TAPPING_TERM` time. - -But lets start with how to use it, first! - -First, you will need `TAP_DANCE_ENABLE=yes` in your `Makefile`, because the feature is disabled by default. This adds a little less than 1k to the firmware size. Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()`, takes a number, which will later be used as an index into the `tap_dance_actions` array. - -This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are three possible options: - -* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held. -* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action. -* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function on when the dance action finishes (like the previous option), and the last function when the tap dance action resets. - -The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise. - -And that's the bulk of it! - -And now, on to the explanation of how it works! - -The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and the timer. - -This means that you have `TAPPING_TERM` time to tap the key again, you do not have to input all the taps within that timeframe. This allows for longer tap counts, with minimal impact on responsiveness. - -Our next stop is `matrix_scan_tap_dance()`. This handles the timeout of tap-dance keys. - -For the sake of flexibility, tap-dance actions can be either a pair of keycodes, or a user function. The latter allows one to handle higher tap counts, or do extra things, like blink the LEDs, fiddle with the backlighting, and so on. This is accomplished by using an union, and some clever macros. - -### Examples - -Here's a simple example for a single definition: - -1. In your `makefile`, add `TAP_DANCE_ENABLE = yes` -2. In your `config.h` (which you can copy from `qmk_firmware/keyboards/planck/config.h` to your keymap directory), add `#define TAPPING_TERM 200` -3. In your `keymap.c` file, define the variables and definitions, then add to your keymap: - -```c -//Tap Dance Declarations -enum { - TD_ESC_CAPS = 0 -}; - -//Tap Dance Definitions -qk_tap_dance_action_t tap_dance_actions[] = { - //Tap once for Esc, twice for Caps Lock - [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS) -// Other declarations would go here, separated by commas, if you have them -}; - -//In Layer declaration, add tap dance item in place of a key code -TD(TD_ESC_CAPS) -``` - -Here's a more complex example involving custom actions: - -```c -enum { - CT_SE = 0, - CT_CLN, - CT_EGG, - CT_FLSH, -}; - -/* Have the above three on the keymap, TD(CT_SE), etc... */ - -void dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) { - if (state->count == 1) { - register_code (KC_RSFT); - register_code (KC_SCLN); - } else { - register_code (KC_SCLN); - } -} - -void dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) { - if (state->count == 1) { - unregister_code (KC_RSFT); - unregister_code (KC_SCLN); - } else { - unregister_code (KC_SCLN); - } -} - -void dance_egg (qk_tap_dance_state_t *state, void *user_data) { - if (state->count >= 100) { - SEND_STRING ("Safety dance!"); - reset_tap_dance (state); - } -} - -// on each tap, light up one led, from right to left -// on the forth tap, turn them off from right to left -void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) { - switch (state->count) { - case 1: - ergodox_right_led_3_on(); - break; - case 2: - ergodox_right_led_2_on(); - break; - case 3: - ergodox_right_led_1_on(); - break; - case 4: - ergodox_right_led_3_off(); - _delay_ms(50); - ergodox_right_led_2_off(); - _delay_ms(50); - ergodox_right_led_1_off(); - } -} - -// on the fourth tap, set the keyboard on flash state -void dance_flsh_finished(qk_tap_dance_state_t *state, void *user_data) { - if (state->count >= 4) { - reset_keyboard(); - reset_tap_dance(state); - } -} - -// if the flash state didnt happen, then turn off leds, left to right -void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) { - ergodox_right_led_1_off(); - _delay_ms(50); - ergodox_right_led_2_off(); - _delay_ms(50); - ergodox_right_led_3_off(); -} - -qk_tap_dance_action_t tap_dance_actions[] = { - [CT_SE] = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT) - ,[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset) - ,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg) - ,[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED (dance_flsh_each, dance_flsh_finished, dance_flsh_reset) -}; -``` - -## Temporarily setting the default layer - -`DF(layer)` - sets default layer to *layer*. The default layer is the one at the "bottom" of the layer stack - the ultimate fallback layer. This currently does not persist over power loss. When you plug the keyboard back in, layer 0 will always be the default. It is theoretically possible to work around that, but that's not what `DF` does. - -## Prevent stuck modifiers - -Consider the following scenario: - -1. Layer 0 has a key defined as Shift. -2. The same key is defined on layer 1 as the letter A. -3. User presses Shift. -4. User switches to layer 1 for whatever reason. -5. User releases Shift, or rather the letter A. -6. User switches back to layer 0. - -Shift was actually never released and is still considered pressed. - -If such situation bothers you add this to your `config.h`: - - #define PREVENT_STUCK_MODIFIERS - -This option uses 5 bytes of memory per every 8 keys on the keyboard -rounded up (5 bits per key). For example on Planck (48 keys) it uses -(48/8)\*5 = 30 bytes. - -## Macro shortcuts: Send a whole string when pressing just one key - -Instead of using the `ACTION_MACRO` function, you can simply use `M(n)` to access macro *n* - *n* will get passed into the `action_get_macro` as the `id`, and you can use a switch statement to trigger it. This gets called on the keydown and keyup, so you'll need to use an if statement testing `record->event.pressed` (see keymap_default.c). - -```c -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // this is the function signature -- just copy/paste it into your keymap file as it is. -{ - switch(id) { - case 0: // this would trigger when you hit a key mapped as M(0) - if (record->event.pressed) { - return MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END ); // this sends the string 'hello' when the macro executes - } - break; - } - return MACRO_NONE; -}; -``` -A macro can include the following commands: - -* I() change interval of stroke in milliseconds. -* D() press key. -* U() release key. -* T() type key(press and release). -* W() wait (milliseconds). -* END end mark. - -So above you can see the stroke interval changed to 255ms between each keystroke, then a bunch of keys being typed, waits a while, then the macro ends. - -Note: Using macros to have your keyboard send passwords for you is possible, but a bad idea. - -### Advanced macro functions - -To get more control over the keys/actions your keyboard takes, the following functions are available to you in the `action_get_macro` function block: - -* `record->event.pressed` - -This is a boolean value that can be tested to see if the switch is being pressed or released. An example of this is - -```c -if (record->event.pressed) { - // on keydown -} else { - // on keyup -} -``` - -* `register_code();` - -This sends the `` keydown event to the computer. Some examples would be `KC_ESC`, `KC_C`, `KC_4`, and even modifiers such as `KC_LSFT` and `KC_LGUI`. - -* `unregister_code();` - -Parallel to `register_code` function, this sends the `` keyup event to the computer. If you don't use this, the key will be held down until it's sent. - -* `layer_on();` - -This will turn on the layer `` - the higher layer number will always take priority. Make sure you have `KC_TRNS` for the key you're pressing on the layer you're switching to, or you'll get stick there unless you have another plan. - -* `layer_off();` - -This will turn off the layer ``. - -* `clear_keyboard();` - -This will clear all mods and keys currently pressed. - -* `clear_mods();` - -This will clear all mods currently pressed. - -* `clear_keyboard_but_mods();` - -This will clear all keys besides the mods currently pressed. - -* `update_tri_layer(layer_1, layer_2, layer_3);` - -If the user attempts to activate layer 1 AND layer 2 at the same time (for example, by hitting their respective layer keys), layer 3 will be activated. Layers 1 and 2 will _also_ be activated, for the purposes of fallbacks (so a given key will fall back from 3 to 2, to 1 -- and only then to 0). - -#### Naming your macros - -If you have a bunch of macros you want to refer to from your keymap, while keeping the keymap easily readable, you can just name them like so: - -``` -#define AUD_OFF M(6) -#define AUD_ON M(7) -#define MUS_OFF M(8) -#define MUS_ON M(9) -#define VC_IN M(10) -#define VC_DE M(11) -#define PLOVER M(12) -#define EXT_PLV M(13) -``` - -As was done on the [Planck default keymap](/keyboards/planck/keymaps/default/keymap.c#L33-L40) - -#### Timer functionality - -It's possible to start timers and read values for time-specific events - here's an example: - -```c -static uint16_t key_timer; -key_timer = timer_read(); -if (timer_elapsed(key_timer) < 100) { - // do something if less than 100ms have passed -} else { - // do something if 100ms or more have passed -} -``` - -It's best to declare the `static uint16_t key_timer;` outside of the macro block (top of file, etc). - -#### Example: Single-key copy/paste (hold to copy, tap to paste) - -With QMK, it's easy to make one key do two things, as long as one of those things is being a modifier. :) So if you want a key to act as Ctrl when held and send the letter R when tapped, that's easy: `CTL_T(KC_R)`. But what do you do when you want that key to send Ctrl-V (paste) when tapped, and Ctrl-C (copy) when held? - -Here's what you do: - - -``` -static uint16_t key_timer; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch(id) { - case 0: { - if (record->event.pressed) { - key_timer = timer_read(); // if the key is being pressed, we start the timer. - } - else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down"). - if (timer_elapsed(key_timer) > 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap. - return MACRO( D(LCTL), T(C), U(LCTL), END ); - } - else { - return MACRO( D(LCTL), T(V), U(LCTL), END ); - } - } - break; - } - } - return MACRO_NONE; -}; -``` - -And then, to assign this macro to a key on your keyboard layout, you just use `M(0)` on the key you want to press for copy/paste. - -## Dynamic macros: record and replay macros in runtime - -In addition to the static macros described above, you may enable the dynamic macros which you may record while writing. They are forgotten as soon as the keyboard is unplugged. Only two such macros may be stored at the same time, with the total length of 64 keypresses (by default). - -To enable them, first add a new element to the `planck_keycodes` enum -- `DYNAMIC_MACRO_RANGE`: - - enum planck_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - PLOVER, - LOWER, - RAISE, - BACKLIT, - EXT_PLV, - DYNAMIC_MACRO_RANGE, - }; - -Afterwards create a new layer called `_DYN`: - - #define _DYN 6 /* almost any other free number should be ok */ - -Below these two modifications include the `dynamic_macro.h` header: - - #include "dynamic_macro.h"` - -Then define the `_DYN` layer with the following keys: `DYN_REC_START1`, `DYN_MACRO_PLAY1`,`DYN_REC_START2` and `DYN_MACRO_PLAY2`. It may also contain other keys, it doesn't matter apart from the fact that you won't be able to record these keys in the dynamic macros. - - [_DYN]= { - {_______, DYN_REC_START1, DYN_MACRO_PLAY1, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, DYN_REC_START2, DYN_MACRO_PLAY2, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} - }, - -Add the following code to the very beginning of your `process_record_user()` function: - - if (!process_record_dynamic_macro(keycode, record)) { - return false; - } - -To start recording the macro, press either `DYN_REC_START1` or `DYN_REC_START2`. To finish the recording, press the `_DYN` layer button. The handler awaits specifically for the `MO(_DYN)` keycode as the "stop signal" so please don't use any fancy ways to access this layer, use the regular `MO()` modifier. To replay the macro, press either `DYN_MACRO_PLAY1` or `DYN_MACRO_PLAY2`. - -If the LED-s start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by setting the `DYNAMIC_MACRO_SIZE` preprocessor macro (default value: 128; please read the comments for it in the header). - -For the details about the internals of the dynamic macros, please read the comments in the `dynamic_macro.h` header. - -## Additional keycode aliases for software-implemented layouts (Colemak, Dvorak, etc) - -Everything is assuming you're in Qwerty (in software) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap: - - #include - -If you use Dvorak, use `keymap_dvorak.h` instead of `keymap_colemak.h` for this line. After including this line, you will get access to: - - * `CM_*` for all of the Colemak-equivalent characters - * `DV_*` for all of the Dvorak-equivalent characters - -These implementations assume you're using Colemak or Dvorak on your OS, not on your keyboard - this is referred to as a software-implemented layout. If your computer is in Qwerty and your keymap is in Colemak or Dvorak, this is referred to as a firmware-implemented layout, and you won't need these features. - -To give an example, if you're using software-implemented Colemak, and want to get an `F`, you would use `CM_F` - `KC_F` under these same circumstances would result in `T`. - -## Additional language support - -In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbreviation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware (but it's being worked on - see Unicode support). - -## Unicode support - -You can currently send 4 hex digits with your OS-specific modifier key (RALT for OSX with the "Unicode Hex Input" layout, see [this article](http://www.poynton.com/notes/misc/mac-unicode-hex-input.html) to learn more) - this is currently limited to supporting one OS at a time, and requires a recompile for switching. 8 digit hex codes are being worked on. The keycode function is `UC(n)`, where *n* is a 4 digit hexidecimal. Enable from the Makefile. - -## Backlight Breathing - -In order to enable backlight breathing, the following line must be added to your config.h file. - - #define BACKLIGHT_BREATHING - -The following function calls are used to control the breathing effect. - -* ```breathing_enable()``` - Enable the free-running breathing effect. -* ```breathing_disable()``` - Disable the free-running breathing effect immediately. -* ```breathing_self_disable()``` - Disable the free-running breathing effect after the current effect ends. -* ```breathing_toggle()``` - Toggle the free-running breathing effect. -* ```breathing_defaults()``` - Reset the speed and brightness settings of the breathing effect. - -The following function calls are used to control the maximum brightness of the breathing effect. - -* ```breathing_intensity_set(value)``` - Set the brightness of the breathing effect when it is at its max value. -* ```breathing_intensity_default()``` - Reset the brightness of the breathing effect to the default value based on the current backlight intensity. - -The following function calls are used to control the cycling speed of the breathing effect. - -* ```breathing_speed_set(value)``` - Set the speed of the breathing effect - how fast it cycles. -* ```breathing_speed_inc(value)``` - Increase the speed of the breathing effect by a fixed value. -* ```breathing_speed_dec(value)``` - Decrease the speed of the breathing effect by a fixed value. -* ```breathing_speed_default()``` - Reset the speed of the breathing effect to the default value. - -The following example shows how to enable the backlight breathing effect when the FUNCTION layer macro button is pressed: - - case MACRO_FUNCTION: - if (record->event.pressed) - { - breathing_speed_set(3); - breathing_enable(); - layer_on(LAYER_FUNCTION); - } - else - { - breathing_speed_set(1); - breathing_self_disable(); - layer_off(LAYER_FUNCTION); - } - break; - -The following example shows how to pulse the backlight on-off-on when the RAISED layer macro button is pressed: - - case MACRO_RAISED: - if (record->event.pressed) - { - layer_on(LAYER_RAISED); - breathing_speed_set(2); - breathing_pulse(); - update_tri_layer(LAYER_LOWER, LAYER_RAISED, LAYER_ADJUST); - } - else - { - layer_off(LAYER_RAISED); - update_tri_layer(LAYER_LOWER, LAYER_RAISED, LAYER_ADJUST); - } - break; - -## Other firmware shortcut keycodes - -* `RESET` - puts the MCU in DFU mode for flashing new firmware (with `make dfu`) -* `DEBUG` - the firmware into debug mode - you'll need hid_listen to see things -* `BL_ON` - turns the backlight on -* `BL_OFF` - turns the backlight off -* `BL_` - sets the backlight to level *n* -* `BL_INC` - increments the backlight level by one -* `BL_DEC` - decrements the backlight level by one -* `BL_TOGG` - toggles the backlight -* `BL_STEP` - steps through the backlight levels - -Enable the backlight from the Makefile. - -# Custom Quantum functions - -All of these functions are available in the `*_kb()` or `*_user()` variety. `kb` ones should only be used in the `/.c` file, and `user` ones should only be used in the `keymap.c`. The keyboard ones call the user ones - it's necessary to keep these calls to allow the keymap functions to work correctly. - -## `void matrix_init_*(void)` - -This function gets called when the matrix is initiated, and can contain start-up code for your keyboard/keymap. - -## `void matrix_scan_*(void)` - -This function gets called at every matrix scan, which is basically as often as the MCU can handle. Be careful what you put here, as it will get run a lot. - -## `bool process_record_*(uint16_t keycode, keyrecord_t *record)` - -This function gets called on every keypress/release, and is where you can define custom functionality. The return value is whether or not QMK should continue processing the keycode - returning `false` stops the execution. - -The `keycode` variable is whatever is defined in your keymap, eg `MO(1)`, `KC_L`, etc. and can be switch-cased to execute code whenever a particular code is pressed. - -The `record` variable contains infomation about the actual press: - -``` -keyrecord_t record { - keyevent_t event { - keypos_t key { - uint8_t col - uint8_t row - } - bool pressed - uint16_t time - } -} -``` - -The conditional `if (record->event.pressed)` can tell if the key is being pressed or released, and you can execute code based on that. - -## `void led_set_*(uint8_t usb_led)` - -This gets called whenever there is a state change on your host LEDs (eg caps lock, scroll lock, etc). The LEDs are defined as: - -``` -#define USB_LED_NUM_LOCK 0 -#define USB_LED_CAPS_LOCK 1 -#define USB_LED_SCROLL_LOCK 2 -#define USB_LED_COMPOSE 3 -#define USB_LED_KANA 4 -``` - -and can be tested against the `usb_led` with a conditional like `if (usb_led & (1<` script to help get you started - you can simply pass your keyboard's name into the script, and all of the necessary files will be created. The components of each are described below. - -## `/keyboards//config.h` - -The `USB Device descriptor parameter` block contains parameters are used to uniquely identify your keyboard, but they don't really matter to the machine. - -Your `MATRIX_ROWS` and `MATRIX_COLS` are the numbers of rows and cols in your keyboard matrix - this may be different than the number of actual rows and columns on your keyboard. There are some tricks you can pull to increase the number of keys in a given matrix, but most keyboards are pretty straight-forward. - -The `MATRIX_ROW_PINS` and `MATRIX_COL_PINS` are the pins your MCU uses on each row/column. Your schematic (if you have one) will have this information on it, and the values will vary depending on your setup. This is one of the most important things to double-check in getting your keyboard setup correctly. - -For the `DIODE_DIRECTION`, most hand-wiring guides will instruct you to wire the diodes in the `COL2ROW` position, but it's possible that they are in the other - people coming from EasyAVR often use `ROW2COL`. Nothing will function if this is incorrect. - -`BACKLIGHT_PIN` is the pin that your PWM-controlled backlight (if one exists) is hooked-up to. Currently only B5, B6, and B7 are supported. - -`BACKLIGHT_BREATHING` is a fancier backlight feature that adds breathing/pulsing/fading effects to the backlight. It uses the same timer as the normal backlight. These breathing effects must be called by code in your keymap. - -`BACKLIGHT_LEVELS` is how many levels exist for your backlight - max is 15, and they are computed automatically from this number. - -## `/keyboards//Makefile` - -The values at the top likely won't need to be changed, since most boards use the `atmega32u4` chip. The `BOOTLOADER_SIZE` will need to be adjusted based on your MCU type. It's defaulted to the Teensy, since that's the most common controller. Below is quoted from the `Makefile`. - -``` -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=512 -``` - -At the bottom of the file, you'll find lots of features to turn on and off - all of these options should be set with `?=` to allow for the keymap overrides. `?=` only assigns if the variable was previously undefined. For the full documenation of these features, see the [Makefile options](#makefile-options). - -## `/keyboards//readme.md` - -This is where you'll describe your keyboard - please write as much as you can about it! Talking about default functionality/features is useful here. Feel free to link to external pages/sites if necessary. Images can be included here as well. This file will be rendered into a webpage at qmk.fm/keyboards//. - -## `/keyboards//.c` - -This is where all of the custom logic for your keyboard goes - you may not need to put anything in this file, since a lot of things are configured automatically. All of the `*_kb()` functions are defined here. If you modify them, remember to keep the calls to `*_user()`, or things in the keymaps might not work. You can read more about the functions [here](#custom-quantum-functions-for-keyboards-and-keymaps) - -## `/keyboards//.h` - -Here is where you can (optionally) define your `KEYMAP` function to remap your matrix into a more readable format. With ortholinear boards, this isn't always necessary, but it can help to accomodate the dead spots on your matrix, where there are keys that take up more than one space (2u, staggering, 6.25u, etc). The example shows the difference between the physical keys, and the matrix design: - -``` -#define KEYMAP( \ - k00, k01, k02, \ - k10, k11 \ -) \ -{ \ - { k00, k01, k02 }, \ - { k10, KC_NO, k11 }, \ -} -``` - -Each of the `kxx` variables needs to be unique, and usually follows the format `k`. You can place `KC_NO` where your dead keys are in your matrix. - -# Unit Testing - -If you are new to unit testing, then you can find many good resources on internet. However most of it is scattered around in small pieces here and there, and there's also many different opinions, so I won't give any recommendations. - -Instead I recommend these two books, explaining two different styles of Unit Testing in detail. - -* "Test Driven Development: By Example: Kent Beck" -* "Growing Object-Oriented Software, Guided By Tests: Steve Freeman, Nat Pryce" - -If you prefer videos there are Uncle Bob's [Clean Coders Videos](https://cleancoders.com/), which unfortunately cost quite a bit, especially if you want to watch many of them. But James Shore has a free [Let's Play](http://www.jamesshore.com/Blog/Lets-Play) video series. - -## Google Test and Google Mock -It's possible to Unit Test your code using [Google Test](https://github.com/google/googletest). The Google Test framework also includes another component for writing testing mocks and stubs, called "Google Mock". For information how to write the actual tests, please refer to the documentation on that site. - -## Use of C++ - -Note that Google Test and therefore any test has to be written in C++, even if the rest of the QMK codebases is written in C. This should hopefully not be a problem even if you don't know any C++, since there's quite clear documentation and examples of the required C++ features, and you can write the rest of the test code almost as you would write normal C. Note that some compiler errors which you might get can look quite scary, but just read carefully what it says, and you should be ok. - -One thing to remember, is that you have to append `extern "C"` around all of your C file includes. - -## Adding tests for new or existing features - -If you want to unit test some feature, then take a look at the existing serial_link tests, in the `quantum/serial_link/tests folder`, and follow the steps below to create a similar structure. - -1. If it doesn't already exist, add a test subfolder to the folder containing the feature. -2. Create a `testlist.mk` and a `rules.mk` file in that folder. -3. Include those files from the root folder `testlist.mk`and `build_test.mk` respectively. -4. Add a new name for your testgroup to the `testlist.mk` file. Each group defined there will be a separate executable. And that's how you can support mocking out different parts. Note that it's worth adding some common prefix, just like it's done for the serial_link tests. The reason for that is that the make command allows substring filtering, so this way you can easily run a subset of the tests. -5. Define the source files and required options in the `rules.mk` file. - * `_SRC` for source files - * `_DEFS` for additional defines - * `_INC` for additional include folders -6. Write the tests in a new cpp file inside the test folder you created. That file has to be one of the files included from the `rules.mk` file. - -Note how there's several different tests, each mocking out a separate part. Also note that each of them only compiles the very minimum that's needed for the tests. It's recommend that you try to do the same. For a relevant video check out [Matt Hargett "Advanced Unit Testing in C & C++](https://www.youtube.com/watch?v=Wmy6g-aVgZI) - -## Running the tests - -To run all the tests in the codebase, type `make test`. You can also run test matching a substring by typing `make test-matchingsubstring` Note that the tests are always compiled with the native compiler of your platform, so they are also run like any other program on your computer. - -## Debugging the tests - -If there are problems with the tests, you can find the executable in the `./build/test` folder. You should be able to run those with GDB or a similar debugger. - -## Full Integration tests - -It's not yet possible to do a full integration test, where you would compile the whole firmware and define a keymap that you are going to test. However there are plans for doing that, because writing tests that way would probably be easier, at least for people that are not used to unit testing. - -In that model you would emulate the input, and expect a certain output from the emulated keyboard. - -# Tracing variables - -Sometimes you might wonder why a variable gets changed and where, and this can be quite tricky to track down without having a debugger. It's of course possible to manually add print statements to track it, but you can also enable the variable trace feature. This works for both for variables that are changed by the code, and when the variable is changed by some memory corruption. - -To take the feature into use add `VARIABLE_TRACE=x` to the end of you make command. `x` represents the number of variables you want to trace, which is usually 1. - -Then at a suitable place in the code, call `ADD_TRACED_VARIABLE`, to begin the tracing. For example to trace all the layer changes, you can do this -```c -void matrix_init_user(void) { - ADD_TRACED_VARIABLE("layer", &layer_state, sizeof(layer_state)); -} -``` - -This will add a traced variable named "layer" (the name is just for your information), which tracks the memory location of `layer_state`. It tracks 4 bytes (the size of `layer_state`), so any modification to the variable will be reported. By default you can not specify a size bigger than 4, but you can change it by adding `MAX_VARIABLE_TRACE_SIZE=x` to the end of the make command line. - -In order to actually detect changes to the variables you should call `VERIFY_TRACED_VARIABLES` around the code that you think that modifies the variable. If a variable is modified it will tell you between which two `VERIFY_TRACED_VARIABLES` calls the modification happened. You can then add more calls to track it down further. I don't recommend spamming the codebase with calls. It's better to start with a few, and then keep adding them in a binary search fashion. You can also delete the ones you don't need, as each call need to store the file name and line number in the ROM, so you can run out of memory if you add too many calls. - -Also remember to delete all the tracing code ones you have found the bug, as you wouldn't want to create a pull request with tracing code. \ No newline at end of file diff --git a/tmk_core/avr.mk b/tmk_core/avr.mk index b4817334..5df539de 100644 --- a/tmk_core/avr.mk +++ b/tmk_core/avr.mk @@ -26,7 +26,7 @@ CFLAGS += -fno-inline-small-functions CFLAGS += -fno-strict-aliasing CPPFLAGS += $(COMPILEFLAGS) -CPPFLAGS += -fno-exceptions +CPPFLAGS += -fno-exceptions -std=c++11 LDFLAGS +=-Wl,--gc-sections diff --git a/tmk_core/common.mk b/tmk_core/common.mk index f826a7b5..47f6fc57 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -50,6 +50,10 @@ ifeq ($(strip $(EXTRAKEY_ENABLE)), yes) TMK_COMMON_DEFS += -DEXTRAKEY_ENABLE endif +ifeq ($(strip $(RAW_ENABLE)), yes) + TMK_COMMON_DEFS += -DRAW_ENABLE +endif + ifeq ($(strip $(CONSOLE_ENABLE)), yes) TMK_COMMON_DEFS += -DCONSOLE_ENABLE else @@ -76,6 +80,14 @@ ifeq ($(strip $(SLEEP_LED_ENABLE)), yes) TMK_COMMON_DEFS += -DNO_SUSPEND_POWER_DOWN endif +ifeq ($(strip $(NO_UART)), yes) + TMK_COMMON_DEFS += -DNO_UART +endif + +ifeq ($(strip $(NO_SUSPEND_POWER_DOWN)), yes) + TMK_COMMON_DEFS += -DNO_SUSPEND_POWER_DOWN +endif + ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) TMK_COMMON_SRC += $(COMMON_DIR)/backlight.c TMK_COMMON_DEFS += -DBACKLIGHT_ENABLE @@ -85,6 +97,16 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE endif +ifeq ($(strip $(BLUETOOTH)), AdafruitBLE) + TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE + TMK_COMMON_DEFS += -DMODULE_ADAFRUIT_BLE +endif + +ifeq ($(strip $(BLUETOOTH)), AdafruitEZKey) + TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE + TMK_COMMON_DEFS += -DMODULE_ADAFRUIT_EZKEY +endif + ifeq ($(strip $(ONEHAND_ENABLE)), yes) TMK_COMMON_DEFS += -DONEHAND_ENABLE endif @@ -110,4 +132,4 @@ endif VPATH += $(TMK_PATH)/$(COMMON_DIR) ifeq ($(PLATFORM),CHIBIOS) VPATH += $(TMK_PATH)/$(COMMON_DIR)/chibios -endif \ No newline at end of file +endif diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index d485b46c..94de3691 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -33,6 +33,9 @@ along with this program. If not, see . #include "nodebug.h" #endif +#ifdef FAUXCLICKY_ENABLE +#include +#endif void action_exec(keyevent_t event) { @@ -41,6 +44,16 @@ void action_exec(keyevent_t event) dprint("EVENT: "); debug_event(event); dprintln(); } +#ifdef FAUXCLICKY_ENABLE + if (IS_PRESSED(event)) { + FAUXCLICKY_ACTION_PRESS; + } + if (IS_RELEASED(event)) { + FAUXCLICKY_ACTION_RELEASE; + } + fauxclicky_check(); +#endif + #ifdef ONEHAND_ENABLE if (!IS_NOEVENT(event)) { process_hand_swap(&event); @@ -49,6 +62,13 @@ void action_exec(keyevent_t event) keyrecord_t record = { .event = event }; +#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) + if (has_oneshot_layer_timed_out()) { + dprintf("Oneshot layer: timeout\n"); + clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); + } +#endif + #ifndef NO_ACTION_TAPPING action_tapping_process(record); #else @@ -100,7 +120,7 @@ bool process_record_quantum(keyrecord_t *record) { return true; } -void process_record(keyrecord_t *record) +void process_record(keyrecord_t *record) { if (IS_NOEVENT(record->event)) { return; } @@ -126,13 +146,6 @@ void process_action(keyrecord_t *record, action_t action) uint8_t tap_count = record->tap.count; #endif -#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) - if (has_oneshot_layer_timed_out()) { - dprintf("Oneshot layer: timeout\n"); - clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); - } -#endif - if (event.pressed) { // clear the potential weak mods left by previously pressed keys clear_weak_mods(); diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h index 33da35f3..b15aaa0e 100644 --- a/tmk_core/common/action_code.h +++ b/tmk_core/common/action_code.h @@ -47,10 +47,15 @@ along with this program. If not, see . * 0100|10| usage(10) (reserved) * 0100|11| usage(10) (reserved) * - * ACT_MOUSEKEY(0110): TODO: Not needed? + * + * ACT_MOUSEKEY(0101): TODO: Merge these two actions to conserve space? * 0101|xxxx| keycode Mouse key * - * 011x|xxxx xxxx xxxx (reseved) + * ACT_SWAP_HANDS(0110): + * 0110|xxxx| keycode Swap hands (keycode on tap, or options) + * + * + * 0111|xxxx xxxx xxxx (reserved) * * * Layer Actions(10xx) @@ -67,7 +72,6 @@ along with this program. If not, see . * ee: on event(01:press, 10:release, 11:both) * * 1001|xxxx|xxxx xxxx (reserved) - * 1001|oopp|BBBB BBBB 8-bit Bitwise Operation??? * * ACT_LAYER_TAP(101x): * 101E|LLLL| keycode On/Off with tap key (0x00-DF)[TAP] diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index a3c75796..58d919a0 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -16,8 +16,14 @@ */ uint32_t default_layer_state = 0; +__attribute__((weak)) +uint32_t default_layer_state_set_kb(uint32_t state) { + return state; +} + static void default_layer_state_set(uint32_t state) { + state = default_layer_state_set_kb(state); debug("default_layer_state: "); default_layer_debug(); debug(" to "); default_layer_state = state; @@ -57,8 +63,14 @@ void default_layer_xor(uint32_t state) */ uint32_t layer_state = 0; +__attribute__((weak)) +uint32_t layer_state_set_kb(uint32_t state) { + return state; +} + static void layer_state_set(uint32_t state) { + state = layer_state_set_kb(state); dprint("layer_state: "); layer_debug(); dprint(" to "); layer_state = state; diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h index 025cf542..d89ed6e5 100644 --- a/tmk_core/common/action_layer.h +++ b/tmk_core/common/action_layer.h @@ -29,6 +29,9 @@ extern uint32_t default_layer_state; void default_layer_debug(void); void default_layer_set(uint32_t state); +__attribute__((weak)) +uint32_t default_layer_state_set_kb(uint32_t state); + #ifndef NO_ACTION_LAYER /* bitwise operation */ void default_layer_or(uint32_t state); @@ -69,6 +72,8 @@ void layer_xor(uint32_t state); #define layer_xor(state) #define layer_debug() +__attribute__((weak)) +uint32_t layer_state_set_kb(uint32_t state); #endif /* pressed actions cache */ diff --git a/tmk_core/common/action_macro.h b/tmk_core/common/action_macro.h index aedc32ec..f373f506 100644 --- a/tmk_core/common/action_macro.h +++ b/tmk_core/common/action_macro.h @@ -20,11 +20,33 @@ along with this program. If not, see . #include "progmem.h" -#define MACRO_NONE 0 + +typedef uint8_t macro_t; + +#define MACRO_NONE (macro_t*)0 #define MACRO(...) ({ static const macro_t __m[] PROGMEM = { __VA_ARGS__ }; &__m[0]; }) #define MACRO_GET(p) pgm_read_byte(p) -typedef uint8_t macro_t; +// Sends press when the macro key is pressed, release when release, or tap_macro when the key has been tapped +#define MACRO_TAP_HOLD(record, press, release, tap_macro) ( ((record)->event.pressed) ? \ + ( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? (press) : MACRO_NONE ) : \ + ( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (tap_macro) : (release) ) ) + +// Holds down the modifier mod when the macro key is held, or sends macro instead when tapped +#define MACRO_TAP_HOLD_MOD(record, macro, mod) MACRO_TAP_HOLD(record, (MACRO(D(mod), END)), MACRO(U(mod), END), macro) + +// Holds down the modifier mod when the macro key is held, or pressed a shifted key when tapped (eg: shift+3 for #) +#define MACRO_TAP_SHFT_KEY_HOLD_MOD(record, key, mod) MACRO_TAP_HOLD_MOD(record, (MACRO(I(10), D(LSFT), T(key), U(LSFT), END)), mod) + + +// Momentary switch layer when held, sends macro if tapped +#define MACRO_TAP_HOLD_LAYER(record, macro, layer) ( ((record)->event.pressed) ? \ + ( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? ({layer_on((layer)); MACRO_NONE; }) : MACRO_NONE ) : \ + ( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (macro) : ({layer_off((layer)); MACRO_NONE; }) ) ) + +// Momentary switch layer when held, presses a shifted key when tapped (eg: shift+3 for #) +#define MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, key, layer) MACRO_TAP_HOLD_LAYER(record, MACRO(I(10), D(LSFT), T(key), U(LSFT), END), layer) + #ifndef NO_ACTION_MACRO diff --git a/tmk_core/common/action_tapping.c b/tmk_core/common/action_tapping.c index e16e11be..bd9a69ae 100644 --- a/tmk_core/common/action_tapping.c +++ b/tmk_core/common/action_tapping.c @@ -228,6 +228,7 @@ bool process_tapping(keyrecord_t *keyp) if (WITHIN_TAPPING_TERM(event)) { if (event.pressed) { if (IS_TAPPING_KEY(event.key)) { +#ifndef TAPPING_FORCE_HOLD if (!tapping_key.tap.interrupted && tapping_key.tap.count > 0) { // sequential tap. keyp->tap = tapping_key.tap; @@ -237,11 +238,11 @@ bool process_tapping(keyrecord_t *keyp) tapping_key = *keyp; debug_tapping_key(); return true; - } else { - // FIX: start new tap again - tapping_key = *keyp; - return true; } +#endif + // FIX: start new tap again + tapping_key = *keyp; + return true; } else if (is_tap_key(event.key)) { // Sequential tap can be interfered with other tap key. debug("Tapping: Start with interfering other tap.\n"); @@ -257,7 +258,7 @@ bool process_tapping(keyrecord_t *keyp) return true; } } else { - if (!IS_NOEVENT(event)) debug("Tapping: other key just after tap.\n") {}; + if (!IS_NOEVENT(event)) debug("Tapping: other key just after tap.\n"); process_record(keyp); return true; } diff --git a/tmk_core/common/avr/bootloader.c b/tmk_core/common/avr/bootloader.c index ad547b98..34db8d0b 100644 --- a/tmk_core/common/avr/bootloader.c +++ b/tmk_core/common/avr/bootloader.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -89,6 +90,12 @@ void bootloader_jump(void) { _delay_ms(5); #endif + #ifdef BOOTLOADHID_BOOTLOADER + // force bootloadHID to stay in bootloader mode, so that it waits + // for a new firmware to be flashed + eeprom_write_byte((uint8_t *)1, 0x00); + #endif + // watchdog reset reset_key = BOOTLOADER_RESET_KEY; wdt_enable(WDTO_250MS); @@ -114,6 +121,11 @@ void bootloader_jump(void) { #endif } +#ifdef __AVR_ATmega32A__ +// MCUSR is actually called MCUCSR in ATmega32A +#define MCUSR MCUCSR +#endif + /* this runs before main() */ void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3"))); void bootloader_jump_after_watchdog_reset(void) diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c index 8a7272bb..0c81e836 100644 --- a/tmk_core/common/avr/suspend.c +++ b/tmk_core/common/avr/suspend.c @@ -47,6 +47,7 @@ void suspend_idle(uint8_t time) sleep_disable(); } +#ifndef NO_SUSPEND_POWER_DOWN /* Power down MCU with watchdog timer * wdto: watchdog timer timeout defined in * WDTO_15MS @@ -61,6 +62,7 @@ void suspend_idle(uint8_t time) * WDTO_8S */ static uint8_t wdt_timeout = 0; + static void power_down(uint8_t wdto) { #ifdef PROTOCOL_LUFA @@ -98,19 +100,19 @@ static void power_down(uint8_t wdto) // Disable watchdog after sleep wdt_disable(); } +#endif void suspend_power_down(void) { +#ifndef NO_SUSPEND_POWER_DOWN power_down(WDTO_15MS); +#endif } __attribute__ ((weak)) void matrix_power_up(void) {} __attribute__ ((weak)) void matrix_power_down(void) {} bool suspend_wakeup_condition(void) { -#ifdef BACKLIGHT_ENABLE - backlight_set(0); -#endif matrix_power_up(); matrix_scan(); matrix_power_down(); @@ -126,10 +128,9 @@ void suspend_wakeup_init(void) // clear keyboard state clear_keyboard(); #ifdef BACKLIGHT_ENABLE - backlight_set(0); backlight_init(); #endif -led_set(host_keyboard_leds()); + led_set(host_keyboard_leds()); } #ifndef NO_SUSPEND_POWER_DOWN diff --git a/tmk_core/common/avr/timer.c b/tmk_core/common/avr/timer.c index 292b41c3..36901520 100644 --- a/tmk_core/common/avr/timer.c +++ b/tmk_core/common/avr/timer.c @@ -17,6 +17,7 @@ along with this program. If not, see . #include #include +#include #include #include "timer_avr.h" #include "timer.h" @@ -24,38 +25,47 @@ along with this program. If not, see . // counter resolution 1ms // NOTE: union { uint32_t timer32; struct { uint16_t dummy; uint16_t timer16; }} -volatile uint32_t timer_count = 0; +volatile uint32_t timer_count; void timer_init(void) { - // Timer0 CTC mode - TCCR0A = 0x02; - #if TIMER_PRESCALER == 1 - TCCR0B = 0x01; + uint8_t prescaler = 0x01; #elif TIMER_PRESCALER == 8 - TCCR0B = 0x02; + uint8_t prescaler = 0x02; #elif TIMER_PRESCALER == 64 - TCCR0B = 0x03; + uint8_t prescaler = 0x03; #elif TIMER_PRESCALER == 256 - TCCR0B = 0x04; + uint8_t prescaler = 0x04; #elif TIMER_PRESCALER == 1024 - TCCR0B = 0x05; + uint8_t prescaler = 0x05; #else # error "Timer prescaler value is NOT vaild." #endif +#ifndef __AVR_ATmega32A__ + // Timer0 CTC mode + TCCR0A = 0x02; + + TCCR0B = prescaler; + OCR0A = TIMER_RAW_TOP; TIMSK0 = (1<. #include #include "report.h" - +#ifdef MIDI_ENABLE + #include "midi.h" +#endif typedef struct { uint8_t (*keyboard_leds)(void); @@ -28,6 +30,11 @@ typedef struct { void (*send_mouse)(report_mouse_t *); void (*send_system)(uint16_t); void (*send_consumer)(uint16_t); +#ifdef MIDI_ENABLE + void (*usb_send_func)(MidiDevice *, uint16_t, uint8_t, uint8_t, uint8_t); + void (*usb_get_midi)(MidiDevice *); + void (*midi_usb_init)(MidiDevice *); +#endif } host_driver_t; #endif diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 371d93f3..eac1f1dd 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -14,6 +14,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ + #include #include "keyboard.h" #include "matrix.h" @@ -50,6 +51,9 @@ along with this program. If not, see . #ifdef RGBLIGHT_ENABLE # include "rgblight.h" #endif +#ifdef FAUXCLICKY_ENABLE +# include "fauxclicky.h" +#endif #ifdef SERIAL_LINK_ENABLE # include "serial_link/system/serial_link.h" #endif @@ -107,6 +111,9 @@ void keyboard_init(void) { #ifdef RGBLIGHT_ENABLE rgblight_init(); #endif +#ifdef FAUXCLICKY_ENABLE + fauxclicky_init(); +#endif #if defined(NKRO_ENABLE) && defined(FORCE_NKRO) keymap_config.nkro = 1; #endif @@ -188,7 +195,7 @@ MATRIX_LOOP_END: #endif #ifdef VISUALIZER_ENABLE - visualizer_update(default_layer_state, layer_state, host_keyboard_leds()); + visualizer_update(default_layer_state, layer_state, visualizer_get_mods(), host_keyboard_leds()); #endif // update LED diff --git a/tmk_core/common/keycode.h b/tmk_core/common/keycode.h index 2f208c54..54e9c322 100644 --- a/tmk_core/common/keycode.h +++ b/tmk_core/common/keycode.h @@ -85,7 +85,7 @@ along with this program. If not, see . #define KC_LCAP KC_LOCKING_CAPS #define KC_LNUM KC_LOCKING_NUM #define KC_LSCR KC_LOCKING_SCROLL -#define KC_ERAS KC_ALT_ERASE, +#define KC_ERAS KC_ALT_ERASE #define KC_CLR KC_CLEAR /* Japanese specific */ #define KC_ZKHK KC_GRAVE diff --git a/tmk_core/common/matrix.h b/tmk_core/common/matrix.h index cee3593e..2543f5ab 100644 --- a/tmk_core/common/matrix.h +++ b/tmk_core/common/matrix.h @@ -50,7 +50,7 @@ void matrix_init(void); uint8_t matrix_scan(void); /* whether modified from previous scan. used after matrix_scan. */ bool matrix_is_modified(void) __attribute__ ((deprecated)); -/* whether a swtich is on */ +/* whether a switch is on */ bool matrix_is_on(uint8_t row, uint8_t col); /* matrix state on row */ matrix_row_t matrix_get_row(uint8_t row); diff --git a/tmk_core/common/raw_hid.h b/tmk_core/common/raw_hid.h new file mode 100644 index 00000000..86da02fd --- /dev/null +++ b/tmk_core/common/raw_hid.h @@ -0,0 +1,8 @@ +#ifndef _RAW_HID_H_ +#define _RAW_HID_H_ + +void raw_hid_receive( uint8_t *data, uint8_t length ); + +void raw_hid_send( uint8_t *data, uint8_t length ); + +#endif diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 0c799eca..8fb28b6c 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -134,13 +134,6 @@ typedef union { } nkro; #endif } __attribute__ ((packed)) report_keyboard_t; -/* -typedef struct { - uint8_t mods; - uint8_t reserved; - uint8_t keys[REPORT_KEYS]; -} __attribute__ ((packed)) report_keyboard_t; -*/ typedef struct { uint8_t buttons; diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk index 5b1e3d19..5b157797 100644 --- a/tmk_core/protocol/lufa.mk +++ b/tmk_core/protocol/lufa.mk @@ -8,13 +8,14 @@ LUFA_PATH ?= $(LUFA_DIR)/LUFA-git ifneq (, $(wildcard $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk)) # New build system from 20120730 LUFA_ROOT_PATH = $(LUFA_PATH)/LUFA - include $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk + include $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk else include $(TMK_PATH)/$(LUFA_PATH)/LUFA/makefile endif LUFA_SRC = lufa.c \ descriptor.c \ + outputselect.c \ $(LUFA_SRC_USB) ifeq ($(strip $(MIDI_ENABLE)), yes) @@ -26,6 +27,15 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) $(TMK_DIR)/protocol/serial_uart.c endif +ifeq ($(strip $(BLUETOOTH)), AdafruitBLE) + LUFA_SRC += $(LUFA_DIR)/adafruit_ble.cpp +endif + +ifeq ($(strip $(BLUETOOTH)), AdafruitEZKey) + LUFA_SRC += $(LUFA_DIR)/bluetooth.c \ + $(TMK_DIR)/protocol/serial_uart.c +endif + ifeq ($(strip $(VIRTSER_ENABLE)), yes) LUFA_SRC += $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c endif @@ -49,6 +59,7 @@ LUFA_OPTS += -DUSE_FLASH_DESCRIPTORS LUFA_OPTS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" #LUFA_OPTS += -DINTERRUPT_CONTROL_ENDPOINT LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 LUFA_OPTS += -DFIXED_NUM_CONFIGURATIONS=1 # Remote wakeup fix for ATmega32U2 https://github.com/tmk/tmk_keyboard/issues/361 diff --git a/tmk_core/protocol/lufa/adafruit_ble.cpp b/tmk_core/protocol/lufa/adafruit_ble.cpp new file mode 100644 index 00000000..fd6edd42 --- /dev/null +++ b/tmk_core/protocol/lufa/adafruit_ble.cpp @@ -0,0 +1,805 @@ +#include "adafruit_ble.h" +#include +#include +#include +#include +#include +#include "debug.h" +#include "pincontrol.h" +#include "timer.h" +#include "action_util.h" +#include "ringbuffer.hpp" +#include + +// These are the pin assignments for the 32u4 boards. +// You may define them to something else in your config.h +// if yours is wired up differently. +#ifndef AdafruitBleResetPin +#define AdafruitBleResetPin D4 +#endif + +#ifndef AdafruitBleCSPin +#define AdafruitBleCSPin B4 +#endif + +#ifndef AdafruitBleIRQPin +#define AdafruitBleIRQPin E6 +#endif + + +#define SAMPLE_BATTERY +#define ConnectionUpdateInterval 1000 /* milliseconds */ + +static struct { + bool is_connected; + bool initialized; + bool configured; + +#define ProbedEvents 1 +#define UsingEvents 2 + bool event_flags; + +#ifdef SAMPLE_BATTERY + uint16_t last_battery_update; + uint32_t vbat; +#endif + uint16_t last_connection_update; +} state; + +// Commands are encoded using SDEP and sent via SPI +// https://github.com/adafruit/Adafruit_BluefruitLE_nRF51/blob/master/SDEP.md + +#define SdepMaxPayload 16 +struct sdep_msg { + uint8_t type; + uint8_t cmd_low; + uint8_t cmd_high; + struct __attribute__((packed)) { + uint8_t len:7; + uint8_t more:1; + }; + uint8_t payload[SdepMaxPayload]; +} __attribute__((packed)); + +// The recv latency is relatively high, so when we're hammering keys quickly, +// we want to avoid waiting for the responses in the matrix loop. We maintain +// a short queue for that. Since there is quite a lot of space overhead for +// the AT command representation wrapped up in SDEP, we queue the minimal +// information here. + +enum queue_type { + QTKeyReport, // 1-byte modifier + 6-byte key report + QTConsumer, // 16-bit key code +#ifdef MOUSE_ENABLE + QTMouseMove, // 4-byte mouse report +#endif +}; + +struct queue_item { + enum queue_type queue_type; + uint16_t added; + union __attribute__((packed)) { + struct __attribute__((packed)) { + uint8_t modifier; + uint8_t keys[6]; + } key; + + uint16_t consumer; + struct __attribute__((packed)) { + int8_t x, y, scroll, pan; + } mousemove; + }; +}; + +// Items that we wish to send +static RingBuffer send_buf; +// Pending response; while pending, we can't send any more requests. +// This records the time at which we sent the command for which we +// are expecting a response. +static RingBuffer resp_buf; + +static bool process_queue_item(struct queue_item *item, uint16_t timeout); + +enum sdep_type { + SdepCommand = 0x10, + SdepResponse = 0x20, + SdepAlert = 0x40, + SdepError = 0x80, + SdepSlaveNotReady = 0xfe, // Try again later + SdepSlaveOverflow = 0xff, // You read more data than is available +}; + +enum ble_cmd { + BleInitialize = 0xbeef, + BleAtWrapper = 0x0a00, + BleUartTx = 0x0a01, + BleUartRx = 0x0a02, +}; + +enum ble_system_event_bits { + BleSystemConnected = 0, + BleSystemDisconnected = 1, + BleSystemUartRx = 8, + BleSystemMidiRx = 10, +}; + +// The SDEP.md file says 2MHz but the web page and the sample driver +// both use 4MHz +#define SpiBusSpeed 4000000 + +#define SdepTimeout 150 /* milliseconds */ +#define SdepShortTimeout 10 /* milliseconds */ +#define SdepBackOff 25 /* microseconds */ +#define BatteryUpdateInterval 10000 /* milliseconds */ + +static bool at_command(const char *cmd, char *resp, uint16_t resplen, + bool verbose, uint16_t timeout = SdepTimeout); +static bool at_command_P(const char *cmd, char *resp, uint16_t resplen, + bool verbose = false); + +struct SPI_Settings { + uint8_t spcr, spsr; +}; + +static struct SPI_Settings spi; + +// Initialize 4Mhz MSBFIRST MODE0 +void SPI_init(struct SPI_Settings *spi) { + spi->spcr = _BV(SPE) | _BV(MSTR); + spi->spsr = _BV(SPI2X); + + static_assert(SpiBusSpeed == F_CPU / 2, "hard coded at 4Mhz"); + + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + // Ensure that SS is OUTPUT High + digitalWrite(B0, PinLevelHigh); + pinMode(B0, PinDirectionOutput); + + SPCR |= _BV(MSTR); + SPCR |= _BV(SPE); + pinMode(B1 /* SCK */, PinDirectionOutput); + pinMode(B2 /* MOSI */, PinDirectionOutput); + } +} + +static inline void SPI_begin(struct SPI_Settings*spi) { + SPCR = spi->spcr; + SPSR = spi->spsr; +} + +static inline uint8_t SPI_TransferByte(uint8_t data) { + SPDR = data; + asm volatile("nop"); + while (!(SPSR & _BV(SPIF))) { + ; // wait + } + return SPDR; +} + +static inline void spi_send_bytes(const uint8_t *buf, uint8_t len) { + if (len == 0) return; + const uint8_t *end = buf + len; + while (buf < end) { + SPDR = *buf; + while (!(SPSR & _BV(SPIF))) { + ; // wait + } + ++buf; + } +} + +static inline uint16_t spi_read_byte(void) { + return SPI_TransferByte(0x00 /* dummy */); +} + +static inline void spi_recv_bytes(uint8_t *buf, uint8_t len) { + const uint8_t *end = buf + len; + if (len == 0) return; + while (buf < end) { + SPDR = 0; // write a dummy to initiate read + while (!(SPSR & _BV(SPIF))) { + ; // wait + } + *buf = SPDR; + ++buf; + } +} + +#if 0 +static void dump_pkt(const struct sdep_msg *msg) { + print("pkt: type="); + print_hex8(msg->type); + print(" cmd="); + print_hex8(msg->cmd_high); + print_hex8(msg->cmd_low); + print(" len="); + print_hex8(msg->len); + print(" more="); + print_hex8(msg->more); + print("\n"); +} +#endif + +// Send a single SDEP packet +static bool sdep_send_pkt(const struct sdep_msg *msg, uint16_t timeout) { + SPI_begin(&spi); + + digitalWrite(AdafruitBleCSPin, PinLevelLow); + uint16_t timerStart = timer_read(); + bool success = false; + bool ready = false; + + do { + ready = SPI_TransferByte(msg->type) != SdepSlaveNotReady; + if (ready) { + break; + } + + // Release it and let it initialize + digitalWrite(AdafruitBleCSPin, PinLevelHigh); + _delay_us(SdepBackOff); + digitalWrite(AdafruitBleCSPin, PinLevelLow); + } while (timer_elapsed(timerStart) < timeout); + + if (ready) { + // Slave is ready; send the rest of the packet + spi_send_bytes(&msg->cmd_low, + sizeof(*msg) - (1 + sizeof(msg->payload)) + msg->len); + success = true; + } + + digitalWrite(AdafruitBleCSPin, PinLevelHigh); + + return success; +} + +static inline void sdep_build_pkt(struct sdep_msg *msg, uint16_t command, + const uint8_t *payload, uint8_t len, + bool moredata) { + msg->type = SdepCommand; + msg->cmd_low = command & 0xff; + msg->cmd_high = command >> 8; + msg->len = len; + msg->more = (moredata && len == SdepMaxPayload) ? 1 : 0; + + static_assert(sizeof(*msg) == 20, "msg is correctly packed"); + + memcpy(msg->payload, payload, len); +} + +// Read a single SDEP packet +static bool sdep_recv_pkt(struct sdep_msg *msg, uint16_t timeout) { + bool success = false; + uint16_t timerStart = timer_read(); + bool ready = false; + + do { + ready = digitalRead(AdafruitBleIRQPin); + if (ready) { + break; + } + _delay_us(1); + } while (timer_elapsed(timerStart) < timeout); + + if (ready) { + SPI_begin(&spi); + + digitalWrite(AdafruitBleCSPin, PinLevelLow); + + do { + // Read the command type, waiting for the data to be ready + msg->type = spi_read_byte(); + if (msg->type == SdepSlaveNotReady || msg->type == SdepSlaveOverflow) { + // Release it and let it initialize + digitalWrite(AdafruitBleCSPin, PinLevelHigh); + _delay_us(SdepBackOff); + digitalWrite(AdafruitBleCSPin, PinLevelLow); + continue; + } + + // Read the rest of the header + spi_recv_bytes(&msg->cmd_low, sizeof(*msg) - (1 + sizeof(msg->payload))); + + // and get the payload if there is any + if (msg->len <= SdepMaxPayload) { + spi_recv_bytes(msg->payload, msg->len); + } + success = true; + break; + } while (timer_elapsed(timerStart) < timeout); + + digitalWrite(AdafruitBleCSPin, PinLevelHigh); + } + return success; +} + +static void resp_buf_read_one(bool greedy) { + uint16_t last_send; + if (!resp_buf.peek(last_send)) { + return; + } + + if (digitalRead(AdafruitBleIRQPin)) { + struct sdep_msg msg; + +again: + if (sdep_recv_pkt(&msg, SdepTimeout)) { + if (!msg.more) { + // We got it; consume this entry + resp_buf.get(last_send); + dprintf("recv latency %dms\n", TIMER_DIFF_16(timer_read(), last_send)); + } + + if (greedy && resp_buf.peek(last_send) && digitalRead(AdafruitBleIRQPin)) { + goto again; + } + } + + } else if (timer_elapsed(last_send) > SdepTimeout * 2) { + dprintf("waiting_for_result: timeout, resp_buf size %d\n", + (int)resp_buf.size()); + + // Timed out: consume this entry + resp_buf.get(last_send); + } +} + +static void send_buf_send_one(uint16_t timeout = SdepTimeout) { + struct queue_item item; + + // Don't send anything more until we get an ACK + if (!resp_buf.empty()) { + return; + } + + if (!send_buf.peek(item)) { + return; + } + if (process_queue_item(&item, timeout)) { + // commit that peek + send_buf.get(item); + dprintf("send_buf_send_one: have %d remaining\n", (int)send_buf.size()); + } else { + dprint("failed to send, will retry\n"); + _delay_ms(SdepTimeout); + resp_buf_read_one(true); + } +} + +static void resp_buf_wait(const char *cmd) { + bool didPrint = false; + while (!resp_buf.empty()) { + if (!didPrint) { + dprintf("wait on buf for %s\n", cmd); + didPrint = true; + } + resp_buf_read_one(true); + } +} + +static bool ble_init(void) { + state.initialized = false; + state.configured = false; + state.is_connected = false; + + pinMode(AdafruitBleIRQPin, PinDirectionInput); + pinMode(AdafruitBleCSPin, PinDirectionOutput); + digitalWrite(AdafruitBleCSPin, PinLevelHigh); + + SPI_init(&spi); + + // Perform a hardware reset + pinMode(AdafruitBleResetPin, PinDirectionOutput); + digitalWrite(AdafruitBleResetPin, PinLevelHigh); + digitalWrite(AdafruitBleResetPin, PinLevelLow); + _delay_ms(10); + digitalWrite(AdafruitBleResetPin, PinLevelHigh); + + _delay_ms(1000); // Give it a second to initialize + + state.initialized = true; + return state.initialized; +} + +static inline uint8_t min(uint8_t a, uint8_t b) { + return a < b ? a : b; +} + +static bool read_response(char *resp, uint16_t resplen, bool verbose) { + char *dest = resp; + char *end = dest + resplen; + + while (true) { + struct sdep_msg msg; + + if (!sdep_recv_pkt(&msg, 2 * SdepTimeout)) { + dprint("sdep_recv_pkt failed\n"); + return false; + } + + if (msg.type != SdepResponse) { + *resp = 0; + return false; + } + + uint8_t len = min(msg.len, end - dest); + if (len > 0) { + memcpy(dest, msg.payload, len); + dest += len; + } + + if (!msg.more) { + // No more data is expected! + break; + } + } + + // Ensure the response is NUL terminated + *dest = 0; + + // "Parse" the result text; we want to snip off the trailing OK or ERROR line + // Rewind past the possible trailing CRLF so that we can strip it + --dest; + while (dest > resp && (dest[0] == '\n' || dest[0] == '\r')) { + *dest = 0; + --dest; + } + + // Look back for start of preceeding line + char *last_line = strrchr(resp, '\n'); + if (last_line) { + ++last_line; + } else { + last_line = resp; + } + + bool success = false; + static const char kOK[] PROGMEM = "OK"; + + success = !strcmp_P(last_line, kOK ); + + if (verbose || !success) { + dprintf("result: %s\n", resp); + } + return success; +} + +static bool at_command(const char *cmd, char *resp, uint16_t resplen, + bool verbose, uint16_t timeout) { + const char *end = cmd + strlen(cmd); + struct sdep_msg msg; + + if (verbose) { + dprintf("ble send: %s\n", cmd); + } + + if (resp) { + // They want to decode the response, so we need to flush and wait + // for all pending I/O to finish before we start this one, so + // that we don't confuse the results + resp_buf_wait(cmd); + *resp = 0; + } + + // Fragment the command into a series of SDEP packets + while (end - cmd > SdepMaxPayload) { + sdep_build_pkt(&msg, BleAtWrapper, (uint8_t *)cmd, SdepMaxPayload, true); + if (!sdep_send_pkt(&msg, timeout)) { + return false; + } + cmd += SdepMaxPayload; + } + + sdep_build_pkt(&msg, BleAtWrapper, (uint8_t *)cmd, end - cmd, false); + if (!sdep_send_pkt(&msg, timeout)) { + return false; + } + + if (resp == NULL) { + auto now = timer_read(); + while (!resp_buf.enqueue(now)) { + resp_buf_read_one(false); + } + auto later = timer_read(); + if (TIMER_DIFF_16(later, now) > 0) { + dprintf("waited %dms for resp_buf\n", TIMER_DIFF_16(later, now)); + } + return true; + } + + return read_response(resp, resplen, verbose); +} + +bool at_command_P(const char *cmd, char *resp, uint16_t resplen, bool verbose) { + auto cmdbuf = (char *)alloca(strlen_P(cmd) + 1); + strcpy_P(cmdbuf, cmd); + return at_command(cmdbuf, resp, resplen, verbose); +} + +bool adafruit_ble_is_connected(void) { + return state.is_connected; +} + +bool adafruit_ble_enable_keyboard(void) { + char resbuf[128]; + + if (!state.initialized && !ble_init()) { + return false; + } + + state.configured = false; + + // Disable command echo + static const char kEcho[] PROGMEM = "ATE=0"; + // Make the advertised name match the keyboard + static const char kGapDevName[] PROGMEM = + "AT+GAPDEVNAME=" STR(PRODUCT) " " STR(DESCRIPTION); + // Turn on keyboard support + static const char kHidEnOn[] PROGMEM = "AT+BLEHIDEN=1"; + + // Adjust intervals to improve latency. This causes the "central" + // system (computer/tablet) to poll us every 10-30 ms. We can't + // set a smaller value than 10ms, and 30ms seems to be the natural + // processing time on my macbook. Keeping it constrained to that + // feels reasonable to type to. + static const char kGapIntervals[] PROGMEM = "AT+GAPINTERVALS=10,30,,"; + + // Reset the device so that it picks up the above changes + static const char kATZ[] PROGMEM = "ATZ"; + + // Turn down the power level a bit + static const char kPower[] PROGMEM = "AT+BLEPOWERLEVEL=-12"; + static PGM_P const configure_commands[] PROGMEM = { + kEcho, + kGapIntervals, + kGapDevName, + kHidEnOn, + kPower, + kATZ, + }; + + uint8_t i; + for (i = 0; i < sizeof(configure_commands) / sizeof(configure_commands[0]); + ++i) { + PGM_P cmd; + memcpy_P(&cmd, configure_commands + i, sizeof(cmd)); + + if (!at_command_P(cmd, resbuf, sizeof(resbuf))) { + dprintf("failed BLE command: %S: %s\n", cmd, resbuf); + goto fail; + } + } + + state.configured = true; + + // Check connection status in a little while; allow the ATZ time + // to kick in. + state.last_connection_update = timer_read(); +fail: + return state.configured; +} + +static void set_connected(bool connected) { + if (connected != state.is_connected) { + if (connected) { + print("****** BLE CONNECT!!!!\n"); + } else { + print("****** BLE DISCONNECT!!!!\n"); + } + state.is_connected = connected; + + // TODO: if modifiers are down on the USB interface and + // we cut over to BLE or vice versa, they will remain stuck. + // This feels like a good point to do something like clearing + // the keyboard and/or generating a fake all keys up message. + // However, I've noticed that it takes a couple of seconds + // for macOS to to start recognizing key presses after BLE + // is in the connected state, so I worry that doing that + // here may not be good enough. + } +} + +void adafruit_ble_task(void) { + char resbuf[48]; + + if (!state.configured && !adafruit_ble_enable_keyboard()) { + return; + } + resp_buf_read_one(true); + send_buf_send_one(SdepShortTimeout); + + if (resp_buf.empty() && (state.event_flags & UsingEvents) && + digitalRead(AdafruitBleIRQPin)) { + // Must be an event update + if (at_command_P(PSTR("AT+EVENTSTATUS"), resbuf, sizeof(resbuf))) { + uint32_t mask = strtoul(resbuf, NULL, 16); + + if (mask & BleSystemConnected) { + set_connected(true); + } else if (mask & BleSystemDisconnected) { + set_connected(false); + } + } + } + + if (timer_elapsed(state.last_connection_update) > ConnectionUpdateInterval) { + bool shouldPoll = true; + if (!(state.event_flags & ProbedEvents)) { + // Request notifications about connection status changes. + // This only works in SPIFRIEND firmware > 0.6.7, which is why + // we check for this conditionally here. + // Note that at the time of writing, HID reports only work correctly + // with Apple products on firmware version 0.6.7! + // https://forums.adafruit.com/viewtopic.php?f=8&t=104052 + if (at_command_P(PSTR("AT+EVENTENABLE=0x1"), resbuf, sizeof(resbuf))) { + at_command_P(PSTR("AT+EVENTENABLE=0x2"), resbuf, sizeof(resbuf)); + state.event_flags |= UsingEvents; + } + state.event_flags |= ProbedEvents; + + // leave shouldPoll == true so that we check at least once + // before relying solely on events + } else { + shouldPoll = false; + } + + static const char kGetConn[] PROGMEM = "AT+GAPGETCONN"; + state.last_connection_update = timer_read(); + + if (at_command_P(kGetConn, resbuf, sizeof(resbuf))) { + set_connected(atoi(resbuf)); + } + } + +#ifdef SAMPLE_BATTERY + // I don't know if this really does anything useful yet; the reported + // voltage level always seems to be around 3200mV. We may want to just rip + // this code out. + if (timer_elapsed(state.last_battery_update) > BatteryUpdateInterval && + resp_buf.empty()) { + state.last_battery_update = timer_read(); + + if (at_command_P(PSTR("AT+HWVBAT"), resbuf, sizeof(resbuf))) { + state.vbat = atoi(resbuf); + } + } +#endif +} + +static bool process_queue_item(struct queue_item *item, uint16_t timeout) { + char cmdbuf[48]; + char fmtbuf[64]; + + // Arrange to re-check connection after keys have settled + state.last_connection_update = timer_read(); + +#if 1 + if (TIMER_DIFF_16(state.last_connection_update, item->added) > 0) { + dprintf("send latency %dms\n", + TIMER_DIFF_16(state.last_connection_update, item->added)); + } +#endif + + switch (item->queue_type) { + case QTKeyReport: + strcpy_P(fmtbuf, + PSTR("AT+BLEKEYBOARDCODE=%02x-00-%02x-%02x-%02x-%02x-%02x-%02x")); + snprintf(cmdbuf, sizeof(cmdbuf), fmtbuf, item->key.modifier, + item->key.keys[0], item->key.keys[1], item->key.keys[2], + item->key.keys[3], item->key.keys[4], item->key.keys[5]); + return at_command(cmdbuf, NULL, 0, true, timeout); + + case QTConsumer: + strcpy_P(fmtbuf, PSTR("AT+BLEHIDCONTROLKEY=0x%04x")); + snprintf(cmdbuf, sizeof(cmdbuf), fmtbuf, item->consumer); + return at_command(cmdbuf, NULL, 0, true, timeout); + +#ifdef MOUSE_ENABLE + case QTMouseMove: + strcpy_P(fmtbuf, PSTR("AT+BLEHIDMOUSEMOVE=%d,%d,%d,%d")); + snprintf(cmdbuf, sizeof(cmdbuf), fmtbuf, item->mousemove.x, + item->mousemove.y, item->mousemove.scroll, item->mousemove.pan); + return at_command(cmdbuf, NULL, 0, true, timeout); +#endif + default: + return true; + } +} + +bool adafruit_ble_send_keys(uint8_t hid_modifier_mask, uint8_t *keys, + uint8_t nkeys) { + struct queue_item item; + bool didWait = false; + + item.queue_type = QTKeyReport; + item.key.modifier = hid_modifier_mask; + item.added = timer_read(); + + while (nkeys >= 0) { + item.key.keys[0] = keys[0]; + item.key.keys[1] = nkeys >= 1 ? keys[1] : 0; + item.key.keys[2] = nkeys >= 2 ? keys[2] : 0; + item.key.keys[3] = nkeys >= 3 ? keys[3] : 0; + item.key.keys[4] = nkeys >= 4 ? keys[4] : 0; + item.key.keys[5] = nkeys >= 5 ? keys[5] : 0; + + if (!send_buf.enqueue(item)) { + if (!didWait) { + dprint("wait for buf space\n"); + didWait = true; + } + send_buf_send_one(); + continue; + } + + if (nkeys <= 6) { + return true; + } + + nkeys -= 6; + keys += 6; + } + + return true; +} + +bool adafruit_ble_send_consumer_key(uint16_t keycode, int hold_duration) { + struct queue_item item; + + item.queue_type = QTConsumer; + item.consumer = keycode; + + while (!send_buf.enqueue(item)) { + send_buf_send_one(); + } + return true; +} + +#ifdef MOUSE_ENABLE +bool adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll, + int8_t pan) { + struct queue_item item; + + item.queue_type = QTMouseMove; + item.mousemove.x = x; + item.mousemove.y = y; + item.mousemove.scroll = scroll; + item.mousemove.pan = pan; + + while (!send_buf.enqueue(item)) { + send_buf_send_one(); + } + return true; +} +#endif + +uint32_t adafruit_ble_read_battery_voltage(void) { + return state.vbat; +} + +bool adafruit_ble_set_mode_leds(bool on) { + if (!state.configured) { + return false; + } + + // The "mode" led is the red blinky one + at_command_P(on ? PSTR("AT+HWMODELED=1") : PSTR("AT+HWMODELED=0"), NULL, 0); + + // Pin 19 is the blue "connected" LED; turn that off too. + // When turning LEDs back on, don't turn that LED on if we're + // not connected, as that would be confusing. + at_command_P(on && state.is_connected ? PSTR("AT+HWGPIO=19,1") + : PSTR("AT+HWGPIO=19,0"), + NULL, 0); + return true; +} + +// https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/ble-generic#at-plus-blepowerlevel +bool adafruit_ble_set_power_level(int8_t level) { + char cmd[46]; + if (!state.configured) { + return false; + } + snprintf(cmd, sizeof(cmd), "AT+BLEPOWERLEVEL=%d", level); + return at_command(cmd, NULL, 0, false); +} diff --git a/tmk_core/protocol/lufa/adafruit_ble.h b/tmk_core/protocol/lufa/adafruit_ble.h new file mode 100644 index 00000000..b3bab3ca --- /dev/null +++ b/tmk_core/protocol/lufa/adafruit_ble.h @@ -0,0 +1,60 @@ +/* Bluetooth Low Energy Protocol for QMK. + * Author: Wez Furlong, 2016 + * Supports the Adafruit BLE board built around the nRF51822 chip. + */ +#pragma once +#ifdef MODULE_ADAFRUIT_BLE +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Instruct the module to enable HID keyboard support and reset */ +extern bool adafruit_ble_enable_keyboard(void); + +/* Query to see if the BLE module is connected */ +extern bool adafruit_ble_query_is_connected(void); + +/* Returns true if we believe that the BLE module is connected. + * This uses our cached understanding that is maintained by + * calling ble_task() periodically. */ +extern bool adafruit_ble_is_connected(void); + +/* Call this periodically to process BLE-originated things */ +extern void adafruit_ble_task(void); + +/* Generates keypress events for a set of keys. + * The hid modifier mask specifies the state of the modifier keys for + * this set of keys. + * Also sends a key release indicator, so that the keys do not remain + * held down. */ +extern bool adafruit_ble_send_keys(uint8_t hid_modifier_mask, uint8_t *keys, + uint8_t nkeys); + +/* Send a consumer keycode, holding it down for the specified duration + * (milliseconds) */ +extern bool adafruit_ble_send_consumer_key(uint16_t keycode, int hold_duration); + +#ifdef MOUSE_ENABLE +/* Send a mouse/wheel movement report. + * The parameters are signed and indicate positive of negative direction + * change. */ +extern bool adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll, + int8_t pan); +#endif + +/* Compute battery voltage by reading an analog pin. + * Returns the integer number of millivolts */ +extern uint32_t adafruit_ble_read_battery_voltage(void); + +extern bool adafruit_ble_set_mode_leds(bool on); +extern bool adafruit_ble_set_power_level(int8_t level); + +#ifdef __cplusplus +} +#endif + +#endif // MODULE_ADAFRUIT_BLE diff --git a/tmk_core/protocol/lufa/descriptor.c b/tmk_core/protocol/lufa/descriptor.c index 6f2407f5..feeea76d 100644 --- a/tmk_core/protocol/lufa/descriptor.c +++ b/tmk_core/protocol/lufa/descriptor.c @@ -40,6 +40,9 @@ #include "report.h" #include "descriptor.h" +#ifndef USB_MAX_POWER_CONSUMPTION +#define USB_MAX_POWER_CONSUMPTION 500 +#endif /******************************************************************************* * HID Report Descriptors @@ -140,10 +143,10 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = HID_RI_USAGE(8, 0x80), /* System Control */ HID_RI_COLLECTION(8, 0x01), /* Application */ HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM), - HID_RI_LOGICAL_MINIMUM(16, 0x0081), - HID_RI_LOGICAL_MAXIMUM(16, 0x00B7), + HID_RI_LOGICAL_MINIMUM(16, 0x0001), + HID_RI_LOGICAL_MAXIMUM(16, 0x0003), HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */ - HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */ + HID_RI_USAGE_MAXIMUM(16, 0x0083), /* System Wake Up */ HID_RI_REPORT_SIZE(8, 16), HID_RI_REPORT_COUNT(8, 1), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), @@ -164,6 +167,28 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = }; #endif +#ifdef RAW_ENABLE +const USB_Descriptor_HIDReport_Datatype_t PROGMEM RawReport[] = +{ + HID_RI_USAGE_PAGE(16, 0xFF60), /* Vendor Page 0xFF60 */ + HID_RI_USAGE(8, 0x61), /* Vendor Usage 0x61 */ + HID_RI_COLLECTION(8, 0x01), /* Application */ + HID_RI_USAGE(8, 0x62), /* Vendor Usage 0x62 */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), + HID_RI_REPORT_COUNT(8, RAW_EPSIZE), + HID_RI_REPORT_SIZE(8, 0x08), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + HID_RI_USAGE(8, 0x63), /* Vendor Usage 0x63 */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(16, 0x00FF), + HID_RI_REPORT_COUNT(8, RAW_EPSIZE), + HID_RI_REPORT_SIZE(8, 0x08), + HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), + HID_RI_END_COLLECTION(0), +}; +#endif + #ifdef CONSOLE_ENABLE const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = { @@ -272,7 +297,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP), - .MaxPowerConsumption = USB_CONFIG_POWER_MA(500) + .MaxPowerConsumption = USB_CONFIG_POWER_MA(USB_MAX_POWER_CONSUMPTION) }, /* @@ -399,6 +424,58 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = }, #endif + /* + * Raw + */ + #ifdef RAW_ENABLE + .Raw_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = RAW_INTERFACE, + .AlternateSetting = 0x00, + + .TotalEndpoints = 2, + + .Class = HID_CSCP_HIDClass, + .SubClass = HID_CSCP_NonBootSubclass, + .Protocol = HID_CSCP_NonBootProtocol, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .Raw_HID = + { + .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, + + .HIDSpec = VERSION_BCD(1,1,1), + .CountryCode = 0x00, + .TotalReportDescriptors = 1, + .HIDReportType = HID_DTYPE_Report, + .HIDReportLength = sizeof(RawReport) + }, + + .Raw_INEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_IN | RAW_IN_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = RAW_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + .Raw_OUTEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DIR_OUT | RAW_OUT_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = RAW_EPSIZE, + .PollingIntervalMS = 0x01 + }, + #endif + /* * Console */ @@ -754,7 +831,6 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .PollingIntervalMS = 0x05 }, #endif - }; @@ -846,6 +922,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Size = sizeof(USB_HID_Descriptor_HID_t); break; #endif +#ifdef RAW_ENABLE + case RAW_INTERFACE: + Address = &ConfigurationDescriptor.Raw_HID; + Size = sizeof(USB_HID_Descriptor_HID_t); + break; +#endif #ifdef CONSOLE_ENABLE case CONSOLE_INTERFACE: Address = &ConfigurationDescriptor.Console_HID; @@ -878,6 +960,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, Size = sizeof(ExtrakeyReport); break; #endif +#ifdef RAW_ENABLE + case RAW_INTERFACE: + Address = &RawReport; + Size = sizeof(RawReport); + break; +#endif #ifdef CONSOLE_ENABLE case CONSOLE_INTERFACE: Address = &ConsoleReport; diff --git a/tmk_core/protocol/lufa/descriptor.h b/tmk_core/protocol/lufa/descriptor.h index c6c94e36..24ce420e 100644 --- a/tmk_core/protocol/lufa/descriptor.h +++ b/tmk_core/protocol/lufa/descriptor.h @@ -71,6 +71,14 @@ typedef struct USB_Descriptor_Endpoint_t Extrakey_INEndpoint; #endif +#ifdef RAW_ENABLE + // Raw HID Interface + USB_Descriptor_Interface_t Raw_Interface; + USB_HID_Descriptor_HID_t Raw_HID; + USB_Descriptor_Endpoint_t Raw_INEndpoint; + USB_Descriptor_Endpoint_t Raw_OUTEndpoint; +#endif + #ifdef CONSOLE_ENABLE // Console HID Interface USB_Descriptor_Interface_t Console_Interface; @@ -137,10 +145,16 @@ typedef struct # define EXTRAKEY_INTERFACE MOUSE_INTERFACE #endif +#ifdef RAW_ENABLE +# define RAW_INTERFACE (EXTRAKEY_INTERFACE + 1) +#else +# define RAW_INTERFACE EXTRAKEY_INTERFACE +#endif + #ifdef CONSOLE_ENABLE -# define CONSOLE_INTERFACE (EXTRAKEY_INTERFACE + 1) +# define CONSOLE_INTERFACE (RAW_INTERFACE + 1) #else -# define CONSOLE_INTERFACE EXTRAKEY_INTERFACE +# define CONSOLE_INTERFACE RAW_INTERFACE #endif #ifdef NKRO_ENABLE @@ -182,12 +196,19 @@ typedef struct # define EXTRAKEY_IN_EPNUM MOUSE_IN_EPNUM #endif +#ifdef RAW_ENABLE +# define RAW_IN_EPNUM (EXTRAKEY_IN_EPNUM + 1) +# define RAW_OUT_EPNUM (EXTRAKEY_IN_EPNUM + 2) +#else +# define RAW_OUT_EPNUM EXTRAKEY_IN_EPNUM +#endif + #ifdef CONSOLE_ENABLE -# define CONSOLE_IN_EPNUM (EXTRAKEY_IN_EPNUM + 1) -# define CONSOLE_OUT_EPNUM (EXTRAKEY_IN_EPNUM + 1) -//# define CONSOLE_OUT_EPNUM (EXTRAKEY_IN_EPNUM + 2) +# define CONSOLE_IN_EPNUM (RAW_OUT_EPNUM + 1) +//# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 2) +# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 1) #else -# define CONSOLE_OUT_EPNUM EXTRAKEY_IN_EPNUM +# define CONSOLE_OUT_EPNUM RAW_OUT_EPNUM #endif #ifdef NKRO_ENABLE @@ -217,7 +238,6 @@ typedef struct # define CDC_OUT_EPNUM MIDI_STREAM_OUT_EPNUM #endif - #if defined(__AVR_ATmega32U2__) && CDC_OUT_EPNUM > 4 # error "Endpoints are not available enough to support all functions. Remove some in Makefile.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL)" #endif @@ -225,6 +245,7 @@ typedef struct #define KEYBOARD_EPSIZE 8 #define MOUSE_EPSIZE 8 #define EXTRAKEY_EPSIZE 8 +#define RAW_EPSIZE 32 #define CONSOLE_EPSIZE 32 #define NKRO_EPSIZE 32 #define MIDI_STREAM_EPSIZE 64 diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 01c0e45b..60cba8d2 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -51,6 +51,9 @@ #include "descriptor.h" #include "lufa.h" +#include "quantum.h" +#include +#include "outputselect.h" #ifdef NKRO_ENABLE #include "keycode_config.h" @@ -64,13 +67,29 @@ #endif #ifdef BLUETOOTH_ENABLE + #ifdef MODULE_ADAFRUIT_BLE + #include "adafruit_ble.h" + #else #include "bluetooth.h" + #endif #endif #ifdef VIRTSER_ENABLE #include "virtser.h" #endif +#if (defined(RGB_MIDI) | defined(RGBLIGHT_ANIMATIONS)) & defined(RGBLIGHT_ENABLE) + #include "rgblight.h" +#endif + +#ifdef MIDI_ENABLE + #include "sysex_tools.h" +#endif + +#ifdef RAW_ENABLE + #include "raw_hid.h" +#endif + uint8_t keyboard_idle = 0; /* 0: Boot Protocol, 1: Report Protocol(default) */ uint8_t keyboard_protocol = 1; @@ -79,9 +98,9 @@ static uint8_t keyboard_led_stats = 0; static report_keyboard_t keyboard_report_sent; #ifdef MIDI_ENABLE -void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2); -void usb_get_midi(MidiDevice * device); -void midi_usb_init(MidiDevice * device); +static void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2); +static void usb_get_midi(MidiDevice * device); +static void midi_usb_init(MidiDevice * device); #endif /* Host driver */ @@ -166,6 +185,80 @@ USB_ClassInfo_CDC_Device_t cdc_device = }; #endif +#ifdef RAW_ENABLE + +void raw_hid_send( uint8_t *data, uint8_t length ) +{ + // TODO: implement variable size packet + if ( length != RAW_EPSIZE ) + { + return; + } + + if (USB_DeviceState != DEVICE_STATE_Configured) + { + return; + } + + // TODO: decide if we allow calls to raw_hid_send() in the middle + // of other endpoint usage. + uint8_t ep = Endpoint_GetCurrentEndpoint(); + + Endpoint_SelectEndpoint(RAW_IN_EPNUM); + + // Check to see if the host is ready to accept another packet + if (Endpoint_IsINReady()) + { + // Write data + Endpoint_Write_Stream_LE(data, RAW_EPSIZE, NULL); + // Finalize the stream transfer to send the last packet + Endpoint_ClearIN(); + } + + Endpoint_SelectEndpoint(ep); +} + +__attribute__ ((weak)) +void raw_hid_receive( uint8_t *data, uint8_t length ) +{ + // Users should #include "raw_hid.h" in their own code + // and implement this function there. Leave this as weak linkage + // so users can opt to not handle data coming in. +} + +static void raw_hid_task(void) +{ + // Create a temporary buffer to hold the read in data from the host + uint8_t data[RAW_EPSIZE]; + bool data_read = false; + + // Device must be connected and configured for the task to run + if (USB_DeviceState != DEVICE_STATE_Configured) + return; + + Endpoint_SelectEndpoint(RAW_OUT_EPNUM); + + // Check to see if a packet has been sent from the host + if (Endpoint_IsOUTReceived()) + { + // Check to see if the packet contains data + if (Endpoint_IsReadWriteAllowed()) + { + /* Read data */ + Endpoint_Read_Stream_LE(data, sizeof(data), NULL); + data_read = true; + } + + // Finalize the stream transfer to receive the last packet + Endpoint_ClearOUT(); + + if ( data_read ) + { + raw_hid_receive( data, sizeof(data) ); + } + } +} +#endif /******************************************************************************* * Console @@ -285,10 +378,14 @@ void EVENT_USB_Device_WakeUp() #endif } + + #ifdef CONSOLE_ENABLE static bool console_flush = false; #define CONSOLE_FLUSH_SET(b) do { \ - uint8_t sreg = SREG; cli(); console_flush = b; SREG = sreg; \ + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {\ + console_flush = b; \ + } \ } while (0) // called every 1ms @@ -302,6 +399,7 @@ void EVENT_USB_Device_StartOfFrame(void) Console_Task(); console_flush = false; } + #endif /** Event handler for the USB_ConfigurationChanged event. @@ -330,6 +428,14 @@ void EVENT_USB_Device_ConfigurationChanged(void) EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE); #endif +#ifdef RAW_ENABLE + /* Setup Raw HID Report Endpoints */ + ConfigSuccess &= ENDPOINT_CONFIG(RAW_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, + RAW_EPSIZE, ENDPOINT_BANK_SINGLE); + ConfigSuccess &= ENDPOINT_CONFIG(RAW_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT, + RAW_EPSIZE, ENDPOINT_BANK_SINGLE); +#endif + #ifdef CONSOLE_ENABLE /* Setup Console HID Report Endpoints */ ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, @@ -485,7 +591,6 @@ void EVENT_USB_Device_ControlRequest(void) /******************************************************************************* * Host driver -p ******************************************************************************/ static uint8_t keyboard_leds(void) { @@ -494,18 +599,25 @@ static uint8_t keyboard_leds(void) static void send_keyboard(report_keyboard_t *report) { + uint8_t timeout = 255; + uint8_t where = where_to_send(); #ifdef BLUETOOTH_ENABLE - bluefruit_serial_send(0xFD); - for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { + if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { + #ifdef MODULE_ADAFRUIT_BLE + adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys)); + #else + bluefruit_serial_send(0xFD); + for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { bluefruit_serial_send(report->raw[i]); - } + } + #endif + } #endif - uint8_t timeout = 255; - - if (USB_DeviceState != DEVICE_STATE_Configured) - return; + if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) { + return; + } /* Select the Keyboard Report Endpoint */ #ifdef NKRO_ENABLE @@ -543,23 +655,31 @@ static void send_keyboard(report_keyboard_t *report) static void send_mouse(report_mouse_t *report) { #ifdef MOUSE_ENABLE + uint8_t timeout = 255; + uint8_t where = where_to_send(); #ifdef BLUETOOTH_ENABLE - bluefruit_serial_send(0xFD); - bluefruit_serial_send(0x00); - bluefruit_serial_send(0x03); - bluefruit_serial_send(report->buttons); - bluefruit_serial_send(report->x); - bluefruit_serial_send(report->y); - bluefruit_serial_send(report->v); // should try sending the wheel v here - bluefruit_serial_send(report->h); // should try sending the wheel h here - bluefruit_serial_send(0x00); + if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { + #ifdef MODULE_ADAFRUIT_BLE + // FIXME: mouse buttons + adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h); + #else + bluefruit_serial_send(0xFD); + bluefruit_serial_send(0x00); + bluefruit_serial_send(0x03); + bluefruit_serial_send(report->buttons); + bluefruit_serial_send(report->x); + bluefruit_serial_send(report->y); + bluefruit_serial_send(report->v); // should try sending the wheel v here + bluefruit_serial_send(report->h); // should try sending the wheel h here + bluefruit_serial_send(0x00); + #endif + } #endif - uint8_t timeout = 255; - - if (USB_DeviceState != DEVICE_STATE_Configured) - return; + if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) { + return; + } /* Select the Mouse Report Endpoint */ Endpoint_SelectEndpoint(MOUSE_IN_EPNUM); @@ -585,7 +705,7 @@ static void send_system(uint16_t data) report_extra_t r = { .report_id = REPORT_ID_SYSTEM, - .usage = data + .usage = data - SYSTEM_POWER_DOWN + 1 }; Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); @@ -599,27 +719,34 @@ static void send_system(uint16_t data) static void send_consumer(uint16_t data) { + uint8_t timeout = 255; + uint8_t where = where_to_send(); #ifdef BLUETOOTH_ENABLE - static uint16_t last_data = 0; - if (data == last_data) return; - last_data = data; - uint16_t bitmap = CONSUMER2BLUEFRUIT(data); - bluefruit_serial_send(0xFD); - bluefruit_serial_send(0x00); - bluefruit_serial_send(0x02); - bluefruit_serial_send((bitmap>>8)&0xFF); - bluefruit_serial_send(bitmap&0xFF); - bluefruit_serial_send(0x00); - bluefruit_serial_send(0x00); - bluefruit_serial_send(0x00); - bluefruit_serial_send(0x00); + if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { + #ifdef MODULE_ADAFRUIT_BLE + adafruit_ble_send_consumer_key(data, 0); + #else + static uint16_t last_data = 0; + if (data == last_data) return; + last_data = data; + uint16_t bitmap = CONSUMER2BLUEFRUIT(data); + bluefruit_serial_send(0xFD); + bluefruit_serial_send(0x00); + bluefruit_serial_send(0x02); + bluefruit_serial_send((bitmap>>8)&0xFF); + bluefruit_serial_send(bitmap&0xFF); + bluefruit_serial_send(0x00); + bluefruit_serial_send(0x00); + bluefruit_serial_send(0x00); + bluefruit_serial_send(0x00); + #endif + } #endif - uint8_t timeout = 255; - - if (USB_DeviceState != DEVICE_STATE_Configured) - return; + if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) { + return; + } report_extra_t r = { .report_id = REPORT_ID_CONSUMER, @@ -709,7 +836,7 @@ int8_t sendchar(uint8_t c) ******************************************************************************/ #ifdef MIDI_ENABLE -void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2) { +static void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2) { MIDI_EventPacket_t event; event.Data1 = byte0; event.Data2 = byte1; @@ -769,7 +896,7 @@ void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byt USB_USBTask(); } -void usb_get_midi(MidiDevice * device) { +static void usb_get_midi(MidiDevice * device) { MIDI_EventPacket_t event; while (MIDI_Device_ReceiveEventPacket(&USB_MIDI_Interface, &event)) { @@ -799,12 +926,12 @@ void usb_get_midi(MidiDevice * device) { USB_USBTask(); } -void midi_usb_init(MidiDevice * device){ +static void midi_usb_init(MidiDevice * device){ midi_device_init(device); midi_device_set_send_func(device, usb_send_func); midi_device_set_pre_input_process_func(device, usb_get_midi); - SetupHardware(); + // SetupHardware(); sei(); } @@ -969,16 +1096,23 @@ void cc_callback(MidiDevice * device, uint8_t chan, uint8_t num, uint8_t val); void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data); + +void setup_midi(void) +{ +#ifdef MIDI_ADVANCED + midi_init(); +#endif + midi_device_init(&midi_device); + midi_device_set_send_func(&midi_device, usb_send_func); + midi_device_set_pre_input_process_func(&midi_device, usb_get_midi); +} #endif int main(void) __attribute__ ((weak)); int main(void) { - #ifdef MIDI_ENABLE - midi_device_init(&midi_device); - midi_device_set_send_func(&midi_device, usb_send_func); - midi_device_set_pre_input_process_func(&midi_device, usb_get_midi); + setup_midi(); #endif setup_mcu(); @@ -998,7 +1132,7 @@ int main(void) // midi_send_noteoff(&midi_device, 0, 64, 127); #endif -#ifdef BLUETOOTH_ENABLE +#ifdef MODULE_ADAFRUIT_EZKEY serial_init(); #endif @@ -1029,7 +1163,7 @@ int main(void) print("Keyboard start.\n"); while (1) { - #ifndef BLUETOOTH_ENABLE + #if !defined(BLUETOOTH_ENABLE) while (USB_DeviceState == DEVICE_STATE_Suspended) { print("[s]"); suspend_power_down(); @@ -1039,20 +1173,36 @@ int main(void) } #endif + keyboard_task(); + #ifdef MIDI_ENABLE midi_device_process(&midi_device); - // MIDI_Task(); +#ifdef MIDI_ADVANCED + midi_task(); +#endif +#endif + +#if defined(RGBLIGHT_ANIMATIONS) & defined(RGBLIGHT_ENABLE) + rgblight_task(); +#endif + +#ifdef MODULE_ADAFRUIT_BLE + adafruit_ble_task(); #endif - keyboard_task(); #ifdef VIRTSER_ENABLE virtser_task(); CDC_Device_USBTask(&cdc_device); #endif +#ifdef RAW_ENABLE + raw_hid_task(); +#endif + #if !defined(INTERRUPT_CONTROL_ENDPOINT) USB_USBTask(); #endif + } } @@ -1077,15 +1227,50 @@ void fallthrough_callback(MidiDevice * device, #endif } + void cc_callback(MidiDevice * device, uint8_t chan, uint8_t num, uint8_t val) { //sending it back on the next channel - midi_send_cc(device, (chan + 1) % 16, num, val); + // midi_send_cc(device, (chan + 1) % 16, num, val); } -void sysex_callback(MidiDevice * device, - uint16_t start, uint8_t length, uint8_t * data) { - for (int i = 0; i < length; i++) - midi_send_cc(device, 15, 0x7F & data[i], 0x7F & (start + i)); +#ifdef API_SYSEX_ENABLE +uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0}; +#endif + +void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data) { + #ifdef API_SYSEX_ENABLE + // SEND_STRING("\n"); + // send_word(start); + // SEND_STRING(": "); + // Don't store the header + int16_t pos = start - 4; + for (uint8_t place = 0; place < length; place++) { + // send_byte(*data); + if (pos >= 0) { + if (*data == 0xF7) { + // SEND_STRING("\nRD: "); + // for (uint8_t i = 0; i < start + place + 1; i++){ + // send_byte(midi_buffer[i]); + // SEND_STRING(" "); + // } + const unsigned decoded_length = sysex_decoded_length(pos); + uint8_t decoded[API_SYSEX_MAX_SIZE]; + sysex_decode(decoded, midi_buffer, pos); + process_api(decoded_length, decoded); + return; + } + else if (pos >= MIDI_SYSEX_BUFFER) { + return; + } + midi_buffer[pos] = *data; + } + // SEND_STRING(" "); + data++; + pos++; + } + #endif } + + #endif diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h index aad08d64..a5157378 100644 --- a/tmk_core/protocol/lufa/lufa.h +++ b/tmk_core/protocol/lufa/lufa.h @@ -49,7 +49,7 @@ #include #include "host.h" #ifdef MIDI_ENABLE - #include "midi.h" + #include "process_midi.h" #endif #ifdef __cplusplus extern "C" { @@ -68,8 +68,19 @@ typedef struct { } __attribute__ ((packed)) report_extra_t; #ifdef MIDI_ENABLE -void MIDI_Task(void); -MidiDevice midi_device; + void MIDI_Task(void); + MidiDevice midi_device; +#endif + +#ifdef API_ENABLE + #include "api.h" +#endif + +#ifdef API_SYSEX_ENABLE + #include "api_sysex.h" + // Allocate space for encoding overhead. + //The header and terminator are not stored to save a few bytes of precious ram + #define MIDI_SYSEX_BUFFER (API_SYSEX_MAX_SIZE + API_SYSEX_MAX_SIZE / 7 + (API_SYSEX_MAX_SIZE % 7 ? 1 : 0)) #endif // #if LUFA_VERSION_INTEGER < 0x120730 diff --git a/tmk_core/protocol/lufa/outputselect.c b/tmk_core/protocol/lufa/outputselect.c new file mode 100644 index 00000000..0df5d3b7 --- /dev/null +++ b/tmk_core/protocol/lufa/outputselect.c @@ -0,0 +1,56 @@ +/* +Copyright 2017 Priyadi Iman Nurcahyo +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "lufa.h" +#include "outputselect.h" +#ifdef MODULE_ADAFRUIT_BLE + #include "adafruit_ble.h" +#endif + +uint8_t desired_output = OUTPUT_DEFAULT; + +void set_output(uint8_t output) { + set_output_user(output); + desired_output = output; +} + +__attribute__((weak)) +void set_output_user(uint8_t output) { +} + +uint8_t auto_detect_output(void) { + if (USB_DeviceState == DEVICE_STATE_Configured) { + return OUTPUT_USB; + } + +#ifdef MODULE_ADAFRUIT_BLE + if (adafruit_ble_is_connected()) { + return OUTPUT_BLUETOOTH; + } +#endif + +#ifdef BLUETOOTH_ENABLE + return OUTPUT_BLUETOOTH; // should check if BT is connected here +#endif + + return OUTPUT_NONE; +} + +uint8_t where_to_send(void) { + if (desired_output == OUTPUT_AUTO) { + return auto_detect_output(); + } + return desired_output; +} + diff --git a/tmk_core/protocol/lufa/outputselect.h b/tmk_core/protocol/lufa/outputselect.h new file mode 100644 index 00000000..28cc3298 --- /dev/null +++ b/tmk_core/protocol/lufa/outputselect.h @@ -0,0 +1,40 @@ +/* +Copyright 2017 Priyadi Iman Nurcahyo +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +enum outputs { + OUTPUT_AUTO, + + OUTPUT_NONE, + OUTPUT_USB, + OUTPUT_BLUETOOTH, + + // backward compatibility + OUTPUT_USB_AND_BT +}; + +/** + * backward compatibility for BLUETOOTH_ENABLE, send to BT and USB by default + */ +#ifndef OUTPUT_DEFAULT + #ifdef BLUETOOTH_ENABLE + #define OUTPUT_DEFAULT OUTPUT_USB_AND_BT + #else + #define OUTPUT_DEFAULT OUTPUT_AUTO + #endif +#endif + +void set_output(uint8_t output); +void set_output_user(uint8_t output); +uint8_t auto_detect_output(void); +uint8_t where_to_send(void); \ No newline at end of file diff --git a/tmk_core/protocol/lufa/ringbuffer.hpp b/tmk_core/protocol/lufa/ringbuffer.hpp new file mode 100644 index 00000000..70a3c488 --- /dev/null +++ b/tmk_core/protocol/lufa/ringbuffer.hpp @@ -0,0 +1,66 @@ +#pragma once +// A simple ringbuffer holding Size elements of type T +template +class RingBuffer { + protected: + T buf_[Size]; + uint8_t head_{0}, tail_{0}; + public: + inline uint8_t nextPosition(uint8_t position) { + return (position + 1) % Size; + } + + inline uint8_t prevPosition(uint8_t position) { + if (position == 0) { + return Size - 1; + } + return position - 1; + } + + inline bool enqueue(const T &item) { + static_assert(Size > 1, "RingBuffer size must be > 1"); + uint8_t next = nextPosition(head_); + if (next == tail_) { + // Full + return false; + } + + buf_[head_] = item; + head_ = next; + return true; + } + + inline bool get(T &dest, bool commit = true) { + auto tail = tail_; + if (tail == head_) { + // No more data + return false; + } + + dest = buf_[tail]; + tail = nextPosition(tail); + + if (commit) { + tail_ = tail; + } + return true; + } + + inline bool empty() const { return head_ == tail_; } + + inline uint8_t size() const { + int diff = head_ - tail_; + if (diff >= 0) { + return diff; + } + return Size + diff; + } + + inline T& front() { + return buf_[tail_]; + } + + inline bool peek(T &item) { + return get(item, false); + } +}; diff --git a/tmk_core/protocol/midi.mk b/tmk_core/protocol/midi.mk index c85ae42f..4855b23d 100644 --- a/tmk_core/protocol/midi.mk +++ b/tmk_core/protocol/midi.mk @@ -4,6 +4,7 @@ SRC += midi.c \ midi_device.c \ bytequeue/bytequeue.c \ bytequeue/interrupt_setting.c \ + sysex_tools.c \ $(LUFA_SRC_USBCLASS) VPATH += $(TMK_PATH)/$(MIDI_DIR) \ No newline at end of file diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c index c3e8b3c1..d9ccbecb 100644 --- a/tmk_core/protocol/ps2_mouse.c +++ b/tmk_core/protocol/ps2_mouse.c @@ -18,60 +18,59 @@ along with this program. If not, see . #include #include #include -#include "ps2.h" #include "ps2_mouse.h" -#include "report.h" #include "host.h" #include "timer.h" #include "print.h" +#include "report.h" #include "debug.h" +#include "ps2.h" +/* ============================= MACROS ============================ */ static report_mouse_t mouse_report = {}; +static inline void ps2_mouse_print_report(report_mouse_t *mouse_report); +static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report); +static inline void ps2_mouse_clear_report(report_mouse_t *mouse_report); +static inline void ps2_mouse_enable_scrolling(void); +static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report); -static void print_usb_data(void); - +/* ============================= IMPLEMENTATION ============================ */ /* supports only 3 button mouse at this time */ -uint8_t ps2_mouse_init(void) { - uint8_t rcv; - +void ps2_mouse_init(void) { ps2_host_init(); - _delay_ms(1000); // wait for powering up + _delay_ms(PS2_MOUSE_INIT_DELAY); // wait for powering up - // send Reset - rcv = ps2_host_send(0xFF); - print("ps2_mouse_init: send Reset: "); - phex(rcv); phex(ps2_error); print("\n"); + PS2_MOUSE_SEND(PS2_MOUSE_RESET, "ps2_mouse_init: sending reset"); - // read completion code of BAT - rcv = ps2_host_recv_response(); - print("ps2_mouse_init: read BAT: "); - phex(rcv); phex(ps2_error); print("\n"); + PS2_MOUSE_RECEIVE("ps2_mouse_init: read BAT"); + PS2_MOUSE_RECEIVE("ps2_mouse_init: read DevID"); - // read Device ID - rcv = ps2_host_recv_response(); - print("ps2_mouse_init: read DevID: "); - phex(rcv); phex(ps2_error); print("\n"); +#ifdef PS2_MOUSE_USE_REMOTE_MODE + ps2_mouse_set_remote_mode(); +#else + ps2_mouse_enable_data_reporting(); +#endif + +#ifdef PS2_MOUSE_ENABLE_SCROLLING + ps2_mouse_enable_scrolling(); +#endif - // send Set Remote mode - rcv = ps2_host_send(0xF0); - print("ps2_mouse_init: send 0xF0: "); - phex(rcv); phex(ps2_error); print("\n"); +#ifdef PS2_MOUSE_USE_2_1_SCALING + ps2_mouse_set_scaling_2_1(); +#endif - return 0; + ps2_mouse_init_user(); } -#define X_IS_NEG (mouse_report.buttons & (1<buttons & (1<buttons & (1<buttons & (1<buttons & (1<x = X_IS_NEG ? + ((!X_IS_OVF && -127 <= mouse_report->x && mouse_report->x <= -1) ? mouse_report->x : -127) : + ((!X_IS_OVF && 0 <= mouse_report->x && mouse_report->x <= 127) ? mouse_report->x : 127); + mouse_report->y = Y_IS_NEG ? + ((!Y_IS_OVF && -127 <= mouse_report->y && mouse_report->y <= -1) ? mouse_report->y : -127) : + ((!Y_IS_OVF && 0 <= mouse_report->y && mouse_report->y <= 127) ? mouse_report->y : 127); + + // remove sign and overflow flags + mouse_report->buttons &= PS2_MOUSE_BTN_MASK; + + // invert coordinate of y to conform to USB HID mouse + mouse_report->y = -mouse_report->y; +} + +static inline void ps2_mouse_clear_report(report_mouse_t *mouse_report) { + mouse_report->x = 0; + mouse_report->y = 0; + mouse_report->v = 0; + mouse_report->h = 0; + mouse_report->buttons = 0; +} + +static inline void ps2_mouse_print_report(report_mouse_t *mouse_report) { + if (!debug_mouse) return; + print("ps2_mouse: ["); + phex(mouse_report->buttons); print("|"); + print_hex8((uint8_t)mouse_report->x); print(" "); + print_hex8((uint8_t)mouse_report->y); print(" "); + print_hex8((uint8_t)mouse_report->v); print(" "); + print_hex8((uint8_t)mouse_report->h); print("]\n"); +} + +static inline void ps2_mouse_enable_scrolling(void) { + PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Initiaing scroll wheel enable: Set sample rate"); + PS2_MOUSE_SEND(200, "200"); + PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Set sample rate"); + PS2_MOUSE_SEND(100, "100"); + PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Set sample rate"); + PS2_MOUSE_SEND(80, "80"); + PS2_MOUSE_SEND(PS2_MOUSE_GET_DEVICE_ID, "Finished enabling scroll wheel"); + _delay_ms(20); +} + +#define PRESS_SCROLL_BUTTONS mouse_report->buttons |= (PS2_MOUSE_SCROLL_BTN_MASK) +#define RELEASE_SCROLL_BUTTONS mouse_report->buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK) +static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report) { + static enum { + SCROLL_NONE, + SCROLL_BTN, + SCROLL_SENT, + } scroll_state = SCROLL_NONE; + static uint16_t scroll_button_time = 0; + + if (PS2_MOUSE_SCROLL_BTN_MASK == (mouse_report->buttons & (PS2_MOUSE_SCROLL_BTN_MASK))) { + // All scroll buttons are pressed + + if (scroll_state == SCROLL_NONE) { + scroll_button_time = timer_read(); + scroll_state = SCROLL_BTN; } - else if ((mouse_report.buttons & (PS2_MOUSE_SCROLL_BTN_MASK)) == 0) { + + // If the mouse has moved, update the report to scroll instead of move the mouse + if (mouse_report->x || mouse_report->y) { + scroll_state = SCROLL_SENT; + mouse_report->v = -mouse_report->y/(PS2_MOUSE_SCROLL_DIVISOR_V); + mouse_report->h = mouse_report->x/(PS2_MOUSE_SCROLL_DIVISOR_H); + mouse_report->x = 0; + mouse_report->y = 0; + } + } else if (0 == (PS2_MOUSE_SCROLL_BTN_MASK & mouse_report->buttons)) { + // None of the scroll buttons are pressed + #if PS2_MOUSE_SCROLL_BTN_SEND - if (scroll_state == SCROLL_BTN && - TIMER_DIFF_16(timer_read(), scroll_button_time) < PS2_MOUSE_SCROLL_BTN_SEND) { - // send Scroll Button(down and up at once) when not scrolled - mouse_report.buttons |= (PS2_MOUSE_SCROLL_BTN_MASK); - host_mouse_send(&mouse_report); - _delay_ms(100); - mouse_report.buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK); - } -#endif - scroll_state = SCROLL_NONE; + if (scroll_state == SCROLL_BTN + && timer_elapsed(scroll_button_time) < PS2_MOUSE_SCROLL_BTN_SEND) { + PRESS_SCROLL_BUTTONS; + host_mouse_send(mouse_report); + _delay_ms(100); + RELEASE_SCROLL_BUTTONS; } - // doesn't send Scroll Button - mouse_report.buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK); #endif - - - host_mouse_send(&mouse_report); - print_usb_data(); + scroll_state = SCROLL_NONE; } - // clear report - mouse_report.x = 0; - mouse_report.y = 0; - mouse_report.v = 0; - mouse_report.h = 0; - mouse_report.buttons = 0; -} -static void print_usb_data(void) -{ - if (!debug_mouse) return; - print("ps2_mouse usb: ["); - phex(mouse_report.buttons); print("|"); - print_hex8((uint8_t)mouse_report.x); print(" "); - print_hex8((uint8_t)mouse_report.y); print(" "); - print_hex8((uint8_t)mouse_report.v); print(" "); - print_hex8((uint8_t)mouse_report.h); print("]\n"); -} - - -/* PS/2 Mouse Synopsis - * http://www.computer-engineering.org/ps2mouse/ - * - * Command: - * 0xFF: Reset - * 0xF6: Set Defaults Sampling; rate=100, resolution=4cnt/mm, scaling=1:1, reporting=disabled - * 0xF5: Disable Data Reporting - * 0xF4: Enable Data Reporting - * 0xF3: Set Sample Rate - * 0xF2: Get Device ID - * 0xF0: Set Remote Mode - * 0xEB: Read Data - * 0xEA: Set Stream Mode - * 0xE9: Status Request - * 0xE8: Set Resolution - * 0xE7: Set Scaling 2:1 - * 0xE6: Set Scaling 1:1 - * - * Mode: - * Stream Mode: devices sends the data when it changs its state - * Remote Mode: host polls the data periodically - * - * This code uses Remote Mode and polls the data with Read Data(0xEB). - * - * Data format: - * byte|7 6 5 4 3 2 1 0 - * ----+-------------------------------------------------------------- - * 0|Yovflw Xovflw Ysign Xsign 1 Middle Right Left - * 1| X movement - * 2| Y movement - */ + RELEASE_SCROLL_BUTTONS; +} diff --git a/tmk_core/protocol/ps2_mouse.h b/tmk_core/protocol/ps2_mouse.h index 27d9790d..eeeffe4d 100644 --- a/tmk_core/protocol/ps2_mouse.h +++ b/tmk_core/protocol/ps2_mouse.h @@ -19,16 +19,62 @@ along with this program. If not, see . #define PS2_MOUSE_H #include +#include "debug.h" -#define PS2_MOUSE_READ_DATA 0xEB +#define PS2_MOUSE_SEND(command, message) \ +do { \ + __attribute__ ((unused)) uint8_t rcv = ps2_host_send(command); \ + if (debug_mouse) { \ + print((message)); \ + xprintf(" command: %X, result: %X, error: %X \n", command, rcv, ps2_error); \ + } \ +} while(0) + +#define PS2_MOUSE_SEND_SAFE(command, message) \ +do { \ + if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \ + ps2_mouse_disable_data_reporting(); \ + } \ + PS2_MOUSE_SEND(command, message); \ + if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \ + ps2_mouse_enable_data_reporting(); \ + } \ +} while(0) + +#define PS2_MOUSE_SET_SAFE(command, value, message) \ +do { \ + if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \ + ps2_mouse_disable_data_reporting(); \ + } \ + PS2_MOUSE_SEND(command, message); \ + PS2_MOUSE_SEND(value, "Sending value"); \ + if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \ + ps2_mouse_enable_data_reporting(); \ + } \ +} while(0) + +#define PS2_MOUSE_RECEIVE(message) \ +do { \ + __attribute__ ((unused)) uint8_t rcv = ps2_host_recv_response(); \ + if (debug_mouse) { \ + print((message)); \ + xprintf(" result: %X, error: %X \n", rcv, ps2_error); \ + } \ +} while(0) + +__attribute__ ((unused)) +static enum ps2_mouse_mode_e { + PS2_MOUSE_STREAM_MODE, + PS2_MOUSE_REMOTE_MODE, +} ps2_mouse_mode = PS2_MOUSE_STREAM_MODE; /* * Data format: * byte|7 6 5 4 3 2 1 0 - * ----+-------------------------------------------------------------- - * 0|Yovflw Xovflw Ysign Xsign 1 Middle Right Left - * 1| X movement(0-255) - * 2| Y movement(0-255) + * ----+---------------------------------------------------------------- + * 0|[Yovflw][Xovflw][Ysign ][Xsign ][ 1 ][Middle][Right ][Left ] + * 1|[ X movement(0-255) ] + * 2|[ Y movement(0-255) ] */ #define PS2_MOUSE_BTN_MASK 0x07 #define PS2_MOUSE_BTN_LEFT 0 @@ -39,10 +85,6 @@ along with this program. If not, see . #define PS2_MOUSE_X_OVFLW 6 #define PS2_MOUSE_Y_OVFLW 7 - -/* - * Scroll by mouse move with pressing button - */ /* mouse button to start scrolling; set 0 to disable scroll */ #ifndef PS2_MOUSE_SCROLL_BTN_MASK #define PS2_MOUSE_SCROLL_BTN_MASK (1<. #ifndef PS2_MOUSE_SCROLL_DIVISOR_H #define PS2_MOUSE_SCROLL_DIVISOR_H 2 #endif +/* multiply reported mouse values by these */ +#ifndef PS2_MOUSE_X_MULTIPLIER +#define PS2_MOUSE_X_MULTIPLIER 1 +#endif +#ifndef PS2_MOUSE_Y_MULTIPLIER +#define PS2_MOUSE_Y_MULTIPLIER 1 +#endif +#ifndef PS2_MOUSE_V_MULTIPLIER +#define PS2_MOUSE_V_MULTIPLIER 1 +#endif +/* For some mice this will need to be 0x0F */ +#ifndef PS2_MOUSE_SCROLL_MASK +#define PS2_MOUSE_SCROLL_MASK 0xFF +#endif +#ifndef PS2_MOUSE_INIT_DELAY +#define PS2_MOUSE_INIT_DELAY 1000 +#endif +enum ps2_mouse_command_e { + PS2_MOUSE_RESET = 0xFF, + PS2_MOUSE_RESEND = 0xFE, + PS2_MOSUE_SET_DEFAULTS = 0xF6, + PS2_MOUSE_DISABLE_DATA_REPORTING = 0xF5, + PS2_MOUSE_ENABLE_DATA_REPORTING = 0xF4, + PS2_MOUSE_SET_SAMPLE_RATE = 0xF3, + PS2_MOUSE_GET_DEVICE_ID = 0xF2, + PS2_MOUSE_SET_REMOTE_MODE = 0xF0, + PS2_MOUSE_SET_WRAP_MODE = 0xEC, + PS2_MOUSE_READ_DATA = 0xEB, + PS2_MOUSE_SET_STREAM_MODE = 0xEA, + PS2_MOUSE_STATUS_REQUEST = 0xE9, + PS2_MOUSE_SET_RESOLUTION = 0xE8, + PS2_MOUSE_SET_SCALING_2_1 = 0xE7, + PS2_MOUSE_SET_SCALING_1_1 = 0xE6, +}; + +typedef enum ps2_mouse_resolution_e { + PS2_MOUSE_1_COUNT_MM, + PS2_MOUSE_2_COUNT_MM, + PS2_MOUSE_4_COUNT_MM, + PS2_MOUSE_8_COUNT_MM, +} ps2_mouse_resolution_t; + +typedef enum ps2_mouse_sample_rate_e { + PS2_MOUSE_10_SAMPLES_SEC = 10, + PS2_MOUSE_20_SAMPLES_SEC = 20, + PS2_MOUSE_40_SAMPLES_SEC = 40, + PS2_MOUSE_60_SAMPLES_SEC = 60, + PS2_MOUSE_80_SAMPLES_SEC = 80, + PS2_MOUSE_100_SAMPLES_SEC = 100, + PS2_MOUSE_200_SAMPLES_SEC = 200, +} ps2_mouse_sample_rate_t; + +void ps2_mouse_init(void); + +void ps2_mouse_init_user(void); -uint8_t ps2_mouse_init(void); void ps2_mouse_task(void); +void ps2_mouse_disable_data_reporting(void); + +void ps2_mouse_enable_data_reporting(void); + +void ps2_mouse_set_remote_mode(void); + +void ps2_mouse_set_stream_mode(void); + +void ps2_mouse_set_scaling_2_1(void); + +void ps2_mouse_set_scaling_1_1(void); + +void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution); + +void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate); + #endif diff --git a/tmk_core/protocol/vusb.mk b/tmk_core/protocol/vusb.mk index 3cba3f71..897b833e 100644 --- a/tmk_core/protocol/vusb.mk +++ b/tmk_core/protocol/vusb.mk @@ -18,4 +18,5 @@ endif # Search Path -VPATH += $(TMK_DIR)/protocol/vusb:$(TMK_DIR)/protocol/vusb/usbdrv +VPATH += $(TMK_PATH)/$(VUSB_DIR) +VPATH += $(TMK_PATH)/$(VUSB_DIR)/usbdrv diff --git a/tmk_core/protocol/vusb/main.c b/tmk_core/protocol/vusb/main.c index 8e4a266e..f6a0c7e9 100644 --- a/tmk_core/protocol/vusb/main.c +++ b/tmk_core/protocol/vusb/main.c @@ -48,8 +48,12 @@ int main(void) uint16_t last_timer = timer_read(); #endif +#ifdef CLKPR + // avoid unintentional changes of clock frequency in devices that have a + // clock prescaler CLKPR = 0x80, CLKPR = 0; -#ifndef PS2_USE_USART +#endif +#ifndef NO_UART uart_init(UART_BAUD_RATE); #endif diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index eaa1c512..022ac6f6 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -15,6 +15,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +#include +#include #include #include "usbdrv.h" #include "usbconfig.h" @@ -24,6 +26,7 @@ along with this program. If not, see . #include "debug.h" #include "host_driver.h" #include "vusb.h" +#include "bootloader.h" static uint8_t vusb_keyboard_leds = 0; @@ -163,6 +166,7 @@ static struct { uint16_t len; enum { NONE, + BOOTLOADER, SET_LED } kind; } last_req; @@ -193,6 +197,11 @@ usbRequest_t *rq = (void *)data; debug("SET_LED: "); last_req.kind = SET_LED; last_req.len = rq->wLength.word; +#ifdef BOOTLOADER_SIZE + } else if(rq->wValue.word == 0x0301) { + last_req.kind = BOOTLOADER; + last_req.len = rq->wLength.word; +#endif } return USB_NO_MSG; // to get data in usbFunctionWrite } else { @@ -220,6 +229,11 @@ uchar usbFunctionWrite(uchar *data, uchar len) last_req.len = 0; return 1; break; + case BOOTLOADER: + usbDeviceDisconnect(); + bootloader_jump(); + return 1; + break; case NONE: default: return -1; @@ -266,7 +280,7 @@ const PROGMEM uchar keyboard_hid_report[] = { 0x95, 0x06, // Report Count (6), 0x75, 0x08, // Report Size (8), 0x15, 0x00, // Logical Minimum (0), - 0x25, 0xFF, 0x00 // Logical Maximum(255), + 0x26, 0xFF, 0x00, // Logical Maximum(255), 0x05, 0x07, // Usage Page (Key Codes), 0x19, 0x00, // Usage Minimum (0), 0x29, 0xFF, // Usage Maximum (255), @@ -336,7 +350,7 @@ const PROGMEM uchar mouse_hid_report[] = { 0xa1, 0x01, // COLLECTION (Application) 0x85, REPORT_ID_SYSTEM, // REPORT_ID (2) 0x15, 0x01, // LOGICAL_MINIMUM (0x1) - 0x25, 0xb7, 0x00 // LOGICAL_MAXIMUM (0xb7) + 0x26, 0xb7, 0x00, // LOGICAL_MAXIMUM (0xb7) 0x19, 0x01, // USAGE_MINIMUM (0x1) 0x29, 0xb7, // USAGE_MAXIMUM (0xb7) 0x75, 0x10, // REPORT_SIZE (16) @@ -481,11 +495,11 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) /* interface index */ switch (rq->wIndex.word) { case 0: - usbMsgPtr = keyboard_hid_report; + usbMsgPtr = (unsigned char *)keyboard_hid_report; len = sizeof(keyboard_hid_report); break; case 1: - usbMsgPtr = mouse_hid_report; + usbMsgPtr = (unsigned char *)mouse_hid_report; len = sizeof(mouse_hid_report); break; } diff --git a/tmk_core/ring_buffer.h b/tmk_core/ring_buffer.h index 7bdebbcf..005d1be6 100644 --- a/tmk_core/ring_buffer.h +++ b/tmk_core/ring_buffer.h @@ -4,13 +4,13 @@ * Ring buffer to store scan codes from keyboard *------------------------------------------------------------------*/ #define RBUF_SIZE 32 +#include static uint8_t rbuf[RBUF_SIZE]; static uint8_t rbuf_head = 0; static uint8_t rbuf_tail = 0; static inline void rbuf_enqueue(uint8_t data) { - uint8_t sreg = SREG; - cli(); + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { uint8_t next = (rbuf_head + 1) % RBUF_SIZE; if (next != rbuf_tail) { rbuf[rbuf_head] = data; @@ -18,36 +18,34 @@ static inline void rbuf_enqueue(uint8_t data) } else { print("rbuf: full\n"); } - SREG = sreg; + } } static inline uint8_t rbuf_dequeue(void) { uint8_t val = 0; + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { - uint8_t sreg = SREG; - cli(); if (rbuf_head != rbuf_tail) { val = rbuf[rbuf_tail]; rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE; } - SREG = sreg; + } return val; } static inline bool rbuf_has_data(void) { - uint8_t sreg = SREG; - cli(); - bool has_data = (rbuf_head != rbuf_tail); - SREG = sreg; - return has_data; + bool has_data; + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + has_data = (rbuf_head != rbuf_tail); + } + return has_data; } static inline void rbuf_clear(void) { - uint8_t sreg = SREG; - cli(); + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { rbuf_head = rbuf_tail = 0; - SREG = sreg; + } } #endif /* RING_BUFFER_H */ diff --git a/util/install_dependencies.sh b/util/install_dependencies.sh index 936a8659..1b73a8b3 100755 --- a/util/install_dependencies.sh +++ b/util/install_dependencies.sh @@ -92,4 +92,23 @@ elif [[ -n "$(type -P zypper)" ]]; then # TODO: The avr and eabi tools are not available as default packages, so we need # another way to install them +elif [[ -n "$(type -P pkg)" ]]; then + # FreeBSD + pkg update + pkg install -y \ + git \ + wget \ + gmake \ + gcc \ + zip \ + unzip \ + avr-binutils \ + avr-gcc \ + avr-libc \ + dfu-programmer \ + dfu-util \ + arm-none-eabi-gcc \ + arm-none-eabi-binutils \ + arm-none-eabi-newlib \ + diffutils fi diff --git a/util/travis_build.sh b/util/travis_build.sh new file mode 100644 index 00000000..6bafd194 --- /dev/null +++ b/util/travis_build.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +TRAVIS_COMMIT_MESSAGE="${TRAVIS_COMMIT_MESSAGE:-none}" +TRAVIS_COMMIT_RANGE="${TRAVIS_COMMIT_RANGE:-HEAD~1..HEAD}" + +if [[ "$TRAVIS_COMMIT_MESSAGE" != *"[skip build]"* ]] ; then + exit_code=0 + NEFM=$(git diff --name-only -n 1 ${TRAVIS_COMMIT_RANGE} | grep -Ev '^(keyboards/)' | wc -l) + if [[ $NEFM -gt 0 ]] ; then + echo "Making all keymaps for all keyboards" + make all-keyboards AUTOGEN="true" + : $((exit_code = $exit_code + $?)) + else + MKB=$(git diff --name-only -n 1 ${TRAVIS_COMMIT_RANGE} | grep -oP '(?<=keyboards\/)([a-zA-Z0-9_]+)(?=\/)' | sort -u) + for KB in $MKB ; do + echo "Making all keymaps for $KB" + make "$KB" AUTOGEN=true + : $((exit_code = $exit_code + $?)) + done + fi + exit $exit_code +fi diff --git a/util/travis_compiled_push.sh b/util/travis_compiled_push.sh index f432976d..58334cb1 100644 --- a/util/travis_compiled_push.sh +++ b/util/travis_compiled_push.sh @@ -7,21 +7,49 @@ rev=$(git rev-parse --short HEAD) git config --global user.name "Travis CI" git config --global user.email "jack.humb+travis.ci@gmail.com" -make ergodox-ez AUTOGEN=true - -find . -name ".build" | xargs rm -rf -cd .. -git clone https://$GH_TOKEN@github.com/jackhumbert/qmk.fm.git -cd qmk.fm -git submodule update --init --recursive -rm -rf keyboard -rm -rf keyboards -cp -r ../qmk_firmware/keyboards . -mkdir keyboards/ergodox_ez/ -cp ../qmk_firmware/util/ergodox_ez.html keyboards/ergodox_ez/index.html -cp ../qmk_firmware/readme.md qmk_readme.md -./generate.sh - -git add -A -git commit -m "generated from qmk_firmware/$TRAVIS_BRANCH@${rev}" -git push +if [[ "$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "false" ]] ; then + +increment_version () +{ + declare -a part=( ${1//\./ } ) + part[2]=$((part[2] + 1)) + new="${part[*]}" + echo -e "${new// /.}" +} + +NEFM=$(git diff --name-only -n 1 ${TRAVIS_COMMIT_RANGE} | grep -Ev '^(keyboards/)' | wc -l) +if [[ $NEFM -gt 0 ]] ; then + echo "Essential files modified." + git fetch --tags + lasttag=$(git tag | grep -Ev '\-' | xargs -I@ git log --format=format:"%ai @%n" -1 @ | sort -V | awk '{print $4}' | tail -1) + newtag=$(increment_version $lasttag) + git tag $newtag + git push --tags -q https://$GH_TOKEN@github.com/qmk/qmk_firmware +else + echo "No essential files modified." +fi + +if [[ "$TRAVIS_COMMIT_MESSAGE" != *"[skip build]"* ]] ; then + + make ergodox-ez AUTOGEN=true + + find . -name ".build" | xargs rm -rf + cd .. + git clone https://$GH_TOKEN@github.com/jackhumbert/qmk.fm.git + cd qmk.fm + git submodule update --init --recursive + #rm -rf keyboard + #rm -rf keyboards + yes | cp -rf ../qmk_firmware/keyboards . + #mkdir keyboards/ergodox_ez/ + cp ../qmk_firmware/util/ergodox_ez.html keyboards/ergodox_ez/index.html + cp ../qmk_firmware/readme.md qmk_readme.md + ./generate.sh + + git add -A + git commit -m "generated from qmk/qmk_firmware@${rev}" + git push + +fi + +fi \ No newline at end of file