]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ergodox_ez/keymaps/drashna/keymap.c
f37b54bf272370fcdb49bc9e818ab10b9088b63e
[qmk_firmware.git] / keyboards / ergodox_ez / keymaps / drashna / keymap.c
1 /*
2 This is the keymap for the keyboard
3 Copyright 2012 Jun Wako <wakojun@gmail.com>
4 Copyright 2015 Jack Humbert
5 Copyright 2017 Art Ortenburger
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 2 of the License, or
9 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17 #include QMK_KEYBOARD_H
18 #include "debug.h"
19 #include "action_layer.h"
20 #include "version.h"
21
22
23 #include "keymap_german.h"
24
25 #include "keymap_nordic.h"
26
27 // Define layer names 
28 #define QWERTY 0
29 #define COLEMAK 1
30 #define DVORAK 2
31 #define WORKMAN 3
32 #define SYMB 8
33 #define OVERWATCH 9
34 #define DIABLO 10
35 #define MOUS 12
36
37
38 //define modifiers
39 #define MODS_SHIFT_MASK  (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
40 #define MODS_CTRL_MASK  (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL))
41 #define MODS_ALT_MASK  (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT))
42
43 //define layer change stuff for underglow indicator
44 bool skip_leds = false;
45
46 #ifdef RGBLIGHT_ENABLE
47 #define rgblight_set_blue        rgblight_sethsv (0xFF,  0xFF, 0xFF);
48 #define rgblight_set_red         rgblight_sethsv (0x00,  0xFF, 0xFF);
49 #define rgblight_set_green       rgblight_sethsv (0x78,  0xFF, 0xFF);
50 #define rgblight_set_orange      rgblight_sethsv (0x1E,  0xFF, 0xFF);
51 #define rgblight_set_teal        rgblight_sethsv (0xC3,  0xFF, 0xFF);
52 #define rgblight_set_magenta     rgblight_sethsv (0x12C, 0xFF, 0xFF);
53 #define rgblight_set_yellow      rgblight_sethsv (0x3C,  0xFF, 0xFF);
54 #define rgblight_set_purple      rgblight_sethsv (0x10E, 0xFF, 0xFF);
55 #endif
56
57 //define diablo macro timer variables
58 static uint16_t diablo_timer[4];
59 static uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
60 static uint8_t diablo_key_time[4];
61
62 bool check_dtimer(uint8_t dtimer) {
63   // has the correct number of seconds elapsed (as defined by diablo_times)
64   return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true;
65 };
66
67
68 enum custom_keycodes {
69   PLACEHOLDER = SAFE_RANGE, // can always be here
70   EPRM,
71   VRSN,
72   RGB_SLD,
73   RGB_0000FF,
74   RGB_008000,
75   RGB_FF0000,
76   RGB_800080,
77   RGB_00FF90,
78   KC_DIABLO_CLEAR,
79   KC_QWERTY,
80   KC_COLEMAK,
81   KC_DVORAK,
82   KC_WORKMAN,
83   KC_MAKEQMK,
84   KC_RESET
85 };
86
87 #ifdef TAP_DANCE_ENABLE
88 enum {
89   TD_FLSH = 0,
90   TD_DIABLO_1,
91   TD_DIABLO_2,
92   TD_DIABLO_3,
93   TD_DIABLO_4
94 };
95
96
97
98
99 // on each tap, light up one led, from right to left
100 // on the forth tap, turn them off from right to left
101
102 void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) {
103   if (!skip_leds) {
104     ergodox_board_led_off();
105     ergodox_right_led_1_off();
106     ergodox_right_led_2_off();
107     ergodox_right_led_3_off();
108     skip_leds = true;
109   }
110   switch (state->count) {
111   case 1:
112     ergodox_right_led_1_on();
113     break;
114   case 2:
115     ergodox_right_led_2_on();
116     break;
117   case 3:
118     ergodox_right_led_3_on();
119     break;
120   case 4:
121     ergodox_right_led_1_off();
122     _delay_ms(50);
123     ergodox_right_led_2_off();
124     _delay_ms(50);
125     ergodox_right_led_3_off();
126
127   }
128 }
129
130 // on the fourth tap, set the keyboard on flash state
131 // and set the underglow to red, because red == bad
132 void dance_flsh_finished(qk_tap_dance_state_t *state, void *user_data) {
133   if (state->count >= 4) {
134 #ifdef RGBLIGHT_ENABLE
135     rgblight_enable();
136     rgblight_mode(1);
137     rgblight_setrgb(0xff, 0x00, 0x00);
138 #endif
139     reset_tap_dance(state);
140     reset_keyboard();
141   }
142 }
143
144 // Cycle through the times for the macro, starting at 0, for disabled.
145 // Max of six values, so don't exceed
146 void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) {
147   if (state->count >= 7) {
148     diablo_key_time[diablo_key] = diablo_times[0];
149     reset_tap_dance(state);
150   }
151   else {
152     diablo_key_time[diablo_key] = diablo_times[state->count - 1];
153   }
154 }
155
156
157 // Would rather have one function for all of this, but no idea how to do that...
158 void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) {
159   diablo_tapdance_master(state, user_data, 0);
160 }
161
162 void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) {
163   diablo_tapdance_master(state, user_data, 1);
164 }
165
166 void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) {
167   diablo_tapdance_master(state, user_data, 2);
168 }
169
170 void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) {
171   diablo_tapdance_master(state, user_data, 3);
172 }
173
174
175 // if the flash state didnt happen, then turn off leds, left to right
176 void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
177   _delay_ms(200);
178   ergodox_right_led_3_off();
179   _delay_ms(200);
180   ergodox_right_led_2_off();
181   _delay_ms(200);
182   ergodox_right_led_1_off();
183   _delay_ms(500);
184   skip_leds = false;
185 }
186
187 //Tap Dance Definitions
188 qk_tap_dance_action_t tap_dance_actions[] = {
189   //Once for Blue, Twice for Green, Thrice for Red, and four to flash
190   [TD_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED(dance_flsh_each, dance_flsh_finished, dance_flsh_reset),
191   // tap once to disable, and more to enable timed micros
192   [TD_DIABLO_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1),
193   [TD_DIABLO_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2),
194   [TD_DIABLO_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3),
195   [TD_DIABLO_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
196
197 };
198 #endif
199
200 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
201 /* Keymap 0: Basic layer
202  * 
203  * 
204  * ,--------------------------------------------------.           ,--------------------------------------------------.
205  * |   = +  |  1 ! | 2 @  | 3 #  | 4 $  | 5 %  | TG(4)|           | TG(4)| 6 ^  | 7 &  |  8 * | 9 (  |  0 ) |  - _   |
206  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
207  * |   TAB  |   Q  |   W  |   E  |   R  |   T  | TG(3)|           |TG(3) |   Y  |   U  |   I  |   O  |   P  |  \ |   |
208  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
209  * |  Bksp  |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;  |  ' "   |
210  * |--------+------+------+------+------+------| TG(2)|           | TG(2)|------+------+------+------+------+--------|
211  * | Shift  |   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |  , < |  . > |  ? / | Shift  |
212  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
213  *   | `/SYM|  ' " | LGUI |  [ { | ] }  |                                       | LEFT | DOWN |  UP  |RIGHT | SYMB |
214  *   `----------------------------------'                                       `----------------------------------'
215  *                                        ,--------------.       ,--------------.
216  *                                        |Alt/Ap|  Win  |       | Alt  |Ctl/Esc|
217  *                                 ,------|------|-------|       |------+-------+------.
218  *                                 |      |      | Home  |       | PgUp |       |      |
219  *                                 | Space| Bksp |-------|       |------|  DEL  |Enter |
220  *                                 |      |      | End   |       | PgDn |       |      |
221  *                                 `---------------------'       `---------------------'
222  */
223   [QWERTY] = LAYOUT_ergodox(
224                 KC_EQUAL,       KC_1,       KC_2,       KC_3,       KC_4,       KC_5,       TG(MOUS),
225                 KC_TAB,         KC_Q,       KC_W,       KC_E,       KC_R,       KC_T,       TG(DIABLO),
226                 KC_BSPACE,      KC_A,       KC_S,       KC_D,       KC_F,       KC_G,
227                 KC_LSHIFT,      LCTL_T(KC_Z),KC_X,       KC_C,       KC_V,       KC_B,       TG(OVERWATCH),
228                 LT(SYMB,KC_GRAVE),KC_QUOTE, KC_LGUI,    KC_LBRACKET,KC_RBRACKET,
229                 
230                                     ALT_T(KC_APPLICATION),  KC_LGUI,
231                                                             KC_HOME,
232                                     KC_SPACE,   KC_BSPACE,  KC_END,
233                                     
234                 TG(MOUS),       KC_6,       KC_7,       KC_8,       KC_9,       KC_0,           KC_MINUS,
235                 TG(DIABLO),     KC_Y,       KC_U,       KC_I,       KC_O,       KC_P,           KC_BSLASH,
236                                 KC_H,       KC_J,       KC_K,       KC_L,       KC_SCOLON,      GUI_T(KC_QUOTE),
237                 TG(OVERWATCH),  KC_N,       KC_M,       KC_COMMA,   KC_DOT,     RCTL_T(KC_SLASH),KC_RSHIFT,
238                                             KC_LEFT,    KC_DOWN,    KC_UP,      KC_RIGHT,       TT(SYMB),
239                 KC_RGUI,    CTL_T(KC_ESCAPE),
240                 KC_PGUP,
241                 KC_PGDOWN,  KC_DELETE,  KC_ENTER
242             ),
243 /* Keymap 0: Basic layer
244  *
245  * ,--------------------------------------------------.           ,--------------------------------------------------.
246  * |   =    |   1  |   2  |   3  |   4  |   5  | LEFT |           | RIGHT|   6  |   7  |   8  |   9  |   0  |   -    |
247  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
248  * | Del    |   Q  |   W  |   F  |   P  |   G  |  L1  |           |  L1  |   J  |   L  |   U  |   Y  |   ;  |   \    |
249  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
250  * | BkSp   |   A  |   R  |   S  |   T  |   D  |------|           |------|   H  |   N  |   E  |   I  |O / L2|   '    |
251  * |--------+------+------+------+------+------| OVER |           | Meh  |------+------+------+------+------+--------|
252  * | LShift |Z/Ctrl|   X  |   C  |   V  |   B  |      |           |      |   K  |   M  |   ,  |   .  |//Ctrl| RShift |
253  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
254  *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  | ~L1  |
255  *   `----------------------------------'                                       `----------------------------------'
256  *                                        ,-------------.       ,-------------.
257  *                                        | App  | LGui |       | Alt  |Ctrl/Esc|
258  *                                 ,------|------|------|       |------+--------+------.
259  *                                 |      |      | Home |       | PgUp |        |      |
260  *                                 | Space|Backsp|------|       |------|  Tab   |Enter |
261  *                                 |      |ace   | End  |       | PgDn |        |      |
262  *                                 `--------------------'       `----------------------'
263  */
264 // If it accepts an argument (i.e, is a function), it doesn't need KC_.
265 // Otherwise, it needs KC_*
266 [COLEMAK] = LAYOUT_ergodox(  
267         // left hand
268         KC_EQL,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   TG(MOUS),
269         KC_TAB,         KC_Q,         KC_W,   KC_F,   KC_P,   KC_G,   TG(DIABLO),
270         KC_BSPC,        KC_A,         KC_R,   KC_S,   KC_T,   KC_D,
271         KC_LSFT,        LCTL_T(KC_Z),  KC_X,   KC_C,   KC_V,   KC_B,   TG(OVERWATCH),
272         LT(SYMB,KC_GRV),KC_QUOT,      KC_LGUI,    KC_LBRACKET,KC_RBRACKET,
273                                               ALT_T(KC_APP),  KC_LEAD,
274                                                               KC_HOME,
275                                                KC_SPC,KC_BSPC,KC_END,
276         // right hand
277              TG(MOUS),    KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
278              TG(DIABLO),  KC_J,   KC_L,   KC_U,   KC_Y,   KC_SCLN,          KC_BSLS,
279                           KC_H,   KC_N,   KC_E,   KC_I,   KC_O,             GUI_T(KC_QUOTE),
280              TG(OVERWATCH),KC_K,  KC_M,   KC_COMM,KC_DOT, RCTL_T(KC_SLASH), KC_RSHIFT,
281                           KC_LEFT,    KC_DOWN,    KC_UP,      KC_RIGHT,       TT(SYMB),
282              KC_LALT,        CTL_T(KC_ESC),
283              KC_PGUP,
284              KC_PGDN,KC_DELETE, KC_ENT
285     ),
286 /* Keymap 0: Basic layer
287  *
288  * ,--------------------------------------------------.           ,--------------------------------------------------.
289  * |   =    |   1  |   2  |   3  |   4  |   5  | LEFT |           | RIGHT|   6  |   7  |   8  |   9  |   0  |   \    |
290  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
291  * | Del    |   '  |   ,  |   .  |   P  |   Y  |  L1  |           |  L1  |   F  |   G  |   C  |   R  |   L  |   /    |
292  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
293  * | BkSp   |   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   H  |   T  |   N  |S / L2|   -    |
294  * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
295  * | LShift |:/Ctrl|   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |Z/Ctrl| RShift |
296  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
297  *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  | ~L1  |
298  *   `----------------------------------'                                       `----------------------------------'
299  *                                        ,-------------.       ,-------------.
300  *                                        | App  | LGui |       | Alt  |Ctrl/Esc|
301  *                                 ,------|------|------|       |------+--------+------.
302  *                                 |      |      | Home |       | PgUp |        |      |
303  *                                 | Space|Backsp|------|       |------|  Tab   |Enter |
304  *                                 |      |ace   | End  |       | PgDn |        |      |
305  *                                 `--------------------'       `----------------------'
306  */
307 // If it accepts an argument (i.e, is a function), it doesn't need KC_.
308 // Otherwise, it needs KC_*
309 [DVORAK] = LAYOUT_ergodox(  
310         // left hand
311         KC_EQL,         KC_1,           KC_2,    KC_3,   KC_4,   KC_5,   TG(MOUS),
312         KC_TAB,        KC_QUOT,        KC_COMM, KC_DOT, KC_P,   KC_Y,   TG(DIABLO),
313         KC_BSPC,        KC_A,           KC_O,    KC_E,   KC_U,   KC_I,
314         KC_LSFT,        LCTL_T(KC_SCLN), KC_Q,    KC_J,   KC_K,   KC_X,   TG(OVERWATCH),
315         LT(SYMB,KC_GRV),KC_QUOT, KC_LGUI, KC_LBRACKET, KC_RBRACKET,
316                                               ALT_T(KC_APP),  KC_LEAD,
317                                                               KC_HOME,
318                                                KC_SPC,KC_BSPC,KC_END,
319         // right hand
320              TG(MOUS),     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,        KC_BSLS,
321              TG(DIABLO),   KC_F,   KC_G,   KC_C,   KC_R,   KC_L,        KC_SLSH,
322                            KC_D,   KC_H,   KC_T,   KC_N,   KC_S,        KC_MINS,
323              TG(OVERWATCH),KC_B,   KC_M,   KC_W,   KC_V,   RCTL_T(KC_Z), KC_RSHIFT,
324                                    KC_LEFT,KC_DOWN,KC_UP,  KC_RIGHT,    TT(SYMB),
325              KC_LALT,        CTL_T(KC_ESC),
326              KC_PGUP,
327              KC_PGDN,KC_DELETE, KC_ENT
328     ),
329 /* Keymap 0: Basic layer
330  *
331  * ,--------------------------------------------------.           ,--------------------------------------------------.
332  * |   =    |   1  |   2  |   3  |   4  |   5  | LEFT |           | RIGHT|   6  |   7  |   8  |   9  |   0  |   -    |
333  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
334  * | Del    |   Q  |   W  |   F  |   P  |   G  |  L1  |           |  L1  |   J  |   L  |   U  |   Y  |   ;  |   \    |
335  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
336  * | BkSp   |   A  |   R  |   S  |   T  |   D  |------|           |------|   H  |   N  |   E  |   I  |O / L2|   '    |
337  * |--------+------+------+------+------+------| OVER |           | Meh  |------+------+------+------+------+--------|
338  * | LShift |Z/Ctrl|   X  |   C  |   V  |   B  |      |           |      |   K  |   M  |   ,  |   .  |//Ctrl| RShift |
339  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
340  *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  | ~L1  |
341  *   `----------------------------------'                                       `----------------------------------'
342  *                                        ,-------------.       ,-------------.
343  *                                        | App  | LGui |       | Alt  |Ctrl/Esc|
344  *                                 ,------|------|------|       |------+--------+------.
345  *                                 |      |      | Home |       | PgUp |        |      |
346  *                                 | Space|Backsp|------|       |------|  Tab   |Enter |
347  *                                 |      |ace   | End  |       | PgDn |        |      |
348  *                                 `--------------------'       `----------------------'
349  */
350 // If it accepts an argument (i.e, is a function), it doesn't need KC_.
351 // Otherwise, it needs KC_*
352 [WORKMAN] = LAYOUT_ergodox(  
353         // left hand
354         KC_EQL,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   TG(MOUS),
355         KC_TAB,         KC_Q,         KC_D,   KC_R,   KC_W,   KC_B,   TG(DIABLO),
356         KC_BSPC,        KC_A,         KC_S,   KC_H,   KC_T,   KC_G,
357         KC_LSFT,        LCTL_T(KC_Z),  KC_X,   KC_M,   KC_C,   KC_V,   TG(OVERWATCH),
358         LT(SYMB,KC_GRV),KC_QUOT,      KC_LGUI,    KC_LBRACKET,KC_RBRACKET,
359                                               ALT_T(KC_APP),  KC_LEAD,
360                                                               KC_HOME,
361                                                KC_SPC,KC_BSPC,KC_END,
362         // right hand
363              TG(MOUS),    KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
364              TG(DIABLO),  KC_J,   KC_F,   KC_U,   KC_P,   KC_SCLN,          KC_BSLS,
365                           KC_Y,   KC_N,   KC_E,   KC_O,   KC_I,             KC_QUOTE,
366              TG(OVERWATCH),KC_K,  KC_L,   KC_COMM,KC_DOT, RCTL_T(KC_SLASH), KC_RSHIFT,
367                           KC_LEFT,    KC_DOWN,    KC_UP,      KC_RIGHT,       TT(SYMB),
368              KC_LALT,        CTL_T(KC_ESC),
369              KC_PGUP,
370              KC_PGDN,KC_DELETE, KC_ENT
371     ),
372
373     /* Keymap 3: Symbol Layer
374 *
375 * ,--------------------------------------------------.           ,--------------------------------------------------.
376 * |   ESC  |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  | F10  |   F11  |
377 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
378 * | VERSION|   !  |   @  |  {   |   }  |  |   |      |           |      |  +   |   7  |   8  |   9  |  *   |   F12  |
379 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
380 * |  MAKE  |   #  |   $  |  (   |   )  |  `   |------|           |------|  -   |   4  |   5  |   6  |  /   | PrtSc  |
381 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
382 * |  RESET |   %  |   ^  |  [   |   ]  |  ~   |      |           |      | NUM  |   1  |   2  |   3  |  =   |  PAUSE |
383 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
384 *   |  LT0 |   &  |   *  |  :   |   ;  |                                       |      |   0  | NUM. | ENT  |  ENT |
385 *   `----------------------------------'                                       `----------------------------------'
386 *                                        ,-------------.       ,-------------.
387 *                                        | RGBM | RED  |       | OFF  | SOLID|
388 *                                 ,------|------|------|       |------+------+------.
389 *                                 |      |      | GREEN|       |      |      |      |
390 *                                 | RGB  | RGB  |------|       |------| NUM0 | NUME |
391 *                                 | DARK |BRITE | BLUE |       |      |      |      |
392 *                                 `--------------------'       `--------------------'
393 */
394   [SYMB] = LAYOUT_ergodox(
395                 KC_ESCAPE,      KC_F1,      KC_F2,      KC_F3,      KC_F4,      KC_F5,      KC_WORKMAN,
396                 VRSN,           KC_EXLM,    KC_AT,      KC_LCBR,    KC_RCBR,    KC_PIPE,    KC_DVORAK,
397                 KC_MAKEQMK,     KC_HASH,    KC_DLR,     KC_LPRN,    KC_RPRN,    KC_GRAVE,
398                 KC_RESET,       KC_PERC,    KC_CIRC,    KC_LBRACKET,KC_RBRACKET,KC_TILD,    KC_COLEMAK,
399                 KC_TRNS,          KC_AMPR,    KC_ASTR,    KC_COLN,    KC_SCOLON,
400                                                                   KC_TRNS, KC_TRNS,
401                                                                   KC_TRNS,
402                                                                   KC_TRNS, KC_TRNS, KC_TRNS,
403                 
404                 KC_QWERTY,   KC_F6,      KC_F7,      KC_F8,      KC_F9,      KC_F10,         KC_F11,
405                 KC_DVORAK,   KC_KP_PLUS, KC_KP_7,    KC_KP_8,    KC_KP_9,    KC_KP_ASTERISK, KC_F12,
406                              KC_KP_MINUS,KC_KP_4,    KC_KP_5,    KC_KP_6,    KC_KP_SLASH,    KC_PSCREEN,
407                 KC_COLEMAK,  KC_NUMLOCK, KC_KP_1,    KC_KP_2,    KC_KP_3,    KC_EQUAL,       KC_PAUSE,
408                                          KC_KP_0,    KC_KP_0,    KC_KP_DOT,  KC_KP_ENTER,    KC_TRNS,
409                 RGB_TOG,    RGB_SLD,
410                 KC_NO,
411                 KC_KP_DOT, KC_KP_0, KC_KP_ENTER
412             ),
413
414 /* Keymap 4: Customized Overwatch Layout
415  *
416  * ,--------------------------------------------------.           ,--------------------------------------------------.
417  * |   ESC  |      |      |      |      |      |      |           |      |  F9  | F10  | F11  |  F12 |      |        |
418  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
419  * |   F1   |  K   |  Q   |  W   |  E   |  R   |  T   |           |      |      |      |      |      |      |        |
420  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
421  * |   TAB  |  G   |  A   |  S   |  D   |  F   |------|           |------|      |      |      |      |      |        |
422  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
423  * |  LCTR  | LSHFT|  Z   |  X   |  C   |  V   |      |           |      |   N  |  M   |      |      |      |        |
424  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
425  *   |   J  |  U   |  I   |  Y   |  T   |                                       |      |      |      |      |      |
426  *   `----------------------------------'                                       `----------------------------------'
427  *                                        ,-------------.       ,-------------.
428  *                                        |  O   |  P   |       |      |      |
429  *                                 ,------|------|------|       |------+------+------.
430  *                                 |      |      | LGUI |       |      |      |      |
431  *                                 |  V   | SPACE|------        |------|      | Enter|
432  *                                 |      |      |  H   |       |      |      |      |
433  *                                 `--------------------'       `--------------------'
434  */
435   [OVERWATCH] = LAYOUT_ergodox(
436                 KC_ESCAPE,      KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,    KC_TRNS,
437                 KC_F1,          KC_K,       KC_Q,       KC_W,       KC_E,       KC_R,       KC_T,
438                 KC_TAB,         KC_G,       KC_A,       KC_S,       KC_D,       KC_F,
439                 KC_LCTL,        KC_LSHIFT,  KC_Z,       KC_X,       KC_C,       KC_V,       KC_TRNS,
440                 KC_G,           KC_U,       KC_I,       KC_Y,       KC_T,
441                                             KC_O,   KC_P,
442                                                     KC_LGUI,
443                                 KC_V,   KC_SPACE,   KC_H,
444                                     
445                 KC_TRNS,        KC_F9,      KC_F10,     KC_F11,     KC_F12,     KC_NO,      KC_NO,
446                 KC_NO,          KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,
447                                 KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,
448                 TG(OVERWATCH),  KC_N,       KC_M,       KC_NO,      KC_NO,      KC_NO,      KC_NO,
449                                             KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,
450                 KC_NO,          KC_NO,
451                 KC_NO,
452                 KC_PGDOWN,      KC_DELETE, KC_ENTER
453             ),
454
455 /* Keymap 3:
456  *
457  * ,--------------------------------------------------.           ,--------------------------------------------------.
458  * |   ESC  |  V   |  D   | ALT  |      |      |      |           |      |      |      |      |      |      |        |
459  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
460  * |   TAB  |  S   |  I   |  F   |  M   |  T   |      |           |      |      |      |      |      |      |        |
461  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
462  * |    Q   |  1   |  2   |  3   |  4   |  G   |------|           |------|      |      |      |      |      |        |
463  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
464  * | NUMLOCK| NUM1 | NUM2 | NUM3 | NUM4 |  Z   |      |           |      |      |      |      |      |      |        |
465  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
466  *   | LCTL | MAC1 | MAC2 | MAC3 | MAC4 |                                       |      |      |      |      |      |
467  *   `----------------------------------'                                       `----------------------------------'
468  *                                        ,-------------.       ,-------------.
469  *                                        |   L  |  J   |       |      |      |
470  *                                 ,------|------|------|       |------+------+------.
471  *                                 |      |      |  G   |       |      |      |      |
472  *                                 | SPACE|  Q   |------        |------|      |      |
473  *                                 | SHIFT| ALT  | 0MAC |       |      |      |      |
474  *                                 `--------------------'       `--------------------'
475  */
476   [DIABLO] = LAYOUT_ergodox(
477                 KC_ESCAPE,  KC_V,       KC_D,       KC_LALT,    KC_NO,      KC_NO,      KC_NO,
478                 KC_TAB,     KC_S,       KC_F,       KC_I,       KC_M,       KC_T,       KC_TRNS,
479                 KC_Q,       KC_1,       KC_2,       KC_3,       KC_4,       KC_G,
480                 KC_LCTL, TD(TD_DIABLO_1), TD(TD_DIABLO_2), TD(TD_DIABLO_3), TD(TD_DIABLO_4), KC_Z,       KC_NO,
481                 KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,
482                                                 KC_L,   KC_J,
483                                                         KC_F,
484                     SFT_T(KC_SPACE),    ALT_T(KC_Q),    KC_DIABLO_CLEAR,
485                                     
486                                     
487                                     
488                 KC_TRNS,        KC_F9,      KC_F10,     KC_F11,     KC_F12,     KC_NO,      KC_NO,
489                 KC_TRNS,        KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,
490                                 KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,
491                 KC_NO,          KC_N,       KC_M,       KC_NO,      KC_NO,      KC_NO,      KC_NO,
492                                             KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,
493                 KC_NO,          KC_NO,
494                 KC_NO,
495                 KC_PGDOWN,      KC_DELETE, KC_ENTER
496             ),
497
498 /* Keymap 4: Media and mouse keys
499  *
500  * ,--------------------------------------------------.           ,--------------------------------------------------.
501  * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
502  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
503  * |        |      | MsUp |      |      |      |      |           |      |      |      |      |      |      |        |
504  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
505  * |        |MsLeft|MsDown|MsRght|      |      |------|           |------|      |      | Acc0 | Acc1 | Acc2 |        |
506  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
507  * |        | Acc0 | Acc1 | Acc2 |      |      |      |           |      |      | Mute |VolDn |VolUp |      |        |
508  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
509  *   |      |      |      |      |      |                                       | Play | Stop |      |      |      |
510  *   `----------------------------------'                                       `----------------------------------'
511  *                                        ,-------------.       ,-------------.
512  *                                        |      |      |       |      |      |
513  *                                 ,------|------|------|       |------+------+------.
514  *                                 |      |      | MWUp |       |      |      |      |
515  *                                 | Lclk | Rclk |------|       |------| MBn4 | MBn5 |
516  *                                 |      |      | MWDn |       | Mclk |      |      |
517  *                                 `--------------------'       `--------------------'
518  */
519   [MOUS] = LAYOUT_ergodox(
520                 KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_TRNS,
521                 KC_NO,      KC_NO,      KC_MS_U,    KC_NO,      KC_NO,      KC_NO,      KC_TRNS,
522                 KC_NO,      KC_MS_L,    KC_MS_D,    KC_MS_R,    KC_NO,      KC_NO,
523                 KC_NO,      KC_ACL0,    KC_ACL1,    KC_ACL2,    KC_NO,      KC_NO,      KC_TRNS,
524                 KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,
525                                                                             KC_NO,      KC_NO,
526                                                                                         KC_WH_U,
527                                                                 KC_BTN1,    KC_BTN2,    KC_WH_D,
528                 
529                 KC_TRNS,    KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,
530                 KC_TRNS,    KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,
531                             KC_NO,      KC_ACL0,    KC_ACL1,    KC_ACL2,    KC_NO,      KC_NO,
532                 KC_TRNS,    KC_NO,      KC_MUTE,    KC_VOLD,    KC_VOLU,    KC_NO,      KC_NO,
533                                         KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_NO,
534                 KC_NO,KC_NO,
535                 KC_NO,
536                 KC_MS_BTN3,KC_MS_BTN4,KC_MS_BTN5
537             ),
538
539 };
540
541
542 void persistent_default_layer_set(uint16_t default_layer) {
543   eeconfig_update_default_layer(default_layer);
544   default_layer_set(default_layer);
545 }
546
547
548 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
549 #ifdef CONSOLE_ENABLE
550   xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed);
551 #endif
552   switch (keycode) {
553     // dynamically generate these.
554   case EPRM:
555     if (record->event.pressed) {
556       eeconfig_init();
557     }
558     return false;
559     break;
560   case VRSN:
561     if (record->event.pressed) {
562       SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
563     }
564     return false;
565     break;
566   case RGB_SLD:
567     if (record->event.pressed) {
568 #ifdef RGBLIGHT_ENABLE
569       rgblight_mode(1);
570 #endif
571     }
572     return false;
573     break;
574
575   case RGB_0000FF:
576     if (record->event.pressed) {
577 #ifdef RGBLIGHT_ENABLE
578       rgblight_enable();
579       rgblight_mode(1);
580       rgblight_setrgb(0x00, 0x00, 0xff);
581 #endif
582     }
583     return false;
584     break;
585
586   case RGB_008000:
587     if (record->event.pressed) {
588 #ifdef RGBLIGHT_ENABLE
589       rgblight_enable();
590       rgblight_mode(1);
591       rgblight_setrgb(0x00, 0x80, 0x00);
592 #endif
593     }
594     return false;
595     break;
596
597   case RGB_FF0000:
598     if (record->event.pressed) {
599 #ifdef RGBLIGHT_ENABLE
600       rgblight_enable();
601       rgblight_mode(1);
602       rgblight_setrgb(0xff, 0x00, 0x00);
603 #endif
604     }
605     return false;
606     break;
607
608   case RGB_800080:
609     if (record->event.pressed) {
610 #ifdef RGBLIGHT_ENABLE
611       rgblight_enable();
612       rgblight_mode(1);
613       rgblight_setrgb(0x80, 0x00, 0x80);
614 #endif
615     }
616     return false;
617     break;
618
619   case RGB_00FF90:
620     if (record->event.pressed) {
621 #ifdef RGBLIGHT_ENABLE
622       rgblight_enable();
623       rgblight_mode(1);
624       rgblight_setrgb(0x00, 0xff, 0x90);
625 #endif
626     }
627     return false;
628     break;
629   case KC_DIABLO_CLEAR:  // reset all Diable timers, disabling them
630     if (record->event.pressed) {
631       uint8_t dtime;
632
633       for (dtime = 0; dtime < 4; dtime++) {
634         diablo_key_time[dtime] = diablo_times[0];
635       }
636     }
637     return false;
638     break;
639   case KC_QWERTY:
640     if (record->event.pressed) {
641       persistent_default_layer_set(1UL << QWERTY);
642     }
643     return false;
644     break;
645   case KC_COLEMAK:
646     if (record->event.pressed) {
647       persistent_default_layer_set(1UL << COLEMAK);
648     }
649     return false;
650     break;
651   case KC_DVORAK:
652     if (record->event.pressed) {
653       persistent_default_layer_set(1UL << DVORAK);
654     }
655     return false;
656     break;
657   case KC_WORKMAN:
658     if (record->event.pressed) {
659       persistent_default_layer_set(1UL << WORKMAN);
660     }
661     return false;
662     break;
663   case KC_MAKEQMK:
664     if (!record->event.pressed) {
665       SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP ":teensy"SS_TAP(X_ENTER));
666     }
667     return false;
668     break;
669   case KC_RESET:
670     if (!record->event.pressed) {
671 #ifdef RGBLIGHT_ENABLE
672       rgblight_enable();
673       rgblight_mode(1);
674       rgblight_setrgb(0xff, 0x00, 0x00);
675 #endif
676       reset_keyboard();
677     }
678     return false;
679     break;
680
681   }
682   return true;
683 }
684
685 #ifdef TAP_DANCE_ENABLE
686
687 // Sends the key press to system, but only if on the Diablo layer
688 void send_diablo_keystroke(uint8_t diablo_key) {
689   if (biton32(layer_state) == DIABLO) {
690     switch (diablo_key) {
691     case 0:
692       SEND_STRING("1");
693       break;
694     case 1:
695       SEND_STRING("2");
696       break;
697     case 2:
698       SEND_STRING("3");
699       break;
700     case 3:
701       SEND_STRING("4");
702       break;
703     }
704   }
705 }
706
707 // Checks each of the 4 timers/keys to see if enough time has elapsed
708 // Runs the "send string" command if enough time has passed, and resets the timer.
709 void run_diablo_macro_check(void) {
710   uint8_t dtime;
711
712   for (dtime = 0; dtime < 4; dtime++) {
713     if (check_dtimer(dtime) && diablo_key_time[dtime]) {
714       diablo_timer[dtime] = timer_read();
715       send_diablo_keystroke(dtime);
716     }
717   }
718
719 }
720
721 #endif
722
723
724 void matrix_init_user(void) { // Runs boot tasks for keyboard
725 #ifdef RGBLIGHT_ENABLE
726   uint8_t default_layer = eeconfig_read_default_layer();
727
728   rgblight_enable();
729   if (default_layer & (1UL << COLEMAK)) {
730     rgblight_set_magenta;
731   }
732   else if (default_layer & (1UL << DVORAK)) {
733     rgblight_set_green;
734   }
735   else if (default_layer & (1UL << WORKMAN)) {
736     rgblight_set_purple;
737   }
738   else {
739     rgblight_set_teal;
740   }
741 #endif
742 };
743
744
745 void matrix_scan_user(void) {  // runs frequently to update info
746   uint8_t modifiders = get_mods();
747
748   if (!skip_leds) {
749     ergodox_board_led_off();
750     ergodox_right_led_1_off();
751     ergodox_right_led_2_off();
752     ergodox_right_led_3_off();
753
754     // Since we're not using the LEDs here for layer indication anymore,
755     // then lets use them for modifier indicators.  Shame we don't have 4...
756     // Also, no "else", since we want to know each, independantly. 
757     if (modifiders & MODS_SHIFT_MASK) {
758       ergodox_right_led_2_on();
759     }
760     if (modifiders & MODS_CTRL_MASK) {
761       ergodox_right_led_1_on();
762     }
763     if (modifiders & MODS_ALT_MASK) {
764       ergodox_right_led_3_on();
765     }
766
767   }
768
769   // Run Diablo 3 macro checking code.
770 #ifdef TAP_DANCE_ENABLE
771   run_diablo_macro_check();
772 #endif
773 };
774
775 uint32_t layer_state_set_kb(uint32_t state) {
776 #ifdef RGBLIGHT_ENABLE
777   uint8_t default_layer = eeconfig_read_default_layer();
778
779   switch (biton32(state)) {
780   case SYMB:
781     rgblight_set_blue;
782     rgblight_mode(2);
783     break;
784   case OVERWATCH:
785     rgblight_set_orange;
786     rgblight_mode(17);
787     break;
788   case DIABLO:
789     rgblight_set_red;
790     rgblight_mode(5);
791     break;
792   case MOUS:
793     rgblight_set_yellow;
794     rgblight_mode(1);
795     break;
796   default:
797     if (default_layer & (1UL << COLEMAK)) {
798       rgblight_set_magenta;
799     }
800     else if (default_layer & (1UL << DVORAK)) {
801       rgblight_set_green;
802     }
803     else if (default_layer & (1UL << WORKMAN)) {
804       rgblight_set_purple;
805     }
806     else {
807       rgblight_set_teal;
808     }
809     rgblight_mode(1);
810     break;
811   }
812 #endif
813   return state;
814 }