Remove broken userspace and keymaps (#18806)
This commit is contained in:
		
							parent
							
								
									4f3af09209
								
							
						
					
					
						commit
						428114fac2
					
				
					 48 changed files with 0 additions and 4810 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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>`
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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___)
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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}`
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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/>.
 | 
			
		||||
 */
 | 
			
		||||
							
								
								
									
										2
									
								
								users/bbaserdem/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								users/bbaserdem/.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,2 +0,0 @@
 | 
			
		|||
/secrets.h
 | 
			
		||||
/secrets.c
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -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);}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
							
								
								
									
										4
									
								
								users/bbaserdem/keymap-bitmaps/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								users/bbaserdem/keymap-bitmaps/.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,4 +0,0 @@
 | 
			
		|||
*.bmp
 | 
			
		||||
splitImages
 | 
			
		||||
templates
 | 
			
		||||
!.gitignore
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue