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