]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/viterbi/keymaps/drashna/keymap.c
e227b472f8c8411c39c4542883143574f341eb19
[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 _MACROS   2
14 #define _GAMEPAD  3
15 #define _MEDIA    4
16
17
18 enum custom_keycodes {
19     KC_DIABLO_CLEAR = SAFE_RANGE,
20     KC_P00,
21     KC_OVERWATCH,
22     KC_SALT,
23     KC_MORESALT,
24     KC_SALTHARD,
25     KC_GOODGAME,
26     KC_SYMM,
27     KC_DOOMFIST,
28     KC_JUSTGAME,
29     KC_GLHF,
30     KC_TORB
31 };
32
33 // Fillers to make layering more clear
34 #define _______ KC_TRNS
35 #define XXXXXXX KC_NO
36 #define MACROS  TG(_MACROS)
37 #define DIABLO  TG(_DIABLO)
38 #define GAMEPAD TG(_GAMEPAD)
39 #define MEDIA   TG(_MEDIA)
40
41
42 bool is_overwatch = false;
43
44 //This is both for underglow, and Diablo 3 macros
45 static uint8_t current_layer = 0;
46 bool has_layer_changed = true;
47
48
49 #define rgblight_set_blue     rgblight_sethsv (0xFF, 0xFF, 0xFF);
50 #define rgblight_set_red      rgblight_sethsv(0x00, 0xFF, 0xFF);
51 #define rgblight_set_green    rgblight_sethsv (0x78, 0xFF, 0xFF);
52 #define rgblight_set_orange   rgblight_sethsv (0x1E, 0xFF, 0xFF);
53 #define rgblight_set_teal     rgblight_sethsv (0xC3, 0xFF, 0xFF);
54 #define rgblight_set_magenta  rgblight_sethsv (0x12C, 0xFF, 0xFF);
55 #define rgblight_set_urine    rgblight_sethsv (0x3C, 0xFF, 0xFF);
56 #define rgblight_set_purple   rgblight_sethsv (0x10E, 0xFF, 0xFF);
57
58 #ifdef TAP_DANCE_ENABLE
59 //define diablo macro timer variables
60 static uint16_t diablo_timer[4];
61 static uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
62 static uint8_t diablo_key_time[4];
63
64
65 bool check_dtimer(uint8_t dtimer) {
66     // has the correct number of seconds elapsed (as defined by diablo_times)
67     return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true;
68 };
69
70
71 enum {
72     TD_DIABLO_1 = 0,
73     TD_DIABLO_2,
74     TD_DIABLO_3,
75     TD_DIABLO_4
76 };
77
78
79 // Cycle through the times for the macro, starting at 0, for disabled.
80 // Max of six values, so don't exceed
81 void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) {
82     if (state->count >= 7) {
83         diablo_key_time[diablo_key] = diablo_times[0];
84         reset_tap_dance(state);
85     }
86     else {
87         diablo_key_time[diablo_key] = diablo_times[state->count - 1];
88     }
89 }
90
91
92 // Would rather have one function for all of this, but no idea how to do that...
93 void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) {
94     diablo_tapdance_master(state, user_data, 0);
95 }
96
97 void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) {
98     diablo_tapdance_master(state, user_data, 1);
99 }
100
101 void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) {
102     diablo_tapdance_master(state, user_data, 2);
103 }
104
105 void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) {
106     diablo_tapdance_master(state, user_data, 3);
107 }
108
109
110
111 //Tap Dance Definitions
112 qk_tap_dance_action_t tap_dance_actions[] = {
113     // tap once to disable, and more to enable timed micros
114     [TD_DIABLO_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1),
115     [TD_DIABLO_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2),
116     [TD_DIABLO_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3),
117     [TD_DIABLO_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
118
119 };
120 #endif
121
122
123 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
124
125 /* QWERTY
126  * ,------------------------------------------------.      ,------------------------------------------------.
127  * |  Ins |   `  |   1  |   2  |   3  |   4  |   5  |      |   6  |   7  |   8  |   9  |   0  | Bksp | Del  |
128  * |------+------+------+------+------+------+------|      |------+------+------+------+------+------+------|
129  * |   -  | Tab  |   Q  |   W  |   E  |   R  |   T  |      |   Y  |   U  |   I  |   O  |   P  |   [  |   ]  |
130  * |------+------+------+------+------+------+------|      |------+------+------+------+------+------+------|
131  * |   =  | Esc  |   A  |   S  |   D  |   F  |   G  |      |   H  |   J  |   K  |   L  |   ;  |   "  |Enter |
132  * |------+------+------+------+------+------+------|      |------+------+------+------+------+------+------|
133  * | Pg Up| Shift|   Z  |   X  |   C  |   V  |   B  |      |   N  |   M  |   ,  |   .  |   /  | Home | End  |
134  * |------+------+------+------+------+------+------|      |------+------+------+------+------+------+------|
135  * | Pg Dn|Adjust| Ctrl | Alt  | GUI  |Lower |Space |      |Space |Raise | Left | Down |  Up  | Right|   \  |
136  * `------------------------------------------------'      `------------------------------------------------'
137  */
138   [_NUMNAV] = KEYMAP(
139       MACROS,  DIABLO,  GAMEPAD, KC_NLCK, KC_SCLK, KC_PTSC, KC_PSLS,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
140       MEDIA,   XXXXXXX, XXXXXXX, KC_P7,   KC_P8,   KC_P9,   KC_PAST,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
141       KC_HOME, KC_DEL,  KC_PGUP, KC_P4,   KC_P5,   KC_P6,   KC_PMNS,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
142       KC_END,  KC_UP,   KC_PGDN, KC_P1,   KC_P2,   KC_P3,   KC_PPLS,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
143       KC_LEFT, KC_DOWN, KC_RGHT, KC_P0,   KC_P00,  KC_PDOT, KC_PENT,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
144   ),
145
146 /* Lower
147  * ,------------------------------------------------.      ,------------------------------------------------.
148  * |      |   ~  |  F1  |  F3  |  F3  |  F4  |  F5  |      |  F6  |  F7  |  F8  |  F9  | F10  | F11  | F12  |
149  * |------+------+------+------+------+------+------|      |------+------+------+------+------+------+------|
150  * |   _  |      |   !  |   @  |   #  |   $  |   %  |      |   ^  |   &  |   *  |   (  |   )  |   {  |   }  |
151  * |------+------+------+------+------+------+------|      |------+------+------+------+------+------+------|
152  * |   +  |      |  F1  |  F2  |  F3  |  F4  |  F5  |      |  F6  |   _  |   +  |   {  |   }  |      |      |
153  * |------+------+------+------+------+------+------|      |------+------+------+------+------+------+------|
154  * |      |      |  F7  |  F8  |  F9  |  F10 |  F11 |      |  F12 |      |      |      |      |      |      |
155  * |------+------+------+------+------+------+------|      |------+------+------+------+------+------+------|
156  * |      |      |      |      |      |      |      |      |      |      | Next | Vol- | Vol+ | Play |      |
157  * `------------------------------------------------'      `------------------------------------------------'
158  */
159   [_DIABLO] = KEYMAP(
160       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
161       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
162       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
163       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
164       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
165   ),
166
167  
168   [_MACROS] = KEYMAP(
169       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
170       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
171       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
172       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
173       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
174   ),
175
176   [_MEDIA] = KEYMAP(
177       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
178       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
179       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
180       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
181       _______, _______, _______, _______, _______, _______, _______,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
182   )
183
184 };
185
186
187
188 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
189     uint16_t kc;
190     if (is_overwatch) {
191         kc = KC_BSPC;
192     }
193     else {
194         kc = KC_ENTER;
195     }
196     switch (keycode) {
197 #ifdef TAP_DANCE_ENABLE
198     case KC_DIABLO_CLEAR:  // reset all Diable timers, disabling them
199         if (record->event.pressed) {
200             uint8_t dtime;
201
202             for (dtime = 0; dtime < 4; dtime++) {
203                 diablo_key_time[dtime] = diablo_times[0];
204             }
205         }
206         return false;
207         break;
208 #endif
209     case KC_P00:
210         if (!record->event.pressed) {
211             register_code(KC_P0);
212             unregister_code(KC_P0);
213             register_code(KC_P0);
214             unregister_code(KC_P0);
215         }
216         return false;
217         break;
218     case KC_OVERWATCH:  // reset all Diable timers, disabling them
219         if (record->event.pressed) {
220             is_overwatch = !is_overwatch;
221             has_layer_changed = true;
222         }
223         return false;
224         break;
225     case KC_SALT:
226         if (!record->event.pressed) {
227             register_code(kc);
228             unregister_code(kc);
229             _delay_ms(50);
230             SEND_STRING("Salt, salt, salt...");
231             register_code(KC_ENTER);
232             unregister_code(KC_ENTER);
233         }
234         return false;
235         break;
236     case KC_MORESALT:
237         if (!record->event.pressed) {
238             register_code(kc);
239             unregister_code(kc);
240             _delay_ms(50);
241             SEND_STRING("Please sir, can I have some more salt?!");
242             register_code(KC_ENTER);
243             unregister_code(KC_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!");
253             register_code(KC_ENTER);
254             unregister_code(KC_ENTER);
255         }
256         return false;
257         break;
258     case KC_GOODGAME:
259         if (!record->event.pressed) {
260             register_code(kc);
261             unregister_code(kc);
262             _delay_ms(50);
263             SEND_STRING("Good game, everyone!");
264             register_code(KC_ENTER);
265             unregister_code(KC_ENTER);
266         }
267         return false;
268         break;
269     case KC_GLHF:
270         if (!record->event.pressed) {
271             register_code(kc);
272             unregister_code(kc);
273             _delay_ms(50);
274             SEND_STRING("Good luck, have fun!!!");
275             register_code(KC_ENTER);
276             unregister_code(KC_ENTER);
277         }
278         return false;
279         break;
280     case KC_SYMM:
281         if (!record->event.pressed) {
282             register_code(kc);
283             unregister_code(kc);
284             _delay_ms(50);
285             SEND_STRING("Left click to win!");
286             register_code(KC_ENTER);
287             unregister_code(KC_ENTER);
288         }
289         return false;
290         break;
291     case KC_DOOMFIST:
292         if (!record->event.pressed) {
293             register_code(kc);
294             unregister_code(kc);
295             _delay_ms(50);
296             SEND_STRING("Hey, look at me.  I'm Doomfist, and I'm overpowered!  All I do is spam punches all day!   I'm DPS, tank and defense, rolled into one! All I need is team healing to be complete!");
297             register_code(KC_ENTER);
298             unregister_code(KC_ENTER);
299         }
300         return false;
301         break;
302     case KC_JUSTGAME:
303
304         if (!record->event.pressed) {
305             register_code(kc);
306             unregister_code(kc);
307             _delay_ms(50);
308             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.");
309             register_code(KC_ENTER);
310             unregister_code(KC_ENTER);
311         }
312         return false;
313         break;
314     case KC_TORB:
315
316         if (!record->event.pressed) {
317             register_code(kc);
318             unregister_code(kc);
319             _delay_ms(50);
320             SEND_STRING("That was positively riveting!");
321             register_code(KC_ENTER);
322             unregister_code(KC_ENTER);
323         }
324         return false;
325         break;
326
327     }
328     return true;
329 }
330
331 #ifdef TAP_DANCE_ENABLE
332
333 // Sends the key press to system, but only if on the Diablo layer
334 void send_diablo_keystroke(uint8_t diablo_key) {
335     if (current_layer == _DIABLO) {
336         switch (diablo_key) {
337         case 0:
338             SEND_STRING("1");
339             break;
340         case 1:
341             SEND_STRING("2");
342             break;
343         case 2:
344             SEND_STRING("3");
345             break;
346         case 3:
347             SEND_STRING("4");
348             break;
349         }
350     }
351 }
352
353 // Checks each of the 4 timers/keys to see if enough time has elapsed
354 // Runs the "send string" command if enough time has passed, and resets the timer.
355 void run_diablo_macro_check(void) {
356     uint8_t dtime;
357
358     for (dtime = 0; dtime < 4; dtime++) {
359         if (check_dtimer(dtime) && diablo_key_time[dtime]) {
360             diablo_timer[dtime] = timer_read();
361             send_diablo_keystroke(dtime);
362         }
363     }
364
365 }
366 #endif
367
368
369 void matrix_scan_user(void) {  // runs frequently to update info
370     uint8_t layer = biton32(layer_state);
371
372     if (layer != current_layer) {
373         has_layer_changed = true;
374         current_layer = layer;
375     }
376     // Check layer, and apply color if its changed since last check
377     if (has_layer_changed) {
378
379         switch (layer) {
380         case _NUMNAV:
381             rgblight_set_teal;
382             rgblight_mode(2);
383             break;
384         case _MACROS:
385             rgblight_set_orange;
386             if (is_overwatch) {
387                 rgblight_mode(17); 
388             }
389             else {
390                 rgblight_mode(18);
391             }
392             break;
393         case _DIABLO:
394             rgblight_set_red;
395             rgblight_mode(5);
396             break;
397         case _GAMEPAD:
398             rgblight_set_urine;
399             rgblight_mode(1);
400             break;
401         case _MEDIA:
402             rgblight_set_blue;
403             rgblight_mode(1);
404             break;
405         }
406         has_layer_changed = false;
407     }
408
409 #ifdef TAP_DANCE_ENABLE
410     // Run Diablo 3 macro checking code.
411     run_diablo_macro_check();
412 #endif
413 };