From f41c2e6863f2ebf55311051cdead743683846a49 Mon Sep 17 00:00:00 2001 From: Felix Uhl Date: Mon, 8 Aug 2016 17:53:08 +0200 Subject: [PATCH 1/5] Update TMK_README.md updated link to non-existent build.md file --- doc/TMK_README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/TMK_README.md b/doc/TMK_README.md index f3d96717a8..0c75a0e279 100644 --- a/doc/TMK_README.md +++ b/doc/TMK_README.md @@ -113,7 +113,7 @@ Third party libraries like LUFA, PJRC and V-USB have their own license respectiv Build Firmware and Program Controller ------------------------------------- -See [doc/build.md](tmk_core/doc/build.md), or the readme in the particular keyboards/* folder. +See [doc/BUILD_GUIDE.md](tmk_core/doc/BUILD_GUIDE.md), or the readme in the particular keyboards/* folder. From 76cd7c5444471c7fbf0f648088cac13f4c79af57 Mon Sep 17 00:00:00 2001 From: Corey Finley Date: Fri, 5 Aug 2016 09:08:55 -0400 Subject: [PATCH 2/5] Adds keymap based on Kinesis advantage --- keyboards/preonic/keymaps/kinesis/Makefile | 27 ++++ keyboards/preonic/keymaps/kinesis/config.h | 92 +++++++++++++ keyboards/preonic/keymaps/kinesis/keymap.c | 144 ++++++++++++++++++++ keyboards/preonic/keymaps/kinesis/readme.md | 1 + 4 files changed, 264 insertions(+) create mode 100644 keyboards/preonic/keymaps/kinesis/Makefile create mode 100644 keyboards/preonic/keymaps/kinesis/config.h create mode 100644 keyboards/preonic/keymaps/kinesis/keymap.c create mode 100644 keyboards/preonic/keymaps/kinesis/readme.md diff --git a/keyboards/preonic/keymaps/kinesis/Makefile b/keyboards/preonic/keymaps/kinesis/Makefile new file mode 100644 index 0000000000..6c8d2897cd --- /dev/null +++ b/keyboards/preonic/keymaps/kinesis/Makefile @@ -0,0 +1,27 @@ + + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = yes # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +TAP_DANCE_ENABLE = yes + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/preonic/keymaps/kinesis/config.h b/keyboards/preonic/keymaps/kinesis/config.h new file mode 100644 index 0000000000..086baa84ff --- /dev/null +++ b/keyboards/preonic/keymaps/kinesis/config.h @@ -0,0 +1,92 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6061 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Ortholinear Keyboards +#define PRODUCT The Preonic Keyboard +#define DESCRIPTION A compact ortholinear keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 12 + +/* Planck PCB default pin-out */ +#define MATRIX_ROW_PINS { D2, D5, B5, B6, D3 } +#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } +#define UNUSED_PINS + +#define BACKLIGHT_PIN B7 + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN D1 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 28 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +#define TAPPING_TERM 200 + +/* disable debug print */ +// #define NO_DEBUG + +/* disable print */ +// #define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/preonic/keymaps/kinesis/keymap.c b/keyboards/preonic/keymaps/kinesis/keymap.c new file mode 100644 index 0000000000..1cd6eb9938 --- /dev/null +++ b/keyboards/preonic/keymaps/kinesis/keymap.c @@ -0,0 +1,144 @@ +#include "preonic.h" +#include "action_layer.h" +#include "eeconfig.h" +#ifdef AUDIO_ENABLE +#include "audio.h" +#endif + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _FN 1 +#define _ULCK 2 + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO +#define HYP_TIC ALL_T(KC_GRV) +#define EQ_LOCK TD(TD_EQ_LOCK) +#define MIN_ULK TD(TD_MIN_ULOCK) + +//Tap Dance Declarations +enum { + TD_EQ_LOCK = 0, + TD_MIN_ULOCK +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,-----------------------------------------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | \ | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Ctrl | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | FN | ` | Alt | LGUI | Back | ESC |ENTER | SPCE | RGUI | [ | ] | FN | + * `-----------------------------------------------------------------------------------' + */ + [_QWERTY] = { + {EQ_LOCK, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, MIN_ULK }, + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS }, + {KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, + {KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC }, + {MO(_FN), HYP_TIC, KC_LALT, KC_LGUI, KC_BSPC, KC_ESC, KC_ENT, KC_SPC, KC_RGUI, KC_LBRC, KC_RBRC, MO(_FN) } + }, + + /* Fn + * ,-----------------------------------------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | VOL- | VOL+ | MUTE |BLtogg| | LEFT | DOWN | UP | RGHT | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | BL- | BL+ |Aud on|AudOff|AGnorm|AGswap| | | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|MusOff| | |PLY/PS| | PREV | NEXT | | + * `-----------------------------------------------------------------------------------' + */ + [_FN] = { + {_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______ }, + {_______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, _______ }, + {_______, KC_VOLD, KC_VOLU, KC_MUTE, BL_TOGG, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______ }, + {_______, BL_DEC, BL_INC, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______ }, + {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, _______, _______, KC_MPLY, _______, KC_MPRV, KC_MNXT, _______ } + } + +}; + +float tone_startup[][2] = { + {NOTE_B5, 20}, + {NOTE_B6, 8}, + {NOTE_DS6, 20}, + {NOTE_B6, 8} +}; + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +/*bool process_record_user(uint16_t keycode, keyrecord_t *record) {*/ + /*return true;*/ + /*[>switch (keycode) {<]*/ + /*[>case QWERTY:<]*/ + /*[>return true;<]*/ + /*[>}<]*/ +/*};*/ + +void matrix_init_user(void) { + startup_user(); +} + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + + +const qk_tap_dance_action_t tap_dance_actions[] = { + //Tap once for equal, twice for hyper + X (alfred lock) + [TD_EQ_LOCK] = ACTION_TAP_DANCE_DOUBLE(KC_EQL, HYPR(KC_X)), + //Tap once for minus, twice for time.heals.nothing + [TD_MIN_ULOCK] = ACTION_TAP_DANCE_DOUBLE(KC_MINS, M(_ULCK)) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case _ULCK: + if (record->event.pressed) { + /* time.heals.nothing */ + return MACRO( I(220), T(T), T(I), T(M), T(E), T(DOT), T(H), T(E), T(A), T(L), T(S), T(DOT), T(N), T(O), T(T), T(H), T(I), T(N), T(G), END); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/preonic/keymaps/kinesis/readme.md b/keyboards/preonic/keymaps/kinesis/readme.md new file mode 100644 index 0000000000..e911968dd9 --- /dev/null +++ b/keyboards/preonic/keymaps/kinesis/readme.md @@ -0,0 +1 @@ +# The default Preonic layout - largely based on the Planck's \ No newline at end of file From 6975135f545d08955ed26ef046a0333e291af716 Mon Sep 17 00:00:00 2001 From: Felix Uhl Date: Wed, 10 Aug 2016 11:40:51 +0200 Subject: [PATCH 3/5] updated reference Build setup links to main readme now. --- doc/TMK_README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/TMK_README.md b/doc/TMK_README.md index 0c75a0e279..e3438eda2b 100644 --- a/doc/TMK_README.md +++ b/doc/TMK_README.md @@ -113,7 +113,7 @@ Third party libraries like LUFA, PJRC and V-USB have their own license respectiv Build Firmware and Program Controller ------------------------------------- -See [doc/BUILD_GUIDE.md](tmk_core/doc/BUILD_GUIDE.md), or the readme in the particular keyboards/* folder. +See [build environment setup](/readme.md#build-environment-setup), or the readme in the particular keyboards/* folder. From a41a53baadf14b50d63fc9424aca67e7bde193f3 Mon Sep 17 00:00:00 2001 From: Felix Uhl Date: Thu, 11 Aug 2016 09:13:38 +0200 Subject: [PATCH 4/5] Fix dead link in keycode.txt The link to the HID Usage tables was outdated and dead, so I replaced it. --- doc/keycode.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/keycode.txt b/doc/keycode.txt index c1134f9bf2..5a42c50bfb 100644 --- a/doc/keycode.txt +++ b/doc/keycode.txt @@ -2,7 +2,7 @@ Keycode Symbol Table ==================== Keycodes are defined in `common/keycode.h`. Range of 00-A4 and E0-E7 are identical with HID Usage: - + Virtual keycodes are defined out of above range to support special actions. From 56f86413e0d7606030cad68257a5d6287c9fd35f Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 11 Aug 2016 09:54:02 -0600 Subject: [PATCH 5/5] Add denolfe satan keymap --- keyboards/satan/keymaps/denolfe/Makefile | 20 ++ keyboards/satan/keymaps/denolfe/README.md | 12 ++ .../satan/keymaps/denolfe/keyboard-layout.png | Bin 0 -> 31762 bytes keyboards/satan/keymaps/denolfe/keymap.c | 171 ++++++++++++++++++ 4 files changed, 203 insertions(+) create mode 100644 keyboards/satan/keymaps/denolfe/Makefile create mode 100644 keyboards/satan/keymaps/denolfe/README.md create mode 100644 keyboards/satan/keymaps/denolfe/keyboard-layout.png create mode 100644 keyboards/satan/keymaps/denolfe/keymap.c diff --git a/keyboards/satan/keymaps/denolfe/Makefile b/keyboards/satan/keymaps/denolfe/Makefile new file mode 100644 index 0000000000..c4adab737c --- /dev/null +++ b/keyboards/satan/keymaps/denolfe/Makefile @@ -0,0 +1,20 @@ + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +RGBLIGHT_ENABLE ?= no # Enable keyboard underlight functionality (+4870) +BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality (+1150) +MIDI_ENABLE ?= no # MIDI controls +AUDIO_ENABLE ?= no +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/satan/keymaps/denolfe/README.md b/keyboards/satan/keymaps/denolfe/README.md new file mode 100644 index 0000000000..30b94fcdd2 --- /dev/null +++ b/keyboards/satan/keymaps/denolfe/README.md @@ -0,0 +1,12 @@ +# denolfe's Layout +Customized Satan keymap + +![Layout](keyboard-layout.png "Practical Keymap") + +## Programming Instructions: +`cd` into keymap directory, `make dfu` + +## Features +- Movement keys with CapsLock + h, j, k, l +- Media Keys +- Backlight control diff --git a/keyboards/satan/keymaps/denolfe/keyboard-layout.png b/keyboards/satan/keymaps/denolfe/keyboard-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d6ad57fb5b180334aefc429430fa867258cd6a GIT binary patch literal 31762 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 literal 0 HcmV?d00001 diff --git a/keyboards/satan/keymaps/denolfe/keymap.c b/keyboards/satan/keymaps/denolfe/keymap.c new file mode 100644 index 0000000000..2f6c8d8f4f --- /dev/null +++ b/keyboards/satan/keymaps/denolfe/keymap.c @@ -0,0 +1,171 @@ +#include "satan.h" + +#ifdef RGBLIGHT_ENABLE +#include "rgblight.h" +#endif + +// Used for SHIFT_ESC +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _SL 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |FN |Ctrl | + * `-----------------------------------------------------------' + */ +[_BL] = KEYMAP( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + MO(_FL), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RGUI, KC_RCTL), + + /* Keymap _FL: Function Layer + * ,-----------------------------------------------------------. + * | | | | | | | | | | | | | | RESET| + * |-----------------------------------------------------------| + * | | | | | | | | | | | |BL-|BL+|BL | + * |-----------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------| + * | | F1|F2 | F3|F4 | F5| F6| F7| F8| | | | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + */ +[_FL] = KEYMAP( + #ifdef RGBLIGHT_ENABLE + KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, \ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_INC, BL_TOGG, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, F(1), F(2), F(3), F(4), F(5), F(6), F(7), F(8), KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + #else + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_PGUP, KC_TRNS, KC_END, KC_MPRV, KC_MNXT, KC_MPLY, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_TOGG, BL_INC, KC_HOME, LCTL(KC_LEFT), LCTL(KC_END), LCTL(KC_RIGHT), KC_TRNS, RESET, \ + KC_TRNS, KC_TRNS, F(9), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + #endif + +[_SL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_PGUP, KC_TRNS, LSFT(KC_END), KC_MPRV, KC_MNXT, KC_MPLY, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, LSFT(KC_LEFT), LSFT(KC_DOWN), LSFT(KC_UP), LSFT(KC_RIGHT), KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_TOGG, BL_INC, LSFT(KC_HOME), LCTL(LSFT(KC_LEFT)), LCTL(LSFT(KC_END)), LCTL(LSFT(KC_RIGHT)), KC_TRNS, RESET, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +enum function_id { + SHIFT_ESC, + #ifdef RGBLIGHT_ENABLE + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL + #endif +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(SHIFT_ESC), + #ifdef RGBLIGHT_ENABLE + [1] = ACTION_FUNCTION(RGBLED_TOGGLE), + [2] = ACTION_FUNCTION(RGBLED_STEP_MODE), + [3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), + [4] = ACTION_FUNCTION(RGBLED_DECREASE_HUE), + [5] = ACTION_FUNCTION(RGBLED_INCREASE_SAT), + [6] = ACTION_FUNCTION(RGBLED_DECREASE_SAT), + [7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL), + [8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL), + #endif + [9] = ACTION_LAYER_MODS(2, MOD_LSFT) +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t shift_esc_shift_mask; + switch (id) { + case SHIFT_ESC: + shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (shift_esc_shift_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (shift_esc_shift_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + //led operations + #ifdef RGBLIGHT_ENABLE + case RGBLED_TOGGLE: + if (record->event.pressed) { + rgblight_toggle(); + } + break; + case RGBLED_INCREASE_HUE: + if (record->event.pressed) { + rgblight_increase_hue(); + } + break; + case RGBLED_DECREASE_HUE: + if (record->event.pressed) { + rgblight_decrease_hue(); + } + break; + case RGBLED_INCREASE_SAT: + if (record->event.pressed) { + rgblight_increase_sat(); + } + break; + case RGBLED_DECREASE_SAT: + if (record->event.pressed) { + rgblight_decrease_sat(); + } + break; + case RGBLED_INCREASE_VAL: + if (record->event.pressed) { + rgblight_increase_val(); + } + break; + case RGBLED_DECREASE_VAL: + if (record->event.pressed) { + rgblight_decrease_val(); + } + break; + case RGBLED_STEP_MODE: + if (record->event.pressed) { + rgblight_step(); + } + break; + #endif + } +}