Userspace and keymap update for user bbaserdem. (#14484)
74 files changed, 4718 insertions(+), 1295 deletions(-) D keyboards/40percentclub/gherkin/keymaps/bbaserdem/README.md D keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h D keyboards/40percentclub/gherkin/keymaps/bbaserdem/keymap.c D keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk D keyboards/lets_split/keymaps/bbaserdem/README.md D keyboards/lets_split/keymaps/bbaserdem/config.h D keyboards/lets_split/keymaps/bbaserdem/keymap.c D keyboards/lets_split/keymaps/bbaserdem/rules.mk D keyboards/lets_split/keymaps/bbaserdem_right/README.md D keyboards/lets_split/keymaps/bbaserdem_right/config.h D keyboards/lets_split/keymaps/bbaserdem_right/keymap.c D keyboards/lets_split/keymaps/bbaserdem_right/rules.mk D keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/README.md D keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/config.h D keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/keymap.c D keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/rules.mk D keyboards/planck/keymaps/bbaserdem/README.md D keyboards/planck/keymaps/bbaserdem/config.h D keyboards/planck/keymaps/bbaserdem/keymap.c D keyboards/planck/keymaps/bbaserdem/rules.mk A keyboards/splitkb/kyria/keymaps/bbaserdem/config.h A keyboards/splitkb/kyria/keymaps/bbaserdem/keymap.c A keyboards/splitkb/kyria/keymaps/bbaserdem/readme.md A keyboards/splitkb/kyria/keymaps/bbaserdem/rules.mk M keyboards/splitkb/kyria/rev1/rules.mk D keyboards/xiudi/xd75/keymaps/bbaserdem/config.h D keyboards/xiudi/xd75/keymaps/bbaserdem/keymap.c D keyboards/xiudi/xd75/keymaps/bbaserdem/readme.md D keyboards/xiudi/xd75/keymaps/bbaserdem/rules.mk A layouts/community/ortho_3x10/bbaserdem/config.h A layouts/community/ortho_3x10/bbaserdem/keymap.c A layouts/community/ortho_3x10/bbaserdem/readme.md A layouts/community/ortho_3x10/bbaserdem/rules.mk A layouts/community/ortho_4x12/bbaserdem/config.h A layouts/community/ortho_4x12/bbaserdem/keymap.c A layouts/community/ortho_4x12/bbaserdem/readme.md A layouts/community/ortho_4x12/bbaserdem/rules.mk A layouts/community/split_3x5_3/bbaserdem/config.h A layouts/community/split_3x5_3/bbaserdem/keymap.c A layouts/community/split_3x5_3/bbaserdem/readme.md A layouts/community/split_3x5_3/bbaserdem/rules.mk A layouts/community/split_3x6_3/bbaserdem/chconf.h A layouts/community/split_3x6_3/bbaserdem/config.h A layouts/community/split_3x6_3/bbaserdem/halconf.h A layouts/community/split_3x6_3/bbaserdem/keymap.c A layouts/community/split_3x6_3/bbaserdem/mcuconf.h A layouts/community/split_3x6_3/bbaserdem/readme.md A layouts/community/split_3x6_3/bbaserdem/rules.mk A layouts/community/split_3x6_3/bbaserdem/ssd1306.c A users/bbaserdem/.gitignore D users/bbaserdem/README.md A users/bbaserdem/bb-audio.c A users/bbaserdem/bb-audio.h A users/bbaserdem/bb-backlight.c A users/bbaserdem/bb-backlight.h A users/bbaserdem/bb-encoder.c A users/bbaserdem/bb-encoder.h A users/bbaserdem/bb-macro.c A users/bbaserdem/bb-macro.h A users/bbaserdem/bb-oled-extra.c A users/bbaserdem/bb-oled-extra.h A users/bbaserdem/bb-oled.c A users/bbaserdem/bb-oled.h A users/bbaserdem/bb-rgb.c A users/bbaserdem/bb-rgb.h A users/bbaserdem/bb-underglow.c A users/bbaserdem/bb-underglow.h M users/bbaserdem/bbaserdem.c M users/bbaserdem/bbaserdem.h M users/bbaserdem/config.h A users/bbaserdem/keymap-bitmaps/.gitignore A users/bbaserdem/keymap-bitmaps/cropBmp A users/bbaserdem/readme.md M users/bbaserdem/rules.mk
D keyboards/40percentclub/gherkin/keymaps/bbaserdem/README.md => keyboards/40percentclub/gherkin/keymaps/bbaserdem/README.md +0 -11
@@ 1,11 0,0 @@ # Gherkin Layout This is my gherkin layout. It is used as a game pad, and key layout is inspired by spare keys I had lying around. The firmware is very simple, and only includes one layer keymap, and RGB effects. # Flashing The following command should be used from the main qmk directory. ``` make gherkin:bbaserdem sudo avrdude -p atmgea34u4 -P `ls /dev/ttyACM*` -c avr109 -U flash:.build/gherkin_bbaserdem.hex ```
D keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h => keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h +0 -9
@@ 1,9 0,0 @@ #pragma once #define RGB_DI_PIN F6 #define RGBLED_NUM 10 #define RGBLIGHT_ANIMATIONS #ifdef BACKLIGHT_LEVELS #undef BACKLIGHT_LEVELS #endif #define BACKLIGHT_LEVELS 3
D keyboards/40percentclub/gherkin/keymaps/bbaserdem/keymap.c => keyboards/40percentclub/gherkin/keymaps/bbaserdem/keymap.c +0 -36
@@ 1,36 0,0 @@ // This is a game-pad gherkin layout with RGB and LED lights #include QMK_KEYBOARD_H backlight_config_t backlight_config; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Game pad * ,-----------------------------------------------------------. * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | Ctl | Alt | ~ | * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * | Tab | Q | W | E | R | T | |^| | ; | ' | / | * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * | Shf | A | S | D | F | <-- | |v| | --> | , | . | * `-----------------------------------------------------------' */ LAYOUT_ortho_3x10( KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_LCTRL, KC_LALT, KC_GRAVE, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_UP, KC_SCLN, KC_QUOTE, KC_SLASH, KC_LSHIFT, KC_A, KC_S, KC_D, KC_F, KC_LEFT, KC_DOWN, KC_RIGHT, KC_COMMA, KC_DOT ) }; void matrix_init_user(void) { // Set LED's to max _delay_us(300); backlight_config.level = 2; backlight_config.enable = 1; eeconfig_update_backlight(backlight_config.raw); backlight_set(backlight_config.level); // Set RGB to rainbow mood light rgblight_enable(); rgblight_mode(1); rgblight_sethsv(120,255,255); rgblight_mode(6); }
D keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk => keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk +0 -13
@@ 1,13 0,0 @@ USER_NAME := bbaserdem-nouserspace STENO_ENABLE = no # Additional protocols for Stenography(+1700), requires VIRTSER MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = no # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend AUDIO_ENABLE = no # Enable audio output from keyboard 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 = yes # Enable RBG light strips BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
D keyboards/lets_split/keymaps/bbaserdem/README.md => keyboards/lets_split/keymaps/bbaserdem/README.md +0 -27
@@ 1,27 0,0 @@ # Lets Split Layout Check out [user readme](../../../../users/bbaserdem/README.md) for more info. # Usage **These commands depend on there being no other arduino connected!** Also udev rules can be set instead of using sudo. Please unplug all other usb devices. To make the hex files; ``` make lets_split/rev2:bbaserdem make lets_split/rev2:bbaserdem_right ``` For the left half, after plugging in and resetting; (from repo main directory) ``` sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:.build/lets_split_rev2_bbaserdem.hex sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -U eeprom:w:keyboards/lets_split/eeprom-lefthand.eep ``` For the right half; ``` sudo avrdude -p atmgea34u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:.build/lets_split_rev2_bbaserdem_right.hex sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -U eeprom:w:keyboards/lets_split/eeprom-righhand.eep ```
D keyboards/lets_split/keymaps/bbaserdem/config.h => keyboards/lets_split/keymaps/bbaserdem/config.h +0 -27
@@ 1,27 0,0 @@ #ifndef CONFIG_KEYMAP_H #define CONFIG_KEYMAP_H #include "../../config.h" #define USE_SERIAL #define EE_HANDS // LED strip stuff #ifdef RGBLIGHT_ENABLE // Who thought it was a good idea to predefine these in the rev2/config.h ??? #ifdef RGBLED_NUM #undef RGBLED_NUM #endif #define RGBLED_NUM 12 #define RGBLIGHT_HUE_STEP 6 #define RGBLIGHT_SAT_STEP 12 #define RGBLIGHT_VAL_STEP 20 #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_EFFECT_SNAKE_LENGTH 6 #define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 2000 #define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 #endif #endif
D keyboards/lets_split/keymaps/bbaserdem/keymap.c => keyboards/lets_split/keymaps/bbaserdem/keymap.c +0 -35
@@ 1,35 0,0 @@ /* * Let's Split - Dvorak turkish * Keymap by @bbaserdem * Dvorak layout with multiple features * Most of the code is in the "user" directory. * Check qmk_firmware/users/bbaserdem for the main part of the code */ #include "lets_split.h" #include "bbaserdem.h" void matrix_init_keymap (void) { } uint32_t layer_state_set_keymap(uint32_t state) { return state; } const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Main Dvorak layer [_DV] = LAYOUT_letssplit_wrapper(DVORAK), // Turkish and special character overlay [_AL] = LAYOUT_letssplit_wrapper(ALTCHAR), // Gaming layer [_GA] = LAYOUT_letssplit_wrapper(GAME), // Numbers layer [_NU] = LAYOUT_letssplit_wrapper(NUMBERS), // Settings layer [_SE] = LAYOUT_letssplit_wrapper(SETTINGS), // Mouse emulation layer [_MO] = LAYOUT_letssplit_wrapper(MOUSE), // Music layer [_MU] = LAYOUT_letssplit_wrapper(MUSIC), };
D keyboards/lets_split/keymaps/bbaserdem/rules.mk => keyboards/lets_split/keymaps/bbaserdem/rules.mk +0 -8
@@ 1,8 0,0 @@ # Build options BACKLIGHT_ENABLE = no # Switch LEDs MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses RGBLIGHT_ENABLE = yes # LED strips TAP_DANCE_ENABLE = no # Use multi-tap features AUDIO_ENABLE = no # Audio stuff
D keyboards/lets_split/keymaps/bbaserdem_right/README.md => keyboards/lets_split/keymaps/bbaserdem_right/README.md +0 -5
@@ 1,5 0,0 @@ # Lets Split - Right Half Keymap for my right half, to be used as a numpad. Check [main readme](../bbaserdem/README.md) for flashing info.
D keyboards/lets_split/keymaps/bbaserdem_right/config.h => keyboards/lets_split/keymaps/bbaserdem_right/config.h +0 -9
@@ 1,9 0,0 @@ #ifndef CONFIG_KEYMAP_H #define CONFIG_KEYMAP_H #include "../../config.h" #define USE_SERIAL #define EE_HANDS #endif
D keyboards/lets_split/keymaps/bbaserdem_right/keymap.c => keyboards/lets_split/keymaps/bbaserdem_right/keymap.c +0 -31
@@ 1,31 0,0 @@ /* * Let's Split - Dvorak turkish * Keymap by @bbaserdem * Dvorak layout with multiple features * Most of the code is in the "user" directory. * Check qmk_firmware/users/bbaserdem for the main part of the code */ #include "lets_split.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Navigation All Supered) Numpad * ,-----------------------. ,-----------------------. * | F4| ` | Q |Alt| L | > | | ) | - | + | = |Ent|Bkp| * |---+---+---+---+---+---| |---+---+---+---+---+---| * | F3| M |Ent|Ctl| K | ^ | | ( | * | 9 | 6 | 3 | . | * |---+---+---+---+---+---| |---+---+---+---+---+---| * | F2| T |Spc|Shf| J | v | | % | / | 8 | 5 | 2 | , | * |---+---+---+---+---+---| |---+---+---+---+---+---| * | F1| F | P |Tab| H | < | |Nlc|Tab| 7 | 4 | 1 | 0 | * `-----------------------' `-----------------------' */ // Main Dvorak layer [0] = LAYOUT_ortho_4x12( LCTL(LALT(KC_DEL)), LGUI(KC_GRV), LGUI(KC_Q), LGUI(KC_LALT), LGUI(KC_L), LGUI(KC_RGHT), KC_RPRN, KC_PMNS, KC_PPLS, KC_PEQL, KC_PENT, KC_BSPC, \ LGUI(KC_F3), LGUI(KC_M), LGUI(KC_ENT), LGUI(KC_LCTL), LGUI(KC_K), LGUI(KC_UP), KC_LPRN, KC_PAST, KC_P9, KC_P6, KC_P3, KC_PDOT, \ LGUI(KC_F2), LGUI(KC_T), LGUI(KC_SPC), LGUI(KC_LSFT), LGUI(KC_J), LGUI(KC_DOWN), KC_PERC, KC_PSLS, KC_P8, KC_P5, KC_P2, KC_PCMM, \ LGUI(KC_F1), LGUI(KC_F), LGUI(KC_P), LGUI(KC_TAB), LGUI(KC_H), LGUI(KC_LEFT), KC_NLCK, KC_TAB, KC_P7, KC_P4, KC_P1, KC_P0 \ ) };
D keyboards/lets_split/keymaps/bbaserdem_right/rules.mk => keyboards/lets_split/keymaps/bbaserdem_right/rules.mk +0 -19
@@ 1,19 0,0 @@ # Build options USER_NAME := bbaserdem-without-userspace BACKLIGHT_ENABLE = no # Switch LEDs MOUSEKEY_ENABLE = no # Emulates mouse key using keypresses RGBLIGHT_ENABLE = no # LED strips TAP_DANCE_ENABLE = no # Use multi-tap features AUDIO_ENABLE = no # Audio stuff BLUETOOTH_ENABLE = no # No bluetooth COMMAND_ENABLE = no # Some bootmagic thing BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite CONSOLE_ENABLE = no # Allows console output with a command SLEEP_LED_ENABLE = no # Breathes LED's when computer is asleep. Untested. NKRO_ENABLE = no # Default is 6KRO which is plenty MIDI_ENABLE = no # Untested feature KEY_LOCK_ENABLE = no # Allows locking any key. Not used UNICODE_ENABLE = no # Used for unicode character emulation EXTRAKEY_ENABLE = no # OS signals like volume control
D keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/README.md => keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/README.md +0 -7
@@ 1,7 0,0 @@ # Lets Split Eh Layout Check out [user readme](../../../../users/bbaserdem/README.md) for more info. # Usage Fill in after flashing
D keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/config.h => keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/config.h +0 -4
D keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/keymap.c => keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/keymap.c +0 -27
@@ 1,27 0,0 @@ #include "lets_split_eh.h" #include "bbaserdem.h" void matrix_init_keymap (void) { } uint32_t layer_state_set_keymap(uint32_t state) { return state; } const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Main Dvorak layer [_DV] = LAYOUT_letssplit_wrapper(DVORAK), // Turkish and special character overlay [_AL] = LAYOUT_letssplit_wrapper(ALTCHAR), // Gaming layer [_GA] = LAYOUT_letssplit_wrapper(GAME), // Numbers layer [_NU] = LAYOUT_letssplit_wrapper(NUMBERS), // Settings layer [_SE] = LAYOUT_letssplit_wrapper(SETTINGS), // Mouse emulation layer [_MO] = LAYOUT_letssplit_wrapper(MOUSE), // Music layer [_MU] = LAYOUT_letssplit_wrapper(MUSIC), };
D keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/rules.mk => keyboards/maple_computing/lets_split_eh/keymaps/bbaserdem/rules.mk +0 -8
@@ 1,8 0,0 @@ # Build options BACKLIGHT_ENABLE = no # Switch LEDs MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses RGBLIGHT_ENABLE = yes # LED strips TAP_DANCE_ENABLE = no # Use multi-tap features AUDIO_ENABLE = no # Audio stuff
D keyboards/planck/keymaps/bbaserdem/README.md => keyboards/planck/keymaps/bbaserdem/README.md +0 -15
@@ 1,15 0,0 @@ # Planck Layout Current keymap is for rev4. Audio is disabled in favor of RGB. Check out [user readme](../../../../users/bbaserdem/README.md) for more info. # Build Get keyboard into reset mode, and then; ``` make planck/rev4:bbaserdem:dfu ``` Either use sudo or set up udev rules.
D keyboards/planck/keymaps/bbaserdem/config.h => keyboards/planck/keymaps/bbaserdem/config.h +0 -24
@@ 1,24 0,0 @@ #ifndef CONFIG_KEYMAP_H #define CONFIG_KEYMAP_H #include "config_common.h" // LED strip stuff #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN B2 #define RGBLED_NUM 12 #define RGBLIGHT_HUE_STEP 6 #define RGBLIGHT_SAT_STEP 12 #define RGBLIGHT_VAL_STEP 20 #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_EFFECT_SNAKE_LENGTH 6 #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 #define RGBLIGHT_EFFECT_KNIGHT_OFFSET 6 #define RGBLIGHT_EFFECT_KNIGHT_LED_NUM 6 #define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 2000 #define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 #endif #define ENCODER_RESOLUTION 4 #endif
D keyboards/planck/keymaps/bbaserdem/keymap.c => keyboards/planck/keymaps/bbaserdem/keymap.c +0 -28
@@ 1,28 0,0 @@ /* * PLANCK - Dvorak turkish * Keymap by @bbaserdem * Dvorak layout with multiple features * Most of the code is in the "user" directory. * Check qmk_firmware/users/bbaserdem for the main part of the code */ #include "planck.h" #include "bbaserdem.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Main Dvorak layer [_DV] = LAYOUT_planck_wrapper(DVORAK), // Turkish and special character overlay [_AL] = LAYOUT_planck_wrapper(ALTCHAR), // Gaming layer [_GA] = LAYOUT_planck_wrapper(GAME), // Numbers layer [_NU] = LAYOUT_planck_wrapper(NUMBERS), // Settings layer [_SE] = LAYOUT_planck_wrapper(SETTINGS), // Mouse emulation layer [_MO] = LAYOUT_planck_wrapper(MOUSE), // Music mode [_MU] = LAYOUT_planck_wrapper(MUSIC), };
D keyboards/planck/keymaps/bbaserdem/rules.mk => keyboards/planck/keymaps/bbaserdem/rules.mk +0 -7
@@ 1,7 0,0 @@ # Build options BACKLIGHT_ENABLE = yes # Switch LEDs MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses RGBLIGHT_ENABLE = yes # LED strips TAP_DANCE_ENABLE = no # Use multi-tap features AUDIO_ENABLE = yes # Audio stuff
A keyboards/splitkb/kyria/keymaps/bbaserdem/config.h => keyboards/splitkb/kyria/keymaps/bbaserdem/config.h +32 -0
@@ 0,0 1,32 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once // Kyria specific #ifdef KEYBOARD_splitkb_kyria_rev1 // Split definition; use the following to flash; // pro-micro: avrdude-split-left/right // elite-c: dfu-split-left/right # define ENCODER_DIRECTION_FLIP # define EE_HANDS // Make sure kyria has bigger oled display # ifdef OLED_ENABLE # define OLED_DISPLAY_128X64 # endif #endif
A keyboards/splitkb/kyria/keymaps/bbaserdem/keymap.c => keyboards/splitkb/kyria/keymaps/bbaserdem/keymap.c +109 -0
@@ 0,0 1,109 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include QMK_KEYBOARD_H #include "bbaserdem.h" #define LAYOUT_split_3x6_5_wrapper(...) LAYOUT_split_3x6_5(__VA_ARGS__) /* F layout * ┌───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┐ * │ W │ F │ G │ Ğ │ I │ O │ │ D │ R │ N │ H │ P │ Q │ * ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┤ * │ X │ A │ S │ D │ F │ G │ │ T │ K │ M │ L │ Y │ Ş │ * ├───┼───┼───┼───┼───┼───┼───┬───┐ ┌───┬───┼───┼───┼───┼───┼───┼───┤ * │* +│ J │ Ö │ V │ C │ Ç │ │ │ │ │ │ Z │ S │ B │. :│, ;│< >│ * └───┴───┴───┼───┼───┼───┤Esc│Shf│ │Shf│Del├───┼───┼───┼───┴───┴───┘ * │En1│Tab│Ent│ │ │ │ │ │Spc│Bsp│En2│ * └───┴───┴───┴───┴───┘ └───┴───┴───┴───┴───┘ */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_split_3x6_5_wrapper( _BL1_1_,_BL1_5_, _BR1_5_,_BR1_1_, _BL2_1_,_BL2_5_, _BR2_5_,_BR2_1_, _BL3_1_,_BL3_5_,xxx2xxx,xxx2xxx,_BR3_5_,_BR3_1_, BB_ENC0, _BL4_3_,KC_LSFT,KC_RSFT,_BR4_3_,BB_ENC1 ), [_CHAR] = LAYOUT_split_3x6_5_wrapper( XXXXXXX,_CL1_5_, _CR1_5_,XXXXXXX, XXXXXXX,_CL2_5_, _CR2_5_,XXXXXXX, XXXXXXX,_CL3_5_,xxx2xxx,xxx2xxx,_CR3_5_,XXXXXXX, _______,_CL4_3_,_______,_______,_CR4_3_,_______ ), [_GAME] = LAYOUT_split_3x6_5_wrapper( _GA1_1_,_GA1_5_, ___5___,___1___, _GA2_1_,_GA2_5_, ___5___,___1___, _GA3_1_,_GA3_5_,xxx2xxx,xxx2xxx,___5___,___1___, _______,_GA4_3_,_______,_______,___3___,_______ ), [_MEDI] = LAYOUT_split_3x6_5_wrapper( ___1___,___5___, _ME1_5_,___1___, ___1___,___5___, _ME2_5_,___1___, ___1___,___5___,xxx2xxx,xxx2xxx,_ME3_5_,___1___, ___1___,___3___,_______,_______,_ME4_3_,___1___ ), [_NAVI] = LAYOUT_split_3x6_5_wrapper( ___1___,___5___, _NA1_5_,___1___, ___1___,___5___, _NA2_5_,___1___, ___1___,___5___,xxx2xxx,xxx2xxx,_NA3_5_,___1___, ___1___,___3___,_______,_______,_NA4_3_,___1___ ), [_SYMB] = LAYOUT_split_3x6_5_wrapper( ___1___,___5___, _SY1_5_,___1___, ___1___,___5___, _SY2_5_,___1___, ___1___,___5___,xxx2xxx,xxx2xxx,_SY3_5_,___1___, ___1___,___3___,_______,_______,_SY4_3_,___1___ ), [_NUMB] = LAYOUT_split_3x6_5_wrapper( ___1___,_NU1_5_, ___5___,___1___, ___1___,_NU2_5_, ___5___,___1___, ___1___,_NU3_5_,xxx2xxx,xxx2xxx,___5___,___1___, ___1___,_NU4_3_,_______,_______,___3___,___1___ ), [_FUNC] = LAYOUT_split_3x6_5_wrapper( ___1___,_FU1_5_, ___5___,___1___, ___1___,_FU2_5_, ___5___,___1___, ___1___,_FU3_5_,xxx2xxx,xxx2xxx,___5___,___1___, ___1___,_FU4_3_,_______,_______,___3___,___1___ ), [_MOUS] = LAYOUT_split_3x6_5_wrapper( ___1___,_MO1_5_, ___5___,___1___, ___1___,_MO2_5_, ___5___,___1___, ___1___,_MO3_5_,xxx2xxx,xxx2xxx,___5___,___1___, ___1___,_MO4_3_,_______,_______,___3___,___1___ ), [_MUSI] = LAYOUT_split_3x6_5_wrapper( _MU_12_,_MU_12_, _MU_06_,xxx2xxx,xxx2xxx,_MU_06_, MU_TOG,_MUL_3_,_MU_02_,_MUR_3_,___1___ ) }; #ifdef KEYBOARD_splitkb_kyria_rev1 // Kyria specific code #ifdef OLED_ENABLE // Kyria's oled screen // Rotate the display on kyria oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_180; } // For kyria; print logo, and allow default status printing bool oled_task_keymap(void) { render_qmk_logo(0, 0); render_status_lite(4, 0); return false; } #endif //OLED_ENABLE #endif //KEYBOARD_splitkb_kyria_rev1
A keyboards/splitkb/kyria/keymaps/bbaserdem/readme.md => keyboards/splitkb/kyria/keymaps/bbaserdem/readme.md +32 -0
@@ 0,0 1,32 @@ This folder contains my Kyria (`split_3x6_5`) board layout. Check out the [user readme](../../../../../users/bbaserdem/readme.md) for more info. # Kyria I use a rev 1.3 PCB as a daily driver. ## Hardware * Using a modified High-profile case; with metal switch plate. * Currently using a Pro-Micro and an Elite-C as microcontrollers. * Using Gateron Silent Black Ink with Progressive springs (100g), lubed. * Have mill-max sockets for hotswap feature. * All microcontrollers and OLED's are socketed for easy removal. ## Features * Use two thumb keys in the 2u layout. * Have rotary encoders in the outermost keys of the thumb cluster. * Have underglow leds soldered. ## Issues * Stabilizers squiek, and need lubing. * The double tap buttons (home row; left leader the most) don't contact well. ## Todo * Switch to Proton C conversion with a game plan. * Lube stabilizers. * Get tenting puck. * (Not depending on me) migrate this code to layouts.
A keyboards/splitkb/kyria/keymaps/bbaserdem/rules.mk => keyboards/splitkb/kyria/keymaps/bbaserdem/rules.mk +30 -0
@@ 0,0 1,30 @@ # Copyright 2021 Batuhan Başerdem # <baserdem.batuhan@gmail.com> @bbaserdem # # 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 <http://www.gnu.org/licenses/>. # Kyria hardware ifneq (,$(findstring splitkb/kyria/rev1,$(KEYBOARD))) # Elective features ENCODER_ENABLE = yes OLED_ENABLE = yes # Nonexistent features AUDIO_ENABLE = no BACKLIGHT_ENABLE = no RGB_MATRIX_ENABLE = no # Space savers NKRO_ENABLE = no VELOCIKEY_ENABLE = no WPM_ENABLE = no endif
M keyboards/splitkb/kyria/rev1/rules.mk => keyboards/splitkb/kyria/rev1/rules.mk +0 -1
@@ 1,5 1,4 @@ OLED_ENABLE = yes OLED_DRIVER = SSD1306 # Enables the use of OLED displays ENCODER_ENABLE = yes # ENables the use of one or more encoders RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow RGB_MATRIX_ENABLE = no # Enable keyboard RGB matrix (do not use together with RGBLIGHT_ENABLE)
D keyboards/xiudi/xd75/keymaps/bbaserdem/config.h => keyboards/xiudi/xd75/keymaps/bbaserdem/config.h +0 -3
D keyboards/xiudi/xd75/keymaps/bbaserdem/keymap.c => keyboards/xiudi/xd75/keymaps/bbaserdem/keymap.c +0 -21
@@ 1,21 0,0 @@ #include QMK_KEYBOARD_H #include "bbaserdem.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layout * ,-----------------------------------------------------------. * |Blt|Lck| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | * |---+---+-----------------------------------------------+---| * |Int|Trm| |Cps| * |---+---| |---| * |Clc|Psw| | \ | * |---+---| PLANCK |---| * |Rev|Ffw| | [ | * |---+---| |---| * |Tog|Mut| | ] | * `-----------------------------------------------------------' */ [0] = KM( FKLAVYE ), [1] = KM( AYARLAR ), };
D keyboards/xiudi/xd75/keymaps/bbaserdem/readme.md => keyboards/xiudi/xd75/keymaps/bbaserdem/readme.md +0 -14
@@ 1,14 0,0 @@ # XD75RE Setup (WIP) F keyboard for turkish, using unicode. * Write down keymap in userspace * Figure out LED indicators # Make Take the board into reset mode, then ``` make xiudi/xd75:bbaserdem:dfu ``` Either sudo it or set permissions in udev.
D keyboards/xiudi/xd75/keymaps/bbaserdem/rules.mk => keyboards/xiudi/xd75/keymaps/bbaserdem/rules.mk +0 -7
@@ 1,7 0,0 @@ # Build options BACKLIGHT_ENABLE = yes # Switch LEDs MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses RGBLIGHT_ENABLE = no # LED strips TAP_DANCE_ENABLE = no # Use multi-tap features AUDIO_ENABLE = no # Audio stuff
A layouts/community/ortho_3x10/bbaserdem/config.h => layouts/community/ortho_3x10/bbaserdem/config.h +21 -0
@@ 0,0 1,21 @@ /* Copyright 2019 Batuhan Başerdem <baserdem.batuhan@gmail.com> @bbaserdem 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 <http://www.gnu.org/licenses/>. */ #pragma once // Gherkin specific #ifdef KEYBOARD_40percentclub_gherkin #define MUSIC_MAP #define RGB_DI_PIN F6 #define DRIVER_LED_TOTAL 10 #endif
A layouts/community/ortho_3x10/bbaserdem/keymap.c => layouts/community/ortho_3x10/bbaserdem/keymap.c +98 -0
@@ 0,0 1,98 @@ /* Copyright 2019 Batuhan Başerdem <baserdem.batuhan@gmail.com> @bbaserdem 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 <http://www.gnu.org/licenses/>. */ #include QMK_KEYBOARD_H #include "bbaserdem.h" #ifdef KEYBOARD_40percentclub_gherkin // Flip it #undef LAYOUT_ortho_3x10 #define LAYOUT_ortho_3x10( \ K00, K01, K02, K03, K04, K05, K10, K11, K12, K13 , \ K14, K15, K20, K21, K22, K23, K24, K25, K30, K31 , \ K32, K33, K34, K35, K40, K41, K42, K43, K44, K45 \ ) { \ { K45, K44, K43, K42, K41, K40 }, \ { K35, K34, K33, K32, K31, K30 }, \ { K25, K24, K23, K22, K21, K20 }, \ { K15, K14, K13, K12, K11, K10 }, \ { K05, K04, K03, K02, K01, K00 } \ } #endif const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Game pad * ,-----------------------------------------------------------. * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | F1 | F2 | F3 | * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * |AdjsL| Q | W | E | R | Ent | Tab | Ctr | |^| | Alt | * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * |Music| A | S | D | F | Spc |Shift| <-- | |v| | --> | * `-----------------------------------------------------------' */ [_BASE] = LAYOUT_ortho_3x10( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_F1, KC_F2, KC_F3, MO(_MEDI), KC_Q, KC_W, KC_E, KC_R, KC_ENT, KC_TAB, KC_LCTL,KC_UP, KC_LALT, MU_TOG, KC_A, KC_S, KC_D, KC_F, KC_SPC, KC_LSFT,KC_LEFT,KC_DOWN,KC_RGHT ), /* Adjust * ,-----------------------------------------------------------. * | Esc |RGBTg|HueUp|HueDn|SatUp|SatDn|ValUp|ValDn|ModNx|ModPr| * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * | |BltTg|Breth|BriUp|BriDn| | |Veloc|SpdUp|SpdDn| * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * |Music| | | | | | | |EEprm|Reset| * `-----------------------------------------------------------' */ [_MEDI] = LAYOUT_ortho_3x10( CK_TOGG,RGB_TOG,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,RGB_MOD,RGB_RMOD, _______,BL_TOGG,BL_BRTG,BL_INC, BL_DEC, XXXXXXX,XXXXXXX,VLK_TOG,RGB_SPI,RGB_SPD, AU_TOG, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,EEP_RST,RESET ), [_MUSI] = LAYOUT_ortho_3x10_wrapper( MU_FAST,_MU_08_,MU_REC, MU_SLOW,_MU_08_,MU_STOP, MU_TOG, _MU_08_,MU_PLAY ), }; // Music map, guitar like. #ifdef AUDIO_ENABLE const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_ortho_3x10( 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ); #endif // RGB matrix code #ifdef RGB_MATRIX_ENABLE // Gherkin #if defined(KEYBOARD_40percentclub_gherkin) led_config_t g_led_config = { { // Key Matrix to LED Index { NO_LED, NO_LED, NO_LED, NO_LED, NO_LED}, { NO_LED, NO_LED, NO_LED, NO_LED, NO_LED}, { NO_LED, NO_LED, NO_LED, NO_LED, NO_LED}, { NO_LED, NO_LED, NO_LED, NO_LED, NO_LED}, { NO_LED, NO_LED, NO_LED, NO_LED, NO_LED} }, { // LED Index to Physical Position {224, 0}, {168, 0}, {112, 0}, { 56, 0}, { 0, 0}, { 0, 64}, { 56, 64}, {112, 64}, {168, 64}, {224, 64}, }, { // LED Index to Flag 2,2,2,2,2,2,2,2,2,2 }}; // Disable layer switching bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {return true;} #endif // Gherkin #endif // RGB Matrix
A layouts/community/ortho_3x10/bbaserdem/readme.md => layouts/community/ortho_3x10/bbaserdem/readme.md +19 -0
@@ 0,0 1,19 @@ This folder contains my [3x10\_ortho](../../../default/ortho_3x10) board layouts Check out the [user readme](../../../../users/bbaserdem/readme.md) for more info. # Gherkin I use [Gherkin](../../../../keyboards/40percentclub/gherkin/readme.md). It is used as a game pad, and key layout is inspired by spare keys I had lying around. The firmware is very simple, and only includes one layer keymap, and RGB effects. ## Status * [x] Layout adapted * [x] Tested build * [x] Confirmed on board ## Build Build command: `CFLAGS="-Wno-error=deprecated" <FILL-IN-LATER>`
A layouts/community/ortho_3x10/bbaserdem/rules.mk => layouts/community/ortho_3x10/bbaserdem/rules.mk +23 -0
@@ 0,0 1,23 @@ # Copyright 2019 Batuhan Başerdem <baserdem.batuhan@gmail.com> @bbaserdem # 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 <http://www.gnu.org/licenses/>. # This small layout is a macro-pad; does not need userspace # Gherkin has both RGB strip and LED lights ifneq (,$(findstring 40percentclub/gherkin,$(KEYBOARD))) CONVERT_TO_PROTON_C = yes RGB_MATRIX_ENABLE = yes RGB_MATRIX_DRIVER = WS2812 AUDIO_ENABLE = yes BACKLIGHT_ENABLE = yes VELOCIKEY_ENABLE = yes endif
A layouts/community/ortho_4x12/bbaserdem/config.h => layouts/community/ortho_4x12/bbaserdem/config.h +26 -0
@@ 0,0 1,26 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once // Code pertaining to planck rev6 #ifdef KEYBOARD_planck_rev6 // Encoder I use; # ifdef ENCODER_RESOLUTION # undef ENCODER_RESOLUTION # endif # define ENCODER_RESOLUTION 2 #endif
A layouts/community/ortho_4x12/bbaserdem/keymap.c => layouts/community/ortho_4x12/bbaserdem/keymap.c +88 -0
@@ 0,0 1,88 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include QMK_KEYBOARD_H #include "bbaserdem.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Base layer [_BASE] = LAYOUT_ortho_4x12_wrapper( _BL1_5_,_BL1_1_,_BR1_1_,_BR1_5_, _BL2_5_,_BL2_1_,_BR2_1_,_BR2_5_, _BL3_5_,_BL3_1_,_BR3_1_,_BR3_5_, BB_ENC0,KC_DOWN,KC_UP, _BL4_3_,_BR4_3_,KC_LEFT,KC_RGHT,RGB_TOG ), // Extra characters overlay [_CHAR] = LAYOUT_ortho_4x12_wrapper( _CL1_5_,xxx2xxx,_CR1_5_, _CL2_5_,xxx2xxx,_CR2_5_, _CL3_5_,xxx2xxx,_CR3_5_, ___3___,_CL4_3_,_CR4_3_,___3___ ), // Game layer: left_half [_GAME] = LAYOUT_ortho_4x12_wrapper( _GA1_5_,_GA1_1_,___6___, _GA2_5_,_GA2_1_,___6___, _GA3_5_,_GA3_1_,___6___, ___3___,_GA4_3_,___6___ ), // Media layer: right_half [_MEDI] = LAYOUT_ortho_4x12_wrapper( ___6___,xxx1xxx,_ME1_5_, ___6___,xxx1xxx,_ME2_5_, ___6___,xxx1xxx,_ME3_5_, ___6___,_ME4_3_,___3___ ), // Navigation layer: right_half [_NAVI] = LAYOUT_ortho_4x12_wrapper( ___6___,xxx1xxx,_NA1_5_, ___6___,xxx1xxx,_NA2_5_, ___6___,xxx1xxx,_NA3_5_, ___6___,_NA4_3_,___3___ ), // Symbol layer: right_half [_SYMB] = LAYOUT_ortho_4x12_wrapper( ___6___,xxx1xxx,_SY1_5_, ___6___,xxx1xxx,_SY2_5_, ___6___,xxx1xxx,_SY3_5_, ___6___,_SY4_3_,___3___ ), // Number layer: left_half [_NUMB] = LAYOUT_ortho_4x12_wrapper( xxx1xxx,_NU1_5_,___6___, xxx1xxx,_NU2_5_,___6___, xxx1xxx,_NU3_5_,___6___, ___3___,_NU4_3_,___6___ ), // Function layer: left_half [_FUNC] = LAYOUT_ortho_4x12_wrapper( _FU1_5_,xxx1xxx,___6___, _FU2_5_,xxx1xxx,___6___, _FU3_5_,xxx1xxx,___6___, ___3___,_FU4_3_,___6___ ), // Mouse layer: left_half [_MOUS] = LAYOUT_ortho_4x12_wrapper( _MO1_5_,xxx1xxx,___6___, _MO2_5_,xxx1xxx,___6___, _MO3_5_,xxx1xxx,___6___, ___3___,_MO4_3_,___6___ ), // Music layer: everything [_MUSI] = LAYOUT_ortho_4x12_wrapper( _MU_12_,_MU_12_,_MU_12_, ___1___,_MU_02_,_MUL_3_,_MUR_3_,_MU_02_,___1___) };
A layouts/community/ortho_4x12/bbaserdem/readme.md => layouts/community/ortho_4x12/bbaserdem/readme.md +12 -0
@@ 0,0 1,12 @@ This folder contains my [4x12\_ortho](../../../default/ortho_4x12) board layouts Check out the [user readme](../../../../users/bbaserdem/readme.md) for more info. # Planck Light I use a couple [planck](../../../../keyboards/planck/readme.md) keyboards. To sell soon; don't use them anymore, but will keep the light version. # JJ40 A planck rev4 replacement; for my acrylic planck case which used to host a now defunct rev4.
A layouts/community/ortho_4x12/bbaserdem/rules.mk => layouts/community/ortho_4x12/bbaserdem/rules.mk +26 -0
@@ 0,0 1,26 @@ # Copyright 2021 Batuhan Başerdem # <baserdem.batuhan@gmail.com> @bbaserdem # # 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 <http://www.gnu.org/licenses/>. # Planck rev6 has both RGBLIGHT and RGB_MATRIX enabled ifneq (,$(findstring planck/rev6,$(KEYBOARD))) RGB_MATRIX_ENABLE = yes RGBLIGHT_ENABLE = no endif # JJ40 here ifneq (,$(findstring jj40,$(KEYBOARD))) RGB_MATRIX_ENABLE = yes endif
A layouts/community/split_3x5_3/bbaserdem/config.h => layouts/community/split_3x5_3/bbaserdem/config.h +35 -0
@@ 0,0 1,35 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once // Split definition; use the following to flash; // pro-micro: avrdude-split-left/right // elite-c: dfu-split-left/right #define EE_HANDS #ifdef KEYBOARD_crkbd_rev1 // Corne overrides # ifdef RGBLED_NUM # undef RGBLED_NUM # endif # ifdef DRIVER_LED_TOTAL # undef DRIVER_LED_TOTAL # endif # define RGBLED_NUM 48 # define DRIVER_LED_TOTAL RGBLED_NUM #endif // KEYBOARD_crkbd_rev1
A layouts/community/split_3x5_3/bbaserdem/keymap.c => layouts/community/split_3x5_3/bbaserdem/keymap.c +117 -0
@@ 0,0 1,117 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include QMK_KEYBOARD_H #include "bbaserdem.h" /* D layout * ┌───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┐ * │' "│, <│. >│ P │ Y │ │ F │ G │ C │ R │ L │ * ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ * │ A │ O │ E │ U │ I │ │ D │ H │ T │ N │ S │ * ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ * │; :│ Q │ J │ K │ X │ │ B │ M │ W │ V │ Z │ * └───┴───┴───┼───┼───┼───┐ ┌───┼───┼───┼───┴───┴───┘ * │Del│Tab│Spc│ │Ent│Esc│Bsp│ * └───┴───┴───┘ └───┴───┴───┘ */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_split_3x5_3_wrapper( _BL1_5_,_BR1_5_, _BL2_5_,_BR2_5_, _BL3_5_,_BR3_5_, _BL4_3_,_BR4_3_ ), [_CHAR] = LAYOUT_split_3x5_3_wrapper( _CL1_5_,_CR1_5_, _CL2_5_,_CR2_5_, _CL3_5_,_CR3_5_, _CL4_3_,_CR4_3_ ), [_GAME] = LAYOUT_split_3x5_3_wrapper( _GA1_5_,___5___, _GA2_5_,___5___, _GA3_5_,___5___, _GA4_3_,___3___ ), [_MEDI] = LAYOUT_split_3x5_3_wrapper( ___5___,_ME1_5_, ___5___,_ME2_5_, ___5___,_ME3_5_, ___3___,_ME4_3_ ), [_NAVI] = LAYOUT_split_3x5_3_wrapper( ___5___,_NA1_5_, ___5___,_NA2_5_, ___5___,_NA3_5_, ___3___,_NA4_3_ ), [_SYMB] = LAYOUT_split_3x5_3_wrapper( ___5___,_SY1_5_, ___5___,_SY2_5_, ___5___,_SY3_5_, ___3___,_SY4_3_ ), [_NUMB] = LAYOUT_split_3x5_3_wrapper( _NU1_5_,___5___, _NU2_5_,___5___, _NU3_5_,___5___, _NU4_3_,___3___ ), [_FUNC] = LAYOUT_split_3x5_3_wrapper( _FU1_5_,___5___, _FU2_5_,___5___, _FU3_5_,___5___, _FU4_3_,___3___ ), [_MOUS] = LAYOUT_split_3x5_3_wrapper( _MO1_5_,___5___, _MO2_5_,___5___, _MO3_5_,___5___, _MO4_3_,___3___ ), [_MUSI] = LAYOUT_split_3x5_3_wrapper( _MU_10_, _MU_10_, _MU_10_, _MUL_3_,_MUR_3_ ) }; // RGB Matrix configuration #ifdef RGB_MATRIX_ENABLE // crkbd #ifdef KEYBOARD_crkbd_rev1 /* This is left-right for crkbd indicator light * ┌──┬──┬──┬──┬──┐ ┌──┬──┬──┬──┬──┐ * │23│18│17│10│09│ │33│34│41│42│47│ * ├02┼──┼01┼──┼00┤ ├24┼──┼25┼──┼26┤ * │22│19│16│11│08│ │32│35│40│43│46│ * ├03┼──┼04┼──┼05┤ ├29┼──┼28┼──┼27┤ * │21│20│15│12│07│ │31│36│39│44│45│ * └──┴──┴──┼──┼──┼──┐┌──┼──┼──┼──┴──┴──┘ * │14│13│06││30│37│38│ * └──┴──┴──┘└──┴──┴──┘ */ // End of differentiations #endif // KEYBOARD_crkbd_rev1 // End of code for the RGB_MATRIX setup #endif // RGB_MATRIX_ENABLE
A layouts/community/split_3x5_3/bbaserdem/readme.md => layouts/community/split_3x5_3/bbaserdem/readme.md +18 -0
@@ 0,0 1,18 @@ This folder contains my [split\_3x5\_3](../../../default/split_3x5_3) board layouts Check out the [user readme](../../../../users/bbaserdem/readme.md) for more info. # Crkbd Using a no 6th column crkbd (rev 2.1 choc) as a mobile keyboard. This version uses ProMicro as controllers; can't have OLED and RGB at the same time. ## Build QMK cli commands no longer works with Archlinux (2021 Sep.) on my PC for flashing promicro. In the past; I used to flash Pro Micro explicitly using the following line, for referance. ``` sudo avrdude -p atmgea34u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:<hexfile>.hex ```
A layouts/community/split_3x5_3/bbaserdem/rules.mk => layouts/community/split_3x5_3/bbaserdem/rules.mk +22 -0
@@ 0,0 1,22 @@ # Copyright 2021 Batuhan Başerdem # <baserdem.batuhan@gmail.com> @bbaserdem # # 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 <http://www.gnu.org/licenses/>. # Corne keyboard ifneq (,$(findstring crkbd/rev1,$(KEYBOARD))) RGBLIGHT_ENABLE = no RGB_MATRIX_ENABLE = yes OLED_ENABLE = no endif
A layouts/community/split_3x6_3/bbaserdem/chconf.h => layouts/community/split_3x6_3/bbaserdem/chconf.h +23 -0
@@ 0,0 1,23 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ // Code pertaining the ARM crkbd version #ifdef KEYBOARD_crkbd_rev1 # define CH_CFG_ST_RESOLUTION 16 # define CH_CFG_ST_FREQUENCY 10000 # include_next "chconf.h" #endif // KEYBOARD_crkbd_rev1
A layouts/community/split_3x6_3/bbaserdem/config.h => layouts/community/split_3x6_3/bbaserdem/config.h +77 -0
@@ 0,0 1,77 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once // Split definition; use the following to flash; // pro-micro: avrdude-split-left/right // elite-c: dfu-split-left/right // Code pertaining to Corne ARM; from Waffle's keymap #ifdef KEYBOARD_crkbd_rev1 // Use EE_HANDS to determine handedness # define EE_HANDS // Rebrand the PCB # undef PRODUCT # define PRODUCT Protorne Keyboard # undef MANUFACTURER # define MANUFACTURER Waffles // Remove OLED definitions? # undef USE_I2C # undef SSD1306OLED // Audio output on pin A5 (actualy will be output on B1 using keymap init) # ifdef AUDIO_ENABLE # define AUDIO_PIN A5 # define MUSIC_MAP # endif // Set serial pin as D3 for sure # undef SOFT_SERIAL_PIN # define SOFT_SERIAL_PIN D3 # define SERIAL_USART_SPEED 921600 # define SERIAL_USART_DRIVER SD1 # define SERIAL_USART_TX_PAL_MODE 7 // Things to make RGB matrix work on the waffle board # undef RGBLED_NUM # define RGBLED_NUM 54 # undef RGB_DI_PIN # define RGB_DI_PIN B5 # ifdef RGB_MATRIX_ENABLE # define RGB_MATRIX_MAXIMUM_BRIGHTNESS 100 # define RGB_MATRIX_SPLIT { 27, 27 } # endif # define WS2812_PWM_DRIVER PWMD3 # define WS2812_PWM_CHANNEL 3 # define WS2812_PWM_PAL_MODE 2 # define WS2812_DMA_STREAM STM32_DMA1_STREAM3 # define WS2812_DMA_CHANNEL 3 // OLED related code # ifdef OLED_ENABLE # define OLED_UPDATE_INTERVAL 100 # endif // Encoder definitons # define ENCODERS_PAD_A { B2 } # define ENCODERS_PAD_B { B6 } # define ENCODER_RESOLUTIONS { 4 } # define ENCODERS_PAD_A_RIGHT { B2 } # define ENCODERS_PAD_B_RIGHT { B6 } # define ENCODER_RESOLUTIONS_RIGHT { 2 } #endif
A layouts/community/split_3x6_3/bbaserdem/halconf.h => layouts/community/split_3x6_3/bbaserdem/halconf.h +24 -0
@@ 0,0 1,24 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #ifdef KEYBOARD_crkbd_rev1 // #define HAL_USE_DAC TRUE # define HAL_USE_PWM TRUE # define HAL_USE_SERIAL TRUE # include_next <halconf.h> #endif
A layouts/community/split_3x6_3/bbaserdem/keymap.c => layouts/community/split_3x6_3/bbaserdem/keymap.c +191 -0
@@ 0,0 1,191 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include QMK_KEYBOARD_H #include "bbaserdem.h" #ifdef KEYBOARD_crkbd_rev1 # include "bb-oled-extra.h" #endif // KEYBOARD_crkbd_rev1 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_split_3x6_3_wrapper( BB_ENC0,_BL1_5_,_BR1_5_,BB_ENC1, _BL2_1_,_BL2_5_,_BR2_5_,_BR2_1_, _BL3_1_,_BL3_5_,_BR3_5_,_BR3_1_, _BL4_3_,_BR4_3_ ), [_CHAR] = LAYOUT_split_3x6_3_wrapper( _______,_CL1_5_,_CR1_5_,_______, XXXXXXX,_CL2_5_,_CR2_5_,XXXXXXX, XXXXXXX,_CL3_5_,_CR3_5_,XXXXXXX, _CL4_3_,_CR4_3_ ), [_GAME] = LAYOUT_split_3x6_3_wrapper( _______,_GA1_5_,___6___, _GA2_1_,_GA2_5_,___6___, _GA3_1_,_GA3_5_,___6___, _GA4_3_,___3___ ), [_MEDI] = LAYOUT_split_3x6_3_wrapper( ___6___,_ME1_5_,_______, ___6___,_ME2_5_,xxx1xxx, ___6___,_ME3_5_,xxx1xxx, ___3___,_ME4_3_ ), [_NAVI] = LAYOUT_split_3x6_3_wrapper( ___6___,_NA1_5_,_______, ___6___,_NA2_5_,xxx1xxx, ___6___,_NA3_5_,xxx1xxx, ___3___,_NA4_3_ ), [_SYMB] = LAYOUT_split_3x6_3_wrapper( ___6___,_SY1_5_,_______, ___6___,_SY2_5_,xxx1xxx, ___6___,_SY3_5_,xxx1xxx, ___3___,_SY4_3_ ), [_NUMB] = LAYOUT_split_3x6_3_wrapper( _______,_NU1_5_,___6___, xxx1xxx,_NU2_5_,___6___, xxx1xxx,_NU3_5_,___6___, _NU4_3_,___3___ ), [_FUNC] = LAYOUT_split_3x6_3_wrapper( _______,_FU1_5_,___6___, xxx1xxx,_FU2_5_,___6___, xxx1xxx,_FU3_5_,___6___, _FU4_3_,___3___ ), [_MOUS] = LAYOUT_split_3x6_3_wrapper( _______,_MO1_5_,___6___, xxx1xxx,_MO2_5_,___6___, xxx1xxx,_MO3_5_,___6___, _MO4_3_,___3___ ), [_MUSI] = LAYOUT_split_3x6_3_wrapper( _MU_12_, _MU_12_, _MU_12_, _MUL_3_,_MUR_3_ ) }; // crkbd #ifdef KEYBOARD_crkbd_rev1 #ifdef AUDIO_ENABLE const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_split_3x6_3( 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0 ); #endif // AUDIO_ENABLE void keyboard_pre_init_keymap(void) { # ifdef AUDIO_ENABLE //thank you to @sigprof for this // Set audio pins to analog mode palSetLineMode(A5, PAL_MODE_INPUT_ANALOG); palSetLineMode(B1, PAL_MODE_INPUT_ANALOG); # endif // AUDIO_ENABLE # ifdef RGB_MATRIX_ENABLE // Led locations are different on protorne; need to be fixed g_led_config = (led_config_t) { { // Logical Layout // 0 1 2 3 4 5 COLS // -LEFT ROWS // 16 17 18 19 20 21 0 // 15 14 13 12 11 10 1 // 04 05 06 07 08 09 2 // 03 02 01 3 // -Right // 21 20 19 18 17 16 4 // 10 11 12 13 14 15 5 // 09 08 07 06 05 04 6 // 01 02 03 7 { 15, 16, 17, 18, 19, 20}, { 14, 13, 12, 11, 10, 9 }, { 3, 4, 5, 6, 7, 8 }, { NO_LED, NO_LED, NO_LED, 2, 1, 0 }, { 47, 46, 45, 44, 43, 42 }, { 36, 37, 38, 39, 40, 41 }, { 35, 34, 33, 32, 31, 30 }, { NO_LED, NO_LED, NO_LED, 27, 28, 29 } }, { // Physical Layout // LEFT RIGHT // 16 17 18 19 20 21 16 17 18 19 20 21 // 24 23 22 24 23 22 // 15 14 13 12 11 10 15 14 13 12 11 10 // 25 27 // 04 05 06 07 08 09 04 05 06 07 08 09 // 26 27 25 26 // 03 02 01 03 02 01 { 95, 63 }, { 80, 58 }, { 60, 55 }, { 0, 41 }, { 16, 42 }, { 33, 37 }, { 50, 35 }, { 68, 37 }, { 85, 39 }, { 85, 21 }, { 68, 19 }, { 50, 13 }, { 33, 20 }, { 16, 24 }, { 0, 24 }, { 0, 7 }, { 16, 7 }, { 33, 3 }, { 50, 0 }, { 68, 2 }, { 85, 4 }, { 85, 16 }, { 50, 13 }, { 16, 20 }, { 16, 38 }, { 50, 48 }, { 85, 52 }, { 164, 55 }, { 144, 58 }, { 129, 63 }, { 139, 39 }, { 156, 37 }, { 174, 35 }, { 191, 37 }, { 208, 42 }, { 224, 41 }, { 224, 24 }, { 208, 24 }, { 191, 20 }, { 174, 13 }, { 156, 19 }, { 139, 21 }, { 139, 4 }, { 156, 2 }, { 174, 0 }, { 191, 3 }, { 208, 7 }, { 224, 7 }, { 208, 20 }, { 174, 13 }, { 139, 16 }, { 139, 52 }, { 174, 48 }, { 208, 38 } }, { // (x---)8 stands for indicator // (-x--)4 stands for per-key led // (--x-)2 stands for underglow led // (---1)1 stands for modifier key 12, 12, 12, 4, 4, 5, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 12, 12, 12, 4, 4, 4, 5, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10 } }; # endif // RGB_MATRIX_ENABLE } // Enable OPAMP1 as A5 → B1 follower #ifdef AUDIO_ENABLE void keyboard_post_init_keymap(void) { OPAMP3->CSR = OPAMP3_CSR_VMSEL_1 | OPAMP3_CSR_VMSEL_0 | OPAMP3_CSR_VPSEL_0 | OPAMP3_CSR_OPAMP3EN; } #endif // AUDIO_ENABLE #ifdef OLED_ENABLE // Flip the display on the right half oled_rotation_t oled_init_user(oled_rotation_t rotation) { if (!is_keyboard_left()) { return OLED_ROTATION_180; } return rotation; } bool oled_task_keymap(void) { if (is_keyboard_left()) { render_status_left(0, 0); } else { render_status_right(0, 0); } return false; } #endif // OLED_ENABLE #endif // KEYBOARD_crkbd_rev1
A layouts/community/split_3x6_3/bbaserdem/mcuconf.h => layouts/community/split_3x6_3/bbaserdem/mcuconf.h +25 -0
@@ 0,0 1,25 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #ifdef KEYBOARD_crkbd_rev1 # include_next <mcuconf.h> # undef STM32_PWM_USE_TIM3 # define STM32_PWM_USE_TIM3 TRUE # undef STM32_SERIAL_USE_USART1 # define STM32_SERIAL_USE_USART1 TRUE #endif
A layouts/community/split_3x6_3/bbaserdem/readme.md => layouts/community/split_3x6_3/bbaserdem/readme.md +15 -0
@@ 0,0 1,15 @@ This folder contains my [split\_3x6\_3](../../../default/split_3x6_3) board layouts Check out the [user readme](../../../../users/bbaserdem/readme.md) for more info. # Crkbd Using [this](https://github.com/ItsWaffIe/waffle_corne) Proton-C compatible PCB. Applying the similar keymap to [@waffle](https://github.com/ItsWaffIe/waffle_corne); using their `crkbd:rev1:arm` build. ## Build Build commands; * For ARM: `CFLAGS="-Wno-error=deprecated" qmk flash -kb crkdb/rev1 -km bbaserdem -bl dfu-util-split-{left,right}`
A layouts/community/split_3x6_3/bbaserdem/rules.mk => layouts/community/split_3x6_3/bbaserdem/rules.mk +47 -0
@@ 0,0 1,47 @@ # Copyright 2021 Batuhan Başerdem # <baserdem.batuhan@gmail.com> @bbaserdem # # 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 <http://www.gnu.org/licenses/>. # Corne keyboard; with ARM ifneq (,$(findstring crkbd/rev1,$(KEYBOARD))) # Proton C conversion MCU = STM32F303 CTPC = yes # BOARD = QMK_PROTON_C # BOOTLOADER = stm32-dfu # My usual features AUDIO_ENABLE = yes BACKLIGHT_ENABLE = no ENCODER_ENABLE = yes RGB_MATRIX_ENABLE = yes OLED_ENABLE = yes # Features that take otherwise too much space WPM_ENABLE = yes NKRO_ENABLE = yes # Config SERIAL_DRIVER = usart WS2812_DRIVER = pwm AUDIO_DRIVER = dac_basic SPLIT_KEYBOARD = yes # These are from waffle DEBUG_MATRIX_SCAN_RATE_ENABLE = no # output matrix scan rate in qmk console/qmk toolbox QUANTUM_LIB_SRC += i2c_master.c #drivers/chibios/i2cmaster.h needs patch - see lines 27/28 VIA_ENABLE = no # COMMAND_ENABLE = no # CONSOLE_ENABLE = no # BOOTMAGIC_ENABLE = lite # LTO_ENABLE = yes # PIMORONI_TRACKBALL = no endif
A layouts/community/split_3x6_3/bbaserdem/ssd1306.c => layouts/community/split_3x6_3/bbaserdem/ssd1306.c +16 -0
@@ 0,0 1,16 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */
A users/bbaserdem/.gitignore => users/bbaserdem/.gitignore +2 -0
D users/bbaserdem/README.md => users/bbaserdem/README.md +0 -51
@@ 1,51 0,0 @@ # Overview I have mostly ortholinear keyboards, which share a lot of functions. For this purpose, I collected them here. I have the following keymaps: * Gherkin (Does not use the user space) * XD75RE (Uses different keymap) * Let's Split * Let's Split It Up * Planck # Layout I use DVORAK with an unorthodox Turkish layout. If you wanna grab my code, and you used a layout with a persistent base layer change, change it to layer 0 before proceeding. # Layers * **Dvorak**: Base layer,with dvorak layout. * **Alternative**: Has alternate characters. * **Game**: Toggled from *Function*, comfortable for gaming use. * **Numeric**: Has numericals and symbols. Can be locked. * **Function**: Layer has media and function keys. * **Mouse**: Manipulates mouse. Can be locked. * **Music** Allows playing sounds. # Functionality * **RGB Backlight**: With layer indication, and ability to change base layer lighting mode. * **Secrets**: By placing a secrets.h, and not tracking it, passwords can be stored. * **Mouse**: Mouse emulation, complete with diagonal keys. * **Turkish**: An AltGr-like overlay that allows some non-common letters, in unicode. I suggest checking out how I enabled Turkish keys, how I planned out RGB lighting, and my mouse implementation; they might offer some insight into fringe user cases. # Issues All features are too big for the 32kB bootloader. Offenders are audio and rgb lights; it comes down to one or the other. ~The Proton board, and rev 6 might fix that.~ # Credits I have previously written my keymap by myself before, but I rewrote it here,
A users/bbaserdem/bb-audio.c => users/bbaserdem/bb-audio.c +82 -0
@@ 0,0 1,82 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include "bb-audio.h" /* AUDIO * This contains some audio related stuff. * There is no need to wrap this up with preprocessor commands; * This is only called if audio is enabled */ float tone_game_intro[][2] = GAME_ON_SONG; float tone_game_outro[][2] = GAME_OFF_SONG; // Audio playing when layer changes layer_state_t layer_state_set_audio(layer_state_t state) { // Get this layer static bool prev_game = false; // If entering the game layer; play the intro sound if (layer_state_cmp(state, _GAME) && (!prev_game)) { stop_all_notes(); PLAY_SONG(tone_game_intro); prev_game = true; } // If exiting the game layer; play the outro sound if ((!layer_state_cmp(state, _GAME)) && prev_game) { stop_all_notes(); PLAY_SONG(tone_game_outro); prev_game = false; } return state; } // Audio layer switch; add the music layer on top of this bool process_record_audio(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case MU_TOG: if (!record->event.pressed) { // On release, exit music mode if enabled if (layer_state_is(_MUSI)) { layer_off(_MUSI); // If not enabled; turn off all layers and load music layer } else { layer_clear(); layer_on(_MUSI); } } return true; break; case MU_ON: if (!record->event.pressed) { // On release, enter music mode layer_clear(); layer_on(_MUSI); } return true; break; case MU_OFF: if (!record->event.pressed) { // On release, exit music mode layer_off(_MUSI); } return true; break; } return true; }
A users/bbaserdem/bb-audio.h => users/bbaserdem/bb-audio.h +28 -0
@@ 0,0 1,28 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #include "bbaserdem.h" /* AUDIO * Some functions to hook to some modes */ // Hook to layer change effects layer_state_t layer_state_set_audio(layer_state_t state); // Hook to audio keycodes bool process_record_audio(uint16_t keycode, keyrecord_t *record);
A users/bbaserdem/bb-backlight.c => users/bbaserdem/bb-backlight.c +30 -0
@@ 0,0 1,30 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include "bb-backlight.h" /* Replaced functions with noeeprom varieties; I don't need retention across * booting. */ // Backlight LEDs void keyboard_post_init_backlight(void) { backlight_enable(); backlight_level(2); # ifdef BACKLIGHT_BREATHING breathing_enable(); # endif // BACKLIGHT_BREATHING }
A users/bbaserdem/bb-backlight.h => users/bbaserdem/bb-backlight.h +23 -0
@@ 0,0 1,23 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #include "bbaserdem.h" /* Hooks for backlight definitions */ void keyboard_post_init_backlight(void);
A users/bbaserdem/bb-encoder.c => users/bbaserdem/bb-encoder.c +514 -0
@@ 0,0 1,514 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include "bb-encoder.h" // Need this to call velocikey activation #ifdef VELOCIKEY_ENABLE # include "velocikey.h" #endif // VELOCIKEY_ENABLE // Need memcpy and memcmp from string.h along with transfer stuff #ifdef OLED_ENABLE # include <string.h> #endif // OLED_ENABLE /* ROTARY ENCODER * This contains my general rotary encoder code * Encoders each have a list of different modes they can be in. * Each mode also have an on click action as well. * Modes can be cycled using either shift-click or ctrl-click * Modes can be reset using OS click * Some modes are only accessible through some keymap layers */ // Default state for the encoders void reset_encoder_state(void) { userspace_config.e0base = 0; userspace_config.e0point = 0; userspace_config.e0rgb = 0; userspace_config.e1base = 1; userspace_config.e1point = 1; userspace_config.e1rgb = 1; } // Encoder scroll functionality bool encoder_update_user(uint8_t index, bool clockwise) { uint8_t this_number; // Differentiate layer roles switch (get_highest_layer(layer_state)) { # ifdef RGB_MATRIX_ENABLE case _MEDI: // Get correct index if (index == 0) { this_number = userspace_config.e0rgb; } else if (index == 1) { this_number = userspace_config.e1rgb; } else { this_number = 128; } switch(this_number) { case 0: // Effect the RGB mode if (clockwise) { rgb_matrix_step_noeeprom(); } else { rgb_matrix_step_reverse_noeeprom(); } break; case 1: // Effect the RGB hue if (clockwise) { rgb_matrix_increase_hue_noeeprom(); } else { rgb_matrix_decrease_hue_noeeprom(); } break; case 2: // Effect the RGB saturation if (clockwise) { rgb_matrix_increase_sat_noeeprom(); } else { rgb_matrix_decrease_sat_noeeprom(); } break; case 3: // Effect the RGB brightness if (clockwise) { rgb_matrix_increase_val_noeeprom(); } else { rgb_matrix_decrease_val_noeeprom(); } break; case 4: // Effect the RGB effect speed if (clockwise) { rgb_matrix_increase_speed_noeeprom(); } else { rgb_matrix_decrease_speed_noeeprom(); } break; } break; # endif // RGB_MATRIX_ENABLE # ifdef MOUSEKEY_ENABLE case _MOUS: // Get correct index if (index == 0) { this_number = userspace_config.e0point; } else if (index == 1) { this_number = userspace_config.e1point; } else { this_number = 128; } switch(this_number) { case 0: // Move mouse on horizontal axis if (clockwise) { tap_code(KC_MS_R); } else { tap_code(KC_MS_L); } break; case 1: // Move mouse on vertical axis if (clockwise) { tap_code(KC_MS_D); } else { tap_code(KC_MS_U); } break; case 2: // Move mouse wheel on vertical axis if (clockwise) { tap_code(KC_WH_D); } else { tap_code(KC_WH_U); } break; case 3: // Move mouse on horizontal axis if (clockwise) { tap_code(KC_WH_R); } else { tap_code(KC_WH_L); } break; } break; # endif // MOUSEKEY_ENABLE default: // Get correct index if (index == 0) { this_number = userspace_config.e0base; } else if (index == 1) { this_number = userspace_config.e1base; } else { this_number = 128; } switch(this_number) { case 0: // Volume if (clockwise) { tap_code16(KC_VOLU); } else { tap_code16(KC_VOLD); } break; case 1: // Song change if (clockwise) { tap_code16(KC_MNXT); } else { tap_code16(KC_MPRV); } break; case 2: // Move to audio sink if (clockwise) { tap_code16(KC_F13); } else { tap_code16(S(KC_F13)); } break; case 3: // Volume of source if (clockwise) { tap_code16(S(KC_VOLU)); } else { tap_code16(C(KC_VOLD)); } break; case 4: // Move to audio source if (clockwise) { tap_code16(C(KC_F13)); } else { tap_code16(C(S(KC_F13))); } break; case 5: // Left-right if (clockwise) { tap_code16(KC_RGHT); } else { tap_code16(KC_LEFT); } break; case 6: // Up-down if (clockwise) { tap_code16(KC_DOWN); } else { tap_code16(KC_UP); } break; case 7: // Page Up-down if (clockwise) { tap_code16(KC_PGDN); } else { tap_code16(KC_PGUP); } break; case 8: // Delete if (clockwise) { tap_code16(KC_DEL); } else { tap_code16(KC_BSPC); } break; } break; } return false; } void encoder_click_action(uint8_t index) { uint8_t this_number; // Differentiate layer roles switch (get_highest_layer(layer_state)) { # ifdef RGB_MATRIX_ENABLE case _MEDI: // Get correct index if (index == 0) { this_number = userspace_config.e0rgb; } else if (index == 1) { this_number = userspace_config.e1rgb; } else { this_number = 128; } switch(this_number) { case 0: // Return to no animation rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR); break; case 1: case 2: case 3: // Toggle rgb_matrix_increase_val_noeeprom(); break; case 4: // Toggle velocikey # ifdef VELOCIKEY_ENABLE velocikey_toggle(); # endif // VELOCIKEY_ENABLE break; } break; # endif // RGB_MATRIX_ENABLE # ifdef MOUSEKEY_ENABLE case _MOUS: // Get correct index if (index == 0) { this_number = userspace_config.e0point; } else if (index == 1) { this_number = userspace_config.e1point; } else { this_number = 128; } switch(this_number) { case 0: // Left click tap_code16(KC_BTN1); break; case 1: // Right click tap_code16(KC_BTN2); break; case 2: case 3: // Middle click tap_code16(KC_BTN2); break; } break; # endif // MOUSEKEY_ENABLE default: // Get correct index if (index == 0) { this_number = userspace_config.e0base; } else if (index == 1) { this_number = userspace_config.e1base; } else { this_number = 128; } switch(this_number) { case 0: // Toggle mute case 2: tap_code16(KC_MUTE); break; case 1: // Pause tap_code16(KC_MPLY); break; case 3: // Mute source case 4: tap_code16(A(KC_MUTE)); break; case 5: // Insert tap_code16(KC_INS); break; case 6: // Capslock tap_code16(KC_CAPS); break; case 7: // Redo tap_code16(BB_REDO); break; case 8: // Undo tap_code16(BB_UNDO); break; } break; } } bool process_record_encoder(uint16_t keycode, keyrecord_t *record) { // Check if and which encoder int encoder_index = -1; // Get the pressed encoder switch (keycode) { case BB_ENC0: encoder_index = 0; break; case BB_ENC1: encoder_index = 1; break; } // Activate encoder function of button if ((encoder_index >= 0) & (!record->event.pressed)) { // If shifted, move mode one point forward if (get_mods() & MOD_MASK_SHIFT) { switch (get_highest_layer(layer_state)) { # ifdef RGB_MATRIX_ENABLE case _MEDI: if (encoder_index == 0) { userspace_config.e0rgb = (userspace_config.e0rgb + 1) % 5; } else { userspace_config.e1rgb = (userspace_config.e1rgb + 1) % 5; } break; # endif // RGB_MATRIX_ENABLE # ifdef MOUSEKEY_ENABLE case _MOUS: if (encoder_index == 0) { userspace_config.e0point = (userspace_config.e0point + 1) % 4; } else { userspace_config.e1point = (userspace_config.e1point + 1) % 4; } break; # endif // MOUSEKEY_ENABLE default: if (encoder_index == 0) { userspace_config.e0base = (userspace_config.e0base + 1) % 9; } else { userspace_config.e1base = (userspace_config.e1base + 1) % 9; } break; } // If ctrl is active, move mode one point backwards } else if (get_mods() & MOD_MASK_CTRL) { switch (get_highest_layer(layer_state)) { # ifdef RGB_MATRIX_ENABLE case _MEDI: if (encoder_index == 0) { userspace_config.e0rgb = (userspace_config.e0rgb + 5 - 1) % 5; } else { userspace_config.e1rgb = (userspace_config.e1rgb + 5 - 1) % 5; } break; # endif // RGB_MATRIX_ENABLE # ifdef MOUSEKEY_ENABLE case _MOUS: if (encoder_index == 0) { userspace_config.e0point = (userspace_config.e0point + 4 - 1) % 4; } else { userspace_config.e1point = (userspace_config.e1point + 4 - 1) % 4; } break; # endif // MOUSEKEY_ENABLE default: if (encoder_index == 0) { userspace_config.e0base = (userspace_config.e0base + 9 - 1) % 9; } else { userspace_config.e1base = (userspace_config.e1base + 9 - 1) % 9; } break; } // If meta is active, reset the encoder states } else if (get_mods() & MOD_MASK_GUI) { reset_encoder_state(); eeconfig_update_user(userspace_config.raw); // If nothing else; just perform the click action } else { encoder_click_action(encoder_index); } } return true; } // For printing status to OLED #ifdef OLED_ENABLE void encoder_state_string(uint8_t index, uint8_t layer, char* buffer) { uint8_t this_number; // Get the layer straight from the main function switch (layer) { // If RGB control mode is enabled # ifdef RGB_MATRIX_ENABLE case _MEDI: // Get correct index if (index == 0) { this_number = userspace_config.e0rgb; } else if (index == 1) { this_number = userspace_config.e1rgb; } else { this_number = 128; } switch (this_number) { case 0: strcpy(buffer, "ani mode"); break; case 1: strcpy(buffer, "hue "); break; case 2: strcpy(buffer, "saturat."); break; case 3: strcpy(buffer, "bright. "); break; case 4: strcpy(buffer, "ani. spd"); break; default: strcpy(buffer, " -N/A- "); break; } break; # endif // RGB_MATRIX_ENABLE // If pointer control is enabled # ifdef MOUSEKEY_ENABLE case _MOUS: // Get correct index if (index == 0) { this_number = userspace_config.e0point; } else if (index == 1) { this_number = userspace_config.e1point; } else { this_number = 128; } switch (this_number) { case 0: strcpy(buffer, "Lateral "); break; case 1: strcpy(buffer, "Vertical"); break; case 2: strcpy(buffer, "Scr. Ver"); break; case 3: strcpy(buffer, "Scr. Lat"); break; default: strcpy(buffer, " -N/A- "); break; } break; # endif // MOUSEKEY_ENABLE default: // Get correct index if (index == 0) { this_number = userspace_config.e0base; } else if (index == 1) { this_number = userspace_config.e1base; } else { this_number = 128; } switch (this_number) { case 0: strcpy(buffer, "Volume "); break; case 1: strcpy(buffer, "Song "); break; case 2: strcpy(buffer, "Sink "); break; case 3: strcpy(buffer, "Src. Vol"); break; case 4: strcpy(buffer, "Source "); break; case 5: strcpy(buffer, "Arrow LR"); break; case 6: strcpy(buffer, "Arrow UD"); break; case 7: strcpy(buffer, "Page U/D"); break; case 8: strcpy(buffer, "Erase "); break; default: strcpy(buffer, " -N/A- "); break; } break; } } #endif // OLED_ENABLE
A users/bbaserdem/bb-encoder.h => users/bbaserdem/bb-encoder.h +29 -0
@@ 0,0 1,29 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #include "bbaserdem.h" // Hook to encoder stuff bool encoder_update_user(uint8_t index, bool clockwise); // Complicated code for what the encoder keys do when pressed bool process_record_encoder(uint16_t keycode, keyrecord_t *record); // Clear the encoder settings void reset_encoder_state(void); // This is so that encoder state is synched between two halves void housekeeping_task_encoder(void); // This is purely for oled; should it want to use it void encoder_state_string(uint8_t index, uint8_t layer, char* buffer);
A users/bbaserdem/bb-macro.c => users/bbaserdem/bb-macro.c +156 -0
@@ 0,0 1,156 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include "bb-macro.h" /* MACRO Definitions * This file has my macros/unicodes * Hooks for other functionality to inject itself into the process_record */ // Tap dance definitons #ifdef AUDIO_ENABLE #ifdef TAP_DANCE_ENABLE qk_tap_dance_action_t tap_dance_actions[] = { // Music playback speed modulator [TD_AUDIO_TEMPO] = ACTION_TAP_DANCE_DOUBLE(MU_SLOW, MU_FAST), }; #endif // AUDIO_ENABLE #endif // TAP_DANCE_ENABLE // Unicode definitions; for single character keys // We mask their definitions if unicode is not enabled #ifdef UNICODEMAP_ENABLE const uint32_t PROGMEM unicode_map[] = { [UPC_A_CIRC] = 0x00C2, [LOW_A_CIRC] = 0x00E2, // Â â [UPC_C_CEDI] = 0x00C7, [LOW_C_CEDI] = 0x00E7, // Ç ç [UPC_G_BREV] = 0x011E, [LOW_G_BREV] = 0x001F, // Ğ ğ [UPC_I_CIRC] = 0x00CE, [LOW_I_CIRC] = 0x00EE, // Î î [UPC_I_DOTL] = 0x0049, [LOW_I_DOTL] = 0x0131, // I ı [UPC_I_DOTT] = 0x0130, [LOW_I_DOTT] = 0x0069, // İ i [UPC_O_DIAE] = 0x00D6, [LOW_O_DIAE] = 0x00F6, // Ö ö [UPC_S_CEDI] = 0x015E, [LOW_S_CEDI] = 0x015F, // Ş ş [UPC_U_CIRC] = 0x00DB, [LOW_U_CIRC] = 0x00FB, // Û û [UPC_U_DIAE] = 0x00DC, [LOW_U_DIAE] = 0x00FC, // Ü ü [UPC_ALPHA] = 0x0391, [LOW_ALPHA] = 0x03B1, // Α α [UPC_BETA] = 0x0392, [LOW_BETA] = 0x03B2, // Β β [UPC_GAMMA] = 0x0393, [LOW_GAMMA] = 0x03B3, // Γ γ [UPC_DELTA] = 0x0394, [LOW_DELTA] = 0x03B4, // Δ δ [UPC_EPSILON] = 0x0395, [LOW_EPSILON] = 0x03B5, // Ε ε [UPC_ZETA] = 0x0396, [LOW_ZETA] = 0x03B6, // Ζ ζ [UPC_ETA] = 0x0397, [LOW_ETA] = 0x03B7, // Η η [UPC_THETA] = 0x0398, [LOW_THETA] = 0x03B8, // Θ θ [UPC_IOTA] = 0x0399, [LOW_IOTA] = 0x03B9, // Ι ι [UPC_KAPPA] = 0x039A, [LOW_KAPPA] = 0x03BA, // Κ κ [UPC_LAMBDA] = 0x039B, [LOW_LAMBDA] = 0x03BB, // Λ λ [UPC_MU] = 0x039C, [LOW_MU] = 0x03BC, // Μ μ [UPC_NU] = 0x039D, [LOW_NU] = 0x03BD, // Ν ν [UPC_XI] = 0x039E, [LOW_XI] = 0x03BE, // Ξ ξ [UPC_OMICRON] = 0x039F, [LOW_OMICRON] = 0x03BF, // Ο ο [UPC_PI] = 0x03A0, [LOW_PI] = 0x03C0, // Π π [UPC_RHO] = 0x03A1, [LOW_RHO] = 0x03C1, // Ρ ρ [UPC_SIGMA] = 0x03A3, [LOW_SIGMA] = 0x03C3, // Σ σ [UPC_TAU] = 0x03A4, [LOW_TAU] = 0x03C4, // Τ τ [UPC_UPSILON] = 0x03A5, [LOW_UPSILON] = 0x03C5, // Υ υ [UPC_PHI] = 0x03A6, [LOW_PHI] = 0x03C6, // Φ φ [UPC_CHI] = 0x03A7, [LOW_CHI] = 0x03C7, // Χ χ [UPC_PSI] = 0x03A8, [LOW_PSI] = 0x03C8, // Ψ ψ [UPC_OMEGA] = 0x03A9, [LOW_OMEGA] = 0x03C9, // Ω ω [ELLIPSIS] = 0x2026, // … [PLANCK_CON] = 0x210F, // ℏ [ANGSTROM] = 0x212B, // Å [BITCOIN] = 0x20BF // ₿ }; #endif // UNICODEMAP_ENABLE // Keycodes bool process_record_macro(uint16_t keycode, keyrecord_t *record) { switch (keycode) { // AltGr + Caps should change the oled layout variable case KC_CAPSLOCK: if (record->event.pressed) { if (get_mods() & MOD_BIT(KC_RALT)) { userspace_config.layout = (userspace_config.layout + 1) % 3; } } return true; break; case BB_OLED: if (record->event.pressed) { if (get_mods() & MOD_MASK_SHIFT) { // Scroll in opposite direction userspace_config.layout = (userspace_config.layout + 4) % 3; } else { userspace_config.layout = (userspace_config.layout + 1) % 3; } } return false; break; // Plain macros case BB_PGPK: // My public PGP key if (record->event.pressed) { SEND_STRING("0B7151C823559DD8A7A04CE36426139E2F4C6CCE"); } return false; break; case DBL_ANG: // Double angular bracket if (record->event.pressed) { SEND_STRING("<>"SS_TAP(X_LEFT)); } return false; break; case DBL_PAR: // Double paranthesis if (record->event.pressed) { SEND_STRING("()"SS_TAP(X_LEFT)); } return false; break; case DBL_BRC: // Double square brackets if (record->event.pressed) { SEND_STRING("[]"SS_TAP(X_LEFT)); } return false; break; case DBL_CBR: // Double curly brackets if (record->event.pressed) { SEND_STRING("{}"SS_TAP(X_LEFT)); } return false; break; // Unicode macros # ifdef UNICODEMAP_ENABLE case TR_FLAG: // Turkish flag if (record->event.pressed) { send_unicode_string("🇹🇷"); } return false; break; case BB_LENY: // Lenny face: ( ͡° ͜ʖ ͡°) if (record->event.pressed) { send_unicode_string("( ͡° ͜ʖ ͡°)"); } return false; break; case BB_TABL: // Table flip: ┻━┻︵ \(°□°)/ ︵ ┻━┻ if (record->event.pressed) { send_unicode_string("┻━┻︵ \\(°□°)/ ︵ ┻━┻"); } return false; break; # endif // UNICODEMAP_ENABLE } return true; }
A users/bbaserdem/bb-macro.h => users/bbaserdem/bb-macro.h +113 -0
@@ 0,0 1,113 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #include "bbaserdem.h" /* This header file contains definitons regarding custom keycodes. * - Both regular and unicode macros are dealt with in this file */ // These will be delegated to keymap specific stuff (weak definition) bool process_record_macro(uint16_t keycode, keyrecord_t *record); // Unicodemap implementation #ifdef UNICODEMAP_ENABLE enum userspace_unicodemap { UPC_A_CIRC, UPC_C_CEDI, UPC_G_BREV, UPC_I_CIRC, UPC_I_DOTL, UPC_I_DOTT, UPC_O_DIAE, UPC_S_CEDI, UPC_U_CIRC, UPC_U_DIAE, LOW_A_CIRC, LOW_C_CEDI, LOW_G_BREV, LOW_I_CIRC, LOW_I_DOTL, LOW_I_DOTT, LOW_O_DIAE, LOW_S_CEDI, LOW_U_CIRC, LOW_U_DIAE, ELLIPSIS, PLANCK_CON, ANGSTROM, MATHPI, BITCOIN, UPC_ALPHA, UPC_BETA, UPC_GAMMA, UPC_DELTA, UPC_EPSILON, UPC_ZETA, UPC_ETA, UPC_THETA, UPC_IOTA, UPC_KAPPA, UPC_LAMBDA, UPC_MU, UPC_NU, UPC_XI, UPC_OMICRON, UPC_PI, UPC_RHO, UPC_SIGMA, UPC_TAU, UPC_UPSILON, UPC_PHI, UPC_CHI, UPC_PSI, UPC_OMEGA, LOW_ALPHA, LOW_BETA, LOW_GAMMA, LOW_DELTA, LOW_EPSILON, LOW_ZETA, LOW_ETA, LOW_THETA, LOW_IOTA, LOW_KAPPA, LOW_LAMBDA, LOW_MU, LOW_NU, LOW_XI, LOW_OMICRON, LOW_PI, LOW_RHO, LOW_SIGMA, LOW_TAU, LOW_UPSILON, LOW_PHI, LOW_CHI, LOW_PSI, LOW_OMEGA, }; #endif // UNICODEMAP_ENABLE // Tap dance stuff #ifdef AUDIO_ENABLE #ifdef TAP_DANCE_ENABLE enum { TD_AUDIO_TEMPO, }; #endif // AUDIO_ENABLE #endif // TAP_DANCE_ENABLE
A users/bbaserdem/bb-oled-extra.c => users/bbaserdem/bb-oled-extra.c +796 -0
@@ 0,0 1,796 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include "bb-oled.h" #include "bb-oled-extra.h" // Helper function that draws images void draw_image(uint8_t row, uint8_t col, const char image[4][42]) { // Draw this image iteratively for (int i = 0; i < 4; i++) { oled_set_cursor(col, row + i); oled_write_raw_P(image[i], 42); } } // Write modifiers to the screen void render_modifiers(uint8_t row, uint8_t col, uint8_t mods) { static const char PROGMEM mod_meta[12] = {0x00,0x01,0x01,0x01,0x01,0x06,0x18,0x60,0x81,0x81,0x81,0x81}; static const char PROGMEM mod_altL[12] = {0x00,0x80,0x80,0x80,0x40,0x20,0x10,0x08,0x84,0x95,0x8e,0x84}; static const char PROGMEM mod_altR[12] = {0x00,0x86,0x8f,0x8f,0x46,0x20,0x10,0x08,0x84,0x95,0x8e,0x84}; static const char PROGMEM mod_ctrl[12] = {0x00,0x00,0xbd,0x42,0xa5,0x99,0x99,0xa5,0x42,0xbd,0x00,0x00}; static const char PROGMEM mod_shft[12] = {0x00,0x20,0x30,0x28,0xe4,0x02,0x01,0x02,0xe4,0x28,0x30,0x20}; // Looks like Mods: <OS> <Alt/Gr> <Ctrl> <Shift> oled_set_cursor(col, row); oled_write("Mods: ", false); // Meta if (mods & MOD_MASK_GUI) { oled_write_raw_P(mod_meta, 12); oled_set_cursor(col + 8, row); } else { oled_write(" ", false); } // Alt(Gr) if (mods & MOD_BIT(KC_RALT)) { oled_write_raw_P(mod_altR, 12); oled_set_cursor(col + 10, row); } else if (mods & MOD_MASK_ALT) { oled_write_raw_P(mod_altL, 12); oled_set_cursor(col + 10, row); } else { oled_write(" ", false); } // Ctrl if (mods & MOD_MASK_CTRL) { oled_write_raw_P(mod_ctrl, 12); oled_set_cursor(col + 12, row); } else { oled_write(" ", false); } // Shift if (mods & MOD_MASK_SHIFT) { oled_write_raw_P(mod_shft, 12); oled_set_cursor(col + 14, row); } else { oled_write(" ", false); } } // Draws the image of the currently used layout void render_layout(uint8_t row, uint8_t col, uint8_t mods, bool isLeft) { // DVORAK static const char PROGMEM base0_L_dvor_nomod[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x04,0x08,0x10,0x00,0x00,0x00, 0x00,0x0e,0x00,0x00,0x00,0x00,0x60,0xe0,0x00,0x00,0x00,0x00,0xc0,0xc0, 0x00,0x00,0x00,0xf8,0x90,0x88,0x88,0x70,0x00,0x78,0x80,0x80,0x40,0xf8 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x00,0x00, 0x40,0x40,0x40,0x80,0x00,0x80,0x41,0x40,0x40,0x80,0x00,0x80,0x40,0x40, 0x40,0x80,0x00,0xc3,0x00,0x00,0x00,0xc0,0x00,0x00,0x42,0xd2,0x02,0x01 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0xd8,0x06,0x01,0x00,0x00,0x00,0x02, 0x05,0x05,0x05,0x07,0x00,0x03,0x04,0x04,0x04,0x03,0x00,0x03,0x05,0x05, 0x85,0x05,0x00,0xc3,0x04,0x04,0x02,0x07,0x00,0x00,0x00,0x07,0x04,0x00 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x03,0x0c,0x30,0xc0,0x00,0x00, 0xb6,0x76,0x00,0x00,0x00,0x1c,0x22,0x22,0x12,0xfe,0x00,0x00,0x80,0x82, 0x7e,0x00,0x00,0x3f,0x08,0x0c,0x12,0x20,0x00,0x22,0x14,0x08,0x14,0x22}}; static const char PROGMEM base0_L_dvor_shift[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x20,0x10,0x20,0x40,0x20,0x00,0x00, 0x07,0x00,0x07,0x00,0x00,0x10,0x28,0x44,0x82,0x00,0x00,0x82,0x44,0x28, 0x10,0x00,0x00,0xfe,0x12,0x12,0x12,0x0c,0x00,0x06,0x08,0xf0,0x08,0x06 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xe0, 0x90,0x90,0x90,0xe0,0x00,0xe0,0x10,0x10,0x10,0xe0,0x00,0xf0,0x90,0x90, 0x90,0x10,0x00,0xf0,0x00,0x00,0x00,0xf0,0x00,0x00,0x10,0xf0,0x10,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x80,0x87,0x80,0x00,0x00,0x07, 0x00,0x00,0x00,0x07,0x00,0x03,0x84,0x84,0x84,0x03,0x00,0x07,0x04,0x04, 0x04,0x84,0x00,0x83,0x04,0x04,0x04,0x83,0x00,0x80,0x04,0x07,0x04,0x80 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x01,0x00,0x28,0x04,0x03,0x00,0x00, 0x36,0x36,0x00,0x00,0x00,0x1f,0x20,0x28,0x10,0x6f,0x00,0x18,0x20,0x20, 0x20,0x1f,0x00,0x3f,0x04,0x0a,0x11,0x20,0x00,0x31,0x0a,0x04,0x0a,0x31}}; static const char PROGMEM base0_R_dvor_nomod[4][42] = { { 0x00,0xfc,0x12,0x12,0x00,0x00,0x70,0x88,0x88,0x48,0xf8,0x00,0x70,0x88, 0x88,0x88,0x88,0x00,0xf8,0x10,0x08,0x08,0x10,0x00,0x00,0x02,0x7e,0x80, 0x80,0x00,0x10,0x28,0x44,0x82,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0x00,0x80,0x80,0x80,0xf0,0x00,0xf0,0x02,0x82,0x82,0x01,0x00,0x00,0x80, 0xf0,0x80,0x80,0x00,0xc0,0x40,0x40,0x40,0x80,0x00,0x80,0x40,0x40,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x83,0x04,0x04,0x02,0x07,0x00,0x07,0x01,0x00,0x00,0x07,0x00,0x00,0x00, 0x03,0x04,0x04,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x04,0x05,0x05,0x05, 0x02,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x3f,0x24,0x22,0x22,0x1c,0x00,0x3e,0x02,0x3e,0x02,0x3c,0x00,0x1e,0x20, 0x1c,0x20,0x1e,0x00,0x06,0x18,0x20,0x18,0x06,0x00,0x22,0x32,0x2a,0x26, 0x22,0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM base0_R_dvor_shift[4][42] = { { 0xfe,0x12,0x12,0x12,0x02,0x00,0xfc,0x02,0x12,0x12,0xf4,0x00,0xfc,0x02, 0x02,0x02,0x84,0x00,0xfe,0x12,0x12,0x32,0xcc,0x00,0xfe,0x00,0x00,0x00, 0x00,0x00,0x04,0x88,0x50,0x20,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0xf1,0x10,0x10,0x10,0xe0,0x00,0xf0,0x81,0x81,0x81,0xf0,0x00,0x10,0x11, 0xf1,0x11,0x10,0x00,0xf1,0x60,0x80,0x00,0xf1,0x00,0x61,0x91,0x91,0x91, 0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x8f,0x88,0x88,0x88,0x07,0x00,0x8f,0x00,0x00,0x00,0x8f,0x00,0x80,0x00, 0x0f,0x00,0x80,0x00,0x8f,0x00,0x01,0x06,0x8f,0x00,0x84,0x88,0x88,0x88, 0x87,0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x7f,0x44,0x44,0x44,0x3b,0x00,0x7f,0x01,0x06,0x01,0x7f,0x00,0x1f,0x60, 0x1c,0x60,0x1f,0x00,0x07,0x18,0x60,0x18,0x07,0x00,0x70,0x48,0x44,0x42, 0x41,0x00,0x08,0x08,0x3e,0x08,0x08,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM symb5_R_dvor[4][42] = { { 0x00,0x02,0x04,0x08,0x00,0x00,0x20,0x20,0xdc,0x02,0x02,0x00,0x02,0x02, 0xdc,0x20,0x20,0x00,0x00,0xc0,0x30,0x0c,0x03,0x00,0x50,0x50,0x50,0x50, 0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0xf0,0x11,0x12,0x02,0x00,0x02,0x12, 0x11,0xf0,0x00,0x00,0x43,0x20,0x20,0x20,0xc0,0x00,0x00,0x00,0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x01,0x80,0x41,0x82,0x01,0x00,0x00,0x1f,0x10,0x90,0x00,0x00,0x00,0x90, 0x10,0x1f,0x00,0x00,0xc0,0x00,0x14,0x03,0x00,0x00,0x01,0x01,0x87,0x01, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x22,0xf3,0x0a,0xf3,0x22,0x00,0x00,0x1c,0x63,0x80,0x00,0x00,0x00,0x80, 0x63,0x1c,0x00,0x00,0x00,0x03,0x0c,0x30,0xc0,0x00,0x00,0x00,0x7f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM numb6_L_dvor_nomod[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20, 0x50,0x88,0x04,0x00,0x00,0x04,0x04,0xc4,0x34,0x0c,0x00,0xd8,0x24,0x24, 0x24,0xd8,0x00,0x18,0x24,0x24,0x24,0xf8,0x00,0xf8,0x44,0x24,0x14,0xf8 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x41,0xe0,0x00,0x00,0xe0,0xa1,0xa1, 0xa1,0x20,0x00,0xc0,0xa1,0xa1,0xa1,0x00,0x00,0x00,0x01,0x01,0x01,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08, 0x08,0x08,0x08,0x08,0x00,0x03,0x02,0x02,0x0f,0x02,0x00,0x04,0x08,0x08, 0x08,0x07,0x00,0x07,0x08,0x08,0x08,0x07,0x00,0x01,0x01,0x01,0x01,0x00 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, 0x22,0x14,0x08,0x00,0x00,0x00,0x04,0x02,0x7f,0x00,0x00,0x42,0x61,0x51, 0x49,0x46,0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x5e,0x61,0x01,0x61,0x5e}}; static const char PROGMEM numb6_L_dvor_shift[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd8,0x24,0x54,0x88,0x40,0x00,0x50,0x20,0xf8, 0x20,0x50,0x00,0x00,0x38,0xc6,0x01,0x00,0x00,0x00,0x01,0xc6,0x38,0x00 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x60,0x91,0xf9,0x90,0x21,0x00,0x20,0x50,0x20, 0x80,0x60,0x00,0x40,0x20,0x10,0x21,0x40,0x00,0x00,0x01,0x00,0x00,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x8f,0x04,0x03,0x00,0x0c,0x02,0x09, 0x14,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x3e,0x41,0x5d, 0x55,0x5e,0x00,0x14,0x7f,0x14,0x7f,0x14,0x00,0x00,0x00,0x00,0x00,0x00}}; // Turkish F static const char PROGMEM base0_L_turf_nomod[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x10,0x10,0x7c,0x10,0x10,0x00,0x00, 0xfe,0x09,0x09,0x00,0x00,0x70,0x88,0x88,0x48,0xf8,0x00,0x51,0xaa,0xaa, 0x92,0x09,0x00,0x00,0x88,0xf8,0x80,0x00,0x00,0x70,0x88,0x88,0x88,0x70 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x40,0x80,0x00,0x80,0x40,0x00,0xc0, 0x00,0x00,0x00,0xc0,0x00,0x00,0x42,0xd2,0x02,0x01,0x00,0x81,0x42,0x42, 0x42,0x81,0x00,0x00,0x40,0x40,0x40,0x80,0x00,0xc0,0x10,0x00,0x10,0xc0 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x03, 0x04,0x04,0x82,0x07,0x00,0x00,0x80,0x07,0x84,0x00,0x00,0x03,0x05,0x05, 0x05,0x05,0x00,0x02,0x05,0x05,0x05,0x07,0x00,0x03,0x04,0x04,0x02,0x07 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x1c,0x22,0x22,0x12,0xfe,0x00,0x00, 0x80,0x82,0x7e,0x00,0x00,0x1c,0x22,0x22,0x22,0x1c,0x00,0x06,0x18,0x20, 0x18,0x06,0x00,0x1c,0x22,0x22,0x22,0x22,0x00,0x1c,0xa2,0x62,0x22,0x22}}; static const char PROGMEM base0_L_turf_shift[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x28,0x10,0x7c,0x10,0x28,0x00,0xfe, 0x12,0x12,0x12,0x02,0x00,0xfc,0x02,0x12,0x12,0xf4,0x00,0xf1,0x0a,0x4a, 0x4a,0xd1,0x00,0x00,0x02,0xfe,0x02,0x00,0x00,0xfc,0x02,0x02,0x02,0xfc },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x30,0x40,0x80,0x40,0x30,0x00,0xf1, 0x00,0x00,0x00,0xf0,0x00,0x00,0x21,0xe9,0x21,0x00,0x00,0xf1,0x92,0x92, 0x92,0x11,0x00,0xe0,0x91,0x91,0x91,0xe0,0x00,0xe0,0x09,0x01,0x09,0xe0 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x0e,0x81,0x80,0x81,0x0e,0x00,0x07, 0x08,0x08,0x08,0x87,0x00,0x00,0x50,0x1f,0x50,0x00,0x00,0x8f,0x08,0x08, 0x08,0x88,0x00,0x0f,0x80,0x80,0x80,0x0f,0x00,0x8f,0x50,0x50,0x50,0x8f },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x3f,0x40,0x50,0x20,0xdf,0x00,0x30, 0x40,0x40,0x40,0x3f,0x00,0x7e,0x81,0x81,0x81,0x7e,0x00,0x07,0x18,0x60, 0x18,0x07,0x00,0x3f,0x40,0x40,0x40,0x21,0x00,0x1f,0xa0,0x60,0x20,0x10}}; static const char PROGMEM base0_L_turf_altgr[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x10,0x10,0x10,0x30,0x00,0x00,0xf0, 0x08,0xe8,0xa8,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0c,0x1e,0xfe,0x02,0xfe,0x00,0x70,0x8a,0x89,0x8a,0x70 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x10,0x20,0x40,0x00,0x00,0xc1, 0x12,0x0a,0x12,0xc2,0x00,0x00,0x10,0xc8,0x10,0x00,0x00,0x40,0xe0,0x50, 0x10,0x20,0x00,0x00,0x50,0x48,0x50,0x80,0x00,0xc0,0x10,0x08,0x10,0xc0 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x00,0x03, 0x04,0x04,0x02,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x83,0x05, 0x04,0x82,0x00,0x02,0x05,0x05,0x05,0x07,0x00,0x83,0x84,0x04,0x82,0x87 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x3e,0x3e,0x3e,0x00,0x08,0x14, 0x22,0x08,0x14,0x22,0x00,0x22,0x14,0x08,0x22,0x14,0x08,0x03,0x02,0x00, 0x03,0x02,0x00,0x1c,0x22,0x7f,0x22,0x22,0x00,0x02,0x01,0x00,0x02,0x01}}; static const char PROGMEM base0_L_turf_shfgr[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x90,0x90,0xfc,0x90,0x90,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0a,0x09,0x0a,0xf0 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x88,0x90,0xa0,0x00,0x00,0xc0, 0x10,0x08,0x10,0xc0,0x00,0x00,0x50,0xc8,0x50,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x50,0x48,0x50,0x80,0x00,0xc1,0x12,0x0a,0x12,0xc1 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x8f,0x4f,0x8f,0x00,0x00,0x0f, 0x10,0x10,0x90,0x0f,0x00,0x80,0x10,0x1f,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x82,0x82,0x82,0x1f,0x00,0x0f,0x10,0x10,0x10,0x0f },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x7c,0x7d,0x7c,0x00,0x00,0x04, 0x0a,0x11,0x20,0x00,0x00,0x20,0x11,0x0a,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x24,0x2a,0x20,0x1f,0x00,0x00,0x00,0x00,0x00,0x00}}; static const char PROGMEM base0_R_turf_nomod[4][42] = { { 0x70,0x88,0x88,0x48,0xff,0x00,0xf8,0x10,0x08,0x08,0x10,0x00,0xf8,0x08, 0x08,0x08,0xf0,0x00,0xff,0x10,0x08,0x08,0xf0,0x00,0xf8,0x90,0x88,0x88, 0x70,0x00,0x10,0x28,0x44,0x82,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0x40,0xf8,0x40,0x40,0x00,0x00,0xf8,0x00,0x80,0x40,0x00,0x00,0xc0,0x40, 0xc0,0x40,0x80,0x00,0x08,0xf8,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00, 0xc0,0x00,0x80,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x00,0x03,0x04,0x04,0x00,0x00,0x07,0x01,0x01,0x02,0x04,0x00,0xc7,0x00, 0x07,0x00,0x07,0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x03,0x14,0x14,0x12, 0x0f,0x00,0x04,0x15,0x0d,0x05,0x02,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x22,0x32,0x2a,0x26,0x22,0x00,0x24,0x2a,0x2a,0x2a,0x10,0x00,0x3f,0x24, 0x22,0x22,0x1c,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0xb0,0x70,0x00, 0x00,0x00,0x1e,0x20,0x1c,0x20,0x1e,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM base0_R_turf_shift[4][42] = { { 0xfe,0x02,0x02,0x02,0xfc,0x00,0xfe,0x12,0x12,0x32,0xcc,0x00,0xfe,0x0c, 0x30,0xc0,0xfe,0x00,0xfe,0x10,0x10,0x10,0xfe,0x00,0xfe,0x12,0x12,0x12, 0x0c,0x00,0x82,0x44,0x28,0x10,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0x11,0x11,0xf1,0x11,0x10,0x00,0xf1,0x80,0x40,0x20,0x11,0x00,0xf1,0x20, 0xc0,0x20,0xf1,0x00,0xf1,0x00,0x00,0x00,0x01,0x00,0x31,0x40,0x80,0x40, 0x30,0x00,0x30,0x48,0x48,0x48,0x90,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x80,0x80,0x8f,0x80,0x80,0x00,0x0f,0x80,0x81,0x82,0x0c,0x00,0x8f,0x80, 0x80,0x80,0x0f,0x00,0x0f,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x82,0x14,0x0c,0x04,0x83,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x70,0x48,0x44,0x42,0x41,0x00,0x23,0x44,0x44,0x44,0x39,0x00,0x7f,0x44, 0x44,0x44,0x3b,0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0xb6,0x76,0x00, 0x00,0x00,0x1f,0x60,0x1c,0x60,0x1f,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM base0_R_turf_altgr[4][42] = { { 0x53,0x54,0xf8,0x54,0x53,0x00,0x7c,0xba,0x8a,0x8a,0x7c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0c,0x12,0x12,0x0c,0x00,0x00,0x20,0xfc,0x22,0x02, 0x84,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0x80,0x80,0xf1,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00, 0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x11,0x01, 0x00,0x00,0x40,0xf0,0x41,0xf0,0x40,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x02,0x01,0x0f,0x08,0x08,0x06,0x83,0x40,0x40,0x40,0x00,0x00,0x0f,0x02, 0x04,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x07,0x01,0x07,0x01,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x4a,0x4a,0x3c,0x00,0x00,0x11,0x0a, 0x04,0x0a,0x11,0x00,0x04,0x04,0x15,0x04,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x02,0x04,0x08,0x04,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM base0_R_turf_shfgr[4][42] = { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x90,0x88, 0x00,0x00,0x00,0x90,0xa1,0x90,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f, 0x00,0x00,0x00,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x7d,0x7c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM symb5_R_turf_nomod[4][42] = { { 0x20,0x20,0xf8,0x20,0x20,0x00,0x00,0xc0,0x30,0x0c,0x03,0x00,0x20,0x20, 0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0x80,0x00,0xc0,0x00,0x80,0x00,0x43,0x20,0x20,0x20,0xc0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x02,0x81,0x47,0x81,0x02,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x04,0x04, 0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x22,0xf3,0x0a,0xf3,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM symb5_R_turf_altgr[4][42] = { { 0x10,0x10,0x10,0x30,0x00,0x00,0x03,0x0c,0x30,0xc0,0x00,0x00,0x00,0x00, 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0x80,0x80,0xe0,0x80,0x80,0x00,0x00,0x00,0xa0,0x00,0x03,0x00,0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x04,0x84,0x47,0x84,0x04,0x00,0x06,0x09,0x08,0x08,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x22,0xf3,0x0a,0xf3,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM numb6_L_turf_nomod[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20, 0x50,0x88,0x04,0x00,0x00,0x04,0x04,0xc4,0x34,0x0c,0x00,0xd8,0x24,0x24, 0x24,0xd8,0x00,0x18,0x24,0x24,0x24,0xf8,0x00,0xf8,0x44,0x24,0x14,0xf8 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x41,0xe0,0x00,0x00,0xe0,0xa1,0xa1, 0xa1,0x20,0x00,0xc0,0xa1,0xa1,0xa1,0x00,0x00,0x00,0x01,0x01,0x01,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x0f,0x02,0x00,0x04,0x08,0x08, 0x08,0x07,0x00,0x07,0x08,0x08,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, 0x22,0x14,0x08,0x00,0x00,0x00,0x04,0x02,0x7f,0x00,0x00,0x42,0x61,0x51, 0x49,0x46,0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x5e,0x61,0x01,0x61,0x5e}}; static const char PROGMEM numb6_L_turf_shift[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x88,0x50,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x38,0xc6, 0x01,0x00,0x00,0x00,0x01,0xc6,0x38,0x00,0x00,0x50,0x50,0x50,0x50,0x50 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0xf8,0x90,0x20,0x00,0x20,0x50,0x20, 0x81,0x60,0x00,0x70,0x89,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x8f,0x04,0x03,0x00,0x0c,0x82,0x09, 0x94,0x08,0x00,0x07,0x08,0x89,0x06,0x09,0x00,0x00,0x00,0x00,0x00,0x00 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, 0x22,0x14,0x08,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x03,0x00, 0x03,0x00,0x00,0x02,0x01,0x00,0x01,0x02,0x00,0x5e,0x61,0x01,0x61,0x5e}}; static const char PROGMEM numb6_L_turf_altgr[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xff,0x00,0x00,0x00,0x10,0x10,0xee,0x01,0x01,0x00,0x00,0xff,0x01, 0x01,0x00,0x00,0x00,0x01,0x01,0xff,0x00,0x00,0x01,0x01,0xee,0x10,0x10 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x10,0xf8,0x00,0x01,0x01,0x00,0x10,0xf9,0x01, 0x01,0x00,0x00,0x88,0xa9,0x51,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x00,0x00,0x00,0x00,0x08,0x8c,0x0a,0x1f,0x00,0x00,0x00,0x90, 0x90,0x10,0x00,0x00,0x08,0x0c,0x0a,0x1f,0x00,0x00,0x00,0x00,0x00,0x00 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7b,0x00,0x00,0x00,0x00,0x09,0x0f,0x08,0x00,0x00,0x00,0x09,0x0c, 0x0a,0x09,0x00,0x14,0x7f,0x14,0x7f,0x14,0x00,0x5e,0x61,0x01,0x61,0x5e}}; static const char PROGMEM numb6_L_turf_shfgr[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0xfc, 0x90,0x90,0x00,0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0xa8,0x50, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x0a, 0x15,0x0a,0x00,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x05,0x05,0x02,0x00,0x00,0x5e,0x61,0x01,0x61,0x5e}}; // QWERTY static const char PROGMEM base0_L_qwer_nomod[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x04,0x08,0x10,0x00,0x00,0x70, 0x88,0x88,0x48,0xf8,0x00,0x78,0x80,0x70,0x80,0x78,0x00,0x70,0xa8,0xa8, 0xa8,0xb0,0x00,0xf8,0x10,0x08,0x08,0x10,0x00,0x08,0x7f,0x88,0x88,0x00 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x18,0x60,0x80,0x00,0x00,0x00,0x00, 0x40,0x40,0x40,0x83,0x00,0x80,0x40,0x40,0x40,0x00,0x00,0x80,0x40,0x40, 0x40,0xf8,0x00,0x00,0xf0,0x48,0x48,0x00,0x00,0x80,0x40,0x40,0x40,0xc0 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0xc0,0x41,0x46,0x18,0x00,0x02, 0x05,0x05,0x05,0x07,0x00,0x04,0x05,0x05,0x05,0x02,0x00,0x03,0x04,0x04, 0x02,0x07,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0xc3,0x14,0x14,0x12,0x0f },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0xff,0x80,0x80,0x00,0x00,0x22, 0x32,0x2a,0x26,0x22,0x00,0x22,0x14,0x08,0x14,0x22,0x00,0x1c,0x22,0x22, 0x22,0x22,0x00,0x06,0x18,0x20,0x18,0x06,0x00,0x3f,0x24,0x22,0x22,0x1c}}; static const char PROGMEM base0_L_qwer_shift[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x20,0x10,0x20,0x40,0x20,0x00,0xfc, 0x02,0x42,0x82,0x7c,0x00,0x7e,0x80,0x70,0x80,0x7e,0x00,0xfe,0x12,0x12, 0x12,0x02,0x00,0xfe,0x12,0x12,0x32,0xcc,0x00,0x02,0x02,0xfe,0x02,0x02 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xe0, 0x91,0x91,0x90,0xe3,0x00,0x60,0x91,0x90,0x91,0x20,0x00,0xf1,0x11,0x11, 0x11,0xe1,0x00,0xf1,0x90,0x90,0x90,0x11,0x00,0xe0,0x10,0x91,0x90,0xa0 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x9f,0x40,0x40,0x00,0x8f, 0x80,0x80,0x80,0x8f,0x00,0x84,0x08,0x08,0x08,0x87,0x00,0x0f,0x88,0x88, 0x88,0x07,0x00,0x8f,0x00,0x00,0x00,0x80,0x00,0x87,0x88,0x88,0x88,0x07 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x04,0x04,0x7b,0x80,0x80,0x00,0x70, 0x48,0x44,0x42,0x41,0x00,0x71,0x0a,0x04,0x0a,0x71,0x00,0x3f,0x40,0x40, 0x40,0x21,0x00,0x07,0x18,0x60,0x18,0x07,0x00,0x7f,0x44,0x44,0x44,0x3b}}; static const char PROGMEM base0_R_qwer_nomod[4][42] = { { 0x78,0x80,0x80,0x40,0xf8,0x00,0x78,0x80,0x80,0x40,0xf8,0x00,0x00,0x08, 0xfa,0x80,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0xf8,0x90,0x88,0x88, 0x70,0x00,0x10,0x28,0x44,0x82,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0xf8,0x82,0x42,0x42,0x81,0x00,0x00,0x00,0x40,0xd0,0x00,0x00,0xf8,0x00, 0x80,0x40,0x00,0x00,0x08,0xf8,0x00,0x00,0x00,0x00,0x03,0xc0,0xc0,0x00, 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x10,0x10,0x0f,0x00,0x00,0x07,0x01, 0x01,0x02,0x04,0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x00,0x16,0x0e,0x00, 0xc0,0x00,0x00,0x40,0x40,0xc0,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x3e,0x02,0x02,0x02,0x3c,0x00,0x3e,0x02,0x3e,0x02,0x3c,0x00,0x00,0xb0, 0x70,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0xc0,0x30,0x0c,0x03, 0x00,0x00,0x00,0x80,0x80,0xff,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM base0_R_qwer_shift[4][42] = { { 0x06,0x08,0xf0,0x08,0x06,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x02, 0xfe,0x02,0x00,0x00,0xfc,0x02,0x02,0x02,0xfc,0x00,0xfe,0x12,0x12,0x12, 0x0c,0x00,0x82,0x44,0x28,0x10,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0xf0,0x80,0x81,0x80,0xf0,0x00,0x00,0x01,0x01,0x01,0xf0,0x00,0xf0,0x81, 0x41,0x21,0x10,0x00,0xf0,0x01,0x01,0x01,0x00,0x00,0x01,0xc0,0xc0,0x00, 0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x8f,0x00,0x00,0x00,0x8f,0x00,0x86,0x08,0x08,0x08,0x87,0x00,0x0f,0x00, 0x01,0x82,0x0c,0x00,0x8f,0x08,0x08,0x08,0x08,0x00,0x00,0x86,0x86,0x80, 0x00,0x00,0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x7f,0x03,0x0c,0x30,0x7f,0x00,0x7f,0x01,0x06,0x01,0x7f,0x00,0x04,0x0a, 0x11,0x20,0x00,0x00,0x20,0x11,0x0a,0x04,0x00,0x00,0x01,0x00,0x28,0x04, 0x03,0x00,0x00,0x80,0x80,0x7b,0x04,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM symb5_R_qwer[4][42] = { { 0x00,0x04,0x08,0x10,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x50,0x50, 0x50,0x50,0x50,0x00,0x10,0x10,0xee,0x01,0x01,0x00,0x01,0x01,0xee,0x10, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0x00,0x00,0x00,0x00,0xf8,0x09,0x0a,0x02,0x00,0x02,0x0a,0x09,0xf8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x01,0x80,0x41,0x82,0x01,0x00,0x04,0x04,0x84,0x44,0x04,0x00,0x01,0x41, 0x87,0x01,0x01,0x00,0xc0,0x1f,0x10,0x10,0x00,0x00,0x00,0x10,0xd0,0x1f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x22,0xf3,0x0a,0xf3,0x22,0x00,0x00,0x1e,0x61,0x80,0x00,0x00,0x00,0x80, 0x61,0x1e,0x00,0x00,0x00,0x03,0x0c,0x30,0xc0,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM numb6_L_qwer_nomod[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20, 0x50,0x88,0x04,0x00,0x00,0x04,0x04,0xc4,0x34,0x0c,0x00,0xd8,0x24,0x24, 0x24,0xd8,0x00,0x18,0x24,0x24,0x24,0xf8,0x00,0xf8,0x44,0x24,0x14,0xf8 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x70,0x00,0x71,0x00,0x00,0x00,0x80,0x41,0xe0,0x00,0x00,0xe0,0xa1,0xa1, 0xa1,0x20,0x00,0xc0,0xa1,0xa1,0xa1,0x00,0x00,0x00,0x01,0x71,0x01,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x0f,0x02,0x00,0x04,0x08,0x08, 0x08,0x07,0x00,0x07,0x08,0x08,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, 0x22,0x14,0x08,0x00,0x00,0x00,0x04,0x02,0x7f,0x00,0x00,0x42,0x61,0x51, 0x49,0x46,0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x5e,0x61,0x01,0x61,0x5e}}; static const char PROGMEM numb6_L_qwer_shift[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd8,0x24,0x54,0x88,0x40,0x00,0x50,0x20,0xf8, 0x20,0x50,0x00,0x00,0x38,0xc6,0x01,0x00,0x00,0x00,0x01,0xc6,0x38,0x00 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x70,0x00,0x70,0x00,0x00,0x60,0x91,0xf9,0x90,0x21,0x00,0x20,0x50,0x20, 0x80,0x60,0x00,0x40,0x20,0x10,0x21,0x40,0x00,0x00,0x71,0x00,0x70,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x8f,0x04,0x03,0x00,0x0c,0x02,0x09, 0x14,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x3e,0x41,0x5d, 0x55,0x5e,0x00,0x14,0x7f,0x14,0x7f,0x14,0x00,0x00,0x00,0x00,0x00,0x00}}; // UNIVERSAL static const char PROGMEM char1_L[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe2,0xae,0x42,0x00,0x00,0x20,0x44,0x40,0x4c,0x20,0x00,0x12,0xa4,0x88, 0xa4,0x12,0x00,0x08,0xf8,0x08,0xf8,0x08,0x00,0x78,0x80,0x80,0x80,0x78 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x41,0x40,0x41,0x80,0x00,0x80,0x40,0x40,0x40,0x80,0x00,0x81,0x40,0x40, 0x40,0x81,0x00,0xc0,0x00,0xc0,0x00,0xc0,0x00,0x00,0xc0,0x00,0x00,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, 0xc4,0x84,0xc2,0x07,0x00,0x03,0x04,0x04,0x04,0x03,0x00,0x02,0x85,0x05, 0x04,0x82,0x00,0x03,0x04,0x1f,0x04,0x03,0x00,0x80,0x83,0x84,0x82,0x80 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f, 0xc4,0x44,0xef,0x3b,0x00,0x3e,0x49,0x49,0x49,0x3e,0x00,0x02,0x7f,0x09, 0x09,0x78,0x00,0x3e,0x08,0x08,0x14,0x22,0x00,0x20,0x24,0x24,0x24,0x20}}; static const char PROGMEM char1_R[4][42] = { { 0x70,0x88,0xf0,0x88,0x70,0x00,0xfe,0x02,0x02,0x02,0x06,0x00,0x88,0x48, 0x70,0x90,0x88,0x00,0xf0,0x88,0x88,0x88,0x70,0x00,0xc0,0x30,0x0c,0x30, 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0xa0,0x50,0x53,0x90,0x20,0x00,0xc0,0x80,0x40,0x40,0x80,0x00,0x40,0x40, 0xc0,0x40,0x40,0x00,0xc3,0x00,0x00,0x00,0xc0,0x00,0x80,0x40,0xc0,0x40, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x03,0x84,0x84,0x04,0x03,0x00,0x07,0x00,0x00,0x00,0x1f,0x00,0x00,0x80, 0x83,0x84,0x00,0x00,0x00,0x83,0x54,0x8b,0x00,0x00,0x83,0x84,0x84,0x83, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0xff,0x24,0x24,0x27,0x18,0x00,0x7e,0x10,0x20,0x20,0x1e,0x00,0x2f,0x30, 0x00,0x30,0x2f,0x00,0xe0,0x38,0x25,0x38,0xe0,0x00,0x18,0x26,0xa1,0xa0, 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM game2_L[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c, 0x82,0xa2,0x42,0xbc,0x00,0x3e,0xc0,0x30,0xc0,0x3e,0x00,0xfe,0x92,0x92, 0x92,0x82,0x00,0xfe,0x12,0x12,0x32,0xcc,0x00,0x02,0x02,0xfe,0x02,0x02 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0xe0,0x00,0xe0, 0x90,0x90,0x90,0xe1,0x00,0x60,0x90,0x90,0x90,0x20,0x00,0xf0,0x10,0x10, 0x10,0xe0,0x00,0xf0,0x90,0x90,0x90,0x10,0x00,0xe0,0x10,0x90,0x90,0xa0 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x00,0x87, 0x80,0x80,0x80,0x87,0x00,0x82,0x04,0x04,0x04,0x83,0x00,0x07,0x84,0x84, 0x84,0x03,0x00,0x87,0x00,0x00,0x00,0x80,0x00,0x83,0x84,0x84,0x84,0x03 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x08,0x3c,0x02,0x3c,0x08,0x00,0x30, 0x28,0x24,0x22,0x21,0x00,0x31,0x0a,0x04,0x0a,0x31,0x00,0x1f,0x20,0x20, 0x20,0x11,0x00,0x03,0x0c,0x30,0x0c,0x03,0x00,0x3f,0x24,0x24,0x24,0x1b}}; static const char PROGMEM medi3_R_nomod[4][42] = { { 0x03,0x0c,0xb0,0x0c,0x03,0x00,0x3f,0x02,0x9c,0x02,0x3f,0x00,0x3f,0x04, 0x84,0x04,0x3f,0x00,0x22,0x25,0xa5,0x25,0x18,0x00,0x3f,0x25,0xa5,0x25, 0x1a,0x00,0x00,0xe0,0x8f,0x02,0x31,0x49,0xfa,0x00,0xe7,0x73,0x00,0x00 },{ 0xc0,0x01,0x73,0x01,0xc0,0x00,0xf0,0x81,0xc3,0xe1,0xf0,0x00,0x00,0x71, 0x03,0x71,0x00,0x00,0x00,0xc1,0xc3,0xc1,0x00,0x00,0xf0,0xe1,0xc3,0x81, 0xf0,0x00,0x00,0x03,0xe2,0x21,0xe0,0x21,0xc0,0x00,0x9c,0xce,0x00,0x00 },{ 0x01,0x02,0x02,0x02,0x01,0x00,0x07,0x00,0x01,0x03,0x87,0x00,0x00,0x1f, 0x0e,0x04,0x80,0x00,0x00,0x03,0x03,0x03,0x00,0x00,0x07,0x03,0x01,0x00, 0x87,0x00,0x00,0x40,0xa6,0xa8,0x08,0x04,0x8e,0x00,0x73,0x39,0x00,0x00 },{ 0x3e,0x31,0x01,0x31,0x3e,0x00,0x00,0x46,0x46,0x4f,0x1f,0x00,0x00,0xa6, 0x46,0xaf,0x1f,0x00,0x28,0x2c,0x2e,0x2c,0x28,0x00,0x00,0x46,0xe6,0x4f, 0x1f,0x00,0x00,0x02,0x72,0x8a,0x89,0x00,0x1e,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM medi3_R_shift[4][42] = { { 0x03,0x0c,0x30,0x0c,0x03,0x00,0x3f,0x02,0x1c,0x02,0x3f,0x00,0x3f,0x04, 0x04,0x04,0x3f,0x00,0x22,0x25,0x25,0x25,0x18,0x00,0x3f,0x25,0x25,0x25, 0x1a,0x00,0x00,0xe0,0x8f,0x02,0x31,0x49,0xfa,0x00,0xe7,0x73,0x00,0x00 },{ 0xc0,0x01,0x71,0x01,0xc0,0x00,0xf0,0x81,0xc1,0xe1,0xf0,0x00,0x00,0x71, 0x01,0x71,0x00,0x00,0x00,0xc1,0xc1,0xc1,0x00,0x00,0xf0,0xe1,0xc1,0x81, 0xf0,0x00,0x00,0x03,0xe2,0x21,0xe0,0x21,0xc0,0x00,0x9c,0xce,0x00,0x00 },{ 0x01,0x02,0x02,0x02,0x01,0x00,0x07,0x00,0x01,0x03,0x87,0x00,0x00,0x1f, 0x0e,0x04,0x80,0x00,0x00,0x03,0x03,0x03,0x00,0x00,0x07,0x03,0x01,0x00, 0x87,0x00,0x00,0x40,0xa6,0xa8,0x08,0x04,0x8e,0x00,0x73,0x39,0x00,0x00 },{ 0x3e,0x31,0x01,0x31,0x3e,0x00,0x00,0x46,0x46,0x4f,0x1f,0x00,0x00,0xa6, 0x46,0xaf,0x1f,0x00,0x28,0x2c,0x2e,0x2c,0x28,0x00,0x00,0x46,0xe6,0x4f, 0x1f,0x00,0x00,0x02,0x72,0x8a,0x89,0x00,0x1e,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM navi4_R[4][42] = { { 0xe0,0x10,0x54,0x38,0x10,0x00,0xfc,0x24,0x24,0x24,0x18,0x00,0x0c,0x10, 0xe0,0x10,0x0c,0x00,0x8c,0x50,0x20,0x50,0x8c,0x00,0xc0,0xbe,0xa2,0xbe, 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0x80,0xc1,0xa1,0x81,0x00,0x00,0x01,0x80,0x40,0x20,0x00,0x00,0x00,0x00, 0xf1,0x00,0x00,0x00,0x41,0x20,0xd0,0x20,0x41,0x00,0x01,0x21,0x41,0x81, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x00,0x49,0x4a,0x48,0x87,0x00,0x81,0x82,0x85,0x89,0x01,0x00,0x01,0x02, 0x85,0x02,0x01,0x00,0x40,0x40,0x47,0x40,0x40,0x00,0x81,0x09,0x05,0x02, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 },{ 0x12,0x65,0x85,0x65,0x17,0x00,0x07,0x01,0x06,0x18,0x60,0x00,0x88,0x90, 0xaf,0x90,0x88,0x00,0x04,0x02,0x7d,0x02,0x04,0x00,0x01,0x46,0x58,0x60, 0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; static const char PROGMEM func7_L[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0xff,0x09,0xe9,0xc9,0x01,0x00,0xe0,0x00, 0x10,0x08,0xfc,0x00,0x00,0x08,0x84,0x44,0x24,0x18,0x00,0x88,0x04,0x24, 0x24,0xd8,0x00,0x60,0x50,0x48,0xfc,0x40,0x00,0x70,0x80,0x9c,0x80,0x70 },{ 0x00,0x00,0xce,0x9c,0x00,0xf0,0x00,0x00,0x9f,0x00,0x03,0x0c,0x1f,0x00, 0xe0,0xa0,0xa1,0x20,0x00,0xc1,0xa1,0xa1,0xa1,0x01,0x00,0x20,0x21,0x21, 0xa1,0x60,0x00,0xc0,0x20,0x20,0x21,0xc0,0x00,0x40,0xe0,0x50,0x40,0x80 },{ 0x00,0x00,0x39,0x73,0x00,0xef,0x02,0x83,0xe4,0x00,0x0e,0x15,0x16,0x00, 0x04,0x08,0x08,0x07,0x00,0x07,0x48,0xc8,0x08,0x07,0x00,0x00,0x40,0xce, 0x01,0x00,0x00,0x06,0x49,0xc9,0x09,0x06,0x00,0x06,0x08,0x49,0x08,0x07 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x05,0x04,0x03,0x90,0xa8,0xa8,0x40,0x06, 0x49,0x49,0x49,0x3e,0x00,0x7c,0xa2,0x93,0x8a,0x7c,0x00,0x00,0x08,0x07, 0xfe,0x00,0x00,0x84,0xc2,0xa3,0x92,0x8c,0x00,0x70,0x38,0x0d,0x38,0x70}}; static const char PROGMEM mous8_L[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x3c,0x84,0xbc,0x84,0x38,0x00,0x00,0x00,0x10, 0x28,0x92,0xc5,0x82,0x00,0xfe,0x1f,0x1f,0x01,0xfe,0x00,0xfe,0x01,0x19, 0x01,0xfe,0x00,0xfe,0x01,0x1f,0x1f,0xfe,0x00,0x10,0x38,0x92,0xc7,0x82 },{ 0x00,0x00,0xce,0x9c,0x00,0xe7,0x08,0x08,0x08,0xe7,0x00,0x00,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x01,0x01,0x81,0x01,0x01,0x00,0x01,0x01,0x81, 0x01,0x01,0x00,0x01,0x01,0x81,0x01,0x01,0x00,0x60,0x50,0xf8,0x41,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x91,0xaa,0xaa,0xa9,0x43,0x00,0x00,0x00,0x02, 0x07,0xca,0x02,0x02,0x00,0x02,0x01,0xcf,0x01,0x02,0x00,0x02,0x04,0x0f, 0x04,0x02,0x00,0x02,0x02,0xca,0x07,0x02,0x00,0xdc,0x58,0x5c,0x18,0x1f },{ 0x00,0x00,0xe7,0xce,0x00,0x1c,0x2a,0x2a,0x2a,0x2c,0x00,0x00,0x00,0x0c, 0x33,0xc0,0x00,0x00,0x00,0x0c,0x03,0x00,0x03,0x0c,0x00,0x0c,0x30,0xc0, 0x30,0x0c,0x00,0x00,0x00,0xc0,0x33,0x0c,0x00,0xe5,0xc9,0xe6,0xc0,0xf8}}; static const char PROGMEM musi9_L[4][42] = { { 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0xfe,0x04,0x18,0x04,0xfe, 0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x8c,0x12,0x12,0x12,0xe4,0x00, 0x00,0x02,0xfe,0x02,0x00,0x00,0xfc,0x02,0x02,0x02,0x84,0x00,0x00,0x00 },{ 0x00,0x00,0xce,0x9c,0x00,0x00,0xc0,0xe0,0xf0,0xf9,0xf8,0xf8,0xf8,0xf9, 0xf0,0xe0,0xc0,0x01,0x01,0x01,0x00,0xf0,0xf0,0x01,0x01,0xf1,0xf0,0x00, 0x00,0x01,0x01,0x01,0x00,0x00,0xf8,0xf1,0xe1,0xc1,0x80,0x00,0x00,0x00 },{ 0x00,0x00,0x39,0x73,0x00,0x00,0x07,0x0f,0x1f,0x3f,0x3f,0x3f,0x3f,0x3f, 0x1f,0x0f,0x07,0x00,0x00,0x00,0x00,0x1f,0x1f,0x00,0x00,0x1f,0x1f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,0x00 },{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x08, 0xf8,0x08,0xf0,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x70,0x88,0x88,0x48, 0xff,0x00,0x70,0xa8,0xa8,0xa8,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}; static const char PROGMEM musi9_R[4][42] = { { 0x00,0x00,0x00,0xfe,0x04,0x18,0x04,0xfe,0x00,0x00,0xfe,0x00,0x00,0x00, 0xfe,0x00,0x8c,0x12,0x12,0x12,0xe4,0x00,0x00,0x02,0xfe,0x02,0x00,0x00, 0xfc,0x02,0x02,0x02,0x84,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 },{ 0x00,0x00,0x00,0x81,0x60,0x10,0x60,0x81,0x60,0x10,0x00,0x01,0x01,0x01, 0xe0,0xe0,0x60,0x61,0x61,0x61,0x60,0xf8,0x70,0x21,0x01,0x01,0xc0,0xe0, 0x60,0x01,0xf9,0xf9,0x00,0x60,0xe0,0xc0,0x00,0x00,0x9c,0xce,0x00,0x00 },{ 0x18,0x24,0x4b,0x48,0x48,0x4c,0x4b,0x48,0x4b,0x2c,0x18,0x00,0x00,0x00, 0x4f,0xe7,0xf0,0x60,0x60,0x60,0x60,0x60,0x7e,0x7f,0x00,0x0f,0x3f,0x70, 0x60,0xc0,0xc1,0xc1,0xc0,0x60,0x70,0x3f,0x0f,0x00,0x73,0x39,0x00,0x00 },{ 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x08,0xf8,0x08,0xf0,0x00,0x70,0x88, 0x88,0x88,0x71,0x00,0x70,0x88,0x88,0x48,0xff,0x00,0x70,0xa8,0xa8,0xa8, 0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; uint8_t this_layout = userspace_config.layout % 3; // Render the requested image on the given column and row // Don't grab highest layer; instead compare from top to bottom. // Highest layer might be on the other side if (isLeft) { if (layer_state_cmp(layer_state, _MUSI)) { draw_image(row, col, musi9_L); } else if (layer_state_cmp(layer_state, _MOUS)) { draw_image(row, col, mous8_L); } else if (layer_state_cmp(layer_state, _FUNC)) { draw_image(row, col, func7_L); } else if (layer_state_cmp(layer_state, _NUMB)) { switch (this_layout) { case 0: // Dvorak if (mods & MOD_MASK_SHIFT) { draw_image(row, col, numb6_L_dvor_shift); } else { draw_image(row, col, numb6_L_dvor_nomod); } break; case 1: // Turkish F if ((mods & MOD_MASK_SHIFT) && (mods & MOD_BIT(KC_RALT))) { // Shift + AltGr draw_image(row, col, numb6_L_turf_shfgr); } else if (mods & MOD_MASK_SHIFT) { // Shift draw_image(row, col, numb6_L_turf_shift); } else if (mods & MOD_BIT(KC_RALT)) { // AltGr draw_image(row, col, numb6_L_turf_altgr); } else { // Normal draw_image(row, col, numb6_L_turf_nomod); } break; case 2: // Qwerty if (mods & MOD_MASK_SHIFT) { draw_image(row, col, numb6_L_qwer_shift); } else { draw_image(row, col, numb6_L_qwer_nomod); } break; } } else if (layer_state_cmp(layer_state, _GAME)) { draw_image(row, col, game2_L); } else if (layer_state_cmp(layer_state, _CHAR)) { draw_image(row, col, char1_L); } else { switch (this_layout) { case 0: // Dvorak if (mods & MOD_MASK_SHIFT) { draw_image(row, col, base0_L_dvor_shift); } else { draw_image(row, col, base0_L_dvor_nomod); } break; case 1: // Turkish F if ((mods & MOD_MASK_SHIFT) && (mods & MOD_BIT(KC_RALT))) { // Shift + AltGr draw_image(row, col, base0_L_turf_shfgr); } else if (mods & MOD_MASK_SHIFT) { // Shift draw_image(row, col, base0_L_turf_shift); } else if (mods & MOD_BIT(KC_RALT)) { // AltGr draw_image(row, col, base0_L_turf_altgr); } else { // Normal draw_image(row, col, base0_L_turf_nomod); } break; case 2: // Qwerty if (mods & MOD_MASK_SHIFT) { draw_image(row, col, base0_L_qwer_shift); } else { draw_image(row, col, base0_L_qwer_nomod); } break; } } } else { if (layer_state_cmp(layer_state, _MUSI)) { draw_image(row, col, musi9_R); } else if (layer_state_cmp(layer_state, _SYMB)) { switch (this_layout) { case 0: // Dvorak draw_image(row, col, symb5_R_dvor); break; case 1: // Turkish f if (mods & MOD_BIT(KC_RALT)) { // AltGr draw_image(row, col, symb5_R_turf_altgr); } else { // Normal draw_image(row, col, symb5_R_turf_nomod); } break; case 2: // Qwerty draw_image(row, col, symb5_R_qwer); break; } } else if (layer_state_cmp(layer_state, _NAVI)) { draw_image(row, col, navi4_R); } else if (layer_state_cmp(layer_state, _MEDI)) { if (mods & MOD_MASK_SHIFT) { draw_image(row, col, medi3_R_shift); } else { draw_image(row, col, medi3_R_nomod); } } else if (layer_state_cmp(layer_state, _CHAR)) { draw_image(row, col, char1_R); } else { switch (this_layout) { case 0: // Dvorak if (mods & MOD_MASK_SHIFT) { draw_image(row, col, base0_R_dvor_shift); } else { draw_image(row, col, base0_R_dvor_nomod); } break; case 1: // Turkish F if ((mods & MOD_MASK_SHIFT) && (mods & MOD_BIT(KC_RALT))) { // Shift + AltGr draw_image(row, col, base0_R_turf_shfgr); } else if (mods & MOD_MASK_SHIFT) { // Shift draw_image(row, col, base0_R_turf_shift); } else if (mods & MOD_BIT(KC_RALT)) { // AltGr draw_image(row, col, base0_R_turf_altgr); } else { // Normal draw_image(row, col, base0_R_turf_nomod); } break; case 2: // Qwerty if (mods & MOD_MASK_SHIFT) { draw_image(row, col, base0_R_qwer_shift); } else { draw_image(row, col, base0_R_qwer_nomod); } break; } } } } // Render the RGB state on the given column and row void render_rgb(uint8_t row, uint8_t col) { static const char PROGMEM rgb_enab[12] = {0x08,0x81,0x3c,0x42,0x99,0xbd,0xbd,0x99,0x42,0x3c,0x81,0x10}; static const char PROGMEM rgb_disa[12] = {0x08,0x81,0x3c,0x42,0x81,0x81,0x81,0x81,0x42,0x3c,0x81,0x10}; static char rgb_temp4[4] = {0}; static char rgb_temp3[3] = {0}; oled_set_cursor(col, row); # ifdef RGB_MATRIX_ENABLE if (rgb_matrix_is_enabled()) { oled_write_raw_P(rgb_enab, 12); } else { oled_write_raw_P(rgb_disa, 12); } oled_set_cursor(col + 2, row); oled_write(" hue sat val", false); oled_set_cursor(col, row + 1); itoa(rgb_matrix_get_mode(), rgb_temp3, 10); oled_write(rgb_temp3, false); oled_write(" ", false); itoa(rgb_matrix_get_hue(), rgb_temp4, 10); oled_write(rgb_temp4, false); oled_write(" ", false); itoa(rgb_matrix_get_sat(), rgb_temp4, 10); oled_write(rgb_temp4, false); oled_write(" ", false); itoa(rgb_matrix_get_val(), rgb_temp4, 10); oled_write(rgb_temp4, false); # else // RGB_MATRIX_ENABLE oled_write("-RGB disabled-", false); # endif // RGB_MATRIX_ENABLE } void render_status_left(uint8_t row, uint8_t col) { // Left side looks like this on the left half // (Should be 14 characters per line) // Mods: <OS> <Alt/Gr> <Ctrl> <Shift> // Enc: <8 len str> // Wpm: <wpm here> // Layout: <dvorak/qwerty/tur. f> // Right half is whatever layer image needs be uint8_t this_mod = get_mods(); uint8_t this_layer = get_highest_layer(layer_state); // MODIFIERS render_modifiers(row + 0, col + 0, this_mod); // Encoders render_encoder(row + 1, col + 0, 0, this_layer); // WPM text render_wpm(row + 2, col + 0); // Visual layout render_keymap(row + 3, col + 0, false); // Draw the image after 14'th character render_layout(row + 0, col + 14, this_mod, true); } void render_status_right(uint8_t row, uint8_t col) { // Right half is whatever layer image needs be on the left // Right side looks like this on the right half // (Should be after the 12'th character; max 14 characters per line) // Mods: <OS> <Alt/Gr> <Ctrl> <Shift> // Enc: <8 len str> // Wpm: <wpm here> // Layout: <dvorak/qwerty/tur. f> uint8_t this_mod = get_mods(); uint8_t this_layer = get_highest_layer(layer_state); // Draw the image render_layout(row + 0, col + 0, this_mod, false); // Modifiers render_modifiers(row + 0, col + 7, this_mod); // Encoder render_encoder(row + 1, col + 7, 1, this_layer); // RGB State (2 rows) render_rgb(row + 2, col + 7); }
A users/bbaserdem/bb-oled-extra.h => users/bbaserdem/bb-oled-extra.h +25 -0
@@ 0,0 1,25 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #include "bbaserdem.h" // OLED layout images writer function void render_modifiers(uint8_t row, uint8_t col, uint8_t mods); void render_layout(uint8_t row, uint8_t col, uint8_t mods, bool isLeft); void render_rgb(uint8_t row, uint8_t col); void render_status_left(uint8_t row, uint8_t col); void render_status_right(uint8_t row, uint8_t col);
A users/bbaserdem/bb-oled.c => users/bbaserdem/bb-oled.c +216 -0
@@ 0,0 1,216 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include "bb-oled.h" #include <string.h> // Grab the print function #ifdef ENCODER_ENABLE # include "bb-encoder.h" #endif // ENCODER_ENABLE /* OLED * This contains general purpose oled code */ // Allow default to be overwritten by keymap if they return false __attribute__ ((weak)) bool oled_task_keymap(void) {return true;} // Do sane defaults for regular oled rendering void oled_task_user(void) { if (is_oled_on()) { if (oled_task_keymap()) { render_status_lite(0, 0); } } } /*-------------------------*\ |*---RENDERING FUNCTIONS---*| \*-------------------------*/ void render_qmk_logo(uint8_t row, uint8_t col) { static const char PROGMEM qmk_logo[] = { 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d, 0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6, 0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd, 0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0}; oled_set_cursor(col, row); oled_write_P(qmk_logo, false); } void render_layer(uint8_t row, uint8_t col, uint8_t top_layer) { // Write the layer state; 17 chars oled_set_cursor(col, row); oled_write("Layer: ", false); switch (top_layer) { case _BASE: oled_write("Default ", false); break; case _CHAR: oled_write("Sp. Chars ", false); break; case _GAME: oled_write("Gaming ", false); break; case _MEDI: oled_write("Media Ctr ", false); break; case _NAVI: oled_write("Navigation", false); break; case _SYMB: oled_write("Symbols ", false); break; case _NUMB: oled_write("Numpad ", false); break; case _FUNC: oled_write("Funct Keys", false); break; case _MOUS: oled_write("Mouse Keys", false); break; case _MUSI: oled_write("Music Mode", false); break; default: oled_write("?? N/A ?? ", false); } } void render_modifiers_lite(uint8_t row, uint8_t col, uint8_t mods) { // Write the modifier state, 16 characters oled_set_cursor(col, row); oled_write((mods & MOD_MASK_SHIFT ) ? "Shft " : " ", false); oled_write((mods & MOD_MASK_CTRL ) ? "Ctrl " : " ", false); oled_write((mods & MOD_MASK_ALT ) ? "Alt" : " ", false); oled_write((mods & MOD_BIT(KC_RALT)) ? "G " : " ", false); oled_write((mods & MOD_MASK_GUI ) ? "Meta " : " ", false); } void render_encoder(uint8_t row, uint8_t col, uint8_t index, uint8_t layer) { // Renders the encoder state, 14 characters oled_set_cursor(col, row); # ifdef ENCODER_ENABLE static char encoder_temp9[9] = {0}; oled_write("Enc: ", false); encoder_state_string(index, layer, encoder_temp9); oled_write(encoder_temp9, false); # else // ENCODER_ENABLE oled_write("No enc. avail.", false); # endif // ENCODER_ENABLE } void render_wpm(uint8_t row, uint8_t col) { // Renders the WPM, 8 characters oled_set_cursor(col, row); # ifdef WPM_ENABLE static char wpm_temp4[4] = {0}; oled_write("WPM: ", false); itoa(get_current_wpm(), wpm_temp4, 10); oled_write(wpm_temp4, false); oled_write(" ", false); # else // WPM_ENABLE oled_write("WPM: N/A", false); # endif // WPM_ENABLE } // Writes the currently used OLED display layout void render_keymap(uint8_t row, uint8_t col, bool isLite) { // Render the oled layout; lite is 11, regular is 14 characters oled_set_cursor(col, row); if (isLite) { oled_write("KM: ", false); } else { oled_write("Layout: ", false); } switch (userspace_config.layout % 3) { case 0: oled_write("Dvorak", false); break; case 1: oled_write("Tur. F", false); break; case 2: oled_write("Qwerty", false); break; } if (isLite) { oled_write(" ", false); } } // Writes the currently used OLED display layout #ifdef RGB_MATRIX_ENABLE void render_rgb_lite(uint8_t row, uint8_t col) { // Writes the currently used OLED display layout, 19 characters static char rgb_temp4[4] = {0}; // Render the oled layout oled_set_cursor(col, row); oled_write("m", false); itoa(rgb_matrix_get_mode(), rgb_temp4, 10); oled_write(rgb_temp4, false); oled_write(" h", false); itoa(rgb_matrix_get_hue(), rgb_temp4, 10); oled_write(rgb_temp4, false); oled_write(" s", false); itoa(rgb_matrix_get_sat(), rgb_temp4, 10); oled_write(rgb_temp4, false); oled_write(" v", false); itoa(rgb_matrix_get_val(), rgb_temp4, 10); oled_write(rgb_temp4, false); } #endif // RGB_MATRIX_ENABLE void render_status_lite(uint8_t row, uint8_t col) { // Function to print state information; for low flash memory uint8_t this_layer = get_highest_layer(layer_state); uint8_t this_mod = get_mods(); // Line 1: Layer State render_layer(row + 0, col + 0, this_layer); // Line 2: Mod or info switch (this_layer) { // Show RGB mode as an overlay in media mode. # ifdef RGB_MATRIX_ENABLE case _MEDI: render_rgb_lite(row + 1, col + 0); break; # endif // RGB_MATRIX_ENABLE // Show the modifier if nothing else is doing anything default: render_modifiers_lite(row + 1, col + 0, this_mod); break; } // Line 3: WPM and layout render_keymap(row + 2, col + 0, true); render_wpm(row + 2, col + 11); // Line 4: Encoder states # ifdef SPLIT_KEYBOARD if (is_keyboard_left()) { render_encoder(row + 3, col + 0, 0, this_layer); } else { render_encoder(row + 3, col + 0, 1, this_layer); } # else // SPLIT_KEYBOARD render_encoder(row + 3, col + 0, 0, this_layer); # endif // SPLIT_KEYBOARD }
A users/bbaserdem/bb-oled.h => users/bbaserdem/bb-oled.h +32 -0
@@ 0,0 1,32 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #include "bbaserdem.h" // Contain the main oled writer here void oled_task_user(void); // Some generic rendering functions void render_qmk_logo(uint8_t row, uint8_t col); void render_layer(uint8_t row, uint8_t col, uint8_t top_layer); void render_modifiers_lite(uint8_t row, uint8_t col, uint8_t mods); void render_encoder(uint8_t row, uint8_t col, uint8_t index, uint8_t layer); void render_wpm(uint8_t row, uint8_t col); void render_keymap(uint8_t row, uint8_t col, bool isLite); #ifdef RGB_MATRIX_ENABLE void render_rgb_lite(uint8_t row, uint8_t col); #endif // RGB_MATRIX_ENABLE void render_status_lite(uint8_t row, uint8_t col);
A users/bbaserdem/bb-rgb.c => users/bbaserdem/bb-rgb.c +130 -0
@@ 0,0 1,130 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include "bb-rgb.h" #include "color.h" #define X_DIV 224/2 /* Code relating to per-key RGB LED stuff */ // Allow hooking into the RGB matrix indications using keymap code // Modulates the brightness of indicator RGB helper_dimmer(uint8_t r, uint8_t g, uint8_t b) { RGB output; output.r = r / 2; output.g = g / 2; output.b = b / 2; return output; } // x range from 0-left to 224-right // y range from 0-top to 64-bottom void helper_painter(uint8_t led_min, uint8_t led_max, RGB col, uint8_t side) { if (side == 1) { // Left for(uint8_t i = led_min; i <= led_max; i++) { if((g_led_config.point[i].x < X_DIV) && (g_led_config.flags[i] & LED_FLAG_INDICATOR)) { rgb_matrix_set_color(i, col.r, col.g, col.b); } } } else if (side == 2) { // Right for(uint8_t i = led_min; i <= led_max; i++) { if((g_led_config.point[i].x > X_DIV) && (g_led_config.flags[i] & LED_FLAG_INDICATOR)) { rgb_matrix_set_color(i, col.r, col.g, col.b); } } } else if (side == 0) { // Both for(uint8_t i = led_min; i <= led_max; i++) { if(g_led_config.flags[i] & LED_FLAG_INDICATOR) { rgb_matrix_set_color(i, col.r, col.g, col.b); } } } } // Allow to turn off global handling __attribute__ ((weak)) bool rgb_matrix_indicators_advanced_keymap(uint8_t led_min, uint8_t led_max) { return false; } // Set RGB state depending on layer void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { uint8_t thisInd = 3; RGB thisCol; // Load keymap hooks if(rgb_matrix_indicators_advanced_keymap(led_min, led_max)) { return; } // Grab color info switch (get_highest_layer(layer_state)) { case _GAME: // Set left side as purple thisCol = helper_dimmer(RGB_PURPLE); thisInd = 1; break; case _CHAR: // Set full board as gold thisCol = helper_dimmer(RGB_GOLD); thisInd = 0; break; case _MEDI: // Set right side as pink thisCol = helper_dimmer(RGB_MAGENTA); thisInd = 2; break; case _NAVI: // Set right side as green thisCol = helper_dimmer(RGB_GREEN); thisInd = 2; break; case _SYMB: // Set right side as yellow thisCol = helper_dimmer(RGB_YELLOW); thisInd = 2; break; case _NUMB: // Set left side as blue thisCol = helper_dimmer(RGB_BLUE); thisInd = 1; break; case _FUNC: // Set left side as red thisCol = helper_dimmer(RGB_RED); thisInd = 1; break; case _MOUS: // Set left side as blue-green thisCol = helper_dimmer(RGB_SPRINGGREEN); thisInd = 1; break; case _MUSI: // Set full board as orange thisCol = helper_dimmer(RGB_ORANGE); thisInd = 0; break; } helper_painter(led_min, led_max, thisCol, thisInd); } // Hook into shutdown code to make all perkey LED's red on hitting reset void shutdown_rgb(void) { // Flash all the key LED's red on shutdown uint16_t timer_start = timer_read(); rgb_matrix_set_color_all(RGB_CORAL); // Delay until this registers while(timer_elapsed(timer_start) < 250) {wait_ms(1);} } // Hook into suspend code void suspend_power_down_rgb(void) { rgb_matrix_set_suspend_state(true); } void suspend_wakeup_init_rgb(void) { rgb_matrix_set_suspend_state(false); }
A users/bbaserdem/bb-rgb.h => users/bbaserdem/bb-rgb.h +28 -0
@@ 0,0 1,28 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #include "bbaserdem.h" /* Hooks involving perkey RGB LEDs */ // For custom indicators void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max); // Hook into shutdown code void shutdown_rgb(void); void suspend_wakeup_init_rgb(void); void suspend_power_down_rgb(void);
A users/bbaserdem/bb-underglow.c => users/bbaserdem/bb-underglow.c +116 -0
@@ 0,0 1,116 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #include "bb-underglow.h" /* UNDERGLOW IMPLEMENTATION */ // Define the layer switching code // An empty layer on the base const rgblight_segment_t PROGMEM bb_base_layer[] = RGBLIGHT_LAYER_SEGMENTS( {0, 0, HSV_WHITE} ); // Gaming layer is turquoise const rgblight_segment_t PROGMEM bb_game_layer[] = RGBLIGHT_LAYER_SEGMENTS( {RGBLIGHT_LEFT_BEG, RGBLIGHT_LEFT_NUM, HSV_PURPLE} ); // Character overlay is chartereuse const rgblight_segment_t PROGMEM bb_char_layer[] = RGBLIGHT_LAYER_SEGMENTS( {0, RGBLED_NUM, HSV_GOLD} ); // Right-hand layers // Media layer is orange const rgblight_segment_t PROGMEM bb_medi_layer[] = RGBLIGHT_LAYER_SEGMENTS( {RGBLIGHT_RIGHT_BEG, RGBLIGHT_RIGHT_NUM, HSV_MAGENTA} ); // Navigation layer is green const rgblight_segment_t PROGMEM bb_navi_layer[] = RGBLIGHT_LAYER_SEGMENTS( {RGBLIGHT_RIGHT_BEG, RGBLIGHT_RIGHT_NUM, HSV_GREEN} ); // Symbol layer is purple const rgblight_segment_t PROGMEM bb_symb_layer[] = RGBLIGHT_LAYER_SEGMENTS( {RGBLIGHT_RIGHT_BEG, RGBLIGHT_RIGHT_NUM, HSV_YELLOW} ); // Left-hand layers // Number layer is blue const rgblight_segment_t PROGMEM bb_numb_layer[] = RGBLIGHT_LAYER_SEGMENTS( {RGBLIGHT_LEFT_BEG, RGBLIGHT_LEFT_NUM, HSV_BLUE} ); // Function layer is red const rgblight_segment_t PROGMEM bb_func_layer[] = RGBLIGHT_LAYER_SEGMENTS( {RGBLIGHT_LEFT_BEG, RGBLIGHT_LEFT_NUM, HSV_RED} ); // Pointer layer is yellow const rgblight_segment_t PROGMEM bb_mous_layer[] = RGBLIGHT_LAYER_SEGMENTS( {RGBLIGHT_LEFT_BEG, RGBLIGHT_LEFT_NUM, HSV_SPRINGGREEN} ); // Music playback layer is magenta const rgblight_segment_t PROGMEM bb_musi_layer[] = RGBLIGHT_LAYER_SEGMENTS( {0, RGBLED_NUM, HSV_ORANGE} ); const rgblight_segment_t* const PROGMEM bb_rgb_layers[] = RGBLIGHT_LAYERS_LIST( bb_base_layer, bb_char_layer, bb_game_layer, bb_medi_layer, bb_navi_layer, bb_symb_layer, bb_numb_layer, bb_func_layer, bb_mous_layer, bb_musi_layer ); // Enable the LED switching layers void keyboard_post_init_underglow(void) { rgblight_layers = bb_rgb_layers; // Default rgb mode is rainbow swirl; set this rgblight_sethsv_noeeprom(100, 255, 255); rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_SWIRL + 0); } // Set RGBLIGHT state depending on layer layer_state_t layer_state_set_underglow(layer_state_t state) { // Activate layers if on that region rgblight_set_layer_state(_BASE, layer_state_cmp(state, _BASE)); rgblight_set_layer_state(_GAME, layer_state_cmp(state, _GAME)); rgblight_set_layer_state(_CHAR, layer_state_cmp(state, _CHAR)); rgblight_set_layer_state(_MEDI, layer_state_cmp(state, _MEDI)); rgblight_set_layer_state(_NAVI, layer_state_cmp(state, _NAVI)); rgblight_set_layer_state(_SYMB, layer_state_cmp(state, _SYMB)); rgblight_set_layer_state(_NUMB, layer_state_cmp(state, _NUMB)); rgblight_set_layer_state(_FUNC, layer_state_cmp(state, _FUNC)); rgblight_set_layer_state(_MOUS, layer_state_cmp(state, _MOUS)); rgblight_set_layer_state(_MUSI, layer_state_cmp(state, _MUSI)); // Return so other stuff can be done return state; } // Hook into shutdown code void shutdown_underglow(void) { // Make the LED's red on shutdown rgblight_enable_noeeprom(); rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); rgblight_sethsv(HSV_WHITE); }
A users/bbaserdem/bb-underglow.h => users/bbaserdem/bb-underglow.h +28 -0
@@ 0,0 1,28 @@ /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #include "bbaserdem.h" /* UNDERGLOW IMPLEMENTATION */ // Used to initialize layer switching overlay void keyboard_post_init_underglow(void); // Used to change RGB underglow layers on keymap layer change layer_state_t layer_state_set_underglow(layer_state_t state); // Hook into shutdown to show effect on shutdown void shutdown_underglow(void);
M users/bbaserdem/bbaserdem.c => users/bbaserdem/bbaserdem.c +321 -594
@@ 1,633 1,360 @@ #include "bbaserdem.h" /*---------------*\ |*-----MOUSE-----*| \*---------------*/ #ifdef MOUSEKEY_ENABLE #include "mousekey.h" #endif /*-------------*\ |*-----RGB-----*| \*-------------*/ #ifdef RGBLIGHT_ENABLE #include "rgblight.h" #endif /*-------------*\ |*---UNICODE---*| \*-------------*/ #ifdef UNICODE_ENABLE #endif /*-----------------*\ |*-----SECRETS-----*| \*-----------------*/ // Enabled by adding a non-tracked secrets.h to this dir. #if (__has_include("secrets.h")) #include "secrets.h" #endif /*---------------*\ |*-----MUSIC-----*| \*---------------*/ #ifdef AUDIO_ENABLE float tone_game[][2] = SONG(ZELDA_PUZZLE); float tone_return[][2] = SONG(ZELDA_TREASURE); float tone_linux[][2] = SONG(UNICODE_LINUX); float tone_windows[][2] = SONG(UNICODE_WINDOWS); #endif /*-------------------*\ |*-----TAP-DANCE-----*| \*-------------------*/ #ifdef TAP_DANCE_ENABLE qk_tap_dance_action_t tap_dance_actions[] = { // Shift on double tap of semicolon [SCL] = ACTION_TAP_DANCE_DOUBLE( KC_SCLN, KC_COLN ) }; #endif /* In keymaps, instead of writing _user functions, write _keymap functions * The __attribute__((weak)) allows for empty definitions here, and during * compilation, if these functions are defined elsewhere, they are written * over. This allows to include custom code from keymaps in the generic code * in this file. /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ __attribute__ ((weak)) void matrix_init_keymap(void) { } __attribute__ ((weak)) void matrix_scan_keymap(void) { } __attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; #include "bbaserdem.h" // Language imports #include <sendstring_dvorak.h> // Need memcpy and memcmp from string.h along with transfer stuff #ifdef SPLIT_KEYBOARD #include "transactions.h" #include <string.h> #endif // SPLIT_KEYBOARD /*-------------------------*\ |*-----KEYBOARD CONFIG-----*| \*-------------------------*/ userspace_config_t userspace_config; userspace_runtime_t userspace_runtime; /*---------------------------------*\ |*----SPLIT KEYBOARD TRANSPORT-----*| \*---------------------------------*/ #ifdef SPLIT_KEYBOARD userspace_config_t transport_userspace_config; userspace_runtime_t transport_userspace_runtime; // Translate the RPC data to the local variable void userspace_config_sync(uint8_t in_buflen, const void* in_data, uint8_t out_buflen, void* out_data) { // Copy incoming data to local variable if (in_buflen == sizeof(transport_userspace_config)) { memcpy(&transport_userspace_config, in_data, in_buflen); } // There is no data to send back; so no output handling } __attribute__ ((weak)) uint32_t layer_state_set_keymap (uint32_t state) { return state; void userspace_runtime_sync(uint8_t in_buflen, const void* in_data, uint8_t out_buflen, void* out_data) { // Copy incoming data to local variable if (in_buflen == sizeof(transport_userspace_runtime)) { memcpy(&transport_userspace_runtime, in_data, in_buflen); } // There is no data to send back; so no output handling } __attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) { } /* ----------------------- *\ * -----RGB Functions----- * \* ----------------------- */ #ifdef RGBLIGHT_ENABLE // Storage variables extern rgblight_config_t rgblight_config; bool base_sta; // Keeps track if in saveable state bool base_tog; // Whether base state is active or not int base_hue; // Hue value of base state int base_sat; // Saturation value of base state int base_val; // Brightness value of base state uint8_t base_mod; // Animation mode of the base state // Save the current state of the rgb mode void rgblight_saveBase(void) { base_hue = rgblight_config.hue; base_sat = rgblight_config.sat; base_val = rgblight_config.val; base_mod = rgblight_config.mode; base_tog = rgblight_config.enable; base_sta = false; // If saving, that means base layer is being left // Either send or receive the correct data void userspace_transport_update(void) { if (is_keyboard_master()) { // If we are the main device; we want to send info. transport_userspace_config.raw = userspace_config.raw; transport_userspace_runtime.raw = userspace_runtime.raw; } else { // If we are the secondary device; we want to receive info, and save to eeprom. userspace_config.raw = transport_userspace_config.raw; userspace_runtime.raw = transport_userspace_runtime.raw; } } // Load the base state back void rgblight_loadBase(void) { // Don't do anything if not enabled if ( !base_sta ) { if ( base_tog ) { rgblight_enable(); rgblight_mode( base_mod ); rgblight_sethsv( base_hue, base_sat, base_val ); } else { rgblight_disable(); // Initiate the protocol on sync void userspace_transport_sync(bool force_sync) { if (is_keyboard_master()) { // Keep track of the last state static userspace_config_t last_userspace_config; static userspace_runtime_t last_userspace_runtime; bool needs_sync = false; // Check if the config values are different if (memcmp(&transport_userspace_config, &last_userspace_config, sizeof(transport_userspace_config))) { needs_sync = true; memcpy(&last_userspace_config, &transport_userspace_config, sizeof(transport_userspace_config)); } // Perform the sync if requested if (needs_sync || force_sync) { transaction_rpc_send(RPC_ID_CONFIG_SYNC, sizeof(transport_userspace_config), &transport_userspace_config); needs_sync = false; } } // Mark that base is loaded, and to be saved before leaving base_sta = true; } // Set to plain HSV color void rgblight_colorStatic( int hu, int sa, int va ) { // First, it must be enabled or color change is not written rgblight_enable(); rgblight_mode(1); rgblight_sethsv(hu,sa,va); } /* HSV values * white ( 0, 0, 255) * red ( 0, 255, 255) * coral ( 16, 176, 255) * orange ( 39, 255, 255) * goldenrod ( 43, 218, 218) * gold ( 51, 255, 255) * yellow ( 60, 255, 255) * chartreuse ( 90, 255, 255) * green (120, 255, 255) * springgreen (150, 255, 255) * turquoise (174, 90, 112) * teal (180, 255, 128) * cyan (180, 255, 255) * azure (186, 102, 255) * blue (240, 255, 255) * purple (270, 255, 255) * magenta (300, 255, 255) * pink (330, 128, 255) */ // Check if the runtime values are different if (memcmp(&transport_userspace_runtime, &last_userspace_runtime, sizeof(transport_userspace_runtime))) { needs_sync = true; memcpy(&last_userspace_runtime, &transport_userspace_runtime, sizeof(transport_userspace_runtime)); } // Set RGBLIGHT state depending on layer void rgblight_change( uint8_t this_layer ) { // Save state, if saving is requested if ( base_sta ) { rgblight_saveBase(); } // Change RGB light switch ( this_layer ) { case _DV: // Load base layer rgblight_loadBase(); break; case _AL: // Do yellow for alternate rgblight_colorStatic( 60,255,255); break; case _GA: // Do purple for game rgblight_colorStatic(285,255,255); break; case _NU: // Do azure for number rgblight_colorStatic(186,200,255); break; case _SE: // Do red for settings rgblight_colorStatic( 16,255,255); break; case _MO: // Do green for mouse rgblight_colorStatic(120,255,255); break; case _MU: // Do orange for music rgblight_colorStatic( 39,255,255); break; default: // Something went wrong rgblight_colorStatic( 0,255,255); break; // Perform the sync if requested if (needs_sync || force_sync) { transaction_rpc_send(RPC_ID_RUNTIME_SYNC, sizeof(transport_userspace_runtime), &transport_userspace_runtime); needs_sync = false; } } } #endif // SPLIT_KEYBOARD #endif /*---------------------------*\ |*-----KEYBOARD PRE INIT-----*| \*---------------------------*/ /* This code runs before anything is started. * Good for early hardware setup */ __attribute__ ((weak)) void keyboard_pre_init_keymap(void) {} __attribute__ ((weak)) void keyboard_pre_init_user(void) { // Keymap specific stuff keyboard_pre_init_keymap(); } /*---------------------*\ |*-----MATRIX INIT-----*| \*---------------------*/ /* This code runs once midway thru the firmware process. * So far, sets the base layer and fixes unicode mode */ __attribute__ ((weak)) void matrix_init_keymap(void) {} void matrix_init_user (void) { // Keymap specific things, do it first thing to allow for delays etc // Keymap specific things matrix_init_keymap(); } /*----------------------------*\ |*-----KEYBOARD POST INIT-----*| \*----------------------------*/ /* This code runs after anything is started. * Good for late hardware setup, like setting up layer specifications */ __attribute__ ((weak)) void keyboard_post_init_keymap(void) {} __attribute__ ((weak)) void keyboard_post_init_user(void) { // Fix beginning base layer, in case some other firmware was flashed // set_single_persistent_default_layer(_BASE); // Correct unicode #ifdef UNICODE_ENABLE // Unicode mode # ifdef UNICODEMAP_ENABLE set_unicode_input_mode(UC_LNX); #endif # endif // UNICODEMAP_ENABLE // Split keyboard halves communication # ifdef SPLIT_KEYBOARD // Register the transactions transaction_register_rpc( RPC_ID_CONFIG_SYNC, userspace_config_sync ); transaction_register_rpc(RPC_ID_RUNTIME_SYNC, userspace_runtime_sync); // Load default config values if (is_keyboard_master()) { // If we are main; load from eeconfig userspace_config.raw = eeconfig_read_user(); // And update the transport variable userspace_transport_update(); // Do one forced transfer to sync halves userspace_transport_sync(true); } else { // Just sync the data received userspace_transport_update(); } # else // SPLIT_KEYBOARD // If we are not split; just load from eeprom userspace_config.raw = eeconfig_read_user(); # endif // SPLIT_KEYBOARD // Backlight LED # ifdef BACKLIGHT_ENABLE keyboard_post_init_backlight(); # endif // BACKLIGHT_ENABLE // RGB underglow # ifdef RGBLIGHT_ENABLE keyboard_post_init_underglow(); # endif // RGBLIGHT_ENABLE // Keymap specific stuff keyboard_post_init_keymap(); } // Make beginning layer DVORAK set_single_persistent_default_layer(_DV); /*---------------------------*\ |*-----HOUSEKEEPING TASK-----*| \*---------------------------*/ /* I have no idea what this does */ __attribute__ ((weak)) void housekeeping_task_keymap(void) {} void housekeeping_task_user(void) { // Check eeprom every now and then static userspace_config_t prev_userspace_config; static fast_timer_t throttle_timer = 0; static bool init_flag = true; // Read this if we never read it before if (init_flag) { init_flag = false; prev_userspace_config.raw = eeconfig_read_user(); } //--RGB light initialize base layer #ifdef RGBLIGHT_ENABLE // Base hue is white, and RGB disabled base_hue = 100; base_sat = 0; base_val = 255; base_mod = 2; base_tog = false; rgblight_enable(); rgblight_mode(base_mod); rgblight_sethsv(base_hue,base_sat,base_val); rgblight_disable(); rgblight_loadBase(); #endif // Throttled tasks here if (timer_elapsed_fast(throttle_timer) >= HOUSEKEEPING_THROTTLE_INTERVAL_MS) { // Refresh timer throttle_timer = timer_read_fast(); // Check userspace config for eeprom updates if (memcmp(&prev_userspace_config, &userspace_config, sizeof(userspace_config))) { memcpy(&prev_userspace_config, &userspace_config, sizeof(userspace_config)); eeconfig_update_user(userspace_config.raw); } } // Do transport stuff # ifdef SPLIT_KEYBOARD userspace_transport_update(); userspace_transport_sync(false); # endif // SPLIT_KEYBOARD // Hook to keymap code housekeeping_task_keymap(); } /*-----------------------*\ |*-----EECONFIG INIT-----*| \*-----------------------*/ /* Default values to send to the eeprom */ void eeconfig_init_user(void) { // Set everything to default userspace_config.raw = 0; // Set encoder states to sane defaults if enabled # ifdef ENCODER_ENABLE reset_encoder_state(); # endif // ENCODER_ENABLE } /*------------------------*\ |*-----PROCESS RECORD-----*| \*------------------------*/ /* Process record: custom keycodes to process here * Allow also the following codes to hook here as well; * Macro definitions * Audio hooks */ __attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; } bool process_record_user(uint16_t keycode, keyrecord_t *record) { // Return after running through all individual hooks return process_record_keymap(keycode, record) && # ifdef AUDIO_ENABLE process_record_audio(keycode, record) && # endif // AUDIO_ENABLE # ifdef ENCODER_ENABLE process_record_encoder(keycode, record) && # endif // ENCODER_ENABLE process_record_macro(keycode, record); } /*---------------------*\ |*-----MATRIX SCAN-----*| \*---------------------*/ /* This code runs every frame * I used to check for layer switching here, but layer state is better used. * Try to not put anything here; as it runs hundreds time per second-ish */ __attribute__ ((weak)) void matrix_scan_keymap(void) { } void matrix_scan_user (void) { // Keymap specific, do it first // Keymap specific scan function matrix_scan_keymap(); } /*------------------*\ |*-----KEYCODES-----*| \*------------------*/ bool process_record_user(uint16_t keycode, keyrecord_t *record) { // Shift check bool is_capital = ( keyboard_report->mods & (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)) ); static bool lock_flag = false; uint8_t layer = biton32 (layer_state); switch (keycode) { // Secrets implementation #if (__has_include("secrets.h")) case SECRET1: if( !record->event.pressed ) { send_string_P( secret[ keycode - SECRET1 ] ); } return false; break; case SECRET2: if( !record->event.pressed ) { send_string_P( secret[ keycode - SECRET2 ] ); } return false; break; case SECRET3: if( !record->event.pressed ) { send_string_P( secret[ keycode - SECRET3 ] ); } return false; break; #endif // If these keys are pressed, load base layer config, and mark saving #ifdef RGBLIGHT_ENABLE case RGB_TOG: case RGB_MOD: case RGB_VAI: case RGB_VAD: case RGB_SAI: case RGB_SAD: case RGB_HUI: case RGB_HUD: if ( !base_sta ) { rgblight_loadBase(); } return true; break; #endif // Lock functionality: These layers are locked if the LOCKED buttons are // pressed. Otherwise, they are momentary toggles case K_LOCK: if (record->event.pressed) { lock_flag = !lock_flag; } return false; break; case K_MOUSE: if (record->event.pressed) { layer_on(_MO); lock_flag = false; } else { if ( lock_flag ) { lock_flag = false; } else { layer_off(_MO); } } return false; break; case K_NUMBR: if (record->event.pressed) { layer_on(_NU); lock_flag = false; } else { if ( lock_flag ) { lock_flag = false; } else { layer_off(_NU); } } return false; break; // Layer switches with sound case K_GAMES: if (record->event.pressed) { // On press, turn off layer if active if ( layer == _GA ) { #ifdef AUDIO_ENABLE stop_all_notes(); PLAY_SONG(tone_return); #endif layer_off(_GA); } } else { // After click, turn on layer if accessed from setting if ( layer == _SE ) { #ifdef AUDIO_ENABLE stop_all_notes(); PLAY_SONG(tone_game); #endif layer_on(_GA); layer_off(_SE); } } return false; break; case MU_TOG: if (record->event.pressed) { // On press, turn off layer if active if ( layer == _SE ) { layer_off(_SE); layer_on(_MU); } else { layer_off(_MU); } } return true; break; //------UNICODE // Unicode switches with sound #ifdef UNICODE_ENABLE case UNI_LI: if (record->event.pressed) { #ifdef AUDIO_ENABLE stop_all_notes(); PLAY_SONG(tone_linux); #endif set_unicode_input_mode(UC_LNX); } return false; break; case UNI_WN: if (record->event.pressed) { #ifdef AUDIO_ENABLE stop_all_notes(); PLAY_SONG(tone_windows); #endif set_unicode_input_mode(UC_WIN); } return false; break; // Turkish letters, with capital functionality case TUR_A: if (record->event.pressed) { if ( is_capital ) { unicode_input_start(); register_hex(0x00c2); unicode_input_finish(); } else { unicode_input_start(); register_hex(0x00e2); unicode_input_finish(); } } return false; break; case TUR_O: if (record->event.pressed) { if ( is_capital ) { unicode_input_start(); register_hex(0x00d6); unicode_input_finish(); } else { unicode_input_start(); register_hex(0x00f6); unicode_input_finish(); } } return false; break; case TUR_U: if (record->event.pressed) { if ( is_capital ) { unicode_input_start(); register_hex(0x00dc); unicode_input_finish(); } else { unicode_input_start(); register_hex(0x00fc); unicode_input_finish(); } } return false; break; case TUR_I: if (record->event.pressed) { if ( is_capital ) { unicode_input_start(); register_hex(0x0130); unicode_input_finish(); } else { unicode_input_start(); register_hex(0x0131); unicode_input_finish(); } } return false; break; case TUR_G: if (record->event.pressed) { if ( is_capital ) { unicode_input_start(); register_hex(0x011e); unicode_input_finish(); } else { unicode_input_start(); register_hex(0x011f); unicode_input_finish(); } } return false; break; case TUR_C: if (record->event.pressed) { if ( is_capital ) { unicode_input_start(); register_hex(0x00c7); unicode_input_finish(); } else { unicode_input_start(); register_hex(0x00e7); unicode_input_finish(); } } return false; break; case TUR_S: if (record->event.pressed) { if ( is_capital ) { unicode_input_start(); register_hex(0x015e); unicode_input_finish(); } else { unicode_input_start(); register_hex(0x015f); unicode_input_finish(); } } return false; break; #endif /*---------------------*\ |*-----LAYER STATE-----*| \*---------------------*/ /* This code runs after every layer change * State represents the new layer state. */ __attribute__ ((weak)) layer_state_t layer_state_set_keymap (layer_state_t state) { return state; } layer_state_t layer_state_set_user(layer_state_t state) { // Keymap layer state setting state = layer_state_set_keymap(state); // For underglow stuff # ifdef RGBLIGHT_ENABLE state = layer_state_set_underglow(state); # endif // RGBLIGHT_ENABLE // Audio playback # ifdef AUDIO_ENABLE state = layer_state_set_audio(state); # endif // AUDIO_ENABLE //-------Diagonal mouse movements #ifdef MOUSEKEY_ENABLE case MO_NE: if( record->event.pressed ) { mousekey_on(MO_N); mousekey_on(MO_E); mousekey_send(); } else { mousekey_off(MO_N); mousekey_off(MO_E); mousekey_send(); } return false; break; case MO_NW: if( record->event.pressed ) { mousekey_on(MO_N); mousekey_on(MO_W); mousekey_send(); } else { mousekey_off(MO_N); mousekey_off(MO_W); mousekey_send(); } return false; break; case MO_SE: if( record->event.pressed ) { mousekey_on(MO_S); mousekey_on(MO_E); mousekey_send(); } else { mousekey_off(MO_S); mousekey_off(MO_E); mousekey_send(); } return false; break; case MO_SW: if( record->event.pressed ) { mousekey_on(MO_S); mousekey_on(MO_W); mousekey_send(); } else { mousekey_off(MO_S); mousekey_off(MO_W); mousekey_send(); } return false; break; case MO_S_NE: if( record->event.pressed ) { mousekey_on(MO_S_N); mousekey_on(MO_S_E); mousekey_send(); } else { mousekey_off(MO_S_N); mousekey_off(MO_S_E); mousekey_send(); } return false; break; case MO_S_NW: if( record->event.pressed ) { mousekey_on(MO_S_N); mousekey_on(MO_S_W); mousekey_send(); } else { mousekey_off(MO_S_N); mousekey_off(MO_S_W); mousekey_send(); } return false; break; case MO_S_SE: if( record->event.pressed ) { mousekey_on(MO_S_S); mousekey_on(MO_S_E); mousekey_send(); } else { mousekey_off(MO_S_S); mousekey_off(MO_S_E); mousekey_send(); } return false; break; case MO_S_SW: if( record->event.pressed ) { mousekey_on(MO_S_S); mousekey_on(MO_S_W); mousekey_send(); } else { mousekey_off(MO_S_S); mousekey_off(MO_S_W); mousekey_send(); } return false; break; #endif return state; } //------DOUBLE PRESS, with added left navigation case DBL_SPC: if( record->event.pressed ) { SEND_STRING(" "SS_TAP(X_LEFT)); } return false; break; case DBL_ANG: if( record->event.pressed ) { SEND_STRING("<>"SS_TAP(X_LEFT)); } return false; break; case DBL_PAR: if( record->event.pressed ) { SEND_STRING("()"SS_TAP(X_LEFT)); } return false; break; case DBL_SQR: if( record->event.pressed ) { SEND_STRING("[]"SS_TAP(X_LEFT)); } return false; break; case DBL_BRC: if( record->event.pressed ) { SEND_STRING("{}"SS_TAP(X_LEFT)); } return false; break; case DBL_QUO: if( record->event.pressed ) { SEND_STRING("\'\'"SS_TAP(X_LEFT)); } return false; break; case DBL_DQT: if( record->event.pressed ) { SEND_STRING("\"\""SS_TAP(X_LEFT)); } return false; break; case DBL_GRV: if( record->event.pressed ) { SEND_STRING("``"SS_TAP(X_LEFT)); } return false; break; // END OF KEYCODES } return process_record_keymap(keycode, record); /*-----------------------------*\ |*-----DEFAULT LAYER STATE-----*| \*-----------------------------*/ /* This code runs after every time default base layer is changed */ __attribute__ ((weak)) layer_state_t default_layer_state_set_keymap (layer_state_t state) { return state; } layer_state_t default_layer_state_set_user(layer_state_t state) { // Keymap level code state = default_layer_state_set_keymap(state); return state; } /*----------------------*\ |*-----LAYER CHANGE-----*| \*----------------------*/ /*------------------------*\ |*-----LED SET KEYMAP-----*| \*------------------------*/ /* Code for LED indicators * I'm not sure when exactly does this code run */ __attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) {} void led_set_user(uint8_t usb_led) { led_set_keymap(usb_led); } layer_state_t layer_state_set_user(layer_state_t state) { /*-----------------*\ |*-----SUSPEND-----*| \*-----------------*/ /* Suspend stuff here, mostly for the rgb lighting. */ __attribute__ ((weak)) void suspend_power_down_keymap (void) { } void suspend_power_down_user(void) { suspend_power_down_keymap(); // RGB matrix sleep hook # ifdef RGB_MATRIX_ENABLE suspend_power_down_rgb(); # endif // RGB_MATRIX_ENABLE } __attribute__ ((weak)) void suspend_wakeup_init_keymap (void) { } void suspend_wakeup_init_user(void) { suspend_wakeup_init_keymap(); // RGB matrix sleep hook # ifdef RGB_MATRIX_ENABLE suspend_wakeup_init_rgb(); # endif // RGB_MATRIX_ENABLE } state = layer_state_set_keymap (state); #ifdef RGBLIGHT_ENABLE // Change RGB lighting depending on the last layer activated rgblight_change( biton32(state) ); #endif return state; /*------------------*\ |*-----SHUTDOWN-----*| \*------------------*/ /* Shutdown stuff here; for when entering bootmode. */ __attribute__ ((weak)) void shutdown_keymap (void) { } void shutdown_user(void) { // Underglow LED hook on boot # ifdef RGBLIGHT_ENABLE shutdown_underglow(); # endif // RGBLIGHT_ENABLE // Perkey led hook on boot # ifdef RGB_MATRIX_ENABLE shutdown_rgb(); # endif // RGB_MATRIX_ENABLE // Keymap hooks shutdown_keymap(); }
M users/bbaserdem/bbaserdem.h => users/bbaserdem/bbaserdem.h +536 -231
@@ 1,268 1,573 @@ #ifndef USERSPACE #define USERSPACE /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #include QMK_KEYBOARD_H #include "quantum.h" #include "keymap_dvorak.h" /* Besides loading libraries and definitions, this file has my layout defs * LAYOUTS: * This file has a couple layouts I use; so that the general changes can be * propagated by only editing this file. */ // Macros to use, this has base level code so not affected by enabled features #include "bb-macro.h" // Audio from onboard speakers #ifdef AUDIO_ENABLE #include "bb-audio.h" #endif // AUDIO_ENABLE // Keycap backlight using non-rgb LEDs #ifdef BACKLIGHT_ENABLE #include "bb-backlight.h" #endif // BACKLIGHT_ENABLE // Underglow light using rgb LEDs #ifdef RGBLIGHT_ENABLE #include "bb-underglow.h" #endif // RGBLIGHT_ENABLE // Keycap backlight using rgb LEDs #ifdef RGB_MATRIX_ENABLE #include "bb-rgb.h" #endif // RGB_MATRIX_ENABLE // Rotary encoder #ifdef ENCODER_ENABLE #include "bb-encoder.h" #endif // ENCODER_ENABLE // Oled screen #ifdef OLED_ENABLE #include "bb-oled.h" #endif // OLED_ENABLE // Structure to keep runtime info on encoder state typedef union { uint32_t raw; struct { bool rgb_sleep; }; } userspace_runtime_t; #define XXX KC_NO typedef union { uint32_t raw; struct { uint8_t e0base :4; // ( 4:0) The encoder state on most layers; regular function uint8_t e1base :4; // ( 8:1) 9 states for this; 4 bits uint8_t e0point :2; // (10:1) The encoder state on mouse layer; moves pointer uint8_t e1point :2; // (12:1) 4 states for this; 2 bits uint8_t e0rgb :4; // (16:2) The encoder state on media layer; controls light uint8_t e1rgb :4; // (20:2) 5 states for this; 3 bits but 4 is better uint8_t layout :2; // (22:2) Stores keymap layout; 3 states is good on 2 bits uint16_t :10; // (32:3) Padding here, free space for 10 more bits }; } userspace_config_t; // Layers #define _DV 0 // Base layer #define _AL 1 // Alt char overlay #define _GA 2 // Game layer #define _NU 3 // Numbers layer #define _SE 4 // Settings layer #define _MO 5 // Mouse emulation #define _MU 6 // Music mode // Broadcast us to everyone else extern userspace_runtime_t userspace_runtime; extern userspace_config_t userspace_config; // Define short macros #define UNDO LCTL(KC_Z) #define REDO LCTL(KC_Y) #define COPY LCTL(KC_C) #define CUT LCTL(KC_X) #define PASTE LCTL(KC_V) // Function definitions that can be accessed through specific keymaps // Runs before all initialization void keyboard_pre_init_keymap(void); // For code that launches once midway through initialization void matrix_init_keymap(void); // For code that launches after initialization is finished. void keyboard_post_init_keymap(void); // These will be delegated to keymap specific stuff (weak definition) bool process_record_keymap(uint16_t keycode, keyrecord_t *record); // This code runs on every tick void matrix_scan_keymap(void); // This code runs after every layer change layer_state_t layer_state_set_keymap(layer_state_t state); // This code runs when the default layer changes layer_state_t default_layer_state_set_keymap (layer_state_t state); // Some code void housekeeping_task_user(void); // This code runs to set LED states void led_set_keymap(uint8_t usb_led); // For code that runs on suspend void suspend_power_down_keymap(void); void suspend_wakeup_init_keymap(void); // For code that runs on powerdown void shutdown_keymap(void); // Rename mouse keys with 7 letters #ifdef MOUSEKEY_ENABLE #define MO_S_N KC_MS_WH_UP #define MO_S_S KC_MS_WH_DOWN #define MO_S_E KC_MS_WH_RIGHT #define MO_S_W KC_MS_WH_LEFT #define MO_N KC_MS_UP #define MO_S KC_MS_DOWN #define MO_E KC_MS_RIGHT #define MO_W KC_MS_LEFT #define MO_CL_L KC_MS_BTN1 #define MO_CL_R KC_MS_BTN2 #define MO_CL_M KC_MS_BTN3 #define MO_CL_4 KC_MS_BTN4 #define MO_CL_5 KC_MS_BTN5 #define MO_AC_0 KC_MS_ACCEL0 #define MO_AC_1 KC_MS_ACCEL1 #define MO_AC_2 KC_MS_ACCEL2 // Make it so that keymaps can use KEYMAP_SAFE_RANGE for custom keycodes #ifdef KEYMAP_SAFE_RANGE #define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE #else #define MO_S_N KC_NO #define MO_S_S KC_NO #define MO_S_E KC_NO #define MO_S_W KC_NO #define MO_N KC_NO #define MO_S KC_NO #define MO_E KC_NO #define MO_W KC_NO #define MO_CL_L KC_NO #define MO_CL_R KC_NO #define MO_CL_M KC_NO #define MO_CL_1 KC_NO #define MO_CL_2 KC_NO #define MO_AC_0 KC_NO #define MO_AC_1 KC_NO #define MO_AC_2 KC_NO #define PLACEHOLDER_SAFE_RANGE SAFE_RANGE #endif // Rename music keys with <8 letters // Custom macro keycode ranges enum userspace_custom_keycodes { // Safe stuff BB_SAFE = PLACEHOLDER_SAFE_RANGE, // Double entry macros DBL_ANG, DBL_PAR, DBL_CBR, DBL_BRC, // Macro key BB_PGPK, // Unicode strings # ifdef UNICODEMAP_ENABLE BB_LENY, BB_TABL, TR_FLAG, # endif // UNICODEMAP_ENABLE // Encoder buttons # ifdef ENCODER_ENABLE BB_ENC0, BB_ENC1, # endif // ENCODER_ENABLE // Oled editor # ifdef OLED_ENABLE BB_OLED, # endif // OLED_ENABLE //use for keymap specific codes KEYMAP_SAFE_RANGE }; // Mask these keycodes if required features are not enabled #ifndef UNICODEMAP_ENABLE #define BB_LENY KC_NO #define BB_TABL KC_NO #define TR_FLAG KC_NO #endif // UNICODEMAP_ENABLE #ifndef ENCODER_ENABLE #define BB_ENC0 KC_NO #define BB_ENC1 KC_NO #endif // ENCODER_ENABLE /// Enumerate of layers enum userspace_layers { _BASE = 0, // Base layer _CHAR, // Characters layer _GAME, // Game layer _MEDI, // R3: Media layer _NAVI, // R3: Navigation layer _SYMB, // R1: Symbols layer _NUMB, // L1: Numbers layer _FUNC, // L2: Function keys layer _MOUS, // L3: Mouse keys layer _MUSI // Music overlay }; // Use 7 wide characters for keymaps, to keep things aligned with 4 tabs #define _______ KC_TRNS #define XXXXXXX KC_NO // These defines allow multiple multi-parameter definitions to expand // for these boards #define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) #define LAYOUT_ortho_5x15_wrapper(...) LAYOUT_ortho_5x15(__VA_ARGS__) #define LAYOUT_ortho_3x10_wrapper(...) LAYOUT_ortho_3x10(__VA_ARGS__) #define LAYOUT_split_3x6_3_wrapper(...) LAYOUT_split_3x6_3(__VA_ARGS__) #define LAYOUT_split_3x5_3_wrapper(...) LAYOUT_split_3x5_3(__VA_ARGS__) // Masks #define ___1___ _______ #define ___2___ _______,_______ #define ___3___ _______,_______,_______ #define ___4___ _______,_______,_______,_______ #define ___5___ _______,_______,_______,_______,_______ #define ___6___ _______,_______,_______,_______,_______,_______ #define xxx1xxx KC_NO #define xxx2xxx KC_NO, KC_NO #define xxx3xxx KC_NO, KC_NO, KC_NO #define xxx4xxx KC_NO, KC_NO, KC_NO, KC_NO #define xxx5xxx KC_NO, KC_NO, KC_NO, KC_NO, KC_NO #define xxx6xxx KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO #define xxx1xxx KC_NO #define xxx3xxx KC_NO, KC_NO, KC_NO #define xxx5xxx KC_NO, KC_NO, KC_NO, KC_NO, KC_NO #define xxx6xxx KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO // Quick macros: in dvorak #define BB_UNDO LCTL(KC_SLSH) // Ctrl + Z #define BB_REDO LCTL(KC_T) // Ctrl + Y #define BB_YANK LCTL(KC_I) // Ctrl + C #define BB_CUT LCTL(KC_B) // Ctrl + X #define BB_PSTE LCTL(KC_DOT) // Ctrl + V // Audio keys #ifdef AUDIO_ENABLE #define MU_REC KC_LCTL #define MU_STOP KC_LALT #define MU_PLAY KC_LGUI #define MU_PLAY KC_LGUI #define MU_FAST KC_UP #define MU_SLOW KC_DOWN #define MU_MASK KC_A #else #define BB_SND MU_ON #ifdef TAP_DANCE_ENABLE #define MU_TEMP TD(TD_AUDIO_TEMPO) #else // TAP_DANCE_ENABLE #define MU_TEMP KC_DOWN #endif // TAP_DANCE_ENABLE #else // AUDIO_ENABLE #define MU_REC KC_NO #define MU_STOP KC_NO #define MU_PLAY KC_NO #define MU_PLAY KC_NO #define MU_FAST KC_NO #define MU_TEMP KC_NO #define MU_SLOW KC_NO #define MU_MASK KC_NO #endif #define BB_SND KC_MUTE #endif // AUDIO_ENABLE // Define non-capitalized UTF shortcuts here #ifdef UNICODE_ENABLE #define PHY_HBR UC(0x0127) #define PHY_DEG UC(0x00b0) #define CUR_LIR UC(0x20ba) #define CUR_BIT UC(0x20bf) #define CUR_EUR UC(0x20ac) #define CUR_BPN UC(0x00a3) #define CUR_YEN UC(0x00a5) #else #define PHY_HBR KC_NO #define PHY_DEG KC_NO #define CUR_LIR KC_NO #define CUR_BIT KC_NO #define CUR_EUR KC_NO #define CUR_BPN KC_NO #define CUR_YEN KC_NO #endif // Unicode keys #ifdef UNICODEMAP_ENABLE #define TR_ACIR XP(LOW_A_CIRC, UPC_A_CIRC ) #define TR_CCED XP(LOW_C_CEDI, UPC_C_CEDI ) #define TR_GBRE XP(LOW_G_BREV, LOW_G_BREV ) #define TR_ICIR XP(LOW_I_CIRC, LOW_I_CIRC ) #define TR_I_NO XP(LOW_I_DOTL, LOW_I_DOTL ) #define TR_IDOT XP(LOW_I_DOTT, LOW_I_DOTT ) #define TR_ODIA XP(LOW_O_DIAE, LOW_O_DIAE ) #define TR_SCED XP(LOW_S_CEDI, LOW_S_CEDI ) #define TR_UCIR XP(LOW_U_CIRC, LOW_U_CIRC ) #define TR_UDIA XP(LOW_U_DIAE, LOW_U_DIAE ) #define GR_ALP XP(LOW_ALPHA, UPC_ALPHA ) #define GR_BET XP(LOW_BETA, UPC_BETA ) #define GR_GAM XP(LOW_GAMMA, UPC_GAMMA ) #define GR_DEL XP(LOW_DELTA, UPC_DELTA ) #define GR_EPS XP(LOW_EPSILON,UPC_EPSILON) #define GR_ZET XP(LOW_ZETA, UPC_ZETA ) #define GR_ETA XP(LOW_ETA, UPC_ETA ) #define GR_THE XP(LOW_THETA, UPC_THETA ) #define GR_IOT XP(LOW_IOTA, UPC_IOTA ) #define GR_KAP XP(LOW_KAPPA, UPC_KAPPA ) #define GR_LAM XP(LOW_LAMBDA, UPC_LAMBDA ) #define GR_MU XP(LOW_MU, UPC_MU ) #define GR_NU XP(LOW_NU, UPC_NU ) #define GR_XI XP(LOW_XI, UPC_XI ) #define GR_OMI XP(LOW_OMICRON,UPC_OMICRON) #define GR_PI XP(LOW_PI, UPC_PI ) #define GR_RHO XP(LOW_RHO, UPC_RHO ) #define GR_SIG XP(LOW_SIGMA, UPC_SIGMA ) #define GR_TAU XP(LOW_TAU, UPC_TAU ) #define GR_UPS XP(LOW_UPSILON,UPC_UPSILON) #define GR_PHI XP(LOW_PHI, UPC_PHI ) #define GR_CHI XP(LOW_CHI, UPC_CHI ) #define GR_PSI XP(LOW_PSI, UPC_PSI ) #define GR_OME XP(LOW_OMEGA, UPC_OMEGA ) #define BB_ELLI X(ELLIPSIS) #define BB_PLNK X(PLANCK_CON) #define BB_ANGS X(ANGSTROM) #define BB_BITC X(BITCOIN) #else // UNICODEMAP_ENABLE #define TR_ACIR KC_A #define TR_CCED KC_C #define TR_GBRE KC_G #define TR_ICIR KC_I #define TR_I_NO KC_I #define TR_IDOT KC_I #define TR_ODIA KC_O #define TR_SCED KC_S #define TR_UCIR KC_U #define TR_UDIA KC_U #define GR_ALP KC_NO #define GR_BET KC_NO #define GR_GAM KC_NO #define GR_DEL KC_NO #define GR_EPS KC_NO #define GR_ZET KC_NO #define GR_ETA KC_NO #define GR_THE KC_NO #define GR_IOT KC_NO #define GR_KAP KC_NO #define GR_LAM KC_NO #define GR_MU KC_NO #define GR_NU KC_NO #define GR_XI KC_NO #define GR_OMI KC_NO #define GR_PI KC_NO #define GR_RHO KC_NO #define GR_SIG KC_NO #define GR_TAU KC_NO #define GR_UPS KC_NO #define GR_PHI KC_NO #define GR_CHI KC_NO #define GR_PSI KC_NO #define GR_OME KC_NO #define BB_ELLI KC_NO #define BB_PLNK KC_NO #define BB_ANGS KC_NO #define BB_BITC KC_NO #endif // UNICODEMAP_ENABLE // Custom keycodes enum userspace_custom_keycodes { // Turkish letters, with shifting TUR_A = SAFE_RANGE, TUR_C, TUR_G, TUR_I, TUR_O, TUR_S, TUR_U, // Unicode mode switch UNI_LI, UNI_WN, // Double keys DBL_SPC, DBL_ANG, DBL_PAR, DBL_SQR, DBL_BRC, DBL_QUO, DBL_DQT, DBL_GRV, // Diagonal mouse movements MO_NE, MO_NW, MO_SE, MO_SW, MO_S_NE, MO_S_NW, MO_S_SE, MO_S_SW, // Layer switches and lock functionality K_MOUSE, K_NUMBR, K_LOCK, K_GAMES, // Secret macros SECRET1, SECRET2, SECRET3 }; // MOD-tap definitions #define GUI_A MT(MOD_LGUI, DV_A) #define ALT_O MT(MOD_LALT, DV_O) #define CTRL_E MT(MOD_LCTL, DV_E) #define SHIFT_U MT(MOD_LSFT, DV_U) #define ALTGR_Q MT(MOD_RALT, DV_Q) #define GUI_S MT(MOD_RGUI, DV_S) #define ALT_N MT(MOD_LALT, DV_N) #define CTRL_T MT(MOD_LCTL, DV_T) #define SHIFT_H MT(MOD_LSFT, DV_H) #define ALTGR_V MT(MOD_RALT, DV_V) // Do tap dancable semicolon key if available #ifdef TAP_DANCE_ENABLE enum { SCL = 0 }; #define MY_SCL TD(SCL) #else #define MY_SCL KC_SCLN #endif // Layer switches #define MED_DEL LT(_MEDI, KC_DEL ) #define NAV_TAB LT(_NAVI, KC_TAB ) #define SYM_SPC LT(_SYMB, KC_SPC ) #define NUM_ENT LT(_NUMB, KC_ENT ) #define FUN_ESC LT(_FUNC, KC_ESC ) #define MOU_BSP LT(_MOUS, KC_BSPC) // Layer switches #define BB_CHAR OSL(_CHAR) #define BB_GAME TG(_GAME) // Shared keymaps #define LAYOUT_planck_wrapper(...) LAYOUT_planck_grid(__VA_ARGS__) #define LAYOUT_letssplit_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) /* Depending on how the layouts change with language; the keys are shown as; * ┌────────────────────────────────────────────────┐ * │AltGr -none- Shift Shift+AltGr │ * └────────────────────────────────────────────────┘ * If there is an exclamation mark; it indicates a dead key on this map. */ /* Dvorak * ,------------------------------------------------------------------------. * | Esc | ' " | , | . | P | Y || F | G | C | R | L | Bkp | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | Tab | A | O | E | U | I || D | H | T | N | S | / ? | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | SYM | ; : | Q | J | K | X || B | M | W | V | Z | SET | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | TUR | OS | Ctrl| Alt | Shf | Spc || Ent | Lft | Dwn | Up | Rght| MSE | * `------------------------------------------------------------------------' */ #define DVORAK \ KC_ESC, KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ KC_TAB, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ K_NUMBR,MY_SCL, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, MO(_SE), \ MO(_AL),KC_LGUI,KC_LCTL,KC_LALT,KC_LSFT,KC_SPC, KC_ENT, KC_LEFT,KC_DOWN,KC_UP, KC_RGHT,K_MOUSE /* Base layout * DVORAK * ┌─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┐ * ` ~ │ ' " │ , < │ . > │ p P │ y Y │ │ f F │ g G │ c C │ r R │ l L │ < > * ├─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┤ * \ | │ a A │ o O │ e E │ u U │ i I │ │ d D │ h H │ t T │ n N │ s S │ - _ * ├─Gui─┼─Alt─┼─Ctr─┼─Sft─┼─────┤ ├─────┼─Sft─┼─Ctr─┼─Alt─┼─Gui─┤ * / ? │ ; : │ q Q │ j J │ k K │ x X │ │ b B │ m M │ w W │ v V │ z Z │ = + * └─────┴AltGr┴─────┼─────┼─────┼─────┐ ┌─────┼─────┼─────┼─────┴AltGr┴─────┘ * │ Del │ Tab │Space│ │Enter│ Esc │BkSpc│ * └─Med─┴─Nav─┴─Sym─┘ └─Num─┴─Fun─┴─Mou─┘ * TURKISH F * ┌─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┐ * ¬+ *±│@f F │ g G │ ğ Ğ │¶ı I │ôo OÔ│ │¥d D │®r R │ n N │°h H │£p P │|< >¦ * !├─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼────!┤ ! * `x Xà│ûu UÛ│îi İÎ│€e E │âa AÂ│ûü ÜÛ│ │₺t T │ k K │µm M │ l L │´y Yá│#ş Şǎ * ! !├─Gui─┼─Alt─┼─Ctr─┼─Sft─┼─────┤ ├─────┼─Sft─┼─Ctr─┼─Alt!┼─Gui─┤ * äq Qå│«j J<│»ö Ö>│“v V │¢c C©│”ç Ç │ │ z Z │§s S │×b B │÷. :ȧ│·, ; │~w W * └─────┴AltGr┴─────┼─────┼─────┼─────┐ ┌─────┼─────┼─────┼─────┴AltGr┴─────┘ * │ Del │ Tab │Space│ │Enter│ Esc │BkSpc│ * └─Med─┴─Nav─┴─Sym─┘ └─Num─┴─Fun─┴─Mou─┘ * The thing about this layout is that these will fit most boards I have. */ #define _BL1_5_ DV_QUOT,DV_COMM,DV_DOT, DV_P, DV_Y #define _BR1_5_ DV_F, DV_G, DV_C, DV_R, DV_L #define _BL2_5_ GUI_A, ALT_O, CTRL_E, SHIFT_U,DV_I #define _BR2_5_ DV_D, SHIFT_H,CTRL_T, ALT_N, GUI_S #define _BL3_5_ DV_SCLN,ALTGR_Q,DV_J, DV_K, DV_X #define _BR3_5_ DV_B, DV_M, DV_W, ALTGR_V,DV_Z #define _BL4_3_ MED_DEL,NAV_TAB,SYM_SPC #define _BR4_3_ NUM_ENT,FUN_ESC,MOU_BSP // The extra line for the 6th (or 0th) row #define _BL1_1_ DV_GRV #define _BR1_1_ KC_NUBS #define _BL2_1_ DV_BSLS #define _BR2_1_ DV_MINS #define _BL3_1_ DV_SLSH #define _BR3_1_ DV_EQL /* Alternative character overlay * ,------------------------------------------------------------------------. * | | ' ' | Undo| Redo|Pound| Yen || | G | C | |TLira| Del | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | | A | O | Euro| U | I ||Degre|Plank| | | S | Ins | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | | " " | Cut | Copy|Paste| || BTC | < > | ( ) | [ ] | { } | PgUp| * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | | | | | | || | Home|PgDwn| PgUp| End | | * `------------------------------------------------------------------------' */ #define ALTCHAR \ _______,DBL_QUO,UNDO, REDO, CUR_BPN,CUR_YEN,_______,TUR_G, TUR_C, _______,CUR_LIR,KC_DEL , \ _______,TUR_A, TUR_O, CUR_EUR,TUR_U, TUR_I, PHY_DEG,PHY_HBR,_______,_______,TUR_S, KC_INS , \ _______,DBL_DQT,CUT, COPY, PASTE, DBL_GRV,CUR_BIT,DBL_ANG,DBL_PAR,DBL_SQR,DBL_BRC,_______, \ _______,_______,_______,_______,_______,DBL_SPC,_______,KC_HOME,KC_PGDN,KC_PGUP,KC_END, _______ /* Extra characters layer * This is accessed using unicode; so IBus compatible apps only. * ┌─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┐ * │TrFlg│Lenny│Table│ π │ υ │ │ φ │ γ │ χ │ ρ │ λ │ * ├─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┤ * │ α │ ο │ ε │ ψ │ ι │ │ δ │ η │ τ │ ν │ σ │ * ├─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┤ * │ ₿ │ θ │ ℏ │ κ │ ξ │ │ β │ μ │ ω │ Å │ ζ │ * └─────┴─────┴─────┼─────┼─────┼─────┐ ┌─────┼─────┼─────┼─────┴─────┴─────┘ * │ Shf │ ... │ GPG │ │ │ │ Shf │ * └─────┴─────┴─────┘ └─────┴─────┴─────┘ * */ #define _CL1_5_ TR_FLAG,BB_LENY,BB_TABL,GR_PI, GR_UPS #define _CR1_5_ GR_PHI, GR_GAM, GR_CHI, GR_RHO, GR_LAM #define _CL2_5_ GR_ALP, GR_OMI, GR_EPS, GR_PSI, GR_IOT #define _CR2_5_ GR_DEL, GR_ETA, GR_TAU, GR_NU, GR_SIG #define _CL3_5_ BB_BITC,GR_THE, BB_PLNK,GR_KAP, GR_XI #define _CR3_5_ GR_BET, GR_MU, GR_OME, BB_ANGS,GR_ZET #define _CL4_3_ KC_RSFT,BB_ELLI,BB_PGPK #define _CR4_3_ XXXXXXX,XXXXXXX,KC_LSFT /* Game layer * ,------------------------------------------------------------------------. * | OFF | Q | W | E | R | T || Esc | 7 | 8 | 9 |NumLk|Bkspc| * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | Tab | A | S | D | F | G || F1 | 4 | 5 | 6 | \ | Ent | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | | Z | X | C | V | B || F2 | 1 | 2 | 3 | ^ | | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | / | ` | | | | Spc || Spc | Ent | 0 | < | v | > | * `------------------------------------------------------------------------' */ #define GAME \ K_GAMES,KC_Q, KC_W, KC_E, KC_R, KC_T, KC_ESC, KC_P7, KC_P8, KC_P9, KC_NLCK,KC_BSPC, \ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_F1, KC_P4, KC_P5, KC_P6, KC_BSLS,KC_ENT , \ _______,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F2, KC_P1, KC_P2, KC_P3, KC_UP, _______, \ KC_SLSH,KC_GRV, _______,_______,_______,KC_SPC, KC_SPC, KC_ENT, KC_P0, KC_LEFT,KC_DOWN,KC_RGHT * This layer turns off the tap-hold keys for the left half. * ┌─────┬─────┬─────┬─────┬─────┐ * │ Q │ W │ E │ R │ T │ * ├─────┼─────┼─────┼─────┼─────┤ * Tab │ A │ S │ D │ F │ G │ * ├─────┼─────┼─────┼─────┼─────┤ * Shift│ Z │ X │ C │ V │ B │ * └─────┴─────┴─────┼─────┼─────┼─────┐ * │ Esc │Enter│Space│ * └─────┴─────┴─────┘ */ #define _GA1_5_ KC_Q, KC_W, KC_E, KC_R, KC_T #define _GA1_1_ _______ #define _GA2_5_ KC_A, KC_S, KC_D, KC_F, KC_G #define _GA2_1_ KC_TAB #define _GA3_5_ KC_Z, KC_X, KC_C, KC_V, KC_B #define _GA3_1_ KC_LSFT #define _GA4_3_ KC_ESC, KC_ENT, KC_SPC /* Media layer * ┌─────┬─────┬─────┬─────┬─────┐ * │Speed│ Mod │ Hue │ Sat │ Bri │ RGB light control * ├─────┼─────┼─────┼─────┼─────┤ * │Togg.│Prev.│MuTog│MuStp│Next │ Media control * ├─────┼─────┼─────┼─────┼─────┤ * │Sink │Vol -│ Mut │Eject│Vol +│ Volume control * ┌─────┼─────┼─────┼─────┴─────┴─────┘ * │OledL│Veloc│Music│ Feature control on keyboard * └─────┴─────┴─────┘ */ #define _ME1_5_ RGB_SPI,RGB_MOD,RGB_HUI,RGB_SAI,RGB_VAI #define _ME2_5_ RGB_TOG,KC_MPRV,KC_MPLY,KC_MSTP,KC_MNXT #define _ME3_5_ KC_F13, KC_VOLD,KC_MUTE,KC_EJCT,KC_VOLU #define _ME4_3_ BB_OLED,VLK_TOG,MU_TOG /* Navigation layer * ┌─────┬─────┬─────┬─────┬─────┐ * │Redo │Paste│Yank │ Cut │PrScr│ * ├─────┼─────┼─────┼─────┼─────┤ * │Undo │ < │ v │ ^ │ > │ * ├─────┼─────┼─────┼─────┼─────┤ * │ Ins │Home │PgDwn│PgUp │ End │ * ┌─────┼─────┼─────┼─────┴─────┴─────┘ * │Enter│ Esc │BkSpc│ * └─────┴─────┴─────┘ */ #define _NA1_5_ BB_REDO,BB_PSTE,BB_YANK,BB_CUT, KC_PSCR #define _NA2_5_ BB_UNDO,KC_LEFT,KC_DOWN,KC_UP, KC_RGHT #define _NA3_5_ KC_INS, KC_HOME,KC_PGDN,KC_PGUP,KC_END #define _NA4_3_ KC_ENT, KC_ESC, KC_BSPC /* Symbols layer * ,------------------------------------------------------------------------. * | OFF | ` | ~ | [ | ] | { || } | - | _ | = | + | | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | \ | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | | ! | @ | # | $ | % || ^ | & | * | ( | ) | LCK | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | | | | | | | || | | | | | | * `------------------------------------------------------------------------' */ #define NUMBERS \ K_NUMBR,KC_GRV, KC_TILD,KC_LBRC,KC_RBRC,KC_LCBR,KC_RCBR,KC_MINS,KC_UNDS,KC_EQL, KC_PLUS,_______, \ _______,KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, \ _______,KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,K_LOCK , \ KC_PIPE,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______ * This layer has the central columns shifted for convenience * DVORAK * ┌─────┬─────┬─────┬─────┬─────┐ * │ ` │ { │ } │ / │ = │ * ├─────┼─────┼─────┼─────┼─────┤ * │ ~ │ [ │ ] │ ? │ + │ * ├─────┼─────┼─────┼─────┼─────┤ * │CapsL│ ( │ ) │ \ │ | │ * ┌─────┼─────┼─────┼─────┴─────┴─────┘ * │Enter│ Esc │BkSpc│ * └─────┴─────┴─────┘ * Turkish F * (AltGr is right on the central column, red. keys on main layer are omitted) * ┌─────┬─────┬─────┬─────┬─────┐ * │ + ¬ │ / \ │ - | │ │ │ * ├─────┼─────┼─────┼─────┼─────┤ * │ * ± │ ? ¿ │ _ │ │ │ * ├─────┼─────┼─────┼─────┼─────┤ * │CapsL│ │ │ │ │ * ┌─────┼─────┼─────┼─────┴─────┴─────┘ * │Enter│ Esc │BkSpc│ * └─────┴─────┴─────┘ * QWERTY * ┌─────┬─────┬─────┬─────┬─────┐ * │ ` │ - │ = │ { │ } │ * ├─────┼─────┼─────┼─────┼─────┤ * │ ~ │ _ │ + │ [ │ ] │ * ├─────┼─────┼─────┼─────┼─────┤ * │CapsL│ ( │ ) │ \ │ | │ * ┌─────┼─────┼─────┼─────┴─────┴─────┘ * │Enter│ Esc │BkSpc│ * └─────┴─────┴─────┘ */ #define _SY1_5_ DV_GRV, DV_LCBR,DV_RCBR,DV_SLSH,DV_EQL #define _SY2_5_ DV_TILD,DV_LBRC,DV_RBRC,DV_QUES,DV_PLUS #define _SY3_5_ KC_CAPS,DV_LPRN,DV_RPRN,DV_BSLS,DV_PIPE #define _SY4_3_ KC_ENT, KC_ESC, KC_BSPC /* Settings layer * ,------------------------------------------------------------------------. * |BLLed| F1 | F2 | F3 | F4 | Lin || Win | Wake| |Hue -|Hue +|Reset| * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | | F5 | F6 | F7 | F8 | || | |RGBto|Sat -|Sat +| | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | Game| F9 | F10 | F11 | F12 |Vol 0||PrtSc| |RGBan|Bri -|Bri +| | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * |Musir| | | | |Vol -||Vol +| Prev| Stop|TogMu| Next| | * `------------------------------------------------------------------------' */ #define SETTINGS \ BL_STEP,KC_F1, KC_F2, KC_F3, KC_F4, UNI_LI, UNI_WN, KC_WAKE,_______,RGB_HUD,RGB_HUI,RESET , \ _______,KC_F5, KC_F6, KC_F7, KC_F8, _______,_______,_______,RGB_TOG,RGB_SAD,RGB_SAI,_______, \ K_GAMES,KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE,KC_PSCR,_______,RGB_MOD,RGB_VAD,RGB_VAI,_______, \ MU_TOG, _______,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MPRV,KC_MSTP,KC_MPLY,KC_MNXT,_______ /* Numbers layer * This layer contains numbers and the associated symbols. * DVORAK * ┌─────┬─────┬─────┬─────┬─────┐ * │ < │ 7 & │ 8 * │ 9 ( │ 0 ) │ * ├─────┼─────┼─────┼─────┼─────┤ * │ _ │ 4 $ │ 5 % │ 6 ^ │ - │ * ├─────┼─────┼─────┼─────┼─────┤ * │ > │ 1 ! │ 2 @ │ 3 # │Char.│ * └─────┴─────┴─────┼─────┼─────┼─────┐ * │ Del │ Tab │Space│ * └─────┴─────┴─────┘ * Turkish F * ┌─────┬─────┬─────┬─────┬─────┐ * │ < | │{7 ' │[8 ( │]9 )±│}0 =°│ * ├─────┼─────┼─────┼─────┼─────┤ * │ │¼4 $ │½5 %⅜│¾6 & │ │ * ├─────┼─────┼─────┼─────┼─────┤ * │ > ¦ │¹1 !¡│²2 " │#3 ^³│Char.│ * └─────┴─────┴─────┼─────┼─────┼─────┐ * │ Del │ Tab │Space│ * └─────┴─────┴─────┘ */ #define _NU1_5_ KC_NUBS,KC_7, KC_8, KC_9, KC_0 #define _NU2_5_ DV_UNDS,KC_4, KC_5, KC_6, DV_MINS #define _NU3_5_ LSFT(KC_NUBS), KC_1, KC_2, KC_3, BB_CHAR #define _NU4_3_ KC_DEL, KC_TAB, KC_SPC /* Function layer * ┌─────┬─────┬─────┬─────┬─────┐ * │ F01 │ F02 │ F03 │ F04 │EEPRM│ * ├─────┼─────┼─────┼─────┼─────┤ * │ F05 │ F06 │ F07 │ F08 │EEPRM│ * ├─────┼─────┼─────┼─────┼─────┤ * │ F09 │ F10 │ F11 │ F12 │GameL│ * └─────┴─────┴─────┼─────┼─────┼─────┐ * │ Del │ Tab │Space│ * └─────┴─────┴─────┘ */ #define _FU1_5_ KC_F1, KC_F2, KC_F3, KC_F4, RESET #define _FU2_5_ KC_F5, KC_F6, KC_F7, KC_F8, EEP_RST #define _FU3_5_ KC_F9, KC_F10, KC_F11, KC_F12, BB_GAME #define _FU4_3_ KC_DEL, KC_TAB, KC_SPC /* Mouse layer * ,------------------------------------------------------------------------. * |Ulock| \ | ^ | / |.....|.....||.....|.....| |\|.| |^| | |/|.| | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | | < | Mid | > |Btn 4|.....||.....|Btn 5| <-- | Mid | --> | | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | | / | v | \ |.....|.....||.....|.....| |/| | |v| | |\| | LCK | * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | | | | | | Left||Right| | |Accl0|Accl1|Accl2| * `------------------------------------------------------------------------' */ #define MOUSE \ K_MOUSE,MO_NW, MO_N, MO_NE, XXX, XXX ,XXX, XXX, MO_S_NW,MO_S_N, MO_S_NE,_______, \ _______,MO_W, MO_CL_M,MO_E, MO_CL_4,XXX ,XXX, MO_CL_5,MO_S_W, MO_CL_M,MO_S_E, _______, \ _______,MO_SW, MO_S, MO_SE, XXX, XXX ,XXX, XXX, MO_S_SW,MO_S_S, MO_S_SE,K_LOCK , \ _______,_______,_______,_______,_______,MO_CL_L,MO_CL_R,_______,MO_AC_0,MO_AC_1,MO_AC_2,_______ * ┌─────┬─────┬─────┬─────┬─────┐ * │Slow │Right│ Mid │ Lft │Fast │ * ├─────┼─────┼─────┼─────┼─────┤ * │ |<| │ |v| │ |^| │ |>| │ Bt4 │ * ├─────┼─────┼─────┼─────┼─────┤ * │ <<< │ vvv │ ^^^ │ >>> │ Bt5 │ * └─────┴─────┴─────┼─────┼─────┼─────┐ * │ Del │ Tab │Space│ * └─────┴─────┴─────┘ */ #define _MO1_5_ KC_ACL0,KC_BTN1,KC_BTN2,KC_BTN3,KC_ACL2 #define _MO2_5_ KC_MS_L,KC_MS_D,KC_MS_U,KC_MS_R,KC_BTN4 #define _MO3_5_ KC_WH_L,KC_WH_D,KC_WH_U,KC_WH_R,KC_BTN5 #define _MO4_3_ KC_DEL, KC_TAB, KC_SPC /* Music layer * ,------------------------------------------------------------------------. * |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....| * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....| * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....| * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| * | togg| rec | stop| play| slow| fast||modes|.....|.....|.....|.....|.....| * `------------------------------------------------------------------------' * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ * │ │ │ │ │ │ │ │ │ │ │ │ │ * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ * │ │ │ │ │ │ │ │ │ │ │ │ │ * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ * │ │ │ │ │ │ │ │ │ │ │ │ │ * └───┴───┴───┼───┼───┼───┼───┼───┼───┼───┴───┴───┘ * │Rec│Stp│Ply│Tmp│Mod│Off│ * └───┴───┴───┴───┴───┴───┘ */ #define MUSIC \ MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \ MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \ MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \ MU_TOG, MU_REC, MU_STOP,MU_PLAY,MU_SLOW,MU_FAST,MU_MOD, MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK #endif #define _MUL_3_ MU_REC, MU_STOP,MU_PLAY #define _MUR_3_ MU_TEMP,MU_MOD, MU_TOG #define _MU_01_ MU_MASK #define _MU_02_ MU_MASK,MU_MASK #define _MU_03_ MU_MASK,MU_MASK,MU_MASK #define _MU_06_ MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK #define _MU_08_ MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK #define _MU_10_ MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK #define _MU_12_ MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK
M users/bbaserdem/config.h => users/bbaserdem/config.h +131 -6
@@ 1,9 1,134 @@ #ifndef USERSPACE_CONFIG_H #define USERSPACE_CONFIG_H /* Copyright 2021 Batuhan Başerdem * <baserdem.batuhan@gmail.com> @bbaserdem * * 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 <http://www.gnu.org/licenses/>. */ #pragma once #ifdef TAP_DANCE_ENABLE #define TAPPING_TERM 300 #define TAPPING_TOGGLE 1 /* CONFIG * Common hardware configuration accross my boards */ // Space saving #ifdef LOCKING_SUPPORT_ENABLE # undef LOCKING_SUPPORT_ENABLE #endif #ifdef LOCKING_RESYNC_ENABLE # undef LOCKING_RESYNC_ENABLE #endif #ifndef NO_DEBUG # define NO_DEBUG #endif #if !defined(NO_PRINT) && !defined(CONSOLE_ENABLE) # define NO_PRINT #endif // Some of my own settings # define HOUSEKEEPING_THROTTLE_INTERVAL_MS 250 // Split transport settings #ifdef SPLIT_KEYBOARD # define SPLIT_TRANSPORT_MIRROR # define SPLIT_LAYER_STATE_ENABLE # define SPLIT_MODS_ENABLE # define SPLIT_TRANSACTION_IDS_USER RPC_ID_CONFIG_SYNC, RPC_ID_RUNTIME_SYNC, RPC_ID_KEYMAP_SYNC # define SPLIT_LED_STATE_ENABLE # ifdef WPM_ENABLE # define SPLIT_WPM_ENABLE # endif // WPM_ENABLE # ifdef OLED_ENABLE # define SPLIT_OLED_ENABLE # endif // OLED_ENABLE #endif // SPLIT_KEYBOARD // Unicode entry mode #ifdef UNICODEMAP_ENABLE # define UNICODE_SELECTED_MODES UC_LNX // Adapt the unicode entry mode to dvorak # ifdef UNICODE_KEY_LNX # undef UNICODE_KEY_LNX # endif # define UNICODE_KEY_LNX LCTL(LSFT(KC_F)) #endif // UNICODEMAP_ENABLE // Mousekey mode #ifdef MOUSEKEY_ENABLE # define MK_COMBINED #endif // MOUSEKEY_ENABLE // Tap-hold settings #define TAPPING_TERM 200 #define TAP_CODE_DELAY 20 #define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD #define TAPPING_FORCE_HOLD // Backlight settings #ifdef BACKLIGHT_ENABLE # define BACKLIGHT_BREATHING # define BREATHING_PERIOD 5 #endif // BACKLIGHT_ENABLE // Audio definitions #ifdef AUDIO_ENABLE //# define AUDIO_ENABLE_TONE_MULTIPLEXING // Make findable songs as defaults # ifdef HOROLOGY # define STARTUP_SONG SONG(HOROLOGY) # endif # ifdef PEOPLE_VULTURES # define GOODBYE_SONG SONG(PEOPLE_VULTURES) # endif # ifdef NONAGON_INFINITY # define MUSIC_ON_SONG SONG(NONAGON_INFINITY) # endif # ifdef WAH_WAH # define MUSIC_OFF_SONG SONG(WAH_WAH) # endif // Audio code expects these to be defined # ifdef BIG_FIG_WASP # define GAME_ON_SONG SONG(BIG_FIG_WASP) # else # define GAME_ON_SONG SONG(USSR_ANTHEM) # endif # ifdef POLYGONDWANALAND # define GAME_OFF_SONG SONG(POLYGONDWANALAND) # else # define GAME_OFF_SONG SONG(NOCTURNE_OP_9_NO_1) # endif #endif // AUDIO_ENABLE // OLED definitions #ifdef OLED_ENABLE // Timeout does not work for split secondary board; i implemented it myself # define OLED_TIMEOUT 30000 // Fade out the screen when timing out # define OLED_FADE_OUT # define OLED_FADE_OUT_INTERVAL 15 #endif // OLED_ENABLE #endif // !USERSPACE_CONFIG_H // For perkey leds #ifdef RGB_MATRIX_ENABLE // This is not working //# define RGB_DISABLE_TIMEOUT 1800000 # define RGB_DISABLE_WHEN_USB_SUSPENDED true // Start using this mode # define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_RAINBOW_BEACON # define RGB_MATRIX_STARTUP_HUE 100 # define RGB_MATRIX_STARTUP_SAT 255 # define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Some config options # define RGB_MATRIX_KEYRELEASES # define RGB_MATRIX_FRAMEBUFFER_EFFECTS // Enable framebuffer effects #endif // RGB_MATRIX_ENABLE
A users/bbaserdem/keymap-bitmaps/.gitignore => users/bbaserdem/keymap-bitmaps/.gitignore +4 -0
A users/bbaserdem/keymap-bitmaps/cropBmp => users/bbaserdem/keymap-bitmaps/cropBmp +38 -0
@@ 0,0 1,38 @@ #!/bin/bash # Copyright 2021 Batuhan Başerdem # <baserdem.batuhan@gmail.com> @bbaserdem # # 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 <http://www.gnu.org/licenses/>. # Goes through all the files and turns them into strips in their respective folder if [ -z "${1}" ] ; then echo 'No argument; defaulting to script directory.' target_dir="$(dirname "${0}")" elif [ -d "${1}" ] ; then echo "Targeting files in '${1}'." target_dir="${1}" else echo 'Argument is not directory.' exit 1 fi output_dir="${target_dir}/splitImages" mkdir -p "${output_dir}" for this_image in "${target_dir}/"*.bmp ; do echo "Found '${this_image}'." this_name="$(basename "${this_image%%.bmp}")" convert "${this_image}" -crop 'x8' "${output_dir}/${this_name}"_%d.bmp done
A users/bbaserdem/readme.md => users/bbaserdem/readme.md +131 -0
@@ 0,0 1,131 @@ # BBASERDEM userspace code for qmk My userspace code for my various keyboards; available here. ## Builds These are my keyboard builds and info, it allows me to plan out my builds. ### Planck SERVER * Board: `kprepublic/jj40` * Microcontroller: Embedded * Layout: `ortho_4x12` * Functionality: Underglow RGB Lighting, LED diode lighting. * Case: Clear Acrylic Top and Bottow, with Frosted Acrylic Diffuser (Smashing Acrylics) * Switches: BOX Navy * Keycaps: Datamancer Tall Deco Typewriter Keycaps Just a decorative planck replacement (for my rev4 PCB that died.) ### Planck Light * Board: `planck/light` * Microcontroller: Embedded * Layout: `ortho_4x12` * Functionality: Per-key RGB Lighting, Audio. * Case: Clear Acrylic Top and Bottow, with Frosted Acrylic Diffuser (Smashing Acrylics) * Switches: BOX Navy * Keycaps: Datamancer Tall Deco Typewriter Keycaps Just a decorative planck replacement (for my rev4 PCB that died.) ### Corne ARM * Board: `crkbd/rev1` * Microcontroller: Proton C (x2) * Layout: `split_3x6_3` * Functionality: OLED, Audio, Per-key RGB Lighting, Rotary Encoder (x2) * Case: IMK Corne Case v2 Polycarbonate * Switches: Healios V2 * Keycaps: POM Jelly PCB is actually [Proton-C Compatible crkbd PCB](https://github.com/ItsWaffIe/waffle_corne). ### Corne Lite * Board: `crkbd/rev1` * Microcontroller: Pro Micro (x2) * Layout: `split_3x5_3` * Functionality: Per-key RGB Lighting, OLED (No firmware space) * Case: Custom * Switches: Choc Low Burnt Orange * Keycaps: [Scooped Choc Keycaps](https://mkultra.click/collections/keycaps/products/scooped-choc-keycaps?variant=31223543365730) Maybe try adding a trackpad for this, as detailed [here](https://github.com/manna-harbour/crkbd/blob/master/trackpoint/readme.org). ### Kyria * Board: `splitkb/kyria/rev1` * Microcontroller: Pro Micro (x2) * Layout: `split_3x6_6` * Functionality: OLED, Underglow RGB Lighting (No firmware space), Rotary Encoder (x2) * Case: Matte Black Acrylic High-Profile case * Switches: Gateron Ink Silent Black * Keycaps: Oblotzky SA Oblivion Main driver at work currently; love the switches and the board layout. # Firmware building ## Archlinux On archlinux, the package *arm-none-eabi-gcc* is too new. To fix; add to the environment `CFLAGS="-Wno-error=deprecated"` to compilation commands. Also; says to run `avr-gcc` version `8.4.0` for smaller firmware, but I find that it only saves a few bytes. ## Bootloader Needed to type this out from the QMK website. If I want to flash a new bootloader for a machine; here are steps; 1. Flash the util/pro_micro_ISP_B6_10.hex to a spare promicro using; `avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:pro_micro_ISP_B6_10.hex` 2. Wire the pins; (first is the ISP pro micro; second is the target) ``` Pro Micro 10 (B6) <-> Keyboard RESET Pro Micro 15 (B1) <-> Keyboard B1 (SCLK) Pro Micro 16 (B2) <-> Keyboard B2 (MOSI) Pro Micro 14 (B3) <-> Keyboard B3 (MISO) Pro Micro VCC <-> Keyboard VCC Pro Micro GND <-> Keyboard GND ``` I do have this on hand I believe; from massdrop's planck light firmware updater. 3. Connect the flashed pro micro to my computer and run `avrdude -c avrisp -P "$(ls /dev/ttyACM*)" -p atmega32u4 -U flash:w:bootloader_atmega32u4_1.0.0.hex:i -U lfuse:w:0x5E:m -U hfuse:w:0xD9:m -U efuse:w:0xC3:m` The avrisp here refers to the firmware on the ISP flasher pro micro. The `atmega32u4` refers to the CPU used in the respective breakout boards. The `avrdude` command interacts with catalina bootloader. The shell call after the `-P` flag auto finds the port that the pro micro connects to. The last few arguments are some jumpers apparently. # Features My userspace has a lot of shared code between different keyboards. These files are prefixed with `sbp-` to remove any naming clash. * [bb-audio](bb-audio.c): Code dealing with audio playback using onboard sound. * [bb-encoder](bb-encoder.c): Rotary encoder sutff. * [bb-macro](bb-macro.c): My custom keycodes; macros, tap dances, etc. * [bb-oled](bb-oled.c): Controls OLED displays. For higher memory; there is also [bb-oled-extra](bb-oled-extra.c). * [bb-rgb](bb-rgb.c): Controls per-key RGB LED matrix stuff, and layer indication. Uses `RGB_MATRIX`. * [bb-underglaw](bb-underglow.c): Controls RGB LED strip, and layer indication. Uses `RGBLIGHT`. # Layout My personal layout is mostly inspired by the [Miryoku layout](../manna-harbour_miryoku/miryoku.org). There are some changes to make it friendlier to international keyboards. My board is compatible with software implementation of Dvorak and Turkish F. ## Base Base layer uses tap-hold functionality to have access to modifiers. The modifiers are mirrored on each half of the layout; as to make those modifiers accessible to the keys that overlap them. Besides the Alt key; each side has the proper L/R version of the modifier. Since Right Alt key functions as AltGr key; both the L and R versions are available on each side.
M users/bbaserdem/rules.mk => users/bbaserdem/rules.mk +83 -17
@@ 1,21 1,87 @@ # Copyright 2021 Batuhan Başerdem # <baserdem.batuhan@gmail.com> @bbaserdem # # 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 <http://www.gnu.org/licenses/>. # Common compilation flags LTO_ENABLE = yes # These should be enabled in all boards MOUSEKEY_ENABLE = yes # Mouse emulation keys EXTRAKEY_ENABLE = yes # OS signals like volume control UNICODEMAP_ENABLE = yes # Used for unicode character emulation # These should be disabled in all boards BOOTMAGIC_ENABLE = no # Access to EEPROM settings, not needed CONSOLE_ENABLE = no # Allows console output with a command COMMAND_ENABLE = no # Some bootmagic thing i dont use SLEEP_LED_ENABLE = no # Breathes LED's when computer is asleep. Untested. MIDI_ENABLE = no # Midi driver (untested) UNICODE_ENABLE = no # We use unicodemap, not unicode UCIS_ENABLE = no # We use unicodemap, not ucis VARIABLE_TRACE = no # Allows debugging variables KEY_LOCK_ENABLE = no # Allows locking any key. Not used in general RGBLIGHT_ENABLE = no # LED strip, but there is RGB_MATRIX instead TAP_DANCE_ENABLE = no # Tap dance keys; i don't use tap dance # These features can be disabled at whim NKRO_ENABLE ?= yes # Default is 6KRO VELOCIKEY_ENABLE ?= yes # Speed effects change with typing speed WPM_ENABLE ?= yes # Get WPM reports as you type # Manually configure these on each keyboard individually # AUDIO_ENABLE # Audio stuff # BACKLIGHT_ENABLE # Switch LEDs # ENCODER_ENABLE # Rotary encoder # RGB_MATRIX_ENABLE # RGB LEDs # OLED_ENABLE # For OLED # Userspace code SRC += bbaserdem.c EXTRAFLAGS += -flto # Used to make code smaller # ENABLE UNICODE_ENABLE = yes # Used for unicode character emulation EXTRAKEY_ENABLE = yes # OS signals like volume control # Macros SRC += bb-macro.c # Audio code ifeq ($(strip $(AUDIO_ENABLE)), yes) SRC += bb-audio.c endif # Rotary encoder stuff ifeq ($(strip $(ENCODER_ENABLE)), yes) SRC += bb-encoder.c endif # RGB LED (Underglow) code ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) SRC += bb-underglow.c endif # RGB LED (Perkey) code ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) SRC += bb-rgb.c endif # Backlight code ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) SRC += bb-backlight.c endif # DISABLE ifndef BLUETOOTH_ENABLE BLUETOOTH_ENABLE = no # No bluetooth # OLED code ifeq ($(strip $(OLED_ENABLE)), yes) SRC += bb-oled.c ifeq ($(strip $(CTPC)), yes) SRC += bb-oled-extra.c endif endif COMMAND_ENABLE = no # Some bootmagic thing i dont use BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite CONSOLE_ENABLE = no # Allows console output with a command SLEEP_LED_ENABLE = no # Breathes LED's when computer is asleep. Untested. NKRO_ENABLE = no # Default is 6KRO which is plenty MIDI_ENABLE = no # Untested feature KEY_LOCK_ENABLE = no # Allows locking any key. Not used # Disabling this makes it compile, i dont know why # VARIABLE_TRACE = no # Allows debugging variables