~ruther/qmk_firmware

428114fac25dedadfff9fceaf98f3ecd196a469d — Joel Challis 2 years ago 4f3af09
Remove broken userspace and keymaps (#18806)

48 files changed, 0 insertions(+), 4810 deletions(-)

D keyboards/splitkb/kyria/keymaps/bbaserdem/config.h
D keyboards/splitkb/kyria/keymaps/bbaserdem/keymap.c
D keyboards/splitkb/kyria/keymaps/bbaserdem/readme.md
D keyboards/splitkb/kyria/keymaps/bbaserdem/rules.mk
D layouts/community/ortho_3x10/bbaserdem/config.h
D layouts/community/ortho_3x10/bbaserdem/keymap.c
D layouts/community/ortho_3x10/bbaserdem/readme.md
D layouts/community/ortho_3x10/bbaserdem/rules.mk
D layouts/community/ortho_4x12/bbaserdem/config.h
D layouts/community/ortho_4x12/bbaserdem/keymap.c
D layouts/community/ortho_4x12/bbaserdem/readme.md
D layouts/community/ortho_4x12/bbaserdem/rules.mk
D layouts/community/split_3x5_3/bbaserdem/config.h
D layouts/community/split_3x5_3/bbaserdem/keymap.c
D layouts/community/split_3x5_3/bbaserdem/readme.md
D layouts/community/split_3x5_3/bbaserdem/rules.mk
D layouts/community/split_3x6_3/bbaserdem/chconf.h
D layouts/community/split_3x6_3/bbaserdem/config.h
D layouts/community/split_3x6_3/bbaserdem/halconf.h
D layouts/community/split_3x6_3/bbaserdem/keymap.c
D layouts/community/split_3x6_3/bbaserdem/mcuconf.h
D layouts/community/split_3x6_3/bbaserdem/readme.md
D layouts/community/split_3x6_3/bbaserdem/rules.mk
D layouts/community/split_3x6_3/bbaserdem/ssd1306.c
D users/bbaserdem/.gitignore
D users/bbaserdem/bb-audio.c
D users/bbaserdem/bb-audio.h
D users/bbaserdem/bb-backlight.c
D users/bbaserdem/bb-backlight.h
D users/bbaserdem/bb-encoder.c
D users/bbaserdem/bb-encoder.h
D users/bbaserdem/bb-macro.c
D users/bbaserdem/bb-macro.h
D users/bbaserdem/bb-oled-extra.c
D users/bbaserdem/bb-oled-extra.h
D users/bbaserdem/bb-oled.c
D users/bbaserdem/bb-oled.h
D users/bbaserdem/bb-rgb.c
D users/bbaserdem/bb-rgb.h
D users/bbaserdem/bb-underglow.c
D users/bbaserdem/bb-underglow.h
D users/bbaserdem/bbaserdem.c
D users/bbaserdem/bbaserdem.h
D users/bbaserdem/config.h
D users/bbaserdem/keymap-bitmaps/.gitignore
D users/bbaserdem/keymap-bitmaps/cropBmp
D users/bbaserdem/readme.md
D users/bbaserdem/rules.mk
D keyboards/splitkb/kyria/keymaps/bbaserdem/config.h => keyboards/splitkb/kyria/keymaps/bbaserdem/config.h +0 -32
@@ 1,32 0,0 @@
/* 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

D keyboards/splitkb/kyria/keymaps/bbaserdem/keymap.c => keyboards/splitkb/kyria/keymaps/bbaserdem/keymap.c +0 -109
@@ 1,109 0,0 @@
/* 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

D keyboards/splitkb/kyria/keymaps/bbaserdem/readme.md => keyboards/splitkb/kyria/keymaps/bbaserdem/readme.md +0 -32
@@ 1,32 0,0 @@
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.

D keyboards/splitkb/kyria/keymaps/bbaserdem/rules.mk => keyboards/splitkb/kyria/keymaps/bbaserdem/rules.mk +0 -30
@@ 1,30 0,0 @@
# 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

D layouts/community/ortho_3x10/bbaserdem/config.h => layouts/community/ortho_3x10/bbaserdem/config.h +0 -21
@@ 1,21 0,0 @@
/*
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 RGB_MATRIX_LED_COUNT 10
#endif

D layouts/community/ortho_3x10/bbaserdem/keymap.c => layouts/community/ortho_3x10/bbaserdem/keymap.c +0 -98
@@ 1,98 0,0 @@
/*
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,EE_CLR,QK_BOOT
    ),
    [_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

D layouts/community/ortho_3x10/bbaserdem/readme.md => layouts/community/ortho_3x10/bbaserdem/readme.md +0 -19
@@ 1,19 0,0 @@
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>`

D layouts/community/ortho_3x10/bbaserdem/rules.mk => layouts/community/ortho_3x10/bbaserdem/rules.mk +0 -23
@@ 1,23 0,0 @@
# 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

D layouts/community/ortho_4x12/bbaserdem/config.h => layouts/community/ortho_4x12/bbaserdem/config.h +0 -26
@@ 1,26 0,0 @@
/* 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

D layouts/community/ortho_4x12/bbaserdem/keymap.c => layouts/community/ortho_4x12/bbaserdem/keymap.c +0 -88
@@ 1,88 0,0 @@
/* 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___)
};

D layouts/community/ortho_4x12/bbaserdem/readme.md => layouts/community/ortho_4x12/bbaserdem/readme.md +0 -12
@@ 1,12 0,0 @@
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.

D layouts/community/ortho_4x12/bbaserdem/rules.mk => layouts/community/ortho_4x12/bbaserdem/rules.mk +0 -26
@@ 1,26 0,0 @@

# 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

D layouts/community/split_3x5_3/bbaserdem/config.h => layouts/community/split_3x5_3/bbaserdem/config.h +0 -35
@@ 1,35 0,0 @@

/* 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 RGB_MATRIX_LED_COUNT
#   undef RGB_MATRIX_LED_COUNT
#   endif
#   define RGBLED_NUM 48
#   define RGB_MATRIX_LED_COUNT RGBLED_NUM
#endif // KEYBOARD_crkbd_rev1

D layouts/community/split_3x5_3/bbaserdem/keymap.c => layouts/community/split_3x5_3/bbaserdem/keymap.c +0 -117
@@ 1,117 0,0 @@
/* 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

D layouts/community/split_3x5_3/bbaserdem/readme.md => layouts/community/split_3x5_3/bbaserdem/readme.md +0 -18
@@ 1,18 0,0 @@
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
```


D layouts/community/split_3x5_3/bbaserdem/rules.mk => layouts/community/split_3x5_3/bbaserdem/rules.mk +0 -22
@@ 1,22 0,0 @@
# 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

D layouts/community/split_3x6_3/bbaserdem/chconf.h => layouts/community/split_3x6_3/bbaserdem/chconf.h +0 -23
@@ 1,23 0,0 @@
/* 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

D layouts/community/split_3x6_3/bbaserdem/config.h => layouts/community/split_3x6_3/bbaserdem/config.h +0 -77
@@ 1,77 0,0 @@
/* 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

D layouts/community/split_3x6_3/bbaserdem/halconf.h => layouts/community/split_3x6_3/bbaserdem/halconf.h +0 -24
@@ 1,24 0,0 @@
/* 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

D layouts/community/split_3x6_3/bbaserdem/keymap.c => layouts/community/split_3x6_3/bbaserdem/keymap.c +0 -191
@@ 1,191 0,0 @@
/* 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

D layouts/community/split_3x6_3/bbaserdem/mcuconf.h => layouts/community/split_3x6_3/bbaserdem/mcuconf.h +0 -25
@@ 1,25 0,0 @@
/* 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

D layouts/community/split_3x6_3/bbaserdem/readme.md => layouts/community/split_3x6_3/bbaserdem/readme.md +0 -15
@@ 1,15 0,0 @@
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}`

D layouts/community/split_3x6_3/bbaserdem/rules.mk => layouts/community/split_3x6_3/bbaserdem/rules.mk +0 -47
@@ 1,47 0,0 @@
# 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

D layouts/community/split_3x6_3/bbaserdem/ssd1306.c => layouts/community/split_3x6_3/bbaserdem/ssd1306.c +0 -16
@@ 1,16 0,0 @@
/* 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/>.
 */

D users/bbaserdem/.gitignore => users/bbaserdem/.gitignore +0 -2
@@ 1,2 0,0 @@
/secrets.h
/secrets.c

D users/bbaserdem/bb-audio.c => users/bbaserdem/bb-audio.c +0 -82
@@ 1,82 0,0 @@
/* 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;
}

D users/bbaserdem/bb-audio.h => users/bbaserdem/bb-audio.h +0 -28
@@ 1,28 0,0 @@
/* 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);

D users/bbaserdem/bb-backlight.c => users/bbaserdem/bb-backlight.c +0 -30
@@ 1,30 0,0 @@
/* 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
}

D users/bbaserdem/bb-backlight.h => users/bbaserdem/bb-backlight.h +0 -23
@@ 1,23 0,0 @@
/* 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);

D users/bbaserdem/bb-encoder.c => users/bbaserdem/bb-encoder.c +0 -514
@@ 1,514 0,0 @@
/* 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

D users/bbaserdem/bb-encoder.h => users/bbaserdem/bb-encoder.h +0 -29
@@ 1,29 0,0 @@
/* 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);

D users/bbaserdem/bb-macro.c => users/bbaserdem/bb-macro.c +0 -156
@@ 1,156 0,0 @@
/* 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_CAPS_LOCK:
            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;
}

D users/bbaserdem/bb-macro.h => users/bbaserdem/bb-macro.h +0 -113
@@ 1,113 0,0 @@
/* 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

D users/bbaserdem/bb-oled-extra.c => users/bbaserdem/bb-oled-extra.c +0 -796
@@ 1,796 0,0 @@
/* 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);
}

D users/bbaserdem/bb-oled-extra.h => users/bbaserdem/bb-oled-extra.h +0 -25
@@ 1,25 0,0 @@
/* 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);

D users/bbaserdem/bb-oled.c => users/bbaserdem/bb-oled.c +0 -216
@@ 1,216 0,0 @@
/* 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
}

D users/bbaserdem/bb-oled.h => users/bbaserdem/bb-oled.h +0 -32
@@ 1,32 0,0 @@
/* 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);

D users/bbaserdem/bb-rgb.c => users/bbaserdem/bb-rgb.c +0 -123
@@ 1,123 0,0 @@
/* 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
bool 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 false;
    }
    // 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);
    return false;
}

// 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);}
}

D users/bbaserdem/bb-rgb.h => users/bbaserdem/bb-rgb.h +0 -28
@@ 1,28 0,0 @@
/* 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
bool 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);

D users/bbaserdem/bb-underglow.c => users/bbaserdem/bb-underglow.c +0 -116
@@ 1,116 0,0 @@
/* 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);
}

D users/bbaserdem/bb-underglow.h => users/bbaserdem/bb-underglow.h +0 -28
@@ 1,28 0,0 @@
/* 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);

D users/bbaserdem/bbaserdem.c => users/bbaserdem/bbaserdem.c +0 -376
@@ 1,376 0,0 @@
/* 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 "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
}
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
}

// 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;
    }
}

// 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;
        }

        // 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));
        }

        // 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

/*---------------------------*\
|*-----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
    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);

    // Unicode mode
#   ifdef UNICODEMAP_ENABLE
    set_unicode_input_mode(UC_LNX);
#   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();
}

/*---------------------------*\
|*-----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();
    }

    // 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 scan function
    matrix_scan_keymap();
}

/*---------------------*\
|*-----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

    return state;
}

/*-----------------------------*\
|*-----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;
}

/*------------------------*\
|*-----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);
}

/*-----------------*\
|*-----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
}

<<<<<<< HEAD
    state = layer_state_set_keymap (state);
#ifdef RGBLIGHT_ENABLE
    // Change RGB lighting depending on the last layer activated
    rgblight_change( get_highest_layer(state) );
#endif
    return state;
||||||| f439fe6055
    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();
>>>>>>> upstream/master
}

D users/bbaserdem/bbaserdem.h => users/bbaserdem/bbaserdem.h +0 -573
@@ 1,573 0,0 @@
/* 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;

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;

// Broadcast us to everyone else
extern userspace_runtime_t  userspace_runtime;
extern userspace_config_t   userspace_config;

// 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);

// 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 PLACEHOLDER_SAFE_RANGE SAFE_RANGE
#endif

// 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_FAST KC_UP
#define MU_SLOW KC_DOWN
#define MU_MASK KC_A
#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_FAST KC_NO
#define MU_TEMP KC_NO
#define MU_SLOW KC_NO
#define MU_MASK KC_NO
#define BB_SND  KC_MUTE
#endif // AUDIO_ENABLE

// 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

// 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)

// 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)

/* 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.
 */

/* 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

/* 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
 * 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
 *  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

/* 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,  EE_CLR
#define _FU3_5_ KC_F9,  KC_F10, KC_F11, KC_F12, BB_GAME
#define _FU4_3_ KC_DEL, KC_TAB, KC_SPC

/* Mouse layer
 * ┌─────┬─────┬─────┬─────┬─────┐
 * │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
 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
 * │   │   │   │   │   │   │   │   │   │   │   │   │
 * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
 * │   │   │   │   │   │   │   │   │   │   │   │   │
 * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
 * │   │   │   │   │   │   │   │   │   │   │   │   │
 * └───┴───┴───┼───┼───┼───┼───┼───┼───┼───┴───┴───┘
 *             │Rec│Stp│Ply│Tmp│Mod│Off│
 *             └───┴───┴───┴───┴───┴───┘
 */
#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

D users/bbaserdem/config.h => users/bbaserdem/config.h +0 -134
@@ 1,134 0,0 @@
/* 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

/* 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

// For perkey leds
#ifdef RGB_MATRIX_ENABLE
// This is not working
//#   define RGB_MATRIX_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

D users/bbaserdem/keymap-bitmaps/.gitignore => users/bbaserdem/keymap-bitmaps/.gitignore +0 -4
@@ 1,4 0,0 @@
*.bmp
splitImages
templates
!.gitignore

D users/bbaserdem/keymap-bitmaps/cropBmp => users/bbaserdem/keymap-bitmaps/cropBmp +0 -38
@@ 1,38 0,0 @@
#!/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

D users/bbaserdem/readme.md => users/bbaserdem/readme.md +0 -131
@@ 1,131 0,0 @@
# 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.

D users/bbaserdem/rules.mk => users/bbaserdem/rules.mk +0 -87
@@ 1,87 0,0 @@
# 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

# 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

# OLED code
ifeq ($(strip $(OLED_ENABLE)), yes)
    SRC += bb-oled.c
    ifeq ($(strip $(CTPC)), yes)
        SRC += bb-oled-extra.c
    endif
endif