From fd44341cbf63787e1e0d8224a8dcb5143b029d2a Mon Sep 17 00:00:00 2001 From: Batuhan Baserdem <19315586+bbaserdem@users.noreply.github.com> Date: Sat, 2 Jul 2022 11:09:04 +0000 Subject: Userspace and keymap update for user bbaserdem. (#14484) --- users/bbaserdem/.gitignore | 2 + users/bbaserdem/README.md | 51 -- users/bbaserdem/bb-audio.c | 82 +++ users/bbaserdem/bb-audio.h | 28 + users/bbaserdem/bb-backlight.c | 30 + users/bbaserdem/bb-backlight.h | 23 + users/bbaserdem/bb-encoder.c | 514 +++++++++++++++++ users/bbaserdem/bb-encoder.h | 29 + users/bbaserdem/bb-macro.c | 156 +++++ users/bbaserdem/bb-macro.h | 113 ++++ users/bbaserdem/bb-oled-extra.c | 796 ++++++++++++++++++++++++++ users/bbaserdem/bb-oled-extra.h | 25 + users/bbaserdem/bb-oled.c | 216 +++++++ users/bbaserdem/bb-oled.h | 32 ++ users/bbaserdem/bb-rgb.c | 130 +++++ users/bbaserdem/bb-rgb.h | 28 + users/bbaserdem/bb-underglow.c | 116 ++++ users/bbaserdem/bb-underglow.h | 28 + users/bbaserdem/bbaserdem.c | 915 +++++++++++------------------- users/bbaserdem/bbaserdem.h | 767 +++++++++++++++++-------- users/bbaserdem/config.h | 137 ++++- users/bbaserdem/keymap-bitmaps/.gitignore | 4 + users/bbaserdem/keymap-bitmaps/cropBmp | 38 ++ users/bbaserdem/readme.md | 131 +++++ users/bbaserdem/rules.mk | 100 +++- 25 files changed, 3592 insertions(+), 899 deletions(-) create mode 100644 users/bbaserdem/.gitignore delete mode 100644 users/bbaserdem/README.md create mode 100644 users/bbaserdem/bb-audio.c create mode 100644 users/bbaserdem/bb-audio.h create mode 100644 users/bbaserdem/bb-backlight.c create mode 100644 users/bbaserdem/bb-backlight.h create mode 100644 users/bbaserdem/bb-encoder.c create mode 100644 users/bbaserdem/bb-encoder.h create mode 100644 users/bbaserdem/bb-macro.c create mode 100644 users/bbaserdem/bb-macro.h create mode 100644 users/bbaserdem/bb-oled-extra.c create mode 100644 users/bbaserdem/bb-oled-extra.h create mode 100644 users/bbaserdem/bb-oled.c create mode 100644 users/bbaserdem/bb-oled.h create mode 100644 users/bbaserdem/bb-rgb.c create mode 100644 users/bbaserdem/bb-rgb.h create mode 100644 users/bbaserdem/bb-underglow.c create mode 100644 users/bbaserdem/bb-underglow.h create mode 100644 users/bbaserdem/keymap-bitmaps/.gitignore create mode 100755 users/bbaserdem/keymap-bitmaps/cropBmp create mode 100644 users/bbaserdem/readme.md (limited to 'users') diff --git a/users/bbaserdem/.gitignore b/users/bbaserdem/.gitignore new file mode 100644 index 0000000000..57bd0e43b4 --- /dev/null +++ b/users/bbaserdem/.gitignore @@ -0,0 +1,2 @@ +/secrets.h +/secrets.c diff --git a/users/bbaserdem/README.md b/users/bbaserdem/README.md deleted file mode 100644 index eb8f33d422..0000000000 --- a/users/bbaserdem/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Overview - -I have mostly ortholinear keyboards, which share a lot of functions. -For this purpose, I collected them here. - -I have the following keymaps: - -* Gherkin (Does not use the user space) -* XD75RE (Uses different keymap) -* Let's Split -* Let's Split It Up -* Planck - -# Layout - -I use DVORAK with an unorthodox Turkish layout. -If you wanna grab my code, and you used a layout with a persistent base -layer change, change it to layer 0 before proceeding. - -# Layers - -* **Dvorak**: Base layer,with dvorak layout. -* **Alternative**: Has alternate characters. -* **Game**: Toggled from *Function*, comfortable for gaming use. -* **Numeric**: Has numericals and symbols. Can be locked. -* **Function**: Layer has media and function keys. -* **Mouse**: Manipulates mouse. Can be locked. -* **Music** Allows playing sounds. - -# Functionality - -* **RGB Backlight**: With layer indication, and ability to change base layer lighting mode. -* **Secrets**: By placing a secrets.h, and not tracking it, passwords can be stored. -* **Mouse**: Mouse emulation, complete with diagonal keys. -* **Turkish**: An AltGr-like overlay that allows some non-common letters, in unicode. - -I suggest checking out how I enabled Turkish keys, -how I planned out RGB lighting, -and my mouse implementation; -they might offer some insight into fringe user cases. - -# Issues - -All features are too big for the 32kB bootloader. -Offenders are audio and rgb lights; it comes down to one or the other. - -~The Proton board, and rev 6 might fix that.~ - -# Credits - -I have previously written my keymap by myself before, but I rewrote it here, diff --git a/users/bbaserdem/bb-audio.c b/users/bbaserdem/bb-audio.c new file mode 100644 index 0000000000..eef0cdf2f6 --- /dev/null +++ b/users/bbaserdem/bb-audio.c @@ -0,0 +1,82 @@ +/* Copyright 2021 Batuhan Başerdem + * @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 . + */ + + +#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; +} diff --git a/users/bbaserdem/bb-audio.h b/users/bbaserdem/bb-audio.h new file mode 100644 index 0000000000..351061ab9a --- /dev/null +++ b/users/bbaserdem/bb-audio.h @@ -0,0 +1,28 @@ +/* Copyright 2021 Batuhan Başerdem + * @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 . + */ +#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); diff --git a/users/bbaserdem/bb-backlight.c b/users/bbaserdem/bb-backlight.c new file mode 100644 index 0000000000..5eca1f2c11 --- /dev/null +++ b/users/bbaserdem/bb-backlight.c @@ -0,0 +1,30 @@ +/* Copyright 2021 Batuhan Başerdem + * @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 . + */ + +#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 +} diff --git a/users/bbaserdem/bb-backlight.h b/users/bbaserdem/bb-backlight.h new file mode 100644 index 0000000000..3af3137d9a --- /dev/null +++ b/users/bbaserdem/bb-backlight.h @@ -0,0 +1,23 @@ +/* Copyright 2021 Batuhan Başerdem + * @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 . + */ +#pragma once +#include "bbaserdem.h" + +/* Hooks for backlight definitions + */ + +void keyboard_post_init_backlight(void); diff --git a/users/bbaserdem/bb-encoder.c b/users/bbaserdem/bb-encoder.c new file mode 100644 index 0000000000..eea9751051 --- /dev/null +++ b/users/bbaserdem/bb-encoder.c @@ -0,0 +1,514 @@ +/* Copyright 2021 Batuhan Başerdem + * @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 . + */ +#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 +#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 diff --git a/users/bbaserdem/bb-encoder.h b/users/bbaserdem/bb-encoder.h new file mode 100644 index 0000000000..dce08cd3d5 --- /dev/null +++ b/users/bbaserdem/bb-encoder.h @@ -0,0 +1,29 @@ +/* Copyright 2021 Batuhan Başerdem + * @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 . + */ +#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); diff --git a/users/bbaserdem/bb-macro.c b/users/bbaserdem/bb-macro.c new file mode 100644 index 0000000000..a84a7bbc21 --- /dev/null +++ b/users/bbaserdem/bb-macro.c @@ -0,0 +1,156 @@ +/* Copyright 2021 Batuhan Başerdem + * @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 . + */ +#include "bb-macro.h" + +/* MACRO Definitions + * This file has my macros/unicodes + * Hooks for other functionality to inject itself into the process_record + */ + +// Tap dance definitons +#ifdef AUDIO_ENABLE +#ifdef TAP_DANCE_ENABLE +qk_tap_dance_action_t tap_dance_actions[] = { + // Music playback speed modulator + [TD_AUDIO_TEMPO] = ACTION_TAP_DANCE_DOUBLE(MU_SLOW, MU_FAST), +}; +#endif // AUDIO_ENABLE +#endif // TAP_DANCE_ENABLE + +// Unicode definitions; for single character keys +// We mask their definitions if unicode is not enabled +#ifdef UNICODEMAP_ENABLE +const uint32_t PROGMEM unicode_map[] = { + [UPC_A_CIRC] = 0x00C2, [LOW_A_CIRC] = 0x00E2, // Â â + [UPC_C_CEDI] = 0x00C7, [LOW_C_CEDI] = 0x00E7, // Ç ç + [UPC_G_BREV] = 0x011E, [LOW_G_BREV] = 0x001F, // Ğ ğ + [UPC_I_CIRC] = 0x00CE, [LOW_I_CIRC] = 0x00EE, // Î î + [UPC_I_DOTL] = 0x0049, [LOW_I_DOTL] = 0x0131, // I ı + [UPC_I_DOTT] = 0x0130, [LOW_I_DOTT] = 0x0069, // İ i + [UPC_O_DIAE] = 0x00D6, [LOW_O_DIAE] = 0x00F6, // Ö ö + [UPC_S_CEDI] = 0x015E, [LOW_S_CEDI] = 0x015F, // Ş ş + [UPC_U_CIRC] = 0x00DB, [LOW_U_CIRC] = 0x00FB, // Û û + [UPC_U_DIAE] = 0x00DC, [LOW_U_DIAE] = 0x00FC, // Ü ü + [UPC_ALPHA] = 0x0391, [LOW_ALPHA] = 0x03B1, // Α α + [UPC_BETA] = 0x0392, [LOW_BETA] = 0x03B2, // Β β + [UPC_GAMMA] = 0x0393, [LOW_GAMMA] = 0x03B3, // Γ γ + [UPC_DELTA] = 0x0394, [LOW_DELTA] = 0x03B4, // Δ δ + [UPC_EPSILON] = 0x0395, [LOW_EPSILON] = 0x03B5, // Ε ε + [UPC_ZETA] = 0x0396, [LOW_ZETA] = 0x03B6, // Ζ ζ + [UPC_ETA] = 0x0397, [LOW_ETA] = 0x03B7, // Η η + [UPC_THETA] = 0x0398, [LOW_THETA] = 0x03B8, // Θ θ + [UPC_IOTA] = 0x0399, [LOW_IOTA] = 0x03B9, // Ι ι + [UPC_KAPPA] = 0x039A, [LOW_KAPPA] = 0x03BA, // Κ κ + [UPC_LAMBDA] = 0x039B, [LOW_LAMBDA] = 0x03BB, // Λ λ + [UPC_MU] = 0x039C, [LOW_MU] = 0x03BC, // Μ μ + [UPC_NU] = 0x039D, [LOW_NU] = 0x03BD, // Ν ν + [UPC_XI] = 0x039E, [LOW_XI] = 0x03BE, // Ξ ξ + [UPC_OMICRON] = 0x039F, [LOW_OMICRON] = 0x03BF, // Ο ο + [UPC_PI] = 0x03A0, [LOW_PI] = 0x03C0, // Π π + [UPC_RHO] = 0x03A1, [LOW_RHO] = 0x03C1, // Ρ ρ + [UPC_SIGMA] = 0x03A3, [LOW_SIGMA] = 0x03C3, // Σ σ + [UPC_TAU] = 0x03A4, [LOW_TAU] = 0x03C4, // Τ τ + [UPC_UPSILON] = 0x03A5, [LOW_UPSILON] = 0x03C5, // Υ υ + [UPC_PHI] = 0x03A6, [LOW_PHI] = 0x03C6, // Φ φ + [UPC_CHI] = 0x03A7, [LOW_CHI] = 0x03C7, // Χ χ + [UPC_PSI] = 0x03A8, [LOW_PSI] = 0x03C8, // Ψ ψ + [UPC_OMEGA] = 0x03A9, [LOW_OMEGA] = 0x03C9, // Ω ω + [ELLIPSIS] = 0x2026, // … + [PLANCK_CON] = 0x210F, // ℏ + [ANGSTROM] = 0x212B, // Å + [BITCOIN] = 0x20BF // ₿ +}; +#endif // UNICODEMAP_ENABLE + +// Keycodes +bool process_record_macro(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + // AltGr + Caps should change the oled layout variable + case KC_CAPSLOCK: + if (record->event.pressed) { + if (get_mods() & MOD_BIT(KC_RALT)) { + userspace_config.layout = (userspace_config.layout + 1) % 3; + } + } + return true; + break; + case BB_OLED: + if (record->event.pressed) { + if (get_mods() & MOD_MASK_SHIFT) { + // Scroll in opposite direction + userspace_config.layout = (userspace_config.layout + 4) % 3; + } else { + userspace_config.layout = (userspace_config.layout + 1) % 3; + } + } + return false; + break; + // Plain macros + case BB_PGPK: + // My public PGP key + if (record->event.pressed) { + SEND_STRING("0B7151C823559DD8A7A04CE36426139E2F4C6CCE"); + } + return false; break; + case DBL_ANG: + // Double angular bracket + if (record->event.pressed) { + SEND_STRING("<>"SS_TAP(X_LEFT)); + } + return false; break; + case DBL_PAR: + // Double paranthesis + if (record->event.pressed) { + SEND_STRING("()"SS_TAP(X_LEFT)); + } + return false; break; + case DBL_BRC: + // Double square brackets + if (record->event.pressed) { + SEND_STRING("[]"SS_TAP(X_LEFT)); + } + return false; break; + case DBL_CBR: + // Double curly brackets + if (record->event.pressed) { + SEND_STRING("{}"SS_TAP(X_LEFT)); + } + return false; break; + // Unicode macros +# ifdef UNICODEMAP_ENABLE + case TR_FLAG: + // Turkish flag + if (record->event.pressed) { + send_unicode_string("🇹🇷"); + } + return false; break; + case BB_LENY: + // Lenny face: ( ͡° ͜ʖ ͡°) + if (record->event.pressed) { + send_unicode_string("( ͡° ͜ʖ ͡°)"); + } + return false; break; + case BB_TABL: + // Table flip: ┻━┻︵ \(°□°)/ ︵ ┻━┻ + if (record->event.pressed) { + send_unicode_string("┻━┻︵ \\(°□°)/ ︵ ┻━┻"); + } + return false; break; +# endif // UNICODEMAP_ENABLE + } + return true; +} diff --git a/users/bbaserdem/bb-macro.h b/users/bbaserdem/bb-macro.h new file mode 100644 index 0000000000..3dc14e7a8a --- /dev/null +++ b/users/bbaserdem/bb-macro.h @@ -0,0 +1,113 @@ +/* Copyright 2021 Batuhan Başerdem + * @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 . + */ +#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 diff --git a/users/bbaserdem/bb-oled-extra.c b/users/bbaserdem/bb-oled-extra.c new file mode 100644 index 0000000000..b52c4b335a --- /dev/null +++ b/users/bbaserdem/bb-oled-extra.c @@ -0,0 +1,796 @@ +/* Copyright 2021 Batuhan Başerdem + * @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 . + */ +#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: + 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,0x