commit
a9af4c928e
@ -1,11 +0,0 @@ |
||||
# Gherkin Layout |
||||
This is my gherkin layout. |
||||
It is used as a game pad, and key layout is inspired by spare keys I had lying around. |
||||
The firmware is very simple, and only includes one layer keymap, and RGB effects. |
||||
|
||||
# Flashing |
||||
The following command should be used from the main qmk directory. |
||||
``` |
||||
make gherkin:bbaserdem |
||||
sudo avrdude -p atmgea34u4 -P `ls /dev/ttyACM*` -c avr109 -U flash:.build/gherkin_bbaserdem.hex |
||||
``` |
@ -1,9 +0,0 @@ |
||||
#pragma once |
||||
|
||||
#define RGB_DI_PIN F6 |
||||
#define RGBLED_NUM 10 |
||||
#define RGBLIGHT_ANIMATIONS |
||||
#ifdef BACKLIGHT_LEVELS |
||||
#undef BACKLIGHT_LEVELS |
||||
#endif |
||||
#define BACKLIGHT_LEVELS 3 |
@ -1,36 +0,0 @@ |
||||
// This is a game-pad gherkin layout with RGB and LED lights
|
||||
|
||||
#include QMK_KEYBOARD_H |
||||
|
||||
backlight_config_t backlight_config; |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
/* Game pad
|
||||
* ,-----------------------------------------------------------. |
||||
* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | Ctl | Alt | ~ | |
||||
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| |
||||
* | Tab | Q | W | E | R | T | |^| | ; | ' | / | |
||||
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| |
||||
* | Shf | A | S | D | F | <-- | |v| | --> | , | . | |
||||
* `-----------------------------------------------------------' |
||||
*/ |
||||
LAYOUT_ortho_3x10( |
||||
KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_LCTRL, KC_LALT, KC_GRAVE, |
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_UP, KC_SCLN, KC_QUOTE, KC_SLASH, |
||||
KC_LSHIFT, KC_A, KC_S, KC_D, KC_F, KC_LEFT, KC_DOWN, KC_RIGHT, KC_COMMA, KC_DOT |
||||
) |
||||
}; |
||||
|
||||
void matrix_init_user(void) { |
||||
// Set LED's to max
|
||||
_delay_us(300); |
||||
backlight_config.level = 2; |
||||
backlight_config.enable = 1; |
||||
eeconfig_update_backlight(backlight_config.raw); |
||||
backlight_set(backlight_config.level); |
||||
// Set RGB to rainbow mood light
|
||||
rgblight_enable(); |
||||
rgblight_mode(1); |
||||
rgblight_sethsv(120,255,255); |
||||
rgblight_mode(6); |
||||
} |
@ -1,13 +0,0 @@ |
||||
USER_NAME := bbaserdem-nouserspace
|
||||
|
||||
STENO_ENABLE = no # Additional protocols for Stenography(+1700), requires VIRTSER
|
||||
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = no # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
AUDIO_ENABLE = no # Enable audio output from keyboard
|
||||
|
||||
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
RGBLIGHT_ENABLE = yes # Enable RBG light strips
|
||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
@ -1,27 +0,0 @@ |
||||
# Lets Split Layout |
||||
|
||||
Check out [user readme](../../../../users/bbaserdem/README.md) for more info. |
||||
|
||||
# Usage |
||||
|
||||
**These commands depend on there being no other arduino connected!** |
||||
Also udev rules can be set instead of using sudo. |
||||
Please unplug all other usb devices. |
||||
|
||||
To make the hex files; |
||||
``` |
||||
make lets_split/rev2:bbaserdem |
||||
make lets_split/rev2:bbaserdem_right |
||||
``` |
||||
|
||||
For the left half, after plugging in and resetting; (from repo main directory) |
||||
``` |
||||
sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:.build/lets_split_rev2_bbaserdem.hex |
||||
sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -U eeprom:w:keyboards/lets_split/eeprom-lefthand.eep |
||||
``` |
||||
|
||||
For the right half; |
||||
``` |
||||
sudo avrdude -p atmgea34u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:.build/lets_split_rev2_bbaserdem_right.hex |
||||
sudo avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -U eeprom:w:keyboards/lets_split/eeprom-righhand.eep |
||||
``` |
@ -1,27 +0,0 @@ |
||||
#ifndef CONFIG_KEYMAP_H |
||||
#define CONFIG_KEYMAP_H |
||||
|
||||
#include "../../config.h" |
||||
|
||||
#define USE_SERIAL |
||||
#define EE_HANDS |
||||
|
||||
// LED strip stuff
|
||||
#ifdef RGBLIGHT_ENABLE |
||||
|
||||
// Who thought it was a good idea to predefine these in the rev2/config.h ???
|
||||
#ifdef RGBLED_NUM |
||||
#undef RGBLED_NUM |
||||
#endif |
||||
#define RGBLED_NUM 12 |
||||
|
||||
#define RGBLIGHT_HUE_STEP 6 |
||||
#define RGBLIGHT_SAT_STEP 12 |
||||
#define RGBLIGHT_VAL_STEP 20 |
||||
#define RGBLIGHT_ANIMATIONS |
||||
#define RGBLIGHT_EFFECT_SNAKE_LENGTH 6 |
||||
#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 2000 |
||||
#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 |
||||
#endif |
||||
|
||||
#endif |
@ -1,35 +0,0 @@ |
||||
/*
|
||||
* Let's Split - Dvorak turkish |
||||
* Keymap by @bbaserdem |
||||
* Dvorak layout with multiple features |
||||
* Most of the code is in the "user" directory. |
||||
* Check qmk_firmware/users/bbaserdem for the main part of the code |
||||
*/ |
||||
|
||||
#include "lets_split.h" |
||||
#include "bbaserdem.h" |
||||
|
||||
|
||||
void matrix_init_keymap (void) { |
||||
} |
||||
|
||||
layer_state_t layer_state_set_keymap(layer_state_t state) { |
||||
return state; |
||||
} |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
// Main Dvorak layer
|
||||
[_DV] = LAYOUT_letssplit_wrapper(DVORAK), |
||||
// Turkish and special character overlay
|
||||
[_AL] = LAYOUT_letssplit_wrapper(ALTCHAR), |
||||
// Gaming layer
|
||||
[_GA] = LAYOUT_letssplit_wrapper(GAME), |
||||
// Numbers layer
|
||||
[_NU] = LAYOUT_letssplit_wrapper(NUMBERS), |
||||
// Settings layer
|
||||
[_SE] = LAYOUT_letssplit_wrapper(SETTINGS), |
||||
// Mouse emulation layer
|
||||
[_MO] = LAYOUT_letssplit_wrapper(MOUSE), |
||||
// Music layer
|
||||
[_MU] = LAYOUT_letssplit_wrapper(MUSIC), |
||||
}; |
@ -1,8 +0,0 @@ |
||||
# Build options
|
||||
|
||||
BACKLIGHT_ENABLE = no # Switch LEDs
|
||||
MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses
|
||||
RGBLIGHT_ENABLE = yes # LED strips
|
||||
TAP_DANCE_ENABLE = no # Use multi-tap features
|
||||
AUDIO_ENABLE = no # Audio stuff
|
||||
|
@ -1,5 +0,0 @@ |
||||
# Lets Split - Right Half |
||||
|
||||
Keymap for my right half, to be used as a numpad. |
||||
Check [main readme](../bbaserdem/README.md) for flashing info. |
||||
|
@ -1,9 +0,0 @@ |
||||
#ifndef CONFIG_KEYMAP_H |
||||
#define CONFIG_KEYMAP_H |
||||
|
||||
#include "../../config.h" |
||||
|
||||
#define USE_SERIAL |
||||
#define EE_HANDS |
||||
|
||||
#endif |
@ -1,31 +0,0 @@ |
||||
/*
|
||||
* Let's Split - Dvorak turkish |
||||
* Keymap by @bbaserdem |
||||
* Dvorak layout with multiple features |
||||
* Most of the code is in the "user" directory. |
||||
* Check qmk_firmware/users/bbaserdem for the main part of the code |
||||
*/ |
||||
|
||||
#include "lets_split.h" |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
|
||||
/* Navigation All Supered) Numpad
|
||||
* ,-----------------------. ,-----------------------. |
||||
* | F4| ` | Q |Alt| L | > | | ) | - | + | = |Ent|Bkp| |
||||
* |---+---+---+---+---+---| |---+---+---+---+---+---| |
||||
* | F3| M |Ent|Ctl| K | ^ | | ( | * | 9 | 6 | 3 | . | |
||||
* |---+---+---+---+---+---| |---+---+---+---+---+---| |
||||
* | F2| T |Spc|Shf| J | v | | % | / | 8 | 5 | 2 | , | |
||||
* |---+---+---+---+---+---| |---+---+---+---+---+---| |
||||
* | F1| F | P |Tab| H | < | |Nlc|Tab| 7 | 4 | 1 | 0 | |
||||
* `-----------------------' `-----------------------' |
||||
*/ |
||||
// Main Dvorak layer
|
||||
[0] = LAYOUT_ortho_4x12( |
||||
LCTL(LALT(KC_DEL)), LGUI(KC_GRV), LGUI(KC_Q), LGUI(KC_LALT), LGUI(KC_L), LGUI(KC_RGHT), KC_RPRN, KC_PMNS, KC_PPLS, KC_PEQL, KC_PENT, KC_BSPC, \
|
||||
LGUI(KC_F3), LGUI(KC_M), LGUI(KC_ENT), LGUI(KC_LCTL), LGUI(KC_K), LGUI(KC_UP), KC_LPRN, KC_PAST, KC_P9, KC_P6, KC_P3, KC_PDOT, \
|
||||
LGUI(KC_F2), LGUI(KC_T), LGUI(KC_SPC), LGUI(KC_LSFT), LGUI(KC_J), LGUI(KC_DOWN), KC_PERC, KC_PSLS, KC_P8, KC_P5, KC_P2, KC_PCMM, \
|
||||
LGUI(KC_F1), LGUI(KC_F), LGUI(KC_P), LGUI(KC_TAB), LGUI(KC_H), LGUI(KC_LEFT), KC_NLCK, KC_TAB, KC_P7, KC_P4, KC_P1, KC_P0 \
|
||||
) |
||||
}; |
@ -1,19 +0,0 @@ |
||||
# Build options
|
||||
|
||||
USER_NAME := bbaserdem-without-userspace
|
||||
|
||||
BACKLIGHT_ENABLE = no # Switch LEDs
|
||||
MOUSEKEY_ENABLE = no # Emulates mouse key using keypresses
|
||||
RGBLIGHT_ENABLE = no # LED strips
|
||||
TAP_DANCE_ENABLE = no # Use multi-tap features
|
||||
AUDIO_ENABLE = no # Audio stuff
|
||||
BLUETOOTH_ENABLE = no # No bluetooth
|
||||
COMMAND_ENABLE = no # Some bootmagic thing
|
||||
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
|
||||
CONSOLE_ENABLE = no # Allows console output with a command
|
||||
SLEEP_LED_ENABLE = no # Breathes LED's when computer is asleep. Untested.
|
||||
NKRO_ENABLE = no # Default is 6KRO which is plenty
|
||||
MIDI_ENABLE = no # Untested feature
|
||||
KEY_LOCK_ENABLE = no # Allows locking any key. Not used
|
||||
UNICODE_ENABLE = no # Used for unicode character emulation
|
||||
EXTRAKEY_ENABLE = no # OS signals like volume control
|
@ -1,7 +0,0 @@ |
||||
# Lets Split Eh Layout |
||||
|
||||
Check out [user readme](../../../../users/bbaserdem/README.md) for more info. |
||||
|
||||
# Usage |
||||
|
||||
Fill in after flashing |
@ -1,4 +0,0 @@ |
||||
#ifndef CONFIG_KEYMAP_H |
||||
#define CONFIG_KEYMAP_H |
||||
#include "../../config.h" |
||||
#endif |
@ -1,27 +0,0 @@ |
||||
#include "lets_split_eh.h" |
||||
#include "bbaserdem.h" |
||||
|
||||
|
||||
void matrix_init_keymap (void) { |
||||
} |
||||
|
||||
layer_state_t layer_state_set_keymap(layer_state_t state) { |
||||
return state; |
||||
} |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
// Main Dvorak layer
|
||||
[_DV] = LAYOUT_letssplit_wrapper(DVORAK), |
||||
// Turkish and special character overlay
|
||||
[_AL] = LAYOUT_letssplit_wrapper(ALTCHAR), |
||||
// Gaming layer
|
||||
[_GA] = LAYOUT_letssplit_wrapper(GAME), |
||||
// Numbers layer
|
||||
[_NU] = LAYOUT_letssplit_wrapper(NUMBERS), |
||||
// Settings layer
|
||||
[_SE] = LAYOUT_letssplit_wrapper(SETTINGS), |
||||
// Mouse emulation layer
|
||||
[_MO] = LAYOUT_letssplit_wrapper(MOUSE), |
||||
// Music layer
|
||||
[_MU] = LAYOUT_letssplit_wrapper(MUSIC), |
||||
}; |
@ -1,8 +0,0 @@ |
||||
# Build options
|
||||
|
||||
BACKLIGHT_ENABLE = no # Switch LEDs
|
||||
MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses
|
||||
RGBLIGHT_ENABLE = yes # LED strips
|
||||
TAP_DANCE_ENABLE = no # Use multi-tap features
|
||||
AUDIO_ENABLE = no # Audio stuff
|
||||
|
@ -1,15 +0,0 @@ |
||||
# Planck Layout |
||||
|
||||
Current keymap is for rev4. |
||||
Audio is disabled in favor of RGB. |
||||
Check out [user readme](../../../../users/bbaserdem/README.md) for more info. |
||||
|
||||
# Build |
||||
|
||||
Get keyboard into reset mode, and then; |
||||
|
||||
``` |
||||
make planck/rev4:bbaserdem:dfu |
||||
``` |
||||
|
||||
Either use sudo or set up udev rules. |
@ -1,24 +0,0 @@ |
||||
#ifndef CONFIG_KEYMAP_H |
||||
#define CONFIG_KEYMAP_H |
||||
|
||||
#include "config_common.h" |
||||
|
||||
// LED strip stuff
|
||||
#ifdef RGBLIGHT_ENABLE |
||||
#define RGB_DI_PIN B2 |
||||
#define RGBLED_NUM 12 |
||||
#define RGBLIGHT_HUE_STEP 6 |
||||
#define RGBLIGHT_SAT_STEP 12 |
||||
#define RGBLIGHT_VAL_STEP 20 |
||||
#define RGBLIGHT_ANIMATIONS |
||||
#define RGBLIGHT_EFFECT_SNAKE_LENGTH 6 |
||||
#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 |
||||
#define RGBLIGHT_EFFECT_KNIGHT_OFFSET 6 |
||||
#define RGBLIGHT_EFFECT_KNIGHT_LED_NUM 6 |
||||
#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 2000 |
||||
#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 |
||||
#endif |
||||
|
||||
#define ENCODER_RESOLUTION 4 |
||||
|
||||
#endif |
@ -1,28 +0,0 @@ |
||||
/*
|
||||
* PLANCK - Dvorak turkish |
||||
* Keymap by @bbaserdem |
||||
* Dvorak layout with multiple features |
||||
* Most of the code is in the "user" directory. |
||||
* Check qmk_firmware/users/bbaserdem for the main part of the code |
||||
*/ |
||||
|
||||
#include "planck.h" |
||||
#include "bbaserdem.h" |
||||
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
// Main Dvorak layer
|
||||
[_DV] = LAYOUT_planck_wrapper(DVORAK), |
||||
// Turkish and special character overlay
|
||||
[_AL] = LAYOUT_planck_wrapper(ALTCHAR), |
||||
// Gaming layer
|
||||
[_GA] = LAYOUT_planck_wrapper(GAME), |
||||
// Numbers layer
|
||||
[_NU] = LAYOUT_planck_wrapper(NUMBERS), |
||||
// Settings layer
|
||||
[_SE] = LAYOUT_planck_wrapper(SETTINGS), |
||||
// Mouse emulation layer
|
||||
[_MO] = LAYOUT_planck_wrapper(MOUSE), |
||||
// Music mode
|
||||
[_MU] = LAYOUT_planck_wrapper(MUSIC), |
||||
}; |
@ -1,7 +0,0 @@ |
||||
# Build options
|
||||
|
||||
BACKLIGHT_ENABLE = yes # Switch LEDs
|
||||
MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses
|
||||
RGBLIGHT_ENABLE = yes # LED strips
|
||||
TAP_DANCE_ENABLE = no # Use multi-tap features
|
||||
AUDIO_ENABLE = yes # Audio stuff
|
@ -0,0 +1,32 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#pragma once |
||||
|
||||
// Kyria specific
|
||||
#ifdef KEYBOARD_splitkb_kyria_rev1 |
||||
// Split definition; use the following to flash;
|
||||
// pro-micro: avrdude-split-left/right
|
||||
// elite-c: dfu-split-left/right
|
||||
# define ENCODER_DIRECTION_FLIP |
||||
# define EE_HANDS |
||||
|
||||
// Make sure kyria has bigger oled display
|
||||
# ifdef OLED_ENABLE |
||||
# define OLED_DISPLAY_128X64 |
||||
# endif |
||||
#endif |
@ -0,0 +1,32 @@ |
||||
This folder contains my Kyria (`split_3x6_5`) board layout. |
||||
Check out the [user readme](../../../../../users/bbaserdem/readme.md) for more info. |
||||
|
||||
# Kyria |
||||
|
||||
I use a rev 1.3 PCB as a daily driver. |
||||
|
||||
## Hardware |
||||
|
||||
* Using a modified High-profile case; with metal switch plate. |
||||
* Currently using a Pro-Micro and an Elite-C as microcontrollers. |
||||
* Using Gateron Silent Black Ink with Progressive springs (100g), lubed. |
||||
* Have mill-max sockets for hotswap feature. |
||||
* All microcontrollers and OLED's are socketed for easy removal. |
||||
|
||||
## Features |
||||
|
||||
* Use two thumb keys in the 2u layout. |
||||
* Have rotary encoders in the outermost keys of the thumb cluster. |
||||
* Have underglow leds soldered. |
||||
|
||||
## Issues |
||||
|
||||
* Stabilizers squiek, and need lubing. |
||||
* The double tap buttons (home row; left leader the most) don't contact well. |
||||
|
||||
## Todo |
||||
|
||||
* Switch to Proton C conversion with a game plan. |
||||
* Lube stabilizers. |
||||
* Get tenting puck. |
||||
* (Not depending on me) migrate this code to layouts. |
@ -0,0 +1,30 @@ |
||||
# Copyright 2021 Batuhan Başerdem
|
||||
# <baserdem.batuhan@gmail.com> @bbaserdem
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Kyria hardware
|
||||
ifneq (,$(findstring splitkb/kyria/rev1,$(KEYBOARD))) |
||||
# Elective features
|
||||
ENCODER_ENABLE = yes
|
||||
OLED_ENABLE = yes
|
||||
# Nonexistent features
|
||||
AUDIO_ENABLE = no
|
||||
BACKLIGHT_ENABLE = no
|
||||
RGB_MATRIX_ENABLE = no
|
||||
# Space savers
|
||||
NKRO_ENABLE = no
|
||||
VELOCIKEY_ENABLE = no
|
||||
WPM_ENABLE = no
|
||||
endif |
@ -1,3 +0,0 @@ |
||||
#pragma once |
||||
|
||||
// place overrides here
|
@ -1,21 +0,0 @@ |
||||
#include QMK_KEYBOARD_H |
||||
#include "bbaserdem.h" |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
/* Layout
|
||||
* ,-----------------------------------------------------------. |
||||
* |Blt|Lck| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | |
||||
* |---+---+-----------------------------------------------+---| |
||||
* |Int|Trm| |Cps| |
||||
* |---+---| |---| |
||||
* |Clc|Psw| | \ | |
||||
* |---+---| PLANCK |---| |
||||
* |Rev|Ffw| | [ | |
||||
* |---+---| |---| |
||||
* |Tog|Mut| | ] | |
||||
* `-----------------------------------------------------------' |
||||
*/ |
||||
[0] = KM( FKLAVYE ), |
||||
[1] = KM( AYARLAR ), |
||||
}; |
||||
|
@ -1,14 +0,0 @@ |
||||
# XD75RE Setup |
||||
|
||||
(WIP) F keyboard for turkish, using unicode. |
||||
|
||||
* Write down keymap in userspace |
||||
* Figure out LED indicators |
||||
|
||||
# Make |
||||
|
||||
Take the board into reset mode, then |
||||
``` |
||||
make xiudi/xd75:bbaserdem:dfu |
||||
``` |
||||
Either sudo it or set permissions in udev. |
@ -1,7 +0,0 @@ |
||||
# Build options
|
||||
BACKLIGHT_ENABLE = yes # Switch LEDs
|
||||
MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses
|
||||
RGBLIGHT_ENABLE = no # LED strips
|
||||
TAP_DANCE_ENABLE = no # Use multi-tap features
|
||||
AUDIO_ENABLE = no # Audio stuff
|
||||
|
@ -0,0 +1,21 @@ |
||||
/*
|
||||
Copyright 2019 Batuhan Başerdem <baserdem.batuhan@gmail.com> @bbaserdem |
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 2 of the License, or |
||||
(at your option) any later version. |
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
|
||||
// Gherkin specific
|
||||
#ifdef KEYBOARD_40percentclub_gherkin |
||||
#define MUSIC_MAP |
||||
#define RGB_DI_PIN F6 |
||||
#define DRIVER_LED_TOTAL 10 |
||||
#endif |
@ -0,0 +1,98 @@ |
||||
/*
|
||||
Copyright 2019 Batuhan Başerdem <baserdem.batuhan@gmail.com> @bbaserdem |
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 2 of the License, or |
||||
(at your option) any later version. |
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#include QMK_KEYBOARD_H |
||||
#include "bbaserdem.h" |
||||
|
||||
#ifdef KEYBOARD_40percentclub_gherkin |
||||
// Flip it
|
||||
#undef LAYOUT_ortho_3x10 |
||||
#define LAYOUT_ortho_3x10( \ |
||||
K00, K01, K02, K03, K04, K05, K10, K11, K12, K13 , \
|
||||
K14, K15, K20, K21, K22, K23, K24, K25, K30, K31 , \
|
||||
K32, K33, K34, K35, K40, K41, K42, K43, K44, K45 \
|
||||
) { \
|
||||
{ K45, K44, K43, K42, K41, K40 }, \
|
||||
{ K35, K34, K33, K32, K31, K30 }, \
|
||||
{ K25, K24, K23, K22, K21, K20 }, \
|
||||
{ K15, K14, K13, K12, K11, K10 }, \
|
||||
{ K05, K04, K03, K02, K01, K00 } \
|
||||
} |
||||
#endif |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
/* Game pad
|
||||
* ,-----------------------------------------------------------. |
||||
* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | F1 | F2 | F3 | |
||||
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| |
||||
* |AdjsL| Q | W | E | R | Ent | Tab | Ctr | |^| | Alt | |
||||
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| |
||||
* |Music| A | S | D | F | Spc |Shift| <-- | |v| | --> | |
||||
* `-----------------------------------------------------------' |
||||
*/ |
||||
[_BASE] = LAYOUT_ortho_3x10( |
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_F1, KC_F2, KC_F3, |
||||
MO(_MEDI), KC_Q, KC_W, KC_E, KC_R, KC_ENT, KC_TAB, KC_LCTL,KC_UP, KC_LALT, |
||||
MU_TOG, KC_A, KC_S, KC_D, KC_F, KC_SPC, KC_LSFT,KC_LEFT,KC_DOWN,KC_RGHT |
||||
), |
||||
/* Adjust
|
||||
* ,-----------------------------------------------------------. |
||||
* | Esc |RGBTg|HueUp|HueDn|SatUp|SatDn|ValUp|ValDn|ModNx|ModPr| |
||||
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| |
||||
* | |BltTg|Breth|BriUp|BriDn| | |Veloc|SpdUp|SpdDn| |
||||
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| |
||||
* |Music| | | | | | | |EEprm|Reset| |
||||
* `-----------------------------------------------------------' |
||||
*/ |
||||
[_MEDI] = LAYOUT_ortho_3x10( |
||||
CK_TOGG,RGB_TOG,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,RGB_MOD,RGB_RMOD, |
||||
_______,BL_TOGG,BL_BRTG,BL_INC, BL_DEC, XXXXXXX,XXXXXXX,VLK_TOG,RGB_SPI,RGB_SPD, |
||||
AU_TOG, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,EEP_RST,RESET |
||||
), |
||||
[_MUSI] = LAYOUT_ortho_3x10_wrapper( |
||||
MU_FAST,_MU_08_,MU_REC, |
||||
MU_SLOW,_MU_08_,MU_STOP, |
||||
MU_TOG, _MU_08_,MU_PLAY |
||||
), |
||||
}; |
||||
|
||||
// Music map, guitar like.
|
||||
#ifdef AUDIO_ENABLE |
||||
const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_ortho_3x10( |
||||
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, |
||||
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, |
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 |
||||
); |
||||
#endif |
||||
|
||||
// RGB matrix code
|
||||
#ifdef RGB_MATRIX_ENABLE |
||||
// Gherkin
|
||||
#if defined(KEYBOARD_40percentclub_gherkin) |
||||
led_config_t g_led_config = { |
||||
{ // Key Matrix to LED Index
|
||||
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED}, |
||||
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED}, |
||||
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED}, |
||||
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED}, |
||||
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED} |
||||
}, { // LED Index to Physical Position
|
||||
{224, 0}, {168, 0}, {112, 0}, { 56, 0}, { 0, 0}, |
||||
{ 0, 64}, { 56, 64}, {112, 64}, {168, 64}, {224, 64}, |
||||
}, { // LED Index to Flag
|
||||
2,2,2,2,2,2,2,2,2,2 |
||||
}}; |
||||
// Disable layer switching
|
||||
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {return true;} |
||||
#endif // Gherkin
|
||||
#endif // RGB Matrix
|
@ -0,0 +1,19 @@ |
||||
This folder contains my [3x10\_ortho](../../../default/ortho_3x10) board layouts |
||||
Check out the [user readme](../../../../users/bbaserdem/readme.md) for more info. |
||||
|
||||
# Gherkin |
||||
|
||||
I use [Gherkin](../../../../keyboards/40percentclub/gherkin/readme.md). |
||||
|
||||
It is used as a game pad, and key layout is inspired by spare keys I had lying around. |
||||
The firmware is very simple, and only includes one layer keymap, and RGB effects. |
||||
|
||||
## Status |
||||
|
||||
* [x] Layout adapted |
||||
* [x] Tested build |
||||
* [x] Confirmed on board |
||||
|
||||
## Build |
||||
|
||||
Build command: `CFLAGS="-Wno-error=deprecated" <FILL-IN-LATER>` |
@ -0,0 +1,23 @@ |
||||
# Copyright 2019 Batuhan Başerdem <baserdem.batuhan@gmail.com> @bbaserdem
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# This small layout is a macro-pad; does not need userspace
|
||||
|
||||
# Gherkin has both RGB strip and LED lights
|
||||
ifneq (,$(findstring 40percentclub/gherkin,$(KEYBOARD))) |
||||
CONVERT_TO_PROTON_C = yes
|
||||
RGB_MATRIX_ENABLE = yes
|
||||
RGB_MATRIX_DRIVER = WS2812
|
||||
AUDIO_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = yes
|
||||
VELOCIKEY_ENABLE = yes
|
||||
endif |
@ -0,0 +1,26 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
|
||||
// Code pertaining to planck rev6
|
||||
#ifdef KEYBOARD_planck_rev6 |
||||
// Encoder I use;
|
||||
# ifdef ENCODER_RESOLUTION |
||||
# undef ENCODER_RESOLUTION |
||||
# endif |
||||
# define ENCODER_RESOLUTION 2 |
||||
#endif |
@ -0,0 +1,88 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#include QMK_KEYBOARD_H |
||||
#include "bbaserdem.h" |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
// Base layer
|
||||
[_BASE] = LAYOUT_ortho_4x12_wrapper( |
||||
_BL1_5_,_BL1_1_,_BR1_1_,_BR1_5_, |
||||
_BL2_5_,_BL2_1_,_BR2_1_,_BR2_5_, |
||||
_BL3_5_,_BL3_1_,_BR3_1_,_BR3_5_, |
||||
BB_ENC0,KC_DOWN,KC_UP, _BL4_3_,_BR4_3_,KC_LEFT,KC_RGHT,RGB_TOG |
||||
), |
||||
// Extra characters overlay
|
||||
[_CHAR] = LAYOUT_ortho_4x12_wrapper( |
||||
_CL1_5_,xxx2xxx,_CR1_5_, |
||||
_CL2_5_,xxx2xxx,_CR2_5_, |
||||
_CL3_5_,xxx2xxx,_CR3_5_, |
||||
___3___,_CL4_3_,_CR4_3_,___3___ |
||||
), |
||||
// Game layer: left_half
|
||||
[_GAME] = LAYOUT_ortho_4x12_wrapper( |
||||
_GA1_5_,_GA1_1_,___6___, |
||||
_GA2_5_,_GA2_1_,___6___, |
||||
_GA3_5_,_GA3_1_,___6___, |
||||
___3___,_GA4_3_,___6___ |
||||
), |
||||
// Media layer: right_half
|
||||
[_MEDI] = LAYOUT_ortho_4x12_wrapper( |
||||
___6___,xxx1xxx,_ME1_5_, |
||||
___6___,xxx1xxx,_ME2_5_, |
||||
___6___,xxx1xxx,_ME3_5_, |
||||
___6___,_ME4_3_,___3___ |
||||
), |
||||
// Navigation layer: right_half
|
||||
[_NAVI] = LAYOUT_ortho_4x12_wrapper( |
||||
___6___,xxx1xxx,_NA1_5_, |
||||
___6___,xxx1xxx,_NA2_5_, |
||||
___6___,xxx1xxx,_NA3_5_, |
||||
___6___,_NA4_3_,___3___ |
||||
), |
||||
// Symbol layer: right_half
|
||||
[_SYMB] = LAYOUT_ortho_4x12_wrapper( |
||||
___6___,xxx1xxx,_SY1_5_, |
||||
___6___,xxx1xxx,_SY2_5_, |
||||
___6___,xxx1xxx,_SY3_5_, |
||||
___6___,_SY4_3_,___3___ |
||||
), |
||||
// Number layer: left_half
|
||||
[_NUMB] = LAYOUT_ortho_4x12_wrapper( |
||||
xxx1xxx,_NU1_5_,___6___, |
||||
xxx1xxx,_NU2_5_,___6___, |
||||
xxx1xxx,_NU3_5_,___6___, |
||||
___3___,_NU4_3_,___6___ |
||||
), |
||||
// Function layer: left_half
|
||||
[_FUNC] = LAYOUT_ortho_4x12_wrapper( |
||||
_FU1_5_,xxx1xxx,___6___, |
||||
_FU2_5_,xxx1xxx,___6___, |
||||
_FU3_5_,xxx1xxx,___6___, |
||||
___3___,_FU4_3_,___6___ |
||||
), |
||||
// Mouse layer: left_half
|
||||
[_MOUS] = LAYOUT_ortho_4x12_wrapper( |
||||
_MO1_5_,xxx1xxx,___6___, |
||||
_MO2_5_,xxx1xxx,___6___, |
||||
_MO3_5_,xxx1xxx,___6___, |
||||
___3___,_MO4_3_,___6___ |
||||
), |
||||
// Music layer: everything
|
||||
[_MUSI] = LAYOUT_ortho_4x12_wrapper( |
||||
_MU_12_,_MU_12_,_MU_12_, |
||||
___1___,_MU_02_,_MUL_3_,_MUR_3_,_MU_02_,___1___) |
||||
}; |
@ -0,0 +1,12 @@ |
||||
This folder contains my [4x12\_ortho](../../../default/ortho_4x12) board layouts |
||||
Check out the [user readme](../../../../users/bbaserdem/readme.md) for more info. |
||||
|
||||
# Planck Light |
||||
|
||||
I use a couple [planck](../../../../keyboards/planck/readme.md) keyboards. |
||||
To sell soon; don't use them anymore, but will keep the light version. |
||||
|
||||
# JJ40 |
||||
|
||||
A planck rev4 replacement; for my acrylic planck case which used to host a now |
||||
defunct rev4. |
@ -0,0 +1,26 @@ |
||||
|
||||
# Copyright 2021 Batuhan Başerdem
|
||||
# <baserdem.batuhan@gmail.com> @bbaserdem
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Planck rev6 has both RGBLIGHT and RGB_MATRIX enabled
|
||||
ifneq (,$(findstring planck/rev6,$(KEYBOARD))) |
||||
RGB_MATRIX_ENABLE = yes
|
||||
RGBLIGHT_ENABLE = no
|
||||
endif |
||||
# JJ40 here
|
||||
ifneq (,$(findstring jj40,$(KEYBOARD))) |
||||
RGB_MATRIX_ENABLE = yes
|
||||
endif |
@ -0,0 +1,35 @@ |
||||
|
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
|
||||
// Split definition; use the following to flash;
|
||||
// pro-micro: avrdude-split-left/right
|
||||
// elite-c: dfu-split-left/right
|
||||
#define EE_HANDS |
||||
|
||||
#ifdef KEYBOARD_crkbd_rev1 |
||||
// Corne overrides
|
||||
# ifdef RGBLED_NUM |
||||
# undef RGBLED_NUM |
||||
# endif |
||||
# ifdef DRIVER_LED_TOTAL |
||||
# undef DRIVER_LED_TOTAL |
||||
# endif |
||||
# define RGBLED_NUM 48 |
||||
# define DRIVER_LED_TOTAL RGBLED_NUM |
||||
#endif // KEYBOARD_crkbd_rev1
|
@ -0,0 +1,18 @@ |
||||
This folder contains my [split\_3x5\_3](../../../default/split_3x5_3) board layouts |
||||
Check out the [user readme](../../../../users/bbaserdem/readme.md) for more info. |
||||
|
||||
# Crkbd |
||||
|
||||
Using a no 6th column crkbd (rev 2.1 choc) as a mobile keyboard. |
||||
|
||||
This version uses ProMicro as controllers; can't have OLED and RGB at the same time. |
||||
|
||||
## Build |
||||
|
||||
QMK cli commands no longer works with Archlinux (2021 Sep.) on my PC for flashing promicro. |
||||
In the past; I used to flash Pro Micro explicitly using the following line, for referance. |
||||
|
||||
``` |
||||
sudo avrdude -p atmgea34u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:<hexfile>.hex |
||||
``` |
||||
|
@ -0,0 +1,22 @@ |
||||
# Copyright 2021 Batuhan Başerdem
|
||||
# <baserdem.batuhan@gmail.com> @bbaserdem
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Corne keyboard
|
||||
ifneq (,$(findstring crkbd/rev1,$(KEYBOARD))) |
||||
RGBLIGHT_ENABLE = no
|
||||
RGB_MATRIX_ENABLE = yes
|
||||
OLED_ENABLE = no
|
||||
endif |
@ -0,0 +1,23 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
// Code pertaining the ARM crkbd version
|
||||
#ifdef KEYBOARD_crkbd_rev1 |
||||
# define CH_CFG_ST_RESOLUTION 16 |
||||
# define CH_CFG_ST_FREQUENCY 10000 |
||||
# include_next "chconf.h" |
||||
#endif // KEYBOARD_crkbd_rev1
|
@ -0,0 +1,77 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
// Split definition; use the following to flash;
|
||||
// pro-micro: avrdude-split-left/right
|
||||
// elite-c: dfu-split-left/right
|
||||
|
||||
// Code pertaining to Corne ARM; from Waffle's keymap
|
||||
#ifdef KEYBOARD_crkbd_rev1 |
||||
// Use EE_HANDS to determine handedness
|
||||
# define EE_HANDS |
||||
|
||||
// Rebrand the PCB
|
||||
# undef PRODUCT |
||||
# define PRODUCT Protorne Keyboard |
||||
# undef MANUFACTURER |
||||
# define MANUFACTURER Waffles |
||||
|
||||
// Remove OLED definitions?
|
||||
# undef USE_I2C |
||||
# undef SSD1306OLED |
||||
|
||||
// Audio output on pin A5 (actualy will be output on B1 using keymap init)
|
||||
# ifdef AUDIO_ENABLE |
||||
# define AUDIO_PIN A5 |
||||
# define MUSIC_MAP |
||||
# endif |
||||
|
||||
// Set serial pin as D3 for sure
|
||||
# undef SOFT_SERIAL_PIN |
||||
# define SOFT_SERIAL_PIN D3 |
||||
# define SERIAL_USART_SPEED 921600 |
||||
# define SERIAL_USART_DRIVER SD1 |
||||
# define SERIAL_USART_TX_PAL_MODE 7 |
||||
|
||||
// Things to make RGB matrix work on the waffle board
|
||||
# undef RGBLED_NUM |
||||
# define RGBLED_NUM 54 |
||||
# undef RGB_DI_PIN |
||||
# define RGB_DI_PIN B5 |
||||
# ifdef RGB_MATRIX_ENABLE |
||||
# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 100 |
||||
# define RGB_MATRIX_SPLIT { 27, 27 } |
||||
# endif |
||||
# define WS2812_PWM_DRIVER PWMD3 |
||||
# define WS2812_PWM_CHANNEL 3 |
||||
# define WS2812_PWM_PAL_MODE 2 |
||||
# define WS2812_DMA_STREAM STM32_DMA1_STREAM3 |
||||
# define WS2812_DMA_CHANNEL 3 |
||||
|
||||
// OLED related code
|
||||
# ifdef OLED_ENABLE |
||||
# define OLED_UPDATE_INTERVAL 100 |
||||
# endif |
||||
|
||||
// Encoder definitons
|
||||
# define ENCODERS_PAD_A { B2 } |
||||
# define ENCODERS_PAD_B { B6 } |
||||
# define ENCODER_RESOLUTIONS { 4 } |
||||
# define ENCODERS_PAD_A_RIGHT { B2 } |
||||
# define ENCODERS_PAD_B_RIGHT { B6 } |
||||
# define ENCODER_RESOLUTIONS_RIGHT { 2 } |
||||
#endif |
@ -0,0 +1,24 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
|
||||
#ifdef KEYBOARD_crkbd_rev1 |
||||
// #define HAL_USE_DAC TRUE
|
||||
# define HAL_USE_PWM TRUE |
||||
# define HAL_USE_SERIAL TRUE |
||||
# include_next <halconf.h> |
||||
#endif |
@ -0,0 +1,191 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#include QMK_KEYBOARD_H |
||||
#include "bbaserdem.h" |
||||
|
||||
#ifdef KEYBOARD_crkbd_rev1 |
||||
# include "bb-oled-extra.h" |
||||
#endif // KEYBOARD_crkbd_rev1
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
[_BASE] = LAYOUT_split_3x6_3_wrapper( |
||||
BB_ENC0,_BL1_5_,_BR1_5_,BB_ENC1, |
||||
_BL2_1_,_BL2_5_,_BR2_5_,_BR2_1_, |
||||
_BL3_1_,_BL3_5_,_BR3_5_,_BR3_1_, |
||||
_BL4_3_,_BR4_3_ |
||||
), |
||||
[_CHAR] = LAYOUT_split_3x6_3_wrapper( |
||||
_______,_CL1_5_,_CR1_5_,_______, |
||||
XXXXXXX,_CL2_5_,_CR2_5_,XXXXXXX, |
||||
XXXXXXX,_CL3_5_,_CR3_5_,XXXXXXX, |
||||
_CL4_3_,_CR4_3_ |
||||
), |
||||
[_GAME] = LAYOUT_split_3x6_3_wrapper( |
||||
_______,_GA1_5_,___6___, |
||||
_GA2_1_,_GA2_5_,___6___, |
||||
_GA3_1_,_GA3_5_,___6___, |
||||
_GA4_3_,___3___ |
||||
), |
||||
[_MEDI] = LAYOUT_split_3x6_3_wrapper( |
||||
___6___,_ME1_5_,_______, |
||||
___6___,_ME2_5_,xxx1xxx, |
||||
___6___,_ME3_5_,xxx1xxx, |
||||
___3___,_ME4_3_ |
||||
), |
||||
[_NAVI] = LAYOUT_split_3x6_3_wrapper( |
||||
___6___,_NA1_5_,_______, |
||||
___6___,_NA2_5_,xxx1xxx, |
||||
___6___,_NA3_5_,xxx1xxx, |
||||
___3___,_NA4_3_ |
||||
), |
||||
[_SYMB] = LAYOUT_split_3x6_3_wrapper( |
||||
___6___,_SY1_5_,_______, |
||||
___6___,_SY2_5_,xxx1xxx, |
||||
___6___,_SY3_5_,xxx1xxx, |
||||
___3___,_SY4_3_ |
||||
), |
||||
[_NUMB] = LAYOUT_split_3x6_3_wrapper( |
||||
_______,_NU1_5_,___6___, |
||||
xxx1xxx,_NU2_5_,___6___, |
||||
xxx1xxx,_NU3_5_,___6___, |
||||
_NU4_3_,___3___ |
||||
), |
||||
[_FUNC] = LAYOUT_split_3x6_3_wrapper( |
||||
_______,_FU1_5_,___6___, |
||||
xxx1xxx,_FU2_5_,___6___, |
||||
xxx1xxx,_FU3_5_,___6___, |
||||
_FU4_3_,___3___ |
||||
), |
||||
[_MOUS] = LAYOUT_split_3x6_3_wrapper( |
||||
_______,_MO1_5_,___6___, |
||||
xxx1xxx,_MO2_5_,___6___, |
||||
xxx1xxx,_MO3_5_,___6___, |
||||
_MO4_3_,___3___ |
||||
), |
||||
[_MUSI] = LAYOUT_split_3x6_3_wrapper( |
||||
_MU_12_, |
||||
_MU_12_, |
||||
_MU_12_, |
||||
_MUL_3_,_MUR_3_ |
||||
) |
||||
}; |
||||
|
||||
// crkbd
|
||||
#ifdef KEYBOARD_crkbd_rev1 |
||||
#ifdef AUDIO_ENABLE |
||||
const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_split_3x6_3( |
||||
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, |
||||
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, |
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, |
||||
0, 0, 0, 0, 0, 0 |
||||
); |
||||
#endif // AUDIO_ENABLE
|
||||
void keyboard_pre_init_keymap(void) { |
||||
# ifdef AUDIO_ENABLE |
||||
//thank you to @sigprof for this
|
||||
// Set audio pins to analog mode
|
||||
palSetLineMode(A5, PAL_MODE_INPUT_ANALOG); |
||||
palSetLineMode(B1, PAL_MODE_INPUT_ANALOG); |
||||
# endif // AUDIO_ENABLE
|
||||
# ifdef RGB_MATRIX_ENABLE |
||||
// Led locations are different on protorne; need to be fixed
|
||||
g_led_config = (led_config_t) { { |
||||
// Logical Layout
|
||||
// 0 1 2 3 4 5 COLS
|
||||
// -LEFT ROWS
|
||||
// 16 17 18 19 20 21 0
|
||||
// 15 14 13 12 11 10 1
|
||||
// 04 05 06 07 08 09 2
|
||||
// 03 02 01 3
|
||||
// -Right
|
||||
// 21 20 19 18 17 16 4
|
||||
// 10 11 12 13 14 15 5
|
||||
// 09 08 07 06 05 04 6
|
||||
// 01 02 03 7
|
||||
{ 15, 16, 17, 18, 19, 20}, |
||||
{ 14, 13, 12, 11, 10, 9 }, |
||||
{ 3, 4, 5, 6, 7, 8 }, |
||||
{ NO_LED, NO_LED, NO_LED, 2, 1, 0 }, |
||||
{ 47, 46, 45, 44, 43, 42 }, |
||||
{ 36, 37, 38, 39, 40, 41 }, |
||||
{ 35, 34, 33, 32, 31, 30 }, |
||||
{ NO_LED, NO_LED, NO_LED, 27, 28, 29 } |
||||
}, { |
||||
// Physical Layout
|
||||
// LEFT RIGHT
|
||||
// 16 17 18 19 20 21 16 17 18 19 20 21
|
||||
// 24 23 22 24 23 22
|
||||
// 15 14 13 12 11 10 15 14 13 12 11 10
|
||||
// 25 27
|
||||
// 04 05 06 07 08 09 04 05 06 07 08 09
|
||||
// 26 27 25 26
|
||||
// 03 02 01 03 02 01
|
||||
{ 95, 63 }, { 80, 58 }, { 60, 55 }, |
||||
{ 0, 41 }, { 16, 42 }, { 33, 37 }, { 50, 35 }, { 68, 37 }, { 85, 39 }, |
||||
{ 85, 21 }, { 68, 19 }, { 50, 13 }, { 33, 20 }, { 16, 24 }, { 0, 24 }, |
||||
{ 0, 7 }, { 16, 7 }, { 33, 3 }, { 50, 0 }, { 68, 2 }, { 85, 4 }, |
||||
{ 85, 16 }, { 50, 13 }, { 16, 20 }, { 16, 38 }, { 50, 48 }, { 85, 52 }, |
||||
{ 164, 55 }, { 144, 58 }, { 129, 63 }, |
||||
{ 139, 39 }, { 156, 37 }, { 174, 35 }, { 191, 37 }, { 208, 42 }, { 224, 41 }, |
||||
{ 224, 24 }, { 208, 24 }, { 191, 20 }, { 174, 13 }, { 156, 19 }, { 139, 21 }, |
||||
{ 139, 4 }, { 156, 2 }, { 174, 0 }, { 191, 3 }, { 208, 7 }, { 224, 7 }, |
||||
{ 208, 20 }, { 174, 13 }, { 139, 16 }, { 139, 52 }, { 174, 48 }, { 208, 38 } |
||||
}, { |
||||
// (x---)8 stands for indicator
|
||||
// (-x--)4 stands for per-key led
|
||||
// (--x-)2 stands for underglow led
|
||||
// (---1)1 stands for modifier key
|
||||
12, 12, 12, |
||||
4, 4, 5, 4, 4, 4, |
||||
4, 5, 5, 5, 5, 4, |
||||
4, 4, 4, 4, 4, 4, |
||||
10, 10, 10, 10, 10, 10, |
||||
12, 12, 12, |
||||
4, 4, 4, 5, 4, 4, |
||||
4, 5, 5, 5, 5, 4, |
||||
4, 4, 4, 4, 4, 4, |
||||
10, 10, 10, 10, 10, 10 |
||||
} }; |
||||
# endif // RGB_MATRIX_ENABLE
|
||||
} |
||||
|
||||
// Enable OPAMP1 as A5 → B1 follower
|
||||
#ifdef AUDIO_ENABLE |
||||
void keyboard_post_init_keymap(void) { |
||||
OPAMP3->CSR = OPAMP3_CSR_VMSEL_1 | OPAMP3_CSR_VMSEL_0 | OPAMP3_CSR_VPSEL_0 | OPAMP3_CSR_OPAMP3EN; |
||||
} |
||||
#endif // AUDIO_ENABLE
|
||||
|
||||
#ifdef OLED_ENABLE |
||||
// Flip the display on the right half
|
||||
oled_rotation_t oled_init_user(oled_rotation_t rotation) { |
||||
if (!is_keyboard_left()) { |
||||
return OLED_ROTATION_180;
|
||||
} |
||||
return rotation; |
||||
} |
||||
|
||||
bool oled_task_keymap(void) { |
||||
if (is_keyboard_left()) { |
||||
render_status_left(0, 0); |
||||
} else { |
||||
render_status_right(0, 0); |
||||
} |
||||
return false; |
||||
} |
||||
#endif // OLED_ENABLE
|
||||
#endif // KEYBOARD_crkbd_rev1
|
@ -0,0 +1,25 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
|
||||
#ifdef KEYBOARD_crkbd_rev1 |
||||
# include_next <mcuconf.h> |
||||
# undef STM32_PWM_USE_TIM3 |
||||
# define STM32_PWM_USE_TIM3 TRUE |
||||
# undef STM32_SERIAL_USE_USART1 |
||||
# define STM32_SERIAL_USE_USART1 TRUE |
||||
#endif |
@ -0,0 +1,15 @@ |
||||
This folder contains my [split\_3x6\_3](../../../default/split_3x6_3) board layouts |
||||
Check out the [user readme](../../../../users/bbaserdem/readme.md) for more info. |
||||
|
||||
# Crkbd |
||||
|
||||
Using [this](https://github.com/ItsWaffIe/waffle_corne) Proton-C compatible PCB. |
||||
|
||||
Applying the similar keymap to [@waffle](https://github.com/ItsWaffIe/waffle_corne); |
||||
using their `crkbd:rev1:arm` build. |
||||
|
||||
## Build |
||||
|
||||
Build commands; |
||||
|
||||
* For ARM: `CFLAGS="-Wno-error=deprecated" qmk flash -kb crkdb/rev1 -km bbaserdem -bl dfu-util-split-{left,right}` |
@ -0,0 +1,47 @@ |
||||
# Copyright 2021 Batuhan Başerdem
|
||||
# <baserdem.batuhan@gmail.com> @bbaserdem
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Corne keyboard; with ARM
|
||||
ifneq (,$(findstring crkbd/rev1,$(KEYBOARD))) |
||||
# Proton C conversion
|
||||
MCU = STM32F303
|
||||
CTPC = yes
|
||||
# BOARD = QMK_PROTON_C
|
||||
# BOOTLOADER = stm32-dfu
|
||||
# My usual features
|
||||
AUDIO_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = no
|
||||
ENCODER_ENABLE = yes
|
||||
RGB_MATRIX_ENABLE = yes
|
||||
OLED_ENABLE = yes
|
||||
# Features that take otherwise too much space
|
||||
WPM_ENABLE = yes
|
||||
NKRO_ENABLE = yes
|
||||
# Config
|
||||
SERIAL_DRIVER = usart
|
||||
WS2812_DRIVER = pwm
|
||||
AUDIO_DRIVER = dac_basic
|
||||
SPLIT_KEYBOARD = yes
|
||||
# These are from waffle
|
||||
DEBUG_MATRIX_SCAN_RATE_ENABLE = no # output matrix scan rate in qmk console/qmk toolbox
|
||||
QUANTUM_LIB_SRC += i2c_master.c #drivers/chibios/i2cmaster.h needs patch - see lines 27/28
|
||||
VIA_ENABLE = no
|
||||
# COMMAND_ENABLE = no
|
||||
# CONSOLE_ENABLE = no
|
||||
# BOOTMAGIC_ENABLE = lite
|
||||
# LTO_ENABLE = yes
|
||||
# PIMORONI_TRACKBALL = no
|
||||
endif |
@ -0,0 +1,16 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
@ -0,0 +1,2 @@ |
||||
/secrets.h |
||||
/secrets.c |
@ -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, |
@ -0,0 +1,82 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
|
||||
#include "bb-audio.h" |
||||
/* AUDIO
|
||||
* This contains some audio related stuff. |
||||
* There is no need to wrap this up with preprocessor commands; |
||||
* This is only called if audio is enabled |
||||
*/ |
||||
|
||||
float tone_game_intro[][2] = GAME_ON_SONG; |
||||
float tone_game_outro[][2] = GAME_OFF_SONG; |
||||
|
||||
// Audio playing when layer changes
|
||||
layer_state_t layer_state_set_audio(layer_state_t state) { |
||||
// Get this layer
|
||||
static bool prev_game = false; |
||||
|
||||
// If entering the game layer; play the intro sound
|
||||
if (layer_state_cmp(state, _GAME) && (!prev_game)) { |
||||
stop_all_notes(); |
||||
PLAY_SONG(tone_game_intro); |
||||
prev_game = true; |
||||
} |
||||
// If exiting the game layer; play the outro sound
|
||||
if ((!layer_state_cmp(state, _GAME)) && prev_game) { |
||||
stop_all_notes(); |
||||
PLAY_SONG(tone_game_outro); |
||||
prev_game = false; |
||||
} |
||||
return state; |
||||
} |
||||
|
||||
// Audio layer switch; add the music layer on top of this
|
||||
bool process_record_audio(uint16_t keycode, keyrecord_t *record) { |
||||
switch (keycode) { |
||||
case MU_TOG: |
||||
if (!record->event.pressed) { |
||||
// On release, exit music mode if enabled
|
||||
if (layer_state_is(_MUSI)) { |
||||
layer_off(_MUSI); |
||||
// If not enabled; turn off all layers and load music layer
|
||||
} else { |
||||
layer_clear(); |
||||
layer_on(_MUSI); |
||||
} |
||||
} |
||||
return true; |
||||
break; |
||||
case MU_ON: |
||||
if (!record->event.pressed) { |
||||
// On release, enter music mode
|
||||
layer_clear(); |
||||
layer_on(_MUSI); |
||||
} |
||||
return true; |
||||
break; |
||||
case MU_OFF: |
||||
if (!record->event.pressed) { |
||||
// On release, exit music mode
|
||||
layer_off(_MUSI); |
||||
} |
||||
return true; |
||||
break; |
||||
} |
||||
return true; |
||||
} |
@ -0,0 +1,28 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
#include "bbaserdem.h" |
||||
|
||||
/* AUDIO
|
||||
* Some functions to hook to some modes |
||||
*/ |
||||
|
||||
// Hook to layer change effects
|
||||
layer_state_t layer_state_set_audio(layer_state_t state); |
||||
|
||||
// Hook to audio keycodes
|
||||
bool process_record_audio(uint16_t keycode, keyrecord_t *record); |
@ -0,0 +1,30 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include "bb-backlight.h" |
||||
/* Replaced functions with noeeprom varieties; I don't need retention across
|
||||
* booting. |
||||
*/ |
||||
|
||||
// Backlight LEDs
|
||||
void keyboard_post_init_backlight(void) { |
||||
backlight_enable(); |
||||
backlight_level(2); |
||||
# ifdef BACKLIGHT_BREATHING |
||||
breathing_enable(); |
||||
# endif // BACKLIGHT_BREATHING
|
||||
} |
@ -0,0 +1,23 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
#include "bbaserdem.h" |
||||
|
||||
/* Hooks for backlight definitions
|
||||
*/ |
||||
|
||||
void keyboard_post_init_backlight(void); |
@ -0,0 +1,514 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#include "bb-encoder.h" |
||||
|
||||
// Need this to call velocikey activation
|
||||
#ifdef VELOCIKEY_ENABLE |
||||
# include "velocikey.h" |
||||
#endif // VELOCIKEY_ENABLE
|
||||
// Need memcpy and memcmp from string.h along with transfer stuff
|
||||
#ifdef OLED_ENABLE |
||||
# include <string.h> |
||||
#endif // OLED_ENABLE
|
||||
|
||||
/* ROTARY ENCODER
|
||||
* This contains my general rotary encoder code |
||||
* Encoders each have a list of different modes they can be in. |
||||
* Each mode also have an on click action as well. |
||||
* Modes can be cycled using either shift-click or ctrl-click |
||||
* Modes can be reset using OS click |
||||
* Some modes are only accessible through some keymap layers |
||||
*/ |
||||
|
||||
// Default state for the encoders
|
||||
void reset_encoder_state(void) { |
||||
userspace_config.e0base = 0; |
||||
userspace_config.e0point = 0; |
||||
userspace_config.e0rgb = 0; |
||||
userspace_config.e1base = 1; |
||||
userspace_config.e1point = 1; |
||||
userspace_config.e1rgb = 1; |
||||
} |
||||
|
||||
// Encoder scroll functionality
|
||||
bool encoder_update_user(uint8_t index, bool clockwise) { |
||||
uint8_t this_number; |
||||
// Differentiate layer roles
|
||||
switch (get_highest_layer(layer_state)) { |
||||
# ifdef RGB_MATRIX_ENABLE |
||||
case _MEDI: |
||||
// Get correct index
|
||||
if (index == 0) { |
||||
this_number = userspace_config.e0rgb; |
||||
} else if (index == 1) { |
||||
this_number = userspace_config.e1rgb; |
||||
} else { |
||||
this_number = 128; |
||||
} |
||||
switch(this_number) { |
||||
case 0: // Effect the RGB mode
|
||||
if (clockwise) { |
||||
rgb_matrix_step_noeeprom(); |
||||
} else { |
||||
rgb_matrix_step_reverse_noeeprom(); |
||||
} |
||||
break; |
||||
case 1: // Effect the RGB hue
|
||||
if (clockwise) { |
||||
rgb_matrix_increase_hue_noeeprom(); |
||||
} else { |
||||
rgb_matrix_decrease_hue_noeeprom(); |
||||
} |
||||
break; |
||||
case 2: // Effect the RGB saturation
|
||||
if (clockwise) { |
||||
rgb_matrix_increase_sat_noeeprom(); |
||||
} else { |
||||
rgb_matrix_decrease_sat_noeeprom(); |
||||
} |
||||
break; |
||||
case 3: // Effect the RGB brightness
|
||||
if (clockwise) { |
||||
rgb_matrix_increase_val_noeeprom(); |
||||
} else { |
||||
rgb_matrix_decrease_val_noeeprom(); |
||||
} |
||||
break; |
||||
case 4: // Effect the RGB effect speed
|
||||
if (clockwise) { |
||||
rgb_matrix_increase_speed_noeeprom(); |
||||
} else { |
||||
rgb_matrix_decrease_speed_noeeprom(); |
||||
} |
||||
break; |
||||
} |
||||
break; |
||||
# endif // RGB_MATRIX_ENABLE
|
||||
# ifdef MOUSEKEY_ENABLE |
||||
case _MOUS: |
||||
// Get correct index
|
||||
if (index == 0) { |
||||
this_number = userspace_config.e0point; |
||||
} else if (index == 1) { |
||||
this_number = userspace_config.e1point; |
||||
} else { |
||||
this_number = 128; |
||||
} |
||||
switch(this_number) { |
||||
case 0: // Move mouse on horizontal axis
|
||||
if (clockwise) { |
||||
tap_code(KC_MS_R); |
||||
} else { |
||||
tap_code(KC_MS_L); |
||||
} |
||||
break; |
||||
case 1: // Move mouse on vertical axis
|
||||
if (clockwise) { |
||||
tap_code(KC_MS_D); |
||||
} else { |
||||
tap_code(KC_MS_U); |
||||
} |
||||
break; |
||||
case 2: // Move mouse wheel on vertical axis
|
||||
if (clockwise) { |
||||
tap_code(KC_WH_D); |
||||
} else { |
||||
tap_code(KC_WH_U); |
||||
} |
||||
break; |
||||
case 3: // Move mouse on horizontal axis
|
||||
if (clockwise) { |
||||
tap_code(KC_WH_R); |
||||
} else { |
||||
tap_code(KC_WH_L); |
||||
} |
||||
break; |
||||
} |
||||
break; |
||||
# endif // MOUSEKEY_ENABLE
|
||||
default: |
||||
// Get correct index
|
||||
if (index == 0) { |
||||
this_number = userspace_config.e0base; |
||||
} else if (index == 1) { |
||||
this_number = userspace_config.e1base; |
||||
} else { |
||||
this_number = 128; |
||||
} |
||||
switch(this_number) { |
||||
case 0: // Volume
|
||||
if (clockwise) { |
||||
tap_code16(KC_VOLU); |
||||
} else { |
||||
tap_code16(KC_VOLD); |
||||
} |
||||
break; |
||||
case 1: // Song change
|
||||
if (clockwise) { |
||||
tap_code16(KC_MNXT); |
||||
} else { |
||||
tap_code16(KC_MPRV); |
||||
} |
||||
break; |
||||
case 2: // Move to audio sink
|
||||
if (clockwise) { |
||||
tap_code16(KC_F13); |
||||
} else { |
||||
tap_code16(S(KC_F13)); |
||||
} |
||||
break; |
||||
case 3: // Volume of source
|
||||
if (clockwise) { |
||||
tap_code16(S(KC_VOLU)); |
||||
} else { |
||||
tap_code16(C(KC_VOLD)); |
||||
} |
||||
break; |
||||
case 4: // Move to audio source
|
||||
if (clockwise) { |
||||
tap_code16(C(KC_F13)); |
||||
} else { |
||||
tap_code16(C(S(KC_F13))); |
||||
} |
||||
break; |
||||
case 5: // Left-right
|
||||
if (clockwise) { |
||||
tap_code16(KC_RGHT); |
||||
} else { |
||||
tap_code16(KC_LEFT); |
||||
} |
||||
break; |
||||
case 6: // Up-down
|
||||
if (clockwise) { |
||||
tap_code16(KC_DOWN); |
||||
} else { |
||||
tap_code16(KC_UP); |
||||
} |
||||
break; |
||||
case 7: // Page Up-down
|
||||
if (clockwise) { |
||||
tap_code16(KC_PGDN); |
||||
} else { |
||||
tap_code16(KC_PGUP); |
||||
} |
||||
break; |
||||
case 8: // Delete
|
||||
if (clockwise) { |
||||
tap_code16(KC_DEL); |
||||
} else { |
||||
tap_code16(KC_BSPC); |
||||
} |
||||
break; |
||||
} |
||||
break; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
void encoder_click_action(uint8_t index) { |
||||
uint8_t this_number; |
||||
// Differentiate layer roles
|
||||
switch (get_highest_layer(layer_state)) { |
||||
# ifdef RGB_MATRIX_ENABLE |
||||
case _MEDI: |
||||
// Get correct index
|
||||
if (index == 0) { |
||||
this_number = userspace_config.e0rgb; |
||||
} else if (index == 1) { |
||||
this_number = userspace_config.e1rgb; |
||||
} else { |
||||
this_number = 128; |
||||
} |
||||
switch(this_number) { |
||||
case 0: // Return to no animation
|
||||
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR); |
||||
break; |
||||
case 1: |
||||
case 2: |
||||
case 3: // Toggle
|
||||
rgb_matrix_increase_val_noeeprom(); |
||||
break; |
||||
case 4: // Toggle velocikey
|
||||
# ifdef VELOCIKEY_ENABLE |
||||
velocikey_toggle(); |
||||
# endif // VELOCIKEY_ENABLE
|
||||
break; |
||||
} |
||||
break; |
||||
# endif // RGB_MATRIX_ENABLE
|
||||
# ifdef MOUSEKEY_ENABLE |
||||
case _MOUS: |
||||
// Get correct index
|
||||
if (index == 0) { |
||||
this_number = userspace_config.e0point; |
||||
} else if (index == 1) { |
||||
this_number = userspace_config.e1point; |
||||
} else { |
||||
this_number = 128; |
||||
} |
||||
switch(this_number) { |
||||
case 0: // Left click
|
||||
tap_code16(KC_BTN1); |
||||
break; |
||||
case 1: // Right click
|
||||
tap_code16(KC_BTN2); |
||||
break; |
||||
case 2: |
||||
case 3: // Middle click
|
||||
tap_code16(KC_BTN2); |
||||
break; |
||||
} |
||||
break; |
||||
# endif // MOUSEKEY_ENABLE
|
||||
default: |
||||
// Get correct index
|
||||
if (index == 0) { |
||||
this_number = userspace_config.e0base; |
||||
} else if (index == 1) { |
||||
this_number = userspace_config.e1base; |
||||
} else { |
||||
this_number = 128; |
||||
} |
||||
switch(this_number) { |
||||
case 0: // Toggle mute
|
||||
case 2: |
||||
tap_code16(KC_MUTE); |
||||
break; |
||||
case 1: // Pause
|
||||
tap_code16(KC_MPLY); |
||||
break; |
||||
case 3: // Mute source
|
||||
case 4: |
||||
tap_code16(A(KC_MUTE)); |
||||
break; |
||||
case 5: // Insert
|
||||
tap_code16(KC_INS); |
||||
break; |
||||
case 6: // Capslock
|
||||
tap_code16(KC_CAPS); |
||||
break; |
||||
case 7: // Redo
|
||||
tap_code16(BB_REDO); |
||||
break; |
||||
case 8: // Undo
|
||||
tap_code16(BB_UNDO); |
||||
break; |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
|
||||
bool process_record_encoder(uint16_t keycode, keyrecord_t *record) { |
||||
// Check if and which encoder
|
||||
int encoder_index = -1; |
||||
|
||||
// Get the pressed encoder
|
||||
switch (keycode) { |
||||
case BB_ENC0: |
||||
encoder_index = 0; |
||||
break; |
||||
case BB_ENC1: |
||||
encoder_index = 1; |
||||
break; |
||||
} |
||||
|
||||
// Activate encoder function of button
|
||||
if ((encoder_index >= 0) & (!record->event.pressed)) { |
||||
// If shifted, move mode one point forward
|
||||
if (get_mods() & MOD_MASK_SHIFT) { |
||||
switch (get_highest_layer(layer_state)) { |
||||
# ifdef RGB_MATRIX_ENABLE |
||||
case _MEDI: |
||||
if (encoder_index == 0) { |
||||
userspace_config.e0rgb = (userspace_config.e0rgb + 1) % 5; |
||||
} else { |
||||
userspace_config.e1rgb = (userspace_config.e1rgb + 1) % 5; |
||||
} |
||||
break; |
||||
# endif // RGB_MATRIX_ENABLE
|
||||
# ifdef MOUSEKEY_ENABLE |
||||
case _MOUS: |
||||
if (encoder_index == 0) { |
||||
userspace_config.e0point = (userspace_config.e0point + 1) % 4; |
||||
} else { |
||||
userspace_config.e1point = (userspace_config.e1point + 1) % 4; |
||||
} |
||||
break; |
||||
# endif // MOUSEKEY_ENABLE
|
||||
default: |
||||
if (encoder_index == 0) { |
||||
userspace_config.e0base = (userspace_config.e0base + 1) % 9; |
||||
} else { |
||||
userspace_config.e1base = (userspace_config.e1base + 1) % 9; |
||||
} |
||||
break; |
||||
} |
||||
// If ctrl is active, move mode one point backwards
|
||||
} else if (get_mods() & MOD_MASK_CTRL) { |
||||
switch (get_highest_layer(layer_state)) { |
||||
# ifdef RGB_MATRIX_ENABLE |
||||
case _MEDI: |
||||
if (encoder_index == 0) { |
||||
userspace_config.e0rgb = (userspace_config.e0rgb + 5 - 1) % 5; |
||||
} else { |
||||
userspace_config.e1rgb = (userspace_config.e1rgb + 5 - 1) % 5; |
||||
} |
||||
break; |
||||
# endif // RGB_MATRIX_ENABLE
|
||||
# ifdef MOUSEKEY_ENABLE |
||||
case _MOUS: |
||||
if (encoder_index == 0) { |
||||
userspace_config.e0point = (userspace_config.e0point + 4 - 1) % 4; |
||||
} else { |
||||
userspace_config.e1point = (userspace_config.e1point + 4 - 1) % 4; |
||||
} |
||||
break; |
||||
# endif // MOUSEKEY_ENABLE
|
||||
default: |
||||
if (encoder_index == 0) { |
||||
userspace_config.e0base = (userspace_config.e0base + 9 - 1) % 9; |
||||
} else { |
||||
userspace_config.e1base = (userspace_config.e1base + 9 - 1) % 9; |
||||
} |
||||
break; |
||||
} |
||||
// If meta is active, reset the encoder states
|
||||
} else if (get_mods() & MOD_MASK_GUI) { |
||||
reset_encoder_state(); |
||||
eeconfig_update_user(userspace_config.raw); |
||||
// If nothing else; just perform the click action
|
||||
} else { |
||||
encoder_click_action(encoder_index); |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
// For printing status to OLED
|
||||
#ifdef OLED_ENABLE |
||||
void encoder_state_string(uint8_t index, uint8_t layer, char* buffer) { |
||||
uint8_t this_number; |
||||
// Get the layer straight from the main function
|
||||
switch (layer) { |
||||
// If RGB control mode is enabled
|
||||
# ifdef RGB_MATRIX_ENABLE |
||||
case _MEDI: |
||||
// Get correct index
|
||||
if (index == 0) { |
||||
this_number = userspace_config.e0rgb; |
||||
} else if (index == 1) { |
||||
this_number = userspace_config.e1rgb; |
||||
} else { |
||||
this_number = 128; |
||||
} |
||||
switch (this_number) { |
||||
case 0: |
||||
strcpy(buffer, "ani mode"); |
||||
break; |
||||
case 1: |
||||
strcpy(buffer, "hue "); |
||||
break; |
||||
case 2: |
||||
strcpy(buffer, "saturat."); |
||||
break; |
||||
case 3: |
||||
strcpy(buffer, "bright. "); |
||||
break; |
||||
case 4: |
||||
strcpy(buffer, "ani. spd"); |
||||
break; |
||||
default: |
||||
strcpy(buffer, " -N/A- "); |
||||
break; |
||||
} |
||||
break; |
||||
# endif // RGB_MATRIX_ENABLE
|
||||
// If pointer control is enabled
|
||||
# ifdef MOUSEKEY_ENABLE |
||||
case _MOUS: |
||||
// Get correct index
|
||||
if (index == 0) { |
||||
this_number = userspace_config.e0point; |
||||
} else if (index == 1) { |
||||
this_number = userspace_config.e1point; |
||||
} else { |
||||
this_number = 128; |
||||
} |
||||
switch (this_number) { |
||||
case 0: |
||||
strcpy(buffer, "Lateral "); |
||||
break; |
||||
case 1: |
||||
strcpy(buffer, "Vertical"); |
||||
break; |
||||
case 2: |
||||
strcpy(buffer, "Scr. Ver"); |
||||
break; |
||||
case 3: |
||||
strcpy(buffer, "Scr. Lat"); |
||||
break; |
||||
default: |
||||
strcpy(buffer, " -N/A- "); |
||||
break; |
||||
} |
||||
break; |
||||
# endif // MOUSEKEY_ENABLE
|
||||
default: |
||||
// Get correct index
|
||||
if (index == 0) { |
||||
this_number = userspace_config.e0base; |
||||
} else if (index == 1) { |
||||
this_number = userspace_config.e1base; |
||||
} else { |
||||
this_number = 128; |
||||
} |
||||
switch (this_number) { |
||||
case 0: |
||||
strcpy(buffer, "Volume "); |
||||
break; |
||||
case 1: |
||||
strcpy(buffer, "Song "); |
||||
break; |
||||
case 2: |
||||
strcpy(buffer, "Sink "); |
||||
break; |
||||
case 3: |
||||
strcpy(buffer, "Src. Vol"); |
||||
break; |
||||
case 4: |
||||
strcpy(buffer, "Source "); |
||||
break; |
||||
case 5: |
||||
strcpy(buffer, "Arrow LR"); |
||||
break; |
||||
case 6: |
||||
strcpy(buffer, "Arrow UD"); |
||||
break; |
||||
case 7: |
||||
strcpy(buffer, "Page U/D"); |
||||
break; |
||||
case 8: |
||||
strcpy(buffer, "Erase "); |
||||
break; |
||||
default: |
||||
strcpy(buffer, " -N/A- "); |
||||
break; |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
#endif // OLED_ENABLE
|
@ -0,0 +1,29 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
#include "bbaserdem.h" |
||||
|
||||
// Hook to encoder stuff
|
||||
bool encoder_update_user(uint8_t index, bool clockwise); |
||||
// Complicated code for what the encoder keys do when pressed
|
||||
bool process_record_encoder(uint16_t keycode, keyrecord_t *record); |
||||
// Clear the encoder settings
|
||||
void reset_encoder_state(void); |
||||
// This is so that encoder state is synched between two halves
|
||||
void housekeeping_task_encoder(void); |
||||
// This is purely for oled; should it want to use it
|
||||
void encoder_state_string(uint8_t index, uint8_t layer, char* buffer); |
@ -0,0 +1,113 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
#include "bbaserdem.h" |
||||
|
||||
/* This header file contains definitons regarding custom keycodes.
|
||||
* - Both regular and unicode macros are dealt with in this file |
||||
*/ |
||||
|
||||
// These will be delegated to keymap specific stuff (weak definition)
|
||||
bool process_record_macro(uint16_t keycode, keyrecord_t *record); |
||||
|
||||
// Unicodemap implementation
|
||||
#ifdef UNICODEMAP_ENABLE |
||||
enum userspace_unicodemap { |
||||
UPC_A_CIRC, |
||||
UPC_C_CEDI, |
||||
UPC_G_BREV, |
||||
UPC_I_CIRC, |
||||
UPC_I_DOTL, |
||||
UPC_I_DOTT, |
||||
UPC_O_DIAE, |
||||
UPC_S_CEDI, |
||||
UPC_U_CIRC, |
||||
UPC_U_DIAE, |
||||
LOW_A_CIRC, |
||||
LOW_C_CEDI, |
||||
LOW_G_BREV, |
||||
LOW_I_CIRC, |
||||
LOW_I_DOTL, |
||||
LOW_I_DOTT, |
||||
LOW_O_DIAE, |
||||
LOW_S_CEDI, |
||||
LOW_U_CIRC, |
||||
LOW_U_DIAE, |
||||
ELLIPSIS, |
||||
PLANCK_CON, |
||||
ANGSTROM, |
||||
MATHPI, |
||||
BITCOIN, |
||||
UPC_ALPHA, |
||||
UPC_BETA, |
||||
UPC_GAMMA, |
||||
UPC_DELTA, |
||||
UPC_EPSILON, |
||||
UPC_ZETA, |
||||
UPC_ETA, |
||||
UPC_THETA, |
||||
UPC_IOTA, |
||||
UPC_KAPPA, |
||||
UPC_LAMBDA, |
||||
UPC_MU, |
||||
UPC_NU, |
||||
UPC_XI, |
||||
UPC_OMICRON, |
||||
UPC_PI, |
||||
UPC_RHO, |
||||
UPC_SIGMA, |
||||
UPC_TAU, |
||||
UPC_UPSILON, |
||||
UPC_PHI, |
||||
UPC_CHI, |
||||
UPC_PSI, |
||||
UPC_OMEGA, |
||||
LOW_ALPHA, |
||||
LOW_BETA, |
||||
LOW_GAMMA, |
||||
LOW_DELTA, |
||||
LOW_EPSILON, |
||||
LOW_ZETA, |
||||
LOW_ETA, |
||||
LOW_THETA, |
||||
LOW_IOTA, |
||||
LOW_KAPPA, |
||||
LOW_LAMBDA, |
||||
LOW_MU, |
||||
LOW_NU, |
||||
LOW_XI, |
||||
LOW_OMICRON, |
||||
LOW_PI, |
||||
LOW_RHO, |
||||
LOW_SIGMA, |
||||
LOW_TAU, |
||||
LOW_UPSILON, |
||||
LOW_PHI, |
||||
LOW_CHI, |
||||
LOW_PSI, |
||||
LOW_OMEGA, |
||||
}; |
||||
#endif // UNICODEMAP_ENABLE
|
||||
|
||||
// Tap dance stuff
|
||||
#ifdef AUDIO_ENABLE |
||||
#ifdef TAP_DANCE_ENABLE |
||||
enum { |
||||
TD_AUDIO_TEMPO, |
||||
}; |
||||
#endif // AUDIO_ENABLE
|
||||
#endif // TAP_DANCE_ENABLE
|
@ -0,0 +1,796 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#include "bb-oled.h" |
||||
#include "bb-oled-extra.h" |
||||
|
||||
// Helper function that draws images
|
||||
void draw_image(uint8_t row, uint8_t col, const char image[4][42]) { |
||||
// Draw this image iteratively
|
||||
for (int i = 0; i < 4; i++) { |
||||
oled_set_cursor(col, row + i); |
||||
oled_write_raw_P(image[i], 42); |
||||
} |
||||
} |
||||
|
||||
// Write modifiers to the screen
|
||||
void render_modifiers(uint8_t row, uint8_t col, uint8_t mods) { |
||||
static const char PROGMEM mod_meta[12] = {0x00,0x01,0x01,0x01,0x01,0x06,0x18,0x60,0x81,0x81,0x81,0x81}; |
||||
static const char PROGMEM mod_altL[12] = {0x00,0x80,0x80,0x80,0x40,0x20,0x10,0x08,0x84,0x95,0x8e,0x84}; |
||||
static const char PROGMEM mod_altR[12] = {0x00,0x86,0x8f,0x8f,0x46,0x20,0x10,0x08,0x84,0x95,0x8e,0x84}; |
||||
static const char PROGMEM mod_ctrl[12] = {0x00,0x00,0xbd,0x42,0xa5,0x99,0x99,0xa5,0x42,0xbd,0x00,0x00}; |
||||
static const char PROGMEM mod_shft[12] = {0x00,0x20,0x30,0x28,0xe4,0x02,0x01,0x02,0xe4,0x28,0x30,0x20}; |
||||
// Looks like Mods: <OS> <Alt/Gr> <Ctrl> <Shift>
|
||||
oled_set_cursor(col, row); |
||||
oled_write("Mods: ", false); |
||||
// Meta
|
||||
if (mods & MOD_MASK_GUI) { |
||||
oled_write_raw_P(mod_meta, 12); |
||||
oled_set_cursor(col + 8, row); |
||||
} else { |
||||
oled_write(" ", false); |
||||
} |
||||
// Alt(Gr)
|
||||
if (mods & MOD_BIT(KC_RALT)) { |
||||
oled_write_raw_P(mod_altR, 12); |
||||
oled_set_cursor(col + 10, row); |
||||
} else if (mods & MOD_MASK_ALT) { |
||||
oled_write_raw_P(mod_altL, 12); |
||||
oled_set_cursor(col + 10, row); |
||||
} else { |
||||
oled_write(" ", false); |
||||
} |
||||
// Ctrl
|
||||
if (mods & MOD_MASK_CTRL) { |
||||
oled_write_raw_P(mod_ctrl, 12); |
||||
oled_set_cursor(col + 12, row); |
||||
} else { |
||||
oled_write(" ", false); |
||||
} |
||||
// Shift
|
||||
if (mods & MOD_MASK_SHIFT) { |
||||
oled_write_raw_P(mod_shft, 12); |
||||
oled_set_cursor(col + 14, row); |
||||
} else { |
||||
oled_write(" ", false); |
||||
} |
||||
} |
||||
|
||||
// Draws the image of the currently used layout
|
||||
void render_layout(uint8_t row, uint8_t col, uint8_t mods, bool isLeft) { |
||||
// DVORAK
|
||||
static const char PROGMEM base0_L_dvor_nomod[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x04,0x08,0x10,0x00,0x00,0x00, |
||||
0x00,0x0e,0x00,0x00,0x00,0x00,0x60,0xe0,0x00,0x00,0x00,0x00,0xc0,0xc0, |
||||
0x00,0x00,0x00,0xf8,0x90,0x88,0x88,0x70,0x00,0x78,0x80,0x80,0x40,0xf8 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x00,0x00, |
||||
0x40,0x40,0x40,0x80,0x00,0x80,0x41,0x40,0x40,0x80,0x00,0x80,0x40,0x40, |
||||
0x40,0x80,0x00,0xc3,0x00,0x00,0x00,0xc0,0x00,0x00,0x42,0xd2,0x02,0x01 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0xd8,0x06,0x01,0x00,0x00,0x00,0x02, |
||||
0x05,0x05,0x05,0x07,0x00,0x03,0x04,0x04,0x04,0x03,0x00,0x03,0x05,0x05, |
||||
0x85,0x05,0x00,0xc3,0x04,0x04,0x02,0x07,0x00,0x00,0x00,0x07,0x04,0x00 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x03,0x0c,0x30,0xc0,0x00,0x00, |
||||
0xb6,0x76,0x00,0x00,0x00,0x1c,0x22,0x22,0x12,0xfe,0x00,0x00,0x80,0x82, |
||||
0x7e,0x00,0x00,0x3f,0x08,0x0c,0x12,0x20,0x00,0x22,0x14,0x08,0x14,0x22}}; |
||||
static const char PROGMEM base0_L_dvor_shift[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x20,0x10,0x20,0x40,0x20,0x00,0x00, |
||||
0x07,0x00,0x07,0x00,0x00,0x10,0x28,0x44,0x82,0x00,0x00,0x82,0x44,0x28, |
||||
0x10,0x00,0x00,0xfe,0x12,0x12,0x12,0x0c,0x00,0x06,0x08,0xf0,0x08,0x06 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xe0, |
||||
0x90,0x90,0x90,0xe0,0x00,0xe0,0x10,0x10,0x10,0xe0,0x00,0xf0,0x90,0x90, |
||||
0x90,0x10,0x00,0xf0,0x00,0x00,0x00,0xf0,0x00,0x00,0x10,0xf0,0x10,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x80,0x87,0x80,0x00,0x00,0x07, |
||||
0x00,0x00,0x00,0x07,0x00,0x03,0x84,0x84,0x84,0x03,0x00,0x07,0x04,0x04, |
||||
0x04,0x84,0x00,0x83,0x04,0x04,0x04,0x83,0x00,0x80,0x04,0x07,0x04,0x80 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x01,0x00,0x28,0x04,0x03,0x00,0x00, |
||||
0x36,0x36,0x00,0x00,0x00,0x1f,0x20,0x28,0x10,0x6f,0x00,0x18,0x20,0x20, |
||||
0x20,0x1f,0x00,0x3f,0x04,0x0a,0x11,0x20,0x00,0x31,0x0a,0x04,0x0a,0x31}}; |
||||
static const char PROGMEM base0_R_dvor_nomod[4][42] = { |
||||
{ 0x00,0xfc,0x12,0x12,0x00,0x00,0x70,0x88,0x88,0x48,0xf8,0x00,0x70,0x88, |
||||
0x88,0x88,0x88,0x00,0xf8,0x10,0x08,0x08,0x10,0x00,0x00,0x02,0x7e,0x80, |
||||
0x80,0x00,0x10,0x28,0x44,0x82,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0x00,0x80,0x80,0x80,0xf0,0x00,0xf0,0x02,0x82,0x82,0x01,0x00,0x00,0x80, |
||||
0xf0,0x80,0x80,0x00,0xc0,0x40,0x40,0x40,0x80,0x00,0x80,0x40,0x40,0x40, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x83,0x04,0x04,0x02,0x07,0x00,0x07,0x01,0x00,0x00,0x07,0x00,0x00,0x00, |
||||
0x03,0x04,0x04,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x04,0x05,0x05,0x05, |
||||
0x02,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x3f,0x24,0x22,0x22,0x1c,0x00,0x3e,0x02,0x3e,0x02,0x3c,0x00,0x1e,0x20, |
||||
0x1c,0x20,0x1e,0x00,0x06,0x18,0x20,0x18,0x06,0x00,0x22,0x32,0x2a,0x26, |
||||
0x22,0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM base0_R_dvor_shift[4][42] = { |
||||
{ 0xfe,0x12,0x12,0x12,0x02,0x00,0xfc,0x02,0x12,0x12,0xf4,0x00,0xfc,0x02, |
||||
0x02,0x02,0x84,0x00,0xfe,0x12,0x12,0x32,0xcc,0x00,0xfe,0x00,0x00,0x00, |
||||
0x00,0x00,0x04,0x88,0x50,0x20,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0xf1,0x10,0x10,0x10,0xe0,0x00,0xf0,0x81,0x81,0x81,0xf0,0x00,0x10,0x11, |
||||
0xf1,0x11,0x10,0x00,0xf1,0x60,0x80,0x00,0xf1,0x00,0x61,0x91,0x91,0x91, |
||||
0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x8f,0x88,0x88,0x88,0x07,0x00,0x8f,0x00,0x00,0x00,0x8f,0x00,0x80,0x00, |
||||
0x0f,0x00,0x80,0x00,0x8f,0x00,0x01,0x06,0x8f,0x00,0x84,0x88,0x88,0x88, |
||||
0x87,0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x7f,0x44,0x44,0x44,0x3b,0x00,0x7f,0x01,0x06,0x01,0x7f,0x00,0x1f,0x60, |
||||
0x1c,0x60,0x1f,0x00,0x07,0x18,0x60,0x18,0x07,0x00,0x70,0x48,0x44,0x42, |
||||
0x41,0x00,0x08,0x08,0x3e,0x08,0x08,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM symb5_R_dvor[4][42] = { |
||||
{ 0x00,0x02,0x04,0x08,0x00,0x00,0x20,0x20,0xdc,0x02,0x02,0x00,0x02,0x02, |
||||
0xdc,0x20,0x20,0x00,0x00,0xc0,0x30,0x0c,0x03,0x00,0x50,0x50,0x50,0x50, |
||||
0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0xf0,0x11,0x12,0x02,0x00,0x02,0x12, |
||||
0x11,0xf0,0x00,0x00,0x43,0x20,0x20,0x20,0xc0,0x00,0x00,0x00,0xc0,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x01,0x80,0x41,0x82,0x01,0x00,0x00,0x1f,0x10,0x90,0x00,0x00,0x00,0x90, |
||||
0x10,0x1f,0x00,0x00,0xc0,0x00,0x14,0x03,0x00,0x00,0x01,0x01,0x87,0x01, |
||||
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x22,0xf3,0x0a,0xf3,0x22,0x00,0x00,0x1c,0x63,0x80,0x00,0x00,0x00,0x80, |
||||
0x63,0x1c,0x00,0x00,0x00,0x03,0x0c,0x30,0xc0,0x00,0x00,0x00,0x7f,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM numb6_L_dvor_nomod[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20, |
||||
0x50,0x88,0x04,0x00,0x00,0x04,0x04,0xc4,0x34,0x0c,0x00,0xd8,0x24,0x24, |
||||
0x24,0xd8,0x00,0x18,0x24,0x24,0x24,0xf8,0x00,0xf8,0x44,0x24,0x14,0xf8 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x41,0xe0,0x00,0x00,0xe0,0xa1,0xa1, |
||||
0xa1,0x20,0x00,0xc0,0xa1,0xa1,0xa1,0x00,0x00,0x00,0x01,0x01,0x01,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08, |
||||
0x08,0x08,0x08,0x08,0x00,0x03,0x02,0x02,0x0f,0x02,0x00,0x04,0x08,0x08, |
||||
0x08,0x07,0x00,0x07,0x08,0x08,0x08,0x07,0x00,0x01,0x01,0x01,0x01,0x00 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, |
||||
0x22,0x14,0x08,0x00,0x00,0x00,0x04,0x02,0x7f,0x00,0x00,0x42,0x61,0x51, |
||||
0x49,0x46,0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x5e,0x61,0x01,0x61,0x5e}}; |
||||
static const char PROGMEM numb6_L_dvor_shift[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0xd8,0x24,0x54,0x88,0x40,0x00,0x50,0x20,0xf8, |
||||
0x20,0x50,0x00,0x00,0x38,0xc6,0x01,0x00,0x00,0x00,0x01,0xc6,0x38,0x00 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x60,0x91,0xf9,0x90,0x21,0x00,0x20,0x50,0x20, |
||||
0x80,0x60,0x00,0x40,0x20,0x10,0x21,0x40,0x00,0x00,0x01,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x8f,0x04,0x03,0x00,0x0c,0x02,0x09, |
||||
0x14,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x3e,0x41,0x5d, |
||||
0x55,0x5e,0x00,0x14,0x7f,0x14,0x7f,0x14,0x00,0x00,0x00,0x00,0x00,0x00}}; |
||||
// Turkish F
|
||||
static const char PROGMEM base0_L_turf_nomod[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x10,0x10,0x7c,0x10,0x10,0x00,0x00, |
||||
0xfe,0x09,0x09,0x00,0x00,0x70,0x88,0x88,0x48,0xf8,0x00,0x51,0xaa,0xaa, |
||||
0x92,0x09,0x00,0x00,0x88,0xf8,0x80,0x00,0x00,0x70,0x88,0x88,0x88,0x70 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x40,0x80,0x00,0x80,0x40,0x00,0xc0, |
||||
0x00,0x00,0x00,0xc0,0x00,0x00,0x42,0xd2,0x02,0x01,0x00,0x81,0x42,0x42, |
||||
0x42,0x81,0x00,0x00,0x40,0x40,0x40,0x80,0x00,0xc0,0x10,0x00,0x10,0xc0 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x03, |
||||
0x04,0x04,0x82,0x07,0x00,0x00,0x80,0x07,0x84,0x00,0x00,0x03,0x05,0x05, |
||||
0x05,0x05,0x00,0x02,0x05,0x05,0x05,0x07,0x00,0x03,0x04,0x04,0x02,0x07 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x1c,0x22,0x22,0x12,0xfe,0x00,0x00, |
||||
0x80,0x82,0x7e,0x00,0x00,0x1c,0x22,0x22,0x22,0x1c,0x00,0x06,0x18,0x20, |
||||
0x18,0x06,0x00,0x1c,0x22,0x22,0x22,0x22,0x00,0x1c,0xa2,0x62,0x22,0x22}}; |
||||
static const char PROGMEM base0_L_turf_shift[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x28,0x10,0x7c,0x10,0x28,0x00,0xfe, |
||||
0x12,0x12,0x12,0x02,0x00,0xfc,0x02,0x12,0x12,0xf4,0x00,0xf1,0x0a,0x4a, |
||||
0x4a,0xd1,0x00,0x00,0x02,0xfe,0x02,0x00,0x00,0xfc,0x02,0x02,0x02,0xfc |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x30,0x40,0x80,0x40,0x30,0x00,0xf1, |
||||
0x00,0x00,0x00,0xf0,0x00,0x00,0x21,0xe9,0x21,0x00,0x00,0xf1,0x92,0x92, |
||||
0x92,0x11,0x00,0xe0,0x91,0x91,0x91,0xe0,0x00,0xe0,0x09,0x01,0x09,0xe0 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x0e,0x81,0x80,0x81,0x0e,0x00,0x07, |
||||
0x08,0x08,0x08,0x87,0x00,0x00,0x50,0x1f,0x50,0x00,0x00,0x8f,0x08,0x08, |
||||
0x08,0x88,0x00,0x0f,0x80,0x80,0x80,0x0f,0x00,0x8f,0x50,0x50,0x50,0x8f |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x3f,0x40,0x50,0x20,0xdf,0x00,0x30, |
||||
0x40,0x40,0x40,0x3f,0x00,0x7e,0x81,0x81,0x81,0x7e,0x00,0x07,0x18,0x60, |
||||
0x18,0x07,0x00,0x3f,0x40,0x40,0x40,0x21,0x00,0x1f,0xa0,0x60,0x20,0x10}}; |
||||
static const char PROGMEM base0_L_turf_altgr[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x10,0x10,0x10,0x30,0x00,0x00,0xf0, |
||||
0x08,0xe8,0xa8,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x0c,0x1e,0xfe,0x02,0xfe,0x00,0x70,0x8a,0x89,0x8a,0x70 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x10,0x20,0x40,0x00,0x00,0xc1, |
||||
0x12,0x0a,0x12,0xc2,0x00,0x00,0x10,0xc8,0x10,0x00,0x00,0x40,0xe0,0x50, |
||||
0x10,0x20,0x00,0x00,0x50,0x48,0x50,0x80,0x00,0xc0,0x10,0x08,0x10,0xc0 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x00,0x03, |
||||
0x04,0x04,0x02,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x83,0x05, |
||||
0x04,0x82,0x00,0x02,0x05,0x05,0x05,0x07,0x00,0x83,0x84,0x04,0x82,0x87 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x3e,0x3e,0x3e,0x00,0x08,0x14, |
||||
0x22,0x08,0x14,0x22,0x00,0x22,0x14,0x08,0x22,0x14,0x08,0x03,0x02,0x00, |
||||
0x03,0x02,0x00,0x1c,0x22,0x7f,0x22,0x22,0x00,0x02,0x01,0x00,0x02,0x01}}; |
||||
static const char PROGMEM base0_L_turf_shfgr[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x90,0x90,0xfc,0x90,0x90,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0a,0x09,0x0a,0xf0 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x88,0x90,0xa0,0x00,0x00,0xc0, |
||||
0x10,0x08,0x10,0xc0,0x00,0x00,0x50,0xc8,0x50,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x80,0x50,0x48,0x50,0x80,0x00,0xc1,0x12,0x0a,0x12,0xc1 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x8f,0x4f,0x8f,0x00,0x00,0x0f, |
||||
0x10,0x10,0x90,0x0f,0x00,0x80,0x10,0x1f,0x10,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x1f,0x82,0x82,0x82,0x1f,0x00,0x0f,0x10,0x10,0x10,0x0f |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x7c,0x7d,0x7c,0x00,0x00,0x04, |
||||
0x0a,0x11,0x20,0x00,0x00,0x20,0x11,0x0a,0x04,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x1f,0x24,0x2a,0x20,0x1f,0x00,0x00,0x00,0x00,0x00,0x00}}; |
||||
static const char PROGMEM base0_R_turf_nomod[4][42] = { |
||||
{ 0x70,0x88,0x88,0x48,0xff,0x00,0xf8,0x10,0x08,0x08,0x10,0x00,0xf8,0x08, |
||||
0x08,0x08,0xf0,0x00,0xff,0x10,0x08,0x08,0xf0,0x00,0xf8,0x90,0x88,0x88, |
||||
0x70,0x00,0x10,0x28,0x44,0x82,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0x40,0xf8,0x40,0x40,0x00,0x00,0xf8,0x00,0x80,0x40,0x00,0x00,0xc0,0x40, |
||||
0xc0,0x40,0x80,0x00,0x08,0xf8,0x00,0x00,0x00,0x00,0xc3,0x00,0x00,0x00, |
||||
0xc0,0x00,0x80,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x00,0x03,0x04,0x04,0x00,0x00,0x07,0x01,0x01,0x02,0x04,0x00,0xc7,0x00, |
||||
0x07,0x00,0x07,0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x03,0x14,0x14,0x12, |
||||
0x0f,0x00,0x04,0x15,0x0d,0x05,0x02,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x22,0x32,0x2a,0x26,0x22,0x00,0x24,0x2a,0x2a,0x2a,0x10,0x00,0x3f,0x24, |
||||
0x22,0x22,0x1c,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0xb0,0x70,0x00, |
||||
0x00,0x00,0x1e,0x20,0x1c,0x20,0x1e,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM base0_R_turf_shift[4][42] = { |
||||
{ 0xfe,0x02,0x02,0x02,0xfc,0x00,0xfe,0x12,0x12,0x32,0xcc,0x00,0xfe,0x0c, |
||||
0x30,0xc0,0xfe,0x00,0xfe,0x10,0x10,0x10,0xfe,0x00,0xfe,0x12,0x12,0x12, |
||||
0x0c,0x00,0x82,0x44,0x28,0x10,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0x11,0x11,0xf1,0x11,0x10,0x00,0xf1,0x80,0x40,0x20,0x11,0x00,0xf1,0x20, |
||||
0xc0,0x20,0xf1,0x00,0xf1,0x00,0x00,0x00,0x01,0x00,0x31,0x40,0x80,0x40, |
||||
0x30,0x00,0x30,0x48,0x48,0x48,0x90,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x80,0x80,0x8f,0x80,0x80,0x00,0x0f,0x80,0x81,0x82,0x0c,0x00,0x8f,0x80, |
||||
0x80,0x80,0x0f,0x00,0x0f,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x0f,0x00, |
||||
0x00,0x00,0x82,0x14,0x0c,0x04,0x83,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x70,0x48,0x44,0x42,0x41,0x00,0x23,0x44,0x44,0x44,0x39,0x00,0x7f,0x44, |
||||
0x44,0x44,0x3b,0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0xb6,0x76,0x00, |
||||
0x00,0x00,0x1f,0x60,0x1c,0x60,0x1f,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM base0_R_turf_altgr[4][42] = { |
||||
{ 0x53,0x54,0xf8,0x54,0x53,0x00,0x7c,0xba,0x8a,0x8a,0x7c,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x0c,0x12,0x12,0x0c,0x00,0x00,0x20,0xfc,0x22,0x02, |
||||
0x84,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0x80,0x80,0xf1,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00, |
||||
0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x11,0x01, |
||||
0x00,0x00,0x40,0xf0,0x41,0xf0,0x40,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x02,0x01,0x0f,0x08,0x08,0x06,0x83,0x40,0x40,0x40,0x00,0x00,0x0f,0x02, |
||||
0x04,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x01,0x07,0x01,0x07,0x01,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x4a,0x4a,0x3c,0x00,0x00,0x11,0x0a, |
||||
0x04,0x0a,0x11,0x00,0x04,0x04,0x15,0x04,0x04,0x00,0x00,0x00,0x04,0x00, |
||||
0x00,0x00,0x04,0x02,0x04,0x08,0x04,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM base0_R_turf_shfgr[4][42] = { |
||||
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x90,0x88, |
||||
0x00,0x00,0x00,0x90,0xa1,0x90,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f, |
||||
0x00,0x00,0x00,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x7d,0x7c, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM symb5_R_turf_nomod[4][42] = { |
||||
{ 0x20,0x20,0xf8,0x20,0x20,0x00,0x00,0xc0,0x30,0x0c,0x03,0x00,0x20,0x20, |
||||
0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0x80,0x00,0xc0,0x00,0x80,0x00,0x43,0x20,0x20,0x20,0xc0,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x02,0x81,0x47,0x81,0x02,0x00,0x00,0x00,0x0a,0x01,0x00,0x00,0x04,0x04, |
||||
0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x22,0xf3,0x0a,0xf3,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM symb5_R_turf_altgr[4][42] = { |
||||
{ 0x10,0x10,0x10,0x30,0x00,0x00,0x03,0x0c,0x30,0xc0,0x00,0x00,0x00,0x00, |
||||
0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0x80,0x80,0xe0,0x80,0x80,0x00,0x00,0x00,0xa0,0x00,0x03,0x00,0x00,0x00, |
||||
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x04,0x84,0x47,0x84,0x04,0x00,0x06,0x09,0x08,0x08,0x04,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x22,0xf3,0x0a,0xf3,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM numb6_L_turf_nomod[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20, |
||||
0x50,0x88,0x04,0x00,0x00,0x04,0x04,0xc4,0x34,0x0c,0x00,0xd8,0x24,0x24, |
||||
0x24,0xd8,0x00,0x18,0x24,0x24,0x24,0xf8,0x00,0xf8,0x44,0x24,0x14,0xf8 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x41,0xe0,0x00,0x00,0xe0,0xa1,0xa1, |
||||
0xa1,0x20,0x00,0xc0,0xa1,0xa1,0xa1,0x00,0x00,0x00,0x01,0x01,0x01,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x0f,0x02,0x00,0x04,0x08,0x08, |
||||
0x08,0x07,0x00,0x07,0x08,0x08,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, |
||||
0x22,0x14,0x08,0x00,0x00,0x00,0x04,0x02,0x7f,0x00,0x00,0x42,0x61,0x51, |
||||
0x49,0x46,0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x5e,0x61,0x01,0x61,0x5e}}; |
||||
static const char PROGMEM numb6_L_turf_shift[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, |
||||
0x88,0x50,0x20,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x38,0xc6, |
||||
0x01,0x00,0x00,0x00,0x01,0xc6,0x38,0x00,0x00,0x50,0x50,0x50,0x50,0x50 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, |
||||
0x00,0x00,0x00,0x00,0x00,0x60,0x90,0xf8,0x90,0x20,0x00,0x20,0x50,0x20, |
||||
0x81,0x60,0x00,0x70,0x89,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x8f,0x04,0x03,0x00,0x0c,0x82,0x09, |
||||
0x94,0x08,0x00,0x07,0x08,0x89,0x06,0x09,0x00,0x00,0x00,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, |
||||
0x22,0x14,0x08,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x03,0x00, |
||||
0x03,0x00,0x00,0x02,0x01,0x00,0x01,0x02,0x00,0x5e,0x61,0x01,0x61,0x5e}}; |
||||
static const char PROGMEM numb6_L_turf_altgr[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0xff,0x00,0x00,0x00,0x10,0x10,0xee,0x01,0x01,0x00,0x00,0xff,0x01, |
||||
0x01,0x00,0x00,0x00,0x01,0x01,0xff,0x00,0x00,0x01,0x01,0xee,0x10,0x10 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x01,0x00,0x00,0x00,0x10,0xf8,0x00,0x01,0x01,0x00,0x10,0xf9,0x01, |
||||
0x01,0x00,0x00,0x88,0xa9,0x51,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0xc0,0x00,0x00,0x00,0x00,0x08,0x8c,0x0a,0x1f,0x00,0x00,0x00,0x90, |
||||
0x90,0x10,0x00,0x00,0x08,0x0c,0x0a,0x1f,0x00,0x00,0x00,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x7b,0x00,0x00,0x00,0x00,0x09,0x0f,0x08,0x00,0x00,0x00,0x09,0x0c, |
||||
0x0a,0x09,0x00,0x14,0x7f,0x14,0x7f,0x14,0x00,0x5e,0x61,0x01,0x61,0x5e}}; |
||||
static const char PROGMEM numb6_L_turf_shfgr[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0xfc, |
||||
0x90,0x90,0x00,0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0xa8,0x50, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x0a, |
||||
0x15,0x0a,0x00,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x04,0x05,0x05,0x02,0x00,0x00,0x5e,0x61,0x01,0x61,0x5e}}; |
||||
// QWERTY
|
||||
static const char PROGMEM base0_L_qwer_nomod[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x04,0x08,0x10,0x00,0x00,0x70, |
||||
0x88,0x88,0x48,0xf8,0x00,0x78,0x80,0x70,0x80,0x78,0x00,0x70,0xa8,0xa8, |
||||
0xa8,0xb0,0x00,0xf8,0x10,0x08,0x08,0x10,0x00,0x08,0x7f,0x88,0x88,0x00 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x18,0x60,0x80,0x00,0x00,0x00,0x00, |
||||
0x40,0x40,0x40,0x83,0x00,0x80,0x40,0x40,0x40,0x00,0x00,0x80,0x40,0x40, |
||||
0x40,0xf8,0x00,0x00,0xf0,0x48,0x48,0x00,0x00,0x80,0x40,0x40,0x40,0xc0 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0xc0,0x41,0x46,0x18,0x00,0x02, |
||||
0x05,0x05,0x05,0x07,0x00,0x04,0x05,0x05,0x05,0x02,0x00,0x03,0x04,0x04, |
||||
0x02,0x07,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0xc3,0x14,0x14,0x12,0x0f |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0xff,0x80,0x80,0x00,0x00,0x22, |
||||
0x32,0x2a,0x26,0x22,0x00,0x22,0x14,0x08,0x14,0x22,0x00,0x1c,0x22,0x22, |
||||
0x22,0x22,0x00,0x06,0x18,0x20,0x18,0x06,0x00,0x3f,0x24,0x22,0x22,0x1c}}; |
||||
static const char PROGMEM base0_L_qwer_shift[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x20,0x10,0x20,0x40,0x20,0x00,0xfc, |
||||
0x02,0x42,0x82,0x7c,0x00,0x7e,0x80,0x70,0x80,0x7e,0x00,0xfe,0x12,0x12, |
||||
0x12,0x02,0x00,0xfe,0x12,0x12,0x32,0xcc,0x00,0x02,0x02,0xfe,0x02,0x02 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xe0, |
||||
0x91,0x91,0x90,0xe3,0x00,0x60,0x91,0x90,0x91,0x20,0x00,0xf1,0x11,0x11, |
||||
0x11,0xe1,0x00,0xf1,0x90,0x90,0x90,0x11,0x00,0xe0,0x10,0x91,0x90,0xa0 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x9f,0x40,0x40,0x00,0x8f, |
||||
0x80,0x80,0x80,0x8f,0x00,0x84,0x08,0x08,0x08,0x87,0x00,0x0f,0x88,0x88, |
||||
0x88,0x07,0x00,0x8f,0x00,0x00,0x00,0x80,0x00,0x87,0x88,0x88,0x88,0x07 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x04,0x04,0x7b,0x80,0x80,0x00,0x70, |
||||
0x48,0x44,0x42,0x41,0x00,0x71,0x0a,0x04,0x0a,0x71,0x00,0x3f,0x40,0x40, |
||||
0x40,0x21,0x00,0x07,0x18,0x60,0x18,0x07,0x00,0x7f,0x44,0x44,0x44,0x3b}}; |
||||
static const char PROGMEM base0_R_qwer_nomod[4][42] = { |
||||
{ 0x78,0x80,0x80,0x40,0xf8,0x00,0x78,0x80,0x80,0x40,0xf8,0x00,0x00,0x08, |
||||
0xfa,0x80,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0xf8,0x90,0x88,0x88, |
||||
0x70,0x00,0x10,0x28,0x44,0x82,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0xf8,0x82,0x42,0x42,0x81,0x00,0x00,0x00,0x40,0xd0,0x00,0x00,0xf8,0x00, |
||||
0x80,0x40,0x00,0x00,0x08,0xf8,0x00,0x00,0x00,0x00,0x03,0xc0,0xc0,0x00, |
||||
0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x10,0x10,0x0f,0x00,0x00,0x07,0x01, |
||||
0x01,0x02,0x04,0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x00,0x16,0x0e,0x00, |
||||
0xc0,0x00,0x00,0x40,0x40,0xc0,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x3e,0x02,0x02,0x02,0x3c,0x00,0x3e,0x02,0x3e,0x02,0x3c,0x00,0x00,0xb0, |
||||
0x70,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0xc0,0x30,0x0c,0x03, |
||||
0x00,0x00,0x00,0x80,0x80,0xff,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM base0_R_qwer_shift[4][42] = { |
||||
{ 0x06,0x08,0xf0,0x08,0x06,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x02, |
||||
0xfe,0x02,0x00,0x00,0xfc,0x02,0x02,0x02,0xfc,0x00,0xfe,0x12,0x12,0x12, |
||||
0x0c,0x00,0x82,0x44,0x28,0x10,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0xf0,0x80,0x81,0x80,0xf0,0x00,0x00,0x01,0x01,0x01,0xf0,0x00,0xf0,0x81, |
||||
0x41,0x21,0x10,0x00,0xf0,0x01,0x01,0x01,0x00,0x00,0x01,0xc0,0xc0,0x00, |
||||
0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x8f,0x00,0x00,0x00,0x8f,0x00,0x86,0x08,0x08,0x08,0x87,0x00,0x0f,0x00, |
||||
0x01,0x82,0x0c,0x00,0x8f,0x08,0x08,0x08,0x08,0x00,0x00,0x86,0x86,0x80, |
||||
0x00,0x00,0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x7f,0x03,0x0c,0x30,0x7f,0x00,0x7f,0x01,0x06,0x01,0x7f,0x00,0x04,0x0a, |
||||
0x11,0x20,0x00,0x00,0x20,0x11,0x0a,0x04,0x00,0x00,0x01,0x00,0x28,0x04, |
||||
0x03,0x00,0x00,0x80,0x80,0x7b,0x04,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM symb5_R_qwer[4][42] = { |
||||
{ 0x00,0x04,0x08,0x10,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x50,0x50, |
||||
0x50,0x50,0x50,0x00,0x10,0x10,0xee,0x01,0x01,0x00,0x01,0x01,0xee,0x10, |
||||
0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0xc0,0x00,0x00,0x00,0x00,0xf8,0x09,0x0a,0x02,0x00,0x02,0x0a,0x09,0xf8, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x01,0x80,0x41,0x82,0x01,0x00,0x04,0x04,0x84,0x44,0x04,0x00,0x01,0x41, |
||||
0x87,0x01,0x01,0x00,0xc0,0x1f,0x10,0x10,0x00,0x00,0x00,0x10,0xd0,0x1f, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x22,0xf3,0x0a,0xf3,0x22,0x00,0x00,0x1e,0x61,0x80,0x00,0x00,0x00,0x80, |
||||
0x61,0x1e,0x00,0x00,0x00,0x03,0x0c,0x30,0xc0,0x00,0x00,0x00,0xff,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM numb6_L_qwer_nomod[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20, |
||||
0x50,0x88,0x04,0x00,0x00,0x04,0x04,0xc4,0x34,0x0c,0x00,0xd8,0x24,0x24, |
||||
0x24,0xd8,0x00,0x18,0x24,0x24,0x24,0xf8,0x00,0xf8,0x44,0x24,0x14,0xf8 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x70,0x00,0x71,0x00,0x00,0x00,0x80,0x41,0xe0,0x00,0x00,0xe0,0xa1,0xa1, |
||||
0xa1,0x20,0x00,0xc0,0xa1,0xa1,0xa1,0x00,0x00,0x00,0x01,0x71,0x01,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x0f,0x02,0x00,0x04,0x08,0x08, |
||||
0x08,0x07,0x00,0x07,0x08,0x08,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41, |
||||
0x22,0x14,0x08,0x00,0x00,0x00,0x04,0x02,0x7f,0x00,0x00,0x42,0x61,0x51, |
||||
0x49,0x46,0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x5e,0x61,0x01,0x61,0x5e}}; |
||||
static const char PROGMEM numb6_L_qwer_shift[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0xd8,0x24,0x54,0x88,0x40,0x00,0x50,0x20,0xf8, |
||||
0x20,0x50,0x00,0x00,0x38,0xc6,0x01,0x00,0x00,0x00,0x01,0xc6,0x38,0x00 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x70,0x00,0x70,0x00,0x00,0x60,0x91,0xf9,0x90,0x21,0x00,0x20,0x50,0x20, |
||||
0x80,0x60,0x00,0x40,0x20,0x10,0x21,0x40,0x00,0x00,0x71,0x00,0x70,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x8f,0x04,0x03,0x00,0x0c,0x02,0x09, |
||||
0x14,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x3e,0x41,0x5d, |
||||
0x55,0x5e,0x00,0x14,0x7f,0x14,0x7f,0x14,0x00,0x00,0x00,0x00,0x00,0x00}}; |
||||
|
||||
// UNIVERSAL
|
||||
static const char PROGMEM char1_L[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
||||
0xe2,0xae,0x42,0x00,0x00,0x20,0x44,0x40,0x4c,0x20,0x00,0x12,0xa4,0x88, |
||||
0xa4,0x12,0x00,0x08,0xf8,0x08,0xf8,0x08,0x00,0x78,0x80,0x80,0x80,0x78 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, |
||||
0x41,0x40,0x41,0x80,0x00,0x80,0x40,0x40,0x40,0x80,0x00,0x81,0x40,0x40, |
||||
0x40,0x81,0x00,0xc0,0x00,0xc0,0x00,0xc0,0x00,0x00,0xc0,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83, |
||||
0xc4,0x84,0xc2,0x07,0x00,0x03,0x04,0x04,0x04,0x03,0x00,0x02,0x85,0x05, |
||||
0x04,0x82,0x00,0x03,0x04,0x1f,0x04,0x03,0x00,0x80,0x83,0x84,0x82,0x80 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f, |
||||
0xc4,0x44,0xef,0x3b,0x00,0x3e,0x49,0x49,0x49,0x3e,0x00,0x02,0x7f,0x09, |
||||
0x09,0x78,0x00,0x3e,0x08,0x08,0x14,0x22,0x00,0x20,0x24,0x24,0x24,0x20}}; |
||||
static const char PROGMEM char1_R[4][42] = { |
||||
{ 0x70,0x88,0xf0,0x88,0x70,0x00,0xfe,0x02,0x02,0x02,0x06,0x00,0x88,0x48, |
||||
0x70,0x90,0x88,0x00,0xf0,0x88,0x88,0x88,0x70,0x00,0xc0,0x30,0x0c,0x30, |
||||
0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0xa0,0x50,0x53,0x90,0x20,0x00,0xc0,0x80,0x40,0x40,0x80,0x00,0x40,0x40, |
||||
0xc0,0x40,0x40,0x00,0xc3,0x00,0x00,0x00,0xc0,0x00,0x80,0x40,0xc0,0x40, |
||||
0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x03,0x84,0x84,0x04,0x03,0x00,0x07,0x00,0x00,0x00,0x1f,0x00,0x00,0x80, |
||||
0x83,0x84,0x00,0x00,0x00,0x83,0x54,0x8b,0x00,0x00,0x83,0x84,0x84,0x83, |
||||
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0xff,0x24,0x24,0x27,0x18,0x00,0x7e,0x10,0x20,0x20,0x1e,0x00,0x2f,0x30, |
||||
0x00,0x30,0x2f,0x00,0xe0,0x38,0x25,0x38,0xe0,0x00,0x18,0x26,0xa1,0xa0, |
||||
0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM game2_L[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c, |
||||
0x82,0xa2,0x42,0xbc,0x00,0x3e,0xc0,0x30,0xc0,0x3e,0x00,0xfe,0x92,0x92, |
||||
0x92,0x82,0x00,0xfe,0x12,0x12,0x32,0xcc,0x00,0x02,0x02,0xfe,0x02,0x02 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0xe0,0x00,0xe0, |
||||
0x90,0x90,0x90,0xe1,0x00,0x60,0x90,0x90,0x90,0x20,0x00,0xf0,0x10,0x10, |
||||
0x10,0xe0,0x00,0xf0,0x90,0x90,0x90,0x10,0x00,0xe0,0x10,0x90,0x90,0xa0 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x00,0x87, |
||||
0x80,0x80,0x80,0x87,0x00,0x82,0x04,0x04,0x04,0x83,0x00,0x07,0x84,0x84, |
||||
0x84,0x03,0x00,0x87,0x00,0x00,0x00,0x80,0x00,0x83,0x84,0x84,0x84,0x03 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x08,0x3c,0x02,0x3c,0x08,0x00,0x30, |
||||
0x28,0x24,0x22,0x21,0x00,0x31,0x0a,0x04,0x0a,0x31,0x00,0x1f,0x20,0x20, |
||||
0x20,0x11,0x00,0x03,0x0c,0x30,0x0c,0x03,0x00,0x3f,0x24,0x24,0x24,0x1b}}; |
||||
static const char PROGMEM medi3_R_nomod[4][42] = { |
||||
{ 0x03,0x0c,0xb0,0x0c,0x03,0x00,0x3f,0x02,0x9c,0x02,0x3f,0x00,0x3f,0x04, |
||||
0x84,0x04,0x3f,0x00,0x22,0x25,0xa5,0x25,0x18,0x00,0x3f,0x25,0xa5,0x25, |
||||
0x1a,0x00,0x00,0xe0,0x8f,0x02,0x31,0x49,0xfa,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0xc0,0x01,0x73,0x01,0xc0,0x00,0xf0,0x81,0xc3,0xe1,0xf0,0x00,0x00,0x71, |
||||
0x03,0x71,0x00,0x00,0x00,0xc1,0xc3,0xc1,0x00,0x00,0xf0,0xe1,0xc3,0x81, |
||||
0xf0,0x00,0x00,0x03,0xe2,0x21,0xe0,0x21,0xc0,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x01,0x02,0x02,0x02,0x01,0x00,0x07,0x00,0x01,0x03,0x87,0x00,0x00,0x1f, |
||||
0x0e,0x04,0x80,0x00,0x00,0x03,0x03,0x03,0x00,0x00,0x07,0x03,0x01,0x00, |
||||
0x87,0x00,0x00,0x40,0xa6,0xa8,0x08,0x04,0x8e,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x3e,0x31,0x01,0x31,0x3e,0x00,0x00,0x46,0x46,0x4f,0x1f,0x00,0x00,0xa6, |
||||
0x46,0xaf,0x1f,0x00,0x28,0x2c,0x2e,0x2c,0x28,0x00,0x00,0x46,0xe6,0x4f, |
||||
0x1f,0x00,0x00,0x02,0x72,0x8a,0x89,0x00,0x1e,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM medi3_R_shift[4][42] = { |
||||
{ 0x03,0x0c,0x30,0x0c,0x03,0x00,0x3f,0x02,0x1c,0x02,0x3f,0x00,0x3f,0x04, |
||||
0x04,0x04,0x3f,0x00,0x22,0x25,0x25,0x25,0x18,0x00,0x3f,0x25,0x25,0x25, |
||||
0x1a,0x00,0x00,0xe0,0x8f,0x02,0x31,0x49,0xfa,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0xc0,0x01,0x71,0x01,0xc0,0x00,0xf0,0x81,0xc1,0xe1,0xf0,0x00,0x00,0x71, |
||||
0x01,0x71,0x00,0x00,0x00,0xc1,0xc1,0xc1,0x00,0x00,0xf0,0xe1,0xc1,0x81, |
||||
0xf0,0x00,0x00,0x03,0xe2,0x21,0xe0,0x21,0xc0,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x01,0x02,0x02,0x02,0x01,0x00,0x07,0x00,0x01,0x03,0x87,0x00,0x00,0x1f, |
||||
0x0e,0x04,0x80,0x00,0x00,0x03,0x03,0x03,0x00,0x00,0x07,0x03,0x01,0x00, |
||||
0x87,0x00,0x00,0x40,0xa6,0xa8,0x08,0x04,0x8e,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x3e,0x31,0x01,0x31,0x3e,0x00,0x00,0x46,0x46,0x4f,0x1f,0x00,0x00,0xa6, |
||||
0x46,0xaf,0x1f,0x00,0x28,0x2c,0x2e,0x2c,0x28,0x00,0x00,0x46,0xe6,0x4f, |
||||
0x1f,0x00,0x00,0x02,0x72,0x8a,0x89,0x00,0x1e,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM navi4_R[4][42] = { |
||||
{ 0xe0,0x10,0x54,0x38,0x10,0x00,0xfc,0x24,0x24,0x24,0x18,0x00,0x0c,0x10, |
||||
0xe0,0x10,0x0c,0x00,0x8c,0x50,0x20,0x50,0x8c,0x00,0xc0,0xbe,0xa2,0xbe, |
||||
0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0x80,0xc1,0xa1,0x81,0x00,0x00,0x01,0x80,0x40,0x20,0x00,0x00,0x00,0x00, |
||||
0xf1,0x00,0x00,0x00,0x41,0x20,0xd0,0x20,0x41,0x00,0x01,0x21,0x41,0x81, |
||||
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x00,0x49,0x4a,0x48,0x87,0x00,0x81,0x82,0x85,0x89,0x01,0x00,0x01,0x02, |
||||
0x85,0x02,0x01,0x00,0x40,0x40,0x47,0x40,0x40,0x00,0x81,0x09,0x05,0x02, |
||||
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x12,0x65,0x85,0x65,0x17,0x00,0x07,0x01,0x06,0x18,0x60,0x00,0x88,0x90, |
||||
0xaf,0x90,0x88,0x00,0x04,0x02,0x7d,0x02,0x04,0x00,0x01,0x46,0x58,0x60, |
||||
0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
static const char PROGMEM func7_L[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0xff,0x09,0xe9,0xc9,0x01,0x00,0xe0,0x00, |
||||
0x10,0x08,0xfc,0x00,0x00,0x08,0x84,0x44,0x24,0x18,0x00,0x88,0x04,0x24, |
||||
0x24,0xd8,0x00,0x60,0x50,0x48,0xfc,0x40,0x00,0x70,0x80,0x9c,0x80,0x70 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0xf0,0x00,0x00,0x9f,0x00,0x03,0x0c,0x1f,0x00, |
||||
0xe0,0xa0,0xa1,0x20,0x00,0xc1,0xa1,0xa1,0xa1,0x01,0x00,0x20,0x21,0x21, |
||||
0xa1,0x60,0x00,0xc0,0x20,0x20,0x21,0xc0,0x00,0x40,0xe0,0x50,0x40,0x80 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0xef,0x02,0x83,0xe4,0x00,0x0e,0x15,0x16,0x00, |
||||
0x04,0x08,0x08,0x07,0x00,0x07,0x48,0xc8,0x08,0x07,0x00,0x00,0x40,0xce, |
||||
0x01,0x00,0x00,0x06,0x49,0xc9,0x09,0x06,0x00,0x06,0x08,0x49,0x08,0x07 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x05,0x04,0x03,0x90,0xa8,0xa8,0x40,0x06, |
||||
0x49,0x49,0x49,0x3e,0x00,0x7c,0xa2,0x93,0x8a,0x7c,0x00,0x00,0x08,0x07, |
||||
0xfe,0x00,0x00,0x84,0xc2,0xa3,0x92,0x8c,0x00,0x70,0x38,0x0d,0x38,0x70}}; |
||||
static const char PROGMEM mous8_L[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x3c,0x84,0xbc,0x84,0x38,0x00,0x00,0x00,0x10, |
||||
0x28,0x92,0xc5,0x82,0x00,0xfe,0x1f,0x1f,0x01,0xfe,0x00,0xfe,0x01,0x19, |
||||
0x01,0xfe,0x00,0xfe,0x01,0x1f,0x1f,0xfe,0x00,0x10,0x38,0x92,0xc7,0x82 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0xe7,0x08,0x08,0x08,0xe7,0x00,0x00,0x00,0x00, |
||||
0x00,0x80,0x01,0x00,0x00,0x01,0x01,0x81,0x01,0x01,0x00,0x01,0x01,0x81, |
||||
0x01,0x01,0x00,0x01,0x01,0x81,0x01,0x01,0x00,0x60,0x50,0xf8,0x41,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x91,0xaa,0xaa,0xa9,0x43,0x00,0x00,0x00,0x02, |
||||
0x07,0xca,0x02,0x02,0x00,0x02,0x01,0xcf,0x01,0x02,0x00,0x02,0x04,0x0f, |
||||
0x04,0x02,0x00,0x02,0x02,0xca,0x07,0x02,0x00,0xdc,0x58,0x5c,0x18,0x1f |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x1c,0x2a,0x2a,0x2a,0x2c,0x00,0x00,0x00,0x0c, |
||||
0x33,0xc0,0x00,0x00,0x00,0x0c,0x03,0x00,0x03,0x0c,0x00,0x0c,0x30,0xc0, |
||||
0x30,0x0c,0x00,0x00,0x00,0xc0,0x33,0x0c,0x00,0xe5,0xc9,0xe6,0xc0,0xf8}}; |
||||
static const char PROGMEM musi9_L[4][42] = { |
||||
{ 0x00,0x00,0x73,0xe7,0x00,0x00,0x00,0x00,0x00,0xfe,0x04,0x18,0x04,0xfe, |
||||
0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x8c,0x12,0x12,0x12,0xe4,0x00, |
||||
0x00,0x02,0xfe,0x02,0x00,0x00,0xfc,0x02,0x02,0x02,0x84,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0xce,0x9c,0x00,0x00,0xc0,0xe0,0xf0,0xf9,0xf8,0xf8,0xf8,0xf9, |
||||
0xf0,0xe0,0xc0,0x01,0x01,0x01,0x00,0xf0,0xf0,0x01,0x01,0xf1,0xf0,0x00, |
||||
0x00,0x01,0x01,0x01,0x00,0x00,0xf8,0xf1,0xe1,0xc1,0x80,0x00,0x00,0x00 |
||||
},{ 0x00,0x00,0x39,0x73,0x00,0x00,0x07,0x0f,0x1f,0x3f,0x3f,0x3f,0x3f,0x3f, |
||||
0x1f,0x0f,0x07,0x00,0x00,0x00,0x00,0x1f,0x1f,0x00,0x00,0x1f,0x1f,0x00, |
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,0x00 |
||||
},{ 0x00,0x00,0xe7,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x08, |
||||
0xf8,0x08,0xf0,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x70,0x88,0x88,0x48, |
||||
0xff,0x00,0x70,0xa8,0xa8,0xa8,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}; |
||||
static const char PROGMEM musi9_R[4][42] = { |
||||
{ 0x00,0x00,0x00,0xfe,0x04,0x18,0x04,0xfe,0x00,0x00,0xfe,0x00,0x00,0x00, |
||||
0xfe,0x00,0x8c,0x12,0x12,0x12,0xe4,0x00,0x00,0x02,0xfe,0x02,0x00,0x00, |
||||
0xfc,0x02,0x02,0x02,0x84,0x00,0x00,0x00,0x00,0x00,0xe7,0x73,0x00,0x00 |
||||
},{ 0x00,0x00,0x00,0x81,0x60,0x10,0x60,0x81,0x60,0x10,0x00,0x01,0x01,0x01, |
||||
0xe0,0xe0,0x60,0x61,0x61,0x61,0x60,0xf8,0x70,0x21,0x01,0x01,0xc0,0xe0, |
||||
0x60,0x01,0xf9,0xf9,0x00,0x60,0xe0,0xc0,0x00,0x00,0x9c,0xce,0x00,0x00 |
||||
},{ 0x18,0x24,0x4b,0x48,0x48,0x4c,0x4b,0x48,0x4b,0x2c,0x18,0x00,0x00,0x00, |
||||
0x4f,0xe7,0xf0,0x60,0x60,0x60,0x60,0x60,0x7e,0x7f,0x00,0x0f,0x3f,0x70, |
||||
0x60,0xc0,0xc1,0xc1,0xc0,0x60,0x70,0x3f,0x0f,0x00,0x73,0x39,0x00,0x00 |
||||
},{ 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x08,0xf8,0x08,0xf0,0x00,0x70,0x88, |
||||
0x88,0x88,0x71,0x00,0x70,0x88,0x88,0x48,0xff,0x00,0x70,0xa8,0xa8,0xa8, |
||||
0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xe7,0x00,0x00}}; |
||||
uint8_t this_layout = userspace_config.layout % 3; |
||||
|
||||
// Render the requested image on the given column and row
|
||||
// Don't grab highest layer; instead compare from top to bottom.
|
||||
// Highest layer might be on the other side
|
||||
if (isLeft) { |
||||
if (layer_state_cmp(layer_state, _MUSI)) { |
||||
draw_image(row, col, musi9_L); |
||||
} else if (layer_state_cmp(layer_state, _MOUS)) { |
||||
draw_image(row, col, mous8_L); |
||||
} else if (layer_state_cmp(layer_state, _FUNC)) { |
||||
draw_image(row, col, func7_L); |
||||
} else if (layer_state_cmp(layer_state, _NUMB)) { |
||||
switch (this_layout) { |
||||
case 0: // Dvorak
|
||||
if (mods & MOD_MASK_SHIFT) { |
||||
draw_image(row, col, numb6_L_dvor_shift); |
||||
} else { |
||||
draw_image(row, col, numb6_L_dvor_nomod); |
||||
} |
||||
break; |
||||
case 1: // Turkish F
|
||||
if ((mods & MOD_MASK_SHIFT) && (mods & MOD_BIT(KC_RALT))) { |
||||
// Shift + AltGr
|
||||
draw_image(row, col, numb6_L_turf_shfgr); |
||||
} else if (mods & MOD_MASK_SHIFT) { |
||||
// Shift
|
||||
draw_image(row, col, numb6_L_turf_shift); |
||||
} else if (mods & MOD_BIT(KC_RALT)) { |
||||
// AltGr
|
||||
draw_image(row, col, numb6_L_turf_altgr); |
||||
} else { |
||||
// Normal
|
||||
draw_image(row, col, numb6_L_turf_nomod); |
||||
} |
||||
break; |
||||
case 2: // Qwerty
|
||||
if (mods & MOD_MASK_SHIFT) { |
||||
draw_image(row, col, numb6_L_qwer_shift); |
||||
} else { |
||||
draw_image(row, col, numb6_L_qwer_nomod); |
||||
} |
||||
break; |
||||
} |
||||
} else if (layer_state_cmp(layer_state, _GAME)) { |
||||
draw_image(row, col, game2_L); |
||||
} else if (layer_state_cmp(layer_state, _CHAR)) { |
||||
draw_image(row, col, char1_L); |
||||
} else { |
||||
switch (this_layout) { |
||||
case 0: // Dvorak
|
||||
if (mods & MOD_MASK_SHIFT) { |
||||
draw_image(row, col, base0_L_dvor_shift); |
||||
} else { |
||||
draw_image(row, col, base0_L_dvor_nomod); |
||||
} |
||||
break; |
||||
case 1: // Turkish F
|
||||
if ((mods & MOD_MASK_SHIFT) && (mods & MOD_BIT(KC_RALT))) { |
||||
// Shift + AltGr
|
||||
draw_image(row, col, base0_L_turf_shfgr); |
||||
} else if (mods & MOD_MASK_SHIFT) { |
||||
// Shift
|
||||
draw_image(row, col, base0_L_turf_shift); |
||||
} else if (mods & MOD_BIT(KC_RALT)) { |
||||
// AltGr
|
||||
draw_image(row, col, base0_L_turf_altgr); |
||||
} else { |
||||
// Normal
|
||||
draw_image(row, col, base0_L_turf_nomod); |
||||
} |
||||
break; |
||||
case 2: // Qwerty
|
||||
if (mods & MOD_MASK_SHIFT) { |
||||
draw_image(row, col, base0_L_qwer_shift); |
||||
} else { |
||||
draw_image(row, col, base0_L_qwer_nomod); |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
} else { |
||||
if (layer_state_cmp(layer_state, _MUSI)) { |
||||
draw_image(row, col, musi9_R); |
||||
} else if (layer_state_cmp(layer_state, _SYMB)) { |
||||
switch (this_layout) { |
||||
case 0: // Dvorak
|
||||
draw_image(row, col, symb5_R_dvor); |
||||
break; |
||||
case 1: // Turkish f
|
||||
if (mods & MOD_BIT(KC_RALT)) { |
||||
// AltGr
|
||||
draw_image(row, col, symb5_R_turf_altgr); |
||||
} else { |
||||
// Normal
|
||||
draw_image(row, col, symb5_R_turf_nomod); |
||||
} |
||||
break; |
||||
case 2: // Qwerty
|
||||
draw_image(row, col, symb5_R_qwer); |
||||
break; |
||||
} |
||||
} else if (layer_state_cmp(layer_state, _NAVI)) { |
||||
draw_image(row, col, navi4_R); |
||||
} else if (layer_state_cmp(layer_state, _MEDI)) { |
||||
if (mods & MOD_MASK_SHIFT) { |
||||
draw_image(row, col, medi3_R_shift); |
||||
} else { |
||||
draw_image(row, col, medi3_R_nomod); |
||||
} |
||||
} else if (layer_state_cmp(layer_state, _CHAR)) { |
||||
draw_image(row, col, char1_R); |
||||
} else { |
||||
switch (this_layout) { |
||||
case 0: // Dvorak
|
||||
if (mods & MOD_MASK_SHIFT) { |
||||
draw_image(row, col, base0_R_dvor_shift); |
||||
} else { |
||||
draw_image(row, col, base0_R_dvor_nomod); |
||||
} |
||||
break; |
||||
case 1: // Turkish F
|
||||
if ((mods & MOD_MASK_SHIFT) && (mods & MOD_BIT(KC_RALT))) { |
||||
// Shift + AltGr
|
||||
draw_image(row, col, base0_R_turf_shfgr); |
||||
} else if (mods & MOD_MASK_SHIFT) { |
||||
// Shift
|
||||
draw_image(row, col, base0_R_turf_shift); |
||||
} else if (mods & MOD_BIT(KC_RALT)) { |
||||
// AltGr
|
||||
draw_image(row, col, base0_R_turf_altgr); |
||||
} else { |
||||
// Normal
|
||||
draw_image(row, col, base0_R_turf_nomod); |
||||
} |
||||
break; |
||||
case 2: // Qwerty
|
||||
if (mods & MOD_MASK_SHIFT) { |
||||
draw_image(row, col, base0_R_qwer_shift); |
||||
} else { |
||||
draw_image(row, col, base0_R_qwer_nomod); |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Render the RGB state on the given column and row
|
||||
void render_rgb(uint8_t row, uint8_t col) { |
||||
static const char PROGMEM rgb_enab[12] = {0x08,0x81,0x3c,0x42,0x99,0xbd,0xbd,0x99,0x42,0x3c,0x81,0x10}; |
||||
static const char PROGMEM rgb_disa[12] = {0x08,0x81,0x3c,0x42,0x81,0x81,0x81,0x81,0x42,0x3c,0x81,0x10}; |
||||
static char rgb_temp4[4] = {0}; |
||||
static char rgb_temp3[3] = {0}; |
||||
|
||||
oled_set_cursor(col, row); |
||||
# ifdef RGB_MATRIX_ENABLE |
||||
if (rgb_matrix_is_enabled()) { |
||||
oled_write_raw_P(rgb_enab, 12); |
||||
} else { |
||||
oled_write_raw_P(rgb_disa, 12); |
||||
} |
||||
oled_set_cursor(col + 2, row); |
||||
oled_write(" hue sat val", false); |
||||
oled_set_cursor(col, row + 1); |
||||
itoa(rgb_matrix_get_mode(), rgb_temp3, 10); |
||||
oled_write(rgb_temp3, false); |
||||
oled_write(" ", false); |
||||
itoa(rgb_matrix_get_hue(), rgb_temp4, 10); |
||||
oled_write(rgb_temp4, false); |
||||
oled_write(" ", false); |
||||
itoa(rgb_matrix_get_sat(), rgb_temp4, 10); |
||||
oled_write(rgb_temp4, false); |
||||
oled_write(" ", false); |
||||
itoa(rgb_matrix_get_val(), rgb_temp4, 10); |
||||
oled_write(rgb_temp4, false); |
||||
# else // RGB_MATRIX_ENABLE
|
||||
oled_write("-RGB disabled-", false); |
||||
# endif // RGB_MATRIX_ENABLE
|
||||
} |
||||
|
||||
void render_status_left(uint8_t row, uint8_t col) { |
||||
// Left side looks like this on the left half
|
||||
// (Should be 14 characters per line)
|
||||
// Mods: <OS> <Alt/Gr> <Ctrl> <Shift>
|
||||
// Enc: <8 len str>
|
||||
// Wpm: <wpm here>
|
||||
// Layout: <dvorak/qwerty/tur. f>
|
||||
// Right half is whatever layer image needs be
|
||||
uint8_t this_mod = get_mods(); |
||||
uint8_t this_layer = get_highest_layer(layer_state); |
||||
|
||||
// MODIFIERS
|
||||
render_modifiers(row + 0, col + 0, this_mod); |
||||
// Encoders
|
||||
render_encoder(row + 1, col + 0, 0, this_layer); |
||||
// WPM text
|
||||
render_wpm(row + 2, col + 0); |
||||
// Visual layout
|
||||
render_keymap(row + 3, col + 0, false); |
||||
// Draw the image after 14'th character
|
||||
render_layout(row + 0, col + 14, this_mod, true); |
||||
} |
||||
|
||||
void render_status_right(uint8_t row, uint8_t col) { |
||||
// Right half is whatever layer image needs be on the left
|
||||
// Right side looks like this on the right half
|
||||
// (Should be after the 12'th character; max 14 characters per line)
|
||||
// Mods: <OS> <Alt/Gr> <Ctrl> <Shift>
|
||||
// Enc: <8 len str>
|
||||
// Wpm: <wpm here>
|
||||
// Layout: <dvorak/qwerty/tur. f>
|
||||
uint8_t this_mod = get_mods(); |
||||
uint8_t this_layer = get_highest_layer(layer_state); |
||||
|
||||
// Draw the image
|
||||
render_layout(row + 0, col + 0, this_mod, false); |
||||
// Modifiers
|
||||
render_modifiers(row + 0, col + 7, this_mod); |
||||
// Encoder
|
||||
render_encoder(row + 1, col + 7, 1, this_layer); |
||||
// RGB State (2 rows)
|
||||
render_rgb(row + 2, col + 7); |
||||
} |
@ -0,0 +1,25 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
#include "bbaserdem.h" |
||||
|
||||
// OLED layout images writer function
|
||||
void render_modifiers(uint8_t row, uint8_t col, uint8_t mods); |
||||
void render_layout(uint8_t row, uint8_t col, uint8_t mods, bool isLeft); |
||||
void render_rgb(uint8_t row, uint8_t col); |
||||
void render_status_left(uint8_t row, uint8_t col); |
||||
void render_status_right(uint8_t row, uint8_t col); |
@ -0,0 +1,216 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#include "bb-oled.h" |
||||
|
||||
#include <string.h> |
||||
// Grab the print function
|
||||
#ifdef ENCODER_ENABLE |
||||
# include "bb-encoder.h" |
||||
#endif // ENCODER_ENABLE
|
||||
|
||||
/* OLED
|
||||
* This contains general purpose oled code |
||||
*/
|
||||
|
||||
// Allow default to be overwritten by keymap if they return false
|
||||
__attribute__ ((weak)) bool oled_task_keymap(void) {return true;} |
||||
|
||||
// Do sane defaults for regular oled rendering
|
||||
void oled_task_user(void) { |
||||
if (is_oled_on()) { |
||||
if (oled_task_keymap()) { |
||||
render_status_lite(0, 0); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/*-------------------------*\
|
||||
|*---RENDERING FUNCTIONS---*| |
||||
\*-------------------------*/ |
||||
void render_qmk_logo(uint8_t row, uint8_t col) { |
||||
static const char PROGMEM qmk_logo[] = { |
||||
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d, |
||||
0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6, |
||||
0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, |
||||
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd, |
||||
0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0}; |
||||
oled_set_cursor(col, row); |
||||
oled_write_P(qmk_logo, false); |
||||
} |
||||
|
||||
void render_layer(uint8_t row, uint8_t col, uint8_t top_layer) { |
||||
// Write the layer state; 17 chars
|
||||
oled_set_cursor(col, row); |
||||
oled_write("Layer: ", false); |
||||
switch (top_layer) { |
||||
case _BASE: |
||||
oled_write("Default ", false); |
||||
break; |
||||
case _CHAR: |
||||
oled_write("Sp. Chars ", false); |
||||
break; |
||||
case _GAME: |
||||
oled_write("Gaming ", false); |
||||
break; |
||||
case _MEDI: |
||||
oled_write("Media Ctr ", false); |
||||
break; |
||||
case _NAVI: |
||||
oled_write("Navigation", false); |
||||
break; |
||||
case _SYMB: |
||||
oled_write("Symbols ", false); |
||||
break; |
||||
case _NUMB: |
||||
oled_write("Numpad ", false); |
||||
break; |
||||
case _FUNC: |
||||
oled_write("Funct Keys", false); |
||||
break; |
||||
case _MOUS: |
||||
oled_write("Mouse Keys", false); |
||||
break; |
||||
case _MUSI: |
||||
oled_write("Music Mode", false); |
||||
break; |
||||
default: |
||||
oled_write("?? N/A ?? ", false); |
||||
} |
||||
} |
||||
|
||||
void render_modifiers_lite(uint8_t row, uint8_t col, uint8_t mods) { |
||||
// Write the modifier state, 16 characters
|
||||
oled_set_cursor(col, row); |
||||
oled_write((mods & MOD_MASK_SHIFT ) ? "Shft " : " ", false); |
||||
oled_write((mods & MOD_MASK_CTRL ) ? "Ctrl " : " ", false); |
||||
oled_write((mods & MOD_MASK_ALT ) ? "Alt" : " ", false); |
||||
oled_write((mods & MOD_BIT(KC_RALT)) ? "G " : " ", false); |
||||
oled_write((mods & MOD_MASK_GUI ) ? "Meta " : " ", false); |
||||
} |
||||
|
||||
void render_encoder(uint8_t row, uint8_t col, uint8_t index, uint8_t layer) { |
||||
// Renders the encoder state, 14 characters
|
||||
oled_set_cursor(col, row); |
||||
|
||||
# ifdef ENCODER_ENABLE |
||||
static char encoder_temp9[9] = {0}; |
||||
oled_write("Enc: ", false); |
||||
encoder_state_string(index, layer, encoder_temp9); |
||||
oled_write(encoder_temp9, false); |
||||
# else // ENCODER_ENABLE
|
||||
oled_write("No enc. avail.", false); |
||||
# endif // ENCODER_ENABLE
|
||||
} |
||||
|
||||
void render_wpm(uint8_t row, uint8_t col) { |
||||
// Renders the WPM, 8 characters
|
||||
oled_set_cursor(col, row); |
||||
# ifdef WPM_ENABLE |
||||
static char wpm_temp4[4] = {0}; |
||||
oled_write("WPM: ", false); |
||||
itoa(get_current_wpm(), wpm_temp4, 10); |
||||
oled_write(wpm_temp4, false); |
||||
oled_write(" ", false); |
||||
# else // WPM_ENABLE
|
||||
oled_write("WPM: N/A", false); |
||||
# endif // WPM_ENABLE
|
||||
} |
||||
|
||||
// Writes the currently used OLED display layout
|
||||
void render_keymap(uint8_t row, uint8_t col, bool isLite) { |
||||
// Render the oled layout; lite is 11, regular is 14 characters
|
||||
oled_set_cursor(col, row); |
||||
if (isLite) { |
||||
oled_write("KM: ", false); |
||||
} else { |
||||
oled_write("Layout: ", false); |
||||
} |
||||
switch (userspace_config.layout % 3) { |
||||
case 0: |
||||
oled_write("Dvorak", false); |
||||
break; |
||||
case 1: |
||||
oled_write("Tur. F", false); |
||||
break; |
||||
case 2: |
||||
oled_write("Qwerty", false); |
||||
break; |
||||
} |
||||
if (isLite) { |
||||
oled_write(" ", false); |
||||
} |
||||
} |
||||
|
||||
// Writes the currently used OLED display layout
|
||||
#ifdef RGB_MATRIX_ENABLE |
||||
void render_rgb_lite(uint8_t row, uint8_t col) { |
||||
// Writes the currently used OLED display layout, 19 characters
|
||||
static char rgb_temp4[4] = {0}; |
||||
// Render the oled layout
|
||||
oled_set_cursor(col, row); |
||||
oled_write("m", false); |
||||
itoa(rgb_matrix_get_mode(), rgb_temp4, 10); |
||||
oled_write(rgb_temp4, false); |
||||
oled_write(" h", false); |
||||
itoa(rgb_matrix_get_hue(), rgb_temp4, 10); |
||||
oled_write(rgb_temp4, false); |
||||
oled_write(" s", false); |
||||
itoa(rgb_matrix_get_sat(), rgb_temp4, 10); |
||||
oled_write(rgb_temp4, false); |
||||
oled_write(" v", false); |
||||
itoa(rgb_matrix_get_val(), rgb_temp4, 10); |
||||
oled_write(rgb_temp4, false); |
||||
} |
||||
#endif // RGB_MATRIX_ENABLE
|
||||
|
||||
void render_status_lite(uint8_t row, uint8_t col) { |
||||
// Function to print state information; for low flash memory
|
||||
uint8_t this_layer = get_highest_layer(layer_state); |
||||
uint8_t this_mod = get_mods(); |
||||
|
||||
// Line 1: Layer State
|
||||
render_layer(row + 0, col + 0, this_layer); |
||||
|
||||
// Line 2: Mod or info
|
||||
switch (this_layer) { |
||||
// Show RGB mode as an overlay in media mode.
|
||||
# ifdef RGB_MATRIX_ENABLE |
||||
case _MEDI: |
||||
render_rgb_lite(row + 1, col + 0); |
||||
break; |
||||
# endif // RGB_MATRIX_ENABLE
|
||||
// Show the modifier if nothing else is doing anything
|
||||
default: |
||||
render_modifiers_lite(row + 1, col + 0, this_mod); |
||||
break; |
||||
} |
||||
|
||||
// Line 3: WPM and layout
|
||||
render_keymap(row + 2, col + 0, true); |
||||
render_wpm(row + 2, col + 11); |
||||
|
||||
// Line 4: Encoder states
|
||||
# ifdef SPLIT_KEYBOARD |
||||
if (is_keyboard_left()) { |
||||
render_encoder(row + 3, col + 0, 0, this_layer); |
||||
} else { |
||||
render_encoder(row + 3, col + 0, 1, this_layer); |
||||
} |
||||
# else // SPLIT_KEYBOARD
|
||||
render_encoder(row + 3, col + 0, 0, this_layer); |
||||
# endif // SPLIT_KEYBOARD
|
||||
} |
@ -0,0 +1,32 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
#include "bbaserdem.h" |
||||
|
||||
// Contain the main oled writer here
|
||||
void oled_task_user(void); |
||||
// Some generic rendering functions
|
||||
void render_qmk_logo(uint8_t row, uint8_t col); |
||||
void render_layer(uint8_t row, uint8_t col, uint8_t top_layer); |
||||
void render_modifiers_lite(uint8_t row, uint8_t col, uint8_t mods); |
||||
void render_encoder(uint8_t row, uint8_t col, uint8_t index, uint8_t layer); |
||||
void render_wpm(uint8_t row, uint8_t col); |
||||
void render_keymap(uint8_t row, uint8_t col, bool isLite); |
||||
#ifdef RGB_MATRIX_ENABLE |
||||
void render_rgb_lite(uint8_t row, uint8_t col); |
||||
#endif // RGB_MATRIX_ENABLE
|
||||
void render_status_lite(uint8_t row, uint8_t col); |
@ -0,0 +1,130 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#include "bb-rgb.h" |
||||
#include "color.h" |
||||
|
||||
#define X_DIV 224/2 |
||||
/* Code relating to per-key RGB LED stuff
|
||||
*/ |
||||
|
||||
// Allow hooking into the RGB matrix indications using keymap code
|
||||
|
||||
// Modulates the brightness of indicator
|
||||
RGB helper_dimmer(uint8_t r, uint8_t g, uint8_t b) { |
||||
RGB output; |
||||
output.r = r / 2; |
||||
output.g = g / 2; |
||||
output.b = b / 2; |
||||
return output; |
||||
} |
||||
// x range from 0-left to 224-right
|
||||
// y range from 0-top to 64-bottom
|
||||
void helper_painter(uint8_t led_min, uint8_t led_max, RGB col, uint8_t side) { |
||||
if (side == 1) { |
||||
// Left
|
||||
for(uint8_t i = led_min; i <= led_max; i++) { |
||||
if((g_led_config.point[i].x < X_DIV) && (g_led_config.flags[i] & LED_FLAG_INDICATOR)) { |
||||
rgb_matrix_set_color(i, col.r, col.g, col.b); |
||||
} |
||||
} |
||||
} else if (side == 2) { |
||||
// Right
|
||||
for(uint8_t i = led_min; i <= led_max; i++) { |
||||
if((g_led_config.point[i].x > X_DIV) && (g_led_config.flags[i] & LED_FLAG_INDICATOR)) { |
||||
rgb_matrix_set_color(i, col.r, col.g, col.b); |
||||
} |
||||
} |
||||
} else if (side == 0) { |
||||
// Both
|
||||
for(uint8_t i = led_min; i <= led_max; i++) { |
||||
if(g_led_config.flags[i] & LED_FLAG_INDICATOR) { |
||||
rgb_matrix_set_color(i, col.r, col.g, col.b); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Allow to turn off global handling
|
||||
__attribute__ ((weak)) bool rgb_matrix_indicators_advanced_keymap(uint8_t led_min, uint8_t led_max) { |
||||
return false; |
||||
} |
||||
// Set RGB state depending on layer
|
||||
void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { |
||||
uint8_t thisInd = 3; |
||||
RGB thisCol; |
||||
// Load keymap hooks
|
||||
if(rgb_matrix_indicators_advanced_keymap(led_min, led_max)) { |
||||
return; |
||||
} |
||||
// Grab color info
|
||||
switch (get_highest_layer(layer_state)) { |
||||
case _GAME: // Set left side as purple
|
||||
thisCol = helper_dimmer(RGB_PURPLE); |
||||
thisInd = 1; |
||||
break; |
||||
case _CHAR: // Set full board as gold
|
||||
thisCol = helper_dimmer(RGB_GOLD); |
||||
thisInd = 0; |
||||
break; |
||||
case _MEDI: // Set right side as pink
|
||||
thisCol = helper_dimmer(RGB_MAGENTA); |
||||
thisInd = 2; |
||||
break; |
||||
case _NAVI: // Set right side as green
|
||||
thisCol = helper_dimmer(RGB_GREEN); |
||||
thisInd = 2; |
||||
break; |
||||
case _SYMB: // Set right side as yellow
|
||||
thisCol = helper_dimmer(RGB_YELLOW); |
||||
thisInd = 2; |
||||
break; |
||||
case _NUMB: // Set left side as blue
|
||||
thisCol = helper_dimmer(RGB_BLUE); |
||||
thisInd = 1; |
||||
break; |
||||
case _FUNC: // Set left side as red
|
||||
thisCol = helper_dimmer(RGB_RED); |
||||
thisInd = 1; |
||||
break; |
||||
case _MOUS: // Set left side as blue-green
|
||||
thisCol = helper_dimmer(RGB_SPRINGGREEN); |
||||
thisInd = 1; |
||||
break; |
||||
case _MUSI: // Set full board as orange
|
||||
thisCol = helper_dimmer(RGB_ORANGE); |
||||
thisInd = 0; |
||||
break; |
||||
} |
||||
helper_painter(led_min, led_max, thisCol, thisInd); |
||||
} |
||||
|
||||
// Hook into shutdown code to make all perkey LED's red on hitting reset
|
||||
void shutdown_rgb(void) { |
||||
// Flash all the key LED's red on shutdown
|
||||
uint16_t timer_start = timer_read(); |
||||
rgb_matrix_set_color_all(RGB_CORAL); |
||||
// Delay until this registers
|
||||
while(timer_elapsed(timer_start) < 250) {wait_ms(1);} |
||||
} |
||||
|
||||
// Hook into suspend code
|
||||
void suspend_power_down_rgb(void) { |
||||
rgb_matrix_set_suspend_state(true); |
||||
} |
||||
void suspend_wakeup_init_rgb(void) { |
||||
rgb_matrix_set_suspend_state(false); |
||||
} |
@ -0,0 +1,28 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
#include "bbaserdem.h" |
||||
|
||||
/* Hooks involving perkey RGB LEDs
|
||||
*/ |
||||
|
||||
// For custom indicators
|
||||
void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max); |
||||
// Hook into shutdown code
|
||||
void shutdown_rgb(void); |
||||
void suspend_wakeup_init_rgb(void); |
||||
void suspend_power_down_rgb(void); |
@ -0,0 +1,116 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#include "bb-underglow.h" |
||||
|
||||
/* UNDERGLOW IMPLEMENTATION
|
||||
*/ |
||||
|
||||
// Define the layer switching code
|
||||
|
||||
// An empty layer on the base
|
||||
const rgblight_segment_t PROGMEM bb_base_layer[] = RGBLIGHT_LAYER_SEGMENTS( |
||||
{0, 0, HSV_WHITE} |
||||
); |
||||
// Gaming layer is turquoise
|
||||
const rgblight_segment_t PROGMEM bb_game_layer[] = RGBLIGHT_LAYER_SEGMENTS( |
||||
{RGBLIGHT_LEFT_BEG, RGBLIGHT_LEFT_NUM, HSV_PURPLE} |
||||
); |
||||
// Character overlay is chartereuse
|
||||
const rgblight_segment_t PROGMEM bb_char_layer[] = RGBLIGHT_LAYER_SEGMENTS( |
||||
{0, RGBLED_NUM, HSV_GOLD} |
||||
); |
||||
|
||||
// Right-hand layers
|
||||
|
||||
// Media layer is orange
|
||||
const rgblight_segment_t PROGMEM bb_medi_layer[] = RGBLIGHT_LAYER_SEGMENTS( |
||||
{RGBLIGHT_RIGHT_BEG, RGBLIGHT_RIGHT_NUM, HSV_MAGENTA} |
||||
); |
||||
// Navigation layer is green
|
||||
const rgblight_segment_t PROGMEM bb_navi_layer[] = RGBLIGHT_LAYER_SEGMENTS( |
||||
{RGBLIGHT_RIGHT_BEG, RGBLIGHT_RIGHT_NUM, HSV_GREEN} |
||||
); |
||||
// Symbol layer is purple
|
||||
const rgblight_segment_t PROGMEM bb_symb_layer[] = RGBLIGHT_LAYER_SEGMENTS( |
||||
{RGBLIGHT_RIGHT_BEG, RGBLIGHT_RIGHT_NUM, HSV_YELLOW} |
||||
); |
||||
|
||||
// Left-hand layers
|
||||
|
||||
// Number layer is blue
|
||||
const rgblight_segment_t PROGMEM bb_numb_layer[] = RGBLIGHT_LAYER_SEGMENTS( |
||||
{RGBLIGHT_LEFT_BEG, RGBLIGHT_LEFT_NUM, HSV_BLUE} |
||||
); |
||||
// Function layer is red
|
||||
const rgblight_segment_t PROGMEM bb_func_layer[] = RGBLIGHT_LAYER_SEGMENTS( |
||||
{RGBLIGHT_LEFT_BEG, RGBLIGHT_LEFT_NUM, HSV_RED} |
||||
); |
||||
// Pointer layer is yellow
|
||||
const rgblight_segment_t PROGMEM bb_mous_layer[] = RGBLIGHT_LAYER_SEGMENTS( |
||||
{RGBLIGHT_LEFT_BEG, RGBLIGHT_LEFT_NUM, HSV_SPRINGGREEN} |
||||
); |
||||
|
||||
// Music playback layer is magenta
|
||||
const rgblight_segment_t PROGMEM bb_musi_layer[] = RGBLIGHT_LAYER_SEGMENTS( |
||||
{0, RGBLED_NUM, HSV_ORANGE} |
||||
); |
||||
|
||||
const rgblight_segment_t* const PROGMEM bb_rgb_layers[] = RGBLIGHT_LAYERS_LIST( |
||||
bb_base_layer, |
||||
bb_char_layer, |
||||
bb_game_layer, |
||||
bb_medi_layer, |
||||
bb_navi_layer, |
||||
bb_symb_layer, |
||||
bb_numb_layer, |
||||
bb_func_layer, |
||||
bb_mous_layer, |
||||
bb_musi_layer |
||||
); |
||||
|
||||
// Enable the LED switching layers
|
||||
void keyboard_post_init_underglow(void) { |
||||
rgblight_layers = bb_rgb_layers; |
||||
// Default rgb mode is rainbow swirl; set this
|
||||
rgblight_sethsv_noeeprom(100, 255, 255); |
||||
rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_SWIRL + 0); |
||||
} |
||||
|
||||
// Set RGBLIGHT state depending on layer
|
||||
layer_state_t layer_state_set_underglow(layer_state_t state) { |
||||
// Activate layers if on that region
|
||||
rgblight_set_layer_state(_BASE, layer_state_cmp(state, _BASE)); |
||||
rgblight_set_layer_state(_GAME, layer_state_cmp(state, _GAME)); |
||||
rgblight_set_layer_state(_CHAR, layer_state_cmp(state, _CHAR)); |
||||
rgblight_set_layer_state(_MEDI, layer_state_cmp(state, _MEDI)); |
||||
rgblight_set_layer_state(_NAVI, layer_state_cmp(state, _NAVI)); |
||||
rgblight_set_layer_state(_SYMB, layer_state_cmp(state, _SYMB)); |
||||
rgblight_set_layer_state(_NUMB, layer_state_cmp(state, _NUMB)); |
||||
rgblight_set_layer_state(_FUNC, layer_state_cmp(state, _FUNC)); |
||||
rgblight_set_layer_state(_MOUS, layer_state_cmp(state, _MOUS)); |
||||
rgblight_set_layer_state(_MUSI, layer_state_cmp(state, _MUSI)); |
||||
// Return so other stuff can be done
|
||||
return state; |
||||
} |
||||
|
||||
// Hook into shutdown code
|
||||
void shutdown_underglow(void) { |
||||
// Make the LED's red on shutdown
|
||||
rgblight_enable_noeeprom(); |
||||
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); |
||||
rgblight_sethsv(HSV_WHITE); |
||||
} |
@ -0,0 +1,28 @@ |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
#include "bbaserdem.h" |
||||
|
||||
/* UNDERGLOW IMPLEMENTATION
|
||||
*/ |
||||
|
||||
// Used to initialize layer switching overlay
|
||||
void keyboard_post_init_underglow(void); |
||||
// Used to change RGB underglow layers on keymap layer change
|
||||
layer_state_t layer_state_set_underglow(layer_state_t state); |
||||
// Hook into shutdown to show effect on shutdown
|
||||
void shutdown_underglow(void); |
@ -1,633 +1,376 @@ |
||||
#include "bbaserdem.h" |
||||
|
||||
/*---------------*\
|
||||
|*-----MOUSE-----*| |
||||
\*---------------*/ |
||||
#ifdef MOUSEKEY_ENABLE |
||||
#include "mousekey.h" |
||||
#endif |
||||
|
||||
/*-------------*\
|
||||
|*-----RGB-----*| |
||||
\*-------------*/ |
||||
#ifdef RGBLIGHT_ENABLE |
||||
#include "rgblight.h" |
||||
#endif |
||||
|
||||
/*-------------*\
|
||||
|*---UNICODE---*| |
||||
\*-------------*/ |
||||
#ifdef UNICODE_ENABLE |
||||
#endif |
||||
|
||||
/*-----------------*\
|
||||
|*-----SECRETS-----*| |
||||
\*-----------------*/ |
||||
// Enabled by adding a non-tracked secrets.h to this dir.
|
||||
#if (__has_include("secrets.h")) |
||||
#include "secrets.h" |
||||
#endif |
||||
|
||||
/*---------------*\
|
||||
|*-----MUSIC-----*| |
||||
\*---------------*/ |
||||
#ifdef AUDIO_ENABLE |
||||
float tone_game[][2] = SONG(ZELDA_PUZZLE); |
||||
float tone_return[][2] = SONG(ZELDA_TREASURE); |
||||
float tone_linux[][2] = SONG(UNICODE_LINUX); |
||||
float tone_windows[][2] = SONG(UNICODE_WINDOWS); |
||||
#endif |
||||
|
||||
/*-------------------*\
|
||||
|*-----TAP-DANCE-----*| |
||||
\*-------------------*/ |
||||
#ifdef TAP_DANCE_ENABLE |
||||
qk_tap_dance_action_t tap_dance_actions[] = { |
||||
// Shift on double tap of semicolon
|
||||
[SCL] = ACTION_TAP_DANCE_DOUBLE( KC_SCLN, KC_COLN ) |
||||
}; |
||||
#endif |
||||
|
||||
/* In keymaps, instead of writing _user functions, write _keymap functions
|
||||
* The __attribute__((weak)) allows for empty definitions here, and during |
||||
* compilation, if these functions are defined elsewhere, they are written |
||||
* over. This allows to include custom code from keymaps in the generic code |
||||
* in this file. |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
__attribute__ ((weak)) void matrix_init_keymap(void) { } |
||||
__attribute__ ((weak)) void matrix_scan_keymap(void) { } |
||||
__attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { |
||||
return true; |
||||
|
||||
#include "bbaserdem.h" |
||||
// Language imports
|
||||
#include <sendstring_dvorak.h> |
||||
// Need memcpy and memcmp from string.h along with transfer stuff
|
||||
#ifdef SPLIT_KEYBOARD |
||||
#include "transactions.h" |
||||
#include <string.h> |
||||
#endif // SPLIT_KEYBOARD
|
||||
|
||||
/*-------------------------*\
|
||||
|*-----KEYBOARD CONFIG-----*| |
||||
\*-------------------------*/ |
||||
userspace_config_t userspace_config; |
||||
userspace_runtime_t userspace_runtime; |
||||
|
||||
/*---------------------------------*\
|
||||
|*----SPLIT KEYBOARD TRANSPORT-----*| |
||||
\*---------------------------------*/ |
||||
#ifdef SPLIT_KEYBOARD |
||||
userspace_config_t transport_userspace_config; |
||||
userspace_runtime_t transport_userspace_runtime; |
||||
|
||||
// Translate the RPC data to the local variable
|
||||
void userspace_config_sync(uint8_t in_buflen, const void* in_data, uint8_t out_buflen, void* out_data) { |
||||
// Copy incoming data to local variable
|
||||
if (in_buflen == sizeof(transport_userspace_config)) { |
||||
memcpy(&transport_userspace_config, in_data, in_buflen); |
||||
} |
||||
// There is no data to send back; so no output handling
|
||||
} |
||||
__attribute__ ((weak)) layer_state_t layer_state_set_keymap (layer_state_t state) { |
||||
return state; |
||||
void userspace_runtime_sync(uint8_t in_buflen, const void* in_data, uint8_t out_buflen, void* out_data) { |
||||
// Copy incoming data to local variable
|
||||
if (in_buflen == sizeof(transport_userspace_runtime)) { |
||||
memcpy(&transport_userspace_runtime, in_data, in_buflen); |
||||
} |
||||
// There is no data to send back; so no output handling
|
||||
} |
||||
__attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) { } |
||||
|
||||
/* ----------------------- *\
|
||||
* -----RGB Functions----- * |
||||
\* ----------------------- */ |
||||
#ifdef RGBLIGHT_ENABLE |
||||
// Storage variables
|
||||
extern rgblight_config_t rgblight_config; |
||||
bool base_sta; // Keeps track if in saveable state
|
||||
bool base_tog; // Whether base state is active or not
|
||||
int base_hue; // Hue value of base state
|
||||
int base_sat; // Saturation value of base state
|
||||
int base_val; // Brightness value of base state
|
||||
uint8_t base_mod; // Animation mode of the base state
|
||||
|
||||
// Save the current state of the rgb mode
|
||||
void rgblight_saveBase(void) { |
||||
base_hue = rgblight_config.hue; |
||||
base_sat = rgblight_config.sat; |
||||
base_val = rgblight_config.val; |
||||
base_mod = rgblight_config.mode; |
||||
base_tog = rgblight_config.enable; |
||||
base_sta = false; // If saving, that means base layer is being left
|
||||
// Either send or receive the correct data
|
||||
void userspace_transport_update(void) { |
||||
if (is_keyboard_master()) { |
||||
// If we are the main device; we want to send info.
|
||||
transport_userspace_config.raw = userspace_config.raw; |
||||
transport_userspace_runtime.raw = userspace_runtime.raw; |
||||
} else { |
||||
// If we are the secondary device; we want to receive info, and save to eeprom.
|
||||
userspace_config.raw = transport_userspace_config.raw; |
||||
userspace_runtime.raw = transport_userspace_runtime.raw; |
||||
} |
||||
} |
||||
|
||||
// Load the base state back
|
||||
void rgblight_loadBase(void) { |
||||
// Don't do anything if not enabled
|
||||
if ( !base_sta ) { |
||||
if ( base_tog ) { |
||||
rgblight_enable(); |
||||
rgblight_mode( base_mod ); |
||||
rgblight_sethsv( base_hue, base_sat, base_val ); |
||||
} else { |
||||
rgblight_disable(); |
||||
// Initiate the protocol on sync
|
||||
void userspace_transport_sync(bool force_sync) { |
||||
if (is_keyboard_master()) { |
||||
// Keep track of the last state
|
||||
static userspace_config_t last_userspace_config; |
||||
static userspace_runtime_t last_userspace_runtime; |
||||
bool needs_sync = false; |
||||
|
||||
// Check if the config values are different
|
||||
if (memcmp(&transport_userspace_config, &last_userspace_config, sizeof(transport_userspace_config))) { |
||||
needs_sync = true; |
||||
memcpy(&last_userspace_config, &transport_userspace_config, sizeof(transport_userspace_config)); |
||||
} |
||||
// Perform the sync if requested
|
||||
if (needs_sync || force_sync) { |
||||
transaction_rpc_send(RPC_ID_CONFIG_SYNC, sizeof(transport_userspace_config), &transport_userspace_config); |
||||
needs_sync = false; |
||||
} |
||||
} |
||||
// Mark that base is loaded, and to be saved before leaving
|
||||
base_sta = true; |
||||
} |
||||
|
||||
// Set to plain HSV color
|
||||
void rgblight_colorStatic( int hu, int sa, int va ) { |
||||
// First, it must be enabled or color change is not written
|
||||
rgblight_enable(); |
||||
rgblight_mode(1); |
||||
rgblight_sethsv(hu,sa,va); |
||||
} |
||||
/* HSV values
|
||||
* white ( 0, 0, 255) |
||||
* red ( 0, 255, 255) |
||||
* coral ( 16, 176, 255) |
||||
* orange ( 39, 255, 255) |
||||
* goldenrod ( 43, 218, 218) |
||||
* gold ( 51, 255, 255) |
||||
* yellow ( 60, 255, 255) |
||||
* chartreuse ( 90, 255, 255) |
||||
* green (120, 255, 255) |
||||
* springgreen (150, 255, 255) |
||||
* turquoise (174, 90, 112) |
||||
* teal (180, 255, 128) |
||||
* cyan (180, 255, 255) |
||||
* azure (186, 102, 255) |
||||
* blue (240, 255, 255) |
||||
* purple (270, 255, 255) |
||||
* magenta (300, 255, 255) |
||||
* pink (330, 128, 255) |
||||
*/ |
||||
// Check if the runtime values are different
|
||||
if (memcmp(&transport_userspace_runtime, &last_userspace_runtime, sizeof(transport_userspace_runtime))) { |
||||
needs_sync = true; |
||||
memcpy(&last_userspace_runtime, &transport_userspace_runtime, sizeof(transport_userspace_runtime)); |
||||
} |
||||
|
||||
// Set RGBLIGHT state depending on layer
|
||||
void rgblight_change( uint8_t this_layer ) { |
||||
// Save state, if saving is requested
|
||||
if ( base_sta ) { |
||||
rgblight_saveBase(); |
||||
} |
||||
// Change RGB light
|
||||
switch ( this_layer ) { |
||||
case _DV: |
||||
// Load base layer
|
||||
rgblight_loadBase(); |
||||
break; |
||||
case _AL: |
||||
// Do yellow for alternate
|
||||
rgblight_colorStatic( 60,255,255); |
||||
break; |
||||
case _GA: |
||||
// Do purple for game
|
||||
rgblight_colorStatic(285,255,255); |
||||
break; |
||||
case _NU: |
||||
// Do azure for number
|
||||
rgblight_colorStatic(186,200,255); |
||||
break; |
||||
case _SE: |
||||
// Do red for settings
|
||||
rgblight_colorStatic( 16,255,255); |
||||
break; |
||||
case _MO: |
||||
// Do green for mouse
|
||||
rgblight_colorStatic(120,255,255); |
||||
break; |
||||
case _MU: |
||||
// Do orange for music
|
||||
rgblight_colorStatic( 39,255,255); |
||||
break; |
||||
default: |
||||
// Something went wrong
|
||||
rgblight_colorStatic( 0,255,255); |
||||
break; |
||||
// Perform the sync if requested
|
||||
if (needs_sync || force_sync) { |
||||
transaction_rpc_send(RPC_ID_RUNTIME_SYNC, sizeof(transport_userspace_runtime), &transport_userspace_runtime); |
||||
needs_sync = false; |
||||
} |
||||
} |
||||
} |
||||
#endif // SPLIT_KEYBOARD
|
||||
|
||||
#endif |
||||
/*---------------------------*\
|
||||
|*-----KEYBOARD PRE INIT-----*| |
||||
\*---------------------------*/ |
||||
/* This code runs before anything is started.
|
||||
* Good for early hardware setup |
||||
*/ |
||||
__attribute__ ((weak)) void keyboard_pre_init_keymap(void) {} |
||||
__attribute__ ((weak)) void keyboard_pre_init_user(void) { |
||||
// Keymap specific stuff
|
||||
keyboard_pre_init_keymap(); |
||||
} |
||||
|
||||
/*---------------------*\
|
||||
|*-----MATRIX INIT-----*| |
||||
\*---------------------*/ |
||||
/* This code runs once midway thru the firmware process.
|
||||
* So far, sets the base layer and fixes unicode mode |
||||
*/ |
||||
__attribute__ ((weak)) void matrix_init_keymap(void) {} |
||||
void matrix_init_user (void) { |
||||
|
||||
// Keymap specific things, do it first thing to allow for delays etc
|
||||
// Keymap specific things
|
||||
matrix_init_keymap(); |
||||
} |
||||
|
||||
/*----------------------------*\
|
||||
|*-----KEYBOARD POST INIT-----*| |
||||
\*----------------------------*/ |
||||
/* This code runs after anything is started.
|
||||
* Good for late hardware setup, like setting up layer specifications |
||||
*/ |
||||
__attribute__ ((weak)) void keyboard_post_init_keymap(void) {} |
||||
__attribute__ ((weak)) void keyboard_post_init_user(void) { |
||||
// Fix beginning base layer, in case some other firmware was flashed
|
||||
// set_single_persistent_default_layer(_BASE);
|
||||
|
||||
// Correct unicode
|
||||
#ifdef UNICODE_ENABLE |
||||
// Unicode mode
|
||||
# ifdef UNICODEMAP_ENABLE |
||||
set_unicode_input_mode(UC_LNX); |
||||
#endif |
||||
# endif // UNICODEMAP_ENABLE
|
||||
|
||||
// Split keyboard halves communication
|
||||
# ifdef SPLIT_KEYBOARD |
||||
// Register the transactions
|
||||
transaction_register_rpc( RPC_ID_CONFIG_SYNC, userspace_config_sync ); |
||||
transaction_register_rpc(RPC_ID_RUNTIME_SYNC, userspace_runtime_sync); |
||||
// Load default config values
|
||||
if (is_keyboard_master()) { |
||||
// If we are main; load from eeconfig
|
||||
userspace_config.raw = eeconfig_read_user(); |
||||
// And update the transport variable
|
||||
userspace_transport_update(); |
||||
// Do one forced transfer to sync halves
|
||||
userspace_transport_sync(true); |
||||
} else { |
||||
// Just sync the data received
|
||||
userspace_transport_update(); |
||||
} |
||||
# else // SPLIT_KEYBOARD
|
||||
// If we are not split; just load from eeprom
|
||||
userspace_config.raw = eeconfig_read_user(); |
||||
# endif // SPLIT_KEYBOARD
|
||||
|
||||
// Backlight LED
|
||||
# ifdef BACKLIGHT_ENABLE |
||||
keyboard_post_init_backlight(); |
||||
# endif // BACKLIGHT_ENABLE
|
||||
|
||||
// RGB underglow
|
||||
# ifdef RGBLIGHT_ENABLE |
||||
keyboard_post_init_underglow(); |
||||
# endif // RGBLIGHT_ENABLE
|
||||
|
||||
// Keymap specific stuff
|
||||
keyboard_post_init_keymap(); |
||||
} |
||||
|
||||
// Make beginning layer DVORAK
|
||||
set_single_persistent_default_layer(_DV); |
||||
/*---------------------------*\
|
||||
|*-----HOUSEKEEPING TASK-----*| |
||||
\*---------------------------*/ |
||||
/* I have no idea what this does
|
||||
*/ |
||||
__attribute__ ((weak)) void housekeeping_task_keymap(void) {} |
||||
void housekeeping_task_user(void) { |
||||
// Check eeprom every now and then
|
||||
static userspace_config_t prev_userspace_config; |
||||
static fast_timer_t throttle_timer = 0; |
||||
static bool init_flag = true; |
||||
|
||||
// Read this if we never read it before
|
||||
if (init_flag) { |
||||
init_flag = false; |
||||
prev_userspace_config.raw = eeconfig_read_user(); |
||||
} |
||||
|
||||
//--RGB light initialize base layer
|
||||
#ifdef RGBLIGHT_ENABLE |
||||
// Base hue is white, and RGB disabled
|
||||
base_hue = 100; |
||||
base_sat = 0; |
||||
base_val = 255; |
||||
base_mod = 2; |
||||
base_tog = false; |
||||
rgblight_enable(); |
||||
rgblight_mode(base_mod); |
||||
rgblight_sethsv(base_hue,base_sat,base_val); |
||||
rgblight_disable(); |
||||
rgblight_loadBase(); |
||||
#endif |
||||
// Throttled tasks here
|
||||
if (timer_elapsed_fast(throttle_timer) >= HOUSEKEEPING_THROTTLE_INTERVAL_MS) { |
||||
// Refresh timer
|
||||
throttle_timer = timer_read_fast(); |
||||
// Check userspace config for eeprom updates
|
||||
if (memcmp(&prev_userspace_config, &userspace_config, sizeof(userspace_config))) { |
||||
memcpy(&prev_userspace_config, &userspace_config, sizeof(userspace_config)); |
||||
eeconfig_update_user(userspace_config.raw); |
||||
} |
||||
} |
||||
|
||||
// Do transport stuff
|
||||
# ifdef SPLIT_KEYBOARD |
||||
userspace_transport_update(); |
||||
userspace_transport_sync(false); |
||||
# endif // SPLIT_KEYBOARD
|
||||
|
||||
// Hook to keymap code
|
||||
housekeeping_task_keymap(); |
||||
} |
||||
|
||||
/*-----------------------*\
|
||||
|*-----EECONFIG INIT-----*| |
||||
\*-----------------------*/ |
||||
/* Default values to send to the eeprom
|
||||
*/ |
||||
void eeconfig_init_user(void) { |
||||
// Set everything to default
|
||||
userspace_config.raw = 0; |
||||
// Set encoder states to sane defaults if enabled
|
||||
# ifdef ENCODER_ENABLE |
||||
reset_encoder_state(); |
||||
# endif // ENCODER_ENABLE
|
||||
} |
||||
|
||||
/*------------------------*\
|
||||
|*-----PROCESS RECORD-----*| |
||||
\*------------------------*/ |
||||
/* Process record: custom keycodes to process here
|
||||
* Allow also the following codes to hook here as well; |
||||
* Macro definitions |
||||
* Audio hooks |
||||
*/ |
||||
__attribute__ ((weak)) |
||||
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { |
||||
return true; |
||||
} |
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
||||
// Return after running through all individual hooks
|
||||
return |
||||
process_record_keymap(keycode, record) && |
||||
# ifdef AUDIO_ENABLE |
||||
process_record_audio(keycode, record) && |
||||
# endif // AUDIO_ENABLE
|
||||
# ifdef ENCODER_ENABLE |
||||
process_record_encoder(keycode, record) && |
||||
# endif // ENCODER_ENABLE
|
||||
process_record_macro(keycode, record); |
||||
} |
||||
|
||||
/*---------------------*\
|
||||
|*-----MATRIX SCAN-----*| |
||||
\*---------------------*/ |
||||
/* This code runs every frame
|
||||
* I used to check for layer switching here, but layer state is better used. |
||||
* Try to not put anything here; as it runs hundreds time per second-ish |
||||
*/ |
||||
__attribute__ ((weak)) void matrix_scan_keymap(void) { } |
||||
void matrix_scan_user (void) { |
||||
// Keymap specific, do it first
|
||||
// Keymap specific scan function
|
||||
matrix_scan_keymap(); |
||||
} |
||||
|
||||
/*------------------*\
|
||||
|*-----KEYCODES-----*| |
||||
\*------------------*/ |
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
||||
|
||||
// Shift check
|
||||
bool is_capital = ( keyboard_report->mods & (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)) ); |
||||
static bool lock_flag = false; |
||||
uint8_t layer = biton32 (layer_state); |
||||
|
||||
switch (keycode) { |
||||
// Secrets implementation
|
||||
#if (__has_include("secrets.h")) |
||||
case SECRET1: |
||||
if( !record->event.pressed ) { |
||||
send_string_P( secret[ keycode - SECRET1 ] ); |
||||
} |
||||
return false; |
||||
break; |
||||
case SECRET2: |
||||
if( !record->event.pressed ) { |
||||
send_string_P( secret[ keycode - SECRET2 ] ); |
||||
} |
||||
return false; |
||||
break; |
||||
case SECRET3: |
||||
if( !record->event.pressed ) { |
||||
send_string_P( secret[ keycode - SECRET3 ] ); |
||||
} |
||||
return false; |
||||
break; |
||||
#endif |
||||
|
||||
// If these keys are pressed, load base layer config, and mark saving
|
||||
#ifdef RGBLIGHT_ENABLE |
||||
case RGB_TOG: |
||||
case RGB_MOD: |
||||
case RGB_VAI: |
||||
case RGB_VAD: |
||||
case RGB_SAI: |
||||
case RGB_SAD: |
||||
case RGB_HUI: |
||||
case RGB_HUD: |
||||
if ( !base_sta ) { |
||||
rgblight_loadBase(); |
||||
} |
||||
return true; |
||||
break; |
||||
#endif |
||||
|
||||
// Lock functionality: These layers are locked if the LOCKED buttons are
|
||||
// pressed. Otherwise, they are momentary toggles
|
||||
case K_LOCK: |
||||
if (record->event.pressed) { |
||||
lock_flag = !lock_flag; |
||||
} |
||||
return false; |
||||
break; |
||||
case K_MOUSE: |
||||
if (record->event.pressed) { |
||||
layer_on(_MO); |
||||
lock_flag = false; |
||||
} else { |
||||
if ( lock_flag ) { |
||||
lock_flag = false; |
||||
} else { |
||||
layer_off(_MO); |
||||
} |
||||
} |
||||
return false; |
||||
break; |
||||
case K_NUMBR: |
||||
if (record->event.pressed) { |
||||
layer_on(_NU); |
||||
lock_flag = false; |
||||
} else { |
||||
if ( lock_flag ) { |
||||
lock_flag = false; |
||||
} else { |
||||
layer_off(_NU); |
||||
} |
||||
} |
||||
return false; |
||||
break; |
||||
|
||||
// Layer switches with sound
|
||||
case K_GAMES: |
||||
if (record->event.pressed) { |
||||
// On press, turn off layer if active
|
||||
if ( layer == _GA ) { |
||||
#ifdef AUDIO_ENABLE |
||||
stop_all_notes(); |
||||
PLAY_SONG(tone_return); |
||||
#endif |
||||
layer_off(_GA); |
||||
} |
||||
} else { |
||||
// After click, turn on layer if accessed from setting
|
||||
if ( layer == _SE ) { |
||||
#ifdef AUDIO_ENABLE |
||||
stop_all_notes(); |
||||
PLAY_SONG(tone_game); |
||||
#endif |
||||
layer_on(_GA); |
||||
layer_off(_SE); |
||||
} |
||||
} |
||||
return false; |
||||
break; |
||||
case MU_TOG: |
||||
if (record->event.pressed) { |
||||
// On press, turn off layer if active
|
||||
if ( layer == _SE ) { |
||||
layer_off(_SE); |
||||
layer_on(_MU); |
||||
} else { |
||||
layer_off(_MU); |
||||
} |
||||
} |
||||
return true; |
||||
break; |
||||
|
||||
//------UNICODE
|
||||
// Unicode switches with sound
|
||||
#ifdef UNICODE_ENABLE |
||||
case UNI_LI: |
||||
if (record->event.pressed) { |
||||
#ifdef AUDIO_ENABLE |
||||
stop_all_notes(); |
||||
PLAY_SONG(tone_linux); |
||||
#endif |
||||
set_unicode_input_mode(UC_LNX); |
||||
} |
||||
return false; |
||||
break; |
||||
case UNI_WN: |
||||
if (record->event.pressed) { |
||||
#ifdef AUDIO_ENABLE |
||||
stop_all_notes(); |
||||
PLAY_SONG(tone_windows); |
||||
#endif |
||||
set_unicode_input_mode(UC_WIN); |
||||
} |
||||
return false; |
||||
break; |
||||
|
||||
// Turkish letters, with capital functionality
|
||||
case TUR_A: |
||||
if (record->event.pressed) { |
||||
if ( is_capital ) { |
||||
unicode_input_start(); |
||||
register_hex(0x00c2); |
||||
unicode_input_finish(); |
||||
} else { |
||||
unicode_input_start(); |
||||
register_hex(0x00e2); |
||||
unicode_input_finish(); |
||||
} |
||||
} |
||||
return false; |
||||
break; |
||||
case TUR_O: |
||||
if (record->event.pressed) { |
||||
if ( is_capital ) { |
||||
unicode_input_start(); |
||||
register_hex(0x00d6); |
||||
unicode_input_finish(); |
||||
} else { |
||||
unicode_input_start(); |
||||
register_hex(0x00f6); |
||||
unicode_input_finish(); |
||||
} |
||||
} |
||||
return false; |
||||
break; |
||||
case TUR_U: |
||||
if (record->event.pressed) { |
||||
if ( is_capital ) { |
||||
unicode_input_start(); |
||||
register_hex(0x00dc); |
||||
unicode_input_finish(); |
||||
} else { |
||||
unicode_input_start(); |
||||
register_hex(0x00fc); |
||||
unicode_input_finish(); |
||||
} |
||||
} |
||||
return false; |
||||
break; |
||||
case TUR_I: |
||||
if (record->event.pressed) { |
||||
if ( is_capital ) { |
||||
unicode_input_start(); |
||||
register_hex(0x0130); |
||||
unicode_input_finish(); |
||||
} else { |
||||
unicode_input_start(); |
||||
register_hex(0x0131); |
||||
unicode_input_finish(); |
||||
} |
||||
} |
||||
return false; |
||||
break; |
||||
case TUR_G: |
||||
if (record->event.pressed) { |
||||
if ( is_capital ) { |
||||
unicode_input_start(); |
||||
register_hex(0x011e); |
||||
unicode_input_finish(); |
||||
} else { |
||||
unicode_input_start(); |
||||
register_hex(0x011f); |
||||
unicode_input_finish(); |
||||
} |
||||
} |
||||
return false; |
||||
break; |
||||
case TUR_C: |
||||
if (record->event.pressed) { |
||||
if ( is_capital ) { |
||||
unicode_input_start(); |
||||
register_hex(0x00c7); |
||||
unicode_input_finish(); |
||||
} else { |
||||
unicode_input_start(); |
||||
register_hex(0x00e7); |
||||
unicode_input_finish(); |
||||
} |
||||
} |
||||
return false; |
||||
break; |
||||
case TUR_S: |
||||
if (record->event.pressed) { |
||||
if ( is_capital ) { |
||||
unicode_input_start(); |
||||
register_hex(0x015e); |
||||
unicode_input_finish(); |
||||
} else { |
||||
unicode_input_start(); |
||||
register_hex(0x015f); |
||||
unicode_input_finish(); |
||||
} |
||||
} |
||||
return false; |
||||
break; |
||||
#endif |
||||
/*---------------------*\
|
||||
|*-----LAYER STATE-----*| |
||||
\*---------------------*/ |
||||
/* This code runs after every layer change
|
||||
* State represents the new layer state. |
||||
*/ |
||||
__attribute__ ((weak)) |
||||
layer_state_t layer_state_set_keymap (layer_state_t state) { |
||||
return state; |
||||
} |
||||
layer_state_t layer_state_set_user(layer_state_t state) { |
||||
// Keymap layer state setting
|
||||
state = layer_state_set_keymap(state); |
||||
// For underglow stuff
|
||||
# ifdef RGBLIGHT_ENABLE |
||||
state = layer_state_set_underglow(state); |
||||
# endif // RGBLIGHT_ENABLE
|
||||
// Audio playback
|
||||
# ifdef AUDIO_ENABLE |
||||
state = layer_state_set_audio(state); |
||||
# endif // AUDIO_ENABLE
|
||||
|
||||
//-------Diagonal mouse movements
|
||||
#ifdef MOUSEKEY_ENABLE |
||||
case MO_NE: |
||||
if( record->event.pressed ) { |
||||
mousekey_on(MO_N); |
||||
mousekey_on(MO_E); |
||||
mousekey_send(); |
||||
} else { |
||||
mousekey_off(MO_N); |
||||
mousekey_off(MO_E); |
||||
mousekey_send(); |
||||
} |
||||
return false; |
||||
break; |
||||
case MO_NW: |
||||
if( record->event.pressed ) { |
||||
mousekey_on(MO_N); |
||||
mousekey_on(MO_W); |
||||
mousekey_send(); |
||||
} else { |
||||
mousekey_off(MO_N); |
||||
mousekey_off(MO_W); |
||||
mousekey_send(); |
||||
} |
||||
return false; |
||||
break; |
||||
case MO_SE: |
||||
if( record->event.pressed ) { |
||||
mousekey_on(MO_S); |
||||
mousekey_on(MO_E); |
||||
mousekey_send(); |
||||
} else { |
||||
mousekey_off(MO_S); |
||||
mousekey_off(MO_E); |
||||
mousekey_send(); |
||||
} |
||||
return false; |
||||
break; |
||||
case MO_SW: |
||||
if( record->event.pressed ) { |
||||
mousekey_on(MO_S); |
||||
mousekey_on(MO_W); |
||||
mousekey_send(); |
||||
} else { |
||||
mousekey_off(MO_S); |
||||
mousekey_off(MO_W); |
||||
mousekey_send(); |
||||
} |
||||
return false; |
||||
break; |
||||
case MO_S_NE: |
||||
if( record->event.pressed ) { |
||||
mousekey_on(MO_S_N); |
||||
mousekey_on(MO_S_E); |
||||
mousekey_send(); |
||||
} else { |
||||
mousekey_off(MO_S_N); |
||||
mousekey_off(MO_S_E); |
||||
mousekey_send(); |
||||
} |
||||
return false; |
||||
break; |
||||
case MO_S_NW: |
||||
if( record->event.pressed ) { |
||||
mousekey_on(MO_S_N); |
||||
mousekey_on(MO_S_W); |
||||
mousekey_send(); |
||||
} else { |
||||
mousekey_off(MO_S_N); |
||||
mousekey_off(MO_S_W); |
||||
mousekey_send(); |
||||
} |
||||
return false; |
||||
break; |
||||
case MO_S_SE: |
||||
if( record->event.pressed ) { |
||||
mousekey_on(MO_S_S); |
||||
mousekey_on(MO_S_E); |
||||
mousekey_send(); |
||||
} else { |
||||
mousekey_off(MO_S_S); |
||||
mousekey_off(MO_S_E); |
||||
mousekey_send(); |
||||
} |
||||
return false; |
||||
break; |
||||
case MO_S_SW: |
||||
if( record->event.pressed ) { |
||||
mousekey_on(MO_S_S); |
||||
mousekey_on(MO_S_W); |
||||
mousekey_send(); |
||||
} else { |
||||
mousekey_off(MO_S_S); |
||||
mousekey_off(MO_S_W); |
||||
mousekey_send(); |
||||
} |
||||
return false; |
||||
break; |
||||
#endif |
||||
return state; |
||||
} |
||||
|
||||
//------DOUBLE PRESS, with added left navigation
|
||||
case DBL_SPC: |
||||
if( record->event.pressed ) { |
||||
SEND_STRING(" "SS_TAP(X_LEFT)); |
||||
} |
||||
return false; |
||||
break; |
||||
case DBL_ANG: |
||||
if( record->event.pressed ) { |
||||
SEND_STRING("<>"SS_TAP(X_LEFT)); |
||||
} |
||||
return false; |
||||
break; |
||||
case DBL_PAR: |
||||
if( record->event.pressed ) { |
||||
SEND_STRING("()"SS_TAP(X_LEFT)); |
||||
} |
||||
return false; |
||||
break; |
||||
case DBL_SQR: |
||||
if( record->event.pressed ) { |
||||
SEND_STRING("[]"SS_TAP(X_LEFT)); |
||||
} |
||||
return false; |
||||
break; |
||||
case DBL_BRC: |
||||
if( record->event.pressed ) { |
||||
SEND_STRING("{}"SS_TAP(X_LEFT)); |
||||
} |
||||
return false; |
||||
break; |
||||
case DBL_QUO: |
||||
if( record->event.pressed ) { |
||||
SEND_STRING("\'\'"SS_TAP(X_LEFT)); |
||||
} |
||||
return false; |
||||
break; |
||||
case DBL_DQT: |
||||
if( record->event.pressed ) { |
||||
SEND_STRING("\"\""SS_TAP(X_LEFT)); |
||||
} |
||||
return false; |
||||
break; |
||||
case DBL_GRV: |
||||
if( record->event.pressed ) { |
||||
SEND_STRING("``"SS_TAP(X_LEFT)); |
||||
} |
||||
return false; |
||||
break; |
||||
// END OF KEYCODES
|
||||
} |
||||
return process_record_keymap(keycode, record); |
||||
/*-----------------------------*\
|
||||
|*-----DEFAULT LAYER STATE-----*| |
||||
\*-----------------------------*/ |
||||
/* This code runs after every time default base layer is changed
|
||||
*/ |
||||
__attribute__ ((weak)) |
||||
layer_state_t default_layer_state_set_keymap (layer_state_t state) { |
||||
return state; |
||||
} |
||||
layer_state_t default_layer_state_set_user(layer_state_t state) { |
||||
// Keymap level code
|
||||
state = default_layer_state_set_keymap(state); |
||||
return state; |
||||
} |
||||
|
||||
/*----------------------*\
|
||||
|*-----LAYER CHANGE-----*| |
||||
\*----------------------*/ |
||||
/*------------------------*\
|
||||
|*-----LED SET KEYMAP-----*| |
||||
\*------------------------*/ |
||||
/* Code for LED indicators
|
||||
* I'm not sure when exactly does this code run |
||||
*/ |
||||
__attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) {} |
||||
void led_set_user(uint8_t usb_led) { |
||||
led_set_keymap(usb_led); |
||||
} |
||||
|
||||
layer_state_t layer_state_set_user(layer_state_t state) { |
||||
/*-----------------*\
|
||||
|*-----SUSPEND-----*| |
||||
\*-----------------*/ |
||||
/* Suspend stuff here, mostly for the rgb lighting.
|
||||
*/ |
||||
__attribute__ ((weak)) void suspend_power_down_keymap (void) { } |
||||
void suspend_power_down_user(void) { |
||||
suspend_power_down_keymap(); |
||||
// RGB matrix sleep hook
|
||||
# ifdef RGB_MATRIX_ENABLE |
||||
suspend_power_down_rgb(); |
||||
# endif // RGB_MATRIX_ENABLE
|
||||
} |
||||
__attribute__ ((weak)) void suspend_wakeup_init_keymap (void) { } |
||||
void suspend_wakeup_init_user(void) { |
||||
suspend_wakeup_init_keymap(); |
||||
// RGB matrix sleep hook
|
||||
# ifdef RGB_MATRIX_ENABLE |
||||
suspend_wakeup_init_rgb(); |
||||
# endif // RGB_MATRIX_ENABLE
|
||||
} |
||||
|
||||
<<<<<<< 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,9 +1,134 @@ |
||||
#ifndef USERSPACE_CONFIG_H |
||||
#define USERSPACE_CONFIG_H |
||||
/* Copyright 2021 Batuhan Başerdem
|
||||
* <baserdem.batuhan@gmail.com> @bbaserdem |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#pragma once |
||||
|
||||
#ifdef TAP_DANCE_ENABLE |
||||
#define TAPPING_TERM 300 |
||||
#define TAPPING_TOGGLE 1 |
||||
/* CONFIG
|
||||
* Common hardware configuration accross my boards |
||||
*/ |
||||
// Space saving
|
||||
#ifdef LOCKING_SUPPORT_ENABLE |
||||
# undef LOCKING_SUPPORT_ENABLE |
||||
#endif |
||||
#ifdef LOCKING_RESYNC_ENABLE |
||||
# undef LOCKING_RESYNC_ENABLE |
||||
#endif |
||||
#ifndef NO_DEBUG |
||||
# define NO_DEBUG |
||||
#endif |
||||
|
||||
#if !defined(NO_PRINT) && !defined(CONSOLE_ENABLE) |
||||
# define NO_PRINT |
||||
#endif |
||||
|
||||
// Some of my own settings
|
||||
# define HOUSEKEEPING_THROTTLE_INTERVAL_MS 250 |
||||
|
||||
// Split transport settings
|
||||
#ifdef SPLIT_KEYBOARD |
||||
# define SPLIT_TRANSPORT_MIRROR |
||||
# define SPLIT_LAYER_STATE_ENABLE |
||||
# define SPLIT_MODS_ENABLE |
||||
# define SPLIT_TRANSACTION_IDS_USER RPC_ID_CONFIG_SYNC, RPC_ID_RUNTIME_SYNC, RPC_ID_KEYMAP_SYNC |
||||
# define SPLIT_LED_STATE_ENABLE |
||||
# ifdef WPM_ENABLE |
||||
# define SPLIT_WPM_ENABLE |
||||
# endif // WPM_ENABLE
|
||||
# ifdef OLED_ENABLE |
||||
# define SPLIT_OLED_ENABLE |
||||
# endif // OLED_ENABLE
|
||||
#endif // SPLIT_KEYBOARD
|
||||
|
||||
// Unicode entry mode
|
||||
#ifdef UNICODEMAP_ENABLE |
||||
# define UNICODE_SELECTED_MODES UC_LNX |
||||
// Adapt the unicode entry mode to dvorak
|
||||
# ifdef UNICODE_KEY_LNX |
||||
# undef UNICODE_KEY_LNX |
||||
# endif |
||||
# define UNICODE_KEY_LNX LCTL(LSFT(KC_F)) |
||||
#endif // UNICODEMAP_ENABLE
|
||||
|
||||
// Mousekey mode
|
||||
#ifdef MOUSEKEY_ENABLE |
||||
# define MK_COMBINED |
||||
#endif // MOUSEKEY_ENABLE
|
||||
|
||||
// Tap-hold settings
|
||||
#define TAPPING_TERM 200 |
||||
#define TAP_CODE_DELAY 20 |
||||
#define IGNORE_MOD_TAP_INTERRUPT |
||||
#define PERMISSIVE_HOLD |
||||
#define TAPPING_FORCE_HOLD |
||||
|
||||
// Backlight settings
|
||||
#ifdef BACKLIGHT_ENABLE |
||||
# define BACKLIGHT_BREATHING |
||||
# define BREATHING_PERIOD 5 |
||||
#endif // BACKLIGHT_ENABLE
|
||||
|
||||
// Audio definitions
|
||||
#ifdef AUDIO_ENABLE |
||||
//# define AUDIO_ENABLE_TONE_MULTIPLEXING
|
||||
// Make findable songs as defaults
|
||||
# ifdef HOROLOGY |
||||
# define STARTUP_SONG SONG(HOROLOGY) |
||||
# endif |
||||
# ifdef PEOPLE_VULTURES |
||||
# define GOODBYE_SONG SONG(PEOPLE_VULTURES) |
||||
# endif |
||||
# ifdef NONAGON_INFINITY |
||||
# define MUSIC_ON_SONG SONG(NONAGON_INFINITY) |
||||
# endif |
||||
# ifdef WAH_WAH |
||||
# define MUSIC_OFF_SONG SONG(WAH_WAH) |
||||
# endif |
||||
// Audio code expects these to be defined
|
||||
# ifdef BIG_FIG_WASP |
||||
# define GAME_ON_SONG SONG(BIG_FIG_WASP) |
||||
# else |
||||
# define GAME_ON_SONG SONG(USSR_ANTHEM) |
||||
# endif |
||||
# ifdef POLYGONDWANALAND |
||||
# define GAME_OFF_SONG SONG(POLYGONDWANALAND) |
||||
# else |
||||
# define GAME_OFF_SONG SONG(NOCTURNE_OP_9_NO_1) |
||||
# endif |
||||
#endif // AUDIO_ENABLE
|
||||
|
||||
// OLED definitions
|
||||
#ifdef OLED_ENABLE |
||||
// Timeout does not work for split secondary board; i implemented it myself
|
||||
# define OLED_TIMEOUT 30000 |
||||
// Fade out the screen when timing out
|
||||
# define OLED_FADE_OUT |
||||
# define OLED_FADE_OUT_INTERVAL 15 |
||||
#endif // OLED_ENABLE
|
||||
|
||||
#endif // !USERSPACE_CONFIG_H
|
||||
// For perkey leds
|
||||
#ifdef RGB_MATRIX_ENABLE |
||||
// This is not working
|
||||
//# define RGB_DISABLE_TIMEOUT 1800000
|
||||
# define RGB_DISABLE_WHEN_USB_SUSPENDED true |
||||
// Start using this mode
|
||||
# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_RAINBOW_BEACON |
||||
# define RGB_MATRIX_STARTUP_HUE 100 |
||||
# define RGB_MATRIX_STARTUP_SAT 255 |
||||
# define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS |
||||
// Some config options
|
||||
# define RGB_MATRIX_KEYRELEASES |
||||
# define RGB_MATRIX_FRAMEBUFFER_EFFECTS // Enable framebuffer effects
|
||||
#endif // RGB_MATRIX_ENABLE
|
||||
|
@ -0,0 +1,4 @@ |
||||
*.bmp |
||||
splitImages |
||||
templates |
||||
!.gitignore |
@ -0,0 +1,38 @@ |
||||
#!/bin/bash |
||||
|
||||
# Copyright 2021 Batuhan Başerdem |
||||
# <baserdem.batuhan@gmail.com> @bbaserdem |
||||
# |
||||
# This program is free software: you can redistribute it and/or modify |
||||
# it under the terms of the GNU General Public License as published by |
||||
# the Free Software Foundation, either version 2 of the License, or |
||||
# (at your option) any later version. |
||||
# |
||||
# This program is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
||||
# Goes through all the files and turns them into strips in their respective folder |
||||
if [ -z "${1}" ] ; then |
||||
echo 'No argument; defaulting to script directory.' |
||||
target_dir="$(dirname "${0}")" |
||||
elif [ -d "${1}" ] ; then |
||||
echo "Targeting files in '${1}'." |
||||
target_dir="${1}" |
||||
else |
||||
echo 'Argument is not directory.' |
||||
exit 1 |
||||
fi |
||||
|
||||
output_dir="${target_dir}/splitImages" |
||||
mkdir -p "${output_dir}" |
||||
|
||||
for this_image in "${target_dir}/"*.bmp ; do |
||||
echo "Found '${this_image}'." |
||||
this_name="$(basename "${this_image%%.bmp}")" |
||||
convert "${this_image}" -crop 'x8' "${output_dir}/${this_name}"_%d.bmp |
||||
done |
@ -0,0 +1,131 @@ |
||||
# BBASERDEM userspace code for qmk |
||||
|
||||
My userspace code for my various keyboards; available here. |
||||
|
||||
## Builds |
||||
|
||||
These are my keyboard builds and info, it allows me to plan out my builds. |
||||
|
||||
### Planck SERVER |
||||
|
||||
* Board: `kprepublic/jj40` |
||||
* Microcontroller: Embedded |
||||
* Layout: `ortho_4x12` |
||||
* Functionality: Underglow RGB Lighting, LED diode lighting. |
||||
* Case: Clear Acrylic Top and Bottow, with Frosted Acrylic Diffuser (Smashing Acrylics) |
||||
* Switches: BOX Navy |
||||
* Keycaps: Datamancer Tall Deco Typewriter Keycaps |
||||
|
||||
Just a decorative planck replacement (for my rev4 PCB that died.) |
||||
|
||||
### Planck Light |
||||
|
||||
* Board: `planck/light` |
||||
* Microcontroller: Embedded |
||||
* Layout: `ortho_4x12` |
||||
* Functionality: Per-key RGB Lighting, Audio. |
||||
* Case: Clear Acrylic Top and Bottow, with Frosted Acrylic Diffuser (Smashing Acrylics) |
||||
* Switches: BOX Navy |
||||
* Keycaps: Datamancer Tall Deco Typewriter Keycaps |
||||
|
||||
Just a decorative planck replacement (for my rev4 PCB that died.) |
||||
|
||||
### Corne ARM |
||||
|
||||
* Board: `crkbd/rev1` |
||||
* Microcontroller: Proton C (x2) |
||||
* Layout: `split_3x6_3` |
||||
* Functionality: OLED, Audio, Per-key RGB Lighting, Rotary Encoder (x2) |
||||
* Case: IMK Corne Case v2 Polycarbonate |
||||
* Switches: Healios V2 |
||||
* Keycaps: POM Jelly |
||||
|
||||
PCB is actually [Proton-C Compatible crkbd PCB](https://github.com/ItsWaffIe/waffle_corne). |
||||
|
||||
### Corne Lite |
||||
|
||||
* Board: `crkbd/rev1` |
||||
* Microcontroller: Pro Micro (x2) |
||||
* Layout: `split_3x5_3` |
||||
* Functionality: Per-key RGB Lighting, OLED (No firmware space) |
||||
* Case: Custom |
||||
* Switches: Choc Low Burnt Orange |
||||
* Keycaps: [Scooped Choc Keycaps](https://mkultra.click/collections/keycaps/products/scooped-choc-keycaps?variant=31223543365730) |
||||
|
||||
Maybe try adding a trackpad for this, as detailed |
||||
[here](https://github.com/manna-harbour/crkbd/blob/master/trackpoint/readme.org). |
||||
|
||||
### Kyria |
||||
|
||||
* Board: `splitkb/kyria/rev1` |
||||
* Microcontroller: Pro Micro (x2) |
||||
* Layout: `split_3x6_6` |
||||
* Functionality: OLED, Underglow RGB Lighting (No firmware space), Rotary Encoder (x2) |
||||
* Case: Matte Black Acrylic High-Profile case |
||||
* Switches: Gateron Ink Silent Black |
||||
* Keycaps: Oblotzky SA Oblivion |
||||
|
||||
Main driver at work currently; love the switches and the board layout. |
||||
|
||||
# Firmware building |
||||
|
||||
## Archlinux |
||||
|
||||
On archlinux, the package *arm-none-eabi-gcc* is too new. |
||||
To fix; add to the environment `CFLAGS="-Wno-error=deprecated"` to compilation commands. |
||||
Also; says to run `avr-gcc` version `8.4.0` for smaller firmware, |
||||
but I find that it only saves a few bytes. |
||||
|
||||
## Bootloader |
||||
|
||||
Needed to type this out from the QMK website. |
||||
If I want to flash a new bootloader for a machine; here are steps; |
||||
|
||||
1. Flash the util/pro_micro_ISP_B6_10.hex to a spare promicro using; |
||||
`avrdude -p atmega32u4 -P "$(ls /dev/ttyACM*)" -c avr109 -D -U flash:w:pro_micro_ISP_B6_10.hex` |
||||
2. Wire the pins; (first is the ISP pro micro; second is the target) |
||||
``` |
||||
Pro Micro 10 (B6) <-> Keyboard RESET |
||||
Pro Micro 15 (B1) <-> Keyboard B1 (SCLK) |
||||
Pro Micro 16 (B2) <-> Keyboard B2 (MOSI) |
||||
Pro Micro 14 (B3) <-> Keyboard B3 (MISO) |
||||
Pro Micro VCC <-> Keyboard VCC |
||||
Pro Micro GND <-> Keyboard GND |
||||
``` |
||||
I do have this on hand I believe; from massdrop's planck light firmware updater. |
||||
3. Connect the flashed pro micro to my computer and run |
||||
`avrdude -c avrisp -P "$(ls /dev/ttyACM*)" -p atmega32u4 -U flash:w:bootloader_atmega32u4_1.0.0.hex:i -U lfuse:w:0x5E:m -U hfuse:w:0xD9:m -U efuse:w:0xC3:m` |
||||
|
||||
The avrisp here refers to the firmware on the ISP flasher pro micro. |
||||
The `atmega32u4` refers to the CPU used in the respective breakout boards. |
||||
The `avrdude` command interacts with catalina bootloader. |
||||
The shell call after the `-P` flag auto finds the port that the pro micro connects to. |
||||
The last few arguments are some jumpers apparently. |
||||
|
||||
# Features |
||||
|
||||
My userspace has a lot of shared code between different keyboards. |
||||
These files are prefixed with `sbp-` to remove any naming clash. |
||||
|
||||
* [bb-audio](bb-audio.c): Code dealing with audio playback using onboard sound. |
||||
* [bb-encoder](bb-encoder.c): Rotary encoder sutff. |
||||
* [bb-macro](bb-macro.c): My custom keycodes; macros, tap dances, etc. |
||||
* [bb-oled](bb-oled.c): Controls OLED displays. For higher memory; there is also [bb-oled-extra](bb-oled-extra.c). |
||||
* [bb-rgb](bb-rgb.c): Controls per-key RGB LED matrix stuff, and layer indication. Uses `RGB_MATRIX`. |
||||
* [bb-underglaw](bb-underglow.c): Controls RGB LED strip, and layer indication. Uses `RGBLIGHT`. |
||||
|
||||
# Layout |
||||
|
||||
My personal layout is mostly inspired by the |
||||
[Miryoku layout](../manna-harbour_miryoku/miryoku.org). |
||||
There are some changes to make it friendlier to international keyboards. |
||||
My board is compatible with software implementation of Dvorak and Turkish F. |
||||
|
||||
## Base |
||||
|
||||
Base layer uses tap-hold functionality to have access to modifiers. |
||||
The modifiers are mirrored on each half of the layout; |
||||
as to make those modifiers accessible to the keys that overlap them. |
||||
Besides the Alt key; each side has the proper L/R version of the modifier. |
||||
Since Right Alt key functions as AltGr key; |
||||
both the L and R versions are available on each side. |
Loading…
Reference in new issue