]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/viterbi/keymaps/drashna/keymap.c
Updated personal keymaps (#1945)
[qmk_firmware.git] / keyboards / viterbi / keymaps / drashna / keymap.c
1 #include "viterbi.h"
2 #include "action_layer.h"
3 #include "eeconfig.h"
4
5 extern keymap_config_t keymap_config;
6
7 // Each layer gets a name for readability, which is then used in the keymap matrix below.
8 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
9 // Layer names don't all need to be of the same length, obviously, and you can also skip them
10 // entirely and just use numbers.
11 #define _NUMNAV   0
12 #define _DIABLO   1
13 #define _GAMEPAD  2
14 #define _MACROS   3
15 #define _MEDIA    4
16 #define _COVECUBE 5
17
18
19 enum custom_keycodes {
20     KC_DIABLO_CLEAR = SAFE_RANGE,
21     KC_P00,
22     KC_MAKE,
23     KC_OVERWATCH,
24     KC_SALT,
25     KC_MORESALT,
26     KC_SALTHARD,
27     KC_GOODGAME,
28     KC_SYMM,
29     KC_DOOMFIST,
30     KC_JUSTGAME,
31     KC_GLHF,
32     KC_TORB,
33     KC_AIM
34 };
35
36 // Fillers to make layering more clear
37 #define _______ KC_TRNS
38 #define XXXXXXX KC_NO
39 #define MACROS   TG(_MACROS)
40 #define DIABLO   TG(_DIABLO)
41 #define GAMEPAD  TG(_GAMEPAD)
42 #define MEDIA    TG(_MEDIA)
43 #define COVECUBE TG(_COVECUBE)
44
45
46 bool is_overwatch = false;
47
48
49 #ifdef RGBLIGHT_ENABLE
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_yellow      rgblight_sethsv (0x3C,  0xFF, 0xFF);
57 #define rgblight_set_purple      rgblight_sethsv (0x10E, 0xFF, 0xFF);
58 #endif
59
60 #ifdef TAP_DANCE_ENABLE
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
67 bool check_dtimer(uint8_t dtimer) {
68     // has the correct number of seconds elapsed (as defined by diablo_times)
69     return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true;
70 };
71
72
73 enum {
74     TD_DIABLO_1 = 0,
75     TD_DIABLO_2,
76     TD_DIABLO_3,
77     TD_DIABLO_4
78 };
79
80
81 // Cycle through the times for the macro, starting at 0, for disabled.
82 // Max of six values, so don't exceed
83 void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) {
84     if (state->count >= 7) {
85         diablo_key_time[diablo_key] = diablo_times[0];
86         reset_tap_dance(state);
87     }
88     else {
89         diablo_key_time[diablo_key] = diablo_times[state->count - 1];
90     }
91 }
92
93
94 // Would rather have one function for all of this, but no idea how to do that...
95 void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) {
96     diablo_tapdance_master(state, user_data, 0);
97 }
98
99 void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) {
100     diablo_tapdance_master(state, user_data, 1);
101 }
102
103 void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) {
104     diablo_tapdance_master(state, user_data, 2);
105 }
106
107 void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) {
108     diablo_tapdance_master(state, user_data, 3);
109 }
110
111
112
113 //Tap Dance Definitions
114 qk_tap_dance_action_t tap_dance_actions[] = {
115     // tap once to disable, and more to enable timed micros
116     [TD_DIABLO_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1),
117     [TD_DIABLO_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2),
118     [TD_DIABLO_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3),
119     [TD_DIABLO_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
120
121 };
122 #endif
123
124
125 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
126
127   [_NUMNAV] = KEYMAP(
128       MACROS,  DIABLO,  GAMEPAD, KC_NLCK, KC_SLCK, KC_COLN, KC_PSLS,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
129       MEDIA,   KC_CALC, COVECUBE,KC_P7,   KC_P8,   KC_P9,   KC_PAST,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
130       KC_HOME, KC_DEL,  KC_PGUP, KC_P4,   KC_P5,   KC_P6,   KC_PMNS,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
131       KC_END,  KC_UP,   KC_PGDN, KC_P1,   KC_P2,   KC_P3,   KC_PPLS,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
132       KC_LEFT, KC_DOWN, KC_RGHT, KC_P0,   KC_P00,  KC_PDOT, KC_PENT,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
133   ),
134
135   [_DIABLO] = KEYMAP(
136       KC_ESC,  DIABLO,  KC_V,    KC_D,    XXXXXXX, XXXXXXX, KC_L,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
137       KC_TAB,  KC_S,    KC_F,    KC_I,    KC_M,    KC_T,    KC_J,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
138       KC_Q,    KC_1,    KC_2,    KC_3,    KC_4,    KC_G,    KC_F,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
139       KC_LCTL, (TD_DIABLO_1), TD(TD_DIABLO_2), TD(TD_DIABLO_3), TD(TD_DIABLO_4), KC_Z, KC_DIABLO_CLEAR,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
140       KC_LALT, KC_F4,   KC_F5,   KC_F8,   KC_F9,   KC_F10,  SFT_T(KC_SPACE),          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
141   ),
142  
143   [_GAMEPAD] = KEYMAP(  // Game pad layout designed primarily for Overwatch
144       MACROS,  KC_ESC,  GAMEPAD, KC_1,    KC_2,    KC_3,    KC_4,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
145       MEDIA,   KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
146       KC_Z,    KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
147       KC_Y,    KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
148       KC_F1,   KC_U,    KC_I,    KC_Y,    KC_V,    KC_SPC,  KC_V,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
149   ),
150
151   [_MACROS] = KEYMAP(
152       MACROS,      XXXXXXX,     GAMEPAD,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
153       XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
154       KC_SYMM,     KC_TORB,     KC_DOOMFIST, XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
155       KC_GLHF,     KC_GOODGAME, XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
156       KC_SALT,     KC_MORESALT, KC_SALTHARD, KC_JUSTGAME, KC_AIM,      XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
157   ),
158
159   [_COVECUBE] = KEYMAP(
160       COVECUBE,    XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
161       XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
162       XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
163       XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
164       XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
165   ),
166
167   [_MEDIA] = KEYMAP(
168       RESET,   KC_MAKE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
169       MEDIA,   XXXXXXX, RGB_SAI, RGB_VAI, RGB_M_P, RGB_M_B, RGB_M_R,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
170       RGB_TOG, RGB_MOD, RGB_SAD, RGB_VAD, RGB_M_SW,RGB_M_SN,RGB_M_K,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
171       KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, RGB_M_K, RGB_M_X, RGB_M_G,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
172       KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
173   )
174
175
176 };
177
178
179
180 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
181     uint16_t kc;
182     if (is_overwatch) { 
183         kc = KC_BSPC;  
184     }
185     else {
186         kc = KC_ENTER;
187     }
188     // Once a delay command is added to "SEND_STRING", 
189     // replace these with X_BSPC and X_ENTER instead. 
190     // and add "SS_TAP(kc) SS_DELAY(50)" to all of the
191     // SEND_STRING commands, to compress things. 
192     switch (keycode) {
193 #ifdef TAP_DANCE_ENABLE
194     case KC_DIABLO_CLEAR:  // reset all Diable timers, disabling them
195         if (record->event.pressed) {
196             uint8_t dtime;
197
198             for (dtime = 0; dtime < 4; dtime++) {
199                 diablo_key_time[dtime] = diablo_times[0];
200             }
201         }
202         return false;
203         break;
204 #endif
205     case KC_P00:
206         if (!record->event.pressed) {
207             register_code(KC_P0);
208             unregister_code(KC_P0);
209             register_code(KC_P0);
210             unregister_code(KC_P0);
211         }
212         return false;
213         break;
214     case KC_MAKE:
215         if (!record->event.pressed) {
216             SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP SS_TAP(X_ENTER));
217         }
218         return false;
219         break;
220     case KC_OVERWATCH:  // reset all Diable timers, disabling them
221         if (record->event.pressed) {
222             is_overwatch = !is_overwatch;
223         }
224 #ifdef RGBLIGHT_ENABLE
225         is_overwatch ? rgblight_mode(17) : rgblight_mode(18);
226 #endif
227         return false;
228         break;
229     case KC_SALT:
230         if (!record->event.pressed) {
231             register_code(kc);
232             unregister_code(kc);
233             _delay_ms(50);
234             SEND_STRING("Salt, salt, salt..." SS_TAP(X_ENTER));
235         }
236         return false;
237         break;
238     case KC_MORESALT:
239         if (!record->event.pressed) {
240             register_code(kc);
241             unregister_code(kc);
242             _delay_ms(50);
243             SEND_STRING("Please sir, can I have some more salt?!" SS_TAP(X_ENTER));
244         }
245         return false;
246         break;
247     case KC_SALTHARD:
248         if (!record->event.pressed) {
249             register_code(kc);
250             unregister_code(kc);
251             _delay_ms(50);
252             SEND_STRING("Your salt only makes my penis that much harder, and even more aggressive!" SS_TAP(X_ENTER));
253         }
254         return false;
255         break;
256     case KC_GOODGAME:
257         if (!record->event.pressed) {
258             register_code(kc);
259             unregister_code(kc);
260             _delay_ms(50);
261             SEND_STRING("Good game, everyone!" SS_TAP(X_ENTER));
262         }
263         return false;
264         break;
265     case KC_GLHF:
266         if (!record->event.pressed) {
267             register_code(kc);
268             unregister_code(kc);
269             _delay_ms(50);
270             SEND_STRING("Good luck, have fun!!!" SS_TAP(X_ENTER));
271         }
272         return false;
273         break;
274     case KC_SYMM:
275         if (!record->event.pressed) {
276             register_code(kc);
277             unregister_code(kc);
278             _delay_ms(50);
279             SEND_STRING("Left click to win!" SS_TAP(X_ENTER));
280         }
281         return false;
282         break;
283     case KC_JUSTGAME:
284
285         if (!record->event.pressed) {
286             register_code(kc);
287             unregister_code(kc);
288             _delay_ms(50);
289             SEND_STRING("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games." SS_TAP(X_ENTER));
290         }
291         return false;
292         break;
293     case KC_TORB:
294
295         if (!record->event.pressed) {
296             register_code(kc);
297             unregister_code(kc);
298             _delay_ms(50);
299             SEND_STRING("That was positively riveting! SS_TAP(X_ENTER)");
300         }
301         return false;
302         break;
303     case KC_AIM:
304
305         if (!record->event.pressed) {
306             register_code(kc);
307             unregister_code(kc);
308             _delay_ms(50);
309             SEND_STRING("That aim is absolutely amazing. It's almost like you're a machine!" SS_TAP(X_ENTER));
310             _delay_ms(50);
311             SEND_STRING("Wait! That aim is TOO good!  You're clearly using an aim hack! CHEATER!" SS_TAP(X_ENTER));
312         }
313         return false;
314         break;
315
316
317     }
318     return true;
319 }
320
321 #ifdef TAP_DANCE_ENABLE
322
323 // Sends the key press to system, but only if on the Diablo layer
324 void send_diablo_keystroke(uint8_t diablo_key) {
325     if (biton32(layer_state) == _DIABLO) {
326         switch (diablo_key) {
327         case 0:
328             SEND_STRING("1");
329             break;
330         case 1:
331             SEND_STRING("2");
332             break;
333         case 2:
334             SEND_STRING("3");
335             break;
336         case 3:
337             SEND_STRING("4");
338             break;
339         }
340     }
341 }
342
343 // Checks each of the 4 timers/keys to see if enough time has elapsed
344 // Runs the "send string" command if enough time has passed, and resets the timer.
345 void run_diablo_macro_check(void) {
346     uint8_t dtime;
347
348     for (dtime = 0; dtime < 4; dtime++) {
349         if (check_dtimer(dtime) && diablo_key_time[dtime]) {
350             diablo_timer[dtime] = timer_read();
351             send_diablo_keystroke(dtime);
352         }
353     }
354
355 }
356 #endif
357
358
359 void matrix_init_user(void) { // Runs boot tasks for keyboard
360 #ifdef RGBLIGHT_ENABLE
361     rgblight_enable();
362     rgblight_set_teal;
363     rgblight_mode(1);
364 #endif
365 };
366
367
368 void matrix_scan_user(void) {  // runs frequently to update info
369 #ifdef TAP_DANCE_ENABLE
370     // Run Diablo 3 macro checking code.
371     run_diablo_macro_check();
372 #endif
373 };
374
375
376 uint32_t layer_state_set_kb(uint32_t state) {
377 #ifdef RGBLIGHT_ENABLE
378     rgblight_enable();
379     switch (biton32(state)) {
380     case _NUMNAV:
381         rgblight_set_teal;
382         rgblight_mode(2);
383         break;
384     case _MACROS:
385         rgblight_set_orange;
386         is_overwatch ? rgblight_mode(17) : rgblight_mode(18);
387         break;
388     case _DIABLO:
389         rgblight_set_red;
390         rgblight_mode(5);
391         break;
392     case _GAMEPAD:
393         rgblight_set_yellow;
394         rgblight_mode(1);
395         break;
396     case _MEDIA:
397         rgblight_set_blue;
398         rgblight_mode(1);
399         break;
400     case _COVECUBE:
401         rgblight_set_green;
402         rgblight_mode(2);
403     }
404 #endif
405     return state;
406 }