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 f3d96717..0c75a0e2 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 00000000..6c8d2897 --- /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 00000000..086baa84 --- /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 00000000..1cd6eb99 --- /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 00000000..e911968d --- /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 0c75a0e2..e3438eda 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 c1134f9b..5a42c50b 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 00000000..c4adab73 --- /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 00000000..30b94fcd --- /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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 G4gDXMykHps 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 00000000..2f6c8d8f --- /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 + } +}