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