From 17a3dbc1591b6cdd96076b94a9d3648c19f7e2ab Mon Sep 17 00:00:00 2001
From: Olivier <olivier@gid0.org>
Date: Sun, 3 Jul 2016 14:38:03 +0200
Subject: [PATCH 001/147] Integrate mouse keys into function layer, delete
 mouse layer.

---
 keyboards/ergodox_ez/keymaps/bepo/keymap.c | 64 +++++-----------------
 1 file changed, 13 insertions(+), 51 deletions(-)

diff --git a/keyboards/ergodox_ez/keymaps/bepo/keymap.c b/keyboards/ergodox_ez/keymaps/bepo/keymap.c
index 921a94d63a6..5c127ab78e3 100644
--- a/keyboards/ergodox_ez/keymaps/bepo/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/bepo/keymap.c
@@ -9,7 +9,6 @@
 #define AQWER 3 // alted qwerty compat layer
 #define FNAV 4 // function / navigation keys
 #define NUM 5 // numeric keypad keys
-#define MSE 6 // mouse keys
 
 #define KP_00 0
 #define CA_Fx 1
@@ -26,7 +25,7 @@ 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|
+ *   |QWERTY|      |LSuper| LCtrl|  LAlt|             |Escape|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
  *                                             |      |      | L_Num|      | CA_Fx|      |      |
  *                                             | Space|LShift|------|      |------|RShift|Enter |
@@ -40,7 +39,7 @@ 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),
+														KC_ESC,		KC_NO,
 																MO(NUM),
 												KC_SPC,		KC_LSHIFT,	MO(FNAV),
 // Right hand
@@ -63,7 +62,7 @@ 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|
+ *   | BEPO |      |LSuper| LCtrl|  LAlt|             |Escape|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
  *                                             |      |      | L_Num|      |      |      |      |
  *                                             | Space|LShift|------|      |------|RShift|Enter |
@@ -77,7 +76,7 @@ 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),
+														KC_ESC,		KC_NO,
 																MO(NUM),
 												KC_SPC,		MO(SQWER),	MO(FNAV),
 // Right hand
@@ -100,7 +99,7 @@ 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|
+ *   | BEPO |      |LSuper| LCtrl|  LAlt|             |Escape|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
  *                                             |      |      | L_Num|      |      |      |      |
  *                                             | Space|LShift|------|      |------|RShift|Enter |
@@ -114,7 +113,7 @@ 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),
-														KC_TRNS,	KC_TRNS,
+														KC_TRNS,	KC_NO,
 																KC_TRNS,
 												KC_TRNS,	KC_TRNS,	KC_TRNS,
 // Right hand
@@ -137,7 +136,7 @@ KC_TRNS,	KC_TRNS,	KC_TRNS),
  * |--------+------+------+------+------+------|  Tab |                                  | NumLo|------+------+------+------+------+--------|
  * |   e    |   \  |   {  |   }  |   .  |   ~  |      |                                  |      |   '  |   q  |   g  |   h  |   f  |   c    |
  * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
- *   | BEPO |      |LSuper| LCtrl|  LAlt|             |Escape| L_Mse|      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
+ *   | BEPO |      |LSuper| LCtrl|  LAlt|             |Escape|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
  *                                             |      |      | L_Num|      |      |      |      |
  *                                             |   _  |LShift|------|      |------|RShift|Enter |
@@ -151,7 +150,7 @@ 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),
+														KC_ESC,		KC_NO,
 																MO(NUM),
 												KC_UNDS,	MO(SQWER),	MO(FNAV),
 // Right hand
@@ -168,9 +167,9 @@ MO(FNAV),	MO(SQWER),	KC_ENTER),
  * ,--------------------------------------------------.                                  ,--------------------------------------------------.
  * |        |  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,8 +183,8 @@ 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,
@@ -236,44 +235,7 @@ KC_NO,		KC_NO,		KC_TRNS,	KC_TRNS,	KC_TRNS,
 								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|        |
- * |--------+------+------+------+------+------|      |                                  |      |------+------+------+------+------+--------|
- * |        |      |      |      |      |      |      |                                  |      |      |      |      |      |      |        |
- * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
- *   |      |      |      |      |      |             |      |      |      |      |      |             |      |      |      |      |      |
- *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
- *                                             |      |      |      |      |      |      |      |
- *                                             |      |      |------|      |------|      |      |
- *                                             |      |      |      |      |      |      |      |
- *                                             `--------------------'      `--------------------'
- */
-[MSE] = 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,
-// 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)
+KC_NO,		KC_TRNS,	KC_KP_ENTER)
 };
 
 const uint16_t PROGMEM fn_actions[] = {

From 9aceaaed4cbdf49c12db85cf3ff40a9e762558a6 Mon Sep 17 00:00:00 2001
From: Olivier <olivier@gid0.org>
Date: Sun, 3 Jul 2016 15:51:55 +0200
Subject: [PATCH 002/147] Replace the "Ctrl+Alt+Fx" macro I was using to switch
 terminals without moving hands by a numeric layer switch key like on the left
 half, for consistency.

---
 keyboards/ergodox_ez/keymaps/bepo/keymap.c | 54 +++++++++-------------
 1 file changed, 22 insertions(+), 32 deletions(-)

diff --git a/keyboards/ergodox_ez/keymaps/bepo/keymap.c b/keyboards/ergodox_ez/keymaps/bepo/keymap.c
index 5c127ab78e3..dd473579986 100644
--- a/keyboards/ergodox_ez/keymaps/bepo/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/bepo/keymap.c
@@ -11,7 +11,6 @@
 #define NUM 5 // numeric keypad keys
 
 #define KP_00 0
-#define CA_Fx 1
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 0: Base layer
@@ -27,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
  *   |QWERTY|      |LSuper| LCtrl|  LAlt|             |Escape|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
- *                                             |      |      | L_Num|      | CA_Fx|      |      |
+ *                                             |      |      | L_Num|      | L_Num|      |      |
  *                                             | Space|LShift|------|      |------|RShift|Enter |
  *                                             |      |      |L_FNav|      |L_FNav|      |      |
  *                                             `--------------------'      `--------------------'
@@ -39,7 +38,7 @@ 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,		KC_NO,
+														KC_ESC,		KC_TRNS,
 																MO(NUM),
 												KC_SPC,		KC_LSHIFT,	MO(FNAV),
 // Right hand
@@ -48,8 +47,8 @@ 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),
+KC_TRNS,	KC_INS,
+MO(NUM),
 MO(FNAV),	KC_RSHIFT,	KC_ENTER),
 /* Keymap 1: QWERTY system compatibility layer
  *
@@ -64,7 +63,7 @@ MO(FNAV),	KC_RSHIFT,	KC_ENTER),
  * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
  *   | BEPO |      |LSuper| LCtrl|  LAlt|             |Escape|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
- *                                             |      |      | L_Num|      |      |      |      |
+ *                                             |      |      | L_Num|      | L_Num|      |      |
  *                                             | Space|LShift|------|      |------|RShift|Enter |
  *                                             |      |      |L_FNav|      |L_FNav|      |      |
  *                                             `--------------------'      `--------------------'
@@ -76,7 +75,7 @@ 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,		KC_NO,
+														KC_ESC,		KC_TRNS,
 																MO(NUM),
 												KC_SPC,		MO(SQWER),	MO(FNAV),
 // Right hand
@@ -85,8 +84,8 @@ KC_TRNS,	KC_NO,		KC_LGUI,	KC_LCTL,	KC_LALT,
 						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,
-KC_TRNS,
+KC_TRNS,	KC_INS,
+MO(NUM),
 MO(FNAV),	MO(SQWER),	KC_ENTER),
 /* Keymap 2: QWERTY shifted system compatibility layer
  *
@@ -101,7 +100,7 @@ MO(FNAV),	MO(SQWER),	KC_ENTER),
  * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
  *   | BEPO |      |LSuper| LCtrl|  LAlt|             |Escape|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
- *                                             |      |      | L_Num|      |      |      |      |
+ *                                             |      |      | L_Num|      | L_Num|      |      |
  *                                             | Space|LShift|------|      |------|RShift|Enter |
  *                                             |      |      |L_FNav|      |L_FNav|      |      |
  *                                             `--------------------'      `--------------------'
@@ -113,7 +112,7 @@ 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),
-														KC_TRNS,	KC_NO,
+														KC_TRNS,	KC_TRNS,
 																KC_TRNS,
 												KC_TRNS,	KC_TRNS,	KC_TRNS,
 // Right hand
@@ -138,7 +137,7 @@ KC_TRNS,	KC_TRNS,	KC_TRNS),
  * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
  *   | BEPO |      |LSuper| LCtrl|  LAlt|             |Escape|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
- *                                             |      |      | L_Num|      |      |      |      |
+ *                                             |      |      | L_Num|      | L_Num|      |      |
  *                                             |   _  |LShift|------|      |------|RShift|Enter |
  *                                             |      |      |L_FNav|      |L_FNav|      |      |
  *                                             `--------------------'      `--------------------'
@@ -150,7 +149,7 @@ 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,		KC_NO,
+														KC_ESC,		KC_TRNS,
 																MO(NUM),
 												KC_UNDS,	MO(SQWER),	MO(FNAV),
 // Right hand
@@ -159,8 +158,8 @@ KC_TRNS,	KC_NO,		KC_LGUI,	KC_LCTL,	KC_LALT,
 						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_NO,		KC_INS,
-KC_TRNS,
+KC_TRNS,	KC_INS,
+MO(NUM),
 MO(FNAV),	MO(SQWER),	KC_ENTER),
 /* Keymap 4: function / navigation layer
  *
@@ -187,8 +186,8 @@ 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,
@@ -196,7 +195,7 @@ 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
@@ -224,18 +223,18 @@ KC_NO,		KC_NO,		KC_NO,		KC_NO,		KC_NO,		KC_NO,		KC_NO,
 KC_NO,		KC_NO,		KC_NO,		KC_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_TRNS,
 																KC_TRNS,
-												KC_NO,		KC_TRNS,	KC_NO,
+												KC_NO,		KC_TRNS,	KC_TRNS,
 // 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)
+KC_TRNS,	KC_TRNS,
+KC_TRNS,
+KC_TRNS,	KC_TRNS,	KC_KP_ENTER)
 };
 
 const uint16_t PROGMEM fn_actions[] = {
@@ -251,15 +250,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;
 };

From 6d195dc60c696d2e07bfe7d098b00598f36fe5a6 Mon Sep 17 00:00:00 2001
From: Olivier <olivier@gid0.org>
Date: Sun, 3 Jul 2016 16:27:08 +0200
Subject: [PATCH 003/147] Add a Makefile for the keymap to disable command mode
 (to keep the keyboard from going into command mode when both Shift keys are
 hold at the same time) and to allow issuing a simple "make" in the keymap
 folder to compile it.

---
 keyboards/ergodox_ez/keymaps/bepo/Makefile | 9 +++++++++
 1 file changed, 9 insertions(+)
 create mode 100644 keyboards/ergodox_ez/keymaps/bepo/Makefile

diff --git a/keyboards/ergodox_ez/keymaps/bepo/Makefile b/keyboards/ergodox_ez/keymaps/bepo/Makefile
new file mode 100644
index 00000000000..b673c5ce52c
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/bepo/Makefile
@@ -0,0 +1,9 @@
+# Having a file like this allows you to override Makefile definitions
+# for your own particular keymap
+
+SLEEP_LED_ENABLE = no  # Breathing sleep LED during USB suspend
+COMMAND_ENABLE   = no  # Commands for debug and configuration
+
+ifndef QUANTUM_DIR
+	include ../../../../Makefile
+endif

From 82edc37238a0f4239da0a6eee74d62773362a2d2 Mon Sep 17 00:00:00 2001
From: Olivier <olivier@gid0.org>
Date: Sun, 3 Jul 2016 16:44:57 +0200
Subject: [PATCH 004/147] Move Escape and Insert keys, Escape is now easier to
 reach (useful for vi). Change the layer switching used to keep a bepo layout
 on US keyboards.

---
 keyboards/ergodox_ez/keymaps/bepo/bepo.png  | Bin 79747 -> 80838 bytes
 keyboards/ergodox_ez/keymaps/bepo/keymap.c  |  28 ++++++++++----------
 keyboards/ergodox_ez/keymaps/bepo/readme.md |   2 +-
 3 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/keyboards/ergodox_ez/keymaps/bepo/bepo.png b/keyboards/ergodox_ez/keymaps/bepo/bepo.png
index 3df7aa609f6300a48c36425320323935aeb435e3..bde2e2cfacb326e7934c5743aea2f303c8a42527 100644
GIT binary patch
literal 80838
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

literal 79747
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

diff --git a/keyboards/ergodox_ez/keymaps/bepo/keymap.c b/keyboards/ergodox_ez/keymaps/bepo/keymap.c
index dd473579986..7c30d587887 100644
--- a/keyboards/ergodox_ez/keymaps/bepo/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/bepo/keymap.c
@@ -24,7 +24,7 @@ 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|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
+ *   |Escape|Insert|LSuper| LCtrl|  LAlt|             | BEPO |QWERTY|      |AZERTY| BEPO |             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
  *                                             |      |      | L_Num|      | L_Num|      |      |
  *                                             | Space|LShift|------|      |------|RShift|Enter |
@@ -37,8 +37,8 @@ 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,		KC_TRNS,
+KC_ESC,		KC_INS,		KC_LGUI,	KC_LCTL,	KC_LALT,
+														DF(BASE),	DF(QWER),
 																MO(NUM),
 												KC_SPC,		KC_LSHIFT,	MO(FNAV),
 // Right hand
@@ -47,7 +47,7 @@ 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_TRNS,	KC_INS,
+DF(QWER),	DF(BASE),
 MO(NUM),
 MO(FNAV),	KC_RSHIFT,	KC_ENTER),
 /* Keymap 1: QWERTY system compatibility layer
@@ -61,7 +61,7 @@ MO(FNAV),	KC_RSHIFT,	KC_ENTER),
  * |--------+------+------+------+------+------|  Tab |                                  | NumLo|------+------+------+------+------+--------|
  * |   e    |   a  |   y  |   x  |   .  |   k  |      |                                  |      |   '  |   q  |   g  |   h  |   f  |   c    |
  * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
- *   | BEPO |      |LSuper| LCtrl|  LAlt|             |Escape|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
+ *   |Escape|Insert|LSuper| LCtrl|  LAlt|             | BEPO |QWERTY|      |AZERTY| BEPO |             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
  *                                             |      |      | L_Num|      | L_Num|      |      |
  *                                             | Space|LShift|------|      |------|RShift|Enter |
@@ -74,8 +74,8 @@ 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,		KC_TRNS,
+KC_ESC,		KC_INS,		KC_LGUI,	KC_LCTL,	KC_LALT,
+														DF(BASE),	DF(QWER),
 																MO(NUM),
 												KC_SPC,		MO(SQWER),	MO(FNAV),
 // Right hand
@@ -84,7 +84,7 @@ KC_TRNS,	KC_NO,		KC_LGUI,	KC_LCTL,	KC_LALT,
 						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_TRNS,	KC_INS,
+DF(QWER),	DF(BASE),
 MO(NUM),
 MO(FNAV),	MO(SQWER),	KC_ENTER),
 /* Keymap 2: QWERTY shifted system compatibility layer
@@ -98,7 +98,7 @@ MO(FNAV),	MO(SQWER),	KC_ENTER),
  * |--------+------+------+------+------+------|  Tab |                                  | NumLo|------+------+------+------+------+--------|
  * |   E    |   A  |   Y  |   X  |   :  |   K  |      |                                  |      |   ?  |   Q  |   G  |   H  |   F  |   C    |
  * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
- *   | BEPO |      |LSuper| LCtrl|  LAlt|             |Escape|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
+ *   |Escape|Insert|LSuper| LCtrl|  LAlt|             | BEPO |QWERTY|      |AZERTY| BEPO |             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
  *                                             |      |      | L_Num|      | L_Num|      |      |
  *                                             | Space|LShift|------|      |------|RShift|Enter |
@@ -111,7 +111,7 @@ 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,
@@ -135,7 +135,7 @@ KC_TRNS,	KC_TRNS,	KC_TRNS),
  * |--------+------+------+------+------+------|  Tab |                                  | NumLo|------+------+------+------+------+--------|
  * |   e    |   \  |   {  |   }  |   .  |   ~  |      |                                  |      |   '  |   q  |   g  |   h  |   f  |   c    |
  * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
- *   | BEPO |      |LSuper| LCtrl|  LAlt|             |Escape|      |      |      |Insert|             | AltGr| RCtrl|RSuper|PrntSc| Pause|
+ *   |Escape|Insert|LSuper| LCtrl|  LAlt|             | BEPO |QWERTY|      |AZERTY| BEPO |             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
  *                                             |      |      | L_Num|      | L_Num|      |      |
  *                                             |   _  |LShift|------|      |------|RShift|Enter |
@@ -148,8 +148,8 @@ 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,		KC_TRNS,
+KC_ESC,		KC_INS,		KC_LGUI,	KC_LCTL,	KC_LALT,
+														KC_TRNS,	KC_TRNS,
 																MO(NUM),
 												KC_UNDS,	MO(SQWER),	MO(FNAV),
 // Right hand
@@ -158,7 +158,7 @@ KC_TRNS,	KC_NO,		KC_LGUI,	KC_LCTL,	KC_LALT,
 						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_INS,
+KC_TRNS,	KC_TRNS,
 MO(NUM),
 MO(FNAV),	MO(SQWER),	KC_ENTER),
 /* Keymap 4: function / navigation layer
diff --git a/keyboards/ergodox_ez/keymaps/bepo/readme.md b/keyboards/ergodox_ez/keymaps/bepo/readme.md
index 4a18cd80ff8..207b6757158 100644
--- a/keyboards/ergodox_ez/keymaps/bepo/readme.md
+++ b/keyboards/ergodox_ez/keymaps/bepo/readme.md
@@ -27,7 +27,7 @@ Touche de fonction permettant de saisir les touches F1 à F12, les touches F1 à
 
 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.
 
 TODO : couche de compatibilité pour utiliser la disposition BÉPO sur un système configuré pour un clavier AZERTY.
 

From 4cfb262faab653247f4d66d44bf5f3339d82bd36 Mon Sep 17 00:00:00 2001
From: Olivier <olivier@gid0.org>
Date: Mon, 4 Jul 2016 01:10:40 +0200
Subject: [PATCH 005/147] Spellchecking.

---
 readme.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/readme.md b/readme.md
index c24d951d8df..02207702c40 100644
--- a/readme.md
+++ b/readme.md
@@ -570,7 +570,7 @@ Enable the backlight from the Makefile.
 
 All of these functions are available in the `*_kb()` or `*_user()` variety. `kb` ones should only be used in the `<keyboard>/<keyboard>.c` file, and `user` ones should only be used in the `keymap.c`. The keyboard ones call the user ones - it's necessary to keep these calls to allow the keymap functions to work correctly.
 
-## `void martix_init_*(void)`
+## `void matrix_init_*(void)`
 
 This function gets called when the matrix is initiated, and can contain start-up code for your keyboard/keymap.
 

From b5172e3afab515b1f93cd09c51b4c6c1b5174dc7 Mon Sep 17 00:00:00 2001
From: Olivier <olivier@gid0.org>
Date: Sat, 20 Aug 2016 18:19:03 +0200
Subject: [PATCH 006/147] Rename file following upstream folder rename.

---
 keyboards/{ergodox_ez => ergodox}/keymaps/bepo/Makefile | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename keyboards/{ergodox_ez => ergodox}/keymaps/bepo/Makefile (100%)

diff --git a/keyboards/ergodox_ez/keymaps/bepo/Makefile b/keyboards/ergodox/keymaps/bepo/Makefile
similarity index 100%
rename from keyboards/ergodox_ez/keymaps/bepo/Makefile
rename to keyboards/ergodox/keymaps/bepo/Makefile

From 67dfde765f5bc192aad8a7a7586b10a661ae52d1 Mon Sep 17 00:00:00 2001
From: Didier Chagniot <didierchagniot@googlemail.com>
Date: Fri, 9 Sep 2016 21:42:35 +0200
Subject: [PATCH 007/147] typing with it

---
 .../ergodox/keymaps/dvorak_emacs/keymap.c     | 165 ++++++++++++++++++
 1 file changed, 165 insertions(+)
 create mode 100755 keyboards/ergodox/keymaps/dvorak_emacs/keymap.c

diff --git a/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c b/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c
new file mode 100755
index 00000000000..4cb11a56f4f
--- /dev/null
+++ b/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c
@@ -0,0 +1,165 @@
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+
+/******************************************************************************************
+ * DVORAK LAYOUT (see http://djelibeibi.unex.es/dvorak/)
+ * Layer 1: auxiliary keys
+ * Layer 2: full qwerty layout
+ *****************************************************************************************/
+
+// LAYERS
+#define BASE    0 // dvorak layout (default)
+#define AUX     1 // auxiliary keys
+
+// MACROS
+/* #define OBRACE 0 // key { or shift */
+/* #define CBRACE 1 // key } or shift */
+/* #define OBRACK 2 // key [ or left alt */
+/* #define CBRACK 3 // key ] or left alt */
+/* #define CAPS   4 // caps lock */
+
+// LEDS
+#define USB_LED_NUM_LOCK    0
+#define USB_LED_CAPS_LOCK   1
+#define USB_LED_SCROLL_LOCK 2
+#define USB_LED_COMPOSE     3
+#define USB_LED_KANA        4
+
+// TIMERS
+#define KEY_TAP_FAST 85
+#define KEY_TAP_SLOW 95
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Base layer
+ * Keys with double values (like Esc/Ctrl) correspond to the 'tapped' key and the 'held' key, respectively
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |   1  |   2  |   3  |   4  |   5  |  Esc |           |  Esc |   6  |   7  |   8  |   9  |   0  | = / +  |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |   ~    |" / ' |, / < |. / > |   P  |   Y  |   [  |           |   ]  |   F  |   G  |   C  |   H  |   L  | / / ?  |
+ * |--------+------+------+------+------+------|   {  |           |   }  |------+------+------+------+------+--------|
+ * |  Tab   |   A  |   O  |   E  |U/LSft| I/L1 |------|           |------|  D/L1|R/RSft|   T  |   N  |   S  | - / _  |
+ * |--------+------+------+------+------+------| LGUI |           | LGUI |------+------+------+------+------+--------|
+ * | {/LSft |; / : |   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |   Z  | }/RSft |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      | ~L1  |                                       | ~L1  |      |      | \ / ||        |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        | HOME |  END |       | LEFT | RIGHT|
+ *                                 ,------|------|------|       |------+--------+------.
+ *                                 | BSPC |  DEL | PGUP |       |  UP  | SPACE  |RETURN|
+ *                                 |  /   |  /   |------|       |------|   /    |  /   |
+ *                                 | LCTL | LALT |PGDWN |       | DOWN | LALT   | LCTL |
+ *                                 `--------------------'       `----------------------'
+ *
+ */
+[BASE] = KEYMAP(
+        // left hand
+        KC_NO,          KC_1,     KC_2,   KC_3,   KC_4,          KC_5,           KC_ESC,
+        KC_TILD,        KC_QUOTE, KC_COMM,KC_DOT, KC_P,          KC_Y,           KC_LBRACKET,
+        KC_TAB,         KC_A,     KC_O,   KC_E,   SFT_T(KC_U),   LT(AUX, KC_I),
+        SFT_T(KC_LBRC), KC_SCLN,  KC_Q,   KC_J,   KC_K,          KC_X,           KC_LGUI,
+        KC_NO,          KC_NO,    KC_NO,  KC_NO,  MO(AUX),
+                                                           KC_HOME, KC_END,
+                                                                    KC_PGUP,
+                                      CTL_T(KC_BSPC), ALT_T(KC_DEL), KC_PGDN,
+        // right hand
+                    KC_ESC,          KC_6,           KC_7,         KC_8,   KC_9,   KC_0,   KC_EQL,
+                    KC_RBRACKET,     KC_F,           KC_G,         KC_C,   KC_R,   KC_L,   KC_SLASH,
+                                     LT(AUX, KC_D),  SFT_T(KC_H),  KC_T,   KC_N,   KC_S,   KC_MINUS,
+                    KC_LGUI,         KC_B,           KC_M,         KC_W,   KC_V,   KC_Z,   SFT_T(KC_RBRC),
+                                                                 MO(AUX), KC_NO,   KC_NO,  KC_BSLASH, KC_NO,
+        KC_LEFT, KC_RIGHT,
+        KC_UP,
+        KC_DOWN, ALT_T(KC_ENT), CTL_T(KC_SPC)
+    ),
+/* Keymap 1: Aux layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |  VolUp |      |      |      |      |      | SLEEP            | PWR  |      |      |      |      |      |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |  VolDn |  F1  |  F2  |  F3  |  F4  |      |      |           |      |      |   7  |   8  |   9  |   *  |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |  F5  |  F6  |  F7  |  F8  | TRANS|------|           |------|TRANS |   4  |   5  |   6  |   +  |        |
+ * |--------+------+------+------+------+------|      |           |PSCR  |------+------+------+------+------+--------|
+ * |  TRANS |  F9  |  F10 |  F11 |  F12 |      |      |           |      |      |   1  |   2  |   3  |   /  |  TRANS |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |CTRL-S|CTRL-Z|CTRL-X|CTRL-C| TRANS|                                       | TRANS|    . |   0  |   =  |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        | TRANS| TRANS|       | TRANS| TRANS|
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      | TRANS|       | TRANS|      |      |
+ *                                 |TRANS |TRANS |------|       |------| TRANS| TRANS|
+ *                                 |      |      | TRANS|       | TRANS|      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+[AUX] = KEYMAP(
+       // left hand
+       KC_VOLU, KC_NO, KC_NO,  KC_NO,  KC_NO,  KC_NO,   KC_SLEP,
+       KC_VOLD, KC_F1, KC_F2,  KC_F3,  KC_F4,  KC_NO,   KC_NO,
+       KC_NO  , KC_F5, KC_F6,  KC_F7,  KC_F8,  KC_TRNS,
+       KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO,   KC_NO,
+       LCTL(KC_S), LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), KC_TRNS,
+                                                            KC_TRNS  , KC_TRNS,
+                                                                     KC_TRNS,
+                                                KC_TRNS, KC_TRNS, KC_TRNS,
+       // right hand
+            KC_PWR,  KC_NO,   KC_NO,  KC_NO,  KC_NO,   KC_NO,   KC_NO,
+            KC_NO,   KC_NO,   KC_7,   KC_8,   KC_9,    KC_PAST, KC_NO,
+                     KC_TRNS, KC_4,   KC_5,   KC_6,    KC_PPLS, KC_NO,
+            KC_PSCR, KC_NO,   KC_1,   KC_2,   KC_3,    KC_PSLS, KC_TRNS,
+                              KC_TRNS,KC_DOT, KC_0,    KC_PEQL, KC_NO,
+       KC_TRNS  , KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_LAYER_TAP_TOGGLE(AUX)                // FN1 - Momentary Layer 1 (Aux)
+};
+
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+        if (record->event.pressed) {
+          register_code(KC_RSFT);
+        } else {
+          unregister_code(KC_RSFT);
+        }
+        break;
+      }
+    return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+    uint8_t layer = biton32(layer_state);
+
+    ergodox_board_led_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
+    switch (layer) {
+        case 1:
+            ergodox_right_led_1_on();
+            break;
+        case 2:
+            ergodox_right_led_2_on();
+            break;
+        default:
+            // none
+            break;
+    }
+}

From 83b6dd0cd6f055d99d3a11690ccc81b908a0aa4c Mon Sep 17 00:00:00 2001
From: Didier Chagniot <didierchagniot@googlemail.com>
Date: Sat, 10 Sep 2016 00:20:21 +0200
Subject: [PATCH 008/147] readme.md updated

---
 .../ergodox/keymaps/dvorak_emacs/readme.md    | 70 +++++++++++++++++++
 1 file changed, 70 insertions(+)
 create mode 100644 keyboards/ergodox/keymaps/dvorak_emacs/readme.md

diff --git a/keyboards/ergodox/keymaps/dvorak_emacs/readme.md b/keyboards/ergodox/keymaps/dvorak_emacs/readme.md
new file mode 100644
index 00000000000..0578f1e2570
--- /dev/null
+++ b/keyboards/ergodox/keymaps/dvorak_emacs/readme.md
@@ -0,0 +1,70 @@
+# Ergodox Dvorak Layout with emacs binding in mind
+ * Control & Alt key on the thumbs (activated if pressed with another key).
+ * In the same way, "I" 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

From b8679bbe045a2285d6ab6bbc420121b26f516b9a Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Wed, 5 Oct 2016 20:41:33 -0400
Subject: [PATCH 009/147] RGBW lights

---
 keyboards/ergodox/config.h              |  2 ++
 keyboards/ergodox/keymaps/jack/Makefile |  5 +++++
 keyboards/ergodox/keymaps/jack/config.h | 14 ++++++++++++++
 keyboards/ergodox/keymaps/jack/keymap.c |  4 ++--
 quantum/rgblight.c                      | 18 +++++++++++++++---
 quantum/rgblight.h                      |  1 +
 6 files changed, 39 insertions(+), 5 deletions(-)
 create mode 100644 keyboards/ergodox/keymaps/jack/Makefile
 create mode 100644 keyboards/ergodox/keymaps/jack/config.h

diff --git a/keyboards/ergodox/config.h b/keyboards/ergodox/config.h
index edc60caae12..049c707a561 100644
--- a/keyboards/ergodox/config.h
+++ b/keyboards/ergodox/config.h
@@ -1,6 +1,8 @@
 #ifndef KEYBOARDS_ERGODOX_CONFIG_H_
 #define KEYBOARDS_ERGODOX_CONFIG_H_
 
+#include "config_common.h"
+
 #define MOUSEKEY_DELAY          100
 #define MOUSEKEY_INTERVAL       20
 #define MOUSEKEY_MAX_SPEED      3
diff --git a/keyboards/ergodox/keymaps/jack/Makefile b/keyboards/ergodox/keymaps/jack/Makefile
new file mode 100644
index 00000000000..1e576127880
--- /dev/null
+++ b/keyboards/ergodox/keymaps/jack/Makefile
@@ -0,0 +1,5 @@
+RGBLIGHT_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
index 00000000000..01ccfb3a2ac
--- /dev/null
+++ b/keyboards/ergodox/keymaps/jack/config.h
@@ -0,0 +1,14 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "../../config.h"
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN D7
+// #define RGBLIGHT_TIMER
+#define RGBLED_NUM 20     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+
+#endif
\ No newline at end of file
diff --git a/keyboards/ergodox/keymaps/jack/keymap.c b/keyboards/ergodox/keymaps/jack/keymap.c
index dda253fa453..1dd5a76187f 100644
--- a/keyboards/ergodox/keymaps/jack/keymap.c
+++ b/keyboards/ergodox/keymaps/jack/keymap.c
@@ -24,7 +24,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                         KC_H,   KC_J,   KC_K,   KC_L,   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,
+             RGB_TOG,        RGB_HUI,
              KC_PGUP,
              KC_PGDN, KC_SPC,KC_SPC
     ),
@@ -90,7 +90,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 
 // Runs just one time when the keyboard initializes.
 void matrix_init_user(void) {
-
+  
 };
 
 // Runs constantly in the background, in a loop.
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index f82e3ec5589..801ca1d0d90 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -50,7 +50,11 @@ 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];
+#ifdef RGBW
+  struct cRGBW led[RGBLED_NUM];
+#else
+  struct cRGB led[RGBLED_NUM];
+#endif
 uint8_t rgblight_inited = 0;
 
 
@@ -334,14 +338,22 @@ 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
   }
 }
 
diff --git a/quantum/rgblight.h b/quantum/rgblight.h
index def26c428cd..2a712d8be43 100644
--- a/quantum/rgblight.h
+++ b/quantum/rgblight.h
@@ -1,6 +1,7 @@
 #ifndef RGBLIGHT_H
 #define RGBLIGHT_H
 
+#define RGBW 1
 
 #if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
 	#define RGBLIGHT_MODES 23

From 99ca59baf8d508f3221df5dd89158241925aca14 Mon Sep 17 00:00:00 2001
From: cbbrowne <cbbrowne@cbbrowne.tor.int-afilias.info>
Date: Wed, 12 Oct 2016 12:03:54 -0400
Subject: [PATCH 010/147] I keep mis-using UPPER|LOWER/SLASH, and getting
 RESET. With RESET shifted to the UPPER+LOWER layer, it is now time to change
 that key to Alt-Slash, which, in Emacs, does automatic word completion

---
 keyboards/planck/keymaps/cbbrowne/keymap.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/keyboards/planck/keymaps/cbbrowne/keymap.c b/keyboards/planck/keymaps/cbbrowne/keymap.c
index 7f1601af75d..4742ca5c06a 100644
--- a/keyboards/planck/keymaps/cbbrowne/keymap.c
+++ b/keyboards/planck/keymaps/cbbrowne/keymap.c
@@ -94,6 +94,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,13 +110,13 @@ 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_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  QWERTY,  KEYPAD,  KEYPAD,  ALTSLASH,_______},
   {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
 },
 [_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,   _______},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  QWERTY,  KEYPAD,  KEYPAD, ALTSLASH,   _______},
   {_______, KEYPAD, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
     },
 [_KEYPAD] = { /* Key Pad */

From 5f91fb413624781ac79db641549b9e08753c04b5 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Sun, 16 Oct 2016 16:03:33 -0400
Subject: [PATCH 011/147] working with power limit

---
 build_keyboard.mk                       |   6 ++
 keyboards/ergodox/keymaps/jack/config.h |   2 +-
 keyboards/ergodox/keymaps/jack/keymap.c |   4 +-
 quantum/keymap.h                        |   4 +
 quantum/light_ws2812.c                  | 137 +++++++++++++++++++++++-
 quantum/light_ws2812.h                  |   7 ++
 quantum/quantum.c                       |   3 +
 quantum/quantum.h                       |   4 +
 8 files changed, 163 insertions(+), 4 deletions(-)

diff --git a/build_keyboard.mk b/build_keyboard.mk
index 03a69b14646..cd9f44c7bd5 100644
--- a/build_keyboard.mk
+++ b/build_keyboard.mk
@@ -169,6 +169,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)
diff --git a/keyboards/ergodox/keymaps/jack/config.h b/keyboards/ergodox/keymaps/jack/config.h
index 01ccfb3a2ac..f0932084a0e 100644
--- a/keyboards/ergodox/keymaps/jack/config.h
+++ b/keyboards/ergodox/keymaps/jack/config.h
@@ -6,7 +6,7 @@
 /* ws2812 RGB LED */
 #define RGB_DI_PIN D7
 // #define RGBLIGHT_TIMER
-#define RGBLED_NUM 20     // Number of LEDs
+#define RGBLED_NUM 15     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 8
 #define RGBLIGHT_SAT_STEP 8
 #define RGBLIGHT_VAL_STEP 8
diff --git a/keyboards/ergodox/keymaps/jack/keymap.c b/keyboards/ergodox/keymaps/jack/keymap.c
index 1dd5a76187f..fabd27a618a 100644
--- a/keyboards/ergodox/keymaps/jack/keymap.c
+++ b/keyboards/ergodox/keymaps/jack/keymap.c
@@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
              KC_NO,     KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,          KC_ENT,
                                   MO(1), KC_LEFT,KC_DOWN,KC_UP,  KC_RGHT,  
              RGB_TOG,        RGB_HUI,
-             KC_PGUP,
+             RGB_MOD,
              KC_PGDN, KC_SPC,KC_SPC
     ),
 [SYMB] = KEYMAP(
@@ -90,7 +90,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 
 // Runs just one time when the keyboard initializes.
 void matrix_init_user(void) {
-  
+
 };
 
 // Runs constantly in the background, in a loop.
diff --git a/quantum/keymap.h b/quantum/keymap.h
index 98ddfd0c533..41aa1162280 100644
--- a/quantum/keymap.h
+++ b/quantum/keymap.h
@@ -174,6 +174,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/light_ws2812.c b/quantum/light_ws2812.c
index 401845e8552..d38dac4c69f 100755
--- a/quantum/light_ws2812.c
+++ b/quantum/light_ws2812.c
@@ -16,6 +16,122 @@
 #include <util/delay.h>
 #include "debug.h"
 
+#define RGBW_BB_TWI 1
+
+#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)
 {
@@ -41,6 +157,25 @@ void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds)
   _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));
+
+  #ifdef RGBW_BB_TWI
+    cli();
+    TWCR = 0;
+    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 % 0x10);
+    }
+    I2C_Stop();
+    sei();
+  #endif
+
+
   _delay_us(80);
 }
 
@@ -123,7 +258,7 @@ void inline ws2812_sendarray_mask(uint8_t *data,uint16_t datlen,uint8_t maskhi)
   cli();
 
   while (datlen--) {
-    curbyte=*data++;
+    curbyte=(*data++) % 0x10;
 
     asm volatile(
     "       ldi   %0,8  \n\t"
diff --git a/quantum/light_ws2812.h b/quantum/light_ws2812.h
index 54eef22d9e0..576c3bc483e 100755
--- a/quantum/light_ws2812.h
+++ b/quantum/light_ws2812.h
@@ -16,6 +16,13 @@
 #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  )
+
 
 /*
  *  Structure of the LED array
diff --git a/quantum/quantum.c b/quantum/quantum.c
index a16bd5443c5..5fa5e66b329 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -128,6 +128,9 @@ bool process_record_quantum(keyrecord_t *record) {
   #endif
   #ifdef UCIS_ENABLE
     process_ucis(keycode, record) &&
+  #endif
+  #ifdef PRINTING_ENABLE
+    process_printer(keycode, record) &&
   #endif
       true)) {
     return false;
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 0c604664951..06a2e049dcf 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -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);
 

From a889b899e2cf52b3b7807d8a7ad39f12e0761a10 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Sun, 16 Oct 2016 16:03:56 -0400
Subject: [PATCH 012/147] working with power limit

---
 .../planck/keymaps/thermal_printer/Makefile   |  26 ++
 .../planck/keymaps/thermal_printer/config.h   |  23 ++
 .../planck/keymaps/thermal_printer/keymap.c   | 314 ++++++++++++++++++
 .../planck/keymaps/thermal_printer/readme.md  |   2 +
 quantum/process_keycode/process_printer.c     | 254 ++++++++++++++
 quantum/process_keycode/process_printer.h     |   8 +
 quantum/process_keycode/process_printer_bb.c  | 260 +++++++++++++++
 7 files changed, 887 insertions(+)
 create mode 100644 keyboards/planck/keymaps/thermal_printer/Makefile
 create mode 100644 keyboards/planck/keymaps/thermal_printer/config.h
 create mode 100644 keyboards/planck/keymaps/thermal_printer/keymap.c
 create mode 100644 keyboards/planck/keymaps/thermal_printer/readme.md
 create mode 100644 quantum/process_keycode/process_printer.c
 create mode 100644 quantum/process_keycode/process_printer.h
 create mode 100644 quantum/process_keycode/process_printer_bb.c

diff --git a/keyboards/planck/keymaps/thermal_printer/Makefile b/keyboards/planck/keymaps/thermal_printer/Makefile
new file mode 100644
index 00000000000..3d1d11877f3
--- /dev/null
+++ b/keyboards/planck/keymaps/thermal_printer/Makefile
@@ -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
index 00000000000..430b6493cfc
--- /dev/null
+++ b/keyboards/planck/keymaps/thermal_printer/config.h
@@ -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
index 00000000000..e880597319c
--- /dev/null
+++ b/keyboards/planck/keymaps/thermal_printer/keymap.c
@@ -0,0 +1,314 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "planck.h"
+#include "action_layer.h"
+#ifdef AUDIO_ENABLE
+  #include "audio.h"
+#endif
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _PLOVER 5
+#define _ADJUST 16
+
+enum planck_keycodes {
+  QWERTY = SAFE_RANGE,
+  COLEMAK,
+  DVORAK,
+  PLOVER,
+  LOWER,
+  RAISE,
+  BACKLIT,
+  EXT_PLV
+};
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = {
+  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
+  {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
+  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
+  {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_COLEMAK] = {
+  {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
+  {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT},
+  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
+  {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  /   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_DVORAK] = {
+  {KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC},
+  {KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH},
+  {KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT },
+  {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = {
+  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = {
+  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
+  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Plover layer (http://opensteno.org)
+ * ,-----------------------------------------------------------------------------------.
+ * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |TogOut|   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+
+[_PLOVER] = {
+  {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   },
+  {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC},
+  {XXXXXXX, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
+  {EXT_PLV, XXXXXXX, XXXXXXX, KC_C,    KC_V,    XXXXXXX, XXXXXXX, KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX}
+},
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |      | Reset|      | Print|no prnt |    |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover|      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = {
+  {_______, RESET,   _______, PRINT_ON, PRINT_OFF, _______, _______, _______, _______, _______, _______, KC_DEL},
+  {_______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  PLOVER,  _______},
+  {_______, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
+}
+
+
+};
+
+#ifdef AUDIO_ENABLE
+
+float tone_startup[][2]    = SONG(STARTUP_SOUND);
+float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
+float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
+float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
+float tone_plover[][2]     = SONG(PLOVER_SOUND);
+float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND);
+float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
+
+float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
+#endif
+
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case QWERTY:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_QWERTY);
+      }
+      return false;
+      break;
+    case COLEMAK:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_COLEMAK);
+      }
+      return false;
+      break;
+    case DVORAK:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_DVORAK);
+      }
+      return false;
+      break;
+    case LOWER:
+      if (record->event.pressed) {
+        layer_on(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case RAISE:
+      if (record->event.pressed) {
+        layer_on(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case BACKLIT:
+      if (record->event.pressed) {
+        register_code(KC_RSFT);
+        #ifdef BACKLIGHT_ENABLE
+          backlight_step();
+        #endif
+      } else {
+        unregister_code(KC_RSFT);
+      }
+      return false;
+      break;
+    case PLOVER:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          stop_all_notes();
+          PLAY_NOTE_ARRAY(tone_plover, false, 0);
+        #endif
+        layer_off(_RAISE);
+        layer_off(_LOWER);
+        layer_off(_ADJUST);
+        layer_on(_PLOVER);
+        if (!eeconfig_is_enabled()) {
+            eeconfig_init();
+        }
+        keymap_config.raw = eeconfig_read_keymap();
+        keymap_config.nkro = 1;
+        eeconfig_update_keymap(keymap_config.raw);
+      }
+      return false;
+      break;
+    case EXT_PLV:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_plover_gb, false, 0);
+        #endif
+        layer_off(_PLOVER);
+      }
+      return false;
+      break;
+  }
+  return true;
+}
+
+void matrix_init_user(void) {
+    #ifdef AUDIO_ENABLE
+        startup_user();
+    #endif
+}
+
+#ifdef AUDIO_ENABLE
+
+void startup_user()
+{
+    _delay_ms(20); // gets rid of tick
+    PLAY_NOTE_ARRAY(tone_startup, false, 0);
+}
+
+void shutdown_user()
+{
+    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+    _delay_ms(150);
+    stop_all_notes();
+}
+
+void music_on_user(void)
+{
+    music_scale_user();
+}
+
+void music_scale_user(void)
+{
+    PLAY_NOTE_ARRAY(music_scale, false, 0);
+}
+
+#endif
diff --git a/keyboards/planck/keymaps/thermal_printer/readme.md b/keyboards/planck/keymaps/thermal_printer/readme.md
new file mode 100644
index 00000000000..de9680b4985
--- /dev/null
+++ b/keyboards/planck/keymaps/thermal_printer/readme.md
@@ -0,0 +1,2 @@
+# The Default Planck Layout
+
diff --git a/quantum/process_keycode/process_printer.c b/quantum/process_keycode/process_printer.c
new file mode 100644
index 00000000000..2e11dd366cf
--- /dev/null
+++ b/quantum/process_keycode/process_printer.c
@@ -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
index 00000000000..fdd36d75a87
--- /dev/null
+++ b/quantum/process_keycode/process_printer.h
@@ -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
index 00000000000..1924d037745
--- /dev/null
+++ b/quantum/process_keycode/process_printer_bb.c
@@ -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

From 826417bfc001377719c9034fe273d1596ba62c9c Mon Sep 17 00:00:00 2001
From: IBNobody <protospherex@gmail.com>
Date: Tue, 18 Oct 2016 16:45:45 -0500
Subject: [PATCH 013/147] Updating Vision keyboard files

---
 .../vision_division/keymaps/default/Makefile  |   4 +-
 .../vision_division/keymaps/default/keymap.c  | 195 ++++++++++--------
 2 files changed, 108 insertions(+), 91 deletions(-)

diff --git a/keyboards/vision_division/keymaps/default/Makefile b/keyboards/vision_division/keymaps/default/Makefile
index 5a930e85edb..28060947aff 100644
--- a/keyboards/vision_division/keymaps/default/Makefile
+++ b/keyboards/vision_division/keymaps/default/Makefile
@@ -2,7 +2,7 @@
 #   change to "no" to disable the options, or define them in the Makefile in
 #   the appropriate keymap folder that will get included automatically
 #
-BOOTMAGIC_ENABLE   = yes  # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE   = no   # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE    = yes  # Mouse keys(+4700)
 EXTRAKEY_ENABLE    = yes  # Audio control and System control(+450)
 CONSOLE_ENABLE     = yes  # Console for debug(+400)
@@ -18,4 +18,4 @@ SLEEP_LED_ENABLE   = no   # Breathing sleep LED during USB suspend
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
-endif
\ No newline at end of file
+endif
diff --git a/keyboards/vision_division/keymaps/default/keymap.c b/keyboards/vision_division/keymaps/default/keymap.c
index 64118abdcee..8622ee52111 100644
--- a/keyboards/vision_division/keymaps/default/keymap.c
+++ b/keyboards/vision_division/keymaps/default/keymap.c
@@ -121,6 +121,7 @@ enum keyboard_macros {
 
 #define M_CP_CT             M(MACRO_COPY_CUT)
 
+#define M_COPY              KC_FN1
 
 #define SC_UNDO             LCTL(KC_Z)
 #define SC_REDO             LCTL(KC_Y)
@@ -145,31 +146,31 @@ 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 +181,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 +205,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 +257,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 +296,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 +306,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_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_2:
-      if (record->event.pressed)
-      {
-        uprint("H2");
-      }
-      break;
 
-    case MACRO_HELP_3:
-      if (record->event.pressed)
-      {
-        uprint("H3");
-      }
-      break;
+  //   case MACRO_HELP_1:
+  //     if (record->event.pressed)
+  //     {
+  //       uprint("H1");
+  //     }
+  //     break;
 
-    case MACRO_HELP_4:
-      if (record->event.pressed)
-      {
-        uprint("H4");
-      }
-      break;
+  //   case MACRO_HELP_2:
+  //     if (record->event.pressed)
+  //     {
+  //       uprint("H2");
+  //     }
+  //     break;
 
-   case MACRO_HELP_5:
-     if (record->event.pressed)
-     {
-       uprint("H5");
-     }
-     break;
+  //   case MACRO_HELP_3:
+  //     if (record->event.pressed)
+  //     {
+  //       uprint("H3");
+  //     }
+  //     break;
 
-   case MACRO_HELP_6:
-     if (record->event.pressed)
-     {
-       uprint("H6");
-     }
-     break;
+  //   case MACRO_HELP_4:
+  //     if (record->event.pressed)
+  //     {
+  //       uprint("H4");
+  //     }
+  //     break;
 
-   case MACRO_HELP_7:
-      if (record->event.pressed)
-      {
-        uprint("H7");
-      }
-      break;
+  //  case MACRO_HELP_5:
+  //    if (record->event.pressed)
+  //    {
+  //      uprint("H5");
+  //    }
+  //    break;
 
-  case MACRO_HELP_8:
-    if (record->event.pressed)
-    {
-      uprint("H8");
-    }
-    break;
+  //  case MACRO_HELP_6:
+  //    if (record->event.pressed)
+  //    {
+  //      uprint("H6");
+  //    }
+  //    break;
 
-  case MACRO_HELP_9:
-    if (record->event.pressed)
-    {
-      uprint("H9");
-    }
-    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 +583,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();
 }

From 17170ba76d3c94edcf1ab263520238fdb0384774 Mon Sep 17 00:00:00 2001
From: IBNobody <ibnobody@gmail.com>
Date: Sun, 23 Oct 2016 23:00:43 -0500
Subject: [PATCH 014/147] Fixed some large keyboard bugs

Fixed some bugs relating to keyboards with more than 16 columns. Also
added the ability to mask off keyboard matrix bits.
---
 keyboards/vision_division/config.h            |  2 +
 .../vision_division/keymaps/default/keymap.c  | 11 ++++++
 quantum/matrix.c                              | 37 +++++++++++++++++--
 readme.md                                     |  1 +
 tmk_core/common/command.c                     |  6 +--
 5 files changed, 50 insertions(+), 7 deletions(-)

diff --git a/keyboards/vision_division/config.h b/keyboards/vision_division/config.h
index 1f8466a5460..93c9606712a 100644
--- a/keyboards/vision_division/config.h
+++ b/keyboards/vision_division/config.h
@@ -33,6 +33,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
 #define DEBOUNCING_DELAY 5
 
+#define MATRIX_MASKED
+
 /* define if matrix has ghost (lacks anti-ghosting diodes) */
 //#define MATRIX_HAS_GHOST
 
diff --git a/keyboards/vision_division/keymaps/default/keymap.c b/keyboards/vision_division/keymaps/default/keymap.c
index 8622ee52111..3282761c0fb 100644
--- a/keyboards/vision_division/keymaps/default/keymap.c
+++ b/keyboards/vision_division/keymaps/default/keymap.c
@@ -142,6 +142,17 @@ 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
diff --git a/quantum/matrix.c b/quantum/matrix.c
index 3174e07390c..ac81794e59e 100644
--- a/quantum/matrix.c
+++ b/quantum/matrix.c
@@ -26,6 +26,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "util.h"
 #include "matrix.h"
 
+#ifdef MATRIX_MASKED
+extern const matrix_row_t matrix_mask[];
+#endif
+
 /* Set 0 if debouncing isn't needed */
 
 #ifndef DEBOUNCING_DELAY
@@ -218,15 +222,34 @@ 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)
 {
+#if (MATRIX_COLS <= 8)
+    print("\nr/c 01234567\n");
+#elif (MATRIX_COLS <= 16)
     print("\nr/c 0123456789ABCDEF\n");
+#elif (MATRIX_COLS <= 32)
+    print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n");
+#endif
+
     for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
         phex(row); print(": ");
-        pbin_reverse16(matrix_get_row(row));
+#if (MATRIX_COLS <= 8)
+        print_bin_reverse8(matrix_get_row(row));
+#elif (MATRIX_COLS <= 16)
+        print_bin_reverse16(matrix_get_row(row));
+#elif (MATRIX_COLS <= 32)
+        print_bin_reverse32(matrix_get_row(row));
+#endif
         print("\n");
     }
 }
@@ -235,7 +258,13 @@ uint8_t matrix_key_count(void)
 {
     uint8_t count = 0;
     for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+#if (MATRIX_COLS <= 8)
+        count += bitpop(matrix[i]);
+#elif (MATRIX_COLS <= 16)
         count += bitpop16(matrix[i]);
+#elif (MATRIX_COLS <= 32)
+        count += bitpop32(matrix[i]);
+#endif
     }
     return count;
 }
@@ -259,7 +288,7 @@ static matrix_row_t read_cols(void)
     matrix_row_t result = 0;
 
 #if DIODE_DIRECTION == COL2ROW
-    for(int x = 0; x < MATRIX_COLS; x++) {     
+    for(int x = 0; x < MATRIX_COLS; x++) {
         int pin = col_pins[x];
 #else
     for(int x = 0; x < MATRIX_ROWS; x++) {
@@ -273,10 +302,10 @@ static matrix_row_t read_cols(void)
 static void unselect_rows(void)
 {
 #if DIODE_DIRECTION == COL2ROW
-    for(int x = 0; x < MATRIX_ROWS; x++) { 
+    for(int x = 0; x < MATRIX_ROWS; x++) {
         int pin = row_pins[x];
 #else
-    for(int x = 0; x < MATRIX_COLS; x++) { 
+    for(int x = 0; x < MATRIX_COLS; x++) {
         int pin = col_pins[x];
 #endif
         _SFR_IO8((pin >> 4) + 1) &=  ~_BV(pin & 0xF);
diff --git a/readme.md b/readme.md
index 62d479ff1df..c460933a704 100644
--- 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.
 
diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c
index f3e1bf6234e..5f29bc0b4e8 100644
--- a/tmk_core/common/command.c
+++ b/tmk_core/common/command.c
@@ -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;
 

From ef8f6180272c3e112f97a6beb9dd90bece3c2131 Mon Sep 17 00:00:00 2001
From: IBNobody <ibnobody@gmail.com>
Date: Sun, 23 Oct 2016 23:03:26 -0500
Subject: [PATCH 015/147] Fixing Line Terminations

---
 .../keymaps/win10_writers-block/config.h      |  72 +-
 .../keymaps/win10_writers-block/keymap.c      | 648 +++++++++---------
 .../keymaps/win10_writers-block/readme.md     | 224 +++---
 3 files changed, 472 insertions(+), 472 deletions(-)

diff --git a/keyboards/ergodox/keymaps/win10_writers-block/config.h b/keyboards/ergodox/keymaps/win10_writers-block/config.h
index 568a711a865..43259db0880 100644
--- a/keyboards/ergodox/keymaps/win10_writers-block/config.h
+++ b/keyboards/ergodox/keymaps/win10_writers-block/config.h
@@ -1,36 +1,36 @@
-#ifndef KEYBOARDS_ERGODOX_CONFIG_H_
-#define KEYBOARDS_ERGODOX_CONFIG_H_
-
-#define MOUSEKEY_DELAY          100
-#define MOUSEKEY_INTERVAL       20
-#define MOUSEKEY_MAX_SPEED      3
-#define MOUSEKEY_TIME_TO_MAX    10
-
-#define TAPPING_TOGGLE  1
-
-/* define if matrix has ghost */
-//#define MATRIX_HAS_GHOST
-
-#define TAPPING_TERM    300
-#define IGNORE_MOD_TAP_INTERRUPT // this makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when you hold it, and when this option isn't enabled, z rapidly followed by x actually sends Ctrl-x. That's bad.)
-
-/* 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_LCTL) | MOD_BIT(KC_RCTL)) || \
-    keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \
-)
-
-#ifdef SUBPROJECT_ez
-    #include "ez/config.h"
-#endif
-#ifdef SUBPROJECT_infinity
-    #include "infinity/config.h"
-#endif
-
-
-#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */
+#ifndef KEYBOARDS_ERGODOX_CONFIG_H_
+#define KEYBOARDS_ERGODOX_CONFIG_H_
+
+#define MOUSEKEY_DELAY          100
+#define MOUSEKEY_INTERVAL       20
+#define MOUSEKEY_MAX_SPEED      3
+#define MOUSEKEY_TIME_TO_MAX    10
+
+#define TAPPING_TOGGLE  1
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+#define TAPPING_TERM    300
+#define IGNORE_MOD_TAP_INTERRUPT // this makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when you hold it, and when this option isn't enabled, z rapidly followed by x actually sends Ctrl-x. That's bad.)
+
+/* 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_LCTL) | MOD_BIT(KC_RCTL)) || \
+    keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \
+)
+
+#ifdef SUBPROJECT_ez
+    #include "ez/config.h"
+#endif
+#ifdef SUBPROJECT_infinity
+    #include "infinity/config.h"
+#endif
+
+
+#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */
diff --git a/keyboards/ergodox/keymaps/win10_writers-block/keymap.c b/keyboards/ergodox/keymaps/win10_writers-block/keymap.c
index ea640ee96f9..3106b337478 100644
--- a/keyboards/ergodox/keymaps/win10_writers-block/keymap.c
+++ b/keyboards/ergodox/keymaps/win10_writers-block/keymap.c
@@ -1,324 +1,324 @@
-#include "ergodox.h"
-#include "debug.h"
-#include "action_layer.h"
-#include "version.h"
-#include "wait.h"
-
-#define BASE 0 // default layer  -  helpful for writing in Office-style word processors. 
-#define SYMB 1 // symbol layer   -  NumPad, etc. - same as Ergodox EZ default but no EEPROM or Version key 
-#define RIMW 2 // rimworld layer -  made for the game RimWorld, by Tynan Sylvester | feel free to remap for your favorite game!
-#define MDIA 3 // media layer    -  mouse and music - close to Ergodox EZ default media layer
-
-#define CO_PA M(0)                  // hold copy, tap paste
-
-#define W_CUT    LCTL(KC_X)         // C-x Cut
-#define W_COPY   LCTL(KC_C)         // C-c Copy
-#define W_PASTE  LCTL(KC_V)         // C-v Paste
-#define W_UNDO   LCTL(KC_Z)         // C-z Undo
-#define W_FIND   LCTL(KC_F)         // C-v Find
-#define W_CAD    LCTL(LALT(KC_DEL)) // one-tap ctrl-alt-del
-
-
-
-//Tap Dance Declarations
-enum {
-  CAKEWARP,
-  CTRLALTMDIA,
-};
-
-void cake_count (qk_tap_dance_state_t *state, void *user_data) {
-  if (state->count == 2) {         
-    layer_on (SYMB);        //define double tap here
-    layer_off (MDIA);
-  } 
-  else {    
-    layer_off (SYMB);       //define single tap or hold here
-    layer_off (MDIA);
-  }
-  if (state->count == 3) {         
-     layer_on (RIMW);       //define triple tap here
-     layer_off (MDIA);
-  } 
-  else {    
-   	layer_off (RIMW);       //define single tap or hold here
-	layer_off (MDIA);
-    reset_tap_dance (state);
-  }
-}
-
-void dance_cad_mdia_fin (qk_tap_dance_state_t *state, void *user_data) {
-  if (state->count == 1) {
-    register_code (KC_LCTL);
-    register_code (KC_LALT);
-	register_code (KC_DEL);
-  } else {
-    layer_on (MDIA);
-  }
-}
-
-void dance_cad_mdia_reset (qk_tap_dance_state_t *state, void *user_data) {
-  if (state->count == 1) {
-    unregister_code (KC_DEL);
-    unregister_code (KC_LALT);
-	unregister_code (KC_LCTL);
-  } else {
-    ;
-  }
-}
-
-//Tap Dance Definitions
-qk_tap_dance_action_t tap_dance_actions[] = {
-  // tap for Layer 0, tap twice to switch to symbol layer, and tap three times to switch to rimworld layer.
-  [CAKEWARP] = ACTION_TAP_DANCE_FN(cake_count)
-  // tap for ctrl-alt-del, tap twice for media layer
-  ,[CTRLALTMDIA] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cad_mdia_fin, dance_cad_mdia_reset)
-  // Other declarations would go here, separated by commas, if you have them
-};
-
-//In Layer declaration, add tap dance item in place of a key code
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-/* Keymap 0: Basic layer - TD(one_tap, two_taps, three_taps...)
- *
- * ,--------------------------------------------------.           ,--------------------------------------------------.
- * |   `    |   1  |   2  |   3  |   4  |   5  | 6    |           |  7   |   7  |   8  |   9  |   0  |   -  |   =    |
- * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * | F12/L1 |   Q  |   W  |   E  |   R  |   T  |  {/[ |           |TD(L0 |   Y  |   U  |   I  |   O  |   P  |   \    | 
- * |--------+------+------+------+------+------|      |           |L1 L2)|------+------+------+------+------+--------|
- * |Caps/Win|   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;  |   '    |
- * |--------+------+------+------+------+------|  }/] |           TD(ctrl|------+------+------+------+------+--------|
- * |LShift/(|Z/Ctrl|   X  |   C  |   V  |   B  |      |           |altdel|   N  |   M  |   ,  |   .  |  /   |RShift/)|
- * `--------+------+------+------+------+-------------'           |L3)   |------+------+------+------+------+--------'
- * |  Undo  |  Cut |CopyPa| Meh  | LGui |                         '------|      | Enter| Left | Up   | Down | Right  |
- *   `----------------------------------'                                       `----------------------------------'
- *                                        ,-------------.       ,-------------.
- *                                        | Esc  | VolUp|       | F4   | Mute |
- *                                 ,------|------|------|       |------+--------+------.
- *                                 |      |      | VolDn|       | F5   |        |      |
- *                                 |Backsp|Delete|------|       |------|  Tab / |Space |
- *                                 |ace   |      | Find |       | Alt  |  CTRL  |      |
- *                                 `--------------------'       `----------------------'
- */
-// If it accepts an argument (i.e, is a function), it doesn't need KC_.
-// Otherwise, it needs KC_*
-[BASE] = KEYMAP(  // layer 0 : default
-        // left hand
-          KC_GRV,         KC_1,         KC_2,         KC_3,        KC_4,   KC_5,   KC_6,
-LT(SYMB, KC_F12),         KC_Q,         KC_W,         KC_E,        KC_R,   KC_T,   KC_LBRC,
-  GUI_T(KC_CAPS),         KC_A,         KC_S,         KC_D,        KC_F,   KC_G,
-         KC_LSPO,  CTL_T(KC_Z),         KC_X,         KC_C,        KC_V,   KC_B,   KC_RBRC,
-          W_UNDO,        W_CUT,        CO_PA, MEH_T(KC_NO),     KC_LGUI,
-                                                                         KC_ESC, KC_VOLU,
-                                                                                 KC_VOLD,
-                                                             KC_BSPC, KC_DELETE,  W_FIND,
-        // right hand
-                       KC_7,   KC_7,   KC_8,   KC_9,    KC_0,   KC_MINS,          KC_EQL,
-               TD(CAKEWARP),   KC_Y,   KC_U,   KC_I,    KC_O,   KC_P,            KC_BSLS,
-                               KC_H,   KC_J,   KC_K,    KC_L,   KC_SCLN,         KC_QUOT,
-            TD(CTRLALTMDIA),   KC_N,   KC_M,   KC_COMM, KC_DOT, KC_SLSH,         KC_RSPC,
-                                       KC_ENT, KC_LEFT, KC_UP,  KC_DOWN,        KC_RIGHT,
-                      KC_F4,        KC_MUTE,
-                      KC_F5,
-                    KC_RALT, CTL_T(KC_TAB), KC_SPC
-    ),
-
-/* Keymap 1: Symbol Layer | No EEPROM Or Version keys
- *
- * ,--------------------------------------------------.           ,--------------------------------------------------.
- * |        |  F1  |  F2  |  F3  |  F4  |  F5  |   xx |           | xx   |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
- * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * |        |   !  |   @  |   {  |   }  |   |  |      |           |TD(L0 |   Up |   7  |   8  |   9  |   *  |   F12  |
- * |--------+------+------+------+------+------|      |           |L1 L2)|------+------+------+------+------+--------|
- * |        |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |   4  |   5  |   6  |   +  |   -    |
- * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   \  |        |
- * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
- *   |      |      |      |      |      |                                       |      |    . |   0  |   =  |      |
- *   `----------------------------------'                                       `----------------------------------'
- *                                        ,-------------.       ,-------------.
- *                                        |      |      |       |      |      |
- *                                 ,------|------|------|       |------+------+------.
- *                                 |      |      |      |       |      |      |      |
- *                                 |      |      |------|       |------|      |      |
- *                                 |      |      |      |       |      |      |      |
- *                                 `--------------------'       `--------------------'
- */
-// SYMBOLS
-[SYMB] = KEYMAP(
-       // left hand
-       KC_TRNS,  KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_NO,
-       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_NO, 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_MINS,
-       KC_TRNS, KC_AMPR, KC_1,   KC_2,    KC_3,    KC_BSLS, KC_TRNS,
-                         KC_TRNS,KC_DOT,  KC_0,    KC_EQL,    KC_NO,
-       KC_TRNS, KC_TRNS,
-       KC_TRNS,
-       KC_TRNS, KC_TRNS, KC_TRNS
-),	
-	
-/* Keymap 2: RimWorld Layer
- *
- * ,--------------------------------------------------.           ,--------------------------------------------------.
- * |  ESC   |   1  |   2  |   3  |   4  |   5  |  6   |           |   7  |   7  |   8  |   9  |   0  |   -  |   =    |
- * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * |  TAB   |   C  |  ,<  |   W  |   >. |   R  |      |           |TD(L0 |  U   |  B   |   N  |  J   |  M   |   PGUP |
- * |--------+------+------+------+------+------| F10  |           |L1 L2)|------+------+------+------+------+--------|
- * |   I    |   F  |   A  |   S  |   D  |   8  |------|           |------|  X   |  L   |   P  |  Y   |  H   |  ENTER |
- * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |   K    |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |           |  F7  |  F8  |  F9  |  F10 |  F11 | F12  |   PGDN |
- * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
- *   |      |      |      |      |      |                                       |  F   |      |      |      |      |
- *   `----------------------------------'                                       `----------------------------------'
- *                                        ,-------------.       ,-------------.
- *                                        |      |      |       |      |      |
- *                                 ,------|------|------|       |------+------+------.
- *                                 |      |      |      |       |      |      |      |
- *                                 |SPACE |  C   |------|       |------|  E   |SPACE |
- *                                 |      |      |  Q   |       |      |      |      |
- *                                 `--------------------'       `--------------------'
- */
-// RIMWORLD 
-[RIMW] = KEYMAP(
-       // left hand
-        KC_ESC,   KC_1,    KC_2,     KC_3,    KC_4,    KC_5,    KC_6,
-        KC_TAB,   KC_C, KC_COMM,     KC_W,  KC_DOT,    KC_R,  KC_F10,
-          KC_I,   KC_F,    KC_A,     KC_S,    KC_D,    KC_8,
-          KC_K,  KC_F1,   KC_F2,    KC_F3,   KC_F4,   KC_F5,   KC_F6,
-       KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
-                                       KC_TRNS,KC_TRNS,
-                                               KC_TRNS,
-                                     KC_C,KC_Q,KC_TRNS,
-       // right hand
-          KC_7,    KC_7,    KC_8,        KC_9,    KC_0,    KC_MINS,  KC_EQL,
-       KC_TRNS,    KC_U,    KC_B,        KC_N,    KC_J,       KC_M, KC_PGUP,
-                   KC_X,    KC_L, SFT_T(KC_P),    KC_Y,       KC_H,  KC_ENT,
-         KC_F7,   KC_F8,   KC_F9,      KC_F10,  KC_F11,     KC_F12, KC_PGDN,
-                            KC_F,     KC_LEFT,   KC_UP,    KC_DOWN,KC_RIGHT,
-       KC_TRNS, KC_TRNS,
-       KC_TRNS,
-       KC_TRNS,    KC_E, KC_TRNS
-),
-/* Keymap 3: Media and mouse keys
- *
- * ,--------------------------------------------------.           ,--------------------------------------------------.
- * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
- * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * |        |      |      | MsUp |      |      |      |           |      |      |      |      |      |      |        |
- * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      |      |      |      |      |  Play  |
- * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
- * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
- *   |      |      |      | Lclk | Rclk |                                       |VolUp |VolDn | Mute |      |      |
- *   `----------------------------------'                                       `----------------------------------'
- *                                        ,-------------.       ,-------------.
- *                                        |      |      |       |      |      |
- *                                 ,------|------|------|       |------+------+------.
- *                                 |      |      |      |       |      |      |Brwser|
- *                                 | Lclk | Rclk |------|       |------|      |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_BTN1, KC_BTN2, 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
-),
-};
-
-static uint16_t key_timer;
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-      switch(id) {
-        case 0: {
-            if (record->event.pressed) {
-                key_timer = timer_read(); // if the key is being pressed, we start the timer.
-            }
-            else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down").
-                if (timer_elapsed(key_timer) > 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap.
-                    return MACRO( D(LCTL), T(C), U(LCTL), END  );
-                }
-                else {
-                    return MACRO( D(LCTL), T(V), U(LCTL), END  );
-                }
-            }
-            break;
-        }
-      }
-    return MACRO_NONE;
-};
-
-// Anything you want to do once when the keyboard initializes.
-// Tests LED function when the keyboard initializes.
-void matrix_init_user(void) {
-
-  wait_ms(500);
-  ergodox_board_led_on();
-  wait_ms(200);
-  ergodox_right_led_1_on();
-  wait_ms(200);
-  ergodox_right_led_2_on();
-  wait_ms(200);
-  ergodox_right_led_3_on();
-  wait_ms(200);
-  ergodox_board_led_off();
-  wait_ms(200);
-  ergodox_right_led_1_off();
-  wait_ms(200);
-  ergodox_right_led_2_off();
-  wait_ms(200);
-  ergodox_right_led_3_off();
-
-};
-
-
-// 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;
-        case 3:
-            ergodox_right_led_3_on();
-            break;			
-        default:
-            // none
-            break;
-    }
-
-};
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "version.h"
+#include "wait.h"
+
+#define BASE 0 // default layer  -  helpful for writing in Office-style word processors. 
+#define SYMB 1 // symbol layer   -  NumPad, etc. - same as Ergodox EZ default but no EEPROM or Version key 
+#define RIMW 2 // rimworld layer -  made for the game RimWorld, by Tynan Sylvester | feel free to remap for your favorite game!
+#define MDIA 3 // media layer    -  mouse and music - close to Ergodox EZ default media layer
+
+#define CO_PA M(0)                  // hold copy, tap paste
+
+#define W_CUT    LCTL(KC_X)         // C-x Cut
+#define W_COPY   LCTL(KC_C)         // C-c Copy
+#define W_PASTE  LCTL(KC_V)         // C-v Paste
+#define W_UNDO   LCTL(KC_Z)         // C-z Undo
+#define W_FIND   LCTL(KC_F)         // C-v Find
+#define W_CAD    LCTL(LALT(KC_DEL)) // one-tap ctrl-alt-del
+
+
+
+//Tap Dance Declarations
+enum {
+  CAKEWARP,
+  CTRLALTMDIA,
+};
+
+void cake_count (qk_tap_dance_state_t *state, void *user_data) {
+  if (state->count == 2) {         
+    layer_on (SYMB);        //define double tap here
+    layer_off (MDIA);
+  } 
+  else {    
+    layer_off (SYMB);       //define single tap or hold here
+    layer_off (MDIA);
+  }
+  if (state->count == 3) {         
+     layer_on (RIMW);       //define triple tap here
+     layer_off (MDIA);
+  } 
+  else {    
+   	layer_off (RIMW);       //define single tap or hold here
+	layer_off (MDIA);
+    reset_tap_dance (state);
+  }
+}
+
+void dance_cad_mdia_fin (qk_tap_dance_state_t *state, void *user_data) {
+  if (state->count == 1) {
+    register_code (KC_LCTL);
+    register_code (KC_LALT);
+	register_code (KC_DEL);
+  } else {
+    layer_on (MDIA);
+  }
+}
+
+void dance_cad_mdia_reset (qk_tap_dance_state_t *state, void *user_data) {
+  if (state->count == 1) {
+    unregister_code (KC_DEL);
+    unregister_code (KC_LALT);
+	unregister_code (KC_LCTL);
+  } else {
+    ;
+  }
+}
+
+//Tap Dance Definitions
+qk_tap_dance_action_t tap_dance_actions[] = {
+  // tap for Layer 0, tap twice to switch to symbol layer, and tap three times to switch to rimworld layer.
+  [CAKEWARP] = ACTION_TAP_DANCE_FN(cake_count)
+  // tap for ctrl-alt-del, tap twice for media layer
+  ,[CTRLALTMDIA] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cad_mdia_fin, dance_cad_mdia_reset)
+  // Other declarations would go here, separated by commas, if you have them
+};
+
+//In Layer declaration, add tap dance item in place of a key code
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer - TD(one_tap, two_taps, three_taps...)
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   `    |   1  |   2  |   3  |   4  |   5  | 6    |           |  7   |   7  |   8  |   9  |   0  |   -  |   =    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * | F12/L1 |   Q  |   W  |   E  |   R  |   T  |  {/[ |           |TD(L0 |   Y  |   U  |   I  |   O  |   P  |   \    | 
+ * |--------+------+------+------+------+------|      |           |L1 L2)|------+------+------+------+------+--------|
+ * |Caps/Win|   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;  |   '    |
+ * |--------+------+------+------+------+------|  }/] |           TD(ctrl|------+------+------+------+------+--------|
+ * |LShift/(|Z/Ctrl|   X  |   C  |   V  |   B  |      |           |altdel|   N  |   M  |   ,  |   .  |  /   |RShift/)|
+ * `--------+------+------+------+------+-------------'           |L3)   |------+------+------+------+------+--------'
+ * |  Undo  |  Cut |CopyPa| Meh  | LGui |                         '------|      | Enter| Left | Up   | Down | Right  |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        | Esc  | VolUp|       | F4   | Mute |
+ *                                 ,------|------|------|       |------+--------+------.
+ *                                 |      |      | VolDn|       | F5   |        |      |
+ *                                 |Backsp|Delete|------|       |------|  Tab / |Space |
+ *                                 |ace   |      | Find |       | Alt  |  CTRL  |      |
+ *                                 `--------------------'       `----------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = KEYMAP(  // layer 0 : default
+        // left hand
+          KC_GRV,         KC_1,         KC_2,         KC_3,        KC_4,   KC_5,   KC_6,
+LT(SYMB, KC_F12),         KC_Q,         KC_W,         KC_E,        KC_R,   KC_T,   KC_LBRC,
+  GUI_T(KC_CAPS),         KC_A,         KC_S,         KC_D,        KC_F,   KC_G,
+         KC_LSPO,  CTL_T(KC_Z),         KC_X,         KC_C,        KC_V,   KC_B,   KC_RBRC,
+          W_UNDO,        W_CUT,        CO_PA, MEH_T(KC_NO),     KC_LGUI,
+                                                                         KC_ESC, KC_VOLU,
+                                                                                 KC_VOLD,
+                                                             KC_BSPC, KC_DELETE,  W_FIND,
+        // right hand
+                       KC_7,   KC_7,   KC_8,   KC_9,    KC_0,   KC_MINS,          KC_EQL,
+               TD(CAKEWARP),   KC_Y,   KC_U,   KC_I,    KC_O,   KC_P,            KC_BSLS,
+                               KC_H,   KC_J,   KC_K,    KC_L,   KC_SCLN,         KC_QUOT,
+            TD(CTRLALTMDIA),   KC_N,   KC_M,   KC_COMM, KC_DOT, KC_SLSH,         KC_RSPC,
+                                       KC_ENT, KC_LEFT, KC_UP,  KC_DOWN,        KC_RIGHT,
+                      KC_F4,        KC_MUTE,
+                      KC_F5,
+                    KC_RALT, CTL_T(KC_TAB), KC_SPC
+    ),
+
+/* Keymap 1: Symbol Layer | No EEPROM Or Version keys
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |  F1  |  F2  |  F3  |  F4  |  F5  |   xx |           | xx   |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |   !  |   @  |   {  |   }  |   |  |      |           |TD(L0 |   Up |   7  |   8  |   9  |   *  |   F12  |
+ * |--------+------+------+------+------+------|      |           |L1 L2)|------+------+------+------+------+--------|
+ * |        |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |   4  |   5  |   6  |   +  |   -    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   \  |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |    . |   0  |   =  |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|      |      |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// SYMBOLS
+[SYMB] = KEYMAP(
+       // left hand
+       KC_TRNS,  KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_NO,
+       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_NO, 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_MINS,
+       KC_TRNS, KC_AMPR, KC_1,   KC_2,    KC_3,    KC_BSLS, KC_TRNS,
+                         KC_TRNS,KC_DOT,  KC_0,    KC_EQL,    KC_NO,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+),	
+	
+/* Keymap 2: RimWorld Layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |  ESC   |   1  |   2  |   3  |   4  |   5  |  6   |           |   7  |   7  |   8  |   9  |   0  |   -  |   =    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |  TAB   |   C  |  ,<  |   W  |   >. |   R  |      |           |TD(L0 |  U   |  B   |   N  |  J   |  M   |   PGUP |
+ * |--------+------+------+------+------+------| F10  |           |L1 L2)|------+------+------+------+------+--------|
+ * |   I    |   F  |   A  |   S  |   D  |   8  |------|           |------|  X   |  L   |   P  |  Y   |  H   |  ENTER |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |   K    |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |           |  F7  |  F8  |  F9  |  F10 |  F11 | F12  |   PGDN |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |  F   |      |      |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |SPACE |  C   |------|       |------|  E   |SPACE |
+ *                                 |      |      |  Q   |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// RIMWORLD 
+[RIMW] = KEYMAP(
+       // left hand
+        KC_ESC,   KC_1,    KC_2,     KC_3,    KC_4,    KC_5,    KC_6,
+        KC_TAB,   KC_C, KC_COMM,     KC_W,  KC_DOT,    KC_R,  KC_F10,
+          KC_I,   KC_F,    KC_A,     KC_S,    KC_D,    KC_8,
+          KC_K,  KC_F1,   KC_F2,    KC_F3,   KC_F4,   KC_F5,   KC_F6,
+       KC_TRNS,KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,
+                                       KC_TRNS,KC_TRNS,
+                                               KC_TRNS,
+                                     KC_C,KC_Q,KC_TRNS,
+       // right hand
+          KC_7,    KC_7,    KC_8,        KC_9,    KC_0,    KC_MINS,  KC_EQL,
+       KC_TRNS,    KC_U,    KC_B,        KC_N,    KC_J,       KC_M, KC_PGUP,
+                   KC_X,    KC_L, SFT_T(KC_P),    KC_Y,       KC_H,  KC_ENT,
+         KC_F7,   KC_F8,   KC_F9,      KC_F10,  KC_F11,     KC_F12, KC_PGDN,
+                            KC_F,     KC_LEFT,   KC_UP,    KC_DOWN,KC_RIGHT,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS,    KC_E, KC_TRNS
+),
+/* Keymap 3: Media and mouse keys
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      |      | MsUp |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      |      |      |      |      |  Play  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      | Lclk | Rclk |                                       |VolUp |VolDn | Mute |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |Brwser|
+ *                                 | Lclk | Rclk |------|       |------|      |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_BTN1, KC_BTN2, 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
+),
+};
+
+static uint16_t key_timer;
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+      switch(id) {
+        case 0: {
+            if (record->event.pressed) {
+                key_timer = timer_read(); // if the key is being pressed, we start the timer.
+            }
+            else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down").
+                if (timer_elapsed(key_timer) > 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap.
+                    return MACRO( D(LCTL), T(C), U(LCTL), END  );
+                }
+                else {
+                    return MACRO( D(LCTL), T(V), U(LCTL), END  );
+                }
+            }
+            break;
+        }
+      }
+    return MACRO_NONE;
+};
+
+// Anything you want to do once when the keyboard initializes.
+// Tests LED function when the keyboard initializes.
+void matrix_init_user(void) {
+
+  wait_ms(500);
+  ergodox_board_led_on();
+  wait_ms(200);
+  ergodox_right_led_1_on();
+  wait_ms(200);
+  ergodox_right_led_2_on();
+  wait_ms(200);
+  ergodox_right_led_3_on();
+  wait_ms(200);
+  ergodox_board_led_off();
+  wait_ms(200);
+  ergodox_right_led_1_off();
+  wait_ms(200);
+  ergodox_right_led_2_off();
+  wait_ms(200);
+  ergodox_right_led_3_off();
+
+};
+
+
+// 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;
+        case 3:
+            ergodox_right_led_3_on();
+            break;			
+        default:
+            // none
+            break;
+    }
+
+};
diff --git a/keyboards/ergodox/keymaps/win10_writers-block/readme.md b/keyboards/ergodox/keymaps/win10_writers-block/readme.md
index 66b1aaf40dc..e51e3c48fc1 100644
--- a/keyboards/ergodox/keymaps/win10_writers-block/readme.md
+++ b/keyboards/ergodox/keymaps/win10_writers-block/readme.md
@@ -1,113 +1,113 @@
-<!-- -*- mode: markdown; fill-column: 8192 -*- -->
-
-Win10 Writer's Block ErgoDox - v1.0
-
-=======================
-
-This is a QWERTY layout for QMK. It's designed to work well in MS Office-like environments. It's tested on Windows 7 and 10.
-
-Professional writers may find this layout useful -- copywriters, technical writers, novelists, etc.  
-
-I use my ErgoDox with this keymap as a daily driver at my office.
-
-A gaming layer is unobtrusively built into this layout. I use that layer to play RimWorld. 
-
-Feel free to modify the gaming layer to your personal taste.
-
-## Table of Contents
-
-* [Layouts](#layouts)
-    - [Base layer](#base-layer)
-    - [Symbol layer](#symbol-layer)
-    - [Gaming layer](#rimworld-layer)
-    - [Media layer](#media-layer)
-* [Tools](#tools)
-    - [Layer notification](#layer-notification)
-* [Building](#building)
-    - [Using on Windows](#using-on-windows)
-* [License](#license)
-* [Special Thanks](#special-thanks)
-
-# Layouts
-
-* TapDance will teleport you to the layer you want: 
-* One Tap for the Base layer
-* Two Taps for the Symbol layer
-* Three Taps for the Rimworld/Gaming layer
-
-* Where the "Meh" key is located on the Ergodox EZ default layout, I've changed it to another tap dance key:
-* One Tap for CTRL-ALT-DEL
-* Two Taps for the Media/Mouse layer
-
-## Base layer
-
-[![Base layer](images/base-layer.png)](http://www.keyboard-layout-editor.com/#/gists/8fd9bbdd3a23bbb5a8779de3624a3be1)
-
-This is a QWERTY layout with some quirks. 
-
-* Enter is located on a key that won't cause as much thumb fatigue.  
-* Copy and Paste work from the same key. Just hold the key to copy and tap the key to paste!
-* Undo, Find and Cut are also one-touch keys. 
-* F12 is where you would normally find TAB on standard layouts. Quickly save in Word, safely.
-* You'll find bracket keys below the "6" key.
-
-* The Meh Key is a single-button CTRL+ALT+SHIFT modifier.
-
-* Space Cadet Shift: Tap L Shift for "(" and R Shift for ")" -- holding either shift works like a normal shift.
-* Tap "Z" or Tab to use either normally. Hold them for CTRL. 
-* Tap Caps Lock to use it normally. Hold it for Win key combinations (Win+D to minimize all programs, etc).
-
-## Symbol layer
-
-[![Symbol layer](images/symbol-layer.png)](http://www.keyboard-layout-editor.com/#/gists/04eb6458b8b17882e472f64d482f12b4)
-
-Your standard Ergodox EZ symbol + numpad layout, minus the Version and EEPROM keys.
-
-* From the base layer, hold the F12 Key to temporarily access this layer (use for quick access to numpad)
-* Release F12 to return to the base layer.
-
-## Rimworld layer
-
-[![Rimworld / Gaming Layer](images/rimworld-layer.png)](http://www.keyboard-layout-editor.com/#/gists/d53af8391e6e443ed0a98ccfbdb4eace)
-
-This layer was made to play RimWorld, a Sci-Fi Colony Survival Game by Tynan Sylvester and Ludeon Studios, available on Steam. 
-
-* Have fun!
-
-## Media layer
-
-[![Media layer](images/media-layer.png)](http://www.keyboard-layout-editor.com/#/gists/3209d09ed4bd997e4f49f28c6ada2ab3)
-
-This is the standard Ergodox EZ media layout with more options for mouseclick buttons. 
-
-* In this layer, your "space" key changes into a back button for your browser.
-
-## LED states
-
-Your LEDs will change to indicate your layer. You'll know you are in the base layer if all LEDs are off.
-
-# Building
-
-To build, you will need the [QMK][qmk] firmware checked out. from there, dive into `keyboards/ergodox/keymaps/win10_writers-block/`
-
-[qmk]: https://github.com/jackhumbert/qmk_firmware
-
-```
-$ make keyboard=ergodox keymap=win10_writers-block
-```
-
-## Using on Windows
-
-This layout is tested in Windows 7 Pro and Windows 10 Home environments. 
-
-# License
-
-GPL 3+
-
-# Special Thanks
-
-* To algernon for his coding help. I'm a novice but I still made this work (and figured out tap dance) with his help.
-
-* To /r/MechanicalKeyboards for being an all-around great community.
-
+<!-- -*- mode: markdown; fill-column: 8192 -*- -->
+
+Win10 Writer's Block ErgoDox - v1.0
+
+=======================
+
+This is a QWERTY layout for QMK. It's designed to work well in MS Office-like environments. It's tested on Windows 7 and 10.
+
+Professional writers may find this layout useful -- copywriters, technical writers, novelists, etc.  
+
+I use my ErgoDox with this keymap as a daily driver at my office.
+
+A gaming layer is unobtrusively built into this layout. I use that layer to play RimWorld. 
+
+Feel free to modify the gaming layer to your personal taste.
+
+## Table of Contents
+
+* [Layouts](#layouts)
+    - [Base layer](#base-layer)
+    - [Symbol layer](#symbol-layer)
+    - [Gaming layer](#rimworld-layer)
+    - [Media layer](#media-layer)
+* [Tools](#tools)
+    - [Layer notification](#layer-notification)
+* [Building](#building)
+    - [Using on Windows](#using-on-windows)
+* [License](#license)
+* [Special Thanks](#special-thanks)
+
+# Layouts
+
+* TapDance will teleport you to the layer you want: 
+* One Tap for the Base layer
+* Two Taps for the Symbol layer
+* Three Taps for the Rimworld/Gaming layer
+
+* Where the "Meh" key is located on the Ergodox EZ default layout, I've changed it to another tap dance key:
+* One Tap for CTRL-ALT-DEL
+* Two Taps for the Media/Mouse layer
+
+## Base layer
+
+[![Base layer](images/base-layer.png)](http://www.keyboard-layout-editor.com/#/gists/8fd9bbdd3a23bbb5a8779de3624a3be1)
+
+This is a QWERTY layout with some quirks. 
+
+* Enter is located on a key that won't cause as much thumb fatigue.  
+* Copy and Paste work from the same key. Just hold the key to copy and tap the key to paste!
+* Undo, Find and Cut are also one-touch keys. 
+* F12 is where you would normally find TAB on standard layouts. Quickly save in Word, safely.
+* You'll find bracket keys below the "6" key.
+
+* The Meh Key is a single-button CTRL+ALT+SHIFT modifier.
+
+* Space Cadet Shift: Tap L Shift for "(" and R Shift for ")" -- holding either shift works like a normal shift.
+* Tap "Z" or Tab to use either normally. Hold them for CTRL. 
+* Tap Caps Lock to use it normally. Hold it for Win key combinations (Win+D to minimize all programs, etc).
+
+## Symbol layer
+
+[![Symbol layer](images/symbol-layer.png)](http://www.keyboard-layout-editor.com/#/gists/04eb6458b8b17882e472f64d482f12b4)
+
+Your standard Ergodox EZ symbol + numpad layout, minus the Version and EEPROM keys.
+
+* From the base layer, hold the F12 Key to temporarily access this layer (use for quick access to numpad)
+* Release F12 to return to the base layer.
+
+## Rimworld layer
+
+[![Rimworld / Gaming Layer](images/rimworld-layer.png)](http://www.keyboard-layout-editor.com/#/gists/d53af8391e6e443ed0a98ccfbdb4eace)
+
+This layer was made to play RimWorld, a Sci-Fi Colony Survival Game by Tynan Sylvester and Ludeon Studios, available on Steam. 
+
+* Have fun!
+
+## Media layer
+
+[![Media layer](images/media-layer.png)](http://www.keyboard-layout-editor.com/#/gists/3209d09ed4bd997e4f49f28c6ada2ab3)
+
+This is the standard Ergodox EZ media layout with more options for mouseclick buttons. 
+
+* In this layer, your "space" key changes into a back button for your browser.
+
+## LED states
+
+Your LEDs will change to indicate your layer. You'll know you are in the base layer if all LEDs are off.
+
+# Building
+
+To build, you will need the [QMK][qmk] firmware checked out. from there, dive into `keyboards/ergodox/keymaps/win10_writers-block/`
+
+[qmk]: https://github.com/jackhumbert/qmk_firmware
+
+```
+$ make keyboard=ergodox keymap=win10_writers-block
+```
+
+## Using on Windows
+
+This layout is tested in Windows 7 Pro and Windows 10 Home environments. 
+
+# License
+
+GPL 3+
+
+# Special Thanks
+
+* To algernon for his coding help. I'm a novice but I still made this work (and figured out tap dance) with his help.
+
+* To /r/MechanicalKeyboards for being an all-around great community.
+
 * To /u/profet23 for his amazing custom Ergodox boards.
\ No newline at end of file

From 508eddf8ba8548d3f71e1c09a404839beb49f45c Mon Sep 17 00:00:00 2001
From: IBNobody <protospherex@gmail.com>
Date: Fri, 28 Oct 2016 14:21:38 -0500
Subject: [PATCH 016/147] Fixing Debounce - WIP

---
 keyboards/vision_division/config.h |   2 +-
 quantum/matrix.c                   | 256 +++++++++++++++++++----------
 tmk_core/common/matrix.h           |  10 ++
 3 files changed, 179 insertions(+), 89 deletions(-)

diff --git a/keyboards/vision_division/config.h b/keyboards/vision_division/config.h
index 93c9606712a..5798d91adf6 100644
--- a/keyboards/vision_division/config.h
+++ b/keyboards/vision_division/config.h
@@ -31,7 +31,7 @@ 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
 
diff --git a/quantum/matrix.c b/quantum/matrix.c
index ac81794e59e..a7dab098770 100644
--- a/quantum/matrix.c
+++ b/quantum/matrix.c
@@ -26,6 +26,33 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "util.h"
 #include "matrix.h"
 
+#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
+
+#if (MATRIX_ROWS <= 8)
+#    define COL_SHIFTER ((uint8_t)1)
+#elif (MATRIX_ROWS <= 16)
+#    define COL_SHIFTER ((uint16_t)1)
+#elif (MATRIX_ROWS <= 32)
+#    define COL_SHIFTER  ((uint32_t)1)
+#endif
+
+
+
 #ifdef MATRIX_MASKED
 extern const matrix_row_t matrix_mask[];
 #endif
@@ -42,24 +69,28 @@ 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_debouncing[MATRIX_ROWS];
 
-#if DIODE_DIRECTION == ROW2COL
-    static matrix_row_t matrix_reversed[MATRIX_COLS];
-    static matrix_row_t matrix_reversed_debouncing[MATRIX_COLS];
+#if DIODE_DIRECTION == COL2ROW
+    static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+#else // ROW2COL
+    static matrix_col_t matrix_transposed[MATRIX_COLS];
+    static matrix_col_t matrix_transposed_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 matrix_row_t read_cols(void);
+    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 matrix_col_t read_rows(void);
+    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();
@@ -99,7 +130,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);
@@ -123,13 +154,15 @@ 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();
 
@@ -139,25 +172,43 @@ void matrix_init(void) {
         matrix_debouncing[i] = 0;
     }
 
+#else // ROW2COL
+    unselect_cols();
+    init_rows();
+
+    // initialize matrix state: all keys off
+    for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+        matrix[i] = 0;
+    }
+
+    // initialize matrix state: all keys off
+    for (uint8_t i=0; i < MATRIX_COLS; i++) {
+        matrix_transposed_debouncing[i] = 0;
+    }
+#endif
+
     matrix_init_quantum();
 }
 
 uint8_t matrix_scan(void)
 {
 
-#if DIODE_DIRECTION == COL2ROW
+#if (DIODE_DIRECTION == COL2ROW)
+
+    // Set row, read cols
+
     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;
+        matrix_row_t current_row = read_cols();
+        if (matrix_debouncing[i] != current_row) {
+            matrix_debouncing[i] = current_row;
             if (debouncing) {
                 debug("bounce!: "); debug_hex(debouncing); debug("\n");
             }
             debouncing = DEBOUNCING_DELAY;
         }
-        unselect_rows();
+        unselect_row(i);
     }
 
     if (debouncing) {
@@ -169,19 +220,23 @@ uint8_t matrix_scan(void)
             }
         }
     }
-#else
+
+#else // ROW2COL
+
+    // Set col, read rows
+
     for (uint8_t i = 0; i < MATRIX_COLS; i++) {
-        select_row(i);
+        select_col(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;
+        matrix_col_t current_col = read_rows();
+        if (matrix_transposed_debouncing[i] != current_col) {
+            matrix_transposed_debouncing[i] = current_col;
             if (debouncing) {
                 debug("bounce!: "); debug_hex(debouncing); debug("\n");
             }
             debouncing = DEBOUNCING_DELAY;
         }
-        unselect_rows();
+        unselect_col(i);
     }
 
     if (debouncing) {
@@ -189,17 +244,20 @@ uint8_t matrix_scan(void)
             wait_ms(1);
         } else {
             for (uint8_t i = 0; i < MATRIX_COLS; i++) {
-                matrix_reversed[i] = matrix_reversed_debouncing[i];
+                matrix_transposed[i] = matrix_transposed_debouncing[i];
             }
         }
     }
+
+    // Untranspose matrix
     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;
+            row |= ((matrix_transposed[x] & (1<<y)) >> y) << x;
         }
         matrix[y] = row;
     }
+
 #endif
 
     matrix_scan_quantum();
@@ -233,23 +291,11 @@ matrix_row_t matrix_get_row(uint8_t row)
 
 void matrix_print(void)
 {
-#if (MATRIX_COLS <= 8)
-    print("\nr/c 01234567\n");
-#elif (MATRIX_COLS <= 16)
-    print("\nr/c 0123456789ABCDEF\n");
-#elif (MATRIX_COLS <= 32)
-    print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n");
-#endif
+    print_matrix_header();
 
     for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
         phex(row); print(": ");
-#if (MATRIX_COLS <= 8)
-        print_bin_reverse8(matrix_get_row(row));
-#elif (MATRIX_COLS <= 16)
-        print_bin_reverse16(matrix_get_row(row));
-#elif (MATRIX_COLS <= 32)
-        print_bin_reverse32(matrix_get_row(row));
-#endif
+        print_matrix_row(row);
         print("\n");
     }
 }
@@ -258,28 +304,21 @@ uint8_t matrix_key_count(void)
 {
     uint8_t count = 0;
     for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
-#if (MATRIX_COLS <= 8)
-        count += bitpop(matrix[i]);
-#elif (MATRIX_COLS <= 16)
-        count += bitpop16(matrix[i]);
-#elif (MATRIX_COLS <= 32)
-        count += bitpop32(matrix[i]);
-#endif
+        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
     }
 }
 
@@ -287,40 +326,81 @@ static matrix_row_t read_cols(void)
 {
     matrix_row_t result = 0;
 
-#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);
+    for(uint8_t x = 0; x < MATRIX_COLS; x++) {
+        uint8_t pin = col_pins[x];
+        result |= (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) ? 0 : (ROW_SHIFTER << x);
     }
-    return result;
-}
 
-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);
-    }
+    return result;
 }
 
 static void select_row(uint8_t row)
 {
-
-#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);
+    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)
+{
+    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
+    }
+}
+
+#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
+    }
+}
+
+static matrix_col_t read_rows(void)
+{
+    matrix_col_t result = 0;
+
+    for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
+        uint8_t pin = row_pins[x];
+        result |= (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) ? 0 : (COL_SHIFTER << x);
+    }
+
+    return result;
+}
+
+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/tmk_core/common/matrix.h b/tmk_core/common/matrix.h
index cee3593eee4..84e066c673a 100644
--- a/tmk_core/common/matrix.h
+++ b/tmk_core/common/matrix.h
@@ -31,6 +31,16 @@ typedef  uint32_t   matrix_row_t;
 #error "MATRIX_COLS: invalid value"
 #endif
 
+#if (MATRIX_ROWS <= 8)
+typedef  uint8_t    matrix_col_t;
+#elif (MATRIX_ROWS <= 16)
+typedef  uint16_t   matrix_col_t;
+#elif (MATRIX_ROWS <= 32)
+typedef  uint32_t   matrix_col_t;
+#else
+#error "MATRIX_COLS: invalid value"
+#endif
+
 #define MATRIX_IS_ON(row, col)  (matrix_get_row(row) && (1<<col))
 
 

From 4c6960835c0a6e29670dabdc27117d7d3c7f99f5 Mon Sep 17 00:00:00 2001
From: IBNobody <protospherex@gmail.com>
Date: Fri, 28 Oct 2016 16:24:20 -0500
Subject: [PATCH 017/147] Refactoring Matrix scanning

---
 quantum/matrix.c         | 173 +++++++++++++++++++++------------------
 tmk_core/common/matrix.h |  10 ---
 2 files changed, 95 insertions(+), 88 deletions(-)

diff --git a/quantum/matrix.c b/quantum/matrix.c
index a7dab098770..1bacea1bed3 100644
--- a/quantum/matrix.c
+++ b/quantum/matrix.c
@@ -43,16 +43,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #    define ROW_SHIFTER  ((uint32_t)1)
 #endif
 
-#if (MATRIX_ROWS <= 8)
-#    define COL_SHIFTER ((uint8_t)1)
-#elif (MATRIX_ROWS <= 16)
-#    define COL_SHIFTER ((uint16_t)1)
-#elif (MATRIX_ROWS <= 32)
-#    define COL_SHIFTER  ((uint32_t)1)
-#endif
-
-
-
 #ifdef MATRIX_MASKED
 extern const matrix_row_t matrix_mask[];
 #endif
@@ -70,6 +60,9 @@ 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];
+
+
 #if DIODE_DIRECTION == COL2ROW
     static matrix_row_t matrix_debouncing[MATRIX_ROWS];
 #else // ROW2COL
@@ -79,13 +72,13 @@ static matrix_row_t matrix[MATRIX_ROWS];
 
 #if (DIODE_DIRECTION == COL2ROW)
     static void init_cols(void);
-    static matrix_row_t read_cols(void);
+    static void 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 matrix_col_t read_rows(void);
+    static void 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);
@@ -169,6 +162,7 @@ void matrix_init(void) {
     // 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;
     }
 
@@ -178,6 +172,7 @@ void matrix_init(void) {
 
     // initialize matrix state: all keys off
     for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+        matrix_raw[i] = 0;
         matrix[i] = 0;
     }
 
@@ -196,67 +191,73 @@ uint8_t matrix_scan(void)
 #if (DIODE_DIRECTION == COL2ROW)
 
     // Set row, read cols
-
-    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
-        select_row(i);
-        wait_us(30);  // without this wait read unstable value.
-        matrix_row_t current_row = read_cols();
-        if (matrix_debouncing[i] != current_row) {
-            matrix_debouncing[i] = current_row;
-            if (debouncing) {
-                debug("bounce!: "); debug_hex(debouncing); debug("\n");
-            }
-            debouncing = DEBOUNCING_DELAY;
-        }
-        unselect_row(i);
+    for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
+        read_cols_on_row(matrix, current_row);
     }
 
-    if (debouncing) {
-        if (--debouncing) {
-            wait_ms(1);
-        } else {
-            for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
-                matrix[i] = matrix_debouncing[i];
-            }
-        }
-    }
+    //     select_row(i);
+    //     wait_us(30);  // without this wait read unstable value.
+    //     matrix_row_t current_row = read_cols();
+    //     if (matrix_debouncing[i] != current_row) {
+    //         matrix_debouncing[i] = current_row;
+    //         if (debouncing) {
+    //             debug("bounce!: "); debug_hex(debouncing); debug("\n");
+    //         }
+    //         debouncing = DEBOUNCING_DELAY;
+    //     }
+    //     unselect_row(i);
+    // }
+
+    // if (debouncing) {
+    //     if (--debouncing) {
+    //         wait_ms(1);
+    //     } else {
+    //         for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+    //             matrix[i] = matrix_debouncing[i];
+    //         }
+    //     }
+    // }
 
 #else // ROW2COL
 
     // Set col, read rows
-
-    for (uint8_t i = 0; i < MATRIX_COLS; i++) {
-        select_col(i);
-        wait_us(30);  // without this wait read unstable value.
-        matrix_col_t current_col = read_rows();
-        if (matrix_transposed_debouncing[i] != current_col) {
-            matrix_transposed_debouncing[i] = current_col;
-            if (debouncing) {
-                debug("bounce!: "); debug_hex(debouncing); debug("\n");
-            }
-            debouncing = DEBOUNCING_DELAY;
-        }
-        unselect_col(i);
+    for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
+        read_rows_on_col(matrix, current_col);
     }
 
-    if (debouncing) {
-        if (--debouncing) {
-            wait_ms(1);
-        } else {
-            for (uint8_t i = 0; i < MATRIX_COLS; i++) {
-                matrix_transposed[i] = matrix_transposed_debouncing[i];
-            }
-        }
-    }
 
-    // Untranspose matrix
-    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_transposed[x] & (1<<y)) >> y) << x;
-        }
-        matrix[y] = row;
-    }
+    // for (uint8_t i = 0; i < MATRIX_COLS; i++) {
+    //     select_col(i);
+    //     wait_us(30);  // without this wait read unstable value.
+    //     matrix_col_t current_col = read_rows();
+    //     if (matrix_transposed_debouncing[i] != current_col) {
+    //         matrix_transposed_debouncing[i] = current_col;
+    //         if (debouncing) {
+    //             debug("bounce!: "); debug_hex(debouncing); debug("\n");
+    //         }
+    //         debouncing = DEBOUNCING_DELAY;
+    //     }
+    //     unselect_col(i);
+    // }
+
+    // if (debouncing) {
+    //     if (--debouncing) {
+    //         wait_ms(1);
+    //     } else {
+    //         for (uint8_t i = 0; i < MATRIX_COLS; i++) {
+    //             matrix_transposed[i] = matrix_transposed_debouncing[i];
+    //         }
+    //     }
+    // }
+
+    // // Untranspose matrix
+    // 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_transposed[x] & (1<<y)) >> y) << x;
+    //     }
+    //     matrix[y] = row;
+    // }
 
 #endif
 
@@ -322,16 +323,25 @@ static void init_cols(void)
     }
 }
 
-static matrix_row_t read_cols(void)
+static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
 {
-    matrix_row_t result = 0;
+    // Clear data in matrix row
+    current_matrix[current_row] = 0;
 
-    for(uint8_t x = 0; x < MATRIX_COLS; x++) {
-        uint8_t pin = col_pins[x];
-        result |= (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) ? 0 : (ROW_SHIFTER << x);
+    // 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;
 }
 
 static void select_row(uint8_t row)
@@ -368,16 +378,23 @@ static void init_rows(void)
     }
 }
 
-static matrix_col_t read_rows(void)
+static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
 {
-    matrix_col_t result = 0;
 
-    for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
-        uint8_t pin = row_pins[x];
-        result |= (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) ? 0 : (COL_SHIFTER << x);
+    // 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++) {
+
+        // Select the row pin to read (active low)
+        uint8_t pin = row_pins[row_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[row_index] &= pin_state ? ~(ROW_SHIFTER << current_col) : 0;
     }
-
-    return result;
 }
 
 static void select_col(uint8_t col)
diff --git a/tmk_core/common/matrix.h b/tmk_core/common/matrix.h
index 84e066c673a..cee3593eee4 100644
--- a/tmk_core/common/matrix.h
+++ b/tmk_core/common/matrix.h
@@ -31,16 +31,6 @@ typedef  uint32_t   matrix_row_t;
 #error "MATRIX_COLS: invalid value"
 #endif
 
-#if (MATRIX_ROWS <= 8)
-typedef  uint8_t    matrix_col_t;
-#elif (MATRIX_ROWS <= 16)
-typedef  uint16_t   matrix_col_t;
-#elif (MATRIX_ROWS <= 32)
-typedef  uint32_t   matrix_col_t;
-#else
-#error "MATRIX_COLS: invalid value"
-#endif
-
 #define MATRIX_IS_ON(row, col)  (matrix_get_row(row) && (1<<col))
 
 

From 32f88c07173b795c6981c779057dceba00aeb1cb Mon Sep 17 00:00:00 2001
From: IBNobody <ibnobody@gmail.com>
Date: Sat, 29 Oct 2016 10:39:03 -0500
Subject: [PATCH 018/147] Made scanning more efficient

---
 quantum/matrix.c | 57 +++++++++++++++++++++---------------------------
 1 file changed, 25 insertions(+), 32 deletions(-)

diff --git a/quantum/matrix.c b/quantum/matrix.c
index 1bacea1bed3..f45b251e4d7 100644
--- a/quantum/matrix.c
+++ b/quantum/matrix.c
@@ -61,24 +61,18 @@ static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
 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 == COL2ROW
-    static matrix_row_t matrix_debouncing[MATRIX_ROWS];
-#else // ROW2COL
-    static matrix_col_t matrix_transposed[MATRIX_COLS];
-    static matrix_col_t matrix_transposed_debouncing[MATRIX_COLS];
-#endif
-
 #if (DIODE_DIRECTION == COL2ROW)
     static void init_cols(void);
-    static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
+    static void 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 void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
+    static void 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);
@@ -158,6 +152,10 @@ void matrix_init(void) {
 #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++) {
@@ -166,22 +164,6 @@ void matrix_init(void) {
         matrix_debouncing[i] = 0;
     }
 
-#else // ROW2COL
-    unselect_cols();
-    init_rows();
-
-    // initialize matrix state: all keys off
-    for (uint8_t i=0; i < MATRIX_ROWS; i++) {
-        matrix_raw[i] = 0;
-        matrix[i] = 0;
-    }
-
-    // initialize matrix state: all keys off
-    for (uint8_t i=0; i < MATRIX_COLS; i++) {
-        matrix_transposed_debouncing[i] = 0;
-    }
-#endif
-
     matrix_init_quantum();
 }
 
@@ -262,7 +244,7 @@ uint8_t matrix_scan(void)
 #endif
 
     matrix_scan_quantum();
-
+// matrix_print();
     return 1;
 }
 
@@ -342,6 +324,9 @@ static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
         // Populate the matrix row with the state of the col pin
         current_matrix[current_row] |=  pin_state ? 0 : (ROW_SHIFTER << col_index);
     }
+
+    // Unselect row
+    unselect_row(current_row);
 }
 
 static void select_row(uint8_t row)
@@ -388,13 +373,21 @@ static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
     // For each row...
     for(uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) {
 
-        // Select the row pin to read (active low)
-        uint8_t pin = row_pins[row_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[row_index] &= pin_state ? ~(ROW_SHIFTER << current_col) : 0;
+        // 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);
+        }
     }
+
+    // Unselect col
+    unselect_col(current_col);
 }
 
 static void select_col(uint8_t col)

From f4030289744fc6dc82dd85c955070c0845813cc5 Mon Sep 17 00:00:00 2001
From: IBNobody <protospherex@gmail.com>
Date: Sat, 29 Oct 2016 16:12:58 -0500
Subject: [PATCH 019/147] added fixed debounce code

---
 quantum/matrix.c | 143 +++++++++++++++++++++++------------------------
 1 file changed, 70 insertions(+), 73 deletions(-)

diff --git a/quantum/matrix.c b/quantum/matrix.c
index f45b251e4d7..3c488b417d6 100644
--- a/quantum/matrix.c
+++ b/quantum/matrix.c
@@ -25,6 +25,19 @@ 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
+
+#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")
@@ -44,16 +57,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #endif
 
 #ifdef MATRIX_MASKED
-extern const matrix_row_t matrix_mask[];
+    extern const matrix_row_t matrix_mask[];
 #endif
 
-/* Set 0 if debouncing isn't needed */
-
-#ifndef DEBOUNCING_DELAY
-#   define DEBOUNCING_DELAY 5
-#endif
-static uint8_t debouncing = DEBOUNCING_DELAY;
-
 static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
 static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
 
@@ -66,13 +72,13 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS];
 
 #if (DIODE_DIRECTION == COL2ROW)
     static void init_cols(void);
-    static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row);
+    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 void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col);
+    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);
@@ -174,83 +180,56 @@ uint8_t matrix_scan(void)
 
     // Set row, read cols
     for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
-        read_cols_on_row(matrix, 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
+
     }
 
-    //     select_row(i);
-    //     wait_us(30);  // without this wait read unstable value.
-    //     matrix_row_t current_row = read_cols();
-    //     if (matrix_debouncing[i] != current_row) {
-    //         matrix_debouncing[i] = current_row;
-    //         if (debouncing) {
-    //             debug("bounce!: "); debug_hex(debouncing); debug("\n");
-    //         }
-    //         debouncing = DEBOUNCING_DELAY;
-    //     }
-    //     unselect_row(i);
-    // }
-
-    // if (debouncing) {
-    //     if (--debouncing) {
-    //         wait_ms(1);
-    //     } else {
-    //         for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
-    //             matrix[i] = matrix_debouncing[i];
-    //         }
-    //     }
-    // }
-
 #else // ROW2COL
 
     // Set col, read rows
     for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
-        read_rows_on_col(matrix, 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();
+            }
+#       else
+             read_rows_on_col(matrix, current_col);
+#       endif
+
     }
 
-
-    // for (uint8_t i = 0; i < MATRIX_COLS; i++) {
-    //     select_col(i);
-    //     wait_us(30);  // without this wait read unstable value.
-    //     matrix_col_t current_col = read_rows();
-    //     if (matrix_transposed_debouncing[i] != current_col) {
-    //         matrix_transposed_debouncing[i] = current_col;
-    //         if (debouncing) {
-    //             debug("bounce!: "); debug_hex(debouncing); debug("\n");
-    //         }
-    //         debouncing = DEBOUNCING_DELAY;
-    //     }
-    //     unselect_col(i);
-    // }
-
-    // if (debouncing) {
-    //     if (--debouncing) {
-    //         wait_ms(1);
-    //     } else {
-    //         for (uint8_t i = 0; i < MATRIX_COLS; i++) {
-    //             matrix_transposed[i] = matrix_transposed_debouncing[i];
-    //         }
-    //     }
-    // }
-
-    // // Untranspose matrix
-    // 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_transposed[x] & (1<<y)) >> y) << x;
-    //     }
-    //     matrix[y] = row;
-    // }
-
 #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;
+        }
+#   endif
+
     matrix_scan_quantum();
-// matrix_print();
     return 1;
 }
 
 bool matrix_is_modified(void)
 {
+#if (DEBOUNCING_DELAY > 0)
     if (debouncing) return false;
+#endif
     return true;
 }
 
@@ -305,8 +284,11 @@ static void init_cols(void)
     }
 }
 
-static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
+static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
 {
+    // Store last value of row prior to reading
+    matrix_row_t last_row_value = current_matrix[current_row];
+
     // Clear data in matrix row
     current_matrix[current_row] = 0;
 
@@ -327,6 +309,8 @@ static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
 
     // Unselect row
     unselect_row(current_row);
+
+    return (last_row_value == current_matrix[current_row]);
 }
 
 static void select_row(uint8_t row)
@@ -363,15 +347,20 @@ static void init_rows(void)
     }
 }
 
-static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
+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++) {
+    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)
@@ -384,10 +373,18 @@ static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
             // 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)

From 78976d8f7a7702eb4e94819af40fb3b32ac6825f Mon Sep 17 00:00:00 2001
From: IBNobody <protospherex@gmail.com>
Date: Tue, 1 Nov 2016 11:52:58 -0500
Subject: [PATCH 020/147] Adding SKIP_GIT to speed up compiles.

---
 Makefile | 57 ++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 39 insertions(+), 18 deletions(-)

diff --git a/Makefile b/Makefile
index 66c0ff30f49..aa33c40f1ff 100644
--- 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)

From c06e2486abda43205a490fc6b233f72f34667857 Mon Sep 17 00:00:00 2001
From: Fred Sundvik <fsundvik@gmail.com>
Date: Sat, 5 Nov 2016 22:45:21 +0200
Subject: [PATCH 021/147] Increase the infinity60 system tick frequency

---
 keyboards/infinity60/chconf.h | 2 +-
 keyboards/infinity60/matrix.c | 7 ++++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/keyboards/infinity60/chconf.h b/keyboards/infinity60/chconf.h
index 43c845739a6..d9114ec858b 100644
--- a/keyboards/infinity60/chconf.h
+++ b/keyboards/infinity60/chconf.h
@@ -48,7 +48,7 @@
  * @details Frequency of the system timer that drives the system ticks. This
  *          setting also defines the system tick time unit.
  */
-#define CH_CFG_ST_FREQUENCY                 1000
+#define CH_CFG_ST_FREQUENCY                 100000
 
 /**
  * @brief   Time delta constant for the tick-less mode.
diff --git a/keyboards/infinity60/matrix.c b/keyboards/infinity60/matrix.c
index 62c165aa533..d2f1852885d 100644
--- a/keyboards/infinity60/matrix.c
+++ b/keyboards/infinity60/matrix.c
@@ -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);

From 6e27f6fbde47804035d508eb84690ed7ee9acee7 Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@gmail.com>
Date: Thu, 10 Nov 2016 18:19:13 -0500
Subject: [PATCH 022/147]   Changes to be committed: 	new file:  
 keyboards/lets_splitv2/Makefile 	new file:  
 keyboards/lets_splitv2/config.h 	new file:  
 keyboards/lets_splitv2/i2c.c 	new file:   keyboards/lets_splitv2/i2c.h 
 new file:   keyboards/lets_splitv2/imgs/split-keyboard-i2c-schematic.png 
 new file:   keyboards/lets_splitv2/imgs/split-keyboard-serial-schematic.png 
 new file:   keyboards/lets_splitv2/keymaps/default/keymap.c 	new file:  
 keyboards/lets_splitv2/lets_split.c 	new file:  
 keyboards/lets_splitv2/lets_split.h 	new file:  
 keyboards/lets_splitv2/matrix.c 	new file:  
 keyboards/lets_splitv2/pro_micro.h 	new file:  
 keyboards/lets_splitv2/readme.md 	new file:  
 keyboards/lets_splitv2/serial.c 	new file:  
 keyboards/lets_splitv2/serial.h 	new file:  
 keyboards/lets_splitv2/split_util.c 	new file:  
 keyboards/lets_splitv2/split_util.h 	new file:   keyboards/maxipad/Makefile
 	new file:   keyboards/maxipad/config.h 	new file:  
 keyboards/maxipad/keymaps/default/Makefile 	new file:  
 keyboards/maxipad/keymaps/default/config.h 	new file:  
 keyboards/maxipad/keymaps/default/keymap.c 	new file:  
 keyboards/maxipad/keymaps/default/readme.md 	new file:  
 keyboards/maxipad/maxipad.c 	new file:   keyboards/maxipad/maxipad.h 
 new file:   keyboards/maxipad/readme.md

---
 keyboards/lets_split/Makefile                 |   2 +-
 keyboards/lets_split/config.h                 |   6 +-
 keyboards/lets_split/keymaps/default/keymap.c |  65 +---
 keyboards/lets_split/lets_split.h             |   8 +-
 keyboards/lets_splitv2/Makefile               |  78 ++++
 keyboards/lets_splitv2/config.h               |  98 +++++
 keyboards/lets_splitv2/i2c.c                  | 159 ++++++++
 keyboards/lets_splitv2/i2c.h                  |  31 ++
 .../imgs/split-keyboard-i2c-schematic.png     | Bin 0 -> 26565 bytes
 .../imgs/split-keyboard-serial-schematic.png  | Bin 0 -> 19487 bytes
 .../lets_splitv2/keymaps/default/keymap.c     | 159 ++++++++
 keyboards/lets_splitv2/lets_split.c           |  30 ++
 keyboards/lets_splitv2/lets_split.h           |  25 ++
 keyboards/lets_splitv2/matrix.c               | 311 +++++++++++++++
 keyboards/lets_splitv2/pro_micro.h            | 362 ++++++++++++++++++
 keyboards/lets_splitv2/readme.md              | 102 +++++
 keyboards/lets_splitv2/serial.c               | 225 +++++++++++
 keyboards/lets_splitv2/serial.h               |  26 ++
 keyboards/lets_splitv2/split_util.c           |  76 ++++
 keyboards/lets_splitv2/split_util.h           |  22 ++
 keyboards/maxipad/Makefile                    |  75 ++++
 keyboards/maxipad/config.h                    | 162 ++++++++
 keyboards/maxipad/keymaps/default/Makefile    |  21 +
 keyboards/maxipad/keymaps/default/config.h    |   8 +
 keyboards/maxipad/keymaps/default/keymap.c    |  54 +++
 keyboards/maxipad/keymaps/default/readme.md   |   1 +
 keyboards/maxipad/maxipad.c                   |  28 ++
 keyboards/maxipad/maxipad.h                   |  25 ++
 keyboards/maxipad/readme.md                   |  28 ++
 29 files changed, 2119 insertions(+), 68 deletions(-)
 create mode 100644 keyboards/lets_splitv2/Makefile
 create mode 100644 keyboards/lets_splitv2/config.h
 create mode 100644 keyboards/lets_splitv2/i2c.c
 create mode 100644 keyboards/lets_splitv2/i2c.h
 create mode 100644 keyboards/lets_splitv2/imgs/split-keyboard-i2c-schematic.png
 create mode 100644 keyboards/lets_splitv2/imgs/split-keyboard-serial-schematic.png
 create mode 100644 keyboards/lets_splitv2/keymaps/default/keymap.c
 create mode 100644 keyboards/lets_splitv2/lets_split.c
 create mode 100644 keyboards/lets_splitv2/lets_split.h
 create mode 100644 keyboards/lets_splitv2/matrix.c
 create mode 100644 keyboards/lets_splitv2/pro_micro.h
 create mode 100644 keyboards/lets_splitv2/readme.md
 create mode 100644 keyboards/lets_splitv2/serial.c
 create mode 100644 keyboards/lets_splitv2/serial.h
 create mode 100644 keyboards/lets_splitv2/split_util.c
 create mode 100644 keyboards/lets_splitv2/split_util.h
 create mode 100644 keyboards/maxipad/Makefile
 create mode 100644 keyboards/maxipad/config.h
 create mode 100644 keyboards/maxipad/keymaps/default/Makefile
 create mode 100644 keyboards/maxipad/keymaps/default/config.h
 create mode 100644 keyboards/maxipad/keymaps/default/keymap.c
 create mode 100644 keyboards/maxipad/keymaps/default/readme.md
 create mode 100644 keyboards/maxipad/maxipad.c
 create mode 100644 keyboards/maxipad/maxipad.h
 create mode 100644 keyboards/maxipad/readme.md

diff --git a/keyboards/lets_split/Makefile b/keyboards/lets_split/Makefile
index b9f07636be0..982cfc591bb 100644
--- a/keyboards/lets_split/Makefile
+++ b/keyboards/lets_split/Makefile
@@ -67,7 +67,7 @@ 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.
-
+USE_I2C ?= yes
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
 
diff --git a/keyboards/lets_split/config.h b/keyboards/lets_split/config.h
index 6f90997ab49..bf618704cd1 100644
--- a/keyboards/lets_split/config.h
+++ b/keyboards/lets_split/config.h
@@ -25,7 +25,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PRODUCT_ID      0x3060
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    Wootpatoot
-#define PRODUCT         Lets Split
+#define PRODUCT         Lets Split v2
 #define DESCRIPTION     A split keyboard for the cheap makers
 
 /* key matrix size */
@@ -34,8 +34,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define MATRIX_COLS 6
 
 // wiring of each half
-#define MATRIX_ROW_PINS { B5, B4, E6, D7 }
-#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 }
+#define MATRIX_ROW_PINS { D7, E6, B4, B5 }
+#define MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 }
 
 #define CATERINA_BOOTLOADER
 
diff --git a/keyboards/lets_split/keymaps/default/keymap.c b/keyboards/lets_split/keymaps/default/keymap.c
index 0d2d94b6726..8c8466ebd5d 100644
--- a/keyboards/lets_split/keymaps/default/keymap.c
+++ b/keyboards/lets_split/keymaps/default/keymap.c
@@ -42,64 +42,17 @@ 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, _LOWER, KC_LGUI, KC_LALT, MO(_LOWER),   KC_SPC,  KC_LSFT,  MO(_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 |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[_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_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 , \
-  ADJUST,  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 |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[_DVORAK] = KEYMAP( \
-  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 , \
-  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, \
   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, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
 ),
 
 /* Raise
@@ -117,7 +70,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   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 \
+  _______, _______, _______, _______, _______, KC_ENT, KC_ENT, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
 ),
 
 /* Adjust (Lower + Raise)
@@ -131,14 +84,6 @@ 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,  _______, _______, \
-  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
-  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
-)
-
-
 };
 
 #ifdef AUDIO_ENABLE
diff --git a/keyboards/lets_split/lets_split.h b/keyboards/lets_split/lets_split.h
index fe7ae076792..04844ed6392 100644
--- a/keyboards/lets_split/lets_split.h
+++ b/keyboards/lets_split/lets_split.h
@@ -6,10 +6,10 @@
 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, 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 }, \
diff --git a/keyboards/lets_splitv2/Makefile b/keyboards/lets_splitv2/Makefile
new file mode 100644
index 00000000000..982cfc591bb
--- /dev/null
+++ b/keyboards/lets_splitv2/Makefile
@@ -0,0 +1,78 @@
+SRC += matrix.c \
+	   i2c.c \
+	   split_util.c \
+	   serial.c
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= no         # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE ?= no      # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no            # MIDI controls
+AUDIO_ENABLE ?= 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.
+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
+
+CUSTOM_MATRIX = yes
+
+ifndef QUANTUM_DIR
+	include ../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/lets_splitv2/config.h b/keyboards/lets_splitv2/config.h
new file mode 100644
index 00000000000..bf618704cd1
--- /dev/null
+++ b/keyboards/lets_splitv2/config.h
@@ -0,0 +1,98 @@
+/*
+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
+
+// #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 ws2812_PORTREG  PORTD
+#define ws2812_DDRREG   DDRD
+#define ws2812_pin PD1
+#define RGBLED_NUM 28     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+// #define NO_DEBUG
+
+/* disable print */
+// #define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
\ No newline at end of file
diff --git a/keyboards/lets_splitv2/i2c.c b/keyboards/lets_splitv2/i2c.c
new file mode 100644
index 00000000000..c72789403e5
--- /dev/null
+++ b/keyboards/lets_splitv2/i2c.c
@@ -0,0 +1,159 @@
+#include <util/twi.h>
+#include <avr/io.h>
+#include <stdlib.h>
+#include <avr/interrupt.h>
+#include <util/twi.h>
+#include <stdbool.h>
+#include "i2c.h"
+
+// Limits the amount of we wait for any one i2c transaction.
+// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is
+// 9 bits, a single transaction will take around 90μs to complete.
+//
+// (F_CPU/SCL_CLOCK)  =>  # of μC cycles to transfer a bit
+// poll loop takes at least 8 clock cycles to execute
+#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8
+
+#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE)
+
+volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE];
+
+static volatile uint8_t slave_buffer_pos;
+static volatile bool slave_has_register_set = false;
+
+// Wait for an i2c operation to finish
+inline static
+void i2c_delay(void) {
+  uint16_t lim = 0;
+  while(!(TWCR & (1<<TWINT)) && lim < I2C_LOOP_TIMEOUT)
+    lim++;
+
+  // easier way, but will wait slightly longer
+  // _delay_us(100);
+}
+
+// Setup twi to run at 100kHz
+void i2c_master_init(void) {
+  // no prescaler
+  TWSR = 0;
+  // Set TWI clock frequency to SCL_CLOCK. Need TWBR>10.
+  // Check datasheets for more info.
+  TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
+}
+
+// Start a transaction with the given i2c slave address. The direction of the
+// transfer is set with I2C_READ and I2C_WRITE.
+// returns: 0 => success
+//          1 => error
+uint8_t i2c_master_start(uint8_t address) {
+  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);
+
+  i2c_delay();
+
+  // check that we started successfully
+  if ( (TW_STATUS != TW_START) && (TW_STATUS != TW_REP_START))
+    return 1;
+
+  TWDR = address;
+  TWCR = (1<<TWINT) | (1<<TWEN);
+
+  i2c_delay();
+
+  if ( (TW_STATUS != TW_MT_SLA_ACK) && (TW_STATUS != TW_MR_SLA_ACK) )
+    return 1; // slave did not acknowledge
+  else
+    return 0; // success
+}
+
+
+// Finish the i2c transaction.
+void i2c_master_stop(void) {
+  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
+
+  uint16_t lim = 0;
+  while(!(TWCR & (1<<TWSTO)) && lim < I2C_LOOP_TIMEOUT)
+    lim++;
+}
+
+// Write one byte to the i2c slave.
+// returns 0 => slave ACK
+//         1 => slave NACK
+uint8_t i2c_master_write(uint8_t data) {
+  TWDR = data;
+  TWCR = (1<<TWINT) | (1<<TWEN);
+
+  i2c_delay();
+
+  // check if the slave acknowledged us
+  return (TW_STATUS == TW_MT_DATA_ACK) ? 0 : 1;
+}
+
+// Read one byte from the i2c slave. If ack=1 the slave is acknowledged,
+// if ack=0 the acknowledge bit is not set.
+// returns: byte read from i2c device
+uint8_t i2c_master_read(int ack) {
+  TWCR = (1<<TWINT) | (1<<TWEN) | (ack<<TWEA);
+
+  i2c_delay();
+  return TWDR;
+}
+
+void i2c_reset_state(void) {
+  TWCR = 0;
+}
+
+void i2c_slave_init(uint8_t address) {
+  TWAR = address << 0; // slave i2c address
+  // TWEN  - twi enable
+  // TWEA  - enable address acknowledgement
+  // TWINT - twi interrupt flag
+  // TWIE  - enable the twi interrupt
+  TWCR = (1<<TWIE) | (1<<TWEA) | (1<<TWINT) | (1<<TWEN);
+}
+
+ISR(TWI_vect);
+
+ISR(TWI_vect) {
+  uint8_t ack = 1;
+  switch(TW_STATUS) {
+    case TW_SR_SLA_ACK:
+      // this device has been addressed as a slave receiver
+      slave_has_register_set = false;
+      break;
+
+    case TW_SR_DATA_ACK:
+      // this device has received data as a slave receiver
+      // The first byte that we receive in this transaction sets the location
+      // of the read/write location of the slaves memory that it exposes over
+      // i2c.  After that, bytes will be written at slave_buffer_pos, incrementing
+      // slave_buffer_pos after each write.
+      if(!slave_has_register_set) {
+        slave_buffer_pos = TWDR;
+        // don't acknowledge the master if this memory loctaion is out of bounds
+        if ( slave_buffer_pos >= SLAVE_BUFFER_SIZE ) {
+          ack = 0;
+          slave_buffer_pos = 0;
+        }
+        slave_has_register_set = true;
+      } else {
+        i2c_slave_buffer[slave_buffer_pos] = TWDR;
+        BUFFER_POS_INC();
+      }
+      break;
+
+    case TW_ST_SLA_ACK:
+    case TW_ST_DATA_ACK:
+      // master has addressed this device as a slave transmitter and is
+      // requesting data.
+      TWDR = i2c_slave_buffer[slave_buffer_pos];
+      BUFFER_POS_INC();
+      break;
+
+    case TW_BUS_ERROR: // something went wrong, reset twi state
+      TWCR = 0;
+    default:
+      break;
+  }
+  // Reset everything, so we are ready for the next TWI interrupt
+  TWCR |= (1<<TWIE) | (1<<TWINT) | (ack<<TWEA) | (1<<TWEN);
+}
diff --git a/keyboards/lets_splitv2/i2c.h b/keyboards/lets_splitv2/i2c.h
new file mode 100644
index 00000000000..08ce4b0093a
--- /dev/null
+++ b/keyboards/lets_splitv2/i2c.h
@@ -0,0 +1,31 @@
+#ifndef I2C_H
+#define I2C_H
+
+#include <stdint.h>
+
+#ifndef F_CPU
+#define F_CPU 16000000UL
+#endif
+
+#define I2C_READ 1
+#define I2C_WRITE 0
+
+#define I2C_ACK 1
+#define I2C_NACK 0
+
+#define SLAVE_BUFFER_SIZE 0x10
+
+// i2c SCL clock frequency
+#define SCL_CLOCK  100000L
+
+extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE];
+
+void i2c_master_init(void);
+uint8_t i2c_master_start(uint8_t address);
+void i2c_master_stop(void);
+uint8_t i2c_master_write(uint8_t data);
+uint8_t i2c_master_read(int);
+void i2c_reset_state(void);
+void i2c_slave_init(uint8_t address);
+
+#endif
diff --git a/keyboards/lets_splitv2/imgs/split-keyboard-i2c-schematic.png b/keyboards/lets_splitv2/imgs/split-keyboard-i2c-schematic.png
new file mode 100644
index 0000000000000000000000000000000000000000..8882947187b15ae4c0cf70c90725d67fb2386d87
GIT binary patch
literal 26565
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
YZ*J%5%7ZOoIGcw!{-X~Y-v8v-@5~+X@&Et;

literal 0
HcmV?d00001

diff --git a/keyboards/lets_splitv2/imgs/split-keyboard-serial-schematic.png b/keyboards/lets_splitv2/imgs/split-keyboard-serial-schematic.png
new file mode 100644
index 0000000000000000000000000000000000000000..7621d38ed94c1716410cdb2b459aa35ad6797160
GIT binary patch
literal 19487
zcmeHvbyQVrzxB2Y!B$X0-3S<TNE;|@6_9RFP*Om;<CqwPfKmbqNQX$b9uP%Jq#H!K
zy9B<uJm3BM8{>ZCj{Dv_Ue7qX1@_u&J<l)ZoWJ?_<hqRH&h2#DNhH!vij;&riL`My
ziL~By>t=lAM)|-n{@AR0RZ@bqM*R1tAjS`0*>+b-%?j^mB>rD_fi=V)U)*9%k-oI0
zYcuUZA+G(M0!K+CCK5&ByrO-}NV}c0=X}rFn!ziN5@lxNl$PU{<usT*M2Ach)ax4z
z3u-u)E^EZcHpI)-%PWr7$L~+GjVqwkc`@z2rBx*EY`J3j+V9tu=T}6=vRZQl`_=n%
zlT}_13sq0k$vnDwXgxlhM3Q>I6Z7W<N%g$PKQB%nmH6kyt6j(bd2w|so({j<nICNZ
z^Wx*43mgBuxUuc%Ki7HxVAr}oUs1jAKj<>gR_BY>*zCsIg2mkmix=hO<cw<~9zNa2
z7O`OqH90#eF!0dqK+VO)sovV9*<ryPJYhBE?%ntCN(s^1_n#b?>Mf@Z5WL&vPQ2y7
z8Fki^C%>7k-rqvQt6Q?w!O7{=)mNwcj!SwSq2o35`TOs`&(=s~yrwGVJiGJU&mU2g
z$gf|eloD0toaRO>>{BNvCtr{Y)>fB;d5z@rTj_Z8pFg6aJw`EZNDO*)Mx%5ag3F$|
zuQDXYi(dGOZ?sHkd`E#(>zV0KTNn+eewFz~tt`(cI4@51<r6PVTQh~M`mW`VzYw-F
zs|*p4<uk79dT_knqIVyuLE`e|mfwdve?NHjA}UEE%ed+N%~!8Bkw_oYa$@|VJUl$e
zosD?%Vya!5nwtIs=Gs=;*RT5=JAQoszI{=+nW5i{(^FGZKckK-y%pRraU@jSO*=_F
z!&3DOHP(ouut|NJn3z~go?S{+n5c;uHNDWShHC{5)6vn=A*I_c#$WUxiEP1gFO8&C
zD;7FCv}aq~--}4{xlkF%b@3p(=JzmBC&gq<!4QYfPxsf(4AxdQYGmH&esHuN(HVBX
zInBTX_nhmpoJnRgX-Is%57D{rYgrk^VY=^ST3SzveDjCfJmHd(l2(8F3?Y!K&nIi<
z{QC8aY+zuJVbUm*ppw!Tg?o*<a7rbaH~b)*{DZys6d!x-|EvFvT;ydT>j57TQBkEg
z=hm%ESBw9-zTyc^&g(iZvo9BgZ1-(t;v??FPyXE%i#@oGe4N|rqNL4Gog5a59B0}4
zE&lr3^(>p?s4HplZBo}Z%_3K=+2O`U+&eSHVd_`S-w$^Pa!I}XC%Kq{%sTSpa&3l(
zno{+AqZ+lHq}Q!m_bq^fk!4HVo`158Ts+#E)!W}6gOHN))pnUxO42FPUYzdl|HV{)
z>`&IZlXIQslbu~$GThc&DL+o7<VQ${@DI*5>fmRTj!TeyS$TPRDYZz}iJx~ZExE%V
zKYYmSsB_S6QMJ3f+qf+|b#A2jIOW@G!L)`XjhLUGpIO~|F|_*_>A*`?xeLD5b0cbJ
z)IOBxYg=2VmwFyH$U2RO(>`rcG*FG5%QElG402nVF*>7_tLW>`Z>qkZ_4-Hla})FP
zjkp{$g_cLZj?wM+Tda?T<)r)#56O=aM=w5#z4(~gH)?LQ)ucL1^rY(hH)Nwv_cm?c
zy47bU_Dq}bc)ng*^36l)sk#r7b&A+2{09?0emsXzDR$OM)0f_VM%{le0&jv!F<y~k
zGu%**JKKNgQ0$eLCkOA-i23B@<(YLBCQbHy8UA#Ci*M9ed)_I8Q(rC(gUI#TXz2`x
zX?-j8;f5reu8-^J&))sm=OQ8^QWvju%E8|L?vEGoXK5eZyi4a^^0}lWmg09p9Uq!s
zo}HaN5TN5KSN`gZX>>I*j9%C_eMU^}!>yX$@_^p4u`0?Ir0iy-YxGck0xqvH$*z!n
z_vUC@PVEVaL;QCF#g<2S%ExPCWErKyM1uBuDL(9@a<5-IT~($2;ntI-xzSSx4<5{0
zOevTPR!-J5I>=P=Xa~iCQPOlAt3F}9k3(CtHPci9IYM7$UKjf!)2!WiFB5q-OvYDJ
zD{jHF?s4$ebKFOSZLhUvnG5JRIXcFxrRh)2%sjUXMHUSGcz3mL_^^Q40Alf^O7d%m
zzbq^*<=b;@Mq4@%B3*;eo;<0+z1z$VDOst%ICe=fLHW$%a>+}Vj0S(avt405>nrBs
zm|<9RujL)n|7{x_EWtcP#FI$>xxRq{6~&HZifKsENzpEFWJ7tZ9&w3?jGS$^>ntlT
zzZxoR=W5)lm2aQAe#3@(EM87tUQDc&+eFv-GwSJ5TwGkX(?6o66A(`ccf0>)`>C2~
z+8XWdPMRHS*Far(W|xEXH!ginJ2gA2)cftFf|A2}(uDbTYU+l%I0Yr_Zhfp=&%^97
zmd|B=EPQUO&Kc&N+Lxa0qsaA(oj!fd?}YRZ+{BTp6y>Dg-zzJ<zkbd9%~<YvSb*2G
zg||LQL!~}m>6x8iF(<D{!)e+_Z|yo=RH~|~sLRu|@@!A4r?ak|*RkC!?<s6Ic4)9R
zMu1F<3hfp>&Sy8KdC~W1SyQ$}k3w_bx0k0XO_!FI=w7^d!8Y`}|J%#*HaAHc#6+Y?
zV{$3pqchO6m4-$D`)DA=9n5F)s_TP!!R)J}WnTliB6siKf178#oTG@>dnGBW<BCP^
zHqytUIG5$QN91Ds!iSVv<&4>lw#>%0`xVZ$m^>mMN6RYhbXyCJs9Je*{{Ei)7{6Qo
zr&Ow%u!K9@P9wy5$+Tf%VWkM4pIT!v;jY}?ricapX=+BXJGUx>`98m52@?zEi8_{`
zoFs2(7)v%9ZOK5Tp5t*!L9IROyh<)ynbVkFM6pZ1UH)pH&FWrZnwpxLrS8X!Go^>k
z2auy2BNlBrR+1=5zELkvsSGVl_D~137P%E6D9p3G$Vf!Pf$wkohEY*ZF)_KXp_Z%e
zVqi!{=3Vt2>nuval|=)FS8H=)km*6}TDfEjKJe9vYk@uyRcrMLDtop1Qi@jP(YDf!
zYNPjAxH*n@h)M_ZvUR9$)p1?Coj;%6^Tk^Q?OrVmFZ#s?uX^n|x?e5b@WtZq?&8Pl
zIhMDdwybU5Nf%f>-Cv#Z;dXiSS4-CGZ`_G{oF>xyM~o~71zq^Ler52>V_wWBPF&Xe
z;$?G|W9)P3*!|DVYWO(HeqvXqGxaO!+VkwHomYlailSpzh{)pBuVAHE+St4-Dsp>z
z<{1K|wXJq#rdIZ(T*QMYN%37SQ)Mh{eX7ydf^=8A4mARnSkDa9*f&nk&j%zVn8dTn
ziqOwI@wxKg(W4=6@zwW1bGUfCLW~Ss-=WP^hu)~@xF`j%Ysn+cDxS$+>FMo#=Qumm
zd=1$V_WSqmicCZC-xK#c+}2k1S%`?Q{Z705{LotwhpE8Ys!-vWcUJ>WWOqbddd7>W
z)hcl0yA;3zfYjRa_7hNwO;730f~jw(*mT!+>^~WW&Sld5_e1065AP7w0lMW8XaOe`
zqMui$BeLQZ<K%@LrlM@eJCd+MarToxIew=;c<{imuOf(!^M-rn%z`WD)A|p$ua0&U
zXj~0om!9n1c41>ls_y6Qc_*jbeosEWaN&Z#pp|}JFQb@qESf-^W{&05#KiaUqP66S
ziMwbLihL#w=^CrRE-m>EX%P_-WYHlB&ZA$v=oN0<c!Q=nDiqp`?{MG#_G@B8to7gz
z$Ju%nde`oJx3xl|8$R8CYUo#)AF-q4IH?!Mu;9uO{jAv5;l`B4&(97rQ}A13h<V{+
z+qYQb`uHp1Vg(m2UZl6J+q-Mm8!B4vSm3jkOw$lAM)Bl3%^%7-J9UhHM5U_nb92iV
zt;~g}wX>Ud<j3n2t?~?ZvEYlH&eNXK^%<#pUrq`M34NM<9U7_xz=Se#<`b!Vb!8d7
z$kVJnmziQ|VIlYOq|y=X=R1qPBh(4l)>|2(g3WBe>LZKT`R+7*A6pnlb|C&wk;xM5
z?CkOC8S!|o(k+`wT@UvogOJ!Q*PcCn`UB{;zQD=u@$g7<n&j@?yNRD9R^iPXrrTeA
z&abYn0s=mrZ(;qjif`Y(ZFzt5e!NPGS>xbOfE=6O3l@uui$O(-Ux*!dc6Rm`cXNH*
z+MZ(-gQuANb}GdXt@G*Ar}DtLb+K~C)8_Oq$b^Z+p~wJ9UkT#AEgyN=^Vi_uqUN`+
zm6g&&XGc9|E=%4vnPb(DSeN57{C-X)S+fQWA4NDy$YzKYaNf36*nZ*-%6|+HJi=6F
z=V5-uSEtp&$_ixzInN^^3LVUIT$XJ|n^KS0%ue-Jb1*V8qI7V4>RtUkElV%v+~mB{
zVv<r;U0t0Vd6^>QI1`H!5(O4u(q9!y{1pJ<SATy$C+D*~^mD87#>U2O+sPx}&qxe?
zPd8FX<MBsk1Xm+6B_Ef&O?=vdnp<98J~1`*VUSfHl%mgae!NovkFFa9NYUYSyRRzL
zByAKW@(=?9!y|G}t9emIP}be<3u%6zkQB`o=oYWL`}*{yxb>^UOtY%T^QXOzmUR~@
z#$Nx_lx85C-*14vbGgiyd9)z`o0W>98&mtqBQ5P{8LL)qdhsF+qZn`XRX{7#zBAhS
zO+L5I3JV{`0%bOTS+`+xlZ~?<wkS_8PX66f3zSzDF)!RslWA*hZSBaesg?|rK8q5U
zwgM*sO0UtOM_g!j#|^4pQwzTxsg3crSX*@o>1C05ZMeF##I|YQav<l;dpVklivE+M
zS)Fu(mcQPsl{Pmw8@A_WSO7<g@q#Ku>A0=bcZ;@bm>2ZkT|`*Z%E-u|4Ph7g8w-?^
z)SFM|InEj%*C}+K?5M3z)@n6dMxW&;)9yc|oF2qLM`wKNn}3<lEh<K_HnRft3}af~
z=LmzQ%GPX)$Vxu(F)=iy`h}(8lpaxWFbhtkpGk+^XR!|k)n?8svyHa&qAZfw)XGr?
z5&Q4m+*-NTTmj9gdXEKHz^^VNY$~b__H<;S64gdW4n|6P(|OYIeK_?vQ7w&*$DoQ=
zS64S|K@}*;AZvxub>Y+N@$qqU0k?1dY__d&c%po_<KWv{sE=?WImRZ&<1akiUi#v=
z<egVV)`Py?V`FAg+(4?g8;x#j61b<>^x!GwisZdgB8(5V#(hLr@I;5A^L<_s#B&&A
zhilDhad}x|_1qJe)0)}esdjyPbtc4cJpKOWogbR#P?;+o3Y_LMgXRZg!iA_#fp4xZ
z^w3y!eEe&}=$zo&XJO>y3enf7okHokbS3T$3knN=S!SL$dbBm%dFshxn77V#Fjm^}
z)q?pBr#?$uN@hY8Y*i1>+ZXqEtMBt_vE>R*s^UZ3w>*j$y&rFV^3tHK=I~FaYoS8*
z`k`QMrFkO<b)0Xq_Yd4VGT+_XdwZlkFMx)I^l?WFa+rVqN=HWr(xJY-KHGIAw|&a0
zuj0wP<H32c32-ghncU&gQPZpyEK^WpRklp1(Cy^LTpN?TS%UIRKb!9P*+Ek}9|*M5
z?&!8M8}I@QVq>Gza8g#-Lb;vp(Z5j^E1k>%lX}2k`tq&%t3KzM1DA6hJ9Z4q@f^S@
zL?@!h$$F@6FzCTnz<}J{^z^2{$rbF+pKwTctlT_-HL#tQd42YUVGf$pXZ=v{<kGx5
zXgC$UXm17wc|}(je)-8RblF!KR{4Aj=1#xUEMHhy_$^E{4=jbj-0xAI-FS;)nQ>=f
z0V-_tu}e>5fi!%h0KtPQ545$l)g@^Nq;0Rgw`qs<!1tpRN3+rCpUV4BY3FCRWSMgS
zJ)*IOia5xFRyD-RMc#1?D?r2)F8tgvZG#GeWIuHYP<*T{N62L<9dXEOKXD_&sJ1Uo
z@qV6V@6*jR40m|Wm??3wu&^Lzzv;V5NIa+<CT;|TYie$;!EJS#k@5rU!3V9tDu|BH
zIQC}oBh=&{DEc;IZGx91BnEoC#b2eQq(BNloNwR9`ew&LcB1KZx-KW>+KngUp(u`Z
zsZ}N^1=08x*&$EBydzz33qDeQcBr12(wMAO3kV$J;juN(!lTEQo0)<Jq=MoOXvv;o
z+N%5`vMRPAQB5yw__8P6V5LB(qLh>eP}94vt{V>@J~aCN=6p-G#c@U^lKa6AY!{bi
z278Bx6QD#GBQhuXjS!A~HV?P&uZy^}<95|+HEb6DxHLhptb)*o<A8Mg3Vxt>qj?M#
zr|p^VIBMFG?l@jB?=R|Pi}on{>>$T0@=jWA34+BL{SdtMb=NclKO)m{zTNI6pNaCy
zVt+U=-#e<}?`Q)V&Wo0O<{iJ|Mur7Cog=YYAt@<ZdC{A892fvN^o;^@X`VSedsbFf
z7HmohU-!ovV$&=1H>I|I4dRJGk3PY{!2xt!ek7;|NcxA<ctH$$rT9xdHpN(<s@H;%
zds$=*v4rZm)^XV0JAKSw-rp>)uw(<u6tWvTZD(h9Nm6q73!@u&OU#~8o?{?Os6+t(
zqx!A~9VWW|T3zm33zjz2%Np(Liv}n*8t*9ZjY=t8x`M(Yn;y5xu*&@`Bq!Yy7GS76
zNDs%EffqOY9%a|(OM24v-pvE=K|w@sugnJw37$su&ubbVD@p2OJa9l?M%-yGQIM$A
zlZ86-W9_ECgOIf%&)?rnonR|Uk$zCZ;8kVU*2fA#h+nB)cV(f+yN_Gcaprx{K?Vl1
zg@uKt6?zdP>5byz;*rP<{`zv=@GO(Ys%T?1dE;Zx4+~ViZhUw3V4e$6E2QHYPmOW$
z8~rHh=Gf`#>e|Q6qhIkp$Zojd%y9sxzTYU%Q|s1~>~EHse*2!PCz+>nhn~-9VIb1G
zViA~uA2f3G6)m5!f6g^TrD<}wx6XXHr1XPrdrt%o1C@2?Ya^{H9sc_3uf7=&^VYgR
z4^#cY0kJZ<y-$BNNJtHI_w?wY;eXL@M-Daf)}M7-&2OIrs4{Q3@D;gV>5_EwQ0YKT
zWTh#xx;w63Vqq+AyrQ4^>MP!mQ2nnypZYq)*!XrskJ9bfV1VY74H>KQH<F`gqPy7E
zEr3AU#rkQJXB4u`w9*bpCW^T%1x|0FVW`;h)k;EkADd>I94)s&)g4>TLm?tpy&iA6
z62hOfm=9Pyxf;PvL1|C`hhLl3^VGP?WX5uGn~lg`yVtGBT6rzj`Tavf@sK2fQ#f=A
ze_xv~y7B4W5<;8Ldf<AV11<M0&Ty2Qj%2HdCY|w~)qA@F9zTAJ&Od+63#jjC-*nOH
zQn~Z$<QGP9Ia5#7RK7Dm9eZD@9Eo1Ca639!6ZyE<i;Q3c7_;ke_@b|kwpkA()UVt}
zB9Sk(Ib}9E<sc)=T3a=KtchQ_s0o<I9WG#8_w}Zv)wXt;mBT+9*zNQ8enz`F;W++1
zQH>|B7joPUGl8)W)%S2SOY`F?5Ve}yiYdNOb{6x&@u}VDiy(Zd?Ra}Fh})L$W=}_v
zNTr@pM}AK8ry2CxeYCVj4bf6#tm-N$+I%KFyg<Tc!e(Y>C)GYgwRhfbbIL{H37?+N
zo;L~=vf(zd5E-6+P*U^y=)({m1FvTPw-QhG1mjhd<ni4lUK=Nt$BSC|j94L6sl7aH
z_NMD=ZR~-yV|T5ORR3%uN+dznw625K{Nz01QSi0oO6(QQ3t>v*>450+D2(Yg!^&3b
zXxU*c6Jiv$`;9toS|F+~$axGAYn9wvNL`eNj~*FA+371#13S^L2s}!GauCa|Q<xYV
z%Ss3xE=x09jn7(J-5|__4cQ1Vx7VVXi~HTZh5C3BC89DN!ayspg$D;yD)%w}NEcV-
z+rLIe644(MB)u8<=VO5o>rpSlhefs8#+jL~_)9gou+LjR*eVr`J`hxmP)J5~Y(2Ag
z|NeK#k*4(XYgu~->M9_^pe|ii`oe4Yohf8jchTAk$EKa6j|wx8qXUa%#O)`}5jeZJ
z7cz_9-eX<O@tQdwfQkH!y<)&Xmq24Hb;k6TyVm>O>!V^*g;D^fbmq+AUAsPRyZC_s
z_NW-XQK+u9cliDGh<2>o54?D<_%V%!`WU#0tu&oBzh=2#b$h!O<a+;^*oG1)7OV%!
zw0yhe-vb^7n)-A&PfLf)t^9~Qu@h_k10^rRpqk-vBrll^477dc&iaQt4qE>#*;cT+
zG)(FE@<o!~<LOh!<bGB&;ZFpKgucr^-I%0dASU}QXHlTUl*fMR7bS182tqxN@BuVd
zv>F-goE++SxMPk;rI>(jmg%8KU`i}HIyxb1dsAIJq8?yJ^N;*pTwH15)RJz*XV!K$
zZ>|%~vJTaB|K7blcl{qlY1%<D3I65s+{;V(+O_A!#=WV0tYPo68%MxjScQaIqJ^B!
zopaA&wD6w41X{!fghP~n)P8QN;^<d*5yb`;r&pF{6#!F+)*5mmLsp$VM8I4bjbGZ&
zD<)$U+Kv{zkhRBr$NVLZ>AFY3TiI0Gs_Y)^JRHp+>ewU#0pK>Z)4|=l--6sS8!e-d
z@Nm%KAsZme?BBB|!pCP<sHhWv#~UUPuf9$C5Y$i}0zkj5A;1AjaD3wUTUG<QLWRrX
z&u1LGHbaV=wrm;34}k+jH9vk35D*}3;LmXk%QL;6=k~XKE5E0!w{P24LkMUHC!Sqp
zAdHm<`(u~^cl&(gWaCk4`zmYDzcVa*uS}Z{mps`^z$$2OXs#J#bK$vh{<%d&GI58%
zdvW-`k3$swP6^d;k!c<2_i#h9mI<|98$i?SVC|Q&LbDQ&-PGgjk_Osx(iR^sLno_y
zEofCSY=(5pX@kBu(%?C2MR067QO9&}?02BjLr_ro0|aeHns~$|iIVO{C1mmQ0SeTc
zG=u7s;M4?-mzM1IwoCkd?9tZLiyAuFch4hLiNS!wX(XIW^p~F)M4;cH77RVfdI_Rl
zAEzMcyAP5zXxIQA1FIni<*D%Z)KzSQG+5ZRsZ2zf(W4E}ni|n32uT)ua~1uMb4~WF
zpkN#%L1!NkS*q(VxZ4Yy8l}(^pac3cKWq14NhLHXYL}m&CU>&~p!lBE6d;pJ07DES
zid(4;aeg#w=QnL3=XQW(`0<wL;npe^A;0l2$Jsx!=cOvP?+>-x(;k3YDz<o?WlbPo
z8mgaP{@B+S$17db^6f41%ZaG2(F=mgvX@>`_oC?Mmu*KGb{2DX0M|%(_fFmncbpqB
zs%k~F6uSUpauemC%Qp1&>*s)yo-}(v5V}DXz3jG*s6r5Yl$DirwCt{p4d3Guq6+7X
zp-umE@y;%G`!a9uydVZBPXuYMHewJr-Glh(q4yFTE0Fo;gZb|?`3(59K$G#FFFY%F
zQ3MQ+lQJA8Y*(e3g-OvQdzN8MghX{h<Z=rO?N6>kCs$k&rJKdXLlUn51rLFaQkD)s
z5w;%O!sxtf+|`qo=S0o)OjPlWV}ro`7Z4{^M_#_g)ohhIbb%eNLi=chEJ^4eR*t#W
zgHV|Uc?)Z3AuB~8kqLmEYd@)*zbv0?ZIoxE<2?D$cC0N9-J3a3vvhx+thczEb8tvV
zNabX1US5dO-$#-JkV6Cvu8Fur?bk#j{`)!-LJ1HVBZ81$M|D9glYu%<fxB+svBN5x
zMtRTR1255re1~ZQ5u3JU*O-Mpd-jab?-0mrtgKQSHdB2^W%o;Ggl4Pon3|p#jumt6
z5q;IPn4Fw!tJJvXRCP_Hq{-UqN=t!LR<Wr;b(j_)7o|mi#9;y3^lN-P1%<b%QWlX$
zXpmW^B+}}c)OkZpd7fwSzfDU^Q_s8;2X%uDa!!m)s63+TPV!@Kn*E0wA$nN%SJAIb
zm2<oruZ)r`zMN@PTiWfScv_O4rgSVIa@gj=yl83)qGP0wkkkn&62<A=^8C1Pn>YAF
zIV2(A<2uORzKYbu*acPLOuISR*4)1-m#A0}xOsu&tztiC6C+y)9akI`d+Y)HC@tQQ
z2M3|lrCL|7EffkZ315j7LHUhGfDhHmit~l2i?3!a+ozc%^bexBr4ZveG{CcMwgA8c
zTN0CqeL^|~RQ~+04O{3?_XOCr^8>p+oKjBYgqG-uPYbSv24z5CjfK7t^F1yp@85Ik
zL07r_?#fFlC{D#+zI=&=P$LH^IZ`9btQ4c;Bgq6TzScHA7x*7ufY)bhV$m1~;Hj9R
z-M-+qHoiuCMkA9Ki6wfRoBId*&GE*R@ETOM9%3Y|Pz6!?5WuTlprHUhya_5^{+HC-
z<p&}WrhQ!LK-VX<!p>UgMo<i#z5Q5Z>BLtTBD;r&P42X$vz7JYr=%k>K)wuN`1HGe
zls$er{yT;YS1~K|#Be!e8fr#hV$WS$TmG?*0+VZjoSzIaezNHL_}9kyo@((mUQE1i
z5PCp2$BAt(4Mw<k95~H6)R1Jta1|`=Icn<RPoF;7mWPYGbr@p6&1FB)B~dMhp&}Qi
zEmp1Q-n?L0251c8&hD5nvZA{25zBh%*#YM4HfVL8pd7R)r+k3)mCH#8Yg+U*P7L}&
z2b{1v6|o92UJmU^s;Lne=<bZf4{Xz(7cgzP#S8i{F*(U~QYroxMBdK>tywAE&}<0)
z-@UxBv?P?MW-&je6$zYj8NuR-Z3}Tgig1G;-*Sc~JULblJ@vV_*wWWnT%XvPI!IH2
z!gk5T(B;shn{8mLH9Dm|PE?2aE6#$Q*F;hF>Mcxkmz}KU(knd#^|TZjd!}A<pgk{3
z?(Kz5e}Vzq%;mCVo#sqKFXTV6TnlQgR@hIoV+RikiLUinTl3bPJ2OIxAS2tC^E4n>
zpF<xBa?=1-y4+LhN#DTW`Q!<g*y@5_Bv#6nPv(fA^TPYe%n&fVJ01B!G~RAc{BC~t
zJi$aEq?4h#IKN*y<9M1F6tWY6V`AozvQ@Cp^wBfh;xGpww4+BPcmvo7OoE?}#M+XL
zM8Rv5wDOeUDzLxl)eEJ}vBy)u`q$SN<fH(w<xLwm#@;IP{e8YG4pZl!uoQ3#^M8Qg
ze~sf;z!<m;Sy19eIx+HBhs;kla-gB{J~$-#Ru$7bYT<%w9x*Zf3Wu53{l`?X?C)LP
ze};<xN$-hfc;jJW+Je!YytOs20sY6TmBqyuv1ESX;fyRBNZL%0V^x;tMr|O)$ZU2G
z(Ee-vrt}-1)&oOS>gW1_(@i)11qmMmbbntGiGnBp4guoqZqmehwF1WsIsvnaCnWbZ
z9@J_K8e8>StP-9~OmttQ_@eT1-}-vah-A<9@WF#7=M(Em+D9zJLqtVHh#9%ecJ}}o
z05puH4~~l_3{Q8w1!Eclh4iO#518unKP*p@qJ>f%f!1MhjFfK;QWXg{S1KItwf~Rr
z=6{_vhuG_Xk%!V0+(eT90Hv3eiRm1|6XSD5^njP_T0$YW;fa|ghHB6VQBM5Z`7s7f
z1V>2#FuCG)!c)+N=${x|E($?#nwp<ifuMYLlH_hL>b!6rl~oxqj~oa6mpVlpe|-gT
z40?Q9U_9JywFV`y9(5yRSVmPf5O0ilOv4yl3)mD1wrcfr9gHpKoC$vcTF}sZr<)2=
zR8SN`NU*3=CUR9z<}joVNNUUwnou33Hf`U>+23C1qM;P8SOaO-dZdZVWv<!4Hwwd#
z1bpyQ50Cc_ov4b?lVp|v--(&p_VuJ2geDlsrH9%{)+%yse?9i|X9Tj|<nIUDEUm2k
z$fyd}KuUek^daOO2f7V0#rS6s_z?D@w}iMSv(|N=hS#9#NZx$%^|$v39kXDzL1W)W
zcY~*WR3!P=sQR%O3##YYCP}+9Q4VrwD*`p#i3Z<*La1X-l(i5CFnG+R=I^}ni^3=>
zk96J_yo&G!5M&KgMDoLRB%c{pe~7S!pf&n?nWT{N=_h2v694pM=xWC)PoF%I>nwB`
zO%_aTjLL32A(^5_sDQvX0Q<ZT*SW*brVHAV00AG6%8%Sz5u^anRZr-c0O(hJvEBQ|
zmoUMqg`wp|)O?~`<fCZW@ML6hh%_@H-htYk;^y|fu#OaKH{L<a9HS)pXaHBDQPzzn
zx;|k%=@SzZbH$&v`))hddk`ZZ=_x1I=}G}QVcW!~2RY0(?;%wAO!H2ezeq$aq!3yS
z#&qlyco)DLVt9?~SZ7C?6#yTUKwJ)RXus~_heQ${#jytUK*5_qlvl5mir9Qm-B)CK
zaaYYW{mO{zq%P(xaN#qW+1Gvjx%4g*ULrh=0(w5L<BXwJj^!m{HjHUfPkSkL(FR5d
za)CMeA>ZAua~P4S63sWp%5?oXSpL=w@LqlaO>J#${%Me}GY0(+#9N5aB;fS$3TD8!
z(#+&d_+XU^&u+Z;_TuAs+tC*OY4Dd=Xg18*p5MP;2RuIQATU!^wS>n15~YzMf9@RV
z;d){>q9jel-bo&3CU|XgE3KGwHXvD0q79OUorZ>n@`1Ks9cjW+CnQQT<CpL7V@6lP
zMCO~3j1?AKUjh<9jHI`3{>bxb0KxVgO?}hm%~yP{ygF?(cQ<q&Vxs}%I0^iAW!!D8
z779=J42_J63P9@>$f^W?gVG-P90b7VFqF=#``4AAX+m0x!zg!h%l7;zKoP<rhwl7t
zK~E6s{f7o&+mXO1$#r&M<i0MZ2)i2hbsN$Fu5OJ!_V)Ik8*4vB5wiT{q2;-i*x(8I
z91NQmMaCwc!m^`+*|ZH%GR51~Gl<`m@S2Qfa@mfk!gBNXk=t*P*<~#O+2d<npYD?%
zZ^g_)4)BUqkz{`!_86|RMi%6KPOeyP0W}qsB6?rNL~DJ$5@2Qn?qZ~29I)}SH$xJz
zq6t1q{r!zk3OW4iKBk?s+Du}*3|Y9MAA{Y#X+f(#!Xre`Qm_tU6w0O$eYWi~7G$<Y
zl9A##Gu-TR^rCMDhec<nvFFxePF4w$)KT=PSHFf8?CrC$GRzd<>mS(o3X@ub>4QVt
zH?9HyS2jYM;m(>)Opzw}DAq}kd~|PB1j<3KRmPfAGl;}O8+}LdyA0L%J8BNGBGUnp
z4=(EvBPiFUK^Ed+)s$3@A3tsb4T9ne;`rfKnXZv2^qFY~INIu=ChpT>cyx0BqLea5
zl9-th-l|opzXHAkOxmpec7Va{SWVRi9qaz;@J3W#W;V*om_J-^7!DGT;Kd*s4?Qgb
z=vY1b?ps2Lg9{A<7-oA@V<?S;>&~oQ2po(}ZMn##k$u|X!twJY($V$q0kE~?zeTkY
zg)BzQ_+aWJYX0E&w-@0$%B<t>1Q>yKt(<2&>YG7BXb6H8w-9;08J_SfusFea`!Ox`
zR@ojN38`-!i$wVbrKvFWXV+54G)=#AGj5A7gpYg+1^FbD0^dhRy$CS`HH+d)D3V76
zEw8^Jg>8d7OG@tNoTI32iN~$1#oyI#tA2^AyVy0eZ`9K2UBMoZ>@5M6xJ>js>4o{5
zFP=tC(G+!>yVj74#wJkwn1vR8#61_KH<H-Cp<*SW`4GYfAv2)_V=B&qxkN}uVv=G~
z_*sjHlgf#KhIzHn-b_&Qa&1S0f!v9~4#nH}5;=>11Bq#t6^<5&192#5L(rLwzrXnl
zSUU<Mz(J6@T+Fh1O=?kuGB6ImTD;3`X)wmp*0up6TcsQ=+ys8~sEt@?#V-&hp-?9v
zbR*#U2o<!t41SZTR$5k8_9I{!-G$IeP=l54mD6M1JF?-ZGUnmPr(=S`3U7Cim=KyW
z7-D~iRduH8(+0xrXcm;6(fD)DZ|}SVkQX1!y-<)?YUY1qsyv$P1`?_W6`OSzshY~J
z2z?BbouRBwR|Vwa9kYDhqBb~a=7%6NNvkqZpj9Y@i8$POwT2p3>ALTyZG_VM8|NXe
ze;O-jZ*Pb7>^RUf;bYjhnRM<)<f<*PUT7<=JC{QUyB+3bgbh_N31!F9($Y5}Awi49
z1Ick6TGwc@w3qgmlb9bBuB|$`z<984Gx}@rR+4-amedgApIpb;c*5mb%&C~D%C(<O
zzQn8<R7MJr1>TayUl`c(aG>H5CfKTQ@e~AFaBUjwP1ydB)>jOk)N)Dcd=8F|Fus$7
zAp_N-Ch|hZ8--B>{egHq#mqZuIk_zzwv7oYvVi;kQ0ku^IAiQ|e{3ioRy;J@>b@2-
zg|Ju^KiX*nx<&C0mhwlfMVpEykqBs`Yx(Qz+Y{2k<m~5uetzxJs+tIOj4d-m!dPS(
z@`86@q)-YKfKXkmbC8=~ggKzJ#cSndu2kkFoT6u0zo1g{`VT@T{eL>sOI|9FnBHyM
zy7fCSMIGE0y;Y&D-Q40UGk!!lbX{3uL+0~OgAXU5at#r628eBDuGKsN`?Rgl06>qx
z?L?oiSJ6>Irq3XL6b_Lld^O<q^g1FKK`1+r<T67T>FJY@3nwvUB~)~bUhnj6*}NHL
z#sS(<gtpTtU%_;hFi@b%y>SN^ZY#sZbpkkah*+-2wCr|uSm@s*qA`1!m4cZhqT7vj
z7U>X$rJb9oK*acv0_0W;TR^1^CVhmw4{lSZ=~@xUbyBA=pBOnnqzEy^4A>B(pI|f~
zIP1)17=bAXJq35B4U+lp2B5?YNPjG*GDL%e_{E24$h&=jT{D(=B;P+{UgP>JzSh0p
z_7^OV<t?qucS82ovvM(N%}grwW=v7hcKEEX0gb6XZ@e%85fU<pa8n`RhJMAN+ZBN?
z?yZ}+hRr<p^e3PvAOpo0`raGR)z&jS5Dlgsu-s${Vd({{Ba$?PbhH7r=@)bjo^kjh
zh`50N@5WxHk{0+oh8j~+1_lhbZzgG9z}(9RiW`|w*q%Orer+PyA0>kF1H}LklpajC
z;lw$gC`>jhLxoicA6by=<j+flAB7!X2P_}LZ7ZO|vhE|HR!?L%=~%#FmX3-Y;sDan
z$15NpfcIVVodJLg$vA*5g>KIRX-*Cnm<%<)E@U|W%}*F%q+9jNP~=g;h%iGbFodb^
zTZljkc@XuE+MI43DNg5~3HT{WE==_hZg263qXHl1zvDwDOn33x1-axnog!C4n<f(u
zS~?-?Sh$1Zu^z#E+W?Kt_HyE~7tfzR?;C}2rU?vKEwIMox_bPru-u${xV|eWQgDO&
zzJ6$Z4XDD*l%n5L&m8B+OsjSv4G?-{3T8kGfc7@abEa6Tv6{zW2?=m2$3cLS@+HIq
z!ubkeoM;Rc{O<^7KLloG3Q;uBVwEzCl_>HMAnPL~X^6>iJe)_c?p}RM`gqk@ni#h`
zNI%`VKT2|iSwccW$``Yf<0>jD^rDW6P?UVghzmI&tm|(tJS6||6ado`Jpvn}QB~#b
zI^K$BA|#AIm;iv2+1%WmLJZ*Qirm}?&H^E3-&WFvjU;<b0Nj@xI$~PT>*1=d#TZu4
z_QEXY0!?jAlpg?-L_eU&LnEjp9VLibvo>D?AZ~?@JE6q!ob!0eeD%QWcxU+EB=-PK
zh$y{-gK<vtV@9a?ME10`xAzpB0QQr9bW_R~4$K>yx2B>cy(5Gq{T8B|^`l?&ZFryx
zzd#+v`qyrf?AZ;gNKBszV|EC?DOuFG@IBOH6ib2AI)$1)BKx+anqHiT&X{~y<0UUw
znc5c8#MI=>3~%uu5M&77X0x{Jn{zroJO(l-@SY}n+!g=&(+$v}G~g?HIWrItR_L;9
zjI7a@d`1k_uWPW#hVeF@f<5!yD2qX8R5qNmuJB6j)1d}9Qjw6@cwCXhkqUnc_E>=+
zzKc7YuVmm+Z|V5yZWx7s_7dWu0rs2y(8H>{O@k-MjZq+vocWx@VoP~Js3gqUgmDGi
z@(!c0vx)pC%krQ2-Le&X8Tc#FZ(odTIKPPk#6OWQ-i%rKchDz#VNpdXOVZ4dhg{=!
zqLB=!k&|n=Ox@LaiNLJNBLR0|oIyQ+@OR<Q5rmMccQET!^h0obl}T?G3Y;SLa>dhh
z!w!=D<Y!wC!%NWC>as2LD1==Z*19A#r>l;<z84S>;R8#1@~WVDf^*4qlNMBV-(D}3
z+Tprv>ax1n?;8b${1hDFV5bit@!VinfjQF!-QG6}#8J&yRvmv&%NhmvNl;DImCY~0
zJfUwI36~%nF2+_!MHoR*Re<!q^(~O{Meg0dZ-W8jOE!hea9Oi0sS<4g(2nAJC4fEj
zmx=sH><++pWe{3H(XoC#bbR9U!t~M<?22l+C+Gz&C2+6?{-JQ=y4X*Q41ZP|X?2A#
z)e3=((1H#lyiH#@L9nanhmxTHiDGXOHJx23n5-NqjcdG)Z$Uu;X0S}#cS9M2C!Fiz
zgDBU&<;6udz0&8oR{dVRCO<GOtAo)*B5Q?kZ4*}TMx2S6FpnUr#^|K$CUoQ&bjy}&
zIBk&#p2bF40;`%uvIG?iTtS|P_@j>#T;{blO!w%h8ov8rl$8}*EYT0aK;$KWJiyfD
zqa@O=v9V;l0oTG{8|Pxod6Lj`39}X12vvxf%~$?L?>q?-Gz39cFo`(nFg3+}@d3iV
zIgtmfsbFa+fsRXe<EB6Ke$UhbhX{afYJ$u#hT<SJfuefVuLTtVGKh0v2y4Rdc?!c4
zf)|5aqYRyN208EJ$51;GM(9|GgT%QB^(?a_%;*e(s$hs>*tCxHe()UE9NnzFCuBSB
zz{njGd2})*jL9<42H~iY124B8ZQ+xKMoyIpn^Bys_=+OHo(&4cADV%?{uVA?gi0EP
z9%q8ew{QKQ&6GlqGJW**sd>qL0?^?z^?mN*QbaXF2J*EgVbZCAz~E^l3=n9p=7rST
zxBtLy5bS8WG#P!Gt#BtN&Ue_uH0O^orbG$_`>ssbARCcvjlRrRt$`}6)Daq$CNM@}
zLO8<P#7RZ)euP5}Kw8CZv893I+t&eilgRoX-PZw&%1{3MJQ~a`;#!*tgH(Nrjt-;_
zz8KVf)dI)a542vV#xj9E2%qXzxG(x<P$3e~r-B8oPC#S!A?M`e3>MRf^KN*UeRRHu
z&{GJd0J9o>)h=uj0FMbAUrS((rsgf7p&1ZpU1n+|2^)u6@h5Ow42BwkIo_br$!{fv
z39|GEdJ6U-c)%g|gUG=5&|9&=J{~PF8Lg<*xkgqB<Stpe;3On%B0^p@Y=bWV<;(x*
z#m(5@GiA%r?Jx4=$HKvYT6O8ux{o`cZ8JkIdr3Be<c;Bo>W56L#i`r9UtbhQpE!Sk
zIBo<*h7BA04M(Zo*${aR+WJRKmN-VTm&bSH5E9H3qWdGv40yt8Xh~7qQ$rQi2x$=q
zr<f?iQL^FM5K#JWZ6NLWH98s^)r)y~6rq<Gg@V$aB+kCwAyw1=bI9ypMKS%~dS3Kj
zNR<Bf68{f6XZ-KDAy(l3d9eKBT4Tq`LuIWAiz91cn(S)a8YTBunI!H%cq4w{k^I5k
z_m!wNJTa?aFG-fzO0{t~Udvj6{6OH|U%R(Hk&}~`yFN#g>tRUSD}8okA6HFX<y7Jh
zhlVtRa+hygCP(tMIh)3-7wH$mENtz=JI9ZZjvd4Fk+f?!akkyv<4-gJ*Wxcs$ByB5
z((c`aZh)?V-_J=vULyT>z2&vt_aYK$hd=S}0+2}mqBr?pbz>ioK<vmE8XZl#966aK
z{_Mb+c<2j<51iX_`0(KbOpIR7uU(3)iPbR6c?Ybld&Av>^nMpXf?>d!oF1z+&M?NI
zVggie*f4M%2Q+TFERSYQkJ-V9v4nvX6_ufr)@2fBtDmfxTBUy42^JQEL`GaY+;z#w
zaq$UDSZr7r1MyxOv4tB@0y15HPkx~tmJJo+JI+o;MOAl^M)cN=bFF)KlltDnp&|q?
z!*d%*0?EK4vK-<QA2-ZmkVc1F#=(XpOie0P=YfM8CnhGWC9?a1O@?52PXsieJ@kD}
zvx>CKkUxa)>{(UZOnf}FKP8~Lq-6Fp2i%LUNlO!ln}<QkljGxwkp&J%E5IX})=k=R
z&x6G2t(>5Qqn$QDEQ2=lZC2jyq>rboMdvjOeovLxmS=T1n#|76AEtVL1A#q#*7di&
z%jD;SY1(Aiku4ke-jl2|aqPpqbc!Y1Sso10$<xb=j`}^5{o$QA7=VQm;EAe(eZ$1k
z@&lB4)g<MFLRcpqA;_9wCbG5=2%kheo~|gV|A%qL5MHH#|2KU6=+49Q<|1E6B@Ry+
zo`JkHnzFbCDI~^C9Fkp;P-$AVn1+g`#U<%$*XnSrTCJz2hv43IAP__NUP3whGy}u;
z4mt(=I@sd{Yt%6CTZZoEr%N!`Tw^fQAU13#&hS3j%VG?8#wRAG4Lx<b!%SB<0@{$S
zJIVA07+#0taMBK;%W2Jt&|~TdeM(6QrlOSY?wiG%*o{DHlfk_6<Kx4CRH2EKKOdE6
z{U~mYa{$B<%lM%-VI>Spo|!co@>0>fkp>O_eb2iFNBO`k!?YO=ALdbgGb%X0uS+NU
zd#xN!X;l$t2wGjKiNjzS>PhN2xh%eY;0E}u_AUeUg2~duvrT&5N=o$^joQm@g8G)x
zbmxRonELKQFciYHt=-}ay-mAKV`Yn&prFG|*+MNXn|dV`THg0er~UiWz!cqV@}R)s
zrpI!Jlhs;5)>Yh?KHftqtLTo435!3dZU1&@d3hLWpAC4Qa(&MD8o}s?akvAK1j;is
zJj}!CPECw+>T&c(LrDqe%@W~(l{P;NH4;aV2YW-za?3uFcCWi}bO{lNm3XY%Zrf_=
zme)!AqYwb)0=NQFt!$~f-`~6?Jr2?oZ@(+#4MS`U9m3oB{jrZn!W{a71Ud8;%pt`m
zK@OoMviZo7M9l0K@|TH}y2?>-OZDTuu4^0J1vOz*f#*gCnoiyjbi)+o1ipeK9HxM$
zQRm{ti-i{J-W2oEdE%d&Fb8u_!6~77=w2l{9O-$v#@KMkgx5hP`A(mcAgO*$E?gRF
z!Eqwf_S||-(t-w2QSg+N3nClcAAakl`fo4y|5cR~5B5Ky+x`3T|20v_zxU;T#lA>2
zel9E~I`YCocG(7c153*vyGSi1B_$6U6VFNF<ZPWomd=dF1pG8gIy&K!n@R3h8=z2n
zK7W2_<HxmZ!vLO{nVCR-_kIa{<E4tW5paYEhju#8Zn&7$Fx84zPUw9>5>kgUYuZ`Z
z&O~D8Li^J(g%)*LQgY{p0egYAyB9^Lz8+6&5QxUF=lEw*NP*tw2KeK@3uFK1qI-4Y
Yy9>onw)Hgg6Sq#eBqNc0;l{oH1LK2XbN~PV

literal 0
HcmV?d00001

diff --git a/keyboards/lets_splitv2/keymaps/default/keymap.c b/keyboards/lets_splitv2/keymaps/default/keymap.c
new file mode 100644
index 00000000000..8c8466ebd5d
--- /dev/null
+++ b/keyboards/lets_splitv2/keymaps/default/keymap.c
@@ -0,0 +1,159 @@
+#include "lets_split.h"
+#include "action_layer.h"
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _ADJUST 16
+
+enum custom_keycodes {
+  QWERTY = SAFE_RANGE,
+  COLEMAK,
+  DVORAK,
+  LOWER,
+  RAISE,
+  ADJUST,
+};
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+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 |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = KEYMAP( \
+  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 , \
+  KC_LCTL, _LOWER, KC_LGUI, KC_LALT, MO(_LOWER),   KC_SPC,  KC_LSFT,  MO(_RAISE),   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+),
+
+[_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, \
+  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_BSPC, 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, \
+  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_ENT, KC_ENT, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      |      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+};
+
+#ifdef AUDIO_ENABLE
+float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
+float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
+float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
+#endif
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case QWERTY:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_QWERTY);
+      }
+      return false;
+      break;
+    case COLEMAK:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_COLEMAK);
+      }
+      return false;
+      break;
+    case DVORAK:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_DVORAK);
+      }
+      return false;
+      break;
+    case LOWER:
+      if (record->event.pressed) {
+        layer_on(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case RAISE:
+      if (record->event.pressed) {
+        layer_on(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case ADJUST:
+      if (record->event.pressed) {
+        layer_on(_ADJUST);
+      } else {
+        layer_off(_ADJUST);
+      }
+      return false;
+      break;
+  }
+  return true;
+}
\ No newline at end of file
diff --git a/keyboards/lets_splitv2/lets_split.c b/keyboards/lets_splitv2/lets_split.c
new file mode 100644
index 00000000000..574c116a754
--- /dev/null
+++ b/keyboards/lets_splitv2/lets_split.c
@@ -0,0 +1,30 @@
+#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) {
+    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+    _delay_ms(150);
+    stop_all_notes();
+}
diff --git a/keyboards/lets_splitv2/lets_split.h b/keyboards/lets_splitv2/lets_split.h
new file mode 100644
index 00000000000..04844ed6392
--- /dev/null
+++ b/keyboards/lets_splitv2/lets_split.h
@@ -0,0 +1,25 @@
+#ifndef LETS_SPLIT_H
+#define LETS_SPLIT_H
+
+#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_splitv2/matrix.c b/keyboards/lets_splitv2/matrix.c
new file mode 100644
index 00000000000..1d768c59b32
--- /dev/null
+++ b/keyboards/lets_splitv2/matrix.c
@@ -0,0 +1,311 @@
+/*
+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/>.
+*/
+
+/*
+ * scan matrix
+ */
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <avr/wdt.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "i2c.h"
+#include "serial.h"
+#include "split_util.h"
+#include "pro_micro.h"
+#include "config.h"
+
+#ifndef DEBOUNCE
+#   define DEBOUNCE	5
+#endif
+
+#define ERROR_DISCONNECT_COUNT 5
+
+static uint8_t debouncing = DEBOUNCE;
+static const int ROWS_PER_HAND = MATRIX_ROWS/2;
+static uint8_t error_count = 0;
+
+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_debouncing[MATRIX_ROWS];
+
+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();
+}
+
+__attribute__ ((weak))
+void matrix_scan_quantum(void) {
+    matrix_scan_kb();
+}
+
+__attribute__ ((weak))
+void matrix_init_kb(void) {
+    matrix_init_user();
+}
+
+__attribute__ ((weak))
+void matrix_scan_kb(void) {
+    matrix_scan_user();
+}
+
+__attribute__ ((weak))
+void matrix_init_user(void) {
+}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+}
+
+inline
+uint8_t matrix_rows(void)
+{
+    return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void)
+{
+    return MATRIX_COLS;
+}
+
+void matrix_init(void)
+{
+    debug_enable = true;
+    debug_matrix = true;
+    debug_mouse = true;
+    // initialize row and col
+    unselect_rows();
+    init_cols();
+
+    TX_RX_LED_INIT;
+
+    // initialize matrix state: all keys off
+    for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+        matrix[i] = 0;
+        matrix_debouncing[i] = 0;
+    }
+
+    matrix_init_quantum();
+}
+
+uint8_t _matrix_scan(void)
+{
+    // Right hand is stored after the left in the matirx so, we need to offset it
+    int offset = isLeftHand ? 0 : (ROWS_PER_HAND);
+
+    for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
+        select_row(i);
+        _delay_us(30);  // without this wait read unstable value.
+        matrix_row_t cols = read_cols();
+        if (matrix_debouncing[i+offset] != cols) {
+            matrix_debouncing[i+offset] = cols;
+            debouncing = DEBOUNCE;
+        }
+        unselect_rows();
+    }
+
+    if (debouncing) {
+        if (--debouncing) {
+            _delay_ms(1);
+        } else {
+            for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
+                matrix[i+offset] = matrix_debouncing[i+offset];
+            }
+        }
+    }
+
+    return 1;
+}
+
+// Get rows from other half over i2c
+int i2c_transaction(void) {
+    int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
+
+    int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE);
+    if (err) goto i2c_error;
+
+    // start of matrix stored at 0x00
+    err = i2c_master_write(0x00);
+    if (err) goto i2c_error;
+
+    // Start read
+    err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ);
+    if (err) goto i2c_error;
+
+    if (!err) {
+        int i;
+        for (i = 0; i < ROWS_PER_HAND-1; ++i) {
+            matrix[slaveOffset+i] = i2c_master_read(I2C_ACK);
+        }
+        matrix[slaveOffset+i] = i2c_master_read(I2C_NACK);
+        i2c_master_stop();
+    } else {
+i2c_error: // the cable is disconnceted, or something else went wrong
+        i2c_reset_state();
+        return err;
+    }
+
+    return 0;
+}
+
+#ifndef USE_I2C
+int serial_transaction(void) {
+    int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
+
+    if (serial_update_buffers()) {
+        return 1;
+    }
+
+    for (int i = 0; i < ROWS_PER_HAND; ++i) {
+        matrix[slaveOffset+i] = serial_slave_buffer[i];
+    }
+    return 0;
+}
+#endif
+
+uint8_t matrix_scan(void)
+{
+    int ret = _matrix_scan();
+
+
+
+#ifdef USE_I2C
+    if( i2c_transaction() ) {
+#else
+    if( serial_transaction() ) {
+#endif
+        // turn on the indicator led when halves are disconnected
+        TXLED1;
+
+        error_count++;
+
+        if (error_count > ERROR_DISCONNECT_COUNT) {
+            // reset other half if disconnected
+            int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
+            for (int i = 0; i < ROWS_PER_HAND; ++i) {
+                matrix[slaveOffset+i] = 0;
+            }
+        }
+    } else {
+        // turn off the indicator led on no error
+        TXLED0;
+        error_count = 0;
+    }
+
+    matrix_scan_quantum();
+
+    return ret;
+}
+
+void matrix_slave_scan(void) {
+    _matrix_scan();
+
+    int offset = (isLeftHand) ? 0 : (MATRIX_ROWS / 2);
+
+#ifdef USE_I2C
+    for (int i = 0; i < ROWS_PER_HAND; ++i) {
+        /* i2c_slave_buffer[i] = matrix[offset+i]; */
+        i2c_slave_buffer[i] = matrix[offset+i];
+    }
+#else
+    for (int i = 0; i < ROWS_PER_HAND; ++i) {
+        serial_slave_buffer[i] = matrix[offset+i];
+    }
+#endif
+}
+
+bool matrix_is_modified(void)
+{
+    if (debouncing) return false;
+    return true;
+}
+
+inline
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+    return (matrix[row] & ((matrix_row_t)1<<col));
+}
+
+inline
+matrix_row_t matrix_get_row(uint8_t row)
+{
+    return matrix[row];
+}
+
+void matrix_print(void)
+{
+    print("\nr/c 0123456789ABCDEF\n");
+    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+        phex(row); print(": ");
+        pbin_reverse16(matrix_get_row(row));
+        print("\n");
+    }
+}
+
+uint8_t matrix_key_count(void)
+{
+    uint8_t count = 0;
+    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+        count += bitpop16(matrix[i]);
+    }
+    return count;
+}
+
+static void  init_cols(void)
+{
+    for(int x = 0; x < MATRIX_COLS; x++) {
+        _SFR_IO8((col_pins[x] >> 4) + 1) &=  ~_BV(col_pins[x] & 0xF);
+        _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF);
+    }
+}
+
+static matrix_row_t read_cols(void)
+{
+    matrix_row_t result = 0;
+    for(int x = 0; x < MATRIX_COLS; x++) {     
+        result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x);
+    }
+    return result;
+}
+
+static void unselect_rows(void)
+{
+    for(int x = 0; x < ROWS_PER_HAND; x++) { 
+        _SFR_IO8((row_pins[x] >> 4) + 1) &=  ~_BV(row_pins[x] & 0xF);
+        _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF);
+    }
+}
+
+static void select_row(uint8_t row)
+{
+    _SFR_IO8((row_pins[row] >> 4) + 1) |=  _BV(row_pins[row] & 0xF);
+    _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF);
+}
diff --git a/keyboards/lets_splitv2/pro_micro.h b/keyboards/lets_splitv2/pro_micro.h
new file mode 100644
index 00000000000..09e219b7b17
--- /dev/null
+++ b/keyboards/lets_splitv2/pro_micro.h
@@ -0,0 +1,362 @@
+/*
+  pins_arduino.h - Pin definition functions for Arduino
+  Part of Arduino - http://www.arduino.cc/
+
+  Copyright (c) 2007 David A. Mellis
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General
+  Public License along with this library; if not, write to the
+  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+  Boston, MA  02111-1307  USA
+
+  $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
+*/
+
+#ifndef Pins_Arduino_h
+#define Pins_Arduino_h
+
+#include <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 A0 = 18;
+static const uint8_t A1 = 19;
+static const uint8_t A2 = 20;
+static const uint8_t A3 = 21;
+static const uint8_t A4 = 22;
+static const uint8_t A5 = 23;
+static const uint8_t A6 = 24;   // D4
+static const uint8_t A7 = 25;   // D6
+static const uint8_t A8 = 26;   // D8
+static const uint8_t A9 = 27;   // D9
+static const uint8_t A10 = 28;  // D10
+static const uint8_t A11 = 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/lets_splitv2/readme.md b/keyboards/lets_splitv2/readme.md
new file mode 100644
index 00000000000..73fdb0f789d
--- /dev/null
+++ b/keyboards/lets_splitv2/readme.md
@@ -0,0 +1,102 @@
+Let's Split
+======
+
+This readme and most of the code are from https://github.com/ahtn/tmk_keyboard/
+
+Split keyboard firmware for Arduino Pro Micro or other ATmega32u4
+based boards.
+
+Features
+--------
+
+Some features supported by the firmware:
+
+* Either half can connect to the computer via USB, or both halves can be used
+  independently.
+* You only need 3 wires to connect the two halves. Two for VCC and GND and one
+  for serial communication.
+* Optional support for I2C connection between the two halves if for some
+  reason you require a faster connection between the two halves. Note this
+  requires an extra wire between halves and pull-up resistors on the data lines.
+
+Required Hardware
+-----------------
+
+Apart from diodes and key switches for the keyboard matrix in each half, you
+will need:
+
+* 2 Arduino Pro Micro's. You can find theses on aliexpress for ≈3.50USD each.
+* 2 TRS sockets
+* 1 TRS cable.
+
+Alternatively, you can use any sort of cable and socket that has at least 3
+wires. If you want to use I2C to communicate between halves, you will need a
+cable with at least 4 wires and 2x 4.7kΩ pull-up resistors
+
+Optional Hardware
+-----------------
+
+A speaker can be hooked-up to either side to the `5` (`C6`) pin and `GND`, and turned on via `AUDIO_ENABLE`.
+
+Wiring
+------
+
+The 3 wires of the TRS cable need to connect GND, VCC, and digital pin 3 (i.e.
+PD0 on the ATmega32u4) between the two Pro Micros.
+
+Then wire your key matrix to any of the remaining 17 IO pins of the pro micro
+and modify the `matrix.c` accordingly.
+
+The wiring for serial:
+
+![serial wiring](imgs/split-keyboard-serial-schematic.png)
+
+The wiring for i2c:
+
+![i2c wiring](imgs/split-keyboard-i2c-schematic.png)
+
+The pull-up resistors may be placed on either half. It is also possible
+to use 4 resistors and have the pull-ups in both halves, but this is
+unnecessary in simple use cases.
+
+Notes on Software Configuration
+-------------------------------
+
+Configuring the firmware is similar to any other TMK project. One thing
+to note is that `MATIX_ROWS` in `config.h` is the total number of rows between
+the two halves, i.e. if your split keyboard has 4 rows in each half, then
+`MATRIX_ROWS=8`.
+
+Also the current implementation assumes a maximum of 8 columns, but it would
+not be very difficult to adapt it to support more if required.
+
+
+Flashing
+--------
+
+If you define `EE_HANDS` in your `config.h`, you will need to set the
+EEPROM for the left and right halves. The EEPROM is used to store whether the
+half is left handed or right handed. This makes it so that the same firmware
+file will run on both hands instead of having to flash left and right handed
+versions of the firmware to each half. To flash the EEPROM file for the left
+half run:
+```
+make eeprom-left
+```
+and similarly for right half
+```
+make eeprom-right
+```
+
+After you have flashed the EEPROM for the first time, you then need to program
+the flash memory:
+```
+make program
+```
+Note that you need to program both halves, but you have the option of using
+different keymaps for each half. You could program the left half with a QWERTY
+layout and the right half with a Colemak layout. Then if you connect the left
+half to a computer by USB the keyboard will use QWERTY and Colemak when the
+right half is connected.
+
+
diff --git a/keyboards/lets_splitv2/serial.c b/keyboards/lets_splitv2/serial.c
new file mode 100644
index 00000000000..f439c2f20bf
--- /dev/null
+++ b/keyboards/lets_splitv2/serial.c
@@ -0,0 +1,225 @@
+/*
+ * WARNING: be careful changing this code, it is very timing dependent
+ */
+
+#ifndef F_CPU
+#define F_CPU 16000000
+#endif
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include <stdbool.h>
+
+#include "serial.h"
+
+// Serial pulse period in microseconds. Its probably a bad idea to lower this
+// value.
+#define SERIAL_DELAY 24
+
+uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
+uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
+
+#define SLAVE_DATA_CORRUPT (1<<0)
+volatile uint8_t status = 0;
+
+inline static
+void serial_delay(void) {
+  _delay_us(SERIAL_DELAY);
+}
+
+inline static
+void serial_output(void) {
+  SERIAL_PIN_DDR |= SERIAL_PIN_MASK;
+}
+
+// make the serial pin an input with pull-up resistor
+inline static
+void serial_input(void) {
+  SERIAL_PIN_DDR  &= ~SERIAL_PIN_MASK;
+  SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
+}
+
+inline static
+uint8_t serial_read_pin(void) {
+  return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK);
+}
+
+inline static
+void serial_low(void) {
+  SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK;
+}
+
+inline static
+void serial_high(void) {
+  SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
+}
+
+void serial_master_init(void) {
+  serial_output();
+  serial_high();
+}
+
+void serial_slave_init(void) {
+  serial_input();
+
+  // Enable INT0
+  EIMSK |= _BV(INT0);
+  // Trigger on falling edge of INT0
+  EICRA &= ~(_BV(ISC00) | _BV(ISC01));
+}
+
+// Used by the master to synchronize timing with the slave.
+static
+void sync_recv(void) {
+  serial_input();
+  // This shouldn't hang if the slave disconnects because the
+  // serial line will float to high if the slave does disconnect.
+  while (!serial_read_pin());
+  serial_delay();
+}
+
+// Used by the slave to send a synchronization signal to the master.
+static
+void sync_send(void) {
+  serial_output();
+
+  serial_low();
+  serial_delay();
+
+  serial_high();
+}
+
+// Reads a byte from the serial line
+static
+uint8_t serial_read_byte(void) {
+  uint8_t byte = 0;
+  serial_input();
+  for ( uint8_t i = 0; i < 8; ++i) {
+    byte = (byte << 1) | serial_read_pin();
+    serial_delay();
+    _delay_us(1);
+  }
+
+  return byte;
+}
+
+// Sends a byte with MSB ordering
+static
+void serial_write_byte(uint8_t data) {
+  uint8_t b = 8;
+  serial_output();
+  while( b-- ) {
+    if(data & (1 << b)) {
+      serial_high();
+    } else {
+      serial_low();
+    }
+    serial_delay();
+  }
+}
+
+// interrupt handle to be used by the slave device
+ISR(SERIAL_PIN_INTERRUPT) {
+  sync_send();
+
+  uint8_t checksum = 0;
+  for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
+    serial_write_byte(serial_slave_buffer[i]);
+    sync_send();
+    checksum += serial_slave_buffer[i];
+  }
+  serial_write_byte(checksum);
+  sync_send();
+
+  // wait for the sync to finish sending
+  serial_delay();
+
+  // read the middle of pulses
+  _delay_us(SERIAL_DELAY/2);
+
+  uint8_t checksum_computed = 0;
+  for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
+    serial_master_buffer[i] = serial_read_byte();
+    sync_send();
+    checksum_computed += serial_master_buffer[i];
+  }
+  uint8_t checksum_received = serial_read_byte();
+  sync_send();
+
+  serial_input(); // end transaction
+
+  if ( checksum_computed != checksum_received ) {
+    status |= SLAVE_DATA_CORRUPT;
+  } else {
+    status &= ~SLAVE_DATA_CORRUPT;
+  }
+}
+
+inline
+bool serial_slave_DATA_CORRUPT(void) {
+  return status & SLAVE_DATA_CORRUPT;
+}
+
+// Copies the serial_slave_buffer to the master and sends the
+// serial_master_buffer to the slave.
+//
+// Returns:
+// 0 => no error
+// 1 => slave did not respond
+int serial_update_buffers(void) {
+  // this code is very time dependent, so we need to disable interrupts
+  cli();
+
+  // signal to the slave that we want to start a transaction
+  serial_output();
+  serial_low();
+  _delay_us(1);
+
+  // wait for the slaves response
+  serial_input();
+  serial_high();
+  _delay_us(SERIAL_DELAY);
+
+  // check if the slave is present
+  if (serial_read_pin()) {
+    // slave failed to pull the line low, assume not present
+    sei();
+    return 1;
+  }
+
+  // if the slave is present syncronize with it
+  sync_recv();
+
+  uint8_t checksum_computed = 0;
+  // receive data from the slave
+  for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
+    serial_slave_buffer[i] = serial_read_byte();
+    sync_recv();
+    checksum_computed += serial_slave_buffer[i];
+  }
+  uint8_t checksum_received = serial_read_byte();
+  sync_recv();
+
+  if (checksum_computed != checksum_received) {
+    sei();
+    return 1;
+  }
+
+  uint8_t checksum = 0;
+  // send data to the slave
+  for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
+    serial_write_byte(serial_master_buffer[i]);
+    sync_recv();
+    checksum += serial_master_buffer[i];
+  }
+  serial_write_byte(checksum);
+  sync_recv();
+
+  // always, release the line when not in use
+  serial_output();
+  serial_high();
+
+  sei();
+  return 0;
+}
diff --git a/keyboards/lets_splitv2/serial.h b/keyboards/lets_splitv2/serial.h
new file mode 100644
index 00000000000..15fe4db7b4c
--- /dev/null
+++ b/keyboards/lets_splitv2/serial.h
@@ -0,0 +1,26 @@
+#ifndef MY_SERIAL_H
+#define MY_SERIAL_H
+
+#include "config.h"
+#include <stdbool.h>
+
+/* TODO:  some defines for interrupt setup */
+#define SERIAL_PIN_DDR DDRD
+#define SERIAL_PIN_PORT PORTD
+#define SERIAL_PIN_INPUT PIND
+#define SERIAL_PIN_MASK _BV(PD0)
+#define SERIAL_PIN_INTERRUPT INT0_vect
+
+#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
+#define SERIAL_MASTER_BUFFER_LENGTH 1
+
+// Buffers for master - slave communication
+extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
+extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
+
+void serial_master_init(void);
+void serial_slave_init(void);
+int serial_update_buffers(void);
+bool serial_slave_data_corrupt(void);
+
+#endif
diff --git a/keyboards/lets_splitv2/split_util.c b/keyboards/lets_splitv2/split_util.c
new file mode 100644
index 00000000000..65003a71a46
--- /dev/null
+++ b/keyboards/lets_splitv2/split_util.c
@@ -0,0 +1,76 @@
+#include <avr/io.h>
+#include <avr/wdt.h>
+#include <avr/power.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include <avr/eeprom.h>
+#include "split_util.h"
+#include "matrix.h"
+#include "i2c.h"
+#include "serial.h"
+#include "keyboard.h"
+#include "config.h"
+
+volatile bool isLeftHand = true;
+
+static void setup_handedness(void) {
+  #ifdef EE_HANDS
+    isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS);
+  #else
+    #ifdef I2C_MASTER_RIGHT
+      isLeftHand = !has_usb();
+    #else
+      isLeftHand = has_usb();
+    #endif
+  #endif
+}
+
+static void keyboard_master_setup(void) {
+#ifdef USE_I2C
+    i2c_master_init();
+#else
+    serial_master_init();
+#endif
+}
+
+static void keyboard_slave_setup(void) {
+#ifdef USE_I2C
+    i2c_slave_init(SLAVE_I2C_ADDRESS);
+#else
+    serial_slave_init();
+#endif
+}
+
+bool has_usb(void) {
+   USBCON |= (1 << OTGPADE); //enables VBUS pad
+   _delay_us(5);
+   return (USBSTA & (1<<VBUS));  //checks state of VBUS
+}
+
+void split_keyboard_setup(void) {
+   setup_handedness();
+
+   if (has_usb()) {
+      keyboard_master_setup();
+   } else {
+      keyboard_slave_setup();
+   }
+   sei();
+}
+
+void keyboard_slave_loop(void) {
+   matrix_init();
+
+   while (1) {
+      matrix_slave_scan();
+   }
+}
+
+// this code runs before the usb and keyboard is initialized
+void matrix_setup(void) {
+    split_keyboard_setup();
+
+    if (!has_usb()) {
+        keyboard_slave_loop();
+    }
+}
diff --git a/keyboards/lets_splitv2/split_util.h b/keyboards/lets_splitv2/split_util.h
new file mode 100644
index 00000000000..6b896679cac
--- /dev/null
+++ b/keyboards/lets_splitv2/split_util.h
@@ -0,0 +1,22 @@
+#ifndef SPLIT_KEYBOARD_UTIL_H
+#define SPLIT_KEYBOARD_UTIL_H
+
+#include <stdbool.h>
+
+#ifdef EE_HANDS
+	#define EECONFIG_BOOTMAGIC_END      (uint8_t *)10
+	#define EECONFIG_HANDEDNESS         EECONFIG_BOOTMAGIC_END
+#endif
+
+#define SLAVE_I2C_ADDRESS           0x32
+
+extern volatile bool isLeftHand;
+
+// slave version of matix scan, defined in matrix.c
+void matrix_slave_scan(void);
+
+void split_keyboard_setup(void);
+bool has_usb(void);
+void keyboard_slave_loop(void);
+
+#endif
diff --git a/keyboards/maxipad/Makefile b/keyboards/maxipad/Makefile
new file mode 100644
index 00000000000..3f6d133c9b3
--- /dev/null
+++ b/keyboards/maxipad/Makefile
@@ -0,0 +1,75 @@
+
+
+# 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
+
+ifndef QUANTUM_DIR
+	include ../../Makefile
+endif
+
+
diff --git a/keyboards/maxipad/config.h b/keyboards/maxipad/config.h
new file mode 100644
index 00000000000..59b8cebecdd
--- /dev/null
+++ b/keyboards/maxipad/config.h
@@ -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      0x6060
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    Wootpatoot
+#define PRODUCT         maxipad
+#define DESCRIPTION     g8ming keeb
+
+/* 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)
+ *
+*/
+#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
index 00000000000..f4671a9d113
--- /dev/null
+++ b/keyboards/maxipad/keymaps/default/Makefile
@@ -0,0 +1,21 @@
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE = no         # Console for debug(+400)
+COMMAND_ENABLE = yes        # Commands for debug and configuration
+NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = no           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
+
+ifndef QUANTUM_DIR
+	include ../../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/maxipad/keymaps/default/config.h b/keyboards/maxipad/keymaps/default/config.h
new file mode 100644
index 00000000000..df06a262062
--- /dev/null
+++ b/keyboards/maxipad/keymaps/default/config.h
@@ -0,0 +1,8 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "../../config.h"
+
+// place overrides here
+
+#endif
\ No newline at end of file
diff --git a/keyboards/maxipad/keymaps/default/keymap.c b/keyboards/maxipad/keymaps/default/keymap.c
new file mode 100644
index 00000000000..7ca127fe4de
--- /dev/null
+++ b/keyboards/maxipad/keymaps/default/keymap.c
@@ -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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+  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
index 00000000000..a6c0d4a3f04
--- /dev/null
+++ b/keyboards/maxipad/keymaps/default/readme.md
@@ -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
index 00000000000..879ae86a769
--- /dev/null
+++ b/keyboards/maxipad/maxipad.c
@@ -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
index 00000000000..eee1309ddcb
--- /dev/null
+++ b/keyboards/maxipad/maxipad.h
@@ -0,0 +1,25 @@
+#ifndef MAXIPAD_H
+#define MAXIPAD_H
+
+#include "quantum.h"
+
+// This a shortcut to help you visually see your layout.
+// The following is an example using the Planck MIT layout
+// The first section contains all of the arguements
+// The second converts the arguments into a two-dimensional array
+#define KEYMAP( \
+     k00, k01, k02, k03, k04, k05, \
+     k10, k11, k12, k13, k14, k15, \
+     k20, k21, k22, k23, k24, k25, \
+     k30, k31, k32, k33, k34, k35, \
+     k40, k41, k42, k43, k44, k45 \
+) \
+{ \
+    { k00, k01, k02, k03, k04, k05 }, \
+    { k10, k11, k12, k13, k14, k15 }, \
+    { k20, k21, k22, k23, k24, k25 }, \
+    { k30, k31, k32, k33, k34, k35 }, \
+    { k40, k41, k42, k43, k44, k45} \
+}
+
+#endif
diff --git a/keyboards/maxipad/readme.md b/keyboards/maxipad/readme.md
new file mode 100644
index 00000000000..964212b8a60
--- /dev/null
+++ b/keyboards/maxipad/readme.md
@@ -0,0 +1,28 @@
+maxipad keyboard firmware
+======================
+
+## Quantum MK Firmware
+
+For the full Quantum feature list, see [the parent readme.md](/doc/readme.md).
+
+## Building
+
+Download or clone the whole firmware and navigate to the keyboards/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 `keymap` option like:
+
+```
+$ make keymap=[default|jack|<name>]
+```
+
+Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`
\ No newline at end of file

From 79f82d3d80a24483d14b078d325bb0f45af58e3d Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@users.noreply.github.com>
Date: Thu, 10 Nov 2016 18:43:31 -0500
Subject: [PATCH 023/147] returned to o

---
 keyboards/lets_split/config.h | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/keyboards/lets_split/config.h b/keyboards/lets_split/config.h
index bf618704cd1..05439facb9e 100644
--- a/keyboards/lets_split/config.h
+++ b/keyboards/lets_split/config.h
@@ -25,7 +25,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PRODUCT_ID      0x3060
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    Wootpatoot
-#define PRODUCT         Lets Split v2
+#define PRODUCT         Lets Split
 #define DESCRIPTION     A split keyboard for the cheap makers
 
 /* key matrix size */
@@ -34,8 +34,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define MATRIX_COLS 6
 
 // wiring of each half
-#define MATRIX_ROW_PINS { D7, E6, B4, B5 }
-#define MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 }
+#define MATRIX_ROW_PINS { B5, B4, E6, D7 }
+#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 }
 
 #define CATERINA_BOOTLOADER
 
@@ -95,4 +95,4 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
 
-#endif
\ No newline at end of file
+#endif

From b5cecb4cc9df2d541050a9a95f48c1d5fb796ae4 Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@gmail.com>
Date: Thu, 10 Nov 2016 20:03:24 -0500
Subject: [PATCH 024/147] Added both revisions into one folder

---
 keyboards/lets_split/Makefile                 |  2 +-
 keyboards/lets_split/config.h                 | 16 ++-
 keyboards/lets_split/keymaps/default/keymap.c | 51 ++--------
 keyboards/lets_split/lets_split.c             | 27 -----
 keyboards/lets_split/lets_split.h             | 26 ++---
 keyboards/lets_split/rev1/config.h            | 98 +++++++++++++++++++
 keyboards/lets_split/rev1/rev1.c              | 30 ++++++
 keyboards/lets_split/rev1/rev1.h              | 25 +++++
 keyboards/lets_split/rev2/config.h            | 98 +++++++++++++++++++
 keyboards/lets_split/rev2/rev2.c              | 30 ++++++
 keyboards/lets_split/rev2/rev2.h              | 25 +++++
 11 files changed, 327 insertions(+), 101 deletions(-)
 create mode 100644 keyboards/lets_split/rev1/config.h
 create mode 100644 keyboards/lets_split/rev1/rev1.c
 create mode 100644 keyboards/lets_split/rev1/rev1.h
 create mode 100644 keyboards/lets_split/rev2/config.h
 create mode 100644 keyboards/lets_split/rev2/rev2.c
 create mode 100644 keyboards/lets_split/rev2/rev2.h

diff --git a/keyboards/lets_split/Makefile b/keyboards/lets_split/Makefile
index 982cfc591bb..396d5155530 100644
--- a/keyboards/lets_split/Makefile
+++ b/keyboards/lets_split/Makefile
@@ -72,7 +72,7 @@ USE_I2C ?= yes
 SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
 
 CUSTOM_MATRIX = yes
-
+SUBPROJECT_DEFAULT = rev2
 ifndef QUANTUM_DIR
 	include ../../Makefile
 endif
\ No newline at end of file
diff --git a/keyboards/lets_split/config.h b/keyboards/lets_split/config.h
index bf618704cd1..245529ae08e 100644
--- a/keyboards/lets_split/config.h
+++ b/keyboards/lets_split/config.h
@@ -28,15 +28,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #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
@@ -94,5 +85,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_ONESHOT
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
-
+#ifdef SUBPROJECT_rev1
+    #include "rev1/config.h"
+#endif
+#ifdef SUBPROJECT_rev2
+    #include "rev2/config.h"
+#endif
 #endif
\ No newline at end of file
diff --git a/keyboards/lets_split/keymaps/default/keymap.c b/keyboards/lets_split/keymaps/default/keymap.c
index 8c8466ebd5d..d9406381641 100644
--- a/keyboards/lets_split/keymaps/default/keymap.c
+++ b/keyboards/lets_split/keymaps/default/keymap.c
@@ -29,61 +29,24 @@ enum custom_keycodes {
 #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 |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[_QWERTY] = KEYMAP( \
-  KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC, \
+[0] = KEYMAP( \
+  KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_DEL, \
   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 , \
-  KC_LCTL, _LOWER, KC_LGUI, KC_LALT, MO(_LOWER),   KC_SPC,  KC_LSFT,  MO(_RAISE),   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+  KC_LCTL, _LOWER, KC_LGUI, KC_LALT, MO(_LOWER),   KC_SPC,  KC_SPC,  MO(_RAISE),   KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
 ),
-
-[_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_BSPC, 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_ENT, KC_ENT, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
 ),
-
-/* Adjust (Lower + Raise)
- * ,-----------------------------------------------------------------------------------.
- * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |      |      |      |      |      |      |      |      |      |      |      |      |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |      |      |      |      |      |             |      |      |      |      |      |
- * `-----------------------------------------------------------------------------------'
- */
 };
 
 #ifdef AUDIO_ENABLE
diff --git a/keyboards/lets_split/lets_split.c b/keyboards/lets_split/lets_split.c
index 574c116a754..fe2d4bc1936 100644
--- a/keyboards/lets_split/lets_split.c
+++ b/keyboards/lets_split/lets_split.c
@@ -1,30 +1,3 @@
 #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) {
-    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
-    _delay_ms(150);
-    stop_all_notes();
-}
diff --git a/keyboards/lets_split/lets_split.h b/keyboards/lets_split/lets_split.h
index 04844ed6392..2cdfb061f2d 100644
--- a/keyboards/lets_split/lets_split.h
+++ b/keyboards/lets_split/lets_split.h
@@ -1,25 +1,13 @@
 #ifndef LETS_SPLIT_H
 #define LETS_SPLIT_H
 
+#ifdef SUBPROJECT_rev1
+    #include "rev1.h"
+#endif
+#ifdef SUBPROJECT_rev2
+    #include "rev2.h"
+#endif
+
 #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/rev1/config.h b/keyboards/lets_split/rev1/config.h
new file mode 100644
index 00000000000..b609ada077f
--- /dev/null
+++ b/keyboards/lets_split/rev1/config.h
@@ -0,0 +1,98 @@
+/*
+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 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
+
+// #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 ws2812_PORTREG  PORTD
+#define ws2812_DDRREG   DDRD
+#define ws2812_pin PD1
+#define RGBLED_NUM 28     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+// #define NO_DEBUG
+
+/* disable print */
+// #define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
\ No newline at end of file
diff --git a/keyboards/lets_split/rev1/rev1.c b/keyboards/lets_split/rev1/rev1.c
new file mode 100644
index 00000000000..574c116a754
--- /dev/null
+++ b/keyboards/lets_split/rev1/rev1.c
@@ -0,0 +1,30 @@
+#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) {
+    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+    _delay_ms(150);
+    stop_all_notes();
+}
diff --git a/keyboards/lets_split/rev1/rev1.h b/keyboards/lets_split/rev1/rev1.h
new file mode 100644
index 00000000000..04fe0ddeb8f
--- /dev/null
+++ b/keyboards/lets_split/rev1/rev1.h
@@ -0,0 +1,25 @@
+#ifndef REV1_H
+#define REV1_H
+
+#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/rev2/config.h b/keyboards/lets_split/rev2/config.h
new file mode 100644
index 00000000000..bf618704cd1
--- /dev/null
+++ b/keyboards/lets_split/rev2/config.h
@@ -0,0 +1,98 @@
+/*
+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
+
+// #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 ws2812_PORTREG  PORTD
+#define ws2812_DDRREG   DDRD
+#define ws2812_pin PD1
+#define RGBLED_NUM 28     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+// #define NO_DEBUG
+
+/* disable print */
+// #define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
\ No newline at end of file
diff --git a/keyboards/lets_split/rev2/rev2.c b/keyboards/lets_split/rev2/rev2.c
new file mode 100644
index 00000000000..574c116a754
--- /dev/null
+++ b/keyboards/lets_split/rev2/rev2.c
@@ -0,0 +1,30 @@
+#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) {
+    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+    _delay_ms(150);
+    stop_all_notes();
+}
diff --git a/keyboards/lets_split/rev2/rev2.h b/keyboards/lets_split/rev2/rev2.h
new file mode 100644
index 00000000000..2a2246f056c
--- /dev/null
+++ b/keyboards/lets_split/rev2/rev2.h
@@ -0,0 +1,25 @@
+#ifndef REV2_H
+#define REV2_H
+
+#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

From 28249498bc621cd8e766a501de0e0c18e525d3f1 Mon Sep 17 00:00:00 2001
From: Seth Chandler <sethbc@sethbc.org>
Date: Sat, 12 Nov 2016 23:56:57 -0500
Subject: [PATCH 025/147] update sethbc keymap

---
 keyboards/satan/keymaps/sethbc/keymap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/keyboards/satan/keymaps/sethbc/keymap.c b/keyboards/satan/keymaps/sethbc/keymap.c
index 82c779081a7..b59efd1d94b 100644
--- a/keyboards/satan/keymaps/sethbc/keymap.c
+++ b/keyboards/satan/keymaps/sethbc/keymap.c
@@ -32,7 +32,7 @@ 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

From b2bc215934ddd31315db4304223750aee3eaf38d Mon Sep 17 00:00:00 2001
From: Seth Chandler <sethbc@sethbc.org>
Date: Sun, 13 Nov 2016 00:42:07 -0500
Subject: [PATCH 026/147] add sethbc keymap for gh60 and update macro expansion
 in connection with same

---
 keyboards/gh60/gh60.h                  | 32 ++++++-----
 keyboards/gh60/keymaps/sethbc/Makefile |  3 +
 keyboards/gh60/keymaps/sethbc/keymap.c | 76 ++++++++++++++++++++++++++
 3 files changed, 96 insertions(+), 15 deletions(-)
 create mode 100644 keyboards/gh60/keymaps/sethbc/Makefile
 create mode 100644 keyboards/gh60/keymaps/sethbc/keymap.c

diff --git a/keyboards/gh60/gh60.h b/keyboards/gh60/gh60.h
index 82624b61484..899f7dc6a3c 100644
--- a/keyboards/gh60/gh60.h
+++ b/keyboards/gh60/gh60.h
@@ -4,7 +4,7 @@
 #include "quantum.h"
 #include "led.h"
 
-/* GH60 LEDs 
+/* GH60 LEDs
  *   GPIO pads
  *   0 F7 WASD LEDs
  *   1 F6 ESC LED
@@ -49,13 +49,13 @@ inline void gh60_wasd_leds_off(void)   	{ DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
     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  \
-)
+) { \
+    { 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_NO,    KC_##K2D }, \
+    { KC_##K30, KC_NO,    KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_NO,    KC_##K3D }, \
+    { KC_##K40, KC_##K41, KC_##K42, KC_NO,    KC_NO,    KC_##K45, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D }  \
+}
 
 #define KEYMAP_HHKB( \
     K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\
@@ -63,12 +63,14 @@ inline void gh60_wasd_leds_off(void)   	{ DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
     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  \
-)
+) { \
+    { 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_NO,    KC_##K2D }, \
+    { KC_##K30, KC_NO,    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 }  \
+}
+
+
 
 #endif
diff --git a/keyboards/gh60/keymaps/sethbc/Makefile b/keyboards/gh60/keymaps/sethbc/Makefile
new file mode 100644
index 00000000000..457a3d01d4a
--- /dev/null
+++ b/keyboards/gh60/keymaps/sethbc/Makefile
@@ -0,0 +1,3 @@
+ifndef QUANTUM_DIR
+	include ../../../../Makefile
+endif
diff --git a/keyboards/gh60/keymaps/sethbc/keymap.c b/keyboards/gh60/keymaps/sethbc/keymap.c
new file mode 100644
index 00000000000..85a46a29bdc
--- /dev/null
+++ b/keyboards/gh60/keymaps/sethbc/keymap.c
@@ -0,0 +1,76 @@
+#include "gh60.h"
+#include "action_layer.h"
+
+#define MODS_CTRL_MASK  (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    /* 0: qwerty */
+  KEYMAP_HHKB(
+	      FN0, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSLS, GRV,  \
+        TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSPC, \
+        LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,ENT,  \
+        LSFT, Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,RSFT, FN1, \
+        LCTL,LALT,LGUI,          SPC,                RGUI,RALT,APP, RCTL),
+    /* 1: fn */
+	KEYMAP_HHKB(
+        GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, TRNS, TRNS, \
+        CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,UP,TRNS,TRNS, \
+        TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RIGHT,PENT, \
+        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END,PGDN,DOWN,TRNS,TRNS, \
+        TRNS,TRNS,TRNS,          TRNS,               TRNS,TRNS,TRNS,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;
+  }
+}

From 34bf8558cdfa3baa46db704299ef66b79b2d0a15 Mon Sep 17 00:00:00 2001
From: Seth Chandler <sethbc@sethbc.org>
Date: Sun, 13 Nov 2016 00:56:46 -0500
Subject: [PATCH 027/147] update sethbc ergodox keymap

---
 keyboards/ergodox/keymaps/sethbc/Makefile  | 11 -----------
 keyboards/ergodox/keymaps/sethbc/keymap.c  |  2 +-
 keyboards/ergodox/keymaps/sethbc/readme.md |  3 ++-
 3 files changed, 3 insertions(+), 13 deletions(-)

diff --git a/keyboards/ergodox/keymaps/sethbc/Makefile b/keyboards/ergodox/keymaps/sethbc/Makefile
index 8c4ff87845d..457a3d01d4a 100644
--- a/keyboards/ergodox/keymaps/sethbc/Makefile
+++ b/keyboards/ergodox/keymaps/sethbc/Makefile
@@ -1,14 +1,3 @@
-BOOTMAGIC_ENABLE = no  # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE  = yes # Mouse keys(+4700)
-EXTRAKEY_ENABLE  = yes # Audio control and System control(+450)
-CONSOLE_ENABLE   = no  # Console for debug(+400)
-COMMAND_ENABLE   = no  # Commands for debug and configuration
-CUSTOM_MATRIX    = yes # Custom matrix file for the ErgoDox EZ
-SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-NKRO_ENABLE      = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-MIDI_ENABLE      = no  # MIDI controls
-UNICODE_ENABLE   = yes # Unicode
-
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
 endif
diff --git a/keyboards/ergodox/keymaps/sethbc/keymap.c b/keyboards/ergodox/keymaps/sethbc/keymap.c
index 6846c4d5295..8816ad63bb9 100644
--- a/keyboards/ergodox/keymaps/sethbc/keymap.c
+++ b/keyboards/ergodox/keymaps/sethbc/keymap.c
@@ -15,7 +15,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
         KC_LGUI, KC_GRV,  KC_BSLS, KC_LEFT, KC_RGHT,
                                                      KC_LCTL, KC_LALT,
                                                               KC_HOME,
-                                            KC_SPC,  KC_BSPC, KC_END,
+                                            KC_BSPC,  KC_DEL, KC_END,
         // right hand
         MO(FN2), KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS,
         KC_LBRC, KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_RBRC,
diff --git a/keyboards/ergodox/keymaps/sethbc/readme.md b/keyboards/ergodox/keymaps/sethbc/readme.md
index 510b2f99c84..57b5d0ec7c6 100644
--- a/keyboards/ergodox/keymaps/sethbc/readme.md
+++ b/keyboards/ergodox/keymaps/sethbc/readme.md
@@ -1,3 +1,4 @@
 # sethbc's Ergodox EZ keymap
 
-Largely based on the Ergodox Infinity default keymap
+Largely based on the Ergodox Infinity default keymap, but layer locking has been
+removed in favor of momentary layer activation

From aa76425395028d304e223d43e76145343850f0db Mon Sep 17 00:00:00 2001
From: Seth Chandler <sethbc@sethbc.org>
Date: Sun, 13 Nov 2016 01:04:10 -0500
Subject: [PATCH 028/147] oops, fixed inverted if statement

---
 keyboards/satan/keymaps/sethbc/keymap.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/keyboards/satan/keymaps/sethbc/keymap.c b/keyboards/satan/keymaps/sethbc/keymap.c
index b59efd1d94b..93610258b38 100644
--- a/keyboards/satan/keymaps/sethbc/keymap.c
+++ b/keyboards/satan/keymaps/sethbc/keymap.c
@@ -37,16 +37,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 [_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
 };
 

From 162f603b1c36c63aa170170998b361a86413767f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hans=20Elleg=C3=A5rd?= <psyill.net@gmail.com>
Date: Sat, 29 Oct 2016 20:31:12 +0200
Subject: [PATCH 029/147] Added keymap "videck", an ErgoDox keymap for Vi(m)
 users.

---
 keyboards/ergodox/keymaps/videck/Makefile    |  19 +
 keyboards/ergodox/keymaps/videck/config.h    |  13 +
 keyboards/ergodox/keymaps/videck/keymap.c    | 179 ++++++++
 keyboards/ergodox/keymaps/videck/readme.md   |  24 +
 keyboards/ergodox/keymaps/videck/videck.json | 443 +++++++++++++++++++
 keyboards/ergodox/keymaps/videck/videck.png  | Bin 0 -> 106851 bytes
 6 files changed, 678 insertions(+)
 create mode 100644 keyboards/ergodox/keymaps/videck/Makefile
 create mode 100644 keyboards/ergodox/keymaps/videck/config.h
 create mode 100644 keyboards/ergodox/keymaps/videck/keymap.c
 create mode 100644 keyboards/ergodox/keymaps/videck/readme.md
 create mode 100644 keyboards/ergodox/keymaps/videck/videck.json
 create mode 100644 keyboards/ergodox/keymaps/videck/videck.png

diff --git a/keyboards/ergodox/keymaps/videck/Makefile b/keyboards/ergodox/keymaps/videck/Makefile
new file mode 100644
index 00000000000..5c7d21f2cc3
--- /dev/null
+++ b/keyboards/ergodox/keymaps/videck/Makefile
@@ -0,0 +1,19 @@
+AUDIO_ENABLE:=no
+BACKLIGHT_ENABLE:=no
+BLUETOOTH_ENABLE:=no
+BOOTMAGIC_ENABLE:=no
+COMMAND_ENABLE:=no
+CONSOLE_ENABLE:=no
+EXTRAKEY_ENABLE:=yes
+MIDI_ENABLE:=no
+MOUSEKEY_ENABLE:=yes
+NKRO_ENABLE:=no
+RGBLIGHT_ENABLE:=no
+SLEEP_LED_ENABLE:=no
+TAP_DANCE_ENABLE:=yes
+UNICODEMAP_ENABLE:=no
+UNICODE_ENABLE:=no
+
+ifndef QUANTUM_DIR
+	include ../../../../Makefile
+endif
diff --git a/keyboards/ergodox/keymaps/videck/config.h b/keyboards/ergodox/keymaps/videck/config.h
new file mode 100644
index 00000000000..d89aabe7791
--- /dev/null
+++ b/keyboards/ergodox/keymaps/videck/config.h
@@ -0,0 +1,13 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "../../config.h"
+
+#ifndef NO_DEBUG
+  #define NO_DEBUG
+#endif
+#ifndef NO_PRINT
+  #define NO_PRINT
+#endif
+
+#endif
diff --git a/keyboards/ergodox/keymaps/videck/keymap.c b/keyboards/ergodox/keymaps/videck/keymap.c
new file mode 100644
index 00000000000..7bd6274e941
--- /dev/null
+++ b/keyboards/ergodox/keymaps/videck/keymap.c
@@ -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
index 00000000000..759e81bac59
--- /dev/null
+++ b/keyboards/ergodox/keymaps/videck/readme.md
@@ -0,0 +1,24 @@
+ViDeck keymap for ErgoDox
+=========================
+
+This is a QWERTY layout based on the US layout, where Vi functionality has been
+especially considered.
+
+# Features
+* Mouse movements using the Vi movement keys.
+* Vi movement keys doubling as arrow keys.
+* Shift lock using double tap.
+* A coder's modifier key for easy input of parenthesis.
+* Acess to the escape key using either thumb.
+* Reasonably accessible Scroll Lock key (useful if you, like me, want to switch
+  to a non-US layout once in a while in X).
+
+# Missing keys
+* Caps Lock (shift lock is used instead).
+* Pause/Break.
+* Print Screen.
+
+# LEDs
+* Shift lock is indicated using first LED.
+* Arrow keys layer is indicated using second LED.
+* Mouse keys layer is indicated using third LED.
diff --git a/keyboards/ergodox/keymaps/videck/videck.json b/keyboards/ergodox/keymaps/videck/videck.json
new file mode 100644
index 00000000000..7068cf54852
--- /dev/null
+++ b/keyboards/ergodox/keymaps/videck/videck.json
@@ -0,0 +1,443 @@
+[
+  {
+    "backcolor": "#333333",
+    "background": {
+      "name": "PBT Black",
+      "style": "background-image: url('/bg/plastic/pbt-black.png');"
+    },
+    "switchMount": "cherry",
+    "switchBrand": "gateron",
+    "switchType": "KS-3-Red"
+  },
+  [
+    {
+      "x": 3.5,
+      "c": "#323232",
+      "t": "#ffffff\n\n\n#ac97d8"
+    },
+    "#\n3\n\nF3",
+    {
+      "x": 10.5
+    },
+    "*\n8\n\nF8"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5
+    },
+    "@\n2\n\nF2",
+    {
+      "x": 1
+    },
+    "$\n4\n\nF4",
+    {
+      "x": 8.5
+    },
+    "&\n7\n\nF7",
+    {
+      "x": 1,
+      "t": "#ffffff\n\n\n#ac97d8\n\n\n\n#555454"
+    },
+    "(\n9\n\nF9"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 5.5,
+      "t": "#ffffff\n\n\n#ac97d8"
+    },
+    "%\n5\n\nF5",
+    {
+      "t": "#ffffff"
+    },
+    "home",
+    {
+      "x": 4.5
+    },
+    "pgup",
+    {
+      "t": "#ffffff\n\n\n#ac97d8"
+    },
+    "^\n6\n\nF6"
+  ],
+  [
+    {
+      "y": -0.875,
+      "t": "#ffffff",
+      "w": 1.5
+    },
+    "~\n`",
+    {
+      "t": "#ffffff\n\n\n#ac97d8"
+    },
+    "!\n1\n\nF1",
+    {
+      "x": 14.5
+    },
+    ")\n0\n\nF10",
+    {
+      "w": 1.5
+    },
+    "_\n-\n\nF11"
+  ],
+  [
+    {
+      "y": -0.375,
+      "x": 3.5,
+      "t": "#ffffff"
+    },
+    "E",
+    {
+      "x": 10.5
+    },
+    "I"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5
+    },
+    "W",
+    {
+      "x": 1
+    },
+    "R",
+    {
+      "x": 8.5
+    },
+    "U",
+    {
+      "x": 1,
+      "t": "#ffffff\n\n\n\n\n\n\n\n\n#f8d615"
+    },
+    "O\n\n\n\n\n\n\n\n\n{"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 5.5,
+      "t": "#ffffff"
+    },
+    "T",
+    {
+      "h": 1.5
+    },
+    "end",
+    {
+      "x": 4.5,
+      "h": 1.5
+    },
+    "pgdn",
+    "Y"
+  ],
+  [
+    {
+      "y": -0.875,
+      "w": 1.5
+    },
+    "+\n=",
+    "Q",
+    {
+      "x": 14.5,
+      "t": "#ffffff\n\n\n\n\n\n\n\n\n#f8d615"
+    },
+    "P\n\n\n\n\n\n\n\n\n}",
+    {
+      "t": "#ffffff\n\n\n#ac97d8",
+      "w": 1.5
+    },
+    "|\n\\\n\nF12"
+  ],
+  [
+    {
+      "y": -0.375,
+      "x": 3.5,
+      "t": "#ffffff"
+    },
+    "D",
+    {
+      "x": 10.5,
+      "t": "#ffffff\n\n#5eb1e7\n#ac97d8"
+    },
+    "K\n\n<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
index 0000000000000000000000000000000000000000..c99323f53b1849872b261310a197addba435fe41
GIT binary patch
literal 106851
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
YuxYDeoyiEX0B?ra?}hhlagQMX2g$;JBLDyZ

literal 0
HcmV?d00001


From e9f748751808de2f1e85cf7fb670d78773bd5e76 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Sun, 13 Nov 2016 23:02:38 -0500
Subject: [PATCH 030/147] mostly working

---
 keyboards/ergodox/ez/ez.c               |  10 ++-
 keyboards/ergodox/ez/matrix.c           |   2 +-
 keyboards/ergodox/keymaps/jack/Makefile |   1 +
 keyboards/ergodox/keymaps/jack/config.h |   4 +-
 quantum/light_ws2812.c                  |  21 +++--
 quantum/light_ws2812.h                  |  14 +++-
 quantum/quantum.c                       |   1 +
 quantum/rgblight.c                      | 101 ++++++++++++------------
 quantum/rgblight.h                      |  10 ++-
 tmk_core/protocol/lufa/lufa.c           |  33 +++++++-
 10 files changed, 125 insertions(+), 72 deletions(-)

diff --git a/keyboards/ergodox/ez/ez.c b/keyboards/ergodox/ez/ez.c
index ddb8ff0cf71..039e4c6bb17 100644
--- a/keyboards/ergodox/ez/ez.c
+++ b/keyboards/ergodox/ez/ez.c
@@ -16,10 +16,10 @@ void matrix_init_kb(void) {
     // unused pins - C7, D4, D5, D7, E6
     // set as input with internal pull-ip enabled
     DDRC  &= ~(1<<7);
-    DDRD  &= ~(1<<7 | 1<<5 | 1<<4);
+    DDRD  &= ~(1<<5 | 1<<4);
     DDRE  &= ~(1<<6);
     PORTC |=  (1<<7);
-    PORTD |=  (1<<7 | 1<<5 | 1<<4);
+    PORTD |=  (1<<5 | 1<<4);
     PORTE |=  (1<<6);
 
     ergodox_blink_all_leds();
@@ -51,6 +51,10 @@ uint8_t init_mcp23018(void) {
     mcp23018_status = 0x20;
 
     // I2C subsystem
+
+    uint8_t sreg_prev;
+    sreg_prev=SREG;
+    cli();
     if (i2c_initialized == 0) {
         i2c_init();  // on pins D(1,0)
         i2c_initialized++;
@@ -79,6 +83,8 @@ uint8_t init_mcp23018(void) {
 out:
     i2c_stop();
 
+    SREG=sreg_prev;
+
     return mcp23018_status;
 }
 
diff --git a/keyboards/ergodox/ez/matrix.c b/keyboards/ergodox/ez/matrix.c
index a19bab90b27..43f5152591a 100644
--- a/keyboards/ergodox/ez/matrix.c
+++ b/keyboards/ergodox/ez/matrix.c
@@ -121,7 +121,7 @@ void matrix_init(void)
     matrix_scan_count = 0;
 #endif
 
-    matrix_init_kb();
+    matrix_init_quantum();
 
 }
 
diff --git a/keyboards/ergodox/keymaps/jack/Makefile b/keyboards/ergodox/keymaps/jack/Makefile
index 1e576127880..7c257af5016 100644
--- a/keyboards/ergodox/keymaps/jack/Makefile
+++ b/keyboards/ergodox/keymaps/jack/Makefile
@@ -1,4 +1,5 @@
 RGBLIGHT_ENABLE = yes
+MIDI_ENABLE = yes
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
diff --git a/keyboards/ergodox/keymaps/jack/config.h b/keyboards/ergodox/keymaps/jack/config.h
index 1781563b84a..5bf109c1840 100644
--- a/keyboards/ergodox/keymaps/jack/config.h
+++ b/keyboards/ergodox/keymaps/jack/config.h
@@ -5,10 +5,12 @@
 
 /* ws2812 RGB LED */
 #define RGB_DI_PIN D7
-// #define RGBLIGHT_TIMER
+#define RGBLIGHT_TIMER
 #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
+
 #endif
\ No newline at end of file
diff --git a/quantum/light_ws2812.c b/quantum/light_ws2812.c
index 497543339b7..6edbc0f2bd7 100755
--- a/quantum/light_ws2812.c
+++ b/quantum/light_ws2812.c
@@ -133,13 +133,13 @@ unsigned char I2C_Write(unsigned char c)
 #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)
@@ -150,12 +150,15 @@ 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 = 0;
+    TWCR &= ~(1<<TWEN);
     I2C_Init();
     I2C_Start();
     I2C_Write(0x84);
@@ -167,9 +170,9 @@ void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds)
       I2C_Write(curbyte);
     }
     I2C_Stop();
-    sei();
-  #else
-    _delay_us(80);
+    SREG=sreg_prev;
+    // TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
+    TWCR=twcr_prev;
   #endif
 
 
@@ -180,7 +183,9 @@ void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds)
   ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(RGB_DI_PIN & 0xF));
 
 
-
+  #ifndef RGBW_BB_TWI
+    _delay_us(80);
+  #endif
 }
 
 void ws2812_sendarray(uint8_t *data,uint16_t datlen)
diff --git a/quantum/light_ws2812.h b/quantum/light_ws2812.h
index 576c3bc483e..0bef93d5ec8 100755
--- a/quantum/light_ws2812.h
+++ b/quantum/light_ws2812.h
@@ -23,6 +23,14 @@
 #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
@@ -49,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
diff --git a/quantum/quantum.c b/quantum/quantum.c
index b8a81a76ba4..9fd9a6ef725 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -131,6 +131,7 @@ bool process_record_quantum(keyrecord_t *record) {
   #endif
   #ifdef PRINTING_ENABLE
     process_printer(keycode, record) &&
+  #endif
   #ifdef UNICODEMAP_ENABLE
     process_unicode_map(keycode, record) &&
   #endif
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index 221a164026e..1901010bf96 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -69,15 +69,12 @@ const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {100, 50, 20};
 
 rgblight_config_t rgblight_config;
 rgblight_config_t inmem_config;
-#ifdef RGBW
-  struct cRGBW led[RGBLED_NUM];
-#else
-  struct cRGB led[RGBLED_NUM];
-#endif
+
+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.
@@ -128,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;
@@ -145,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) {
@@ -311,7 +308,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;
@@ -378,51 +375,55 @@ void rgblight_set(void) {
 
 // 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_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);
+    }
   }
 }
 
@@ -461,7 +462,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();
 
@@ -498,7 +499,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]);
       }
     }
   }
@@ -518,7 +519,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;
@@ -537,7 +538,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]);
       }
     }
   }
diff --git a/quantum/rgblight.h b/quantum/rgblight.h
index efc685f3123..d16ba24e536 100644
--- a/quantum/rgblight.h
+++ b/quantum/rgblight.h
@@ -1,8 +1,6 @@
 #ifndef RGBLIGHT_H
 #define RGBLIGHT_H
 
-#define RGBW 1
-
 #if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
 	#define RGBLIGHT_MODES 23
 #else
@@ -35,6 +33,7 @@
 #endif
 
 #define RGBLED_TIMER_TOP F_CPU/(256*64)
+// #define RGBLED_TIMER_TOP 0xFF10
 
 #include <stdint.h>
 #include <stdbool.h>
@@ -79,10 +78,13 @@ 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);
 
+
+void rgblight_task(void);
+
 void rgblight_timer_init(void);
 void rgblight_timer_enable(void);
 void rgblight_timer_disable(void);
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 01c0e45b0b0..fe466f6047e 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -71,6 +71,10 @@
     #include "virtser.h"
 #endif
 
+#ifdef RGB_MIDI
+    #include "rgblight.h"        
+#endif
+
 uint8_t keyboard_idle = 0;
 /* 0: Boot Protocol, 1: Report Protocol(default) */
 uint8_t keyboard_protocol = 1;
@@ -1045,6 +1049,10 @@ int main(void)
 #endif
         keyboard_task();
 
+#ifdef RGBLIGHT_ENABLE
+        rgblight_task();
+#endif
+
 #ifdef VIRTSER_ENABLE
         virtser_task();
         CDC_Device_USBTask(&cdc_device);
@@ -1077,15 +1085,34 @@ void fallthrough_callback(MidiDevice * device,
 #endif
 }
 
+#ifdef RGB_MIDI
+    rgblight_config_t rgblight_config;
+#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);
+    #ifdef RGB_MIDI
+        rgblight_config.raw = eeconfig_read_rgblight();
+        switch (num) {
+            case 14:
+                rgblight_config.hue = val * 360 / 127;
+            break;
+            case 15:
+                rgblight_config.sat = val << 1;
+            break;
+            case 16:
+                rgblight_config.val = val << 1;
+            break;
+        }
+        rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
+    #endif
 }
 
 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));
+  // for (int i = 0; i < length; i++)
+  //   midi_send_cc(device, 15, 0x7F & data[i], 0x7F & (start + i));
 }
 #endif

From 702405f0391463cc5d0c8c8109304ac8d0ec844a Mon Sep 17 00:00:00 2001
From: Noah Andrews <NoahAndrews@users.noreply.github.com>
Date: Mon, 14 Nov 2016 10:03:18 -0500
Subject: [PATCH 031/147] Recommend WSL on Windows 10

At this point, I consider the batch scripts @IBNobody and I worked on to mostly be a failure. They've proven to be unreliable, too dependent on the environment they're being run in, and I've seen far too many examples of people having frustrating issues with them that I haven't been able to help them with. They can also produce misleading and confusing error messages. I've been pointing people to use the WSL for a while now. Eventually, I think we should make a proper replacement for the batch scripts, possibly with an environment in msys2. For now, the WSL method in Windows 10 is far more reliable, and is easy to set up.

I also cleaned up some things in the WSL instructions themselves.
---
 readme.md | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/readme.md b/readme.md
index d5a259ccb86..4eed2c776be 100644
--- a/readme.md
+++ b/readme.md
@@ -45,19 +45,19 @@ Before you are able to compile, you'll need to install an environment for AVR de
 
 ### Windows 10
 
-It's still recommended to use the method for Vista and later below. The reason for this is that the Windows 10 Subsystem for Linux lacks [USB support](https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/13355724-unable-to-access-usb-devices-from-bash), so it's not possible to flash the firmware to the keyboard. Please add your vote to the link!
+Due to some issues with the "Windows (Vista and later)" instructions below, we now recommend following these instructions if you use Windows, which will allow you to use the Windows Subsystem for Linux to compile the firmware. If you are not using Windows 10 with the Anniversary Update installed (which came out in July 2016), you will need to use one of the other methods, such as Docker, Vagrant, or the instructions for Vista and later. 
 
-That said, it's still possible to use it for compilation. And recommended, if you need to compile much, since it's much faster than at least Cygwin (which is also supported, but currently lacking documentation). I haven't tried the method below, so I'm unable to tell.
+If you use this method, you will need to use a standalone tool to flash the firmware to the keyboard after you compile it. We recommend the official [QMK Firmware Flasher](https://github.com/jackhumbert/qmk_firmware_flasher/releases). This is because the Windows 10 Subsystem for Linux lacks [libUSB support](https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/13355724-unable-to-access-usb-devices-from-bash), so it can't access the keyboard's microcontroller. Please add your vote for Microsoft to fix this issue using the link!
 
 Here are the steps
 
 1. Install the Windows 10 subsystem for Linux, following [these instructions](http://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/).
-2. If you have previously cloned the repository using the normal Git bash, you will need to clean up the line endings. If you have cloned it after 20th of August 2016, you are likely fine. To clean up the line endings do the following
-   1. Make sure that you have no changes you haven't committed by running `git status`, if you do commit them first
-   2. From within the Git bash run `git rm --cached -r .`
-   3. Followed by `git reset --hard`
-3. Start the "Bash On Ubuntu On Windows" from the start menu
-4. With the bash open, navigate to your Git checkout. The harddisk can be accessed from `/mnt` for example `/mnt/c` for the `c:\` drive.
+2. If you have  cloned the repository using git before August 20, 2016, clean up the line endings from wherever you currently access git:
+   1. Make sure that you have no changes you haven't committed by running `git status`. ANY UNCOMMITTED CHANGES WILL BE PERMANENTLY LOST.
+   2. Run `git rm --cached -r .`
+   3. Run `git reset --hard`
+3. Open "Bash On Ubuntu On Windows" from the start menu
+4. With the bash window open, navigate to your copy of the [qmk_firmware repository](https://github.com/jackhumbert/qmk_firmware) using the `cd` command. The harddisks can be accessed from `/mnt/<driveletter>`. For example, your main hard drive (C:) can be accessed by executiing the command `cd /mnt/c`. If your username is John and the qmk_firmware folder is in your Downloads folder, you can move to it with the command `cd /mnt/c/Users/John/Downloads/qmk_firmware`. You can use the Tab key as you go to help you autocomplete the folder names.
 5. Run `sudo util/install_dependencies.sh`.
 6. After a while the installation will finish, and you are good to go
 
@@ -1305,4 +1305,4 @@ This will add a traced variable named "layer" (the name is just for your informa
 
 In order to actually detect changes to the variables you should call `VERIFY_TRACED_VARIABLES` around the code that you think that modifies the variable. If a variable is modified it will tell you between which two `VERIFY_TRACED_VARIABLES` calls the modification happened. You can then add more calls to track it down further. I don't recommend spamming the codebase with calls. It's better to start with a few, and then keep adding them in a binary search fashion. You can also delete the ones you don't need, as each call need to store the file name and line number in the ROM, so you can run out of memory if you add too many calls.
 
-Also remember to delete all the tracing code ones you have found the bug, as you wouldn't want to create a pull request with tracing code.
\ No newline at end of file
+Also remember to delete all the tracing code ones you have found the bug, as you wouldn't want to create a pull request with tracing code.

From dd22c787b8b417df109d2136c76ce496dd7b93e3 Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@users.noreply.github.com>
Date: Mon, 14 Nov 2016 23:05:37 -0500
Subject: [PATCH 032/147] fixed extra paste

---
 keyboards/lets_split/config.h | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/keyboards/lets_split/config.h b/keyboards/lets_split/config.h
index a5394c5e4d2..bf04731162a 100644
--- a/keyboards/lets_split/config.h
+++ b/keyboards/lets_split/config.h
@@ -105,7 +105,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
     #include "rev2/config.h"
 #endif
 #endif
-=======
 
-#endif
->>>>>>> 79f82d3d80a24483d14b078d325bb0f45af58e3d
+
+

From bce6e52391da7c5f620c96a91857940f0dee19df Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@users.noreply.github.com>
Date: Mon, 14 Nov 2016 23:08:10 -0500
Subject: [PATCH 033/147] fixed conflict

---
 keyboards/lets_split/config.h | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/keyboards/lets_split/config.h b/keyboards/lets_split/config.h
index bf04731162a..059d45b0c00 100644
--- a/keyboards/lets_split/config.h
+++ b/keyboards/lets_split/config.h
@@ -28,8 +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
 
-<<<<<<< HEAD
-=======
 /* key matrix size */
 // Rows are doubled-up
 #define MATRIX_ROWS 8
@@ -39,7 +37,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define MATRIX_ROW_PINS { B5, B4, E6, D7 }
 #define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 }
 
->>>>>>> 79f82d3d80a24483d14b078d325bb0f45af58e3d
 #define CATERINA_BOOTLOADER
 
 // #define USE_I2C

From 530dd3377e4d409a7ca2fee7e47b60b735ebc0fa Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Tue, 15 Nov 2016 13:18:10 -0500
Subject: [PATCH 034/147] animations, midi, etc

---
 quantum/light_ws2812.c        | 1 -
 tmk_core/protocol/lufa/lufa.c | 5 +++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/quantum/light_ws2812.c b/quantum/light_ws2812.c
index 6edbc0f2bd7..aac058f5343 100755
--- a/quantum/light_ws2812.c
+++ b/quantum/light_ws2812.c
@@ -171,7 +171,6 @@ void inline ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t leds)
     }
     I2C_Stop();
     SREG=sreg_prev;
-    // TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
     TWCR=twcr_prev;
   #endif
 
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index fe466f6047e..b628cde370a 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -1043,12 +1043,13 @@ int main(void)
         }
         #endif
 
+        keyboard_task();
+
 #ifdef MIDI_ENABLE
         midi_device_process(&midi_device);
         // MIDI_Task();
 #endif
-        keyboard_task();
-
+        
 #ifdef RGBLIGHT_ENABLE
         rgblight_task();
 #endif

From 4da698fda3b7e08d7baa6849243716fb8765679a Mon Sep 17 00:00:00 2001
From: Seebs <seebs@seebs.net>
Date: Wed, 16 Nov 2016 15:44:26 -0600
Subject: [PATCH 035/147] dvorak/plover keyboard layout

Plover's steno support likes quasi-qwerty, and gaming likes qwerty,
and I like dvorak, so... what if I could have it all?

Signed-off-by: seebs <seebs@seebs.net>
---
 .../ergodox/keymaps/dvorak_plover/README.md   |  14 ++
 .../ergodox/keymaps/dvorak_plover/keymap.c    | 230 ++++++++++++++++++
 2 files changed, 244 insertions(+)
 create mode 100644 keyboards/ergodox/keymaps/dvorak_plover/README.md
 create mode 100644 keyboards/ergodox/keymaps/dvorak_plover/keymap.c

diff --git a/keyboards/ergodox/keymaps/dvorak_plover/README.md b/keyboards/ergodox/keymaps/dvorak_plover/README.md
new file mode 100644
index 00000000000..c8287b01954
--- /dev/null
+++ b/keyboards/ergodox/keymaps/dvorak_plover/README.md
@@ -0,0 +1,14 @@
+Dvorak support, plover support, gaming support
+
+I'm used to the Kinesis, so originally I was just going to patch up
+the thumb keys to be more familiar. But the ergodox is really well
+suited to NKRO support in Plover, so I added a layer for that, and
+then I remembered that dvorak can be really annoying for video
+games (try to reach WASD), so I added a layer for that.
+
+The result is probably a bit idiosyncratic, but it works for me.
+
+(I also don't have any press/hold distinction keys, because that
+confuses my fuzzy little brain.)
+
+Contributed by seebs (seebs@seebs.net)
diff --git a/keyboards/ergodox/keymaps/dvorak_plover/keymap.c b/keyboards/ergodox/keymaps/dvorak_plover/keymap.c
new file mode 100644
index 00000000000..d0505609d7b
--- /dev/null
+++ b/keyboards/ergodox/keymaps/dvorak_plover/keymap.c
@@ -0,0 +1,230 @@
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+
+#define BASE 0 // default layer
+#define SYMB 1 // symbols
+#define PLVR 2 // media keys
+#define QWRT 3 // qwerty layer for gaming
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   =    |   1  |   2  |   3  |   4  |   5  | Esc  |           | Esc  |   6  |   7  |   8  |   9  |   0  |   \    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * | Tab    |   '  |   ,  |   .  |   P  |   Y  |  L1  |           |  L2  |   F  |   G  |   C  |   R  |   L  |   /    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * | LGui   |   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   H  |   T  |   N  |   S  |   -    |
+ * |--------+------+------+------+------+------| Esc  |           |  L3  |------+------+------+------+------+--------|
+ * | LShift |   ;  |   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |   Z  | RShift |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |Lalt  |  Grv |      | Left | Right|                                       |  Up  | Down |   [  |   ]  | RAlt |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,---------------.
+ *                                        | LCtrl| Alt  |       | LGui | RCtrl  |
+ *                                 ,------|------|------|       |------+--------+------.
+ *                                 |      |      | Home |       | PgUp |        |      |
+ *                                 |Backsp|Delete|------|       |------| Enter  |Space |
+ *                                 |   ace|      | End  |       | PgDn |        |      |
+ *                                 `--------------------'       `----------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = KEYMAP(  // layer 0 : default
+        // left hand
+        KC_EQL,         KC_1,           KC_2,    KC_3,   KC_4,   KC_5,   KC_ESC,
+        KC_TAB,         KC_QUOT,        KC_COMM, KC_DOT, KC_P,   KC_Y,   MO(SYMB),
+        KC_LGUI,        KC_A,           KC_O,    KC_E,   KC_U,   KC_I,
+        KC_LSFT,        KC_SCLN,        KC_Q,    KC_J,   KC_K,   KC_X,   KC_ESC,
+        KC_LALT,        KC_GRV,         KC_ESC,  KC_LEFT,KC_RGHT,
+                                               KC_LCTL,  KC_LALT,
+                                                              KC_HOME,
+                                               KC_BSPC,KC_DEL,KC_END,
+        // right hand
+            KC_ESC,      KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_BSLS,
+             TG(PLVR),       KC_F,   KC_G,   KC_C,   KC_R,   KC_L,             KC_SLSH,
+                          KC_D,   KC_H,   KC_T,   KC_N,   KC_S,             KC_MINS,
+             TG(QWRT),KC_B,   KC_M,   KC_W,   KC_V,   KC_Z,             KC_RSFT,
+                                  KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_RALT,
+             KC_LGUI,        KC_RCTL,
+             KC_PGUP,
+             KC_PGDN,KC_ENT, KC_SPC
+    ),
+/* Keymap 1: Symbol Layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |   !  |   @  |   {  |   }  |   |  |      |           |      |   Up |  KP7 |  KP8 | KP9  |  KP* |   F12  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |  KP4 |  KP5 | KP6  |  KP+ |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |  KP1 |  KP2 | KP3  |  KP/ |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |  KP. | KP0  |  KP= |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|      |      |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// SYMBOLS
+[SYMB] = KEYMAP(
+       // left hand
+       KC_TRNS,KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
+       KC_TRNS,KC_EXLM,KC_AT,  KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
+       KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
+       KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
+       KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+                                       KC_TRNS,KC_TRNS,
+                                               KC_TRNS,
+                               KC_TRNS,KC_TRNS,KC_TRNS,
+       // right hand
+       KC_TRNS, KC_F6,   KC_F7,  KC_F8,   KC_F9,   KC_F10,  KC_F11,
+       KC_TRNS, KC_UP,   KC_P7,  KC_P8,   KC_P9,   KC_PAST, KC_F12,
+                KC_DOWN, KC_P4,  KC_P5,   KC_P6,   KC_PPLS, KC_TRNS,
+       KC_TRNS, KC_AMPR, KC_P1,  KC_P2,   KC_P3,   KC_PSLS, KC_TRNS,
+                         KC_TRNS,KC_PDOT,  KC_P0,   KC_PEQL,  KC_TRNS,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+),
+/* Keymap 2: Steno for Plover from https://github.com/shayneholmes/tmk_keyboard/commit/11290f8489013018f778627db725160c745e75bd
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |   1  |   2  |   3  |   4  |   5  |      |           | L2   |  6   |  7   |   8  |   9  |  0   |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   q  |   w  |   e  |   r  |   t  |------|           |------|  y   |  u   |   i  |   o  |  p   |   [    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   a  |   s  |   d  |   f  |   g  |      |           |      |  h   |  j   |   k  |   l  |  ;   |   '    |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |      |      |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |   c  |   v  |------|       |------|  n   |  m   |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+
+[PLVR] = KEYMAP(  // layout: layer 2: Steno for Plover
+        // left hand
+        KC_NO, KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,
+        KC_NO,  KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_TRNS,
+        KC_NO,  KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,
+        KC_NO,  KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_NO,
+        KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,
+                                      KC_FN4, KC_NO,
+                                           KC_NO,
+                                 KC_C,   KC_V,   KC_NO,
+        // right hand
+               KC_NO,  KC_NO,   KC_NO,   KC_NO,  KC_NO,   KC_NO,   KC_TRNS,
+               TG(2),   KC_6,    KC_7,    KC_8,   KC_9,    KC_0,   KC_TRNS,
+                        KC_Y,   KC_U,    KC_I,    KC_O,   KC_P,    KC_LBRC,
+               KC_NO,   KC_H,    KC_J,    KC_K,   KC_L, KC_SCLN,   KC_QUOT,
+                              KC_TRNS, KC_TRNS,  KC_NO,   KC_NO,     KC_NO,
+        KC_TRNS, KC_TRNS,
+        KC_TRNS,
+        KC_NO,  KC_N,   KC_M
+),
+/* Keymap 3: qwerty-ish
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   =    |   1  |   2  |   3  |   4  |   5  | Esc  |           | Esc  |   6  |   7  |   8  |   9  |   0  |   -    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * | Tab    |   Q  |   W  |   E  |   R  |   T  |      |           |      |   Y  |   U  |   I  |   O  |   P  |   \    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * | LGui   |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;  |  LGui  |
+ * |--------+------+------+------+------+------| Spc  |           |  L3  |------+------+------+------+------+--------|
+ * | LShift |   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |   /  | RShift |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   | Lalt |  Grv |  '"  | Left | Right|                                       |  Up  | Down |   [  |   ]  | RAlt |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,---------------.
+ *                                        | LCtrl| LAlt |       | LGui | RCtrl  |
+ *                                 ,------|------|------|       |------+--------+------.
+ *                                 |      |      | Home |       | PgUp |        |      |
+ *                                 |Backsp|Delete|------|       |------| Enter  |Space |
+ *                                 |   ace|      | End  |       | PgDn |        |      |
+ *                                 `--------------------'       `----------------------'
+ */
+[QWRT] = KEYMAP(  // layer 3: qwerty for gaming
+        // left hand
+        KC_EQL,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_ESC,
+        KC_TAB,         KC_Q,         KC_W,   KC_E,   KC_R,   KC_T,   TG(SYMB),
+        KC_LGUI,        KC_A,         KC_S,   KC_D,   KC_F,   KC_G,
+        KC_LSFT,        KC_Z,         KC_X,   KC_C,   KC_V,   KC_B,   KC_SPACE,
+        KC_LALT,      KC_GRV,      KC_QUOT,  KC_LEFT,KC_RGHT,
+										        KC_LCTL,  KC_LALT,
+										                       KC_HOME,
+										        KC_BSPC,KC_DEL,KC_END,
+        // right hand
+             KC_ESC,     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
+             KC_NO,       KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
+                          KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,          KC_QUOT,
+             TG(QWRT),    KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,          KC_RSFT,
+                                  KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_RALT,
+              KC_LGUI,        KC_RCTL,
+              KC_PGUP,
+              KC_PGDN,KC_ENT, KC_SPC
+    ),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_LAYER_TAP_TOGGLE(SYMB)                // FN1 - Momentary Layer 1 (Symbols)
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+        if (record->event.pressed) {
+          register_code(KC_RSFT);
+        } else {
+          unregister_code(KC_RSFT);
+        }
+        break;
+      }
+    return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+    uint8_t layer = biton32(layer_state);
+
+    ergodox_board_led_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
+    switch (layer) {
+      // TODO: Make this relevant to the ErgoDox EZ.
+        case 1:
+            ergodox_right_led_1_on();
+            break;
+        case 2:
+            ergodox_right_led_2_on();
+            break;
+		case 3:
+			ergodox_right_led_3_on();
+			break;
+        default:
+            // none
+            break;
+    }
+
+};

From 1dd6ceb45dfcf5f0991b84fea5a761a35df7fcda Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@gmail.com>
Date: Wed, 16 Nov 2016 19:18:54 -0500
Subject: [PATCH 036/147] Updated my repo to current qmk

---
 keyboards/lets_split/config.h                 |  48 +-----
 keyboards/lets_split/keymaps/default/keymap.c |  12 +-
 keyboards/lets_split/lets_split.c             |  30 ----
 keyboards/lets_split/lets_split.h             |  26 +--
 keyboards/lets_split/rev1/Makefile            |   3 +
 keyboards/lets_split/rev1/config.h            | 102 +++++++++++
 keyboards/lets_split/rev1/rev1.c              |  32 ++++
 keyboards/lets_split/rev1/rev1.h              |  25 +++
 keyboards/lets_split/rev1/rules.mk            |   5 +
 keyboards/lets_split/rev2/Makefile            |   3 +
 keyboards/lets_split/rev2/config.h            | 102 +++++++++++
 keyboards/lets_split/rev2/rev2.c              |  32 ++++
 keyboards/lets_split/rev2/rev2.h              |  25 +++
 keyboards/lets_split/rev2/rules.mk            |   5 +
 keyboards/lets_split/rules.mk                 |   7 +-
 keyboards/maxipad/Makefile                    |   3 +
 keyboards/maxipad/config.h                    | 162 ++++++++++++++++++
 keyboards/maxipad/keymaps/default/Makefile    |  21 +++
 keyboards/maxipad/keymaps/default/config.h    |   8 +
 keyboards/maxipad/keymaps/default/keymap.c    |  54 ++++++
 keyboards/maxipad/keymaps/default/readme.md   |   1 +
 keyboards/maxipad/maxipad.c                   |  28 +++
 keyboards/maxipad/maxipad.h                   |  25 +++
 keyboards/maxipad/readme.md                   |  28 +++
 keyboards/maxipad/rules.mk                    |  67 ++++++++
 25 files changed, 756 insertions(+), 98 deletions(-)
 create mode 100644 keyboards/lets_split/rev1/Makefile
 create mode 100644 keyboards/lets_split/rev1/config.h
 create mode 100644 keyboards/lets_split/rev1/rev1.c
 create mode 100644 keyboards/lets_split/rev1/rev1.h
 create mode 100644 keyboards/lets_split/rev1/rules.mk
 create mode 100644 keyboards/lets_split/rev2/Makefile
 create mode 100644 keyboards/lets_split/rev2/config.h
 create mode 100644 keyboards/lets_split/rev2/rev2.c
 create mode 100644 keyboards/lets_split/rev2/rev2.h
 create mode 100644 keyboards/lets_split/rev2/rules.mk
 create mode 100644 keyboards/maxipad/Makefile
 create mode 100644 keyboards/maxipad/config.h
 create mode 100644 keyboards/maxipad/keymaps/default/Makefile
 create mode 100644 keyboards/maxipad/keymaps/default/config.h
 create mode 100644 keyboards/maxipad/keymaps/default/keymap.c
 create mode 100644 keyboards/maxipad/keymaps/default/readme.md
 create mode 100644 keyboards/maxipad/maxipad.c
 create mode 100644 keyboards/maxipad/maxipad.h
 create mode 100644 keyboards/maxipad/readme.md
 create mode 100644 keyboards/maxipad/rules.mk

diff --git a/keyboards/lets_split/config.h b/keyboards/lets_split/config.h
index f4d900accbe..5bee553199c 100644
--- a/keyboards/lets_split/config.h
+++ b/keyboards/lets_split/config.h
@@ -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
 
@@ -72,25 +49,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define IS_COMMAND() ( \
     keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
 )
-
-/* ws2812 RGB LED */
-#define RGB_DI_PIN D4
-#define RGBLIGHT_TIMER
-#define RGBLED_NUM 8     // Number of LEDs
-#define RGBLIGHT_HUE_STEP 10
-#define RGBLIGHT_SAT_STEP 17
-#define RGBLIGHT_VAL_STEP 17
-
-/*
- * Feature disable options
- *  These options are also useful to firmware size reduction.
- */
-
 /* disable debug print */
-// #define NO_DEBUG
+//#define NO_DEBUG
 
 /* disable print */
-// #define NO_PRINT
+//#define NO_PRINT
 
 /* disable action features */
 //#define NO_ACTION_LAYER
@@ -98,5 +61,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_ONESHOT
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
-
+#ifdef SUBPROJECT_rev1
+    #include "rev1/config.h"
+#endif
+#ifdef SUBPROJECT_rev2
+    #include "rev2/config.h"
+#endif
 #endif
diff --git a/keyboards/lets_split/keymaps/default/keymap.c b/keyboards/lets_split/keymaps/default/keymap.c
index 0d2d94b6726..fc41c01fdba 100644
--- a/keyboards/lets_split/keymaps/default/keymap.c
+++ b/keyboards/lets_split/keymaps/default/keymap.c
@@ -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
@@ -99,7 +99,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
   KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
   _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \
-  _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+  _______, _______, _______, _______, _______, KC_BSPC, MT(MOD_LSFT, KC_BSPC), _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
 ),
 
 /* Raise
@@ -117,7 +117,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   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 \
+  _______, _______, _______, _______, _______, KC_ENT, MT(MOD_LSFT, KC_ENT), _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
 ),
 
 /* Adjust (Lower + Raise)
@@ -134,7 +134,7 @@ 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, _______, _______, _______, \
   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
 )
 
diff --git a/keyboards/lets_split/lets_split.c b/keyboards/lets_split/lets_split.c
index c505d3a6e31..851299aa2b4 100644
--- a/keyboards/lets_split/lets_split.c
+++ b/keyboards/lets_split/lets_split.c
@@ -1,32 +1,2 @@
 #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/lets_split.h b/keyboards/lets_split/lets_split.h
index fe7ae076792..2cdfb061f2d 100644
--- a/keyboards/lets_split/lets_split.h
+++ b/keyboards/lets_split/lets_split.h
@@ -1,25 +1,13 @@
 #ifndef LETS_SPLIT_H
 #define LETS_SPLIT_H
 
+#ifdef SUBPROJECT_rev1
+    #include "rev1.h"
+#endif
+#ifdef SUBPROJECT_rev2
+    #include "rev2.h"
+#endif
+
 #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/Makefile b/keyboards/lets_split/rev1/Makefile
new file mode 100644
index 00000000000..4e2a6f00fd8
--- /dev/null
+++ b/keyboards/lets_split/rev1/Makefile
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+	include ../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/lets_split/rev1/config.h b/keyboards/lets_split/rev1/config.h
new file mode 100644
index 00000000000..f4d900accbe
--- /dev/null
+++ b/keyboards/lets_split/rev1/config.h
@@ -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
+#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)) \
+)
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN D4
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 8     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+// #define NO_DEBUG
+
+/* disable print */
+// #define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
diff --git a/keyboards/lets_split/rev1/rev1.c b/keyboards/lets_split/rev1/rev1.c
new file mode 100644
index 00000000000..c505d3a6e31
--- /dev/null
+++ b/keyboards/lets_split/rev1/rev1.c
@@ -0,0 +1,32 @@
+#include "lets_split.h"
+
+#ifdef AUDIO_ENABLE
+    float tone_startup[][2] = SONG(STARTUP_SOUND);
+    float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
+#endif
+
+void matrix_init_kb(void) {
+
+    #ifdef AUDIO_ENABLE
+        _delay_ms(20); // gets rid of tick
+        PLAY_NOTE_ARRAY(tone_startup, false, 0);
+    #endif
+
+    // // green led on
+    // DDRD |= (1<<5);
+    // PORTD &= ~(1<<5);
+
+    // // orange led on
+    // DDRB |= (1<<0);
+    // PORTB &= ~(1<<0);
+
+	matrix_init_user();
+};
+
+void shutdown_user(void) {
+    #ifdef AUDIO_ENABLE
+        PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+	_delay_ms(150);
+	stop_all_notes();
+    #endif
+}
diff --git a/keyboards/lets_split/rev1/rev1.h b/keyboards/lets_split/rev1/rev1.h
new file mode 100644
index 00000000000..50bda031544
--- /dev/null
+++ b/keyboards/lets_split/rev1/rev1.h
@@ -0,0 +1,25 @@
+#ifndef REV1_H
+#define REV1_H
+
+#include "../lets_split.h"
+
+//void promicro_bootloader_jmp(bool program);
+
+#define KEYMAP( \
+	k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \
+	k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \
+	k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \
+	k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \
+	) \
+	{ \
+		{ k00, k01, k02, k03, k04, k05 }, \
+		{ k10, k11, k12, k13, k14, k15 }, \
+		{ k20, k21, k22, k23, k24, k25 }, \
+		{ k30, k31, k32, k33, k34, k35 }, \
+		{ k40, k41, k42, k43, k44, k45 }, \
+		{ k50, k51, k52, k53, k54, k55 }, \
+		{ k60, k61, k62, k63, k64, k65 }, \
+		{ k70, k71, k72, k73, k74, k75 } \
+	}
+
+#endif
\ No newline at end of file
diff --git a/keyboards/lets_split/rev1/rules.mk b/keyboards/lets_split/rev1/rules.mk
new file mode 100644
index 00000000000..a0825b4ef64
--- /dev/null
+++ b/keyboards/lets_split/rev1/rules.mk
@@ -0,0 +1,5 @@
+BACKLIGHT_ENABLE = no
+
+ifndef QUANTUM_DIR
+	include ../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/lets_split/rev2/Makefile b/keyboards/lets_split/rev2/Makefile
new file mode 100644
index 00000000000..4e2a6f00fd8
--- /dev/null
+++ b/keyboards/lets_split/rev2/Makefile
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+	include ../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/lets_split/rev2/config.h b/keyboards/lets_split/rev2/config.h
new file mode 100644
index 00000000000..cd152e331f4
--- /dev/null
+++ b/keyboards/lets_split/rev2/config.h
@@ -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 RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+// #define NO_DEBUG
+
+/* disable print */
+// #define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
diff --git a/keyboards/lets_split/rev2/rev2.c b/keyboards/lets_split/rev2/rev2.c
new file mode 100644
index 00000000000..c505d3a6e31
--- /dev/null
+++ b/keyboards/lets_split/rev2/rev2.c
@@ -0,0 +1,32 @@
+#include "lets_split.h"
+
+#ifdef AUDIO_ENABLE
+    float tone_startup[][2] = SONG(STARTUP_SOUND);
+    float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
+#endif
+
+void matrix_init_kb(void) {
+
+    #ifdef AUDIO_ENABLE
+        _delay_ms(20); // gets rid of tick
+        PLAY_NOTE_ARRAY(tone_startup, false, 0);
+    #endif
+
+    // // green led on
+    // DDRD |= (1<<5);
+    // PORTD &= ~(1<<5);
+
+    // // orange led on
+    // DDRB |= (1<<0);
+    // PORTB &= ~(1<<0);
+
+	matrix_init_user();
+};
+
+void shutdown_user(void) {
+    #ifdef AUDIO_ENABLE
+        PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+	_delay_ms(150);
+	stop_all_notes();
+    #endif
+}
diff --git a/keyboards/lets_split/rev2/rev2.h b/keyboards/lets_split/rev2/rev2.h
new file mode 100644
index 00000000000..a8b0f0f4c70
--- /dev/null
+++ b/keyboards/lets_split/rev2/rev2.h
@@ -0,0 +1,25 @@
+#ifndef REV2_H
+#define REV2_H
+
+#include "../lets_split.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
index 00000000000..80a942d06f7
--- /dev/null
+++ b/keyboards/lets_split/rev2/rules.mk
@@ -0,0 +1,5 @@
+BACKLIGHT_ENABLE = no
+
+ifndef QUANTUM_DIR
+	include ../../../Makefile
+endif
diff --git a/keyboards/lets_split/rules.mk b/keyboards/lets_split/rules.mk
index 6fde8a444cc..1aee5313c1e 100644
--- a/keyboards/lets_split/rules.mk
+++ b/keyboards/lets_split/rules.mk
@@ -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
index 00000000000..4e2a6f00fd8
--- /dev/null
+++ b/keyboards/maxipad/Makefile
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+	include ../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/maxipad/config.h b/keyboards/maxipad/config.h
new file mode 100644
index 00000000000..2462a5cfdae
--- /dev/null
+++ b/keyboards/maxipad/config.h
@@ -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      0x6060
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    You
+#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)
+ *
+*/
+#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
index 00000000000..f4671a9d113
--- /dev/null
+++ b/keyboards/maxipad/keymaps/default/Makefile
@@ -0,0 +1,21 @@
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE = no         # Console for debug(+400)
+COMMAND_ENABLE = yes        # Commands for debug and configuration
+NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = no           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
+
+ifndef QUANTUM_DIR
+	include ../../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/maxipad/keymaps/default/config.h b/keyboards/maxipad/keymaps/default/config.h
new file mode 100644
index 00000000000..df06a262062
--- /dev/null
+++ b/keyboards/maxipad/keymaps/default/config.h
@@ -0,0 +1,8 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "../../config.h"
+
+// place overrides here
+
+#endif
\ No newline at end of file
diff --git a/keyboards/maxipad/keymaps/default/keymap.c b/keyboards/maxipad/keymaps/default/keymap.c
new file mode 100644
index 00000000000..8a9bc4f0d48
--- /dev/null
+++ b/keyboards/maxipad/keymaps/default/keymap.c
@@ -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
index 00000000000..a6c0d4a3f04
--- /dev/null
+++ b/keyboards/maxipad/keymaps/default/readme.md
@@ -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
index 00000000000..879ae86a769
--- /dev/null
+++ b/keyboards/maxipad/maxipad.c
@@ -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
index 00000000000..eee1309ddcb
--- /dev/null
+++ b/keyboards/maxipad/maxipad.h
@@ -0,0 +1,25 @@
+#ifndef MAXIPAD_H
+#define MAXIPAD_H
+
+#include "quantum.h"
+
+// This a shortcut to help you visually see your layout.
+// The following is an example using the Planck MIT layout
+// The first section contains all of the arguements
+// The second converts the arguments into a two-dimensional array
+#define KEYMAP( \
+     k00, k01, k02, k03, k04, k05, \
+     k10, k11, k12, k13, k14, k15, \
+     k20, k21, k22, k23, k24, k25, \
+     k30, k31, k32, k33, k34, k35, \
+     k40, k41, k42, k43, k44, k45 \
+) \
+{ \
+    { k00, k01, k02, k03, k04, k05 }, \
+    { k10, k11, k12, k13, k14, k15 }, \
+    { k20, k21, k22, k23, k24, k25 }, \
+    { k30, k31, k32, k33, k34, k35 }, \
+    { k40, k41, k42, k43, k44, k45} \
+}
+
+#endif
diff --git a/keyboards/maxipad/readme.md b/keyboards/maxipad/readme.md
new file mode 100644
index 00000000000..e722b660225
--- /dev/null
+++ b/keyboards/maxipad/readme.md
@@ -0,0 +1,28 @@
+maxipad keyboard firmware
+======================
+
+## Quantum MK Firmware
+
+For the full Quantum feature list, see [the parent readme](/).
+
+## Building
+
+Download or clone the whole firmware and navigate to the keyboards/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 default`.
+
+### Other Keymaps
+
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
+
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
+```
+$ make [default|jack|<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
index 00000000000..55898147dd3
--- /dev/null
+++ b/keyboards/maxipad/rules.mk
@@ -0,0 +1,67 @@
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6

From 21b6b4e6c4d6872164a13e8d31e3e0a9f146ea60 Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@gmail.com>
Date: Wed, 16 Nov 2016 19:49:38 -0500
Subject: [PATCH 037/147] should have fixed conflixed

---
 keyboards/lets_split/Makefile                 | 79 -------------------
 keyboards/lets_split/config.h                 | 13 +--
 keyboards/lets_split/keymaps/default/keymap.c | 19 -----
 keyboards/lets_split/lets_split.c             |  7 +-
 keyboards/lets_split/rev1/config.h            | 26 ------
 keyboards/lets_split/rev1/rev1.c              |  6 --
 keyboards/lets_split/rev1/rev1.h              |  5 +-
 keyboards/lets_split/rev2/config.h            | 18 +----
 keyboards/lets_split/rev2/rev2.c              |  6 --
 keyboards/lets_split/rev2/rev2.h              |  5 +-
 keyboards/maxipad/Makefile                    | 78 ------------------
 keyboards/maxipad/config.h                    |  9 +--
 keyboards/maxipad/keymaps/default/keymap.c    |  7 +-
 13 files changed, 10 insertions(+), 268 deletions(-)

diff --git a/keyboards/lets_split/Makefile b/keyboards/lets_split/Makefile
index 6ce6e437311..4e2a6f00fd8 100644
--- a/keyboards/lets_split/Makefile
+++ b/keyboards/lets_split/Makefile
@@ -1,82 +1,3 @@
-<<<<<<< HEAD
 ifndef MAKEFILE_INCLUDED
-=======
-SRC += matrix.c \
-	   i2c.c \
-	   split_util.c \
-	   serial.c
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-# Build Options
-#   change to "no" to disable the options, or define them in the Makefile in 
-#   the appropriate keymap folder that will get included automatically
-#
-BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= no         # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE ?= no      # Enable keyboard backlight functionality
-MIDI_ENABLE ?= no            # MIDI controls
-AUDIO_ENABLE ?= 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.
-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
-
-CUSTOM_MATRIX = yes
-SUBPROJECT_DEFAULT = rev2
-ifndef QUANTUM_DIR
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
 	include ../../Makefile
 endif
\ No newline at end of file
diff --git a/keyboards/lets_split/config.h b/keyboards/lets_split/config.h
index 91b11f03fd8..1b7bbcbbb9e 100644
--- a/keyboards/lets_split/config.h
+++ b/keyboards/lets_split/config.h
@@ -61,20 +61,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_ONESHOT
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
-<<<<<<< HEAD
-=======
-<<<<<<< HEAD
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
+
 #ifdef SUBPROJECT_rev1
     #include "rev1/config.h"
 #endif
 #ifdef SUBPROJECT_rev2
     #include "rev2/config.h"
 #endif
-#endif
-<<<<<<< HEAD
-=======
-
-
-
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
+#endif
\ No newline at end of file
diff --git a/keyboards/lets_split/keymaps/default/keymap.c b/keyboards/lets_split/keymaps/default/keymap.c
index 41b9b8d8ff1..6f1f71f5f88 100644
--- a/keyboards/lets_split/keymaps/default/keymap.c
+++ b/keyboards/lets_split/keymaps/default/keymap.c
@@ -29,7 +29,6 @@ enum custom_keycodes {
 #define XXXXXXX KC_NO
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-<<<<<<< HEAD
 
 /* Qwerty
  * ,-----------------------------------------------------------------------------------.
@@ -83,29 +82,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   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 , \
   ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
-=======
-[0] = KEYMAP( \
-  KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_DEL, \
-  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 , \
-  KC_LCTL, _LOWER, KC_LGUI, KC_LALT, MO(_LOWER),   KC_SPC,  KC_SPC,  MO(_RAISE),   KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
 ),
 [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),_______, _______, _______, \
-<<<<<<< HEAD
   _______, _______, _______, _______, _______, KC_BSPC, MT(MOD_LSFT, KC_BSPC), _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
-=======
-  _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
 ),
 [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, _______, _______, _______, \
-<<<<<<< HEAD
   _______, _______, _______, _______, _______, KC_ENT, MT(MOD_LSFT, KC_ENT), _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
 ),
 
@@ -126,12 +113,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   _______, RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD, _______, _______, _______, \
   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
 )
-
-
-=======
-  _______, _______, _______, _______, _______, KC_ENT, KC_ENT, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
-),
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
 };
 
 #ifdef AUDIO_ENABLE
diff --git a/keyboards/lets_split/lets_split.c b/keyboards/lets_split/lets_split.c
index 8bb33f9514b..117b727a855 100644
--- a/keyboards/lets_split/lets_split.c
+++ b/keyboards/lets_split/lets_split.c
@@ -1,6 +1 @@
-#include "lets_split.h"
-
-<<<<<<< HEAD
-=======
-
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
+#include "lets_split.h"
\ No newline at end of file
diff --git a/keyboards/lets_split/rev1/config.h b/keyboards/lets_split/rev1/config.h
index da5b4767335..825e5ec2451 100644
--- a/keyboards/lets_split/rev1/config.h
+++ b/keyboards/lets_split/rev1/config.h
@@ -25,11 +25,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PRODUCT_ID      0x3060
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    Wootpatoot
-<<<<<<< HEAD
 #define PRODUCT         Lets Split
-=======
 #define PRODUCT         Lets Split v1
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
 #define DESCRIPTION     A split keyboard for the cheap makers
 
 /* key matrix size */
@@ -44,15 +41,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define CATERINA_BOOTLOADER
 
 // #define USE_I2C
-
-<<<<<<< HEAD
 // Use serial if not using I2C
 #ifndef USE_I2C
 #  define USE_SERIAL
 #endif
 
-=======
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
 // #define EE_HANDS
 
 #define I2C_MASTER_LEFT
@@ -80,21 +73,6 @@ 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 */
-<<<<<<< HEAD
-#define RGB_DI_PIN D4
-#define RGBLIGHT_TIMER
-#define RGBLED_NUM 8     // Number of LEDs
-=======
-#define ws2812_PORTREG  PORTD
-#define ws2812_DDRREG   DDRD
-#define ws2812_pin PD1
-#define RGBLED_NUM 28     // Number of LEDs
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
-#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.
@@ -113,8 +91,4 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
 
-<<<<<<< HEAD
 #endif
-=======
-#endif
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
diff --git a/keyboards/lets_split/rev1/rev1.c b/keyboards/lets_split/rev1/rev1.c
index 41dd1e35355..c505d3a6e31 100644
--- a/keyboards/lets_split/rev1/rev1.c
+++ b/keyboards/lets_split/rev1/rev1.c
@@ -24,15 +24,9 @@ void matrix_init_kb(void) {
 };
 
 void shutdown_user(void) {
-<<<<<<< HEAD
     #ifdef AUDIO_ENABLE
         PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
 	_delay_ms(150);
 	stop_all_notes();
     #endif
-=======
-    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
-    _delay_ms(150);
-    stop_all_notes();
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
 }
diff --git a/keyboards/lets_split/rev1/rev1.h b/keyboards/lets_split/rev1/rev1.h
index 998b2be7c7e..4667c9fb09c 100644
--- a/keyboards/lets_split/rev1/rev1.h
+++ b/keyboards/lets_split/rev1/rev1.h
@@ -1,15 +1,12 @@
 #ifndef REV1_H
 #define REV1_H
 
-<<<<<<< HEAD
 #include "../lets_split.h"
 
 //void promicro_bootloader_jmp(bool program);
-=======
 #include "quantum.h"
 
-void promicro_bootloader_jmp(bool program);
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
+//void promicro_bootloader_jmp(bool program);
 
 #define KEYMAP( \
 	k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \
diff --git a/keyboards/lets_split/rev2/config.h b/keyboards/lets_split/rev2/config.h
index 19c137e56c1..e9689d773d4 100644
--- a/keyboards/lets_split/rev2/config.h
+++ b/keyboards/lets_split/rev2/config.h
@@ -41,14 +41,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 // #define USE_I2C
 
-<<<<<<< HEAD
 // Use serial if not using I2C
 #ifndef USE_I2C
 #  define USE_SERIAL
 #endif
 
-=======
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
 // #define EE_HANDS
 
 #define I2C_MASTER_LEFT
@@ -77,19 +74,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 )
 
 /* ws2812 RGB LED */
-<<<<<<< HEAD
 #define RGB_DI_PIN D3
 #define RGBLIGHT_TIMER
 #define RGBLED_NUM 12    // Number of LEDs
-=======
 #define ws2812_PORTREG  PORTD
 #define ws2812_DDRREG   DDRD
-#define ws2812_pin PD1
-#define RGBLED_NUM 28     // Number of LEDs
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
-#define RGBLIGHT_HUE_STEP 10
-#define RGBLIGHT_SAT_STEP 17
-#define RGBLIGHT_VAL_STEP 17
 
 /*
  * Feature disable options
@@ -109,8 +98,5 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
 
-<<<<<<< HEAD
-#endif
-=======
-#endif
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
+
+#endif
\ No newline at end of file
diff --git a/keyboards/lets_split/rev2/rev2.c b/keyboards/lets_split/rev2/rev2.c
index 41dd1e35355..c505d3a6e31 100644
--- a/keyboards/lets_split/rev2/rev2.c
+++ b/keyboards/lets_split/rev2/rev2.c
@@ -24,15 +24,9 @@ void matrix_init_kb(void) {
 };
 
 void shutdown_user(void) {
-<<<<<<< HEAD
     #ifdef AUDIO_ENABLE
         PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
 	_delay_ms(150);
 	stop_all_notes();
     #endif
-=======
-    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
-    _delay_ms(150);
-    stop_all_notes();
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
 }
diff --git a/keyboards/lets_split/rev2/rev2.h b/keyboards/lets_split/rev2/rev2.h
index 9e251ca57db..990976de2bc 100644
--- a/keyboards/lets_split/rev2/rev2.h
+++ b/keyboards/lets_split/rev2/rev2.h
@@ -1,15 +1,12 @@
 #ifndef REV2_H
 #define REV2_H
 
-<<<<<<< HEAD
 #include "../lets_split.h"
 
 //void promicro_bootloader_jmp(bool program);
-=======
 #include "quantum.h"
 
-void promicro_bootloader_jmp(bool program);
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
+//void promicro_bootloader_jmp(bool program);
 
 #define KEYMAP( \
 	k00, k01, k02, k03, k04, k05, k45, k44, k43, k42, k41, k40, \
diff --git a/keyboards/maxipad/Makefile b/keyboards/maxipad/Makefile
index c65665142af..57b2ef62e5f 100644
--- a/keyboards/maxipad/Makefile
+++ b/keyboards/maxipad/Makefile
@@ -1,81 +1,3 @@
-<<<<<<< HEAD
 ifndef MAKEFILE_INCLUDED
 	include ../../Makefile
 endif
-=======
-
-
-# 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
-
-ifndef QUANTUM_DIR
-	include ../../Makefile
-endif
-
-
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
diff --git a/keyboards/maxipad/config.h b/keyboards/maxipad/config.h
index 4a942aae94a..fbe64a5b0b5 100644
--- a/keyboards/maxipad/config.h
+++ b/keyboards/maxipad/config.h
@@ -24,15 +24,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define VENDOR_ID       0xFEED
 #define PRODUCT_ID      0x6060
 #define DEVICE_VER      0x0001
-<<<<<<< HEAD
-#define MANUFACTURER    You
-#define PRODUCT         maxipad
-#define DESCRIPTION     A custom keyboard
-=======
 #define MANUFACTURER    Wootpatoot
 #define PRODUCT         maxipad
-#define DESCRIPTION     g8ming keeb
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
+#define DESCRIPTION     A custom keyboard
+
 
 /* key matrix size */
 #define MATRIX_ROWS 5
diff --git a/keyboards/maxipad/keymaps/default/keymap.c b/keyboards/maxipad/keymaps/default/keymap.c
index 5e3a594ccd7..43ace324197 100644
--- a/keyboards/maxipad/keymaps/default/keymap.c
+++ b/keyboards/maxipad/keymaps/default/keymap.c
@@ -10,15 +10,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 ),
 [1] = KEYMAP(
   KC_GRV,  KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, \
-<<<<<<< HEAD
   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, \
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
-  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
-  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS  \
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
 ),
 };
 

From b085a34506bc981a7c7cdb270b7786d6a4cbf985 Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@users.noreply.github.com>
Date: Wed, 16 Nov 2016 20:44:49 -0500
Subject: [PATCH 038/147] fixed readme conflicts

---
 keyboards/maxipad/readme.md | 22 ++--------------------
 1 file changed, 2 insertions(+), 20 deletions(-)

diff --git a/keyboards/maxipad/readme.md b/keyboards/maxipad/readme.md
index 1971ce1f368..ab7b122fe88 100644
--- a/keyboards/maxipad/readme.md
+++ b/keyboards/maxipad/readme.md
@@ -1,13 +1,7 @@
-maxipad keyboard firmware
-======================
-
 ## Quantum MK Firmware
 
-<<<<<<< HEAD
 For the full Quantum feature list, see [the parent readme](/).
-=======
-For the full Quantum feature list, see [the parent readme.md](/doc/readme.md).
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
+
 
 ## Building
 
@@ -17,17 +11,13 @@ Depending on which keymap you would like to use, you will have to compile slight
 
 ### Default
 
-<<<<<<< HEAD
-To build with the default keymap, simply run `make default`.
-=======
 To build with the default keymap, simply run `make`.
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
+
 
 ### 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.
 
-<<<<<<< HEAD
 To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
 
 ```
@@ -35,12 +25,4 @@ $ make [default|jack|<name>]
 ```
 
 Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
-=======
-To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
 
-```
-$ make keymap=[default|jack|<name>]
-```
-
-Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df

From 00d88b74ada77b7cbf452aaf622846f80d85d732 Mon Sep 17 00:00:00 2001
From: Benjamin Grabkowitz <profet23@users.noreply.github.com>
Date: Wed, 16 Nov 2016 23:52:36 -0500
Subject: [PATCH 039/147] Adding Support for atreus62 keyboard.
 https://github.com/profet23/atreus62

---
 keyboards/atreus62/Makefile                 |   3 +
 keyboards/atreus62/atreus62.c               |   1 +
 keyboards/atreus62/atreus62.h               |  26 ++
 keyboards/atreus62/config.h                 |  83 +++++
 keyboards/atreus62/keymaps/default/keymap.c |  71 ++++
 keyboards/atreus62/pro_micro.h              | 362 ++++++++++++++++++++
 keyboards/atreus62/rules.mk                 |  66 ++++
 7 files changed, 612 insertions(+)
 create mode 100644 keyboards/atreus62/Makefile
 create mode 100644 keyboards/atreus62/atreus62.c
 create mode 100644 keyboards/atreus62/atreus62.h
 create mode 100644 keyboards/atreus62/config.h
 create mode 100644 keyboards/atreus62/keymaps/default/keymap.c
 create mode 100644 keyboards/atreus62/pro_micro.h
 create mode 100644 keyboards/atreus62/rules.mk

diff --git a/keyboards/atreus62/Makefile b/keyboards/atreus62/Makefile
new file mode 100644
index 00000000000..4e2a6f00fd8
--- /dev/null
+++ b/keyboards/atreus62/Makefile
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+	include ../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/atreus62/atreus62.c b/keyboards/atreus62/atreus62.c
new file mode 100644
index 00000000000..ba5bce98992
--- /dev/null
+++ b/keyboards/atreus62/atreus62.c
@@ -0,0 +1 @@
+#include "atreus62.h"
\ No newline at end of file
diff --git a/keyboards/atreus62/atreus62.h b/keyboards/atreus62/atreus62.h
new file mode 100644
index 00000000000..eacf5b45138
--- /dev/null
+++ b/keyboards/atreus62/atreus62.h
@@ -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
index 00000000000..90a4aa05a6b
--- /dev/null
+++ b/keyboards/atreus62/config.h
@@ -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
index 00000000000..52802c77b7d
--- /dev/null
+++ b/keyboards/atreus62/keymaps/default/keymap.c
@@ -0,0 +1,71 @@
+// this is the style you want to emulate.
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+
+#include "atreus62.h"
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _DEFAULT 0
+#define _NAV 1
+#define _RESET 2
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[_DEFAULT] = { /* qwerty */
+		{ KC_ESC,   KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_TRNS,  KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS },
+		{ KC_BSLS,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_TRNS,  KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_RBRC },
+		{ KC_TAB,   KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_TRNS,  KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT },
+		{ KC_LSFT,  KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_DELT,  KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_LBRC },
+		{ KC_LCTL,  KC_LGUI, KC_LALT, KC_GRV,  MO(_NAV),KC_BSPC, KC_ENT,   KC_SPC,  KC_EQL,  KC_MINS, KC_QUOT, KC_ENT,  KC_RGUI }
+},
+
+[_NAV] = { 
+		{ TO(_DEFAULT),  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_TRNS,  KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11  },
+		{ KC_TRNS,       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_F12,  KC_TRNS, KC_UP,   KC_TRNS, KC_TRNS, KC_TRNS },
+		{ KC_TRNS,       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS },
+		{ TO(_RESET),    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS },
+		{ KC_TRNS,       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+},
+
+[_RESET] = {
+		{ TO(_DEFAULT),  KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  ,  KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO   },
+		{ KC_NO  ,       KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  ,  KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO   },
+		{ KC_NO  ,       KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  ,  KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO   },
+		{ KC_NO  ,       KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  ,  KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO   },
+		{ KC_NO  ,       KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  ,  KC_NO  , KC_NO  , KC_NO  , KC_NO  , KC_NO  , RESET }
+}
+
+
+/*
+[_TRNS] = {
+		{ KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS },
+		{ KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS },
+		{ KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS },
+		{ KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS },
+		{ KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+},
+*/
+};
+
+
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+	// MACRODOWN only works in this function
+	switch (id) {
+	case 0:
+		if (record->event.pressed) {
+			register_code(KC_RSFT);
+		}
+		else {
+			unregister_code(KC_RSFT);
+		}
+		break;
+	}
+	return MACRO_NONE;
+};
diff --git a/keyboards/atreus62/pro_micro.h b/keyboards/atreus62/pro_micro.h
new file mode 100644
index 00000000000..f9e7ed75d9d
--- /dev/null
+++ b/keyboards/atreus62/pro_micro.h
@@ -0,0 +1,362 @@
+/*
+  pins_arduino.h - Pin definition functions for Arduino
+  Part of Arduino - http://www.arduino.cc/
+
+  Copyright (c) 2007 David A. Mellis
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General
+  Public License along with this library; if not, write to the
+  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+  Boston, MA  02111-1307  USA
+
+  $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
+*/
+
+#ifndef Pins_Arduino_h
+#define Pins_Arduino_h
+
+#include <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/rules.mk b/keyboards/atreus62/rules.mk
new file mode 100644
index 00000000000..f5d0be23ac9
--- /dev/null
+++ b/keyboards/atreus62/rules.mk
@@ -0,0 +1,66 @@
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes         # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+#BACKLIGHT_ENABLE ?= no      # Enable keyboard backlight functionality
+#MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= yes         # Unicode
+#BLUETOOTH_ENABLE ?= yes       # Enable Bluetooth with the Adafruit EZ-Key HID
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend

From 6c5fce5c1a9d6383843416e0a236c2d7ea9cc2da Mon Sep 17 00:00:00 2001
From: Benjamin Grabkowitz <profet23@users.noreply.github.com>
Date: Wed, 16 Nov 2016 23:59:42 -0500
Subject: [PATCH 040/147] Adding readme placeholder

---
 keyboards/atreus62/readme.md | 10 ++++++++++
 1 file changed, 10 insertions(+)
 create mode 100644 keyboards/atreus62/readme.md

diff --git a/keyboards/atreus62/readme.md b/keyboards/atreus62/readme.md
new file mode 100644
index 00000000000..0245b4f9f05
--- /dev/null
+++ b/keyboards/atreus62/readme.md
@@ -0,0 +1,10 @@
+atreus62 keyboard firmware
+======================
+
+This firmware is for the atreus62 keyboard.
+
+This version utilizes a Pro Micro for its controller and has a 62 key layout.
+
+https://github.com/profet23/atreus62
+
+TODO: More information
\ No newline at end of file

From 3774a7fcdab5544fc787f4c200be05fcd417e31f Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Thu, 17 Nov 2016 17:42:14 -0500
Subject: [PATCH 041/147] rgb light through midi

---
 keyboards/amj60/config.h                      |  2 +-
 keyboards/clueboard/rev1/config.h             |  2 +-
 keyboards/clueboard/rev2/config.h             |  2 +-
 keyboards/cluecard/config.h                   |  2 +-
 .../cluecard/keymaps/rgb_effects/config.h     |  2 +-
 keyboards/cluepad/config.h                    |  2 +-
 keyboards/ergodox/keymaps/jack/config.h       |  3 +-
 keyboards/gh60/keymaps/robotmaxtron/config.h  |  2 +-
 .../handwired/minorca/keymaps/rgb/config.h    |  2 +-
 keyboards/jd40/config.h                       |  2 +-
 keyboards/kc60/keymaps/ws2812/config.h        |  2 +-
 keyboards/lets_split/config.h                 |  2 +-
 keyboards/lets_split/keymaps/i2c/config.h     |  2 +-
 keyboards/lets_split/keymaps/serial/config.h  |  2 +-
 keyboards/phantom/config.h                    |  2 +-
 .../planck/keymaps/experimental/config.h      |  2 +-
 keyboards/planck/keymaps/yang/config.h        |  2 +-
 keyboards/preonic/config.h                    |  2 +-
 keyboards/preonic/keymaps/kinesis/config.h    |  2 +-
 keyboards/satan/config.h                      |  2 +-
 keyboards/tada68/config.h                     |  2 +-
 quantum/light_ws2812.c                        |  2 -
 quantum/rgblight.c                            | 10 +-
 quantum/rgblight.h                            |  2 +-
 readme.md                                     |  4 +-
 tmk_core/protocol/lufa/lufa.c                 | 96 +++++++++++++++++++
 26 files changed, 126 insertions(+), 31 deletions(-)

diff --git a/keyboards/amj60/config.h b/keyboards/amj60/config.h
index d98e0e9f2f8..7c06f9a6c79 100644
--- a/keyboards/amj60/config.h
+++ b/keyboards/amj60/config.h
@@ -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/clueboard/rev1/config.h b/keyboards/clueboard/rev1/config.h
index 8c949723247..f40876ffbf7 100644
--- a/keyboards/clueboard/rev1/config.h
+++ b/keyboards/clueboard/rev1/config.h
@@ -26,7 +26,7 @@
 /* Underlight configuration
  */
 #define RGB_DI_PIN B2
-#define RGBLIGHT_TIMER
+#define RGBLIGHT_ANIMATIONS
 #define RGBLED_NUM 14     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17
diff --git a/keyboards/clueboard/rev2/config.h b/keyboards/clueboard/rev2/config.h
index 15ca4ece86a..8435fd02be7 100644
--- a/keyboards/clueboard/rev2/config.h
+++ b/keyboards/clueboard/rev2/config.h
@@ -30,7 +30,7 @@
 /* Underlight configuration
  */
 #define RGB_DI_PIN D7
-#define RGBLIGHT_TIMER
+#define RGBLIGHT_ANIMATIONS
 #define RGBLED_NUM 14     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17
diff --git a/keyboards/cluecard/config.h b/keyboards/cluecard/config.h
index 765347b1319..6520eb5574a 100644
--- a/keyboards/cluecard/config.h
+++ b/keyboards/cluecard/config.h
@@ -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
diff --git a/keyboards/cluecard/keymaps/rgb_effects/config.h b/keyboards/cluecard/keymaps/rgb_effects/config.h
index e88847df4d3..c6c9342c818 100644
--- a/keyboards/cluecard/keymaps/rgb_effects/config.h
+++ b/keyboards/cluecard/keymaps/rgb_effects/config.h
@@ -4,7 +4,7 @@
 #include "../../config.h"
 
 // place overrides here
-#define RGBLIGHT_TIMER
+#define RGBLIGHT_ANIMATIONS
 #define RGBLIGHT_EFFECT_SNAKE_LENGTH 3
 #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2
 #define RGBLIGHT_EFFECT_KNIGHT_OFFSET 2
diff --git a/keyboards/cluepad/config.h b/keyboards/cluepad/config.h
index bae05fade38..bd64dfd27d9 100644
--- a/keyboards/cluepad/config.h
+++ b/keyboards/cluepad/config.h
@@ -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
diff --git a/keyboards/ergodox/keymaps/jack/config.h b/keyboards/ergodox/keymaps/jack/config.h
index 5bf109c1840..5c11652264a 100644
--- a/keyboards/ergodox/keymaps/jack/config.h
+++ b/keyboards/ergodox/keymaps/jack/config.h
@@ -5,12 +5,13 @@
 
 /* ws2812 RGB LED */
 #define RGB_DI_PIN D7
-#define RGBLIGHT_TIMER
+#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
diff --git a/keyboards/gh60/keymaps/robotmaxtron/config.h b/keyboards/gh60/keymaps/robotmaxtron/config.h
index 6a29e6b8c26..bcd7534617c 100644
--- a/keyboards/gh60/keymaps/robotmaxtron/config.h
+++ b/keyboards/gh60/keymaps/robotmaxtron/config.h
@@ -182,7 +182,7 @@ along with this program. If not, see <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
diff --git a/keyboards/handwired/minorca/keymaps/rgb/config.h b/keyboards/handwired/minorca/keymaps/rgb/config.h
index deaac2e26fa..43b3c59110d 100644
--- a/keyboards/handwired/minorca/keymaps/rgb/config.h
+++ b/keyboards/handwired/minorca/keymaps/rgb/config.h
@@ -11,7 +11,7 @@
 
 /* ws2812 RGB LED */
 #define RGB_DI_PIN D5
-#define RGBLIGHT_TIMER
+#define RGBLIGHT_ANIMATIONS
 #define RGBLED_NUM 13     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17
diff --git a/keyboards/jd40/config.h b/keyboards/jd40/config.h
index e2594f4b372..047be5707b0 100644
--- a/keyboards/jd40/config.h
+++ b/keyboards/jd40/config.h
@@ -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
diff --git a/keyboards/kc60/keymaps/ws2812/config.h b/keyboards/kc60/keymaps/ws2812/config.h
index 2f39ea8e55e..43abf6228ef 100644
--- a/keyboards/kc60/keymaps/ws2812/config.h
+++ b/keyboards/kc60/keymaps/ws2812/config.h
@@ -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
diff --git a/keyboards/lets_split/config.h b/keyboards/lets_split/config.h
index f4d900accbe..b0ad522fcba 100644
--- a/keyboards/lets_split/config.h
+++ b/keyboards/lets_split/config.h
@@ -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
diff --git a/keyboards/lets_split/keymaps/i2c/config.h b/keyboards/lets_split/keymaps/i2c/config.h
index 2671fabf6d4..72e5ae66bab 100644
--- a/keyboards/lets_split/keymaps/i2c/config.h
+++ b/keyboards/lets_split/keymaps/i2c/config.h
@@ -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
diff --git a/keyboards/lets_split/keymaps/serial/config.h b/keyboards/lets_split/keymaps/serial/config.h
index f4d900accbe..b0ad522fcba 100644
--- a/keyboards/lets_split/keymaps/serial/config.h
+++ b/keyboards/lets_split/keymaps/serial/config.h
@@ -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
diff --git a/keyboards/phantom/config.h b/keyboards/phantom/config.h
index 983a1d73f29..71a33498b4f 100644
--- a/keyboards/phantom/config.h
+++ b/keyboards/phantom/config.h
@@ -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
diff --git a/keyboards/planck/keymaps/experimental/config.h b/keyboards/planck/keymaps/experimental/config.h
index 52acd1905eb..cc093bee493 100644
--- a/keyboards/planck/keymaps/experimental/config.h
+++ b/keyboards/planck/keymaps/experimental/config.h
@@ -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/yang/config.h b/keyboards/planck/keymaps/yang/config.h
index feb5a119013..4ed19d76f90 100644
--- a/keyboards/planck/keymaps/yang/config.h
+++ b/keyboards/planck/keymaps/yang/config.h
@@ -5,7 +5,7 @@
 
 /* ws2812 RGB LED */
 #define RGB_DI_PIN D1
-#define RGBLIGHT_TIMER
+#define RGBLIGHT_ANIMATIONS
 #define RGBLED_NUM 28     // Number of LEDs
 #define RGBLIGHT_HUE_STEP 10
 #define RGBLIGHT_SAT_STEP 17
diff --git a/keyboards/preonic/config.h b/keyboards/preonic/config.h
index 3fb978c2f6b..f88acf21110 100644
--- a/keyboards/preonic/config.h
+++ b/keyboards/preonic/config.h
@@ -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
diff --git a/keyboards/preonic/keymaps/kinesis/config.h b/keyboards/preonic/keymaps/kinesis/config.h
index 086baa84ff8..e6099ceb82c 100644
--- a/keyboards/preonic/keymaps/kinesis/config.h
+++ b/keyboards/preonic/keymaps/kinesis/config.h
@@ -63,7 +63,7 @@ along with this program.  If not, see <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
diff --git a/keyboards/satan/config.h b/keyboards/satan/config.h
index 7e9f91cc829..eb357b39e07 100644
--- a/keyboards/satan/config.h
+++ b/keyboards/satan/config.h
@@ -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/tada68/config.h b/keyboards/tada68/config.h
index 5d8757936dd..19cf9c9b398 100644
--- a/keyboards/tada68/config.h
+++ b/keyboards/tada68/config.h
@@ -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
diff --git a/quantum/light_ws2812.c b/quantum/light_ws2812.c
index aac058f5343..a883b138848 100755
--- a/quantum/light_ws2812.c
+++ b/quantum/light_ws2812.c
@@ -16,8 +16,6 @@
 #include <util/delay.h>
 #include "debug.h"
 
-#define RGBW_BB_TWI 1
-
 #ifdef RGBW_BB_TWI
 
 // Port for the I2C
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index 1901010bf96..6b58f665471 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -174,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
 
@@ -221,7 +221,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) {
@@ -231,7 +231,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
   }
@@ -245,7 +245,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);
@@ -371,7 +371,7 @@ void rgblight_set(void) {
   }
 }
 
-#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
+#ifdef RGBLIGHT_ANIMATIONS
 
 // Animation timer -- AVR Timer3
 void rgblight_timer_init(void) {
diff --git a/quantum/rgblight.h b/quantum/rgblight.h
index d16ba24e536..330c2fe1ba1 100644
--- a/quantum/rgblight.h
+++ b/quantum/rgblight.h
@@ -1,7 +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
diff --git a/readme.md b/readme.md
index d5a259ccb86..2364b53010d 100644
--- a/readme.md
+++ b/readme.md
@@ -1135,12 +1135,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
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index b628cde370a..7eb9be601e3 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -51,6 +51,7 @@
 
 #include "descriptor.h"
 #include "lufa.h"
+#include "quantum.h"
 
 #ifdef NKRO_ENABLE
   #include "keycode_config.h"
@@ -1111,9 +1112,104 @@ void cc_callback(MidiDevice * device,
     #endif
 }
 
+void send_dword(uint32_t number) {
+    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;
+    }
+}
+
+uint8_t midi_buffer[16] = {0};
+
 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));
+    // if (start == 0x27) {
+        // 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)
+                sysex_buffer_callback(start + place, &midi_buffer);
+            // SEND_STRING(" ");
+            data++;
+        }
+    // }
+
 }
+
+void sysex_buffer_callback(uint8_t length, uint8_t * data) {
+    uint8_t * pointer_copy = data;
+
+    if (*data++ != 0xF0)
+        return
+    data++;
+    data++;
+    data++;
+    data++;
+
+    switch (*data++) {
+        case 0x27: ; // RGB LED functions
+            switch (*data++)
+                case 0x00: ; // Update HSV
+                    uint32_t part1 = *data++;
+                    uint32_t part2 = *data++;
+                    uint32_t part3 = *data++;
+                    uint32_t part4 = *data++;
+                    uint32_t part5 = *data++;
+                    uint32_t chunk = ((part1 & 0x1FUL) << 28) | (part2 << 21) | (part3 << 14) | (part4 << 7) | part5;
+                    // SEND_STRING("\nCHUNK: ");
+                    // send_dword(chunk);
+                    rgblight_sethsv(((chunk >> 16) & 0xFFFF) % 360, (chunk >> 8) & 0xFF, chunk & 0xFF);
+                    // SEND_STRING("\nHUE: ");
+                    // send_word(((chunk >> 16) & 0xFFFF) % 360);
+                    // SEND_STRING("\nSAT: ");
+                    // send_word((chunk >> 8) & 0xFF);
+                    // SEND_STRING("\nVAL: ");
+                    // send_word(chunk & 0xFF);
+                    break;
+                case 0x01: ; // Update RGB
+                    break;
+            break;
+    }
+
+    // SEND_STRING("\nDATA:\n");
+    // while (*pointer_copy != 0xF7) {
+    //     send_byte(*pointer_copy++);
+    //     SEND_STRING(" ");
+    // }
+
+}
+
 #endif

From 9bbc9a7ce024edb4d80ce65d43c82456e3714928 Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Thu, 17 Nov 2016 19:47:08 -0500
Subject: [PATCH 042/147] Initial Erez Experimental keymap tweaks

---
 keyboards/ergodox/keymaps/erez_experimental/Makefile |  2 ++
 keyboards/ergodox/keymaps/erez_experimental/config.h | 11 +++++++++++
 keyboards/ergodox/keymaps/erez_experimental/keymap.c | 12 ++++++------
 3 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/keyboards/ergodox/keymaps/erez_experimental/Makefile b/keyboards/ergodox/keymaps/erez_experimental/Makefile
index b673c5ce52c..dbe89d1410c 100644
--- a/keyboards/ergodox/keymaps/erez_experimental/Makefile
+++ b/keyboards/ergodox/keymaps/erez_experimental/Makefile
@@ -3,6 +3,8 @@
 
 SLEEP_LED_ENABLE = no  # Breathing sleep LED during USB suspend
 COMMAND_ENABLE   = no  # Commands for debug and configuration
+RGBLIGHT_ENABLE = yes
+MIDI_ENABLE = yes
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
diff --git a/keyboards/ergodox/keymaps/erez_experimental/config.h b/keyboards/ergodox/keymaps/erez_experimental/config.h
index e5d7fe1885e..fbd12ab7976 100644
--- a/keyboards/ergodox/keymaps/erez_experimental/config.h
+++ b/keyboards/ergodox/keymaps/erez_experimental/config.h
@@ -8,5 +8,16 @@
 
 #undef LEADER_TIMEOUT
 #define LEADER_TIMEOUT 300
+ 
+/* 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
diff --git a/keyboards/ergodox/keymaps/erez_experimental/keymap.c b/keyboards/ergodox/keymaps/erez_experimental/keymap.c
index 4804959d634..b867d36013b 100644
--- a/keyboards/ergodox/keymaps/erez_experimental/keymap.c
+++ b/keyboards/ergodox/keymaps/erez_experimental/keymap.c
@@ -67,9 +67,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  *                                        ,-------------.       ,-------------.
  *                                        |      |      |       |      |      |
  *                                 ,------|------|------|       |------+------+------.
- *                                 |      |      |      |       |      |      |      |
+ *                                 |VAI   |VAD   |HUI   |       |SAI   |TOG   |MOD   |
  *                                 |      |      |------|       |------|      |      |
- *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |HUD   |       |SAD   |      |      |
  *                                 `--------------------'       `--------------------'
  */
 // SYMBOLS
@@ -81,8 +81,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        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,
@@ -90,8 +90,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        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_SAI,
+       RGB_SAD, RGB_TOG, RGB_MOD
 ),
 /* Keymap 2: Media and mouse keys
  *

From 285c5a91f23e972d9c579184283443111186329d Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Thu, 17 Nov 2016 20:56:36 -0500
Subject: [PATCH 043/147] Groundwork for dedicated color keycodes

---
 .../keymaps/erez_experimental/keymap.c        | 24 ++++++++++++++++++-
 quantum/rgblight.c                            |  7 ++++++
 quantum/rgblight.h                            |  1 +
 3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/keyboards/ergodox/keymaps/erez_experimental/keymap.c b/keyboards/ergodox/keymaps/erez_experimental/keymap.c
index b867d36013b..4a23c7ac587 100644
--- a/keyboards/ergodox/keymaps/erez_experimental/keymap.c
+++ b/keyboards/ergodox/keymaps/erez_experimental/keymap.c
@@ -7,6 +7,12 @@
 #define SYMB 1 // symbols
 #define MDIA 2 // media keys
 
+enum custom_keycodes {
+  PLACEHOLDER = SAFE_RANGE, // can always be here
+  RGB_FF00BB // always start with RGB_
+};
+
+
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 0: Basic layer
  *
@@ -75,7 +81,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 // 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,
@@ -152,6 +158,22 @@ 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) {
+        rgblight_enable();
+        rgblight_mode(1);
+        rgblight_setrgb(0xff,0x00,0xbb);
+      }
+      return false;
+      break;
+  }
+  return true;
+}
+
 LEADER_EXTERNS();
 
 // Runs constantly in the background, in a loop.
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index 6b58f665471..00620da58ea 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -253,6 +253,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;
diff --git a/quantum/rgblight.h b/quantum/rgblight.h
index 330c2fe1ba1..a3673348e75 100644
--- a/quantum/rgblight.h
+++ b/quantum/rgblight.h
@@ -61,6 +61,7 @@ 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);

From 161bd5596b5d8199f2e56246a27ccbdb8c80bb36 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Fri, 18 Nov 2016 22:22:24 -0500
Subject: [PATCH 044/147] midi back and forth

---
 keyboards/ergodox/keymaps/jack/keymap.c |  7 ++-
 tmk_core/protocol/lufa/lufa.c           | 62 ++++++++++++++++++-------
 tmk_core/protocol/lufa/lufa.h           |  1 +
 3 files changed, 52 insertions(+), 18 deletions(-)

diff --git a/keyboards/ergodox/keymaps/jack/keymap.c b/keyboards/ergodox/keymaps/jack/keymap.c
index 8721b9644ab..eb41f121275 100644
--- a/keyboards/ergodox/keymaps/jack/keymap.c
+++ b/keyboards/ergodox/keymaps/jack/keymap.c
@@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                   MO(1), KC_LEFT,KC_DOWN,KC_UP,  KC_RGHT,  
              RGB_TOG,        RGB_HUI,
              RGB_MOD,
-             KC_PGDN, KC_SPC,KC_SPC
+             M(2), KC_SPC,KC_SPC
     ),
 [SYMB] = KEYMAP(
        // left hand
@@ -89,6 +89,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
           eeconfig_init();
         }
         break;
+        case 2:
+        if (record->event.pressed) { // For resetting EEPROM
+          send_unicode_midi(0x0CA0);
+        }
+        break;
       }
     return MACRO_NONE;
 };
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 7eb9be601e3..ae9cc2f962f 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -1161,7 +1161,7 @@ void sysex_callback(MidiDevice * device,
             // send_byte(*data);
             midi_buffer[start + place] = *data;
             if (*data == 0xF7)
-                sysex_buffer_callback(start + place, &midi_buffer);
+                sysex_buffer_callback(device, start + place, &midi_buffer);
             // SEND_STRING(" ");
             data++;
         }
@@ -1169,7 +1169,24 @@ void sysex_callback(MidiDevice * device,
 
 }
 
-void sysex_buffer_callback(uint8_t length, uint8_t * data) {
+uint32_t decode_4byte_chunk(uint8_t * data) {
+    uint32_t part1 = *data++;
+    uint32_t part2 = *data++;
+    uint32_t part3 = *data++;
+    uint32_t part4 = *data++;
+    uint32_t part5 = *data++;
+    return ((part1 & 0x1FUL) << 28) | (part2 << 21) | (part3 << 14) | (part4 << 7) | part5;
+}
+
+void encode_4byte_chunk(uint32_t data, uint8_t * pointer) {
+    *pointer++ = (data >> 28) & 0x7F;
+    *pointer++ = (data >> 21) & 0x7F;
+    *pointer++ = (data >> 14) & 0x7F;
+    *pointer++ = (data >> 7) & 0x7F;
+    *pointer++ = (data) & 0x7F;
+}
+
+void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data) {
     uint8_t * pointer_copy = data;
 
     if (*data++ != 0xF0)
@@ -1180,28 +1197,31 @@ void sysex_buffer_callback(uint8_t length, uint8_t * data) {
     data++;
 
     switch (*data++) {
+        case 0x13: ; // Get info from keyboard
+            switch (*data++) {
+                case 0x00: ; // Get layer state
+                    // send_dword(layer_state);
+                    uint8_t chunk[5];
+                    encode_4byte_chunk(layer_state | default_layer_state, &chunk);
+
+                    uint8_t array[] = {0xF0, 0x00, 0x00, 0x00, 0x00, chunk[0], chunk[1], chunk[2], chunk[3], chunk[4], 0xF7};
+                    midi_send_array(&midi_device, 11, &array);
+                    // midi_send_data(device, 3, 0x00, layer_state >> 24 & 0x7f, layer_state >> 16 & 0x7f);
+                    // midi_send_data(device, 6, layer_state >> 8 & 0x7f, layer_state & 0x7f, 0xF7);
+                    break;
+            }
+        #ifdef RGBLIGHT_ENABLE
         case 0x27: ; // RGB LED functions
-            switch (*data++)
+            switch (*data++) {
                 case 0x00: ; // Update HSV
-                    uint32_t part1 = *data++;
-                    uint32_t part2 = *data++;
-                    uint32_t part3 = *data++;
-                    uint32_t part4 = *data++;
-                    uint32_t part5 = *data++;
-                    uint32_t chunk = ((part1 & 0x1FUL) << 28) | (part2 << 21) | (part3 << 14) | (part4 << 7) | part5;
-                    // SEND_STRING("\nCHUNK: ");
-                    // send_dword(chunk);
+                    uint32_t chunk = decode_4byte_chunk(data);
                     rgblight_sethsv(((chunk >> 16) & 0xFFFF) % 360, (chunk >> 8) & 0xFF, chunk & 0xFF);
-                    // SEND_STRING("\nHUE: ");
-                    // send_word(((chunk >> 16) & 0xFFFF) % 360);
-                    // SEND_STRING("\nSAT: ");
-                    // send_word((chunk >> 8) & 0xFF);
-                    // SEND_STRING("\nVAL: ");
-                    // send_word(chunk & 0xFF);
                     break;
                 case 0x01: ; // Update RGB
                     break;
+            }
             break;
+        #endif
     }
 
     // SEND_STRING("\nDATA:\n");
@@ -1212,4 +1232,12 @@ void sysex_buffer_callback(uint8_t length, uint8_t * data) {
 
 }
 
+void send_unicode_midi(uint32_t unicode) {
+    uint8_t chunk[5];
+    encode_4byte_chunk(unicode, &chunk);
+
+    uint8_t array[] = {0xF0, 0x00, 0x00, 0x00, 0x05, chunk[0], chunk[1], chunk[2], chunk[3], chunk[4], 0xF7};
+    midi_send_array(&midi_device, 11, &array);
+}
+
 #endif
diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h
index aad08d6407c..3fec797b6cf 100644
--- a/tmk_core/protocol/lufa/lufa.h
+++ b/tmk_core/protocol/lufa/lufa.h
@@ -70,6 +70,7 @@ typedef struct {
 #ifdef MIDI_ENABLE
 void MIDI_Task(void);
 MidiDevice midi_device;
+void send_unicode_midi(uint32_t unicode);
 #endif
 
 // #if LUFA_VERSION_INTEGER < 0x120730

From a06115df19a74d39b08758472b221e630c3680d3 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Fri, 18 Nov 2016 23:20:07 -0500
Subject: [PATCH 045/147] don't always detect a matrix change (fixes debounce)

---
 quantum/matrix.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/quantum/matrix.c b/quantum/matrix.c
index 3c488b417d6..07eb87bc362 100644
--- a/quantum/matrix.c
+++ b/quantum/matrix.c
@@ -310,7 +310,7 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
     // Unselect row
     unselect_row(current_row);
 
-    return (last_row_value == current_matrix[current_row]);
+    return (last_row_value != current_matrix[current_row]);
 }
 
 static void select_row(uint8_t row)

From 01736a502e8f2900bde229a086a4ab03513f6781 Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@gmail.com>
Date: Fri, 18 Nov 2016 23:40:34 -0500
Subject: [PATCH 046/147] just saving

---
 keyboards/maxipad/Makefile                  |   2 +-
 keyboards/maxipad/config.h                  | 113 ++++----------------
 keyboards/maxipad/keymaps/default/Makefile  |  21 ----
 keyboards/maxipad/keymaps/default/config.h  |   8 --
 keyboards/maxipad/keymaps/default/keymap.c  |  40 ++-----
 keyboards/maxipad/keymaps/default/readme.md |   1 -
 keyboards/maxipad/maxipad.c                 |  29 +----
 keyboards/maxipad/maxipad.h                 |  12 +--
 keyboards/maxipad/readme.md                 |  31 ++----
 keyboards/maxipad/rules.mk                  |  29 ++---
 10 files changed, 54 insertions(+), 232 deletions(-)
 delete mode 100644 keyboards/maxipad/keymaps/default/Makefile
 delete mode 100644 keyboards/maxipad/keymaps/default/config.h
 delete mode 100644 keyboards/maxipad/keymaps/default/readme.md

diff --git a/keyboards/maxipad/Makefile b/keyboards/maxipad/Makefile
index 57b2ef62e5f..4e2a6f00fd8 100644
--- a/keyboards/maxipad/Makefile
+++ b/keyboards/maxipad/Makefile
@@ -1,3 +1,3 @@
 ifndef MAKEFILE_INCLUDED
 	include ../../Makefile
-endif
+endif
\ No newline at end of file
diff --git a/keyboards/maxipad/config.h b/keyboards/maxipad/config.h
index fbe64a5b0b5..a056e4963bc 100644
--- a/keyboards/maxipad/config.h
+++ b/keyboards/maxipad/config.h
@@ -24,124 +24,49 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define VENDOR_ID       0xFEED
 #define PRODUCT_ID      0x6060
 #define DEVICE_VER      0x0001
-#define MANUFACTURER    Wootpatoot
+#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)
- *
-*/
-#define MATRIX_ROW_PINS { B6, F7, B2, B3, B1 }
-#define MATRIX_COL_PINS { F6, C6, D7, F5, B4, B5 }
-#define UNUSED_PINS
+// Planck PCB default pin-out
+// Change this to how you wired your keyboard
+// COLS: Left to right, ROWS: Top to bottom
+#ifdef USE_PRO_MICRO
+	#define MATRIX_ROW_PINS { B6, B2, B3, B1, F7 }
+	#define MATRIX_COL_PINS { F4, C6, D7, F5, B4, B5 }
+	#define UNUSED_PINS
+ #else
+ 	#define MATRIX_ROW_PINS { B6, F7, B2, B3, B1 }
+	#define MATRIX_COL_PINS { F6, C6, D7, F5, B4, B5 }
+	#define UNUSED_PINS
+ #endif
 
 /* 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 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
 
-/*
- * 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 */
+/* key combination for 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.
diff --git a/keyboards/maxipad/keymaps/default/Makefile b/keyboards/maxipad/keymaps/default/Makefile
deleted file mode 100644
index f4671a9d113..00000000000
--- a/keyboards/maxipad/keymaps/default/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# 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
deleted file mode 100644
index df06a262062..00000000000
--- a/keyboards/maxipad/keymaps/default/config.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#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
index 43ace324197..227cef7d863 100644
--- a/keyboards/maxipad/keymaps/default/keymap.c
+++ b/keyboards/maxipad/keymaps/default/keymap.c
@@ -1,5 +1,5 @@
 #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, \
@@ -13,42 +13,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   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 \
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_SPC   \
 ),
 };
-
+ 
 const uint16_t PROGMEM fn_actions[] = {
-
 };
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+ 
+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) {
-            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
+};
\ No newline at end of file
diff --git a/keyboards/maxipad/keymaps/default/readme.md b/keyboards/maxipad/keymaps/default/readme.md
deleted file mode 100644
index a6c0d4a3f04..00000000000
--- a/keyboards/maxipad/keymaps/default/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-# The default keymap for maxipad
\ No newline at end of file
diff --git a/keyboards/maxipad/maxipad.c b/keyboards/maxipad/maxipad.c
index 879ae86a769..a193b112b91 100644
--- a/keyboards/maxipad/maxipad.c
+++ b/keyboards/maxipad/maxipad.c
@@ -1,28 +1 @@
-#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);
-}
+#include "maxipad.h"
\ No newline at end of file
diff --git a/keyboards/maxipad/maxipad.h b/keyboards/maxipad/maxipad.h
index eee1309ddcb..4d8c6428d28 100644
--- a/keyboards/maxipad/maxipad.h
+++ b/keyboards/maxipad/maxipad.h
@@ -8,18 +8,18 @@
 // 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 \
 ) \
 { \
     { 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} \
+    { k40, k41, k42, k43, k44, k45 } \
 }
 
 #endif
diff --git a/keyboards/maxipad/readme.md b/keyboards/maxipad/readme.md
index 1971ce1f368..4e1702c5ad4 100644
--- a/keyboards/maxipad/readme.md
+++ b/keyboards/maxipad/readme.md
@@ -1,46 +1,27 @@
-maxipad keyboard firmware
+Maxipad keyboard firmware
 ======================
 
 ## Quantum MK Firmware
 
-<<<<<<< HEAD
-For the full Quantum feature list, see [the parent readme](/).
-=======
-For the full Quantum feature list, see [the parent readme.md](/doc/readme.md).
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
+For the full Quantum feature list, see [the parent readme.md](/readme.md).
 
 ## Building
 
+If you are using a pro micro then make sure to enable USE_PRO_MICRO in the makefile
+
 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
-
-<<<<<<< HEAD
 To build with the default keymap, simply run `make default`.
-=======
-To build with the default keymap, simply run `make`.
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
 
 ### Other Keymaps
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
 
-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.
-
-<<<<<<< HEAD
 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.
-=======
-To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
-
-```
-$ make keymap=[default|jack|<name>]
-```
-
-Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`
->>>>>>> bce6e52391da7c5f620c96a91857940f0dee19df
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
\ No newline at end of file
diff --git a/keyboards/maxipad/rules.mk b/keyboards/maxipad/rules.mk
index 55898147dd3..e6e5923f163 100644
--- a/keyboards/maxipad/rules.mk
+++ b/keyboards/maxipad/rules.mk
@@ -1,3 +1,5 @@
+
+
 # MCU name
 #MCU = at90usb1287
 MCU = atmega32u4
@@ -49,19 +51,18 @@ OPT_DEFS += -DBOOTLOADER_SIZE=512
 
 
 # Build Options
-#   change yes to no to disable
+#   comment out to disable the options.
 #
-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
+BOOTMAGIC_ENABLE ?= yes	# Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes	# Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes	# Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes	# Console for debug(+400)
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= 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
+# SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
+# NKRO_ENABLE ?= yes		# USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality
+# MIDI_ENABLE ?= YES 		# MIDI controls
+# UNICODE_ENABLE ?= YES 		# Unicode
+# BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID
+USE_PRO_MICRO ?= yes
\ No newline at end of file

From e356de222023d2a8f7d5ee79030a37eaa9b1b25f Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@gmail.com>
Date: Sat, 19 Nov 2016 00:44:52 -0500
Subject: [PATCH 047/147] added the pinout for pro micro into maxipad

---
 keyboards/maxipad/config.h | 12 +++++++++---
 keyboards/maxipad/rules.mk |  1 +
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/keyboards/maxipad/config.h b/keyboards/maxipad/config.h
index fbe64a5b0b5..fc5ab776172 100644
--- a/keyboards/maxipad/config.h
+++ b/keyboards/maxipad/config.h
@@ -43,9 +43,15 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
  *
 */
-#define MATRIX_ROW_PINS { B6, F7, B2, B3, B1 }
-#define MATRIX_COL_PINS { F6, C6, D7, F5, B4, B5 }
-#define UNUSED_PINS
+//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
diff --git a/keyboards/maxipad/rules.mk b/keyboards/maxipad/rules.mk
index 55898147dd3..f9bf74179b5 100644
--- a/keyboards/maxipad/rules.mk
+++ b/keyboards/maxipad/rules.mk
@@ -65,3 +65,4 @@ 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
+USE_PRO_MICRO ?= yes
\ No newline at end of file

From 102a830bbdb302eb0951ec7910ab7c9feae272d1 Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@gmail.com>
Date: Sat, 19 Nov 2016 00:49:20 -0500
Subject: [PATCH 048/147] changed readme

---
 keyboards/maxipad/readme.md | 2 ++
 keyboards/maxipad/rules.mk  | 3 +--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/keyboards/maxipad/readme.md b/keyboards/maxipad/readme.md
index ab7b122fe88..de2265d1115 100644
--- a/keyboards/maxipad/readme.md
+++ b/keyboards/maxipad/readme.md
@@ -5,6 +5,8 @@ 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.
diff --git a/keyboards/maxipad/rules.mk b/keyboards/maxipad/rules.mk
index f9bf74179b5..56b2042efa0 100644
--- a/keyboards/maxipad/rules.mk
+++ b/keyboards/maxipad/rules.mk
@@ -64,5 +64,4 @@ BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by
 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
-USE_PRO_MICRO ?= yes
\ No newline at end of file
+AUDIO_ENABLE ?= no           # Audio output on port C6
\ No newline at end of file

From ffa5b1e7ea6697acf9ebfcade1149031642f7870 Mon Sep 17 00:00:00 2001
From: Gergely Nagy <algernon@madhouse-project.org>
Date: Sat, 19 Nov 2016 11:32:09 +0100
Subject: [PATCH 049/147] Add a timeout to space-cadet shift.

When one holds a Space Cadet shift, to have it act as a shift, so that
mouse behaviour changes, when released without any other key pressed, it
still registers a paren. To remedy this, add a hold timeout: if the key
is held longer than TAPPING_TERM, it will not register the parens.

Fixes #884, with the side-effect of not being able to have parens
trigger the OS-side repeat anymore.

Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
---
 quantum/quantum.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/quantum/quantum.c b/quantum/quantum.c
index 098312e6ef5..2addcb670ca 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -75,6 +75,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) {
 
@@ -283,6 +284,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 +294,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 +307,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 +317,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);
         }

From 7f5e71d79fb5ca70139c42b83c158738217c1c8a Mon Sep 17 00:00:00 2001
From: "samgalson@gmail.com" <samgalson@gmail.com>
Date: Sat, 19 Nov 2016 14:21:12 +0000
Subject: [PATCH 050/147] adds galson keymap

---
 keyboards/ergodox/keymaps/galson/Makefile  |   2 +
 keyboards/ergodox/keymaps/galson/keymap.c  | 183 +++++++++++++++++++++
 keyboards/ergodox/keymaps/galson/readme.md |  11 ++
 3 files changed, 196 insertions(+)
 create mode 100644 keyboards/ergodox/keymaps/galson/Makefile
 create mode 100644 keyboards/ergodox/keymaps/galson/keymap.c
 create mode 100644 keyboards/ergodox/keymaps/galson/readme.md

diff --git a/keyboards/ergodox/keymaps/galson/Makefile b/keyboards/ergodox/keymaps/galson/Makefile
new file mode 100644
index 00000000000..f008f50793e
--- /dev/null
+++ b/keyboards/ergodox/keymaps/galson/Makefile
@@ -0,0 +1,2 @@
+COMMAND_ENABLE   = no  # Commands for debug and configuration
+
diff --git a/keyboards/ergodox/keymaps/galson/keymap.c b/keyboards/ergodox/keymaps/galson/keymap.c
new file mode 100644
index 00000000000..0d3e7560ddd
--- /dev/null
+++ b/keyboards/ergodox/keymaps/galson/keymap.c
@@ -0,0 +1,183 @@
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "version.h"
+
+#define BASE 0 // default layer
+#define SYMB 1 // symbols
+#define MDIA 2 // media keys
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   +    |   1  |   2  |   3  |   4  |   5  | rclk |           | lclk |   6  |   7  |   8  |   9  |   0  |   -    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |   =    |   Q  |   W  |   E  |   R  |cmd/T |shift |           |shift |cmd/Y |   U  |   I  |   O  |   P  |   \    |
+ * |--------+------+------+------+------+------|  (   |           |  )   |------+------+------+------+------+--------|
+ * |   "    |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |; / L2|    '   |
+ * |--------+------+------+------+------+------| ctrl |           | ctrl |------+------+------+------+------+--------|
+ * |   {    |   Z  |   X  |   C  |   V  |   B  |  [   |           |   ]  |   N  |   M  |   ,  |   .  |   /  |    }   |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |  _   |   `  |  $   | Left | Right|                                       |  Up  | Down |   :  |   *  |  !     |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |   <  |  |   |       |   &  |   >   |
+ *                                 ,------|------|------|       |------+--------+------.
+ *                                 |      |      |  #   |       |   @  |        |      |
+ *                                 | Space|Backsp|------|       |------|  Tab   |Enter |
+ *                                 |      |ace   |  %   |       |  ESC |        |      |
+ *                                 `--------------------'       `----------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = KEYMAP(  // layer 0 : default
+        // left hand
+        KC_PLUS,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_BTN2,
+        KC_EQL,          KC_Q,         KC_W,   KC_E,   KC_R,   GUI_T(KC_T),   KC_LSPO,
+        KC_DQUO,  KC_A,         KC_S,   KC_D,   KC_F,   KC_G,
+        KC_LCBR,  CTL_T(KC_Z),  KC_X,   KC_C,   KC_V,   KC_B,   CTL_T(KC_LBRC),
+        KC_UNDS,         KC_GRV,       KC_DLR, KC_LEFT,KC_RGHT,
+                                                               KC_LABK,  KC_PIPE,
+                                                                       KC_HASH,
+                                                       KC_SPC, KC_BSPC,KC_PERC,
+        // right hand
+        KC_BTN1,         KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
+        KC_RSPC,  GUI_T(KC_Y),   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
+                         KC_H,   KC_J,   KC_K,   KC_L,   LT(MDIA, KC_SCLN), KC_QUOT,
+        CTL_T(KC_RBRC),  KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,   KC_RCBR,
+                                 KC_UP,  KC_DOWN,KC_COLN,KC_ASTR,          KC_EXLM,
+        KC_AMPR,          KC_RABK,
+        KC_AT,
+        KC_ESC,         KC_TAB, KC_ENT
+    ),
+/* Keymap 1: Symbol Layer
+ *
+ * ,--------------------------------------------------. 
+ * |Version |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |   !  |   @  |   {  |   }  |   |  |      |           |      |   Up |   7  |   8  |   9  |   *  |   F12  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |   4  |   5  |   6  |   +  |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   \  |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |    . |   0  |   =  |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|      |      |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// SYMBOLS
+[SYMB] = KEYMAP(
+       // left hand
+       M(0),   KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
+       KC_TRNS,KC_EXLM,KC_AT,  KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
+       KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
+       KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
+       KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+                                       KC_TRNS,KC_TRNS,
+                                               KC_TRNS,
+                               KC_TRNS,KC_TRNS,KC_TRNS,
+       // right hand
+       KC_TRNS, KC_F6,   KC_F7,  KC_F8,   KC_F9,   KC_F10,  KC_F11,
+       KC_TRNS, KC_UP,   KC_7,   KC_8,    KC_9,    KC_ASTR, KC_F12,
+                KC_DOWN, KC_4,   KC_5,    KC_6,    KC_PLUS, KC_TRNS,
+       KC_TRNS, KC_AMPR, KC_1,   KC_2,    KC_3,    KC_BSLS, KC_TRNS,
+                         KC_TRNS,KC_DOT,  KC_0,    KC_EQL,  KC_TRNS,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+),
+/* Keymap 2: Media and mouse keys
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      |      | MsUp |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      |      |      |      |      |  Play  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      | Lclk | Rclk |                                       |VolUp |VolDn | Mute |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |Brwser|
+ *                                 |      |      |------|       |------|      |Back  |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// MEDIA AND MOUSE
+[MDIA] = KEYMAP(
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
+                                           KC_TRNS, KC_TRNS,
+                                                    KC_TRNS,
+                                  KC_TRNS, KC_TRNS, KC_TRNS,
+    // right hand
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
+                          KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_WBAK
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_LAYER_TAP_TOGGLE(SYMB)                // FN1 - Momentary Layer 1 (Symbols)
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+        if (record->event.pressed) {
+          SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+        }
+        break;
+      }
+    return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+    uint8_t layer = biton32(layer_state);
+
+    ergodox_board_led_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
+    switch (layer) {
+      // TODO: Make this relevant to the ErgoDox EZ.
+        case 1:
+            ergodox_right_led_1_on();
+            break;
+        case 2:
+            ergodox_right_led_2_on();
+            break;
+        default:
+            // none
+            break;
+    }
+
+};
diff --git a/keyboards/ergodox/keymaps/galson/readme.md b/keyboards/ergodox/keymaps/galson/readme.md
new file mode 100644
index 00000000000..ebc916725b3
--- /dev/null
+++ b/keyboards/ergodox/keymaps/galson/readme.md
@@ -0,0 +1,11 @@
+# Galson keymap
+
+
+Sep 26, 2016.
+
+This is an ergonomic layout for programming for those with typing-related injuries. Key features:
+
+- As many symbol keys as possible are accessible without shifting. These should be accessed by moving the entire hand and pressing with a strong finger.
+- Arrow keys and left and right mouse clicks for mouse-free navigation when combined with head mouse or eyetracker.
+- Modifier keys are dual role and relocated to positions convenient for the index finger.
+- Positions are more convenient when the keyboard is vertically mounted (as it should be!)
\ No newline at end of file

From 620e4f74d39bbcd9a41b6deed0fb990dfadbd106 Mon Sep 17 00:00:00 2001
From: Seth Chandler <sethbc@sethbc.org>
Date: Sat, 19 Nov 2016 11:37:12 -0500
Subject: [PATCH 051/147] move KC expansion to separate macros

---
 keyboards/gh60/gh60.h                        | 49 ++++++++++++++++++--
 keyboards/gh60/keymaps/default/keymap.c      | 12 ++---
 keyboards/gh60/keymaps/robotmaxtron/keymap.c | 24 +++++-----
 keyboards/gh60/keymaps/sethbc/keymap.c       |  4 +-
 4 files changed, 66 insertions(+), 23 deletions(-)

diff --git a/keyboards/gh60/gh60.h b/keyboards/gh60/gh60.h
index 899f7dc6a3c..4f206cc1617 100644
--- a/keyboards/gh60/gh60.h
+++ b/keyboards/gh60/gh60.h
@@ -34,6 +34,20 @@ inline void gh60_wasd_leds_off(void)   	{ DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
     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,           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, 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 }  \
+}
+
+#define KC_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, K2C, K2D, \
+    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 }, \
@@ -42,13 +56,28 @@ inline void gh60_wasd_leds_off(void)   	{ DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
     { 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 }  \
 }
 
-/* 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  \
+) { \
+    { 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 }  \
+}
+
+/* ANSI variant with KC expansion */
+#define KC_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  \
 ) { \
     { 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 }, \
@@ -57,12 +86,28 @@ inline void gh60_wasd_leds_off(void)   	{ DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
     { KC_##K40, KC_##K41, KC_##K42, KC_NO,    KC_NO,    KC_##K45, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_##K4A, KC_##K4B, KC_##K4C, KC_##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  \
+) { \
+    { 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 }  \
+}
+
+/* HHKB Variant with KC expansion */
+#define KC_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  \
 ) { \
     { 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 }, \
@@ -71,6 +116,4 @@ inline void gh60_wasd_leds_off(void)   	{ DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
     { 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 }  \
 }
 
-
-
 #endif
diff --git a/keyboards/gh60/keymaps/default/keymap.c b/keyboards/gh60/keymaps/default/keymap.c
index 3622be41b88..5c88b2ecf10 100644
--- a/keyboards/gh60/keymaps/default/keymap.c
+++ b/keyboards/gh60/keymaps/default/keymap.c
@@ -3,21 +3,21 @@
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     /* 0: qwerty */
-    KEYMAP(
+    KC_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),
     /* 1: fn */
-	KEYMAP(
+	KC_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),
     /* 2: arrows */
-	KEYMAP(
+	KC_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, \
@@ -49,7 +49,7 @@ void matrix_scan_user(void) {
 
 //Layer LED indicators
     uint32_t layer = layer_state;
-	
+
     if (layer & (1<<1)) {
         gh60_wasd_leds_on();
         gh60_fn_led_on();
@@ -57,7 +57,7 @@ void matrix_scan_user(void) {
         gh60_wasd_leds_off();
         gh60_fn_led_off();
     }
-	
+
     if (layer & (1<<2)) {
         gh60_poker_leds_on();
         gh60_esc_led_on();
@@ -65,5 +65,5 @@ void matrix_scan_user(void) {
         gh60_poker_leds_off();
         gh60_esc_led_off();
     }
-	
+
 };
diff --git a/keyboards/gh60/keymaps/robotmaxtron/keymap.c b/keyboards/gh60/keymaps/robotmaxtron/keymap.c
index 263eec4e53c..d53589e8118 100644
--- a/keyboards/gh60/keymaps/robotmaxtron/keymap.c
+++ b/keyboards/gh60/keymaps/robotmaxtron/keymap.c
@@ -8,7 +8,7 @@
 
 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 |
    * |-----------------------------------------------------------|
@@ -21,14 +21,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    * |Ctrl|Gui |Alt |      Space             |Alt |Fn  |Menu|Ctrl|
    * `-----------------------------------------------------------'
    */
-	[_BL] = KEYMAP(
+	[_BL] = KC_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),
-   
-   /*  
+
+   /*
    * Locking arrow keys to WASD for when you need dedicated arrow keys
    * ,-----------------------------------------------------------.
    * |    |  |   |   |   |   |   |   |   |   |   |   |   |       |
@@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    * |    |    |    |                        |    |    |    |    |
    * `-----------------------------------------------------------'
    */
-	[_AL] = KEYMAP(
+	[_AL] = KC_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, \
@@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
         TRNS,TRNS,TRNS,          TRNS,               TRNS,TRNS,TRNS,TRNS,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   |
@@ -64,16 +64,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    * |    |    |    |                          |    |    |    |    |
    * `-------------------------------------------------------------'
    */
-	[_FL] = KEYMAP(
+	[_FL] = KC_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),
-   
-   /* 
+
+   /*
    * Locking layer for controlling the underglow.
-   * 
+   *
    * ,-----------------------------------------------------------.
    * |    |  |   |   |   |   |   |   |   |   |   |   |   |       |
    * |-----------------------------------------------------------|
@@ -86,7 +86,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    * |    |    |    |                        |    |    |    |    |
    * `-----------------------------------------------------------'
    */
-	[_UL] = KEYMAP(
+	[_UL] = KC_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, \
@@ -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/keymap.c b/keyboards/gh60/keymaps/sethbc/keymap.c
index 85a46a29bdc..141c7f0b000 100644
--- a/keyboards/gh60/keymaps/sethbc/keymap.c
+++ b/keyboards/gh60/keymaps/sethbc/keymap.c
@@ -6,14 +6,14 @@
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     /* 0: qwerty */
-  KEYMAP_HHKB(
+  KC_KEYMAP_HHKB(
 	      FN0, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSLS, GRV,  \
         TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSPC, \
         LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,ENT,  \
         LSFT, Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,RSFT, FN1, \
         LCTL,LALT,LGUI,          SPC,                RGUI,RALT,APP, RCTL),
     /* 1: fn */
-	KEYMAP_HHKB(
+	KC_KEYMAP_HHKB(
         GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, TRNS, TRNS, \
         CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,UP,TRNS,TRNS, \
         TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RIGHT,PENT, \

From 74a1f00713d1407fb1d2e20d58da93919ab0c221 Mon Sep 17 00:00:00 2001
From: Gergely Nagy <algernon@madhouse-project.org>
Date: Sat, 19 Nov 2016 18:19:18 +0100
Subject: [PATCH 052/147] Fix the Space Cadet timeout code

Define a default TAPPING_TERM in quantum.c, for keyboards that do not
have it set. Fixes the CI failure.

Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
---
 quantum/quantum.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/quantum/quantum.c b/quantum/quantum.c
index 2addcb670ca..b5e2d60b9d5 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -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:

From df8724ce08e09b6b077b601da7976639140655d7 Mon Sep 17 00:00:00 2001
From: Seth Chandler <sethbc@sethbc.org>
Date: Sat, 19 Nov 2016 12:19:21 -0500
Subject: [PATCH 053/147] remove KC expansion from GH60

---
 keyboards/gh60/gh60.h                        | 44 -----------------
 keyboards/gh60/keymaps/default/keymap.c      | 36 +++++++-------
 keyboards/gh60/keymaps/robotmaxtron/keymap.c | 50 ++++++++++----------
 keyboards/gh60/keymaps/sethbc/keymap.c       | 24 +++++-----
 4 files changed, 55 insertions(+), 99 deletions(-)

diff --git a/keyboards/gh60/gh60.h b/keyboards/gh60/gh60.h
index 4f206cc1617..66bc2790d28 100644
--- a/keyboards/gh60/gh60.h
+++ b/keyboards/gh60/gh60.h
@@ -42,20 +42,6 @@ inline void gh60_wasd_leds_off(void)   	{ DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
     { K40, K41, K42, KC_NO,    KC_NO,    K45, KC_NO,    KC_NO,    KC_NO,    K49, K4A, K4B, K4C, K4D }  \
 }
 
-#define KC_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, K2C, K2D, \
-    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 }  \
-}
-
 /* ANSI variant. No extra keys for ISO */
 #define KEYMAP_ANSI( \
     K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
@@ -71,21 +57,6 @@ inline void gh60_wasd_leds_off(void)   	{ DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
     { K40, K41, K42, KC_NO,    KC_NO,    K45, KC_NO,    KC_NO,    KC_NO,    KC_NO,    K4A, K4B, K4C, K4D }  \
 }
 
-/* ANSI variant with KC expansion */
-#define KC_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  \
-) { \
-    { 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_NO,    KC_##K2D }, \
-    { KC_##K30, KC_NO,    KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_NO,    KC_##K3D }, \
-    { KC_##K40, KC_##K41, KC_##K42, KC_NO,    KC_NO,    KC_##K45, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D }  \
-}
-
 /* HHKB Variant */
 #define KEYMAP_HHKB( \
     K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\
@@ -101,19 +72,4 @@ inline void gh60_wasd_leds_off(void)   	{ DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
     { K40, K41, K42, KC_NO,    KC_NO,    K45, KC_NO,    KC_NO,    KC_NO,    K49, K4A, K4B, K4C, K4D }  \
 }
 
-/* HHKB Variant with KC expansion */
-#define KC_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  \
-) { \
-    { 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_NO,    KC_##K2D }, \
-    { KC_##K30, KC_NO,    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 }  \
-}
-
 #endif
diff --git a/keyboards/gh60/keymaps/default/keymap.c b/keyboards/gh60/keymaps/default/keymap.c
index 5c88b2ecf10..92f5459840c 100644
--- a/keyboards/gh60/keymaps/default/keymap.c
+++ b/keyboards/gh60/keymaps/default/keymap.c
@@ -3,26 +3,26 @@
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     /* 0: qwerty */
-    KC_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),
+    KEYMAP(
+	      KC_ESC,KC_1,KC_2,KC_3,KC_4,KC_5,KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINS,KC_EQL,KC_GRV,\
+        KC_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 */
-	KC_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),
+	KEYMAP(
+        KC_ESC,KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_F11,KC_F12,KC_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 */
-	KC_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),
+	KEYMAP(
+        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,\
+        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,\
+        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,\
+        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_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[] = {
diff --git a/keyboards/gh60/keymaps/robotmaxtron/keymap.c b/keyboards/gh60/keymaps/robotmaxtron/keymap.c
index d53589e8118..9acac7cecfd 100644
--- a/keyboards/gh60/keymaps/robotmaxtron/keymap.c
+++ b/keyboards/gh60/keymaps/robotmaxtron/keymap.c
@@ -10,7 +10,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /*
    *  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|  [|  ]|    \|
    * |-----------------------------------------------------------|
@@ -21,12 +21,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    * |Ctrl|Gui |Alt |      Space             |Alt |Fn  |Menu|Ctrl|
    * `-----------------------------------------------------------'
    */
-	[_BL] = KC_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),
+	[_BL] = KEYMAP(
+        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
@@ -42,12 +42,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    * |    |    |    |                        |    |    |    |    |
    * `-----------------------------------------------------------'
    */
-	[_AL] = KC_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),
+	[_AL] = KEYMAP(
+        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
+        KC_TRNS,KC_TRNS,KC_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),
 
 
    /*
@@ -64,12 +64,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    * |    |    |    |                          |    |    |    |    |
    * `-------------------------------------------------------------'
    */
-	[_FL] = KC_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),
+	[_FL] = KEYMAP(
+        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.
@@ -86,12 +86,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    * |    |    |    |                        |    |    |    |    |
    * `-----------------------------------------------------------'
    */
-	[_UL] = KC_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),
+	[_UL] = KEYMAP(
+        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
+        KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
+        KC_TRNS,F(4),F(5),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \
+        KC_TRNS,KC_TRNS,KC_TRNS,F(6),F(7),F(8),F(9),F(10),F(11),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,   \
+        KC_TRNS,KC_TRNS,KC_TRNS,          KC_TRNS,               KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS),
 };
 
 enum function_id {
diff --git a/keyboards/gh60/keymaps/sethbc/keymap.c b/keyboards/gh60/keymaps/sethbc/keymap.c
index 141c7f0b000..599e664e23a 100644
--- a/keyboards/gh60/keymaps/sethbc/keymap.c
+++ b/keyboards/gh60/keymaps/sethbc/keymap.c
@@ -6,19 +6,19 @@
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     /* 0: qwerty */
-  KC_KEYMAP_HHKB(
-	      FN0, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSLS, GRV,  \
-        TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSPC, \
-        LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,ENT,  \
-        LSFT, Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,RSFT, FN1, \
-        LCTL,LALT,LGUI,          SPC,                RGUI,RALT,APP, RCTL),
+  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 */
-	KC_KEYMAP_HHKB(
-        GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, TRNS, TRNS, \
-        CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,UP,TRNS,TRNS, \
-        TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RIGHT,PENT, \
-        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END,PGDN,DOWN,TRNS,TRNS, \
-        TRNS,TRNS,TRNS,          TRNS,               TRNS,TRNS,TRNS,TRNS),
+	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 {

From c86bbf474e7709749dfd5e09fa5defd5e6baaaa3 Mon Sep 17 00:00:00 2001
From: Fred Sundvik <fsundvik@gmail.com>
Date: Sun, 20 Nov 2016 19:28:10 +0200
Subject: [PATCH 054/147] Always initialze the Infinity Ergodox backlight

Otherwise it will stay lit. The set_led functionality is also disabled
since it doesn't work properly for slaves.
---
 keyboards/ergodox/infinity/infinity.c |  6 ++++--
 keyboards/ergodox/infinity/led.c      | 25 +------------------------
 2 files changed, 5 insertions(+), 26 deletions(-)

diff --git a/keyboards/ergodox/infinity/infinity.c b/keyboards/ergodox/infinity/infinity.c
index c5793385fe7..02db67eaf26 100644
--- a/keyboards/ergodox/infinity/infinity.c
+++ b/keyboards/ergodox/infinity/infinity.c
@@ -38,7 +38,6 @@ void init_serial_link_hal(void) {
 // Using a higher pre-scalar without flicker is possible but FTM0_MOD will need to be reduced
 // Which will reduce the brightness range
 #define PRESCALAR_DEFINE 0
-#ifdef VISUALIZER_ENABLE
 void lcd_backlight_hal_init(void) {
 	// Setup Backlight
     SIM->SCGC6 |= SIM_SCGC6_FTM0;
@@ -76,7 +75,6 @@ void lcd_backlight_hal_color(uint16_t r, uint16_t g, uint16_t b) {
 	CHANNEL_GREEN.CnV = g;
 	CHANNEL_BLUE.CnV = b;
 }
-#endif
 
 __attribute__ ((weak))
 void matrix_init_user(void) {
@@ -92,6 +90,10 @@ void matrix_init_kb(void) {
 	// runs once when the firmware starts up
 
 	matrix_init_user();
+	// The backlight always has to be initialized, otherwise it will stay lit
+#ifndef VISUALIZER_ENABLE
+	lcd_backlight_hal_init();
+#endif
 }
 
 void matrix_scan_kb(void) {
diff --git a/keyboards/ergodox/infinity/led.c b/keyboards/ergodox/infinity/led.c
index 77195bb358e..8175c1c5c5a 100644
--- a/keyboards/ergodox/infinity/led.c
+++ b/keyboards/ergodox/infinity/led.c
@@ -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
 }

From a8b1c47f0f6e63dc1260159b7b8b2172a3b57ff4 Mon Sep 17 00:00:00 2001
From: Sihui Huang <sihuih@gmail.com>
Date: Sun, 20 Nov 2016 11:10:26 -0800
Subject: [PATCH 055/147] add sh-hhkb-jp layers

---
 keyboards/hhkb/keymaps/sh_jp/Makefile  |  1 +
 keyboards/hhkb/keymaps/sh_jp/README.md | 84 ++++++++++++++++++++++++++
 keyboards/hhkb/keymaps/sh_jp/keymap.c  | 60 ++++++++++++++++++
 3 files changed, 145 insertions(+)
 create mode 100644 keyboards/hhkb/keymaps/sh_jp/Makefile
 create mode 100644 keyboards/hhkb/keymaps/sh_jp/README.md
 create mode 100644 keyboards/hhkb/keymaps/sh_jp/keymap.c

diff --git a/keyboards/hhkb/keymaps/sh_jp/Makefile b/keyboards/hhkb/keymaps/sh_jp/Makefile
new file mode 100644
index 00000000000..a7f700f019c
--- /dev/null
+++ b/keyboards/hhkb/keymaps/sh_jp/Makefile
@@ -0,0 +1 @@
+OPT_DEFS += -DHHKB_JP
diff --git a/keyboards/hhkb/keymaps/sh_jp/README.md b/keyboards/hhkb/keymaps/sh_jp/README.md
new file mode 100644
index 00000000000..7be38a415f4
--- /dev/null
+++ b/keyboards/hhkb/keymaps/sh_jp/README.md
@@ -0,0 +1,84 @@
+Keymaps for 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 QWER:
+,-----------------------------------------------------------.
+|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
index 00000000000..16181acd3e7
--- /dev/null
+++ b/keyboards/hhkb/keymaps/sh_jp/keymap.c
@@ -0,0 +1,60 @@
+#include "hhkb.h"
+
+#define _______ KC_TRNS
+
+enum {
+  DVOR,
+  QWER,
+  NEW_CMD,
+  SYMB,
+  FUNC
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [DVOR] = KEYMAP_JP(
+    KC_ESC,   KC_1,    KC_2,    KC_3,    KC_4,     KC_5,    KC_6,    KC_7,     KC_8,    KC_9,    KC_0, KC_LBRC,  KC_RBRC, KC_JYEN,  KC_BSPC,
+    KC_TAB,   KC_QUOT, KC_COMM, KC_DOT,  KC_P,     KC_Y,    KC_F,    KC_G,     KC_C,    KC_R,   KC_L, KC_SLSH, KC_EQL,
+    KC_LCTL,  KC_A,    KC_O,    KC_E,    KC_U,     KC_I,    KC_D,    KC_H,     KC_T,    KC_N,   KC_S, KC_MINS, KC_BSLS, KC_ENT,
+    KC_LSFT,  KC_SCLN, KC_Q,    KC_J,    KC_K,     KC_X,    KC_B,    KC_M,     KC_W,    KC_V,   KC_Z,   KC_RO,  KC_UP, KC_RSFT,
+    MO(FUNC), KC_ZKHK, KC_LALT, MO(NEW_CMD),   MO(SYMB),    MT(MOD_LSFT, KC_SPC),    MO(SYMB),  KC_TAB, KC_RGUI,   TG(QWER), KC_LEFT, KC_DOWN, KC_RGHT
+  ),
+  [QWER] = KEYMAP_JP(
+    KC_ESC,   KC_1,    KC_2,    KC_3,    KC_4,     KC_5,    KC_6,    KC_7,     KC_8,    KC_9,    KC_0, KC_MINS,  KC_EQL, KC_JYEN,  KC_BSPC,
+    KC_TAB,   KC_Q,    KC_W,    KC_E,    KC_R,     KC_T,    KC_Y,    KC_U,     KC_I,    KC_O,    KC_P, KC_LBRC, KC_RBRC,
+    KC_LCTL,  KC_A,    KC_S,    KC_D,    KC_F,     KC_G,    KC_H,    KC_J,     KC_K,    KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT,
+    KC_LSFT,  KC_Z,    KC_X,    KC_C,    KC_V,     KC_B,    KC_N,    KC_M,  KC_COMM,  KC_DOT, KC_SLSH,                      KC_RO, KC_UP, KC_RSFT,
+    MO(FUNC), KC_ZKHK, KC_LALT, MO(NEW_CMD),    MO(SYMB),    MT(MOD_LSFT, KC_SPC),    MO(SYMB),  KC_TAB, KC_RGUI,   _______, KC_LEFT, KC_DOWN, KC_RGHT
+  ),
+
+  [NEW_CMD] = KEYMAP_JP(
+    _______, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4),  LGUI(KC_5), LGUI(KC_6), LGUI(KC_7),  LGUI(KC_8), LGUI(KC_9), LGUI(KC_0), _______, _______, _______, _______,
+    _______,  LGUI(KC_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_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[] = {
+
+};

From 11f17e3b233dbbf7c39e5e0042cc5fdff3acba55 Mon Sep 17 00:00:00 2001
From: Sihui Huang <sihuih@gmail.com>
Date: Sun, 20 Nov 2016 11:12:48 -0800
Subject: [PATCH 056/147] Update README.md

---
 keyboards/hhkb/keymaps/sh_jp/README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/keyboards/hhkb/keymaps/sh_jp/README.md b/keyboards/hhkb/keymaps/sh_jp/README.md
index 7be38a415f4..6c6ab1bc656 100644
--- a/keyboards/hhkb/keymaps/sh_jp/README.md
+++ b/keyboards/hhkb/keymaps/sh_jp/README.md
@@ -1,4 +1,5 @@
-Keymaps for both Dvorak layout and QWER layout for HHKB JP.  
+###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>

From 34aa59c6d514cb30ca3582200cadd1da4786c50c Mon Sep 17 00:00:00 2001
From: Sihui Huang <sihuih@gmail.com>
Date: Sun, 20 Nov 2016 11:13:57 -0800
Subject: [PATCH 057/147] Update README.md

---
 keyboards/hhkb/keymaps/sh_jp/README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/keyboards/hhkb/keymaps/sh_jp/README.md b/keyboards/hhkb/keymaps/sh_jp/README.md
index 6c6ab1bc656..65e781cf302 100644
--- a/keyboards/hhkb/keymaps/sh_jp/README.md
+++ b/keyboards/hhkb/keymaps/sh_jp/README.md
@@ -4,7 +4,8 @@
 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 `!`.
+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.
 

From 23f63ed1b9487271f8156ecf191ab7d82d595e81 Mon Sep 17 00:00:00 2001
From: Sihui Huang <sihuih@gmail.com>
Date: Sun, 20 Nov 2016 11:18:08 -0800
Subject: [PATCH 058/147] Update README.md

---
 keyboards/hhkb/keymaps/sh_jp/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/keyboards/hhkb/keymaps/sh_jp/README.md b/keyboards/hhkb/keymaps/sh_jp/README.md
index 65e781cf302..37fa43e66f4 100644
--- a/keyboards/hhkb/keymaps/sh_jp/README.md
+++ b/keyboards/hhkb/keymaps/sh_jp/README.md
@@ -10,7 +10,7 @@
 6. There's an extra `Tab` in the last line.
 
 ```
-Layer QWER:
+Layer DVOR:
 ,-----------------------------------------------------------.
 |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|   |Bsp|
 |-----------------------------------------------------------|

From 6f24344be78985be5eb2f6e75f1dee546f539646 Mon Sep 17 00:00:00 2001
From: Didier Chagniot <didierchagniot@googlemail.com>
Date: Sun, 20 Nov 2016 20:51:05 +0100
Subject: [PATCH 059/147] typo fix

---
 .../ergodox/keymaps/dvorak_emacs/keymap.c     |  2 +-
 .../ergodox/keymaps/dvorak_emacs/readme.md    | 36 +++++++++----------
 2 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c b/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c
index 4cb11a56f4f..d33c6e5271e 100755
--- a/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c
+++ b/keyboards/ergodox/keymaps/dvorak_emacs/keymap.c
@@ -34,7 +34,7 @@ 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  | / / ?  |
diff --git a/keyboards/ergodox/keymaps/dvorak_emacs/readme.md b/keyboards/ergodox/keymaps/dvorak_emacs/readme.md
index 0578f1e2570..a3fc34afebf 100644
--- a/keyboards/ergodox/keymaps/dvorak_emacs/readme.md
+++ b/keyboards/ergodox/keymaps/dvorak_emacs/readme.md
@@ -1,6 +1,6 @@
 # Ergodox Dvorak Layout with emacs binding in mind
  * Control & Alt key on the thumbs (activated if pressed with another key).
- * In the same way, "I" and "R" are the shift modifier 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.
 
@@ -15,23 +15,23 @@ Keys with double values (like U/LSft) correspond to the 'tapped' key and the 'he
 <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 |
-                                 `--------------------'       `----------------------'
+|        |   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>
 

From ccc34851f2e12d990a6d51742fc7e85e8011a94d Mon Sep 17 00:00:00 2001
From: Sihui Huang <sihuih@gmail.com>
Date: Sun, 20 Nov 2016 13:31:41 -0800
Subject: [PATCH 060/147] add space to NewCmd layer

---
 keyboards/hhkb/keymaps/sh_jp/README.md | 2 +-
 keyboards/hhkb/keymaps/sh_jp/keymap.c  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/keyboards/hhkb/keymaps/sh_jp/README.md b/keyboards/hhkb/keymaps/sh_jp/README.md
index 65e781cf302..84557a5c07a 100644
--- a/keyboards/hhkb/keymaps/sh_jp/README.md
+++ b/keyboards/hhkb/keymaps/sh_jp/README.md
@@ -8,7 +8,7 @@
   - 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 QWER:
 ,-----------------------------------------------------------.
diff --git a/keyboards/hhkb/keymaps/sh_jp/keymap.c b/keyboards/hhkb/keymaps/sh_jp/keymap.c
index 16181acd3e7..c2bdd37bc29 100644
--- a/keyboards/hhkb/keymaps/sh_jp/keymap.c
+++ b/keyboards/hhkb/keymaps/sh_jp/keymap.c
@@ -31,7 +31,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     _______,  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_LEFT), LGUI(KC_DOWN), LGUI(KC_RGHT)
+    _______, _______, _______, _______, _______,     LGUI(KC_SPC), _______, _______, _______, _______, LGUI(KC_LEFT), LGUI(KC_DOWN), LGUI(KC_RGHT)
   ),
 
   [SYMB] = KEYMAP_JP(

From b75538c0bfca03f7b493b7b7dbaf9dc5e7631e53 Mon Sep 17 00:00:00 2001
From: Sihui Huang <sihuih@gmail.com>
Date: Sun, 20 Nov 2016 14:45:51 -0800
Subject: [PATCH 061/147] add del to new cmd

---
 keyboards/hhkb/keymaps/sh_jp/keymap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/keyboards/hhkb/keymaps/sh_jp/keymap.c b/keyboards/hhkb/keymaps/sh_jp/keymap.c
index c2bdd37bc29..d4cb3b04188 100644
--- a/keyboards/hhkb/keymaps/sh_jp/keymap.c
+++ b/keyboards/hhkb/keymaps/sh_jp/keymap.c
@@ -27,7 +27,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   ),
 
   [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_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),  _______, _______, _______,

From b57cf3c0c851f2fb0e32c955b16fc6f0ad236e54 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Mon, 21 Nov 2016 12:54:06 -0500
Subject: [PATCH 062/147] more structure to the package

---
 tmk_core/protocol/lufa/lufa.c | 109 +++++++++++++++++++++++++++-------
 tmk_core/protocol/lufa/lufa.h |  15 ++++-
 2 files changed, 101 insertions(+), 23 deletions(-)

diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index ae9cc2f962f..cc00b3b89b9 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -1147,10 +1147,9 @@ void send_nibble(uint8_t number) {
     }
 }
 
-uint8_t midi_buffer[16] = {0};
+uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0};
 
-void sysex_callback(MidiDevice * device,
-    uint16_t start, uint8_t length, uint8_t * data) {
+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));
     // if (start == 0x27) {
@@ -1169,7 +1168,7 @@ void sysex_callback(MidiDevice * device,
 
 }
 
-uint32_t decode_4byte_chunk(uint8_t * data) {
+uint32_t decode_uint32_chunk(uint8_t * data) {
     uint32_t part1 = *data++;
     uint32_t part2 = *data++;
     uint32_t part3 = *data++;
@@ -1178,7 +1177,13 @@ uint32_t decode_4byte_chunk(uint8_t * data) {
     return ((part1 & 0x1FUL) << 28) | (part2 << 21) | (part3 << 14) | (part4 << 7) | part5;
 }
 
-void encode_4byte_chunk(uint32_t data, uint8_t * pointer) {
+uint32_t decode_uint8_chunk(uint8_t * data) {
+    uint32_t part4 = *data++;
+    uint32_t part5 = *data++;
+    return (part4 << 7) | part5;
+}
+
+void encode_uint32_chunk(uint32_t data, uint8_t * pointer) {
     *pointer++ = (data >> 28) & 0x7F;
     *pointer++ = (data >> 21) & 0x7F;
     *pointer++ = (data >> 14) & 0x7F;
@@ -1186,6 +1191,11 @@ void encode_4byte_chunk(uint32_t data, uint8_t * pointer) {
     *pointer++ = (data) & 0x7F;
 }
 
+void encode_uint8_chunk(uint8_t data, uint8_t * pointer) {
+    *pointer++ = (data >> 7) & 0x7F;
+    *pointer++ = (data) & 0x7F;
+}
+
 void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data) {
     uint8_t * pointer_copy = data;
 
@@ -1197,28 +1207,77 @@ void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data)
     data++;
 
     switch (*data++) {
-        case 0x13: ; // Get info from keyboard
+        case 0x12: ; // Set info on keyboard
             switch (*data++) {
-                case 0x00: ; // Get layer state
-                    // send_dword(layer_state);
-                    uint8_t chunk[5];
-                    encode_4byte_chunk(layer_state | default_layer_state, &chunk);
-
-                    uint8_t array[] = {0xF0, 0x00, 0x00, 0x00, 0x00, chunk[0], chunk[1], chunk[2], chunk[3], chunk[4], 0xF7};
-                    midi_send_array(&midi_device, 11, &array);
-                    // midi_send_data(device, 3, 0x00, layer_state >> 24 & 0x7f, layer_state >> 16 & 0x7f);
-                    // midi_send_data(device, 6, layer_state >> 8 & 0x7f, layer_state & 0x7f, 0xF7);
+                case 0x02: ; // set default layer
+                    uint8_t default_layer = decode_uint8_chunk(data);
+                    eeconfig_update_default_layer(default_layer);
+                    default_layer_set((uint32_t)default_layer);
+                    break;
+                case 0x08: ; // set keymap options
+                    uint8_t keymap_options = decode_uint8_chunk(data);
+                    eeconfig_update_keymap(keymap_options);
                     break;
             }
+            break;
+        case 0x13: ; // Get info from keyboard
+            switch (*data++) {
+                case 0x00: ; // Handshake
+                    send_bytes_sysex(0x00, NULL, 0);
+                    break;
+                case 0x01: ; // Get debug state
+                    uint8_t debug[2];
+                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_DEBUG), &debug);
+                    send_bytes_sysex(0x01, &debug, 2);
+                    break;
+                case 0x02: ; // Get default layer
+                    uint8_t default_layer[2];
+                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_DEFAULT_LAYER), &default_layer);
+                    send_bytes_sysex(0x02, &default_layer, 2);
+                    break;
+                #ifdef AUDIO_ENABLE
+                case 0x03: ; // Get backlight state
+                    uint8_t audio[2];
+                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_AUDIO), &audio);
+                    send_bytes_sysex(0x03, &audio, 2);
+                #endif
+                case 0x04: ; // Get layer state
+                    uint8_t layers[5];
+                    encode_uint32_chunk(layer_state, &layers);
+                    send_bytes_sysex(0x04, &layers, 5);
+                    break;
+                #ifdef BACKLIGHT_ENABLE
+                case 0x06: ; // Get backlight state
+                    uint8_t backlight[2];
+                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_BACKLIGHT), &backlight);
+                    send_bytes_sysex(0x06, &backlight, 2);
+                #endif
+                #ifdef RGBLIGHT_ENABLE
+                case 0x07: ; // Get rgblight state
+                    uint8_t rgblight[2];
+                    encode_uint32_chunk(eeprom_read_dword(EECONFIG_RGBLIGHT), &rgblight);
+                    send_bytes_sysex(0x07, &rgblight, 5);
+                #endif
+                case 0x08: ; // Keymap options
+                    uint8_t keymap_options[2];
+                    encode_uint8_chunk(eeconfig_read_keymap(), &keymap_options);
+                    send_bytes_sysex(0x08, &keymap_options, 2);
+                    break;
+            }
+            break;
         #ifdef RGBLIGHT_ENABLE
         case 0x27: ; // RGB LED functions
             switch (*data++) {
                 case 0x00: ; // Update HSV
-                    uint32_t chunk = decode_4byte_chunk(data);
-                    rgblight_sethsv(((chunk >> 16) & 0xFFFF) % 360, (chunk >> 8) & 0xFF, chunk & 0xFF);
+                    uint32_t hsv = decode_uint32_chunk(data);
+                    rgblight_sethsv(((hsv >> 16) & 0xFFFF) % 360, (hsv >> 8) & 0xFF, hsv & 0xFF);
                     break;
                 case 0x01: ; // Update RGB
                     break;
+                case 0x02: ; // Update mode
+                    uint8_t rgb_mode = decode_uint8_chunk(data);
+                    rgblight_mode(rgb_mode);
+                    break;
             }
             break;
         #endif
@@ -1234,10 +1293,20 @@ void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data)
 
 void send_unicode_midi(uint32_t unicode) {
     uint8_t chunk[5];
-    encode_4byte_chunk(unicode, &chunk);
+    encode_uint32_chunk(unicode, &chunk);
+    send_bytes_sysex(0x05, &chunk, 5);
+}
 
-    uint8_t array[] = {0xF0, 0x00, 0x00, 0x00, 0x05, chunk[0], chunk[1], chunk[2], chunk[3], chunk[4], 0xF7};
-    midi_send_array(&midi_device, 11, &array);
+void send_bytes_sysex(uint8_t type, uint8_t * bytes, uint8_t length) {
+    uint8_t * array = malloc(sizeof(uint8_t) * (length + 6));
+    array[0] = 0xF0;
+    array[1] = 0x00;
+    array[2] = 0x00;
+    array[3] = 0x00;
+    array[4] = type;
+    array[length + 5] = 0xF7;
+    memcpy(array + 5, bytes, length);
+    midi_send_array(&midi_device, length + 6, array);
 }
 
 #endif
diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h
index 3fec797b6cf..198964f901c 100644
--- a/tmk_core/protocol/lufa/lufa.h
+++ b/tmk_core/protocol/lufa/lufa.h
@@ -68,9 +68,18 @@ typedef struct {
 } __attribute__ ((packed)) report_extra_t;
 
 #ifdef MIDI_ENABLE
-void MIDI_Task(void);
-MidiDevice midi_device;
-void send_unicode_midi(uint32_t unicode);
+  #define MIDI_SYSEX_BUFFER 16 
+  void MIDI_Task(void);
+  MidiDevice midi_device;
+
+  void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data);
+  uint32_t decode_uint32_chunk(uint8_t * data);
+  uint32_t decode_uint8_chunk(uint8_t * data);
+  void encode_uint32_chunk(uint32_t data, uint8_t * pointer);
+  void encode_uint8_chunk(uint8_t data, uint8_t * pointer);
+  void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data);
+  void send_unicode_midi(uint32_t unicode);
+  void send_bytes_sysex(uint8_t type, uint8_t * bytes, uint8_t length);
 #endif
 
 // #if LUFA_VERSION_INTEGER < 0x120730

From c1037b1dc060d14a09a59f697fefe2b5b91bf373 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Mon, 21 Nov 2016 18:05:06 -0500
Subject: [PATCH 063/147] working with helper, qmk_helper_windows@05b0105

---
 keyboards/planck/keymaps/default/Makefile | 8 ++++----
 keyboards/planck/keymaps/default/keymap.c | 4 ++--
 tmk_core/protocol/lufa/lufa.c             | 6 ++++++
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/keyboards/planck/keymaps/default/Makefile b/keyboards/planck/keymaps/default/Makefile
index 0f4953888dd..267a087ea92 100644
--- a/keyboards/planck/keymaps/default/Makefile
+++ b/keyboards/planck/keymaps/default/Makefile
@@ -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
diff --git a/keyboards/planck/keymaps/default/keymap.c b/keyboards/planck/keymaps/default/keymap.c
index 5f71ae7d19a..ddbe4d7b27e 100644
--- a/keyboards/planck/keymaps/default/keymap.c
+++ b/keyboards/planck/keymaps/default/keymap.c
@@ -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}
 },
 
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index cc00b3b89b9..35739e3211b 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -1207,6 +1207,12 @@ void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data)
     data++;
 
     switch (*data++) {
+        case 0x07: ; // Quantum action
+            break;
+        case 0x08: ; // Keyboard acion
+            break;
+        case 0x09: ; // User action
+            break;
         case 0x12: ; // Set info on keyboard
             switch (*data++) {
                 case 0x02: ; // set default layer

From 664c0a036b3d7c3ed39f4a7a78d97f4a9cc7d20c Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Mon, 21 Nov 2016 19:50:55 -0500
Subject: [PATCH 064/147] cleaning up new code

---
 quantum/light_ws2812.h        |  2 +-
 quantum/quantum.c             | 40 ++++++++++++++++
 quantum/quantum.h             |  5 ++
 tmk_core/protocol/lufa/lufa.c | 90 +++++++++++------------------------
 4 files changed, 73 insertions(+), 64 deletions(-)

diff --git a/quantum/light_ws2812.h b/quantum/light_ws2812.h
index 0bef93d5ec8..9498e550e97 100755
--- a/quantum/light_ws2812.h
+++ b/quantum/light_ws2812.h
@@ -16,7 +16,7 @@
 #include <avr/io.h>
 #include <avr/interrupt.h>
 //#include "ws2812_config.h"
-#include "i2cmaster.h"
+//#include "i2cmaster.h"
 
 #define LIGHT_I2C 1
 #define LIGHT_I2C_ADDR        0x84
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 9fd9a6ef725..8b2fefef656 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -802,6 +802,46 @@ void backlight_set(uint8_t level)
 #endif // backlight
 
 
+// Functions for spitting out values
+//
+
+void send_dword(uint32_t number) { // this might not actually work
+    uint16_t word = (number >> 16);
+    send_word(word);
+    send_word(number & 0xFFFFUL);
+}
+
+void send_word(uint16_t number) {
+    uint8_t byte = number >> 8;
+    send_byte(byte);
+    send_byte(number & 0xFF);
+}
+
+void send_byte(uint8_t number) {
+    uint8_t nibble = number >> 4;
+    send_nibble(nibble);
+    send_nibble(number & 0xF);
+}
+
+void send_nibble(uint8_t number) {
+    switch (number) {
+        case 0:
+            register_code(KC_0);
+            unregister_code(KC_0);
+            break;
+        case 1 ... 9:
+            register_code(KC_1 + (number - 1));
+            unregister_code(KC_1 + (number - 1));
+            break;
+        case 0xA ... 0xF:
+            register_code(KC_A + (number - 0xA));
+            unregister_code(KC_A + (number - 0xA));
+            break;
+    }
+}
+
+
+
 
 __attribute__ ((weak))
 void led_set_user(uint8_t usb_led) {
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 06a2e049dcf..3d35f11fadb 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -110,6 +110,11 @@ 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);
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 35739e3211b..14da3b8039a 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -84,9 +84,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 */
@@ -714,7 +714,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;
@@ -774,7 +774,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)) {
 
@@ -804,12 +804,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();
 }
 
@@ -1112,41 +1112,6 @@ void cc_callback(MidiDevice * device,
     #endif
 }
 
-void send_dword(uint32_t number) {
-    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;
-    }
-}
-
 uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0};
 
 void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data) {
@@ -1159,8 +1124,8 @@ void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t
         for (uint8_t place = 0; place < length; place++) {
             // send_byte(*data);
             midi_buffer[start + place] = *data;
-            if (*data == 0xF7)
-                sysex_buffer_callback(device, start + place, &midi_buffer);
+            if (*data == 0xF7 && midi_buffer[0] == 0xF0)
+                sysex_buffer_callback(device, start + place, midi_buffer);
             // SEND_STRING(" ");
             data++;
         }
@@ -1197,10 +1162,9 @@ void encode_uint8_chunk(uint8_t data, uint8_t * pointer) {
 }
 
 void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data) {
-    uint8_t * pointer_copy = data;
+    // uint8_t * pointer_copy = data; // use for debugging
 
-    if (*data++ != 0xF0)
-        return
+    //data++; // i'm 98% sure there's a better way to do this
     data++;
     data++;
     data++;
@@ -1233,41 +1197,41 @@ void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data)
                     break;
                 case 0x01: ; // Get debug state
                     uint8_t debug[2];
-                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_DEBUG), &debug);
-                    send_bytes_sysex(0x01, &debug, 2);
+                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_DEBUG), debug);
+                    send_bytes_sysex(0x01, debug, 2);
                     break;
                 case 0x02: ; // Get default layer
                     uint8_t default_layer[2];
-                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_DEFAULT_LAYER), &default_layer);
-                    send_bytes_sysex(0x02, &default_layer, 2);
+                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_DEFAULT_LAYER), default_layer);
+                    send_bytes_sysex(0x02, default_layer, 2);
                     break;
                 #ifdef AUDIO_ENABLE
                 case 0x03: ; // Get backlight state
                     uint8_t audio[2];
-                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_AUDIO), &audio);
-                    send_bytes_sysex(0x03, &audio, 2);
+                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_AUDIO), audio);
+                    send_bytes_sysex(0x03, audio, 2);
                 #endif
                 case 0x04: ; // Get layer state
                     uint8_t layers[5];
-                    encode_uint32_chunk(layer_state, &layers);
-                    send_bytes_sysex(0x04, &layers, 5);
+                    encode_uint32_chunk(layer_state, layers);
+                    send_bytes_sysex(0x04, layers, 5);
                     break;
                 #ifdef BACKLIGHT_ENABLE
                 case 0x06: ; // Get backlight state
                     uint8_t backlight[2];
-                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_BACKLIGHT), &backlight);
-                    send_bytes_sysex(0x06, &backlight, 2);
+                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_BACKLIGHT), backlight);
+                    send_bytes_sysex(0x06, backlight, 2);
                 #endif
                 #ifdef RGBLIGHT_ENABLE
                 case 0x07: ; // Get rgblight state
                     uint8_t rgblight[2];
-                    encode_uint32_chunk(eeprom_read_dword(EECONFIG_RGBLIGHT), &rgblight);
-                    send_bytes_sysex(0x07, &rgblight, 5);
+                    encode_uint32_chunk(eeprom_read_dword(EECONFIG_RGBLIGHT), rgblight);
+                    send_bytes_sysex(0x07, rgblight, 5);
                 #endif
                 case 0x08: ; // Keymap options
                     uint8_t keymap_options[2];
-                    encode_uint8_chunk(eeconfig_read_keymap(), &keymap_options);
-                    send_bytes_sysex(0x08, &keymap_options, 2);
+                    encode_uint8_chunk(eeconfig_read_keymap(), keymap_options);
+                    send_bytes_sysex(0x08, keymap_options, 2);
                     break;
             }
             break;
@@ -1299,8 +1263,8 @@ void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data)
 
 void send_unicode_midi(uint32_t unicode) {
     uint8_t chunk[5];
-    encode_uint32_chunk(unicode, &chunk);
-    send_bytes_sysex(0x05, &chunk, 5);
+    encode_uint32_chunk(unicode, chunk);
+    send_bytes_sysex(0x05, chunk, 5);
 }
 
 void send_bytes_sysex(uint8_t type, uint8_t * bytes, uint8_t length) {

From 6390033e8688550826a4bd3004a2e76568600657 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Mon, 21 Nov 2016 20:14:16 -0500
Subject: [PATCH 065/147] cleaning up midid

---
 quantum/config_common.h       | 99 ++++++++++++++++++-----------------
 tmk_core/common/host_driver.h |  9 +++-
 tmk_core/protocol/lufa/lufa.c |  2 +-
 3 files changed, 59 insertions(+), 51 deletions(-)

diff --git a/quantum/config_common.h b/quantum/config_common.h
index 8ed5f4a106e..f3897dc2ce7 100644
--- a/quantum/config_common.h
+++ b/quantum/config_common.h
@@ -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
diff --git a/tmk_core/common/host_driver.h b/tmk_core/common/host_driver.h
index edb9e5dd9c0..588d1c0be8f 100644
--- a/tmk_core/common/host_driver.h
+++ b/tmk_core/common/host_driver.h
@@ -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
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 14da3b8039a..a33a16599e2 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -1051,7 +1051,7 @@ int main(void)
         // MIDI_Task();
 #endif
         
-#ifdef RGBLIGHT_ENABLE
+#ifdef RGBLIGHT_ANIMATIONS
         rgblight_task();
 #endif
 

From 06a2677b7eedbf58532fa1a673ba1277e756174d Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Mon, 21 Nov 2016 20:17:32 -0500
Subject: [PATCH 066/147] fix infinity

---
 keyboards/ergodox/config.h    | 2 --
 keyboards/ergodox/ez/config.h | 2 ++
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/keyboards/ergodox/config.h b/keyboards/ergodox/config.h
index 049c707a561..edc60caae12 100644
--- a/keyboards/ergodox/config.h
+++ b/keyboards/ergodox/config.h
@@ -1,8 +1,6 @@
 #ifndef KEYBOARDS_ERGODOX_CONFIG_H_
 #define KEYBOARDS_ERGODOX_CONFIG_H_
 
-#include "config_common.h"
-
 #define MOUSEKEY_DELAY          100
 #define MOUSEKEY_INTERVAL       20
 #define MOUSEKEY_MAX_SPEED      3
diff --git a/keyboards/ergodox/ez/config.h b/keyboards/ergodox/ez/config.h
index 084a044ee1a..67a856e511c 100644
--- a/keyboards/ergodox/ez/config.h
+++ b/keyboards/ergodox/ez/config.h
@@ -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

From 2febf9b9f7d610fc2eca666a842272cb90a87919 Mon Sep 17 00:00:00 2001
From: h-youhei <hukumitu.youhei@gmail.com>
Date: Tue, 22 Nov 2016 20:40:12 +0900
Subject: [PATCH 067/147] Add japanese keymap

---
 quantum/keymap_extras/keymap_jp.h | 62 +++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)
 create mode 100644 quantum/keymap_extras/keymap_jp.h

diff --git a/quantum/keymap_extras/keymap_jp.h b/quantum/keymap_extras/keymap_jp.h
new file mode 100644
index 00000000000..e81b5952e00
--- /dev/null
+++ b/quantum/keymap_extras/keymap_jp.h
@@ -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

From d37becc0a9203c4c7d52aca6190b4b3d9fb69a59 Mon Sep 17 00:00:00 2001
From: PureSpider <alex.lamprecht1@gmail.com>
Date: Tue, 22 Nov 2016 22:12:57 +0100
Subject: [PATCH 068/147] Set backlight status to on if it's at maximum
 brightness already and the brightness increase keybind is used

Before it was turned on but the status wasn't set to on, so you had to
push the backlight toggle bind twice to turn it off again
---
 tmk_core/common/backlight.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tmk_core/common/backlight.c b/tmk_core/common/backlight.c
index c9e8fd3fd2d..0e0ad2d1541 100644
--- a/tmk_core/common/backlight.c
+++ b/tmk_core/common/backlight.c
@@ -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);
 }

From 5893f0fa1fcecfface25ce570f37e51031a14489 Mon Sep 17 00:00:00 2001
From: Wilba6582 <Jason.S.Williams@gmail.com>
Date: Wed, 23 Nov 2016 16:22:57 +1100
Subject: [PATCH 069/147] Fixed NO_SUSPEND_POWER_DOWN handling

---
 tmk_core/common/avr/suspend.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c
index 8a7272bbc52..939bda15eb7 100644
--- a/tmk_core/common/avr/suspend.c
+++ b/tmk_core/common/avr/suspend.c
@@ -47,6 +47,7 @@ void suspend_idle(uint8_t time)
     sleep_disable();
 }
 
+#ifndef NO_SUSPEND_POWER_DOWN
 /* Power down MCU with watchdog timer
  * wdto: watchdog timer timeout defined in <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,10 +100,13 @@ 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) {}
@@ -109,7 +114,9 @@ __attribute__ ((weak)) void matrix_power_down(void) {}
 bool suspend_wakeup_condition(void)
 {
 #ifdef BACKLIGHT_ENABLE
+#ifndef NO_SUSPEND_POWER_DOWN
     backlight_set(0);
+#endif
 #endif
     matrix_power_up();
     matrix_scan();
@@ -126,7 +133,6 @@ void suspend_wakeup_init(void)
     // clear keyboard state
     clear_keyboard();
 #ifdef BACKLIGHT_ENABLE
-    backlight_set(0);
     backlight_init();
 #endif
 led_set(host_keyboard_leds());

From 3d7aaa31e41a9c96e785b0c089d74dfda525dfbe Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Wed, 23 Nov 2016 00:30:06 -0500
Subject: [PATCH 070/147] converted to 8bit messages

---
 Dockerfile                    |   3 +-
 tmk_core/protocol/lufa/lufa.c | 119 +++++++++++++++++++---------------
 tmk_core/protocol/midi.mk     |   1 +
 3 files changed, 70 insertions(+), 53 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 744ded85797..c42bbeb32af 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -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
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index a33a16599e2..c4531c8d730 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -76,6 +76,10 @@
     #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;
@@ -1124,8 +1128,16 @@ void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t
         for (uint8_t place = 0; place < length; place++) {
             // send_byte(*data);
             midi_buffer[start + place] = *data;
-            if (*data == 0xF7 && midi_buffer[0] == 0xF0)
-                sysex_buffer_callback(device, start + place, midi_buffer);
+            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);
+                sysex_buffer_callback(device, decode_length, decoded);
+            }
             // SEND_STRING(" ");
             data++;
         }
@@ -1161,32 +1173,35 @@ void encode_uint8_chunk(uint8_t data, uint8_t * pointer) {
     *pointer++ = (data) & 0x7F;
 }
 
-void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data) {
-    // uint8_t * pointer_copy = data; // use for debugging
+void dword_to_bytes(uint8_t * bytes, uint32_t dword) {
+    bytes[0] = (dword >> 24) & 0xFF;
+    bytes[1] = (dword >> 16) & 0xFF; 
+    bytes[2] = (dword >> 8) & 0xFF; 
+    bytes[3] = (dword >> 0) & 0xFF; 
+}
 
-    //data++; // i'm 98% sure there's a better way to do this
-    data++;
-    data++;
-    data++;
-    data++;
+void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data) {
+    // SEND_STRING("\nRX: ");
+    // for (uint8_t i = 0; i < length; i++) {
+    //     send_byte(data[i]);
+    //     SEND_STRING(" ");
+    // }
 
     switch (*data++) {
         case 0x07: ; // Quantum action
             break;
-        case 0x08: ; // Keyboard acion
+        case 0x08: ; // Keyboard action
             break;
         case 0x09: ; // User action
             break;
         case 0x12: ; // Set info on keyboard
             switch (*data++) {
                 case 0x02: ; // set default layer
-                    uint8_t default_layer = decode_uint8_chunk(data);
-                    eeconfig_update_default_layer(default_layer);
-                    default_layer_set((uint32_t)default_layer);
+                    eeconfig_update_default_layer(data[0] << 8 | data[1]);
+                    default_layer_set((uint32_t)(data[0] << 8 | data[1]));
                     break;
                 case 0x08: ; // set keymap options
-                    uint8_t keymap_options = decode_uint8_chunk(data);
-                    eeconfig_update_keymap(keymap_options);
+                    eeconfig_update_keymap(data[0]);
                     break;
             }
             break;
@@ -1196,42 +1211,37 @@ void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data)
                     send_bytes_sysex(0x00, NULL, 0);
                     break;
                 case 0x01: ; // Get debug state
-                    uint8_t debug[2];
-                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_DEBUG), debug);
-                    send_bytes_sysex(0x01, debug, 2);
+                    uint8_t debug_bytes[1] = { eeprom_read_byte(EECONFIG_DEBUG) };
+                    send_bytes_sysex(0x01, debug_bytes, 1);
                     break;
                 case 0x02: ; // Get default layer
-                    uint8_t default_layer[2];
-                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_DEFAULT_LAYER), default_layer);
-                    send_bytes_sysex(0x02, default_layer, 2);
+                    uint8_t default_bytes[1] = { eeprom_read_byte(EECONFIG_DEFAULT_LAYER) };
+                    send_bytes_sysex(0x02, default_bytes, 1);
                     break;
                 #ifdef AUDIO_ENABLE
                 case 0x03: ; // Get backlight state
-                    uint8_t audio[2];
-                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_AUDIO), audio);
-                    send_bytes_sysex(0x03, audio, 2);
+                    uint8_t audio_bytes[1] = { eeprom_read_byte(EECONFIG_AUDIO) };
+                    send_bytes_sysex(0x03, audio_bytes, 1);
                 #endif
                 case 0x04: ; // Get layer state
-                    uint8_t layers[5];
-                    encode_uint32_chunk(layer_state, layers);
-                    send_bytes_sysex(0x04, layers, 5);
+                    uint8_t layer_state_bytes[4];
+                    dword_to_bytes(layer_state_bytes, layer_state);
+                    send_bytes_sysex(0x04, layer_state_bytes, 4);
                     break;
                 #ifdef BACKLIGHT_ENABLE
                 case 0x06: ; // Get backlight state
-                    uint8_t backlight[2];
-                    encode_uint8_chunk(eeprom_read_byte(EECONFIG_BACKLIGHT), backlight);
-                    send_bytes_sysex(0x06, backlight, 2);
+                    uint8_t backlight_bytes[1] = { eeprom_read_byte(EECONFIG_BACKLIGHT) };
+                    send_bytes_sysex(0x06, backlight_bytes, 1);
                 #endif
                 #ifdef RGBLIGHT_ENABLE
                 case 0x07: ; // Get rgblight state
-                    uint8_t rgblight[2];
-                    encode_uint32_chunk(eeprom_read_dword(EECONFIG_RGBLIGHT), rgblight);
-                    send_bytes_sysex(0x07, rgblight, 5);
+                    uint8_t rgblight_bytes[4];
+                    dword_to_bytes(rgblight_bytes, eeprom_read_dword(EECONFIG_RGBLIGHT));
+                    send_bytes_sysex(0x07, rgblight_bytes, 4);
                 #endif
                 case 0x08: ; // Keymap options
-                    uint8_t keymap_options[2];
-                    encode_uint8_chunk(eeconfig_read_keymap(), keymap_options);
-                    send_bytes_sysex(0x08, keymap_options, 2);
+                    uint8_t keymap_bytes[1] = { eeconfig_read_keymap() };
+                    send_bytes_sysex(0x08, keymap_bytes, 1);
                     break;
             }
             break;
@@ -1239,26 +1249,18 @@ void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data)
         case 0x27: ; // RGB LED functions
             switch (*data++) {
                 case 0x00: ; // Update HSV
-                    uint32_t hsv = decode_uint32_chunk(data);
-                    rgblight_sethsv(((hsv >> 16) & 0xFFFF) % 360, (hsv >> 8) & 0xFF, hsv & 0xFF);
+                    rgblight_sethsv((data[0] << 8 | data[1]) % 360, data[2], data[3]);
                     break;
                 case 0x01: ; // Update RGB
                     break;
                 case 0x02: ; // Update mode
-                    uint8_t rgb_mode = decode_uint8_chunk(data);
-                    rgblight_mode(rgb_mode);
+                    rgblight_mode(data[0]);
                     break;
             }
             break;
         #endif
     }
 
-    // SEND_STRING("\nDATA:\n");
-    // while (*pointer_copy != 0xF7) {
-    //     send_byte(*pointer_copy++);
-    //     SEND_STRING(" ");
-    // }
-
 }
 
 void send_unicode_midi(uint32_t unicode) {
@@ -1268,15 +1270,30 @@ void send_unicode_midi(uint32_t unicode) {
 }
 
 void send_bytes_sysex(uint8_t type, uint8_t * bytes, uint8_t length) {
-    uint8_t * array = malloc(sizeof(uint8_t) * (length + 6));
+    // 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 + 1));
+    precode[0] = type;
+    memcpy(precode + 1, bytes, length);
+    uint8_t * encoded = malloc(sizeof(uint8_t) * (sysex_encoded_length(length + 1)));
+    uint16_t encoded_length = sysex_encode(encoded, precode, length + 1);
+    uint8_t * array = malloc(sizeof(uint8_t) * (encoded_length + 5));
     array[0] = 0xF0;
     array[1] = 0x00;
     array[2] = 0x00;
     array[3] = 0x00;
-    array[4] = type;
-    array[length + 5] = 0xF7;
-    memcpy(array + 5, bytes, length);
-    midi_send_array(&midi_device, length + 6, array);
+    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(" ");
+    // }
 }
 
 #endif
diff --git a/tmk_core/protocol/midi.mk b/tmk_core/protocol/midi.mk
index c85ae42ff24..4855b23d301 100644
--- a/tmk_core/protocol/midi.mk
+++ b/tmk_core/protocol/midi.mk
@@ -4,6 +4,7 @@ SRC += midi.c \
 	   midi_device.c \
 	   bytequeue/bytequeue.c \
 	   bytequeue/interrupt_setting.c \
+	   sysex_tools.c \
 	   $(LUFA_SRC_USBCLASS)
 
 VPATH += $(TMK_PATH)/$(MIDI_DIR)
\ No newline at end of file

From cf3926a8e13edb76193b8af25b497f9ef61161fd Mon Sep 17 00:00:00 2001
From: Wilba6582 <Jason.S.Wiliams@gmail.com>
Date: Wed, 23 Nov 2016 19:45:50 +1100
Subject: [PATCH 071/147] Fixed NO_SUSPEND_POWER_DOWN handling

---
 tmk_core/common/avr/suspend.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c
index 939bda15eb7..0c81e836121 100644
--- a/tmk_core/common/avr/suspend.c
+++ b/tmk_core/common/avr/suspend.c
@@ -113,11 +113,6 @@ __attribute__ ((weak)) void matrix_power_up(void) {}
 __attribute__ ((weak)) void matrix_power_down(void) {}
 bool suspend_wakeup_condition(void)
 {
-#ifdef BACKLIGHT_ENABLE
-#ifndef NO_SUSPEND_POWER_DOWN
-    backlight_set(0);
-#endif
-#endif
     matrix_power_up();
     matrix_scan();
     matrix_power_down();
@@ -135,7 +130,7 @@ void suspend_wakeup_init(void)
 #ifdef BACKLIGHT_ENABLE
     backlight_init();
 #endif
-led_set(host_keyboard_leds());
+	led_set(host_keyboard_leds());
 }
 
 #ifndef NO_SUSPEND_POWER_DOWN

From 2e23689b8e3222982082c1f5a4f8ce7686f9658b Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Wed, 23 Nov 2016 18:52:02 -0500
Subject: [PATCH 072/147] converted to new format

---
 quantum/rgblight.c            |  13 ++
 quantum/rgblight.h            |   1 +
 tmk_core/protocol/lufa/lufa.c | 313 +++++++++++++++++++++-------------
 tmk_core/protocol/lufa/lufa.h |  16 +-
 4 files changed, 217 insertions(+), 126 deletions(-)

diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index 00620da58ea..bb03d6e9138 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -183,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) {
diff --git a/quantum/rgblight.h b/quantum/rgblight.h
index a3673348e75..28a410e480d 100644
--- a/quantum/rgblight.h
+++ b/quantum/rgblight.h
@@ -65,6 +65,7 @@ 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);
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index c4531c8d730..c3234b8ce59 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -1145,141 +1145,58 @@ void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t
 
 }
 
-uint32_t decode_uint32_chunk(uint8_t * data) {
-    uint32_t part1 = *data++;
-    uint32_t part2 = *data++;
-    uint32_t part3 = *data++;
-    uint32_t part4 = *data++;
-    uint32_t part5 = *data++;
-    return ((part1 & 0x1FUL) << 28) | (part2 << 21) | (part3 << 14) | (part4 << 7) | part5;
-}
-
-uint32_t decode_uint8_chunk(uint8_t * data) {
-    uint32_t part4 = *data++;
-    uint32_t part5 = *data++;
-    return (part4 << 7) | part5;
-}
-
-void encode_uint32_chunk(uint32_t data, uint8_t * pointer) {
-    *pointer++ = (data >> 28) & 0x7F;
-    *pointer++ = (data >> 21) & 0x7F;
-    *pointer++ = (data >> 14) & 0x7F;
-    *pointer++ = (data >> 7) & 0x7F;
-    *pointer++ = (data) & 0x7F;
-}
-
-void encode_uint8_chunk(uint8_t data, uint8_t * pointer) {
-    *pointer++ = (data >> 7) & 0x7F;
-    *pointer++ = (data) & 0x7F;
-}
-
-void dword_to_bytes(uint8_t * bytes, uint32_t dword) {
+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; 
 }
 
-void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data) {
-    // SEND_STRING("\nRX: ");
-    // for (uint8_t i = 0; i < length; i++) {
-    //     send_byte(data[i]);
-    //     SEND_STRING(" ");
-    // }
-
-    switch (*data++) {
-        case 0x07: ; // Quantum action
-            break;
-        case 0x08: ; // Keyboard action
-            break;
-        case 0x09: ; // User action
-            break;
-        case 0x12: ; // Set info on keyboard
-            switch (*data++) {
-                case 0x02: ; // set default layer
-                    eeconfig_update_default_layer(data[0] << 8 | data[1]);
-                    default_layer_set((uint32_t)(data[0] << 8 | data[1]));
-                    break;
-                case 0x08: ; // set keymap options
-                    eeconfig_update_keymap(data[0]);
-                    break;
-            }
-            break;
-        case 0x13: ; // Get info from keyboard
-            switch (*data++) {
-                case 0x00: ; // Handshake
-                    send_bytes_sysex(0x00, NULL, 0);
-                    break;
-                case 0x01: ; // Get debug state
-                    uint8_t debug_bytes[1] = { eeprom_read_byte(EECONFIG_DEBUG) };
-                    send_bytes_sysex(0x01, debug_bytes, 1);
-                    break;
-                case 0x02: ; // Get default layer
-                    uint8_t default_bytes[1] = { eeprom_read_byte(EECONFIG_DEFAULT_LAYER) };
-                    send_bytes_sysex(0x02, default_bytes, 1);
-                    break;
-                #ifdef AUDIO_ENABLE
-                case 0x03: ; // Get backlight state
-                    uint8_t audio_bytes[1] = { eeprom_read_byte(EECONFIG_AUDIO) };
-                    send_bytes_sysex(0x03, audio_bytes, 1);
-                #endif
-                case 0x04: ; // Get layer state
-                    uint8_t layer_state_bytes[4];
-                    dword_to_bytes(layer_state_bytes, layer_state);
-                    send_bytes_sysex(0x04, layer_state_bytes, 4);
-                    break;
-                #ifdef BACKLIGHT_ENABLE
-                case 0x06: ; // Get backlight state
-                    uint8_t backlight_bytes[1] = { eeprom_read_byte(EECONFIG_BACKLIGHT) };
-                    send_bytes_sysex(0x06, backlight_bytes, 1);
-                #endif
-                #ifdef RGBLIGHT_ENABLE
-                case 0x07: ; // Get rgblight state
-                    uint8_t rgblight_bytes[4];
-                    dword_to_bytes(rgblight_bytes, eeprom_read_dword(EECONFIG_RGBLIGHT));
-                    send_bytes_sysex(0x07, rgblight_bytes, 4);
-                #endif
-                case 0x08: ; // Keymap options
-                    uint8_t keymap_bytes[1] = { eeconfig_read_keymap() };
-                    send_bytes_sysex(0x08, keymap_bytes, 1);
-                    break;
-            }
-            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
-    }
-
+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];
 }
 
-void send_unicode_midi(uint32_t unicode) {
-    uint8_t chunk[5];
-    encode_uint32_chunk(unicode, chunk);
-    send_bytes_sysex(0x05, chunk, 5);
-}
+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)
+};
 
-void send_bytes_sysex(uint8_t type, uint8_t * bytes, uint8_t length) {
+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,
+
+};
+
+void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint8_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 + 1));
-    precode[0] = type;
-    memcpy(precode + 1, bytes, length);
-    uint8_t * encoded = malloc(sizeof(uint8_t) * (sysex_encoded_length(length + 1)));
-    uint16_t encoded_length = sysex_encode(encoded, precode, length + 1);
+    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;
@@ -1296,4 +1213,158 @@ void send_bytes_sysex(uint8_t type, uint8_t * bytes, uint8_t length) {
     // }
 }
 
+#define MT_GET_DATA(data_type, data, length) send_bytes_sysex(MT_GET_DATA, data_type, data, length)
+#define MT_GET_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_GET_DATA_ACK, data_type, data, length)
+#define MT_SET_DATA(data_type, data, length) send_bytes_sysex(MT_SET_DATA, data_type, data, length)
+#define MT_SET_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_SET_DATA_ACK, data_type, data, length)
+#define MT_SEND_DATA(data_type, data, length) send_bytes_sysex(MT_SEND_DATA, data_type, data, length)
+#define MT_SEND_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_SEND_DATA_ACK, data_type, data, length)
+#define MT_EXE_ACTION(data_type, data, length) send_bytes_sysex(MT_EXE_ACTION, data_type, data, length)
+#define MT_EXE_ACTION_ACK(data_type, data, length) send_bytes_sysex(MT_EXE_ACTION_ACK, data_type, data, length)
+
+__attribute__ ((weak))
+bool sysex_process_quantum(uint8_t length, uint8_t * data) {
+    return sysex_process_keyboard(length, data);
+}
+
+__attribute__ ((weak))
+bool sysex_process_keyboard(uint8_t length, uint8_t * data) {
+    return sysex_process_user(length, data);
+}
+
+__attribute__ ((weak))
+bool sysex_process_user(uint8_t length, uint8_t * data) {
+    return true;
+}
+
+void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data) {
+    // SEND_STRING("\nRX: ");
+    // for (uint8_t i = 0; i < length; i++) {
+    //     send_byte(data[i]);
+    //     SEND_STRING(" ");
+    // }
+    if (!sysex_process_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;
+                }
+                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_sysex(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
+    }
+
+}
+
+void send_unicode_midi(uint32_t unicode) {
+    uint8_t chunk[4];
+    dword_to_bytes(unicode, chunk);
+    MT_SEND_DATA(DT_UNICODE, chunk, 5);
+}
+
+
 #endif
diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h
index 198964f901c..99b089f42bd 100644
--- a/tmk_core/protocol/lufa/lufa.h
+++ b/tmk_core/protocol/lufa/lufa.h
@@ -73,13 +73,19 @@ typedef struct {
   MidiDevice midi_device;
 
   void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data);
-  uint32_t decode_uint32_chunk(uint8_t * data);
-  uint32_t decode_uint8_chunk(uint8_t * data);
-  void encode_uint32_chunk(uint32_t data, uint8_t * pointer);
-  void encode_uint8_chunk(uint8_t data, uint8_t * pointer);
   void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data);
   void send_unicode_midi(uint32_t unicode);
-  void send_bytes_sysex(uint8_t type, uint8_t * bytes, uint8_t length);
+  void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint8_t length);
+
+  __attribute__ ((weak))
+  bool sysex_process_quantum(uint8_t length, uint8_t * data);
+
+  __attribute__ ((weak))
+  bool sysex_process_keyboard(uint8_t length, uint8_t * data);
+
+  __attribute__ ((weak))
+  bool sysex_process_user(uint8_t length, uint8_t * data);
+
 #endif
 
 // #if LUFA_VERSION_INTEGER < 0x120730

From cefa8468fb5f28bd67a0c02d371a4aef0964e20c Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Wed, 23 Nov 2016 20:16:38 -0500
Subject: [PATCH 073/147] travis pls

---
 keyboards/ergodox/infinity/rules.mk     |  2 +
 keyboards/ergodox/keymaps/jack/Makefile |  4 +-
 quantum/quantum.c                       |  9 ++++-
 quantum/quantum.h                       |  2 +
 tmk_core/protocol/lufa/lufa.c           | 49 +------------------------
 tmk_core/protocol/lufa/lufa.h           | 42 ++++++++++++++++++++-
 6 files changed, 56 insertions(+), 52 deletions(-)

diff --git a/keyboards/ergodox/infinity/rules.mk b/keyboards/ergodox/infinity/rules.mk
index ccb735a485b..473a6dfec6d 100644
--- a/keyboards/ergodox/infinity/rules.mk
+++ b/keyboards/ergodox/infinity/rules.mk
@@ -63,6 +63,8 @@ VISUALIZER_ENABLE ?= no #temporarily disabled to make everything compile
 LCD_ENABLE ?= yes
 LED_ENABLE ?= yes
 LCD_BACKLIGHT_ENABLE ?= yes
+MIDI_ENABLE = no
+RGBLIGHT_ENABLE = no
 
 ifndef QUANTUM_DIR
 	include ../../../Makefile
diff --git a/keyboards/ergodox/keymaps/jack/Makefile b/keyboards/ergodox/keymaps/jack/Makefile
index 7c257af5016..3ca69bb9231 100644
--- a/keyboards/ergodox/keymaps/jack/Makefile
+++ b/keyboards/ergodox/keymaps/jack/Makefile
@@ -1,5 +1,5 @@
-RGBLIGHT_ENABLE = yes
-MIDI_ENABLE = yes
+RGBLIGHT_ENABLE ?= yes
+MIDI_ENABLE ?= yes
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
diff --git a/quantum/quantum.c b/quantum/quantum.c
index f9f1ef22d08..8372a7adc51 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -847,8 +847,13 @@ void send_nibble(uint8_t number) {
     }
 }
 
-
-
+void send_unicode_midi(uint32_t unicode) {
+  #ifdef MIDI_ENABLE
+    uint8_t chunk[4];
+    dword_to_bytes(unicode, chunk);
+    MT_SEND_DATA(DT_UNICODE, chunk, 5);
+  #endif
+}
 
 __attribute__ ((weak))
 void led_set_user(uint8_t usb_led) {
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 3d35f11fadb..316da15b9ab 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -119,4 +119,6 @@ void send_nibble(uint8_t number);
 void led_set_user(uint8_t usb_led);
 void led_set_kb(uint8_t usb_led);
 
+void send_unicode_midi(uint32_t unicode);
+
 #endif
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index c3234b8ce59..eae3e8f2980 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -72,7 +72,7 @@
     #include "virtser.h"
 #endif
 
-#ifdef RGB_MIDI
+#if (defined(RGB_MIDI) | defined(RGBLIGHT_ANIMATIONS)) & defined(RGBLIGHT_ENABLE)
     #include "rgblight.h"        
 #endif
 
@@ -1156,35 +1156,6 @@ 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];
 }
 
-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,
-
-};
-
 void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint8_t length) {
     // SEND_STRING("\nTX: ");
     // for (uint8_t i = 0; i < length; i++) {
@@ -1213,15 +1184,6 @@ void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes,
     // }
 }
 
-#define MT_GET_DATA(data_type, data, length) send_bytes_sysex(MT_GET_DATA, data_type, data, length)
-#define MT_GET_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_GET_DATA_ACK, data_type, data, length)
-#define MT_SET_DATA(data_type, data, length) send_bytes_sysex(MT_SET_DATA, data_type, data, length)
-#define MT_SET_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_SET_DATA_ACK, data_type, data, length)
-#define MT_SEND_DATA(data_type, data, length) send_bytes_sysex(MT_SEND_DATA, data_type, data, length)
-#define MT_SEND_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_SEND_DATA_ACK, data_type, data, length)
-#define MT_EXE_ACTION(data_type, data, length) send_bytes_sysex(MT_EXE_ACTION, data_type, data, length)
-#define MT_EXE_ACTION_ACK(data_type, data, length) send_bytes_sysex(MT_EXE_ACTION_ACK, data_type, data, length)
-
 __attribute__ ((weak))
 bool sysex_process_quantum(uint8_t length, uint8_t * data) {
     return sysex_process_keyboard(length, data);
@@ -1312,7 +1274,7 @@ void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data)
                         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)
+                        MT_GET_DATA_ACK(DT_RGBLIGHT, NULL, 0);
                     #endif
                     break;
                 }
@@ -1360,11 +1322,4 @@ void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data)
 
 }
 
-void send_unicode_midi(uint32_t unicode) {
-    uint8_t chunk[4];
-    dword_to_bytes(unicode, chunk);
-    MT_SEND_DATA(DT_UNICODE, chunk, 5);
-}
-
-
 #endif
diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h
index 99b089f42bd..0962dda8d8d 100644
--- a/tmk_core/protocol/lufa/lufa.h
+++ b/tmk_core/protocol/lufa/lufa.h
@@ -74,8 +74,9 @@ typedef struct {
 
   void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data);
   void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data);
-  void send_unicode_midi(uint32_t unicode);
   void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint8_t length);
+  void dword_to_bytes(uint32_t dword, uint8_t * bytes);
+  uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index);
 
   __attribute__ ((weak))
   bool sysex_process_quantum(uint8_t length, uint8_t * data);
@@ -86,6 +87,45 @@ typedef struct {
   __attribute__ ((weak))
   bool sysex_process_user(uint8_t length, uint8_t * data);
 
+  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,
+
+  };
+
+
+  #define MT_GET_DATA(data_type, data, length) send_bytes_sysex(MT_GET_DATA, data_type, data, length)
+  #define MT_GET_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_GET_DATA_ACK, data_type, data, length)
+  #define MT_SET_DATA(data_type, data, length) send_bytes_sysex(MT_SET_DATA, data_type, data, length)
+  #define MT_SET_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_SET_DATA_ACK, data_type, data, length)
+  #define MT_SEND_DATA(data_type, data, length) send_bytes_sysex(MT_SEND_DATA, data_type, data, length)
+  #define MT_SEND_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_SEND_DATA_ACK, data_type, data, length)
+  #define MT_EXE_ACTION(data_type, data, length) send_bytes_sysex(MT_EXE_ACTION, data_type, data, length)
+  #define MT_EXE_ACTION_ACK(data_type, data, length) send_bytes_sysex(MT_EXE_ACTION_ACK, data_type, data, length)
+
 #endif
 
 // #if LUFA_VERSION_INTEGER < 0x120730

From f25596b8dc2f15f620c07164d871023d9284618c Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Wed, 23 Nov 2016 21:28:12 -0500
Subject: [PATCH 074/147] rgblight fixes

---
 keyboards/ergodox/keymaps/erez_experimental/Makefile | 4 ++--
 keyboards/ergodox/keymaps/erez_experimental/keymap.c | 8 +++++---
 tmk_core/protocol/lufa/lufa.c                        | 2 +-
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/keyboards/ergodox/keymaps/erez_experimental/Makefile b/keyboards/ergodox/keymaps/erez_experimental/Makefile
index dbe89d1410c..51a0c74c547 100644
--- a/keyboards/ergodox/keymaps/erez_experimental/Makefile
+++ b/keyboards/ergodox/keymaps/erez_experimental/Makefile
@@ -3,8 +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
+RGBLIGHT_ENABLE ?= yes
+MIDI_ENABLE ?= yes
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
diff --git a/keyboards/ergodox/keymaps/erez_experimental/keymap.c b/keyboards/ergodox/keymaps/erez_experimental/keymap.c
index 4a23c7ac587..0c0e3c4e39e 100644
--- a/keyboards/ergodox/keymaps/erez_experimental/keymap.c
+++ b/keyboards/ergodox/keymaps/erez_experimental/keymap.c
@@ -164,9 +164,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
     // dynamically generate these.
     case RGB_FF00BB:
       if (record->event.pressed) {
-        rgblight_enable();
-        rgblight_mode(1);
-        rgblight_setrgb(0xff,0x00,0xbb);
+        #ifdef RGBLIGHT_ENABLE
+          rgblight_enable();
+          rgblight_mode(1);
+          rgblight_setrgb(0xff,0x00,0xbb);
+        #endif
       }
       return false;
       break;
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index eae3e8f2980..aa2e781c80e 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -1055,7 +1055,7 @@ int main(void)
         // MIDI_Task();
 #endif
         
-#ifdef RGBLIGHT_ANIMATIONS
+#if defined(RGBLIGHT_ANIMATIONS) & defined(RGBLIGHT_ENABLE)
         rgblight_task();
 #endif
 

From 3be13d1ffb43216aff1300cdce79512559bdde7c Mon Sep 17 00:00:00 2001
From: ofples <plesserofer@gmail.com>
Date: Fri, 25 Nov 2016 09:15:12 +0200
Subject: [PATCH 075/147] Added protocol.mk to build

---
 build_keyboard.mk | 1 +
 1 file changed, 1 insertion(+)

diff --git a/build_keyboard.mk b/build_keyboard.mk
index 61aebf3935a..055ce632ae2 100644
--- a/build_keyboard.mk
+++ b/build_keyboard.mk
@@ -199,6 +199,7 @@ endif
 VPATH += $(KEYBOARD_PATH)
 VPATH += $(COMMON_VPATH)
 
+include $(TMK_PATH)/protocol.mk
 
 include $(TMK_PATH)/common.mk
 SRC += $(TMK_COMMON_SRC)

From 03d6e165bb0baf9d0093250d3c3c0771290df4d6 Mon Sep 17 00:00:00 2001
From: ofples <plesserofer@gmail.com>
Date: Fri, 25 Nov 2016 09:17:40 +0200
Subject: [PATCH 076/147] Added missing endif for ifdef __AVR_ATmega32U4__ and
 removed the unnecessary one at the end of the file

---
 quantum/config_common.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/quantum/config_common.h b/quantum/config_common.h
index 8ed5f4a106e..443473292de 100644
--- a/quantum/config_common.h
+++ b/quantum/config_common.h
@@ -76,6 +76,7 @@
         } while(0)
 #   else
 #       error "USART configuration is needed."
+#   endif
 #endif
 
 // I'm fairly sure these aren't needed, but oh well - Jack
@@ -125,4 +126,3 @@
 
 #endif
 
-#endif

From 0c9d66eb59add717397ba83d508577073412ce86 Mon Sep 17 00:00:00 2001
From: ofples <plesserofer@gmail.com>
Date: Fri, 25 Nov 2016 09:20:41 +0200
Subject: [PATCH 077/147] Removed comment

---
 quantum/config_common.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/quantum/config_common.h b/quantum/config_common.h
index 443473292de..6b525fe1c64 100644
--- a/quantum/config_common.h
+++ b/quantum/config_common.h
@@ -79,8 +79,6 @@
 #   endif
 #endif
 
-// I'm fairly sure these aren't needed, but oh well - Jack
-
 /*
  * PS/2 Interrupt configuration
  */

From 97e7486d4c8818f4a6b3e619729d6f4f6524a7d1 Mon Sep 17 00:00:00 2001
From: ofples <plesserofer@gmail.com>
Date: Fri, 25 Nov 2016 12:10:44 +0200
Subject: [PATCH 078/147] Added documentation for PS/2 mouse in readme

---
 readme.md | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/readme.md b/readme.md
index 8615b48d554..0157b907248 100644
--- a/readme.md
+++ b/readme.md
@@ -1157,6 +1157,45 @@ 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.
+In order to do this you must first enable the option in your Makefile.
+
+    PS2_MOUSE_ENABLE = yes
+
+Then, decide whether to use interrupts (better if your microcontroller supports them) or busywait, and enable the relevant option.
+
+    PS2_USE_INT = yes
+    // PS2_USE_BUSYWAIT = yes
+
+If you're using a teensy and have hooked up the clock on your PS/2 device to D1 and the data to D0, you're all set.
+Otherwise, you will need to update the following defines in your `config.h`:
+    
+    #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
+
+And with `PS2_USE_INT` also define these macros:
+
+    #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
+
 ## Safety Considerations
 
 You probably don't want to "brick" your keyboard, making it impossible

From 4b0d16cd7bdcd41cffb17a7b6eed7cb44beaef34 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 13:11:40 +0700
Subject: [PATCH 079/147] My Promethium keyboard firmware

---
 keyboards/handwired/promethium/Makefile       |   3 +
 keyboards/handwired/promethium/config.h       | 164 ++++
 .../promethium/keymaps/priyadi/Makefile       |  28 +
 .../promethium/keymaps/priyadi/config.h       |  17 +
 .../promethium/keymaps/priyadi/flash.sh       |   3 +
 .../promethium/keymaps/priyadi/keymap.c       | 725 ++++++++++++++++++
 .../promethium/keymaps/priyadi/readme.md      |   0
 .../handwired/promethium/keymaps/readme.md    |  22 +
 keyboards/handwired/promethium/promethium.c   |   6 +
 keyboards/handwired/promethium/promethium.h   |  99 +++
 keyboards/handwired/promethium/readme.md      |  12 +
 keyboards/handwired/promethium/rgbsps.c       |  24 +
 keyboards/handwired/promethium/rgbsps.h       |   4 +
 keyboards/handwired/promethium/rules.mk       |  75 ++
 14 files changed, 1182 insertions(+)
 create mode 100644 keyboards/handwired/promethium/Makefile
 create mode 100644 keyboards/handwired/promethium/config.h
 create mode 100644 keyboards/handwired/promethium/keymaps/priyadi/Makefile
 create mode 100644 keyboards/handwired/promethium/keymaps/priyadi/config.h
 create mode 100755 keyboards/handwired/promethium/keymaps/priyadi/flash.sh
 create mode 100644 keyboards/handwired/promethium/keymaps/priyadi/keymap.c
 create mode 100644 keyboards/handwired/promethium/keymaps/priyadi/readme.md
 create mode 100644 keyboards/handwired/promethium/keymaps/readme.md
 create mode 100644 keyboards/handwired/promethium/promethium.c
 create mode 100644 keyboards/handwired/promethium/promethium.h
 create mode 100644 keyboards/handwired/promethium/readme.md
 create mode 100644 keyboards/handwired/promethium/rgbsps.c
 create mode 100644 keyboards/handwired/promethium/rgbsps.h
 create mode 100644 keyboards/handwired/promethium/rules.mk

diff --git a/keyboards/handwired/promethium/Makefile b/keyboards/handwired/promethium/Makefile
new file mode 100644
index 00000000000..191c6bb664d
--- /dev/null
+++ b/keyboards/handwired/promethium/Makefile
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+	include ../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/handwired/promethium/config.h b/keyboards/handwired/promethium/config.h
new file mode 100644
index 00000000000..5a2afe6abd3
--- /dev/null
+++ b/keyboards/handwired/promethium/config.h
@@ -0,0 +1,164 @@
+/*
+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
+#if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)
+/* 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
+
+
+#endif
diff --git a/keyboards/handwired/promethium/keymaps/priyadi/Makefile b/keyboards/handwired/promethium/keymaps/priyadi/Makefile
new file mode 100644
index 00000000000..2f6f27a7320
--- /dev/null
+++ b/keyboards/handwired/promethium/keymaps/priyadi/Makefile
@@ -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
index 00000000000..8b78c0dc4fb
--- /dev/null
+++ b/keyboards/handwired/promethium/keymaps/priyadi/config.h
@@ -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
index 00000000000..fb81a54ee08
--- /dev/null
+++ b/keyboards/handwired/promethium/keymaps/priyadi/flash.sh
@@ -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
index 00000000000..b2da2f97b78
--- /dev/null
+++ b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
@@ -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
index 00000000000..e69de29bb2d
diff --git a/keyboards/handwired/promethium/keymaps/readme.md b/keyboards/handwired/promethium/keymaps/readme.md
new file mode 100644
index 00000000000..527691389ed
--- /dev/null
+++ b/keyboards/handwired/promethium/keymaps/readme.md
@@ -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
index 00000000000..a0035cce1aa
--- /dev/null
+++ b/keyboards/handwired/promethium/promethium.c
@@ -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
index 00000000000..fb0dc168306
--- /dev/null
+++ b/keyboards/handwired/promethium/promethium.h
@@ -0,0 +1,99 @@
+#ifndef PROMETHIUM_H
+#define PROMETHIUM_H
+
+#include "quantum.h"
+
+#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
index 00000000000..64e2c3a16a6
--- /dev/null
+++ b/keyboards/handwired/promethium/readme.md
@@ -0,0 +1,12 @@
+Promethium Keyboard Firmware
+============================
+A handwired Planck based keyboard using the Adafruit Feather 32u4 Bluefruit LE controller.
+
+Features:
+
+* Single piece split form factor
+* Vertical staggered
+* Trackpoint
+* Bluetooth LE *TBD*
+* Battery
+* Per switch RGB LED
\ No newline at end of file
diff --git a/keyboards/handwired/promethium/rgbsps.c b/keyboards/handwired/promethium/rgbsps.c
new file mode 100644
index 00000000000..ea922ec3fde
--- /dev/null
+++ b/keyboards/handwired/promethium/rgbsps.c
@@ -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
index 00000000000..6da197f75dd
--- /dev/null
+++ b/keyboards/handwired/promethium/rgbsps.h
@@ -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
index 00000000000..835b13c4f38
--- /dev/null
+++ b/keyboards/handwired/promethium/rules.mk
@@ -0,0 +1,75 @@
+
+# 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
+
+include $(TMK_DIR)/protocol.mk
+SRC += $(QUANTUM_DIR)/light_ws2812.c
+SRC += rgbsps.c
\ No newline at end of file

From 9a071f051ca9dffdf64b68ea59b2424e37bc51e7 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 13:24:53 +0700
Subject: [PATCH 080/147] Make PS2 init delay configurable. Some devices are
 not fully powered up after 1s.

---
 tmk_core/protocol/ps2_mouse.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index c3e8b3c1c33..82f6966e8ed 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/tmk_core/protocol/ps2_mouse.c
@@ -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);

From b94e5b2aa6636326b2eaa75a2c562ea074e1535a Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 13:44:50 +0700
Subject: [PATCH 081/147] change init delay to 2000ms

---
 keyboards/handwired/promethium/promethium.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/keyboards/handwired/promethium/promethium.h b/keyboards/handwired/promethium/promethium.h
index fb0dc168306..8f2a8c3be2f 100644
--- a/keyboards/handwired/promethium/promethium.h
+++ b/keyboards/handwired/promethium/promethium.h
@@ -3,6 +3,8 @@
 
 #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, \

From 6313ec7ef960ad76182020f031cd09803d7a7d51 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 13:46:05 +0700
Subject: [PATCH 082/147] protocols.mk is already included in latest QMK

---
 keyboards/handwired/promethium/rules.mk | 1 -
 1 file changed, 1 deletion(-)

diff --git a/keyboards/handwired/promethium/rules.mk b/keyboards/handwired/promethium/rules.mk
index 835b13c4f38..0842780cce2 100644
--- a/keyboards/handwired/promethium/rules.mk
+++ b/keyboards/handwired/promethium/rules.mk
@@ -70,6 +70,5 @@ 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
 
-include $(TMK_DIR)/protocol.mk
 SRC += $(QUANTUM_DIR)/light_ws2812.c
 SRC += rgbsps.c
\ No newline at end of file

From 2cf9b9375878d3810fbdfe0c215ee4dcb379a163 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 13:47:03 +0700
Subject: [PATCH 083/147] remove ifdef on chip type

---
 keyboards/handwired/promethium/config.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/keyboards/handwired/promethium/config.h b/keyboards/handwired/promethium/config.h
index 5a2afe6abd3..473af67d34d 100644
--- a/keyboards/handwired/promethium/config.h
+++ b/keyboards/handwired/promethium/config.h
@@ -116,7 +116,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* PS/2 mouse USART version */
 #ifdef PS2_USE_USART
-#if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)
 /* XCK for clock line and RXD for data line */
 #define PS2_CLOCK_PORT  PORTD
 #define PS2_CLOCK_PIN   PIND
@@ -158,7 +157,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PS2_USART_ERROR         (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1)))
 #define PS2_USART_RX_VECT       USART1_RX_vect
 #endif
-#endif
 
 
 #endif

From de1df639535817e17f1c01f07e7a629cec478526 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 13:55:41 +0700
Subject: [PATCH 084/147] PS2 pins configuration belongs to each keyboards
 config.h

Each keyboard might have different pin configuration. And keeping this
here will trigger redefinition warning on keyboards that have PS2
defines.
---
 quantum/config_common.h | 46 -----------------------------------------
 1 file changed, 46 deletions(-)

diff --git a/quantum/config_common.h b/quantum/config_common.h
index 6b525fe1c64..21960f1a059 100644
--- a/quantum/config_common.h
+++ b/quantum/config_common.h
@@ -78,49 +78,3 @@
 #       error "USART configuration is needed."
 #   endif
 #endif
-
-/*
- * 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
-

From 17acde94ee2695ab69ea336742c904d649dce17c Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 14:02:38 +0700
Subject: [PATCH 085/147] Fix unterminated ifndef

---
 quantum/config_common.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/quantum/config_common.h b/quantum/config_common.h
index 21960f1a059..4d3939dae17 100644
--- a/quantum/config_common.h
+++ b/quantum/config_common.h
@@ -78,3 +78,5 @@
 #       error "USART configuration is needed."
 #   endif
 #endif
+
+#endif
\ No newline at end of file

From f837406ace5a3072e98f0bd0e3f4c84704762195 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 14:23:55 +0700
Subject: [PATCH 086/147] A few addition to PS2 documentation.

---
 readme.md | 146 +++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 118 insertions(+), 28 deletions(-)

diff --git a/readme.md b/readme.md
index 0157b907248..3eb67882ab5 100644
--- a/readme.md
+++ b/readme.md
@@ -1160,41 +1160,131 @@ Please note the USB port can only supply a limited amount of power to the keyboa
 ## 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.
-In order to do this you must first enable the option in your Makefile.
 
-    PS2_MOUSE_ENABLE = yes
+Then, decide whether to use USART (best), interrupts (better) or busywait (not recommended), and enable the relevant option.
 
-Then, decide whether to use interrupts (better if your microcontroller supports them) or busywait, and enable the relevant option.
+### Busywait version
 
-    PS2_USE_INT = yes
-    // PS2_USE_BUSYWAIT = yes
+Note: This is not recommended, you may encounter jerky movement or unsent inputs. Please use interrupt or USART version if possible.
 
-If you're using a teensy and have hooked up the clock on your PS/2 device to D1 and the data to D0, you're all set.
-Otherwise, you will need to update the following defines in your `config.h`:
-    
-    #define PS2_CLOCK_PORT  PORTD
-    #define PS2_CLOCK_PIN   PIND
-    #define PS2_CLOCK_DDR   DDRD
-    #define PS2_CLOCK_BIT   1
+In rules.mk:
 
-    #define PS2_DATA_PORT   PORTD
-    #define PS2_DATA_PIN    PIND
-    #define PS2_DATA_DDR    DDRD
-    #define PS2_DATA_BIT    0
+```
+PS2_MOUSE_ENABLE = yes
+PS2_USE_BUSYWAIT = yes
+```
 
-And with `PS2_USE_INT` also define these macros:
+In your keyboard config.h:
 
-    #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
+```
+#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
 

From d9d67e7b7686fdcbc7269a76d2a54c42325bdd03 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 15:26:02 +0700
Subject: [PATCH 087/147] add macro error when a required define is missing

---
 quantum/config_common.h | 118 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 118 insertions(+)

diff --git a/quantum/config_common.h b/quantum/config_common.h
index 4d3939dae17..0a2dba78ffd 100644
--- a/quantum/config_common.h
+++ b/quantum/config_common.h
@@ -79,4 +79,122 @@
 #   endif
 #endif
 
+#ifdef PS2_USE_BUSYWAIT
+#   ifndef PS2_CLOCK_PORT
+#       error "PS2_CLOCK_PORT has to be defined"
+#   endif
+#   ifndef PS2_CLOCK_PIN
+#       error "PS2_CLOCK_PIN has to be defined"
+#   endif
+#   ifndef PS2_CLOCK_DDR
+#       error "PS2_CLOCK_DDR has to be defined"
+#   endif
+#   ifndef PS2_CLOCK_BIT
+#       error "PS2_CLOCK_BIT has to be defined"
+#   endif
+#   ifndef PS2_DATA_PORT
+#       error "PS2_DATA_PORT has to be defined"
+#   endif
+#   ifndef PS2_DATA_PIN
+#       error "PS2_DATA_PIN has to be defined"
+#   endif
+#   ifndef PS2_DATA_DDR
+#       error "PS2_DATA_DDR has to be defined"
+#   endif
+#   ifndef PS2_DATA_BIT
+#       error "PS2_DATA_BIT has to be defined"
+#   endif
+#endif
+
+#ifdef PS2_USE_INT
+#   ifndef PS2_CLOCK_PORT
+#       error "PS2_CLOCK_PORT has to be defined"
+#   endif
+#   ifndef PS2_CLOCK_PIN
+#       error "PS2_CLOCK_PIN has to be defined"
+#   endif
+#   ifndef PS2_CLOCK_DDR
+#       error "PS2_CLOCK_DDR has to be defined"
+#   endif
+#   ifndef PS2_CLOCK_BIT
+#       error "PS2_CLOCK_BIT has to be defined"
+#   endif
+#   ifndef PS2_DATA_PORT
+#       error "PS2_DATA_PORT has to be defined"
+#   endif
+#   ifndef PS2_DATA_PIN
+#       error "PS2_DATA_PIN has to be defined"
+#   endif
+#   ifndef PS2_DATA_DDR
+#       error "PS2_DATA_DDR has to be defined"
+#   endif
+#   ifndef PS2_DATA_BIT
+#       error "PS2_DATA_BIT has to be defined"
+#   endif
+#   ifndef PS2_INT_INIT
+#       error "PS2_INT_INIT has to be defined"
+#   endif
+#   ifndef PS2_INT_ON
+#       error "PS2_INT_ON has to be defined"
+#   endif
+#   ifndef PS2_INT_OFF
+#       error "PS2_INT_OFF has to be defined"
+#   endif
+#   ifndef PS2_INT_VECT
+#       error "PS2_INT_VECT has to be defined"
+#   endif
+#endif
+
+#ifdef PS2_USE_USART
+#   ifndef PS2_CLOCK_PORT
+#       error "PS2_CLOCK_PORT has to be defined"
+#   endif
+#   ifndef PS2_CLOCK_PIN
+#       error "PS2_CLOCK_PIN has to be defined"
+#   endif
+#   ifndef PS2_CLOCK_DDR
+#       error "PS2_CLOCK_DDR has to be defined"
+#   endif
+#   ifndef PS2_CLOCK_BIT
+#       error "PS2_CLOCK_BIT has to be defined"
+#   endif
+#   ifndef PS2_DATA_PORT
+#       error "PS2_DATA_PORT has to be defined"
+#   endif
+#   ifndef PS2_DATA_PIN
+#       error "PS2_DATA_PIN has to be defined"
+#   endif
+#   ifndef PS2_DATA_DDR
+#       error "PS2_DATA_DDR has to be defined"
+#   endif
+#   ifndef PS2_DATA_BIT
+#       error "PS2_DATA_BIT has to be defined"
+#   endif
+#   ifndef PS2_USART_INIT
+#       error "PS2_USART_INIT has to be defined"
+#   endif
+#   ifndef PS2_USART_RX_INT_ON
+#       error "PS2_USART_RX_INT_ON has to be defined"
+#   endif
+#   ifndef PS2_USART_RX_POLL_ON
+#       error "PS2_USART_RX_POLL_ON has to be defined"
+#   endif
+#   ifndef PS2_USART_OFF
+#       error "PS2_USART_OFF has to be defined"
+#   endif
+#   ifndef PS2_USART_RX_READY
+#       error "PS2_USART_RX_READY has to be defined"
+#   endif
+#   ifndef PS2_USART_RX_DATA
+#       error "PS2_USART_RX_DATA has to be defined"
+#   endif
+#   ifndef PS2_USART_ERROR
+#       error "PS2_USART_ERROR has to be defined"
+#   endif
+#   ifndef PS2_USART_RX_VECT
+#       error "PS2_USART_RX_VECT has to be defined"
+#   endif
+#endif
+
+
 #endif
\ No newline at end of file

From f2214ce1cb6cfe7a0efabe870a2c00fb8451ee80 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 15:57:48 +0700
Subject: [PATCH 088/147] remove define checks. didn't work because of include
 ordering.

---
 quantum/config_common.h | 118 ----------------------------------------
 1 file changed, 118 deletions(-)

diff --git a/quantum/config_common.h b/quantum/config_common.h
index 0a2dba78ffd..4d3939dae17 100644
--- a/quantum/config_common.h
+++ b/quantum/config_common.h
@@ -79,122 +79,4 @@
 #   endif
 #endif
 
-#ifdef PS2_USE_BUSYWAIT
-#   ifndef PS2_CLOCK_PORT
-#       error "PS2_CLOCK_PORT has to be defined"
-#   endif
-#   ifndef PS2_CLOCK_PIN
-#       error "PS2_CLOCK_PIN has to be defined"
-#   endif
-#   ifndef PS2_CLOCK_DDR
-#       error "PS2_CLOCK_DDR has to be defined"
-#   endif
-#   ifndef PS2_CLOCK_BIT
-#       error "PS2_CLOCK_BIT has to be defined"
-#   endif
-#   ifndef PS2_DATA_PORT
-#       error "PS2_DATA_PORT has to be defined"
-#   endif
-#   ifndef PS2_DATA_PIN
-#       error "PS2_DATA_PIN has to be defined"
-#   endif
-#   ifndef PS2_DATA_DDR
-#       error "PS2_DATA_DDR has to be defined"
-#   endif
-#   ifndef PS2_DATA_BIT
-#       error "PS2_DATA_BIT has to be defined"
-#   endif
-#endif
-
-#ifdef PS2_USE_INT
-#   ifndef PS2_CLOCK_PORT
-#       error "PS2_CLOCK_PORT has to be defined"
-#   endif
-#   ifndef PS2_CLOCK_PIN
-#       error "PS2_CLOCK_PIN has to be defined"
-#   endif
-#   ifndef PS2_CLOCK_DDR
-#       error "PS2_CLOCK_DDR has to be defined"
-#   endif
-#   ifndef PS2_CLOCK_BIT
-#       error "PS2_CLOCK_BIT has to be defined"
-#   endif
-#   ifndef PS2_DATA_PORT
-#       error "PS2_DATA_PORT has to be defined"
-#   endif
-#   ifndef PS2_DATA_PIN
-#       error "PS2_DATA_PIN has to be defined"
-#   endif
-#   ifndef PS2_DATA_DDR
-#       error "PS2_DATA_DDR has to be defined"
-#   endif
-#   ifndef PS2_DATA_BIT
-#       error "PS2_DATA_BIT has to be defined"
-#   endif
-#   ifndef PS2_INT_INIT
-#       error "PS2_INT_INIT has to be defined"
-#   endif
-#   ifndef PS2_INT_ON
-#       error "PS2_INT_ON has to be defined"
-#   endif
-#   ifndef PS2_INT_OFF
-#       error "PS2_INT_OFF has to be defined"
-#   endif
-#   ifndef PS2_INT_VECT
-#       error "PS2_INT_VECT has to be defined"
-#   endif
-#endif
-
-#ifdef PS2_USE_USART
-#   ifndef PS2_CLOCK_PORT
-#       error "PS2_CLOCK_PORT has to be defined"
-#   endif
-#   ifndef PS2_CLOCK_PIN
-#       error "PS2_CLOCK_PIN has to be defined"
-#   endif
-#   ifndef PS2_CLOCK_DDR
-#       error "PS2_CLOCK_DDR has to be defined"
-#   endif
-#   ifndef PS2_CLOCK_BIT
-#       error "PS2_CLOCK_BIT has to be defined"
-#   endif
-#   ifndef PS2_DATA_PORT
-#       error "PS2_DATA_PORT has to be defined"
-#   endif
-#   ifndef PS2_DATA_PIN
-#       error "PS2_DATA_PIN has to be defined"
-#   endif
-#   ifndef PS2_DATA_DDR
-#       error "PS2_DATA_DDR has to be defined"
-#   endif
-#   ifndef PS2_DATA_BIT
-#       error "PS2_DATA_BIT has to be defined"
-#   endif
-#   ifndef PS2_USART_INIT
-#       error "PS2_USART_INIT has to be defined"
-#   endif
-#   ifndef PS2_USART_RX_INT_ON
-#       error "PS2_USART_RX_INT_ON has to be defined"
-#   endif
-#   ifndef PS2_USART_RX_POLL_ON
-#       error "PS2_USART_RX_POLL_ON has to be defined"
-#   endif
-#   ifndef PS2_USART_OFF
-#       error "PS2_USART_OFF has to be defined"
-#   endif
-#   ifndef PS2_USART_RX_READY
-#       error "PS2_USART_RX_READY has to be defined"
-#   endif
-#   ifndef PS2_USART_RX_DATA
-#       error "PS2_USART_RX_DATA has to be defined"
-#   endif
-#   ifndef PS2_USART_ERROR
-#       error "PS2_USART_ERROR has to be defined"
-#   endif
-#   ifndef PS2_USART_RX_VECT
-#       error "PS2_USART_RX_VECT has to be defined"
-#   endif
-#endif
-
-
 #endif
\ No newline at end of file

From 8ee389c9b6e6757c228534b095e609d5a9501102 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 13:11:40 +0700
Subject: [PATCH 089/147] My Promethium keyboard firmware

---
 keyboards/handwired/promethium/Makefile       |   3 +
 keyboards/handwired/promethium/config.h       | 164 ++++
 .../promethium/keymaps/priyadi/Makefile       |  28 +
 .../promethium/keymaps/priyadi/config.h       |  17 +
 .../promethium/keymaps/priyadi/flash.sh       |   3 +
 .../promethium/keymaps/priyadi/keymap.c       | 725 ++++++++++++++++++
 .../promethium/keymaps/priyadi/readme.md      |   0
 .../handwired/promethium/keymaps/readme.md    |  22 +
 keyboards/handwired/promethium/promethium.c   |   6 +
 keyboards/handwired/promethium/promethium.h   |  99 +++
 keyboards/handwired/promethium/readme.md      |  12 +
 keyboards/handwired/promethium/rgbsps.c       |  24 +
 keyboards/handwired/promethium/rgbsps.h       |   4 +
 keyboards/handwired/promethium/rules.mk       |  75 ++
 14 files changed, 1182 insertions(+)
 create mode 100644 keyboards/handwired/promethium/Makefile
 create mode 100644 keyboards/handwired/promethium/config.h
 create mode 100644 keyboards/handwired/promethium/keymaps/priyadi/Makefile
 create mode 100644 keyboards/handwired/promethium/keymaps/priyadi/config.h
 create mode 100755 keyboards/handwired/promethium/keymaps/priyadi/flash.sh
 create mode 100644 keyboards/handwired/promethium/keymaps/priyadi/keymap.c
 create mode 100644 keyboards/handwired/promethium/keymaps/priyadi/readme.md
 create mode 100644 keyboards/handwired/promethium/keymaps/readme.md
 create mode 100644 keyboards/handwired/promethium/promethium.c
 create mode 100644 keyboards/handwired/promethium/promethium.h
 create mode 100644 keyboards/handwired/promethium/readme.md
 create mode 100644 keyboards/handwired/promethium/rgbsps.c
 create mode 100644 keyboards/handwired/promethium/rgbsps.h
 create mode 100644 keyboards/handwired/promethium/rules.mk

diff --git a/keyboards/handwired/promethium/Makefile b/keyboards/handwired/promethium/Makefile
new file mode 100644
index 00000000000..191c6bb664d
--- /dev/null
+++ b/keyboards/handwired/promethium/Makefile
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+	include ../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/handwired/promethium/config.h b/keyboards/handwired/promethium/config.h
new file mode 100644
index 00000000000..5a2afe6abd3
--- /dev/null
+++ b/keyboards/handwired/promethium/config.h
@@ -0,0 +1,164 @@
+/*
+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
+#if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)
+/* 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
+
+
+#endif
diff --git a/keyboards/handwired/promethium/keymaps/priyadi/Makefile b/keyboards/handwired/promethium/keymaps/priyadi/Makefile
new file mode 100644
index 00000000000..2f6f27a7320
--- /dev/null
+++ b/keyboards/handwired/promethium/keymaps/priyadi/Makefile
@@ -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
index 00000000000..8b78c0dc4fb
--- /dev/null
+++ b/keyboards/handwired/promethium/keymaps/priyadi/config.h
@@ -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
index 00000000000..fb81a54ee08
--- /dev/null
+++ b/keyboards/handwired/promethium/keymaps/priyadi/flash.sh
@@ -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
index 00000000000..b2da2f97b78
--- /dev/null
+++ b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
@@ -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
index 00000000000..e69de29bb2d
diff --git a/keyboards/handwired/promethium/keymaps/readme.md b/keyboards/handwired/promethium/keymaps/readme.md
new file mode 100644
index 00000000000..527691389ed
--- /dev/null
+++ b/keyboards/handwired/promethium/keymaps/readme.md
@@ -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
index 00000000000..a0035cce1aa
--- /dev/null
+++ b/keyboards/handwired/promethium/promethium.c
@@ -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
index 00000000000..fb0dc168306
--- /dev/null
+++ b/keyboards/handwired/promethium/promethium.h
@@ -0,0 +1,99 @@
+#ifndef PROMETHIUM_H
+#define PROMETHIUM_H
+
+#include "quantum.h"
+
+#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
index 00000000000..64e2c3a16a6
--- /dev/null
+++ b/keyboards/handwired/promethium/readme.md
@@ -0,0 +1,12 @@
+Promethium Keyboard Firmware
+============================
+A handwired Planck based keyboard using the Adafruit Feather 32u4 Bluefruit LE controller.
+
+Features:
+
+* Single piece split form factor
+* Vertical staggered
+* Trackpoint
+* Bluetooth LE *TBD*
+* Battery
+* Per switch RGB LED
\ No newline at end of file
diff --git a/keyboards/handwired/promethium/rgbsps.c b/keyboards/handwired/promethium/rgbsps.c
new file mode 100644
index 00000000000..ea922ec3fde
--- /dev/null
+++ b/keyboards/handwired/promethium/rgbsps.c
@@ -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
index 00000000000..6da197f75dd
--- /dev/null
+++ b/keyboards/handwired/promethium/rgbsps.h
@@ -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
index 00000000000..835b13c4f38
--- /dev/null
+++ b/keyboards/handwired/promethium/rules.mk
@@ -0,0 +1,75 @@
+
+# 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
+
+include $(TMK_DIR)/protocol.mk
+SRC += $(QUANTUM_DIR)/light_ws2812.c
+SRC += rgbsps.c
\ No newline at end of file

From b5019bef055d3b3a90b8b42268b9ad874600782b Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 13:44:50 +0700
Subject: [PATCH 090/147] change init delay to 2000ms

---
 keyboards/handwired/promethium/promethium.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/keyboards/handwired/promethium/promethium.h b/keyboards/handwired/promethium/promethium.h
index fb0dc168306..8f2a8c3be2f 100644
--- a/keyboards/handwired/promethium/promethium.h
+++ b/keyboards/handwired/promethium/promethium.h
@@ -3,6 +3,8 @@
 
 #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, \

From 7f3c9c6a395a921d2914fc5cac1ac8f9441c33eb Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 13:46:05 +0700
Subject: [PATCH 091/147] protocols.mk is already included in latest QMK

---
 keyboards/handwired/promethium/rules.mk | 1 -
 1 file changed, 1 deletion(-)

diff --git a/keyboards/handwired/promethium/rules.mk b/keyboards/handwired/promethium/rules.mk
index 835b13c4f38..0842780cce2 100644
--- a/keyboards/handwired/promethium/rules.mk
+++ b/keyboards/handwired/promethium/rules.mk
@@ -70,6 +70,5 @@ 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
 
-include $(TMK_DIR)/protocol.mk
 SRC += $(QUANTUM_DIR)/light_ws2812.c
 SRC += rgbsps.c
\ No newline at end of file

From 0f39ab52192c0e34f0aea5ff6bb1fa2ded427b6e Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 13:47:03 +0700
Subject: [PATCH 092/147] remove ifdef on chip type

---
 keyboards/handwired/promethium/config.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/keyboards/handwired/promethium/config.h b/keyboards/handwired/promethium/config.h
index 5a2afe6abd3..473af67d34d 100644
--- a/keyboards/handwired/promethium/config.h
+++ b/keyboards/handwired/promethium/config.h
@@ -116,7 +116,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* PS/2 mouse USART version */
 #ifdef PS2_USE_USART
-#if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)
 /* XCK for clock line and RXD for data line */
 #define PS2_CLOCK_PORT  PORTD
 #define PS2_CLOCK_PIN   PIND
@@ -158,7 +157,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PS2_USART_ERROR         (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1)))
 #define PS2_USART_RX_VECT       USART1_RX_vect
 #endif
-#endif
 
 
 #endif

From 6fee7e178f7c949213a124d78de60bc30267d367 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sat, 26 Nov 2016 23:53:15 +0700
Subject: [PATCH 093/147] fix strict-prototypes warning

---
 quantum/process_keycode/process_unicode.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/quantum/process_keycode/process_unicode.h b/quantum/process_keycode/process_unicode.h
index 065eeb5f6a8..f17cfa6cf24 100644
--- a/quantum/process_keycode/process_unicode.h
+++ b/quantum/process_keycode/process_unicode.h
@@ -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
 

From a182cbc0319d54122e12dfa48e782e8e122c7df6 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sun, 27 Nov 2016 00:34:29 +0700
Subject: [PATCH 094/147] Update Unicode documentation

---
 readme.md | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/readme.md b/readme.md
index 3eb67882ab5..cd65e0e69ec 100644
--- a/readme.md
+++ b/readme.md
@@ -911,7 +911,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
 

From 12c1314b024b0e24dc561d8f8816561a4ca8ff42 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sun, 27 Nov 2016 00:40:31 +0700
Subject: [PATCH 095/147] update docs

---
 keyboards/handwired/promethium/readme.md | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/keyboards/handwired/promethium/readme.md b/keyboards/handwired/promethium/readme.md
index 64e2c3a16a6..e63d2f1add7 100644
--- a/keyboards/handwired/promethium/readme.md
+++ b/keyboards/handwired/promethium/readme.md
@@ -5,8 +5,9 @@ A handwired Planck based keyboard using the Adafruit Feather 32u4 Bluefruit LE c
 Features:
 
 * Single piece split form factor
-* Vertical staggered
+* Columnar stagger
 * Trackpoint
 * Bluetooth LE *TBD*
 * Battery
-* Per switch RGB LED
\ No newline at end of file
+* Per switch RGB LED
+* Proximity sensor for energy conservation *TBD*
\ No newline at end of file

From 7edac212c8ed8442bf4207e70dc8194631b2bf27 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Sat, 26 Nov 2016 15:37:46 -0500
Subject: [PATCH 096/147] separated into api files/folder

---
 build_keyboard.mk                          |   8 +
 common.mk                                  |   1 +
 keyboards/ergodox/keymaps/jack/keymap.c    |   2 +-
 keyboards/ergodox/rules.mk                 |   1 -
 keyboards/planck/rules.mk                  |   1 +
 keyboards/preonic/keymaps/default/Makefile |  22 ---
 keyboards/preonic/rules.mk                 |   3 +-
 quantum/api.c                              | 178 ++++++++++++++++++
 quantum/api.h                              |  59 ++++++
 quantum/api/api_sysex.c                    |  29 +++
 quantum/api/api_sysex.h                    |  10 +
 quantum/quantum.c                          |   6 +-
 quantum/quantum.h                          |   2 +-
 tmk_core/protocol/lufa/lufa.c              | 203 +--------------------
 tmk_core/protocol/lufa/lufa.h              |  61 +------
 15 files changed, 303 insertions(+), 283 deletions(-)
 create mode 100644 quantum/api.c
 create mode 100644 quantum/api.h
 create mode 100644 quantum/api/api_sysex.c
 create mode 100644 quantum/api/api_sysex.h

diff --git a/build_keyboard.mk b/build_keyboard.mk
index 42f8f8ac7b5..c1e55400390 100644
--- a/build_keyboard.mk
+++ b/build_keyboard.mk
@@ -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
diff --git a/common.mk b/common.mk
index 18751cd5ac8..c4b9394a24f 100644
--- a/common.mk
+++ b/common.mk
@@ -23,4 +23,5 @@ COMMON_VPATH += $(QUANTUM_PATH)
 COMMON_VPATH += $(QUANTUM_PATH)/keymap_extras
 COMMON_VPATH += $(QUANTUM_PATH)/audio
 COMMON_VPATH += $(QUANTUM_PATH)/process_keycode
+COMMON_VPATH += $(QUANTUM_PATH)/api
 COMMON_VPATH += $(SERIAL_PATH)
\ No newline at end of file
diff --git a/keyboards/ergodox/keymaps/jack/keymap.c b/keyboards/ergodox/keymaps/jack/keymap.c
index eb41f121275..9cb80c59d12 100644
--- a/keyboards/ergodox/keymaps/jack/keymap.c
+++ b/keyboards/ergodox/keymaps/jack/keymap.c
@@ -91,7 +91,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
         break;
         case 2:
         if (record->event.pressed) { // For resetting EEPROM
-          send_unicode_midi(0x0CA0);
+          api_send_unicode(0x0CA0);
         }
         break;
       }
diff --git a/keyboards/ergodox/rules.mk b/keyboards/ergodox/rules.mk
index add64ec76fd..2e501e81b2e 100644
--- a/keyboards/ergodox/rules.mk
+++ b/keyboards/ergodox/rules.mk
@@ -24,6 +24,5 @@ COMMAND_ENABLE   ?= yes # Commands for debug and configuration
 CUSTOM_MATRIX    ?= yes # Custom matrix file for the ErgoDox EZ
 SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend
 NKRO_ENABLE      ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-MIDI_ENABLE      ?= no  # MIDI controls
 UNICODE_ENABLE   ?= yes # Unicode
 ONEHAND_ENABLE   ?= yes # Allow swapping hands of keyboard
diff --git a/keyboards/planck/rules.mk b/keyboards/planck/rules.mk
index 25db53a315e..ccee972715a 100644
--- a/keyboards/planck/rules.mk
+++ b/keyboards/planck/rules.mk
@@ -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
diff --git a/keyboards/preonic/keymaps/default/Makefile b/keyboards/preonic/keymaps/default/Makefile
index 581e08cd02a..3d4659ceb9a 100644
--- a/keyboards/preonic/keymaps/default/Makefile
+++ b/keyboards/preonic/keymaps/default/Makefile
@@ -1,25 +1,3 @@
-
-
-# Build Options
-#   change to "no" to disable the options, or define them in the Makefile in 
-#   the appropriate keymap folder that will get included automatically
-#
-BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
-CONSOLE_ENABLE = no         # Console for debug(+400)
-COMMAND_ENABLE = yes        # Commands for debug and configuration
-NKRO_ENABLE = yes            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality
-MIDI_ENABLE = no            # MIDI controls
-AUDIO_ENABLE = yes           # Audio output on port C6
-UNICODE_ENABLE = no         # Unicode
-BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
-
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
-
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
 endif
\ No newline at end of file
diff --git a/keyboards/preonic/rules.mk b/keyboards/preonic/rules.mk
index d0f3a3a1c08..c4ce2aacca8 100644
--- a/keyboards/preonic/rules.mk
+++ b/keyboards/preonic/rules.mk
@@ -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
diff --git a/quantum/api.c b/quantum/api.c
new file mode 100644
index 00000000000..4ca3b96762d
--- /dev/null
+++ b/quantum/api.c
@@ -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
index 00000000000..00dcdb8954b
--- /dev/null
+++ b/quantum/api.h
@@ -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
index 00000000000..a4a554e7645
--- /dev/null
+++ b/quantum/api/api_sysex.c
@@ -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
index 00000000000..b947b60e542
--- /dev/null
+++ b/quantum/api/api_sysex.h
@@ -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
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 8372a7adc51..f653564a67d 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -847,12 +847,12 @@ void send_nibble(uint8_t number) {
     }
 }
 
-void send_unicode_midi(uint32_t unicode) {
-  #ifdef MIDI_ENABLE
+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
+#endif
 }
 
 __attribute__ ((weak))
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 316da15b9ab..e6adf974aba 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -119,6 +119,6 @@ void send_nibble(uint8_t number);
 void led_set_user(uint8_t usb_led);
 void led_set_kb(uint8_t usb_led);
 
-void send_unicode_midi(uint32_t unicode);
+void api_send_unicode(uint32_t unicode);
 
 #endif
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index aa2e781c80e..39d4824b6b9 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -1091,37 +1091,17 @@ void fallthrough_callback(MidiDevice * device,
 #endif
 }
 
-#ifdef RGB_MIDI
-    rgblight_config_t rgblight_config;
-#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);
-    #ifdef RGB_MIDI
-        rgblight_config.raw = eeconfig_read_rgblight();
-        switch (num) {
-            case 14:
-                rgblight_config.hue = val * 360 / 127;
-            break;
-            case 15:
-                rgblight_config.sat = val << 1;
-            break;
-            case 16:
-                rgblight_config.val = val << 1;
-            break;
-        }
-        rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
-    #endif
 }
 
 uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0};
 
 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));
-    // if (start == 0x27) {
+    #ifdef API_SYSEX_ENABLE
         // SEND_STRING("\n");
         // send_word(start);
         // SEND_STRING(": ");
@@ -1136,190 +1116,13 @@ void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t
                 // }
                 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);
-                sysex_buffer_callback(device, decode_length, decoded);
+                process_api(decode_length, decoded);
             }
             // SEND_STRING(" ");
             data++;
         }
-    // }
-
+    #endif
 }
 
-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];
-}
-
-void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint8_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(" ");
-    // }
-}
-
-__attribute__ ((weak))
-bool sysex_process_quantum(uint8_t length, uint8_t * data) {
-    return sysex_process_keyboard(length, data);
-}
-
-__attribute__ ((weak))
-bool sysex_process_keyboard(uint8_t length, uint8_t * data) {
-    return sysex_process_user(length, data);
-}
-
-__attribute__ ((weak))
-bool sysex_process_user(uint8_t length, uint8_t * data) {
-    return true;
-}
-
-void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data) {
-    // SEND_STRING("\nRX: ");
-    // for (uint8_t i = 0; i < length; i++) {
-    //     send_byte(data[i]);
-    //     SEND_STRING(" ");
-    // }
-    if (!sysex_process_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;
-                }
-                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_sysex(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
-    }
-
-}
 
 #endif
diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h
index 0962dda8d8d..b11854101d4 100644
--- a/tmk_core/protocol/lufa/lufa.h
+++ b/tmk_core/protocol/lufa/lufa.h
@@ -68,64 +68,17 @@ typedef struct {
 } __attribute__ ((packed)) report_extra_t;
 
 #ifdef MIDI_ENABLE
-  #define MIDI_SYSEX_BUFFER 16 
   void MIDI_Task(void);
   MidiDevice midi_device;
+  #define MIDI_SYSEX_BUFFER 32 
+#endif
 
-  void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data);
-  void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data);
-  void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint8_t length);
-  void dword_to_bytes(uint32_t dword, uint8_t * bytes);
-  uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index);
-
-  __attribute__ ((weak))
-  bool sysex_process_quantum(uint8_t length, uint8_t * data);
-
-  __attribute__ ((weak))
-  bool sysex_process_keyboard(uint8_t length, uint8_t * data);
-
-  __attribute__ ((weak))
-  bool sysex_process_user(uint8_t length, uint8_t * data);
-
-  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,
-
-  };
-
-
-  #define MT_GET_DATA(data_type, data, length) send_bytes_sysex(MT_GET_DATA, data_type, data, length)
-  #define MT_GET_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_GET_DATA_ACK, data_type, data, length)
-  #define MT_SET_DATA(data_type, data, length) send_bytes_sysex(MT_SET_DATA, data_type, data, length)
-  #define MT_SET_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_SET_DATA_ACK, data_type, data, length)
-  #define MT_SEND_DATA(data_type, data, length) send_bytes_sysex(MT_SEND_DATA, data_type, data, length)
-  #define MT_SEND_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_SEND_DATA_ACK, data_type, data, length)
-  #define MT_EXE_ACTION(data_type, data, length) send_bytes_sysex(MT_EXE_ACTION, data_type, data, length)
-  #define MT_EXE_ACTION_ACK(data_type, data, length) send_bytes_sysex(MT_EXE_ACTION_ACK, data_type, data, length)
+#ifdef API_ENABLE
+  #include "api.h"
+#endif
 
+#ifdef API_SYSEX_ENABLE
+  #include "api_sysex.h"
 #endif
 
 // #if LUFA_VERSION_INTEGER < 0x120730

From be4e75423a232d9d328bb23835e0fa5152292c95 Mon Sep 17 00:00:00 2001
From: Wez Furlong <wez@fb.com>
Date: Sun, 27 Nov 2016 22:41:22 -0800
Subject: [PATCH 097/147] Tidy up atomicity in timer.c and ring_buffer.h

Adopt the macros for saving/restoring the interrupt state
that are provided by the avr gcc environment.

Removing intialization of the timer value; this shaves off
a few bytes because globals are default initialized to zero.
---
 tmk_core/common/avr/timer.c | 36 ++++++++++++++++--------------------
 tmk_core/ring_buffer.h      | 26 ++++++++++++--------------
 2 files changed, 28 insertions(+), 34 deletions(-)

diff --git a/tmk_core/common/avr/timer.c b/tmk_core/common/avr/timer.c
index 292b41c3a6c..84af4448853 100644
--- a/tmk_core/common/avr/timer.c
+++ b/tmk_core/common/avr/timer.c
@@ -17,6 +17,7 @@ along with this program.  If not, see <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);
 }
diff --git a/tmk_core/ring_buffer.h b/tmk_core/ring_buffer.h
index 7bdebbcf34f..005d1be6133 100644
--- a/tmk_core/ring_buffer.h
+++ b/tmk_core/ring_buffer.h
@@ -4,13 +4,13 @@
  * Ring buffer to store scan codes from keyboard
  *------------------------------------------------------------------*/
 #define RBUF_SIZE 32
+#include <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 */

From 8485bb34d2e291db5b6c81f892850da1cdca37ba Mon Sep 17 00:00:00 2001
From: Wez Furlong <wez@fb.com>
Date: Sun, 27 Nov 2016 22:43:11 -0800
Subject: [PATCH 098/147] Add arduino-alike GPIO pin control helpers

Unlike the arduino functions, these don't take abstract pin numbers,
they take pin labels like `B0`.  Also, rather than taking very
generic parameter names, these take slightly more descriptive
enum values.

These improve the clarity of code that would otherwise be inscrutable
bit manipulation in tersely named port register names.
---
 quantum/pincontrol.h | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)
 create mode 100644 quantum/pincontrol.h

diff --git a/quantum/pincontrol.h b/quantum/pincontrol.h
new file mode 100644
index 00000000000..36ce29ef220
--- /dev/null
+++ b/quantum/pincontrol.h
@@ -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);
+}

From 712476cd288505cabb2ad6163d1c1ba13a7a1cca Mon Sep 17 00:00:00 2001
From: Wez Furlong <wez@fb.com>
Date: Sun, 27 Nov 2016 22:48:04 -0800
Subject: [PATCH 099/147] Add support for Adafruit BLE modules

This implements some helper functions that allow sending key reports
to an SPI based Bluetooth Low Energy module, such as the Adafruit
Feather 32u4 Bluefruit LE.

There is some plumbing required in lufa.c to enable this; that
is in a follow-on commit.
---
 tmk_core/common.mk                      |   6 +-
 tmk_core/protocol/lufa.mk               |   4 +
 tmk_core/protocol/lufa/adafruit_ble.cpp | 805 ++++++++++++++++++++++++
 tmk_core/protocol/lufa/adafruit_ble.h   |  60 ++
 tmk_core/protocol/lufa/ringbuffer.hpp   |  66 ++
 5 files changed, 940 insertions(+), 1 deletion(-)
 create mode 100644 tmk_core/protocol/lufa/adafruit_ble.cpp
 create mode 100644 tmk_core/protocol/lufa/adafruit_ble.h
 create mode 100644 tmk_core/protocol/lufa/ringbuffer.hpp

diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index f826a7b540b..c32a12bb6fd 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -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
diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk
index 5b1e3d19d01..151d26cbc80 100644
--- a/tmk_core/protocol/lufa.mk
+++ b/tmk_core/protocol/lufa.mk
@@ -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
index 00000000000..37194e77a98
--- /dev/null
+++ b/tmk_core/protocol/lufa/adafruit_ble.cpp
@@ -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
index 00000000000..351fd55ae92
--- /dev/null
+++ b/tmk_core/protocol/lufa/adafruit_ble.h
@@ -0,0 +1,60 @@
+/* Bluetooth Low Energy Protocol for QMK.
+ * Author: Wez Furlong, 2016
+ * Supports the Adafruit BLE board built around the nRF51822 chip.
+ */
+#pragma once
+#ifdef 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
diff --git a/tmk_core/protocol/lufa/ringbuffer.hpp b/tmk_core/protocol/lufa/ringbuffer.hpp
new file mode 100644
index 00000000000..70a3c4881d9
--- /dev/null
+++ b/tmk_core/protocol/lufa/ringbuffer.hpp
@@ -0,0 +1,66 @@
+#pragma once
+// A simple ringbuffer holding Size elements of type T
+template <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);
+  }
+};

From e26a80508f2247d27e431a7415df1ff3405f598a Mon Sep 17 00:00:00 2001
From: Olivier <olivier@gid0.org>
Date: Mon, 28 Nov 2016 11:20:00 +0100
Subject: [PATCH 100/147] Reorganize the numeric keypad layer more like a
 traditional numeric keypad.

---
 keyboards/ergodox/keymaps/bepo/bepo.png | Bin 80838 -> 80249 bytes
 keyboards/ergodox/keymaps/bepo/keymap.c |  24 ++++++++++++------------
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/keyboards/ergodox/keymaps/bepo/bepo.png b/keyboards/ergodox/keymaps/bepo/bepo.png
index bde2e2cfacb326e7934c5743aea2f303c8a42527..54992f5ae54c6c38b29221a78c45224af611573f 100644
GIT binary patch
literal 80249
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
bo?k4vBG|Zx;Uvdj_)BfS#=c}#WAFb1kA(g2

literal 80838
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

diff --git a/keyboards/ergodox/keymaps/bepo/keymap.c b/keyboards/ergodox/keymaps/bepo/keymap.c
index ae8047ab59a..c1a8ae21d9f 100644
--- a/keyboards/ergodox/keymaps/bepo/keymap.c
+++ b/keyboards/ergodox/keymaps/bepo/keymap.c
@@ -201,18 +201,18 @@ KC_TRNS,	KC_TRNS,	KC_NO),
 /* Keymap 5: numeric 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  |   .  |      |      |
+ *   |      |      |      |      |      |             |      |      |      |      |      |             |   0  |  00  |   .  | Enter|      |
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
  *                                             |      |      |      |      |      |      |      |
- *                                             |      |      |------|      |------|      | Enter|
+ *                                             |      |      |------|      |------|      |      |
  *                                             |      |      |      |      |      |      |      |
  *                                             `--------------------'      `--------------------'
  */
@@ -227,14 +227,14 @@ KC_NO,		KC_NO,		KC_TRNS,	KC_TRNS,	KC_TRNS,
 																KC_TRNS,
 												KC_NO,		KC_TRNS,	KC_TRNS,
 // 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_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_KP_ENTER)
+KC_TRNS,	KC_TRNS,	KC_TRNS)
 };
 
 const uint16_t PROGMEM fn_actions[] = {

From 3f1fca2eb8078cdfbf576d6d4168de8e6ae1c2f6 Mon Sep 17 00:00:00 2001
From: Olivier <olivier@gid0.org>
Date: Mon, 28 Nov 2016 11:21:23 +0100
Subject: [PATCH 101/147] Adjust comment.

---
 keyboards/ergodox/keymaps/bepo/readme.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/keyboards/ergodox/keymaps/bepo/readme.md b/keyboards/ergodox/keymaps/bepo/readme.md
index 207b6757158..51a50698513 100644
--- a/keyboards/ergodox/keymaps/bepo/readme.md
+++ b/keyboards/ergodox/keymaps/bepo/readme.md
@@ -23,7 +23,7 @@ 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".
 

From 2d0ada01902a0103dc4f4f54a416f0666c641b5b Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Mon, 28 Nov 2016 07:55:02 -0500
Subject: [PATCH 102/147] Pulls LED config into common config for EZ

---
 keyboards/ergodox/ez/config.h                        | 11 +++++++++++
 keyboards/ergodox/keymaps/erez_experimental/config.h | 10 ----------
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/keyboards/ergodox/ez/config.h b/keyboards/ergodox/ez/config.h
index 67a856e511c..0b7e8b2ee17 100644
--- a/keyboards/ergodox/ez/config.h
+++ b/keyboards/ergodox/ez/config.h
@@ -45,6 +45,17 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Set 0 if debouncing isn't needed */
 #define DEBOUNCE    5
 
+/* 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
+
 /*
  * Feature disable options
  *  These options are also useful to firmware size reduction.
diff --git a/keyboards/ergodox/keymaps/erez_experimental/config.h b/keyboards/ergodox/keymaps/erez_experimental/config.h
index fbd12ab7976..4da18c65aab 100644
--- a/keyboards/ergodox/keymaps/erez_experimental/config.h
+++ b/keyboards/ergodox/keymaps/erez_experimental/config.h
@@ -9,15 +9,5 @@
 #undef LEADER_TIMEOUT
 #define LEADER_TIMEOUT 300
  
-/* 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

From 9caf866618840ca38f4ceb1166ad679174c752c3 Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Mon, 28 Nov 2016 07:59:01 -0500
Subject: [PATCH 103/147] Tweaks EZ Makefile

---
 keyboards/ergodox/ez/Makefile | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/keyboards/ergodox/ez/Makefile b/keyboards/ergodox/ez/Makefile
index 191c6bb664d..9b6121e2c21 100644
--- a/keyboards/ergodox/ez/Makefile
+++ b/keyboards/ergodox/ez/Makefile
@@ -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

From d2b6438e391743544d437ca8c2998de6ab631894 Mon Sep 17 00:00:00 2001
From: Olivier <olivier@gid0.org>
Date: Mon, 28 Nov 2016 14:10:31 +0100
Subject: [PATCH 104/147] A little cleanup, add some comments, change others.

---
 keyboards/ergodox/keymaps/bepo/keymap.c | 42 ++++++++++---------------
 1 file changed, 16 insertions(+), 26 deletions(-)

diff --git a/keyboards/ergodox/keymaps/bepo/keymap.c b/keyboards/ergodox/keymaps/bepo/keymap.c
index c1a8ae21d9f..8f068e238d6 100644
--- a/keyboards/ergodox/keymaps/bepo/keymap.c
+++ b/keyboards/ergodox/keymaps/bepo/keymap.c
@@ -1,19 +1,19 @@
 #include "ergodox.h"
-#include "debug.h"
-#include "action_layer.h"
 #include "keymap_bepo.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
+// keymaps
+#define BASE 0	// default layer, for bepo compatible systems
+#define QWER 1	// bepo to qwerty base compat layer, for qwerty systems
+#define SQWER 2	// bepo with shift key to qwerty compat layer
+#define AQWER 3	// bepo with altgr key to qwerty compat layer
+#define FNAV 4	// function / navigation / mouse layer
+#define NUM 5	// numeric keypad layer
 
-#define KP_00 0
+// 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|   @  |   +  |   -  |   /  |   *  |   =    |
@@ -50,7 +50,7 @@ KC_ESC,		KC_INS,		KC_LGUI,	KC_LCTL,	KC_LALT,
 DF(QWER),	DF(BASE),
 MO(NUM),
 MO(FNAV),	KC_RSHIFT,	KC_ENTER),
-/* Keymap 1: QWERTY system compatibility layer
+/* Keymap 1: bepo to qwerty base compat layer
  *
  * ,--------------------------------------------------.                                  ,--------------------------------------------------.
  * |   $    |   "  |   <  |   >  |   (  |   )  |Delete|                                  |ScroLo|   @  |   +  |   -  |   /  |   *  |   =    |
@@ -87,7 +87,7 @@ KC_ESC,		KC_INS,		KC_LGUI,	KC_LCTL,	KC_LALT,
 DF(QWER),	DF(BASE),
 MO(NUM),
 MO(FNAV),	MO(SQWER),	KC_ENTER),
-/* Keymap 2: QWERTY shifted system compatibility layer
+/* Keymap 2: bepo with shift key to qwerty compat layer
  *
  * ,--------------------------------------------------.                                  ,--------------------------------------------------.
  * |   #    |   1  |   2  |   3  |   4  |   5  |Delete|                                  |ScroLo|   6  |   7  |   8  |   9  |   0  |   =    |
@@ -124,7 +124,7 @@ 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),
-/* Keymap 3: QWERTY alted system compatibility layer
+/* Keymap 3: bepo with altgr key to qwerty compat layer
  *
  * ,--------------------------------------------------.                                  ,--------------------------------------------------.
  * |   $    |   "  |   <  |   >  |   [  |   ]  |Delete|                                  |ScroLo|   @  |   +  |   -  |   /  |   *  |   =    |
@@ -161,7 +161,7 @@ KC_ESC,		KC_INS,		KC_LGUI,	KC_LCTL,	KC_LALT,
 KC_TRNS,	KC_TRNS,
 MO(NUM),
 MO(FNAV),	MO(SQWER),	KC_ENTER),
-/* Keymap 4: function / navigation layer
+/* Keymap 4: function / navigation / mouse layer
  *
  * ,--------------------------------------------------.                                  ,--------------------------------------------------.
  * |        |  F1  |  F2  |  F3  |  F4  |  F5  |VolMut|                                  |      |  F6  |  F7  |  F8  |  F9  |  F10 |        |
@@ -198,7 +198,7 @@ KC_NO,		KC_NO,		KC_TRNS,	KC_TRNS,	KC_TRNS,
 KC_TRNS,	KC_TRNS,
 KC_TRNS,
 KC_TRNS,	KC_TRNS,	KC_NO),
-/* Keymap 5: numeric layer, sends keypad codes
+/* Keymap 5: numeric keypad layer, sends keypad codes
  *
  * ,--------------------------------------------------.                                  ,--------------------------------------------------.
  * |        |      |      |      |      |      |      |                                  |      |      | NumLo|   /  |   *  |   -  |        |
@@ -237,12 +237,10 @@ 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)
 {
   switch(id) {
+    // keypad "double 0"
     case KP_00:
       if (record->event.pressed) {
         return MACRO( T(KP_0), D(KP_0), END );
@@ -253,11 +251,3 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
   }
   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) {
-};

From 84735836e309fe9e2c45ed991a58820ae2bb9123 Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Mon, 28 Nov 2016 08:13:32 -0500
Subject: [PATCH 105/147] Tweaks position of TOG not to conflict with MO

---
 keyboards/ergodox/keymaps/erez_experimental/keymap.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/keyboards/ergodox/keymaps/erez_experimental/keymap.c b/keyboards/ergodox/keymaps/erez_experimental/keymap.c
index 0c0e3c4e39e..2963c40e319 100644
--- a/keyboards/ergodox/keymaps/erez_experimental/keymap.c
+++ b/keyboards/ergodox/keymaps/erez_experimental/keymap.c
@@ -71,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  *   |      |      |      |NxtTab|PrvTab|                                       |      |      |      |      |      |
  *   `----------------------------------'                                       `----------------------------------'
  *                                        ,-------------.       ,-------------.
- *                                        |      |      |       |      |      |
+ *                                        |      |      |       |TOG   |
  *                                 ,------|------|------|       |------+------+------.
  *                                 |VAI   |VAD   |HUI   |       |SAI   |TOG   |MOD   |
  *                                 |      |      |------|       |------|      |      |
@@ -95,9 +95,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                 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,
+       RGB_TOG, KC_TRNS,
        RGB_SAI,
-       RGB_SAD, RGB_TOG, RGB_MOD
+       RGB_SAD, KC_TRNS, RGB_MOD
 ),
 /* Keymap 2: Media and mouse keys
  *

From f02eccbb29ee6a8cf421895dcef2e55a76c1bdcb Mon Sep 17 00:00:00 2001
From: Olivier <olivier@gid0.org>
Date: Mon, 28 Nov 2016 14:16:42 +0100
Subject: [PATCH 106/147] Change layer names (cosmetic change) and reorder them
 so that the "shift" layer can be accessed from the "alt" layer when in QWERTY
 compat mode.

---
 keyboards/ergodox/keymaps/bepo/keymap.c | 124 ++++++++++++------------
 1 file changed, 62 insertions(+), 62 deletions(-)

diff --git a/keyboards/ergodox/keymaps/bepo/keymap.c b/keyboards/ergodox/keymaps/bepo/keymap.c
index 8f068e238d6..c19ab0d48da 100644
--- a/keyboards/ergodox/keymaps/bepo/keymap.c
+++ b/keyboards/ergodox/keymaps/bepo/keymap.c
@@ -2,12 +2,12 @@
 #include "keymap_bepo.h"
 
 // keymaps
-#define BASE 0	// default layer, for bepo compatible systems
-#define QWER 1	// bepo to qwerty base compat layer, for qwerty systems
-#define SQWER 2	// bepo with shift key to qwerty compat layer
-#define AQWER 3	// bepo with altgr key to qwerty compat layer
+#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 FNAV 4	// function / navigation / mouse layer
-#define NUM 5	// numeric keypad layer
+#define NUMK 5	// numeric keypad layer
 
 // macros
 #define KP_00 0	// keypad "double 0"
@@ -26,20 +26,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
  *   |Escape|Insert|LSuper| LCtrl|  LAlt|             | BEPO |QWERTY|      |AZERTY| BEPO |             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
- *                                             |      |      | L_Num|      | L_Num|      |      |
+ *                                             |      |      |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,
 KC_ESC,		KC_INS,		KC_LGUI,	KC_LCTL,	KC_LALT,
-														DF(BASE),	DF(QWER),
-																MO(NUM),
+														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,
@@ -47,8 +47,8 @@ KC_ESC,		KC_INS,		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,
-DF(QWER),	DF(BASE),
-MO(NUM),
+DF(QW_B),	DF(BEPO),
+MO(NUMK),
 MO(FNAV),	KC_RSHIFT,	KC_ENTER),
 /* Keymap 1: bepo to qwerty base compat layer
  *
@@ -63,31 +63,68 @@ MO(FNAV),	KC_RSHIFT,	KC_ENTER),
  * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
  *   |Escape|Insert|LSuper| LCtrl|  LAlt|             | BEPO |QWERTY|      |AZERTY| BEPO |             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
- *                                             |      |      | L_Num|      | 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_ESC,		KC_INS,		KC_LGUI,	KC_LCTL,	KC_LALT,
-														DF(BASE),	DF(QWER),
-																MO(NUM),
-												KC_SPC,		MO(SQWER),	MO(FNAV),
+														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,
-DF(QWER),	DF(BASE),
-MO(NUM),
-MO(FNAV),	MO(SQWER),	KC_ENTER),
-/* Keymap 2: bepo with shift key to qwerty compat layer
+								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,
+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,12 +137,12 @@ MO(FNAV),	MO(SQWER),	KC_ENTER),
  * `--------+------+------+------+------+-------------,-------------.      ,-------------`-------------+------+------+------+------+--------'
  *   |Escape|Insert|LSuper| LCtrl|  LAlt|             | BEPO |QWERTY|      |AZERTY| BEPO |             | AltGr| RCtrl|RSuper|PrntSc| Pause|
  *   `----------------------------------'      ,------|------|------|      |------+------+------.      `----------------------------------'
- *                                             |      |      | L_Num|      | 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,
@@ -124,43 +161,6 @@ 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),
-/* Keymap 3: 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_Num|      | L_Num|      |      |
- *                                             |   _  |LShift|------|      |------|RShift|Enter |
- *                                             |      |      |L_FNav|      |L_FNav|      |      |
- *                                             `--------------------'      `--------------------'
- */
-[AQWER] = 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,
-																MO(NUM),
-												KC_UNDS,	MO(SQWER),	MO(FNAV),
-// 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,
-MO(NUM),
-MO(FNAV),	MO(SQWER),	KC_ENTER),
 /* Keymap 4: function / navigation / mouse layer
  *
  * ,--------------------------------------------------.                                  ,--------------------------------------------------.
@@ -216,7 +216,7 @@ KC_TRNS,	KC_TRNS,	KC_NO),
  *                                             |      |      |      |      |      |      |      |
  *                                             `--------------------'      `--------------------'
  */
-[NUM] = 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,
@@ -234,7 +234,7 @@ KC_NO,		KC_NO,		KC_TRNS,	KC_TRNS,	KC_TRNS,
 								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_TRNS)
+KC_TRNS,	KC_TRNS,	KC_NO)
 };
 
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)

From 5a2501d90fb9d2ea1a60d42dfd664d899865e6b5 Mon Sep 17 00:00:00 2001
From: Olivier <olivier@gid0.org>
Date: Mon, 28 Nov 2016 16:38:03 +0100
Subject: [PATCH 107/147] Add the AZERTY compatibility layer.

---
 keyboards/ergodox/keymaps/bepo/keymap.c  | 125 ++++++++++++++++++++++-
 keyboards/ergodox/keymaps/bepo/readme.md |   4 +-
 2 files changed, 122 insertions(+), 7 deletions(-)

diff --git a/keyboards/ergodox/keymaps/bepo/keymap.c b/keyboards/ergodox/keymaps/bepo/keymap.c
index c19ab0d48da..05250ee6a77 100644
--- a/keyboards/ergodox/keymaps/bepo/keymap.c
+++ b/keyboards/ergodox/keymaps/bepo/keymap.c
@@ -1,13 +1,17 @@
 #include "ergodox.h"
 #include "keymap_bepo.h"
+#include "keymap_french.h"
 
 // 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 FNAV 4	// function / navigation / mouse layer
-#define NUMK 5	// numeric keypad 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
 
 // macros
 #define KP_00 0	// keypad "double 0"
@@ -47,7 +51,7 @@ KC_ESC,		KC_INS,		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,
-DF(QW_B),	DF(BEPO),
+DF(AZ_B),	DF(BEPO),
 MO(NUMK),
 MO(FNAV),	KC_RSHIFT,	KC_ENTER),
 /* Keymap 1: bepo to qwerty base compat layer
@@ -161,7 +165,118 @@ 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),
-/* Keymap 4: function / navigation / mouse 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_grav| trem |   €  |   ,  |------|                                  |------|   c  |   t  |   s  |   r  |   n  |   m    |
+ * |--------+------+------+------+------+------|  Tab |                                  | NumLo|------+------+------+------+------+--------|
+ * |   /    |   \  |   {  |   }  |   .  |   ~  |      |                                  |      |   '  |   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|      |      |
+ *                                             `--------------------'      `--------------------'
+ */
+[AZ_A] = KEYMAP(
+// Left hand
+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,	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_TRNS,	KC_TRNS,
+KC_TRNS,
+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 |        |
@@ -198,7 +313,7 @@ KC_NO,		KC_NO,		KC_TRNS,	KC_TRNS,	KC_TRNS,
 KC_TRNS,	KC_TRNS,
 KC_TRNS,
 KC_TRNS,	KC_TRNS,	KC_NO),
-/* Keymap 5: numeric keypad layer, sends keypad codes
+/* Keymap 8: numeric keypad layer, sends keypad codes
  *
  * ,--------------------------------------------------.                                  ,--------------------------------------------------.
  * |        |      |      |      |      |      |      |                                  |      |      | NumLo|   /  |   *  |   -  |        |
diff --git a/keyboards/ergodox/keymaps/bepo/readme.md b/keyboards/ergodox/keymaps/bepo/readme.md
index 51a50698513..2959ac82989 100644
--- a/keyboards/ergodox/keymaps/bepo/readme.md
+++ b/keyboards/ergodox/keymaps/bepo/readme.md
@@ -27,8 +27,8 @@ Touche de fonction permettant de saisir les touches F1 à F12, les touches F1 à
 
 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".
 
-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.
+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>

From 06f18e95d4670a055ca349da7d653e0bcb37d83a Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Tue, 29 Nov 2016 00:06:12 -0500
Subject: [PATCH 108/147] enable api sysex for ez

---
 keyboards/ergodox/ez/rules.mk | 1 +
 1 file changed, 1 insertion(+)

diff --git a/keyboards/ergodox/ez/rules.mk b/keyboards/ergodox/ez/rules.mk
index a9715beb857..f570061fe4f 100644
--- a/keyboards/ergodox/ez/rules.mk
+++ b/keyboards/ergodox/ez/rules.mk
@@ -72,6 +72,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=512
 #
 
 SLEEP_LED_ENABLE = no
+API_SYSEX_ENABLE ?= yes
 
 ifndef QUANTUM_DIR
 	include ../../../Makefile

From d0cefef946660865dae80877886fcce610920a27 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Tue, 29 Nov 2016 00:09:56 -0500
Subject: [PATCH 109/147] enable rgblight by default for ez

---
 keyboards/ergodox/ez/config.h | 11 +++++++++++
 keyboards/ergodox/ez/rules.mk |  1 +
 2 files changed, 12 insertions(+)

diff --git a/keyboards/ergodox/ez/config.h b/keyboards/ergodox/ez/config.h
index 67a856e511c..c2750a321f0 100644
--- a/keyboards/ergodox/ez/config.h
+++ b/keyboards/ergodox/ez/config.h
@@ -41,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
diff --git a/keyboards/ergodox/ez/rules.mk b/keyboards/ergodox/ez/rules.mk
index f570061fe4f..893cfa7a848 100644
--- a/keyboards/ergodox/ez/rules.mk
+++ b/keyboards/ergodox/ez/rules.mk
@@ -73,6 +73,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=512
 
 SLEEP_LED_ENABLE = no
 API_SYSEX_ENABLE ?= yes
+RGBLIGHT_ENABLE ?= yes
 
 ifndef QUANTUM_DIR
 	include ../../../Makefile

From f946d830f98da0161753d37da9659caa7469cf4f Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Tue, 29 Nov 2016 00:11:11 -0500
Subject: [PATCH 110/147] guess i didnt pull

---
 keyboards/ergodox/ez/config.h | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/keyboards/ergodox/ez/config.h b/keyboards/ergodox/ez/config.h
index f3e1020bdbb..c2750a321f0 100644
--- a/keyboards/ergodox/ez/config.h
+++ b/keyboards/ergodox/ez/config.h
@@ -56,17 +56,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Set 0 if debouncing isn't needed */
 #define DEBOUNCE    5
 
-/* 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
-
 /*
  * Feature disable options
  *  These options are also useful to firmware size reduction.

From 4094544d41450617bc21ab58646603b8964eae0e Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Tue, 29 Nov 2016 09:23:16 -0500
Subject: [PATCH 111/147] Test layout for ErgoDox EZ manufacturing robot

---
 .../keymaps/robot_test_layout/keymap.c        | 130 ++++++++++++++++++
 .../keymaps/robot_test_layout/readme.md       |   5 +
 quantum/rgblight.c                            |   6 +
 quantum/rgblight.h                            |   2 +
 4 files changed, 143 insertions(+)
 create mode 100644 keyboards/ergodox/keymaps/robot_test_layout/keymap.c
 create mode 100644 keyboards/ergodox/keymaps/robot_test_layout/readme.md

diff --git a/keyboards/ergodox/keymaps/robot_test_layout/keymap.c b/keyboards/ergodox/keymaps/robot_test_layout/keymap.c
new file mode 100644
index 00000000000..0363eedc2b7
--- /dev/null
+++ b/keyboards/ergodox/keymaps/robot_test_layout/keymap.c
@@ -0,0 +1,130 @@
+#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
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0] = KEYMAP(
+    RGB_TOGGLE,RGB_FF0000,RGB_00FF00,RGB_0000FF,RGB_FFFFFF,RGB_TOGGLE,KC_6,
+    KC_A,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_E,KC_A,KC_A,KC_S,KC_D,KC_F,KC_G,KC_A,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_L,KC_Z,KC_QUOTE,KC_N,KC_U,KC_C,KC_E,KC_8,KC_9,KC_Y,KC_COMMA,KC_6,KC_7,KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINUS,KC_J,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_BSLASH,KC_H,KC_J,KC_K,KC_L,KC_J,KC_K,KC_Z,KC_N,KC_M,KC_COMMA,KC_DOT,KC_E,KC_QUOTE,KC_8,KC_7,KC_LBRACKET,KC_RBRACKET,KC_H,KC_9,KC_7,KC_8,KC_7,KC_6,KC_9),
+};
+
+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 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_A); unregister_code(KC_A);
+        #endif
+      }
+      return false;
+      break;
+    case RGB_00FF00:
+      if (record->event.pressed) {
+        #ifdef RGBLIGHT_ENABLE
+          EZ_RGB(0x00ff00);
+          register_code(KC_B); unregister_code(KC_B);
+        #endif
+      }
+      return false;
+      break;
+    case RGB_0000FF:
+      if (record->event.pressed) {
+        #ifdef RGBLIGHT_ENABLE
+          EZ_RGB(0x0000ff);
+          register_code(KC_C); unregister_code(KC_C);
+        #endif
+      }
+      return false;
+      break;
+    case RGB_FFFFFF:
+      if (record->event.pressed) {
+        #ifdef RGBLIGHT_ENABLE
+          EZ_RGB(0xffffff);
+          register_code(KC_D); unregister_code(KC_D);
+        #endif
+      }
+      return false;
+      break;
+    case RGB_TOGGLE:
+      if (record->event.pressed) {
+        #ifdef RGBLIGHT_ENABLE
+          rgblight_toggle();
+          register_code(KC_F); unregister_code(KC_F);
+        #endif
+      }
+      return false;
+      break;
+  }
+  return true;
+}
+
+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/readme.md b/keyboards/ergodox/keymaps/robot_test_layout/readme.md
new file mode 100644
index 00000000000..45dc2aa76cf
--- /dev/null
+++ b/keyboards/ergodox/keymaps/robot_test_layout/readme.md
@@ -0,0 +1,5 @@
+# Robot test layout
+
+Use this layout if you like to pretend you're [Norman](https://www.youtube.com/watch?v=-sbxFBay-tg), the ErgoDox EZ manufacturing robot.
+
+It's really meant just for internal use, but we're posting it on GitHub anyway, because hurray to open source. :)
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index bb03d6e9138..625971e0fe6 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -425,6 +425,12 @@ void rgblight_timer_toggle(void) {
   dprintf("TIMER3 toggled.\n");
 }
 
+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
diff --git a/quantum/rgblight.h b/quantum/rgblight.h
index 28a410e480d..aa1d026e0e6 100644
--- a/quantum/rgblight.h
+++ b/quantum/rgblight.h
@@ -84,6 +84,8 @@ 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);
 

From fe001d46fd06924bb81fe8d506f5be8894db3df0 Mon Sep 17 00:00:00 2001
From: Wilba6582 <Jason.S.Wiliams@gmail.com>
Date: Mon, 28 Nov 2016 18:31:16 +1100
Subject: [PATCH 112/147] Initial version of Raw HID interface

---
 keyboards/planck/planck.c           | 16 ++++-
 keyboards/planck/rules.mk           |  3 +-
 tmk_core/common.mk                  |  4 ++
 tmk_core/common/raw_hid.h           |  8 +++
 tmk_core/protocol/lufa/descriptor.c | 87 +++++++++++++++++++++++++-
 tmk_core/protocol/lufa/descriptor.h | 39 +++++++++---
 tmk_core/protocol/lufa/lufa.c       | 94 +++++++++++++++++++++++++++++
 7 files changed, 239 insertions(+), 12 deletions(-)
 create mode 100644 tmk_core/common/raw_hid.h

diff --git a/keyboards/planck/planck.c b/keyboards/planck/planck.c
index 645b450d1db..0d37b662236 100644
--- a/keyboards/planck/planck.c
+++ b/keyboards/planck/planck.c
@@ -1,5 +1,8 @@
 #include "planck.h"
 
+#include "raw_hid.h"
+#include "keymap.h"
+
 #ifdef ONEHAND_ENABLE
 __attribute__ ((weak))
 const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
@@ -16,4 +19,15 @@ void matrix_init_kb(void) {
 	PORTE |= (1<<6);
 
 	matrix_init_user();
-}
\ No newline at end of file
+}
+
+#ifdef RAW_ENABLE
+
+void raw_hid_receive( uint8_t *data, uint8_t length )
+{
+	// Basic test of Raw HID
+	// Echo back data received
+	raw_hid_send( data, length );
+}
+
+#endif
diff --git a/keyboards/planck/rules.mk b/keyboards/planck/rules.mk
index ccee972715a..4874d92b9fd 100644
--- a/keyboards/planck/rules.mk
+++ b/keyboards/planck/rules.mk
@@ -62,7 +62,8 @@ 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
+API_SYSEX_ENABLE = no
+RAW_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
diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index f826a7b540b..d65f02f12bb 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -50,6 +50,10 @@ ifeq ($(strip $(EXTRAKEY_ENABLE)), yes)
     TMK_COMMON_DEFS += -DEXTRAKEY_ENABLE
 endif
 
+ifeq ($(strip $(RAW_ENABLE)), yes)
+    TMK_COMMON_DEFS += -DRAW_ENABLE
+endif
+
 ifeq ($(strip $(CONSOLE_ENABLE)), yes)
     TMK_COMMON_DEFS += -DCONSOLE_ENABLE
 else
diff --git a/tmk_core/common/raw_hid.h b/tmk_core/common/raw_hid.h
new file mode 100644
index 00000000000..86da02fd155
--- /dev/null
+++ b/tmk_core/common/raw_hid.h
@@ -0,0 +1,8 @@
+#ifndef _RAW_HID_H_
+#define _RAW_HID_H_
+
+void raw_hid_receive( uint8_t *data, uint8_t length );
+
+void raw_hid_send( uint8_t *data, uint8_t length );
+
+#endif
diff --git a/tmk_core/protocol/lufa/descriptor.c b/tmk_core/protocol/lufa/descriptor.c
index 6f2407f5805..bf47787d296 100644
--- a/tmk_core/protocol/lufa/descriptor.c
+++ b/tmk_core/protocol/lufa/descriptor.c
@@ -164,6 +164,28 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] =
 };
 #endif
 
+#ifdef RAW_ENABLE
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM RawReport[] =
+{
+    HID_RI_USAGE_PAGE(16, 0xFF60), /* Vendor Page 0xFF60 */
+    HID_RI_USAGE(8, 0x61), /* Vendor Usage 0x61 */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_USAGE(8, 0x62), /* Vendor Usage 0x62 */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
+        HID_RI_REPORT_COUNT(8, RAW_EPSIZE),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+        HID_RI_USAGE(8, 0x63), /* Vendor Usage 0x63 */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
+        HID_RI_REPORT_COUNT(8, RAW_EPSIZE),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
+    HID_RI_END_COLLECTION(0),
+};
+#endif
+
 #ifdef CONSOLE_ENABLE
 const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] =
 {
@@ -399,6 +421,58 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
         },
 #endif
 
+		/*
+	     * Raw
+	     */
+	#ifdef RAW_ENABLE
+	    .Raw_Interface =
+	        {
+	            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+	            .InterfaceNumber        = RAW_INTERFACE,
+	            .AlternateSetting       = 0x00,
+
+	            .TotalEndpoints         = 2,
+
+	            .Class                  = HID_CSCP_HIDClass,
+	            .SubClass               = HID_CSCP_NonBootSubclass,
+	            .Protocol               = HID_CSCP_NonBootProtocol,
+
+	            .InterfaceStrIndex      = NO_DESCRIPTOR
+	        },
+
+	    .Raw_HID =
+	        {
+	            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+	            .HIDSpec                = VERSION_BCD(1,1,1),
+	            .CountryCode            = 0x00,
+	            .TotalReportDescriptors = 1,
+	            .HIDReportType          = HID_DTYPE_Report,
+	            .HIDReportLength        = sizeof(RawReport)
+	        },
+
+	    .Raw_INEndpoint =
+	        {
+	            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+	            .EndpointAddress        = (ENDPOINT_DIR_IN | RAW_IN_EPNUM),
+	            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+	            .EndpointSize           = RAW_EPSIZE,
+	            .PollingIntervalMS      = 0x01
+	        },
+
+	    .Raw_OUTEndpoint =
+	        {
+	            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+	            .EndpointAddress        = (ENDPOINT_DIR_OUT | RAW_OUT_EPNUM),
+	            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+	            .EndpointSize           = RAW_EPSIZE,
+	            .PollingIntervalMS      = 0x01
+	        },
+	#endif
+
     /*
      * Console
      */
@@ -754,7 +828,6 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
                     .PollingIntervalMS      = 0x05
             },
 #endif
-
 };
 
 
@@ -846,6 +919,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                 Size    = sizeof(USB_HID_Descriptor_HID_t);
                 break;
 #endif
+#ifdef RAW_ENABLE
+            case RAW_INTERFACE:
+                Address = &ConfigurationDescriptor.Raw_HID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
+#endif
 #ifdef CONSOLE_ENABLE
             case CONSOLE_INTERFACE:
                 Address = &ConfigurationDescriptor.Console_HID;
@@ -878,6 +957,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                 Size    = sizeof(ExtrakeyReport);
                 break;
 #endif
+#ifdef RAW_ENABLE
+            case RAW_INTERFACE:
+                Address = &RawReport;
+                Size    = sizeof(RawReport);
+                break;
+#endif
 #ifdef CONSOLE_ENABLE
             case CONSOLE_INTERFACE:
                 Address = &ConsoleReport;
diff --git a/tmk_core/protocol/lufa/descriptor.h b/tmk_core/protocol/lufa/descriptor.h
index c6c94e36184..24ce420e6ac 100644
--- a/tmk_core/protocol/lufa/descriptor.h
+++ b/tmk_core/protocol/lufa/descriptor.h
@@ -71,6 +71,14 @@ typedef struct
     USB_Descriptor_Endpoint_t             Extrakey_INEndpoint;
 #endif
 
+#ifdef RAW_ENABLE
+    // Raw HID Interface
+    USB_Descriptor_Interface_t            Raw_Interface;
+    USB_HID_Descriptor_HID_t              Raw_HID;
+    USB_Descriptor_Endpoint_t             Raw_INEndpoint;
+    USB_Descriptor_Endpoint_t             Raw_OUTEndpoint;
+#endif
+
 #ifdef CONSOLE_ENABLE
     // Console HID Interface
     USB_Descriptor_Interface_t            Console_Interface;
@@ -137,10 +145,16 @@ typedef struct
 #   define EXTRAKEY_INTERFACE       MOUSE_INTERFACE
 #endif
 
-#ifdef CONSOLE_ENABLE
-#   define CONSOLE_INTERFACE        (EXTRAKEY_INTERFACE + 1)
+#ifdef RAW_ENABLE
+#   define RAW_INTERFACE        	(EXTRAKEY_INTERFACE + 1)
 #else
-#   define CONSOLE_INTERFACE        EXTRAKEY_INTERFACE
+#   define RAW_INTERFACE        	EXTRAKEY_INTERFACE
+#endif
+
+#ifdef CONSOLE_ENABLE
+#   define CONSOLE_INTERFACE        (RAW_INTERFACE + 1)
+#else
+#   define CONSOLE_INTERFACE        RAW_INTERFACE
 #endif
 
 #ifdef NKRO_ENABLE
@@ -182,12 +196,19 @@ typedef struct
 #   define EXTRAKEY_IN_EPNUM        MOUSE_IN_EPNUM
 #endif
 
-#ifdef CONSOLE_ENABLE
-#   define CONSOLE_IN_EPNUM         (EXTRAKEY_IN_EPNUM + 1)
-#   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 1)
-//#   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 2)
+#ifdef RAW_ENABLE
+#   define RAW_IN_EPNUM         (EXTRAKEY_IN_EPNUM + 1)
+#   define RAW_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 2)
 #else
-#   define CONSOLE_OUT_EPNUM        EXTRAKEY_IN_EPNUM
+#   define RAW_OUT_EPNUM        EXTRAKEY_IN_EPNUM
+#endif
+
+#ifdef CONSOLE_ENABLE
+#   define CONSOLE_IN_EPNUM         (RAW_OUT_EPNUM + 1)
+//#   define CONSOLE_OUT_EPNUM        (RAW_OUT_EPNUM + 2)
+#   define CONSOLE_OUT_EPNUM        (RAW_OUT_EPNUM + 1)
+#else
+#   define CONSOLE_OUT_EPNUM        RAW_OUT_EPNUM
 #endif
 
 #ifdef NKRO_ENABLE
@@ -217,7 +238,6 @@ typedef struct
 #   define CDC_OUT_EPNUM	MIDI_STREAM_OUT_EPNUM
 #endif
 
-
 #if defined(__AVR_ATmega32U2__) && CDC_OUT_EPNUM > 4
 # error "Endpoints are not available enough to support all functions. Remove some in Makefile.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL)"
 #endif
@@ -225,6 +245,7 @@ typedef struct
 #define KEYBOARD_EPSIZE             8
 #define MOUSE_EPSIZE                8
 #define EXTRAKEY_EPSIZE             8
+#define RAW_EPSIZE              	32
 #define CONSOLE_EPSIZE              32
 #define NKRO_EPSIZE                 32
 #define MIDI_STREAM_EPSIZE          64
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 39d4824b6b9..aeb5f078153 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -80,6 +80,10 @@
   #include "sysex_tools.h"
 #endif
 
+#ifdef RAW_ENABLE
+	#include "raw_hid.h"
+#endif
+
 uint8_t keyboard_idle = 0;
 /* 0: Boot Protocol, 1: Report Protocol(default) */
 uint8_t keyboard_protocol = 1;
@@ -175,6 +179,80 @@ USB_ClassInfo_CDC_Device_t cdc_device =
 };
 #endif
 
+#ifdef RAW_ENABLE
+
+void raw_hid_send( uint8_t *data, uint8_t length )
+{
+	// TODO: implement variable size packet
+	if ( length != RAW_EPSIZE )
+	{
+		return;
+	}
+
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	{
+		return;
+	}
+
+	// TODO: decide if we allow calls to raw_hid_send() in the middle
+	// of other endpoint usage.
+	uint8_t ep = Endpoint_GetCurrentEndpoint();
+
+	Endpoint_SelectEndpoint(RAW_IN_EPNUM);
+
+	// Check to see if the host is ready to accept another packet
+	if (Endpoint_IsINReady())
+	{
+		// Write data
+		Endpoint_Write_Stream_LE(data, RAW_EPSIZE, NULL);
+		// Finalize the stream transfer to send the last packet
+		Endpoint_ClearIN();
+	}
+
+	Endpoint_SelectEndpoint(ep);
+}
+
+__attribute__ ((weak))
+void raw_hid_receive( uint8_t *data, uint8_t length )
+{
+	// Users should #include "raw_hid.h" in their own code
+	// and implement this function there. Leave this as weak linkage
+	// so users can opt to not handle data coming in.
+}
+
+static void raw_hid_task(void)
+{
+	// Create a temporary buffer to hold the read in data from the host
+	uint8_t data[RAW_EPSIZE];
+	bool data_read = false;
+
+	// Device must be connected and configured for the task to run
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	return;
+
+	Endpoint_SelectEndpoint(RAW_OUT_EPNUM);
+
+	// Check to see if a packet has been sent from the host
+	if (Endpoint_IsOUTReceived())
+	{
+		// Check to see if the packet contains data
+		if (Endpoint_IsReadWriteAllowed())
+		{
+			/* Read data */
+			Endpoint_Read_Stream_LE(data, sizeof(data), NULL);
+			data_read = true;
+		}
+
+		// Finalize the stream transfer to receive the last packet
+		Endpoint_ClearOUT();
+
+		if ( data_read )
+		{
+			raw_hid_receive( data, sizeof(data) );
+		}
+	}
+}
+#endif
 
 /*******************************************************************************
  * Console
@@ -294,6 +372,8 @@ void EVENT_USB_Device_WakeUp()
 #endif
 }
 
+
+
 #ifdef CONSOLE_ENABLE
 static bool console_flush = false;
 #define CONSOLE_FLUSH_SET(b)   do { \
@@ -311,6 +391,7 @@ void EVENT_USB_Device_StartOfFrame(void)
     Console_Task();
     console_flush = false;
 }
+
 #endif
 
 /** Event handler for the USB_ConfigurationChanged event.
@@ -339,6 +420,14 @@ void EVENT_USB_Device_ConfigurationChanged(void)
                                      EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE);
 #endif
 
+#ifdef RAW_ENABLE
+    /* Setup Raw HID Report Endpoints */
+    ConfigSuccess &= ENDPOINT_CONFIG(RAW_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+									 RAW_EPSIZE, ENDPOINT_BANK_SINGLE);
+    ConfigSuccess &= ENDPOINT_CONFIG(RAW_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
+									 RAW_EPSIZE, ENDPOINT_BANK_SINGLE);
+#endif
+
 #ifdef CONSOLE_ENABLE
     /* Setup Console HID Report Endpoints */
     ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
@@ -1064,9 +1153,14 @@ int main(void)
         CDC_Device_USBTask(&cdc_device);
 #endif
 
+#ifdef RAW_ENABLE
+        raw_hid_task();
+#endif
+
 #if !defined(INTERRUPT_CONTROL_ENDPOINT)
         USB_USBTask();
 #endif
+
     }
 }
 

From 66b13a66e93c50ba6258fcde548ab946fd8db683 Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Wed, 30 Nov 2016 22:22:57 -0500
Subject: [PATCH 113/147] Better layout

---
 .../keymaps/robot_test_layout/keymap.c        | 121 ++++++++++--------
 1 file changed, 71 insertions(+), 50 deletions(-)

diff --git a/keyboards/ergodox/keymaps/robot_test_layout/keymap.c b/keyboards/ergodox/keymaps/robot_test_layout/keymap.c
index 0363eedc2b7..480be177f09 100644
--- a/keyboards/ergodox/keymaps/robot_test_layout/keymap.c
+++ b/keyboards/ergodox/keymaps/robot_test_layout/keymap.c
@@ -9,16 +9,42 @@ enum custom_keycodes {
   RGB_00FF00,
   RGB_0000FF,
   RGB_FFFFFF,
-  RGB_TOGGLE
+  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,RGB_TOGGLE,KC_6,
-    KC_A,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_E,KC_A,KC_A,KC_S,KC_D,KC_F,KC_G,KC_A,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_L,KC_Z,KC_QUOTE,KC_N,KC_U,KC_C,KC_E,KC_8,KC_9,KC_Y,KC_COMMA,KC_6,KC_7,KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINUS,KC_J,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_BSLASH,KC_H,KC_J,KC_K,KC_L,KC_J,KC_K,KC_Z,KC_N,KC_M,KC_COMMA,KC_DOT,KC_E,KC_QUOTE,KC_8,KC_7,KC_LBRACKET,KC_RBRACKET,KC_H,KC_9,KC_7,KC_8,KC_7,KC_6,KC_9),
+        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)
 };
@@ -35,7 +61,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
     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.
@@ -43,7 +69,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
       if (record->event.pressed) {
         #ifdef RGBLIGHT_ENABLE
           EZ_RGB(0xff0000);
-          register_code(KC_A); unregister_code(KC_A);
+          register_code(KC_1); unregister_code(KC_1);
         #endif
       }
       return false;
@@ -52,7 +78,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
       if (record->event.pressed) {
         #ifdef RGBLIGHT_ENABLE
           EZ_RGB(0x00ff00);
-          register_code(KC_B); unregister_code(KC_B);
+          register_code(KC_2); unregister_code(KC_2);
         #endif
       }
       return false;
@@ -61,7 +87,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
       if (record->event.pressed) {
         #ifdef RGBLIGHT_ENABLE
           EZ_RGB(0x0000ff);
-          register_code(KC_C); unregister_code(KC_C);
+          register_code(KC_3); unregister_code(KC_3);
         #endif
       }
       return false;
@@ -70,7 +96,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
       if (record->event.pressed) {
         #ifdef RGBLIGHT_ENABLE
           EZ_RGB(0xffffff);
-          register_code(KC_D); unregister_code(KC_D);
+          register_code(KC_4); unregister_code(KC_4);
         #endif
       }
       return false;
@@ -79,52 +105,47 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
       if (record->event.pressed) {
         #ifdef RGBLIGHT_ENABLE
           rgblight_toggle();
-          register_code(KC_F); unregister_code(KC_F);
+          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;
 }
-
-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;
-    }
-
-};

From 1f290f6213c7c3bf001a85242cfae4f9b5a14942 Mon Sep 17 00:00:00 2001
From: cbbrowne <cbbrowne@cbbrowne.tor.int-afilias.info>
Date: Thu, 1 Dec 2016 16:21:15 -0500
Subject: [PATCH 114/147] Make my builds smaller

---
 keyboards/planck/keymaps/cbbrowne/Makefile | 7 ++++---
 keyboards/planck/keymaps/cbbrowne/config.h | 3 +++
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/keyboards/planck/keymaps/cbbrowne/Makefile b/keyboards/planck/keymaps/cbbrowne/Makefile
index 581e08cd02a..3c20da84bea 100644
--- a/keyboards/planck/keymaps/cbbrowne/Makefile
+++ b/keyboards/planck/keymaps/cbbrowne/Makefile
@@ -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 = no
 
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
-endif
\ No newline at end of file
+endif
diff --git a/keyboards/planck/keymaps/cbbrowne/config.h b/keyboards/planck/keymaps/cbbrowne/config.h
index 1e04ba61d7a..bd15fd5a22a 100644
--- a/keyboards/planck/keymaps/cbbrowne/config.h
+++ b/keyboards/planck/keymaps/cbbrowne/config.h
@@ -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

From b787ed9dc6c81f47215c48d47240717afa3cd440 Mon Sep 17 00:00:00 2001
From: cbbrowne <cbbrowne@cbbrowne.tor.int-afilias.info>
Date: Thu, 1 Dec 2016 16:24:03 -0500
Subject: [PATCH 115/147] More notes on .hex size protection

---
 readme.md | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/readme.md b/readme.md
index a92ae4c1dc0..5c82efcdddb 100644
--- a/readme.md
+++ b/readme.md
@@ -1318,14 +1318,27 @@ 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
 - 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.

From af4c44deef55a300113b4a65f8d3ab37bf2ef97d Mon Sep 17 00:00:00 2001
From: cbbrowne <cbbrowne@cbbrowne.tor.int-afilias.info>
Date: Thu, 1 Dec 2016 16:31:30 -0500
Subject: [PATCH 116/147] Improve docs on SYSEX bit

---
 keyboards/planck/keymaps/cbbrowne/Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/keyboards/planck/keymaps/cbbrowne/Makefile b/keyboards/planck/keymaps/cbbrowne/Makefile
index 3c20da84bea..b1c70ace70e 100644
--- a/keyboards/planck/keymaps/cbbrowne/Makefile
+++ b/keyboards/planck/keymaps/cbbrowne/Makefile
@@ -16,7 +16,7 @@ AUDIO_ENABLE = yes           # Audio output on port C6
 UNICODE_ENABLE = no         # Unicode
 BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
-API_SYSEX_ENABLE = no
+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

From 95a160bf92ebc5b92ef360f1649e2bd5e3ac2000 Mon Sep 17 00:00:00 2001
From: cbbrowne <cbbrowne@cbbrowne.tor.int-afilias.info>
Date: Thu, 1 Dec 2016 16:31:51 -0500
Subject: [PATCH 117/147] Improve docs on memory usage

---
 readme.md | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/readme.md b/readme.md
index 5c82efcdddb..afdb03ba54b 100644
--- a/readme.md
+++ b/readme.md
@@ -348,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.
@@ -1339,6 +1343,9 @@ Size after:
     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.

From 570e784140becd8621c4d05e8e36c8b0f8402b3b Mon Sep 17 00:00:00 2001
From: cbbrowne <cbbrowne@cbbrowne.tor.int-afilias.info>
Date: Fri, 2 Dec 2016 12:31:43 -0500
Subject: [PATCH 118/147] I want page-down/page-up - put those on
 LOWER-Left/Right near bottom corner

---
 keyboards/planck/keymaps/cbbrowne/keymap.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/keyboards/planck/keymaps/cbbrowne/keymap.c b/keyboards/planck/keymaps/cbbrowne/keymap.c
index 4742ca5c06a..717f4b23516 100644
--- a/keyboards/planck/keymaps/cbbrowne/keymap.c
+++ b/keyboards/planck/keymaps/cbbrowne/keymap.c
@@ -62,6 +62,7 @@
    - How about Alt-F1 thru Alt-F8?
    - What's the keystroke to get from X to console these days?
    - A layer for doing console switching would not be a bad idea
+   - I haven't got page-up/page-down, let's have that...
 */
 
 enum layers {
@@ -117,7 +118,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   {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, ALTSLASH,   _______},
-  {_______, KEYPAD, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+  {_______, 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},

From f6e86cd2c904cc3951b2341b9c73a535dbf28f03 Mon Sep 17 00:00:00 2001
From: cbbrowne <cbbrowne@cbbrowne.tor.int-afilias.info>
Date: Fri, 2 Dec 2016 12:35:03 -0500
Subject: [PATCH 119/147] I also want page-down/page-up on UPPER layer

---
 keyboards/planck/keymaps/cbbrowne/keymap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/keyboards/planck/keymaps/cbbrowne/keymap.c b/keyboards/planck/keymaps/cbbrowne/keymap.c
index 717f4b23516..2be4dab4b1f 100644
--- a/keyboards/planck/keymaps/cbbrowne/keymap.c
+++ b/keyboards/planck/keymaps/cbbrowne/keymap.c
@@ -112,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   {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,  ALTSLASH,_______},
-  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+  {_______, _______, _______, _______, _______, _______, _______, _______, 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},

From 5d43a2aecf2fcb9ed9a25ddc0924c66e544bcdf8 Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Fri, 2 Dec 2016 12:53:18 -0500
Subject: [PATCH 120/147] Kristian's keymap

---
 keyboards/ergodox/keymaps/kristian/keymap.c | 79 +++++++++++++++++++++
 1 file changed, 79 insertions(+)
 create mode 100644 keyboards/ergodox/keymaps/kristian/keymap.c

diff --git a/keyboards/ergodox/keymaps/kristian/keymap.c b/keyboards/ergodox/keymaps/kristian/keymap.c
new file mode 100644
index 00000000000..2238590917a
--- /dev/null
+++ b/keyboards/ergodox/keymaps/kristian/keymap.c
@@ -0,0 +1,79 @@
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "version.h"
+#include "keymap_fr_ch.h"
+#include "keymap_french.h"
+#include "keymap_german.h"
+#include "keymap_german_ch.h"
+#include "keymap_nordic.h"
+#include "keymap_norwegian.h"
+#include "keymap_spanish.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+
+[0] = KEYMAP(NO_LESS,KC_1,KC_2,KC_3,KC_4,KC_5,KC_BSPACE,KC_TAB,KC_Q,KC_W,KC_E,KC_R,KC_T,TG(1),KC_BSPACE,KC_A,KC_S,KC_D,KC_F,KC_G,SFT_T(NO_QUOT),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_QUOT),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;
+    }
+
+};

From aa70aa3962f0c148916412eb40924e108b6b5c07 Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Fri, 2 Dec 2016 13:03:39 -0500
Subject: [PATCH 121/147] Tweaks Kristian's layout again

---
 keyboards/ergodox/keymaps/kristian/keymap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/keyboards/ergodox/keymaps/kristian/keymap.c b/keyboards/ergodox/keymaps/kristian/keymap.c
index 2238590917a..e7e42432555 100644
--- a/keyboards/ergodox/keymaps/kristian/keymap.c
+++ b/keyboards/ergodox/keymaps/kristian/keymap.c
@@ -13,7 +13,7 @@
 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_QUOT),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_QUOT),KC_DOWN,KC_UP,NO_LPRN,NO_RPRN,MO(1),NO_QUOT,CTL_T(KC_ESCAPE),NO_APOS,KC_LALT,KC_LGUI,KC_ENTER),
+[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),
 

From 555e41d9e5f8d393637898e2c77c64066b648245 Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Fri, 2 Dec 2016 13:03:51 -0500
Subject: [PATCH 122/147] Annotates nordic

---
 quantum/keymap_extras/keymap_nordic.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/quantum/keymap_extras/keymap_nordic.h b/quantum/keymap_extras/keymap_nordic.h
index da5c8297579..9b0ef35ca99 100644
--- a/quantum/keymap_extras/keymap_nordic.h
+++ b/quantum/keymap_extras/keymap_nordic.h
@@ -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

From 245c9508bd6169d2feb398e99234103cc669efa7 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Fri, 2 Dec 2016 13:32:50 -0500
Subject: [PATCH 123/147] adds warnings to 4 keymaps

---
 keyboards/planck/keymaps/bone2planck/Makefile | 4 +++-
 keyboards/planck/keymaps/brandon/Makefile     | 4 +++-
 keyboards/planck/keymaps/impossible/Makefile  | 4 +++-
 keyboards/planck/keymaps/jeebak/Makefile      | 4 +++-
 4 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/keyboards/planck/keymaps/bone2planck/Makefile b/keyboards/planck/keymaps/bone2planck/Makefile
index 581e08cd02a..cf2c31f0fb5 100644
--- a/keyboards/planck/keymaps/bone2planck/Makefile
+++ b/keyboards/planck/keymaps/bone2planck/Makefile
@@ -1,4 +1,6 @@
-
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 # Build Options
 #   change to "no" to disable the options, or define them in the Makefile in 
diff --git a/keyboards/planck/keymaps/brandon/Makefile b/keyboards/planck/keymaps/brandon/Makefile
index 581e08cd02a..cf2c31f0fb5 100644
--- a/keyboards/planck/keymaps/brandon/Makefile
+++ b/keyboards/planck/keymaps/brandon/Makefile
@@ -1,4 +1,6 @@
-
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 # Build Options
 #   change to "no" to disable the options, or define them in the Makefile in 
diff --git a/keyboards/planck/keymaps/impossible/Makefile b/keyboards/planck/keymaps/impossible/Makefile
index 581e08cd02a..cf2c31f0fb5 100644
--- a/keyboards/planck/keymaps/impossible/Makefile
+++ b/keyboards/planck/keymaps/impossible/Makefile
@@ -1,4 +1,6 @@
-
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 # Build Options
 #   change to "no" to disable the options, or define them in the Makefile in 
diff --git a/keyboards/planck/keymaps/jeebak/Makefile b/keyboards/planck/keymaps/jeebak/Makefile
index 581e08cd02a..cf2c31f0fb5 100644
--- a/keyboards/planck/keymaps/jeebak/Makefile
+++ b/keyboards/planck/keymaps/jeebak/Makefile
@@ -1,4 +1,6 @@
-
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 # Build Options
 #   change to "no" to disable the options, or define them in the Makefile in 

From cee0cf8a6eca8d2316dd75f39351f13132ff0257 Mon Sep 17 00:00:00 2001
From: cbbrowne <cbbrowne@cbbrowne.tor.int-afilias.info>
Date: Fri, 2 Dec 2016 14:12:55 -0500
Subject: [PATCH 124/147] Adds warnings to Planck keymaps that exceed 0x7000
 bytes in size #929

---
 keyboards/planck/keymaps/jhenahan/Makefile        | 4 +++-
 keyboards/planck/keymaps/joe/Makefile             | 5 ++++-
 keyboards/planck/keymaps/leo/Makefile             | 5 ++++-
 keyboards/planck/keymaps/lucas/Makefile           | 5 ++++-
 keyboards/planck/keymaps/mollat/Makefile          | 5 ++++-
 keyboards/planck/keymaps/nico/Makefile            | 5 ++++-
 keyboards/planck/keymaps/premek/Makefile          | 3 +++
 keyboards/planck/keymaps/priyadi/Makefile         | 3 +++
 keyboards/planck/keymaps/pvc/Makefile             | 5 ++++-
 keyboards/planck/keymaps/sgoodwin/Makefile        | 5 ++++-
 keyboards/planck/keymaps/tak3over/Makefile        | 5 ++++-
 keyboards/planck/keymaps/thermal_printer/Makefile | 3 +++
 keyboards/planck/keymaps/vifon/Makefile           | 3 +++
 13 files changed, 47 insertions(+), 9 deletions(-)

diff --git a/keyboards/planck/keymaps/jhenahan/Makefile b/keyboards/planck/keymaps/jhenahan/Makefile
index de01ad2404b..83da2a7f896 100644
--- a/keyboards/planck/keymaps/jhenahan/Makefile
+++ b/keyboards/planck/keymaps/jhenahan/Makefile
@@ -1,4 +1,6 @@
-
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 # Build Options
 #   change to "no" to disable the options, or define them in the Makefile in 
diff --git a/keyboards/planck/keymaps/joe/Makefile b/keyboards/planck/keymaps/joe/Makefile
index 581e08cd02a..b2ca419445f 100644
--- a/keyboards/planck/keymaps/joe/Makefile
+++ b/keyboards/planck/keymaps/joe/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 
 # Build Options
@@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
-endif
\ No newline at end of file
+endif
diff --git a/keyboards/planck/keymaps/leo/Makefile b/keyboards/planck/keymaps/leo/Makefile
index 581e08cd02a..b2ca419445f 100644
--- a/keyboards/planck/keymaps/leo/Makefile
+++ b/keyboards/planck/keymaps/leo/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 
 # Build Options
@@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
-endif
\ No newline at end of file
+endif
diff --git a/keyboards/planck/keymaps/lucas/Makefile b/keyboards/planck/keymaps/lucas/Makefile
index 581e08cd02a..b2ca419445f 100644
--- a/keyboards/planck/keymaps/lucas/Makefile
+++ b/keyboards/planck/keymaps/lucas/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 
 # Build Options
@@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
-endif
\ No newline at end of file
+endif
diff --git a/keyboards/planck/keymaps/mollat/Makefile b/keyboards/planck/keymaps/mollat/Makefile
index 581e08cd02a..b2ca419445f 100644
--- a/keyboards/planck/keymaps/mollat/Makefile
+++ b/keyboards/planck/keymaps/mollat/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 
 # Build Options
@@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
-endif
\ No newline at end of file
+endif
diff --git a/keyboards/planck/keymaps/nico/Makefile b/keyboards/planck/keymaps/nico/Makefile
index 581e08cd02a..b2ca419445f 100644
--- a/keyboards/planck/keymaps/nico/Makefile
+++ b/keyboards/planck/keymaps/nico/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 
 # Build Options
@@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
-endif
\ No newline at end of file
+endif
diff --git a/keyboards/planck/keymaps/premek/Makefile b/keyboards/planck/keymaps/premek/Makefile
index 0f4953888dd..b2ca419445f 100644
--- a/keyboards/planck/keymaps/premek/Makefile
+++ b/keyboards/planck/keymaps/premek/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 
 # Build Options
diff --git a/keyboards/planck/keymaps/priyadi/Makefile b/keyboards/planck/keymaps/priyadi/Makefile
index aa211d2f053..f113f496c21 100644
--- a/keyboards/planck/keymaps/priyadi/Makefile
+++ b/keyboards/planck/keymaps/priyadi/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 
 # Build Options
diff --git a/keyboards/planck/keymaps/pvc/Makefile b/keyboards/planck/keymaps/pvc/Makefile
index b2ff961fa5e..c92ca1bffaf 100644
--- a/keyboards/planck/keymaps/pvc/Makefile
+++ b/keyboards/planck/keymaps/pvc/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 # Build Options
 #   change to "no" to disable the options, or define them in the Makefile in
@@ -21,4 +24,4 @@ SLEEP_LED_ENABLE = no  # Breathing sleep LED during USB suspend
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
-endif
\ No newline at end of file
+endif
diff --git a/keyboards/planck/keymaps/sgoodwin/Makefile b/keyboards/planck/keymaps/sgoodwin/Makefile
index 581e08cd02a..b2ca419445f 100644
--- a/keyboards/planck/keymaps/sgoodwin/Makefile
+++ b/keyboards/planck/keymaps/sgoodwin/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 
 # Build Options
@@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
-endif
\ No newline at end of file
+endif
diff --git a/keyboards/planck/keymaps/tak3over/Makefile b/keyboards/planck/keymaps/tak3over/Makefile
index 581e08cd02a..b2ca419445f 100644
--- a/keyboards/planck/keymaps/tak3over/Makefile
+++ b/keyboards/planck/keymaps/tak3over/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 
 # Build Options
@@ -22,4 +25,4 @@ SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
 ifndef QUANTUM_DIR
 	include ../../../../Makefile
-endif
\ No newline at end of file
+endif
diff --git a/keyboards/planck/keymaps/thermal_printer/Makefile b/keyboards/planck/keymaps/thermal_printer/Makefile
index 3d1d11877f3..9477d1179ab 100644
--- a/keyboards/planck/keymaps/thermal_printer/Makefile
+++ b/keyboards/planck/keymaps/thermal_printer/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 
 # Build Options
diff --git a/keyboards/planck/keymaps/vifon/Makefile b/keyboards/planck/keymaps/vifon/Makefile
index 838cb4e8854..53660a2e76e 100644
--- a/keyboards/planck/keymaps/vifon/Makefile
+++ b/keyboards/planck/keymaps/vifon/Makefile
@@ -1,3 +1,6 @@
+# Please remove if no longer applicable
+$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
+$(warning Please disable some options in the Makefile to resolve)
 
 
 # Build Options

From 044fa3ff856393d75a80fe6625b4a5682b81b76d Mon Sep 17 00:00:00 2001
From: Wez Furlong <wez@fb.com>
Date: Sun, 27 Nov 2016 22:51:30 -0800
Subject: [PATCH 125/147] Connect the adafruit ble code to the lufa main loop

There are now 3 potential locations to send HID reports:

1. USB
2. The bluefruit easy key
3. Adafruit BLE

Generally speaking, if USB is connected then we should prefer to
send the reports there; it is generally the best channel for this.

The bluefruit module has no feedback about bluetooth connectivity
so the code must speculatively send reports over both USB and bluetooth.

The BLE module has connectivity feedback.  In general we want to
prefer to send HID reports over USB while connected there, even
if BLE is connected.  Except that it is convenient to force them
over BLE while testing the implementation.

This policy has been extracted out into a where_to_send function
which returns a bitmask of which of the channels should be used.
---
 tmk_core/protocol/lufa/lufa.c | 82 ++++++++++++++++++++++++++++++-----
 1 file changed, 71 insertions(+), 11 deletions(-)

diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 39d4824b6b9..ee2552c190a 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -52,6 +52,7 @@
 #include "descriptor.h"
 #include "lufa.h"
 #include "quantum.h"
+#include <util/atomic.h>
 
 #ifdef NKRO_ENABLE
   #include "keycode_config.h"
@@ -67,13 +68,16 @@
 #ifdef BLUETOOTH_ENABLE
     #include "bluetooth.h"
 #endif
+#ifdef ADAFRUIT_BLE_ENABLE
+    #include "adafruit_ble.h"
+#endif
 
 #ifdef VIRTSER_ENABLE
     #include "virtser.h"
 #endif
 
 #if (defined(RGB_MIDI) | defined(RGBLIGHT_ANIMATIONS)) & defined(RGBLIGHT_ENABLE)
-    #include "rgblight.h"        
+    #include "rgblight.h"
 #endif
 
 #ifdef MIDI_ENABLE
@@ -297,7 +301,9 @@ void EVENT_USB_Device_WakeUp()
 #ifdef CONSOLE_ENABLE
 static bool console_flush = false;
 #define CONSOLE_FLUSH_SET(b)   do { \
-    uint8_t sreg = SREG; cli(); console_flush = b; SREG = sreg; \
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {\
+    console_flush = b; \
+  } \
 } while (0)
 
 // called every 1ms
@@ -501,9 +507,35 @@ static uint8_t keyboard_leds(void)
     return keyboard_led_stats;
 }
 
+#define SendToUSB 1
+#define SendToBT  2
+#define SendToBLE 4
+
+static inline uint8_t where_to_send(void) {
+#ifdef ADAFRUIT_BLE_ENABLE
+#if 0
+  if (adafruit_ble_is_connected()) {
+    // For testing, send to BLE as a priority
+    return SendToBLE;
+  }
+#endif
+
+  // This is the real policy
+  if (USB_DeviceState != DEVICE_STATE_Configured) {
+    if (adafruit_ble_is_connected()) {
+      return SendToBLE;
+    }
+  }
+#endif
+  return ((USB_DeviceState == DEVICE_STATE_Configured) ? SendToUSB : 0)
+#ifdef BLUETOOTH_ENABLE
+    || SendToBT
+#endif
+    ;
+}
+
 static void send_keyboard(report_keyboard_t *report)
 {
-
 #ifdef BLUETOOTH_ENABLE
     bluefruit_serial_send(0xFD);
     for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) {
@@ -512,9 +544,17 @@ static void send_keyboard(report_keyboard_t *report)
 #endif
 
     uint8_t timeout = 255;
+    uint8_t where = where_to_send();
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where & SendToBLE) {
+      adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys));
+    }
+#endif
+
+    if (!(where & SendToUSB)) {
+      return;
+    }
 
     /* Select the Keyboard Report Endpoint */
 #ifdef NKRO_ENABLE
@@ -567,8 +607,17 @@ static void send_mouse(report_mouse_t *report)
 
     uint8_t timeout = 255;
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+    uint8_t where = where_to_send();
+
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where & SendToBLE) {
+      // FIXME: mouse buttons
+      adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h);
+    }
+#endif
+    if (!(where & SendToUSB)) {
+      return;
+    }
 
     /* Select the Mouse Report Endpoint */
     Endpoint_SelectEndpoint(MOUSE_IN_EPNUM);
@@ -626,9 +675,16 @@ static void send_consumer(uint16_t data)
 #endif
 
     uint8_t timeout = 255;
+    uint8_t where = where_to_send();
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where & SendToBLE) {
+      adafruit_ble_send_consumer_key(data, 0);
+    }
+#endif
+    if (!(where & SendToUSB)) {
+      return;
+    }
 
     report_extra_t r = {
         .report_id = REPORT_ID_CONSUMER,
@@ -1038,7 +1094,7 @@ int main(void)
 
     print("Keyboard start.\n");
     while (1) {
-        #ifndef BLUETOOTH_ENABLE
+        #if !defined(BLUETOOTH_ENABLE) && !defined(ADAFRUIT_BLE_ENABLE)
         while (USB_DeviceState == DEVICE_STATE_Suspended) {
             print("[s]");
             suspend_power_down();
@@ -1054,11 +1110,15 @@ int main(void)
         midi_device_process(&midi_device);
         // MIDI_Task();
 #endif
-        
+
 #if defined(RGBLIGHT_ANIMATIONS) & defined(RGBLIGHT_ENABLE)
         rgblight_task();
 #endif
 
+#ifdef ADAFRUIT_BLE_ENABLE
+        adafruit_ble_task();
+#endif
+
 #ifdef VIRTSER_ENABLE
         virtser_task();
         CDC_Device_USBTask(&cdc_device);

From d639e08a3131892c608760df4e3806d843a91176 Mon Sep 17 00:00:00 2001
From: ofples <plesserofer@gmail.com>
Date: Sat, 3 Dec 2016 13:05:02 +0200
Subject: [PATCH 126/147] Refactored and improved ps2 mouse feature

---
 tmk_core/protocol/ps2_mouse.c | 373 ++++++++++++++++++++--------------
 tmk_core/protocol/ps2_mouse.h |  81 +++++++-
 2 files changed, 288 insertions(+), 166 deletions(-)

diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index 82f6966e8ed..f247ba8dca1 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/tmk_core/protocol/ps2_mouse.c
@@ -18,63 +18,99 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include <stdbool.h>
 #include<avr/io.h>
 #include<util/delay.h>
-#include "ps2.h"
 #include "ps2_mouse.h"
-#include "report.h"
 #include "host.h"
 #include "timer.h"
 #include "print.h"
+#include "report.h"
 #include "debug.h"
+#include "ps2.h"
 
-#ifndef PS2_INIT_DELAY
-#define PS2_INIT_DELAY 1000
-#endif
+/* ============================= MACROS ============================ */
+
+#define PS2_MOUSE_SEND(command, message) \
+do { \
+   uint8_t rcv = ps2_host_send(command); \
+   if (debug_mouse) { \
+        print((message)); \
+        xprintf(" command: %X, result: %X, error: %X \n", command, rcv, ps2_error); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_SEND_SAFE(command, message) \
+do { \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_disable_data_reporting(); \
+    } \
+    PS2_MOUSE_SEND(command, message); \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_enable_data_reporting(); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_SET_SAFE(command, value, message) \
+do { \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_disable_data_reporting(); \
+    } \
+    PS2_MOUSE_SEND(command, message); \
+    PS2_MOUSE_SEND(value, "Sending value"); \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_enable_data_reporting(); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_RECEIVE(message) \
+do { \
+   uint8_t rcv = ps2_host_recv_response(); \
+   if (debug_mouse) { \
+        print((message)); \
+        xprintf(" result: %X, error: %X \n", rcv, ps2_error); \
+    } \
+} while(0)
+
+static enum ps2_mouse_mode_e {
+    PS2_MOUSE_STREAM_MODE,
+    PS2_MOUSE_REMOTE_MODE,
+} ps2_mouse_mode = PS2_MOUSE_STREAM_MODE;
 
 static report_mouse_t mouse_report = {};
 
+static inline void ps2_mouse_print_report(report_mouse_t *mouse_report);
+static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report);
+static inline void ps2_mouse_clear_report(report_mouse_t *mouse_report);
+static inline void ps2_mouse_enable_scrolling(void);
+static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report);
 
-static void print_usb_data(void);
-
+/* ============================= IMPLEMENTATION ============================ */
 
 /* supports only 3 button mouse at this time */
-uint8_t ps2_mouse_init(void) {
-    uint8_t rcv;
-
+void ps2_mouse_init(void) {
     ps2_host_init();
 
-    _delay_ms(PS2_INIT_DELAY);    // wait for powering up
+    _delay_ms(1000);    // wait for powering up
 
-    // send Reset
-    rcv = ps2_host_send(0xFF);
-    print("ps2_mouse_init: send Reset: ");
-    phex(rcv); phex(ps2_error); print("\n");
+    PS2_MOUSE_SEND(PS2_MOUSE_RESET, "ps2_mouse_init: sending reset");
 
-    // read completion code of BAT
-    rcv = ps2_host_recv_response();
-    print("ps2_mouse_init: read BAT: ");
-    phex(rcv); phex(ps2_error); print("\n");
+    PS2_MOUSE_RECEIVE("ps2_mouse_init: read BAT");
+    PS2_MOUSE_RECEIVE("ps2_mouse_init: read DevID");
 
-    // read Device ID
-    rcv = ps2_host_recv_response();
-    print("ps2_mouse_init: read DevID: ");
-    phex(rcv); phex(ps2_error); print("\n");
+#ifdef PS2_MOUSE_USE_REMOTE_MODE
+    ps2_mouse_set_remote_mode();
+#else
+    ps2_mouse_enable_data_reporting();
+#endif
 
-    // send Set Remote mode
-    rcv = ps2_host_send(0xF0);
-    print("ps2_mouse_init: send 0xF0: ");
-    phex(rcv); phex(ps2_error); print("\n");
+#ifdef PS2_MOUSE_ENABLE_SCROLLING
+    ps2_mouse_enable_scrolling();
+#endif
 
-    return 0;
+#ifdef PS2_MOUSE_USE_2_1_SCALING
+    ps2_mouse_set_scaling_2_1();
+#endif
 }
 
-#define X_IS_NEG  (mouse_report.buttons & (1<<PS2_MOUSE_X_SIGN))
-#define Y_IS_NEG  (mouse_report.buttons & (1<<PS2_MOUSE_Y_SIGN))
-#define X_IS_OVF  (mouse_report.buttons & (1<<PS2_MOUSE_X_OVFLW))
-#define Y_IS_OVF  (mouse_report.buttons & (1<<PS2_MOUSE_Y_OVFLW))
-void ps2_mouse_task(void)
-{
-    enum { SCROLL_NONE, SCROLL_BTN, SCROLL_SENT };
-    static uint8_t scroll_state = SCROLL_NONE;
+void ps2_mouse_task(void) {
     static uint8_t buttons_prev = 0;
 
     /* receives packet from mouse */
@@ -82,142 +118,169 @@ void ps2_mouse_task(void)
     rcv = ps2_host_send(PS2_MOUSE_READ_DATA);
     if (rcv == PS2_ACK) {
         mouse_report.buttons = ps2_host_recv_response();
-        mouse_report.x = ps2_host_recv_response();
-        mouse_report.y = ps2_host_recv_response();
+        mouse_report.x = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER;
+        mouse_report.y = ps2_host_recv_response() * PS2_MOUSE_Y_MULTIPLIER;
+#ifdef PS2_MOUSE_ENABLE_SCROLLING
+        mouse_report.v = -(ps2_host_recv_response() & PS2_MOUSE_SCROLL_MASK) * PS2_MOUSE_V_MULTIPLIER;
+#endif
     } else {
         if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
         return;
     }
-        xprintf("%ud ", timer_read());
-        print("ps2_mouse raw: [");
-        phex(mouse_report.buttons); print("|");
-        print_hex8((uint8_t)mouse_report.x); print(" ");
-        print_hex8((uint8_t)mouse_report.y); print("]\n");
 
     /* if mouse moves or buttons state changes */
-    if (mouse_report.x || mouse_report.y ||
+    if (mouse_report.x || mouse_report.y || mouse_report.v ||
             ((mouse_report.buttons ^ buttons_prev) & PS2_MOUSE_BTN_MASK)) {
-
-#ifdef PS2_MOUSE_DEBUG
-        print("ps2_mouse raw: [");
-        phex(mouse_report.buttons); print("|");
-        print_hex8((uint8_t)mouse_report.x); print(" ");
-        print_hex8((uint8_t)mouse_report.y); print("]\n");
+#ifdef PS2_MOUSE_DEBUG_RAW
+        // Used to debug raw ps2 bytes from mouse
+        ps2_mouse_print_report(&mouse_report);
 #endif
-
         buttons_prev = mouse_report.buttons;
-
-        // PS/2 mouse data is '9-bit integer'(-256 to 255) which is comprised of sign-bit and 8-bit value.
-        // bit: 8    7 ... 0
-        //      sign \8-bit/
-        //
-        // Meanwhile USB HID mouse indicates 8bit data(-127 to 127), note that -128 is not used.
-        //
-        // This converts PS/2 data into HID value. Use only -127-127 out of PS/2 9-bit.
-        mouse_report.x = X_IS_NEG ?
-                          ((!X_IS_OVF && -127 <= mouse_report.x && mouse_report.x <= -1) ?  mouse_report.x : -127) :
-                          ((!X_IS_OVF && 0 <= mouse_report.x && mouse_report.x <= 127) ? mouse_report.x : 127);
-        mouse_report.y = Y_IS_NEG ?
-                          ((!Y_IS_OVF && -127 <= mouse_report.y && mouse_report.y <= -1) ?  mouse_report.y : -127) :
-                          ((!Y_IS_OVF && 0 <= mouse_report.y && mouse_report.y <= 127) ? mouse_report.y : 127);
-
-        // remove sign and overflow flags
-        mouse_report.buttons &= PS2_MOUSE_BTN_MASK;
-
-        // invert coordinate of y to conform to USB HID mouse
-        mouse_report.y = -mouse_report.y;
-
-
+        ps2_mouse_convert_report_to_hid(&mouse_report);
 #if PS2_MOUSE_SCROLL_BTN_MASK
-        static uint16_t scroll_button_time = 0;
-        if ((mouse_report.buttons & (PS2_MOUSE_SCROLL_BTN_MASK)) == (PS2_MOUSE_SCROLL_BTN_MASK)) {
-            if (scroll_state == SCROLL_NONE) {
-                scroll_button_time = timer_read();
-                scroll_state = SCROLL_BTN;
-            }
-
-            // doesn't send Scroll Button
-            //mouse_report.buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK);
-
-            if (mouse_report.x || mouse_report.y) {
-                scroll_state = SCROLL_SENT;
-
-                mouse_report.v = -mouse_report.y/(PS2_MOUSE_SCROLL_DIVISOR_V);
-                mouse_report.h =  mouse_report.x/(PS2_MOUSE_SCROLL_DIVISOR_H);
-                mouse_report.x = 0;
-                mouse_report.y = 0;
-                //host_mouse_send(&mouse_report);
-            }
-        }
-        else if ((mouse_report.buttons & (PS2_MOUSE_SCROLL_BTN_MASK)) == 0) {
-#if PS2_MOUSE_SCROLL_BTN_SEND
-            if (scroll_state == SCROLL_BTN &&
-                    TIMER_DIFF_16(timer_read(), scroll_button_time) < PS2_MOUSE_SCROLL_BTN_SEND) {
-                // send Scroll Button(down and up at once) when not scrolled
-                mouse_report.buttons |= (PS2_MOUSE_SCROLL_BTN_MASK);
-                host_mouse_send(&mouse_report);
-                _delay_ms(100);
-                mouse_report.buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK);
-            }
+        ps2_mouse_scroll_button_task(&mouse_report);
 #endif
-            scroll_state = SCROLL_NONE;
-        }
-        // doesn't send Scroll Button
-        mouse_report.buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK);
+#ifdef PS2_MOUSE_DEBUG_HID
+        // Used to debug the bytes sent to the host
+        ps2_mouse_print_report(&mouse_report);
 #endif
-
-
         host_mouse_send(&mouse_report);
-        print_usb_data();
     }
-    // clear report
-    mouse_report.x = 0;
-    mouse_report.y = 0;
-    mouse_report.v = 0;
-    mouse_report.h = 0;
-    mouse_report.buttons = 0;
+    
+    ps2_mouse_clear_report(&mouse_report);
 }
 
-static void print_usb_data(void)
-{
+void ps2_mouse_disable_data_reporting(void) {
+    PS2_MOUSE_SEND(PS2_MOUSE_DISABLE_DATA_REPORTING, "ps2 mouse disable data reporting"); 
+}
+
+void ps2_mouse_enable_data_reporting(void) {
+    PS2_MOUSE_SEND(PS2_MOUSE_ENABLE_DATA_REPORTING, "ps2 mouse enable data reporting");
+}
+
+void ps2_mouse_set_remote_mode(void) { 
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_REMOTE_MODE, "ps2 mouse set remote mode"); 
+    ps2_mouse_mode = PS2_MOUSE_REMOTE_MODE;
+}
+
+void ps2_mouse_set_stream_mode(void) { 
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_STREAM_MODE, "ps2 mouse set stream mode"); 
+    ps2_mouse_mode = PS2_MOUSE_STREAM_MODE;
+}
+
+void ps2_mouse_set_scaling_2_1(void) {
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_2_1, "ps2 mouse set scaling 2:1"); 
+}
+
+void ps2_mouse_set_scaling_1_1(void) {
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_1_1, "ps2 mouse set scaling 1:1"); 
+}
+
+void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution) {
+    PS2_MOUSE_SET_SAFE(PS2_MOUSE_SET_RESOLUTION, resolution, "ps2 mouse set resolution");
+}
+
+void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate) {
+    PS2_MOUSE_SET_SAFE(PS2_MOUSE_SET_SAMPLE_RATE, sample_rate, "ps2 mouse set sample rate");
+}
+
+/* ============================= HELPERS ============================ */
+
+#define X_IS_NEG  (mouse_report->buttons & (1<<PS2_MOUSE_X_SIGN))
+#define Y_IS_NEG  (mouse_report->buttons & (1<<PS2_MOUSE_Y_SIGN))
+#define X_IS_OVF  (mouse_report->buttons & (1<<PS2_MOUSE_X_OVFLW))
+#define Y_IS_OVF  (mouse_report->buttons & (1<<PS2_MOUSE_Y_OVFLW))
+static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report) {
+    // PS/2 mouse data is '9-bit integer'(-256 to 255) which is comprised of sign-bit and 8-bit value.
+    // bit: 8    7 ... 0
+    //      sign \8-bit/
+    //
+    // Meanwhile USB HID mouse indicates 8bit data(-127 to 127), note that -128 is not used.
+    //
+    // This converts PS/2 data into HID value. Use only -127-127 out of PS/2 9-bit.
+    mouse_report->x = X_IS_NEG ?
+        ((!X_IS_OVF && -127 <= mouse_report->x && mouse_report->x <= -1) ?  mouse_report->x : -127) :
+        ((!X_IS_OVF && 0 <= mouse_report->x && mouse_report->x <= 127) ? mouse_report->x : 127);
+    mouse_report->y = Y_IS_NEG ?
+        ((!Y_IS_OVF && -127 <= mouse_report->y && mouse_report->y <= -1) ?  mouse_report->y : -127) :
+        ((!Y_IS_OVF && 0 <= mouse_report->y && mouse_report->y <= 127) ? mouse_report->y : 127);
+
+    // remove sign and overflow flags
+    mouse_report->buttons &= PS2_MOUSE_BTN_MASK;
+
+    // invert coordinate of y to conform to USB HID mouse
+    mouse_report->y = -mouse_report->y;
+}
+
+static inline void ps2_mouse_clear_report(report_mouse_t *mouse_report) {
+    mouse_report->x = 0;
+    mouse_report->y = 0;
+    mouse_report->v = 0;
+    mouse_report->h = 0;
+    mouse_report->buttons = 0;
+}
+
+static inline void ps2_mouse_print_report(report_mouse_t *mouse_report) {
     if (!debug_mouse) return;
-    print("ps2_mouse usb: [");
-    phex(mouse_report.buttons); print("|");
-    print_hex8((uint8_t)mouse_report.x); print(" ");
-    print_hex8((uint8_t)mouse_report.y); print(" ");
-    print_hex8((uint8_t)mouse_report.v); print(" ");
-    print_hex8((uint8_t)mouse_report.h); print("]\n");
+    print("ps2_mouse: [");
+    phex(mouse_report->buttons); print("|");
+    print_hex8((uint8_t)mouse_report->x); print(" ");
+    print_hex8((uint8_t)mouse_report->y); print(" ");
+    print_hex8((uint8_t)mouse_report->v); print(" ");
+    print_hex8((uint8_t)mouse_report->h); print("]\n");
 }
 
+static inline void ps2_mouse_enable_scrolling(void) {
+    PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Initiaing scroll wheel enable: Set sample rate");
+    PS2_MOUSE_SEND(200, "200");
+    PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Set sample rate");
+    PS2_MOUSE_SEND(100, "100");
+    PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Set sample rate");
+    PS2_MOUSE_SEND(80, "80");
+    PS2_MOUSE_SEND(PS2_MOUSE_GET_DEVICE_ID, "Finished enabling scroll wheel");
+    _delay_ms(20);
+}
 
-/* PS/2 Mouse Synopsis
- * http://www.computer-engineering.org/ps2mouse/
- *
- * Command:
- * 0xFF: Reset
- * 0xF6: Set Defaults Sampling; rate=100, resolution=4cnt/mm, scaling=1:1, reporting=disabled
- * 0xF5: Disable Data Reporting
- * 0xF4: Enable Data Reporting
- * 0xF3: Set Sample Rate
- * 0xF2: Get Device ID
- * 0xF0: Set Remote Mode
- * 0xEB: Read Data
- * 0xEA: Set Stream Mode
- * 0xE9: Status Request
- * 0xE8: Set Resolution
- * 0xE7: Set Scaling 2:1
- * 0xE6: Set Scaling 1:1
- *
- * Mode:
- * Stream Mode: devices sends the data when it changs its state
- * Remote Mode: host polls the data periodically
- *
- * This code uses Remote Mode and polls the data with Read Data(0xEB).
- *
- * Data format:
- * byte|7       6       5       4       3       2       1       0
- * ----+--------------------------------------------------------------
- *    0|Yovflw  Xovflw  Ysign   Xsign   1       Middle  Right   Left
- *    1|                    X movement
- *    2|                    Y movement
- */
+#define PRESS_SCROLL_BUTTONS    mouse_report->buttons |= (PS2_MOUSE_SCROLL_BTN_MASK)
+#define RELEASE_SCROLL_BUTTONS  mouse_report->buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK)
+static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report) {
+    static enum { 
+        SCROLL_NONE, 
+        SCROLL_BTN, 
+        SCROLL_SENT,
+    } scroll_state = SCROLL_NONE;
+    static uint16_t scroll_button_time = 0;
+
+    if (PS2_MOUSE_SCROLL_BTN_MASK == (mouse_report->buttons & (PS2_MOUSE_SCROLL_BTN_MASK))) {
+        // All scroll buttons are pressed
+
+        if (scroll_state == SCROLL_NONE) {
+            scroll_button_time = timer_read();
+            scroll_state = SCROLL_BTN;
+        }
+
+        // If the mouse has moved, update the report to scroll instead of move the mouse
+        if (mouse_report->x || mouse_report->y) {
+            scroll_state = SCROLL_SENT;
+            mouse_report->v = -mouse_report->y/(PS2_MOUSE_SCROLL_DIVISOR_V);
+            mouse_report->h =  mouse_report->x/(PS2_MOUSE_SCROLL_DIVISOR_H);
+            mouse_report->x = 0;
+            mouse_report->y = 0;
+        }
+    } else if (0 == (PS2_MOUSE_SCROLL_BTN_MASK & mouse_report->buttons)) {
+        // None of the scroll buttons are pressed 
+
+#if PS2_MOUSE_SCROLL_BTN_SEND
+        if (scroll_state == SCROLL_BTN 
+                && timer_elapsed(scroll_button_time) < PS2_MOUSE_SCROLL_BTN_SEND) {
+            PRESS_SCROLL_BUTTONS;
+            host_mouse_send(mouse_report);
+            _delay_ms(100);
+            RELEASE_SCROLL_BUTTONS;
+        }
+#endif
+        scroll_state = SCROLL_NONE;
+    }
+
+    RELEASE_SCROLL_BUTTONS;
+}
\ No newline at end of file
diff --git a/tmk_core/protocol/ps2_mouse.h b/tmk_core/protocol/ps2_mouse.h
index 27d9790d43f..3b498059dcb 100644
--- a/tmk_core/protocol/ps2_mouse.h
+++ b/tmk_core/protocol/ps2_mouse.h
@@ -20,15 +20,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <stdbool.h>
 
-#define PS2_MOUSE_READ_DATA     0xEB
-
 /*
  * Data format:
  * byte|7       6       5       4       3       2       1       0
- * ----+--------------------------------------------------------------
- *    0|Yovflw  Xovflw  Ysign   Xsign   1       Middle  Right   Left
- *    1|                    X movement(0-255)
- *    2|                    Y movement(0-255)
+ * ----+----------------------------------------------------------------
+ *    0|[Yovflw][Xovflw][Ysign ][Xsign ][ 1    ][Middle][Right ][Left  ]
+ *    1|[                    X movement(0-255)                         ]
+ *    2|[                    Y movement(0-255)                         ]
  */
 #define PS2_MOUSE_BTN_MASK      0x07
 #define PS2_MOUSE_BTN_LEFT      0
@@ -39,10 +37,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PS2_MOUSE_X_OVFLW       6
 #define PS2_MOUSE_Y_OVFLW       7
 
-
-/*
- * Scroll by mouse move with pressing button
- */
 /* mouse button to start scrolling; set 0 to disable scroll */
 #ifndef PS2_MOUSE_SCROLL_BTN_MASK
 #define PS2_MOUSE_SCROLL_BTN_MASK       (1<<PS2_MOUSE_BTN_MIDDLE)
@@ -58,9 +52,74 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #ifndef PS2_MOUSE_SCROLL_DIVISOR_H
 #define PS2_MOUSE_SCROLL_DIVISOR_H      2
 #endif
+/* multiply reported mouse values by these */
+#ifndef PS2_MOUSE_X_MULTIPLIER
+#define PS2_MOUSE_X_MULTIPLIER          1
+#endif
+#ifndef PS2_MOUSE_Y_MULTIPLIER
+#define PS2_MOUSE_Y_MULTIPLIER          1
+#endif
+#ifndef PS2_MOUSE_V_MULTIPLIER
+#define PS2_MOUSE_V_MULTIPLIER          1
+#endif
+/* For some mice this will need to be 0x0F */
+#ifndef PS2_MOUSE_SCROLL_MASK       
+#define PS2_MOUSE_SCROLL_MASK           0xFF 
+#endif
 
+enum ps2_mouse_command_e {
+    PS2_MOUSE_RESET = 0xFF,
+    PS2_MOUSE_RESEND = 0xFE,
+    PS2_MOSUE_SET_DEFAULTS = 0xF6,
+    PS2_MOUSE_DISABLE_DATA_REPORTING = 0xF5,
+    PS2_MOUSE_ENABLE_DATA_REPORTING = 0xF4,
+    PS2_MOUSE_SET_SAMPLE_RATE = 0xF3,
+    PS2_MOUSE_GET_DEVICE_ID = 0xF2,
+    PS2_MOUSE_SET_REMOTE_MODE = 0xF0,
+    PS2_MOUSE_SET_WRAP_MODE = 0xEC,
+    PS2_MOUSE_READ_DATA = 0xEB,
+    PS2_MOUSE_SET_STREAM_MODE = 0xEA,
+    PS2_MOUSE_STATUS_REQUEST = 0xE9,
+    PS2_MOUSE_SET_RESOLUTION = 0xE8,
+    PS2_MOUSE_SET_SCALING_2_1 = 0xE7,
+    PS2_MOUSE_SET_SCALING_1_1 = 0xE6,
+};
+
+typedef enum ps2_mouse_resolution_e {
+    PS2_MOUSE_1_COUNT_MM,
+    PS2_MOUSE_2_COUNT_MM,
+    PS2_MOUSE_4_COUNT_MM,
+    PS2_MOUSE_8_COUNT_MM,   
+} ps2_mouse_resolution_t;
+
+typedef enum ps2_mouse_sample_rate_e {
+    PS2_MOUSE_10_SAMPLES_SEC = 10,
+    PS2_MOUSE_20_SAMPLES_SEC = 20,
+    PS2_MOUSE_40_SAMPLES_SEC = 40,
+    PS2_MOUSE_60_SAMPLES_SEC = 60,
+    PS2_MOUSE_80_SAMPLES_SEC = 80,
+    PS2_MOUSE_100_SAMPLES_SEC = 100,
+    PS2_MOUSE_200_SAMPLES_SEC = 200,
+} ps2_mouse_sample_rate_t;
+
+void ps2_mouse_init(void);
 
-uint8_t ps2_mouse_init(void);
 void ps2_mouse_task(void);
 
+void ps2_mouse_disable_data_reporting(void);
+
+void ps2_mouse_enable_data_reporting(void);
+
+void ps2_mouse_set_remote_mode(void);
+
+void ps2_mouse_set_stream_mode(void);
+
+void ps2_mouse_set_scaling_2_1(void);
+
+void ps2_mouse_set_scaling_1_1(void);
+
+void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution);
+
+void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate);
+
 #endif

From 9f41544e1de12b92bdc15538ec7a9e66a4af0c43 Mon Sep 17 00:00:00 2001
From: Ofer Plesser <plesserofer@gmail.com>
Date: Sat, 3 Dec 2016 13:09:42 +0200
Subject: [PATCH 127/147] Added back PS2_MOUSE_INIT_DELAY define

---
 tmk_core/protocol/ps2_mouse.c | 2 +-
 tmk_core/protocol/ps2_mouse.h | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index f247ba8dca1..04c15dd4fdc 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/tmk_core/protocol/ps2_mouse.c
@@ -283,4 +283,4 @@ static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report) {
     }
 
     RELEASE_SCROLL_BUTTONS;
-}
\ No newline at end of file
+}
diff --git a/tmk_core/protocol/ps2_mouse.h b/tmk_core/protocol/ps2_mouse.h
index 3b498059dcb..e11c705fc65 100644
--- a/tmk_core/protocol/ps2_mouse.h
+++ b/tmk_core/protocol/ps2_mouse.h
@@ -66,6 +66,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #ifndef PS2_MOUSE_SCROLL_MASK       
 #define PS2_MOUSE_SCROLL_MASK           0xFF 
 #endif
+#ifndef PS2_MOUSE_INIT_DELAY
+#define PS2_MOUSE_INIT_DELAY            1000
+#endif
 
 enum ps2_mouse_command_e {
     PS2_MOUSE_RESET = 0xFF,

From 8e2732edf3c457d98dd4526d88dad26786cb3db9 Mon Sep 17 00:00:00 2001
From: Ofer Plesser <plesserofer@gmail.com>
Date: Sat, 3 Dec 2016 13:11:37 +0200
Subject: [PATCH 128/147] Updated ps2 mouse documentation in readme

---
 readme.md | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 111 insertions(+), 1 deletion(-)

diff --git a/readme.md b/readme.md
index be151083292..1f06fe79fa0 100644
--- a/readme.md
+++ b/readme.md
@@ -1191,7 +1191,7 @@ Please note the USB port can only supply a limited amount of power to the keyboa
 
 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.
+There are three available modes for hooking up PS/2 devices: USART (best), interrupts (better) or busywait (not recommended).
 
 ### Busywait version
 
@@ -1316,6 +1316,116 @@ In your keyboard config.h:
 #endif
 ```
 
+### Additional Settings
+
+#### PS/2 mouse features
+
+These enable settings supported by the PS/2 mouse protocol: http://www.computer-engineering.org/ps2mouse/
+
+```
+/* Use remote mode instead of the default stream mode (see link) */
+#define PS2_MOUSE_USE_REMOTE_MODE  
+
+/* Enable the scrollwheel or scroll gesture on your mouse or touchpad */
+#define PS2_MOUSE_ENABLE_SCROLLING
+
+/* Some mice will need a scroll mask to be configured. The default is 0xFF. */
+#define PS2_MOUSE_SCROLL_MASK 0x0F
+
+/* Applies a transformation to the movement before sending to the host (see link) */
+#define PS2_MOUSE_USE_2_1_SCALING
+
+/* The time to wait after initializing the ps2 host */
+#define PS2_MOUSE_INIT_DELAY 1000 /* Default */
+```
+
+You can also call the following functions from ps2_mouse.h
+
+```
+void ps2_mouse_disable_data_reporting(void);
+
+void ps2_mouse_enable_data_reporting(void);
+
+void ps2_mouse_set_remote_mode(void);
+
+void ps2_mouse_set_stream_mode(void);
+
+void ps2_mouse_set_scaling_2_1(void);
+
+void ps2_mouse_set_scaling_1_1(void);
+
+void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution);
+
+void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate);
+```
+
+#### Fine control
+
+Use the following defines to change the sensitivity and speed of the mouse.
+Note: you can also use `ps2_mouse_set_resolution` for the same effect (not supported on most touchpads).
+
+```
+#define PS2_MOUSE_X_MULTIPLIER 3
+#define PS2_MOUSE_Y_MULTIPLIER 3
+#define PS2_MOUSE_V_MULTIPLIER 1
+```
+
+#### Scroll button
+
+If you're using a trackpoint, you will likely want to be able to use it for scrolling.
+Its possible to enable a "scroll button/s" that when pressed will cause the mouse to scroll instead of moving.
+To enable the feature, you must set a scroll button mask as follows:
+
+```
+#define PS2_MOUSE_SCROLL_BTN_MASK (1<<PS2_MOUSE_BUTTON_MIDDLE) /* Default */
+```
+
+To disable the scroll button feature:
+
+```
+#define PS2_MOUSE_SCROLL_BTN_MASK 0
+```
+
+The available buttons are:
+
+```
+#define PS2_MOUSE_BTN_LEFT      0
+#define PS2_MOUSE_BTN_RIGHT     1
+#define PS2_MOUSE_BTN_MIDDLE    2
+```
+
+You can also combine buttons in the mask by `|`ing them together.
+
+Once you've configured your scroll button mask, you must configure the scroll button send interval.
+This is the interval before which if the scroll buttons were released they would be sent to the host.
+After this interval, they will cause the mouse to scroll and will not be sent.
+
+```
+#define PS2_MOUSE_SCROLL_BTN_SEND 300 /* Default */
+```
+
+To disable sending the scroll buttons:
+```
+#define PS2_MOUSE_SCROLL_BTN_SEND 0
+```
+
+Fine control over the scrolling is supported with the following defines:
+
+```
+#define PS2_MOUSE_SCROLL_DIVISOR_H 2
+#define PS2_MOUSE_SCROLL_DIVISOR_V 2
+```
+
+#### Debug settings
+
+To debug the mouse, add `debug_mouse = true` or enable via bootmagic.
+
+```
+/* To debug the mouse reports */
+#define PS2_MOUSE_DEBUG_HID
+#define PS2_MOUSE_DEBUG_RAW
+```
+
 ## Safety Considerations
 
 You probably don't want to "brick" your keyboard, making it impossible

From f0768f8be96fb7a9af354d5f1584b0f67cc5b960 Mon Sep 17 00:00:00 2001
From: Ofer Plesser <plesserofer@gmail.com>
Date: Sat, 3 Dec 2016 13:41:56 +0200
Subject: [PATCH 129/147] Forgot to use define in delay instead of hardcoded
 number

---
 tmk_core/protocol/ps2_mouse.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index 04c15dd4fdc..af971dd4975 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/tmk_core/protocol/ps2_mouse.c
@@ -88,7 +88,7 @@ static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report);
 void ps2_mouse_init(void) {
     ps2_host_init();
 
-    _delay_ms(1000);    // wait for powering up
+    _delay_ms(PS2_MOUSE_INIT_DELAY);    // wait for powering up
 
     PS2_MOUSE_SEND(PS2_MOUSE_RESET, "ps2_mouse_init: sending reset");
 

From f39e1b5dfe7552f01dbc6eab95c268f41a9d98e2 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Sat, 3 Dec 2016 14:36:39 -0500
Subject: [PATCH 130/147] cleans-up formatting of readme

---
 readme.md | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/readme.md b/readme.md
index 1f06fe79fa0..b618334dc33 100644
--- a/readme.md
+++ b/readme.md
@@ -1442,13 +1442,16 @@ what things are (and likely aren't) too risky.
   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]
+
+```
+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

From ae66f0d70214b8a5e81ecf5977619bcd4bf6f413 Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@gmail.com>
Date: Sat, 3 Dec 2016 17:09:11 -0500
Subject: [PATCH 131/147] added plate files for lets split

---
 keyboards/pilcrow/Makefile                   |    3 +
 keyboards/pilcrow/config.h                   |  162 +
 keyboards/pilcrow/keymaps/default/Makefile   |   21 +
 keyboards/pilcrow/keymaps/default/config.h   |    8 +
 keyboards/pilcrow/keymaps/default/keymap.c   |   88 +
 keyboards/pilcrow/keymaps/default/readme.md  |    1 +
 keyboards/pilcrow/pilcrow.c                  |   28 +
 keyboards/pilcrow/pilcrow.h                  |   23 +
 keyboards/pilcrow/readme.md                  |   28 +
 keyboards/pilcrow/rules.mk                   |   67 +
 keyboards/weebkeeb/Makefile                  |    3 +
 keyboards/weebkeeb/aek.dxf                   | 6486 ++++++++++++++++++
 keyboards/weebkeeb/config.h                  |  162 +
 keyboards/weebkeeb/keymaps/default/Makefile  |   21 +
 keyboards/weebkeeb/keymaps/default/config.h  |    8 +
 keyboards/weebkeeb/keymaps/default/keymap.c  |  119 +
 keyboards/weebkeeb/keymaps/default/readme.md |    1 +
 keyboards/weebkeeb/readme.md                 |   28 +
 keyboards/weebkeeb/rules.mk                  |   67 +
 keyboards/weebkeeb/weebkeeb.c                |   28 +
 keyboards/weebkeeb/weebkeeb.h                |   23 +
 21 files changed, 7375 insertions(+)
 create mode 100644 keyboards/pilcrow/Makefile
 create mode 100644 keyboards/pilcrow/config.h
 create mode 100644 keyboards/pilcrow/keymaps/default/Makefile
 create mode 100644 keyboards/pilcrow/keymaps/default/config.h
 create mode 100644 keyboards/pilcrow/keymaps/default/keymap.c
 create mode 100644 keyboards/pilcrow/keymaps/default/readme.md
 create mode 100644 keyboards/pilcrow/pilcrow.c
 create mode 100644 keyboards/pilcrow/pilcrow.h
 create mode 100644 keyboards/pilcrow/readme.md
 create mode 100644 keyboards/pilcrow/rules.mk
 create mode 100644 keyboards/weebkeeb/Makefile
 create mode 100644 keyboards/weebkeeb/aek.dxf
 create mode 100644 keyboards/weebkeeb/config.h
 create mode 100644 keyboards/weebkeeb/keymaps/default/Makefile
 create mode 100644 keyboards/weebkeeb/keymaps/default/config.h
 create mode 100644 keyboards/weebkeeb/keymaps/default/keymap.c
 create mode 100644 keyboards/weebkeeb/keymaps/default/readme.md
 create mode 100644 keyboards/weebkeeb/readme.md
 create mode 100644 keyboards/weebkeeb/rules.mk
 create mode 100644 keyboards/weebkeeb/weebkeeb.c
 create mode 100644 keyboards/weebkeeb/weebkeeb.h

diff --git a/keyboards/pilcrow/Makefile b/keyboards/pilcrow/Makefile
new file mode 100644
index 00000000000..4e2a6f00fd8
--- /dev/null
+++ b/keyboards/pilcrow/Makefile
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+	include ../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/pilcrow/config.h b/keyboards/pilcrow/config.h
new file mode 100644
index 00000000000..d79c1ba40c8
--- /dev/null
+++ b/keyboards/pilcrow/config.h
@@ -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      0x6060
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    You
+#define PRODUCT         pilcrow
+#define DESCRIPTION     A custom keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 10
+
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+*/
+#define MATRIX_ROW_PINS { B2, C6, D7, E6 }
+#define MATRIX_COL_PINS { B6, D1, B4, B5, D4, D0, B3, B1, F7, F6 }
+#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/pilcrow/keymaps/default/Makefile b/keyboards/pilcrow/keymaps/default/Makefile
new file mode 100644
index 00000000000..f4671a9d113
--- /dev/null
+++ b/keyboards/pilcrow/keymaps/default/Makefile
@@ -0,0 +1,21 @@
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE = no         # Console for debug(+400)
+COMMAND_ENABLE = yes        # Commands for debug and configuration
+NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = no           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
+
+ifndef QUANTUM_DIR
+	include ../../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/pilcrow/keymaps/default/config.h b/keyboards/pilcrow/keymaps/default/config.h
new file mode 100644
index 00000000000..df06a262062
--- /dev/null
+++ b/keyboards/pilcrow/keymaps/default/config.h
@@ -0,0 +1,8 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "../../config.h"
+
+// place overrides here
+
+#endif
\ No newline at end of file
diff --git a/keyboards/pilcrow/keymaps/default/keymap.c b/keyboards/pilcrow/keymaps/default/keymap.c
new file mode 100644
index 00000000000..e382e4c6ad1
--- /dev/null
+++ b/keyboards/pilcrow/keymaps/default/keymap.c
@@ -0,0 +1,88 @@
+#include "pilcrow.h"
+#define _______ KC_TRNS
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = KEYMAP( \
+  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P, \
+  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, \
+  KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, \
+  KC_LCTL, KC_LALT, KC_LGUI, MO(1),   KC_SPC,  MT(MOD_LSFT, KC_SPC), MO(2),   MO(3),   KC_DEL, KC_ESC \
+),
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[1] = KEYMAP( \
+  KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \
+  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, \
+  KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),KC_PIPE, S(KC_QUOT), \
+  _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_GRV \
+),
+[2] = KEYMAP( \
+  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0, \
+  KC_TAB,  KC_LEFT, KC_DOWN, KC_UP,   KC_RIGHT,KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, \
+  OSM(MOD_LSFT),  KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, KC_BSLS, KC_QUOT, \
+  _______, _______, _______, _______, KC_ENT,  KC_ENT,  _______, KC_MNXT, KC_VOLD, KC_VOLU \
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      |      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[3] =  KEYMAP( \
+  RESET,   KC_UP, _______, _______, _______, _______, _______, KC_MS_WH_DOWN, KC_MS_U, KC_MS_WH_UP, \
+  KC_LEFT, KC_DOWN, KC_RIGHT, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, KC_MS_L,KC_MS_D, KC_MS_R, \
+  RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, \
+  _______, _______, _______, _______, KC_MS_BTN1, KC_MS_BTN2, _______, _______, _______, _______ \
+)
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
+
+
+void matrix_init_user(void) {
+
+}
+
+void matrix_scan_user(void) {
+
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  return true;
+}
+
+void led_set_user(uint8_t usb_led) {
+
+}
\ No newline at end of file
diff --git a/keyboards/pilcrow/keymaps/default/readme.md b/keyboards/pilcrow/keymaps/default/readme.md
new file mode 100644
index 00000000000..95472dfca89
--- /dev/null
+++ b/keyboards/pilcrow/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for pilcrow
\ No newline at end of file
diff --git a/keyboards/pilcrow/pilcrow.c b/keyboards/pilcrow/pilcrow.c
new file mode 100644
index 00000000000..c8243df7bff
--- /dev/null
+++ b/keyboards/pilcrow/pilcrow.c
@@ -0,0 +1,28 @@
+#include "pilcrow.h"
+
+void matrix_init_kb(void) {
+	// put your keyboard start-up code here
+	// runs once when the firmware starts up
+
+	matrix_init_user();
+}
+
+void matrix_scan_kb(void) {
+	// put your looping keyboard code here
+	// runs every cycle (a lot)
+
+	matrix_scan_user();
+}
+
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+	// put your per-action keyboard code here
+	// runs for every action, just before processing by the firmware
+
+	return process_record_user(keycode, record);
+}
+
+void led_set_kb(uint8_t usb_led) {
+	// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
+
+	led_set_user(usb_led);
+}
diff --git a/keyboards/pilcrow/pilcrow.h b/keyboards/pilcrow/pilcrow.h
new file mode 100644
index 00000000000..7138ccb3f62
--- /dev/null
+++ b/keyboards/pilcrow/pilcrow.h
@@ -0,0 +1,23 @@
+#ifndef PILCROW_H
+#define PILCROW_H
+
+#include "quantum.h"
+
+// This a shortcut to help you visually see your layout.
+// The following is an example using the Planck MIT layout
+// The first section contains all of the arguements
+// The second converts the arguments into a two-dimensional array
+#define KEYMAP( \
+    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \
+    k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \
+    k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \
+    k30, k31, k32, k33, k34, k35, k36, k37, k38, k39 \
+) \
+{ \
+    { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09 }, \
+    { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19 }, \
+    { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29 }, \
+    { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39 } \
+}
+
+#endif
diff --git a/keyboards/pilcrow/readme.md b/keyboards/pilcrow/readme.md
new file mode 100644
index 00000000000..7a7f6d2af58
--- /dev/null
+++ b/keyboards/pilcrow/readme.md
@@ -0,0 +1,28 @@
+pilcrow keyboard firmware
+======================
+
+## Quantum MK Firmware
+
+For the full Quantum feature list, see [the parent readme](/).
+
+## Building
+
+Download or clone the whole firmware and navigate to the keyboards/pilcrow folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. 
+
+Depending on which keymap you would like to use, you will have to compile slightly differently.
+
+### Default
+
+To build with the default keymap, simply run `make default`.
+
+### Other Keymaps
+
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
+
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
+```
+$ make [default|jack|<name>]
+```
+
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboards/pilcrow/rules.mk b/keyboards/pilcrow/rules.mk
new file mode 100644
index 00000000000..55898147dd3
--- /dev/null
+++ b/keyboards/pilcrow/rules.mk
@@ -0,0 +1,67 @@
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
diff --git a/keyboards/weebkeeb/Makefile b/keyboards/weebkeeb/Makefile
new file mode 100644
index 00000000000..4e2a6f00fd8
--- /dev/null
+++ b/keyboards/weebkeeb/Makefile
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+	include ../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/weebkeeb/aek.dxf b/keyboards/weebkeeb/aek.dxf
new file mode 100644
index 00000000000..cfe80946bdb
--- /dev/null
+++ b/keyboards/weebkeeb/aek.dxf
@@ -0,0 +1,6486 @@
+0
+SECTION
+2
+ENTITIES
+0
+LINE
+8
+0
+10
+104.7875
+20
+-89.2875
+11
+104.7875
+21
+-91.6875
+0
+LINE
+8
+0
+10
+104.7875
+20
+-91.6875
+11
+102.3875
+21
+-91.6875
+0
+LINE
+8
+0
+10
+102.3875
+20
+-91.6875
+11
+102.3875
+21
+-89.2875
+0
+LINE
+8
+0
+10
+102.3875
+20
+-89.2875
+11
+104.7875
+21
+-89.2875
+0
+LINE
+8
+0
+10
+116.8875
+20
+-89.2875
+11
+116.8875
+21
+-91.6875
+0
+LINE
+8
+0
+10
+116.8875
+20
+-91.6875
+11
+114.4875
+21
+-91.6875
+0
+LINE
+8
+0
+10
+114.4875
+20
+-91.6875
+11
+114.4875
+21
+-89.2875
+0
+LINE
+8
+0
+10
+114.4875
+20
+-89.2875
+11
+116.8875
+21
+-89.2875
+0
+CIRCLE
+8
+0
+10
+109.6375
+20
+-90.4875
+40
+3.15
+0
+LINE
+8
+0
+10
+103.4875
+20
+-94.3875
+11
+103.4875
+21
+-99.4875
+0
+LINE
+8
+0
+10
+103.4875
+20
+-99.4875
+11
+100.8875
+21
+-99.4875
+0
+LINE
+8
+0
+10
+100.8875
+20
+-99.4875
+11
+100.8875
+21
+-94.3875
+0
+LINE
+8
+0
+10
+100.8875
+20
+-94.3875
+11
+103.4875
+21
+-94.3875
+0
+LINE
+8
+0
+10
+191.7875
+20
+-94.3875
+11
+191.7875
+21
+-99.4875
+0
+LINE
+8
+0
+10
+191.7875
+20
+-99.4875
+11
+194.3875
+21
+-99.4875
+0
+LINE
+8
+0
+10
+194.3875
+20
+-99.4875
+11
+194.3875
+21
+-94.3875
+0
+LINE
+8
+0
+10
+194.3875
+20
+-94.3875
+11
+191.7875
+21
+-94.3875
+0
+LINE
+8
+0
+10
+155.3875
+20
+-84.0875
+11
+139.8875
+21
+-84.0875
+0
+LINE
+8
+0
+10
+139.8875
+20
+-84.0875
+11
+139.8875
+21
+-96.8875
+0
+LINE
+8
+0
+10
+139.8875
+20
+-96.8875
+11
+155.3875
+21
+-96.8875
+0
+LINE
+8
+0
+10
+155.3875
+20
+-96.8875
+11
+155.3875
+21
+-84.0875
+0
+LINE
+8
+0
+10
+256.28125
+20
+-56.2875
+11
+256.28125
+21
+-61.3875
+0
+LINE
+8
+0
+10
+256.28125
+20
+-61.3875
+11
+253.68125
+21
+-61.3875
+0
+LINE
+8
+0
+10
+253.68125
+20
+-61.3875
+11
+253.68125
+21
+-56.2875
+0
+LINE
+8
+0
+10
+253.68125
+20
+-56.2875
+11
+256.28125
+21
+-56.2875
+0
+LINE
+8
+0
+10
+281.88125
+20
+-56.2875
+11
+281.88125
+21
+-61.3875
+0
+LINE
+8
+0
+10
+281.88125
+20
+-61.3875
+11
+284.48125
+21
+-61.3875
+0
+LINE
+8
+0
+10
+284.48125
+20
+-61.3875
+11
+284.48125
+21
+-56.2875
+0
+LINE
+8
+0
+10
+284.48125
+20
+-56.2875
+11
+281.88125
+21
+-56.2875
+0
+LINE
+8
+0
+10
+276.83125
+20
+-45.9875
+11
+261.33125
+21
+-45.9875
+0
+LINE
+8
+0
+10
+261.33125
+20
+-45.9875
+11
+261.33125
+21
+-58.7875
+0
+LINE
+8
+0
+10
+261.33125
+20
+-58.7875
+11
+276.83125
+21
+-58.7875
+0
+LINE
+8
+0
+10
+276.83125
+20
+-58.7875
+11
+276.83125
+21
+-45.9875
+0
+LINE
+8
+0
+10
+258.6625
+20
+-18.1875
+11
+258.6625
+21
+-23.2875
+0
+LINE
+8
+0
+10
+258.6625
+20
+-23.2875
+11
+256.0625
+21
+-23.2875
+0
+LINE
+8
+0
+10
+256.0625
+20
+-23.2875
+11
+256.0625
+21
+-18.1875
+0
+LINE
+8
+0
+10
+256.0625
+20
+-18.1875
+11
+258.6625
+21
+-18.1875
+0
+LINE
+8
+0
+10
+284.2625
+20
+-18.1875
+11
+284.2625
+21
+-23.2875
+0
+LINE
+8
+0
+10
+284.2625
+20
+-23.2875
+11
+286.8625
+21
+-23.2875
+0
+LINE
+8
+0
+10
+286.8625
+20
+-23.2875
+11
+286.8625
+21
+-18.1875
+0
+LINE
+8
+0
+10
+286.8625
+20
+-18.1875
+11
+284.2625
+21
+-18.1875
+0
+LINE
+8
+0
+10
+279.2125
+20
+-7.8875
+11
+263.7125
+21
+-7.8875
+0
+LINE
+8
+0
+10
+263.7125
+20
+-7.8875
+11
+263.7125
+21
+-20.6875
+0
+LINE
+8
+0
+10
+263.7125
+20
+-20.6875
+11
+279.2125
+21
+-20.6875
+0
+LINE
+8
+0
+10
+279.2125
+20
+-20.6875
+11
+279.2125
+21
+-7.8875
+0
+LINE
+8
+0
+10
+13.39375
+20
+-75.3375
+11
+13.39375
+21
+-80.4375
+0
+LINE
+8
+0
+10
+13.39375
+20
+-80.4375
+11
+10.79375
+21
+-80.4375
+0
+LINE
+8
+0
+10
+10.79375
+20
+-80.4375
+11
+10.79375
+21
+-75.3375
+0
+LINE
+8
+0
+10
+10.79375
+20
+-75.3375
+11
+13.39375
+21
+-75.3375
+0
+LINE
+8
+0
+10
+38.99375
+20
+-75.3375
+11
+38.99375
+21
+-80.4375
+0
+LINE
+8
+0
+10
+38.99375
+20
+-80.4375
+11
+41.59375
+21
+-80.4375
+0
+LINE
+8
+0
+10
+41.59375
+20
+-80.4375
+11
+41.59375
+21
+-75.3375
+0
+LINE
+8
+0
+10
+41.59375
+20
+-75.3375
+11
+38.99375
+21
+-75.3375
+0
+LINE
+8
+0
+10
+33.94375
+20
+-65.0375
+11
+18.44375
+21
+-65.0375
+0
+LINE
+8
+0
+10
+18.44375
+20
+-65.0375
+11
+18.44375
+21
+-77.8375
+0
+LINE
+8
+0
+10
+18.44375
+20
+-77.8375
+11
+33.94375
+21
+-77.8375
+0
+LINE
+8
+0
+10
+33.94375
+20
+-77.8375
+11
+33.94375
+21
+-65.0375
+0
+LINE
+8
+0
+10
+193.4875
+20
+-7.8875
+11
+177.9875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+177.9875
+20
+-7.8875
+11
+177.9875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+177.9875
+20
+-20.6875
+11
+193.4875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+193.4875
+20
+-20.6875
+11
+193.4875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+174.4375
+20
+-7.8875
+11
+158.9375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+158.9375
+20
+-7.8875
+11
+158.9375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+158.9375
+20
+-20.6875
+11
+174.4375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+174.4375
+20
+-20.6875
+11
+174.4375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+183.9625
+20
+-26.9375
+11
+168.4625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+168.4625
+20
+-26.9375
+11
+168.4625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+168.4625
+20
+-39.7375
+11
+183.9625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+183.9625
+20
+-39.7375
+11
+183.9625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+169.675
+20
+-45.9875
+11
+154.175
+21
+-45.9875
+0
+LINE
+8
+0
+10
+154.175
+20
+-45.9875
+11
+154.175
+21
+-58.7875
+0
+LINE
+8
+0
+10
+154.175
+20
+-58.7875
+11
+169.675
+21
+-58.7875
+0
+LINE
+8
+0
+10
+169.675
+20
+-58.7875
+11
+169.675
+21
+-45.9875
+0
+LINE
+8
+0
+10
+150.625
+20
+-45.9875
+11
+135.125
+21
+-45.9875
+0
+LINE
+8
+0
+10
+135.125
+20
+-45.9875
+11
+135.125
+21
+-58.7875
+0
+LINE
+8
+0
+10
+135.125
+20
+-58.7875
+11
+150.625
+21
+-58.7875
+0
+LINE
+8
+0
+10
+150.625
+20
+-58.7875
+11
+150.625
+21
+-45.9875
+0
+LINE
+8
+0
+10
+160.15
+20
+-65.0375
+11
+144.65
+21
+-65.0375
+0
+LINE
+8
+0
+10
+144.65
+20
+-65.0375
+11
+144.65
+21
+-77.8375
+0
+LINE
+8
+0
+10
+144.65
+20
+-77.8375
+11
+160.15
+21
+-77.8375
+0
+LINE
+8
+0
+10
+160.15
+20
+-77.8375
+11
+160.15
+21
+-65.0375
+0
+LINE
+8
+0
+10
+141.1
+20
+-65.0375
+11
+125.6
+21
+-65.0375
+0
+LINE
+8
+0
+10
+125.6
+20
+-65.0375
+11
+125.6
+21
+-77.8375
+0
+LINE
+8
+0
+10
+125.6
+20
+-77.8375
+11
+141.1
+21
+-77.8375
+0
+LINE
+8
+0
+10
+141.1
+20
+-77.8375
+11
+141.1
+21
+-65.0375
+0
+LINE
+8
+0
+10
+155.3875
+20
+-7.8875
+11
+139.8875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+139.8875
+20
+-7.8875
+11
+139.8875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+139.8875
+20
+-20.6875
+11
+155.3875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+155.3875
+20
+-20.6875
+11
+155.3875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+136.3375
+20
+-7.8875
+11
+120.8375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+120.8375
+20
+-7.8875
+11
+120.8375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+120.8375
+20
+-20.6875
+11
+136.3375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+136.3375
+20
+-20.6875
+11
+136.3375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+164.9125
+20
+-26.9375
+11
+149.4125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+149.4125
+20
+-26.9375
+11
+149.4125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+149.4125
+20
+-39.7375
+11
+164.9125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+164.9125
+20
+-39.7375
+11
+164.9125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+145.8625
+20
+-26.9375
+11
+130.3625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+130.3625
+20
+-26.9375
+11
+130.3625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+130.3625
+20
+-39.7375
+11
+145.8625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+145.8625
+20
+-39.7375
+11
+145.8625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+131.575
+20
+-45.9875
+11
+116.075
+21
+-45.9875
+0
+LINE
+8
+0
+10
+116.075
+20
+-45.9875
+11
+116.075
+21
+-58.7875
+0
+LINE
+8
+0
+10
+116.075
+20
+-58.7875
+11
+131.575
+21
+-58.7875
+0
+LINE
+8
+0
+10
+131.575
+20
+-58.7875
+11
+131.575
+21
+-45.9875
+0
+LINE
+8
+0
+10
+122.05
+20
+-65.0375
+11
+106.55
+21
+-65.0375
+0
+LINE
+8
+0
+10
+106.55
+20
+-65.0375
+11
+106.55
+21
+-77.8375
+0
+LINE
+8
+0
+10
+106.55
+20
+-77.8375
+11
+122.05
+21
+-77.8375
+0
+LINE
+8
+0
+10
+122.05
+20
+-77.8375
+11
+122.05
+21
+-65.0375
+0
+LINE
+8
+0
+10
+103.0
+20
+-65.0375
+11
+87.5
+21
+-65.0375
+0
+LINE
+8
+0
+10
+87.5
+20
+-65.0375
+11
+87.5
+21
+-77.8375
+0
+LINE
+8
+0
+10
+87.5
+20
+-77.8375
+11
+103.0
+21
+-77.8375
+0
+LINE
+8
+0
+10
+103.0
+20
+-77.8375
+11
+103.0
+21
+-65.0375
+0
+LINE
+8
+0
+10
+117.2875
+20
+-7.8875
+11
+101.7875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+101.7875
+20
+-7.8875
+11
+101.7875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+101.7875
+20
+-20.6875
+11
+117.2875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+117.2875
+20
+-20.6875
+11
+117.2875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+98.2375
+20
+-7.8875
+11
+82.7375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+82.7375
+20
+-7.8875
+11
+82.7375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+82.7375
+20
+-20.6875
+11
+98.2375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+98.2375
+20
+-20.6875
+11
+98.2375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+126.8125
+20
+-26.9375
+11
+111.3125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+111.3125
+20
+-26.9375
+11
+111.3125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+111.3125
+20
+-39.7375
+11
+126.8125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+126.8125
+20
+-39.7375
+11
+126.8125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+107.7625
+20
+-26.9375
+11
+92.2625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+92.2625
+20
+-26.9375
+11
+92.2625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+92.2625
+20
+-39.7375
+11
+107.7625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+107.7625
+20
+-39.7375
+11
+107.7625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+112.525
+20
+-45.9875
+11
+97.025
+21
+-45.9875
+0
+LINE
+8
+0
+10
+97.025
+20
+-45.9875
+11
+97.025
+21
+-58.7875
+0
+LINE
+8
+0
+10
+97.025
+20
+-58.7875
+11
+112.525
+21
+-58.7875
+0
+LINE
+8
+0
+10
+112.525
+20
+-58.7875
+11
+112.525
+21
+-45.9875
+0
+LINE
+8
+0
+10
+93.475
+20
+-45.9875
+11
+77.975
+21
+-45.9875
+0
+LINE
+8
+0
+10
+77.975
+20
+-45.9875
+11
+77.975
+21
+-58.7875
+0
+LINE
+8
+0
+10
+77.975
+20
+-58.7875
+11
+93.475
+21
+-58.7875
+0
+LINE
+8
+0
+10
+93.475
+20
+-58.7875
+11
+93.475
+21
+-45.9875
+0
+LINE
+8
+0
+10
+83.95
+20
+-65.0375
+11
+68.45
+21
+-65.0375
+0
+LINE
+8
+0
+10
+68.45
+20
+-65.0375
+11
+68.45
+21
+-77.8375
+0
+LINE
+8
+0
+10
+68.45
+20
+-77.8375
+11
+83.95
+21
+-77.8375
+0
+LINE
+8
+0
+10
+83.95
+20
+-77.8375
+11
+83.95
+21
+-65.0375
+0
+LINE
+8
+0
+10
+79.1875
+20
+-84.0875
+11
+63.6875
+21
+-84.0875
+0
+LINE
+8
+0
+10
+63.6875
+20
+-84.0875
+11
+63.6875
+21
+-96.8875
+0
+LINE
+8
+0
+10
+63.6875
+20
+-96.8875
+11
+79.1875
+21
+-96.8875
+0
+LINE
+8
+0
+10
+79.1875
+20
+-96.8875
+11
+79.1875
+21
+-84.0875
+0
+LINE
+8
+0
+10
+79.1875
+20
+-7.8875
+11
+63.6875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+63.6875
+20
+-7.8875
+11
+63.6875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+63.6875
+20
+-20.6875
+11
+79.1875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+79.1875
+20
+-20.6875
+11
+79.1875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+60.1375
+20
+-7.8875
+11
+44.6375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+44.6375
+20
+-7.8875
+11
+44.6375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+44.6375
+20
+-20.6875
+11
+60.1375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+60.1375
+20
+-20.6875
+11
+60.1375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+88.7125
+20
+-26.9375
+11
+73.2125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+73.2125
+20
+-26.9375
+11
+73.2125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+73.2125
+20
+-39.7375
+11
+88.7125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+88.7125
+20
+-39.7375
+11
+88.7125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+69.6625
+20
+-26.9375
+11
+54.1625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+54.1625
+20
+-26.9375
+11
+54.1625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+54.1625
+20
+-39.7375
+11
+69.6625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+69.6625
+20
+-39.7375
+11
+69.6625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+74.425
+20
+-45.9875
+11
+58.925
+21
+-45.9875
+0
+LINE
+8
+0
+10
+58.925
+20
+-45.9875
+11
+58.925
+21
+-58.7875
+0
+LINE
+8
+0
+10
+58.925
+20
+-58.7875
+11
+74.425
+21
+-58.7875
+0
+LINE
+8
+0
+10
+74.425
+20
+-58.7875
+11
+74.425
+21
+-45.9875
+0
+LINE
+8
+0
+10
+64.9
+20
+-65.0375
+11
+49.4
+21
+-65.0375
+0
+LINE
+8
+0
+10
+49.4
+20
+-65.0375
+11
+49.4
+21
+-77.8375
+0
+LINE
+8
+0
+10
+49.4
+20
+-77.8375
+11
+64.9
+21
+-77.8375
+0
+LINE
+8
+0
+10
+64.9
+20
+-77.8375
+11
+64.9
+21
+-65.0375
+0
+LINE
+8
+0
+10
+52.9937
+20
+-84.0875
+11
+37.4937
+21
+-84.0875
+0
+LINE
+8
+0
+10
+37.4937
+20
+-84.0875
+11
+37.4937
+21
+-96.8875
+0
+LINE
+8
+0
+10
+37.4937
+20
+-96.8875
+11
+52.9937
+21
+-96.8875
+0
+LINE
+8
+0
+10
+52.9937
+20
+-96.8875
+11
+52.9937
+21
+-84.0875
+0
+LINE
+8
+0
+10
+41.0875
+20
+-7.8875
+11
+25.5875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+25.5875
+20
+-7.8875
+11
+25.5875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+25.5875
+20
+-20.6875
+11
+41.0875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+41.0875
+20
+-20.6875
+11
+41.0875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+22.0375
+20
+-7.8875
+11
+6.5375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+6.5375
+20
+-7.8875
+11
+6.5375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+6.5375
+20
+-20.6875
+11
+22.0375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+22.0375
+20
+-20.6875
+11
+22.0375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+50.6125
+20
+-26.9375
+11
+35.1125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+35.1125
+20
+-26.9375
+11
+35.1125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+35.1125
+20
+-39.7375
+11
+50.6125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+50.6125
+20
+-39.7375
+11
+50.6125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+26.8
+20
+-26.9375
+11
+11.3
+21
+-26.9375
+0
+LINE
+8
+0
+10
+11.3
+20
+-26.9375
+11
+11.3
+21
+-39.7375
+0
+LINE
+8
+0
+10
+11.3
+20
+-39.7375
+11
+26.8
+21
+-39.7375
+0
+LINE
+8
+0
+10
+26.8
+20
+-39.7375
+11
+26.8
+21
+-26.9375
+0
+LINE
+8
+0
+10
+55.375
+20
+-45.9875
+11
+39.875
+21
+-45.9875
+0
+LINE
+8
+0
+10
+39.875
+20
+-45.9875
+11
+39.875
+21
+-58.7875
+0
+LINE
+8
+0
+10
+39.875
+20
+-58.7875
+11
+55.375
+21
+-58.7875
+0
+LINE
+8
+0
+10
+55.375
+20
+-58.7875
+11
+55.375
+21
+-45.9875
+0
+LINE
+8
+0
+10
+29.18125
+20
+-45.9875
+11
+13.68125
+21
+-45.9875
+0
+LINE
+8
+0
+10
+13.68125
+20
+-45.9875
+11
+13.68125
+21
+-58.7875
+0
+LINE
+8
+0
+10
+13.68125
+20
+-58.7875
+11
+29.18125
+21
+-58.7875
+0
+LINE
+8
+0
+10
+29.18125
+20
+-58.7875
+11
+29.18125
+21
+-45.9875
+0
+LINE
+8
+0
+10
+26.8
+20
+-84.0875
+11
+11.3
+21
+-84.0875
+0
+LINE
+8
+0
+10
+11.3
+20
+-84.0875
+11
+11.3
+21
+-96.8875
+0
+LINE
+8
+0
+10
+11.3
+20
+-96.8875
+11
+26.8
+21
+-96.8875
+0
+LINE
+8
+0
+10
+26.8
+20
+-96.8875
+11
+26.8
+21
+-84.0875
+0
+LINE
+8
+0
+10
+260.1625
+20
+-26.9375
+11
+244.6625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+244.6625
+20
+-26.9375
+11
+244.6625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+244.6625
+20
+-39.7375
+11
+260.1625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+260.1625
+20
+-39.7375
+11
+260.1625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+283.975
+20
+-26.9375
+11
+268.475
+21
+-26.9375
+0
+LINE
+8
+0
+10
+268.475
+20
+-26.9375
+11
+268.475
+21
+-39.7375
+0
+LINE
+8
+0
+10
+268.475
+20
+-39.7375
+11
+283.975
+21
+-39.7375
+0
+LINE
+8
+0
+10
+283.975
+20
+-39.7375
+11
+283.975
+21
+-26.9375
+0
+LINE
+8
+0
+10
+283.975
+20
+-84.0875
+11
+268.475
+21
+-84.0875
+0
+LINE
+8
+0
+10
+268.475
+20
+-84.0875
+11
+268.475
+21
+-96.8875
+0
+LINE
+8
+0
+10
+268.475
+20
+-96.8875
+11
+283.975
+21
+-96.8875
+0
+LINE
+8
+0
+10
+283.975
+20
+-96.8875
+11
+283.975
+21
+-84.0875
+0
+LINE
+8
+0
+10
+250.6375
+20
+-7.8875
+11
+235.1375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+235.1375
+20
+-7.8875
+11
+235.1375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+235.1375
+20
+-20.6875
+11
+250.6375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+250.6375
+20
+-20.6875
+11
+250.6375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+241.1125
+20
+-26.9375
+11
+225.6125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+225.6125
+20
+-26.9375
+11
+225.6125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+225.6125
+20
+-39.7375
+11
+241.1125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+241.1125
+20
+-39.7375
+11
+241.1125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+222.0625
+20
+-26.9375
+11
+206.5625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+206.5625
+20
+-26.9375
+11
+206.5625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+206.5625
+20
+-39.7375
+11
+222.0625
+21
+-39.7375
+0
+LINE
+8
+0
+10
+222.0625
+20
+-39.7375
+11
+222.0625
+21
+-26.9375
+0
+LINE
+8
+0
+10
+245.875
+20
+-45.9875
+11
+230.375
+21
+-45.9875
+0
+LINE
+8
+0
+10
+230.375
+20
+-45.9875
+11
+230.375
+21
+-58.7875
+0
+LINE
+8
+0
+10
+230.375
+20
+-58.7875
+11
+245.875
+21
+-58.7875
+0
+LINE
+8
+0
+10
+245.875
+20
+-58.7875
+11
+245.875
+21
+-45.9875
+0
+LINE
+8
+0
+10
+226.825
+20
+-45.9875
+11
+211.325
+21
+-45.9875
+0
+LINE
+8
+0
+10
+211.325
+20
+-45.9875
+11
+211.325
+21
+-58.7875
+0
+LINE
+8
+0
+10
+211.325
+20
+-58.7875
+11
+226.825
+21
+-58.7875
+0
+LINE
+8
+0
+10
+226.825
+20
+-58.7875
+11
+226.825
+21
+-45.9875
+0
+LINE
+8
+0
+10
+236.35
+20
+-65.0375
+11
+220.85
+21
+-65.0375
+0
+LINE
+8
+0
+10
+220.85
+20
+-65.0375
+11
+220.85
+21
+-77.8375
+0
+LINE
+8
+0
+10
+220.85
+20
+-77.8375
+11
+236.35
+21
+-77.8375
+0
+LINE
+8
+0
+10
+236.35
+20
+-77.8375
+11
+236.35
+21
+-65.0375
+0
+LINE
+8
+0
+10
+217.3
+20
+-65.0375
+11
+201.8
+21
+-65.0375
+0
+LINE
+8
+0
+10
+201.8
+20
+-65.0375
+11
+201.8
+21
+-77.8375
+0
+LINE
+8
+0
+10
+201.8
+20
+-77.8375
+11
+217.3
+21
+-77.8375
+0
+LINE
+8
+0
+10
+217.3
+20
+-77.8375
+11
+217.3
+21
+-65.0375
+0
+LINE
+8
+0
+10
+257.78125
+20
+-84.0875
+11
+242.28125
+21
+-84.0875
+0
+LINE
+8
+0
+10
+242.28125
+20
+-84.0875
+11
+242.28125
+21
+-96.8875
+0
+LINE
+8
+0
+10
+242.28125
+20
+-96.8875
+11
+257.78125
+21
+-96.8875
+0
+LINE
+8
+0
+10
+257.78125
+20
+-96.8875
+11
+257.78125
+21
+-84.0875
+0
+LINE
+8
+0
+10
+231.5875
+20
+-7.8875
+11
+216.0875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+216.0875
+20
+-7.8875
+11
+216.0875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+216.0875
+20
+-20.6875
+11
+231.5875
+21
+-20.6875
+0
+LINE
+8
+0
+10
+231.5875
+20
+-20.6875
+11
+231.5875
+21
+-7.8875
+0
+LINE
+8
+0
+10
+212.5375
+20
+-7.8875
+11
+197.0375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+197.0375
+20
+-7.8875
+11
+197.0375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+197.0375
+20
+-20.6875
+11
+212.5375
+21
+-20.6875
+0
+LINE
+8
+0
+10
+212.5375
+20
+-20.6875
+11
+212.5375
+21
+-7.8875
+0
+LINE
+8
+0
+10
+203.0125
+20
+-26.9375
+11
+187.5125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+187.5125
+20
+-26.9375
+11
+187.5125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+187.5125
+20
+-39.7375
+11
+203.0125
+21
+-39.7375
+0
+LINE
+8
+0
+10
+203.0125
+20
+-39.7375
+11
+203.0125
+21
+-26.9375
+0
+LINE
+8
+0
+10
+207.775
+20
+-45.9875
+11
+192.275
+21
+-45.9875
+0
+LINE
+8
+0
+10
+192.275
+20
+-45.9875
+11
+192.275
+21
+-58.7875
+0
+LINE
+8
+0
+10
+192.275
+20
+-58.7875
+11
+207.775
+21
+-58.7875
+0
+LINE
+8
+0
+10
+207.775
+20
+-58.7875
+11
+207.775
+21
+-45.9875
+0
+LINE
+8
+0
+10
+188.725
+20
+-45.9875
+11
+173.225
+21
+-45.9875
+0
+LINE
+8
+0
+10
+173.225
+20
+-45.9875
+11
+173.225
+21
+-58.7875
+0
+LINE
+8
+0
+10
+173.225
+20
+-58.7875
+11
+188.725
+21
+-58.7875
+0
+LINE
+8
+0
+10
+188.725
+20
+-58.7875
+11
+188.725
+21
+-45.9875
+0
+LINE
+8
+0
+10
+198.25
+20
+-65.0375
+11
+182.75
+21
+-65.0375
+0
+LINE
+8
+0
+10
+182.75
+20
+-65.0375
+11
+182.75
+21
+-77.8375
+0
+LINE
+8
+0
+10
+182.75
+20
+-77.8375
+11
+198.25
+21
+-77.8375
+0
+LINE
+8
+0
+10
+198.25
+20
+-77.8375
+11
+198.25
+21
+-65.0375
+0
+LINE
+8
+0
+10
+179.2
+20
+-65.0375
+11
+163.7
+21
+-65.0375
+0
+LINE
+8
+0
+10
+163.7
+20
+-65.0375
+11
+163.7
+21
+-77.8375
+0
+LINE
+8
+0
+10
+163.7
+20
+-77.8375
+11
+179.2
+21
+-77.8375
+0
+LINE
+8
+0
+10
+179.2
+20
+-77.8375
+11
+179.2
+21
+-65.0375
+0
+LINE
+8
+0
+10
+231.5875
+20
+-84.0875
+11
+216.0875
+21
+-84.0875
+0
+LINE
+8
+0
+10
+216.0875
+20
+-84.0875
+11
+216.0875
+21
+-96.8875
+0
+LINE
+8
+0
+10
+216.0875
+20
+-96.8875
+11
+231.5875
+21
+-96.8875
+0
+LINE
+8
+0
+10
+231.5875
+20
+-96.8875
+11
+231.5875
+21
+-84.0875
+0
+LINE
+8
+0
+10
+244.01875
+20
+-75.3375
+11
+244.01875
+21
+-80.4375
+0
+LINE
+8
+0
+10
+244.01875
+20
+-80.4375
+11
+241.41875
+21
+-80.4375
+0
+LINE
+8
+0
+10
+241.41875
+20
+-80.4375
+11
+241.41875
+21
+-75.3375
+0
+LINE
+8
+0
+10
+241.41875
+20
+-75.3375
+11
+244.01875
+21
+-75.3375
+0
+LINE
+8
+0
+10
+284.61875
+20
+-75.3375
+11
+284.61875
+21
+-80.4375
+0
+LINE
+8
+0
+10
+284.61875
+20
+-80.4375
+11
+287.21875
+21
+-80.4375
+0
+LINE
+8
+0
+10
+287.21875
+20
+-80.4375
+11
+287.21875
+21
+-75.3375
+0
+LINE
+8
+0
+10
+287.21875
+20
+-75.3375
+11
+284.61875
+21
+-75.3375
+0
+LINE
+8
+0
+10
+272.06875
+20
+-65.0375
+11
+256.56875
+21
+-65.0375
+0
+LINE
+8
+0
+10
+256.56875
+20
+-65.0375
+11
+256.56875
+21
+-77.8375
+0
+LINE
+8
+0
+10
+256.56875
+20
+-77.8375
+11
+272.06875
+21
+-77.8375
+0
+LINE
+8
+0
+10
+272.06875
+20
+-77.8375
+11
+272.06875
+21
+-65.0375
+0
+TEXT
+8
+Cmts
+62
+1
+10
+303.847897
+20
+-52.73062
+1
+95.000 mm 
+40
+1.5
+41
+1.5
+50
+270.186984
+7
+SIMPLEX
+72
+1
+73
+2
+11
+303.847897
+21
+-52.73062
+0
+LINE
+8
+Cmts
+62
+1
+10
+287.34
+20
+-100.28
+11
+305.35289
+21
+-100.221215
+0
+LINE
+8
+Cmts
+62
+1
+10
+287.03
+20
+-5.29
+11
+305.04289
+21
+-5.231215
+0
+LINE
+8
+Cmts
+62
+1
+10
+302.342904
+20
+-5.240026
+11
+302.652904
+21
+-100.230026
+0
+LINE
+8
+Cmts
+62
+1
+10
+302.652904
+20
+-100.230026
+11
+302.06281
+21
+-99.105442
+0
+LINE
+8
+Cmts
+62
+1
+10
+302.652904
+20
+-100.230026
+11
+303.235645
+21
+-99.101614
+0
+LINE
+8
+Cmts
+62
+1
+10
+302.342904
+20
+-5.240026
+11
+301.760163
+21
+-6.368438
+0
+LINE
+8
+Cmts
+62
+1
+10
+302.342904
+20
+-5.240026
+11
+302.932998
+21
+-6.36461
+0
+TEXT
+8
+Cmts
+62
+1
+10
+17.92
+20
+-43.7
+1
+25.6125 mm 
+40
+1.5
+41
+1.5
+7
+SIMPLEX
+72
+1
+73
+2
+11
+17.92
+21
+-43.7
+0
+LINE
+8
+Cmts
+62
+1
+10
+30.71
+20
+-33.34
+11
+30.71
+21
+-45.05
+0
+LINE
+8
+Cmts
+62
+1
+10
+5.13
+20
+-33.34
+11
+5.13
+21
+-45.05
+0
+LINE
+8
+Cmts
+62
+1
+10
+5.13
+20
+-42.35
+11
+30.71
+21
+-42.35
+0
+LINE
+8
+Cmts
+62
+1
+10
+30.71
+20
+-42.35
+11
+29.583496
+21
+-42.936421
+0
+LINE
+8
+Cmts
+62
+1
+10
+30.71
+20
+-42.35
+11
+29.583496
+21
+-41.763579
+0
+LINE
+8
+Cmts
+62
+1
+10
+5.13
+20
+-42.35
+11
+6.256504
+21
+-42.936421
+0
+LINE
+8
+Cmts
+62
+1
+10
+5.13
+20
+-42.35
+11
+6.256504
+21
+-41.763579
+0
+TEXT
+8
+Cmts
+62
+1
+10
+277.347461
+20
+-39.634741
+1
+25.6125 mm 
+40
+1.5
+41
+1.5
+50
+0.022425
+7
+SIMPLEX
+72
+1
+73
+2
+11
+277.347461
+21
+-39.634741
+0
+LINE
+8
+Cmts
+62
+1
+10
+290.12
+20
+-33.34
+11
+290.12299
+21
+-40.979741
+0
+LINE
+8
+Cmts
+62
+1
+10
+264.57
+20
+-33.35
+11
+264.57299
+21
+-40.989741
+0
+LINE
+8
+Cmts
+62
+1
+10
+264.571933
+20
+-38.289741
+11
+290.121933
+21
+-38.279741
+0
+LINE
+8
+Cmts
+62
+1
+10
+290.121933
+20
+-38.279741
+11
+288.995659
+21
+-38.866603
+0
+LINE
+8
+Cmts
+62
+1
+10
+290.121933
+20
+-38.279741
+11
+288.9952
+21
+-37.693761
+0
+LINE
+8
+Cmts
+62
+1
+10
+264.571933
+20
+-38.289741
+11
+265.698666
+21
+-38.875721
+0
+LINE
+8
+Cmts
+62
+1
+10
+264.571933
+20
+-38.289741
+11
+265.698207
+21
+-37.702879
+0
+TEXT
+8
+Cmts
+62
+1
+10
+202.7
+20
+-90.49
+1
+6.300 mm 
+40
+1.5
+41
+1.5
+50
+270.0
+7
+SIMPLEX
+72
+1
+73
+2
+11
+202.7
+21
+-90.49
+0
+LINE
+8
+Cmts
+62
+1
+10
+195.44
+20
+-93.64
+11
+204.05
+21
+-93.64
+0
+LINE
+8
+Cmts
+62
+1
+10
+195.44
+20
+-87.34
+11
+204.05
+21
+-87.34
+0
+LINE
+8
+Cmts
+62
+1
+10
+201.35
+20
+-87.34
+11
+201.35
+21
+-93.64
+0
+LINE
+8
+Cmts
+62
+1
+10
+201.35
+20
+-93.64
+11
+200.763579
+21
+-92.513496
+0
+LINE
+8
+Cmts
+62
+1
+10
+201.35
+20
+-93.64
+11
+201.936421
+21
+-92.513496
+0
+LINE
+8
+Cmts
+62
+1
+10
+201.35
+20
+-87.34
+11
+200.763579
+21
+-88.466504
+0
+LINE
+8
+Cmts
+62
+1
+10
+201.35
+20
+-87.34
+11
+201.936421
+21
+-88.466504
+0
+TEXT
+8
+Cmts
+62
+1
+10
+258.43468
+20
+-33.349763
+1
+6.300 mm 
+40
+1.5
+41
+1.5
+50
+270.090946
+7
+SIMPLEX
+72
+1
+73
+2
+11
+258.43468
+21
+-33.349763
+0
+LINE
+8
+Cmts
+62
+1
+10
+264.59
+20
+-36.49
+11
+257.089682
+21
+-36.501906
+0
+LINE
+8
+Cmts
+62
+1
+10
+264.58
+20
+-30.19
+11
+257.079682
+21
+-30.201906
+0
+LINE
+8
+Cmts
+62
+1
+10
+259.779679
+20
+-30.19762
+11
+259.789679
+21
+-36.49762
+0
+LINE
+8
+Cmts
+62
+1
+10
+259.789679
+20
+-36.49762
+11
+259.201471
+21
+-35.372048
+0
+LINE
+8
+Cmts
+62
+1
+10
+259.789679
+20
+-36.49762
+11
+260.374311
+21
+-35.370187
+0
+LINE
+8
+Cmts
+62
+1
+10
+259.779679
+20
+-30.19762
+11
+259.195047
+21
+-31.325053
+0
+LINE
+8
+Cmts
+62
+1
+10
+259.779679
+20
+-30.19762
+11
+260.367887
+21
+-31.323192
+0
+TEXT
+8
+Cmts
+62
+1
+10
+24.47
+20
+-33.33
+1
+6.300 mm 
+40
+1.5
+41
+1.5
+50
+270.0
+7
+SIMPLEX
+72
+1
+73
+2
+11
+24.47
+21
+-33.33
+0
+LINE
+8
+Cmts
+62
+1
+10
+30.72
+20
+-36.48
+11
+23.12
+21
+-36.48
+0
+LINE
+8
+Cmts
+62
+1
+10
+30.72
+20
+-30.18
+11
+23.12
+21
+-30.18
+0
+LINE
+8
+Cmts
+62
+1
+10
+25.82
+20
+-30.18
+11
+25.82
+21
+-36.48
+0
+LINE
+8
+Cmts
+62
+1
+10
+25.82
+20
+-36.48
+11
+25.233579
+21
+-35.353496
+0
+LINE
+8
+Cmts
+62
+1
+10
+25.82
+20
+-36.48
+11
+26.406421
+21
+-35.353496
+0
+LINE
+8
+Cmts
+62
+1
+10
+25.82
+20
+-30.18
+11
+25.233579
+21
+-31.306504
+0
+LINE
+8
+Cmts
+62
+1
+10
+25.82
+20
+-30.18
+11
+26.406421
+21
+-31.306504
+0
+TEXT
+8
+Cmts
+62
+1
+10
+103.46
+20
+-90.49
+1
+6.300 mm 
+40
+1.5
+41
+1.5
+50
+270.0
+7
+SIMPLEX
+72
+1
+73
+2
+11
+103.46
+21
+-90.49
+0
+LINE
+8
+Cmts
+62
+1
+10
+109.64
+20
+-93.64
+11
+102.11
+21
+-93.64
+0
+LINE
+8
+Cmts
+62
+1
+10
+109.64
+20
+-87.34
+11
+102.11
+21
+-87.34
+0
+LINE
+8
+Cmts
+62
+1
+10
+104.81
+20
+-87.34
+11
+104.81
+21
+-93.64
+0
+LINE
+8
+Cmts
+62
+1
+10
+104.81
+20
+-93.64
+11
+104.223579
+21
+-92.513496
+0
+LINE
+8
+Cmts
+62
+1
+10
+104.81
+20
+-93.64
+11
+105.396421
+21
+-92.513496
+0
+LINE
+8
+Cmts
+62
+1
+10
+104.81
+20
+-87.34
+11
+104.223579
+21
+-88.466504
+0
+LINE
+8
+Cmts
+62
+1
+10
+104.81
+20
+-87.34
+11
+105.396421
+21
+-88.466504
+0
+TEXT
+8
+Cmts
+62
+1
+10
+171.54
+20
+-78.67
+1
+47.800 mm 
+40
+1.5
+41
+1.5
+7
+SIMPLEX
+72
+1
+73
+2
+11
+171.54
+21
+-78.67
+0
+LINE
+8
+Cmts
+62
+1
+10
+147.64
+20
+-90.49
+11
+147.64
+21
+-77.32
+0
+LINE
+8
+Cmts
+62
+1
+10
+195.44
+20
+-90.49
+11
+195.44
+21
+-77.32
+0
+LINE
+8
+Cmts
+62
+1
+10
+195.44
+20
+-80.02
+11
+147.64
+21
+-80.02
+0
+LINE
+8
+Cmts
+62
+1
+10
+147.64
+20
+-80.02
+11
+148.766504
+21
+-79.433579
+0
+LINE
+8
+Cmts
+62
+1
+10
+147.64
+20
+-80.02
+11
+148.766504
+21
+-80.606421
+0
+LINE
+8
+Cmts
+62
+1
+10
+195.44
+20
+-80.02
+11
+194.313496
+21
+-79.433579
+0
+LINE
+8
+Cmts
+62
+1
+10
+195.44
+20
+-80.02
+11
+194.313496
+21
+-80.606421
+0
+TEXT
+8
+Cmts
+62
+1
+10
+128.64
+20
+-109.43
+1
+38.000 mm 
+40
+1.5
+41
+1.5
+7
+SIMPLEX
+72
+1
+73
+2
+11
+128.64
+21
+-109.43
+0
+LINE
+8
+Cmts
+62
+1
+10
+109.64
+20
+-90.48
+11
+109.64
+21
+-110.78
+0
+LINE
+8
+Cmts
+62
+1
+10
+147.64
+20
+-90.48
+11
+147.64
+21
+-110.78
+0
+LINE
+8
+Cmts
+62
+1
+10
+147.64
+20
+-108.08
+11
+109.64
+21
+-108.08
+0
+LINE
+8
+Cmts
+62
+1
+10
+109.64
+20
+-108.08
+11
+110.766504
+21
+-107.493579
+0
+LINE
+8
+Cmts
+62
+1
+10
+109.64
+20
+-108.08
+11
+110.766504
+21
+-108.666421
+0
+LINE
+8
+Cmts
+62
+1
+10
+147.64
+20
+-108.08
+11
+146.513496
+21
+-107.493579
+0
+LINE
+8
+Cmts
+62
+1
+10
+147.64
+20
+-108.08
+11
+146.513496
+21
+-108.666421
+0
+TEXT
+8
+Cmts
+62
+1
+10
+197.96
+20
+-99.88
+1
+0.800 mm 
+40
+1.5
+41
+1.5
+50
+270.0
+7
+SIMPLEX
+72
+1
+73
+2
+11
+197.96
+21
+-99.88
+0
+LINE
+8
+Cmts
+62
+1
+10
+194.38
+20
+-100.28
+11
+199.31
+21
+-100.28
+0
+LINE
+8
+Cmts
+62
+1
+10
+194.38
+20
+-99.48
+11
+199.31
+21
+-99.48
+0
+LINE
+8
+Cmts
+62
+1
+10
+196.61
+20
+-99.48
+11
+196.61
+21
+-100.28
+0
+LINE
+8
+Cmts
+62
+1
+10
+196.61
+20
+-100.28
+11
+196.023579
+21
+-99.153496
+0
+LINE
+8
+Cmts
+62
+1
+10
+196.61
+20
+-100.28
+11
+197.196421
+21
+-99.153496
+0
+LINE
+8
+Cmts
+62
+1
+10
+196.61
+20
+-99.48
+11
+196.023579
+21
+-100.606504
+0
+LINE
+8
+Cmts
+62
+1
+10
+196.61
+20
+-99.48
+11
+197.196421
+21
+-100.606504
+0
+TEXT
+8
+Cmts
+62
+1
+10
+188.875133
+20
+-92.417616
+1
+3.900 mm 
+40
+1.5
+41
+1.5
+50
+89.559272
+7
+SIMPLEX
+72
+1
+73
+2
+11
+188.875133
+21
+-92.417616
+0
+LINE
+8
+Cmts
+62
+1
+10
+191.77
+20
+-94.39
+11
+187.510173
+21
+-94.357232
+0
+LINE
+8
+Cmts
+62
+1
+10
+191.8
+20
+-90.49
+11
+187.540173
+21
+-90.457232
+0
+LINE
+8
+Cmts
+62
+1
+10
+190.240093
+20
+-90.478001
+11
+190.210093
+21
+-94.378001
+0
+LINE
+8
+Cmts
+62
+1
+10
+190.210093
+20
+-94.378001
+11
+189.632355
+21
+-93.24702
+0
+LINE
+8
+Cmts
+62
+1
+10
+190.210093
+20
+-94.378001
+11
+190.805162
+21
+-93.256041
+0
+LINE
+8
+Cmts
+62
+1
+10
+190.240093
+20
+-90.478001
+11
+189.645024
+21
+-91.599961
+0
+LINE
+8
+Cmts
+62
+1
+10
+190.240093
+20
+-90.478001
+11
+190.817831
+21
+-91.608982
+0
+TEXT
+8
+Cmts
+62
+1
+10
+159.664849
+20
+-87.283312
+1
+6.400 mm 
+40
+1.5
+41
+1.5
+50
+270.089525
+7
+SIMPLEX
+72
+1
+73
+2
+11
+159.664849
+21
+-87.283312
+0
+LINE
+8
+Cmts
+62
+1
+10
+155.38
+20
+-84.09
+11
+161.009848
+21
+-84.081203
+0
+LINE
+8
+Cmts
+62
+1
+10
+155.39
+20
+-90.49
+11
+161.019848
+21
+-90.481203
+0
+LINE
+8
+Cmts
+62
+1
+10
+158.319851
+20
+-90.485422
+11
+158.309851
+21
+-84.085422
+0
+LINE
+8
+Cmts
+62
+1
+10
+158.309851
+20
+-84.085422
+11
+158.898031
+21
+-85.211008
+0
+LINE
+8
+Cmts
+62
+1
+10
+158.309851
+20
+-84.085422
+11
+157.725191
+21
+-85.212841
+0
+LINE
+8
+Cmts
+62
+1
+10
+158.319851
+20
+-90.485422
+11
+158.904511
+21
+-89.358003
+0
+LINE
+8
+Cmts
+62
+1
+10
+158.319851
+20
+-90.485422
+11
+157.731671
+21
+-89.359836
+0
+LINE
+8
+Cmts
+62
+1
+10
+109.67
+20
+-90.4875
+11
+195.48
+21
+-90.4875
+0
+TEXT
+8
+Cmts
+62
+1
+10
+147.64
+20
+-117.98
+1
+88.300 mm 
+40
+1.5
+41
+1.5
+7
+SIMPLEX
+72
+1
+73
+2
+11
+147.64
+21
+-117.98
+0
+LINE
+8
+Cmts
+62
+1
+10
+191.79
+20
+-99.49
+11
+191.79
+21
+-119.33
+0
+LINE
+8
+Cmts
+62
+1
+10
+103.49
+20
+-99.49
+11
+103.49
+21
+-119.33
+0
+LINE
+8
+Cmts
+62
+1
+10
+103.49
+20
+-116.63
+11
+191.79
+21
+-116.63
+0
+LINE
+8
+Cmts
+62
+1
+10
+191.79
+20
+-116.63
+11
+190.663496
+21
+-117.216421
+0
+LINE
+8
+Cmts
+62
+1
+10
+191.79
+20
+-116.63
+11
+190.663496
+21
+-116.043579
+0
+LINE
+8
+Cmts
+62
+1
+10
+103.49
+20
+-116.63
+11
+104.616504
+21
+-117.216421
+0
+LINE
+8
+Cmts
+62
+1
+10
+103.49
+20
+-116.63
+11
+104.616504
+21
+-116.043579
+0
+TEXT
+8
+Cmts
+62
+1
+10
+102.19
+20
+-104.41
+1
+2.600 mm 
+40
+1.5
+41
+1.5
+7
+SIMPLEX
+72
+1
+73
+2
+11
+102.19
+21
+-104.41
+0
+LINE
+8
+Cmts
+62
+1
+10
+103.49
+20
+-99.49
+11
+103.49
+21
+-105.76
+0
+LINE
+8
+Cmts
+62
+1
+10
+100.89
+20
+-99.49
+11
+100.89
+21
+-105.76
+0
+LINE
+8
+Cmts
+62
+1
+10
+100.89
+20
+-103.06
+11
+103.49
+21
+-103.06
+0
+LINE
+8
+Cmts
+62
+1
+10
+103.49
+20
+-103.06
+11
+102.363496
+21
+-103.646421
+0
+LINE
+8
+Cmts
+62
+1
+10
+103.49
+20
+-103.06
+11
+102.363496
+21
+-102.473579
+0
+LINE
+8
+Cmts
+62
+1
+10
+100.89
+20
+-103.06
+11
+102.016504
+21
+-103.646421
+0
+LINE
+8
+Cmts
+62
+1
+10
+100.89
+20
+-103.06
+11
+102.016504
+21
+-102.473579
+0
+TEXT
+8
+Cmts
+62
+1
+10
+97.67
+20
+-96.94
+1
+5.100 mm 
+40
+1.5
+41
+1.5
+50
+270.0
+7
+SIMPLEX
+72
+1
+73
+2
+11
+97.67
+21
+-96.94
+0
+LINE
+8
+Cmts
+62
+1
+10
+100.89
+20
+-99.49
+11
+96.32
+21
+-99.49
+0
+LINE
+8
+Cmts
+62
+1
+10
+100.89
+20
+-94.39
+11
+96.32
+21
+-94.39
+0
+LINE
+8
+Cmts
+62
+1
+10
+99.02
+20
+-94.39
+11
+99.02
+21
+-99.49
+0
+LINE
+8
+Cmts
+62
+1
+10
+99.02
+20
+-99.49
+11
+98.433579
+21
+-98.363496
+0
+LINE
+8
+Cmts
+62
+1
+10
+99.02
+20
+-99.49
+11
+99.606421
+21
+-98.363496
+0
+LINE
+8
+Cmts
+62
+1
+10
+99.02
+20
+-94.39
+11
+98.433579
+21
+-95.516504
+0
+LINE
+8
+Cmts
+62
+1
+10
+99.02
+20
+-94.39
+11
+99.606421
+21
+-95.516504
+0
+TEXT
+8
+Cmts
+62
+1
+10
+109.63
+20
+-81.13
+1
+14.500 mm 
+40
+1.5
+41
+1.5
+7
+SIMPLEX
+72
+1
+73
+2
+11
+109.63
+21
+-81.13
+0
+LINE
+8
+Cmts
+62
+1
+10
+102.38
+20
+-89.28
+11
+102.38
+21
+-79.78
+0
+LINE
+8
+Cmts
+62
+1
+10
+116.88
+20
+-89.28
+11
+116.88
+21
+-79.78
+0
+LINE
+8
+Cmts
+62
+1
+10
+116.88
+20
+-82.48
+11
+102.38
+21
+-82.48
+0
+LINE
+8
+Cmts
+62
+1
+10
+102.38
+20
+-82.48
+11
+103.506504
+21
+-81.893579
+0
+LINE
+8
+Cmts
+62
+1
+10
+102.38
+20
+-82.48
+11
+103.506504
+21
+-83.066421
+0
+LINE
+8
+Cmts
+62
+1
+10
+116.88
+20
+-82.48
+11
+115.753496
+21
+-81.893579
+0
+LINE
+8
+Cmts
+62
+1
+10
+116.88
+20
+-82.48
+11
+115.753496
+21
+-83.066421
+0
+TEXT
+8
+Cmts
+62
+1
+10
+121.803009
+20
+-90.50045
+1
+2.400 mm 
+40
+1.5
+41
+1.5
+50
+89.761269
+7
+SIMPLEX
+72
+1
+73
+2
+11
+121.803009
+21
+-90.50045
+0
+LINE
+8
+Cmts
+62
+1
+10
+116.89
+20
+-91.68
+11
+123.147997
+21
+-91.706075
+0
+LINE
+8
+Cmts
+62
+1
+10
+116.9
+20
+-89.28
+11
+123.157997
+21
+-89.306075
+0
+LINE
+8
+Cmts
+62
+1
+10
+120.458021
+20
+-89.294825
+11
+120.448021
+21
+-91.694825
+0
+LINE
+8
+Cmts
+62
+1
+10
+120.448021
+20
+-91.694825
+11
+119.866299
+21
+-90.565888
+0
+LINE
+8
+Cmts
+62
+1
+10
+120.448021
+20
+-91.694825
+11
+121.03913
+21
+-90.570774
+0
+LINE
+8
+Cmts
+62
+1
+10
+120.458021
+20
+-89.294825
+11
+119.866912
+21
+-90.418876
+0
+LINE
+8
+Cmts
+62
+1
+10
+120.458021
+20
+-89.294825
+11
+121.039743
+21
+-90.423762
+0
+TEXT
+8
+Cmts
+62
+1
+10
+115.69
+20
+-85.3
+1
+2.400 mm 
+40
+1.5
+41
+1.5
+7
+SIMPLEX
+72
+1
+73
+2
+11
+115.69
+21
+-85.3
+0
+LINE
+8
+Cmts
+62
+1
+10
+116.89
+20
+-89.28
+11
+116.89
+21
+-83.95
+0
+LINE
+8
+Cmts
+62
+1
+10
+114.49
+20
+-89.28
+11
+114.49
+21
+-83.95
+0
+LINE
+8
+Cmts
+62
+1
+10
+114.49
+20
+-86.65
+11
+116.89
+21
+-86.65
+0
+LINE
+8
+Cmts
+62
+1
+10
+116.89
+20
+-86.65
+11
+115.763496
+21
+-87.236421
+0
+LINE
+8
+Cmts
+62
+1
+10
+116.89
+20
+-86.65
+11
+115.763496
+21
+-86.063579
+0
+LINE
+8
+Cmts
+62
+1
+10
+114.49
+20
+-86.65
+11
+115.616504
+21
+-87.236421
+0
+LINE
+8
+Cmts
+62
+1
+10
+114.49
+20
+-86.65
+11
+115.616504
+21
+-86.063579
+0
+TEXT
+8
+Cmts
+62
+1
+10
+135.19
+20
+-90.49
+1
+12.800 mm 
+40
+1.5
+41
+1.5
+50
+270.0
+7
+SIMPLEX
+72
+1
+73
+2
+11
+135.19
+21
+-90.49
+0
+LINE
+8
+Cmts
+62
+1
+10
+139.89
+20
+-96.89
+11
+133.84
+21
+-96.89
+0
+LINE
+8
+Cmts
+62
+1
+10
+139.89
+20
+-84.09
+11
+133.84
+21
+-84.09
+0
+LINE
+8
+Cmts
+62
+1
+10
+136.54
+20
+-84.09
+11
+136.54
+21
+-96.89
+0
+LINE
+8
+Cmts
+62
+1
+10
+136.54
+20
+-96.89
+11
+135.953579
+21
+-95.763496
+0
+LINE
+8
+Cmts
+62
+1
+10
+136.54
+20
+-96.89
+11
+137.126421
+21
+-95.763496
+0
+LINE
+8
+Cmts
+62
+1
+10
+136.54
+20
+-84.09
+11
+135.953579
+21
+-85.216504
+0
+LINE
+8
+Cmts
+62
+1
+10
+136.54
+20
+-84.09
+11
+137.126421
+21
+-85.216504
+0
+TEXT
+8
+Cmts
+62
+1
+10
+147.63
+20
+-105.02
+1
+15.500 mm 
+40
+1.5
+41
+1.5
+7
+SIMPLEX
+72
+1
+73
+2
+11
+147.63
+21
+-105.02
+0
+LINE
+8
+Cmts
+62
+1
+10
+139.88
+20
+-96.87
+11
+139.88
+21
+-106.37
+0
+LINE
+8
+Cmts
+62
+1
+10
+155.38
+20
+-96.87
+11
+155.38
+21
+-106.37
+0
+LINE
+8
+Cmts
+62
+1
+10
+155.38
+20
+-103.67
+11
+139.88
+21
+-103.67
+0
+LINE
+8
+Cmts
+62
+1
+10
+139.88
+20
+-103.67
+11
+141.006504
+21
+-103.083579
+0
+LINE
+8
+Cmts
+62
+1
+10
+139.88
+20
+-103.67
+11
+141.006504
+21
+-104.256421
+0
+LINE
+8
+Cmts
+62
+1
+10
+155.38
+20
+-103.67
+11
+154.253496
+21
+-103.083579
+0
+LINE
+8
+Cmts
+62
+1
+10
+155.38
+20
+-103.67
+11
+154.253496
+21
+-104.256421
+0
+CIRCLE
+8
+0
+10
+30.75
+20
+-33.3375
+40
+3.15
+0
+CIRCLE
+8
+0
+10
+195.4375
+20
+-90.4875
+40
+3.15
+0
+CIRCLE
+8
+0
+10
+264.525
+20
+-33.3375
+40
+3.15
+0
+LINE
+8
+0
+10
+290.1375
+20
+-7.7875
+11
+290.1375
+21
+-58.7125
+0
+LINE
+8
+0
+10
+288.3375
+20
+-58.7125
+11
+290.1375
+21
+-58.7125
+0
+LINE
+8
+0
+10
+5.1375
+20
+-65.0125
+11
+5.1375
+21
+-97.7875
+0
+LINE
+8
+0
+10
+288.3375
+20
+-65.1125
+11
+290.1375
+21
+-65.1125
+0
+LINE
+8
+0
+10
+8.7375
+20
+-65.0125
+11
+5.1375
+21
+-65.0125
+0
+LINE
+8
+0
+10
+8.7375
+20
+-58.8125
+11
+5.1375
+21
+-58.8125
+0
+ARC
+8
+0
+10
+8.7375
+20
+-61.9125
+30
+0.0
+40
+3.1
+50
+-90.0
+51
+90.0
+0
+ARC
+8
+0
+10
+288.3375
+20
+-61.9125
+30
+0.0
+40
+3.2
+50
+90.0
+51
+270.0
+0
+TEXT
+8
+Cmts
+62
+1
+10
+277.6375
+20
+6.3625
+1
+25.000 mm 
+40
+1.5
+41
+1.5
+7
+SIMPLEX
+72
+1
+73
+2
+11
+277.6375
+21
+6.3625
+0
+LINE
+8
+Cmts
+62
+1
+10
+265.1375
+20
+-33.3375
+11
+265.1375
+21
+7.7125
+0
+LINE
+8
+Cmts
+62
+1
+10
+290.1375
+20
+-33.3375
+11
+290.1375
+21
+7.7125
+0
+LINE
+8
+Cmts
+62
+1
+10
+290.1375
+20
+5.0125
+11
+265.1375
+21
+5.0125
+0
+LINE
+8
+Cmts
+62
+1
+10
+265.1375
+20
+5.0125
+11
+266.264004
+21
+5.598921
+0
+LINE
+8
+Cmts
+62
+1
+10
+265.1375
+20
+5.0125
+11
+266.264004
+21
+4.426079
+0
+LINE
+8
+Cmts
+62
+1
+10
+290.1375
+20
+5.0125
+11
+289.010996
+21
+5.598921
+0
+LINE
+8
+Cmts
+62
+1
+10
+290.1375
+20
+5.0125
+11
+289.010996
+21
+4.426079
+0
+TEXT
+8
+Cmts
+62
+1
+10
+147.6375
+20
+10.875
+1
+285.000 mm 
+40
+1.5
+41
+1.5
+7
+SIMPLEX
+72
+1
+73
+2
+11
+147.6375
+21
+10.875
+0
+LINE
+8
+Cmts
+62
+1
+10
+290.1375
+20
+-7.14375
+11
+290.1375
+21
+12.225
+0
+LINE
+8
+Cmts
+62
+1
+10
+5.1375
+20
+-7.14375
+11
+5.1375
+21
+12.225
+0
+LINE
+8
+Cmts
+62
+1
+10
+5.1375
+20
+9.525
+11
+290.1375
+21
+9.525
+0
+LINE
+8
+Cmts
+62
+1
+10
+290.1375
+20
+9.525
+11
+289.010996
+21
+8.938579
+0
+LINE
+8
+Cmts
+62
+1
+10
+290.1375
+20
+9.525
+11
+289.010996
+21
+10.111421
+0
+LINE
+8
+Cmts
+62
+1
+10
+5.1375
+20
+9.525
+11
+6.264004
+21
+8.938579
+0
+LINE
+8
+Cmts
+62
+1
+10
+5.1375
+20
+9.525
+11
+6.264004
+21
+10.111421
+0
+ARC
+8
+0
+10
+7.6375
+20
+-97.7875
+30
+0.0
+40
+2.5
+50
+-180.0
+51
+-90.0
+0
+ARC
+8
+0
+10
+287.6375
+20
+-97.7875
+30
+0.0
+40
+2.5
+50
+-90.0
+51
+0.0
+0
+ARC
+8
+0
+10
+287.6375
+20
+-7.7875
+30
+0.0
+40
+2.5
+50
+0.0
+51
+90.0
+0
+ARC
+8
+0
+10
+7.6375
+20
+-7.7875
+30
+0.0
+40
+2.5
+50
+90.0
+51
+180.0
+0
+LINE
+8
+0
+10
+290.1375
+20
+-97.7875
+11
+290.1375
+21
+-65.1125
+0
+LINE
+8
+0
+10
+7.6375
+20
+-100.2875
+11
+287.6375
+21
+-100.2875
+0
+LINE
+8
+0
+10
+5.1375
+20
+-7.7875
+11
+5.1375
+21
+-58.8125
+0
+LINE
+8
+0
+10
+7.6375
+20
+-5.2875
+11
+287.6375
+21
+-5.2875
+0
+ENDSEC
+0
+EOF
\ No newline at end of file
diff --git a/keyboards/weebkeeb/config.h b/keyboards/weebkeeb/config.h
new file mode 100644
index 00000000000..859adc9cc29
--- /dev/null
+++ b/keyboards/weebkeeb/config.h
@@ -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      0x6060
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    You
+#define PRODUCT         weebkeeb
+#define DESCRIPTION     A custom keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 12
+
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+*/
+#define MATRIX_ROW_PINS { F4, F5, F6, F7 }
+#define MATRIX_COL_PINS { B0, B1, B2, B3, B4, B5, B6, B7, C6, C7, F0, F1 }
+#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/weebkeeb/keymaps/default/Makefile b/keyboards/weebkeeb/keymaps/default/Makefile
new file mode 100644
index 00000000000..f4671a9d113
--- /dev/null
+++ b/keyboards/weebkeeb/keymaps/default/Makefile
@@ -0,0 +1,21 @@
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE = no         # Console for debug(+400)
+COMMAND_ENABLE = yes        # Commands for debug and configuration
+NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = no           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
+
+ifndef QUANTUM_DIR
+	include ../../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/weebkeeb/keymaps/default/config.h b/keyboards/weebkeeb/keymaps/default/config.h
new file mode 100644
index 00000000000..df06a262062
--- /dev/null
+++ b/keyboards/weebkeeb/keymaps/default/config.h
@@ -0,0 +1,8 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "../../config.h"
+
+// place overrides here
+
+#endif
\ No newline at end of file
diff --git a/keyboards/weebkeeb/keymaps/default/keymap.c b/keyboards/weebkeeb/keymaps/default/keymap.c
new file mode 100644
index 00000000000..cdf1f1e4c78
--- /dev/null
+++ b/keyboards/weebkeeb/keymaps/default/keymap.c
@@ -0,0 +1,119 @@
+#include "weebkeeb.h"
+
+#define _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _ADJUST 16
+
+enum custom_keycodes {
+  QWERTY = SAFE_RANGE,
+  COLEMAK,
+  DVORAK,
+  LOWER,
+  RAISE,
+  ADJUST,
+};
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+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 |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = KEYMAP( \
+  KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_DEL, \
+  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 , \
+  KC_LCTL, ADJUST, KC_LALT, KC_LGUI, MO(3),   KC_SPC,   KC_SPC,  MO(4),   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 |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[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_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+[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_ENT,  KC_ENT,  _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      |      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_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, _______, _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+)
+};
+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/weebkeeb/keymaps/default/readme.md b/keyboards/weebkeeb/keymaps/default/readme.md
new file mode 100644
index 00000000000..87713227632
--- /dev/null
+++ b/keyboards/weebkeeb/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for weebkeeb
\ No newline at end of file
diff --git a/keyboards/weebkeeb/readme.md b/keyboards/weebkeeb/readme.md
new file mode 100644
index 00000000000..bf31016c82c
--- /dev/null
+++ b/keyboards/weebkeeb/readme.md
@@ -0,0 +1,28 @@
+weebkeeb keyboard firmware
+======================
+
+## Quantum MK Firmware
+
+For the full Quantum feature list, see [the parent readme](/).
+
+## Building
+
+Download or clone the whole firmware and navigate to the keyboards/weebkeeb folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. 
+
+Depending on which keymap you would like to use, you will have to compile slightly differently.
+
+### Default
+
+To build with the default keymap, simply run `make default`.
+
+### Other Keymaps
+
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
+
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
+```
+$ make [default|jack|<name>]
+```
+
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboards/weebkeeb/rules.mk b/keyboards/weebkeeb/rules.mk
new file mode 100644
index 00000000000..55898147dd3
--- /dev/null
+++ b/keyboards/weebkeeb/rules.mk
@@ -0,0 +1,67 @@
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
diff --git a/keyboards/weebkeeb/weebkeeb.c b/keyboards/weebkeeb/weebkeeb.c
new file mode 100644
index 00000000000..483fc9440ed
--- /dev/null
+++ b/keyboards/weebkeeb/weebkeeb.c
@@ -0,0 +1,28 @@
+#include "weebkeeb.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/weebkeeb/weebkeeb.h b/keyboards/weebkeeb/weebkeeb.h
new file mode 100644
index 00000000000..7bca2c20145
--- /dev/null
+++ b/keyboards/weebkeeb/weebkeeb.h
@@ -0,0 +1,23 @@
+#ifndef WEEBKEEB_H
+#define WEEBKEEB_H
+
+#include "quantum.h"
+
+// This a shortcut to help you visually see your layout.
+// The following is an example using the Planck MIT layout
+// The first section contains all of the arguements
+// The second converts the arguments into a two-dimensional array
+#define KEYMAP( \
+    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, 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 \
+) \
+{ \
+    { 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 } \
+}
+
+#endif

From 45b7718fb154c6400b169a9d3005cedebd37ff9a Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@gmail.com>
Date: Sat, 3 Dec 2016 17:30:40 -0500
Subject: [PATCH 132/147] cleaned up personal projects

---
 keyboards/pilcrow/Makefile                   |    3 -
 keyboards/pilcrow/config.h                   |  162 -
 keyboards/pilcrow/keymaps/default/Makefile   |   21 -
 keyboards/pilcrow/keymaps/default/config.h   |    8 -
 keyboards/pilcrow/keymaps/default/keymap.c   |   88 -
 keyboards/pilcrow/keymaps/default/readme.md  |    1 -
 keyboards/pilcrow/pilcrow.c                  |   28 -
 keyboards/pilcrow/pilcrow.h                  |   23 -
 keyboards/pilcrow/readme.md                  |   28 -
 keyboards/pilcrow/rules.mk                   |   67 -
 keyboards/weebkeeb/Makefile                  |    3 -
 keyboards/weebkeeb/aek.dxf                   | 6486 ------------------
 keyboards/weebkeeb/config.h                  |  162 -
 keyboards/weebkeeb/keymaps/default/Makefile  |   21 -
 keyboards/weebkeeb/keymaps/default/config.h  |    8 -
 keyboards/weebkeeb/keymaps/default/keymap.c  |  119 -
 keyboards/weebkeeb/keymaps/default/readme.md |    1 -
 keyboards/weebkeeb/readme.md                 |   28 -
 keyboards/weebkeeb/rules.mk                  |   67 -
 keyboards/weebkeeb/weebkeeb.c                |   28 -
 keyboards/weebkeeb/weebkeeb.h                |   23 -
 21 files changed, 7375 deletions(-)
 delete mode 100644 keyboards/pilcrow/Makefile
 delete mode 100644 keyboards/pilcrow/config.h
 delete mode 100644 keyboards/pilcrow/keymaps/default/Makefile
 delete mode 100644 keyboards/pilcrow/keymaps/default/config.h
 delete mode 100644 keyboards/pilcrow/keymaps/default/keymap.c
 delete mode 100644 keyboards/pilcrow/keymaps/default/readme.md
 delete mode 100644 keyboards/pilcrow/pilcrow.c
 delete mode 100644 keyboards/pilcrow/pilcrow.h
 delete mode 100644 keyboards/pilcrow/readme.md
 delete mode 100644 keyboards/pilcrow/rules.mk
 delete mode 100644 keyboards/weebkeeb/Makefile
 delete mode 100644 keyboards/weebkeeb/aek.dxf
 delete mode 100644 keyboards/weebkeeb/config.h
 delete mode 100644 keyboards/weebkeeb/keymaps/default/Makefile
 delete mode 100644 keyboards/weebkeeb/keymaps/default/config.h
 delete mode 100644 keyboards/weebkeeb/keymaps/default/keymap.c
 delete mode 100644 keyboards/weebkeeb/keymaps/default/readme.md
 delete mode 100644 keyboards/weebkeeb/readme.md
 delete mode 100644 keyboards/weebkeeb/rules.mk
 delete mode 100644 keyboards/weebkeeb/weebkeeb.c
 delete mode 100644 keyboards/weebkeeb/weebkeeb.h

diff --git a/keyboards/pilcrow/Makefile b/keyboards/pilcrow/Makefile
deleted file mode 100644
index 4e2a6f00fd8..00000000000
--- a/keyboards/pilcrow/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifndef MAKEFILE_INCLUDED
-	include ../../Makefile
-endif
\ No newline at end of file
diff --git a/keyboards/pilcrow/config.h b/keyboards/pilcrow/config.h
deleted file mode 100644
index d79c1ba40c8..00000000000
--- a/keyboards/pilcrow/config.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
-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    You
-#define PRODUCT         pilcrow
-#define DESCRIPTION     A custom keyboard
-
-/* key matrix size */
-#define MATRIX_ROWS 4
-#define MATRIX_COLS 10
-
-/*
- * Keyboard Matrix Assignments
- *
- * Change this to how you wired your keyboard
- * COLS: AVR pins used for columns, left to right
- * ROWS: AVR pins used for rows, top to bottom
- * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
- *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
- *
-*/
-#define MATRIX_ROW_PINS { B2, C6, D7, E6 }
-#define MATRIX_COL_PINS { B6, D1, B4, B5, D4, D0, B3, B1, F7, F6 }
-#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/pilcrow/keymaps/default/Makefile b/keyboards/pilcrow/keymaps/default/Makefile
deleted file mode 100644
index f4671a9d113..00000000000
--- a/keyboards/pilcrow/keymaps/default/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# 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/pilcrow/keymaps/default/config.h b/keyboards/pilcrow/keymaps/default/config.h
deleted file mode 100644
index df06a262062..00000000000
--- a/keyboards/pilcrow/keymaps/default/config.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#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/pilcrow/keymaps/default/keymap.c b/keyboards/pilcrow/keymaps/default/keymap.c
deleted file mode 100644
index e382e4c6ad1..00000000000
--- a/keyboards/pilcrow/keymaps/default/keymap.c
+++ /dev/null
@@ -1,88 +0,0 @@
-#include "pilcrow.h"
-#define _______ KC_TRNS
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP( \
-  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P, \
-  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, \
-  KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, \
-  KC_LCTL, KC_LALT, KC_LGUI, MO(1),   KC_SPC,  MT(MOD_LSFT, KC_SPC), MO(2),   MO(3),   KC_DEL, KC_ESC \
-),
-
-/* Colemak
- * ,-----------------------------------------------------------------------------------.
- * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[1] = KEYMAP( \
-  KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \
-  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, \
-  KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),KC_PIPE, S(KC_QUOT), \
-  _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_GRV \
-),
-[2] = KEYMAP( \
-  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0, \
-  KC_TAB,  KC_LEFT, KC_DOWN, KC_UP,   KC_RIGHT,KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, \
-  OSM(MOD_LSFT),  KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, KC_BSLS, KC_QUOT, \
-  _______, _______, _______, _______, KC_ENT,  KC_ENT,  _______, KC_MNXT, KC_VOLD, KC_VOLU \
-),
-
-/* Adjust (Lower + Raise)
- * ,-----------------------------------------------------------------------------------.
- * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |      |      |      |      |      |      |      |      |      |      |      |      |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |      |      |      |      |      |             |      |      |      |      |      |
- * `-----------------------------------------------------------------------------------'
- */
-[3] =  KEYMAP( \
-  RESET,   KC_UP, _______, _______, _______, _______, _______, KC_MS_WH_DOWN, KC_MS_U, KC_MS_WH_UP, \
-  KC_LEFT, KC_DOWN, KC_RIGHT, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, KC_MS_L,KC_MS_D, KC_MS_R, \
-  RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, \
-  _______, _______, _______, _______, KC_MS_BTN1, KC_MS_BTN2, _______, _______, _______, _______ \
-)
-};
-
-const uint16_t PROGMEM fn_actions[] = {
-
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-  // MACRODOWN only works in this function
-      switch(id) {
-        case 0:
-          if (record->event.pressed) {
-            register_code(KC_RSFT);
-          } else {
-            unregister_code(KC_RSFT);
-          }
-        break;
-      }
-    return MACRO_NONE;
-};
-
-
-void matrix_init_user(void) {
-
-}
-
-void matrix_scan_user(void) {
-
-}
-
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
-  return true;
-}
-
-void led_set_user(uint8_t usb_led) {
-
-}
\ No newline at end of file
diff --git a/keyboards/pilcrow/keymaps/default/readme.md b/keyboards/pilcrow/keymaps/default/readme.md
deleted file mode 100644
index 95472dfca89..00000000000
--- a/keyboards/pilcrow/keymaps/default/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-# The default keymap for pilcrow
\ No newline at end of file
diff --git a/keyboards/pilcrow/pilcrow.c b/keyboards/pilcrow/pilcrow.c
deleted file mode 100644
index c8243df7bff..00000000000
--- a/keyboards/pilcrow/pilcrow.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "pilcrow.h"
-
-void matrix_init_kb(void) {
-	// put your keyboard start-up code here
-	// runs once when the firmware starts up
-
-	matrix_init_user();
-}
-
-void matrix_scan_kb(void) {
-	// put your looping keyboard code here
-	// runs every cycle (a lot)
-
-	matrix_scan_user();
-}
-
-bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
-	// put your per-action keyboard code here
-	// runs for every action, just before processing by the firmware
-
-	return process_record_user(keycode, record);
-}
-
-void led_set_kb(uint8_t usb_led) {
-	// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
-
-	led_set_user(usb_led);
-}
diff --git a/keyboards/pilcrow/pilcrow.h b/keyboards/pilcrow/pilcrow.h
deleted file mode 100644
index 7138ccb3f62..00000000000
--- a/keyboards/pilcrow/pilcrow.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef PILCROW_H
-#define PILCROW_H
-
-#include "quantum.h"
-
-// This a shortcut to help you visually see your layout.
-// The following is an example using the Planck MIT layout
-// The first section contains all of the arguements
-// The second converts the arguments into a two-dimensional array
-#define KEYMAP( \
-    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \
-    k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \
-    k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \
-    k30, k31, k32, k33, k34, k35, k36, k37, k38, k39 \
-) \
-{ \
-    { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09 }, \
-    { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19 }, \
-    { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29 }, \
-    { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39 } \
-}
-
-#endif
diff --git a/keyboards/pilcrow/readme.md b/keyboards/pilcrow/readme.md
deleted file mode 100644
index 7a7f6d2af58..00000000000
--- a/keyboards/pilcrow/readme.md
+++ /dev/null
@@ -1,28 +0,0 @@
-pilcrow keyboard firmware
-======================
-
-## Quantum MK Firmware
-
-For the full Quantum feature list, see [the parent readme](/).
-
-## Building
-
-Download or clone the whole firmware and navigate to the keyboards/pilcrow folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. 
-
-Depending on which keymap you would like to use, you will have to compile slightly differently.
-
-### Default
-
-To build with the default keymap, simply run `make default`.
-
-### Other Keymaps
-
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
-
-To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
-
-```
-$ make [default|jack|<name>]
-```
-
-Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboards/pilcrow/rules.mk b/keyboards/pilcrow/rules.mk
deleted file mode 100644
index 55898147dd3..00000000000
--- a/keyboards/pilcrow/rules.mk
+++ /dev/null
@@ -1,67 +0,0 @@
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= no            # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
diff --git a/keyboards/weebkeeb/Makefile b/keyboards/weebkeeb/Makefile
deleted file mode 100644
index 4e2a6f00fd8..00000000000
--- a/keyboards/weebkeeb/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifndef MAKEFILE_INCLUDED
-	include ../../Makefile
-endif
\ No newline at end of file
diff --git a/keyboards/weebkeeb/aek.dxf b/keyboards/weebkeeb/aek.dxf
deleted file mode 100644
index cfe80946bdb..00000000000
--- a/keyboards/weebkeeb/aek.dxf
+++ /dev/null
@@ -1,6486 +0,0 @@
-0
-SECTION
-2
-ENTITIES
-0
-LINE
-8
-0
-10
-104.7875
-20
--89.2875
-11
-104.7875
-21
--91.6875
-0
-LINE
-8
-0
-10
-104.7875
-20
--91.6875
-11
-102.3875
-21
--91.6875
-0
-LINE
-8
-0
-10
-102.3875
-20
--91.6875
-11
-102.3875
-21
--89.2875
-0
-LINE
-8
-0
-10
-102.3875
-20
--89.2875
-11
-104.7875
-21
--89.2875
-0
-LINE
-8
-0
-10
-116.8875
-20
--89.2875
-11
-116.8875
-21
--91.6875
-0
-LINE
-8
-0
-10
-116.8875
-20
--91.6875
-11
-114.4875
-21
--91.6875
-0
-LINE
-8
-0
-10
-114.4875
-20
--91.6875
-11
-114.4875
-21
--89.2875
-0
-LINE
-8
-0
-10
-114.4875
-20
--89.2875
-11
-116.8875
-21
--89.2875
-0
-CIRCLE
-8
-0
-10
-109.6375
-20
--90.4875
-40
-3.15
-0
-LINE
-8
-0
-10
-103.4875
-20
--94.3875
-11
-103.4875
-21
--99.4875
-0
-LINE
-8
-0
-10
-103.4875
-20
--99.4875
-11
-100.8875
-21
--99.4875
-0
-LINE
-8
-0
-10
-100.8875
-20
--99.4875
-11
-100.8875
-21
--94.3875
-0
-LINE
-8
-0
-10
-100.8875
-20
--94.3875
-11
-103.4875
-21
--94.3875
-0
-LINE
-8
-0
-10
-191.7875
-20
--94.3875
-11
-191.7875
-21
--99.4875
-0
-LINE
-8
-0
-10
-191.7875
-20
--99.4875
-11
-194.3875
-21
--99.4875
-0
-LINE
-8
-0
-10
-194.3875
-20
--99.4875
-11
-194.3875
-21
--94.3875
-0
-LINE
-8
-0
-10
-194.3875
-20
--94.3875
-11
-191.7875
-21
--94.3875
-0
-LINE
-8
-0
-10
-155.3875
-20
--84.0875
-11
-139.8875
-21
--84.0875
-0
-LINE
-8
-0
-10
-139.8875
-20
--84.0875
-11
-139.8875
-21
--96.8875
-0
-LINE
-8
-0
-10
-139.8875
-20
--96.8875
-11
-155.3875
-21
--96.8875
-0
-LINE
-8
-0
-10
-155.3875
-20
--96.8875
-11
-155.3875
-21
--84.0875
-0
-LINE
-8
-0
-10
-256.28125
-20
--56.2875
-11
-256.28125
-21
--61.3875
-0
-LINE
-8
-0
-10
-256.28125
-20
--61.3875
-11
-253.68125
-21
--61.3875
-0
-LINE
-8
-0
-10
-253.68125
-20
--61.3875
-11
-253.68125
-21
--56.2875
-0
-LINE
-8
-0
-10
-253.68125
-20
--56.2875
-11
-256.28125
-21
--56.2875
-0
-LINE
-8
-0
-10
-281.88125
-20
--56.2875
-11
-281.88125
-21
--61.3875
-0
-LINE
-8
-0
-10
-281.88125
-20
--61.3875
-11
-284.48125
-21
--61.3875
-0
-LINE
-8
-0
-10
-284.48125
-20
--61.3875
-11
-284.48125
-21
--56.2875
-0
-LINE
-8
-0
-10
-284.48125
-20
--56.2875
-11
-281.88125
-21
--56.2875
-0
-LINE
-8
-0
-10
-276.83125
-20
--45.9875
-11
-261.33125
-21
--45.9875
-0
-LINE
-8
-0
-10
-261.33125
-20
--45.9875
-11
-261.33125
-21
--58.7875
-0
-LINE
-8
-0
-10
-261.33125
-20
--58.7875
-11
-276.83125
-21
--58.7875
-0
-LINE
-8
-0
-10
-276.83125
-20
--58.7875
-11
-276.83125
-21
--45.9875
-0
-LINE
-8
-0
-10
-258.6625
-20
--18.1875
-11
-258.6625
-21
--23.2875
-0
-LINE
-8
-0
-10
-258.6625
-20
--23.2875
-11
-256.0625
-21
--23.2875
-0
-LINE
-8
-0
-10
-256.0625
-20
--23.2875
-11
-256.0625
-21
--18.1875
-0
-LINE
-8
-0
-10
-256.0625
-20
--18.1875
-11
-258.6625
-21
--18.1875
-0
-LINE
-8
-0
-10
-284.2625
-20
--18.1875
-11
-284.2625
-21
--23.2875
-0
-LINE
-8
-0
-10
-284.2625
-20
--23.2875
-11
-286.8625
-21
--23.2875
-0
-LINE
-8
-0
-10
-286.8625
-20
--23.2875
-11
-286.8625
-21
--18.1875
-0
-LINE
-8
-0
-10
-286.8625
-20
--18.1875
-11
-284.2625
-21
--18.1875
-0
-LINE
-8
-0
-10
-279.2125
-20
--7.8875
-11
-263.7125
-21
--7.8875
-0
-LINE
-8
-0
-10
-263.7125
-20
--7.8875
-11
-263.7125
-21
--20.6875
-0
-LINE
-8
-0
-10
-263.7125
-20
--20.6875
-11
-279.2125
-21
--20.6875
-0
-LINE
-8
-0
-10
-279.2125
-20
--20.6875
-11
-279.2125
-21
--7.8875
-0
-LINE
-8
-0
-10
-13.39375
-20
--75.3375
-11
-13.39375
-21
--80.4375
-0
-LINE
-8
-0
-10
-13.39375
-20
--80.4375
-11
-10.79375
-21
--80.4375
-0
-LINE
-8
-0
-10
-10.79375
-20
--80.4375
-11
-10.79375
-21
--75.3375
-0
-LINE
-8
-0
-10
-10.79375
-20
--75.3375
-11
-13.39375
-21
--75.3375
-0
-LINE
-8
-0
-10
-38.99375
-20
--75.3375
-11
-38.99375
-21
--80.4375
-0
-LINE
-8
-0
-10
-38.99375
-20
--80.4375
-11
-41.59375
-21
--80.4375
-0
-LINE
-8
-0
-10
-41.59375
-20
--80.4375
-11
-41.59375
-21
--75.3375
-0
-LINE
-8
-0
-10
-41.59375
-20
--75.3375
-11
-38.99375
-21
--75.3375
-0
-LINE
-8
-0
-10
-33.94375
-20
--65.0375
-11
-18.44375
-21
--65.0375
-0
-LINE
-8
-0
-10
-18.44375
-20
--65.0375
-11
-18.44375
-21
--77.8375
-0
-LINE
-8
-0
-10
-18.44375
-20
--77.8375
-11
-33.94375
-21
--77.8375
-0
-LINE
-8
-0
-10
-33.94375
-20
--77.8375
-11
-33.94375
-21
--65.0375
-0
-LINE
-8
-0
-10
-193.4875
-20
--7.8875
-11
-177.9875
-21
--7.8875
-0
-LINE
-8
-0
-10
-177.9875
-20
--7.8875
-11
-177.9875
-21
--20.6875
-0
-LINE
-8
-0
-10
-177.9875
-20
--20.6875
-11
-193.4875
-21
--20.6875
-0
-LINE
-8
-0
-10
-193.4875
-20
--20.6875
-11
-193.4875
-21
--7.8875
-0
-LINE
-8
-0
-10
-174.4375
-20
--7.8875
-11
-158.9375
-21
--7.8875
-0
-LINE
-8
-0
-10
-158.9375
-20
--7.8875
-11
-158.9375
-21
--20.6875
-0
-LINE
-8
-0
-10
-158.9375
-20
--20.6875
-11
-174.4375
-21
--20.6875
-0
-LINE
-8
-0
-10
-174.4375
-20
--20.6875
-11
-174.4375
-21
--7.8875
-0
-LINE
-8
-0
-10
-183.9625
-20
--26.9375
-11
-168.4625
-21
--26.9375
-0
-LINE
-8
-0
-10
-168.4625
-20
--26.9375
-11
-168.4625
-21
--39.7375
-0
-LINE
-8
-0
-10
-168.4625
-20
--39.7375
-11
-183.9625
-21
--39.7375
-0
-LINE
-8
-0
-10
-183.9625
-20
--39.7375
-11
-183.9625
-21
--26.9375
-0
-LINE
-8
-0
-10
-169.675
-20
--45.9875
-11
-154.175
-21
--45.9875
-0
-LINE
-8
-0
-10
-154.175
-20
--45.9875
-11
-154.175
-21
--58.7875
-0
-LINE
-8
-0
-10
-154.175
-20
--58.7875
-11
-169.675
-21
--58.7875
-0
-LINE
-8
-0
-10
-169.675
-20
--58.7875
-11
-169.675
-21
--45.9875
-0
-LINE
-8
-0
-10
-150.625
-20
--45.9875
-11
-135.125
-21
--45.9875
-0
-LINE
-8
-0
-10
-135.125
-20
--45.9875
-11
-135.125
-21
--58.7875
-0
-LINE
-8
-0
-10
-135.125
-20
--58.7875
-11
-150.625
-21
--58.7875
-0
-LINE
-8
-0
-10
-150.625
-20
--58.7875
-11
-150.625
-21
--45.9875
-0
-LINE
-8
-0
-10
-160.15
-20
--65.0375
-11
-144.65
-21
--65.0375
-0
-LINE
-8
-0
-10
-144.65
-20
--65.0375
-11
-144.65
-21
--77.8375
-0
-LINE
-8
-0
-10
-144.65
-20
--77.8375
-11
-160.15
-21
--77.8375
-0
-LINE
-8
-0
-10
-160.15
-20
--77.8375
-11
-160.15
-21
--65.0375
-0
-LINE
-8
-0
-10
-141.1
-20
--65.0375
-11
-125.6
-21
--65.0375
-0
-LINE
-8
-0
-10
-125.6
-20
--65.0375
-11
-125.6
-21
--77.8375
-0
-LINE
-8
-0
-10
-125.6
-20
--77.8375
-11
-141.1
-21
--77.8375
-0
-LINE
-8
-0
-10
-141.1
-20
--77.8375
-11
-141.1
-21
--65.0375
-0
-LINE
-8
-0
-10
-155.3875
-20
--7.8875
-11
-139.8875
-21
--7.8875
-0
-LINE
-8
-0
-10
-139.8875
-20
--7.8875
-11
-139.8875
-21
--20.6875
-0
-LINE
-8
-0
-10
-139.8875
-20
--20.6875
-11
-155.3875
-21
--20.6875
-0
-LINE
-8
-0
-10
-155.3875
-20
--20.6875
-11
-155.3875
-21
--7.8875
-0
-LINE
-8
-0
-10
-136.3375
-20
--7.8875
-11
-120.8375
-21
--7.8875
-0
-LINE
-8
-0
-10
-120.8375
-20
--7.8875
-11
-120.8375
-21
--20.6875
-0
-LINE
-8
-0
-10
-120.8375
-20
--20.6875
-11
-136.3375
-21
--20.6875
-0
-LINE
-8
-0
-10
-136.3375
-20
--20.6875
-11
-136.3375
-21
--7.8875
-0
-LINE
-8
-0
-10
-164.9125
-20
--26.9375
-11
-149.4125
-21
--26.9375
-0
-LINE
-8
-0
-10
-149.4125
-20
--26.9375
-11
-149.4125
-21
--39.7375
-0
-LINE
-8
-0
-10
-149.4125
-20
--39.7375
-11
-164.9125
-21
--39.7375
-0
-LINE
-8
-0
-10
-164.9125
-20
--39.7375
-11
-164.9125
-21
--26.9375
-0
-LINE
-8
-0
-10
-145.8625
-20
--26.9375
-11
-130.3625
-21
--26.9375
-0
-LINE
-8
-0
-10
-130.3625
-20
--26.9375
-11
-130.3625
-21
--39.7375
-0
-LINE
-8
-0
-10
-130.3625
-20
--39.7375
-11
-145.8625
-21
--39.7375
-0
-LINE
-8
-0
-10
-145.8625
-20
--39.7375
-11
-145.8625
-21
--26.9375
-0
-LINE
-8
-0
-10
-131.575
-20
--45.9875
-11
-116.075
-21
--45.9875
-0
-LINE
-8
-0
-10
-116.075
-20
--45.9875
-11
-116.075
-21
--58.7875
-0
-LINE
-8
-0
-10
-116.075
-20
--58.7875
-11
-131.575
-21
--58.7875
-0
-LINE
-8
-0
-10
-131.575
-20
--58.7875
-11
-131.575
-21
--45.9875
-0
-LINE
-8
-0
-10
-122.05
-20
--65.0375
-11
-106.55
-21
--65.0375
-0
-LINE
-8
-0
-10
-106.55
-20
--65.0375
-11
-106.55
-21
--77.8375
-0
-LINE
-8
-0
-10
-106.55
-20
--77.8375
-11
-122.05
-21
--77.8375
-0
-LINE
-8
-0
-10
-122.05
-20
--77.8375
-11
-122.05
-21
--65.0375
-0
-LINE
-8
-0
-10
-103.0
-20
--65.0375
-11
-87.5
-21
--65.0375
-0
-LINE
-8
-0
-10
-87.5
-20
--65.0375
-11
-87.5
-21
--77.8375
-0
-LINE
-8
-0
-10
-87.5
-20
--77.8375
-11
-103.0
-21
--77.8375
-0
-LINE
-8
-0
-10
-103.0
-20
--77.8375
-11
-103.0
-21
--65.0375
-0
-LINE
-8
-0
-10
-117.2875
-20
--7.8875
-11
-101.7875
-21
--7.8875
-0
-LINE
-8
-0
-10
-101.7875
-20
--7.8875
-11
-101.7875
-21
--20.6875
-0
-LINE
-8
-0
-10
-101.7875
-20
--20.6875
-11
-117.2875
-21
--20.6875
-0
-LINE
-8
-0
-10
-117.2875
-20
--20.6875
-11
-117.2875
-21
--7.8875
-0
-LINE
-8
-0
-10
-98.2375
-20
--7.8875
-11
-82.7375
-21
--7.8875
-0
-LINE
-8
-0
-10
-82.7375
-20
--7.8875
-11
-82.7375
-21
--20.6875
-0
-LINE
-8
-0
-10
-82.7375
-20
--20.6875
-11
-98.2375
-21
--20.6875
-0
-LINE
-8
-0
-10
-98.2375
-20
--20.6875
-11
-98.2375
-21
--7.8875
-0
-LINE
-8
-0
-10
-126.8125
-20
--26.9375
-11
-111.3125
-21
--26.9375
-0
-LINE
-8
-0
-10
-111.3125
-20
--26.9375
-11
-111.3125
-21
--39.7375
-0
-LINE
-8
-0
-10
-111.3125
-20
--39.7375
-11
-126.8125
-21
--39.7375
-0
-LINE
-8
-0
-10
-126.8125
-20
--39.7375
-11
-126.8125
-21
--26.9375
-0
-LINE
-8
-0
-10
-107.7625
-20
--26.9375
-11
-92.2625
-21
--26.9375
-0
-LINE
-8
-0
-10
-92.2625
-20
--26.9375
-11
-92.2625
-21
--39.7375
-0
-LINE
-8
-0
-10
-92.2625
-20
--39.7375
-11
-107.7625
-21
--39.7375
-0
-LINE
-8
-0
-10
-107.7625
-20
--39.7375
-11
-107.7625
-21
--26.9375
-0
-LINE
-8
-0
-10
-112.525
-20
--45.9875
-11
-97.025
-21
--45.9875
-0
-LINE
-8
-0
-10
-97.025
-20
--45.9875
-11
-97.025
-21
--58.7875
-0
-LINE
-8
-0
-10
-97.025
-20
--58.7875
-11
-112.525
-21
--58.7875
-0
-LINE
-8
-0
-10
-112.525
-20
--58.7875
-11
-112.525
-21
--45.9875
-0
-LINE
-8
-0
-10
-93.475
-20
--45.9875
-11
-77.975
-21
--45.9875
-0
-LINE
-8
-0
-10
-77.975
-20
--45.9875
-11
-77.975
-21
--58.7875
-0
-LINE
-8
-0
-10
-77.975
-20
--58.7875
-11
-93.475
-21
--58.7875
-0
-LINE
-8
-0
-10
-93.475
-20
--58.7875
-11
-93.475
-21
--45.9875
-0
-LINE
-8
-0
-10
-83.95
-20
--65.0375
-11
-68.45
-21
--65.0375
-0
-LINE
-8
-0
-10
-68.45
-20
--65.0375
-11
-68.45
-21
--77.8375
-0
-LINE
-8
-0
-10
-68.45
-20
--77.8375
-11
-83.95
-21
--77.8375
-0
-LINE
-8
-0
-10
-83.95
-20
--77.8375
-11
-83.95
-21
--65.0375
-0
-LINE
-8
-0
-10
-79.1875
-20
--84.0875
-11
-63.6875
-21
--84.0875
-0
-LINE
-8
-0
-10
-63.6875
-20
--84.0875
-11
-63.6875
-21
--96.8875
-0
-LINE
-8
-0
-10
-63.6875
-20
--96.8875
-11
-79.1875
-21
--96.8875
-0
-LINE
-8
-0
-10
-79.1875
-20
--96.8875
-11
-79.1875
-21
--84.0875
-0
-LINE
-8
-0
-10
-79.1875
-20
--7.8875
-11
-63.6875
-21
--7.8875
-0
-LINE
-8
-0
-10
-63.6875
-20
--7.8875
-11
-63.6875
-21
--20.6875
-0
-LINE
-8
-0
-10
-63.6875
-20
--20.6875
-11
-79.1875
-21
--20.6875
-0
-LINE
-8
-0
-10
-79.1875
-20
--20.6875
-11
-79.1875
-21
--7.8875
-0
-LINE
-8
-0
-10
-60.1375
-20
--7.8875
-11
-44.6375
-21
--7.8875
-0
-LINE
-8
-0
-10
-44.6375
-20
--7.8875
-11
-44.6375
-21
--20.6875
-0
-LINE
-8
-0
-10
-44.6375
-20
--20.6875
-11
-60.1375
-21
--20.6875
-0
-LINE
-8
-0
-10
-60.1375
-20
--20.6875
-11
-60.1375
-21
--7.8875
-0
-LINE
-8
-0
-10
-88.7125
-20
--26.9375
-11
-73.2125
-21
--26.9375
-0
-LINE
-8
-0
-10
-73.2125
-20
--26.9375
-11
-73.2125
-21
--39.7375
-0
-LINE
-8
-0
-10
-73.2125
-20
--39.7375
-11
-88.7125
-21
--39.7375
-0
-LINE
-8
-0
-10
-88.7125
-20
--39.7375
-11
-88.7125
-21
--26.9375
-0
-LINE
-8
-0
-10
-69.6625
-20
--26.9375
-11
-54.1625
-21
--26.9375
-0
-LINE
-8
-0
-10
-54.1625
-20
--26.9375
-11
-54.1625
-21
--39.7375
-0
-LINE
-8
-0
-10
-54.1625
-20
--39.7375
-11
-69.6625
-21
--39.7375
-0
-LINE
-8
-0
-10
-69.6625
-20
--39.7375
-11
-69.6625
-21
--26.9375
-0
-LINE
-8
-0
-10
-74.425
-20
--45.9875
-11
-58.925
-21
--45.9875
-0
-LINE
-8
-0
-10
-58.925
-20
--45.9875
-11
-58.925
-21
--58.7875
-0
-LINE
-8
-0
-10
-58.925
-20
--58.7875
-11
-74.425
-21
--58.7875
-0
-LINE
-8
-0
-10
-74.425
-20
--58.7875
-11
-74.425
-21
--45.9875
-0
-LINE
-8
-0
-10
-64.9
-20
--65.0375
-11
-49.4
-21
--65.0375
-0
-LINE
-8
-0
-10
-49.4
-20
--65.0375
-11
-49.4
-21
--77.8375
-0
-LINE
-8
-0
-10
-49.4
-20
--77.8375
-11
-64.9
-21
--77.8375
-0
-LINE
-8
-0
-10
-64.9
-20
--77.8375
-11
-64.9
-21
--65.0375
-0
-LINE
-8
-0
-10
-52.9937
-20
--84.0875
-11
-37.4937
-21
--84.0875
-0
-LINE
-8
-0
-10
-37.4937
-20
--84.0875
-11
-37.4937
-21
--96.8875
-0
-LINE
-8
-0
-10
-37.4937
-20
--96.8875
-11
-52.9937
-21
--96.8875
-0
-LINE
-8
-0
-10
-52.9937
-20
--96.8875
-11
-52.9937
-21
--84.0875
-0
-LINE
-8
-0
-10
-41.0875
-20
--7.8875
-11
-25.5875
-21
--7.8875
-0
-LINE
-8
-0
-10
-25.5875
-20
--7.8875
-11
-25.5875
-21
--20.6875
-0
-LINE
-8
-0
-10
-25.5875
-20
--20.6875
-11
-41.0875
-21
--20.6875
-0
-LINE
-8
-0
-10
-41.0875
-20
--20.6875
-11
-41.0875
-21
--7.8875
-0
-LINE
-8
-0
-10
-22.0375
-20
--7.8875
-11
-6.5375
-21
--7.8875
-0
-LINE
-8
-0
-10
-6.5375
-20
--7.8875
-11
-6.5375
-21
--20.6875
-0
-LINE
-8
-0
-10
-6.5375
-20
--20.6875
-11
-22.0375
-21
--20.6875
-0
-LINE
-8
-0
-10
-22.0375
-20
--20.6875
-11
-22.0375
-21
--7.8875
-0
-LINE
-8
-0
-10
-50.6125
-20
--26.9375
-11
-35.1125
-21
--26.9375
-0
-LINE
-8
-0
-10
-35.1125
-20
--26.9375
-11
-35.1125
-21
--39.7375
-0
-LINE
-8
-0
-10
-35.1125
-20
--39.7375
-11
-50.6125
-21
--39.7375
-0
-LINE
-8
-0
-10
-50.6125
-20
--39.7375
-11
-50.6125
-21
--26.9375
-0
-LINE
-8
-0
-10
-26.8
-20
--26.9375
-11
-11.3
-21
--26.9375
-0
-LINE
-8
-0
-10
-11.3
-20
--26.9375
-11
-11.3
-21
--39.7375
-0
-LINE
-8
-0
-10
-11.3
-20
--39.7375
-11
-26.8
-21
--39.7375
-0
-LINE
-8
-0
-10
-26.8
-20
--39.7375
-11
-26.8
-21
--26.9375
-0
-LINE
-8
-0
-10
-55.375
-20
--45.9875
-11
-39.875
-21
--45.9875
-0
-LINE
-8
-0
-10
-39.875
-20
--45.9875
-11
-39.875
-21
--58.7875
-0
-LINE
-8
-0
-10
-39.875
-20
--58.7875
-11
-55.375
-21
--58.7875
-0
-LINE
-8
-0
-10
-55.375
-20
--58.7875
-11
-55.375
-21
--45.9875
-0
-LINE
-8
-0
-10
-29.18125
-20
--45.9875
-11
-13.68125
-21
--45.9875
-0
-LINE
-8
-0
-10
-13.68125
-20
--45.9875
-11
-13.68125
-21
--58.7875
-0
-LINE
-8
-0
-10
-13.68125
-20
--58.7875
-11
-29.18125
-21
--58.7875
-0
-LINE
-8
-0
-10
-29.18125
-20
--58.7875
-11
-29.18125
-21
--45.9875
-0
-LINE
-8
-0
-10
-26.8
-20
--84.0875
-11
-11.3
-21
--84.0875
-0
-LINE
-8
-0
-10
-11.3
-20
--84.0875
-11
-11.3
-21
--96.8875
-0
-LINE
-8
-0
-10
-11.3
-20
--96.8875
-11
-26.8
-21
--96.8875
-0
-LINE
-8
-0
-10
-26.8
-20
--96.8875
-11
-26.8
-21
--84.0875
-0
-LINE
-8
-0
-10
-260.1625
-20
--26.9375
-11
-244.6625
-21
--26.9375
-0
-LINE
-8
-0
-10
-244.6625
-20
--26.9375
-11
-244.6625
-21
--39.7375
-0
-LINE
-8
-0
-10
-244.6625
-20
--39.7375
-11
-260.1625
-21
--39.7375
-0
-LINE
-8
-0
-10
-260.1625
-20
--39.7375
-11
-260.1625
-21
--26.9375
-0
-LINE
-8
-0
-10
-283.975
-20
--26.9375
-11
-268.475
-21
--26.9375
-0
-LINE
-8
-0
-10
-268.475
-20
--26.9375
-11
-268.475
-21
--39.7375
-0
-LINE
-8
-0
-10
-268.475
-20
--39.7375
-11
-283.975
-21
--39.7375
-0
-LINE
-8
-0
-10
-283.975
-20
--39.7375
-11
-283.975
-21
--26.9375
-0
-LINE
-8
-0
-10
-283.975
-20
--84.0875
-11
-268.475
-21
--84.0875
-0
-LINE
-8
-0
-10
-268.475
-20
--84.0875
-11
-268.475
-21
--96.8875
-0
-LINE
-8
-0
-10
-268.475
-20
--96.8875
-11
-283.975
-21
--96.8875
-0
-LINE
-8
-0
-10
-283.975
-20
--96.8875
-11
-283.975
-21
--84.0875
-0
-LINE
-8
-0
-10
-250.6375
-20
--7.8875
-11
-235.1375
-21
--7.8875
-0
-LINE
-8
-0
-10
-235.1375
-20
--7.8875
-11
-235.1375
-21
--20.6875
-0
-LINE
-8
-0
-10
-235.1375
-20
--20.6875
-11
-250.6375
-21
--20.6875
-0
-LINE
-8
-0
-10
-250.6375
-20
--20.6875
-11
-250.6375
-21
--7.8875
-0
-LINE
-8
-0
-10
-241.1125
-20
--26.9375
-11
-225.6125
-21
--26.9375
-0
-LINE
-8
-0
-10
-225.6125
-20
--26.9375
-11
-225.6125
-21
--39.7375
-0
-LINE
-8
-0
-10
-225.6125
-20
--39.7375
-11
-241.1125
-21
--39.7375
-0
-LINE
-8
-0
-10
-241.1125
-20
--39.7375
-11
-241.1125
-21
--26.9375
-0
-LINE
-8
-0
-10
-222.0625
-20
--26.9375
-11
-206.5625
-21
--26.9375
-0
-LINE
-8
-0
-10
-206.5625
-20
--26.9375
-11
-206.5625
-21
--39.7375
-0
-LINE
-8
-0
-10
-206.5625
-20
--39.7375
-11
-222.0625
-21
--39.7375
-0
-LINE
-8
-0
-10
-222.0625
-20
--39.7375
-11
-222.0625
-21
--26.9375
-0
-LINE
-8
-0
-10
-245.875
-20
--45.9875
-11
-230.375
-21
--45.9875
-0
-LINE
-8
-0
-10
-230.375
-20
--45.9875
-11
-230.375
-21
--58.7875
-0
-LINE
-8
-0
-10
-230.375
-20
--58.7875
-11
-245.875
-21
--58.7875
-0
-LINE
-8
-0
-10
-245.875
-20
--58.7875
-11
-245.875
-21
--45.9875
-0
-LINE
-8
-0
-10
-226.825
-20
--45.9875
-11
-211.325
-21
--45.9875
-0
-LINE
-8
-0
-10
-211.325
-20
--45.9875
-11
-211.325
-21
--58.7875
-0
-LINE
-8
-0
-10
-211.325
-20
--58.7875
-11
-226.825
-21
--58.7875
-0
-LINE
-8
-0
-10
-226.825
-20
--58.7875
-11
-226.825
-21
--45.9875
-0
-LINE
-8
-0
-10
-236.35
-20
--65.0375
-11
-220.85
-21
--65.0375
-0
-LINE
-8
-0
-10
-220.85
-20
--65.0375
-11
-220.85
-21
--77.8375
-0
-LINE
-8
-0
-10
-220.85
-20
--77.8375
-11
-236.35
-21
--77.8375
-0
-LINE
-8
-0
-10
-236.35
-20
--77.8375
-11
-236.35
-21
--65.0375
-0
-LINE
-8
-0
-10
-217.3
-20
--65.0375
-11
-201.8
-21
--65.0375
-0
-LINE
-8
-0
-10
-201.8
-20
--65.0375
-11
-201.8
-21
--77.8375
-0
-LINE
-8
-0
-10
-201.8
-20
--77.8375
-11
-217.3
-21
--77.8375
-0
-LINE
-8
-0
-10
-217.3
-20
--77.8375
-11
-217.3
-21
--65.0375
-0
-LINE
-8
-0
-10
-257.78125
-20
--84.0875
-11
-242.28125
-21
--84.0875
-0
-LINE
-8
-0
-10
-242.28125
-20
--84.0875
-11
-242.28125
-21
--96.8875
-0
-LINE
-8
-0
-10
-242.28125
-20
--96.8875
-11
-257.78125
-21
--96.8875
-0
-LINE
-8
-0
-10
-257.78125
-20
--96.8875
-11
-257.78125
-21
--84.0875
-0
-LINE
-8
-0
-10
-231.5875
-20
--7.8875
-11
-216.0875
-21
--7.8875
-0
-LINE
-8
-0
-10
-216.0875
-20
--7.8875
-11
-216.0875
-21
--20.6875
-0
-LINE
-8
-0
-10
-216.0875
-20
--20.6875
-11
-231.5875
-21
--20.6875
-0
-LINE
-8
-0
-10
-231.5875
-20
--20.6875
-11
-231.5875
-21
--7.8875
-0
-LINE
-8
-0
-10
-212.5375
-20
--7.8875
-11
-197.0375
-21
--7.8875
-0
-LINE
-8
-0
-10
-197.0375
-20
--7.8875
-11
-197.0375
-21
--20.6875
-0
-LINE
-8
-0
-10
-197.0375
-20
--20.6875
-11
-212.5375
-21
--20.6875
-0
-LINE
-8
-0
-10
-212.5375
-20
--20.6875
-11
-212.5375
-21
--7.8875
-0
-LINE
-8
-0
-10
-203.0125
-20
--26.9375
-11
-187.5125
-21
--26.9375
-0
-LINE
-8
-0
-10
-187.5125
-20
--26.9375
-11
-187.5125
-21
--39.7375
-0
-LINE
-8
-0
-10
-187.5125
-20
--39.7375
-11
-203.0125
-21
--39.7375
-0
-LINE
-8
-0
-10
-203.0125
-20
--39.7375
-11
-203.0125
-21
--26.9375
-0
-LINE
-8
-0
-10
-207.775
-20
--45.9875
-11
-192.275
-21
--45.9875
-0
-LINE
-8
-0
-10
-192.275
-20
--45.9875
-11
-192.275
-21
--58.7875
-0
-LINE
-8
-0
-10
-192.275
-20
--58.7875
-11
-207.775
-21
--58.7875
-0
-LINE
-8
-0
-10
-207.775
-20
--58.7875
-11
-207.775
-21
--45.9875
-0
-LINE
-8
-0
-10
-188.725
-20
--45.9875
-11
-173.225
-21
--45.9875
-0
-LINE
-8
-0
-10
-173.225
-20
--45.9875
-11
-173.225
-21
--58.7875
-0
-LINE
-8
-0
-10
-173.225
-20
--58.7875
-11
-188.725
-21
--58.7875
-0
-LINE
-8
-0
-10
-188.725
-20
--58.7875
-11
-188.725
-21
--45.9875
-0
-LINE
-8
-0
-10
-198.25
-20
--65.0375
-11
-182.75
-21
--65.0375
-0
-LINE
-8
-0
-10
-182.75
-20
--65.0375
-11
-182.75
-21
--77.8375
-0
-LINE
-8
-0
-10
-182.75
-20
--77.8375
-11
-198.25
-21
--77.8375
-0
-LINE
-8
-0
-10
-198.25
-20
--77.8375
-11
-198.25
-21
--65.0375
-0
-LINE
-8
-0
-10
-179.2
-20
--65.0375
-11
-163.7
-21
--65.0375
-0
-LINE
-8
-0
-10
-163.7
-20
--65.0375
-11
-163.7
-21
--77.8375
-0
-LINE
-8
-0
-10
-163.7
-20
--77.8375
-11
-179.2
-21
--77.8375
-0
-LINE
-8
-0
-10
-179.2
-20
--77.8375
-11
-179.2
-21
--65.0375
-0
-LINE
-8
-0
-10
-231.5875
-20
--84.0875
-11
-216.0875
-21
--84.0875
-0
-LINE
-8
-0
-10
-216.0875
-20
--84.0875
-11
-216.0875
-21
--96.8875
-0
-LINE
-8
-0
-10
-216.0875
-20
--96.8875
-11
-231.5875
-21
--96.8875
-0
-LINE
-8
-0
-10
-231.5875
-20
--96.8875
-11
-231.5875
-21
--84.0875
-0
-LINE
-8
-0
-10
-244.01875
-20
--75.3375
-11
-244.01875
-21
--80.4375
-0
-LINE
-8
-0
-10
-244.01875
-20
--80.4375
-11
-241.41875
-21
--80.4375
-0
-LINE
-8
-0
-10
-241.41875
-20
--80.4375
-11
-241.41875
-21
--75.3375
-0
-LINE
-8
-0
-10
-241.41875
-20
--75.3375
-11
-244.01875
-21
--75.3375
-0
-LINE
-8
-0
-10
-284.61875
-20
--75.3375
-11
-284.61875
-21
--80.4375
-0
-LINE
-8
-0
-10
-284.61875
-20
--80.4375
-11
-287.21875
-21
--80.4375
-0
-LINE
-8
-0
-10
-287.21875
-20
--80.4375
-11
-287.21875
-21
--75.3375
-0
-LINE
-8
-0
-10
-287.21875
-20
--75.3375
-11
-284.61875
-21
--75.3375
-0
-LINE
-8
-0
-10
-272.06875
-20
--65.0375
-11
-256.56875
-21
--65.0375
-0
-LINE
-8
-0
-10
-256.56875
-20
--65.0375
-11
-256.56875
-21
--77.8375
-0
-LINE
-8
-0
-10
-256.56875
-20
--77.8375
-11
-272.06875
-21
--77.8375
-0
-LINE
-8
-0
-10
-272.06875
-20
--77.8375
-11
-272.06875
-21
--65.0375
-0
-TEXT
-8
-Cmts
-62
-1
-10
-303.847897
-20
--52.73062
-1
-95.000 mm 
-40
-1.5
-41
-1.5
-50
-270.186984
-7
-SIMPLEX
-72
-1
-73
-2
-11
-303.847897
-21
--52.73062
-0
-LINE
-8
-Cmts
-62
-1
-10
-287.34
-20
--100.28
-11
-305.35289
-21
--100.221215
-0
-LINE
-8
-Cmts
-62
-1
-10
-287.03
-20
--5.29
-11
-305.04289
-21
--5.231215
-0
-LINE
-8
-Cmts
-62
-1
-10
-302.342904
-20
--5.240026
-11
-302.652904
-21
--100.230026
-0
-LINE
-8
-Cmts
-62
-1
-10
-302.652904
-20
--100.230026
-11
-302.06281
-21
--99.105442
-0
-LINE
-8
-Cmts
-62
-1
-10
-302.652904
-20
--100.230026
-11
-303.235645
-21
--99.101614
-0
-LINE
-8
-Cmts
-62
-1
-10
-302.342904
-20
--5.240026
-11
-301.760163
-21
--6.368438
-0
-LINE
-8
-Cmts
-62
-1
-10
-302.342904
-20
--5.240026
-11
-302.932998
-21
--6.36461
-0
-TEXT
-8
-Cmts
-62
-1
-10
-17.92
-20
--43.7
-1
-25.6125 mm 
-40
-1.5
-41
-1.5
-7
-SIMPLEX
-72
-1
-73
-2
-11
-17.92
-21
--43.7
-0
-LINE
-8
-Cmts
-62
-1
-10
-30.71
-20
--33.34
-11
-30.71
-21
--45.05
-0
-LINE
-8
-Cmts
-62
-1
-10
-5.13
-20
--33.34
-11
-5.13
-21
--45.05
-0
-LINE
-8
-Cmts
-62
-1
-10
-5.13
-20
--42.35
-11
-30.71
-21
--42.35
-0
-LINE
-8
-Cmts
-62
-1
-10
-30.71
-20
--42.35
-11
-29.583496
-21
--42.936421
-0
-LINE
-8
-Cmts
-62
-1
-10
-30.71
-20
--42.35
-11
-29.583496
-21
--41.763579
-0
-LINE
-8
-Cmts
-62
-1
-10
-5.13
-20
--42.35
-11
-6.256504
-21
--42.936421
-0
-LINE
-8
-Cmts
-62
-1
-10
-5.13
-20
--42.35
-11
-6.256504
-21
--41.763579
-0
-TEXT
-8
-Cmts
-62
-1
-10
-277.347461
-20
--39.634741
-1
-25.6125 mm 
-40
-1.5
-41
-1.5
-50
-0.022425
-7
-SIMPLEX
-72
-1
-73
-2
-11
-277.347461
-21
--39.634741
-0
-LINE
-8
-Cmts
-62
-1
-10
-290.12
-20
--33.34
-11
-290.12299
-21
--40.979741
-0
-LINE
-8
-Cmts
-62
-1
-10
-264.57
-20
--33.35
-11
-264.57299
-21
--40.989741
-0
-LINE
-8
-Cmts
-62
-1
-10
-264.571933
-20
--38.289741
-11
-290.121933
-21
--38.279741
-0
-LINE
-8
-Cmts
-62
-1
-10
-290.121933
-20
--38.279741
-11
-288.995659
-21
--38.866603
-0
-LINE
-8
-Cmts
-62
-1
-10
-290.121933
-20
--38.279741
-11
-288.9952
-21
--37.693761
-0
-LINE
-8
-Cmts
-62
-1
-10
-264.571933
-20
--38.289741
-11
-265.698666
-21
--38.875721
-0
-LINE
-8
-Cmts
-62
-1
-10
-264.571933
-20
--38.289741
-11
-265.698207
-21
--37.702879
-0
-TEXT
-8
-Cmts
-62
-1
-10
-202.7
-20
--90.49
-1
-6.300 mm 
-40
-1.5
-41
-1.5
-50
-270.0
-7
-SIMPLEX
-72
-1
-73
-2
-11
-202.7
-21
--90.49
-0
-LINE
-8
-Cmts
-62
-1
-10
-195.44
-20
--93.64
-11
-204.05
-21
--93.64
-0
-LINE
-8
-Cmts
-62
-1
-10
-195.44
-20
--87.34
-11
-204.05
-21
--87.34
-0
-LINE
-8
-Cmts
-62
-1
-10
-201.35
-20
--87.34
-11
-201.35
-21
--93.64
-0
-LINE
-8
-Cmts
-62
-1
-10
-201.35
-20
--93.64
-11
-200.763579
-21
--92.513496
-0
-LINE
-8
-Cmts
-62
-1
-10
-201.35
-20
--93.64
-11
-201.936421
-21
--92.513496
-0
-LINE
-8
-Cmts
-62
-1
-10
-201.35
-20
--87.34
-11
-200.763579
-21
--88.466504
-0
-LINE
-8
-Cmts
-62
-1
-10
-201.35
-20
--87.34
-11
-201.936421
-21
--88.466504
-0
-TEXT
-8
-Cmts
-62
-1
-10
-258.43468
-20
--33.349763
-1
-6.300 mm 
-40
-1.5
-41
-1.5
-50
-270.090946
-7
-SIMPLEX
-72
-1
-73
-2
-11
-258.43468
-21
--33.349763
-0
-LINE
-8
-Cmts
-62
-1
-10
-264.59
-20
--36.49
-11
-257.089682
-21
--36.501906
-0
-LINE
-8
-Cmts
-62
-1
-10
-264.58
-20
--30.19
-11
-257.079682
-21
--30.201906
-0
-LINE
-8
-Cmts
-62
-1
-10
-259.779679
-20
--30.19762
-11
-259.789679
-21
--36.49762
-0
-LINE
-8
-Cmts
-62
-1
-10
-259.789679
-20
--36.49762
-11
-259.201471
-21
--35.372048
-0
-LINE
-8
-Cmts
-62
-1
-10
-259.789679
-20
--36.49762
-11
-260.374311
-21
--35.370187
-0
-LINE
-8
-Cmts
-62
-1
-10
-259.779679
-20
--30.19762
-11
-259.195047
-21
--31.325053
-0
-LINE
-8
-Cmts
-62
-1
-10
-259.779679
-20
--30.19762
-11
-260.367887
-21
--31.323192
-0
-TEXT
-8
-Cmts
-62
-1
-10
-24.47
-20
--33.33
-1
-6.300 mm 
-40
-1.5
-41
-1.5
-50
-270.0
-7
-SIMPLEX
-72
-1
-73
-2
-11
-24.47
-21
--33.33
-0
-LINE
-8
-Cmts
-62
-1
-10
-30.72
-20
--36.48
-11
-23.12
-21
--36.48
-0
-LINE
-8
-Cmts
-62
-1
-10
-30.72
-20
--30.18
-11
-23.12
-21
--30.18
-0
-LINE
-8
-Cmts
-62
-1
-10
-25.82
-20
--30.18
-11
-25.82
-21
--36.48
-0
-LINE
-8
-Cmts
-62
-1
-10
-25.82
-20
--36.48
-11
-25.233579
-21
--35.353496
-0
-LINE
-8
-Cmts
-62
-1
-10
-25.82
-20
--36.48
-11
-26.406421
-21
--35.353496
-0
-LINE
-8
-Cmts
-62
-1
-10
-25.82
-20
--30.18
-11
-25.233579
-21
--31.306504
-0
-LINE
-8
-Cmts
-62
-1
-10
-25.82
-20
--30.18
-11
-26.406421
-21
--31.306504
-0
-TEXT
-8
-Cmts
-62
-1
-10
-103.46
-20
--90.49
-1
-6.300 mm 
-40
-1.5
-41
-1.5
-50
-270.0
-7
-SIMPLEX
-72
-1
-73
-2
-11
-103.46
-21
--90.49
-0
-LINE
-8
-Cmts
-62
-1
-10
-109.64
-20
--93.64
-11
-102.11
-21
--93.64
-0
-LINE
-8
-Cmts
-62
-1
-10
-109.64
-20
--87.34
-11
-102.11
-21
--87.34
-0
-LINE
-8
-Cmts
-62
-1
-10
-104.81
-20
--87.34
-11
-104.81
-21
--93.64
-0
-LINE
-8
-Cmts
-62
-1
-10
-104.81
-20
--93.64
-11
-104.223579
-21
--92.513496
-0
-LINE
-8
-Cmts
-62
-1
-10
-104.81
-20
--93.64
-11
-105.396421
-21
--92.513496
-0
-LINE
-8
-Cmts
-62
-1
-10
-104.81
-20
--87.34
-11
-104.223579
-21
--88.466504
-0
-LINE
-8
-Cmts
-62
-1
-10
-104.81
-20
--87.34
-11
-105.396421
-21
--88.466504
-0
-TEXT
-8
-Cmts
-62
-1
-10
-171.54
-20
--78.67
-1
-47.800 mm 
-40
-1.5
-41
-1.5
-7
-SIMPLEX
-72
-1
-73
-2
-11
-171.54
-21
--78.67
-0
-LINE
-8
-Cmts
-62
-1
-10
-147.64
-20
--90.49
-11
-147.64
-21
--77.32
-0
-LINE
-8
-Cmts
-62
-1
-10
-195.44
-20
--90.49
-11
-195.44
-21
--77.32
-0
-LINE
-8
-Cmts
-62
-1
-10
-195.44
-20
--80.02
-11
-147.64
-21
--80.02
-0
-LINE
-8
-Cmts
-62
-1
-10
-147.64
-20
--80.02
-11
-148.766504
-21
--79.433579
-0
-LINE
-8
-Cmts
-62
-1
-10
-147.64
-20
--80.02
-11
-148.766504
-21
--80.606421
-0
-LINE
-8
-Cmts
-62
-1
-10
-195.44
-20
--80.02
-11
-194.313496
-21
--79.433579
-0
-LINE
-8
-Cmts
-62
-1
-10
-195.44
-20
--80.02
-11
-194.313496
-21
--80.606421
-0
-TEXT
-8
-Cmts
-62
-1
-10
-128.64
-20
--109.43
-1
-38.000 mm 
-40
-1.5
-41
-1.5
-7
-SIMPLEX
-72
-1
-73
-2
-11
-128.64
-21
--109.43
-0
-LINE
-8
-Cmts
-62
-1
-10
-109.64
-20
--90.48
-11
-109.64
-21
--110.78
-0
-LINE
-8
-Cmts
-62
-1
-10
-147.64
-20
--90.48
-11
-147.64
-21
--110.78
-0
-LINE
-8
-Cmts
-62
-1
-10
-147.64
-20
--108.08
-11
-109.64
-21
--108.08
-0
-LINE
-8
-Cmts
-62
-1
-10
-109.64
-20
--108.08
-11
-110.766504
-21
--107.493579
-0
-LINE
-8
-Cmts
-62
-1
-10
-109.64
-20
--108.08
-11
-110.766504
-21
--108.666421
-0
-LINE
-8
-Cmts
-62
-1
-10
-147.64
-20
--108.08
-11
-146.513496
-21
--107.493579
-0
-LINE
-8
-Cmts
-62
-1
-10
-147.64
-20
--108.08
-11
-146.513496
-21
--108.666421
-0
-TEXT
-8
-Cmts
-62
-1
-10
-197.96
-20
--99.88
-1
-0.800 mm 
-40
-1.5
-41
-1.5
-50
-270.0
-7
-SIMPLEX
-72
-1
-73
-2
-11
-197.96
-21
--99.88
-0
-LINE
-8
-Cmts
-62
-1
-10
-194.38
-20
--100.28
-11
-199.31
-21
--100.28
-0
-LINE
-8
-Cmts
-62
-1
-10
-194.38
-20
--99.48
-11
-199.31
-21
--99.48
-0
-LINE
-8
-Cmts
-62
-1
-10
-196.61
-20
--99.48
-11
-196.61
-21
--100.28
-0
-LINE
-8
-Cmts
-62
-1
-10
-196.61
-20
--100.28
-11
-196.023579
-21
--99.153496
-0
-LINE
-8
-Cmts
-62
-1
-10
-196.61
-20
--100.28
-11
-197.196421
-21
--99.153496
-0
-LINE
-8
-Cmts
-62
-1
-10
-196.61
-20
--99.48
-11
-196.023579
-21
--100.606504
-0
-LINE
-8
-Cmts
-62
-1
-10
-196.61
-20
--99.48
-11
-197.196421
-21
--100.606504
-0
-TEXT
-8
-Cmts
-62
-1
-10
-188.875133
-20
--92.417616
-1
-3.900 mm 
-40
-1.5
-41
-1.5
-50
-89.559272
-7
-SIMPLEX
-72
-1
-73
-2
-11
-188.875133
-21
--92.417616
-0
-LINE
-8
-Cmts
-62
-1
-10
-191.77
-20
--94.39
-11
-187.510173
-21
--94.357232
-0
-LINE
-8
-Cmts
-62
-1
-10
-191.8
-20
--90.49
-11
-187.540173
-21
--90.457232
-0
-LINE
-8
-Cmts
-62
-1
-10
-190.240093
-20
--90.478001
-11
-190.210093
-21
--94.378001
-0
-LINE
-8
-Cmts
-62
-1
-10
-190.210093
-20
--94.378001
-11
-189.632355
-21
--93.24702
-0
-LINE
-8
-Cmts
-62
-1
-10
-190.210093
-20
--94.378001
-11
-190.805162
-21
--93.256041
-0
-LINE
-8
-Cmts
-62
-1
-10
-190.240093
-20
--90.478001
-11
-189.645024
-21
--91.599961
-0
-LINE
-8
-Cmts
-62
-1
-10
-190.240093
-20
--90.478001
-11
-190.817831
-21
--91.608982
-0
-TEXT
-8
-Cmts
-62
-1
-10
-159.664849
-20
--87.283312
-1
-6.400 mm 
-40
-1.5
-41
-1.5
-50
-270.089525
-7
-SIMPLEX
-72
-1
-73
-2
-11
-159.664849
-21
--87.283312
-0
-LINE
-8
-Cmts
-62
-1
-10
-155.38
-20
--84.09
-11
-161.009848
-21
--84.081203
-0
-LINE
-8
-Cmts
-62
-1
-10
-155.39
-20
--90.49
-11
-161.019848
-21
--90.481203
-0
-LINE
-8
-Cmts
-62
-1
-10
-158.319851
-20
--90.485422
-11
-158.309851
-21
--84.085422
-0
-LINE
-8
-Cmts
-62
-1
-10
-158.309851
-20
--84.085422
-11
-158.898031
-21
--85.211008
-0
-LINE
-8
-Cmts
-62
-1
-10
-158.309851
-20
--84.085422
-11
-157.725191
-21
--85.212841
-0
-LINE
-8
-Cmts
-62
-1
-10
-158.319851
-20
--90.485422
-11
-158.904511
-21
--89.358003
-0
-LINE
-8
-Cmts
-62
-1
-10
-158.319851
-20
--90.485422
-11
-157.731671
-21
--89.359836
-0
-LINE
-8
-Cmts
-62
-1
-10
-109.67
-20
--90.4875
-11
-195.48
-21
--90.4875
-0
-TEXT
-8
-Cmts
-62
-1
-10
-147.64
-20
--117.98
-1
-88.300 mm 
-40
-1.5
-41
-1.5
-7
-SIMPLEX
-72
-1
-73
-2
-11
-147.64
-21
--117.98
-0
-LINE
-8
-Cmts
-62
-1
-10
-191.79
-20
--99.49
-11
-191.79
-21
--119.33
-0
-LINE
-8
-Cmts
-62
-1
-10
-103.49
-20
--99.49
-11
-103.49
-21
--119.33
-0
-LINE
-8
-Cmts
-62
-1
-10
-103.49
-20
--116.63
-11
-191.79
-21
--116.63
-0
-LINE
-8
-Cmts
-62
-1
-10
-191.79
-20
--116.63
-11
-190.663496
-21
--117.216421
-0
-LINE
-8
-Cmts
-62
-1
-10
-191.79
-20
--116.63
-11
-190.663496
-21
--116.043579
-0
-LINE
-8
-Cmts
-62
-1
-10
-103.49
-20
--116.63
-11
-104.616504
-21
--117.216421
-0
-LINE
-8
-Cmts
-62
-1
-10
-103.49
-20
--116.63
-11
-104.616504
-21
--116.043579
-0
-TEXT
-8
-Cmts
-62
-1
-10
-102.19
-20
--104.41
-1
-2.600 mm 
-40
-1.5
-41
-1.5
-7
-SIMPLEX
-72
-1
-73
-2
-11
-102.19
-21
--104.41
-0
-LINE
-8
-Cmts
-62
-1
-10
-103.49
-20
--99.49
-11
-103.49
-21
--105.76
-0
-LINE
-8
-Cmts
-62
-1
-10
-100.89
-20
--99.49
-11
-100.89
-21
--105.76
-0
-LINE
-8
-Cmts
-62
-1
-10
-100.89
-20
--103.06
-11
-103.49
-21
--103.06
-0
-LINE
-8
-Cmts
-62
-1
-10
-103.49
-20
--103.06
-11
-102.363496
-21
--103.646421
-0
-LINE
-8
-Cmts
-62
-1
-10
-103.49
-20
--103.06
-11
-102.363496
-21
--102.473579
-0
-LINE
-8
-Cmts
-62
-1
-10
-100.89
-20
--103.06
-11
-102.016504
-21
--103.646421
-0
-LINE
-8
-Cmts
-62
-1
-10
-100.89
-20
--103.06
-11
-102.016504
-21
--102.473579
-0
-TEXT
-8
-Cmts
-62
-1
-10
-97.67
-20
--96.94
-1
-5.100 mm 
-40
-1.5
-41
-1.5
-50
-270.0
-7
-SIMPLEX
-72
-1
-73
-2
-11
-97.67
-21
--96.94
-0
-LINE
-8
-Cmts
-62
-1
-10
-100.89
-20
--99.49
-11
-96.32
-21
--99.49
-0
-LINE
-8
-Cmts
-62
-1
-10
-100.89
-20
--94.39
-11
-96.32
-21
--94.39
-0
-LINE
-8
-Cmts
-62
-1
-10
-99.02
-20
--94.39
-11
-99.02
-21
--99.49
-0
-LINE
-8
-Cmts
-62
-1
-10
-99.02
-20
--99.49
-11
-98.433579
-21
--98.363496
-0
-LINE
-8
-Cmts
-62
-1
-10
-99.02
-20
--99.49
-11
-99.606421
-21
--98.363496
-0
-LINE
-8
-Cmts
-62
-1
-10
-99.02
-20
--94.39
-11
-98.433579
-21
--95.516504
-0
-LINE
-8
-Cmts
-62
-1
-10
-99.02
-20
--94.39
-11
-99.606421
-21
--95.516504
-0
-TEXT
-8
-Cmts
-62
-1
-10
-109.63
-20
--81.13
-1
-14.500 mm 
-40
-1.5
-41
-1.5
-7
-SIMPLEX
-72
-1
-73
-2
-11
-109.63
-21
--81.13
-0
-LINE
-8
-Cmts
-62
-1
-10
-102.38
-20
--89.28
-11
-102.38
-21
--79.78
-0
-LINE
-8
-Cmts
-62
-1
-10
-116.88
-20
--89.28
-11
-116.88
-21
--79.78
-0
-LINE
-8
-Cmts
-62
-1
-10
-116.88
-20
--82.48
-11
-102.38
-21
--82.48
-0
-LINE
-8
-Cmts
-62
-1
-10
-102.38
-20
--82.48
-11
-103.506504
-21
--81.893579
-0
-LINE
-8
-Cmts
-62
-1
-10
-102.38
-20
--82.48
-11
-103.506504
-21
--83.066421
-0
-LINE
-8
-Cmts
-62
-1
-10
-116.88
-20
--82.48
-11
-115.753496
-21
--81.893579
-0
-LINE
-8
-Cmts
-62
-1
-10
-116.88
-20
--82.48
-11
-115.753496
-21
--83.066421
-0
-TEXT
-8
-Cmts
-62
-1
-10
-121.803009
-20
--90.50045
-1
-2.400 mm 
-40
-1.5
-41
-1.5
-50
-89.761269
-7
-SIMPLEX
-72
-1
-73
-2
-11
-121.803009
-21
--90.50045
-0
-LINE
-8
-Cmts
-62
-1
-10
-116.89
-20
--91.68
-11
-123.147997
-21
--91.706075
-0
-LINE
-8
-Cmts
-62
-1
-10
-116.9
-20
--89.28
-11
-123.157997
-21
--89.306075
-0
-LINE
-8
-Cmts
-62
-1
-10
-120.458021
-20
--89.294825
-11
-120.448021
-21
--91.694825
-0
-LINE
-8
-Cmts
-62
-1
-10
-120.448021
-20
--91.694825
-11
-119.866299
-21
--90.565888
-0
-LINE
-8
-Cmts
-62
-1
-10
-120.448021
-20
--91.694825
-11
-121.03913
-21
--90.570774
-0
-LINE
-8
-Cmts
-62
-1
-10
-120.458021
-20
--89.294825
-11
-119.866912
-21
--90.418876
-0
-LINE
-8
-Cmts
-62
-1
-10
-120.458021
-20
--89.294825
-11
-121.039743
-21
--90.423762
-0
-TEXT
-8
-Cmts
-62
-1
-10
-115.69
-20
--85.3
-1
-2.400 mm 
-40
-1.5
-41
-1.5
-7
-SIMPLEX
-72
-1
-73
-2
-11
-115.69
-21
--85.3
-0
-LINE
-8
-Cmts
-62
-1
-10
-116.89
-20
--89.28
-11
-116.89
-21
--83.95
-0
-LINE
-8
-Cmts
-62
-1
-10
-114.49
-20
--89.28
-11
-114.49
-21
--83.95
-0
-LINE
-8
-Cmts
-62
-1
-10
-114.49
-20
--86.65
-11
-116.89
-21
--86.65
-0
-LINE
-8
-Cmts
-62
-1
-10
-116.89
-20
--86.65
-11
-115.763496
-21
--87.236421
-0
-LINE
-8
-Cmts
-62
-1
-10
-116.89
-20
--86.65
-11
-115.763496
-21
--86.063579
-0
-LINE
-8
-Cmts
-62
-1
-10
-114.49
-20
--86.65
-11
-115.616504
-21
--87.236421
-0
-LINE
-8
-Cmts
-62
-1
-10
-114.49
-20
--86.65
-11
-115.616504
-21
--86.063579
-0
-TEXT
-8
-Cmts
-62
-1
-10
-135.19
-20
--90.49
-1
-12.800 mm 
-40
-1.5
-41
-1.5
-50
-270.0
-7
-SIMPLEX
-72
-1
-73
-2
-11
-135.19
-21
--90.49
-0
-LINE
-8
-Cmts
-62
-1
-10
-139.89
-20
--96.89
-11
-133.84
-21
--96.89
-0
-LINE
-8
-Cmts
-62
-1
-10
-139.89
-20
--84.09
-11
-133.84
-21
--84.09
-0
-LINE
-8
-Cmts
-62
-1
-10
-136.54
-20
--84.09
-11
-136.54
-21
--96.89
-0
-LINE
-8
-Cmts
-62
-1
-10
-136.54
-20
--96.89
-11
-135.953579
-21
--95.763496
-0
-LINE
-8
-Cmts
-62
-1
-10
-136.54
-20
--96.89
-11
-137.126421
-21
--95.763496
-0
-LINE
-8
-Cmts
-62
-1
-10
-136.54
-20
--84.09
-11
-135.953579
-21
--85.216504
-0
-LINE
-8
-Cmts
-62
-1
-10
-136.54
-20
--84.09
-11
-137.126421
-21
--85.216504
-0
-TEXT
-8
-Cmts
-62
-1
-10
-147.63
-20
--105.02
-1
-15.500 mm 
-40
-1.5
-41
-1.5
-7
-SIMPLEX
-72
-1
-73
-2
-11
-147.63
-21
--105.02
-0
-LINE
-8
-Cmts
-62
-1
-10
-139.88
-20
--96.87
-11
-139.88
-21
--106.37
-0
-LINE
-8
-Cmts
-62
-1
-10
-155.38
-20
--96.87
-11
-155.38
-21
--106.37
-0
-LINE
-8
-Cmts
-62
-1
-10
-155.38
-20
--103.67
-11
-139.88
-21
--103.67
-0
-LINE
-8
-Cmts
-62
-1
-10
-139.88
-20
--103.67
-11
-141.006504
-21
--103.083579
-0
-LINE
-8
-Cmts
-62
-1
-10
-139.88
-20
--103.67
-11
-141.006504
-21
--104.256421
-0
-LINE
-8
-Cmts
-62
-1
-10
-155.38
-20
--103.67
-11
-154.253496
-21
--103.083579
-0
-LINE
-8
-Cmts
-62
-1
-10
-155.38
-20
--103.67
-11
-154.253496
-21
--104.256421
-0
-CIRCLE
-8
-0
-10
-30.75
-20
--33.3375
-40
-3.15
-0
-CIRCLE
-8
-0
-10
-195.4375
-20
--90.4875
-40
-3.15
-0
-CIRCLE
-8
-0
-10
-264.525
-20
--33.3375
-40
-3.15
-0
-LINE
-8
-0
-10
-290.1375
-20
--7.7875
-11
-290.1375
-21
--58.7125
-0
-LINE
-8
-0
-10
-288.3375
-20
--58.7125
-11
-290.1375
-21
--58.7125
-0
-LINE
-8
-0
-10
-5.1375
-20
--65.0125
-11
-5.1375
-21
--97.7875
-0
-LINE
-8
-0
-10
-288.3375
-20
--65.1125
-11
-290.1375
-21
--65.1125
-0
-LINE
-8
-0
-10
-8.7375
-20
--65.0125
-11
-5.1375
-21
--65.0125
-0
-LINE
-8
-0
-10
-8.7375
-20
--58.8125
-11
-5.1375
-21
--58.8125
-0
-ARC
-8
-0
-10
-8.7375
-20
--61.9125
-30
-0.0
-40
-3.1
-50
--90.0
-51
-90.0
-0
-ARC
-8
-0
-10
-288.3375
-20
--61.9125
-30
-0.0
-40
-3.2
-50
-90.0
-51
-270.0
-0
-TEXT
-8
-Cmts
-62
-1
-10
-277.6375
-20
-6.3625
-1
-25.000 mm 
-40
-1.5
-41
-1.5
-7
-SIMPLEX
-72
-1
-73
-2
-11
-277.6375
-21
-6.3625
-0
-LINE
-8
-Cmts
-62
-1
-10
-265.1375
-20
--33.3375
-11
-265.1375
-21
-7.7125
-0
-LINE
-8
-Cmts
-62
-1
-10
-290.1375
-20
--33.3375
-11
-290.1375
-21
-7.7125
-0
-LINE
-8
-Cmts
-62
-1
-10
-290.1375
-20
-5.0125
-11
-265.1375
-21
-5.0125
-0
-LINE
-8
-Cmts
-62
-1
-10
-265.1375
-20
-5.0125
-11
-266.264004
-21
-5.598921
-0
-LINE
-8
-Cmts
-62
-1
-10
-265.1375
-20
-5.0125
-11
-266.264004
-21
-4.426079
-0
-LINE
-8
-Cmts
-62
-1
-10
-290.1375
-20
-5.0125
-11
-289.010996
-21
-5.598921
-0
-LINE
-8
-Cmts
-62
-1
-10
-290.1375
-20
-5.0125
-11
-289.010996
-21
-4.426079
-0
-TEXT
-8
-Cmts
-62
-1
-10
-147.6375
-20
-10.875
-1
-285.000 mm 
-40
-1.5
-41
-1.5
-7
-SIMPLEX
-72
-1
-73
-2
-11
-147.6375
-21
-10.875
-0
-LINE
-8
-Cmts
-62
-1
-10
-290.1375
-20
--7.14375
-11
-290.1375
-21
-12.225
-0
-LINE
-8
-Cmts
-62
-1
-10
-5.1375
-20
--7.14375
-11
-5.1375
-21
-12.225
-0
-LINE
-8
-Cmts
-62
-1
-10
-5.1375
-20
-9.525
-11
-290.1375
-21
-9.525
-0
-LINE
-8
-Cmts
-62
-1
-10
-290.1375
-20
-9.525
-11
-289.010996
-21
-8.938579
-0
-LINE
-8
-Cmts
-62
-1
-10
-290.1375
-20
-9.525
-11
-289.010996
-21
-10.111421
-0
-LINE
-8
-Cmts
-62
-1
-10
-5.1375
-20
-9.525
-11
-6.264004
-21
-8.938579
-0
-LINE
-8
-Cmts
-62
-1
-10
-5.1375
-20
-9.525
-11
-6.264004
-21
-10.111421
-0
-ARC
-8
-0
-10
-7.6375
-20
--97.7875
-30
-0.0
-40
-2.5
-50
--180.0
-51
--90.0
-0
-ARC
-8
-0
-10
-287.6375
-20
--97.7875
-30
-0.0
-40
-2.5
-50
--90.0
-51
-0.0
-0
-ARC
-8
-0
-10
-287.6375
-20
--7.7875
-30
-0.0
-40
-2.5
-50
-0.0
-51
-90.0
-0
-ARC
-8
-0
-10
-7.6375
-20
--7.7875
-30
-0.0
-40
-2.5
-50
-90.0
-51
-180.0
-0
-LINE
-8
-0
-10
-290.1375
-20
--97.7875
-11
-290.1375
-21
--65.1125
-0
-LINE
-8
-0
-10
-7.6375
-20
--100.2875
-11
-287.6375
-21
--100.2875
-0
-LINE
-8
-0
-10
-5.1375
-20
--7.7875
-11
-5.1375
-21
--58.8125
-0
-LINE
-8
-0
-10
-7.6375
-20
--5.2875
-11
-287.6375
-21
--5.2875
-0
-ENDSEC
-0
-EOF
\ No newline at end of file
diff --git a/keyboards/weebkeeb/config.h b/keyboards/weebkeeb/config.h
deleted file mode 100644
index 859adc9cc29..00000000000
--- a/keyboards/weebkeeb/config.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
-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    You
-#define PRODUCT         weebkeeb
-#define DESCRIPTION     A custom keyboard
-
-/* key matrix size */
-#define MATRIX_ROWS 4
-#define MATRIX_COLS 12
-
-/*
- * Keyboard Matrix Assignments
- *
- * Change this to how you wired your keyboard
- * COLS: AVR pins used for columns, left to right
- * ROWS: AVR pins used for rows, top to bottom
- * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
- *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
- *
-*/
-#define MATRIX_ROW_PINS { F4, F5, F6, F7 }
-#define MATRIX_COL_PINS { B0, B1, B2, B3, B4, B5, B6, B7, C6, C7, F0, F1 }
-#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/weebkeeb/keymaps/default/Makefile b/keyboards/weebkeeb/keymaps/default/Makefile
deleted file mode 100644
index f4671a9d113..00000000000
--- a/keyboards/weebkeeb/keymaps/default/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# 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/weebkeeb/keymaps/default/config.h b/keyboards/weebkeeb/keymaps/default/config.h
deleted file mode 100644
index df06a262062..00000000000
--- a/keyboards/weebkeeb/keymaps/default/config.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#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/weebkeeb/keymaps/default/keymap.c b/keyboards/weebkeeb/keymaps/default/keymap.c
deleted file mode 100644
index cdf1f1e4c78..00000000000
--- a/keyboards/weebkeeb/keymaps/default/keymap.c
+++ /dev/null
@@ -1,119 +0,0 @@
-#include "weebkeeb.h"
-
-#define _QWERTY 0
-#define _COLEMAK 1
-#define _DVORAK 2
-#define _LOWER 3
-#define _RAISE 4
-#define _ADJUST 16
-
-enum custom_keycodes {
-  QWERTY = SAFE_RANGE,
-  COLEMAK,
-  DVORAK,
-  LOWER,
-  RAISE,
-  ADJUST,
-};
-
-// Fillers to make layering more clear
-#define _______ KC_TRNS
-#define XXXXXXX KC_NO
-
-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 |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[_QWERTY] = KEYMAP( \
-  KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_DEL, \
-  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 , \
-  KC_LCTL, ADJUST, KC_LALT, KC_LGUI, MO(3),   KC_SPC,   KC_SPC,  MO(4),   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 |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[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_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
-),
-[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_ENT,  KC_ENT,  _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
-),
-
-/* Adjust (Lower + Raise)
- * ,-----------------------------------------------------------------------------------.
- * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |      |      |      |      |      |      |      |      |      |      |      |      |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |      |      |      |      |      |             |      |      |      |      |      |
- * `-----------------------------------------------------------------------------------'
- */
-[_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, _______, _______, _______, \
-  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
-)
-};
-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/weebkeeb/keymaps/default/readme.md b/keyboards/weebkeeb/keymaps/default/readme.md
deleted file mode 100644
index 87713227632..00000000000
--- a/keyboards/weebkeeb/keymaps/default/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-# The default keymap for weebkeeb
\ No newline at end of file
diff --git a/keyboards/weebkeeb/readme.md b/keyboards/weebkeeb/readme.md
deleted file mode 100644
index bf31016c82c..00000000000
--- a/keyboards/weebkeeb/readme.md
+++ /dev/null
@@ -1,28 +0,0 @@
-weebkeeb keyboard firmware
-======================
-
-## Quantum MK Firmware
-
-For the full Quantum feature list, see [the parent readme](/).
-
-## Building
-
-Download or clone the whole firmware and navigate to the keyboards/weebkeeb folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. 
-
-Depending on which keymap you would like to use, you will have to compile slightly differently.
-
-### Default
-
-To build with the default keymap, simply run `make default`.
-
-### Other Keymaps
-
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
-
-To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
-
-```
-$ make [default|jack|<name>]
-```
-
-Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboards/weebkeeb/rules.mk b/keyboards/weebkeeb/rules.mk
deleted file mode 100644
index 55898147dd3..00000000000
--- a/keyboards/weebkeeb/rules.mk
+++ /dev/null
@@ -1,67 +0,0 @@
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= no            # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
diff --git a/keyboards/weebkeeb/weebkeeb.c b/keyboards/weebkeeb/weebkeeb.c
deleted file mode 100644
index 483fc9440ed..00000000000
--- a/keyboards/weebkeeb/weebkeeb.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "weebkeeb.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/weebkeeb/weebkeeb.h b/keyboards/weebkeeb/weebkeeb.h
deleted file mode 100644
index 7bca2c20145..00000000000
--- a/keyboards/weebkeeb/weebkeeb.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef WEEBKEEB_H
-#define WEEBKEEB_H
-
-#include "quantum.h"
-
-// This a shortcut to help you visually see your layout.
-// The following is an example using the Planck MIT layout
-// The first section contains all of the arguements
-// The second converts the arguments into a two-dimensional array
-#define KEYMAP( \
-    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, 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 \
-) \
-{ \
-    { 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 } \
-}
-
-#endif

From 0f71c81df833a282250ecc4e66034320e40b208e Mon Sep 17 00:00:00 2001
From: climbalima <climbalima@gmail.com>
Date: Sat, 3 Dec 2016 17:37:41 -0500
Subject: [PATCH 133/147] having trouble with conflicts

---
 keyboards/maxipad/config.h  | 15 ---------------
 keyboards/maxipad/readme.md |  2 --
 keyboards/maxipad/rules.mk  |  3 ---
 3 files changed, 20 deletions(-)

diff --git a/keyboards/maxipad/config.h b/keyboards/maxipad/config.h
index 4377a892e95..d7a5ef5646a 100644
--- a/keyboards/maxipad/config.h
+++ b/keyboards/maxipad/config.h
@@ -32,20 +32,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define MATRIX_ROWS 5
 #define MATRIX_COLS 6
 
-<<<<<<< HEAD
-// Planck PCB default pin-out
-// Change this to how you wired your keyboard
-// COLS: Left to right, ROWS: Top to bottom
-#ifdef USE_PRO_MICRO
-	#define MATRIX_ROW_PINS { B6, B2, B3, B1, F7 }
-	#define MATRIX_COL_PINS { F4, C6, D7, F5, B4, B5 }
-	#define UNUSED_PINS
- #else
- 	#define MATRIX_ROW_PINS { B6, F7, B2, B3, B1 }
-	#define MATRIX_COL_PINS { F6, C6, D7, F5, B4, B5 }
-	#define UNUSED_PINS
- #endif
-=======
 /*
  * Keyboard Matrix Assignments
  *
@@ -65,7 +51,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 	//#define MATRIX_COL_PINS { F6, C6, D7, F5, B4, B5 }
 	//#define UNUSED_PINS
 
->>>>>>> 102a830bbdb302eb0951ec7910ab7c9feae272d1
 
 /* COL2ROW or ROW2COL */
 #define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/maxipad/readme.md b/keyboards/maxipad/readme.md
index 58ed5d718ff..861ea2b0782 100644
--- a/keyboards/maxipad/readme.md
+++ b/keyboards/maxipad/readme.md
@@ -1,6 +1,4 @@
-<<<<<<< HEAD
 Maxipad keyboard firmware
-======================
 
 ## Quantum MK Firmware
 
diff --git a/keyboards/maxipad/rules.mk b/keyboards/maxipad/rules.mk
index 49bb5f00229..a5c73915236 100644
--- a/keyboards/maxipad/rules.mk
+++ b/keyboards/maxipad/rules.mk
@@ -59,7 +59,6 @@ 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
-<<<<<<< HEAD
 # SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
 # NKRO_ENABLE ?= yes		# USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 # BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality
@@ -67,7 +66,6 @@ COMMAND_ENABLE ?= yes    # Commands for debug and configuration
 # UNICODE_ENABLE ?= YES 		# Unicode
 # BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID
 USE_PRO_MICRO ?= yes
-=======
 SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
 # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 NKRO_ENABLE ?= no            # USB Nkey Rollover
@@ -76,4 +74,3 @@ 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
->>>>>>> 102a830bbdb302eb0951ec7910ab7c9feae272d1

From 75b18773bd9368ad53d7072d73a6280e053123a3 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sun, 4 Dec 2016 14:51:27 +0700
Subject: [PATCH 134/147] fix RGB LED order

---
 keyboards/handwired/promethium/promethium.h | 124 ++++++++++----------
 1 file changed, 62 insertions(+), 62 deletions(-)

diff --git a/keyboards/handwired/promethium/promethium.h b/keyboards/handwired/promethium/promethium.h
index 8f2a8c3be2f..662eeab9904 100644
--- a/keyboards/handwired/promethium/promethium.h
+++ b/keyboards/handwired/promethium/promethium.h
@@ -23,77 +23,77 @@
 }
 
 enum led_sequence {
-  LED_IND_EMOJI,
-  LED_IND_NUM,
-  LED_IND_FUNC,
-
-  LED_IND_BATTERY,
-  LED_IND_USB,
   LED_IND_BLUETOOTH,
+  LED_IND_USB,
+  LED_IND_BATTERY,
 
-  LED_TAB,
-  LED_ESC,
-  LED_LSFT,
-  LED_LCTL,
+  LED_IND_FUNC,
+  LED_IND_NUM,
+  LED_IND_EMOJI,
 
-  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_BKSP,
+  LED_ENT,
+  LED_RSFT,
+  LED_RCTL,
 
   LED_RGUI,
   LED_SLSH,
   LED_SCLN,
   LED_P,
 
-  LED_BKSP,
-  LED_ENT,
-  LED_RSFT,
-  LED_RCTL
+  LED_O,
+  LED_L,
+  LED_DOT,
+  LED_RALT,
+
+  LED_EMOJI,
+  LED_COMM,
+  LED_K,
+  LED_I,
+
+  LED_U,
+  LED_J,
+  LED_M,
+  LED_FUNC,
+
+  LED_RSPC,
+  LED_N,
+  LED_HH,
+  LED_Y,
+
+  LED_TRACKPOINT3,
+  LED_TRACKPOINT2,
+  LED_TRACKPOINT1,
+
+  LED_LSPC,
+  LED_B,
+  LED_G,
+  LED_T,
+
+  LED_R,
+  LED_F,
+  LED_V,
+  LED_NUM,
+
+  LED_PUNC,
+  LED_C,
+  LED_D,
+  LED_E,
+
+  LED_W,
+  LED_S,
+  LED_X,
+  LED_LALT,
+
+  LED_LGUI,
+  LED_Z,
+  LED_A,
+  LED_Q,
+
+  LED_TAB,
+  LED_ESC,
+  LED_LSFT,
+  LED_LCTL,
 };
 
 #endif

From a8e5f6180585f46684d713976ad05d4d81b11ab1 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Sun, 4 Dec 2016 23:55:06 +0700
Subject: [PATCH 135/147] fix emoji LED indicators.

---
 .../promethium/keymaps/priyadi/keymap.c       | 46 +++++++++++--------
 1 file changed, 27 insertions(+), 19 deletions(-)

diff --git a/keyboards/handwired/promethium/keymaps/priyadi/keymap.c b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
index b2da2f97b78..3d34e98229e 100644
--- a/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
+++ b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
@@ -282,25 +282,25 @@ void led_layer_func(void) {
   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_U, 15, 0, 0);
+  rgbsps_set(LED_O, 15, 0, 0);
+  rgbsps_set(LED_COMM, 15, 0, 0);
+  rgbsps_set(LED_DOT, 15, 0, 0);
+  rgbsps_set(LED_SCLN, 15, 0, 0);
+  rgbsps_set(LED_P, 15, 0, 0);
 
-  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_set(LED_Q, 0, 15, 0);
+  rgbsps_set(LED_W, 0, 15, 0);
+  rgbsps_set(LED_E, 0, 15, 0);
+  rgbsps_set(LED_R, 0, 15, 0);
+  rgbsps_set(LED_A, 0, 15, 0);
+  rgbsps_set(LED_S, 0, 15, 0);
+  rgbsps_set(LED_D, 0, 15, 0);
+  rgbsps_set(LED_F, 0, 15, 0);
+  rgbsps_set(LED_Z, 0, 15, 0);
+  rgbsps_set(LED_X, 0, 15, 0);
+  rgbsps_set(LED_C, 0, 15, 0);
+  rgbsps_set(LED_V, 0, 15, 0);
 
   rgbsps_send();
 }
@@ -361,7 +361,15 @@ void led_layer_num(void) {
 }
 
 void led_layer_emoji(void) {
-  rgbsps_setall(15, 15, 0);
+  for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
+    rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 15, 15, 0);
+  }
+  for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
+    rgbsps_set(pgm_read_byte(&LED_MODS[i]), 15, 15, 0);
+  }
+  for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
+    rgbsps_set(pgm_read_byte(&LED_FN[i]), 15, 15, 0);
+  }
 
   rgbsps_set(LED_IND_FUNC, 0, 0, 0);
   rgbsps_set(LED_IND_NUM, 0, 0, 0);

From 6ef3060b4292392be1455c26d260e819f7d12ef0 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Mon, 5 Dec 2016 01:07:12 +0700
Subject: [PATCH 136/147] Implemented weak ps2_mouse_init_user()

There are a lot of PS/2 commands, some are vendor/device specific, so we
provide a weak ps2_mouse_init_user() to be implemented in each keyboard
that need it.
---
 tmk_core/protocol/ps2_mouse.c | 54 +++++------------------------------
 tmk_core/protocol/ps2_mouse.h | 49 +++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 47 deletions(-)

diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index af971dd4975..e3c6974440c 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/tmk_core/protocol/ps2_mouse.c
@@ -28,53 +28,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* ============================= MACROS ============================ */
 
-#define PS2_MOUSE_SEND(command, message) \
-do { \
-   uint8_t rcv = ps2_host_send(command); \
-   if (debug_mouse) { \
-        print((message)); \
-        xprintf(" command: %X, result: %X, error: %X \n", command, rcv, ps2_error); \
-    } \
-} while(0)
-
-#define PS2_MOUSE_SEND_SAFE(command, message) \
-do { \
-    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
-        ps2_mouse_disable_data_reporting(); \
-    } \
-    PS2_MOUSE_SEND(command, message); \
-    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
-        ps2_mouse_enable_data_reporting(); \
-    } \
-} while(0)
-
-#define PS2_MOUSE_SET_SAFE(command, value, message) \
-do { \
-    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
-        ps2_mouse_disable_data_reporting(); \
-    } \
-    PS2_MOUSE_SEND(command, message); \
-    PS2_MOUSE_SEND(value, "Sending value"); \
-    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
-        ps2_mouse_enable_data_reporting(); \
-    } \
-} while(0)
-
-#define PS2_MOUSE_RECEIVE(message) \
-do { \
-   uint8_t rcv = ps2_host_recv_response(); \
-   if (debug_mouse) { \
-        print((message)); \
-        xprintf(" result: %X, error: %X \n", rcv, ps2_error); \
-    } \
-} while(0)
-
-static enum ps2_mouse_mode_e {
-    PS2_MOUSE_STREAM_MODE,
-    PS2_MOUSE_REMOTE_MODE,
-} ps2_mouse_mode = PS2_MOUSE_STREAM_MODE;
-
-static report_mouse_t mouse_report = {};
+static report_mouse_t mouse_report = {};./
 
 static inline void ps2_mouse_print_report(report_mouse_t *mouse_report);
 static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report);
@@ -108,6 +62,12 @@ void ps2_mouse_init(void) {
 #ifdef PS2_MOUSE_USE_2_1_SCALING
     ps2_mouse_set_scaling_2_1();
 #endif
+
+    ps2_mouse_init_user();
+}
+
+__attribute__((weak))
+void ps2_mouse_init_user(void) {
 }
 
 void ps2_mouse_task(void) {
diff --git a/tmk_core/protocol/ps2_mouse.h b/tmk_core/protocol/ps2_mouse.h
index e11c705fc65..3c93a463429 100644
--- a/tmk_core/protocol/ps2_mouse.h
+++ b/tmk_core/protocol/ps2_mouse.h
@@ -19,6 +19,53 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define  PS2_MOUSE_H
 
 #include <stdbool.h>
+#include "debug.h"
+
+#define PS2_MOUSE_SEND(command, message) \
+do { \
+   uint8_t rcv = ps2_host_send(command); \
+   if (debug_mouse) { \
+        print((message)); \
+        xprintf(" command: %X, result: %X, error: %X \n", command, rcv, ps2_error); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_SEND_SAFE(command, message) \
+do { \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_disable_data_reporting(); \
+    } \
+    PS2_MOUSE_SEND(command, message); \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_enable_data_reporting(); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_SET_SAFE(command, value, message) \
+do { \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_disable_data_reporting(); \
+    } \
+    PS2_MOUSE_SEND(command, message); \
+    PS2_MOUSE_SEND(value, "Sending value"); \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_enable_data_reporting(); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_RECEIVE(message) \
+do { \
+   uint8_t rcv = ps2_host_recv_response(); \
+   if (debug_mouse) { \
+        print((message)); \
+        xprintf(" result: %X, error: %X \n", rcv, ps2_error); \
+    } \
+} while(0)
+
+static enum ps2_mouse_mode_e {
+    PS2_MOUSE_STREAM_MODE,
+    PS2_MOUSE_REMOTE_MODE,
+} ps2_mouse_mode = PS2_MOUSE_STREAM_MODE;
 
 /*
  * Data format:
@@ -107,6 +154,8 @@ typedef enum ps2_mouse_sample_rate_e {
 
 void ps2_mouse_init(void);
 
+void ps2_mouse_init_user(void);
+
 void ps2_mouse_task(void);
 
 void ps2_mouse_disable_data_reporting(void);

From 73073f270b55d939559e8cfd4a7d36e3510ba2f6 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Mon, 5 Dec 2016 01:15:04 +0700
Subject: [PATCH 137/147] Trackpoint initialization

---
 .../promethium/keymaps/priyadi/flash.sh       |   1 +
 .../promethium/keymaps/priyadi/keymap.c       | 110 +++++++++++++++++-
 2 files changed, 110 insertions(+), 1 deletion(-)

diff --git a/keyboards/handwired/promethium/keymaps/priyadi/flash.sh b/keyboards/handwired/promethium/keymaps/priyadi/flash.sh
index fb81a54ee08..14a3b43789d 100755
--- a/keyboards/handwired/promethium/keymaps/priyadi/flash.sh
+++ b/keyboards/handwired/promethium/keymaps/priyadi/flash.sh
@@ -1,3 +1,4 @@
 #!/bin/sh
 
+sleep 10
 avrdude -p m32u4 -P /dev/ttyACM0 -c avr109 -U flash:w:../../../../../.build/handwired_promethium_priyadi.hex
diff --git a/keyboards/handwired/promethium/keymaps/priyadi/keymap.c b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
index 3d34e98229e..bf797a7491b 100644
--- a/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
+++ b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
@@ -11,6 +11,8 @@
 #include "process_unicode.h"
 #include "quantum.h"
 #include "rgbsps.h"
+#include "ps2_mouse.h"
+#include "ps2.h"
 #define COUNT(x) (sizeof (x) / sizeof (*(x)))
 
 // #define RGBLED_NUM 5
@@ -730,4 +732,110 @@ void shutdown_user()
     stop_all_notes();
 }
 
-#endif
\ No newline at end of file
+#endif
+
+
+void ps2_mouse_init_user() {
+    // set TrackPoint sensitivity
+    PS2_MOUSE_SEND(0xE2, "set trackpoint sensitivity: 0xE2");
+    PS2_MOUSE_SEND(0x81, "set trackpoint sensitivity: 0x81");
+    PS2_MOUSE_SEND(0x4A, "set trackpoint sensitivity: 0x4A");
+    PS2_MOUSE_SEND(0x60, "set trackpoint sensitivity: 0x60");
+
+    // set TrackPoint speed
+    // (transfer function upper plateau speed)
+    PS2_MOUSE_SEND(0xE2, "set trackpoint speed: 0xE2");
+    PS2_MOUSE_SEND(0x81, "set trackpoint speed: 0x81");
+    PS2_MOUSE_SEND(0x60, "set trackpoint speed: 0x60");
+    PS2_MOUSE_SEND(0x90, "set trackpoint speed: 0x90");
+
+    // set TrackPoint Negative Inertia factor
+    PS2_MOUSE_SEND(0xE2, "set negative inertia factor: 0xE2");
+    PS2_MOUSE_SEND(0x81, "set negative inertia factor: 0x81");
+    PS2_MOUSE_SEND(0x4D, "set negative inertia factor: 0x4D");
+    PS2_MOUSE_SEND(0x03, "set negative inertia factor: 0x03");
+
+    // disable up threshold (click)
+    PS2_MOUSE_SEND(0xE2, "set disable up threshold: 0xE2");
+    PS2_MOUSE_SEND(0x47, "set disable up threshold: 0x47");
+    PS2_MOUSE_SEND(0x2C, "set disable up threshold: 0x2C");
+    PS2_MOUSE_SEND(0x01, "set disable up threshold: 0x01");
+
+    // enable TrackPoint Press to Select (PtS)
+    // print("ps2_mouse_init: send 0xE2: ");
+    // rcv = ps2_host_send(0xE2);
+    // phex(rcv); phex(ps2_error); print("\n");
+    // print("ps2_mouse_init: send 0x47: ");
+    // rcv = ps2_host_send(0x47);
+    // phex(rcv); phex(ps2_error); print("\n");
+    // print("ps2_mouse_init: send 0x2C: ");
+    // rcv = ps2_host_send(0x2C);
+    // phex(rcv); phex(ps2_error); print("\n");
+    // print("ps2_mouse_init: send 0x00: ");
+    // rcv = ps2_host_send(0x00);
+    // phex(rcv); phex(ps2_error); print("\n");
+
+    // set TrackPoint Press to Select threshold
+    // print("ps2_mouse_init: send 0xE2: ");
+    // rcv = ps2_host_send(0xE2);
+    // phex(rcv); phex(ps2_error); print("\n");
+    // print("ps2_mouse_init: send 0x81: ");
+    // rcv = ps2_host_send(0x81);
+    // phex(rcv); phex(ps2_error); print("\n");
+    // print("ps2_mouse_init: send 0x5C: ");
+    // rcv = ps2_host_send(0x5C);
+    // phex(rcv); phex(ps2_error); print("\n");
+    // // default PtS threshold is 0x08
+    // print("ps2_mouse_init: send 0x04: ");
+    // rcv = ps2_host_send(0x04);
+    // phex(rcv); phex(ps2_error); print("\n");
+
+    // set TrackPoint Press to Select time constant (zTc)
+    // print("ps2_mouse_init: send 0xE2: ");
+    // rcv = ps2_host_send(0xE2);
+    // phex(rcv); phex(ps2_error); print("\n");
+    // print("ps2_mouse_init: send 0x81: ");
+    // rcv = ps2_host_send(0x81);
+    // phex(rcv); phex(ps2_error); print("\n");
+    // print("ps2_mouse_init: send 0x5E: ");
+    // rcv = ps2_host_send(0x5E);
+    // phex(rcv); phex(ps2_error); print("\n");
+    // // default zTc is 0x26
+    // print("ps2_mouse_init: send 0x45: ");
+    // rcv = ps2_host_send(0x45);
+    // phex(rcv); phex(ps2_error); print("\n");
+
+    /*
+    // set TrackPoint Press to Select Jenks Curvature (jkcur)
+    print("ps2_mouse_init: send 0xE2: ");
+    rcv = ps2_host_send(0xE2);
+    phex(rcv); phex(ps2_error); print("\n");
+    print("ps2_mouse_init: send 0x81: ");
+    rcv = ps2_host_send(0x81);
+    phex(rcv); phex(ps2_error); print("\n");
+    print("ps2_mouse_init: send 0x5D: ");
+    rcv = ps2_host_send(0x5D);
+    phex(rcv); phex(ps2_error); print("\n");
+    // default jkcur is 0x87
+    print("ps2_mouse_init: send 0x87: ");
+    rcv = ps2_host_send(0x87);
+    phex(rcv); phex(ps2_error); print("\n");
+    */
+
+    /*
+    // set TrackPoint Minimum Drag (mindrag)
+    print("ps2_mouse_init: send 0xE2: ");
+    rcv = ps2_host_send(0xE2);
+    phex(rcv); phex(ps2_error); print("\n");
+    print("ps2_mouse_init: send 0x81: ");
+    rcv = ps2_host_send(0x81);
+    phex(rcv); phex(ps2_error); print("\n");
+    print("ps2_mouse_init: send 0x59: ");
+    rcv = ps2_host_send(0x59);
+    phex(rcv); phex(ps2_error); print("\n");
+    // default PtS mindrag is 0x14
+    print("ps2_mouse_init: send 0x14: ");
+    rcv = ps2_host_send(0x14);
+    phex(rcv); phex(ps2_error); print("\n");
+    */
+}
\ No newline at end of file

From d059624bfb32e268ff0972609d7eadbb212fa2d2 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Mon, 5 Dec 2016 01:07:12 +0700
Subject: [PATCH 138/147] Implemented weak ps2_mouse_init_user()

There are a lot of PS/2 commands, some are vendor/device specific, so we
provide a weak ps2_mouse_init_user() to be implemented in each keyboard
that need it.
---
 tmk_core/protocol/ps2_mouse.c | 54 +++++------------------------------
 tmk_core/protocol/ps2_mouse.h | 49 +++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 47 deletions(-)

diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index af971dd4975..e3c6974440c 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/tmk_core/protocol/ps2_mouse.c
@@ -28,53 +28,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* ============================= MACROS ============================ */
 
-#define PS2_MOUSE_SEND(command, message) \
-do { \
-   uint8_t rcv = ps2_host_send(command); \
-   if (debug_mouse) { \
-        print((message)); \
-        xprintf(" command: %X, result: %X, error: %X \n", command, rcv, ps2_error); \
-    } \
-} while(0)
-
-#define PS2_MOUSE_SEND_SAFE(command, message) \
-do { \
-    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
-        ps2_mouse_disable_data_reporting(); \
-    } \
-    PS2_MOUSE_SEND(command, message); \
-    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
-        ps2_mouse_enable_data_reporting(); \
-    } \
-} while(0)
-
-#define PS2_MOUSE_SET_SAFE(command, value, message) \
-do { \
-    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
-        ps2_mouse_disable_data_reporting(); \
-    } \
-    PS2_MOUSE_SEND(command, message); \
-    PS2_MOUSE_SEND(value, "Sending value"); \
-    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
-        ps2_mouse_enable_data_reporting(); \
-    } \
-} while(0)
-
-#define PS2_MOUSE_RECEIVE(message) \
-do { \
-   uint8_t rcv = ps2_host_recv_response(); \
-   if (debug_mouse) { \
-        print((message)); \
-        xprintf(" result: %X, error: %X \n", rcv, ps2_error); \
-    } \
-} while(0)
-
-static enum ps2_mouse_mode_e {
-    PS2_MOUSE_STREAM_MODE,
-    PS2_MOUSE_REMOTE_MODE,
-} ps2_mouse_mode = PS2_MOUSE_STREAM_MODE;
-
-static report_mouse_t mouse_report = {};
+static report_mouse_t mouse_report = {};./
 
 static inline void ps2_mouse_print_report(report_mouse_t *mouse_report);
 static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report);
@@ -108,6 +62,12 @@ void ps2_mouse_init(void) {
 #ifdef PS2_MOUSE_USE_2_1_SCALING
     ps2_mouse_set_scaling_2_1();
 #endif
+
+    ps2_mouse_init_user();
+}
+
+__attribute__((weak))
+void ps2_mouse_init_user(void) {
 }
 
 void ps2_mouse_task(void) {
diff --git a/tmk_core/protocol/ps2_mouse.h b/tmk_core/protocol/ps2_mouse.h
index e11c705fc65..3c93a463429 100644
--- a/tmk_core/protocol/ps2_mouse.h
+++ b/tmk_core/protocol/ps2_mouse.h
@@ -19,6 +19,53 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define  PS2_MOUSE_H
 
 #include <stdbool.h>
+#include "debug.h"
+
+#define PS2_MOUSE_SEND(command, message) \
+do { \
+   uint8_t rcv = ps2_host_send(command); \
+   if (debug_mouse) { \
+        print((message)); \
+        xprintf(" command: %X, result: %X, error: %X \n", command, rcv, ps2_error); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_SEND_SAFE(command, message) \
+do { \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_disable_data_reporting(); \
+    } \
+    PS2_MOUSE_SEND(command, message); \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_enable_data_reporting(); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_SET_SAFE(command, value, message) \
+do { \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_disable_data_reporting(); \
+    } \
+    PS2_MOUSE_SEND(command, message); \
+    PS2_MOUSE_SEND(value, "Sending value"); \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_enable_data_reporting(); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_RECEIVE(message) \
+do { \
+   uint8_t rcv = ps2_host_recv_response(); \
+   if (debug_mouse) { \
+        print((message)); \
+        xprintf(" result: %X, error: %X \n", rcv, ps2_error); \
+    } \
+} while(0)
+
+static enum ps2_mouse_mode_e {
+    PS2_MOUSE_STREAM_MODE,
+    PS2_MOUSE_REMOTE_MODE,
+} ps2_mouse_mode = PS2_MOUSE_STREAM_MODE;
 
 /*
  * Data format:
@@ -107,6 +154,8 @@ typedef enum ps2_mouse_sample_rate_e {
 
 void ps2_mouse_init(void);
 
+void ps2_mouse_init_user(void);
+
 void ps2_mouse_task(void);
 
 void ps2_mouse_disable_data_reporting(void);

From 07d29b7d29ce13a22f50270ab54d39f80103cc44 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Mon, 5 Dec 2016 01:22:40 +0700
Subject: [PATCH 139/147] syntax error fix

---
 tmk_core/protocol/ps2_mouse.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index e3c6974440c..d9ccbecb43a 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/tmk_core/protocol/ps2_mouse.c
@@ -28,7 +28,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* ============================= MACROS ============================ */
 
-static report_mouse_t mouse_report = {};./
+static report_mouse_t mouse_report = {};
 
 static inline void ps2_mouse_print_report(report_mouse_t *mouse_report);
 static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report);

From 236c0408596e525c949abc5a3b3ef8b853c28504 Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Mon, 5 Dec 2016 01:22:40 +0700
Subject: [PATCH 140/147] syntax error fix

---
 tmk_core/protocol/ps2_mouse.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index e3c6974440c..d9ccbecb43a 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/tmk_core/protocol/ps2_mouse.c
@@ -28,7 +28,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* ============================= MACROS ============================ */
 
-static report_mouse_t mouse_report = {};./
+static report_mouse_t mouse_report = {};
 
 static inline void ps2_mouse_print_report(report_mouse_t *mouse_report);
 static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report);

From c7d11fd001cac4f0baeecdda79b7743e3695c77f Mon Sep 17 00:00:00 2001
From: Priyadi Iman Nurcahyo <priyadi@priyadi.net>
Date: Mon, 5 Dec 2016 02:15:38 +0700
Subject: [PATCH 141/147] Remove unnecessary build options

---
 keyboards/handwired/promethium/keymaps/priyadi/Makefile | 7 ++++---
 keyboards/handwired/promethium/rules.mk                 | 2 +-
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/keyboards/handwired/promethium/keymaps/priyadi/Makefile b/keyboards/handwired/promethium/keymaps/priyadi/Makefile
index 2f6f27a7320..46fdfa01183 100644
--- a/keyboards/handwired/promethium/keymaps/priyadi/Makefile
+++ b/keyboards/handwired/promethium/keymaps/priyadi/Makefile
@@ -4,16 +4,17 @@
 #   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)
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = no        # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no         # Console for debug(+400)
-COMMAND_ENABLE = yes        # Commands for debug and configuration
+COMMAND_ENABLE = no         # Commands for debug and configuration
 NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 BACKLIGHT_ENABLE = 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
diff --git a/keyboards/handwired/promethium/rules.mk b/keyboards/handwired/promethium/rules.mk
index 0842780cce2..891f523c22a 100644
--- a/keyboards/handwired/promethium/rules.mk
+++ b/keyboards/handwired/promethium/rules.mk
@@ -61,7 +61,7 @@ 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
+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

From 7e4341e437c2f0d8d4257b616b1d8d30a8cab4ed Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Sun, 4 Dec 2016 23:01:07 -0500
Subject: [PATCH 142/147] Update rules.mk

---
 keyboards/planck/rules.mk | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/keyboards/planck/rules.mk b/keyboards/planck/rules.mk
index 4874d92b9fd..fb24e823540 100644
--- a/keyboards/planck/rules.mk
+++ b/keyboards/planck/rules.mk
@@ -62,8 +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 = no
-RAW_ENABLE = yes
+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
+SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend

From b66845ca7f737fe793268d512e0b45d59b5677f9 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Sun, 4 Dec 2016 23:10:44 -0500
Subject: [PATCH 143/147] Update rules.mk


From 1eec2b7277ed24a63c42ea6b53a4db530c35dbbd Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Sun, 4 Dec 2016 23:11:22 -0500
Subject: [PATCH 144/147] Update planck.c

---
 keyboards/planck/planck.c | 14 --------------
 1 file changed, 14 deletions(-)

diff --git a/keyboards/planck/planck.c b/keyboards/planck/planck.c
index 0d37b662236..3980b02f503 100644
--- a/keyboards/planck/planck.c
+++ b/keyboards/planck/planck.c
@@ -1,8 +1,5 @@
 #include "planck.h"
 
-#include "raw_hid.h"
-#include "keymap.h"
-
 #ifdef ONEHAND_ENABLE
 __attribute__ ((weak))
 const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
@@ -20,14 +17,3 @@ void matrix_init_kb(void) {
 
 	matrix_init_user();
 }
-
-#ifdef RAW_ENABLE
-
-void raw_hid_receive( uint8_t *data, uint8_t length )
-{
-	// Basic test of Raw HID
-	// Echo back data received
-	raw_hid_send( data, length );
-}
-
-#endif

From a05b6a72d9da9fa6056046c9f600957f43b3c8df Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Mon, 5 Dec 2016 20:34:24 -0500
Subject: [PATCH 145/147] Adjusts config for better mousekey support

---
 keyboards/ergodox/config.h | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/keyboards/ergodox/config.h b/keyboards/ergodox/config.h
index edc60caae12..994a8c64333 100644
--- a/keyboards/ergodox/config.h
+++ b/keyboards/ergodox/config.h
@@ -1,10 +1,11 @@
 #ifndef KEYBOARDS_ERGODOX_CONFIG_H_
 #define KEYBOARDS_ERGODOX_CONFIG_H_
 
-#define MOUSEKEY_DELAY          100
 #define MOUSEKEY_INTERVAL       20
-#define MOUSEKEY_MAX_SPEED      3
-#define MOUSEKEY_TIME_TO_MAX    10
+#define MOUSEKEY_DELAY          0
+#define MOUSEKEY_TIME_TO_MAX    5
+#define MOUSEKEY_MAX_SPEED      2
+#define MOUSEKEY_WHEEL_DELAY 0
 
 #define TAPPING_TOGGLE  1
 

From 82922a4937dc9683a2364f750a67b80b63767ab5 Mon Sep 17 00:00:00 2001
From: Erez Zukerman <ezukerman@godaddy.com>
Date: Mon, 5 Dec 2016 20:35:03 -0500
Subject: [PATCH 146/147] A new default layout that supports Shine

---
 keyboards/ergodox/keymaps/default/keymap.c    | 84 +++++++++++++------
 .../keymaps/erez_experimental/keymap.c        |  2 +-
 2 files changed, 59 insertions(+), 27 deletions(-)

diff --git a/keyboards/ergodox/keymaps/default/keymap.c b/keyboards/ergodox/keymaps/default/keymap.c
index 2f399bd1815..4eff2808502 100644
--- a/keyboards/ergodox/keymaps/default/keymap.c
+++ b/keyboards/ergodox/keymaps/default/keymap.c
@@ -7,7 +7,12 @@
 #define SYMB 1 // symbols
 #define MDIA 2 // media keys
 
-#define EPRM M(1) // Macro 1: Reset EEPROM
+enum custom_keycodes {
+  PLACEHOLDER = SAFE_RANGE, // can always be here
+  EPRM,
+  VRSN,
+  RGB_SLD
+};
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 0: Basic layer
@@ -17,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
  * | Del    |   Q  |   W  |   E  |   R  |   T  |  L1  |           |  L1  |   Y  |   U  |   I  |   O  |   P  |   \    |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * | BkSp   |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |; / L2|' / Cmd |
+ * | BkSp   |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |J/Alt |   K  |   L  |; / L2|' / Cmd |
  * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
  * | LShift |Z/Ctrl|   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |//Ctrl| RShift |
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
@@ -44,56 +49,56 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                                               KC_HOME,
                                                KC_SPC,KC_BSPC,KC_END,
         // right hand
-             KC_RGHT,     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
-             TG(SYMB),    KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
-                          KC_H,   KC_J,   KC_K,   KC_L,   LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
-             MEH_T(KC_NO),KC_N,   KC_M,   KC_COMM,KC_DOT, CTL_T(KC_SLSH),   KC_RSFT,
-                                  KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_FN1,
+             KC_RGHT,     KC_6,   KC_7,        KC_8,   KC_9,   KC_0,             KC_MINS,
+             TG(SYMB),    KC_Y,   KC_U,        KC_I,   KC_O,   KC_P,             KC_BSLS,
+                          KC_H,   ALT_T(KC_J), KC_K,   KC_L,   LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
+             MEH_T(KC_NO),KC_N,   KC_M,        KC_COMM,KC_DOT, CTL_T(KC_SLSH),   KC_RSFT,
+                                  KC_UP,       KC_DOWN,KC_LBRC,KC_RBRC,          KC_FN1,
              KC_LALT,        CTL_T(KC_ESC),
              KC_PGUP,
              KC_PGDN,KC_TAB, KC_ENT
     ),
 /* Keymap 1: Symbol Layer
  *
- * ,--------------------------------------------------.           ,--------------------------------------------------.
- * |Version |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
- * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * |        |   !  |   @  |   {  |   }  |   |  |      |           |      |   Up |   7  |   8  |   9  |   *  |   F12  |
- * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |   4  |   5  |   6  |   +  |        |
- * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   \  |        |
- * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
- *   | EPRM |      |      |      |      |                                       |      |    . |   0  |   =  |      |
- *   `----------------------------------'                                       `----------------------------------'
+ * ,---------------------------------------------------.           ,--------------------------------------------------.
+ * |Version  |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
+ * |---------+------+------+------+------+------+------|           |------+------+------+------+------+------+--------|
+ * |         |   !  |   @  |   {  |   }  |   |  |      |           |      |   Up |   7  |   8  |   9  |   *  |   F12  |
+ * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |         |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |   4  |   5  |   6  |   +  |        |
+ * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |         |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   \  |        |
+ * `---------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   | EPRM  |      |      |      |      |                                       |      |    . |   0  |   =  |      |
+ *   `-----------------------------------'                                       `----------------------------------'
  *                                        ,-------------.       ,-------------.
- *                                        |      |      |       |      |      |
+ *                                        |Animat|      |       |Toggle|Solid |
  *                                 ,------|------|------|       |------+------+------.
- *                                 |      |      |      |       |      |      |      |
- *                                 |      |      |------|       |------|      |      |
+ *                                 |Bright|Bright|      |       |      |Hue-  |Hue+  |
+ *                                 |ness- |ness+ |------|       |------|      |      |
  *                                 |      |      |      |       |      |      |      |
  *                                 `--------------------'       `--------------------'
  */
 // SYMBOLS
 [SYMB] = KEYMAP(
        // left hand
-       M(0),   KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
+       VRSN,   KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
        KC_TRNS,KC_EXLM,KC_AT,  KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
        KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
        KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
           EPRM,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
-                                       KC_TRNS,KC_TRNS,
+                                       RGB_MOD,KC_TRNS,
                                                KC_TRNS,
-                               KC_TRNS,KC_TRNS,KC_TRNS,
+                               RGB_VAD,RGB_VAI,KC_TRNS,
        // right hand
        KC_TRNS, KC_F6,   KC_F7,  KC_F8,   KC_F9,   KC_F10,  KC_F11,
        KC_TRNS, KC_UP,   KC_7,   KC_8,    KC_9,    KC_ASTR, KC_F12,
                 KC_DOWN, KC_4,   KC_5,    KC_6,    KC_PLUS, KC_TRNS,
        KC_TRNS, KC_AMPR, KC_1,   KC_2,    KC_3,    KC_BSLS, KC_TRNS,
                          KC_TRNS,KC_DOT,  KC_0,    KC_EQL,  KC_TRNS,
-       KC_TRNS, KC_TRNS,
+       RGB_TOG, RGB_SLD,
        KC_TRNS,
-       KC_TRNS, KC_TRNS, KC_TRNS
+       KC_TRNS, RGB_HUD, RGB_HUI
 ),
 /* Keymap 2: Media and mouse keys
  *
@@ -160,6 +165,33 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
     return MACRO_NONE;
 };
 
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    // dynamically generate these.
+    case EPRM:
+      if (record->event.pressed) {
+        eeconfig_init();
+      }
+      return false;
+      break;
+    case VRSN:
+      if (record->event.pressed) {
+        SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+      }
+      return false;
+      break;
+    case RGB_SLD:
+      if (record->event.pressed) {
+        #ifdef RGBLIGHT_ENABLE
+          rgblight_mode(1);
+        #endif
+      }
+      return false;
+      break;
+  }
+  return true;
+}
+
 // Runs just one time when the keyboard initializes.
 void matrix_init_user(void) {
 
diff --git a/keyboards/ergodox/keymaps/erez_experimental/keymap.c b/keyboards/ergodox/keymaps/erez_experimental/keymap.c
index 2963c40e319..13b8240ce82 100644
--- a/keyboards/ergodox/keymaps/erez_experimental/keymap.c
+++ b/keyboards/ergodox/keymaps/erez_experimental/keymap.c
@@ -73,7 +73,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  *                                        ,-------------.       ,-------------.
  *                                        |      |      |       |TOG   |
  *                                 ,------|------|------|       |------+------+------.
- *                                 |VAI   |VAD   |HUI   |       |SAI   |TOG   |MOD   |
+ *                                 |VAI   |VAD   |HUI   |       |SAI   |      |MOD   |
  *                                 |      |      |------|       |------|      |      |
  *                                 |      |      |HUD   |       |SAD   |      |      |
  *                                 `--------------------'       `--------------------'

From 985a091a739c99736d5b17de5161831488dbc219 Mon Sep 17 00:00:00 2001
From: Jack Humbert <jack.humb@gmail.com>
Date: Tue, 6 Dec 2016 09:49:05 -0500
Subject: [PATCH 147/147] Update readme.md

---
 readme.md | 1562 +----------------------------------------------------
 1 file changed, 2 insertions(+), 1560 deletions(-)

diff --git a/readme.md b/readme.md
index b618334dc33..90584cabcb8 100644
--- a/readme.md
+++ b/readme.md
@@ -4,7 +4,7 @@
 
 This is a keyboard firmware based on the [tmk_keyboard firmware](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.com), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/).
 
-## Official website
+## Official website (currently under construction with the move to the wiki)
 
 For an easy-to-read version of this document and the repository, check out [http://qmk.fm](http://qmk.fm). Nicely formatted keyboard and keymap listings are also available there, along with the ability to download .hex files instead of having to setup a build environment and compile them.
 
@@ -31,1567 +31,9 @@ The OLKB product firmwares are maintained by [Jack Humbert](https://github.com/j
 
 This is not a tiny project. While this is the main readme, there are many other files you might want to consult. Here are some points of interest:
 
+* [**The Wiki**](https://github.com/jackhumbert/qmk_firmware/wiki) - the entirity of the readme has been moved here
 * The readme for your own keyboard: This is found under `keyboards/<your keyboards's name>/`. So for the ErgoDox EZ, it's [here](keyboards/ergodox/ez/); for the Planck, it's [here](keyboards/planck/) and so on.
 * The list of possible keycodes you can use in your keymap is actually spread out in a few different places:
   * [doc/keycode.txt](doc/keycode.txt) - an explanation of those same keycodes.
   * [quantum/keymap.h](quantum/keymap.h) - this is where the QMK-specific aliases are all set up. Things like the Hyper and Meh key, the Leader key, and all of the other QMK innovations. These are also explained and documented below, but `keymap.h` is where they're actually defined.
 * The [TMK documentation](doc/TMK_README.md). QMK is based on TMK, and this explains how it works internally.
-
-# Getting started
-
-Before you are able to compile, you'll need to install an environment for AVR development. You'll find the instructions for any OS below. If you find another/better way to set things up from scratch, please consider [making a pull request](https://github.com/jackhumbert/qmk_firmware/pulls) with your changes!
-
-## Build Environment Setup
-
-### Windows 10
-
-Due to some issues with the "Windows (Vista and later)" instructions below, we now recommend following these instructions if you use Windows, which will allow you to use the Windows Subsystem for Linux to compile the firmware. If you are not using Windows 10 with the Anniversary Update installed (which came out in July 2016), you will need to use one of the other methods, such as Docker, Vagrant, or the instructions for Vista and later. 
-
-If you use this method, you will need to use a standalone tool to flash the firmware to the keyboard after you compile it. We recommend the official [QMK Firmware Flasher](https://github.com/jackhumbert/qmk_firmware_flasher/releases). This is because the Windows 10 Subsystem for Linux lacks [libUSB support](https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/13355724-unable-to-access-usb-devices-from-bash), so it can't access the keyboard's microcontroller. Please add your vote for Microsoft to fix this issue using the link!
-
-Here are the steps
-
-1. Install the Windows 10 subsystem for Linux, following [these instructions](http://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/).
-2. If you have  cloned the repository using git before August 20, 2016, clean up the line endings from wherever you currently access git:
-   1. Make sure that you have no changes you haven't committed by running `git status`. ANY UNCOMMITTED CHANGES WILL BE PERMANENTLY LOST.
-   2. Run `git rm --cached -r .`
-   3. Run `git reset --hard`
-3. Open "Bash On Ubuntu On Windows" from the start menu
-4. With the bash window open, navigate to your copy of the [qmk_firmware repository](https://github.com/jackhumbert/qmk_firmware) using the `cd` command. The harddisks can be accessed from `/mnt/<driveletter>`. For example, your main hard drive (C:) can be accessed by executiing the command `cd /mnt/c`. If your username is John and the qmk_firmware folder is in your Downloads folder, you can move to it with the command `cd /mnt/c/Users/John/Downloads/qmk_firmware`. You can use the Tab key as you go to help you autocomplete the folder names.
-5. Run `sudo util/install_dependencies.sh`.
-6. After a while the installation will finish, and you are good to go
-
-**Note** From time to time, the dependencies might change, so just run `install_dependencies.sh` again if things are not working.
-
-**Warning:** If you edit Makefiles or shell scripts, make sure you are using an editor that saves the files with Unix line endings. Otherwise the compilation might not work.
-
-
-### Windows (Vista and later)
-1. If you have ever installed WinAVR, uninstall it.
-2. Install [MHV AVR Tools](https://infernoembedded.com/sites/default/files/project/MHV_AVR_Tools_20131101.exe). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**.
-3. If you are going to flash Infinity based keyboards you will need to install dfu-util, refer to the instructions by [Input Club](https://github.com/kiibohd/controller/wiki/Loading-DFU-Firmware).
-4. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location.
-5. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/jackhumbert/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer.
-6. Open the `\util` folder.
-7. Double-click on the `1-setup-path-win` batch script to run it. You'll need to accept a User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up.
-8. Right-click on the `2-setup-environment-win` batch script, select "Run as administrator", and accept the User Account Control prompt. This part may take a couple of minutes, and you'll need to approve a driver installation, but once it finishes, your environment is complete!
-
-If you have trouble and want to ask for help, it is useful to generate a *Win_Check_Output.txt* file by running `Win_Check.bat` in the `\util` folder.
-
-### Mac
-If you're using [homebrew,](http://brew.sh/) you can use the following commands:
-
-    brew tap osx-cross/avr
-    brew install avr-libc
-    brew install dfu-programmer
-
-This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line.
-
-You can also try these instructions:
-
-1. Install Xcode from the App Store.
-2. Install the Command Line Tools from `Xcode->Preferences->Downloads`.
-3. Install [DFU-Programmer][dfu-prog].
-
-If you are going to flash Infinity based keyboards you will also need dfu-util
-
-    brew install dfu-util
-
-### Linux
-
-To ensure you are always up to date, you can just run `sudo util/install_dependencies.sh`. That should always install all the dependencies needed.
-
-You can also install things manually, but this documentation might not be always up to date with all requirements.
-
-The current requirements are the following, but not all might be needed depending on what you do. Also note that some systems might not have all the dependencies available as packages, or they might be named differently.
-
-```
-build-essential
-gcc
-unzip
-wget
-zip
-gcc-avr
-binutils-avr
-avr-libc
-dfu-programmer
-dfu-util
-gcc-arm-none-eabi
-binutils-arm-none-eabi
-libnewlib-arm-none-eabi
-git
-```
-
-Install the dependencies with your favorite package manager.
-
-Debian/Ubuntu example:
-
-    sudo apt-get update
-    sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi
-
-### Docker
-
-If this is a bit complex for you, Docker might be the turn-key solution you need. After installing [Docker](https://www.docker.com/products/docker), run the following command at the root of the QMK folder to build a keyboard/keymap:
-
-```bash
-# You'll run this every time you want to build a keymap
-# modify the keymap and keyboard assigment to compile what you want
-# defaults are ergodox/default
-
-docker run -e keymap=gwen -e keyboard=ergodox --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware
-
-# On windows docker seems to have issue with VOLUME tag in Dockerfile, and $('pwd') won't print a windows compliant path, use full path instead like this
-docker run -e keymap=default -e keyboard=ergobop --rm -v D:/Users/Sacapuces/Documents/Repositories/qmk:/qmk:rw edasque/qmk_firmware
-
-```
-
-This will compile the targetted keyboard/keymap and leave it in your QMK directory for you to flash.
-
-### Vagrant
-If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [VAGRANT_GUIDE file](doc/VAGRANT_GUIDE.md).
-
-## Verify Your Installation
-1. If you haven't already, obtain this repository ([https://github.com/jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware)). You can either download it as a zip file and extract it, or clone it using the command line tool git or the Github Desktop application.
-2. Open up a terminal or command prompt and navigate to the `qmk_firmware` folder using the `cd` command. The command prompt will typically open to your home directory. If, for example, you cloned the repository to your Documents folder, then you would type `cd Documents/qmk_firmware`. If you extracted the file from a zip, then it may be named `qmk_firmware-master` instead.
-3. To confirm that you're in the correct location, you can display the contents of your current folder using the `dir` command on Windows, or the `ls` command on Linux or Mac. You should see several files, including `readme.md` and a `quantum` folder. From here, you need to navigate to the appropriate folder under `keyboards/`. For example, if you're building for a Planck, run `cd keyboards/planck`.
-4. Once you're in the correct keyboard-specific folder, run the `make` command. This should output a lot of information about the build process. More information about the `make` command can be found below.
-
-# Customizing your keymap
-
-In every keymap folder, the following files are recommended:
-
-* `config.h` - the options to configure your keymap
-* `keymap.c` - all of your keymap code, required
-* `Makefile` - the features of QMK that are enabled, required to run `make` in your keymap folder
-* `readme.md` - a description of your keymap, how others might use it, and explanations of features
-
-## The `make` command
-
-The `make` command is how you compile the firmware into a .hex file, which can be loaded by a dfu programmer (like dfu-progammer via `make dfu`) or the [Teensy loader](https://www.pjrc.com/teensy/loader.html) (only used with Teensys).
-
-**NOTE:** To abort a make command press `Ctrl-c`
-
-The following instruction refers to these folders.
-
-* The `root` (`/`) folder is the qmk_firmware folder, in which are `doc`, `keyboard`, `quantum`, etc.
-* The `keyboard` folder is any keyboard project's folder, like `/keyboards/planck`.
-* The `keymap` folder is any keymap's folder, like `/keyboards/planck/keymaps/default`.
-* The `subproject` folder is the subproject folder of a keyboard, like `/keyboards/ergodox/ez`
-
-### Simple instructions for building and uploading a keyboard
-
-**Most keyboards have more specific instructions in the keyboard specific readme.md file, so please check that first**
-
-If the `keymap` folder contains a file name `Makefile`
-
-1. Change the directory to the `keymap` folder
-2. Run `make <subproject>-<programmer>`
-
-Otherwise, if there's no `Makefile` in the `keymap` folder
-
-1. Enter the `keyboard` folder
-2. Run `make <subproject>-<keymap>-<programmer>`
-
-In the above commands, replace:
-
-* `<keymap>` with the name of your keymap
-* `<subproject>` with the name of the subproject (revision or sub-model of your keyboard). For example, for Ergodox it can be `ez` or `infinity`, and for Planck `rev3` or `rev4`.
-  * If the keyboard doesn't have a subproject, or if you are happy with the default (defined in `rules.mk` file of the `keyboard` folder), you can leave it out. But remember to also remove the dash (`-`) from the command.
-* `<programmer>` The programmer to use. Most keyboards use `dfu`, but some use `teensy`. Infinity keyboards use `dfu-util`. Check the readme file in the keyboard folder to find out which programmer to use.
-  * If you  don't add `-<programmer` to the command line, the firmware will be still be compiled into a hex file, but the upload will be skipped.
-
-**NOTE:** Some operating systems will refuse to program unless you run the make command as root for example `sudo make dfu`
-
-### More detailed make instruction
-
-The full syntax of the `make` command is the following, but parts of the command can be left out if you run it from other directories than the `root` (as you might already have noticed by reading the simple instructions).
-
-`<keyboard>-<subproject>-<keymap>-<target>`, where:
-
-* `<keyboard>` is the name of the keyboard, for example `planck`
-  * Use `allkb` to compile all keyboards
-* `<subproject>` is the name of the subproject (revision or sub-model of the keyboard). For example, for Ergodox it can be `ez` or `infinity`, and for Planck `rev3` or `rev4`.
-  * If the keyboard doesn't have any subprojects, it can be left out
-  * To compile the default subproject, you can leave it out, or specify `defaultsp`
-  * Use `allsp` to compile all subprojects
-* `<keymap>` is the name of the keymap, for example `algernon`
-  * Use `allkm` to compile all keymaps
-* `<target>` will be explained in more detail below.
-
-**Note:** When you leave some parts of the command out, you should also remove the dash (`-`).
-
-As mentioned above, there are some shortcuts, when you are in a:
-
-* `keyboard` folder, the command will automatically fill the `<keyboard>` part. So you only need to type `<subproject>-<keymap>-<target>`
-* `subproject` folder, it will fill in both `<keyboard>` and `<subproject>`
-* `keymap` folder, then `<keyboard>` and `<keymap>` will be filled in. If you need to specify the `<subproject>` use the following syntax `<subproject>-<target>`
-  * Note in order to support this shortcut, the keymap needs its own Makefile (see the example [here](/doc/keymap_makefile_example.mk))
-* `keymap` folder of a `subproject`, then everything except the `<target>` will be filled in
-
-The `<target>` means the following
-* If no target is given, then it's the same as `all` below
-* `all` compiles the keyboard and generates a `<keyboard>_<keymap>.hex` file in whichever folder you run `make` from. These files are ignored by git, so don't worry about deleting them when committing/creating pull requests.
-* `dfu`, `teensy` or `dfu-util`, compile and upload the firmware to the keyboard. If the compilation fails, then nothing will be uploaded. The programmer to use depends on the keyboard. For most keyboards it's `dfu`, but for Infinity keyboards you should use `dfu-util`, and `teensy` for standard Teensys. To find out which command you should use for your keyboard, check the keyboard specific readme. **Note** that some operating systems needs root access for these commands to work, so in that case you need to run for example `sudo make dfu`.
-* `clean`, cleans the build output folders to make sure that everything is built from scratch. Run this before normal compilation if you have some unexplainable problems.
-
-Some other targets are supported but, but not important enough to be documented here. Check the source code of the make files for more information.
-
-You can also add extra options at the end of the make command line, after the target
-
-* `make COLOR=false` - turns off color output
-* `make SILENT=true` - turns off output besides errors/warnings
-* `make VERBOSE=true` - outputs all of the gcc stuff (not interesting, unless you need to debug)
-* `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.
-
-Here are some examples commands
-
-* `make allkb-allsp-allkm` builds everything (all keyboards, all subprojects, all keymaps). Running just `make` from the `root` will also run this.
-* `make` from within a `keyboard` directory, is the same as `make keyboard-allsp-allkm`, which compiles all subprojects and keymaps of the keyboard. **NOTE** that this behaviour has changed. Previously it compiled just the default keymap.
-* `make ergodox-infinity-algernon-clean` will clean the build output of the Ergodox Infinity keyboard. This example uses the full syntax and can be run from any folder with a `Makefile`
-* `make dfu COLOR=false` from within a keymap folder, builds and uploads the keymap, but without color output.
-
-## The `Makefile`
-
-There are 5 different `make` and `Makefile` locations:
-
-* root (`/`)
-* keyboard (`/keyboards/<keyboard>/`)
-* keymap (`/keyboards/<keyboard>/keymaps/<keymap>/`)
-* subproject (`/keyboards/<keyboard>/<subproject>`)
-* subproject keymap (`/keyboards/<keyboard>/<subproject>/keymaps/<keymap>`)
-
-The root contains the code used to automatically figure out which keymap or keymaps to compile based on your current directory and commandline arguments. It's considered stable, and shouldn't be modified. The keyboard one will contain the MCU set-up and default settings for your keyboard, and shouldn't be modified unless you are the producer of that keyboard. The keymap Makefile can be modified by users, and is optional. It is included automatically if it exists. You can see an example [here](/doc/keymap_makefile_example.mk) - the last few lines are the most important. The settings you set here will override any defaults set in the keyboard Makefile. **The file is required if you want to run `make` in the keymap folder.**
-
-For keyboards and subprojects, the make files are split in two parts `Makefile` and `rules.mk`. All settings can be found in the `rules.mk` file, while the `Makefile` is just there for support and including the root `Makefile`. Keymaps contain just one `Makefile` for simplicity.
-
-### Makefile options
-
-Set the variables to `no` to disable them, and `yes` to enable them.
-
-`BOOTMAGIC_ENABLE`
-
-This allows you to hold a key and the salt key (space by default) and have access to a various EEPROM settings that persist over power loss. It's advised you keep this disabled, as the settings are often changed by accident, and produce confusing results that makes it difficult to debug. It's one of the more common problems encountered in help sessions.
-
-`MOUSEKEY_ENABLE`
-
-This gives you control over cursor movements and clicks via keycodes/custom functions.
-
-`EXTRAKEY_ENABLE`
-
-This allows you to use the system and audio control key codes.
-
-`CONSOLE_ENABLE`
-
-This allows you to print messages that can be read using [`hid_listen`](https://www.pjrc.com/teensy/hid_listen.html). 
-
-By default, all debug (*dprint*) print (*print*, *xprintf*), and user print (*uprint*) messages will be enabled. This will eat up a significant portion of the flash and may make the keyboard .hex file too big to program. 
-
-To disable debug messages (*dprint*) and reduce the .hex file size, include `#define NO_DEBUG` in your `config.h` file.
-
-To disable print messages (*print*, *xprintf*) and user print messages (*uprint*) and reduce the .hex file size, include `#define NO_PRINT` in your `config.h` file.
-
-To disable print messages (*print*, *xprintf*) and **KEEP** user print messages (*uprint*), include `#define USER_PRINT` in your `config.h` file.
-
-To see the text, open `hid_listen` and enjoy looking at your printed messages.
-
-**NOTE:** Do not include *uprint* messages in anything other than your keymap code. It must not be used within the QMK system framework. Otherwise, you will bloat other people's .hex files. 
-
-`COMMAND_ENABLE`
-
-This enables magic commands, typically fired with the default magic key combo `LSHIFT+RSHIFT+KEY`. Magic commands include turning on debugging messages (`MAGIC+D`) or temporarily toggling NKRO (`MAGIC+N`).
-
-`SLEEP_LED_ENABLE`
-
-Enables your LED to breath while your computer is sleeping. Timer1 is being used here. This feature is largely unused and untested, and needs updating/abstracting.
-
-`NKRO_ENABLE`
-
-This allows the keyboard to tell the host OS that up to 248 keys are held down at once (default without NKRO is 6). NKRO is off by default, even if `NKRO_ENABLE` is set. NKRO can be forced by adding `#define FORCE_NKRO` to your config.h or by binding `MAGIC_TOGGLE_NKRO` to a key and then hitting the key.
-
-`BACKLIGHT_ENABLE`
-
-This enables your backlight on Timer1 and ports B5, B6, or B7 (for now). You can specify your port by putting this in your `config.h`:
-
-    #define BACKLIGHT_PIN B7
-
-`MIDI_ENABLE`
-
-This enables MIDI sending and receiving with your keyboard. To enter MIDI send mode, you can use the keycode `MI_ON`, and `MI_OFF` to turn it off. This is a largely untested feature, but more information can be found in the `quantum/quantum.c` file.
-
-`UNICODE_ENABLE`
-
-This allows you to send unicode symbols via `UC(<unicode>)` in your keymap. Only codes up to 0x7FFF are currently supported.
-
-`UNICODEMAP_ENABLE`
-
-This allows sending unicode symbols using `X(<unicode>)` in your keymap. Codes
-up to 0xFFFFFFFF are supported, including emojis. You will need to maintain
-a separate mapping table in your keymap file.
-
-Known limitations:
-- Under Mac OS, only codes up to 0xFFFF are supported.
-- Under Linux ibus, only codes up to 0xFFFFF are supported (but anything important is still under this limit for now).
-
-Characters out of range supported by the OS will be ignored.
-
-`BLUETOOTH_ENABLE`
-
-This allows you to interface with a Bluefruit EZ-key to send keycodes wirelessly. It uses the D2 and D3 pins.
-
-`AUDIO_ENABLE`
-
-This allows you output audio on the C6 pin (needs abstracting). See the [audio section](#driving-a-speaker---audio-support) for more information.
-
-`VARIABLE_TRACE`
-
-Use this to debug changes to variable values, see the [tracing variables](#tracing-variables) section for more information.
-
-`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.
-
-So let's say your keyboard's makefile has `BACKLIGHT_ENABLE = yes` (or maybe doesn't even list the `BACKLIGHT_ENABLE` option, which would cause it to be off). You want your particular keymap to not have the debug console, so you make a file called `Makefile` and specify `BACKLIGHT_ENABLE = no`.
-
-You can use the `doc/keymap_makefile_example.md` as a template/starting point.
-
-## The `config.h` file
-
-There are 2 `config.h` locations:
-
-* keyboard (`/keyboards/<keyboard>/`)
-* keymap (`/keyboards/<keyboard>/keymaps/<keymap>/`)
-
-The keyboard `config.h` is included only if the keymap one doesn't exist. The format to use for your custom one [is here](/doc/keymap_config_h_example.h). If you want to override a setting from the parent `config.h` file, you need to do this:
-
-```c
-#undef MY_SETTING
-#define MY_SETTING 4
-```
-
-For a value of `4` for this imaginary setting. So we `undef` it first, then `define` it.
-
-You can then override any settings, rather than having to copy and paste the whole thing.
-
-# Going beyond the keycodes
-
-Aside from the [basic keycodes](doc/keycode.txt), your keymap can include shortcuts to common operations.
-
-## Quick aliases to common actions
-
-Your keymap can include shortcuts to common operations (called "function actions" in tmk).
-
-These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk `ACTION_*` functions, please see the [TMK documentation](https://github.com/jackhumbert/qmk_firmware/blob/master/doc/keymap.md#2-action).
-
-Instead of using `FNx` when defining `ACTION_*` functions, you can use `F(x)` - the benefit here is being able to use more than 32 function actions (up to 4096), if you happen to need them.
-
-### Switching and toggling layers
-
-`MO(layer)` - momentary switch to *layer*. As soon as you let go of the key, the layer is deactivated and you pop back out to the previous layer. When you apply this to a key, that same key must be set as `KC_TRNS` on the destination layer. Otherwise, you won't make it back to the original layer when you release the key (and you'll get a keycode sent). You can only switch to layers *above* your current layer. If you're on layer 0 and you use `MO(1)`, that will switch to layer 1 just fine. But if you include `MO(3)` on layer 5, that won't do anything for you -- because layer 3 is lower than layer 5 on the stack.
-
-`OSL(layer)` - momentary switch to *layer*, as a one-shot operation. So if you have a key that's defined as `OSL(1)`, and you tap that key, then only the very next keystroke would come from layer 1. You would drop back to layer zero immediately after that one keystroke. That's handy if you have a layer full of custom shortcuts -- for example, a dedicated key for closing a window. So you tap your one-shot layer mod, then tap that magic 'close window' key, and keep typing like a boss. Layer 1 would remain active as long as you hold that key down, too (so you can use it like a momentary toggle-layer key with extra powers).
-
-`LT(layer, kc)` - momentary switch to *layer* when held, and *kc* when tapped. Like `MO()`, this only works upwards in the layer stack (`layer` must be higher than the current layer).
-
-`TG(layer)` - toggles a layer on or off. As with `MO()`, you should set this key as `KC_TRNS` in the destination layer so that tapping it again actually toggles back to the original layer. Only works upwards in the layer stack.
-
-`TO(layer)` - Goes to a layer. This code is special, because it lets you go either up or down the stack -- just goes directly to the layer you want. So while other codes only let you go _up_ the stack (from layer 0 to layer 3, for example), `TO(2)` is going to get you to layer 2, no matter where you activate it from -- even if you're currently on layer 5. This gets activated on keydown (as soon as the key is pressed).
-
-
-### Fun with modifier keys
-
-* `LSFT(kc)` - applies left Shift to *kc* (keycode) - `S(kc)` is an alias
-* `RSFT(kc)` - applies right Shift to *kc*
-* `LCTL(kc)` - applies left Control to *kc*
-* `RCTL(kc)` - applies right Control to *kc*
-* `LALT(kc)` - applies left Alt to *kc*
-* `RALT(kc)` - applies right Alt to *kc*
-* `LGUI(kc)` - applies left GUI (command/win) to *kc*
-* `RGUI(kc)` - applies right GUI (command/win) to *kc*
-* `HYPR(kc)` - applies Hyper (all modifiers) to *kc*
-* `MEH(kc)`  - applies Meh (all modifiers except Win/Cmd) to *kc*
-* `LCAG(kc)` - applies CtrlAltGui to *kc*
-
-You can also chain these, like this:
-
-    LALT(LCTL(KC_DEL)) -- this makes a key that sends Alt, Control, and Delete in a single keypress.
-
-The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols. Their long names are also available and documented in `/quantum/keymap_common.h`.
-
-    KC_TILD  ~
-    KC_EXLM  !
-    KC_AT    @
-    KC_HASH  #
-    KC_DLR   $
-    KC_PERC  %
-    KC_CIRC  ^
-    KC_AMPR  &
-    KC_ASTR  *
-    KC_LPRN  (
-    KC_RPRN  )
-    KC_UNDS  _
-    KC_PLUS  +
-    KC_DQUO  "
-    KC_LCBR  {
-    KC_RCBR  }
-    KC_LABK  <
-    KC_RABK  >
-    KC_PIPE  |
-    KC_COLN  :
-
-`OSM(mod)` - this is a "one shot" modifier. So let's say you have your left Shift key defined as `OSM(MOD_LSFT)`. Tap it, let go, and Shift is "on" -- but only for the next character you'll type. So to write "The", you don't need to hold down Shift -- you tap it, tap t, and move on with life. And if you hold down the left Shift key, it just works as a left Shift key, as you would expect (so you could type THE). There's also a magical, secret way to "lock" a modifier by tapping it multiple times. If you want to learn more about that, open an issue. :)
-
-`MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down.
-
-These are the values you can use for the `mod` in `MT()` and `OSM()` (right-hand modifiers are not available for `MT()`):
-
-  * MOD_LCTL
-  * MOD_LSFT
-  * MOD_LALT
-  * MOD_LGUI
-  * MOD_HYPR
-  * MOD_MEH
-
-These can also be combined like `MOD_LCTL | MOD_LSFT` e.g. `MT(MOD_LCTL | MOD_LSFT, KC_ESC)` which would activate Control and Shift when held, and send Escape when tapped.
-
-We've added shortcuts to make common modifier/tap (mod-tap) mappings more compact:
-
-  * `CTL_T(kc)` - is LCTL when held and *kc* when tapped
-  * `SFT_T(kc)` - is LSFT when held and *kc* when tapped
-  * `ALT_T(kc)` - is LALT when held and *kc* when tapped
-  * `GUI_T(kc)` - is LGUI when held and *kc* when tapped
-  * `ALL_T(kc)` - is Hyper (all mods) when held and *kc* when tapped. To read more about what you can do with a Hyper key, see [this blog post by Brett Terpstra](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)
-  * `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped
-  * `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift.
-
-## Space Cadet Shift: The future, built in
-
-Steve Losh [described](http://stevelosh.com/blog/2012/10/a-modern-space-cadet/) the Space Cadet Shift quite well. Essentially, you hit the left Shift on its own, and you get an opening parenthesis; hit the right Shift on its own, and you get the closing one. When hit with other keys, the Shift key keeps working as it always does. Yes, it's as cool as it sounds.
-
-To use it, use `KC_LSPO` (Left Shift, Parens Open) for your left Shift on your keymap, and `KC_RSPC` (Right Shift, Parens Close) for your right Shift.
-
-It's defaulted to work on US keyboards, but if your layout uses different keys for parenthesis, you can define those in your `config.h` like this:
-
-    #define LSPO_KEY KC_9
-    #define RSPC_KEY KC_0
-
-You can also choose between different rollover behaviors of the shift keys by defining:
-
-    #define DISABLE_SPACE_CADET_ROLLOVER
-
-in your `config.h`. Disabling rollover allows you to use the opposite shift key to cancel the space cadet state in the event of an erroneous press instead of emitting a pair of parentheses when the keys are released.
-
-The only other thing you're going to want to do is create a `Makefile` in your keymap directory and set the following:
-
-```
-COMMAND_ENABLE   = no  # Commands for debug and configuration
-```
-
-This is just to keep the keyboard from going into command mode when you hold both Shift keys at the same time.
-
-## The Leader key: A new kind of modifier
-
-If you've ever used Vim, you know what a Leader key is. If not, you're about to discover a wonderful concept. :) Instead of hitting Alt+Shift+W for example (holding down three keys at the same time), what if you could hit a _sequence_ of keys instead? So you'd hit our special modifier (the Leader key), followed by W and then C (just a rapid succession of keys), and something would happen.
-
-That's what `KC_LEAD` does. Here's an example:
-
-1. Pick a key on your keyboard you want to use as the Leader key. Assign it the keycode `KC_LEAD`. This key would be dedicated just for this -- it's a single action key, can't be used for anything else.
-2. Include the line `#define LEADER_TIMEOUT 300` somewhere in your keymap.c file, probably near the top. The 300 there is 300ms -- that's how long you have for the sequence of keys following the leader. You can tweak this value for comfort, of course.
-3. Within your `matrix_scan_user` function, do something like this:
-
-```
-LEADER_EXTERNS();
-
-void matrix_scan_user(void) {
-  LEADER_DICTIONARY() {
-    leading = false;
-    leader_end();
-
-    SEQ_ONE_KEY(KC_F) {
-      register_code(KC_S);
-      unregister_code(KC_S);
-    }
-    SEQ_TWO_KEYS(KC_A, KC_S) {
-      register_code(KC_H);
-      unregister_code(KC_H);
-    }
-    SEQ_THREE_KEYS(KC_A, KC_S, KC_D) {
-      register_code(KC_LGUI);
-      register_code(KC_S);
-      unregister_code(KC_S);
-      unregister_code(KC_LGUI);
-    }
-  }
-}
-```
-
-As you can see, you have three function. you can use - `SEQ_ONE_KEY` for single-key sequences (Leader followed by just one key), and `SEQ_TWO_KEYS` and `SEQ_THREE_KEYS` for longer sequences. Each of these accepts one or more keycodes as arguments. This is an important point: You can use keycodes from **any layer on your keyboard**. That layer would need to be active for the leader macro to fire, obviously.
-
-## Tap Dance: A single key can do 3, 5, or 100 different things
-
-Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/jackhumbert/qmk_firmware/pull/451). Here's how algernon describes the feature:
-
-With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter.
-
-To make it clear how this is different from `ACTION_FUNCTION_TAP`, lets explore a certain setup! We want one key to send `Space` on single tap, but `Enter` on double-tap.
-
-With `ACTION_FUNCTION_TAP`, it is quite a rain-dance to set this up, and has the problem that when the sequence is interrupted, the interrupting key will be send first. Thus, `SPC a` will result in `a SPC` being sent, if they are typed within `TAPPING_TERM`. With the tap dance feature, that'll come out as `SPC a`, correctly.
-
-The implementation hooks into two parts of the system, to achieve this: into `process_record_quantum()`, and the matrix scan. We need the latter to be able to time out a tap sequence even when a key is not being pressed, so `SPC` alone will time out and register after `TAPPING_TERM` time.
-
-But lets start with how to use it, first!
-
-First, you will need `TAP_DANCE_ENABLE=yes` in your `Makefile`, because the feature is disabled by default. This adds a little less than 1k to the firmware size. Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()`, takes a number, which will later be used as an index into the `tap_dance_actions` array.
-
-This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are three possible options:
-
-* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
-* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
-* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function on when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
-
-The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
-
-And that's the bulk of it!
-
-And now, on to the explanation of how it works!
-
-The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and the timer.
-
-This means that you have `TAPPING_TERM` time to tap the key again, you do not have to input all the taps within that timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
-
-Our next stop is `matrix_scan_tap_dance()`. This handles the timeout of tap-dance keys.
-
-For the sake of flexibility, tap-dance actions can be either a pair of keycodes, or a user function. The latter allows one to handle higher tap counts, or do extra things, like blink the LEDs, fiddle with the backlighting, and so on. This is accomplished by using an union, and some clever macros.
-
-### Examples
-
-Here's a simple example for a single definition:
-
-1. In your `makefile`, add `TAP_DANCE_ENABLE = yes`
-2. In your `config.h` (which you can copy from `qmk_firmware/keyboards/planck/config.h` to your keymap directory), add `#define TAPPING_TERM 200`
-3. In your `keymap.c` file, define the variables and definitions, then add to your keymap:
-
-```c
-//Tap Dance Declarations
-enum {
-  TD_ESC_CAPS = 0
-};
-
-//Tap Dance Definitions
-qk_tap_dance_action_t tap_dance_actions[] = {
-  //Tap once for Esc, twice for Caps Lock
-  [TD_ESC_CAPS]  = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS)
-// Other declarations would go here, separated by commas, if you have them
-};
-
-//In Layer declaration, add tap dance item in place of a key code
-TD(TD_ESC_CAPS)
-```
-
-Here's a more complex example involving custom actions:
-
-```c
-enum {
- CT_SE = 0,
- CT_CLN,
- CT_EGG,
- CT_FLSH,
-};
-
-/* Have the above three on the keymap, TD(CT_SE), etc... */
-
-void dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
-  if (state->count == 1) {
-    register_code (KC_RSFT);
-    register_code (KC_SCLN);
-  } else {
-    register_code (KC_SCLN);
-  }
-}
-
-void dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
-  if (state->count == 1) {
-    unregister_code (KC_RSFT);
-    unregister_code (KC_SCLN);
-  } else {
-    unregister_code (KC_SCLN);
-  }
-}
-
-void dance_egg (qk_tap_dance_state_t *state, void *user_data) {
-  if (state->count >= 100) {
-    SEND_STRING ("Safety dance!");
-    reset_tap_dance (state);
-  }
-}
-
-// on each tap, light up one led, from right to left
-// on the forth tap, turn them off from right to left
-void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) {
-  switch (state->count) {
-  case 1:
-    ergodox_right_led_3_on();
-    break;
-  case 2:
-    ergodox_right_led_2_on();
-    break;
-  case 3:
-    ergodox_right_led_1_on();
-    break;
-  case 4:
-    ergodox_right_led_3_off();
-    _delay_ms(50);
-    ergodox_right_led_2_off();
-    _delay_ms(50);
-    ergodox_right_led_1_off();
-  }
-}
-
-// on the fourth tap, set the keyboard on flash state
-void dance_flsh_finished(qk_tap_dance_state_t *state, void *user_data) {
-  if (state->count >= 4) {
-    reset_keyboard();
-    reset_tap_dance(state);
-  }
-}
-
-// if the flash state didnt happen, then turn off leds, left to right
-void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
-  ergodox_right_led_1_off();
-  _delay_ms(50);
-  ergodox_right_led_2_off();
-  _delay_ms(50);
-  ergodox_right_led_3_off();
-}
-
-qk_tap_dance_action_t tap_dance_actions[] = {
-  [CT_SE]  = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT)
- ,[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset)
- ,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg)
- ,[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED (dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
-};
-```
-
-## Temporarily setting the default layer
-
-`DF(layer)` - sets default layer to *layer*. The default layer is the one at the "bottom" of the layer stack - the ultimate fallback layer. This currently does not persist over power loss. When you plug the keyboard back in, layer 0 will always be the default. It is theoretically possible to work around that, but that's not what `DF` does.
-
-## Prevent stuck modifiers
-
-Consider the following scenario:
-
-1. Layer 0 has a key defined as Shift.
-2. The same key is defined on layer 1 as the letter A.
-3. User presses Shift.
-4. User switches to layer 1 for whatever reason.
-5. User releases Shift, or rather the letter A.
-6. User switches back to layer 0.
-
-Shift was actually never released and is still considered pressed.
-
-If such situation bothers you add this to your `config.h`:
-
-    #define PREVENT_STUCK_MODIFIERS
-
-This option uses 5 bytes of memory per every 8 keys on the keyboard
-rounded up (5 bits per key). For example on Planck (48 keys) it uses
-(48/8)\*5 = 30 bytes.
-
-## Macro shortcuts: Send a whole string when pressing just one key
-
-Instead of using the `ACTION_MACRO` function, you can simply use `M(n)` to access macro *n* - *n* will get passed into the `action_get_macro` as the `id`, and you can use a switch statement to trigger it. This gets called on the keydown and keyup, so you'll need to use an if statement testing `record->event.pressed` (see keymap_default.c).
-
-```c
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // this is the function signature -- just copy/paste it into your keymap file as it is.
-{
-  switch(id) {
-    case 0: // this would trigger when you hit a key mapped as M(0)
-      if (record->event.pressed) {
-        return MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END  ); // this sends the string 'hello' when the macro executes
-      }
-      break;
-  }
-  return MACRO_NONE;
-};
-```
-A macro can include the following commands:
-
-* I() change interval of stroke in milliseconds.
-* D() press key.
-* U() release key.
-* T() type key(press and release).
-* W() wait (milliseconds).
-* END end mark.
-
-So above you can see the stroke interval changed to 255ms between each keystroke, then a bunch of keys being typed, waits a while, then the macro ends.
-
-Note: Using macros to have your keyboard send passwords for you is possible, but a bad idea.
-
-### Advanced macro functions
-
-To get more control over the keys/actions your keyboard takes, the following functions are available to you in the `action_get_macro` function block:
-
-* `record->event.pressed`
-
-This is a boolean value that can be tested to see if the switch is being pressed or released. An example of this is
-
-```c
-if (record->event.pressed) {
-  // on keydown
-} else {
-  // on keyup
-}
-```
-
-* `register_code(<kc>);`
-
-This sends the `<kc>` keydown event to the computer. Some examples would be `KC_ESC`, `KC_C`, `KC_4`, and even modifiers such as `KC_LSFT` and `KC_LGUI`.
-
-* `unregister_code(<kc>);`
-
-Parallel to `register_code` function, this sends the `<kc>` keyup event to the computer. If you don't use this, the key will be held down until it's sent.
-
-* `layer_on(<n>);`
-
-This will turn on the layer `<n>` - the higher layer number will always take priority. Make sure you have `KC_TRNS` for the key you're pressing on the layer you're switching to, or you'll get stick there unless you have another plan.
-
-* `layer_off(<n>);`
-
-This will turn off the layer `<n>`.
-
-* `clear_keyboard();`
-
-This will clear all mods and keys currently pressed.
-
-* `clear_mods();`
-
-This will clear all mods currently pressed.
-
-* `clear_keyboard_but_mods();`
-
-This will clear all keys besides the mods currently pressed.
-
-* `update_tri_layer(layer_1, layer_2, layer_3);`
-
-If the user attempts to activate layer 1 AND layer 2 at the same time (for example, by hitting their respective layer keys), layer 3 will be activated. Layers 1 and 2 will _also_ be activated, for the purposes of fallbacks (so a given key will fall back from 3 to 2, to 1 -- and only then to 0).
-
-#### Naming your macros
-
-If you have a bunch of macros you want to refer to from your keymap, while keeping the keymap easily readable, you can just name them like so:
-
-```
-#define AUD_OFF M(6)
-#define AUD_ON M(7)
-#define MUS_OFF M(8)
-#define MUS_ON M(9)
-#define VC_IN M(10)
-#define VC_DE M(11)
-#define PLOVER M(12)
-#define EXT_PLV M(13)
-```
-
-As was done on the [Planck default keymap](/keyboards/planck/keymaps/default/keymap.c#L33-L40)
-
-#### Timer functionality
-
-It's possible to start timers and read values for time-specific events - here's an example:
-
-```c
-static uint16_t key_timer;
-key_timer = timer_read();
-if (timer_elapsed(key_timer) < 100) {
-  // do something if less than 100ms have passed
-} else {
-  // do something if 100ms or more have passed
-}
-```
-
-It's best to declare the `static uint16_t key_timer;` outside of the macro block (top of file, etc).
-
-#### Example: Single-key copy/paste (hold to copy, tap to paste)
-
-With QMK, it's easy to make one key do two things, as long as one of those things is being a modifier. :) So if you want a key to act as Ctrl when held and send the letter R when tapped, that's easy: `CTL_T(KC_R)`. But what do you do when you want that key to send Ctrl-V (paste) when tapped, and Ctrl-C (copy) when held?
-
-Here's what you do:
-
-
-```
-static uint16_t key_timer;
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-      switch(id) {
-        case 0: {
-            if (record->event.pressed) {
-                key_timer = timer_read(); // if the key is being pressed, we start the timer.
-            }
-            else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down").
-                if (timer_elapsed(key_timer) > 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap.
-                    return MACRO( D(LCTL), T(C), U(LCTL), END  );
-                }
-                else {
-                    return MACRO( D(LCTL), T(V), U(LCTL), END  );
-                }
-            }
-            break;
-        }
-      }
-    return MACRO_NONE;
-};
-```
-
-And then, to assign this macro to a key on your keyboard layout, you just use `M(0)` on the key you want to press for copy/paste.
-
-## Dynamic macros: record and replay macros in runtime
-
-In addition to the static macros described above, you may enable the dynamic macros which you may record while writing. They are forgotten as soon as the keyboard is unplugged. Only two such macros may be stored at the same time, with the total length of 64 keypresses (by default).
-
-To enable them, first add a new element to the `planck_keycodes` enum -- `DYNAMIC_MACRO_RANGE`:
-
-    enum planck_keycodes {
-      QWERTY = SAFE_RANGE,
-      COLEMAK,
-      DVORAK,
-      PLOVER,
-      LOWER,
-      RAISE,
-      BACKLIT,
-      EXT_PLV,
-      DYNAMIC_MACRO_RANGE,
-    };
-
-Afterwards create a new layer called `_DYN`:
-
-    #define _DYN 6    /* almost any other free number should be ok */
-
-Below these two modifications include the `dynamic_macro.h` header:
-
-    #include "dynamic_macro.h"`
-
-Then define the `_DYN` layer with the following keys: `DYN_REC_START1`, `DYN_MACRO_PLAY1`,`DYN_REC_START2` and `DYN_MACRO_PLAY2`. It may also contain other keys, it doesn't matter apart from the fact that you won't be able to record these keys in the dynamic macros.
-
-    [_DYN]= {
-        {_______,  DYN_REC_START1, DYN_MACRO_PLAY1, _______, _______, _______, _______, _______, _______, _______, _______, _______},
-        {_______,  DYN_REC_START2, DYN_MACRO_PLAY2, _______, _______, _______, _______, _______, _______, _______, _______, _______},
-        {_______,  _______,        _______,         _______, _______, _______, _______, _______, _______, _______, _______, _______},
-        {_______,  _______,        _______,         _______, _______, _______, _______, _______, _______, _______, _______, _______}
-    },
-
-Add the following code to the very beginning of your `process_record_user()` function:
-
-    if (!process_record_dynamic_macro(keycode, record)) {
-        return false;
-    }
-
-To start recording the macro, press either `DYN_REC_START1` or `DYN_REC_START2`. To finish the recording, press the `_DYN` layer button. The handler awaits specifically for the `MO(_DYN)` keycode as the "stop signal" so please don't use any fancy ways to access this layer, use the regular `MO()` modifier. To replay the macro, press either `DYN_MACRO_PLAY1` or `DYN_MACRO_PLAY2`.
-
-If the LED-s start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by setting the `DYNAMIC_MACRO_SIZE` preprocessor macro (default value: 128; please read the comments for it in the header).
-
-For the details about the internals of the dynamic macros, please read the comments in the `dynamic_macro.h` header.
-
-## Additional keycode aliases for software-implemented layouts (Colemak, Dvorak, etc)
-
-Everything is assuming you're in Qwerty (in software) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap:
-
-   #include <keymap_colemak.h>
-
-If you use Dvorak, use `keymap_dvorak.h` instead of `keymap_colemak.h` for this line. After including this line, you will get access to:
-
- * `CM_*` for all of the Colemak-equivalent characters
- * `DV_*` for all of the Dvorak-equivalent characters
-
-These implementations assume you're using Colemak or Dvorak on your OS, not on your keyboard - this is referred to as a software-implemented layout. If your computer is in Qwerty and your keymap is in Colemak or Dvorak, this is referred to as a firmware-implemented layout, and you won't need these features.
-
-To give an example, if you're using software-implemented Colemak, and want to get an `F`, you would use `CM_F` - `KC_F` under these same circumstances would result in `T`.
-
-## Additional language support
-
-In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbreviation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware (but it's being worked on - see Unicode support).
-
-## Unicode support
-
-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
-
-In order to enable backlight breathing, the following line must be added to your config.h file.
-
-    #define BACKLIGHT_BREATHING
-
-The following function calls are used to control the breathing effect.
-
-* ```breathing_enable()``` - Enable the free-running breathing effect.
-* ```breathing_disable()``` - Disable the free-running breathing effect immediately.
-* ```breathing_self_disable()``` - Disable the free-running breathing effect after the current effect ends.
-* ```breathing_toggle()``` - Toggle the free-running breathing effect.
-* ```breathing_defaults()``` - Reset the speed and brightness settings of the breathing effect.
-
-The following function calls are used to control the maximum brightness of the breathing effect.
-
-* ```breathing_intensity_set(value)``` - Set the brightness of the breathing effect when it is at its max value.
-* ```breathing_intensity_default()``` - Reset the brightness of the breathing effect to the default value based on the current backlight intensity.
-
-The following function calls are used to control the cycling speed of the breathing effect.
-
-* ```breathing_speed_set(value)``` - Set the speed of the breathing effect - how fast it cycles.
-* ```breathing_speed_inc(value)``` - Increase the speed of the breathing effect by a fixed value.
-* ```breathing_speed_dec(value)``` - Decrease the speed of the breathing effect by a fixed value.
-* ```breathing_speed_default()``` - Reset the speed of the breathing effect to the default value.
-
-The following example shows how to enable the backlight breathing effect when the FUNCTION layer macro button is pressed:
-
-    case MACRO_FUNCTION:
-        if (record->event.pressed)
-        {
-            breathing_speed_set(3);
-            breathing_enable();
-            layer_on(LAYER_FUNCTION);
-        }
-        else
-        {
-            breathing_speed_set(1);
-            breathing_self_disable();
-            layer_off(LAYER_FUNCTION);
-        }
-        break;
-
-The following example shows how to pulse the backlight on-off-on when the RAISED layer macro button is pressed:
-
-    case MACRO_RAISED:
-      if (record->event.pressed)
-      {
-        layer_on(LAYER_RAISED);
-        breathing_speed_set(2);
-        breathing_pulse();
-        update_tri_layer(LAYER_LOWER, LAYER_RAISED, LAYER_ADJUST);
-      }
-      else
-      {
-        layer_off(LAYER_RAISED);
-        update_tri_layer(LAYER_LOWER, LAYER_RAISED, LAYER_ADJUST);
-      }
-      break;
-
-## Other firmware shortcut keycodes
-
-* `RESET` - puts the MCU in DFU mode for flashing new firmware (with `make dfu`)
-* `DEBUG` - the firmware into debug mode - you'll need hid_listen to see things
-* `BL_ON` - turns the backlight on
-* `BL_OFF` - turns the backlight off
-* `BL_<n>` - sets the backlight to level *n*
-* `BL_INC` - increments the backlight level by one
-* `BL_DEC` - decrements the backlight level by one
-* `BL_TOGG` - toggles the backlight
-* `BL_STEP` - steps through the backlight levels
-
-Enable the backlight from the Makefile.
-
-# Custom Quantum functions
-
-All of these functions are available in the `*_kb()` or `*_user()` variety. `kb` ones should only be used in the `<keyboard>/<keyboard>.c` file, and `user` ones should only be used in the `keymap.c`. The keyboard ones call the user ones - it's necessary to keep these calls to allow the keymap functions to work correctly.
-
-## `void matrix_init_*(void)`
-
-This function gets called when the matrix is initiated, and can contain start-up code for your keyboard/keymap.
-
-## `void matrix_scan_*(void)`
-
-This function gets called at every matrix scan, which is basically as often as the MCU can handle. Be careful what you put here, as it will get run a lot.
-
-## `bool process_record_*(uint16_t keycode, keyrecord_t *record)`
-
-This function gets called on every keypress/release, and is where you can define custom functionality. The return value is whether or not QMK should continue processing the keycode - returning `false` stops the execution.
-
-The `keycode` variable is whatever is defined in your keymap, eg `MO(1)`, `KC_L`, etc. and can be switch-cased to execute code whenever a particular code is pressed.
-
-The `record` variable contains infomation about the actual press:
-
-```
-keyrecord_t record {
-  keyevent_t event {
-    keypos_t key {
-      uint8_t col
-      uint8_t row
-    }
-    bool     pressed
-    uint16_t time
-  }
-}
-```
-
-The conditional `if (record->event.pressed)` can tell if the key is being pressed or released, and you can execute code based on that.
-
-## `void led_set_*(uint8_t usb_led)`
-
-This gets called whenever there is a state change on your host LEDs (eg caps lock, scroll lock, etc). The LEDs are defined as:
-
-```
-#define USB_LED_NUM_LOCK                0
-#define USB_LED_CAPS_LOCK               1
-#define USB_LED_SCROLL_LOCK             2
-#define USB_LED_COMPOSE                 3
-#define USB_LED_KANA                    4
-```
-
-and can be tested against the `usb_led` with a conditional like `if (usb_led & (1<<USB_LED_CAPS_LOCK))` - if this is true, you can turn your LED one, otherwise turn it off.
-
-# Modding your keyboard
-
-## Audio output from a speaker
-
-Your keyboard can make sounds! If you've got a Planck, Preonic, or basically any keyboard that allows access to the C6 port, you can hook up a simple speaker and make it beep. You can use those beeps to indicate layer transitions, modifiers, special keys, or just to play some funky 8bit tunes.
-
-The audio code lives in [quantum/audio/audio.h](/quantum/audio/audio.h) and in the other files in the audio directory. It's enabled by default on the Planck [stock keymap](/keyboards/planck/keymaps/default/keymap.c). Here are the important bits:
-
-```
-#include "audio.h"
-```
-
-Then, lower down the file:
-
-```
-float tone_startup[][2] = {
-    ED_NOTE(_E7 ),
-    E__NOTE(_CS7),
-    E__NOTE(_E6 ),
-    E__NOTE(_A6 ),
-    M__NOTE(_CS7, 20)
-};
-```
-
-This is how you write a song. Each of these lines is a note, so we have a little ditty composed of five notes here.
-
-Then, we have this chunk:
-
-```
-float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
-float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
-float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
-float tone_plover[][2]     = SONG(PLOVER_SOUND);
-float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND);
-
-float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
-float goodbye[][2] = SONG(GOODBYE_SOUND);
-```
-
-Wherein we bind predefined songs (from [quantum/audio/song_list.h](/quantum/audio/song_list.h)) into named variables. This is one optimization that helps save on memory: These songs only take up memory when you reference them in your keymap, because they're essentially all preprocessor directives.
-
-So now you have something called `tone_plover` for example. How do you make it play the Plover tune, then? If you look further down the keymap, you'll see this:
-
-```
-PLAY_NOTE_ARRAY(tone_plover, false, 0); // Signature is: Song name, repeat, rest style
-```
-
-This is inside one of the macros. So when that macro executes, your keyboard plays that particular chime.
-
-"Rest style" in the method signature above (the last parameter) specifies if there's a rest (a moment of silence) between the notes.
-
-
-## Recording And Playing back Music
-* ```Music On``` - Turn music mode on. The default mapping is ```Lower+Upper+C```
-* ```LCTL``` - start a recording
-* play some tones
-* ```LALT``` - stop recording, stop playing
-* ```LGUI``` - play recording
-* ```LALT``` - stop playing
-* ```Music Off``` - Turn music mode off. The default mapping is ```Lower+Upper+V```
-
-
-## MIDI functionalty
-
-This is still a WIP, but check out `quantum/keymap_midi.c` to see what's happening. Enable from the Makefile.
-
-## Bluetooth functionality
-
-This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboards/comments/3psx0q/the_planck_keyboard_with_bluetooth_guide_and/?ref=search_posts), but can be enabled via the Makefile. The firmware will still output characters via USB, so be aware of this when charging via a computer. It would make sense to have a switch on the Bluefruit to turn it off at will.
-
-## International Characters on Windows
-
-[AutoHotkey](https://autohotkey.com) allows Windows users to create custom hotkeys among others.
-
-The method does not require Unicode support in the keyboard itself but depends instead of AutoHotkey running in the background.
-
-First you need to select a modifier combination that is not in use by any of your programs.
-CtrlAltWin is not used very widely and should therefore be perfect for this.
-There is a macro defined for a mod-tab combo `LCAG_T`.
-Add this mod-tab combo to a key on your keyboard, e.g.: `LCAG_T(KC_TAB)`.
-This makes the key behave like a tab key if pressed and released immediately but changes it to the modifier if used with another key.
-
-In the default script of AutoHotkey you can define custom hotkeys.
-
-    <^<!<#a::Send, ä
-    <^<!<#<+a::Send, Ä
-
-The hotkeys above are for the combination CtrlAltGui and CtrlAltGuiShift plus the letter a.
-AutoHotkey inserts the Text right of `Send, ` when this combination is pressed.
-
-## RGB Under Glow Mod
-
-![Planck with RGB Underglow](https://raw.githubusercontent.com/jackhumbert/qmk_firmware/master/keyboards/planck/keymaps/yang/planck-with-rgb-underglow.jpg)
-
-Here is a quick demo on Youtube (with NPKC KC60) (https://www.youtube.com/watch?v=VKrpPAHlisY).
-
-For this mod, you need an unused pin wiring to DI of WS2812 strip. After wiring the VCC, GND, and DI, you can enable the underglow in your Makefile.
-
-    RGBLIGHT_ENABLE = yes
-
-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_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
-    #define RGBLIGHT_VAL_STEP 17
-
-You'll need to edit `RGB_DI_PIN` to the pin you have your `DI` on your RGB strip wired to.
-
-The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. For details, please check this keymap. `keyboards/planck/keymaps/yang/keymap.c`
-
-### WS2812 Wiring
-
-![WS2812 Wiring](https://raw.githubusercontent.com/jackhumbert/qmk_firmware/master/keyboards/planck/keymaps/yang/WS2812-wiring.jpg)
-
-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.
-
-There are three available modes for hooking up PS/2 devices: USART (best), interrupts (better) or busywait (not recommended).
-
-### 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
-```
-
-### Additional Settings
-
-#### PS/2 mouse features
-
-These enable settings supported by the PS/2 mouse protocol: http://www.computer-engineering.org/ps2mouse/
-
-```
-/* Use remote mode instead of the default stream mode (see link) */
-#define PS2_MOUSE_USE_REMOTE_MODE  
-
-/* Enable the scrollwheel or scroll gesture on your mouse or touchpad */
-#define PS2_MOUSE_ENABLE_SCROLLING
-
-/* Some mice will need a scroll mask to be configured. The default is 0xFF. */
-#define PS2_MOUSE_SCROLL_MASK 0x0F
-
-/* Applies a transformation to the movement before sending to the host (see link) */
-#define PS2_MOUSE_USE_2_1_SCALING
-
-/* The time to wait after initializing the ps2 host */
-#define PS2_MOUSE_INIT_DELAY 1000 /* Default */
-```
-
-You can also call the following functions from ps2_mouse.h
-
-```
-void ps2_mouse_disable_data_reporting(void);
-
-void ps2_mouse_enable_data_reporting(void);
-
-void ps2_mouse_set_remote_mode(void);
-
-void ps2_mouse_set_stream_mode(void);
-
-void ps2_mouse_set_scaling_2_1(void);
-
-void ps2_mouse_set_scaling_1_1(void);
-
-void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution);
-
-void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate);
-```
-
-#### Fine control
-
-Use the following defines to change the sensitivity and speed of the mouse.
-Note: you can also use `ps2_mouse_set_resolution` for the same effect (not supported on most touchpads).
-
-```
-#define PS2_MOUSE_X_MULTIPLIER 3
-#define PS2_MOUSE_Y_MULTIPLIER 3
-#define PS2_MOUSE_V_MULTIPLIER 1
-```
-
-#### Scroll button
-
-If you're using a trackpoint, you will likely want to be able to use it for scrolling.
-Its possible to enable a "scroll button/s" that when pressed will cause the mouse to scroll instead of moving.
-To enable the feature, you must set a scroll button mask as follows:
-
-```
-#define PS2_MOUSE_SCROLL_BTN_MASK (1<<PS2_MOUSE_BUTTON_MIDDLE) /* Default */
-```
-
-To disable the scroll button feature:
-
-```
-#define PS2_MOUSE_SCROLL_BTN_MASK 0
-```
-
-The available buttons are:
-
-```
-#define PS2_MOUSE_BTN_LEFT      0
-#define PS2_MOUSE_BTN_RIGHT     1
-#define PS2_MOUSE_BTN_MIDDLE    2
-```
-
-You can also combine buttons in the mask by `|`ing them together.
-
-Once you've configured your scroll button mask, you must configure the scroll button send interval.
-This is the interval before which if the scroll buttons were released they would be sent to the host.
-After this interval, they will cause the mouse to scroll and will not be sent.
-
-```
-#define PS2_MOUSE_SCROLL_BTN_SEND 300 /* Default */
-```
-
-To disable sending the scroll buttons:
-```
-#define PS2_MOUSE_SCROLL_BTN_SEND 0
-```
-
-Fine control over the scrolling is supported with the following defines:
-
-```
-#define PS2_MOUSE_SCROLL_DIVISOR_H 2
-#define PS2_MOUSE_SCROLL_DIVISOR_V 2
-```
-
-#### Debug settings
-
-To debug the mouse, add `debug_mouse = true` or enable via bootmagic.
-
-```
-/* To debug the mouse reports */
-#define PS2_MOUSE_DEBUG_HID
-#define PS2_MOUSE_DEBUG_RAW
-```
-
-## 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 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 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, 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.
-- EEPROM has around a 100000 write cycle.  You shouldn't rewrite the
-  firmware repeatedly and continually; that'll burn the EEPROM
-  eventually.
-
-# Porting your keyboard to QMK
-
-If your keyboard is running an Atmega chip (atmega32u4 and others), it's pretty easy to get things setup for compiling your own firmware to flash onto your board. There is a `/util/new_project.sh <keyboard>` script to help get you started - you can simply pass your keyboard's name into the script, and all of the necessary files will be created. The components of each are described below.
-
-## `/keyboards/<keyboard>/config.h`
-
-The `USB Device descriptor parameter` block contains parameters are used to uniquely identify your keyboard, but they don't really matter to the machine.
-
-Your `MATRIX_ROWS` and `MATRIX_COLS` are the numbers of rows and cols in your keyboard matrix - this may be different than the number of actual rows and columns on your keyboard. There are some tricks you can pull to increase the number of keys in a given matrix, but most keyboards are pretty straight-forward.
-
-The `MATRIX_ROW_PINS` and `MATRIX_COL_PINS` are the pins your MCU uses on each row/column. Your schematic (if you have one) will have this information on it, and the values will vary depending on your setup. This is one of the most important things to double-check in getting your keyboard setup correctly.
-
-For the `DIODE_DIRECTION`, most hand-wiring guides will instruct you to wire the diodes in the `COL2ROW` position, but it's possible that they are in the other - people coming from EasyAVR often use `ROW2COL`. Nothing will function if this is incorrect.
-
-`BACKLIGHT_PIN` is the pin that your PWM-controlled backlight (if one exists) is hooked-up to. Currently only B5, B6, and B7 are supported.
-
-`BACKLIGHT_BREATHING` is a fancier backlight feature that adds breathing/pulsing/fading effects to the backlight. It uses the same timer as the normal backlight. These breathing effects must be called by code in your keymap.
-
-`BACKLIGHT_LEVELS` is how many levels exist for your backlight - max is 15, and they are computed automatically from this number.
-
-## `/keyboards/<keyboard>/Makefile`
-
-The values at the top likely won't need to be changed, since most boards use the `atmega32u4` chip. The `BOOTLOADER_SIZE` will need to be adjusted based on your MCU type. It's defaulted to the Teensy, since that's the most common controller. Below is quoted from the `Makefile`.
-
-```
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-```
-
-At the bottom of the file, you'll find lots of features to turn on and off - all of these options should be set with `?=` to allow for the keymap overrides. `?=` only assigns if the variable was previously undefined. For the full documenation of these features, see the [Makefile options](#makefile-options).
-
-## `/keyboards/<keyboard>/readme.md`
-
-This is where you'll describe your keyboard - please write as much as you can about it! Talking about default functionality/features is useful here. Feel free to link to external pages/sites if necessary. Images can be included here as well. This file will be rendered into a webpage at qmk.fm/keyboards/<keyboard>/.
-
-## `/keyboards/<keyboard>/<keyboard>.c`
-
-This is where all of the custom logic for your keyboard goes - you may not need to put anything in this file, since a lot of things are configured automatically. All of the `*_kb()` functions are defined here. If you modify them, remember to keep the calls to `*_user()`, or things in the keymaps might not work. You can read more about the functions [here](#custom-quantum-functions-for-keyboards-and-keymaps)
-
-## `/keyboards/<keyboard>/<keyboard>.h`
-
-Here is where you can (optionally) define your `KEYMAP` function to remap your matrix into a more readable format. With ortholinear boards, this isn't always necessary, but it can help to accomodate the dead spots on your matrix, where there are keys that take up more than one space (2u, staggering, 6.25u, etc). The example shows the difference between the physical keys, and the matrix design:
-
-```
-#define KEYMAP( \
-    k00, k01, k02, \
-      k10,  k11   \
-) \
-{ \
-    { k00, k01,   k02 }, \
-    { k10, KC_NO, k11 }, \
-}
-```
-
-Each of the `kxx` variables needs to be unique, and usually follows the format `k<row><col>`. You can place `KC_NO` where your dead keys are in your matrix.
-
-# Unit Testing
-
-If you are new to unit testing, then you can find many good resources on internet. However most of it is scattered around in small pieces here and there, and there's also many different opinions, so I won't give any recommendations.
-
-Instead I recommend these two books, explaining two different styles of Unit Testing in detail.
-
-* "Test Driven Development: By Example: Kent Beck"
-* "Growing Object-Oriented Software, Guided By Tests: Steve Freeman, Nat Pryce"
-
-If you prefer videos there are Uncle Bob's [Clean Coders Videos](https://cleancoders.com/), which unfortunately cost quite a bit, especially if you want to watch many of them. But James Shore has a free [Let's Play](http://www.jamesshore.com/Blog/Lets-Play) video series.
-
-## Google Test and Google Mock
-It's possible to Unit Test your code using [Google Test](https://github.com/google/googletest). The Google Test framework also includes another component for writing testing mocks and stubs, called "Google Mock". For information how to write the actual tests, please refer to the documentation on that site.
-
-## Use of C++
-
-Note that Google Test and therefore any test has to be written in C++, even if the rest of the QMK codebases is written in C. This should hopefully not be a problem even if you don't know any C++, since there's quite clear documentation and examples of the required C++ features, and you can write the rest of the test code almost as you would write normal C. Note that some compiler errors which you might get can look quite scary, but just read carefully what it says, and you should be ok.
-
-One thing to remember, is that you have to append `extern "C"` around all of your C file includes.
-
-## Adding tests for new or existing features
-
-If you want to unit test some feature, then take a look at the existing serial_link tests, in the `quantum/serial_link/tests folder`, and follow the steps below to create a similar structure.
-
-1. If it doesn't already exist, add a test subfolder to the folder containing the feature.
-2. Create a `testlist.mk` and a `rules.mk` file in that folder.
-3. Include those files from the root folder `testlist.mk`and `build_test.mk` respectively.
-4. Add a new name for your testgroup to the `testlist.mk` file. Each group defined there will be a separate executable. And that's how you can support mocking out different parts. Note that it's worth adding some common prefix, just like it's done for the serial_link tests. The reason for that is that the make command allows substring filtering, so this way you can easily run a subset of the tests.
-5. Define the source files and required options in the `rules.mk` file.
-   * `_SRC` for source files
-   * `_DEFS` for additional defines
-   * `_INC` for additional include folders
-6. Write the tests in a new cpp file inside the test folder you created. That file has to be one of the files included from the `rules.mk` file.
-
-Note how there's several different tests, each mocking out a separate part. Also note that each of them only compiles the very minimum that's needed for the tests. It's recommend that you try to do the same. For a relevant video check out [Matt Hargett "Advanced Unit Testing in C & C++](https://www.youtube.com/watch?v=Wmy6g-aVgZI)
-
-## Running the tests
-
-To run all the tests in the codebase, type `make test`. You can also run test matching a substring by typing `make test-matchingsubstring` Note that the tests are always compiled with the native compiler of your platform, so they are also run like any other program on your computer.
-
-## Debugging the tests
-
-If there are problems with the tests, you can find the executable in the `./build/test` folder. You should be able to run those with GDB or a similar debugger.
-
-## Full Integration tests
-
-It's not yet possible to do a full integration test, where you would compile the whole firmware and define a keymap that you are going to test. However there are plans for doing that, because writing tests that way would probably be easier, at least for people that are not used to unit testing.
-
-In that model you would emulate the input, and expect a certain output from the emulated keyboard.
-
-# Tracing variables 
-
-Sometimes you might wonder why a variable gets changed and where, and this can be quite tricky to track down without having a debugger. It's of course possible to manually add print statements to track it, but you can also enable the variable trace feature. This works for both for variables that are changed by the code, and when the variable is changed by some memory corruption.
-
-To take the feature into use add `VARIABLE_TRACE=x` to the end of you make command. `x` represents the number of variables you want to trace, which is usually 1. 
-
-Then at a suitable place in the code, call `ADD_TRACED_VARIABLE`, to begin the tracing. For example to trace all the layer changes, you can do this
-```c
-void matrix_init_user(void) {
-  ADD_TRACED_VARIABLE("layer", &layer_state, sizeof(layer_state));
-}
-```
-
-This will add a traced variable named "layer" (the name is just for your information), which tracks the memory location of `layer_state`. It tracks 4 bytes (the size of `layer_state`), so any modification to the variable will be reported. By default you can not specify a size bigger than 4, but you can change it by adding `MAX_VARIABLE_TRACE_SIZE=x` to the end of the make command line.
-
-In order to actually detect changes to the variables you should call `VERIFY_TRACED_VARIABLES` around the code that you think that modifies the variable. If a variable is modified it will tell you between which two `VERIFY_TRACED_VARIABLES` calls the modification happened. You can then add more calls to track it down further. I don't recommend spamming the codebase with calls. It's better to start with a few, and then keep adding them in a binary search fashion. You can also delete the ones you don't need, as each call need to store the file name and line number in the ROM, so you can run out of memory if you add too many calls.
-
-Also remember to delete all the tracing code ones you have found the bug, as you wouldn't want to create a pull request with tracing code.