aboutsummaryrefslogtreecommitdiff
path: root/keyboards
diff options
context:
space:
mode:
authorQMK Bot <hello@qmk.fm>2021-01-26 04:23:57 +0000
committerQMK Bot <hello@qmk.fm>2021-01-26 04:23:57 +0000
commit2f145bc231743660e3931d9fc977638751ab6f08 (patch)
treea13940c9f09004127276b18a204679d18661b7c2 /keyboards
parent9f1d2246a0d5572dcd57e8c5178e6120d40694d9 (diff)
parent0e7e52c8202701e6a246fa8a6ac13dd2ecad5743 (diff)
downloadqmk_firmware-2f145bc231743660e3931d9fc977638751ab6f08.tar.gz
qmk_firmware-2f145bc231743660e3931d9fc977638751ab6f08.zip
Merge remote-tracking branch 'origin/master' into develop
Diffstat (limited to 'keyboards')
-rw-r--r--keyboards/planck/keymaps/tk/config.h64
-rw-r--r--keyboards/planck/keymaps/tk/keymap.c690
-rw-r--r--keyboards/planck/keymaps/tk/rules.mk11
3 files changed, 765 insertions, 0 deletions
diff --git a/keyboards/planck/keymaps/tk/config.h b/keyboards/planck/keymaps/tk/config.h
new file mode 100644
index 000000000..213d7345b
--- /dev/null
+++ b/keyboards/planck/keymaps/tk/config.h
@@ -0,0 +1,64 @@
1/* Copyright 2020 Tushar Khan
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#pragma once
18
19#define ENCODER_RESOLUTION 4 // dependent on rotary encoder
20
21#define TAP_CODE_DELAY 10 // delay between key press and release on `tapcode(kc)`
22
23#define TAPPING_TERM 200 // mod tap tap-window
24
25// oneshot keys --
26
27#define ONESHOT_TAP_TOGGLE 25 // taps to toggle a one-shot layer/key persistence
28
29#define ONESHOT_TIMEOUT 500 // one-shot layer/key timeout
30
31// dynamic macros --
32
33// you can store HALF of this number of keypresses in both macros together
34#define DYNAMIC_MACRO_SIZE 256
35
36// mouse keys --
37
38#define MK_3_SPEED
39
40// mouse speeds
41
42// cursor offset per movement
43#define MK_C_OFFSET_1 4
44#define MK_C_OFFSET_2 16
45
46// time between cursor movements (ms)
47#define MK_C_INTERVAL_1 16 // 16 ms = 60 Hz refresh rate
48#define MK_C_INTERVAL_2 16
49
50// scroll speeds
51
52// scroll steps per scroll action
53#define MK_W_OFFSET_1 1
54#define MK_W_OFFSET_2 4
55
56// time between scroll steps (ms)
57#define MK_W_INTERVAL_1 16
58#define MK_W_INTERVAL_2 16
59
60
61// audio --
62
63#define AUDIO_CLICKY
64#define AUDIO_CLICKY_FREQ_RANDOMNESS 1
diff --git a/keyboards/planck/keymaps/tk/keymap.c b/keyboards/planck/keymaps/tk/keymap.c
new file mode 100644
index 000000000..b3273aec5
--- /dev/null
+++ b/keyboards/planck/keymaps/tk/keymap.c
@@ -0,0 +1,690 @@
1/* Copyright 2020 Tushar Khan
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include QMK_KEYBOARD_H
18#include "muse.h"
19
20
21/*
22 ██████╗ ███████╗███████╗██╗███╗ ██╗██╗████████╗██╗ ██████╗ ███╗ ██╗███████╗
23 ██╔══██╗██╔════╝██╔════╝██║████╗ ██║██║╚══██╔══╝██║██╔═══██╗████╗ ██║██╔════╝
24 ██║ ██║█████╗ █████╗ ██║██╔██╗ ██║██║ ██║ ██║██║ ██║██╔██╗ ██║███████╗
25 ██║ ██║██╔══╝ ██╔══╝ ██║██║╚██╗██║██║ ██║ ██║██║ ██║██║╚██╗██║╚════██║
26 ██████╔╝███████╗██║ ██║██║ ╚████║██║ ██║ ██║╚██████╔╝██║ ╚████║███████║
27 ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝
28*/
29
30
31#define LCTL_MASK (get_mods() & MOD_BIT(KC_LCTL))
32#define RCTL_MASK (get_mods() & MOD_BIT(KC_RCTL))
33#define CTL_MASK (LCTL_MASK || RCTL_MASK)
34#define LSFT_MASK (get_mods() & MOD_BIT(KC_LSFT))
35#define RSFT_MASK (get_mods() & MOD_BIT(KC_RSFT))
36#define SFT_MASK (LSFT_MASK || RSFT_MASK)
37#define LALT_MASK (get_mods() & MOD_BIT(KC_LALT))
38#define RALT_MASK (get_mods() & MOD_BIT(KC_RALT))
39#define ALT_MASK (LALT_MASK || RALT_MASK)
40
41// Layers
42
43enum planck_layers {
44 _BASE,
45 _LOWER1,
46 _RAISE1,
47 _LOWER2,
48 _RAISE2,
49 _HYPER,
50 _ROTOR,
51};
52
53#define BASE TO(_BASE)
54#define HYPER MO(_HYPER)
55#define R_MODES MO(_ROTOR)
56
57#define LOWER1 OSL(_LOWER1)
58#define LOWER2 OSL(_LOWER2)
59#define RAISE1 OSL(_RAISE1)
60#define RAISE2 OSL(_RAISE2)
61
62// Custom keycodes
63
64#define CTL_TAB MT(MOD_LCTL, KC_TAB)
65#define SH_ESC MT(MOD_LSFT, KC_ESC)
66#define SH_QUOT MT(MOD_RSFT, KC_QUOT)
67
68enum keycodes {
69 ROTARY = SAFE_RANGE,
70 PANIC, // backspace on tap, delete on tap with RSHIFT
71
72 // rotary modes
73 R_VOL, R_MEDIA, R_BRI, R_SC_V, R_SC_H, R_AR_V, R_AR_H,
74
75 // command-line macros
76 DEL_LN, // [delete line]
77 EMAIL, // [email address]
78 PHONE, // [phone number]
79 GT_CMT, // git commit -m ''
80 SHEBANG, // #!/usr/bin/env
81 CHMOD, // chmod 744 *sh
82 PY_VENV, // source *env*/bin/activate
83};
84
85// Rotary encoder states
86
87enum encoder_states {
88 VOLUME, // volume up/down, toggle mute
89 MEDIA, // media next/previous, play/pause
90 BRIGHTNESS, // brightness up/down
91 SCROLL_V, // scroll up/down, middle click
92 SCROLL_H, // scroll right/left, middle click
93 ARROW_V, // arrow up/down
94 ARROW_H, // arrow left/right
95};
96
97enum encoder_states rotary_state = VOLUME;
98
99// Songs
100
101#ifdef AUDIO_ENABLE
102// feedback songs
103float confirm_song[][2] = SONG(MARIO_COIN);
104float reject_song[][2] = SONG(MARIO_BUMP);
105
106// dynamic macro songs
107float dmacro_recs_song[][2] = SONG(MARIO_CAVE_1);
108float dmacro_rece_song[][2] = SONG(MARIO_CAVE_2);
109float dmacro_play_song[][2] = SONG(MARIO_PIPE);
110
111// layer toggle songs
112float base_song[][2] = SONG(MARIO_BUMP);
113float hyper_song[][2] = SONG(MARIO_POWERUP_BLOCK);
114float rotary_song[][2] = SONG(MARIO_POWERUP);
115float raise1_song[][2] = SONG(MARIO_POWERUP_BLOCK);
116float raise2_song[][2] = SONG(MARIO_POWERUP);
117float lower1_song[][2] = SONG(MARIO_POWERUP_BLOCK);
118float lower2_song[][2] = SONG(MARIO_POWERUP);
119
120// shortcut songs
121float caps_on_song[][2] = SONG(MARIO_CAVE_1);
122float caps_off_song[][2] = SONG(MARIO_CAVE_2);
123float save_song[][2] = SONG(MARIO_COIN);
124float cut_song[][2] = SONG(MARIO_STOMP);
125float copy_song[][2] = SONG(MARIO_STOMP);
126float paste_song[][2] = SONG(MARIO_FIREBALL);
127float undo_song[][2] = SONG(MARIO_KICK);
128float redo_song[][2] = SONG(MARIO_ONEUP);
129#endif
130
131
132/*
133██╗ ██╗███████╗██╗ ██╗███╗ ███╗ █████╗ ██████╗ ███████╗
134██║ ██╔╝██╔════╝╚██╗ ██╔╝████╗ ████║██╔══██╗██╔══██╗██╔════╝
135█████╔╝ █████╗ ╚████╔╝ ██╔████╔██║███████║██████╔╝███████╗
136██╔═██╗ ██╔══╝ ╚██╔╝ ██║╚██╔╝██║██╔══██║██╔═══╝ ╚════██║
137██║ ██╗███████╗ ██║ ██║ ╚═╝ ██║██║ ██║██║ ███████║
138╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚══════╝
139*/
140
141
142const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
143
144 /* Base
145
146 |-----------------------------------------------------------------------------------------------|
147 | Rotary| Q | W | E | R | T | Y | U | I | O | P | Panic |
148 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
149 | Tab | A | S | D | F | G | H | J | K | L | ; | Enter |
150 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
151 | Esc | Z | X | C | V | B | N | M | , | . | / | ' |
152 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
153 | HYPER | Caps | Meta | Super | LOWER1| Space | RAISE1|DM1 Ply|DM2 Ply|DM1 Rec|DM2 Rec|
154 |-----------------------------------------------------------------------------------------------|
155
156 * PANIC: BACKSPACE on tap, DELETE on tap with RSHIFT
157 * TAB: CTRL on hold
158 * ESC and ': SHIFT on hold
159
160 */
161
162 [_BASE] = LAYOUT_planck_grid(
163 ROTARY, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, PANIC,
164 CTL_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
165 SH_ESC, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SH_QUOT,
166 HYPER, KC_CAPS, KC_LALT, KC_LGUI, LOWER1, KC_SPACE, KC_SPACE, RAISE1, DM_PLY1, DM_PLY2, DM_REC1, DM_REC2
167 ),
168
169 /* Hyper - keyboard adjustments and function keys
170
171 |-----------------------------------------------------------------------------------------------|
172 | ROTARY| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | Reset |
173 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
174 |T Audio| F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 |T Music|
175 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
176 |T Click| F21 | F22 | F23 | F24 | | | | | | |C Music|
177 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
178 | xXx | Wake | Sleep |PrntScr| xXx | BASE | xXx | | | | |
179 |-----------------------------------------------------------------------------------------------|
180
181 */
182 [_HYPER] = LAYOUT_planck_grid(
183 R_MODES, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET,
184 AU_TOG, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, MU_TOG,
185 CK_TOGG, KC_F21, KC_F22, KC_F23, KC_F24, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MU_MOD,
186 XXXXXXX, KC_WAKE, KC_SLEP, KC_PSCR, XXXXXXX, BASE, BASE, XXXXXXX, _______, _______, _______, _______
187 ),
188
189 /* Rotary - change rotary encoder mode
190
191 |-----------------------------------------------------------------------------------------------|
192 | | | | | | | |scrll h|scrll v|scrll v|scrll h| |
193 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
194 | | | | | | | |arrow h|arrow v|arrow v|arrow h| |
195 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
196 | | | | | vol | bright| | media | | | | |
197 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
198 | | | | | xXx | BASE | xXx | | | | |
199 |-----------------------------------------------------------------------------------------------|
200
201 */
202 [_ROTOR] = LAYOUT_planck_grid(
203 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, R_SC_H, R_SC_V, R_SC_V, R_SC_H, XXXXXXX,
204 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, R_AR_H, R_AR_V, R_AR_V, R_AR_H, XXXXXXX,
205 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, R_VOL, R_BRI, XXXXXXX, R_MEDIA, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
206 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, BASE, BASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
207 ),
208
209 /* Lower I - numbers and brackets
210
211 |-----------------------------------------------------------------------------------------------|
212 | | 1 | 2 | 3 | $ | * | / | | | | | |
213 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
214 | | 4 | 5 | 6 | . | + | = | [ | ] | { | } | |
215 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
216 | | 7 | 8 | 9 | 0 | - | _ | ( | ) | < | > | |
217 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
218 | | | | | LOWER2| BASE | RAISE1| | | | |
219 |-----------------------------------------------------------------------------------------------|
220
221 * The following symbols are found on other layers: $ * /
222 * It is recommended to not primarily use this layer for those symbols
223 * They are merely on this layer for numerical-typing convenience
224
225 */
226 [_LOWER1] = LAYOUT_planck_grid(
227 _______, KC_1, KC_2, KC_3, KC_DLR, KC_ASTR, KC_SLSH, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
228 _______, KC_4, KC_5, KC_6, KC_DOT, KC_PLUS, KC_EQL, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
229 _______, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_UNDS, KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
230 _______, _______, _______, _______, LOWER2, BASE, BASE, RAISE1, _______, _______, _______, _______
231 ),
232
233 /* Lower II - macros
234
235 |-----------------------------------------------------------------------------------------------|
236 | | | | email | | | | | | | phone | |
237 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
238 | | | g stat| del ln| | | | | | | | |
239 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
240 | | CHMOD | | g cmt |py venv| | | | | | | |
241 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
242 | | | | | xXx | BASE | RAISE1| | | | |
243 |-----------------------------------------------------------------------------------------------|
244
245 * DO NOT INCLUDE DESTRUCTIVE MACROS
246
247 */
248 [_LOWER2] = LAYOUT_planck_grid(
249 _______, XXXXXXX, XXXXXXX, EMAIL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, PHONE, _______,
250 _______, XXXXXXX, SHEBANG, DEL_LN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
251 _______, CHMOD, XXXXXXX, GT_CMT, PY_VENV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
252 _______, _______, _______, _______, XXXXXXX, BASE, BASE, RAISE1, _______, _______, _______, _______
253 ),
254
255 /* Raise I - symbols and movement
256
257 |-----------------------------------------------------------------------------------------------|
258 | | ! | @ | # | | | | S lt | S up | S dn | S rt | |
259 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
260 | | $ | % | ^ | | | | Left | Down | Up | Right | |
261 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
262 | | & | * | ( | ) | | | ~ | ` | | | \ | |
263 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
264 | | | | | LOWER1| BASE | RAISE2| | | | |
265 |-----------------------------------------------------------------------------------------------|
266
267 * It is not recomended to use the ( ) symbols on this layer
268 * They are merely here for uniformity
269
270 */
271 [_RAISE1] = LAYOUT_planck_grid(
272 _______, KC_EXLM, KC_AT, KC_HASH, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, _______,
273 _______, KC_DLR, KC_PERC, KC_CIRC, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______,
274 _______, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, XXXXXXX, XXXXXXX, KC_TILD, KC_GRV, KC_PIPE, KC_BSLS, _______,
275 _______, _______, _______, _______, LOWER1, BASE, BASE, RAISE2, _______, _______, _______, _______
276 ),
277
278 /* Raise II - mouse navigation
279
280 |-----------------------------------------------------------------------------------------------|
281 | | | | | | | | S lt | S up | S dn | S rt | |
282 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
283 | | | | | | | | M lt | M dn | M up | M rt | |
284 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
285 | | | | | | | | L Ck | R ck | Slow | Fast | |
286 |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
287 | | | | | LOWER1| BASE | xXx | | | | |
288 |-----------------------------------------------------------------------------------------------|
289
290 */
291 [_RAISE2] = LAYOUT_planck_grid(
292 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, _______,
293 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______,
294 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, KC_ACL1, KC_ACL2, _______,
295 _______, _______, _______, _______, LOWER1, BASE, BASE, XXXXXXX, _______, _______, _______, _______
296 ),
297
298};
299
300
301/*
302 ██████╗██╗ ██╗███████╗████████╗ ██████╗ ███╗ ███╗ ██╗ ██████╗ ██████╗ ██╗ ██████╗
303██╔════╝██║ ██║██╔════╝╚══██╔══╝██╔═══██╗████╗ ████║ ██║ ██╔═══██╗██╔════╝ ██║██╔════╝
304██║ ██║ ██║███████╗ ██║ ██║ ██║██╔████╔██║ ██║ ██║ ██║██║ ███╗██║██║
305██║ ██║ ██║╚════██║ ██║ ██║ ██║██║╚██╔╝██║ ██║ ██║ ██║██║ ██║██║██║
306╚██████╗╚██████╔╝███████║ ██║ ╚██████╔╝██║ ╚═╝ ██║ ███████╗╚██████╔╝╚██████╔╝██║╚██████╗
307 ╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═════╝
308*/
309
310
311// Keyboard initialization
312
313void keyboard_post_init_user(void) {
314 clicky_off();
315}
316
317// Dynamic macros
318
319static bool prerecord_clicky = false;
320
321void dynamic_macro_record_start_user(void) {
322 prerecord_clicky = is_clicky_on();
323 if (!prerecord_clicky) {
324 clicky_on();
325 }
326
327 #ifdef AUDIO_ENABLE
328 PLAY_SONG(dmacro_recs_song);
329 #endif
330}
331
332void dynamic_macro_record_end_user(int8_t direction) {
333 if (!prerecord_clicky) {
334 clicky_off();
335 }
336
337 #ifdef AUDIO_ENABLE
338 PLAY_SONG(dmacro_rece_song);
339 #endif
340}
341
342void dynamic_macro_play_user(int8_t direction) {
343 #ifdef AUDIO_ENABLE
344 PLAY_SONG(dmacro_play_song);
345 #endif
346}
347
348// Layers
349
350layer_state_t layer_state_set_user(layer_state_t state) {
351 // play layer activation audio
352 #ifdef AUDIO_ENABLE
353 switch (get_highest_layer(state)) {
354 case _BASE:
355 // enabling base layer song breaks a lot of other songs including
356 // - macro recording start song
357 // - rotary feedback songs
358
359 // PLAY_SONG(base_song);
360 break;
361 case _HYPER:
362 PLAY_SONG(hyper_song);
363 break;
364 case _ROTOR:
365 PLAY_SONG(rotary_song);
366 break;
367 case _LOWER1:
368 PLAY_SONG(lower1_song);
369 break;
370 case _LOWER2:
371 PLAY_SONG(lower2_song);
372 break;
373 case _RAISE1:
374 PLAY_SONG(raise1_song);
375 break;
376 case _RAISE2:
377 PLAY_SONG(raise2_song);
378 break;
379 default:
380 break;
381 }
382 #endif
383
384 return state;
385}
386
387// Keycode events
388
389bool process_record_user(uint16_t keycode, keyrecord_t *record) {
390 static bool panic_del = false; // PANIC in delete-mode
391 static bool caps_active = false;
392
393 switch (keycode) {
394
395 /*
396 ██  ██ ███████ ██  ██  ██████  ██████  ██████  ███████ ███████ 
397 ██  ██  ██       ██  ██  ██      ██    ██ ██   ██ ██      ██      
398 █████   █████   ████   ██  ██  ██ ██  ██ █████  ███████ 
399 ██  ██  ██      ██   ██  ██  ██ ██  ██ ██          ██ 
400 ██  ██ ███████  ██   ██████  ██████  ██████  ███████ ███████
401 */
402
403 case PANIC:
404 if (record->event.pressed) {
405 if (RSFT_MASK) {
406 unregister_code(KC_RSFT);
407 register_code(KC_DEL);
408 panic_del = true;
409 }
410 else {
411 register_code(KC_BSPACE);
412 }
413 }
414 else {
415 if (panic_del) {
416 register_code(KC_RSFT);
417 unregister_code(KC_DEL);
418 panic_del = false;
419 }
420 else {
421 unregister_code(KC_BSPACE);
422 }
423 }
424 return false;
425 case KC_CAPS:
426 if (record->event.pressed) {
427 caps_active = !caps_active;
428 }
429 break;
430
431 // rotary encoder
432
433 case R_VOL:
434 if (record->event.pressed) {
435 rotary_state = VOLUME;
436 }
437 break;
438 case R_MEDIA:
439 if (record->event.pressed) {
440 rotary_state = MEDIA;
441 }
442 break;
443 case R_BRI:
444 if (record->event.pressed) {
445 rotary_state = BRIGHTNESS;
446 }
447 break;
448 case R_SC_V:
449 if (record->event.pressed) {
450 rotary_state = SCROLL_V;
451 }
452 break;
453 case R_SC_H:
454 if (record->event.pressed) {
455 rotary_state = SCROLL_H;
456 }
457 break;
458 case R_AR_V:
459 if (record->event.pressed) {
460 rotary_state = ARROW_V;
461 }
462 break;
463 case R_AR_H:
464 if (record->event.pressed) {
465 rotary_state = ARROW_H;
466 }
467 break;
468 case ROTARY:
469 if (record->event.pressed) {
470 if (rotary_state == VOLUME) {
471 tap_code(KC_MUTE); // toggle mute
472 }
473 else if (rotary_state == MEDIA) {
474 tap_code(KC_MPLY); // play/pause media
475 }
476 else if (rotary_state == SCROLL_V || rotary_state == SCROLL_H) {
477 tap_code(KC_BTN3); // middle mouse button
478 }
479 }
480 return false;
481
482 /*
483 ███  ███  █████  ██████ ██████  ██████  ███████ 
484 ████  ████ ██   ██ ██      ██   ██ ██    ██ ██      
485 ██ ████ ██ ███████ ██  ██████  ██  ██ ███████ 
486 ██  ██  ██ ██   ██ ██  ██   ██ ██  ██      ██ 
487 ██      ██ ██  ██  ██████ ██  ██  ██████  ███████
488 */
489
490 case DEL_LN:
491 if (record->event.pressed) {
492 tap_code16(LCTL(KC_E)); // go to start of line
493 tap_code16(LCTL(KC_U)); // clear to beginning of line
494 }
495 break;
496 case EMAIL:
497 if (record->event.pressed) {
498 SEND_STRING("email macro not set");
499 }
500 break;
501 case PHONE:
502 if (record->event.pressed) {
503 SEND_STRING("phone macro not set");
504 }
505 break;
506 case SHEBANG:
507 if (record->event.pressed) {
508 SEND_STRING("#!/usr/bin/env ");
509 }
510 break;
511 case CHMOD:
512 if (record->event.pressed) {
513 SEND_STRING("chmod 744 *.sh ");
514 }
515 break;
516 case GT_CMT:
517 if (record->event.pressed) {
518 SEND_STRING("git commit -m ''");
519 tap_code(KC_LEFT);
520 }
521 break;
522 case PY_VENV:
523 if (record->event.pressed) {
524 SEND_STRING("source *env*/bin/activate");
525 }
526 break;
527 };
528
529 /*
530 █████  ██  ██ ██████  ██  ██████ 
531 ██   ██ ██  ██ ██   ██ ██ ██    ██ 
532 ███████ ██  ██ ██  ██ ██ ██  ██ 
533 ██   ██ ██  ██ ██  ██ ██ ██  ██ 
534 ██  ██  ██████  ██████  ██  ██████
535 */
536
537 #ifdef AUDIO_ENABLE
538 if (record->event.pressed) {
539 switch (keycode) {
540 case KC_S: // CTRL+S
541 if (CTL_MASK) {
542 PLAY_SONG(save_song);
543 }
544 break;
545 case KC_C: // CTRL+C
546 if (CTL_MASK) {
547 PLAY_SONG(copy_song);
548 }
549 break;
550 case KC_V: // CTRL+V
551 if (CTL_MASK) {
552 PLAY_SONG(paste_song);
553 }
554 break;
555 case KC_X: // CTRL+X
556 if (CTL_MASK) {
557 PLAY_SONG(cut_song);
558 }
559 break;
560 case KC_Z: // CTRL+Z
561 if (CTL_MASK) {
562 PLAY_SONG(undo_song);
563 }
564 break;
565 case KC_Y: // CTRL+Y
566 if (CTL_MASK) {
567 PLAY_SONG(redo_song);
568 }
569 break;
570 case KC_CAPS:
571 if (caps_active) {
572 PLAY_SONG(caps_on_song);
573 }
574 else {
575 PLAY_SONG(caps_off_song);
576 }
577 break;
578
579 // rotary encoder
580
581 case R_VOL:
582 case R_MEDIA:
583 case R_BRI:
584 case R_SC_V:
585 case R_SC_H:
586 case R_AR_V:
587 case R_AR_H:
588 PLAY_SONG(confirm_song);
589 break;
590
591 default:
592 if (IS_LAYER_ON(_ROTOR)) {
593 PLAY_SONG(reject_song);
594 }
595 };
596 }
597 #endif
598
599 return true;
600}
601
602void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
603
604}
605
606
607/*
608██████╗ ██████╗ ████████╗ █████╗ ██████╗ ██╗ ██╗ ███████╗███╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗██████╗
609██╔══██╗██╔═══██╗╚══██╔══╝██╔══██╗██╔══██╗╚██╗ ██╔╝ ██╔════╝████╗ ██║██╔════╝██╔═══██╗██╔══██╗██╔════╝██╔══██╗
610██████╔╝██║ ██║ ██║ ███████║██████╔╝ ╚████╔╝ █████╗ ██╔██╗ ██║██║ ██║ ██║██║ ██║█████╗ ██████╔╝
611██╔══██╗██║ ██║ ██║ ██╔══██║██╔══██╗ ╚██╔╝ ██╔══╝ ██║╚██╗██║██║ ██║ ██║██║ ██║██╔══╝ ██╔══██╗
612██║ ██║╚██████╔╝ ██║ ██║ ██║██║ ██║ ██║ ███████╗██║ ╚████║╚██████╗╚██████╔╝██████╔╝███████╗██║ ██║
613╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝
614*/
615
616
617#ifdef ENCODER_ENABLE
618void encoder_update_user(uint8_t index, bool clockwise) {
619 static int scroll_interval = 5;
620
621 switch (rotary_state) {
622 case VOLUME:
623 if (clockwise) {
624 tap_code(KC_VOLU);
625 }
626 else {
627 tap_code(KC_VOLD);
628 }
629 break;
630 case MEDIA:
631 if (clockwise) {
632 tap_code(KC_MNXT);
633 }
634 else {
635 tap_code(KC_MPRV);
636 }
637 break;
638 case BRIGHTNESS:
639 if (clockwise) {
640 tap_code(KC_BRIU);
641 }
642 else {
643 tap_code(KC_BRID);
644 }
645 break;
646 case SCROLL_V:
647 if (clockwise) {
648 // tap_code(KC_PGDN);
649 for (int i=0; i<scroll_interval; i++) {
650 tap_code(KC_WH_D);
651 }
652 }
653 else {
654 // tap_code(KC_PGUP);
655 for (int i=0; i<scroll_interval; i++) {
656 tap_code(KC_WH_U);
657 }
658 }
659 break;
660 case SCROLL_H:
661 if (clockwise) {
662 for (int i=0; i<scroll_interval; i++) {
663 tap_code(KC_WH_R);
664 }
665 }
666 else {
667 for (int i=0; i<scroll_interval; i++) {
668 tap_code(KC_WH_L);
669 }
670 }
671 break;
672 case ARROW_V:
673 if (clockwise) {
674 tap_code(KC_DOWN);
675 }
676 else {
677 tap_code(KC_UP);
678 }
679 break;
680 case ARROW_H:
681 if (clockwise) {
682 tap_code(KC_RIGHT);
683 }
684 else {
685 tap_code(KC_LEFT);
686 }
687 break;
688 }
689}
690#endif
diff --git a/keyboards/planck/keymaps/tk/rules.mk b/keyboards/planck/keymaps/tk/rules.mk
new file mode 100644
index 000000000..3e001cdf9
--- /dev/null
+++ b/keyboards/planck/keymaps/tk/rules.mk
@@ -0,0 +1,11 @@
1SRC += muse.c
2
3COMMAND_ENABLE = no
4
5AUDIO_ENABLE = yes
6
7ENCODER_ENABLE = yes
8
9MOUSEKEY_ENABLE = yes
10
11DYNAMIC_MACRO_ENABLE = yes