aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManassarn Manoonchai <manassarn@gmail.com>2019-09-07 22:06:30 +0700
committerDrashna Jaelre <drashna@live.com>2019-09-07 08:06:30 -0700
commitc21281c593d2eb9ef87053ef1d04d0b7d41be726 (patch)
tree22e7d04bd9f27e4bc481cf89791a0cf0ee4ef175
parent6ca29f2b9b02763aa3de607e8d08f14d5284918f (diff)
downloadqmk_firmware-c21281c593d2eb9ef87053ef1d04d0b7d41be726.tar.gz
qmk_firmware-c21281c593d2eb9ef87053ef1d04d0b7d41be726.zip
[Keymap] Add narze userspace (#6652)
* Refactor & reimplement mod tap macros * Reduce tapping term * Update readme * Add narze userspace * Make use of narze userspace * Extract Superduper mode * Refactor Superduper mode * (Ergodox Infinity) Prevent stuck modifiers * Update ergodox_infinity/narze likewise * Add warning for building Infinity with docker * Fix include eeprom.h in superduper * Try enabling superduper mode with combo for ergodox infinity * Apply suggestions on #4546 * Convert to 4 spaces * Map backlight step key * Replace PLAY_NOTE_ARRAY * Fix superduper toggle * Re enable audio in planck rev4 * Use perform_space_cadet * Remove superduper mod tap triggers * Add readme for planck light firmware flashing command * Remove unused layers * Remove unused keycodes * Add backlight toggle * Remove unused songs & use DEFAULT_LAYER_SONGS * Update readme * Move includes to header file
-rw-r--r--keyboards/ergodox_infinity/keymaps/narze/config.h11
-rw-r--r--keyboards/ergodox_infinity/keymaps/narze/keymap.c532
-rw-r--r--keyboards/ergodox_infinity/keymaps/narze/readme.md19
-rw-r--r--keyboards/ergodox_infinity/keymaps/narze/rules.mk5
-rw-r--r--keyboards/planck/keymaps/narze/config.h15
-rw-r--r--keyboards/planck/keymaps/narze/keymap.c595
-rw-r--r--keyboards/planck/keymaps/narze/readme.md15
-rw-r--r--keyboards/planck/keymaps/narze/rules.mk20
-rw-r--r--users/narze/narze.c1
-rw-r--r--users/narze/narze.h9
-rw-r--r--users/narze/readme.md18
-rw-r--r--users/narze/rules.mk5
-rw-r--r--users/narze/superduper.c66
-rw-r--r--users/narze/superduper.h7
14 files changed, 533 insertions, 785 deletions
diff --git a/keyboards/ergodox_infinity/keymaps/narze/config.h b/keyboards/ergodox_infinity/keymaps/narze/config.h
index 551327a12..bceb14c92 100644
--- a/keyboards/ergodox_infinity/keymaps/narze/config.h
+++ b/keyboards/ergodox_infinity/keymaps/narze/config.h
@@ -1,14 +1,11 @@
1#ifndef CONFIG_H_ 1#pragma once
2#define CONFIG_H_
3
4#include "../../config.h"
5 2
6#undef TAPPING_TERM 3#undef TAPPING_TERM
7#define TAPPING_TERM 150 4#define TAPPING_TERM 150
8 5
9// Combos not working yet 6// Combos not working yet
10// #define COMBO_TERM 20 7#define COMBO_TERM 20
11// #define COMBO_COUNT 1 8#define COMBO_COUNT 1
12// #define COMBO_ALLOW_ACTION_KEYS 9// #define COMBO_ALLOW_ACTION_KEYS
13 10
14#define IGNORE_MOD_TAP_INTERRUPT 11#define IGNORE_MOD_TAP_INTERRUPT
@@ -16,5 +13,3 @@
16 13
17#undef MOUSEKEY_DELAY 14#undef MOUSEKEY_DELAY
18#define MOUSEKEY_DELAY 100 15#define MOUSEKEY_DELAY 100
19
20#endif
diff --git a/keyboards/ergodox_infinity/keymaps/narze/keymap.c b/keyboards/ergodox_infinity/keymaps/narze/keymap.c
index d562c4a9d..e48db6f28 100644
--- a/keyboards/ergodox_infinity/keymaps/narze/keymap.c
+++ b/keyboards/ergodox_infinity/keymaps/narze/keymap.c
@@ -1,93 +1,55 @@
1#include QMK_KEYBOARD_H 1#include QMK_KEYBOARD_H
2// #include "debug.h" 2#include "narze.h"
3#include "action_layer.h"
4#include "version.h" 3#include "version.h"
5#include "eeconfig.h"
6#include "eeprom.h"
7#include "keymap_colemak.h" 4#include "keymap_colemak.h"
8 5
9extern keymap_config_t keymap_config; 6extern keymap_config_t keymap_config;
10 7
11enum ergodox_layers { 8enum ergodox_layers {
12 _QWERTY, 9 _QWERTY,
13 _COLEMAK, 10 _COLEMAK,
14 _QWOC, 11 _QWOC,
15 _LOWER, 12 _LOWER,
16 _RAISE, 13 _RAISE,
17 _PLOVER, 14 _PLOVER,
18// Intermediate layers for SuperDuper (Combo keys does not work on Infinity yet) 15 // Intermediate layers for SuperDuper (Combo keys does not work on Infinity yet)
19 _SUPER, 16 _SUPERDUPER,
20 _DUPER, 17 _MOUSE,
21 _SUPERDUPER, 18 _ADJUST,
22 _MOUSE, 19 _MDIA,
23 _ADJUST, 20 _SYMB,
24 _MDIA,
25 _SYMB,
26}; 21};
27 22
28enum ergodox_keycodes { 23enum ergodox_keycodes {
29 QWERTY = SAFE_RANGE, 24 QWERTY = SAFE_RANGE,
30 COLEMAK, 25 COLEMAK,
31 QWOC, 26 QWOC,
32 PLOVER, 27 LOWER,
33 SUPER, 28 RAISE,
34 DUPER, 29 PLOVER,
35 SUPERDUPER, 30 SUPERDUPER,
36 MOUSE, 31 MOUSE,
37 LOWER, 32 BACKLIT,
38 RAISE, 33 EXT_PLV,
39 BACKLIT, 34 SDTOGG, // Toggle SuperDuper
40 EXT_PLV, 35 EPRM,
41 SDTOGG, // Toggle SuperDuper 36 VRSN,
42 EPRM, 37 RGB_SLD,
43 VRSN, 38 GUI_UNDS,
44 RGB_SLD 39 LSFT_LPRN,
40 RSFT_RPRN,
45}; 41};
46 42
47enum functions {
48 M_GUI_UNDS, // Simulate GUI_T(KC_UNDS)
49 M_SFT_PO, // SFT_T(KC_LPRN)
50 M_SFT_PC, // SFT_T(KC_RPRN)
51};
52
53// Timer for custom mod tap
54static uint16_t m_gui_unds_timer;
55static uint16_t m_sft_po_timer;
56static uint16_t m_sft_pc_timer;
57
58// Narze : Custom Macros 43// Narze : Custom Macros
59#define HPR_ESC ALL_T(KC_ESC) 44#define HPR_ESC ALL_T(KC_ESC)
60#define SFT_ENT SFT_T(KC_ENT) 45#define SFT_ENT SFT_T(KC_ENT)
61#define SFT_PO F(M_SFT_PO) 46#define SFT_PO LSFT_LPRN
62#define SFT_PC F(M_SFT_PC) 47#define SFT_PC RSFT_RPRN
63#define GUI_MINS GUI_T(KC_MINS) 48#define GUI_MINS GUI_T(KC_MINS)
64#define GUI_UNDS F(M_GUI_UNDS)
65
66// Combo : SuperDuper layer from S+D (R+S in Colemak)
67// #define COMBO_COUNT 1
68// #define SUPERDUPER_COMBO_COUNT 3
69// #define EECONFIG_SUPERDUPER_INDEX (uint8_t *) 19
70
71// enum process_combo_event {
72// CB_SUPERDUPER,
73// };
74
75// const uint16_t PROGMEM superduper_combos[SUPERDUPER_COMBO_COUNT][3] = {
76// [_QWERTY] = {KC_S, KC_D, COMBO_END},
77// [_COLEMAK] = {KC_R, KC_S, COMBO_END},
78// [_QWOC] = {CM_S, CM_D, COMBO_END},
79// };
80
81// combo_t PROGMEM key_combos[COMBO_COUNT] = {
82// [CB_SUPERDUPER] = COMBO_ACTION(superduper_combos[_QWERTY]),
83// };
84
85// volatile bool superduper_enabled = true;
86 49
87// const uint16_t empty_combo[] = {COMBO_END}; 50enum process_combo_event {
88 51 CB_SUPERDUPER,
89// void set_superduper_key_combos(void); 52};
90// void clear_superduper_key_combos(void);
91 53
92const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 54const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
93/* Qwerty 55/* Qwerty
@@ -115,7 +77,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
115 // left hand 77 // left hand
116 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO), 78 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO),
117 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, LT(_SYMB, KC_NO), 79 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, LT(_SYMB, KC_NO),
118 HPR_ESC, KC_A, LT(_SUPER, KC_S), LT(_DUPER, KC_D), KC_F, KC_G, 80 HPR_ESC, KC_A, KC_S, KC_D, KC_F, KC_G,
119 SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), 81 SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
120 LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER, 82 LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER,
121 KC_ENT, KC_LGUI, 83 KC_ENT, KC_LGUI,
@@ -156,7 +118,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
156 // left hand 118 // left hand
157 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO), 119 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO),
158 KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, LT(_SYMB, KC_NO), 120 KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, LT(_SYMB, KC_NO),
159 HPR_ESC, KC_A, LT(_SUPER,KC_R), LT(_DUPER,KC_S), KC_T, KC_D, 121 HPR_ESC, KC_A, KC_R, KC_S, KC_T, KC_D,
160 SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), 122 SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
161 LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER, 123 LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER,
162 KC_ENT, KC_LGUI, 124 KC_ENT, KC_LGUI,
@@ -177,7 +139,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
177 // left hand 139 // left hand
178 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO), 140 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO),
179 KC_TAB, CM_Q, CM_W, CM_E, CM_R, CM_T, LT(_SYMB, KC_NO), 141 KC_TAB, CM_Q, CM_W, CM_E, CM_R, CM_T, LT(_SYMB, KC_NO),
180 HPR_ESC, CM_A, LT(_SUPER,CM_S), LT(_DUPER,CM_D), CM_F, CM_G, 142 HPR_ESC, CM_A, CM_S, CM_D, CM_F, CM_G,
181 SFT_PO, LT(_MOUSE, CM_Z), CM_X, CM_C, CM_V, CM_B, ALL_T(KC_NO), 143 SFT_PO, LT(_MOUSE, CM_Z), CM_X, CM_C, CM_V, CM_B, ALL_T(KC_NO),
182 LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER, 144 LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER,
183 KC_ENT, KC_LGUI, 145 KC_ENT, KC_LGUI,
@@ -357,47 +319,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
357 _______, 319 _______,
358 _______,_______, KC_LSFT 320 _______,_______, KC_LSFT
359 ), 321 ),
360// Intermediate keymaps for SuperDuper (Combo keys does not work on Infinity yet)
361[_SUPER] = LAYOUT_ergodox(
362 // left hand
363 _______, _______, _______, _______, _______, _______, _______,
364 _______, _______, _______, _______, _______, _______, _______,
365 _______, _______, _______, DUPER, _______, _______,
366 _______, _______, _______, _______, _______, _______, _______,
367 _______, _______, _______, _______, _______,
368 _______, _______,
369 _______,
370 _______,_______,_______,
371 // right hand
372 _______, _______, _______, _______, _______, _______, _______,
373 _______, _______, _______, _______, _______, _______, _______,
374 _______, _______, _______, _______, _______, _______,
375 _______, _______, _______, _______, _______, _______, _______,
376 _______, _______, _______, _______, _______,
377 _______, _______,
378 _______,
379 _______,_______, _______
380 ),
381[_DUPER] = LAYOUT_ergodox(
382 // left hand
383 _______, _______, _______, _______, _______, _______, _______,
384 _______, _______, _______, _______, _______, _______, _______,
385 _______, _______, SUPER, _______, _______, _______,
386 _______, _______, _______, _______, _______, _______, _______,
387 _______, _______, _______, _______, _______,
388 _______, _______,
389 _______,
390 _______,_______,_______,
391 // right hand
392 _______, _______, _______, _______, _______, _______, _______,
393 _______, _______, _______, _______, _______, _______, _______,
394 _______, _______, _______, _______, _______, _______,
395 _______, _______, _______, _______, _______, _______, _______,
396 _______, _______, _______, _______, _______,
397 _______, _______,
398 _______,
399 _______,_______, _______
400 ),
401 322
402/* Mouse 323/* Mouse
403 * 324 *
@@ -452,7 +373,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
452 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| 373 * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
453 * | | | | | | | | | |SDTogg| | | | | | 374 * | | | | | | | | | |SDTogg| | | | | |
454 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' 375 * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
455 * | | | | | | | | | | | | 376 * | | | | | | | | | | | BACKLIT|
456 * `----------------------------------' `----------------------------------' 377 * `----------------------------------' `----------------------------------'
457 * ,-------------. ,-------------. 378 * ,-------------. ,-------------.
458 * | | | | | | 379 * | | | | | |
@@ -477,7 +398,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
477 _______, _______, _______, _______, _______, _______, KC_DEL, 398 _______, _______, _______, _______, _______, _______, KC_DEL,
478 AG_SWAP, QWERTY, COLEMAK, QWOC, PLOVER, _______, 399 AG_SWAP, QWERTY, COLEMAK, QWOC, PLOVER, _______,
479 _______, SDTOGG, _______, _______, _______, _______, _______, 400 _______, SDTOGG, _______, _______, _______, _______, _______,
480 _______, _______, _______, _______, _______, 401 _______, _______, _______, _______, BACKLIT,
481 _______, _______, 402 _______, _______,
482 _______, 403 _______,
483 _______,_______, _______ 404 _______,_______, _______
@@ -569,146 +490,123 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
569) 490)
570}; 491};
571 492
572void persistant_default_layer_set(uint16_t default_layer) {
573 eeconfig_update_default_layer(default_layer);
574 default_layer_set(default_layer);
575}
576
577bool process_record_user(uint16_t keycode, keyrecord_t *record) { 493bool process_record_user(uint16_t keycode, keyrecord_t *record) {
578 switch (keycode) { 494 switch (keycode) {
579 case QWERTY: 495 case QWERTY:
580 if (record->event.pressed) { 496 if (record->event.pressed) {
581 persistant_default_layer_set(1UL<<_QWERTY); 497 set_single_persistent_default_layer(_QWERTY);
582 498
583 // key_combos[CB_SUPERDUPER].keys = superduper_combos[_QWERTY]; 499 set_superduper_key_combo_layer(_QWERTY);
584 // eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _QWERTY); 500 }
585 } 501 return false;
586 return false; 502
587 break; 503 case COLEMAK:
588 case COLEMAK: 504 if (record->event.pressed) {
589 if (record->event.pressed) { 505 set_single_persistent_default_layer(_COLEMAK);
590 persistant_default_layer_set(1UL<<_COLEMAK); 506
591 507 set_superduper_key_combo_layer(_COLEMAK);
592 // key_combos[CB_SUPERDUPER].keys = superduper_combos[_COLEMAK]; 508 }
593 // eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _COLEMAK); 509 return false;
594 } 510
595 return false; 511 case QWOC:
596 break; 512 if (record->event.pressed) {
597 case QWOC: 513 set_single_persistent_default_layer(_QWOC);
598 if (record->event.pressed) { 514
599 persistant_default_layer_set(1UL<<_QWOC); 515 set_superduper_key_combo_layer(_QWOC);
600 516 }
601 // key_combos[CB_SUPERDUPER].keys = superduper_combos[_QWOC]; 517 return false;
602 // eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _QWOC); 518
603 } 519 case LOWER:
604 return false; 520 if (record->event.pressed) {
605 break; 521 layer_on(_LOWER);
606 case LOWER: 522 update_tri_layer(_LOWER, _RAISE, _ADJUST);
607 if (record->event.pressed) { 523 } else {
608 layer_on(_LOWER); 524 layer_off(_LOWER);
609 update_tri_layer(_LOWER, _RAISE, _ADJUST); 525 update_tri_layer(_LOWER, _RAISE, _ADJUST);
610 } else { 526 }
611 layer_off(_LOWER); 527 return false;
612 update_tri_layer(_LOWER, _RAISE, _ADJUST); 528
613 } 529 case RAISE:
614 return false; 530 if (record->event.pressed) {
615 break; 531 layer_on(_RAISE);
616 case RAISE: 532 update_tri_layer(_LOWER, _RAISE, _ADJUST);
617 if (record->event.pressed) { 533 } else {
618 layer_on(_RAISE); 534 layer_off(_RAISE);
619 update_tri_layer(_LOWER, _RAISE, _ADJUST); 535 update_tri_layer(_LOWER, _RAISE, _ADJUST);
620 } else { 536 }
621 layer_off(_RAISE); 537 return false;
622 update_tri_layer(_LOWER, _RAISE, _ADJUST); 538
623 } 539 case BACKLIT:
624 return false; 540 if (record->event.pressed) {
625 break; 541 register_code(KC_RSFT);
626 case SUPER: 542 #ifdef BACKLIGHT_ENABLE
627 if (record->event.pressed) { 543 backlight_step();
628 layer_on(_SUPER); 544 #endif
629 update_tri_layer(_SUPER, _DUPER, _SUPERDUPER); 545 } else {
630 } else { 546 unregister_code(KC_RSFT);
631 layer_off(_SUPER); 547 }
632 update_tri_layer(_SUPER, _DUPER, _SUPERDUPER); 548 return false;
633 } 549
634 return false; 550 case PLOVER:
635 break; 551 if (record->event.pressed) {
636 case DUPER: 552 layer_off(_RAISE);
637 if (record->event.pressed) { 553 layer_off(_LOWER);
638 layer_on(_DUPER); 554 layer_off(_ADJUST);
639 update_tri_layer(_SUPER, _DUPER, _SUPERDUPER); 555 layer_on(_PLOVER);
640 } else { 556 if (!eeconfig_is_enabled()) {
641 layer_off(_DUPER); 557 eeconfig_init();
642 update_tri_layer(_SUPER, _DUPER, _SUPERDUPER); 558 }
643 } 559 keymap_config.raw = eeconfig_read_keymap();
644 return false; 560 keymap_config.nkro = 1;
645 break; 561 eeconfig_update_keymap(keymap_config.raw);
646 case BACKLIT: 562 }
647 if (record->event.pressed) { 563 return false;
648 register_code(KC_RSFT); 564
649 #ifdef BACKLIGHT_ENABLE 565 case EXT_PLV:
650 backlight_step(); 566 if (record->event.pressed) {
651 #endif 567 layer_off(_PLOVER);
652 } else { 568 }
653 unregister_code(KC_RSFT); 569 return false;
654 } 570
655 return false; 571 case SDTOGG:
656 break; 572 if (record->event.pressed) {
657 case PLOVER: 573 toggle_superduper_mode();
658 if (record->event.pressed) { 574 }
659 layer_off(_RAISE); 575 return false;
660 layer_off(_LOWER); 576
661 layer_off(_ADJUST); 577 case VRSN:
662 layer_on(_PLOVER); 578 if (record->event.pressed) {
663 if (!eeconfig_is_enabled()) { 579 SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
664 eeconfig_init(); 580 }
665 } 581 return false;
666 keymap_config.raw = eeconfig_read_keymap(); 582
667 keymap_config.nkro = 1; 583 case RGB_SLD:
668 eeconfig_update_keymap(keymap_config.raw); 584 if (record->event.pressed) {
669 } 585 #ifdef RGBLIGHT_ENABLE
670 return false; 586 rgblight_mode(1);
671 break; 587 #endif
672 case EXT_PLV: 588 }
673 if (record->event.pressed) { 589 return false;
674 layer_off(_PLOVER); 590
675 } 591 // Macros
676 return false; 592
677 break; 593 // 1. Hold for LGUI, tap for Underscore
678 case SDTOGG: 594 case GUI_UNDS:
679 if (record->event.pressed) { 595 perform_space_cadet(record, KC_LGUI, KC_LSFT, KC_MINS);
680 // superduper_enabled = !superduper_enabled; 596 return false;
681 597
682 // if (superduper_enabled) { 598 // 2. Hold for LSHIFT, tap for Parens open
683 // set_superduper_key_combos(); 599 case LSFT_LPRN:
684 // } else { 600 perform_space_cadet(record, KC_LSFT, KC_LSFT, KC_9);
685 // clear_superduper_key_combos(); 601 return false;
686 // } 602
687 } 603 // 3. Hold for RSHIFT, tap for Parens close
688 return false; 604 case RSFT_RPRN:
689 break; 605 perform_space_cadet(record, KC_RSFT, KC_RSFT, KC_0);
690 case EPRM: 606 return false;
691 if (record->event.pressed) { 607
692 eeconfig_init(); 608 }
693 } 609 return true;
694 return false;
695 break;
696 case VRSN:
697 if (record->event.pressed) {
698 SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
699 }
700 return false;
701 break;
702 case RGB_SLD:
703 if (record->event.pressed) {
704 #ifdef RGBLIGHT_ENABLE
705 rgblight_mode(1);
706 #endif
707 }
708 return false;
709 break;
710 }
711 return true;
712} 610}
713 611
714void matrix_init_user(void) { 612void matrix_init_user(void) {
@@ -716,25 +614,9 @@ void matrix_init_user(void) {
716} 614}
717 615
718void matrix_setup(void) { 616void matrix_setup(void) {
719 // set_superduper_key_combos(); 617 set_superduper_key_combos();
720} 618}
721 619
722// void set_superduper_key_combos(void) {
723// uint8_t layer = eeprom_read_byte(EECONFIG_SUPERDUPER_INDEX);
724
725// switch (layer) {
726// case _QWERTY:
727// case _COLEMAK:
728// case _QWOC:
729// key_combos[CB_SUPERDUPER].keys = superduper_combos[layer];
730// break;
731// }
732// }
733
734// void clear_superduper_key_combos(void) {
735// key_combos[CB_SUPERDUPER].keys = empty_combo;
736// }
737
738void matrix_scan_user(void) { 620void matrix_scan_user(void) {
739 // uint8_t layer = biton32(layer_state); 621 // uint8_t layer = biton32(layer_state);
740 622
@@ -758,91 +640,17 @@ void matrix_scan_user(void) {
758 640
759// Combos 641// Combos
760 642
761// void process_combo_event(uint8_t combo_index, bool pressed) { 643void process_combo_event(uint8_t combo_index, bool pressed) {
762// if (pressed) { 644 if (pressed) {
763// switch(combo_index) { 645 switch(combo_index) {
764// case CB_SUPERDUPER: 646 case CB_SUPERDUPER:
765// layer_on(_SUPERDUPER); 647 layer_on(_SUPERDUPER);
766// ergodox_board_led_on(); 648 ergodox_board_led_on();
767// break; 649 break;
768// }
769// } else {
770// layer_off(_SUPERDUPER);
771// ergodox_board_led_off();
772// unregister_mods(MOD_BIT(KC_LGUI) | MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); // Sometimes mods are held, unregister them
773// }
774// }
775
776// Macros
777
778const uint16_t PROGMEM fn_actions[] = {
779 [M_GUI_UNDS] = ACTION_MACRO_TAP(M_GUI_UNDS),
780 [M_SFT_PO] = ACTION_MACRO_TAP(M_SFT_PO),
781 [M_SFT_PC] = ACTION_MACRO_TAP(M_SFT_PC),
782};
783
784const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
785{
786 bool tap_not_interrupted = record->tap.count > 0 && !record->tap.interrupted;
787
788 switch(id) {
789 // Hold for LGUI, tap for Underscore
790 case M_GUI_UNDS:
791 if (record->event.pressed) {
792 m_gui_unds_timer = timer_read();
793
794 if (!tap_not_interrupted) {
795 register_mods(MOD_BIT(KC_LGUI));
796 } 650 }
797 } else { 651 } else {
798 if (tap_not_interrupted && timer_elapsed(m_gui_unds_timer) < TAPPING_TERM) { 652 layer_off(_SUPERDUPER);
799 653 ergodox_board_led_off();
800 add_weak_mods(MOD_BIT(KC_LSFT)); 654 unregister_mods(MOD_BIT(KC_LGUI) | MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); // Sometimes mods are held, unregister them
801 send_keyboard_report(); 655 }
802 register_code(KC_MINS); 656}
803 unregister_code(KC_MINS);
804 del_weak_mods(MOD_BIT(KC_LSFT));
805 send_keyboard_report();
806 record->tap.count = 0; // ad hoc: cancel tap
807 } else {
808 unregister_mods(MOD_BIT(KC_LGUI));
809 }
810 }
811 break;
812 // Hold for LSHIFT, tap for Parens open
813 case M_SFT_PO:
814 if (record->event.pressed) {
815 m_sft_po_timer = timer_read();
816
817 if (!tap_not_interrupted) {
818 register_mods(MOD_BIT(KC_LSFT));
819 }
820 } else {
821 if (tap_not_interrupted && timer_elapsed(m_sft_po_timer) < TAPPING_TERM) {
822 record->tap.count = 0;
823 return MACRO(D(RSFT), T(9), U(RSFT), END);
824 } else {
825 unregister_mods(MOD_BIT(KC_LSFT));
826 }
827 }
828 break;
829 // Hold for RSHIFT, tap for Parens close
830 case M_SFT_PC:
831 if (record->event.pressed) {
832 m_sft_pc_timer = timer_read();
833
834 if (!tap_not_interrupted) {
835 register_mods(MOD_BIT(KC_RSFT));
836 }
837 } else {
838 if (tap_not_interrupted && timer_elapsed(m_sft_pc_timer) < TAPPING_TERM) {
839 record->tap.count = 0;
840 return MACRO(D(LSFT), T(0), U(LSFT), END);
841 } else {
842 unregister_mods(MOD_BIT(KC_RSFT));
843 }
844 }
845 break;
846 }
847 return MACRO_NONE;
848};
diff --git a/keyboards/ergodox_infinity/keymaps/narze/readme.md b/keyboards/ergodox_infinity/keymaps/narze/readme.md
index 03a72f1ac..f24fc05fe 100644
--- a/keyboards/ergodox_infinity/keymaps/narze/readme.md
+++ b/keyboards/ergodox_infinity/keymaps/narze/readme.md
@@ -25,21 +25,22 @@ Press `S+D` simultaneously and hold, then...
25- It can be activated by holding `/` as well, but it's slower since `LT()` uses `TAPPING_TERM` of 200ms but `S+D` uses `COMBO_TERM` of only 20ms (Can be changed within config.h) 25- It can be activated by holding `/` as well, but it's slower since `LT()` uses `TAPPING_TERM` of 200ms but `S+D` uses `COMBO_TERM` of only 20ms (Can be changed within config.h)
26 26
27## Build instructions 27## Build instructions
28- `cd /path/to/qmk_firmware` 28If your environment is ready to build with `make`, don't use docker since it takes 5m+ to compile.
29Use the instructions in Ergodox Infinity's readme.
29 30
30#### Left side 31#### Left side (Docker)
31 ``` 32```
32docker run -e keymap=narze -e subproject=infinity -e keyboard=ergodox --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware 33cd /path/to/qmk_firmware
34util/docker_build.sh ergodox_infinity:narze
33avr-objcopy -Iihex -Obinary .build/ergodox_infinity_narze.hex .build/ergodox_infinity_narze_left.bin 35avr-objcopy -Iihex -Obinary .build/ergodox_infinity_narze.hex .build/ergodox_infinity_narze_left.bin
34dfu-util --device 1c11:b007 -D .build/ergodox_infinity_narze_left.bin 36dfu-util --device 1c11:b007 -D .build/ergodox_infinity_narze_left.bin
35``` 37```
36 38
37#### Right side 39#### Right side (Docker)
40You have to override `usb_args` in order to pass `MASTER=right` to docker using provided build script.
38``` 41```
39docker run -e keymap=narze -e subproject=infinity -e keyboard=ergodox -e MASTER=right --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware 42cd /path/to/qmk_firmware
43usb_args="-e MASTER=right" util/docker_build.sh ergodox_infinity:narze
40avr-objcopy -Iihex -Obinary .build/ergodox_infinity_narze.hex .build/ergodox_infinity_narze_right.bin 44avr-objcopy -Iihex -Obinary .build/ergodox_infinity_narze.hex .build/ergodox_infinity_narze_right.bin
41dfu-util --device 1c11:b007 -D .build/ergodox_infinity_narze_right.bin 45dfu-util --device 1c11:b007 -D .build/ergodox_infinity_narze_right.bin
42``` 46```
43
44## TODO
45- [ ] Make SuperDuper mode fully-compatible in Windows by swapping GUI with Ctrl
diff --git a/keyboards/ergodox_infinity/keymaps/narze/rules.mk b/keyboards/ergodox_infinity/keymaps/narze/rules.mk
index bd89bb9d9..4bfa4fde2 100644
--- a/keyboards/ergodox_infinity/keymaps/narze/rules.mk
+++ b/keyboards/ergodox_infinity/keymaps/narze/rules.mk
@@ -15,10 +15,9 @@ MIDI_ENABLE = no # MIDI controls
15AUDIO_ENABLE = no # Audio output on port C6 15AUDIO_ENABLE = no # Audio output on port C6
16UNICODE_ENABLE = no # Unicode 16UNICODE_ENABLE = no # Unicode
17BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID 17BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
18RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. 18RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
19 19
20# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE 20# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
21SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend 21SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
22 22
23# Combos not working yet 23COMBO_ENABLE = yes
24COMBO_ENABLE = no
diff --git a/keyboards/planck/keymaps/narze/config.h b/keyboards/planck/keymaps/narze/config.h
index 19d784b2b..9c5876a13 100644
--- a/keyboards/planck/keymaps/narze/config.h
+++ b/keyboards/planck/keymaps/narze/config.h
@@ -1,7 +1,4 @@
1#ifndef CONFIG_USER_H 1#pragma once
2#define CONFIG_USER_H
3
4#include "../../config.h"
5 2
6/* 3/*
7 * MIDI options 4 * MIDI options
@@ -26,7 +23,8 @@
26/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ 23/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
27//#define MIDI_TONE_KEYCODE_OCTAVES 2 24//#define MIDI_TONE_KEYCODE_OCTAVES 2
28 25
29#define TAPPING_TERM 200 26#undef TAPPING_TERM
27#define TAPPING_TERM 100
30 28
31#define COMBO_TERM 20 29#define COMBO_TERM 20
32#define COMBO_COUNT 1 30#define COMBO_COUNT 1
@@ -38,4 +36,11 @@
38 36
39#define MOUSEKEY_DELAY 100 37#define MOUSEKEY_DELAY 100
40 38
39#ifdef AUDIO_ENABLE
40 #define STARTUP_SONG SONG(PLANCK_SOUND)
41
42 #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
43 SONG(COLEMAK_SOUND), \
44 SONG(DVORAK_SOUND) \
45 }
41#endif 46#endif
diff --git a/keyboards/planck/keymaps/narze/keymap.c b/keyboards/planck/keymaps/narze/keymap.c
index 8f6cb0626..24740f92d 100644
--- a/keyboards/planck/keymaps/narze/keymap.c
+++ b/keyboards/planck/keymaps/narze/keymap.c
@@ -1,89 +1,49 @@
1// This is the canonical layout file for the Quantum project. If you want to add another keyboard, 1#include QMK_KEYBOARD_H
2// this is the style you want to emulate. 2#include "narze.h"
3
4#pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example"
5#include "planck.h"
6#include "action_layer.h"
7#ifdef AUDIO_ENABLE 3#ifdef AUDIO_ENABLE
8 #include "audio.h" 4 #include "audio.h"
9#endif 5#endif
10#include "eeconfig.h"
11#include "keymap_colemak.h" 6#include "keymap_colemak.h"
12 7
13extern keymap_config_t keymap_config; 8extern keymap_config_t keymap_config;
14 9
15// Each layer gets a name for readability, which is then used in the keymap matrix below.
16// The underscores don't mean anything - you can have a layer called STUFF or any other name.
17// Layer names don't all need to be of the same length, obviously, and you can also skip them
18// entirely and just use numbers.
19
20enum planck_layers { 10enum planck_layers {
21 _QWERTY, 11 _QWERTY,
22 _COLEMAK, 12 _COLEMAK,
23 _QWOC, 13 _QWOC,
24 _LOWER, 14 _LOWER,
25 _RAISE, 15 _RAISE,
26 _PLOVER, 16 _PLOVER,
27 _SUPERDUPER, 17 _SUPERDUPER,
28 _MOUSE, 18 _MOUSE,
29 _ADJUST 19 _ADJUST
30}; 20};
31 21
32enum planck_keycodes { 22enum planck_keycodes {
33 QWERTY = SAFE_RANGE, 23 QWERTY = SAFE_RANGE,
34 COLEMAK, 24 COLEMAK,
35 QWOC, 25 QWOC,
36 PLOVER, 26 PLOVER,
37 SUPERDUPER, 27 SUPERDUPER,
38 MOUSE, 28 MOUSE,
39 LOWER, 29 LOWER,
40 RAISE, 30 RAISE,
41 BACKLIT, 31 BACKLIT,
42 EXT_PLV, 32 EXT_PLV,
43 SDTOGG, // Toggle SuperDuper 33 SDTOGG, // Toggle SuperDuper
44}; 34 GUI_UNDS,
45 35 LSFT_LPRN,
46enum functions {
47 M_GUI_UNDS, // Simulate GUI_T(KC_UNDS)
48 M_SFT_PO, // SFT_T(KC_LPRN)
49}; 36};
50 37
51// Timer for custom mod tap
52static uint16_t m_gui_unds_timer;
53static uint16_t m_sft_po_timer;
54
55// Narze : Custom Macros 38// Narze : Custom Macros
56#define HPR_ESC ALL_T(KC_ESC) 39#define HPR_ESC ALL_T(KC_ESC)
57#define SFT_ENT SFT_T(KC_ENT) 40#define SFT_ENT SFT_T(KC_ENT)
58#define SFT_PO F(M_SFT_PO)
59#define GUI_MINS GUI_T(KC_MINS) 41#define GUI_MINS GUI_T(KC_MINS)
60#define GUI_UNDS F(M_GUI_UNDS)
61
62// Combo : SuperDuper layer from S+D (R+S in Colemak)
63#define SUPERDUPER_COMBO_COUNT 3
64#define EECONFIG_SUPERDUPER_INDEX (uint8_t *) 19
65 42
66enum process_combo_event { 43enum process_combo_event {
67 CB_SUPERDUPER, 44 CB_SUPERDUPER,
68}; 45};
69 46
70const uint16_t PROGMEM superduper_combos[SUPERDUPER_COMBO_COUNT][3] = {
71 [_QWERTY] = {KC_S, KC_D, COMBO_END},
72 [_COLEMAK] = {KC_R, KC_S, COMBO_END},
73 [_QWOC] = {CM_S, CM_D, COMBO_END},
74};
75
76combo_t key_combos[COMBO_COUNT] = {
77 [CB_SUPERDUPER] = COMBO_ACTION(superduper_combos[_QWERTY]),
78};
79
80volatile bool superduper_enabled = true;
81
82const uint16_t empty_combo[] = {COMBO_END};
83
84void set_superduper_key_combos(void);
85void clear_superduper_key_combos(void);
86
87const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 47const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
88 48
89/* Qwerty 49/* Qwerty
@@ -97,12 +57,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
97 * | Rse/[| Ctrl | Alt | GUI/_|Lower | Space |Raise | GUI/-| Alt | Ctrl | Low/]| 57 * | Rse/[| Ctrl | Alt | GUI/_|Lower | Space |Raise | GUI/-| Alt | Ctrl | Low/]|
98 * `-----------------------------------------------------------------------------------' 58 * `-----------------------------------------------------------------------------------'
99 */ 59 */
100[_QWERTY] = { 60[_QWERTY] = LAYOUT_planck_grid(
101 {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, 61 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
102 {HPR_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, 62 HPR_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
103 {SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, LT(_SUPERDUPER, KC_SLSH), SFT_ENT}, 63 LSFT_LPRN, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, LT(_SUPERDUPER, KC_SLSH), SFT_ENT,
104 {LT(_RAISE, KC_LBRC), KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_SPC, KC_SPC, RAISE, GUI_MINS, KC_RALT, KC_RCTL, LT(_LOWER, KC_RBRC)} 64 LT(_RAISE, KC_LBRC), KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_SPC, KC_SPC, RAISE, GUI_MINS, KC_RALT, KC_RCTL, LT(_LOWER, KC_RBRC)
105}, 65),
106 66
107/* Colemak 67/* Colemak
108 * ,-----------------------------------------------------------------------------------. 68 * ,-----------------------------------------------------------------------------------.
@@ -115,20 +75,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
115 * | Brite| Ctrl | Alt | GUI/_|Lower | Space |Raise | GUI/-| Alt | Ctrl | Low/]| 75 * | Brite| Ctrl | Alt | GUI/_|Lower | Space |Raise | GUI/-| Alt | Ctrl | Low/]|
116 * `-----------------------------------------------------------------------------------' 76 * `-----------------------------------------------------------------------------------'
117 */ 77 */
118[_COLEMAK] = { 78[_COLEMAK] = LAYOUT_planck_grid(
119 {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, 79 KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
120 {HPR_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, 80 HPR_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
121 {SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, LT(_SUPERDUPER, KC_SLSH), SFT_ENT}, 81 LSFT_LPRN, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, LT(_SUPERDUPER, KC_SLSH), SFT_ENT,
122 {LT(_RAISE, KC_LBRC), KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_SPC, KC_SPC, RAISE, GUI_MINS, KC_RALT, KC_RCTL, LT(_LOWER, KC_RBRC)} 82 LT(_RAISE, KC_LBRC), KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_SPC, KC_SPC, RAISE, GUI_MINS, KC_RALT, KC_RCTL, LT(_LOWER, KC_RBRC)
123}, 83),
124 84
125/* Qwerty on software Colemak : Useful for gaming with qwerty keymaps! */ 85/* Qwerty on software Colemak : Useful for gaming with qwerty keymaps! */
126[_QWOC] = { 86[_QWOC] = LAYOUT_planck_grid(
127 {KC_TAB, CM_Q, CM_W, CM_E, CM_R, CM_T, CM_Y, CM_U, CM_I, CM_O, CM_P, KC_BSPC}, 87 KC_TAB, CM_Q, CM_W, CM_E, CM_R, CM_T, CM_Y, CM_U, CM_I, CM_O, CM_P, KC_BSPC,
128 {HPR_ESC, CM_A, CM_S, CM_D, CM_F, CM_G, CM_H, CM_J, CM_K, CM_L, CM_SCLN, KC_QUOT}, 88 HPR_ESC, CM_A, CM_S, CM_D, CM_F, CM_G, CM_H, CM_J, CM_K, CM_L, CM_SCLN, KC_QUOT,
129 {SFT_PO, LT(_MOUSE, CM_Z), CM_X, CM_C, CM_V, CM_B, CM_N, CM_M, CM_COMM, CM_DOT, LT(_SUPERDUPER, CM_SLSH), SFT_ENT}, 89 LSFT_LPRN, LT(_MOUSE, CM_Z), CM_X, CM_C, CM_V, CM_B, CM_N, CM_M, CM_COMM, CM_DOT, LT(_SUPERDUPER, CM_SLSH), SFT_ENT,
130 {LT(_RAISE, KC_LBRC), KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_SPC, KC_SPC, RAISE, GUI_MINS, KC_RALT, KC_RCTL, LT(_LOWER, KC_RBRC)} 90 LT(_RAISE, KC_LBRC), KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_SPC, KC_SPC, RAISE, GUI_MINS, KC_RALT, KC_RCTL, LT(_LOWER, KC_RBRC)
131}, 91),
132 92
133/* Lower 93/* Lower
134 * ,-----------------------------------------------------------------------------------. 94 * ,-----------------------------------------------------------------------------------.
@@ -136,17 +96,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
136 * |------+------+------+------+------+-------------+------+------+------+------+------| 96 * |------+------+------+------+------+-------------+------+------+------+------+------|
137 * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | 97 * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
138 * |------+------+------+------+------+------|------+------+------+------+------+------| 98 * |------+------+------+------+------+------|------+------+------+------+------+------|
139 * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Sft/Ent| 99 * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ | | | |Sft/Ent|
140 * |------+------+------+------+------+------+------+------+------+------+------+------| 100 * |------+------+------+------+------+------+------+------+------+------+------+------|
141 * | | | | | | | | Next | Vol- | Vol+ | Play | 101 * | | | | | | | | Next | Vol- | Vol+ | Play |
142 * `-----------------------------------------------------------------------------------' 102 * `-----------------------------------------------------------------------------------'
143 */ 103 */
144[_LOWER] = { 104[_LOWER] = LAYOUT_planck_grid(
145 {KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, 105 KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
146 {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, 106 KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
147 {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______}, 107 _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),_______,_______, _______, _______,
148 {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} 108 _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
149}, 109),
150 110
151/* Raise 111/* Raise
152 * ,-----------------------------------------------------------------------------------. 112 * ,-----------------------------------------------------------------------------------.
@@ -154,17 +114,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
154 * |------+------+------+------+------+-------------+------+------+------+------+------| 114 * |------+------+------+------+------+-------------+------+------+------+------+------|
155 * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | 115 * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
156 * |------+------+------+------+------+------|------+------+------+------+------+------| 116 * |------+------+------+------+------+------|------+------+------+------+------+------|
157 * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Sft/Ent| 117 * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # | | | |Sft/Ent|
158 * |------+------+------+------+------+------+------+------+------+------+------+------| 118 * |------+------+------+------+------+------+------+------+------+------+------+------|
159 * | | | | | | | | Next | Vol- | Vol+ | Play | 119 * | | | | | | | | Next | Vol- | Vol+ | Play |
160 * `-----------------------------------------------------------------------------------' 120 * `-----------------------------------------------------------------------------------'
161 */ 121 */
162[_RAISE] = { 122[_RAISE] = LAYOUT_planck_grid(
163 {KC_TILD, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, 123 KC_TILD, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
164 {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, 124 KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
165 {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______}, 125 _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, _______, _______, _______, _______,
166 {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} 126 _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
167}, 127),
168 128
169/* Plover layer (http://opensteno.org) 129/* Plover layer (http://opensteno.org)
170 * ,-----------------------------------------------------------------------------------. 130 * ,-----------------------------------------------------------------------------------.
@@ -178,12 +138,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
178 * `-----------------------------------------------------------------------------------' 138 * `-----------------------------------------------------------------------------------'
179 */ 139 */
180 140
181[_PLOVER] = { 141[_PLOVER] = LAYOUT_planck_grid(
182 {KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 }, 142 KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 ,
183 {XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC}, 143 XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
184 {XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, 144 XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
185 {EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX} 145 EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX
186}, 146),
187 147
188/* SuperDuper : https://gist.github.com/narze/861e2167784842d38771 148/* SuperDuper : https://gist.github.com/narze/861e2167784842d38771
189 * /-----------------------------------------------------------------------------------\ 149 * /-----------------------------------------------------------------------------------\
@@ -196,12 +156,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
196 * | | | | | | Shift | | | | | | 156 * | | | | | | Shift | | | | | |
197 * \-----------------------------------------------------------------------------------/ 157 * \-----------------------------------------------------------------------------------/
198 */ 158 */
199[_SUPERDUPER] = { 159[_SUPERDUPER] = LAYOUT_planck_grid(
200 {_______, _______, _______, _______, _______, _______, _______, _______, S(LGUI(KC_LBRC)), S(LGUI(KC_RBRC)), _______, _______}, 160 _______, _______, _______, _______, _______, _______, _______, _______, S(LGUI(KC_LBRC)), S(LGUI(KC_RBRC)), _______, _______,
201 {_______, KC_LALT, _______, _______, KC_BSPC, KC_LGUI, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_DEL, _______}, 161 _______, KC_LALT, _______, _______, KC_BSPC, KC_LGUI, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_DEL, _______,
202 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, 162 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
203 {_______, _______, _______, _______, _______, KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______} 163 _______, _______, _______, _______, _______, KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______
204}, 164),
205 165
206/* Mouse 166/* Mouse
207 * /-----------------------------------------------------------------------------------\ 167 * /-----------------------------------------------------------------------------------\
@@ -214,12 +174,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
214 * | | | | | M2 | LeftClick | M2 | | | | | 174 * | | | | | M2 | LeftClick | M2 | | | | |
215 * \-----------------------------------------------------------------------------------/ 175 * \-----------------------------------------------------------------------------------/
216 */ 176 */
217[_MOUSE] = { 177[_MOUSE] = LAYOUT_planck_grid(
218 {_______, _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, _______, _______, KC_WH_U, KC_WH_D, _______, _______}, 178 _______, _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, _______, _______, KC_WH_U, KC_WH_D, _______, _______,
219 {_______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, _______}, 179 _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, _______,
220 {_______, _______, _______, _______, _______, KC_BTN3, KC_BTN3, _______, _______, _______, _______, _______}, 180 _______, _______, _______, _______, _______, KC_BTN3, KC_BTN3, _______, _______, _______, _______, _______,
221 {_______, _______, _______, _______, KC_BTN2, KC_BTN1, KC_BTN1, KC_BTN2, _______, _______, _______, _______} 181 _______, _______, _______, _______, KC_BTN2, KC_BTN1, KC_BTN1, KC_BTN2, _______, _______, _______, _______
222}, 182),
223 183
224/* Adjust (Lower + Raise) 184/* Adjust (Lower + Raise)
225 * ,-----------------------------------------------------------------------------------. 185 * ,-----------------------------------------------------------------------------------.
@@ -232,290 +192,161 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
232 * | | | | | | | | | | | | 192 * | | | | | | | | | | | |
233 * `-----------------------------------------------------------------------------------' 193 * `-----------------------------------------------------------------------------------'
234 */ 194 */
235[_ADJUST] = { 195[_ADJUST] = LAYOUT_planck_grid(
236 {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, 196 _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL,
237 {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, QWOC, PLOVER, _______}, 197 _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, QWOC, PLOVER, _______,
238 {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, SDTOGG, _______, _______, _______, _______}, 198 _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, SDTOGG, _______, _______, _______, _______,
239 {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} 199 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BACKLIT
240} 200)
241 201
242}; 202};
243 203
244#ifdef AUDIO_ENABLE 204#ifdef AUDIO_ENABLE
245 float tone_startup[][2] = SONG(STARTUP_SOUND); 205 float tone_plover[][2] = SONG(PLOVER_SOUND);
246 float tone_qwerty[][2] = SONG(QWERTY_SOUND); 206 float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND);
247 float tone_qwoc[][2] = SONG(DVORAK_SOUND); 207 float tone_coin[][2] = SONG(VIOLIN_SOUND);
248 float tone_colemak[][2] = SONG(COLEMAK_SOUND); 208 float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
249 float tone_plover[][2] = SONG(PLOVER_SOUND);
250 float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND);
251 float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
252 float tone_coin[][2] = SONG(COIN_SOUND);
253 float tone_sonic_ring[][2] = SONG(SONIC_RING);
254
255 float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
256 float tone_superduper[][2] = SONG(SUPER_DUPER_SOUND);
257#endif 209#endif
258 210
259void persistant_default_layer_set(uint16_t default_layer) {
260 eeconfig_update_default_layer(default_layer);
261 default_layer_set(default_layer);
262}
263
264bool process_record_user(uint16_t keycode, keyrecord_t *record) { 211bool process_record_user(uint16_t keycode, keyrecord_t *record) {
265 switch (keycode) { 212 switch (keycode) {
266 case QWERTY: 213 case QWERTY:
267 if (record->event.pressed) { 214 if (record->event.pressed) {
268 #ifdef AUDIO_ENABLE 215 set_single_persistent_default_layer(_QWERTY);
269 PLAY_NOTE_ARRAY(tone_qwerty, false, 0); 216
270 #endif 217 set_superduper_key_combo_layer(_QWERTY);
271 persistant_default_layer_set(1UL<<_QWERTY); 218 }
272 219 return false;
273 key_combos[CB_SUPERDUPER].keys = superduper_combos[_QWERTY]; 220
274 eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _QWERTY); 221 case COLEMAK:
275 } 222 if (record->event.pressed) {
276 return false; 223 set_single_persistent_default_layer(_COLEMAK);
277 break; 224
278 case COLEMAK: 225 set_superduper_key_combo_layer(_COLEMAK);
279 if (record->event.pressed) { 226 }
280 #ifdef AUDIO_ENABLE 227 return false;
281 PLAY_NOTE_ARRAY(tone_colemak, false, 0); 228
282 #endif 229 case QWOC:
283 persistant_default_layer_set(1UL<<_COLEMAK); 230 if (record->event.pressed) {
284 231 set_single_persistent_default_layer(_QWOC);
285 key_combos[CB_SUPERDUPER].keys = superduper_combos[_COLEMAK]; 232
286 eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _COLEMAK); 233 set_superduper_key_combo_layer(_QWOC);
287 } 234 }
288 return false; 235 return false;
289 break; 236
290 case QWOC: 237 case LOWER:
291 if (record->event.pressed) { 238 if (record->event.pressed) {
292 #ifdef AUDIO_ENABLE 239 layer_on(_LOWER);
293 PLAY_NOTE_ARRAY(tone_qwoc, false, 0); 240 update_tri_layer(_LOWER, _RAISE, _ADJUST);
294 #endif 241 } else {
295 persistant_default_layer_set(1UL<<_QWOC); 242 layer_off(_LOWER);
296 243 update_tri_layer(_LOWER, _RAISE, _ADJUST);
297 key_combos[CB_SUPERDUPER].keys = superduper_combos[_QWOC]; 244 }
298 eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _QWOC); 245 return false;
299 } 246
300 return false; 247 case RAISE:
301 break; 248 if (record->event.pressed) {
302 case LOWER: 249 layer_on(_RAISE);
303 if (record->event.pressed) { 250 update_tri_layer(_LOWER, _RAISE, _ADJUST);
304 layer_on(_LOWER); 251 } else {
305 update_tri_layer(_LOWER, _RAISE, _ADJUST); 252 layer_off(_RAISE);
306 } else { 253 update_tri_layer(_LOWER, _RAISE, _ADJUST);
307 layer_off(_LOWER); 254 }
308 update_tri_layer(_LOWER, _RAISE, _ADJUST); 255 return false;
309 } 256
310 return false; 257 case BACKLIT:
311 break; 258 if (record->event.pressed) {
312 case RAISE: 259 register_code(KC_RSFT);
313 if (record->event.pressed) { 260 #ifdef BACKLIGHT_ENABLE
314 layer_on(_RAISE); 261 backlight_step();
315 update_tri_layer(_LOWER, _RAISE, _ADJUST); 262 #endif
316 } else { 263 } else {
317 layer_off(_RAISE); 264 unregister_code(KC_RSFT);
318 update_tri_layer(_LOWER, _RAISE, _ADJUST); 265 }
319 } 266 return false;
320 return false; 267
321 break; 268 case PLOVER:
322 case BACKLIT: 269 if (record->event.pressed) {
323 if (record->event.pressed) { 270 #ifdef AUDIO_ENABLE
324 register_code(KC_RSFT); 271 stop_all_notes();
325 #ifdef BACKLIGHT_ENABLE 272 PLAY_SONG(tone_plover);
326 backlight_step(); 273 #endif
327 #endif 274 layer_off(_RAISE);
328 } else { 275 layer_off(_LOWER);
329 unregister_code(KC_RSFT); 276 layer_off(_ADJUST);
330 } 277 layer_on(_PLOVER);
331 return false; 278 if (!eeconfig_is_enabled()) {
332 break; 279 eeconfig_init();
333 case PLOVER: 280 }
334 if (record->event.pressed) { 281 keymap_config.raw = eeconfig_read_keymap();
335 #ifdef AUDIO_ENABLE 282 keymap_config.nkro = 1;
336 stop_all_notes(); 283 eeconfig_update_keymap(keymap_config.raw);
337 PLAY_NOTE_ARRAY(tone_plover, false, 0); 284 }
338 #endif 285 return false;
339 layer_off(_RAISE); 286
340 layer_off(_LOWER); 287 case EXT_PLV:
341 layer_off(_ADJUST); 288 if (record->event.pressed) {
342 layer_on(_PLOVER); 289 #ifdef AUDIO_ENABLE
343 if (!eeconfig_is_enabled()) { 290 PLAY_SONG(tone_plover_gb);
344 eeconfig_init(); 291 #endif
345 } 292 layer_off(_PLOVER);
346 keymap_config.raw = eeconfig_read_keymap(); 293 }
347 keymap_config.nkro = 1; 294 return false;
348 eeconfig_update_keymap(keymap_config.raw); 295
349 } 296 case SDTOGG:
350 return false; 297 if (record->event.pressed) {
351 break; 298 bool enabled = toggle_superduper_mode();
352 case EXT_PLV: 299
353 if (record->event.pressed) { 300 #ifdef AUDIO_ENABLE
354 #ifdef AUDIO_ENABLE 301 if (enabled) {
355 PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); 302 PLAY_SONG(tone_coin);
356 #endif 303 } else {
357 layer_off(_PLOVER); 304 PLAY_SONG(tone_goodbye);
358 } 305 }
359 return false; 306 #endif
360 break; 307 }
361 case SDTOGG: 308 return false;
362 if (record->event.pressed) { 309
363 superduper_enabled = !superduper_enabled; 310 // Macros
364 311
365 if (superduper_enabled) { 312 // 1. Hold for LGUI, tap for Underscore
366 set_superduper_key_combos(); 313 case GUI_UNDS:
367 314 perform_space_cadet(record, KC_LGUI, KC_LSFT, KC_MINS);
368 #ifdef AUDIO_ENABLE 315 return false;
369 PLAY_NOTE_ARRAY(tone_sonic_ring, false, 0); 316
370 #endif 317 // 2. Hold for LSHIFT, tap for Parens open
371 } else { 318 case LSFT_LPRN:
372 clear_superduper_key_combos(); 319 perform_space_cadet(record, KC_LSFT, KC_LSFT, KC_9);
373 320 return false;
374 #ifdef AUDIO_ENABLE 321
375 PLAY_NOTE_ARRAY(tone_coin, false, 0); 322 default:
376 #endif 323 return true;
377 } 324 }
378 } 325 return true;
379 return false;
380 break;
381 }
382 return true;
383} 326}
384 327
385void matrix_init_user(void) { 328void matrix_init_user(void) {
386 #ifdef AUDIO_ENABLE 329 #ifdef AUDIO_ENABLE
387 startup_user(); 330 startup_user();
388 #endif 331 #endif
389} 332}
390 333
391void matrix_setup(void) { 334void matrix_setup(void) {
392 set_superduper_key_combos(); 335 set_superduper_key_combos();
393}
394
395void set_superduper_key_combos(void) {
396 uint8_t layer = eeprom_read_byte(EECONFIG_SUPERDUPER_INDEX);
397
398 switch (layer) {
399 case _QWERTY:
400 case _COLEMAK:
401 case _QWOC:
402 key_combos[CB_SUPERDUPER].keys = superduper_combos[layer];
403 break;
404 }
405}
406
407void clear_superduper_key_combos(void) {
408 key_combos[CB_SUPERDUPER].keys = empty_combo;
409} 336}
410 337
411void matrix_scan_user(void) { 338void matrix_scan_user(void) {
412} 339}
413 340
414#ifdef AUDIO_ENABLE
415
416void startup_user()
417{
418 _delay_ms(20); // gets rid of tick
419 PLAY_NOTE_ARRAY(tone_startup, false, 0);
420}
421
422void shutdown_user()
423{
424 PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
425 _delay_ms(150);
426 stop_all_notes();
427}
428
429void music_on_user(void)
430{
431 music_scale_user();
432}
433
434void music_scale_user(void)
435{
436 PLAY_NOTE_ARRAY(music_scale, false, 0);
437}
438
439#endif
440
441// Combos
442
443void process_combo_event(uint8_t combo_index, bool pressed) { 341void process_combo_event(uint8_t combo_index, bool pressed) {
444 if (pressed) { 342 if (pressed) {
445 switch(combo_index) { 343 switch(combo_index) {
446 case CB_SUPERDUPER: 344 case CB_SUPERDUPER:
447 layer_on(_SUPERDUPER); 345 layer_on(_SUPERDUPER);
448 346 break;
449 #ifdef AUDIO_ENABLE 347 }
450 PLAY_NOTE_ARRAY(tone_superduper, false, 0); 348 } else {
451 #endif 349 layer_off(_SUPERDUPER);
452 break; 350 unregister_mods(MOD_BIT(KC_LGUI) | MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); // Sometimes mods are held, unregister them
453 } 351 }
454 } else {
455 layer_off(_SUPERDUPER);
456 unregister_mods(MOD_BIT(KC_LGUI) | MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); // Sometimes mods are held, unregister them
457 }
458} 352}
459
460// Macros
461
462const uint16_t PROGMEM fn_actions[] = {
463 [M_GUI_UNDS] = ACTION_MACRO_TAP(M_GUI_UNDS),
464 [M_SFT_PO] = ACTION_MACRO_TAP(M_SFT_PO),
465};
466
467const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
468{
469 bool tap_not_interrupted = record->tap.count > 0 && !record->tap.interrupted;
470
471 switch(id) {
472 // Hold for LGUI, tap for Underscore
473 case M_GUI_UNDS:
474 if (record->event.pressed) {
475 m_gui_unds_timer = timer_read();
476
477 if (!tap_not_interrupted) {
478 register_mods(MOD_BIT(KC_LGUI));
479 }
480 } else {
481 if (tap_not_interrupted && timer_elapsed(m_gui_unds_timer) < TAPPING_TERM) {
482 #ifdef AUDIO_ENABLE
483 PLAY_NOTE_ARRAY(tone_superduper, false, 0);
484 #endif
485
486 add_weak_mods(MOD_BIT(KC_LSFT));
487 send_keyboard_report();
488 register_code(KC_MINS);
489 unregister_code(KC_MINS);
490 del_weak_mods(MOD_BIT(KC_LSFT));
491 send_keyboard_report();
492 record->tap.count = 0; // ad hoc: cancel tap
493 } else {
494 unregister_mods(MOD_BIT(KC_LGUI));
495 }
496 }
497 break;
498 // Hold for LSHIFT, tap for Parens open
499 case M_SFT_PO:
500 if (record->event.pressed) {
501 m_sft_po_timer = timer_read();
502
503 if (!tap_not_interrupted) {
504 register_mods(MOD_BIT(KC_LSFT));
505 }
506 } else {
507 if (tap_not_interrupted && timer_elapsed(m_sft_po_timer) < TAPPING_TERM) {
508 #ifdef AUDIO_ENABLE
509 PLAY_NOTE_ARRAY(tone_superduper, false, 0);
510 #endif
511
512 record->tap.count = 0;
513 return MACRO(D(RSFT), T(9), U(RSFT), END);
514 } else {
515 unregister_mods(MOD_BIT(KC_LSFT));
516 }
517 }
518 break;
519 }
520 return MACRO_NONE;
521};
diff --git a/keyboards/planck/keymaps/narze/readme.md b/keyboards/planck/keymaps/narze/readme.md
index 6824251e8..737171bca 100644
--- a/keyboards/planck/keymaps/narze/readme.md
+++ b/keyboards/planck/keymaps/narze/readme.md
@@ -22,10 +22,11 @@ Press `S+D` simultaneously and hold, then...
22 22
23## Build instructions 23## Build instructions
24- `cd /path/to/qmk_firmware` 24- `cd /path/to/qmk_firmware`
25- `docker run -e keymap=narze -e subproject=rev4 -e keyboard=planck --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware` 25- Ensure latest libraries are loaded `make git-submodule`
26- `dfu-programmer atmega32u4 erase && dfu-programmer atmega32u4 flash .build/planck_rev4_narze.hex` 26- Build with docker
27 27 - Planck Rev. 4 : `util/docker_build.sh planck/rev4:narze`
28## TODO 28 - Planck Light : `util/docker_build.sh planck/light:narze`
29- [] Make SuperDuper mode fully-compatible in Windows by swapping GUI with Ctrl 29- Flash hex file
30 30 - Using dfu-programmer `dfu-programmer atmega32u4 erase --force && dfu-programmer atmega32u4 flash .build/planck_rev4_narze.hex`
31 31 - For Planck Light change the target microcontroller `dfu-programmer at90usb1286 erase --force && dfu-programmer at90usb1286 flash .build/planck_light_narze.hex`
32 - Use [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases)
diff --git a/keyboards/planck/keymaps/narze/rules.mk b/keyboards/planck/keymaps/narze/rules.mk
index 286a2ffdc..9b56dc18f 100644
--- a/keyboards/planck/keymaps/narze/rules.mk
+++ b/keyboards/planck/keymaps/narze/rules.mk
@@ -1,23 +1,25 @@
1 1
2 2
3# Build Options
4# change to "no" to disable the options, or define them in the Makefile in
5# the appropriate keymap folder that will get included automatically
6#
7BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) 3BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
8MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
9EXTRAKEY_ENABLE = yes # Audio control and System control(+450) 4EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
10CONSOLE_ENABLE = no # Console for debug(+400) 5CONSOLE_ENABLE = no # Console for debug(+400)
11COMMAND_ENABLE = yes # Commands for debug and configuration 6COMMAND_ENABLE = yes # Commands for debug and configuration
12NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work 7NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
13BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality 8BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
14MIDI_ENABLE = no # MIDI controls
15AUDIO_ENABLE = no # Audio output on port C6
16UNICODE_ENABLE = no # Unicode 9UNICODE_ENABLE = no # Unicode
17BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID 10BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
18RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. 11RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
12AUDIO_ENABLE = yes
19 13
20# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE 14# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
21SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend 15SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
22 16
23COMBO_ENABLE = yes 17COMBO_ENABLE = yes
18
19ifeq ($(strip $(KEYBOARD)), planck/rev4)
20 MOUSEKEY_ENABLE = no # Mouse keys(+4700)
21 MIDI_ENABLE = no
22else
23 MOUSEKEY_ENABLE = yes
24 MIDI_ENABLE = yes
25endif
diff --git a/users/narze/narze.c b/users/narze/narze.c
new file mode 100644
index 000000000..6ec303449
--- /dev/null
+++ b/users/narze/narze.c
@@ -0,0 +1 @@
#include "narze.h"
diff --git a/users/narze/narze.h b/users/narze/narze.h
new file mode 100644
index 000000000..036539a9c
--- /dev/null
+++ b/users/narze/narze.h
@@ -0,0 +1,9 @@
1#pragma once
2
3#include "quantum.h"
4#include "eeconfig.h"
5#include "keymap_colemak.h"
6
7#ifdef COMBO_ENABLE
8# include "superduper.h"
9#endif
diff --git a/users/narze/readme.md b/users/narze/readme.md
new file mode 100644
index 000000000..124b84e6b
--- /dev/null
+++ b/users/narze/readme.md
@@ -0,0 +1,18 @@
1# TODO
2- [ ] Make SuperDuper mode fully-compatible in Windows by swapping GUI with Ctrl
3
4# LICENSE
5Copyright 2019 Manassarn Manoonchai manassarn@gmail.com @narze
6
7This program is free software: you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation, either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/users/narze/rules.mk b/users/narze/rules.mk
new file mode 100644
index 000000000..565a4a7a6
--- /dev/null
+++ b/users/narze/rules.mk
@@ -0,0 +1,5 @@
1SRC += narze.c
2
3ifeq ($(strip $(COMBO_ENABLE)), yes)
4 SRC += superduper.c
5endif
diff --git a/users/narze/superduper.c b/users/narze/superduper.c
new file mode 100644
index 000000000..b497ce2e6
--- /dev/null
+++ b/users/narze/superduper.c
@@ -0,0 +1,66 @@
1#include "superduper.h"
2#include "eeconfig.h"
3#include "eeprom.h"
4#include "keymap_colemak.h"
5
6// SuperDuper
7
8#define SUPERDUPER_COMBO_COUNT 3
9#define EECONFIG_SUPERDUPER_INDEX (uint8_t *) 19
10
11enum process_combo_event {
12 CB_SUPERDUPER,
13};
14
15enum supported_layers {
16 _QWERTY,
17 _COLEMAK,
18 _QWOC
19};
20
21const uint16_t PROGMEM superduper_combos[SUPERDUPER_COMBO_COUNT][3] = {
22 [_QWERTY] = {KC_S, KC_D, COMBO_END},
23 [_COLEMAK] = {KC_R, KC_S, COMBO_END},
24 [_QWOC] = {CM_S, CM_D, COMBO_END},
25};
26
27combo_t key_combos[COMBO_COUNT] = {
28 [CB_SUPERDUPER] = COMBO_ACTION(superduper_combos[_QWERTY]),
29};
30
31volatile bool superduper_enabled = true;
32
33const uint16_t PROGMEM empty_combo[] = {COMBO_END};
34
35bool toggle_superduper_mode(void) {
36 superduper_enabled = !superduper_enabled;
37
38 if (superduper_enabled) {
39 set_superduper_key_combos();
40 } else {
41 clear_superduper_key_combos();
42 }
43
44 return superduper_enabled;
45}
46
47void set_superduper_key_combo_layer(uint16_t layer) {
48 key_combos[CB_SUPERDUPER].keys = superduper_combos[layer];
49 eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, layer);
50}
51
52void set_superduper_key_combos(void) {
53 uint8_t layer = eeprom_read_byte(EECONFIG_SUPERDUPER_INDEX);
54
55 switch (layer) {
56 case _QWERTY:
57 case _COLEMAK:
58 case _QWOC:
59 key_combos[CB_SUPERDUPER].keys = superduper_combos[layer];
60 break;
61 }
62}
63
64void clear_superduper_key_combos(void) {
65 key_combos[CB_SUPERDUPER].keys = empty_combo;
66}
diff --git a/users/narze/superduper.h b/users/narze/superduper.h
new file mode 100644
index 000000000..f8df2e1af
--- /dev/null
+++ b/users/narze/superduper.h
@@ -0,0 +1,7 @@
1#pragma once
2#include "narze.h"
3
4bool toggle_superduper_mode(void);
5void set_superduper_key_combo_layer(uint16_t layer);
6void set_superduper_key_combos(void);
7void clear_superduper_key_combos(void);