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