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