@ -1,3 +1,19 @@
/* Copyright 2020 yushakobo
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : / / www . gnu . org / licenses / > .
*/
# include QMK_KEYBOARD_H
# include "bootloader.h"
# ifdef PROTOCOL_LUFA
@ -7,17 +23,6 @@
# ifdef AUDIO_ENABLE
# include "audio.h"
# endif
# ifdef SSD1306OLED
# include "ssd1306.h"
# endif
# ifdef RGBLIGHT_ENABLE
/ / Following line allows macro to read current RGB settings
extern rgblight_config_t rgblight_config ;
# endif
extern uint8_t is_master ;
/ / Each layer gets a name for readability , which is then used in the keymap matrix below .
/ / The underscores don ' t mean anything - you can have a layer called STUFF or any other name .
@ -420,16 +425,16 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if ( record - > event . pressed ) {
rgblight_mode ( RGB_current_mode ) ;
rgblight_step ( ) ;
RGB_current_mode = rgblight_config . mode ;
RGB_current_mode = rgblight_get_mode ( ) ;
}
# endif
return false ;
break ;
case EISU :
if ( record - > event . pressed ) {
if ( keymap_config . swap_lalt_lgui = = false ) {
if ( is_mac_mode ( ) ) {
register_code ( KC_LANG2 ) ;
} else {
} else {
SEND_STRING ( SS_LALT ( " ` " ) ) ;
}
} else {
@ -439,9 +444,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
break ;
case KANA :
if ( record - > event . pressed ) {
if ( keymap_config . swap_lalt_lgui = = false ) {
if ( is_mac_mode ( ) ) {
register_code ( KC_LANG1 ) ;
} else {
} else {
SEND_STRING ( SS_LALT ( " ` " ) ) ;
}
} else {
@ -454,7 +459,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if ( record - > event . pressed ) {
eeconfig_update_rgblight_default ( ) ;
rgblight_enable ( ) ;
RGB_current_mode = rgblight_config . mode ;
RGB_current_mode = rgblight_get_mode ( ) ;
}
# endif
break ;
@ -462,12 +467,16 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true ;
}
# ifdef SSD1306OLED
# include "ssd1306.h"
# endif
void matrix_init_user ( void ) {
# ifdef AUDIO_ENABLE
startup_user ( ) ;
# endif
# ifdef RGBLIGHT_ENABLE
RGB_current_mode = rgblight_config . mode ;
RGB_current_mode = rgblight_get_mode ( ) ;
# endif
/ / SSD1306 OLED init , make sure to add # define SSD1306OLED in config . h
# ifdef SSD1306OLED
@ -500,132 +509,3 @@ void music_scale_user(void)
}
# endif
/ / SSD1306 OLED update loop , make sure to add # define SSD1306OLED in config . h
# ifdef SSD1306OLED
void matrix_scan_user ( void ) {
iota_gfx_task ( ) ; / / this is what updates the display continuously
}
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 ;
}
}
/ / assign the right code to your layers for OLED display
# define L_BASE 0
# define L_LOWER (1<<_LOWER)
# define L_RAISE (1<<_RAISE)
# define L_ADJUST (1<<_ADJUST)
# define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
static void render_logo ( struct CharacterMatrix * matrix ) {
static const char helix_logo [ ] PROGMEM = {
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 } ;
matrix_write_P ( matrix , helix_logo ) ;
/ / matrix_write_P ( & matrix , PSTR ( " Split keyboard kit " ) ) ;
}
static void render_rgbled_status ( bool full , struct CharacterMatrix * matrix ) {
# ifdef RGBLIGHT_ENABLE
char buf [ 30 ] ;
if ( RGBLIGHT_MODES > 1 & & rgblight_config . enable ) {
if ( full ) {
snprintf ( buf , sizeof ( buf ) , " LED %2d: %d,%d,%d " ,
rgblight_config . mode ,
rgblight_config . hue / RGBLIGHT_HUE_STEP ,
rgblight_config . sat / RGBLIGHT_SAT_STEP ,
rgblight_config . val / RGBLIGHT_VAL_STEP ) ;
} else {
snprintf ( buf , sizeof ( buf ) , " [%2d] " , rgblight_config . mode ) ;
}
matrix_write ( matrix , buf ) ;
}
# endif
}
static void render_layer_status ( struct CharacterMatrix * matrix ) {
/ / Define layers here , Have not worked out how to have text displayed for each layer . Copy down the number you see and add a case for it below
char buf [ 10 ] ;
matrix_write_P ( matrix , PSTR ( " Layer: " ) ) ;
switch ( layer_state ) {
case L_BASE :
matrix_write_P ( matrix , PSTR ( " Default " ) ) ;
break ;
case L_RAISE :
matrix_write_P ( matrix , PSTR ( " Raise " ) ) ;
break ;
case L_LOWER :
matrix_write_P ( matrix , PSTR ( " Lower " ) ) ;
break ;
case L_ADJUST :
case L_ADJUST_TRI :
matrix_write_P ( matrix , PSTR ( " Adjust " ) ) ;
break ;
default :
matrix_write_P ( matrix , PSTR ( " Undef- " ) ) ;
snprintf ( buf , sizeof ( buf ) , " %ld " , layer_state ) ;
matrix_write ( matrix , buf ) ;
}
}
void render_status ( struct CharacterMatrix * matrix ) {
/ / Render to mode icon
static const char os_logo [ ] [ 2 ] [ 3 ] PROGMEM = { { { 0x95 , 0x96 , 0 } , { 0xb5 , 0xb6 , 0 } } , { { 0x97 , 0x98 , 0 } , { 0xb7 , 0xb8 , 0 } } } ;
if ( keymap_config . swap_lalt_lgui = = false ) {
matrix_write_P ( matrix , os_logo [ 0 ] [ 0 ] ) ;
matrix_write_P ( matrix , PSTR ( " \n " ) ) ;
matrix_write_P ( matrix , os_logo [ 0 ] [ 1 ] ) ;
} else {
matrix_write_P ( matrix , os_logo [ 1 ] [ 0 ] ) ;
matrix_write_P ( matrix , PSTR ( " \n " ) ) ;
matrix_write_P ( matrix , os_logo [ 1 ] [ 1 ] ) ;
}
matrix_write_P ( matrix , PSTR ( " " ) ) ;
render_layer_status ( matrix ) ;
matrix_write_P ( matrix , PSTR ( " \n " ) ) ;
/ / Host Keyboard LED Status
matrix_write_P ( matrix , ( host_keyboard_leds ( ) & ( 1 < < USB_LED_NUM_LOCK ) ) ?
PSTR ( " NUMLOCK " ) : PSTR ( " " ) ) ;
matrix_write_P ( matrix , ( host_keyboard_leds ( ) & ( 1 < < USB_LED_CAPS_LOCK ) ) ?
PSTR ( " CAPS " ) : PSTR ( " " ) ) ;
matrix_write_P ( matrix , ( host_keyboard_leds ( ) & ( 1 < < USB_LED_SCROLL_LOCK ) ) ?
PSTR ( " SCLK " ) : PSTR ( " " ) ) ;
matrix_write_P ( matrix , PSTR ( " \n " ) ) ;
render_rgbled_status ( true , matrix ) ;
}
void iota_gfx_task_user ( void ) {
struct CharacterMatrix matrix ;
# if DEBUG_TO_SCREEN
if ( debug_enable ) {
return ;
}
# endif
matrix_clear ( & matrix ) ;
if ( is_master ) {
render_status ( & matrix ) ;
} else {
render_logo ( & matrix ) ;
render_rgbled_status ( false , & matrix ) ;
render_layer_status ( & matrix ) ;
}
matrix_update ( & display , & matrix ) ;
}
# endif