[Keymap] Updates to drashna Keymaps and Userspace (#17543)

This commit is contained in:
Drashna Jaelre 2022-07-02 19:55:46 -07:00 committed by GitHub
parent a3119385a4
commit 1c43410e26
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 759 additions and 522 deletions

View file

@ -18,10 +18,10 @@
#undef MATRIX_COL_PINS #undef MATRIX_COL_PINS
#define MATRIX_COL_PINS \ #define MATRIX_COL_PINS \
{ B0, B1, B10, B3, B4, B5 } { B0, B1, B12, B3, B4, B5 }
#undef MATRIX_COL_PINS_RIGHT #undef MATRIX_COL_PINS_RIGHT
#define MATRIX_COL_PINS_RIGHT \ #define MATRIX_COL_PINS_RIGHT \
{ B0, B1, B10, B3, B4, B5 } { B0, B1, B12, B3, B4, B5 }
#undef MATRIX_ROW_PINS #undef MATRIX_ROW_PINS
#define MATRIX_ROW_PINS \ #define MATRIX_ROW_PINS \
@ -30,8 +30,12 @@
#define MATRIX_ROW_PINS_RIGHT \ #define MATRIX_ROW_PINS_RIGHT \
{ B15, A2, B8, A8, B9 } { B15, A2, B8, A8, B9 }
#define UNUSED_PINS { B6, C14, C15 }
#define DIODE_DIRECTION ROW2COL #define DIODE_DIRECTION ROW2COL
#define SPLIT_HAND_PIN A3 #define SPLIT_HAND_PIN A3
#undef MASTER_RIGHT
// #define USB_VBUS_PIN B10
#undef RGB_DI_PIN #undef RGB_DI_PIN
#define RGB_DI_PIN A1 #define RGB_DI_PIN A1
@ -46,6 +50,13 @@
#define DEBUG_LED_PIN C13 #define DEBUG_LED_PIN C13
#define AUDIO_PIN B7
#define AUDIO_PWM_DRIVER PWMD4
#define AUDIO_PWM_CHANNEL 2
#define AUDIO_PWM_PAL_MODE 2
#define AUDIO_STATE_TIMER GPTD3
#define AUDIO_INIT_DELAY
#undef SOFT_SERIAL_PIN #undef SOFT_SERIAL_PIN
// #define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode. // #define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
#define SERIAL_USART_TX_PIN A9 #define SERIAL_USART_TX_PIN A9
@ -77,9 +88,12 @@
#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR 64 #define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR 64
#undef PMW3360_CS_PIN #undef PMW3360_CS_PIN
#define PMW3360_CS_PIN B14 #define PMW3360_CS_PIN A15 // b14
#define PMW3360_CS_MODE 3 #define PMW3360_CS_MODE 3
#define PMW3360_CS_DIVISOR 64 #define PMW3360_CS_DIVISOR 64
#define PMW3360_LIFTOFF_DISTANCE 0b1111
#undef ROTATIONAL_TRANSFORM_ANGLE
#define ROTATIONAL_TRANSFORM_ANGLE -65
#define CHARYBDIS_MINIMUM_DEFAULT_DPI 1200 #define CHARYBDIS_MINIMUM_DEFAULT_DPI 1200
#define CHARYBDIS_DEFAULT_DPI_CONFIG_STEP 400 #define CHARYBDIS_DEFAULT_DPI_CONFIG_STEP 400
@ -90,3 +104,5 @@
#undef RGB_MATRIX_MAXIMUM_BRIGHTNESS #undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150 #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150
#define CHARYBDIS_CONFIG_SYNC

View file

@ -16,11 +16,12 @@
#pragma once #pragma once
#define HAL_USE_PWM TRUE #define HAL_USE_PWM TRUE
#define HAL_USE_PAL TRUE
#define HAL_USE_GPT TRUE
#define HAL_USE_SERIAL TRUE #define HAL_USE_SERIAL TRUE
// #define HAL_USE_I2C TRUE // #define HAL_USE_I2C TRUE
#define HAL_USE_SPI TRUE #define HAL_USE_SPI TRUE
#define SPI_USE_WAIT TRUE #define SPI_USE_WAIT TRUE
#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
// #define HAL_USE_GPT TRUE
#include_next <halconf.h> #include_next <halconf.h>

View file

@ -26,8 +26,8 @@
KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, UC_CLUE, \ KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, UC_CLUE, \
SH_TT, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, SH_TT, \ SH_TT, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, SH_TT, \
LALT_T(KC_TAB), K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, RALT_T(K1B), \ LALT_T(KC_TAB), K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, RALT_T(K1B), \
OS_LSFT, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, RCTL_T(K2A), OS_RSFT, \ OS_LSFT,CTL_T(K21),ALT_T(K22),GUI_T(K23),K24,K25, K26,K27,RGUI_T(K28),RALT_T(K29),RCTL_T(K2A), OS_RSFT, \
KC_GRV, OS_LALT, OS_LGUI, TT(_MOUSE), KC_ENT, \ SFT_T(KC_GRV), UC_IRNY, OS_LGUI, TT(_MOUSE), KC_ENT, \
KC_SPC, BK_LWER, DL_RAIS \ KC_SPC, BK_LWER, DL_RAIS \
) )
@ -58,38 +58,36 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_________________DVORAK_L3_________________, _________________DVORAK_R3_________________ _________________DVORAK_L3_________________, _________________DVORAK_R3_________________
), ),
[_MOUSE] = LAYOUT_charybdis_4x6(
_______, _______, _______, _______, _______, _______, DRGSCRL, DPI_RMOD,DPI_MOD, S_D_RMOD,S_D_MOD, SNP_TOG,
_______, _______, _______, _______, _______, _______, KC_WH_U, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, KC_WH_D, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN6, SNIPING,
_______, _______, _______, _______, _______, _______, KC_BTN7, KC_BTN4, KC_BTN5, KC_BTN8, _______, _______,
_______, _______, _______, _______, _______,
_______, _______, _______
),
[_GAMEPAD] = LAYOUT_charybdis_4x6( [_GAMEPAD] = LAYOUT_charybdis_4x6(
KC_ESC, KC_NO, KC_1, KC_2, KC_3, KC_4, _______, _______, _______, _______, _______, _______, KC_ESC, KC_NO, KC_1, KC_2, KC_3, KC_4, _______, _______, _______, _______, _______, _______,
KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, _______, _______, _______, _______, _______, _______, KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, _______, _______, _______, _______, _______, _______,
KC_TAB, KC_G, KC_A, KC_S, KC_D, KC_F, _______, _______, _______, _______, _______, _______, KC_TAB, KC_G, KC_A, KC_S, KC_D, KC_F, _______, _______, _______, _______, _______, _______,
KC_LCTL, KC_LSFT, KC_Z, KC_X, KC_C, KC_H, _______, _______, _______, _______, _______, _______, KC_LCTL, KC_LSFT, KC_Z, KC_X, KC_C, KC_H, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, KC_V, _______, _______, _______, TG_GAME,
_______, _______, _______ KC_SPC, KC_H, _______
), ),
[_DIABLO] = LAYOUT_charybdis_4x6( [_DIABLO] = LAYOUT_charybdis_4x6(
KC_ESC, KC_V, KC_D, KC_LALT, KC_NO, KC_NO, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, KC_ESC, KC_V, KC_D, KC_LALT, KC_NO, KC_NO, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO,
KC_TAB, KC_S, KC_I, KC_F, KC_M, KC_T, _______, _______, _______, _______, _______, _______, KC_TAB, KC_S, KC_I, KC_F, KC_M, KC_T, _______, _______, _______, _______, _______, _______,
KC_Q, KC_1, KC_2, KC_3, KC_4, KC_G, _______, _______, _______, _______, _______, _______, KC_Q, KC_1, KC_2, KC_3, KC_4, KC_G, _______, _______, _______, _______, _______, _______,
KC_LCTL, KC_D3_1, KC_D3_2, KC_D3_3, KC_D3_4, KC_Z, _______, _______, _______, _______, _______, _______, KC_LCTL, KC_D3_1, KC_D3_2, KC_D3_3, KC_D3_4, KC_Z, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, KC_G, _______, _______, TO(_DIABLOII), TG_DBLO,
_______, _______, _______ KC_LSFT, KC_LCTL, _______
), ),
[_DIABLOII] = LAYOUT_charybdis_4x6( [_DIABLOII] = LAYOUT_charybdis_4x6(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_GRV, _______, _______, _______, _______, _______, _______, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_GRV, _______, _______, _______, _______, _______, _______,
KC_TAB, KC_A, KC_T, KC_Q, KC_I, KC_M, _______, _______, _______, _______, _______, _______, KC_TAB, KC_A, KC_T, KC_Q, KC_I, KC_M, _______, _______, _______, _______, _______, _______,
KC_S, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, _______, _______, _______, KC_S, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, _______, _______, _______,
KC_LCTL, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, _______, _______, _______, _______, _______, KC_LCTL, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, KC_DIABLO_CLEAR, _______, _______, _______, TG(_DIABLOII),
SFT_T(KC_SPACE), ALT_T(KC_Q), _______
),
[_MOUSE] = LAYOUT_charybdis_4x6(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, KC_WH_U, DPI_RMOD,DPI_MOD, S_D_RMOD,S_D_MOD, _______,
_______, _______, _______, _______, _______, _______, KC_WH_D, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN6, SNIPING,
_______, _______, _______, _______, _______, _______, KC_BTN7, KC_BTN4, KC_BTN5, KC_BTN8, DRGSCRL, _______,
_______, SNIPING, SNIPING, _______, _______,
_______, _______, _______ _______, _______, _______
), ),
@ -112,18 +110,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
), ),
[_ADJUST] = LAYOUT_charybdis_4x6_wrapper( [_ADJUST] = LAYOUT_charybdis_4x6_wrapper(
QK_MAKE, KC_WIDE,KC_AUSSIE,KC_SCRIPT,KC_ZALGO,KC_NOMODE, KC_NOMODE,KC_BLOCKS,KC_REGIONAL,_______,_______, QK_BOOT, QK_MAKE, KC_WIDE,KC_AUSSIE,KC_SCRIPT,KC_ZALGO,KC_SUPER, KC_NOMODE,KC_BLOCKS,KC_REGIONAL,TG_GAME,TG_DBLO, QK_BOOT,
VRSN, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, EE_CLR, VRSN, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, EE_CLR,
KEYLOCK, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, TG_MODS, KEYLOCK, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, TG_MODS,
UC_MOD, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY, UC_MOD, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY,
QK_RBT, AUTO_CTN, _______, KC_NUKE, _______, QK_RBT, AUTO_CTN, _______, _______, KC_NUKE,
_______, _______, _______ _______, _______, _______
) )
}; };
// clang-format on // clang-format on
void matrix_init_keyemap(void) { setPinInputHigh(A0); } void matrix_init_keymap(void) {
setPinInputHigh(A0);
#ifdef RGB_MATRIX_ENABLE
g_led_config.flags[53] = g_led_config.flags[54] = g_led_config.flags[55] =
g_led_config.flags[0] = g_led_config.flags[1] = g_led_config.flags[2] = g_led_config.flags[3] =
g_led_config.flags[29] = g_led_config.flags[30] = g_led_config.flags[31] = g_led_config.flags[32] =
LED_FLAG_MODIFIER;
#endif
}
void matrix_scan_keymap(void) { void matrix_scan_keymap(void) {
if (!readPin(A0)) { if (!readPin(A0)) {
@ -144,3 +150,25 @@ void matrix_output_unselect_delay(uint8_t line, bool key_pressed) {
__asm__ volatile("nop" ::: "memory"); __asm__ volatile("nop" ::: "memory");
} }
} }
#ifdef SWAP_HANDS_ENABLE
const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
/* Left hand, matrix positions */
{{0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}},
{{0, 6}, {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}},
{{0, 7}, {1, 7}, {2, 7}, {3, 7}, {4, 7}, {5, 7}},
{{0, 8}, {1, 8}, {2, 8}, {3, 8}, {4, 8}, {5, 8}},
{{2, 9}, {4, 9}, {5, 9}, {1, 9}, {0, 9}, {3, 9}},
/* Right hand, matrix positions */
{{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}},
{{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}},
{{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}},
{{0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}},
{{0, 4}, {3, 4}, {2, 4}, {5, 4}, {4, 4}, {2, 4}},
};
# ifdef ENCODER_MAP_ENABLE
const uint8_t PROGMEM encoder_hand_swap_config[NUM_ENCODERS] = {1, 0};
# endif
#endif

View file

@ -17,19 +17,18 @@
#pragma once #pragma once
#include_next "mcuconf.h" #include_next "mcuconf.h"
#undef STM32_I2C_USE_I2C1
#define STM32_I2C_USE_I2C1 TRUE
// #undef STM32_I2C_I2C1_RX_DMA_STREAM #undef STM32_PWM_USE_ADVANCED
// #define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) #define STM32_PWM_USE_ADVANCED TRUE
#undef STM32_I2C_I2C1_TX_DMA_STREAM
#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) #undef STM32_PWM_USE_TIM1
#define STM32_PWM_USE_TIM1 TRUE
#undef STM32_PWM_USE_TIM2 #undef STM32_PWM_USE_TIM2
#define STM32_PWM_USE_TIM2 TRUE #define STM32_PWM_USE_TIM2 TRUE
#undef STM32_PWM_USE_TIM3 #undef STM32_PWM_USE_TIM4
#define STM32_PWM_USE_TIM3 TRUE #define STM32_PWM_USE_TIM4 TRUE
#undef STM32_SPI_USE_SPI1 #undef STM32_SPI_USE_SPI1
#define STM32_SPI_USE_SPI1 TRUE #define STM32_SPI_USE_SPI1 TRUE
@ -37,8 +36,8 @@
#undef STM32_SERIAL_USE_USART1 #undef STM32_SERIAL_USE_USART1
#define STM32_SERIAL_USE_USART1 TRUE #define STM32_SERIAL_USE_USART1 TRUE
#undef STM32_GPT_USE_TIM4 #undef STM32_GPT_USE_TIM3
#define STM32_GPT_USE_TIM4 TRUE #define STM32_GPT_USE_TIM3 TRUE
#undef STM32_ST_USE_TIMER #undef STM32_ST_USE_TIMER
#define STM32_ST_USE_TIMER 5 #define STM32_ST_USE_TIMER 5

View file

@ -1,24 +1,33 @@
# MCU name # MCU name
MCU = STM32F411 MCU = STM32F411
BOARD = BLACKPILL_STM32_F411
# Bootloader selection # Bootloader selection
BOOTLOADER = stm32-dfu BOOTLOADER := tinyuf2
# BOOTLOADER := tinyuf2
LTO_ENABLE := no BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # Enable N-Key Rollover
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = yes # Audio output
AUDIO_SUPPORTED = yes # is set to no in kb, needs to be forcibly enabled
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite KEYBOARD_SHARED_EP = yes
KEYBOARD_SHARED_EP = yes MOUSE_SHARED_EP = yes
MOUSE_SHARED_EP = yes
EEPROM_DRIVER = spi EEPROM_DRIVER = spi
WS2812_DRIVER = pwm WS2812_DRIVER = pwm
SERIAL_DRIVER = usart SERIAL_DRIVER = usart
AUDIO_DRIVER = pwm_hardware
MOUSEKEY_ENABLE = yes BACKLIGHT_DRIVER = pwm
NKRO_ENABLE = yes
CONSOLE_ENABLE = yes
AUTOCORRECTION_ENABLE = yes AUTOCORRECTION_ENABLE = yes
CAPS_WORD_ENABLE = yes
DEBOUNCE_TYPE = asym_eager_defer_pk SWAP_HANDS_ENABLE = yes
TAP_DANCE_ENABLE = yes
DEBOUNCE_TYPE = asym_eager_defer_pk
WPM_ENABLE = yes
LTO_ENABLE = no

View file

@ -28,8 +28,3 @@
#define CHARYBDIS_SNIPING_DPI_CONFIG_STEP 200 #define CHARYBDIS_SNIPING_DPI_CONFIG_STEP 200
#define ENCODER_DEFAULT_POS 0x3 #define ENCODER_DEFAULT_POS 0x3
#define SECURE_UNLOCK_SEQUENCE \
{ \
{ 2, 1 }, { 2, 2 }, { 2, 3 }, { 2, 4 } \
}

View file

@ -59,16 +59,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_________________DVORAK_L3_________________, _________________DVORAK_R3_________________ _________________DVORAK_L3_________________, _________________DVORAK_R3_________________
), ),
[_MOUSE] = LAYOUT_5x6_right(
_______, _______, _______, _______, _______, _______, DRGSCRL, DPI_RMOD,DPI_MOD, S_D_RMOD,S_D_MOD, SNP_TOG,
_______, _______, _______, _______, _______, _______, KC_WH_U, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, KC_WH_D, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN6, SNIPING,
_______, _______, _______, _______, _______, _______, KC_BTN7, KC_BTN4, KC_BTN5, KC_BTN8, _______, _______,
_______, _______, _______, _______,
_______, _______, KC_BTN3,
_______, _______, _______,
_______, _______, _______, _______
),
[_GAMEPAD] = LAYOUT_5x6_right( [_GAMEPAD] = LAYOUT_5x6_right(
KC_ESC, KC_NO, KC_1, KC_2, KC_3, KC_4, _______, _______, _______, _______, _______, _______, KC_ESC, KC_NO, KC_1, KC_2, KC_3, KC_4, _______, _______, _______, _______, _______, _______,
KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, _______, _______, _______, _______, _______, _______, KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, _______, _______, _______, _______, _______, _______,
@ -99,6 +89,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_LSFT, _______, _______, KC_LSFT, _______, _______,
KC_LCTL, KC_V, _______, _______ KC_LCTL, KC_V, _______, _______
), ),
[_MOUSE] = LAYOUT_5x6_right(
_______, _______, _______, _______, _______, _______, DRGSCRL, DPI_RMOD,DPI_MOD, S_D_RMOD,S_D_MOD, SNP_TOG,
_______, _______, _______, _______, _______, _______, KC_WH_U, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, KC_WH_D, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN6, SNIPING,
_______, _______, _______, _______, _______, _______, KC_BTN7, KC_BTN4, KC_BTN5, KC_BTN8, _______, _______,
_______, _______, _______, _______,
_______, _______, KC_BTN3,
_______, _______, _______,
_______, _______, _______, _______
),
[_LOWER] = LAYOUT_5x6_right_wrapper( [_LOWER] = LAYOUT_5x6_right_wrapper(
KC_F12, _________________FUNC_LEFT_________________, _________________FUNC_RIGHT________________, KC_F11, KC_F12, _________________FUNC_LEFT_________________, _________________FUNC_RIGHT________________, KC_F11,
_______, _________________LOWER_L1__________________, _________________LOWER_R1__________________, _______, _______, _________________LOWER_L1__________________, _________________LOWER_R1__________________, _______,

View file

@ -55,11 +55,11 @@ void shutdown_user(void) {
rgblight_enable_noeeprom(); rgblight_enable_noeeprom();
rgblight_mode_noeeprom(1); rgblight_mode_noeeprom(1);
rgblight_setrgb_red(); rgblight_setrgb_red();
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
rgb_matrix_set_color_all(0xFF, 0x00, 0x00); rgb_matrix_set_color_all(0xFF, 0x00, 0x00);
rgb_matrix_update_pwm_buffers(); rgb_matrix_update_pwm_buffers();
#endif // RGB_MATRIX_ENABLE #endif // RGB_MATRIX_ENABLE
#ifdef OLED_ENABLE #ifdef OLED_ENABLE
oled_off(); oled_off();
#endif #endif
@ -88,7 +88,7 @@ void suspend_power_down_user(void) {
__attribute__((weak)) void suspend_wakeup_init_keymap(void) {} __attribute__((weak)) void suspend_wakeup_init_keymap(void) {}
void suspend_wakeup_init_user(void) { void suspend_wakeup_init_user(void) {
#ifdef OLED_ENABLE #ifdef OLED_ENABLE
oled_timer_reset(); oled_timer_reset();
#endif #endif
suspend_wakeup_init_keymap(); suspend_wakeup_init_keymap();
} }
@ -104,9 +104,9 @@ void matrix_scan_user(void) {
startup_user(); startup_user();
} }
#ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code. #ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
run_diablo_macro_check(); run_diablo_macro_check();
#endif // TAP_DANCE_ENABLE #endif // TAP_DANCE_ENABLE
#ifdef CAPS_WORD_ENABLE #ifdef CAPS_WORD_ENABLE
caps_word_task(); caps_word_task();
#endif #endif
@ -124,8 +124,10 @@ float doom_song[][2] = SONG(E1M1_DOOM);
// on layer change, no matter where the change was initiated // on layer change, no matter where the change was initiated
// Then runs keymap's layer change check // Then runs keymap's layer change check
__attribute__((weak)) layer_state_t layer_state_set_keymap(layer_state_t state) { return state; } __attribute__((weak)) layer_state_t layer_state_set_keymap(layer_state_t state) {
layer_state_t layer_state_set_user(layer_state_t state) { return state;
}
layer_state_t layer_state_set_user(layer_state_t state) {
if (!is_keyboard_master()) { if (!is_keyboard_master()) {
return state; return state;
} }
@ -136,7 +138,7 @@ layer_state_t layer_state_set_user(layer_state_t state) {
#endif #endif
#if defined(CUSTOM_RGBLIGHT) #if defined(CUSTOM_RGBLIGHT)
state = layer_state_set_rgb_light(state); state = layer_state_set_rgb_light(state);
#endif // CUSTOM_RGBLIGHT #endif // CUSTOM_RGBLIGHT
#if defined(AUDIO_ENABLE) && !defined(__arm__) #if defined(AUDIO_ENABLE) && !defined(__arm__)
static bool is_gamepad_on = false; static bool is_gamepad_on = false;
if (layer_state_cmp(state, _GAMEPAD) != is_gamepad_on) { if (layer_state_cmp(state, _GAMEPAD) != is_gamepad_on) {
@ -153,28 +155,31 @@ layer_state_t layer_state_set_user(layer_state_t state) {
} }
// Runs state check and changes underglow color and animation // Runs state check and changes underglow color and animation
__attribute__((weak)) layer_state_t default_layer_state_set_keymap(layer_state_t state) { return state; } __attribute__((weak)) layer_state_t default_layer_state_set_keymap(layer_state_t state) {
layer_state_t default_layer_state_set_user(layer_state_t state) { return state;
}
layer_state_t default_layer_state_set_user(layer_state_t state) {
if (!is_keyboard_master()) { if (!is_keyboard_master()) {
return state; return state;
} }
state = default_layer_state_set_keymap(state); state = default_layer_state_set_keymap(state);
#if 0 #if defined(CUSTOM_RGBLIGHT)
# if defined(CUSTOM_RGBLIGHT) || defined(RGB_MATRIX_ENABLE) state = default_layer_state_set_rgb_light(state);
state = default_layer_state_set_rgb(state);
# endif
#endif #endif
return state; return state;
} }
__attribute__((weak)) void led_set_keymap(uint8_t usb_led) {} __attribute__((weak)) void led_set_keymap(uint8_t usb_led) {}
void led_set_user(uint8_t usb_led) { led_set_keymap(usb_led); } void led_set_user(uint8_t usb_led) {
led_set_keymap(usb_led);
}
__attribute__((weak)) void eeconfig_init_keymap(void) {} __attribute__((weak)) void eeconfig_init_keymap(void) {}
void eeconfig_init_user(void) { void eeconfig_init_user(void) {
userspace_config.raw = 0; userspace_config.raw = 0;
userspace_config.rgb_layer_change = true; userspace_config.rgb_layer_change = true;
userspace_config.autocorrection = true;
eeconfig_update_user(userspace_config.raw); eeconfig_update_user(userspace_config.raw);
eeconfig_init_keymap(); eeconfig_init_keymap();
} }
@ -187,8 +192,8 @@ void matrix_slave_scan_user(void) {
music_task(); music_task();
# endif # endif
# ifdef AUDIO_INIT_DELAY # ifdef AUDIO_INIT_DELAY
if (!is_keyboard_master()) { if (!is_keyboard_master()) {
static bool delayed_tasks_run = false; static bool delayed_tasks_run = false;
static uint16_t delayed_task_timer = 0; static uint16_t delayed_task_timer = 0;
if (!delayed_tasks_run) { if (!delayed_tasks_run) {
if (!delayed_task_timer) { if (!delayed_task_timer) {
@ -214,3 +219,11 @@ void matrix_slave_scan_user(void) {
matrix_slave_scan_keymap(); matrix_slave_scan_keymap();
} }
#endif #endif
__attribute__((weak)) void housekeeping_task_keymap(void) {}
void housekeeping_task_user(void) {
#if defined(SPLIT_KEYBOARD) && defined(SPLIT_TRANSACTION_IDS_USER)
housekeeping_task_transport_sync();
#endif
housekeeping_task_keymap();
}

View file

@ -16,6 +16,7 @@ layer_state_t layer_state_set_keymap(layer_state_t state);
layer_state_t default_layer_state_set_keymap(layer_state_t state); layer_state_t default_layer_state_set_keymap(layer_state_t state);
void led_set_keymap(uint8_t usb_led); void led_set_keymap(uint8_t usb_led);
void eeconfig_init_keymap(void); void eeconfig_init_keymap(void);
void housekeeping_task_keymap(void);
#ifdef CUSTOM_UNICODE_ENABLE #ifdef CUSTOM_UNICODE_ENABLE
void matrix_init_unicode(void); void matrix_init_unicode(void);

View file

@ -4,10 +4,10 @@
#pragma once #pragma once
// Use custom magic number so that when switching branches, EEPROM always gets reset // Use custom magic number so that when switching branches, EEPROM always gets reset
#define EECONFIG_MAGIC_NUMBER (uint16_t)0x1339 #define EECONFIG_MAGIC_NUMBER (uint16_t)0x1339
#ifdef IS_COMMAND #ifdef IS_COMMAND
#undef IS_COMMAND # undef IS_COMMAND
#endif #endif
#define IS_COMMAND() (((get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) == MOD_MASK_SHIFT) #define IS_COMMAND() (((get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) == MOD_MASK_SHIFT)
@ -37,8 +37,8 @@
// # define WPM_LAUNCH_CONTROL // # define WPM_LAUNCH_CONTROL
// # define WPM_ALLOW_COUNT_REGRESSOIN // # define WPM_ALLOW_COUNT_REGRESSOIN
// # define WPM_UNFILTERED // # define WPM_UNFILTERED
# define WPM_SAMPLE_SECONDS 10 # define WPM_SAMPLE_SECONDS 10
# define WPM_SAMPLE_PERIODS 50 # define WPM_SAMPLE_PERIODS 50
# define WPM_ESTIMATED_WORD_SIZE 5 # define WPM_ESTIMATED_WORD_SIZE 5
#endif #endif
@ -51,34 +51,34 @@
# define GOODBYE_SONG SONG(SONIC_RING) # define GOODBYE_SONG SONG(SONIC_RING)
# define DEFAULT_LAYER_SONGS \ # define DEFAULT_LAYER_SONGS \
{ SONG(QWERTY_SOUND), SONG(COLEMAK_SOUND), SONG(DVORAK_SOUND), SONG(OVERWATCH_THEME) } { SONG(QWERTY_SOUND), SONG(COLEMAK_SOUND), SONG(DVORAK_SOUND), SONG(OVERWATCH_THEME) }
# define UNICODE_SONG_MAC SONG(MARIO_THEME) # define UNICODE_SONG_MAC SONG(MARIO_THEME)
# define UNICODE_SONG_LNX SONG(MARIO_POWERUP) # define UNICODE_SONG_LNX SONG(MARIO_POWERUP)
# define UNICODE_SONG_WIN SONG(MARIO_ONEUP) # define UNICODE_SONG_WIN SONG(MARIO_ONEUP)
# define UNICODE_SONG_BSD SONG(RICK_ROLL) # define UNICODE_SONG_BSD SONG(RICK_ROLL)
# define UNICODE_SONG_WINC SONG(RICK_ROLL) # define UNICODE_SONG_WINC SONG(RICK_ROLL)
# else # else
# define STARTUP_SONG SONG(STARTUP_SOUND) # define STARTUP_SONG SONG(STARTUP_SOUND)
# define GOODBYE_SONG SONG(GOODBYE_SOUND) # define GOODBYE_SONG SONG(GOODBYE_SOUND)
# define DEFAULT_LAYER_SONGS \ # define DEFAULT_LAYER_SONGS \
{ SONG(QWERTY_SOUND), SONG(COLEMAK_SOUND), SONG(DVORAK_SOUND), SONG(WORKMAN_SOUND) } { SONG(QWERTY_SOUND), SONG(COLEMAK_SOUND), SONG(DVORAK_SOUND), SONG(WORKMAN_SOUND) }
# define UNICODE_SONG_MAC SONG(QWERTY_SOUND) # define UNICODE_SONG_MAC SONG(QWERTY_SOUND)
# define UNICODE_SONG_LNX SONG(COLEMAK_SOUND) # define UNICODE_SONG_LNX SONG(COLEMAK_SOUND)
# define UNICODE_SONG_WIN SONG(DVORAK_SOUND) # define UNICODE_SONG_WIN SONG(DVORAK_SOUND)
# define UNICODE_SONG_BSD SONG(WORKMAN_SOUND) # define UNICODE_SONG_BSD SONG(WORKMAN_SOUND)
# define UNICODE_SONG_WINC SONG(PLOVER_GOODBYE_SOUND) # define UNICODE_SONG_WINC SONG(PLOVER_GOODBYE_SOUND)
# endif # endif
#endif // !AUDIO_ENABLE #endif // !AUDIO_ENABLE
#define UNICODE_SELECTED_MODES UC_WINC, UC_MAC #define UNICODE_SELECTED_MODES UC_WINC, UC_MAC
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
# define RGBLIGHT_SLEEP # define RGBLIGHT_SLEEP
# define RGBLIGHT_EFFECT_TWINKLE_LIFE 250 # define RGBLIGHT_EFFECT_TWINKLE_LIFE 250
# define RGBLIGHT_EFFECT_TWINKLE_PROBABILITY 1 / 24 # define RGBLIGHT_EFFECT_TWINKLE_PROBABILITY 1 / 24
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
# define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot) # define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot)
// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened) // # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened)
# define RGB_MATRIX_FRAMEBUFFER_EFFECTS # define RGB_MATRIX_FRAMEBUFFER_EFFECTS
// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects // # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
@ -179,20 +179,26 @@
# define ENABLE_RGB_MATRIX_MULTISPLASH # define ENABLE_RGB_MATRIX_MULTISPLASH
# define ENABLE_RGB_MATRIX_SOLID_SPLASH # define ENABLE_RGB_MATRIX_SOLID_SPLASH
# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH # define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
# endif // AVR # endif // AVR
#endif // RGB_MATRIX_ENABLE #endif // RGB_MATRIX_ENABLE
#ifdef OLED_ENABLE #ifdef OLED_ENABLE
# ifdef SPLIT_KEYBOARD # ifndef OLED_UPDATE_INTERVAL
# define OLED_UPDATE_INTERVAL 60 # ifdef OLED_DRIVER_SH1107
# else # define OLED_UPDATE_INTERVAL 75
# define OLED_UPDATE_INTERVAL 15 # else
# ifdef SPLIT_KEYBOARD
# define OLED_UPDATE_INTERVAL 60
# else
# define OLED_UPDATE_INTERVAL 15
# endif
# endif
# endif # endif
# define OLED_DISABLE_TIMEOUT # define OLED_DISABLE_TIMEOUT
# ifdef OLED_FONT_H # ifdef OLED_FONT_H
# undef OLED_FONT_H # undef OLED_FONT_H
# endif # endif
# define OLED_FONT_H "oled/drashna_font.h" # define OLED_FONT_H "oled/drashna_font.h"
# define OLED_FONT_END 255 # define OLED_FONT_END 255
// # define OLED_FONT_5X5 // # define OLED_FONT_5X5
// # define OLED_FONT_AZTECH // # define OLED_FONT_AZTECH
@ -223,14 +229,13 @@
// #define WPM_SAMPLE_PERIODS 50 // #define WPM_SAMPLE_PERIODS 50
// #define WPM_LAUNCH_CONTROL // #define WPM_LAUNCH_CONTROL
#ifndef ONESHOT_TAP_TOGGLE #ifndef ONESHOT_TAP_TOGGLE
# define ONESHOT_TAP_TOGGLE 2 # define ONESHOT_TAP_TOGGLE 2
#endif // !ONESHOT_TAP_TOGGLE #endif // !ONESHOT_TAP_TOGGLE
#ifndef ONESHOT_TIMEOUT #ifndef ONESHOT_TIMEOUT
# define ONESHOT_TIMEOUT 3000 # define ONESHOT_TIMEOUT 3000
#endif // !ONESHOT_TIMEOUT #endif // !ONESHOT_TIMEOUT
#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY #define IGNORE_MOD_TAP_INTERRUPT_PER_KEY
#define PERMISSIVE_HOLD_PER_KEY #define PERMISSIVE_HOLD_PER_KEY
@ -238,7 +243,6 @@
#define RETRO_TAPPING_PER_KEY #define RETRO_TAPPING_PER_KEY
#define TAPPING_TERM_PER_KEY #define TAPPING_TERM_PER_KEY
#ifndef TAPPING_TOGGLE #ifndef TAPPING_TOGGLE
# define TAPPING_TOGGLE 1 # define TAPPING_TOGGLE 1
#endif #endif
@ -255,12 +259,12 @@
#ifdef CONVERT_TO_PROTON_C #ifdef CONVERT_TO_PROTON_C
// pins that are available but not present on Pro Micro // pins that are available but not present on Pro Micro
# define A3 PAL_LINE(GPIOA, 3) # define A3 PAL_LINE(GPIOA, 3)
# define A4 PAL_LINE(GPIOA, 4) # define A4 PAL_LINE(GPIOA, 4)
# define A5 PAL_LINE(GPIOA, 5) # define A5 PAL_LINE(GPIOA, 5)
# define A6 PAL_LINE(GPIOA, 6) # define A6 PAL_LINE(GPIOA, 6)
# define A7 PAL_LINE(GPIOA, 7) # define A7 PAL_LINE(GPIOA, 7)
# define A8 PAL_LINE(GPIOA, 8) # define A8 PAL_LINE(GPIOA, 8)
# define A13 PAL_LINE(GPIOA, 13) # define A13 PAL_LINE(GPIOA, 13)
# define A14 PAL_LINE(GPIOA, 14) # define A14 PAL_LINE(GPIOA, 14)
# define A15 PAL_LINE(GPIOA, 15) # define A15 PAL_LINE(GPIOA, 15)
@ -291,12 +295,22 @@
# ifndef OLED_BRIGHTNESS # ifndef OLED_BRIGHTNESS
# define OLED_BRIGHTNESS 50 # define OLED_BRIGHTNESS 50
# endif # endif
# if !defined(STM32F4XX) #endif
# undef OLED_UPDATE_INTERVAL
# define OLED_UPDATE_INTERVAL 75 #ifdef USE_I2CV1
# endif # define I2C1_CLOCK_SPEED 400000
# define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_2
#endif #endif
#define ENABLE_COMPILE_KEYCODE #define ENABLE_COMPILE_KEYCODE
#define BOTH_SHIFTS_TURNS_ON_CAPS_WORD #define BOTH_SHIFTS_TURNS_ON_CAPS_WORD
#ifndef SECURE_UNLOCK_SEQUENCE
# define SECURE_UNLOCK_SEQUENCE \
{ \
{2, 1}, {2, 2}, {2, 3}, { \
2, 4 \
} \
}
#endif

View file

@ -52,7 +52,7 @@ void autocorrect_enable(void) {
*/ */
void autocorrect_disable(void) { void autocorrect_disable(void) {
userspace_config.autocorrection = false; userspace_config.autocorrection = false;
typo_buffer_size = 0; typo_buffer_size = 0;
eeconfig_update_user(userspace_config.raw); eeconfig_update_user(userspace_config.raw);
} }
@ -62,7 +62,7 @@ void autocorrect_disable(void) {
*/ */
void autocorrect_toggle(void) { void autocorrect_toggle(void) {
userspace_config.autocorrection = !userspace_config.autocorrection; userspace_config.autocorrection = !userspace_config.autocorrection;
typo_buffer_size = 0; typo_buffer_size = 0;
eeconfig_update_user(userspace_config.raw); eeconfig_update_user(userspace_config.raw);
} }
@ -98,15 +98,15 @@ __attribute__((weak)) bool process_autocorrect_user(uint16_t *keycode, keyrecord
} }
*keycode &= 0xFF; // Get the basic keycode. *keycode &= 0xFF; // Get the basic keycode.
return true; return true;
#ifndef NO_ACTION_TAPPING # ifndef NO_ACTION_TAPPING
// Exclude tap-hold keys when they are held down // Exclude tap-hold keys when they are held down
// and mask for base keycode when they are tapped. // and mask for base keycode when they are tapped.
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
# ifdef NO_ACTION_LAYER # ifdef NO_ACTION_LAYER
// Exclude Layer Tap, if layers are disabled // Exclude Layer Tap, if layers are disabled
// but action tapping is still enabled. // but action tapping is still enabled.
return false; return false;
# endif # endif
case QK_MOD_TAP ... QK_MOD_TAP_MAX: case QK_MOD_TAP ... QK_MOD_TAP_MAX:
// Exclude hold keycode // Exclude hold keycode
if (!record->tap.count) { if (!record->tap.count) {
@ -114,25 +114,25 @@ __attribute__((weak)) bool process_autocorrect_user(uint16_t *keycode, keyrecord
} }
*keycode &= 0xFF; *keycode &= 0xFF;
break; break;
#else # else
case QK_MOD_TAP ... QK_MOD_TAP_MAX: case QK_MOD_TAP ... QK_MOD_TAP_MAX:
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
// Exclude if disabled // Exclude if disabled
return false; return false;
#endif # endif
// Exclude swap hands keys when they are held down // Exclude swap hands keys when they are held down
// and mask for base keycode when they are tapped. // and mask for base keycode when they are tapped.
case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX: case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX:
#ifdef SWAP_HANDS_ENABLE # ifdef SWAP_HANDS_ENABLE
if (*keycode >= 0x56F0 || !record->tap.count) { if (*keycode >= 0x56F0 || !record->tap.count) {
return false; return false;
} }
*keycode &= 0xFF; *keycode &= 0xFF;
break; break;
#else # else
// Exclude if disabled // Exclude if disabled
return false; return false;
#endif # endif
} }
// Disable autocorrect while a mod other than shift is active. // Disable autocorrect while a mod other than shift is active.
@ -166,9 +166,9 @@ __attribute__((weak)) bool apply_autocorrect(uint8_t backspaces, const char *str
*/ */
bool process_autocorrection(uint16_t keycode, keyrecord_t *record) { bool process_autocorrection(uint16_t keycode, keyrecord_t *record) {
uint8_t mods = get_mods(); uint8_t mods = get_mods();
#ifndef NO_ACTION_ONESHOT # ifndef NO_ACTION_ONESHOT
mods |= get_oneshot_mods(); mods |= get_oneshot_mods();
#endif # endif
if ((keycode >= AUTOCORRECT_ON && keycode <= AUTOCORRECT_TOGGLE) && record->event.pressed) { if ((keycode >= AUTOCORRECT_ON && keycode <= AUTOCORRECT_TOGGLE) && record->event.pressed) {
if (keycode == AUTOCORRECT_ON) { if (keycode == AUTOCORRECT_ON) {

View file

@ -20,8 +20,12 @@ bool host_driver_disabled = false;
* *
* This handles the keycodes at the keymap level, useful for keyboard specific customization * This handles the keycodes at the keymap level, useful for keyboard specific customization
*/ */
__attribute__((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; } __attribute__((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
__attribute__((weak)) bool process_record_secrets(uint16_t keycode, keyrecord_t *record) { return true; } return true;
}
__attribute__((weak)) bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
return true;
}
/** /**
* @brief Main user keycode handler * @brief Main user keycode handler
@ -46,10 +50,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// If console is enabled, it will print the matrix position and status of each key pressed // If console is enabled, it will print the matrix position and status of each key pressed
#ifdef KEYLOGGER_ENABLE #ifdef KEYLOGGER_ENABLE
uprintf("KL: kc: 0x%04X, col: %2u, row: %2u, pressed: %b, time: %5u, int: %b, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count); uprintf("KL: kc: 0x%04X, col: %2u, row: %2u, pressed: %b, time: %5u, int: %b, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count);
#endif // KEYLOGGER_ENABLE #endif // KEYLOGGER_ENABLE
#if defined(OLED_ENABLE) && defined(CUSTOM_OLED_DRIVER) #if defined(OLED_ENABLE) && defined(CUSTOM_OLED_DRIVER)
process_record_user_oled(keycode, record); process_record_user_oled(keycode, record);
#endif // OLED #endif // OLED
if (!(process_record_keymap(keycode, record) && process_record_secrets(keycode, record) if (!(process_record_keymap(keycode, record) && process_record_secrets(keycode, record)
#ifdef CUSTOM_RGB_MATRIX #ifdef CUSTOM_RGB_MATRIX
@ -90,34 +94,34 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
} }
break; break;
case VRSN: // Prints firmware version case VRSN: // Prints firmware version
if (record->event.pressed) { if (record->event.pressed) {
send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), TAP_CODE_DELAY); send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), TAP_CODE_DELAY);
} }
break; break;
case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them
#ifdef TAP_DANCE_ENABLE #ifdef TAP_DANCE_ENABLE
if (record->event.pressed) { if (record->event.pressed) {
for (uint8_t index = 0; index < 4; index++) { for (uint8_t index = 0; index < 4; index++) {
diablo_timer[index].key_interval = 0; diablo_timer[index].key_interval = 0;
} }
} }
#endif // TAP_DANCE_ENABLE #endif // TAP_DANCE_ENABLE
break; break;
case KC_CCCV: // One key copy/paste case KC_CCCV: // One key copy/paste
if (record->event.pressed) { if (record->event.pressed) {
copy_paste_timer = timer_read(); copy_paste_timer = timer_read();
} else { } else {
if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
tap_code16(LCTL(KC_C)); tap_code16(LCTL(KC_C));
} else { // Tap, paste } else { // Tap, paste
tap_code16(LCTL(KC_V)); tap_code16(LCTL(KC_V));
} }
} }
break; break;
case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal
#if defined(CUSTOM_RGBLIGHT) || defined(CUSTOM_RGB_MATRIX) #if defined(CUSTOM_RGBLIGHT) || defined(CUSTOM_RGB_MATRIX)
if (record->event.pressed) { if (record->event.pressed) {
userspace_config.rgb_layer_change ^= 1; userspace_config.rgb_layer_change ^= 1;
@ -140,7 +144,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
# endif # endif
} }
} }
#endif // CUSTOM_RGBLIGHT #endif // CUSTOM_RGBLIGHT
break; break;
#if defined(CUSTOM_RGBLIGHT) || defined(CUSTOM_RGB_MATRIX) #if defined(CUSTOM_RGBLIGHT) || defined(CUSTOM_RGB_MATRIX)
@ -160,7 +164,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
} }
return false; return false;
break; break;
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
if (record->event.pressed) { if (record->event.pressed) {
bool is_eeprom_updated; bool is_eeprom_updated;
# if defined(CUSTOM_RGBLIGHT) && !defined(RGBLIGHT_DISABLE_KEYCODES) # if defined(CUSTOM_RGBLIGHT) && !defined(RGBLIGHT_DISABLE_KEYCODES)
@ -200,9 +204,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
} }
break; break;
} }
} }
return true; return true;
} }
__attribute__((weak)) void post_process_record_keymap(uint16_t keycode, keyrecord_t *record) {} __attribute__((weak)) void post_process_record_keymap(uint16_t keycode, keyrecord_t *record) {}
void post_process_record_user(uint16_t keycode, keyrecord_t *record) { post_process_record_keymap(keycode, record); } void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
post_process_record_keymap(keycode, record);
}

View file

@ -13,30 +13,30 @@
#endif #endif
enum userspace_custom_keycodes { enum userspace_custom_keycodes {
VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info
KC_QWERTY, // Sets default layer to QWERTY KC_QWERTY, // Sets default layer to QWERTY
FIRST_DEFAULT_LAYER_KEYCODE = KC_QWERTY, // Sets default layer to QWERTY FIRST_DEFAULT_LAYER_KEYCODE = KC_QWERTY, // Sets default layer to QWERTY
KC_COLEMAK_DH, // Sets default layer to COLEMAK KC_COLEMAK_DH, // Sets default layer to COLEMAK
KC_COLEMAK, // Sets default layer to COLEMAK KC_COLEMAK, // Sets default layer to COLEMAK
KC_DVORAK, // Sets default layer to DVORAK KC_DVORAK, // Sets default layer to DVORAK
LAST_DEFAULT_LAYER_KEYCODE = KC_DVORAK, // Sets default layer to WORKMAN LAST_DEFAULT_LAYER_KEYCODE = KC_DVORAK, // Sets default layer to WORKMAN
KC_DIABLO_CLEAR, // Clears all Diablo Timers KC_DIABLO_CLEAR, // Clears all Diablo Timers
KC_RGB_T, // Toggles RGB Layer Indication mode KC_RGB_T, // Toggles RGB Layer Indication mode
RGB_IDL, // RGB Idling animations RGB_IDL, // RGB Idling animations
KC_SECRET_1, // test1 KC_SECRET_1, // test1
KC_SECRET_2, // test2 KC_SECRET_2, // test2
KC_SECRET_3, // test3 KC_SECRET_3, // test3
KC_SECRET_4, // test4 KC_SECRET_4, // test4
KC_SECRET_5, // test5 KC_SECRET_5, // test5
KC_CCCV, // Hold to copy, tap to paste KC_CCCV, // Hold to copy, tap to paste
KC_NUKE, // NUCLEAR LAUNCH DETECTED!!! KC_NUKE, // NUCLEAR LAUNCH DETECTED!!!
UC_FLIP, // (ಠ痊ಠ)┻━┻ UC_FLIP, // (ಠ痊ಠ)┻━┻
UC_TABL, // ┬─┬ノ( º _ ºノ) UC_TABL, // ┬─┬ノ( º _ ºノ)
UC_SHRG, // ¯\_(ツ)_/¯ UC_SHRG, // ¯\_(ツ)_/¯
UC_DISA, // ಠ_ಠ UC_DISA, // ಠ_ಠ
UC_IRNY, UC_IRNY,
UC_CLUE, UC_CLUE,
KEYLOCK, // Locks keyboard by unmounting driver KEYLOCK, // Locks keyboard by unmounting driver
KC_NOMODE, KC_NOMODE,
KC_WIDE, KC_WIDE,
KC_SCRIPT, KC_SCRIPT,
@ -44,11 +44,12 @@ enum userspace_custom_keycodes {
KC_REGIONAL, KC_REGIONAL,
KC_AUSSIE, KC_AUSSIE,
KC_ZALGO, KC_ZALGO,
KC_SUPER,
KC_ACCEL, KC_ACCEL,
AUTOCORRECT_ON, AUTOCORRECT_ON,
AUTOCORRECT_OFF, AUTOCORRECT_OFF,
AUTOCORRECT_TOGGLE, AUTOCORRECT_TOGGLE,
NEW_SAFE_RANGE // use "NEWPLACEHOLDER for keymap specific codes NEW_SAFE_RANGE // use "NEWPLACEHOLDER for keymap specific codes
}; };
bool process_record_secrets(uint16_t keycode, keyrecord_t *record); bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
@ -58,37 +59,37 @@ void post_process_record_keymap(uint16_t keycode, keyrecord_t *record);
bool process_record_unicode(uint16_t keycode, keyrecord_t *record); bool process_record_unicode(uint16_t keycode, keyrecord_t *record);
#endif #endif
#define LOWER MO(_LOWER) #define LOWER MO(_LOWER)
#define RAISE MO(_RAISE) #define RAISE MO(_RAISE)
#define ADJUST MO(_ADJUST) #define ADJUST MO(_ADJUST)
#define TG_MODS OS_TOGG #define TG_MODS OS_TOGG
#define TG_GAME TG(_GAMEPAD) #define TG_GAME TG(_GAMEPAD)
#define TG_DBLO TG(_DIABLO) #define TG_DBLO TG(_DIABLO)
#define OS_LWR OSL(_LOWER) #define OS_LWR OSL(_LOWER)
#define OS_RSE OSL(_RAISE) #define OS_RSE OSL(_RAISE)
#define KC_SEC1 KC_SECRET_1 #define KC_SEC1 KC_SECRET_1
#define KC_SEC2 KC_SECRET_2 #define KC_SEC2 KC_SECRET_2
#define KC_SEC3 KC_SECRET_3 #define KC_SEC3 KC_SECRET_3
#define KC_SEC4 KC_SECRET_4 #define KC_SEC4 KC_SECRET_4
#define KC_SEC5 KC_SECRET_5 #define KC_SEC5 KC_SECRET_5
#define QWERTY KC_QWERTY #define QWERTY KC_QWERTY
#define DVORAK KC_DVORAK #define DVORAK KC_DVORAK
#define COLEMAK KC_COLEMAK #define COLEMAK KC_COLEMAK
#define COLEMAKDH KC_COLEMAK_DH #define COLEMAKDH KC_COLEMAK_DH
#define DEFLYR1 FIRST_DEFAULT_LAYER_KEYCODE #define DEFLYR1 FIRST_DEFAULT_LAYER_KEYCODE
#define DEFLYR2 (FIRST_DEFAULT_LAYER_KEYCODE + 1) #define DEFLYR2 (FIRST_DEFAULT_LAYER_KEYCODE + 1)
#define DEFLYR3 (FIRST_DEFAULT_LAYER_KEYCODE + 2) #define DEFLYR3 (FIRST_DEFAULT_LAYER_KEYCODE + 2)
#define DEFLYR4 (FIRST_DEFAULT_LAYER_KEYCODE + 3) #define DEFLYR4 (FIRST_DEFAULT_LAYER_KEYCODE + 3)
#if LAST_DEFAULT_LAYER_KEYCODE > (FIRST_DEFAULT_LAYER_KEYCODE + 3) #if LAST_DEFAULT_LAYER_KEYCODE > (FIRST_DEFAULT_LAYER_KEYCODE + 3)
# define DEFLYR5 (FIRST_DEFAULT_LAYER_KEYCODE + 4) # define DEFLYR5 (FIRST_DEFAULT_LAYER_KEYCODE + 4)
# define DEFLYR6 (FIRST_DEFAULT_LAYER_KEYCODE + 5) # define DEFLYR6 (FIRST_DEFAULT_LAYER_KEYCODE + 5)
# define DEFLYR7 (FIRST_DEFAULT_LAYER_KEYCODE + 6) # define DEFLYR7 (FIRST_DEFAULT_LAYER_KEYCODE + 6)
# define DEFLYR8 (FIRST_DEFAULT_LAYER_KEYCODE + 7) # define DEFLYR8 (FIRST_DEFAULT_LAYER_KEYCODE + 7)
# if LAST_DEFAULT_LAYER_KEYCODE > (FIRST_DEFAULT_LAYER_KEYCODE + 7) # if LAST_DEFAULT_LAYER_KEYCODE > (FIRST_DEFAULT_LAYER_KEYCODE + 7)
# define DEFLYR9 (FIRST_DEFAULT_LAYER_KEYCODE + 8) # define DEFLYR9 (FIRST_DEFAULT_LAYER_KEYCODE + 8)
# define DEFLYR10 (FIRST_DEFAULT_LAYER_KEYCODE + 9) # define DEFLYR10 (FIRST_DEFAULT_LAYER_KEYCODE + 9)
# define DEFLYR11 (FIRST_DEFAULT_LAYER_KEYCODE + 10) # define DEFLYR11 (FIRST_DEFAULT_LAYER_KEYCODE + 10)
# define DEFLYR12 (FIRST_DEFAULT_LAYER_KEYCODE + 11) # define DEFLYR12 (FIRST_DEFAULT_LAYER_KEYCODE + 11)
@ -99,9 +100,9 @@ bool process_record_unicode(uint16_t keycode, keyrecord_t *record);
# define KC_C1R3 SH_T(KC_TAB) # define KC_C1R3 SH_T(KC_TAB)
#elif defined(DRASHNA_LP) #elif defined(DRASHNA_LP)
# define KC_C1R3 TG(_GAMEPAD) # define KC_C1R3 TG(_GAMEPAD)
#else // SWAP_HANDS_ENABLE #else // SWAP_HANDS_ENABLE
# define KC_C1R3 KC_TAB # define KC_C1R3 KC_TAB
#endif // SWAP_HANDS_ENABLE #endif // SWAP_HANDS_ENABLE
#define BK_LWER LT(_LOWER, KC_BSPC) #define BK_LWER LT(_LOWER, KC_BSPC)
#define SP_LWER LT(_LOWER, KC_SPC) #define SP_LWER LT(_LOWER, KC_SPC)
@ -120,7 +121,7 @@ bool process_record_unicode(uint16_t keycode, keyrecord_t *record);
#define OS_RCTL OSM(MOD_RCTL) #define OS_RCTL OSM(MOD_RCTL)
#define OS_LALT OSM(MOD_LALT) #define OS_LALT OSM(MOD_LALT)
#define OS_RALT OSM(MOD_RALT) #define OS_RALT OSM(MOD_RALT)
#define OS_MEH OSM(MOD_MEH) #define OS_MEH OSM(MOD_MEH)
#define OS_HYPR OSM(MOD_HYPR) #define OS_HYPR OSM(MOD_HYPR)
#define ALT_APP ALT_T(KC_APP) #define ALT_APP ALT_T(KC_APP)
@ -138,9 +139,9 @@ We use custom codes here, so we can substitute the right stuff
# define KC_D3_2 TD(TD_D3_2) # define KC_D3_2 TD(TD_D3_2)
# define KC_D3_3 TD(TD_D3_3) # define KC_D3_3 TD(TD_D3_3)
# define KC_D3_4 TD(TD_D3_4) # define KC_D3_4 TD(TD_D3_4)
#else // TAP_DANCE_ENABLE #else // TAP_DANCE_ENABLE
# define KC_D3_1 KC_1 # define KC_D3_1 KC_1
# define KC_D3_2 KC_2 # define KC_D3_2 KC_2
# define KC_D3_3 KC_3 # define KC_D3_3 KC_3
# define KC_D3_4 KC_4 # define KC_D3_4 KC_4
#endif // TAP_DANCE_ENABLE #endif // TAP_DANCE_ENABLE

View file

@ -26,7 +26,7 @@ void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= (sizeof(diablo_times) / sizeof(uint8_t))) { if (state->count >= (sizeof(diablo_times) / sizeof(uint8_t))) {
diablo_timer[diablo_keys->index].key_interval = 0; diablo_timer[diablo_keys->index].key_interval = 0;
reset_tap_dance(state); reset_tap_dance(state);
} else { // else set the interval (tapdance count starts at 1, array starts at 0, so offset by one) } else { // else set the interval (tapdance count starts at 1, array starts at 0, so offset by one)
diablo_timer[diablo_keys->index].key_interval = diablo_times[state->count - 1]; diablo_timer[diablo_keys->index].key_interval = diablo_times[state->count - 1];
} }
} }

View file

@ -28,4 +28,4 @@ enum {
TD_D3_3, TD_D3_3,
TD_D3_4, TD_D3_4,
}; };
#endif // TAP_DANCE_ENABLE #endif // TAP_DANCE_ENABLE

View file

@ -29,10 +29,10 @@ __attribute__((weak)) bool get_hold_on_other_key_press(uint16_t keycode, keyreco
// Do not select the hold action when another key is pressed. // Do not select the hold action when another key is pressed.
// return false; // return false;
switch (keycode) { switch (keycode) {
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: // case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
return true; // return true;
default: default:
return false; return true;
} }
} }

View file

@ -69,7 +69,7 @@ bool process_record_glyph_replacement(uint16_t keycode, keyrecord_t *record, tra
} }
return false; return false;
} else if (KC_1 <= keycode && keycode <= KC_0) { } else if (KC_1 <= keycode && keycode <= KC_0) {
if (is_shifted) { // skip shifted numbers, so that we can still use symbols etc. if (is_shifted) { // skip shifted numbers, so that we can still use symbols etc.
return process_record_keymap(keycode, record); return process_record_keymap(keycode, record);
} }
if (record->event.pressed) { if (record->event.pressed) {
@ -92,42 +92,81 @@ DEFINE_UNICODE_RANGE_TRANSLATOR(unicode_range_translator_boxes, 0x1F170, 0x1F170
DEFINE_UNICODE_RANGE_TRANSLATOR(unicode_range_translator_regional, 0x1F1E6, 0x1F1E6, '0', '1', 0x2003); DEFINE_UNICODE_RANGE_TRANSLATOR(unicode_range_translator_regional, 0x1F1E6, 0x1F1E6, '0', '1', 0x2003);
DEFINE_UNICODE_LUT_TRANSLATOR(unicode_lut_translator_aussie, DEFINE_UNICODE_LUT_TRANSLATOR(unicode_lut_translator_aussie,
0x0250, // a 0x0250, // a
'q', // b 'q', // b
0x0254, // c 0x0254, // c
'p', // d 'p', // d
0x01DD, // e 0x01DD, // e
0x025F, // f 0x025F, // f
0x0183, // g 0x0183, // g
0x0265, // h 0x0265, // h
0x1D09, // i 0x1D09, // i
0x027E, // j 0x027E, // j
0x029E, // k 0x029E, // k
'l', // l 'l', // l
0x026F, // m 0x026F, // m
'u', // n 'u', // n
'o', // o 'o', // o
'd', // p 'd', // p
'b', // q 'b', // q
0x0279, // r 0x0279, // r
's', // s 's', // s
0x0287, // t 0x0287, // t
'n', // u 'n', // u
0x028C, // v 0x028C, // v
0x028D, // w 0x028D, // w
0x2717, // x 0x2717, // x
0x028E, // y 0x028E, // y
'z', // z 'z', // z
0x0269, // 1 0x0269, // 1
0x3139, // 2 0x3139, // 2
0x0190, // 3 0x0190, // 3
0x3123, // 4 0x3123, // 4
0x03DB, // 5 0x03DB, // 5
'9', // 6 '9', // 6
0x3125, // 7 0x3125, // 7
'8', // 8 '8', // 8
'6', // 9 '6', // 9
'0' // 0 '0' // 0
);
DEFINE_UNICODE_LUT_TRANSLATOR(unicode_lut_translator_super,
0x1D43, // a
0x1D47, // b
0x1D9C, // c
0x1D48, // d
0x1D49, // e
0x1DA0, // f
0x1D4D, // g
0x02B0, // h
0x2071, // i
0x02B2, // j
0x1D4F, // k
0x1D4F, // l
0x1D50, // m
0x207F, // n
0x1D52, // o
0x1D56, // p
0x06F9, // q
0x02B3, // r
0x02E2, // s
0x1D57, // t
0x1D58, // u
0x1D5B, // v
0x02B7, // w
0x02E3, // x
0x02B8, // y
0x1DBB, // z
0x00B9, // 1
0x00B2, // 2
0x00B3, // 3
0x2074, // 4
0x2075, // 5
0x2076, // 6
0x2077, // 7
0x2078, // 8
0x2079, // 9
0x2070 // 0
); );
bool process_record_aussie(uint16_t keycode, keyrecord_t *record) { bool process_record_aussie(uint16_t keycode, keyrecord_t *record) {
@ -207,41 +246,41 @@ bool process_record_zalgo(uint16_t keycode, keyrecord_t *record) {
bool process_record_unicode(uint16_t keycode, keyrecord_t *record) { bool process_record_unicode(uint16_t keycode, keyrecord_t *record) {
switch (keycode) { switch (keycode) {
case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
if (record->event.pressed) { if (record->event.pressed) {
send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻"); send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻");
} }
break; break;
case UC_TABL: // ┬─┬ノ( º _ ºノ) case UC_TABL: // ┬─┬ノ( º _ ºノ)
if (record->event.pressed) { if (record->event.pressed) {
send_unicode_string("┬─┬ノ( º _ ºノ)"); send_unicode_string("┬─┬ノ( º _ ºノ)");
} }
break; break;
case UC_SHRG: // ¯\_(ツ)_/¯ case UC_SHRG: // ¯\_(ツ)_/¯
if (record->event.pressed) { if (record->event.pressed) {
send_unicode_string("¯\\_(ツ)_/¯"); send_unicode_string("¯\\_(ツ)_/¯");
} }
break; break;
case UC_DISA: // ಠ_ಠ case UC_DISA: // ಠ_ಠ
if (record->event.pressed) { if (record->event.pressed) {
send_unicode_string("ಠ_ಠ"); send_unicode_string("ಠ_ಠ");
} }
break; break;
case UC_IRNY: // ⸮ case UC_IRNY: // ⸮
if (record->event.pressed) { if (record->event.pressed) {
register_unicode(0x2E2E); register_unicode(0x2E2E);
} }
break; break;
case UC_CLUE: // ‽ case UC_CLUE: // ‽
if (record->event.pressed) { if (record->event.pressed) {
register_unicode(0x203D); register_unicode(0x203D);
} }
break; break;
case KC_NOMODE ... KC_ZALGO: case KC_NOMODE ... KC_SUPER:
if (record->event.pressed) { if (record->event.pressed) {
if (typing_mode != keycode - KC_NOMODE) { if (typing_mode != keycode - KC_NOMODE) {
typing_mode = keycode - KC_NOMODE; typing_mode = keycode - KC_NOMODE;
@ -280,6 +319,10 @@ bool process_record_unicode(uint16_t keycode, keyrecord_t *record) {
return false; return false;
} }
} }
} else if (typing_mode == UCTM_SUPER) {
if (((KC_A <= keycode) && (keycode <= KC_0))) {
return process_record_glyph_replacement(keycode, record, unicode_lut_translator_super);
}
} else if (typing_mode == UCTM_AUSSIE) { } else if (typing_mode == UCTM_AUSSIE) {
return process_record_aussie(keycode, record); return process_record_aussie(keycode, record);
} else if (typing_mode == UCTM_ZALGO) { } else if (typing_mode == UCTM_ZALGO) {
@ -292,4 +335,6 @@ bool process_record_unicode(uint16_t keycode, keyrecord_t *record) {
* @brief Initialize the default unicode mode on firmware startu * @brief Initialize the default unicode mode on firmware startu
* *
*/ */
void matrix_init_unicode(void) { unicode_input_mode_init(); } void matrix_init_unicode(void) {
unicode_input_mode_init();
}

View file

@ -11,6 +11,7 @@ enum unicode_typing_mode {
UCTM_REGIONAL, UCTM_REGIONAL,
UCTM_AUSSIE, UCTM_AUSSIE,
UCTM_ZALGO, UCTM_ZALGO,
UCTM_SUPER,
}; };
extern uint8_t typing_mode; extern uint8_t typing_mode;

View file

@ -34,7 +34,7 @@ uint32_t oled_timer = 0;
char keylog_str[OLED_KEYLOGGER_LENGTH] = {0}; char keylog_str[OLED_KEYLOGGER_LENGTH] = {0};
static uint16_t log_timer = 0; static uint16_t log_timer = 0;
#ifdef OLED_DISPLAY_VERBOSE #ifdef OLED_DISPLAY_VERBOSE
static const char PROGMEM display_border[3] = {0x0, 0xFF, 0x0}; const char PROGMEM display_border[3] = {0x0, 0xFF, 0x0};
#endif #endif
deferred_token kittoken; deferred_token kittoken;
@ -117,9 +117,9 @@ void oled_timer_reset(void) {
* @brief Renders keylogger buffer to oled * @brief Renders keylogger buffer to oled
* *
*/ */
void render_keylogger_status(void) { void render_keylogger_status(uint8_t col, uint8_t line) {
#ifdef OLED_DISPLAY_VERBOSE #ifdef OLED_DISPLAY_VERBOSE
oled_set_cursor(1, 6); oled_set_cursor(col, line);
#endif #endif
oled_write_P(PSTR(OLED_RENDER_KEYLOGGER), false); oled_write_P(PSTR(OLED_RENDER_KEYLOGGER), false);
oled_write(keylog_str, false); oled_write(keylog_str, false);
@ -132,9 +132,9 @@ void render_keylogger_status(void) {
* @brief Renders default layer state (aka layout) to oled * @brief Renders default layer state (aka layout) to oled
* *
*/ */
void render_default_layer_state(void) { void render_default_layer_state(uint8_t col, uint8_t line) {
#ifdef OLED_DISPLAY_VERBOSE #ifdef OLED_DISPLAY_VERBOSE
oled_set_cursor(1, 1); oled_set_cursor(col, line);
#endif #endif
oled_write_P(PSTR(OLED_RENDER_LAYOUT_NAME), false); oled_write_P(PSTR(OLED_RENDER_LAYOUT_NAME), false);
switch (get_highest_layer(default_layer_state)) { switch (get_highest_layer(default_layer_state)) {
@ -160,7 +160,7 @@ void render_default_layer_state(void) {
* @brief Renders the active layers to the OLED * @brief Renders the active layers to the OLED
* *
*/ */
void render_layer_state(void) { void render_layer_state(uint8_t col, uint8_t line) {
#ifdef OLED_DISPLAY_VERBOSE #ifdef OLED_DISPLAY_VERBOSE
// clang-format off // clang-format off
static const char PROGMEM tri_layer_image[][3][24] = { static const char PROGMEM tri_layer_image[][3][24] = {
@ -286,33 +286,33 @@ void render_layer_state(void) {
layer_is[2] = 5; layer_is[2] = 5;
} }
oled_set_cursor(1, 2); oled_set_cursor(col, line);
oled_write_raw_P(tri_layer_image[layer_is[0]][0], sizeof(tri_layer_image[0][0])); oled_write_raw_P(tri_layer_image[layer_is[0]][0], sizeof(tri_layer_image[0][0]));
oled_set_cursor(5, 2); oled_set_cursor(col + 4, line);
oled_write_raw_P(tri_layer_image[layer_is[1]][0], sizeof(tri_layer_image[0][0])); oled_write_raw_P(tri_layer_image[layer_is[1]][0], sizeof(tri_layer_image[0][0]));
oled_set_cursor(9, 2); oled_set_cursor(col + 8, line);
oled_write_raw_P(tri_layer_image[layer_is[2]][0], sizeof(tri_layer_image[0][0])); oled_write_raw_P(tri_layer_image[layer_is[2]][0], sizeof(tri_layer_image[0][0]));
oled_set_cursor(14, 2); oled_set_cursor(col + 13, line);
oled_write_P(PSTR("Diablo2"), layer_state_is(_DIABLOII)); oled_write_P(PSTR("Diablo2"), layer_state_is(_DIABLOII));
oled_advance_page(true); oled_advance_page(true);
oled_set_cursor(1, 3); oled_set_cursor(col, line + 1);
oled_write_raw_P(tri_layer_image[layer_is[0]][1], sizeof(tri_layer_image[0][0])); oled_write_raw_P(tri_layer_image[layer_is[0]][1], sizeof(tri_layer_image[0][0]));
oled_set_cursor(5, 3); oled_set_cursor(col + 4, line + 1);
oled_write_raw_P(tri_layer_image[layer_is[1]][1], sizeof(tri_layer_image[0][0])); oled_write_raw_P(tri_layer_image[layer_is[1]][1], sizeof(tri_layer_image[0][0]));
oled_set_cursor(9, 3); oled_set_cursor(col + 8, line + 1);
oled_write_raw_P(tri_layer_image[layer_is[2]][1], sizeof(tri_layer_image[0][0])); oled_write_raw_P(tri_layer_image[layer_is[2]][1], sizeof(tri_layer_image[0][0]));
oled_set_cursor(14, 3); oled_set_cursor(col + 13, line + 1);
oled_write_P(PSTR("Diablo3"), layer_state_is(_DIABLO)); oled_write_P(PSTR("Diablo3"), layer_state_is(_DIABLO));
oled_advance_page(true); oled_advance_page(true);
oled_set_cursor(1, 4); oled_set_cursor(col, line + 2);
oled_write_raw_P(tri_layer_image[layer_is[0]][2], sizeof(tri_layer_image[0][0])); oled_write_raw_P(tri_layer_image[layer_is[0]][2], sizeof(tri_layer_image[0][0]));
oled_set_cursor(5, 4); oled_set_cursor(col + 4, line + 2);
oled_write_raw_P(tri_layer_image[layer_is[1]][2], sizeof(tri_layer_image[0][0])); oled_write_raw_P(tri_layer_image[layer_is[1]][2], sizeof(tri_layer_image[0][0]));
oled_set_cursor(9, 4); oled_set_cursor(col + 8, line + 2);
oled_write_raw_P(tri_layer_image[layer_is[2]][2], sizeof(tri_layer_image[0][0])); oled_write_raw_P(tri_layer_image[layer_is[2]][2], sizeof(tri_layer_image[0][0]));
oled_set_cursor(14, 4); oled_set_cursor(col + 13, line + 2);
oled_write_P(PSTR("Media"), layer_state_is(_MEDIA)); oled_write_P(PSTR("Media"), layer_state_is(_MEDIA));
#else #else
oled_write_P(PSTR(OLED_RENDER_LAYER_NAME), false); oled_write_P(PSTR(OLED_RENDER_LAYER_NAME), false);
@ -327,9 +327,12 @@ void render_layer_state(void) {
* *
* @param led_usb_state Current keyboard led state * @param led_usb_state Current keyboard led state
*/ */
void render_keylock_status(led_t led_usb_state) { void render_keylock_status(led_t led_usb_state, uint8_t col, uint8_t line) {
#if defined(OLED_DISPLAY_VERBOSE) #if defined(OLED_DISPLAY_VERBOSE)
oled_set_cursor(1, 6); oled_set_cursor(col, line);
#endif
#ifdef CAPS_WORD_ENABLE
led_usb_state.caps_lock |= is_caps_word_on();
#endif #endif
oled_write_P(PSTR(OLED_RENDER_LOCK_NAME), false); oled_write_P(PSTR(OLED_RENDER_LOCK_NAME), false);
#if !defined(OLED_DISPLAY_VERBOSE) #if !defined(OLED_DISPLAY_VERBOSE)
@ -348,8 +351,9 @@ void render_keylock_status(led_t led_usb_state) {
* @brief Renders the matrix scan rate to the host system * @brief Renders the matrix scan rate to the host system
* *
*/ */
void render_matrix_scan_rate(uint8_t padding) { void render_matrix_scan_rate(uint8_t padding, uint8_t col, uint8_t line) {
#ifdef DEBUG_MATRIX_SCAN_RATE #ifdef DEBUG_MATRIX_SCAN_RATE
oled_set_cursor(col, line);
oled_write_P(PSTR("MS:"), false); oled_write_P(PSTR("MS:"), false);
if (padding) { if (padding) {
for (uint8_t n = padding; n > 0; n--) { for (uint8_t n = padding; n > 0; n--) {
@ -365,10 +369,10 @@ void render_matrix_scan_rate(uint8_t padding) {
* *
* @param modifiers Modifiers to check against (real, weak, onesheot, etc;) * @param modifiers Modifiers to check against (real, weak, onesheot, etc;)
*/ */
void render_mod_status(uint8_t modifiers) { void render_mod_status(uint8_t modifiers, uint8_t col, uint8_t line) {
static const char PROGMEM mod_status[5][3] = {{0xE8, 0xE9, 0}, {0xE4, 0xE5, 0}, {0xE6, 0xE7, 0}, {0xEA, 0xEB, 0}, {0xEC, 0xED, 0}}; static const char PROGMEM mod_status[5][3] = {{0xE8, 0xE9, 0}, {0xE4, 0xE5, 0}, {0xE6, 0xE7, 0}, {0xEA, 0xEB, 0}, {0xEC, 0xED, 0}};
#if defined(OLED_DISPLAY_VERBOSE) #if defined(OLED_DISPLAY_VERBOSE)
oled_set_cursor(1, 5); oled_set_cursor(col, line);
#endif #endif
oled_write_P(PSTR(OLED_RENDER_MODS_NAME), false); oled_write_P(PSTR(OLED_RENDER_MODS_NAME), false);
#if defined(OLED_DISPLAY_VERBOSE) #if defined(OLED_DISPLAY_VERBOSE)
@ -393,7 +397,7 @@ void render_mod_status(uint8_t modifiers) {
extern bool swap_hands; extern bool swap_hands;
#endif #endif
void render_bootmagic_status(void) { void render_bootmagic_status(uint8_t col, uint8_t line) {
/* Show Ctrl-Gui Swap options */ /* Show Ctrl-Gui Swap options */
static const char PROGMEM logo[][2][3] = { static const char PROGMEM logo[][2][3] = {
{{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}, {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}},
@ -402,7 +406,8 @@ void render_bootmagic_status(void) {
bool is_bootmagic_on; bool is_bootmagic_on;
#ifdef OLED_DISPLAY_VERBOSE #ifdef OLED_DISPLAY_VERBOSE
oled_set_cursor(7, 3); oled_set_cursor(col, line);
// oled_set_cursor(7, 3);
is_bootmagic_on = !keymap_config.swap_lctl_lgui; is_bootmagic_on = !keymap_config.swap_lctl_lgui;
#else #else
is_bootmagic_on = keymap_config.swap_lctl_lgui; is_bootmagic_on = keymap_config.swap_lctl_lgui;
@ -435,7 +440,7 @@ void render_bootmagic_status(void) {
oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NOGUI), keymap_config.no_gui); oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NOGUI), keymap_config.no_gui);
#endif #endif
#ifdef OLED_DISPLAY_VERBOSE #ifdef OLED_DISPLAY_VERBOSE
oled_set_cursor(7, 4); oled_set_cursor(col, line + 1);
if (keymap_config.swap_lctl_lgui) { if (keymap_config.swap_lctl_lgui) {
oled_write_P(logo[1][1], is_bootmagic_on); oled_write_P(logo[1][1], is_bootmagic_on);
} else { } else {
@ -455,7 +460,7 @@ void render_bootmagic_status(void) {
extern bool tap_toggling; extern bool tap_toggling;
#endif #endif
void render_user_status(void) { void render_user_status(uint8_t col, uint8_t line) {
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
bool is_audio_on = false, l_is_clicky_on = false; bool is_audio_on = false, l_is_clicky_on = false;
# ifdef SPLIT_KEYBOARD # ifdef SPLIT_KEYBOARD
@ -472,7 +477,7 @@ void render_user_status(void) {
# endif # endif
#endif #endif
#if defined(OLED_DISPLAY_VERBOSE) #if defined(OLED_DISPLAY_VERBOSE)
oled_set_cursor(1, 5); oled_set_cursor(col, line);
#endif #endif
oled_write_P(PSTR(OLED_RENDER_USER_NAME), false); oled_write_P(PSTR(OLED_RENDER_USER_NAME), false);
#if !defined(OLED_DISPLAY_VERBOSE) #if !defined(OLED_DISPLAY_VERBOSE)
@ -523,9 +528,27 @@ void render_user_status(void) {
#endif #endif
} }
void render_wpm(uint8_t padding) { void render_rgb_hsv(uint8_t col, uint8_t line) {
#ifdef WPM_ENABLE oled_set_cursor(col, line);
oled_write_P(PSTR("HSV: "), false);
#ifdef RGB_MATRIX_ENABLE
oled_write(get_u8_str(rgb_matrix_get_hue(), ' '), false);
oled_write_P(PSTR(", "), false);
oled_write(get_u8_str(rgb_matrix_get_sat(), ' '), false);
oled_write_P(PSTR(", "), false);
oled_write(get_u8_str(rgb_matrix_get_val(), ' '), false);
#elif RGBLIGHT_ENABLE
oled_write(get_u8_str(rgblight_get_hue(), ' '), false);
oled_write_P(PSTR(", "), false);
oled_write(get_u8_str(rgblight_get_sat(), ' '), false);
oled_write_P(PSTR(", "), false);
oled_write(get_u8_str(rgblight_get_val(), ' '), false);
#endif
}
void render_wpm(uint8_t padding, uint8_t col, uint8_t line) {
#ifdef WPM_ENABLE
oled_set_cursor(col, line);
oled_write_P(PSTR(OLED_RENDER_WPM_COUNTER), false); oled_write_P(PSTR(OLED_RENDER_WPM_COUNTER), false);
if (padding) { if (padding) {
for (uint8_t n = padding; n > 0; n--) { for (uint8_t n = padding; n > 0; n--) {
@ -591,7 +614,8 @@ void render_wpm_graph(uint8_t max_lines_graph, uint8_t vertical_offset) {
} }
#if defined(POINTING_DEVICE_ENABLE) #if defined(POINTING_DEVICE_ENABLE)
void render_pointing_dpi_status(uint16_t cpi, uint8_t padding) { void render_pointing_dpi_status(uint16_t cpi, uint8_t padding, uint8_t col, uint8_t line) {
oled_set_cursor(col, line);
oled_write_P(PSTR("CPI:"), false); oled_write_P(PSTR("CPI:"), false);
if (padding) { if (padding) {
for (uint8_t n = padding - 1; n > 0; n--) { for (uint8_t n = padding - 1; n > 0; n--) {
@ -603,13 +627,6 @@ void render_pointing_dpi_status(uint16_t cpi, uint8_t padding) {
} }
#endif #endif
__attribute__((weak)) void oled_driver_render_logo_right(void) {
#if defined(OLED_DISPLAY_VERBOSE)
oled_set_cursor(0, 1);
#endif
render_default_layer_state();
}
// WPM-responsive animation stuff here // WPM-responsive animation stuff here
#define OLED_SLEEP_FRAMES 2 #define OLED_SLEEP_FRAMES 2
#define OLED_SLEEP_SPEED 10 // below this wpm value your animation will idle #define OLED_SLEEP_SPEED 10 // below this wpm value your animation will idle
@ -635,7 +652,7 @@ __attribute__((weak)) void oled_driver_render_logo_right(void) {
static uint8_t animation_frame = 0; static uint8_t animation_frame = 0;
static uint8_t animation_type = 0; static uint8_t animation_type = 0;
void render_kitty(void) { void render_kitty(uint8_t col, uint8_t line) {
// Images credit j-inc(/James Incandenza) and pixelbenny. // Images credit j-inc(/James Incandenza) and pixelbenny.
// Credit to obosob for initial animation approach. // Credit to obosob for initial animation approach.
// heavily modified by drashna because he's a glutton for punishment // heavily modified by drashna because he's a glutton for punishment
@ -712,11 +729,44 @@ void render_kitty(void) {
// clang-format on // clang-format on
for (uint8_t i = 0; i < 4; i++) { for (uint8_t i = 0; i < 4; i++) {
oled_set_cursor(1, i + 1); oled_set_cursor(col, line + i);
oled_write_raw_P(animation[animation_type][animation_frame][i], OLED_ANIM_SIZE); oled_write_raw_P(animation[animation_type][animation_frame][i], OLED_ANIM_SIZE);
} }
} }
void render_unicode_mode(uint8_t col, uint8_t line) {
#ifdef CUSTOM_UNICODE_ENABLE
oled_set_cursor(col, line);
oled_write_ln_P(PSTR("Unicode:"), false);
switch (typing_mode) {
case UCTM_WIDE:
oled_write_P(PSTR(" Wide"), false);
break;
case UCTM_SCRIPT:
oled_write_P(PSTR(" Script"), false);
break;
case UCTM_BLOCKS:
oled_write_P(PSTR(" Blocks"), false);
break;
case UCTM_REGIONAL:
oled_write_P(PSTR(" Regional"), false);
break;
case UCTM_AUSSIE:
oled_write_P(PSTR(" Aussie"), false);
break;
case UCTM_ZALGO:
oled_write_P(PSTR(" Zalgo"), false);
break;
case UCTM_NO_MODE:
oled_write_P(PSTR(" Normal"), false);
break;
default:
oled_write_P(PSTR(" Unknown"), false);
break;
}
#endif
}
uint32_t kitty_animation_phases(uint32_t triger_time, void *cb_arg) { uint32_t kitty_animation_phases(uint32_t triger_time, void *cb_arg) {
static uint32_t anim_frame_duration = 500; static uint32_t anim_frame_duration = 500;
#ifdef CUSTOM_POINTING_DEVICE #ifdef CUSTOM_POINTING_DEVICE
@ -748,34 +798,8 @@ uint32_t kitty_animation_phases(uint32_t triger_time, void *cb_arg) {
return anim_frame_duration; return anim_frame_duration;
} }
void oled_driver_render_logo_left(void) { void render_mouse_mode(uint8_t col, uint8_t line) {
#if defined(OLED_DISPLAY_VERBOSE) #if (defined(KEYBOARD_bastardkb_charybdis) || defined(KEYBOARD_handwired_tractyl_manuform)) && defined(POINTING_DEVICE_ENABLE)
oled_set_cursor(0, 1);
render_kitty();
# if defined(KEYBOARD_handwired_tractyl_manuform)
oled_set_cursor(7, 0);
oled_write_P(PSTR("Tractyl"), true);
# elif defined(KEYBOARD_bastardkb_charybdis)
oled_set_cursor(6, 0);
oled_write_P(PSTR("Charybdis"), true);
# elif defined(KEYBOARD_splitkb_kyria)
oled_set_cursor(7, 0);
oled_write_P(PSTR("SplitKB"), true);
# else
oled_set_cursor(8, 0);
oled_write_P(PSTR("Left"), true);
# endif
oled_set_cursor(7, 1);
# if defined(WPM_ENABLE)
render_wpm(1);
# elif defined(DEBUG_MATRIX_SCAN_RATE)
render_matrix_scan_rate(2);
# endif
oled_set_cursor(7, 2);
# if (defined(KEYBOARD_bastardkb_charybdis) || defined(KEYBOARD_handwired_tractyl_manuform)) && defined(POINTING_DEVICE_ENABLE)
render_pointing_dpi_status(charybdis_get_pointer_sniping_enabled() ? charybdis_get_pointer_sniping_dpi() : charybdis_get_pointer_default_dpi(), 1);
// credit and thanks to jaspertandy on discord for these images // credit and thanks to jaspertandy on discord for these images
static const char PROGMEM mouse_logo[3][2][16] = {// mouse icon static const char PROGMEM mouse_logo[3][2][16] = {// mouse icon
{{0, 0, 0, 252, 2, 2, 2, 58, 2, 2, 2, 252, 0, 0, 0, 0}, {0, 0, 63, 96, 64, 64, 64, 64, 64, 64, 64, 96, 63, 0, 0, 0}}, {{0, 0, 0, 252, 2, 2, 2, 58, 2, 2, 2, 252, 0, 0, 0, 0}, {0, 0, 63, 96, 64, 64, 64, 64, 64, 64, 64, 96, 63, 0, 0, 0}},
@ -785,27 +809,20 @@ void oled_driver_render_logo_left(void) {
{{0, 0, 112, 136, 156, 2, 15, 1, 15, 2, 140, 68, 56, 0, 0, 0}, {0, 0, 2, 6, 15, 28, 60, 124, 60, 28, 15, 6, 2, 0, 0, 0}}}; {{0, 0, 112, 136, 156, 2, 15, 1, 15, 2, 140, 68, 56, 0, 0, 0}, {0, 0, 2, 6, 15, 28, 60, 124, 60, 28, 15, 6, 2, 0, 0, 0}}};
uint8_t image_index = 0; uint8_t image_index = 0;
# ifdef OLED_DISPLAY_TEST # ifdef OLED_DISPLAY_TEST
image_index = animation_frame; image_index = animation_frame;
# else # else
if (charybdis_get_pointer_sniping_enabled()) { if (charybdis_get_pointer_sniping_enabled()) {
image_index = 1; image_index = 1;
} else if (charybdis_get_pointer_dragscroll_enabled()) { } else if (charybdis_get_pointer_dragscroll_enabled()) {
image_index = 2; image_index = 2;
} }
# endif
oled_set_cursor(17, 1);
oled_write_raw_P(mouse_logo[image_index][0], 16);
oled_set_cursor(17, 2);
oled_write_raw_P(mouse_logo[image_index][1], 16);
# elif defined(WPM_ENABLE) && defined(DEBUG_MATRIX_SCAN_RATE)
render_matrix_scan_rate(2);
# endif # endif
oled_set_cursor(0, 5); oled_set_cursor(col, line);
#else oled_write_raw_P(mouse_logo[image_index][0], 16);
render_default_layer_state(); oled_set_cursor(col, line + 1);
oled_write_raw_P(mouse_logo[image_index][1], 16);
#endif #endif
} }
@ -823,27 +840,73 @@ void render_status_right(void) {
oled_set_cursor(8, 0); oled_set_cursor(8, 0);
oled_write_P(PSTR("Right"), true); oled_write_P(PSTR("Right"), true);
#endif #endif
oled_driver_render_logo_right(); #if defined(OLED_DISPLAY_VERBOSE)
render_default_layer_state(1, 1);
#else
render_default_layer_state(0, 0);
#endif
/* Show Keyboard Layout */ /* Show Keyboard Layout */
render_layer_state(); render_layer_state(1, 2);
render_mod_status(get_mods() | get_oneshot_mods()); render_mod_status(get_mods() | get_oneshot_mods(), 1, 5);
#if !defined(OLED_DISPLAY_VERBOSE) && defined(WPM_ENABLE) && !defined(CONVERT_TO_PROTON_C) #if !defined(OLED_DISPLAY_VERBOSE) && defined(WPM_ENABLE) && !defined(STM32F303xC)
render_wpm(2); render_wpm(2);
#endif #endif
render_keylock_status(host_keyboard_led_state()); render_keylock_status(host_keyboard_led_state(), 1, 6);
} }
void render_status_left(void) { void render_status_left(void) {
oled_driver_render_logo_left(); #if defined(OLED_DISPLAY_VERBOSE)
render_kitty(0, 1);
# if defined(KEYBOARD_handwired_tractyl_manuform)
oled_set_cursor(7, 0);
oled_write_P(PSTR("Tractyl"), true);
# elif defined(KEYBOARD_bastardkb_charybdis)
oled_set_cursor(6, 0);
oled_write_P(PSTR("Charybdis"), true);
# elif defined(KEYBOARD_splitkb_kyria)
oled_set_cursor(7, 0);
oled_write_P(PSTR("SplitKB"), true);
# elif defined(KEYBOARD_handwired_fingerpunch_rockon)
oled_set_cursor(7, 0);
oled_write_P(PSTR("Rock On"), true);
# else
oled_set_cursor(8, 0);
oled_write_P(PSTR("Left"), true);
# endif
# if defined(WPM_ENABLE)
render_wpm(1, 7, 1);
# elif defined(DEBUG_MATRIX_SCAN_RATE)
render_matrix_scan_rate(1, 7, 1);
# endif
# if (defined(KEYBOARD_bastardkb_charybdis) || defined(KEYBOARD_handwired_tractyl_manuform)) && defined(POINTING_DEVICE_ENABLE)
render_pointing_dpi_status(charybdis_get_pointer_sniping_enabled() ? charybdis_get_pointer_sniping_dpi() : charybdis_get_pointer_default_dpi(), 1, 7, 2);
render_mouse_mode(17, 1);
# elif defined(WPM_ENABLE) && defined(DEBUG_MATRIX_SCAN_RATE)
render_matrix_scan_rate(1, 7, 2);
# endif
/* Show Keyboard Layout */ /* Show Keyboard Layout */
render_bootmagic_status(); render_bootmagic_status(7, 3);
render_user_status(); render_user_status(1, 5);
render_keylogger_status(); render_keylogger_status(1, 6);
#else
render_default_layer_state(0, 0);
/* Show Keyboard Layout */
render_bootmagic_status(7, 3);
render_user_status(1, 5);
render_keylogger_status(1, 6);
#endif
} }
__attribute__((weak)) void oled_render_large_display(bool side) {} __attribute__((weak)) void oled_render_large_display(bool side) {
if (!side) {
render_unicode_mode(1, 14);
}
}
__attribute__((weak)) oled_rotation_t oled_init_keymap(oled_rotation_t rotation) { __attribute__((weak)) oled_rotation_t oled_init_keymap(oled_rotation_t rotation) {
return rotation; return rotation;
@ -895,14 +958,12 @@ bool oled_task_user(void) {
#endif #endif
render_status_left(); render_status_left();
#if defined(OLED_DISPLAY_128X128) #if defined(OLED_DISPLAY_128X128)
oled_set_cursor(0, 7);
oled_render_large_display(true); oled_render_large_display(true);
#endif #endif
#ifndef OLED_DISPLAY_TEST #ifndef OLED_DISPLAY_TEST
} else { } else {
render_status_right(); render_status_right();
# if defined(OLED_DISPLAY_128X128) # if defined(OLED_DISPLAY_128X128)
oled_set_cursor(0, 7);
oled_render_large_display(false); oled_render_large_display(false);
# endif # endif
} }

View file

@ -18,132 +18,135 @@
#include "quantum.h" #include "quantum.h"
#include "oled_driver.h" #include "oled_driver.h"
#ifdef DEFFERED_EXEC_ENABLE
extern deferred_token kittoken; extern deferred_token kittoken;
#endif
void oled_driver_render_logo(void); void oled_driver_render_logo(void);
bool process_record_user_oled(uint16_t keycode, keyrecord_t *record); bool process_record_user_oled(uint16_t keycode, keyrecord_t *record);
oled_rotation_t oled_init_keymap(oled_rotation_t rotation); oled_rotation_t oled_init_keymap(oled_rotation_t rotation);
void oled_timer_reset(void); void oled_timer_reset(void);
void render_keylogger_status(void); void render_keylogger_status(uint8_t col, uint8_t line);
void render_default_layer_state(void); void render_default_layer_state(uint8_t col, uint8_t line);
void render_layer_state(void); void render_layer_state(uint8_t col, uint8_t line);
void render_keylock_status(led_t led_usb_state); void render_keylock_status(led_t led_usb_state, uint8_t col, uint8_t line);
void render_matrix_scan_rate(uint8_t padding); void render_matrix_scan_rate(uint8_t padding, uint8_t col, uint8_t line);
void render_mod_status(uint8_t modifiers); void render_mod_status(uint8_t modifiers, uint8_t col, uint8_t line);
void render_bootmagic_status(void); void render_bootmagic_status(uint8_t col, uint8_t line);
void render_user_status(void); void render_user_status(uint8_t col, uint8_t line);
void oled_driver_render_logo(void); void oled_driver_render_logo(void);
void render_wpm(uint8_t padding); void render_wpm(uint8_t padding, uint8_t col, uint8_t line);
void render_pointing_dpi_status(uint16_t cpi, uint8_t padding); void render_pointing_dpi_status(uint16_t cpi, uint8_t padding, uint8_t col, uint8_t line);
void oled_driver_render_logo_left(void); void oled_driver_render_logo_left(void);
void oled_driver_render_logo_right(void); void oled_driver_render_logo_right(void);
void oled_render_large_display(bool side); void oled_render_large_display(bool side);
void render_wpm_graph(uint8_t max_lines_graph, uint8_t vertical_offset); void render_wpm_graph(uint8_t max_lines_graph, uint8_t vertical_offset);
void render_kitty(uint8_t col, uint8_t line);
void render_unicode_mode(uint8_t col, uint8_t line);
void render_rgb_hsv(uint8_t col, uint8_t line);
void oled_pan_section(bool left, uint16_t y_start, uint16_t y_end, uint16_t x_start, uint16_t x_end); void oled_pan_section(bool left, uint16_t y_start, uint16_t y_end, uint16_t x_start, uint16_t x_end);
#if defined(OLED_DISPLAY_128X128) || defined(OLED_DISPLAY_128X64) #if defined(OLED_DISPLAY_128X128) || defined(OLED_DISPLAY_128X64)
# define OLED_DISPLAY_VERBOSE # define OLED_DISPLAY_VERBOSE
# define OLED_RENDER_KEYLOGGER "Keylogger: " # define OLED_RENDER_KEYLOGGER "Keylogger: "
# ifndef OLED_KEYLOGGER_LENGTH # ifndef OLED_KEYLOGGER_LENGTH
# define OLED_KEYLOGGER_LENGTH 9 # define OLED_KEYLOGGER_LENGTH 9
# endif # endif
# define OLED_RENDER_LAYOUT_NAME "Layout: " # define OLED_RENDER_LAYOUT_NAME "Layout: "
# define OLED_RENDER_LAYOUT_QWERTY "Qwerty" # define OLED_RENDER_LAYOUT_QWERTY "Qwerty"
# define OLED_RENDER_LAYOUT_COLEMAK_DH "Colemak DH" # define OLED_RENDER_LAYOUT_COLEMAK_DH "Colemak DH"
# define OLED_RENDER_LAYOUT_COLEMAK "Colemak" # define OLED_RENDER_LAYOUT_COLEMAK "Colemak"
# define OLED_RENDER_LAYOUT_DVORAK "Dvorak" # define OLED_RENDER_LAYOUT_DVORAK "Dvorak"
# define OLED_RENDER_LAYOUT_WORKMAN "Workman" # define OLED_RENDER_LAYOUT_WORKMAN "Workman"
# define OLED_RENDER_LAYOUT_NORMAN "Norman" # define OLED_RENDER_LAYOUT_NORMAN "Norman"
# define OLED_RENDER_LAYOUT_MALTRON "Matron" # define OLED_RENDER_LAYOUT_MALTRON "Matron"
# define OLED_RENDER_LAYOUT_EUCALYN "Eucalyn" # define OLED_RENDER_LAYOUT_EUCALYN "Eucalyn"
# define OLED_RENDER_LAYOUT_CARPLAX "Carplax" # define OLED_RENDER_LAYOUT_CARPLAX "Carplax"
# define OLED_RENDER_LAYER_NAME "Layer:" # define OLED_RENDER_LAYER_NAME "Layer:"
# define OLED_RENDER_LAYER_LOWER "Lower" # define OLED_RENDER_LAYER_LOWER "Lower"
# define OLED_RENDER_LAYER_RAISE "Raise" # define OLED_RENDER_LAYER_RAISE "Raise"
# define OLED_RENDER_LAYER_ADJUST "Adjust" # define OLED_RENDER_LAYER_ADJUST "Adjust"
# define OLED_RENDER_LAYER_MODS "Mods" # define OLED_RENDER_LAYER_MODS "Mods"
# define OLED_RENDER_LOCK_NAME "Lock: " # define OLED_RENDER_LOCK_NAME "Lock: "
# define OLED_RENDER_LOCK_NUML "NUM" # define OLED_RENDER_LOCK_NUML "NUM"
# define OLED_RENDER_LOCK_CAPS "CAPS" # define OLED_RENDER_LOCK_CAPS "CAPS"
# define OLED_RENDER_LOCK_SCLK "SCLK" # define OLED_RENDER_LOCK_SCLK "SCLK"
# define OLED_RENDER_MODS_NAME "Mods" # define OLED_RENDER_MODS_NAME "Mods"
# define OLED_RENDER_MODS_SFT "Sft" # define OLED_RENDER_MODS_SFT "Sft"
# define OLED_RENDER_MODS_CTL "Ctl" # define OLED_RENDER_MODS_CTL "Ctl"
# define OLED_RENDER_MODS_ALT "Alt" # define OLED_RENDER_MODS_ALT "Alt"
# define OLED_RENDER_MODS_GUI "GUI" # define OLED_RENDER_MODS_GUI "GUI"
# define OLED_RENDER_BOOTMAGIC_NAME "Boot " # define OLED_RENDER_BOOTMAGIC_NAME "Boot "
# define OLED_RENDER_BOOTMAGIC_NKRO "NKRO" # define OLED_RENDER_BOOTMAGIC_NKRO "NKRO"
# define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI" # define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI"
# define OLED_RENDER_BOOTMAGIC_GRV "GRV" # define OLED_RENDER_BOOTMAGIC_GRV "GRV"
# define OLED_RENDER_BOOTMAGIC_ONESHOT "1SHT" # define OLED_RENDER_BOOTMAGIC_ONESHOT "1SHT"
# define OLED_RENDER_BOOTMAGIC_SWAP "SWAP" # define OLED_RENDER_BOOTMAGIC_SWAP "SWAP"
# define OLED_RENDER_BOOTMAGIC_CAPS "CAPS" # define OLED_RENDER_BOOTMAGIC_CAPS "CAPS"
# define OLED_RENDER_USER_NAME "USER:" # define OLED_RENDER_USER_NAME "USER:"
# define OLED_RENDER_USER_ANIM "Anim" # define OLED_RENDER_USER_ANIM "Anim"
# define OLED_RENDER_USER_LAYR "Layr" # define OLED_RENDER_USER_LAYR "Layr"
# define OLED_RENDER_USER_NUKE "Nuke" # define OLED_RENDER_USER_NUKE "Nuke"
# define OLED_RENDER_WPM_COUNTER "WPM: " # define OLED_RENDER_WPM_COUNTER "WPM: "
#else #else
# define OLED_RENDER_KEYLOGGER "KLogr" # define OLED_RENDER_KEYLOGGER "KLogr"
# ifndef OLED_KEYLOGGER_LENGTH # ifndef OLED_KEYLOGGER_LENGTH
# define OLED_KEYLOGGER_LENGTH 5 # define OLED_KEYLOGGER_LENGTH 5
# endif # endif
# define OLED_RENDER_LAYOUT_NAME "Lyout" # define OLED_RENDER_LAYOUT_NAME "Lyout"
# define OLED_RENDER_LAYOUT_QWERTY " QRTY" # define OLED_RENDER_LAYOUT_QWERTY " QRTY"
# define OLED_RENDER_LAYOUT_COLEMAK_DH " cmDH" # define OLED_RENDER_LAYOUT_COLEMAK_DH " cmDH"
# define OLED_RENDER_LAYOUT_COLEMAK " COLE" # define OLED_RENDER_LAYOUT_COLEMAK " COLE"
# define OLED_RENDER_LAYOUT_DVORAK " DVRK" # define OLED_RENDER_LAYOUT_DVORAK " DVRK"
# define OLED_RENDER_LAYOUT_WORKMAN " WKMN" # define OLED_RENDER_LAYOUT_WORKMAN " WKMN"
# define OLED_RENDER_LAYOUT_NORMAN " NORM" # define OLED_RENDER_LAYOUT_NORMAN " NORM"
# define OLED_RENDER_LAYOUT_MALTRON " MLTN" # define OLED_RENDER_LAYOUT_MALTRON " MLTN"
# define OLED_RENDER_LAYOUT_EUCALYN " ECLN" # define OLED_RENDER_LAYOUT_EUCALYN " ECLN"
# define OLED_RENDER_LAYOUT_CARPLAX " CRPX" # define OLED_RENDER_LAYOUT_CARPLAX " CRPX"
# define OLED_RENDER_LAYER_NAME "LAYER" # define OLED_RENDER_LAYER_NAME "LAYER"
# define OLED_RENDER_LAYER_LOWER "Lower" # define OLED_RENDER_LAYER_LOWER "Lower"
# define OLED_RENDER_LAYER_RAISE "Raise" # define OLED_RENDER_LAYER_RAISE "Raise"
# define OLED_RENDER_LAYER_ADJUST "Adjst" # define OLED_RENDER_LAYER_ADJUST "Adjst"
# define OLED_RENDER_LAYER_MODS " Mods" # define OLED_RENDER_LAYER_MODS " Mods"
# define OLED_RENDER_LOCK_NAME "Lock:" # define OLED_RENDER_LOCK_NAME "Lock:"
# define OLED_RENDER_LOCK_NUML "NumL" # define OLED_RENDER_LOCK_NUML "NumL"
# define OLED_RENDER_LOCK_CAPS "CapL" # define OLED_RENDER_LOCK_CAPS "CapL"
# define OLED_RENDER_LOCK_SCLK "ScrL" # define OLED_RENDER_LOCK_SCLK "ScrL"
# define OLED_RENDER_MODS_NAME "Mods: " # define OLED_RENDER_MODS_NAME "Mods: "
# define OLED_RENDER_MODS_SFT "Shft" # define OLED_RENDER_MODS_SFT "Shft"
# define OLED_RENDER_MODS_CTL "Ctrl" # define OLED_RENDER_MODS_CTL "Ctrl"
# define OLED_RENDER_MODS_ALT "Alt\n" # define OLED_RENDER_MODS_ALT "Alt\n"
# define OLED_RENDER_MODS_GUI "GUI\n" # define OLED_RENDER_MODS_GUI "GUI\n"
# define OLED_RENDER_BOOTMAGIC_NAME "BTMGK" # define OLED_RENDER_BOOTMAGIC_NAME "BTMGK"
# define OLED_RENDER_BOOTMAGIC_NKRO "NKRO" # define OLED_RENDER_BOOTMAGIC_NKRO "NKRO"
# define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI" # define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI"
# define OLED_RENDER_BOOTMAGIC_GRV "GRV" # define OLED_RENDER_BOOTMAGIC_GRV "GRV"
# define OLED_RENDER_BOOTMAGIC_ONESHOT "1SHT" # define OLED_RENDER_BOOTMAGIC_ONESHOT "1SHT"
# define OLED_RENDER_BOOTMAGIC_SWAP "SWAP" # define OLED_RENDER_BOOTMAGIC_SWAP "SWAP"
# define OLED_RENDER_BOOTMAGIC_CAPS "CAPS" # define OLED_RENDER_BOOTMAGIC_CAPS "CAPS"
# define OLED_RENDER_USER_NAME "USER:" # define OLED_RENDER_USER_NAME "USER:"
# define OLED_RENDER_USER_ANIM "Anim" # define OLED_RENDER_USER_ANIM "Anim"
# define OLED_RENDER_USER_LAYR "Layr" # define OLED_RENDER_USER_LAYR "Layr"
# define OLED_RENDER_USER_NUKE "Nuke" # define OLED_RENDER_USER_NUKE "Nuke"
# define OLED_RENDER_WPM_COUNTER "WPM: " # define OLED_RENDER_WPM_COUNTER "WPM: "
#endif #endif
extern char keylog_str[OLED_KEYLOGGER_LENGTH];
extern char keylog_str[OLED_KEYLOGGER_LENGTH];
#ifndef OLED_WPM_GRAPH_MAX_WPM #ifndef OLED_WPM_GRAPH_MAX_WPM
# define OLED_WPM_GRAPH_MAX_WPM 120 # define OLED_WPM_GRAPH_MAX_WPM 120

View file

@ -52,7 +52,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define PAGE_ADDR 0x22 #define PAGE_ADDR 0x22
#define PAM_SETCOLUMN_LSB 0x00 #define PAM_SETCOLUMN_LSB 0x00
#define PAM_SETCOLUMN_MSB 0x10 #define PAM_SETCOLUMN_MSB 0x10
#define PAM_PAGE_ADDR 0xB0 // 0xb0 -- 0xb7 #define PAM_PAGE_ADDR 0xB0 // 0xb0 -- 0xb7
// Hardware Configuration Commands // Hardware Configuration Commands
#define DISPLAY_START_LINE 0x40 #define DISPLAY_START_LINE 0x40
@ -109,9 +109,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define I2C_DATA 0x40 #define I2C_DATA 0x40
#if defined(__AVR__) #if defined(__AVR__)
# define I2C_TRANSMIT_P(data) i2c_transmit_P((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT) # define I2C_TRANSMIT_P(data) i2c_transmit_P((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT)
#else // defined(__AVR__) #else // defined(__AVR__)
# define I2C_TRANSMIT_P(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT) # define I2C_TRANSMIT_P(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT)
#endif // defined(__AVR__) #endif // defined(__AVR__)
#define I2C_TRANSMIT(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT) #define I2C_TRANSMIT(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT)
#define I2C_WRITE_REG(mode, data, size) i2c_writeReg((OLED_DISPLAY_ADDRESS << 1), mode, data, size, OLED_I2C_TIMEOUT) #define I2C_WRITE_REG(mode, data, size) i2c_writeReg((OLED_DISPLAY_ADDRESS << 1), mode, data, size, OLED_I2C_TIMEOUT)
@ -122,7 +122,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// parts of the display unusable or don't get cleared correctly // parts of the display unusable or don't get cleared correctly
// and also allows for drawing & inverting // and also allows for drawing & inverting
uint8_t oled_buffer[OLED_MATRIX_SIZE]; uint8_t oled_buffer[OLED_MATRIX_SIZE];
uint8_t * oled_cursor; uint8_t *oled_cursor;
OLED_BLOCK_TYPE oled_dirty = 0; OLED_BLOCK_TYPE oled_dirty = 0;
bool oled_initialized = false; bool oled_initialized = false;
bool oled_active = false; bool oled_active = false;
@ -131,7 +131,7 @@ bool oled_inverted = false;
uint8_t oled_brightness = OLED_BRIGHTNESS; uint8_t oled_brightness = OLED_BRIGHTNESS;
oled_rotation_t oled_rotation = 0; oled_rotation_t oled_rotation = 0;
uint8_t oled_rotation_width = 0; uint8_t oled_rotation_width = 0;
uint8_t oled_scroll_speed = 0; // this holds the speed after being remapped to ssd1306 internal values uint8_t oled_scroll_speed = 0; // this holds the speed after being remapped to ssd1306 internal values
uint8_t oled_scroll_start = 0; uint8_t oled_scroll_start = 0;
uint8_t oled_scroll_end = 7; uint8_t oled_scroll_end = 7;
#if OLED_TIMEOUT > 0 #if OLED_TIMEOUT > 0
@ -261,8 +261,12 @@ bool oled_init(oled_rotation_t rotation) {
return true; return true;
} }
__attribute__((weak)) oled_rotation_t oled_init_kb(oled_rotation_t rotation) { return rotation; } __attribute__((weak)) oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
__attribute__((weak)) oled_rotation_t oled_init_user(oled_rotation_t rotation) { return rotation; } return rotation;
}
__attribute__((weak)) oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return rotation;
}
void oled_clear(void) { void oled_clear(void) {
memset(oled_buffer, 0, sizeof(oled_buffer)); memset(oled_buffer, 0, sizeof(oled_buffer));
@ -299,9 +303,9 @@ static void calc_bounds_90(uint8_t update_start, uint8_t *cmd_array) {
// Only the Page Addressing Mode is supported // Only the Page Addressing Mode is supported
uint8_t start_page = bottom_block_top_page - (OLED_BLOCK_SIZE * update_start % OLED_DISPLAY_HEIGHT / 8); uint8_t start_page = bottom_block_top_page - (OLED_BLOCK_SIZE * update_start % OLED_DISPLAY_HEIGHT / 8);
uint8_t start_column = OLED_BLOCK_SIZE * update_start / OLED_DISPLAY_HEIGHT * 8; uint8_t start_column = OLED_BLOCK_SIZE * update_start / OLED_DISPLAY_HEIGHT * 8;
cmd_array[0] = PAM_PAGE_ADDR | start_page; cmd_array[0] = PAM_PAGE_ADDR | start_page;
cmd_array[1] = PAM_SETCOLUMN_LSB | ((OLED_COLUMN_OFFSET + start_column) & 0x0f); cmd_array[1] = PAM_SETCOLUMN_LSB | ((OLED_COLUMN_OFFSET + start_column) & 0x0f);
cmd_array[2] = PAM_SETCOLUMN_MSB | ((OLED_COLUMN_OFFSET + start_column) >> 4 & 0x0f); cmd_array[2] = PAM_SETCOLUMN_MSB | ((OLED_COLUMN_OFFSET + start_column) >> 4 & 0x0f);
} }
uint8_t crot(uint8_t a, int8_t n) { uint8_t crot(uint8_t a, int8_t n) {
@ -339,9 +343,9 @@ void oled_render(void) {
// Set column & page position // Set column & page position
static uint8_t display_start[] = {I2C_CMD, PAM_PAGE_ADDR, PAM_SETCOLUMN_LSB, PAM_SETCOLUMN_MSB}; static uint8_t display_start[] = {I2C_CMD, PAM_PAGE_ADDR, PAM_SETCOLUMN_LSB, PAM_SETCOLUMN_MSB};
if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_90)) { if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_90)) {
calc_bounds(update_start, &display_start[1]); // Offset from I2C_CMD byte at the start calc_bounds(update_start, &display_start[1]); // Offset from I2C_CMD byte at the start
} else { } else {
calc_bounds_90(update_start, &display_start[1]); // Offset from I2C_CMD byte at the start calc_bounds_90(update_start, &display_start[1]); // Offset from I2C_CMD byte at the start
} }
// Send column & page position // Send column & page position
@ -369,7 +373,7 @@ void oled_render(void) {
// For SH1106 or SH1107 the data chunk must be split into separate pieces for each page // For SH1106 or SH1107 the data chunk must be split into separate pieces for each page
const uint8_t columns_in_block = (OLED_BLOCK_SIZE + OLED_DISPLAY_HEIGHT - 1) / OLED_DISPLAY_HEIGHT * 8; const uint8_t columns_in_block = (OLED_BLOCK_SIZE + OLED_DISPLAY_HEIGHT - 1) / OLED_DISPLAY_HEIGHT * 8;
const uint8_t num_pages = OLED_BLOCK_SIZE / columns_in_block; const uint8_t num_pages = OLED_BLOCK_SIZE / columns_in_block;
for (uint8_t i = 0; i < num_pages; ++i) { for (uint8_t i = 0; i < num_pages; ++i) {
// Send column & page position for all pages except the first one // Send column & page position for all pages except the first one
if (i > 0) { if (i > 0) {
@ -414,7 +418,8 @@ void oled_advance_page(bool clearPageRemainder) {
remaining = remaining / OLED_FONT_WIDTH; remaining = remaining / OLED_FONT_WIDTH;
// Write empty character until next line // Write empty character until next line
while (remaining--) oled_write_char(' ', false); while (remaining--)
oled_write_char(' ', false);
} else { } else {
// Next page index out of bounds? // Next page index out of bounds?
if (index + remaining >= OLED_MATRIX_SIZE) { if (index + remaining >= OLED_MATRIX_SIZE) {
@ -465,7 +470,7 @@ void oled_write_char(const char data, bool invert) {
_Static_assert(sizeof(font) >= ((OLED_FONT_END + 1 - OLED_FONT_START) * OLED_FONT_WIDTH), "OLED_FONT_END references outside array"); _Static_assert(sizeof(font) >= ((OLED_FONT_END + 1 - OLED_FONT_START) * OLED_FONT_WIDTH), "OLED_FONT_END references outside array");
// set the reder buffer data // set the reder buffer data
uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index
if (cast_data < OLED_FONT_START || cast_data > OLED_FONT_END) { if (cast_data < OLED_FONT_START || cast_data > OLED_FONT_END) {
memset(oled_cursor, 0x00, OLED_FONT_WIDTH); memset(oled_cursor, 0x00, OLED_FONT_WIDTH);
} else { } else {
@ -610,7 +615,7 @@ void oled_write_raw_P(const char *data, uint16_t size) {
oled_dirty |= ((OLED_BLOCK_TYPE)1 << (i / OLED_BLOCK_SIZE)); oled_dirty |= ((OLED_BLOCK_TYPE)1 << (i / OLED_BLOCK_SIZE));
} }
} }
#endif // defined(__AVR__) #endif // defined(__AVR__)
bool oled_on(void) { bool oled_on(void) {
if (!oled_initialized) { if (!oled_initialized) {
@ -660,7 +665,9 @@ bool oled_off(void) {
return !oled_active; return !oled_active;
} }
bool is_oled_on(void) { return oled_active; } bool is_oled_on(void) {
return oled_active;
}
uint8_t oled_set_brightness(uint8_t level) { uint8_t oled_set_brightness(uint8_t level) {
if (!oled_initialized) { if (!oled_initialized) {
@ -678,7 +685,9 @@ uint8_t oled_set_brightness(uint8_t level) {
return oled_brightness; return oled_brightness;
} }
uint8_t oled_get_brightness(void) { return oled_brightness; } uint8_t oled_get_brightness(void) {
return oled_brightness;
}
// Set the specific 8 lines rows of the screen to scroll. // Set the specific 8 lines rows of the screen to scroll.
// 0 is the default for start, and 7 for end, which is the entire // 0 is the default for start, and 7 for end, which is the entire
@ -758,7 +767,9 @@ bool oled_scroll_off(void) {
return !oled_scrolling; return !oled_scrolling;
} }
bool is_oled_scrolling(void) { return oled_scrolling; } bool is_oled_scrolling(void) {
return oled_scrolling;
}
bool oled_invert(bool invert) { bool oled_invert(bool invert) {
if (!oled_initialized) { if (!oled_initialized) {
@ -842,6 +853,9 @@ void oled_task(void) {
#endif #endif
} }
__attribute__((weak)) bool oled_task_kb(void) {
__attribute__((weak)) bool oled_task_kb(void) { return oled_task_user(); } return oled_task_user();
__attribute__((weak)) bool oled_task_user(void) { return true; } }
__attribute__((weak)) bool oled_task_user(void) {
return true;
}

View file

@ -15,7 +15,7 @@ void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode
} }
switch (mode) { switch (mode) {
case 1: // breathing case 1: // breathing
{ {
uint16_t time = scale16by8(g_rgb_timer, speed / 8); uint16_t time = scale16by8(g_rgb_timer, speed / 8);
hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v); hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
@ -27,7 +27,7 @@ void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode
} }
break; break;
} }
default: // Solid Color default: // Solid Color
{ {
RGB rgb = hsv_to_rgb(hsv); RGB rgb = hsv_to_rgb(hsv);
for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
@ -59,6 +59,8 @@ void keyboard_post_init_rgb_matrix(void) {
#endif #endif
if (userspace_config.rgb_layer_change) { if (userspace_config.rgb_layer_change) {
rgb_matrix_set_flags(LED_FLAG_UNDERGLOW | LED_FLAG_KEYLIGHT | LED_FLAG_INDICATOR); rgb_matrix_set_flags(LED_FLAG_UNDERGLOW | LED_FLAG_KEYLIGHT | LED_FLAG_INDICATOR);
} else {
rgb_matrix_set_flags(LED_FLAG_ALL);
} }
} }
@ -70,7 +72,7 @@ bool process_record_user_rgb_matrix(uint16_t keycode, keyrecord_t *record) {
} }
#endif #endif
switch (keycode) { switch (keycode) {
case RGB_IDL: // This allows me to use underglow as layer indication, or as normal case RGB_IDL: // This allows me to use underglow as layer indication, or as normal
#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
if (record->event.pressed) { if (record->event.pressed) {
userspace_config.rgb_matrix_idle_anim ^= 1; userspace_config.rgb_matrix_idle_anim ^= 1;
@ -86,9 +88,13 @@ bool process_record_user_rgb_matrix(uint16_t keycode, keyrecord_t *record) {
return true; return true;
} }
__attribute__((weak)) bool rgb_matrix_indicators_advanced_keymap(uint8_t led_min, uint8_t led_max) { return true; } __attribute__((weak)) bool rgb_matrix_indicators_advanced_keymap(uint8_t led_min, uint8_t led_max) {
void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { return true;
if (!rgb_matrix_indicators_advanced_keymap(led_min, led_max)) { return; } }
void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
if (!rgb_matrix_indicators_advanced_keymap(led_min, led_max)) {
return;
}
#if defined(RGBLIGHT_ENABLE) #if defined(RGBLIGHT_ENABLE)
if (!userspace_config.rgb_layer_change) if (!userspace_config.rgb_layer_change)
@ -96,19 +102,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min,
if (userspace_config.rgb_layer_change) if (userspace_config.rgb_layer_change)
#endif #endif
{ {
switch (get_highest_layer(layer_state | default_layer_state)) { switch (get_highest_layer(layer_state & ~((layer_state_t)1 << _MOUSE))) {
case _DEFAULT_LAYER_1:
rgb_matrix_layer_helper(DEFAULT_LAYER_1_HSV, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
break;
case _DEFAULT_LAYER_2:
rgb_matrix_layer_helper(DEFAULT_LAYER_2_HSV, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
break;
case _DEFAULT_LAYER_3:
rgb_matrix_layer_helper(DEFAULT_LAYER_3_HSV, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
break;
case _DEFAULT_LAYER_4:
rgb_matrix_layer_helper(DEFAULT_LAYER_4_HSV, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
break;
case _GAMEPAD: case _GAMEPAD:
rgb_matrix_layer_helper(HSV_ORANGE, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max); rgb_matrix_layer_helper(HSV_ORANGE, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
break; break;
@ -124,9 +118,33 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min,
case _ADJUST: case _ADJUST:
rgb_matrix_layer_helper(HSV_RED, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max); rgb_matrix_layer_helper(HSV_RED, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
break; break;
default:
if (layer_state_is(_MOUSE)) {
rgb_matrix_layer_helper(HSV_PURPLE, 1, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
} else {
switch (get_highest_layer(default_layer_state)) {
case _DEFAULT_LAYER_1:
rgb_matrix_layer_helper(DEFAULT_LAYER_1_HSV, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
break;
case _DEFAULT_LAYER_2:
rgb_matrix_layer_helper(DEFAULT_LAYER_2_HSV, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
break;
case _DEFAULT_LAYER_3:
rgb_matrix_layer_helper(DEFAULT_LAYER_3_HSV, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
break;
case _DEFAULT_LAYER_4:
rgb_matrix_layer_helper(DEFAULT_LAYER_4_HSV, 0, rgb_matrix_config.speed, LED_FLAG_MODIFIER, led_min, led_max);
break;
}
}
break;
} }
} }
} }
__attribute__((weak)) bool rgb_matrix_indicators_keymap(void) { return true; } __attribute__((weak)) bool rgb_matrix_indicators_keymap(void) {
void rgb_matrix_indicators_user(void) { rgb_matrix_indicators_keymap(); } return true;
}
void rgb_matrix_indicators_user(void) {
rgb_matrix_indicators_keymap();
}

View file

@ -1,28 +1,30 @@
// Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com> // Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#ifdef RGBLIGHT_ENABLE #include "drashna.h"
#include "rgb_stuff.h"
# include "drashna.h" #include "eeprom.h"
# include "rgb_stuff.h"
# include "eeprom.h"
bool has_initialized; bool has_initialized;
void rgblight_sethsv_default_helper(uint8_t index) { rgblight_sethsv_at(rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val(), index); } void rgblight_sethsv_default_helper(uint8_t index) {
rgblight_sethsv_at(rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val(), index);
}
void rgblight_set_hsv_and_mode(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode) { void rgblight_set_hsv_and_mode(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode) {
rgblight_sethsv_noeeprom(hue, sat, val); rgblight_sethsv_noeeprom(hue, sat, val);
// wait_us(175); // Add a slight delay between color and mode to ensure it's processed correctly // wait_us(175); // Add a slight delay between color and mode to ensure it's processed correctly
rgblight_mode_noeeprom(mode); rgblight_mode_noeeprom(mode);
} }
bool process_record_user_rgb_light(uint16_t keycode, keyrecord_t *record) { return true; } bool process_record_user_rgb_light(uint16_t keycode, keyrecord_t *record) {
return true;
}
# if defined(RGBLIGHT_STARTUP_ANIMATION) #if defined(RGBLIGHT_STARTUP_ANIMATION)
static bool is_enabled; static bool is_enabled;
static bool is_rgblight_startup; static bool is_rgblight_startup;
static HSV old_hsv; static HSV old_hsv;
static uint8_t old_mode; static uint8_t old_mode;
deferred_token rgb_startup_token; deferred_token rgb_startup_token;
uint32_t rgb_startup_animation(uint32_t triger_time, void *cb_arg) { uint32_t rgb_startup_animation(uint32_t triger_time, void *cb_arg) {
@ -44,10 +46,10 @@ uint32_t rgb_startup_animation(uint32_t triger_time, void *cb_arg) {
} }
return is_rgblight_startup ? 10 : 0; return is_rgblight_startup ? 10 : 0;
} }
# endif #endif
void keyboard_post_init_rgb_light(void) { void keyboard_post_init_rgb_light(void) {
# if defined(RGBLIGHT_STARTUP_ANIMATION) #if defined(RGBLIGHT_STARTUP_ANIMATION)
is_enabled = rgblight_is_enabled(); is_enabled = rgblight_is_enabled();
if (userspace_config.rgb_layer_change) { if (userspace_config.rgb_layer_change) {
layer_state_set_rgb_light(layer_state); layer_state_set_rgb_light(layer_state);
@ -56,27 +58,17 @@ void keyboard_post_init_rgb_light(void) {
old_mode = rgblight_get_mode(); old_mode = rgblight_get_mode();
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
is_rgblight_startup = true; is_rgblight_startup = true;
rgb_startup_token = defer_exec(300, rgb_startup_animation, NULL); rgb_startup_token = defer_exec(300, rgb_startup_animation, NULL);
# endif #endif
if (userspace_config.rgb_layer_change) { if (userspace_config.rgb_layer_change) {
layer_state_set_rgb_light(layer_state); layer_state_set_rgb_light(layer_state);
} }
} }
layer_state_t layer_state_set_rgb_light(layer_state_t state) { layer_state_t layer_state_set_rgb_light(layer_state_t state) {
# ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
if (userspace_config.rgb_layer_change) { if (userspace_config.rgb_layer_change) {
switch (get_highest_layer(state | default_layer_state)) { switch (get_highest_layer(state & ~((layer_state_t)1 << _MOUSE))) {
case _MOUSE: // mouse
if (!layer_state_cmp(state, _GAMEPAD) && !layer_state_cmp(state, _DIABLO)) {
# if defined(RGBLIGHT_EFFECT_TWINKLE)
rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_TWINKLE + 5);
# else
rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_BREATHING + 3);
# endif
}
break;
case _MEDIA: case _MEDIA:
rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_KNIGHT + 1); rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_KNIGHT + 1);
break; break;
@ -84,6 +76,7 @@ layer_state_t layer_state_set_rgb_light(layer_state_t state) {
rgblight_set_hsv_and_mode(HSV_ORANGE, RGBLIGHT_MODE_SNAKE + 2); rgblight_set_hsv_and_mode(HSV_ORANGE, RGBLIGHT_MODE_SNAKE + 2);
break; break;
case _DIABLO: case _DIABLO:
case _DIABLOII:
rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_BREATHING + 3); rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_BREATHING + 3);
break; break;
case _RAISE: case _RAISE:
@ -95,23 +88,36 @@ layer_state_t layer_state_set_rgb_light(layer_state_t state) {
case _ADJUST: case _ADJUST:
rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_KNIGHT + 2); rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_KNIGHT + 2);
break; break;
case _DEFAULT_LAYER_1: default:
rgblight_set_hsv_and_mode(DEFAULT_LAYER_1_HSV, RGBLIGHT_MODE_STATIC_LIGHT); if (layer_state_cmp(state, _MOUSE)) {
break; # if defined(RGBLIGHT_EFFECT_TWINKLE)
case _DEFAULT_LAYER_2: rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_TWINKLE + 5);
rgblight_set_hsv_and_mode(DEFAULT_LAYER_2_HSV, RGBLIGHT_MODE_STATIC_LIGHT); # else
break; rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_BREATHING + 3);
case _DEFAULT_LAYER_3: # endif
rgblight_set_hsv_and_mode(DEFAULT_LAYER_3_HSV, RGBLIGHT_MODE_STATIC_LIGHT); } else {
break; default_layer_state_set_rgb_light(default_layer_state);
case _DEFAULT_LAYER_4: }
rgblight_set_hsv_and_mode(DEFAULT_LAYER_4_HSV, RGBLIGHT_MODE_STATIC_LIGHT);
break;
} }
#endif // RGBLIGHT_ENABLE
} }
# endif // RGBLIGHT_ENABLE
return state; return state;
} }
#endif layer_state_t default_layer_state_set_rgb_light(layer_state_t state) {
switch (get_highest_layer(state)) {
case _DEFAULT_LAYER_1:
rgblight_set_hsv_and_mode(DEFAULT_LAYER_1_HSV, RGBLIGHT_MODE_STATIC_LIGHT);
break;
case _DEFAULT_LAYER_2:
rgblight_set_hsv_and_mode(DEFAULT_LAYER_2_HSV, RGBLIGHT_MODE_STATIC_LIGHT);
break;
case _DEFAULT_LAYER_3:
rgblight_set_hsv_and_mode(DEFAULT_LAYER_3_HSV, RGBLIGHT_MODE_STATIC_LIGHT);
break;
case _DEFAULT_LAYER_4:
rgblight_set_hsv_and_mode(DEFAULT_LAYER_4_HSV, RGBLIGHT_MODE_STATIC_LIGHT);
break;
}
return state;
}

View file

@ -3,6 +3,8 @@ SRC += $(USER_PATH)/drashna.c \
$(USER_PATH)/keyrecords/process_records.c \ $(USER_PATH)/keyrecords/process_records.c \
$(USER_PATH)/keyrecords/tapping.c $(USER_PATH)/keyrecords/tapping.c
# TOP_SYMBOLS = yes
ifneq ($(PLATFORM),CHIBIOS) ifneq ($(PLATFORM),CHIBIOS)
ifneq ($(strip $(LTO_SUPPORTED)), no) ifneq ($(strip $(LTO_SUPPORTED)), no)
LTO_ENABLE = yes LTO_ENABLE = yes
@ -15,6 +17,7 @@ GRAVE_ESC_ENABLE = no
ifneq ($(strip $(NO_SECRETS)), yes) ifneq ($(strip $(NO_SECRETS)), yes)
ifneq ("$(wildcard $(USER_PATH)/../../../qmk_secrets/secrets.c)","") ifneq ("$(wildcard $(USER_PATH)/../../../qmk_secrets/secrets.c)","")
SRC += $(USER_PATH)/../../../qmk_secrets/secrets.c SRC += $(USER_PATH)/../../../qmk_secrets/secrets.c
$(shell touch $(USER_PATH)/../../../qmk_secrets/secrets.c)
SECURE_ENABLE = yes SECURE_ENABLE = yes
endif endif
ifeq ($(strip $(NO_SECRETS)), lite) ifeq ($(strip $(NO_SECRETS)), lite)
@ -103,7 +106,6 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
ifeq ($(strip $(CUSTOM_POINTING_DEVICE)), yes) ifeq ($(strip $(CUSTOM_POINTING_DEVICE)), yes)
SRC += $(USER_PATH)/pointing/pointing.c SRC += $(USER_PATH)/pointing/pointing.c
OPT_DEFS += -DCUSTOM_POINTING_DEVICE OPT_DEFS += -DCUSTOM_POINTING_DEVICE
OPT_DEFS += -DMOUSE_EXT_REPORT
endif endif
endif endif
@ -119,5 +121,6 @@ endif
AUTOCORRECTION_ENABLE ?= no AUTOCORRECTION_ENABLE ?= no
ifeq ($(strip $(AUTOCORRECTION_ENABLE)), yes) ifeq ($(strip $(AUTOCORRECTION_ENABLE)), yes)
SRC += $(USER_PATH)/keyrecords/autocorrection/autocorrection.c SRC += $(USER_PATH)/keyrecords/autocorrection/autocorrection.c
$(shell touch $(USER_PATH)/keyrecords/autocorrection/autocorrection.c)
OPT_DEFS += -DAUTOCORRECTION_ENABLE OPT_DEFS += -DAUTOCORRECTION_ENABLE
endif endif

View file

@ -55,7 +55,9 @@ void user_config_sync(uint8_t initiator2target_buffer_size, const void* initiato
} }
#if defined(SPLIT_WATCHDOG_TIMEOUT) #if defined(SPLIT_WATCHDOG_TIMEOUT)
void watchdog_handler(uint8_t in_buflen, const void* in_data, uint8_t out_buflen, void* out_data) { watchdog_ping_done = true; } void watchdog_handler(uint8_t in_buflen, const void* in_data, uint8_t out_buflen, void* out_data) {
watchdog_ping_done = true;
}
#endif #endif
#ifdef CUSTOM_OLED_DRIVER #ifdef CUSTOM_OLED_DRIVER
@ -97,7 +99,7 @@ void user_transport_update(void) {
user_state.tap_toggling = tap_toggling; user_state.tap_toggling = tap_toggling;
#endif #endif
#ifdef UNICODE_COMMON_ENABLE #ifdef UNICODE_COMMON_ENABLE
user_state.unicode_mode = unicode_config.input_mode; user_state.unicode_mode = unicode_config.input_mode;
user_state.unicode_typing_mode = typing_mode; user_state.unicode_typing_mode = typing_mode;
#endif #endif
#ifdef SWAP_HANDS_ENABLE #ifdef SWAP_HANDS_ENABLE
@ -112,7 +114,7 @@ void user_transport_update(void) {
user_state.raw = transport_user_state; user_state.raw = transport_user_state;
#ifdef UNICODE_COMMON_ENABLE #ifdef UNICODE_COMMON_ENABLE
unicode_config.input_mode = user_state.unicode_mode; unicode_config.input_mode = user_state.unicode_mode;
typing_mode = user_state.unicode_typing_mode; typing_mode = user_state.unicode_typing_mode;
#endif #endif
#if defined(CUSTOM_POINTING_DEVICE) #if defined(CUSTOM_POINTING_DEVICE)
tap_toggling = user_state.tap_toggling; tap_toggling = user_state.tap_toggling;
@ -216,7 +218,7 @@ void user_transport_sync(void) {
if (timer_elapsed32(watchdog_timer) > 100) { if (timer_elapsed32(watchdog_timer) > 100) {
uint8_t any_data = 1; uint8_t any_data = 1;
if (transaction_rpc_send(RPC_ID_USER_WATCHDOG_SYNC, sizeof(any_data), &any_data)) { if (transaction_rpc_send(RPC_ID_USER_WATCHDOG_SYNC, sizeof(any_data), &any_data)) {
watchdog_ping_done = true; // successful ping watchdog_ping_done = true; // successful ping
} else { } else {
dprint("Watchdog ping failed!\n"); dprint("Watchdog ping failed!\n");
} }
@ -233,7 +235,7 @@ void user_transport_sync(void) {
#endif #endif
} }
void housekeeping_task_user(void) { void housekeeping_task_transport_sync(void) {
// Update kb_state so we can send to slave // Update kb_state so we can send to slave
user_transport_update(); user_transport_update();

View file

@ -12,16 +12,17 @@ extern char keylog_str[OLED_KEYLOGGER_LENGTH];
typedef union { typedef union {
uint32_t raw; uint32_t raw;
struct { struct {
bool audio_enable :1; bool audio_enable :1;
bool audio_clicky_enable :1; bool audio_clicky_enable :1;
bool tap_toggling :1; bool tap_toggling :1;
uint8_t unicode_mode :3; uint8_t unicode_mode :3;
bool swap_hands :1; bool swap_hands :1;
bool host_driver_disabled :1; bool host_driver_disabled :1;
uint8_t unicode_typing_mode :3; uint8_t unicode_typing_mode :3;
}; };
} user_runtime_config_t; } user_runtime_config_t;
extern user_runtime_config_t user_state; extern user_runtime_config_t user_state;
void keyboard_post_init_transport_sync(void); void keyboard_post_init_transport_sync(void);
void housekeeping_task_transport_sync(void);