]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/planck/keymaps/brandon/keymap.c
Adds support for Planck Rev 6 (#2666)
[qmk_firmware.git] / keyboards / planck / keymaps / brandon / keymap.c
1 #pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example"
2 #include "planck.h"
3 #include "action_layer.h"
4 #include "eeconfig.h"
5 #include "keymap_plover.h"
6 #include "action_tapping.h"
7
8 extern keymap_config_t keymap_config;
9
10 // Keymap layers
11 enum planck_layers {
12   BASE_QWERTY_LAYER,
13   BASE_COLEMAK_LAYER,
14   BASE_STENO_LAYER,
15   LOWER_LAYER,
16   RAISE_LAYER,
17   NAVIGATION_LAYER,
18   GUI_LAYER,
19   KEYBOARD_LAYER
20 };
21
22 // Key aliases for legibility
23 #define _______ KC_TRNS
24 #define ___x___ KC_NO
25
26 // Macros
27 enum planck_macros {
28   LALT_BRACE,
29   RALT_BRACE
30 };
31
32 // Dashes (macOS)
33 #define KC_NDSH LALT(KC_MINS)
34 #define KC_MDSH S(LALT(KC_MINS))
35
36 // Window manager keys
37 #define WM_FULL LALT(LGUI(KC_F))
38 #define WM_NEXT LCTL(LALT(LGUI(KC_RGHT)))
39 #define WM_PREV LCTL(LALT(LGUI(KC_LEFT)))
40 #define WM_NW   LCTL(LGUI(KC_LEFT))
41 #define WM_N    LALT(LGUI(KC_UP))
42 #define WM_NE   LCTL(LGUI(KC_RGHT))
43 #define WM_E    LALT(LGUI(KC_RGHT))
44 #define WM_SE   S(LCTL(LGUI(KC_RGHT)))
45 #define WM_S    LALT(LGUI(KC_DOWN))
46 #define WM_SW   S(LCTL(LGUI(KC_LEFT)))
47 #define WM_W    LALT(LGUI(KC_LEFT))
48 #define WM_CNTR LALT(LGUI(KC_C))
49
50 // Special key codes
51 enum planck_keycodes {
52   QWERTY = SAFE_RANGE,
53   COLEMAK,
54   STENO,
55   LOWER,
56   RAISE,
57   PV_EXIT,
58   PV_LOOK
59 };
60
61 //Tap Dance Declarations
62 enum {
63   TD_ESC_GRV = 0
64 };
65
66 // Tap Dance Definitions
67 qk_tap_dance_action_t tap_dance_actions[] = {
68   // Tap once for Esc, twice for Backspace
69   [TD_ESC_GRV]  = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_GRV)
70   // Other declarations would go here, separated by commas, if you have them
71 };
72
73 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
74   /* Base layer (Qwerty)
75    *                ,-----------------------------------------------------------------------.
76    * Double tap 4 ~ | ESC | Q   | W   | E   | R   | T   | Y   | U   | I   | O   | P   | '   |
77    *                |-----------------------------------------------------------------------|
78    * Tap for Tab -- |Ctrl | A   | S   | D   | F   | G   | H   | J   | K   | L   |; Fn4|Ctrl | -- Tap for Enter
79    *                |-----------------------------------------------------------------------|
80    *   Tap for ( -- |Shift| Z   | X   | C   | V   | B   | N   | M   | ,   | .   | /   |Shift| -- Tap for )
81    *                |-----------------------------------------------------------------------|
82    *   Tap for [ -- | Fn3 |Hyper| Alt |Super| Fn1 |   Space   | Fn2 |Super| Alt |Hyper| Fn3 | -- Tap for ]
83    *                `-----------------------------------------------------------------------'
84    *                        /                                                     /
85    *   Tap for ] [ --------'-----------------------------------------------------'
86    */
87   [BASE_QWERTY_LAYER] = {
88     {TD(TD_ESC_GRV),  KC_Q,           KC_W,          KC_E,    KC_R,  KC_T,   KC_Y,    KC_U,  KC_I,    KC_O,          KC_P,           KC_QUOT},
89     {F(5),    KC_A,           KC_S,          KC_D,    KC_F,  KC_G,   KC_H,    KC_J,  KC_K,    KC_L,          F(1),           F(6)},
90     {KC_LSPO, KC_Z,           KC_X,          KC_C,    KC_V,  KC_B,   KC_N,    KC_M,  KC_COMM, KC_DOT,        KC_SLSH,        KC_RSPC},
91     {F(3),    ALL_T(KC_RBRC), M(LALT_BRACE), KC_LGUI, LOWER, KC_SPC, KC_BSPC, RAISE, KC_RGUI, M(RALT_BRACE), ALL_T(KC_LBRC), F(4)}
92   },
93
94   /* Base layer (Colemak)
95    *                ,-----------------------------------------------------------------------.
96    *                |     | Q   | W   | F   | P   | G   | J   | L   | U   | Y   | ;   |     |
97    *                |-----------------------------------------------------------------------|
98    *                |     | A   | R   | S   | T   | D   | H   | N   | E   | I   |O Fn4|     |
99    *                |-----------------------------------------------------------------------|
100    *                |     | Z   | X   | C   | V   | B   | K   | M   |     |     |     |     |
101    *                |-----------------------------------------------------------------------|
102    *                |     |     |     |     |     |           |     |     |     |     |     |
103    *                `-----------------------------------------------------------------------'
104    */
105   [BASE_COLEMAK_LAYER] = {
106     {_______, KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, _______},
107     {_______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    F(2),    _______},
108     {_______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    _______, _______, _______, _______},
109     {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
110   },
111
112   /* Base layer (Qwerty-Steno)
113    *                ,-----------------------------------------------------------------------.
114    *                |  #  |  #  |  #  |  #  |  #  |  #  |  #  |  #  |  #  |  #  |  #  |  #  |
115    *                |-----------------------------------------------------------------------|
116    *                |Look |     |  T  |  P  |  H  |           |  F  |  P  |  L  |  T  |  D  |
117    *                | -up |  S  |-----+-----+-----|     *     |-----+-----+-----+-----+-----|
118    *                |     |     |  K  |  W  |  R  |           |  R  |  B  |  G  |  S  |  Z  |
119    *                |-----------------------------------------------------------------------|
120    *                |Exit |     |     |  A  |  O  |           |  E  |  U  |     |     |     |
121    *                `-----------------------------------------------------------------------'
122    */
123   [BASE_STENO_LAYER] = {
124     {PV_NUM,  PV_NUM,  PV_NUM,  PV_NUM, PV_NUM, PV_NUM,  PV_NUM,  PV_NUM, PV_NUM, PV_NUM,  PV_NUM,  PV_NUM},
125     {PV_LOOK, PV_LS,   PV_LT,   PV_LP,  PV_LH,  PV_STAR, PV_STAR, PV_RF,  PV_RP,  PV_RL,   PV_RT,   PV_RD},
126     {PV_LOOK, PV_LS,   PV_LK,   PV_LW,  PV_LR,  PV_STAR, PV_STAR, PV_RR,  PV_RB,  PV_RG,   PV_RS,   PV_RZ},
127     {PV_EXIT, ___x___, ___x___, PV_A,   PV_O,   _______, _______, PV_E,   PV_U,   ___x___, ___x___, ___x___}
128   },
129
130   /* Numeric layer
131    *                ,-----------------------------------------------------------------------.
132    * Application -- |D-Grv| F1  | F2  | F3  | F4  | F5  | F6  | F7  | F8  | F9  | F10 | #   |
133    *      window    |-----------------------------------------------------------------------|
134    *    switcher    |     | 1   | 2   | 3   | 4   | 5   | 6   | 7   | 8   | 9   | 0   |     |
135    *                |-----------------------------------------------------------------------|
136    *                |     | -   | =   | `   | \   |     |ndash|mdash| ,   | .   | /   |     |
137    *                |-----------------------------------------------------------------------|
138    *                |     |     |     |     |     | Backspace |     |     |     |     |     |
139    *                `-----------------------------------------------------------------------'
140    */
141   [LOWER_LAYER] = {
142     {LGUI(KC_GRV), KC_F1,          KC_F2,         KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,         KC_F10,         S(KC_3)},
143     {F(5),         KC_1,           KC_2,          KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,          KC_0,           F(6)},
144     {KC_LSPO,      KC_MINS,        KC_EQL,        KC_GRV,  KC_BSLS, ___x___, KC_NDSH, KC_MDSH, KC_COMM, KC_DOT,        KC_SLSH,        KC_RSPC},
145     {F(3),         ALL_T(KC_LBRC), M(LALT_BRACE), KC_LGUI, LOWER,   KC_BSPC, KC_BSPC, RAISE,   KC_RGUI, M(RALT_BRACE), ALL_T(KC_RBRC), F(4)}
146   },
147
148   /* Symbol layer
149    *                ,-----------------------------------------------------------------------.
150    *                |     | F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | #   |
151    *                |-----------------------------------------------------------------------|
152    *                |     | !   | @   | #   | $   | %   | ^   | &   | *   | '   | "   |     | \
153    *                |-----------------------------------------------------------------------|  |-- Mostly shifted version
154    *                |     | _   | +   | ~   | |   |     |ndash|mdash| ,   | .   | /   |     | /    of lower layer
155    *                |-----------------------------------------------------------------------|
156    *                |     |     |     |     |     |  Delete   |     |     |     |     |     |
157    *                `-----------------------------------------------------------------------'
158    */
159   [RAISE_LAYER] = {
160     {_______, KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20,     S(KC_3)},
161     {_______, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), KC_QUOT, S(KC_QUOT), _______},
162     {_______, KC_UNDS, KC_PLUS, KC_TILD, KC_PIPE, ___x___, KC_NDSH, KC_MDSH, KC_COMM, KC_DOT,  KC_SLSH,    _______},
163     {_______, _______, _______, _______, _______, KC_DEL,  KC_DEL,  _______, _______, _______, _______,    _______}
164   },
165
166   /* Directional navigation layer
167    *
168    *         Large movements -----/```````````````````\   /```````````````````\----- Vim-style arrow keys
169    *                ,-----------------------------------------------------------------------.
170    *                |     |     |     |     |     |     |     |     |     |     |     |     |
171    *                |-----------------------------------------------------------------------|
172    *                |     |     |Home |PgUp |PgDn | End |Left |Down | Up  |Right|     |     |
173    *                |-----------------------------------------------------------------------|
174    *                |     |     |     |     |     |     |     |     |     |     |     |     |
175    *                |-----------------------------------------------------------------------|
176    *                |     |     |     |     |     |           |     |     |     |     |     |
177    *                `-----------------------------------------------------------------------'
178    */
179   [NAVIGATION_LAYER] = {
180     {___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___},
181     {_______, ___x___, KC_HOME, KC_PGUP, KC_PGDN, KC_END,  KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, F(1),    _______},
182     {_______, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, _______},
183     {_______, _______, _______, _______, ___x___, ___x___, ___x___, ___x___, _______, _______, _______, _______}
184   },
185
186   /* GUI (window management/mouse/media controls) layer
187    *
188    *        Mouse keys -----/```````````````````\               /```````````````````\----- Window manager
189    *                ,-----------------------------------------------------------------------.
190    *                |     |Ms B2|Ms Up|Ms B1|Ms WD|     |     |Prev | NW  |  N  | NE  |     |
191    *                |-----------------------------------------------------------------------|
192    *                |     |Ms L |Ms Dn|Ms R |Ms WU|     |     |Full |  W  |Centr|  E  |     |
193    *                |-----------------------------------------------------------------------|
194    *                |     |Ms WL|Ms B3|Ms WR|     |     |     |Next | SW  |  S  | SE  |     |
195    *                |-----------------------------------------------------------------------|
196    *                |     |Prev |Play |Next |Brig-|   Sleep   |Brig+|Mute |Vol- |Vol+ |     |
197    *                `-----------------------------------------------------------------------'
198    *                        \___ Media ___/   \___ Screen/sleep __/   \___ Volume __/
199    */
200   [GUI_LAYER] = {
201     {_______, KC_BTN2, KC_MS_U, KC_BTN1, KC_WH_D, ___x___, ___x___, WM_PREV, WM_NW,   WM_N,    WM_NE,   _______},
202     {_______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, ___x___, ___x___, WM_FULL, WM_W,    WM_CNTR, WM_E,    _______},
203     {_______, KC_WH_L, KC_BTN3, KC_WH_R, ___x___, ___x___, ___x___, WM_NEXT, WM_SW,   WM_S,    WM_SE,   _______},
204     {_______, KC_MPRV, KC_MPLY, KC_MNXT, KC_SLCK, KC_SLEP, KC_SLEP, KC_PAUS, KC_MUTE, KC_VOLD, KC_VOLU, _______}
205   },
206
207   /* Keyboard settings layer
208    *                ,-----------------------------------------------------------------------.
209    *    Firmware -- |     |Reset|     |     |     |     |     |     |     |     |     |     |
210    *                |-----------------------------------------------------------------------|
211    *   Set layer -- |     |Qwert|Colem|Steno| ... |     |     |     |     |     |     |     |
212    *                |-----------------------------------------------------------------------|
213    *       Audio -- |     |Voic-|Voic+|Mus +|Mus -|MIDI+|MIDI-|     |     |Aud +|Aud -|     |
214    *                |-----------------------------------------------------------------------|
215    *                |     |     |     |     |     |  Toggle   |     |Toggl| BL- | BL+ |     |
216    *                `-----------------------------------------------------------------------'
217    *                                                    \_____________\_ Backlight _/
218    */
219   [KEYBOARD_LAYER] = {
220     {___x___, RESET,   ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___},
221     {___x___, QWERTY,  COLEMAK, STENO,   ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___, ___x___},
222     {___x___, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  ___x___, ___x___, AU_ON,   AU_OFF,  ___x___},
223     {___x___, ___x___, ___x___, ___x___, LOWER,   BL_TOGG, BL_TOGG, RAISE,   BL_TOGG, BL_DEC,  BL_INC,  ___x___}
224   }
225 };
226
227 const uint16_t PROGMEM fn_actions[] = {
228   // Layer switching
229   [1] = ACTION_LAYER_TAP_KEY(NAVIGATION_LAYER, KC_SCOLON),
230   [2] = ACTION_LAYER_TAP_KEY(NAVIGATION_LAYER, KC_O),
231   [3] = ACTION_LAYER_TAP_KEY(GUI_LAYER, KC_LBRACKET),
232   [4] = ACTION_LAYER_TAP_KEY(GUI_LAYER, KC_RBRACKET),
233
234   // Modifiers
235   [5] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_TAB),
236   [6] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT),
237 };
238
239 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
240 {
241   switch(id) {
242     case LALT_BRACE:
243       if (record->event.pressed) {
244         register_mods(MOD_LALT);
245         record->tap.interrupted = 0;
246       } else {
247         unregister_mods(MOD_LALT);
248
249         if (record->tap.count && !record->tap.interrupted) {
250           add_weak_mods(MOD_LSFT);
251           register_code(KC_LBRACKET);
252           unregister_code(KC_LBRACKET);
253           del_weak_mods(MOD_LSFT);
254         }
255
256         record->tap.count = 0;
257       }
258       break;
259     case RALT_BRACE:
260       if (record->event.pressed) {
261         register_mods(MOD_RALT);
262         record->tap.interrupted = 0;
263       } else {
264         unregister_mods(MOD_RALT);
265
266         if (record->tap.count && !record->tap.interrupted) {
267           add_weak_mods(MOD_LSFT);
268           register_code(KC_RBRACKET);
269           unregister_code(KC_RBRACKET);
270           del_weak_mods(MOD_LSFT);
271         }
272
273         record->tap.count = 0;
274       }
275       break;
276   }
277   return MACRO_NONE;
278 }
279
280 #ifdef AUDIO_ENABLE
281
282 float tone_startup[][2]   = SONG(STARTUP_SOUND);
283 float tone_qwerty[][2]    = SONG(QWERTY_SOUND);
284 float tone_colemak[][2]   = SONG(COLEMAK_SOUND);
285 float tone_plover[][2]    = SONG(PLOVER_SOUND);
286 float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND);
287 float music_scale[][2]    = SONG(MUSIC_SCALE_SOUND);
288 float tone_goodbye[][2]   = SONG(GOODBYE_SOUND);
289
290 #endif
291
292 void persistant_default_layer_set(uint16_t default_layer) {
293   eeconfig_update_default_layer(default_layer);
294   default_layer_set(default_layer);
295 }
296
297 // Send PHROPB ({PLOVER:RESUME}).
298 void plover_resume(void) {
299   register_code(PV_LP);
300   register_code(PV_LH);
301   register_code(PV_LR);
302   register_code(PV_O);
303   register_code(PV_RP);
304   register_code(PV_RB);
305   unregister_code(PV_LP);
306   unregister_code(PV_LH);
307   unregister_code(PV_LR);
308   unregister_code(PV_O);
309   unregister_code(PV_RP);
310   unregister_code(PV_RB);
311 }
312
313 // Send PHROF ({PLOVER:SUSPEND}).
314 void plover_suspend(void) {
315   register_code(PV_LP);
316   register_code(PV_LH);
317   register_code(PV_LR);
318   register_code(PV_O);
319   register_code(PV_RF);
320   unregister_code(PV_LP);
321   unregister_code(PV_LH);
322   unregister_code(PV_LR);
323   unregister_code(PV_O);
324   unregister_code(PV_RF);
325 }
326
327 // Send PHROBG ({PLOVER:LOOKUP}).
328 void plover_lookup(void) {
329   register_code(PV_LP);
330   register_code(PV_LH);
331   register_code(PV_LR);
332   register_code(PV_O);
333   register_code(PV_RB);
334   register_code(PV_RG);
335   unregister_code(PV_LP);
336   unregister_code(PV_LH);
337   unregister_code(PV_LR);
338   unregister_code(PV_O);
339   unregister_code(PV_RB);
340   unregister_code(PV_RG);
341 }
342
343 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
344   switch (keycode) {
345     case QWERTY:
346       if (record->event.pressed) {
347         persistant_default_layer_set(1UL<<BASE_QWERTY_LAYER);
348       }
349       return false;
350     case COLEMAK:
351       if (record->event.pressed) {
352         persistant_default_layer_set(1UL<<BASE_COLEMAK_LAYER);
353       }
354       return false;
355     case LOWER:
356       if (record->event.pressed) {
357         layer_on(LOWER_LAYER);
358         update_tri_layer(LOWER_LAYER, RAISE_LAYER, KEYBOARD_LAYER);
359       } else {
360         layer_off(LOWER_LAYER);
361         update_tri_layer(LOWER_LAYER, RAISE_LAYER, KEYBOARD_LAYER);
362       }
363       return false;
364     case RAISE:
365       if (record->event.pressed) {
366         layer_on(RAISE_LAYER);
367         update_tri_layer(LOWER_LAYER, RAISE_LAYER, KEYBOARD_LAYER);
368       } else {
369         layer_off(RAISE_LAYER);
370         update_tri_layer(LOWER_LAYER, RAISE_LAYER, KEYBOARD_LAYER);
371       }
372       return false;
373     case STENO:
374       if (record->event.pressed) {
375         layer_off(RAISE_LAYER);
376         layer_off(LOWER_LAYER);
377         layer_off(KEYBOARD_LAYER);
378         layer_on(BASE_STENO_LAYER);
379         if (!eeconfig_is_enabled()) {
380           eeconfig_init();
381         }
382         keymap_config.raw = eeconfig_read_keymap();
383         keymap_config.nkro = 1;
384         eeconfig_update_keymap(keymap_config.raw);
385         plover_resume();
386       }
387       return false;
388     case PV_EXIT:
389       if (record->event.pressed) {
390         plover_suspend();
391         layer_off(BASE_STENO_LAYER);
392       }
393       return false;
394     case PV_LOOK:
395       if (record->event.pressed) {
396         plover_lookup();
397       }
398       return false;
399   }
400   return true;
401 }
402
403 void matrix_init_user(void) {
404 #ifdef AUDIO_ENABLE
405   startup_user();
406 #endif
407 }