@ -1,15 +1,5 @@
# include QMK_KEYBOARD_H
# include "drashna.h"
# ifdef PROTOCOL_LUFA
# include "lufa.h"
# include "split_util.h"
# endif
# ifdef SSD1306OLED
# include "ssd1306.h"
# endif
# ifdef OLED_DRIVER_ENABLE
# include "oled_driver.h"
# endif
extern keymap_config_t keymap_config ;
extern uint8_t is_master ;
@ -20,7 +10,7 @@ extern rgblight_config_t rgblight_config;
# endif
enum crkbd_keycodes {
RGBRST = NEW_SAFE_RANGE
RGBRST = NEW_SAFE_RANGE
} ;
# define LAYOUT_crkbd_base( \
@ -31,7 +21,7 @@ enum crkbd_keycodes {
LAYOUT_wrapper ( \
KC_ESC , K01 , K02 , K03 , K04 , K05 , K06 , K07 , K08 , K09 , K0A , KC_MINS , \
KC_TAB , ALT_T ( K11 ) , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19 , K1A , RGUI_T ( KC_QUOT ) , \
OS_LSFT , CTL_T ( K21 ) , K22 , K23 , K24 , K25 , K26 , K27 , K28 , K29 , CTL_T ( K2A ) , OS_RSFT , \
OS_LSFT , CTL_T ( K21 ) , K22 , K23 , K24 , K25 , K26 , K27 , K28 , K29 , R CTL_T( K2A ) , OS_RSFT , \
LT ( _LOWER , KC_GRV ) , KC_SPC , KC_BSPC , KC_DEL , KC_ENT , RAISE \
)
# define LAYOUT_crkbd_base_wrapper(...) LAYOUT_crkbd_base(__VA_ARGS__)
@ -115,35 +105,38 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
} ;
void matrix_init_keymap ( void ) {
/ / SSD1306 OLED init , make sure to add # define SSD1306OLED in config . h
# ifdef SSD1306OLED
iota_gfx_init ( ! has_usb ( ) ) ; / / turns on the display
# endif
# ifndef CONVERT_TO_PROTON_C
# ifndef CONVERT_TO_PROTON_C
setPinOutput ( D5 ) ;
writePinHigh ( D5 ) ;
setPinOutput ( B0 ) ;
writePinHigh ( B0 ) ;
# endif
# endif
}
/ / SSD1306 OLED update loop , make sure to add # define SSD1306OLED in config . h
# ifdef SSD1306OLED
/ / When add source files to SRC in rules . mk , you can use functions .
const char * read_logo ( void ) ;
char layer_state_str [ 24 ] ;
char modifier_state_str [ 24 ] ;
char host_led_state_str [ 24 ] ;
char keylog_str [ 24 ] = { } ;
char keylogs_str [ 21 ] = { } ;
int keylogs_str_idx = 0 ;
# ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user ( oled_rotation_t rotation ) {
if ( is_master ) {
return OLED_ROTATION_270 ;
} else {
return rotation ;
}
}
void render_crkbd_logo ( void ) {
static const char PROGMEM crkbd_logo [ ] = {
0x80 , 0x81 , 0x82 , 0x83 , 0x84 , 0x85 , 0x86 , 0x87 , 0x88 , 0x89 , 0x8a , 0x8b , 0x8c , 0x8d , 0x8e , 0x8f , 0x90 , 0x91 , 0x92 , 0x93 , 0x94 ,
0xa0 , 0xa1 , 0xa2 , 0xa3 , 0xa4 , 0xa5 , 0xa6 , 0xa7 , 0xa8 , 0xa9 , 0xaa , 0xab , 0xac , 0xad , 0xae , 0xaf , 0xb0 , 0xb1 , 0xb2 , 0xb3 , 0xb4 ,
0xc0 , 0xc1 , 0xc2 , 0xc3 , 0xc4 , 0xc5 , 0xc6 , 0xc7 , 0xc8 , 0xc9 , 0xca , 0xcb , 0xcc , 0xcd , 0xce , 0xcf , 0xd0 , 0xd1 , 0xd2 , 0xd3 , 0xd4 ,
0 } ;
oled_write_P ( crkbd_logo , false ) ;
}
/ / const char * read_mode_icon ( bool swap ) ;
/ / void set_timelog ( void ) ;
/ / const char * read_timelog ( void ) ;
# define KEYLOG_LEN (int)(32 / OLED_FONT_WIDTH)
char keylog_str [ KEYLOG_LEN ] = { } ;
uint8_t keylogs_str_idx = 0 ;
uint16_t log_timer = 0 ;
const char code_to_name [ 60 ] = {
' ' , ' ' , ' ' , ' ' , ' a ' , ' b ' , ' c ' , ' d ' , ' e ' , ' f ' ,
@ -153,261 +146,124 @@ const char code_to_name[60] = {
' R ' , ' E ' , ' B ' , ' T ' , ' _ ' , ' - ' , ' = ' , ' [ ' , ' ] ' , ' \\ ' ,
' # ' , ' ; ' , ' \' ' , ' ` ' , ' , ' , ' . ' , ' / ' , ' ' , ' ' , ' ' } ;
void set_keylog ( uint16_t keycode , keyrecord_t * record ) {
char name = ' ' ;
if ( ( keycode > = QK_MOD_TAP & & keycode < = QK_MOD_TAP_MAX ) | | ( keycode > = QK_LAYER_TAP & & keycode < = QK_LAYER_TAP_MAX ) ) { keycode = keycode & 0xFF ; }
if ( keycode < 60 ) {
name = code_to_name [ keycode ] ;
}
/ / update keylog
snprintf ( keylog_str , sizeof ( keylog_str ) , " %dx%d, k%2d : %c " ,
record - > event . key . row , record - > event . key . col ,
keycode , name ) ;
/ / update keylogs
if ( keylogs_str_idx = = sizeof ( keylogs_str ) - 1 ) {
keylogs_str_idx = 0 ;
for ( int i = 0 ; i < sizeof ( keylogs_str ) - 1 ; i + + ) {
keylogs_str [ i ] = ' ' ;
}
}
keylogs_str [ keylogs_str_idx ] = name ;
keylogs_str_idx + + ;
}
void add_keylog ( uint16_t keycode ) {
if ( ( keycode > = QK_MOD_TAP & & keycode < = QK_MOD_TAP_MAX ) | |
( keycode > = QK_LAYER_TAP & & keycode < = QK_LAYER_TAP_MAX ) ) { keycode = keycode & 0xFF ; }
const char * read_keylog ( void ) {
return keylog_str ;
for ( uint8_t i = KEYLOG_LEN - 1 ; i > 0 ; i - - ) {
keylog_str [ i ] = keylog_str [ i - 1 ] ;
}
if ( keycode < 60 ) {
keylog_str [ 0 ] = code_to_name [ keycode ] ;
}
log_timer = timer_read ( ) ;
}
const char * read_keylogs ( void ) {
return keylogs_str ;
void update_log ( void ) {
if ( timer_elapsed ( log_timer ) > 750 ) {
add_keylog ( 0 ) ;
}
}
const char * read_modifier_state ( void ) {
uint8_t modifiers = get_mods ( ) ;
uint8_t one_shot = get_oneshot_mods ( ) ;
snprintf ( modifier_state_str , sizeof ( modifier_state_str ) , " Mods:%s %s %s %s " ,
( modifiers & MOD_MASK_CTRL | | one_shot & MOD_MASK_CTRL ) ? " CTL " : " " ,
( modifiers & MOD_MASK_GUI | | one_shot & MOD_MASK_GUI ) ? " GUI " : " " ,
( modifiers & MOD_MASK_ALT | | one_shot & MOD_MASK_ALT ) ? " ALT " : " " ,
( modifiers & MOD_MASK_SHIFT | | one_shot & MOD_MASK_SHIFT ) ? " SFT " : " "
) ;
return modifier_state_str ;
bool process_record_keymap ( uint16_t keycode , keyrecord_t * record ) {
if ( record - > event . pressed ) { add_keylog ( keycode ) ; }
return true ;
}
const char * read_host_led_state ( void ) {
uint8_t leds = host_keyboard_leds ( ) ;
snprintf ( host_led_state_str , sizeof ( host_led_state_str ) , " NL:%s CL:%s SL:%s " ,
( leds & ( 1 < < USB_LED_NUM_LOCK ) ) ? " on " : " - " ,
( leds & ( 1 < < USB_LED_CAPS_LOCK ) ) ? " on " : " - " ,
( leds & ( 1 < < USB_LED_SCROLL_LOCK ) ) ? " on " : " - "
) ;
return host_led_state_str ;
}
void render_status ( void ) {
const char * read_layer_state ( void ) {
switch ( biton32 ( layer_state ) ) {
case _RAISE :
snprintf ( layer_state_str , sizeof ( layer_state_str ) , " Layer: Raise " ) ;
break ;
case _LOWER :
snprintf ( layer_state_str , sizeof ( layer_state_str ) , " Layer: Lower " ) ;
break ;
case _ADJUST :
snprintf ( layer_state_str , sizeof ( layer_state_str ) , " Layer: Adjust " ) ;
break ;
default :
switch ( biton32 ( default_layer_state ) ) {
oled_write_P ( PSTR ( " Layer " ) , false ) ;
switch ( biton32 ( layer_state ) ) {
case 0 :
oled_write_P ( PSTR ( " Base " ) , false ) ;
break ;
case _RAISE :
oled_write_P ( PSTR ( " Raise " ) , false ) ;
break ;
case _LOWER :
oled_write_P ( PSTR ( " Lower " ) , false ) ;
break ;
case _ADJUST :
oled_write_P ( PSTR ( " Adjst " ) , false ) ;
break ;
default :
oled_write_P ( PSTR ( " Unkn " ) , false ) ;
break ;
}
oled_write_P ( PSTR ( " Lyout " ) , false ) ;
switch ( biton32 ( default_layer_state ) ) {
case _QWERTY :
snprintf ( layer_state_str , sizeof ( layer_state_str ) , " Layer: Qwerty " ) ;
break ;
oled_write_P ( PSTR ( " QWRTY " ) , false ) ;
break ;
case _COLEMAK :
snprintf ( layer_state_str , sizeof ( layer_state_str ) , " Layer: Colemak " ) ;
break ;
oled_write_P ( PSTR ( " COLMK " ) , false ) ;
break ;
case _DVORAK :
snprintf ( layer_state_str , sizeof ( layer_state_str ) , " Layer: Dvorak " ) ;
break ;
oled_write_P ( PSTR ( " DVRAK " ) , false ) ;
break ;
case _WORKMAN :
snprintf ( layer_state_str , sizeof ( layer_state_str ) , " Layer: Workman " ) ;
break ;
}
break ;
}
return layer_state_str ;
}
void matrix_scan_keymap ( void ) {
iota_gfx_task ( ) ;
}
void matrix_render_user ( struct CharacterMatrix * matrix ) {
if ( is_master ) {
/ / If you want to change the display of OLED , you need to change here
matrix_write_ln ( matrix , read_layer_state ( ) ) ;
matrix_write_ln ( matrix , read_modifier_state ( ) ) ;
/ / matrix_write_ln ( matrix , read_keylog ( ) ) ;
matrix_write_ln ( matrix , read_keylogs ( ) ) ;
/ / matrix_write_ln ( matrix , read_mode_icon ( keymap_config . swap_lalt_lgui ) ) ;
/ / matrix_write ( matrix , read_host_led_state ( ) ) ;
/ / matrix_write_ln ( matrix , read_timelog ( ) ) ;
} else {
matrix_write ( matrix , read_logo ( ) ) ;
}
}
void matrix_update ( struct CharacterMatrix * dest , const struct CharacterMatrix * source ) {
if ( memcmp ( dest - > display , source - > display , sizeof ( dest - > display ) ) ) {
memcpy ( dest - > display , source - > display , sizeof ( dest - > display ) ) ;
dest - > dirty = true ;
}
}
void iota_gfx_task_user ( void ) {
struct CharacterMatrix matrix ;
matrix_clear ( & matrix ) ;
matrix_render_user ( & matrix ) ;
matrix_update ( & display , & matrix ) ;
}
bool process_record_keymap ( uint16_t keycode , keyrecord_t * record ) {
switch ( keycode ) {
case KC_A . . . KC_SLASH :
case KC_F1 . . . KC_F12 :
case KC_INSERT . . . KC_UP :
case KC_KP_SLASH . . . KC_KP_DOT :
case KC_F13 . . . KC_F24 :
if ( record - > event . pressed ) { set_keylog ( keycode , record ) ; }
break ;
/ / set_timelog ( ) ;
}
return true ;
}
oled_write_P ( PSTR ( " WRKMN " ) , false ) ;
break ;
case _NORMAN :
oled_write_P ( PSTR ( " NORMN " ) , false ) ;
break ;
case _MALTRON :
oled_write_P ( PSTR ( " MLTRN " ) , false ) ;
break ;
case _EUCALYN :
oled_write_P ( PSTR ( " ECLYN " ) , false ) ;
break ;
case _CARPLAX :
oled_write_P ( PSTR ( " CRPLX " ) , false ) ;
break ;
}
# endif
uint8_t modifiers = get_mods ( ) ;
uint8_t one_shot = get_oneshot_mods ( ) ;
oled_write_P ( PSTR ( " Mods: " ) , false ) ;
oled_write_P ( ( modifiers & MOD_MASK_SHIFT | | one_shot & MOD_MASK_SHIFT ) ? PSTR ( " SFT " ) : PSTR ( " " ) , false ) ;
oled_write_P ( ( modifiers & MOD_MASK_CTRL | | one_shot & MOD_MASK_CTRL ) ? PSTR ( " CTL " ) : PSTR ( " " ) , false ) ;
oled_write_P ( ( modifiers & MOD_MASK_ALT | | one_shot & MOD_MASK_ALT ) ? PSTR ( " ALT " ) : PSTR ( " " ) , false ) ;
oled_write_P ( ( modifiers & MOD_MASK_GUI | | one_shot & MOD_MASK_GUI ) ? PSTR ( " GUI " ) : PSTR ( " " ) , false ) ;
# ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user ( oled_rotation_t rotation ) {
if ( is_master ) {
return OLED_ROTATION_270 ;
} else {
return rotation ;
}
}
void render_crkbd_logo ( void ) {
static const char PROGMEM crkbd_logo [ ] = {
0x80 , 0x81 , 0x82 , 0x83 , 0x84 , 0x85 , 0x86 , 0x87 , 0x88 , 0x89 , 0x8a , 0x8b , 0x8c , 0x8d , 0x8e , 0x8f , 0x90 , 0x91 , 0x92 , 0x93 , 0x94 ,
0xa0 , 0xa1 , 0xa2 , 0xa3 , 0xa4 , 0xa5 , 0xa6 , 0xa7 , 0xa8 , 0xa9 , 0xaa , 0xab , 0xac , 0xad , 0xae , 0xaf , 0xb0 , 0xb1 , 0xb2 , 0xb3 , 0xb4 ,
0xc0 , 0xc1 , 0xc2 , 0xc3 , 0xc4 , 0xc5 , 0xc6 , 0xc7 , 0xc8 , 0xc9 , 0xca , 0xcb , 0xcc , 0xcd , 0xce , 0xcf , 0xd0 , 0xd1 , 0xd2 , 0xd3 , 0xd4 ,
0 } ;
oled_write_P ( crkbd_logo , false ) ;
}
oled_write_P ( PSTR ( " BTMGK " ) , false ) ;
if ( keymap_config . swap_lalt_lgui ) {
oled_write_P ( PSTR ( " Mac " ) , false ) ;
} else {
oled_write_P ( PSTR ( " Win " ) , false ) ;
}
void render_status ( void ) {
uint8_t led_usb_state = host_keyboard_leds ( ) ;
oled_write_P ( PSTR ( " Lock: " ) , false ) ;
oled_write_P ( led_usb_state & ( 1 < < USB_LED_NUM_LOCK ) ? PSTR ( " NUM " ) : PSTR ( " " ) , false ) ;
oled_write_P ( led_usb_state & ( 1 < < USB_LED_CAPS_LOCK ) ? PSTR ( " CAPS " ) : PSTR ( " " ) , false ) ;
oled_write_P ( led_usb_state & ( 1 < < USB_LED_SCROLL_LOCK ) ? PSTR ( " SCRL " ) : PSTR ( " " ) , false ) ;
oled_write_P ( PSTR ( " Layer " ) , false ) ;
switch ( biton32 ( layer_state ) ) {
case 0 :
oled_write_P ( PSTR ( " Base " ) , false ) ;
break ;
case _RAISE :
oled_write_P ( PSTR ( " Raise " ) , false ) ;
break ;
case _LOWER :
oled_write_P ( PSTR ( " Lower " ) , false ) ;
break ;
case _ADJUST :
oled_write_P ( PSTR ( " Adjst " ) , false ) ;
break ;
default :
oled_write_P ( PSTR ( " Unkn " ) , false ) ;
break ;
}
oled_write_P ( PSTR ( " Lyout " ) , false ) ;
switch ( biton32 ( default_layer_state ) ) {
case _QWERTY :
oled_write_P ( PSTR ( " QWRTY " ) , false ) ;
break ;
case _COLEMAK :
oled_write_P ( PSTR ( " COLMK " ) , false ) ;
break ;
case _DVORAK :
oled_write_P ( PSTR ( " DVRAK " ) , false ) ;
break ;
case _WORKMAN :
oled_write_P ( PSTR ( " WRKMN " ) , false ) ;
break ;
case _NORMAN :
oled_write_P ( PSTR ( " NORMN " ) , false ) ;
break ;
case _MALTRON :
oled_write_P ( PSTR ( " MLTRN " ) , false ) ;
break ;
case _EUCALYN :
oled_write_P ( PSTR ( " ECLYN " ) , false ) ;
break ;
case _CARPLAX :
oled_write_P ( PSTR ( " CRPLX " ) , false ) ;
break ;
}
uint8_t modifiers = get_mods ( ) ;
uint8_t one_shot = get_oneshot_mods ( ) ;
oled_write_P ( PSTR ( " Mods: " ) , false ) ;
oled_write_P ( ( modifiers & MOD_MASK_CTRL | | one_shot & MOD_MASK_CTRL ) ? PSTR ( " CTL " ) : PSTR ( " " ) , false ) ;
oled_write_P ( ( modifiers & MOD_MASK_GUI | | one_shot & MOD_MASK_GUI ) ? PSTR ( " GUI " ) : PSTR ( " " ) , false ) ;
oled_write_P ( ( modifiers & MOD_MASK_ALT | | one_shot & MOD_MASK_ALT ) ? PSTR ( " ALT " ) : PSTR ( " " ) , false ) ;
oled_write_P ( ( modifiers & MOD_MASK_SHIFT | | one_shot & MOD_MASK_SHIFT ) ? PSTR ( " SFT " ) : PSTR ( " " ) , false ) ;
oled_write_P ( PSTR ( " BTMGK " ) , false ) ;
static const char PROGMEM mode_logo [ 4 ] [ 4 ] = {
{ 0x95 , 0x96 , 0x0a , 0 } ,
{ 0xb5 , 0xb6 , 0x0a , 0 } ,
{ 0x97 , 0x98 , 0x0a , 0 } ,
{ 0xb7 , 0xb8 , 0x0a , 0 } } ;
if ( keymap_config . swap_lalt_lgui ! = false ) {
oled_write_P ( mode_logo [ 0 ] , false ) ;
oled_write_P ( mode_logo [ 1 ] , false ) ;
} else {
oled_write_P ( mode_logo [ 2 ] , false ) ;
oled_write_P ( mode_logo [ 3 ] , false ) ;
}
uint8_t led_usb_state = host_keyboard_leds ( ) ;
oled_write_P ( PSTR ( " Lock: " ) , false ) ;
oled_write_P ( led_usb_state & ( 1 < < USB_LED_NUM_LOCK ) ? PSTR ( " NUM " ) : PSTR ( " " ) , false ) ;
oled_write_P ( led_usb_state & ( 1 < < USB_LED_CAPS_LOCK ) ? PSTR ( " CAPS " ) : PSTR ( " " ) , false ) ;
oled_write_P ( led_usb_state & ( 1 < < USB_LED_SCROLL_LOCK ) ? PSTR ( " SCRL " ) : PSTR ( " " ) , false ) ;
oled_write ( keylog_str , false ) ;
}
void oled_task_user ( void ) {
if ( is_master ) {
render_status ( ) ; / / Renders the current keyboard state ( layer , lock , caps , scroll , etc )
} else {
render_crkbd_logo ( ) ;
oled_scroll_left ( ) ; / / Turns on scrolling
}
if ( is_master ) {
render_status ( ) ; / / Renders the current keyboard state ( layer , lock , caps , scroll , etc )
} else {
render_crkbd_logo ( ) ;
oled_scroll_left ( ) ; / / Turns on scrolling
}
}
void matrix_scan_keymap ( void ) { update_log ( ) ; }
# endif
uint16_t get_tapping_term ( uint16_t keycode ) {
switch ( keycode ) {
case ALT_T ( KC_A ) :
return TAPPING_TERM + 100 ;
default :
return TAPPING_TERM ;
}
switch ( keycode ) {
case ALT_T ( KC_A ) :
return TAPPING_TERM + 100 ;
default :
return TAPPING_TERM ;
}
}