]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Merge pull request #881 from NoahAndrews/patch-1
authorJack Humbert <jack.humb@gmail.com>
Fri, 2 Dec 2016 18:22:03 +0000 (13:22 -0500)
committerGitHub <noreply@github.com>
Fri, 2 Dec 2016 18:22:03 +0000 (13:22 -0500)
Recommend WSL on Windows 10 [Discussion]

173 files changed:
Dockerfile
Makefile
build_keyboard.mk
common.mk
keyboards/amj60/config.h
keyboards/atreus62/Makefile [new file with mode: 0644]
keyboards/atreus62/atreus62.c [new file with mode: 0644]
keyboards/atreus62/atreus62.h [new file with mode: 0644]
keyboards/atreus62/config.h [new file with mode: 0644]
keyboards/atreus62/keymaps/default/keymap.c [new file with mode: 0644]
keyboards/atreus62/pro_micro.h [new file with mode: 0644]
keyboards/atreus62/readme.md [new file with mode: 0644]
keyboards/atreus62/rules.mk [new file with mode: 0644]
keyboards/clueboard/rev1/config.h
keyboards/clueboard/rev2/config.h
keyboards/cluecard/config.h
keyboards/cluecard/keymaps/rgb_effects/config.h
keyboards/cluepad/config.h
keyboards/ergodox/ez/Makefile
keyboards/ergodox/ez/config.h
keyboards/ergodox/ez/ez.c
keyboards/ergodox/ez/matrix.c
keyboards/ergodox/ez/rules.mk
keyboards/ergodox/infinity/infinity.c
keyboards/ergodox/infinity/led.c
keyboards/ergodox/infinity/rules.mk
keyboards/ergodox/keymaps/bepo/Makefile [new file with mode: 0644]
keyboards/ergodox/keymaps/bepo/bepo.png
keyboards/ergodox/keymaps/bepo/keymap.c
keyboards/ergodox/keymaps/bepo/readme.md
keyboards/ergodox/keymaps/dvorak_emacs/keymap.c [new file with mode: 0755]
keyboards/ergodox/keymaps/dvorak_emacs/readme.md [new file with mode: 0644]
keyboards/ergodox/keymaps/dvorak_plover/README.md [new file with mode: 0644]
keyboards/ergodox/keymaps/dvorak_plover/keymap.c [new file with mode: 0644]
keyboards/ergodox/keymaps/erez_experimental/Makefile
keyboards/ergodox/keymaps/erez_experimental/config.h
keyboards/ergodox/keymaps/erez_experimental/keymap.c
keyboards/ergodox/keymaps/galson/Makefile [new file with mode: 0644]
keyboards/ergodox/keymaps/galson/keymap.c [new file with mode: 0644]
keyboards/ergodox/keymaps/galson/readme.md [new file with mode: 0644]
keyboards/ergodox/keymaps/jack/Makefile [new file with mode: 0644]
keyboards/ergodox/keymaps/jack/config.h [new file with mode: 0644]
keyboards/ergodox/keymaps/jack/keymap.c
keyboards/ergodox/keymaps/kristian/keymap.c [new file with mode: 0644]
keyboards/ergodox/keymaps/robot_test_layout/keymap.c [new file with mode: 0644]
keyboards/ergodox/keymaps/robot_test_layout/readme.md [new file with mode: 0644]
keyboards/ergodox/keymaps/sethbc/Makefile
keyboards/ergodox/keymaps/sethbc/keymap.c
keyboards/ergodox/keymaps/sethbc/readme.md
keyboards/ergodox/keymaps/videck/Makefile [new file with mode: 0644]
keyboards/ergodox/keymaps/videck/config.h [new file with mode: 0644]
keyboards/ergodox/keymaps/videck/keymap.c [new file with mode: 0644]
keyboards/ergodox/keymaps/videck/readme.md [new file with mode: 0644]
keyboards/ergodox/keymaps/videck/videck.json [new file with mode: 0644]
keyboards/ergodox/keymaps/videck/videck.png [new file with mode: 0644]
keyboards/ergodox/rules.mk
keyboards/gh60/gh60.h
keyboards/gh60/keymaps/default/keymap.c
keyboards/gh60/keymaps/robotmaxtron/config.h
keyboards/gh60/keymaps/robotmaxtron/keymap.c
keyboards/gh60/keymaps/sethbc/Makefile [new file with mode: 0644]
keyboards/gh60/keymaps/sethbc/keymap.c [new file with mode: 0644]
keyboards/handwired/minorca/keymaps/rgb/config.h
keyboards/handwired/promethium/Makefile [new file with mode: 0644]
keyboards/handwired/promethium/config.h [new file with mode: 0644]
keyboards/handwired/promethium/keymaps/priyadi/Makefile [new file with mode: 0644]
keyboards/handwired/promethium/keymaps/priyadi/config.h [new file with mode: 0644]
keyboards/handwired/promethium/keymaps/priyadi/flash.sh [new file with mode: 0755]
keyboards/handwired/promethium/keymaps/priyadi/keymap.c [new file with mode: 0644]
keyboards/handwired/promethium/keymaps/priyadi/readme.md [new file with mode: 0644]
keyboards/handwired/promethium/keymaps/readme.md [new file with mode: 0644]
keyboards/handwired/promethium/promethium.c [new file with mode: 0644]
keyboards/handwired/promethium/promethium.h [new file with mode: 0644]
keyboards/handwired/promethium/readme.md [new file with mode: 0644]
keyboards/handwired/promethium/rgbsps.c [new file with mode: 0644]
keyboards/handwired/promethium/rgbsps.h [new file with mode: 0644]
keyboards/handwired/promethium/rules.mk [new file with mode: 0644]
keyboards/hhkb/keymaps/sh_jp/Makefile [new file with mode: 0644]
keyboards/hhkb/keymaps/sh_jp/README.md [new file with mode: 0644]
keyboards/hhkb/keymaps/sh_jp/keymap.c [new file with mode: 0644]
keyboards/infinity60/chconf.h
keyboards/infinity60/matrix.c
keyboards/jd40/config.h
keyboards/kc60/keymaps/dbroqua/keymap.c
keyboards/kc60/keymaps/ws2812/config.h
keyboards/lets_split/config.h
keyboards/lets_split/keymaps/default/keymap.c
keyboards/lets_split/keymaps/i2c/config.h
keyboards/lets_split/keymaps/serial/config.h
keyboards/lets_split/lets_split.c
keyboards/lets_split/lets_split.h
keyboards/lets_split/rev1/Makefile [new file with mode: 0644]
keyboards/lets_split/rev1/config.h [new file with mode: 0644]
keyboards/lets_split/rev1/rev1.c [new file with mode: 0644]
keyboards/lets_split/rev1/rev1.h [new file with mode: 0644]
keyboards/lets_split/rev1/rules.mk [new file with mode: 0644]
keyboards/lets_split/rev2/Makefile [new file with mode: 0644]
keyboards/lets_split/rev2/config.h [new file with mode: 0644]
keyboards/lets_split/rev2/rev2.c [new file with mode: 0644]
keyboards/lets_split/rev2/rev2.h [new file with mode: 0644]
keyboards/lets_split/rev2/rules.mk [new file with mode: 0644]
keyboards/lets_split/rules.mk
keyboards/maxipad/Makefile [new file with mode: 0644]
keyboards/maxipad/config.h [new file with mode: 0644]
keyboards/maxipad/keymaps/default/Makefile [new file with mode: 0644]
keyboards/maxipad/keymaps/default/config.h [new file with mode: 0644]
keyboards/maxipad/keymaps/default/keymap.c [new file with mode: 0644]
keyboards/maxipad/keymaps/default/readme.md [new file with mode: 0644]
keyboards/maxipad/maxipad.c [new file with mode: 0644]
keyboards/maxipad/maxipad.h [new file with mode: 0644]
keyboards/maxipad/readme.md [new file with mode: 0644]
keyboards/maxipad/rules.mk [new file with mode: 0644]
keyboards/phantom/config.h
keyboards/planck/keymaps/cbbrowne/Makefile
keyboards/planck/keymaps/cbbrowne/config.h
keyboards/planck/keymaps/cbbrowne/keymap.c
keyboards/planck/keymaps/default/Makefile
keyboards/planck/keymaps/default/keymap.c
keyboards/planck/keymaps/experimental/config.h
keyboards/planck/keymaps/thermal_printer/Makefile [new file with mode: 0644]
keyboards/planck/keymaps/thermal_printer/config.h [new file with mode: 0644]
keyboards/planck/keymaps/thermal_printer/keymap.c [new file with mode: 0644]
keyboards/planck/keymaps/thermal_printer/readme.md [new file with mode: 0644]
keyboards/planck/keymaps/yang/config.h
keyboards/planck/rules.mk
keyboards/preonic/config.h
keyboards/preonic/keymaps/default/Makefile
keyboards/preonic/keymaps/kinesis/config.h
keyboards/preonic/rules.mk
keyboards/satan/config.h
keyboards/satan/keymaps/dbroqua_hhkb/keymap.c [new file with mode: 0644]
keyboards/satan/keymaps/dbroqua_hhkb/readme.md [new file with mode: 0644]
keyboards/satan/keymaps/sethbc/keymap.c
keyboards/tada68/config.h
keyboards/vision_division/config.h
keyboards/vision_division/keymaps/default/Makefile
keyboards/vision_division/keymaps/default/keymap.c
quantum/api.c [new file with mode: 0644]
quantum/api.h [new file with mode: 0644]
quantum/api/api_sysex.c [new file with mode: 0644]
quantum/api/api_sysex.h [new file with mode: 0644]
quantum/config_common.h
quantum/keymap.h
quantum/keymap_extras/keymap_jp.h [new file with mode: 0644]
quantum/keymap_extras/keymap_nordic.h
quantum/light_ws2812.c
quantum/light_ws2812.h
quantum/matrix.c
quantum/pincontrol.h [new file with mode: 0644]
quantum/process_keycode/process_printer.c [new file with mode: 0644]
quantum/process_keycode/process_printer.h [new file with mode: 0644]
quantum/process_keycode/process_printer_bb.c [new file with mode: 0644]
quantum/process_keycode/process_unicode.h
quantum/quantum.c
quantum/quantum.h
quantum/rgblight.c
quantum/rgblight.h
readme.md
tmk_core/common.mk
tmk_core/common/avr/suspend.c
tmk_core/common/avr/timer.c
tmk_core/common/backlight.c
tmk_core/common/command.c
tmk_core/common/host_driver.h
tmk_core/protocol/lufa.mk
tmk_core/protocol/lufa/adafruit_ble.cpp [new file with mode: 0644]
tmk_core/protocol/lufa/adafruit_ble.h [new file with mode: 0644]
tmk_core/protocol/lufa/lufa.c
tmk_core/protocol/lufa/lufa.h
tmk_core/protocol/lufa/ringbuffer.hpp [new file with mode: 0644]
tmk_core/protocol/midi.mk
tmk_core/protocol/ps2_mouse.c
tmk_core/ring_buffer.h

index 744ded85797c435cee7494d8bfa67e6691c2bf28..c42bbeb32af3ac315890906b9f1cf8e509f3e44d 100644 (file)
@@ -25,5 +25,4 @@ ENV subproject=ez
 ENV keymap=default
 
 VOLUME /qmk
-WORKDIR /qmk
-CMD make clean ; make keyboard=${keyboard} subproject=${subproject} keymap=${keymap}
+WORKDIR /qmk
\ No newline at end of file
index 66c0ff30f492e2e216b8fc624298a2774dc35b01..aa33c40f1ffcc5089bb7f42234b8a8c3b4dcafd6 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -38,7 +38,7 @@ ERROR_FILE := $(BUILD_DIR)/error_occured
 
 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
 # and the PATH_ELEMENTS are the rest that are still unprocessed
@@ -47,16 +47,16 @@ define NEXT_PATH_ELEMENT
     $$(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))
@@ -111,7 +111,7 @@ endif
 .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,7 +163,7 @@ 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
@@ -171,10 +171,10 @@ 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 
+# 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))
@@ -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),)
@@ -343,7 +343,7 @@ define PARSE_SUBPROJECT
     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),)
@@ -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 overriden by specifying silent=false
 # from the command line
 define SET_SILENT_MODE
     ifdef SUB_IS_SILENT
@@ -481,11 +481,12 @@ 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: %
-%: 
+ifndef SKIP_GIT
+%:
        # 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;
        # Check if the submodules are dirty, and display a warning if they are
@@ -505,8 +506,24 @@ $(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;
+else
+%:
+       # 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;
+       rm -f $(ERROR_FILE) > /dev/null 2>&1
+       $(eval $(call PARSE_RULE,$@))
+       $(eval $(call SET_SILENT_MODE))
+       # Run all the commands in the same shell, notice the + at the first line
+       # it has to be there to allow parallel execution of the submake
+       # This always tries to compile everything, even if error occurs in the middle
+       # 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))
        if [ -f $(ERROR_FILE) ]; then printf "$(MSG_ERRORS)" & exit 1; fi;
+endif
 
 # All should compile everything
 .PHONY: all
@@ -526,7 +543,11 @@ 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)
index 61aebf3935a249d46b2e624d781acf45462d99af..ce505de126743772a4b289f4f3359bbaf9a61125 100644 (file)
@@ -131,6 +131,14 @@ 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
+
 ifeq ($(strip $(MIDI_ENABLE)), yes)
     OPT_DEFS += -DMIDI_ENABLE
        SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
@@ -174,6 +182,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 +213,7 @@ endif
 VPATH += $(KEYBOARD_PATH)
 VPATH += $(COMMON_VPATH)
 
+include $(TMK_PATH)/protocol.mk
 
 include $(TMK_PATH)/common.mk
 SRC += $(TMK_COMMON_SRC)
index 18751cd5ac89915e87b3308d05f6ac4cbde90c30..c4b9394a24ff3a16204238e328ebbc3febed68ed 100644 (file)
--- 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
index d98e0e9f2f867c5572c5ef8261e3225b8fa59323..7c06f9a6c79ee63cb381d9084e425d7e18db5895 100644 (file)
@@ -67,7 +67,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 #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/atreus62/Makefile b/keyboards/atreus62/Makefile
new file mode 100644 (file)
index 0000000..4e2a6f0
--- /dev/null
@@ -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 (file)
index 0000000..ba5bce9
--- /dev/null
@@ -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 (file)
index 0000000..eacf5b4
--- /dev/null
@@ -0,0 +1,26 @@
+#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 } \
+}
+
+#endif
\ No newline at end of file
diff --git a/keyboards/atreus62/config.h b/keyboards/atreus62/config.h
new file mode 100644 (file)
index 0000000..90a4aa0
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 (file)
index 0000000..52802c7
--- /dev/null
@@ -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/pro_micro.h b/keyboards/atreus62/pro_micro.h
new file mode 100644 (file)
index 0000000..f9e7ed7
--- /dev/null
@@ -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 <avr/pgmspace.h>
+
+// 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 (file)
index 0000000..0245b4f
--- /dev/null
@@ -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 (file)
index 0000000..f5d0be2
--- /dev/null
@@ -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
index 8c949723247bf654dcab4e521ab989aa5f40fa5a..f40876ffbf7762482e72759ac0ffad41be927281 100644 (file)
@@ -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
index 15ca4ece86afaca045d26bb75b5354daec026251..8435fd02be748a5d74a9688f1570ce1b26b1ada1 100644 (file)
@@ -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
index 765347b131926b84652e8e8067571a1a7a787a07..6520eb5574a7b0976f6f320ca1519b91ac167f2b 100644 (file)
@@ -140,7 +140,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* 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
index e88847df4d30b5d31a4058dd0beeaaac547565e0..c6c9342c8188779d295e24d5b225e89df3608171 100644 (file)
@@ -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
index bae05fade38ae99b8ee11c7c2d1fb8b96b9ac5bb..bd64dfd27d9aaa3778e9621f5484622c751a7c18 100644 (file)
@@ -70,7 +70,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* 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
index 191c6bb664de85727cd5fb1c36ab6f14ab207d96..9b6121e2c2131533b21d13b41e7b745997c22849 100644 (file)
@@ -1,3 +1,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 MAKEFILE_INCLUDED
        include ../../../Makefile
-endif
\ No newline at end of file
+endif
index 084a044ee1a2ed121708308ad292f7b84802e56e..c2750a321f0ff8b89258266004a6c39a251c6e12 100644 (file)
@@ -21,6 +21,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include "../config.h"
 
+#include "config_common.h"
+
 /* USB Device descriptor parameter */
 #define VENDOR_ID       0xFEED
 #define PRODUCT_ID      0x1307
@@ -39,6 +41,17 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #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
+
 
 /* Set 0 if debouncing isn't needed */
 #define DEBOUNCE    5
index ddb8ff0cf714a77261e2ca97d795b46ce8a71c91..039e4c6bb17e3640b80fa807aaa50bc330b84383 100644 (file)
@@ -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;
 }
 
index a19bab90b2744195ae20d7204a4e8fd841175a23..43f5152591ad904e886c28ad58e50afde7464be1 100644 (file)
@@ -121,7 +121,7 @@ void matrix_init(void)
     matrix_scan_count = 0;
 #endif
 
-    matrix_init_kb();
+    matrix_init_quantum();
 
 }
 
index a9715beb8573d3c86b031036aeb728faec2a88cb..893cfa7a848ebf2841db57ec83ae377c39a09f64 100644 (file)
@@ -72,6 +72,8 @@ OPT_DEFS += -DBOOTLOADER_SIZE=512
 #
 
 SLEEP_LED_ENABLE = no
+API_SYSEX_ENABLE ?= yes
+RGBLIGHT_ENABLE ?= yes
 
 ifndef QUANTUM_DIR
        include ../../../Makefile
index c5793385fe789ace12dc8bee22d1886b5219c86f..02db67eaf263c8dfe4eb00a95a86d791de1c1da8 100644 (file)
@@ -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) {
index 77195bb358e3663cfa69aa822710a42e5211798b..8175c1c5c5abc752950d48174a474ad72cfca78a 100644 (file)
@@ -21,29 +21,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 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<<USB_LED_CAPS_LOCK)) {
-        GPIOC->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
 }
index ccb735a485beede2222294951d429ab0e754dc79..473a6dfec6d72935eac0e614b636c30f9ecaace7 100644 (file)
@@ -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/bepo/Makefile b/keyboards/ergodox/keymaps/bepo/Makefile
new file mode 100644 (file)
index 0000000..b673c5c
--- /dev/null
@@ -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
index 3df7aa609f6300a48c36425320323935aeb435e3..54992f5ae54c6c38b29221a78c45224af611573f 100644 (file)
Binary files a/keyboards/ergodox/keymaps/bepo/bepo.png and b/keyboards/ergodox/keymaps/bepo/bepo.png differ
index 2d88fc10ead6c9ac5089fc512724f54acdf30397..05250ee6a779b89b85e16c86211e3601866e6f73 100644 (file)
@@ -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) {
-};
index 4a18cd80ff89f69d6500b48f74a5c7ab656bbebc..2959ac82989c5b99925ebe5cec81283de21f11d0 100644 (file)
@@ -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 <olivier@gid0.org>
diff --git a/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c b/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c
new file mode 100755 (executable)
index 0000000..d33c6e5
--- /dev/null
@@ -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 (file)
index 0000000..a3fc34a
--- /dev/null
@@ -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
+
+<pre><code>
+
+,--------------------------------------------------.           ,--------------------------------------------------.
+|        |   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 |
+                                `--------------------'       `----------------------'
+
+</pre></code>
+
+### Keymap 1: Aux layer
+
+<pre><code>
+
+,--------------------------------------------------.           ,--------------------------------------------------.
+|  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|      |      |
+                                `--------------------'       `--------------------'
+
+</pre></code>
+
+
+
+## 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 (file)
index 0000000..c8287b0
--- /dev/null
@@ -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 (file)
index 0000000..d050560
--- /dev/null
@@ -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;
+    }
+
+};
index b673c5ce52ce1f60b2998b3e5152c8d67f5d5877..51a0c74c547b5f2e38a8d0141c4cae649a9f388b 100644 (file)
@@ -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
index e5d7fe1885e60c99495329efca9b869f4f84ae0b..4da18c65aab5b850f0b68178ab153bd783764522 100644 (file)
@@ -8,5 +8,6 @@
 
 #undef LEADER_TIMEOUT
 #define LEADER_TIMEOUT 300
 
 #endif
index 4804959d634ba78027905deaa76c5f4139b3bc3f..2963c40e31945f76ea3710345843ad8df1e41a7c 100644 (file)
@@ -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   |TOG   |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 (file)
index 0000000..f008f50
--- /dev/null
@@ -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 (file)
index 0000000..0d3e756
--- /dev/null
@@ -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 (file)
index 0000000..ebc9167
--- /dev/null
@@ -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/jack/Makefile b/keyboards/ergodox/keymaps/jack/Makefile
new file mode 100644 (file)
index 0000000..3ca69bb
--- /dev/null
@@ -0,0 +1,6 @@
+RGBLIGHT_ENABLE ?= yes
+MIDI_ENABLE ?= yes
+
+ifndef QUANTUM_DIR
+       include ../../../../Makefile
+endif
diff --git a/keyboards/ergodox/keymaps/jack/config.h b/keyboards/ergodox/keymaps/jack/config.h
new file mode 100644 (file)
index 0000000..5c11652
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "../../config.h"
+
+/* 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
+
+#endif
\ No newline at end of file
index dda253fa4538ff940198766b2bf5690d64cb7f8b..9cb80c59d12f0b8cb6cafe77814e92c644f0cb16 100644 (file)
@@ -19,14 +19,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                                               KC_HOME,
                                                KC_SPC,KC_SPC,KC_END,
         // right hand
-             KC_NO,     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_NO,
-             KC_NO,     KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSPC,
-                        KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,          KC_QUOT,
+             KC_NO,     M(1),   KC_7,   KC_8,   KC_9,   KC_0,             KC_NO,
+             KC_NO,     RGB_TOG,   RGB_MOD,   RGB_HUI,   RGB_HUD,   KC_P,             KC_BSPC,
+                        RGB_SAI,   RGB_SAD,   RGB_VAI,   RGB_VAD,   KC_SCLN,          KC_QUOT,
              KC_NO,     KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,          KC_ENT,
                                   MO(1), KC_LEFT,KC_DOWN,KC_UP,  KC_RGHT,  
-             KC_NO,        KC_NO,
-             KC_PGUP,
-             KC_PGDN, KC_SPC,KC_SPC
+             RGB_TOG,        RGB_HUI,
+             RGB_MOD,
+             M(2), KC_SPC,KC_SPC
     ),
 [SYMB] = KEYMAP(
        // left hand
@@ -84,6 +84,16 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
           unregister_code(KC_RSFT);
         }
         break;
+        case 1:
+        if (record->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/kristian/keymap.c b/keyboards/ergodox/keymaps/kristian/keymap.c
new file mode 100644 (file)
index 0000000..e7e4243
--- /dev/null
@@ -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/robot_test_layout/keymap.c b/keyboards/ergodox/keymaps/robot_test_layout/keymap.c
new file mode 100644 (file)
index 0000000..480be17
--- /dev/null
@@ -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(0xff0000);
+          register_code(KC_1); unregister_code(KC_1);
+        #endif
+      }
+      return false;
+      break;
+    case RGB_00FF00:
+      if (record->event.pressed) {
+        #ifdef RGBLIGHT_ENABLE
+          EZ_RGB(0x00ff00);
+          register_code(KC_2); unregister_code(KC_2);
+        #endif
+      }
+      return false;
+      break;
+    case RGB_0000FF:
+      if (record->event.pressed) {
+        #ifdef RGBLIGHT_ENABLE
+          EZ_RGB(0x0000ff);
+          register_code(KC_3); unregister_code(KC_3);
+        #endif
+      }
+      return false;
+      break;
+    case RGB_FFFFFF:
+      if (record->event.pressed) {
+        #ifdef RGBLIGHT_ENABLE
+          EZ_RGB(0xffffff);
+          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 (file)
index 0000000..45dc2aa
--- /dev/null
@@ -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. :)
index 8c4ff87845d1e55744799c2dd455a2d7f53236f8..457a3d01d4a4f6d3a66baaac45d37543aacf7888 100644 (file)
@@ -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
index 6846c4d5295ed1911e1bacf312e36415dc9162a2..8816ad63bb91a68e2d8ff8fc8cd49929d3bc63d1 100644 (file)
@@ -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,
index 510b2f99c84e3bc1ac11ded3aa0fa8fabb6cc3f3..57b5d0ec7c62a636fb3cab5c9575ee60235c10ae 100644 (file)
@@ -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/videck/Makefile b/keyboards/ergodox/keymaps/videck/Makefile
new file mode 100644 (file)
index 0000000..5c7d21f
--- /dev/null
@@ -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 (file)
index 0000000..d89aabe
--- /dev/null
@@ -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 (file)
index 0000000..7bd6274
--- /dev/null
@@ -0,0 +1,179 @@
+#include <stdbool.h>
+
+#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 (file)
index 0000000..759e81b
--- /dev/null
@@ -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 (file)
index 0000000..7068cf5
--- /dev/null
@@ -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<i class='fa fa-caret-up'></i>\n<i class='kb kb-Arrows-Up'></i>"
+  ],
+  [
+    {
+      "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<i class='fa fa-caret-down'></i>\n<i class='kb kb-Arrows-Down'></i>",
+    {
+      "x": 1,
+      "t": "#ffffff\n\n#5eb1e7\n#ac97d8\n\n\n\n\n\n#f8d615"
+    },
+    "L\n\n<i class='fa fa-caret-right'></i>\n<i class='kb kb-Arrows-Right'></i>\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<i class='fa fa-caret-left'></i>\n<i class='kb kb-Arrows-Left'></i>"
+  ],
+  [
+    {
+      "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&Ouml;\n\n)",
+    {
+      "t": "#ffffff\n\n\n\n\n\n\n#60605b",
+      "w": 1.5
+    },
+    "\"\n'\n\n\n\n\n\n&Auml;"
+  ],
+  [
+    {
+      "y": -0.625,
+      "x": 6.5,
+      "t": "#ffffff",
+      "h": 1.5
+    },
+    "<i class='kb kb-Unicode-BackSpace-DeleteLeft-Big'></i>",
+    {
+      "x": 4.5,
+      "h": 1.5
+    },
+    "<i class='kb kb-Unicode-DeleteRight-Big'></i>"
+  ],
+  [
+    {
+      "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
+    },
+    "&uArr;\n\n2-tap<br/>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
+    },
+    "&uArr;\n\n2-tap<br/>locks"
+  ],
+  [
+    {
+      "y": -0.375,
+      "x": 3.5,
+      "t": "#ffffff",
+      "a": 4
+    },
+    "\n<i class='kb kb-Multimedia-Volume-Up-2'></i>",
+    {
+      "x": 10.5,
+      "f": 3
+    },
+    "}\n]"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5
+    },
+    "\n<i class='kb kb-Multimedia-Volume-Down-1'></i>",
+    {
+      "x": 1
+    },
+    "\n<i class='kb kb-Multimedia-Mute-1'></i>",
+    {
+      "x": 8.5,
+      "t": "#ffffff\n\n\n\n\n\n\n#60605b",
+      "f": 3
+    },
+    "{\n[\n\n\n\n\n\n&Aring;",
+    {
+      "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\n<i class='fa fa-mouse-pointer'></i>M",
+    {
+      "t": "#ffffff",
+      "f": 7
+    },
+    "<i class='kb kb-logo-linux-tux'></i>"
+  ],
+  [
+    {
+      "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\n<i class='fa fa-mouse-pointer'></i>L",
+    {
+      "h": 2
+    },
+    "<i class='kb kb-Tab-1'></i>\n\n\n\n\n\n\n\n\n\n<i class='fa fa-mouse-pointer'></i>R",
+    {
+      "t": "#5eb1e7"
+    },
+    "<i class='fa fa-mouse-pointer'></i>"
+  ],
+  [
+    {
+      "x": 2,
+      "t": "#ac97d8"
+    },
+    "<i class='fa fa-arrows'></i>"
+  ],
+  [
+    {
+      "r": -30,
+      "rx": 13,
+      "y": -1,
+      "x": -3,
+      "t": "#ffffff"
+    },
+    "<i class='kb kb-Hamburger-Menu'></i>",
+    "esc"
+  ],
+  [
+    {
+      "x": -3
+    },
+    "ins",
+    {
+      "h": 2
+    },
+    "<i class='kb kb-Return-2'></i>",
+    {
+      "h": 2
+    },
+    "space"
+  ],
+  [
+    {
+      "x": -3
+    },
+    "scroll<br/>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 (file)
index 0000000..c99323f
Binary files /dev/null and b/keyboards/ergodox/keymaps/videck/videck.png differ
index add64ec76fd81c302770dbbf296b0a380f01c748..2e501e81b2e06ddd8c40ef510152bb33c91b8a80 100644 (file)
@@ -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
index 82624b614844ca4a139696f2960ad4c01d4ef886..66bc2790d287cfe39a5b3debb3945953beab840f 100644 (file)
@@ -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
index 3622be41b88211a55aa6452d3e36e7e5360ab238..92f5459840c7b9595199a3c815d655602ad90ea7 100644 (file)
@@ -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();
     }
-       
+
 };
index 6a29e6b8c264dfd7d623567eafeaea96592c329a..bcd7534617c28e7da0514b33129eb63ca6637653 100644 (file)
@@ -182,7 +182,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
 #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
index 263eec4e53c0bba0cb822dd89ee0b4b8941c6203..9acac7cecfda0f294bdeba9becba2c4af8219430 100644 (file)
@@ -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 (file)
index 0000000..457a3d0
--- /dev/null
@@ -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 (file)
index 0000000..599e664
--- /dev/null
@@ -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;
+  }
+}
index deaac2e26faaedef549654396764161053349581..43b3c59110defe9aaba6d5042f7ff217cfa25c07 100644 (file)
@@ -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/promethium/Makefile b/keyboards/handwired/promethium/Makefile
new file mode 100644 (file)
index 0000000..191c6bb
--- /dev/null
@@ -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 (file)
index 0000000..473af67
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x6660
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    Priyadi
+#define PRODUCT         Promethium Keyboard
+#define DESCRIPTION     Promethium Keyboard
+
+/* 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
+
+/* 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) | MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RCTRL)) \
+)
+
+/*
+ * 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
+
+/* 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<<ISC31) |      \
+              (0<<ISC30));      \
+} while (0)
+#define PS2_INT_ON()  do {      \
+    EIMSK |= (1<<INT3);         \
+} while (0)
+#define PS2_INT_OFF() do {      \
+    EIMSK &= ~(1<<INT3);        \
+} while (0)
+#define PS2_INT_VECT    INT3_vect
+#endif
+
+/* PS/2 mouse USART version */
+#ifdef PS2_USE_USART
+/* XCK for clock line and RXD for data line */
+#define PS2_CLOCK_PORT  PORTD
+#define PS2_CLOCK_PIN   PIND
+#define PS2_CLOCK_DDR   DDRD
+#define PS2_CLOCK_BIT   5
+#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<<PS2_CLOCK_BIT);   \
+    PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT);     \
+    UCSR1C = ((1 << UMSEL10) |  \
+              (3 << UPM10)   |  \
+              (0 << USBS1)   |  \
+              (3 << UCSZ10)  |  \
+              (0 << UCPOL1));   \
+    UCSR1A = 0;                 \
+    UBRR1H = 0;                 \
+    UBRR1L = 0;                 \
+} while (0)
+#define PS2_USART_RX_INT_ON() do {  \
+    UCSR1B = ((1 << RXCIE1) |       \
+              (1 << RXEN1));        \
+} while (0)
+#define PS2_USART_RX_POLL_ON() do { \
+    UCSR1B = (1 << RXEN1);          \
+} while (0)
+#define PS2_USART_OFF() do {    \
+    UCSR1C = 0;                 \
+    UCSR1B &= ~((1 << RXEN1) |  \
+                (1 << TXEN1));  \
+} while (0)
+#define PS2_USART_RX_READY      (UCSR1A & (1<<RXC1))
+#define PS2_USART_RX_DATA       UDR1
+#define PS2_USART_ERROR         (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1)))
+#define PS2_USART_RX_VECT       USART1_RX_vect
+#endif
+
+
+#endif
diff --git a/keyboards/handwired/promethium/keymaps/priyadi/Makefile b/keyboards/handwired/promethium/keymaps/priyadi/Makefile
new file mode 100644 (file)
index 0000000..2f6f27a
--- /dev/null
@@ -0,0 +1,28 @@
+
+
+# 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 = 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 = 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.
+PS2_MOUSE_ENABLE = yes
+PS2_USE_INT = 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/handwired/promethium/keymaps/priyadi/config.h b/keyboards/handwired/promethium/keymaps/priyadi/config.h
new file mode 100644 (file)
index 0000000..8b78c0d
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "../../config.h"
+
+/* bootmagic salt key */
+#define BOOTMAGIC_KEY_SALT              KC_ESC
+
+/* skip bootmagic and eeconfig */
+#define BOOTMAGIC_KEY_SKIP              KC_SPACE
+
+#define PREVENT_STUCK_MODIFIERS
+
+#define RGB_DI_PIN B5
+#define RGBSPS_NUM 57
+
+#endif
diff --git a/keyboards/handwired/promethium/keymaps/priyadi/flash.sh b/keyboards/handwired/promethium/keymaps/priyadi/flash.sh
new file mode 100755 (executable)
index 0000000..fb81a54
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+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 (file)
index 0000000..b2da2f9
--- /dev/null
@@ -0,0 +1,725 @@
+// 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 "promethium.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"
+#include "rgbsps.h"
+#define COUNT(x) (sizeof (x) / sizeof (*(x)))
+
+// #define RGBLED_NUM 5
+// struct cRGB led[RGBLED_NUM];
+
+
+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)
+
+// RGBSPS
+
+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_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_FUNC,
+  LED_EMOJI
+};
+
+const uint8_t PROGMEM LED_INDICATORS[] = {
+  LED_IND_EMOJI,
+  LED_IND_NUM,
+  LED_IND_FUNC,
+  LED_IND_BATTERY,
+  LED_IND_USB,
+  LED_IND_BLUETOOTH,
+};
+
+const uint8_t PROGMEM LED_TRACKPOINT[] = {
+  LED_TRACKPOINT1,
+  LED_TRACKPOINT2,
+  LED_TRACKPOINT3,
+};
+
+void led_reset(void) {
+  for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
+    rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 15, 6, 0);
+  }
+
+  for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
+    rgbsps_set(pgm_read_byte(&LED_MODS[i]), 15, 0, 0);
+  }
+
+  for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
+    rgbsps_set(pgm_read_byte(&LED_FN[i]), 15, 15, 15);
+  }
+}
+
+void led_layer_normal(void) {
+  rgbsps_set(LED_IND_FUNC, 0, 0, 0);
+  rgbsps_set(LED_IND_NUM, 0, 0, 0);
+  rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
+
+  led_reset();
+
+  rgbsps_send();
+}
+
+void led_layer_func(void) {
+  rgbsps_set(LED_IND_FUNC, 0, 15, 0);
+  rgbsps_set(LED_IND_NUM, 0, 0, 0);
+  rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
+
+  led_reset();
+
+  for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
+    rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 0, 0, 0);
+  }
+
+  rgbsps_set(LED_I, 15, 0, 15);
+  rgbsps_set(LED_J, 15, 0, 15);
+  rgbsps_set(LED_K, 15, 0, 15);
+  rgbsps_set(LED_L, 15, 0, 15);
+
+  rgbsps_set(LED_U, 15, 0, 10);
+  rgbsps_set(LED_O, 15, 0, 10);
+  rgbsps_set(LED_COMM, 15, 0, 10);
+  rgbsps_set(LED_DOT, 15, 0, 10);
+  rgbsps_set(LED_SCLN, 15, 0, 10);
+  rgbsps_set(LED_P, 15, 0, 10);
+
+  rgbsps_set(LED_Q, 10, 0, 15);
+  rgbsps_set(LED_W, 10, 0, 15);
+  rgbsps_set(LED_E, 10, 0, 15);
+  rgbsps_set(LED_R, 10, 0, 15);
+  rgbsps_set(LED_A, 10, 0, 15);
+  rgbsps_set(LED_S, 10, 0, 15);
+  rgbsps_set(LED_D, 10, 0, 15);
+  rgbsps_set(LED_F, 10, 0, 15);
+  rgbsps_set(LED_Z, 10, 0, 15);
+  rgbsps_set(LED_X, 10, 0, 15);
+  rgbsps_set(LED_C, 10, 0, 15);
+  rgbsps_set(LED_V, 10, 0, 15);
+
+  rgbsps_send();
+}
+
+void led_layer_punc(void) {
+  rgbsps_set(LED_IND_FUNC, 0, 15, 0);
+  rgbsps_set(LED_IND_NUM, 0, 0, 15);
+  rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
+
+  led_reset();
+
+  rgbsps_send();
+}
+
+void led_layer_num(void) {
+  rgbsps_set(LED_IND_FUNC, 0, 0, 0);
+  rgbsps_set(LED_IND_NUM, 0, 0, 15);
+  rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
+
+  led_reset();
+
+  for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
+    rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 0, 0, 0);
+  }
+
+  rgbsps_set(LED_U, 0, 5, 15);
+  rgbsps_set(LED_I, 0, 5, 15);
+  rgbsps_set(LED_O, 0, 5, 15);
+  rgbsps_set(LED_J, 0, 5, 15);
+  rgbsps_set(LED_K, 0, 5, 15);
+  rgbsps_set(LED_L, 0, 5, 15);
+  rgbsps_set(LED_M, 0, 5, 15);
+  rgbsps_set(LED_COMM, 0, 5, 15);
+  rgbsps_set(LED_DOT, 0, 5, 15);
+  rgbsps_set(LED_FUNC, 0, 5, 15);
+
+  rgbsps_set(LED_EMOJI, 0, 10, 15);
+  rgbsps_set(LED_RALT, 0, 10, 15);
+
+  rgbsps_set(LED_Q, 0, 10, 15);
+  rgbsps_set(LED_W, 0, 10, 15);
+  rgbsps_set(LED_E, 0, 10, 15);
+  rgbsps_set(LED_R, 0, 10, 15);
+  rgbsps_set(LED_T, 0, 10, 15);
+  rgbsps_set(LED_Y, 0, 10, 15);
+  rgbsps_set(LED_P, 0, 10, 15);
+
+  rgbsps_set(LED_A, 0, 15, 15);
+  rgbsps_set(LED_S, 0, 15, 15);
+  rgbsps_set(LED_D, 0, 15, 15);
+  rgbsps_set(LED_F, 0, 15, 15);
+  rgbsps_set(LED_Z, 0, 15, 15);
+  rgbsps_set(LED_X, 0, 15, 15);
+  rgbsps_set(LED_C, 0, 15, 15);
+  rgbsps_set(LED_V, 0, 15, 15);
+
+  rgbsps_send();
+}
+
+void led_layer_emoji(void) {
+  rgbsps_setall(15, 15, 0);
+
+  rgbsps_set(LED_IND_FUNC, 0, 0, 0);
+  rgbsps_set(LED_IND_NUM, 0, 0, 0);
+  rgbsps_set(LED_IND_EMOJI, 15, 15, 0);
+
+  rgbsps_set(LED_PUNC, 15, 15, 15);
+  rgbsps_set(LED_EMOJI, 15, 15, 15);
+
+  rgbsps_send();
+}
+
+void led_layer_gui(void) {
+  rgbsps_set(LED_IND_FUNC, 15, 10, 15);
+  rgbsps_set(LED_IND_NUM, 15, 10, 15);
+  rgbsps_set(LED_IND_EMOJI, 15, 10, 15);
+  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);
+
+  // // hardcode indicator for now
+  rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 15);
+  rgbsps_set(LED_IND_USB, 15, 15, 15);
+  rgbsps_set(LED_IND_BATTERY, 0, 15, 0);
+
+  led_layer_normal();
+}
+
+
+// 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] = 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_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] = KEYMAP(
+  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] = KEYMAP(
+  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] = KEYMAP(
+  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] = KEYMAP(
+  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] = KEYMAP(
+  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] = 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 |      |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |Linux |      | Vol- | Mute | Vol+ |      |      |  D-  |      |  D+  |      |Qwerty|
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Win  |      | Prev | Play | Next |      |      |      |      |      |      |Colmak|
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | OSX  |      |      |      |      |  BL- |  BL+ |      |      |      |      |Workmn|
+ * `-----------------------------------------------------------------------------------'
+ */
+[_GUI] = KEYMAP(
+  _______, 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, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, COLEMAK,
+      OSX, _______, _______, _______, _______,  BL_DEC,  BL_INC, _______, _______, RGB_VAI, RGB_VAD, 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) {
+  #ifdef AUDIO_ENABLE
+  // faux clicky
+  if (record->event.pressed) PLAY_NOTE_ARRAY(tone_click, false, 0);
+  #endif
+
+  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);
+        if (IS_LAYER_ON(_GUI)) {
+          led_layer_gui();
+        } else {
+          led_layer_punc();;
+        }
+      } else {
+        layer_off(_PUNC);
+        update_tri_layer(_PUNC, _EMOJI, _GUI);
+        if (IS_LAYER_ON(_EMOJI)) {
+          led_layer_emoji();
+        } else {
+          led_layer_normal();;
+        }
+      }
+      return false;
+      break;
+    case EMOJI:
+      if (record->event.pressed) {
+        layer_on(_EMOJI);
+        update_tri_layer(_PUNC, _EMOJI, _GUI);
+        if (IS_LAYER_ON(_GUI)) {
+          led_layer_gui();
+        } else {
+          led_layer_emoji();;
+        }
+      } else {
+        layer_off(_EMOJI);
+        update_tri_layer(_PUNC, _EMOJI, _GUI);
+        if (IS_LAYER_ON(_PUNC)) {
+          led_layer_punc();
+        } else {
+          led_layer_normal();;
+        }
+      }
+      return false;
+      break;
+    case NUM:
+      if (record->event.pressed) {
+        layer_on(_NUM);
+        led_layer_num();
+      } else {
+        layer_off(_NUM);
+        led_layer_normal();
+      }
+      return false;
+      break;
+    case FUNC:
+      if (record->event.pressed) {
+        layer_on(_FUNC);
+        led_layer_func();
+      } else {
+        layer_off(_FUNC);
+        led_layer_normal();
+      }
+      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);
+  led_init();
+}
+
+// void init_rgblight(void) {
+//   for (uint8_t i = 0; i < RGBLED_NUM; i++) {
+//     led[i].r = 255;
+//     led[i].g = 85;
+//     led[i].b = 0;
+//   }
+//   ws2812_setleds(led, RGBLED_NUM);
+// }
+
+
+#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
diff --git a/keyboards/handwired/promethium/keymaps/priyadi/readme.md b/keyboards/handwired/promethium/keymaps/priyadi/readme.md
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/keyboards/handwired/promethium/keymaps/readme.md b/keyboards/handwired/promethium/keymaps/readme.md
new file mode 100644 (file)
index 0000000..5276913
--- /dev/null
@@ -0,0 +1,22 @@
+# How to add your own keymap
+
+Folders can be named however you'd like (will be approved upon merging), or should follow the format with a preceding `_`:
+
+    _[ISO 3166-1 alpha-2 code*]_[layout variant]_[layout name/author]
+
+\* See full list: https://en.wikipedia.org/wiki/ISO_3166-1#Officially_assigned_code_elements
+
+and contain the following files:
+
+* `keymap.c`
+* `readme.md` *recommended*
+* `config.h` *optional*, found automatically when compiling
+* `Makefile` *optional*, found automatically when compling
+
+When adding your keymap to this list, keep it organised alphabetically (select list, edit->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 (file)
index 0000000..a0035cc
--- /dev/null
@@ -0,0 +1,6 @@
+#include "promethium.h"
+
+void matrix_init_kb(void) {
+
+       matrix_init_user();
+}
\ No newline at end of file
diff --git a/keyboards/handwired/promethium/promethium.h b/keyboards/handwired/promethium/promethium.h
new file mode 100644 (file)
index 0000000..8f2a8c3
--- /dev/null
@@ -0,0 +1,101 @@
+#ifndef PROMETHIUM_H
+#define PROMETHIUM_H
+
+#include "quantum.h"
+
+#define PS2_INIT_DELAY 2000
+
+#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} \
+}
+
+enum led_sequence {
+  LED_IND_EMOJI,
+  LED_IND_NUM,
+  LED_IND_FUNC,
+
+  LED_IND_BATTERY,
+  LED_IND_USB,
+  LED_IND_BLUETOOTH,
+
+  LED_TAB,
+  LED_ESC,
+  LED_LSFT,
+  LED_LCTL,
+
+  LED_LGUI,
+  LED_Z,
+  LED_A,
+  LED_Q,
+
+  LED_W,
+  LED_S,
+  LED_X,
+  LED_LALT,
+
+  LED_PUNC,
+  LED_C,
+  LED_D,
+  LED_E,
+
+  LED_R,
+  LED_F,
+  LED_V,
+  LED_NUM,
+
+  LED_LSPC,
+  LED_B,
+  LED_G,
+  LED_T,
+
+  LED_TRACKPOINT1,
+  LED_TRACKPOINT2,
+  LED_TRACKPOINT3,
+
+  LED_RSPC,
+  LED_N,
+  LED_HH,
+  LED_Y,
+
+  LED_U,
+  LED_J,
+  LED_M,
+  LED_FUNC,
+
+  LED_EMOJI,
+  LED_COMM,
+  LED_K,
+  LED_I,
+
+  LED_O,
+  LED_L,
+  LED_DOT,
+  LED_RALT,
+
+  LED_RGUI,
+  LED_SLSH,
+  LED_SCLN,
+  LED_P,
+
+  LED_BKSP,
+  LED_ENT,
+  LED_RSFT,
+  LED_RCTL
+};
+
+#endif
+
+
diff --git a/keyboards/handwired/promethium/readme.md b/keyboards/handwired/promethium/readme.md
new file mode 100644 (file)
index 0000000..e63d2f1
--- /dev/null
@@ -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 (file)
index 0000000..ea922ec
--- /dev/null
@@ -0,0 +1,24 @@
+#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);
+}
\ No newline at end of file
diff --git a/keyboards/handwired/promethium/rgbsps.h b/keyboards/handwired/promethium/rgbsps.h
new file mode 100644 (file)
index 0000000..6da197f
--- /dev/null
@@ -0,0 +1,4 @@
+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);
\ No newline at end of file
diff --git a/keyboards/handwired/promethium/rules.mk b/keyboards/handwired/promethium/rules.mk
new file mode 100644 (file)
index 0000000..0842780
--- /dev/null
@@ -0,0 +1,74 @@
+
+# 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
+
+# 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
\ No newline at end of file
diff --git a/keyboards/hhkb/keymaps/sh_jp/Makefile b/keyboards/hhkb/keymaps/sh_jp/Makefile
new file mode 100644 (file)
index 0000000..a7f700f
--- /dev/null
@@ -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 (file)
index 0000000..4f82f2f
--- /dev/null
@@ -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.<sup>[1](#cmdTab)</sup>
+  - 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:
+,-----------------------------------------------------------.
+|   |   |   |   |   |   |   |   |   |   |  |   |   |   |    |
+|-----------------------------------------------------------|
+|     |   |   |   |   |   |   |   |   |   |   |   |   |     |
+|------------------------------------------------------`    |
+|      |   |   |   |   |   |   |   |   |   |   |   |   |    |
+|-----------------------------------------------------------|
+|       |   |   |   |   |   |   |   |   |   |   |   |   |   |
+|-----------------------------------------------------------|
+|  |  |    |      |    |       |    |   |   |   |   |   |   |
+`-----------------------------------------------------------'
+```
+<a name="cmdTab">1</a>: `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 (file)
index 0000000..d4cb3b0
--- /dev/null
@@ -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[] = {
+
+};
index 43c845739a6a406b166340c5c39a5deec1f544ae..d9114ec858bc64011903be91318060531d7ba431 100644 (file)
@@ -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.
index 62c165aa5339747179f83b5be3c74f0ab0d82291..d2f1852885dfc0b92b40c1a79288743974f3abde 100644 (file)
@@ -96,7 +96,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);
index e2594f4b372e4b1b2202339496a72175e4d61d74..047be5707b0fc7d728d3a3a463f40a0dbb0c5e98 100644 (file)
@@ -70,7 +70,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
 )
 
 #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
index 1b645ea938e9364630b72bfe58707be9c89f4c25..8b5efd0ceec704623e7aad13e4b83ca1762fdaf2 100644 (file)
@@ -61,7 +61,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |-----------------------------------------------------------------------------------------+
  * |         |     |     |     |     |     |     | Psc |     |     |     |     |             |
  * |-----------------------------------------------------------------------------------------+
- * |           | Led | Led-| Led+|     | Mute| Vol+| Vol-|     |     |     |    Play   |     |
+ * |           | Led | Led+| Led-|     | Mute| Vol+| Vol-|     |     |     |    Play   |     |
  * |-----------------------------------------------------------------------------------------+
  * |       |       |       |                                 |       | Prev  | Stop  | Next  |
  * `-----------------------------------------------------------------------------------------'
index 2f39ea8e55ecb607d2c7dc24ec1099a25986fad0..43abf6228effe0de1cb093711fd465b745e95e76 100644 (file)
@@ -2,7 +2,7 @@
 
 /* WS2812B RGB Underglow LED */
 #define RGB_DI_PIN F5   // Based on wiring depicted in ws2812_wiring.jpg
-#define RGBLIGHT_TIMER       
+#define RGBLIGHT_ANIMATIONS       
 #define RGBLED_NUM 16         // Number of LEDs. Change this to match your use case.
 #define RGBLIGHT_HUE_STEP 8
 #define RGBLIGHT_SAT_STEP 8
index f4d900accbe410f98c13b00bba935d4577344bcc..4db45ab0b3f0a02b118ffa56ce590559243a92f6 100644 (file)
@@ -28,29 +28,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #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 EE_HANDS
-
-#define I2C_MASTER_LEFT
-// #define I2C_MASTER_RIGHT
-
 /* COL2ROW or ROW2COL */
 #define DIODE_DIRECTION COL2ROW
 
@@ -73,24 +50,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
     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
+//#define NO_DEBUG
 
 /* disable print */
-// #define NO_PRINT
+//#define NO_PRINT
 
 /* disable action features */
 //#define NO_ACTION_LAYER
@@ -99,4 +63,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
 
+#ifdef SUBPROJECT_rev1
+    #include "rev1/config.h"
+#endif
+#ifdef SUBPROJECT_rev2
+    #include "rev2/config.h"
+#endif
 #endif
index 0d2d94b67260497ea07446db5cac2aa5dab8af26..6f1f71f5f88dd00da5cc59a32ef6b8669f019747 100644 (file)
@@ -42,10 +42,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * `-----------------------------------------------------------------------------------'
  */
 [_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_SCLN, KC_QUOT, \
+  KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC, \
+  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_ENT , \
-  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+  KC_LCTL, ADJUST, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  MT(MOD_LSFT, KC_SPC),  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
 ),
 
 /* Colemak
@@ -83,41 +83,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT , \
   ADJUST,  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] = KEYMAP( \
-  KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
+[3] = KEYMAP( \
+  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_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_BSPC, MT(MOD_LSFT, KC_BSPC), _______, 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] = KEYMAP( \
-  KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC, \
+[4] = KEYMAP( \
+  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_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 \
+  _______, _______, _______, _______, _______, KC_ENT, MT(MOD_LSFT, KC_ENT), _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
 ),
 
 /* Adjust (Lower + Raise)
@@ -134,11 +110,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 [_ADJUST] =  KEYMAP( \
   _______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
   _______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  _______, _______, \
-  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+  _______, RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD, _______, _______, _______, \
   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
 )
-
-
 };
 
 #ifdef AUDIO_ENABLE
index 2671fabf6d44af31f06f9e24ffbcd6e485ba286a..72e5ae66bab60f77a0e70b39328dfebee6e2af9a 100644 (file)
@@ -75,7 +75,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* ws2812 RGB LED */
 #define RGB_DI_PIN D4
-#define RGBLIGHT_TIMER
+#define RGBLIGHT_ANIMATIONS
 #define RGBLED_NUM 8     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17
index f4d900accbe410f98c13b00bba935d4577344bcc..b0ad522fcbae965959c05a3e9f10455ea49c7f9c 100644 (file)
@@ -75,7 +75,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* ws2812 RGB LED */
 #define RGB_DI_PIN D4
-#define RGBLIGHT_TIMER
+#define RGBLIGHT_ANIMATIONS
 #define RGBLED_NUM 8     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17
index c505d3a6e317630df35f0d166a77bf4de841f11e..117b727a85543f4d2abdfeb6df3fad9902c05ffb 100644 (file)
@@ -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
index fe7ae076792f0001bc0184696cc27f15482929a7..2cdfb061f2db332e82faed77b6d6d85a2615c2d2 100644 (file)
@@ -1,25 +1,13 @@
 #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
 
-#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/rev1/Makefile b/keyboards/lets_split/rev1/Makefile
new file mode 100644 (file)
index 0000000..4e2a6f0
--- /dev/null
@@ -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 (file)
index 0000000..825e5ec
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 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 CATERINA_BOOTLOADER
+
+// #define USE_I2C
+// Use serial if not using I2C
+#ifndef USE_I2C
+#  define USE_SERIAL
+#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)) \
+)
+
+/*
+ * 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 (file)
index 0000000..c505d3a
--- /dev/null
@@ -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 (file)
index 0000000..4667c9f
--- /dev/null
@@ -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 (file)
index 0000000..a0825b4
--- /dev/null
@@ -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 (file)
index 0000000..4e2a6f0
--- /dev/null
@@ -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 (file)
index 0000000..e9689d7
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 CATERINA_BOOTLOADER
+
+// #define USE_I2C
+
+// Use serial if not using I2C
+#ifndef USE_I2C
+#  define USE_SERIAL
+#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 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 (file)
index 0000000..c505d3a
--- /dev/null
@@ -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/rev2/rev2.h b/keyboards/lets_split/rev2/rev2.h
new file mode 100644 (file)
index 0000000..990976d
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef REV2_H
+#define REV2_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, 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 \
+       ) \
+       { \
+               { 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/rev2/rules.mk b/keyboards/lets_split/rev2/rules.mk
new file mode 100644 (file)
index 0000000..80a942d
--- /dev/null
@@ -0,0 +1,5 @@
+BACKLIGHT_ENABLE = no
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
index 6fde8a444ccae172391daa3847395fbf587db4b9..1aee5313c1ee122fb0feebc44dc52caef52651b0 100644 (file)
@@ -63,11 +63,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/maxipad/Makefile b/keyboards/maxipad/Makefile
new file mode 100644 (file)
index 0000000..57b2ef6
--- /dev/null
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+       include ../../Makefile
+endif
diff --git a/keyboards/maxipad/config.h b/keyboards/maxipad/config.h
new file mode 100644 (file)
index 0000000..fc5ab77
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 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/maxipad/keymaps/default/Makefile b/keyboards/maxipad/keymaps/default/Makefile
new file mode 100644 (file)
index 0000000..f4671a9
--- /dev/null
@@ -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/maxipad/keymaps/default/config.h b/keyboards/maxipad/keymaps/default/config.h
new file mode 100644 (file)
index 0000000..df06a26
--- /dev/null
@@ -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/maxipad/keymaps/default/keymap.c b/keyboards/maxipad/keymaps/default/keymap.c
new file mode 100644 (file)
index 0000000..43ace32
--- /dev/null
@@ -0,0 +1,54 @@
+#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_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;
+};
+
+
+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/maxipad/keymaps/default/readme.md b/keyboards/maxipad/keymaps/default/readme.md
new file mode 100644 (file)
index 0000000..a6c0d4a
--- /dev/null
@@ -0,0 +1 @@
+# The default keymap for maxipad
\ No newline at end of file
diff --git a/keyboards/maxipad/maxipad.c b/keyboards/maxipad/maxipad.c
new file mode 100644 (file)
index 0000000..879ae86
--- /dev/null
@@ -0,0 +1,28 @@
+#include "maxipad.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/maxipad/maxipad.h b/keyboards/maxipad/maxipad.h
new file mode 100644 (file)
index 0000000..eee1309
--- /dev/null
@@ -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 (file)
index 0000000..de2265d
--- /dev/null
@@ -0,0 +1,30 @@
+## Quantum MK Firmware
+
+For the full Quantum feature list, see [the parent readme](/).
+
+
+## Building
+
+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 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|<name>]
+```
+
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
+
diff --git a/keyboards/maxipad/rules.mk b/keyboards/maxipad/rules.mk
new file mode 100644 (file)
index 0000000..56b2042
--- /dev/null
@@ -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
\ No newline at end of file
index 983a1d73f29868ac4c7a10e74559f7067b5fe068..71a33498b4fd9550216d247c4eea47b3657aa7e7 100644 (file)
@@ -63,7 +63,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* 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
index 581e08cd02aab5f0c0519f0a8c2a43486274fa39..b1c70ace70e4a8b457bfa4c3234c4d7776271ea6 100644 (file)
@@ -5,8 +5,8 @@
 #   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
@@ -16,10 +16,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 = yes      # 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
index 1e04ba61d7a52c58f52a78851df20f63a7ea5f83..bd15fd5a22a12277f381616c7a711baabea47a94 100644 (file)
@@ -1,6 +1,9 @@
 #ifndef CONFIG_USER_H
 #define CONFIG_USER_H
 
+#define NO_DEBUG
+#define NO_PRINT
+
 #include "../../config.h"
 
 #define LEADER_TIMEOUT 300
index 7f1601af75d0cc256935b3d11c2987e21be70ce2..2be4dab4b1f2b4e35260028fd75ec950cc8ebd5a 100644 (file)
@@ -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 */
@@ -109,14 +111,14 @@ 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_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  QWERTY,  KEYPAD,  KEYPAD,  ALTSLASH,_______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_VOLD, KC_VOLU, 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_VOLD, KC_VOLU, 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},
index 0f4953888dd8743710682742d0b6ba4f9dfebbe1..267a087ea92dfd521fa18a927c46c40842d85968 100644 (file)
@@ -5,17 +5,17 @@
 #   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
-MIDI_ENABLE = no            # MIDI controls
+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
 
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
index 5f71ae7d19ab1850766e0029b5e3c41f0715e162..ddbe4d7b27ec7fa10a19cd57e4b5546080405b1f 100644 (file)
@@ -107,7 +107,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 [_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_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}
 },
 
@@ -125,7 +125,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}
 },
 
index 52acd1905ebebcdc69822434889b0935565096d5..cc093bee493cce874ea526978c57ff116ec20b08 100644 (file)
@@ -9,7 +9,7 @@
 
 /* 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
diff --git a/keyboards/planck/keymaps/thermal_printer/Makefile b/keyboards/planck/keymaps/thermal_printer/Makefile
new file mode 100644 (file)
index 0000000..3d1d118
--- /dev/null
@@ -0,0 +1,26 @@
+
+
+# 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 (file)
index 0000000..430b649
--- /dev/null
@@ -0,0 +1,23 @@
+#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)
+
+ #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 (file)
index 0000000..e880597
--- /dev/null
@@ -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 (file)
index 0000000..de9680b
--- /dev/null
@@ -0,0 +1,2 @@
+# The Default Planck Layout
+
index feb5a11901393757eca9df17e4501041e063116c..4ed19d76f901f3caa43bc485cec4f998e84c637b 100644 (file)
@@ -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
index 25db53a315e239fecd8d36e66ac72fb49096926a..ccee972715a37324662addf229580bb74863ca68 100644 (file)
@@ -62,6 +62,7 @@ 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 = 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
\ No newline at end of file
index 3fb978c2f6bafe89b7b2262534004c804c802434..f88acf211109e0293a3a79f4da6803056cfc3f7e 100644 (file)
@@ -63,7 +63,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* 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
index 581e08cd02aab5f0c0519f0a8c2a43486274fa39..3d4659ceb9a8b7425748ed250c5123d4e839e5d6 100644 (file)
@@ -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
index 086baa84ff8833fe7cfb9073554134fb29ee6475..e6099ceb82c1d7618349951e4abd4b847a98234a 100644 (file)
@@ -63,7 +63,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* 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
index d0f3a3a1c0817b77747b485c87d09d11b871f602..c4ce2aacca8447eb70fddda6755429d1a7d4167f 100644 (file)
@@ -53,7 +53,7 @@ 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
@@ -64,6 +64,7 @@ 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 ?= 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
\ No newline at end of file
index 7e9f91cc829c40a9267c1f8b3dc390b52d115ed7..eb357b39e07c9b11ae00f7c035158e143e0520e3 100644 (file)
@@ -67,7 +67,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 #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/dbroqua_hhkb/keymap.c b/keyboards/satan/keymaps/dbroqua_hhkb/keymap.c
new file mode 100644 (file)
index 0000000..98a298e
--- /dev/null
@@ -0,0 +1,110 @@
+// 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 "satan.h"
+
+#define _DEFAULT 0
+#define _ALTDISP 1
+#define _FN 2
+
+enum planck_keycodes {
+  DEFAULT = SAFE_RANGE,
+  ALTDISP
+};
+
+// Fillers to make layering more clear
+#define ______ KC_TRNS
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Qwerty alt/gui/space/gui/alt
+ * ,-----------------------------------------------------------------------------------------.
+ * | 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  |
+ * |-----------------------------------------------------------------------------------------+
+ *         | LAlt| LGUI  |               Space                | RGUI  | RAlt |
+ *         `-----------------------------------------------------------------'
+ */
+  [_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_LALT,  KC_LGUI,            KC_SPC,                                                 KC_RGUI,  KC_RALT, ______, ______ \
+      ),
+
+/* 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 |
+ *         `-----------------------------------------------------------------'
+ */
+  [_ALTDISP] = 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 */
+      ______,   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,   BL_DEC, BL_INC, BL_TOGG, ______, ______, ______, ______, 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, ______,______,  \
+      ______,   DEFAULT, ALTDISP,                 ______,                 KC_MSTP, ______,    ______,    ______ \
+      )
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+  return MACRO_NONE;
+};
+
+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 DEFAULT:
+      if (record->event.pressed) {
+        persistant_default_layer_set(1UL<<_DEFAULT);
+      }
+      return false;
+      break;
+    case ALTDISP:
+      if (record->event.pressed) {
+        persistant_default_layer_set(1UL<<_ALTDISP);
+      }
+      return false;
+      break;
+  }
+  return true;
+}
\ No newline at end of file
diff --git a/keyboards/satan/keymaps/dbroqua_hhkb/readme.md b/keyboards/satan/keymaps/dbroqua_hhkb/readme.md
new file mode 100644 (file)
index 0000000..39e71be
--- /dev/null
@@ -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
index 82c779081a7efcbbd8b68641d177959d98068f3f..93610258b38cd0f39e5129033a1258c2d7f71969 100644 (file)
@@ -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
 };
 
index 5d8757936ddd7508bdae4aeb14f4bfa4d0fe5191..19cf9c9b39882f86bad6fd23a2ff5a6aee1f0aa2 100644 (file)
@@ -67,7 +67,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 /*#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
index 1f8466a5460fc3d16c898548c53cd45d48f1f049..5798d91adf6e5c018ee25f1d1959b495bacdee76 100644 (file)
@@ -31,7 +31,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #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
index 5a930e85edbd78d2d833ae59d1078340cd25f300..28060947aff5b008a20fbf9b0ccf1af2b6d3f990 100644 (file)
@@ -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
index 64118abdcee50c5206662005791e7b12c9f47167..3282761c0fb76b641ab38332488146f6f0389998 100644 (file)
@@ -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/quantum/api.c b/quantum/api.c
new file mode 100644 (file)
index 0000000..4ca3b96
--- /dev/null
@@ -0,0 +1,178 @@
+#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;
+                }
+                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
+    }
+
+}
\ No newline at end of file
diff --git a/quantum/api.h b/quantum/api.h
new file mode 100644 (file)
index 0000000..00dcdb8
--- /dev/null
@@ -0,0 +1,59 @@
+#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
\ No newline at end of file
diff --git a/quantum/api/api_sysex.c b/quantum/api/api_sysex.c
new file mode 100644 (file)
index 0000000..a4a554e
--- /dev/null
@@ -0,0 +1,29 @@
+#include "api_sysex.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(" ");
+    // }
+    uint8_t * precode = malloc(sizeof(uint8_t) * (length + 2));
+    precode[0] = message_type;
+    precode[1] = data_type;
+    memcpy(precode + 2, bytes, length);
+    uint8_t * encoded = malloc(sizeof(uint8_t) * (sysex_encoded_length(length + 2)));
+    uint16_t encoded_length = sysex_encode(encoded, precode, length + 2);
+    uint8_t * array = malloc(sizeof(uint8_t) * (encoded_length + 5));
+    array[0] = 0xF0;
+    array[1] = 0x00;
+    array[2] = 0x00;
+    array[3] = 0x00;
+    array[encoded_length + 4] = 0xF7;
+    memcpy(array + 4, encoded, encoded_length);
+    midi_send_array(&midi_device, encoded_length + 5, array);
+
+    // SEND_STRING("\nTD: ");
+    // for (uint8_t i = 0; i < encoded_length + 5; i++) {
+    //     send_byte(array[i]);
+    //     SEND_STRING(" ");
+    // }
+}
\ No newline at end of file
diff --git a/quantum/api/api_sysex.h b/quantum/api/api_sysex.h
new file mode 100644 (file)
index 0000000..b947b60
--- /dev/null
@@ -0,0 +1,10 @@
+#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
\ No newline at end of file
index 8ed5f4a106e47edcd44c46d8b9a49221d0f4c225..17c11faeb617e1fbaeae12af7622f6c4c429c10e 100644 (file)
@@ -5,55 +5,56 @@
 #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
-
+#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
         } while(0)
 #   else
 #       error "USART configuration is needed."
-#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<<ISC11) |      \
-              (0<<ISC10));      \
-} while (0)
-#define PS2_INT_ON()  do {      \
-    EIMSK |= (1<<INT1);         \
-} while (0)
-#define PS2_INT_OFF() do {      \
-    EIMSK &= ~(1<<INT1);        \
-} while (0)
-#define PS2_INT_VECT    INT1_vect
-#endif
-
-/*
- * PS/2 Busywait configuration
- */
-#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    0
-#endif
-
+#   endif
 #endif
 
 #endif
index a01bbfbd148636088e14dc7fafa929d0517a0d6b..ae56d16c75ebc488bb4ef667ec0f64763d2ffcdb 100644 (file)
@@ -178,6 +178,10 @@ enum quantum_keycodes {
     // Right shift, close paren
     KC_RSPC,
 
+    // Printing
+    PRINT_ON,
+    PRINT_OFF,
+
     // always leave at the end
     SAFE_RANGE
 };
diff --git a/quantum/keymap_extras/keymap_jp.h b/quantum/keymap_extras/keymap_jp.h
new file mode 100644 (file)
index 0000000..e81b595
--- /dev/null
@@ -0,0 +1,62 @@
+/* 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
index da5c829757924f98db2a7b503ff6fd2f43d36785..9b0ef35ca991adf1e17a188f4f6f982a2942f313 100644 (file)
@@ -13,7 +13,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
index 401845e8552bd6cee3f53596e4c05610c4d15e4f..a883b1388487130f5c783bd6b1f5df603718000b 100755 (executable)
 #include <util/delay.h>
 #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()
+{
+    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()
+{
+    // 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()
+{
+    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 +148,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<<TWEN);
+    I2C_Init();
+    I2C_Start();
+    I2C_Write(0x84);
+    uint16_t datlen = leds<<2;
+    uint8_t curbyte;
+    uint8_t * data = (uint8_t*)ledarray;
+    while (datlen--) {
+      curbyte=*data++;
+      I2C_Write(curbyte);
+    }
+    I2C_Stop();
+    SREG=sreg_prev;
+    TWCR=twcr_prev;
+  #endif
+
+
   // ws2812_DDRREG |= _BV(ws2812_pin); // Enable DDR
   // new universal format (DDR)
   _SFR_IO8((RGB_DI_PIN >> 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 +264,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"
index 54eef22d9e00715606fee071c66ce2670437a086..9498e550e97fddb6a7456e1bc0bc004c246fa8bf 100755 (executable)
 #include <avr/io.h>
 #include <avr/interrupt.h>
 //#include "ws2812_config.h"
+//#include "i2cmaster.h"
+
+#define LIGHT_I2C 1
+#define LIGHT_I2C_ADDR        0x84
+#define LIGHT_I2C_ADDR_WRITE  ( (LIGHT_I2C_ADDR<<1) | I2C_WRITE )
+#define LIGHT_I2C_ADDR_READ   ( (LIGHT_I2C_ADDR<<1) | I2C_READ  )
+
+#define RGBW 1
+
+#ifdef RGBW
+  #define LED_TYPE struct cRGBW
+#else
+  #define LED_TYPE struct cRGB
+#endif
+
 
 /*
  *  Structure of the LED array
@@ -42,9 +57,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
index 3174e07390ca587351b842010f9a14b5f89d367c..07eb87bc362ed1bfa876ecff2d6676e2b8ed4bf6 100644 (file)
@@ -25,37 +25,65 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #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
 
 static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
 static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
 
 /* matrix state(1:on, 0:off) */
 static matrix_row_t matrix[MATRIX_ROWS];
+
+static matrix_row_t matrix_raw[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);
+#else // 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);
@@ -119,19 +147,26 @@ 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();
+#else // ROW2COL
+    unselect_cols();
+    init_rows();
+#endif
 
     // initialize matrix state: all keys off
     for (uint8_t i=0; i < MATRIX_ROWS; i++) {
         matrix[i] = 0;
+        matrix_raw[i] = 0;
         matrix_debouncing[i] = 0;
     }
 
@@ -141,71 +176,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");
+
+#else // 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)) >> 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 +242,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 +266,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)
+#else // 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 (file)
index 0000000..36ce29e
--- /dev/null
@@ -0,0 +1,37 @@
+#pragma once
+// Some helpers for controlling gpio pins
+#include <avr/io.h>
+
+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_printer.c b/quantum/process_keycode/process_printer.c
new file mode 100644 (file)
index 0000000..2e11dd3
--- /dev/null
@@ -0,0 +1,254 @@
+#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;
+
+}
\ No newline at end of file
diff --git a/quantum/process_keycode/process_printer.h b/quantum/process_keycode/process_printer.h
new file mode 100644 (file)
index 0000000..fdd36d7
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef PROCESS_PRINTER_H
+#define PROCESS_PRINTER_H
+
+#include "quantum.h"
+
+#include "protocol/serial.h"
+
+#endif
\ No newline at end of file
diff --git a/quantum/process_keycode/process_printer_bb.c b/quantum/process_keycode/process_printer_bb.c
new file mode 100644 (file)
index 0000000..1924d03
--- /dev/null
@@ -0,0 +1,260 @@
+#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;
+
+}
\ No newline at end of file
index 065eeb5f6a80c9d9e44051f2bd4dbba1952ec9f2..f17cfa6cf24078b73cd1a2ac371f67573b72ddbf 100644 (file)
@@ -22,6 +22,7 @@ void register_hex(uint16_t hex);
 bool process_unicode(uint16_t keycode, keyrecord_t *record);
 
 #ifdef UNICODEMAP_ENABLE
+void unicode_map_input_error(void);
 bool process_unicode_map(uint16_t keycode, keyrecord_t *record);
 #endif
 
index 098312e6ef545c15c0a8956b4d79094587893647..f653564a67dea8396b04db82500c4b9dc531a480 100644 (file)
@@ -1,5 +1,9 @@
 #include "quantum.h"
 
+#ifndef TAPPING_TERM
+#define TAPPING_TERM 200
+#endif
+
 static void do_code16 (uint16_t code, void (*f) (uint8_t)) {
   switch (code) {
   case QK_MODS ... QK_MODS_MAX:
@@ -75,6 +79,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) {
 
@@ -129,6 +134,9 @@ bool process_record_quantum(keyrecord_t *record) {
   #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
@@ -283,6 +291,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 +301,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 +314,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 +324,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);
         }
@@ -799,6 +809,51 @@ 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;
+    }
+}
+
+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) {
index 0c6046649512c7d33ff924d6b38b92e342d33c7a..e6adf974aba58aa006a876c58d00f2d19d6099c7 100644 (file)
@@ -59,6 +59,10 @@ extern uint32_t default_layer_state;
 
 #include "process_tap_dance.h"
 
+#ifdef PRINTING_ENABLE
+       #include "process_printer.h"
+#endif
+
 #define SEND_STRING(str) send_string(PSTR(str))
 void send_string(const char *str);
 
@@ -106,8 +110,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);
+
 
 void led_set_user(uint8_t usb_led);
 void led_set_kb(uint8_t usb_led);
 
+void api_send_unicode(uint32_t unicode);
+
 #endif
index d550c58660610540539688c28ef59229fa9eedb5..625971e0fe616d33dab4211a0df12902d169e37c 100644 (file)
@@ -69,11 +69,12 @@ const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {100, 50, 20};
 
 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 +125,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 +142,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 +174,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 +183,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) {
@@ -220,7 +234,7 @@ 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) {
@@ -230,7 +244,7 @@ void rgblight_mode(uint8_t mode) {
     // MODE 15-20, snake
     // MODE 21-23, knight
 
-    #if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
+    #ifdef RGBLIGHT_ANIMATIONS
       rgblight_timer_enable();
     #endif
   }
@@ -244,7 +258,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 +266,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 +328,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;
@@ -351,66 +372,84 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) {
 
 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);
+    }
   }
 }
 
@@ -449,7 +488,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 +525,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 +545,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 +564,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]);
       }
     }
   }
index 17f04ffcf288304eacdf2ebfa65ff8cf2c163370..aa1d026e0e6e100c5ab7eef8d83cfc0d8725b6df 100644 (file)
@@ -1,8 +1,7 @@
 #ifndef RGBLIGHT_H
 #define RGBLIGHT_H
 
-
-#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
+#ifdef RGBLIGHT_ANIMATIONS
        #define RGBLIGHT_MODES 23
 #else
        #define RGBLIGHT_MODES 1
@@ -34,6 +33,7 @@
 #endif
 
 #define RGBLED_TIMER_TOP F_CPU/(256*64)
+// #define RGBLED_TIMER_TOP 0xFF10
 
 #include <stdint.h>
 #include <stdbool.h>
@@ -61,9 +61,11 @@ 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_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 +80,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);
index 4eed2c776beac220020b70345d579cb49fdfe369..be15108329262d67d673fc51fdbde0e29647fd9e 100644 (file)
--- a/readme.md
+++ b/readme.md
@@ -241,6 +241,7 @@ You can also add extra options at the end of the make command line, after the ta
 * `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)
+* `make EXTRAFLAGS=-E` - Preprocess the code without doing any compiling (useful if you are trying to debug #define commands)
 
 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.
 
@@ -347,6 +348,10 @@ This allows you output audio on the C6 pin (needs abstracting). See the [audio s
 
 Use this to debug changes to variable values, see the [tracing variables](#tracing-variables) section for more information.
 
+`API_SYSEX_ENABLE`
+
+This enables using the Quantum SYSEX API to send strings (somewhere?)
+
 ### 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.
@@ -910,7 +915,33 @@ In `quantum/keymap_extras/`, you'll see various language files - these work the
 
 ## 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.
+There are three Unicode keymap definition method available in QMK:
+
+### UNICODE_ENABLE
+
+Supports Unicode input up to 0xFFFF. The keycode function is `UC(n)` in
+keymap file, where *n* is a 4 digit hexadecimal.
+
+### UNICODEMAP_ENABLE
+
+Supports Unicode up to 0xFFFFFFFF. You need to maintain a separate mapping
+table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file.
+The keycode function is `X(n)` where *n* is the array index of the mapping
+table.
+
+### UCIS_ENABLE
+
+TBD
+
+Unicode input in QMK works by inputing a sequence of characters to the OS,
+sort of like macro. Unfortunately, each OS has different ideas on how Unicode is inputted.
+
+This is the current list of Unicode input method in QMK:
+
+* UC_OSX: MacOS Unicode Hex Input support. Works only up to 0xFFFF. Disabled by default. To enable: go to System Preferences -> Keyboard -> Input Sources, and enable Unicode Hex.
+* UC_LNX: Unicode input method under Linux. Works up to 0xFFFFF. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else.
+* UC_WIN: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead.
+* UC_WINC: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows.
 
 ## Backlight Breathing
 
@@ -1135,12 +1166,12 @@ For this mod, you need an unused pin wiring to DI of WS2812 strip. After wiring
 
     RGBLIGHT_ENABLE = yes
 
-In order to use the underglow timer functions, you need to have `#define RGBLIGHT_TIMER` in your `config.h`, and have audio disabled (`AUDIO_ENABLE = no` in your Makefile).
+In order to use the underglow animation functions, you need to have `#define RGBLIGHT_ANIMATIONS` in your `config.h`.
 
 Please add the following options into your config.h, and set them up according your hardware configuration. These settings are for the `F4` pin by default:
 
     #define RGB_DI_PIN F4     // The pin your RGB strip is wired to
-    #define RGBLIGHT_TIMER    // Require for fancier stuff (not compatible with audio)
+    #define RGBLIGHT_ANIMATIONS    // Require for fancier stuff (not compatible with audio)
     #define RGBLED_NUM 14     // Number of LEDs
     #define RGBLIGHT_HUE_STEP 10
     #define RGBLIGHT_SAT_STEP 17
@@ -1156,20 +1187,165 @@ The firmware supports 5 different light effects, and the color (hue, saturation,
 
 Please note the USB port can only supply a limited amount of power to the keyboard (500mA by standard, however, modern computer and most usb hubs can provide 700+mA.). According to the data of NeoPixel from Adafruit, 30 WS2812 LEDs require a 5V 1A power supply, LEDs used in this mod should not more than 20.
 
+## PS/2 Mouse Support
+
+Its possible to hook up a PS/2 mouse (for example touchpads or trackpoints) to your keyboard as a composite device.
+
+Then, decide whether to use USART (best), interrupts (better) or busywait (not recommended), and enable the relevant option.
+
+### Busywait version
+
+Note: This is not recommended, you may encounter jerky movement or unsent inputs. Please use interrupt or USART version if possible.
+
+In rules.mk:
+
+```
+PS2_MOUSE_ENABLE = yes
+PS2_USE_BUSYWAIT = yes
+```
+
+In your keyboard config.h:
+
+```
+#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
+```
+
+### Interrupt version
+
+The following example uses D2 for clock and D5 for data. You can use any INT or PCINT pin for clock, and any pin for data.
+
+In rules.mk:
+
+```
+PS2_MOUSE_ENABLE = yes
+PS2_USE_INT = yes
+```
+
+In your keyboard config.h:
+
+```
+#ifdef PS2_USE_INT
+#define PS2_CLOCK_PORT  PORTD
+#define PS2_CLOCK_PIN   PIND
+#define PS2_CLOCK_DDR   DDRD
+#define PS2_CLOCK_BIT   2
+#define PS2_DATA_PORT   PORTD
+#define PS2_DATA_PIN    PIND
+#define PS2_DATA_DDR    DDRD
+#define PS2_DATA_BIT    5
+
+#define PS2_INT_INIT()  do {    \
+    EICRA |= ((1<<ISC21) |      \
+              (0<<ISC20));      \
+} while (0)
+#define PS2_INT_ON()  do {      \
+    EIMSK |= (1<<INT2);         \
+} while (0)
+#define PS2_INT_OFF() do {      \
+    EIMSK &= ~(1<<INT2);        \
+} while (0)
+#define PS2_INT_VECT   INT2_vect
+#endif
+```
+
+### USART version
+
+To use USART on the ATMega32u4, you have to use PD5 for clock and PD2 for data. If one of those are unavailable, you need to use interrupt version.
+
+In rules.mk:
+
+```
+PS2_MOUSE_ENABLE = yes
+PS2_USE_USART = yes
+```
+
+In your keyboard config.h:
+
+```
+#ifdef PS2_USE_USART
+#define PS2_CLOCK_PORT  PORTD
+#define PS2_CLOCK_PIN   PIND
+#define PS2_CLOCK_DDR   DDRD
+#define PS2_CLOCK_BIT   5
+#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<<PS2_CLOCK_BIT);   \
+    PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT);     \
+    UCSR1C = ((1 << UMSEL10) |  \
+              (3 << UPM10)   |  \
+              (0 << USBS1)   |  \
+              (3 << UCSZ10)  |  \
+              (0 << UCPOL1));   \
+    UCSR1A = 0;                 \
+    UBRR1H = 0;                 \
+    UBRR1L = 0;                 \
+} while (0)
+#define PS2_USART_RX_INT_ON() do {  \
+    UCSR1B = ((1 << RXCIE1) |       \
+              (1 << RXEN1));        \
+} while (0)
+#define PS2_USART_RX_POLL_ON() do { \
+    UCSR1B = (1 << RXEN1);          \
+} while (0)
+#define PS2_USART_OFF() do {    \
+    UCSR1C = 0;                 \
+    UCSR1B &= ~((1 << RXEN1) |  \
+                (1 << TXEN1));  \
+} while (0)
+#define PS2_USART_RX_READY      (UCSR1A & (1<<RXC1))
+#define PS2_USART_RX_DATA       UDR1
+#define PS2_USART_ERROR         (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1)))
+#define PS2_USART_RX_VECT       USART1_RX_vect
+#endif
+#endif
+#endif
+```
+
 ## Safety Considerations
 
 You probably don't want to "brick" your keyboard, making it impossible
 to rewrite firmware onto it.  Here are some of the parameters to show
 what things are (and likely aren't) too risky.
 
-- If a keyboard map does not include RESET, then, to get into DFU
+- If your keyboard map does not include RESET, then, to get into DFU
   mode, you will need to press the reset button on the PCB, which
-  requires unscrewing some bits.
+  requires unscrewing the bottom.
 - Messing with tmk_core / common files might make the keyboard
   inoperable
 - Too large a .hex file is trouble; `make dfu` will erase the block,
   test the size (oops, wrong order!), which errors out, failing to
-  flash the keyboard
+  flash the keyboard, leaving it in DFU mode.
+  - To this end, note that the maximum .hex file size on Planck is
+    7000h (28672 decimal)
+```Linking: .build/planck_rev4_cbbrowne.elf                                                            [OK]
+Creating load file for Flash: .build/planck_rev4_cbbrowne.hex                                       [OK]
+
+Size after:
+   text    data     bss     dec     hex filename
+      0   22396       0   22396    577c planck_rev4_cbbrowne.hex
+```
+  - The above file is of size 22396/577ch, which is less than
+    28672/7000h
+  - As long as you have a suitable alternative .hex file around, you
+    can retry, loading that one
+  - Some of the options you might specify in your keyboard's Makefile
+    consume extra memory; watch out for BOOTMAGIC_ENABLE,
+    MOUSEKEY_ENABLE, EXTRAKEY_ENABLE, CONSOLE_ENABLE, API_SYSEX_ENABLE
 - DFU tools do /not/ allow you to write into the bootloader (unless
   you throw in extra fruitsalad of options), so there is little risk
   there.
index f826a7b540b87da494a7d18fa74629523b813ecb..c32a12bb6fd94686487397d22dbd12d60d6e3df7 100644 (file)
@@ -81,6 +81,10 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
     TMK_COMMON_DEFS += -DBACKLIGHT_ENABLE
 endif
 
+ifeq ($(strip $(ADAFRUIT_BLE_ENABLE)), yes)
+    TMK_COMMON_DEFS += -DADAFRUIT_BLE_ENABLE
+endif
+
 ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
     TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE
 endif
@@ -110,4 +114,4 @@ endif
 VPATH += $(TMK_PATH)/$(COMMON_DIR)
 ifeq ($(PLATFORM),CHIBIOS)
 VPATH += $(TMK_PATH)/$(COMMON_DIR)/chibios
-endif
\ No newline at end of file
+endif
index 8a7272bbc5298612bc935f51116d5e44973cddf2..0c81e8361213af2221c93883801e649ea364a5a7 100644 (file)
@@ -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 <avr/wdt.h>
  *          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
index 292b41c3a6c29fca9e4319114a0759473ea3e7e3..84af44488539e13867bd3dc9fa5fd2e567ca1025 100644 (file)
@@ -17,6 +17,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <avr/io.h>
 #include <avr/interrupt.h>
+#include <util/atomic.h>
 #include <stdint.h>
 #include "timer_avr.h"
 #include "timer.h"
@@ -24,7 +25,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 // 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)
 {
@@ -52,10 +53,9 @@ void timer_init(void)
 inline
 void timer_clear(void)
 {
-    uint8_t sreg = SREG;
-    cli();
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
     timer_count = 0;
-    SREG = sreg;
+  }
 }
 
 inline
@@ -63,10 +63,9 @@ uint16_t timer_read(void)
 {
     uint32_t t;
 
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+      t = timer_count;
+    }
 
     return (t & 0xFFFF);
 }
@@ -76,10 +75,9 @@ uint32_t timer_read32(void)
 {
     uint32_t t;
 
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+      t = timer_count;
+    }
 
     return t;
 }
@@ -89,10 +87,9 @@ uint16_t timer_elapsed(uint16_t last)
 {
     uint32_t t;
 
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+      t = timer_count;
+    }
 
     return TIMER_DIFF_16((t & 0xFFFF), last);
 }
@@ -102,10 +99,9 @@ uint32_t timer_elapsed32(uint32_t last)
 {
     uint32_t t;
 
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+      t = timer_count;
+    }
 
     return TIMER_DIFF_32(t, last);
 }
index c9e8fd3fd2ddbe3fce3afd0096f13f3cfab1f2c2..0e0ad2d1541d8e05dc7de68f64ce1eec4ec3b2a9 100644 (file)
@@ -36,9 +36,9 @@ void backlight_increase(void)
     if(backlight_config.level < BACKLIGHT_LEVELS)
     {
         backlight_config.level++;
-        backlight_config.enable = 1;
-        eeconfig_update_backlight(backlight_config.raw);
     }
+    backlight_config.enable = 1;
+    eeconfig_update_backlight(backlight_config.raw);
     dprintf("backlight increase: %u\n", backlight_config.level);
     backlight_set(backlight_config.level);
 }
index f3e1bf6234ec9e77868fb5f56aa91d72627db6b5..5f29bc0b4e84ec6ad0407cb63f3ba4b818749550 100644 (file)
@@ -379,11 +379,11 @@ static bool command_common(uint8_t code)
             debug_enable = !debug_enable;
             if (debug_enable) {
                 print("\ndebug: on\n");
-                debug_matrix   = true;
-                debug_keyboard = true;
-                debug_mouse    = true;
             } else {
                 print("\ndebug: off\n");
+                debug_matrix   = false;
+                debug_keyboard = false;
+                debug_mouse    = false;
             }
             break;
 
index edb9e5dd9c0f841b82e966608eda18d96b2ccd8e..588d1c0be8f304214b2a12e70f5870c6781039df 100644 (file)
@@ -20,7 +20,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <stdint.h>
 #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
index 5b1e3d19d01765a82db91614d7754ec887c72276..151d26cbc80a16fe78f5ddb6e5406704b633f0b7 100644 (file)
@@ -21,6 +21,10 @@ ifeq ($(strip $(MIDI_ENABLE)), yes)
        include $(TMK_PATH)/protocol/midi.mk
 endif
 
+ifeq ($(strip $(ADAFRUIT_BLE_ENABLE)), yes)
+       LUFA_SRC += $(LUFA_DIR)/adafruit_ble.cpp
+endif
+
 ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
        LUFA_SRC += $(LUFA_DIR)/bluetooth.c \
        $(TMK_DIR)/protocol/serial_uart.c
diff --git a/tmk_core/protocol/lufa/adafruit_ble.cpp b/tmk_core/protocol/lufa/adafruit_ble.cpp
new file mode 100644 (file)
index 0000000..37194e7
--- /dev/null
@@ -0,0 +1,805 @@
+#include "adafruit_ble.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <alloca.h>
+#include <util/delay.h>
+#include <util/atomic.h>
+#include "debug.h"
+#include "pincontrol.h"
+#include "timer.h"
+#include "action_util.h"
+#include "ringbuffer.hpp"
+#include <string.h>
+
+// 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)) {
+      uint8_t x, y, scroll, pan;
+    } mousemove;
+  };
+};
+
+// Items that we wish to send
+static RingBuffer<queue_item, 40> 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<uint16_t, 2> 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 (file)
index 0000000..351fd55
--- /dev/null
@@ -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 ADAFRUIT_BLE_ENABLE
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>
+
+#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 // ADAFRUIT_BLE_ENABLE
index 01c0e45b0b010a5ee3a68996fefd2e68e41b74a5..39d4824b6b9cb6a5b5c56394d720a021bb1cb70f 100644 (file)
@@ -51,6 +51,7 @@
 
 #include "descriptor.h"
 #include "lufa.h"
+#include "quantum.h"
 
 #ifdef NKRO_ENABLE
   #include "keycode_config.h"
     #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
+
 uint8_t keyboard_idle = 0;
 /* 0: Boot Protocol, 1: Report Protocol(default) */
 uint8_t keyboard_protocol = 1;
@@ -79,9 +88,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 */
@@ -709,7 +718,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 +778,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 +808,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();
 }
 
@@ -1039,11 +1048,16 @@ int main(void)
         }
         #endif
 
+        keyboard_task();
+
 #ifdef MIDI_ENABLE
         midi_device_process(&midi_device);
         // MIDI_Task();
 #endif
-        keyboard_task();
+        
+#if defined(RGBLIGHT_ANIMATIONS) & defined(RGBLIGHT_ENABLE)
+        rgblight_task();
+#endif
 
 #ifdef VIRTSER_ENABLE
         virtser_task();
@@ -1077,15 +1091,38 @@ 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));
+uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0};
+
+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(": ");
+        for (uint8_t place = 0; place < length; place++) {
+            // send_byte(*data);
+            midi_buffer[start + place] = *data;
+            if (*data == 0xF7) {
+                // SEND_STRING("\nRD: ");
+                // for (uint8_t i = 0; i < start + place + 1; i++){
+                //     send_byte(midi_buffer[i]);
+                // SEND_STRING(" ");
+                // }
+                uint8_t * decoded = malloc(sizeof(uint8_t) * (sysex_decoded_length(start + place - 4)));
+                uint16_t decode_length = sysex_decode(decoded, midi_buffer + 4, start + place - 4);
+                process_api(decode_length, decoded);
+            }
+            // SEND_STRING(" ");
+            data++;
+        }
+    #endif
 }
+
+
 #endif
index aad08d6407cfb3400835afee87f62aa393e79c37..b11854101d4e35dc95294106a02f182923724256 100644 (file)
@@ -68,8 +68,17 @@ typedef struct {
 } __attribute__ ((packed)) report_extra_t;
 
 #ifdef MIDI_ENABLE
-void MIDI_Task(void);
-MidiDevice midi_device;
+  void MIDI_Task(void);
+  MidiDevice midi_device;
+  #define MIDI_SYSEX_BUFFER 32 
+#endif
+
+#ifdef API_ENABLE
+  #include "api.h"
+#endif
+
+#ifdef API_SYSEX_ENABLE
+  #include "api_sysex.h"
 #endif
 
 // #if LUFA_VERSION_INTEGER < 0x120730
diff --git a/tmk_core/protocol/lufa/ringbuffer.hpp b/tmk_core/protocol/lufa/ringbuffer.hpp
new file mode 100644 (file)
index 0000000..70a3c48
--- /dev/null
@@ -0,0 +1,66 @@
+#pragma once
+// A simple ringbuffer holding Size elements of type T
+template <typename T, uint8_t Size>
+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);
+  }
+};
index c85ae42ff24b33e7968bfe0f5c261f27d4fa25ea..4855b23d3017a63670863864cc5bb81690aecff6 100644 (file)
@@ -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
index c3e8b3c1c3354753cc3ce12d902c6978caf8af16..82f6966e8ed7697011dd738c280f2f26c4f6bfc8 100644 (file)
@@ -26,6 +26,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "print.h"
 #include "debug.h"
 
+#ifndef PS2_INIT_DELAY
+#define PS2_INIT_DELAY 1000
+#endif
 
 static report_mouse_t mouse_report = {};
 
@@ -39,7 +42,7 @@ uint8_t ps2_mouse_init(void) {
 
     ps2_host_init();
 
-    _delay_ms(1000);    // wait for powering up
+    _delay_ms(PS2_INIT_DELAY);    // wait for powering up
 
     // send Reset
     rcv = ps2_host_send(0xFF);
index 7bdebbcf34f6bc0854a329e275d6f7e2cf58f3e0..005d1be61334496a405b087c2daffe332cc39b7f 100644 (file)
@@ -4,13 +4,13 @@
  * Ring buffer to store scan codes from keyboard
  *------------------------------------------------------------------*/
 #define RBUF_SIZE 32
+#include <util/atomic.h>
 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 */