2021-03-10 06:17:35 +01:00
/* Copyright 2020-2021 doodboard
*
* 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
const uint16_t PROGMEM keymaps [ ] [ MATRIX_ROWS ] [ MATRIX_COLS ] = {
[ 0 ] = LAYOUT (
TG ( 1 ) , KC_PSLS , KC_PAST , KC_PMNS ,
KC_7 , KC_8 , KC_9 , KC_PPLS ,
KC_4 , KC_5 , KC_6 , KC_PPLS ,
KC_MUTE , KC_1 , KC_2 , KC_3 , KC_ENT ,
KC_BSPC , KC_0 , KC_0 , KC_DOT , KC_ENT ) ,
[ 1 ] = LAYOUT (
TG ( 1 ) , KC_TRNS , KC_TRNS , KC_TRNS ,
KC_HOME , KC_UP , KC_PGUP , KC_TRNS ,
KC_LEFT , KC_TRNS , KC_RGHT , KC_TRNS ,
KC_TRNS , KC_END , KC_DOWN , KC_PGDN , KC_TRNS ,
TG ( 2 ) , KC_TRNS , KC_INS , KC_DEL , KC_TRNS ) ,
[ 2 ] = LAYOUT (
KC_TRNS , RGB_TOG , RGB_MOD , KC_TRNS ,
RGB_HUI , RGB_SAI , RGB_VAI , KC_TRNS ,
RGB_HUD , RGB_SAD , RGB_VAD , KC_TRNS ,
RESET , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS ,
TG ( 2 ) , RESET , KC_TRNS , KC_TRNS , KC_TRNS ) ,
[ 3 ] = LAYOUT (
KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS ,
KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS ,
KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS ,
KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS ,
KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS ) ,
} ;
2021-05-22 08:17:32 +02:00
bool encoder_update_user ( uint8_t index , bool clockwise ) {
2021-03-10 06:17:35 +01:00
if ( index = = 0 ) { /* First encoder */
if ( clockwise ) {
tap_code ( KC_VOLU ) ;
} else {
tap_code ( KC_VOLD ) ;
}
2021-05-22 08:17:32 +02:00
}
return true ;
2021-03-10 06:17:35 +01:00
}
# ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user ( oled_rotation_t rotation ) { return OLED_ROTATION_270 ; }
// WPM-responsive animation stuff here
# define IDLE_FRAMES 2
# define IDLE_SPEED 40 // below this wpm value your animation will idle
# define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
// #define SLEEP_TIMER 60000 // should sleep after this period of 0 wpm, needs fixing
# define ANIM_SIZE 636 // number of bytes in array, minimize for adequate firmware size, max is 1024
uint32_t anim_timer = 0 ;
uint32_t anim_sleep = 0 ;
uint8_t current_idle_frame = 0 ;
// Credit to u/Pop-X- for the initial code. You can find his commit here https://github.com/qmk/qmk_firmware/pull/9264/files#diff-303f6e3a7a5ee54be0a9a13630842956R196-R333.
static void render_anim ( void ) {
static const char PROGMEM idle [ IDLE_FRAMES ] [ ANIM_SIZE ] = {
{
0 , 0 , 192 , 192 , 192 , 192 , 192 , 192 , 192 , 248 , 248 , 30 , 30 , 254 , 254 , 248 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 3 , 3 , 3 , 3 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 127 , 127 , 255 , 255 , 255 , 255 , 255 , 159 , 159 , 135 , 135 , 129 , 129 , 129 , 97 , 97 , 25 , 25 , 7 , 7 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 97 , 97 , 127 , 1 , 1 , 97 , 97 , 127 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
} ,
{
0 , 0 , 128 , 128 , 128 , 128 , 128 , 128 , 128 , 240 , 240 , 60 , 60 , 252 , 252 , 240 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 7 , 7 , 7 , 7 , 7 , 255 , 255 , 254 , 254 , 255 , 255 , 255 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 63 , 63 , 15 , 15 , 3 , 3 , 3 , 195 , 195 , 51 , 51 , 15 , 15 , 3 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , 3 , 99 , 99 , 127 , 3 , 3 , 99 , 99 , 127 , 3 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
}
} ;
//assumes 1 frame prep stage
void animation_phase ( void ) {
current_idle_frame = ( current_idle_frame + 1 ) % IDLE_FRAMES ;
oled_write_raw_P ( idle [ abs ( ( IDLE_FRAMES - 1 ) - current_idle_frame ) ] , ANIM_SIZE ) ;
}
if ( timer_elapsed32 ( anim_timer ) > ANIM_FRAME_DURATION ) {
anim_timer = timer_read32 ( ) ;
animation_phase ( ) ;
}
}
void oled_task_user ( void ) {
render_anim ( ) ;
oled_set_cursor ( 0 , 6 ) ;
oled_write_P ( PSTR ( " DUCK \n BOARD \n " ) , false ) ;
oled_write_P ( PSTR ( " ----- \n " ) , false ) ;
// Host Keyboard Layer Status
oled_write_P ( PSTR ( " MODE \n " ) , false ) ;
oled_write_P ( PSTR ( " \n " ) , false ) ;
switch ( get_highest_layer ( layer_state ) ) {
case 0 :
oled_write_P ( PSTR ( " BASE \n " ) , false ) ;
break ;
case 1 :
oled_write_P ( PSTR ( " FUNC \n " ) , false ) ;
break ;
case 2 :
oled_write_P ( PSTR ( " RGB \n " ) , false ) ;
break ;
case 3 :
oled_write_P ( PSTR ( " FN2 \n " ) , false ) ;
break ;
}
}
# endif
void keyboard_post_init_user ( void ) {
//Customise these values to debug
debug_enable = true ;
debug_matrix = true ;
//debug_keyboard=true;
//debug_mouse=true;
}