]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/viterbi/keymaps/drashna/keymap.c
Migrated most code from keymaps to userspace (#1980)
[qmk_firmware.git] / keyboards / viterbi / keymaps / drashna / keymap.c
1 #include "viterbi.h"
2 #include "action_layer.h"
3 #include "eeconfig.h"
4 #include "drashna.h"
5
6 extern keymap_config_t keymap_config;
7
8 // Each layer gets a name for readability, which is then used in the keymap matrix below.
9 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
10 // Layer names don't all need to be of the same length, obviously, and you can also skip them
11 // entirely and just use numbers.
12
13
14 // Fillers to make layering more clear
15 #define _______ KC_TRNS
16 #define XXXXXXX KC_NO
17
18 #define LMACRO   TG(_MACROS)
19 #define DIABLO   TG(_DIABLO)
20 #define GAMEPAD  TG(_OVERWATCH)
21 #define MEDIA    TG(_MEDIA)
22 #define COVECUBE TG(_COVECUBE)
23
24
25
26
27 #ifdef TAP_DANCE_ENABLE
28 //define diablo macro timer variables
29 static uint16_t diablo_timer[4];
30 static uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
31 static uint8_t diablo_key_time[4];
32
33
34 bool check_dtimer(uint8_t dtimer) {
35   // has the correct number of seconds elapsed (as defined by diablo_times)
36   return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true;
37 };
38
39
40 enum {
41   TD_DIABLO_1 = 0,
42   TD_DIABLO_2,
43   TD_DIABLO_3,
44   TD_DIABLO_4
45 };
46
47
48 // Cycle through the times for the macro, starting at 0, for disabled.
49 // Max of six values, so don't exceed
50 void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) {
51   if (state->count >= 7) {
52     diablo_key_time[diablo_key] = diablo_times[0];
53     reset_tap_dance(state);
54   }
55   else {
56     diablo_key_time[diablo_key] = diablo_times[state->count - 1];
57   }
58 }
59
60
61 // Would rather have one function for all of this, but no idea how to do that...
62 void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) {
63   diablo_tapdance_master(state, user_data, 0);
64 }
65
66 void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) {
67   diablo_tapdance_master(state, user_data, 1);
68 }
69
70 void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) {
71   diablo_tapdance_master(state, user_data, 2);
72 }
73
74 void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) {
75   diablo_tapdance_master(state, user_data, 3);
76 }
77
78
79
80 //Tap Dance Definitions
81 qk_tap_dance_action_t tap_dance_actions[] = {
82   // tap once to disable, and more to enable timed micros
83   [TD_DIABLO_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1),
84   [TD_DIABLO_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2),
85   [TD_DIABLO_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3),
86   [TD_DIABLO_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
87
88 };
89 #endif
90
91
92 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
93
94   [_NUMLOCK] = KEYMAP(
95       LMACRO,  DIABLO,  GAMEPAD, KC_NLCK, KC_SLCK, KC_COLN, KC_PSLS,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
96       MEDIA,   KC_CALC, COVECUBE,KC_P7,   KC_P8,   KC_P9,   KC_PAST,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
97       KC_HOME, KC_DEL,  KC_PGUP, KC_P4,   KC_P5,   KC_P6,   KC_PMNS,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
98       KC_END,  KC_UP,   KC_PGDN, KC_P1,   KC_P2,   KC_P3,   KC_PPLS,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
99       KC_LEFT, KC_DOWN, KC_RGHT, KC_P0,   KC_P00,  KC_PDOT, KC_PENT,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
100   ),
101
102   [_DIABLO] = KEYMAP(
103       KC_ESC,  DIABLO,  KC_V,    KC_D,    XXXXXXX, XXXXXXX, KC_L,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
104       KC_TAB,  KC_S,    KC_F,    KC_I,    KC_M,    KC_T,    KC_J,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
105       KC_Q,    KC_1,    KC_2,    KC_3,    KC_4,    KC_G,    KC_F,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
106       KC_LCTL, TD(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, \
107       KC_LALT, KC_F4,   KC_F5,   KC_F8,   KC_F9,   KC_F10,  SFT_T(KC_SPACE),          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
108   ),
109
110   [_OVERWATCH] = KEYMAP(  // Game pad layout designed primarily for Overwatch
111       LMACRO,   KC_ESC,  GAMEPAD, KC_1,    KC_2,    KC_3,    KC_4,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
112       MEDIA,   KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
113       KC_Z,    KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
114       KC_Y,    KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
115       KC_F1,   KC_U,    KC_I,    KC_Y,    KC_V,    KC_SPC,  KC_V,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
116   ),
117
118   [_MACROS] = KEYMAP(
119       LMACRO,       XXXXXXX,     GAMEPAD,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
120       XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
121       KC_SYMM,     KC_TORB,     KC_DOOMFIST, XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
122       KC_GLHF,     KC_GOODGAME, XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
123       KC_SALT,     KC_MORESALT, KC_SALTHARD, KC_JUSTGAME, KC_AIM,      XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
124   ),
125
126   [_COVECUBE] = KEYMAP(
127       COVECUBE,    XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
128       XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
129       XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
130       XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
131       XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,     XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
132   ),
133
134   [_MEDIA] = KEYMAP(
135       KC_RESET,KC_MAKE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
136       MEDIA,   XXXXXXX, RGB_SAI, RGB_VAI, RGB_M_P, RGB_M_B, RGB_M_R,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
137       RGB_TOG, RGB_MOD, RGB_SAD, RGB_VAD, RGB_M_SW,RGB_M_SN,RGB_M_K,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
138       KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, RGB_M_K, RGB_M_X, RGB_M_G,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
139       KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
140   )
141
142
143 };
144
145
146
147 bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
148   switch (keycode) {
149 #ifdef TAP_DANCE_ENABLE
150   case KC_DIABLO_CLEAR:  // reset all Diable timers, disabling them
151     if (record->event.pressed) {
152       uint8_t dtime;
153
154       for (dtime = 0; dtime < 4; dtime++) {
155         diablo_key_time[dtime] = diablo_times[0];
156       }
157     }
158     return false;
159     break;
160 #endif
161   }
162   return true;
163 }
164
165 #ifdef TAP_DANCE_ENABLE
166
167 // Sends the key press to system, but only if on the Diablo layer
168 void send_diablo_keystroke(uint8_t diablo_key) {
169   if (biton32(layer_state) == _DIABLO) {
170     switch (diablo_key) {
171     case 0:
172       SEND_STRING("1");
173       break;
174     case 1:
175       SEND_STRING("2");
176       break;
177     case 2:
178       SEND_STRING("3");
179       break;
180     case 3:
181       SEND_STRING("4");
182       break;
183     }
184   }
185 }
186
187 // Checks each of the 4 timers/keys to see if enough time has elapsed
188 // Runs the "send string" command if enough time has passed, and resets the timer.
189 void run_diablo_macro_check(void) {
190   uint8_t dtime;
191
192   for (dtime = 0; dtime < 4; dtime++) {
193     if (check_dtimer(dtime) && diablo_key_time[dtime]) {
194       diablo_timer[dtime] = timer_read();
195       send_diablo_keystroke(dtime);
196     }
197   }
198
199 }
200 #endif
201
202
203
204 void matrix_scan_keymap(void) {  // runs frequently to update info
205 #ifdef TAP_DANCE_ENABLE
206     // Run Diablo 3 macro checking code.
207   run_diablo_macro_check();
208 #endif
209 };
210