 4e1c5887c5
			
		
	
	
		4e1c5887c5
		
			
		
	
	
	
	
		
			
			* add docs * core changes * update keyboards to new OLED * updated users to new OLED * update layouts to new OLED * fixup docs * drashna's suggestion * fix up docs * new keyboards with oled * core split changes * remaining keyboard files * Fix The Helix keyboards oled options * reflect develop Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: mtei <2170248+mtei@users.noreply.github.com>
		
			
				
	
	
		
			376 lines
		
	
	
	
		
			37 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			376 lines
		
	
	
	
		
			37 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Copyright 2019 Thomas Baart <thomas@splitkb.com>
 | |
|  *
 | |
|  * 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 <stdio.h>
 | |
| bool is_alt_tab_active = false;
 | |
| uint16_t alt_tab_timer = 0;
 | |
| 
 | |
| char wpm_str[10];
 | |
| 
 | |
| enum layers {
 | |
|     _QWERTY,
 | |
|     _2WERTY, //pronounced "twerty," obviously
 | |
|     _LOWER,
 | |
|     _RAISE,
 | |
|     _ADJUST,
 | |
| };
 | |
| 
 | |
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | |
| /*
 | |
|  * Base Layer: QWERTY
 | |
|  *
 | |
|  * ,-------------------------------------------.                              ,-------------------------------------------.
 | |
|  * |RAIS/ESC|   Q  |   W  |   E  |   R  |   T  |                              |   Y  |   U  |   I  |   O  |   P  |  BKSP  |
 | |
|  * |--------+------+------+------+------+------|                              |------+------+------+------+------+--------|
 | |
|  * |Tab     |   A  |   S  |  D   |   F  |   G  |                              |   H  |   J  |   K  |   L  | ;  : |  ' "   |
 | |
|  * |--------+------+------+------+------+------+-------------.  ,-------------+------+------+------+------+------+--------|
 | |
|  * | CTRL   |   Z  |   X  |   C  |   V  |   B  |Enter |Ctrl  |  |Ctrl  |(2u)  |   N  |   M  | ,  < | . >  | /  ? |  - _   |
 | |
|  * `----------------------+------+------+------+------+------|  |------+------+------+------+------+----------------------'
 | |
|  *                        | TG(1)| Alt  | Win  | Shift| Back |  | Enter| Space| Win  | Alt  |TG(3) |
 | |
|  *                        |      |      |      | Lower| space|  | Lower| Raise|      |      |      |
 | |
|  *                        `----------------------------------'  `----------------------------------'
 | |
|  */
 | |
|     [_QWERTY] = LAYOUT(
 | |
|       KC_ESC,    KC_Q,    KC_W,   KC_E,   KC_R,   KC_T,                               KC_Y,    KC_U,    KC_I,    KC_O,       KC_P, KC_BSPC,
 | |
|       KC_TAB,    KC_A,    KC_S,   KC_D,   KC_F,   KC_G,                               KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,
 | |
|       KC_LCTL,   KC_Z,    KC_X,   KC_C,   KC_V,   KC_B,    KC_ENT,  KC_LCTL,       KC_RCTL, _______,     KC_N,    KC_M,   KC_COMM,  KC_DOT,  KC_SLSH, KC_MINS,
 | |
|                                  TG(1), KC_LALT, KC_LGUI, KC_LSFT,  KC_BSPC,      LT(3, KC_ENT), LT(2, KC_SPC), KC_RGUI,  KC_RALT, TG(2)
 | |
|     ),
 | |
| /*
 | |
|  * This layer exists to change encoder functions.
 | |
|  *
 | |
|  * ,-------------------------------------------.                              ,-------------------------------------------.
 | |
|  * |        |      |      |      |      |      |                              |      |      |      |      |      |        |
 | |
|  * |--------+------+------+------+------+------|                              |------+------+------+------+------+--------|
 | |
|  * |        |      |      |      |      |      |                              |      |      |      |      |      |        |
 | |
|  * |--------+------+------+------+------+------+-------------.  ,-------------+------+------+------+------+------+--------|
 | |
|  * |        |      |      |      |      |      |      |      |  |      |      |      |      |      |      |      |        |
 | |
|  * `----------------------+------+------+------+------+------|  |------+------+------+------+------+----------------------'
 | |
|  *                        |      |      |      |      |      |  |      |      |      |      |      |
 | |
|  *                        |      |      |      |      |      |  |      |      |      |      |      |
 | |
|  *                        `----------------------------------'  `----------------------------------'
 | |
|  */
 | |
|     [_2WERTY] = LAYOUT(
 | |
|       _______, _______, _______, _______, _______, _______,                                     _______, _______, _______, _______, _______, _______,
 | |
|       _______, _______, _______, _______, _______, _______,                                     _______, _______, _______, _______, _______, _______,
 | |
|       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | |
|                                  KC_TRNS, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | |
|     ),
 | |
| /*
 | |
|  * Lower Layer: numpad and arrow
 | |
|  *
 | |
|  * ,-------------------------------------------.                              ,-------------------------------------------.
 | |
|  * |        |      |   7  |   8  |  9   |  0   |                              | PGUP |      |  UP  |      |      |   Del
 | |
|    |
 | |
|  * |--------+------+------+------+------+------|                              |------+------+------+------+------+--------|
 | |
|  * | CAPS   |      |   4  |   5  |  6   | Tab  |                              | PGDN | Left | Down | Right|      |        |
 | |
|  * |--------+------+------+------+------+------+-------------.  ,-------------+------+------+------+------+------+--------|
 | |
|  * |        |      |   1  |  2   |  3   | Ent  |      |      |  |      |      |      | LBRC | RBRC |      |   |\ |  +=    |
 | |
|  * `----------------------+------+------+------+------+------|  |------+------+------+------+------+----------------------'
 | |
|  *                        |      | Tab  | Ent  |      |      |  |      |      |      |      |      |
 | |
|  *                        |      |      |      |      |      |  |      |      |      |      |      |
 | |
|  *                        `----------------------------------'  `----------------------------------'
 | |
|  */
 | |
|      [_LOWER] = LAYOUT(
 | |
|         _______, _______,    KC_7,    KC_8,    KC_9,    KC_0,                                            KC_PGUP, _______,   KC_UP, _______, _______,  KC_DEL,
 | |
|         KC_CAPS, _______,    KC_4,    KC_5,    KC_6,  KC_TAB,                                            KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______,
 | |
|         KC_LSFT,    KC_0,    KC_1,    KC_2,    KC_3,  KC_ENT,   KC_TRNS,  KC_TRNS,       MO(4), _______, KC_LBRC, KC_RBRC, _______, _______, KC_BSLS,  KC_EQL,
 | |
|                                    KC_TRNS,    KC_TAB,  KC_ENT, KC_TRNS,  KC_TRNS,     KC_TRNS, KC_TRNS, _______, _______, _______
 | |
|     ),
 | |
| /*
 | |
|  * Raise Layer: F keys and media
 | |
|  *
 | |
|  * ,-------------------------------------------.                              ,-------------------------------------------.
 | |
|  * |        |      |      |      |      |      |                              |  F9  | F10  |  F11 |  F12 |      |        |
 | |
|  * |--------+------+------+------+------+------|                              |------+------+------+------+------+--------|
 | |
|  * |        |      | Prev | Play | Next | VolUp|                              | F5   | F6   | F7   | F8   |      |        |
 | |
|  * |--------+------+------+------+------+------+-------------.  ,-------------+------+------+------+------+------+--------|
 | |
|  * |        |      |      |      | Mute | VolDn|      |      |  |      |      | F1   | F2   | F3   |  F4  |      |        |
 | |
|  * `----------------------+------+------+------+------+------|  |------+------+------+------+------+----------------------'
 | |
|  *                        |      |      |      |      |      |  |      |      |      |      |      |
 | |
|  *                        |      |      |      |      |      |  |      |      |      |      |      |
 | |
|  *                        `----------------------------------'  `----------------------------------'
 | |
|  */
 | |
|     [_RAISE] = LAYOUT(
 | |
|       _______, _______, _______, _______, _______, _______,                                       KC_F9,  KC_F10,  KC_F11, KC_F12, _______, _______,
 | |
|       _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLU,                                       KC_F5,   KC_F6,   KC_F7,  KC_F8, _______, _______,
 | |
|       _______, _______, _______, _______, KC_MUTE, KC_VOLD, _______, _______, _______, _______,   KC_F1,   KC_F2,   KC_F3,  KC_F4, _______, _______,
 | |
|                                  _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_TRNS
 | |
|     ),
 | |
| /*
 | |
|  * Adjust Layer: Function keys, RGB
 | |
|  *
 | |
|  * ,-------------------------------------------.                              ,-------------------------------------------.
 | |
|  * |        | F1   |  F2  | F3   | F4   | F5   |                              | F6   | F7   |  F8  | F9   | F10  |        |
 | |
|  * |--------+------+------+------+------+------|                              |------+------+------+------+------+--------|
 | |
|  * |        | VAI  | SAI  | HUI  | SPI  | MOD  |                              |      |      |      | F11  | F12  |        |
 | |
|  * |--------+------+------+------+------+------+-------------.  ,-------------+------+------+------+------+------+--------|
 | |
|  * |        | VID  | SAD  | HUD  | SPD  | RMOD |      |      |  |      |      |      |      |      |      |      |        |
 | |
|  * `----------------------+------+------+------+------+------|  |------+------+------+------+------+----------------------'
 | |
|  *                        |      |      |      |      |      |  |      |      |      |      |      |
 | |
|  *                        |      |      |      |      |      |  |      |      |      |      |      |
 | |
|  *                        `----------------------------------'  `----------------------------------'
 | |
|  */
 | |
|     [_ADJUST] = LAYOUT(
 | |
|       _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,                                       KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  _______,
 | |
|       RGB_TOG, RGB_VAI, RGB_SAI, RGB_HUI, RGB_SPI, RGB_MOD,                                     _______, _______, _______, KC_F11,  KC_F12,  _______,
 | |
|       _______, RGB_VAD, RGB_SAD, RGB_HUD, RGB_SPD, RGB_RMOD,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | |
|                                  KC_TRNS, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | |
|     ),
 | |
| // /*
 | |
| //  * Layer template
 | |
| //  *
 | |
| //  * ,-------------------------------------------.                              ,-------------------------------------------.
 | |
| //  * |        |      |      |      |      |      |                              |      |      |      |      |      |        |
 | |
| //  * |--------+------+------+------+------+------|                              |------+------+------+------+------+--------|
 | |
| //  * |        |      |      |      |      |      |                              |      |      |      |      |      |        |
 | |
| //  * |--------+------+------+------+------+------+-------------.  ,-------------+------+------+------+------+------+--------|
 | |
| //  * |        |      |      |      |      |      |      |      |  |      |      |      |      |      |      |      |        |
 | |
| //  * `----------------------+------+------+------+------+------|  |------+------+------+------+------+----------------------'
 | |
| //  *                        |      |      |      |      |      |  |      |      |      |      |      |
 | |
| //  *                        |      |      |      |      |      |  |      |      |      |      |      |
 | |
| //  *                        `----------------------------------'  `----------------------------------'
 | |
| //  */
 | |
| //     [_LAYERINDEX] = LAYOUT(
 | |
| //       _______, _______, _______, _______, _______, _______,                                     _______, _______, _______, _______, _______, _______,
 | |
| //       _______, _______, _______, _______, _______, _______,                                     _______, _______, _______, _______, _______, _______,
 | |
| //       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | |
| //                                  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | |
| //     ),
 | |
| };
 | |
| 
 | |
| layer_state_t layer_state_set_user(layer_state_t state) {
 | |
|     return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
 | |
| }
 | |
| 
 | |
| #ifdef OLED_ENABLE
 | |
| 
 | |
| oled_rotation_t oled_init_user(oled_rotation_t rotation) {
 | |
| 	return OLED_ROTATION_180;
 | |
| }
 | |
| 
 | |
| static void render_status(void) {
 | |
|     // Host Keyboard Layer Status
 | |
|     oled_write_P(PSTR("Layer: "), false);
 | |
|     switch (get_highest_layer(layer_state)) {
 | |
|         case _QWERTY:
 | |
|             oled_write_P(PSTR("QWERTY"), false);
 | |
|             break;
 | |
|         case _2WERTY:
 | |
|             oled_write_P(PSTR("2WERTY"), false);
 | |
|             break;
 | |
|         case _LOWER:
 | |
|             oled_write_P(PSTR("Numpad"), false);
 | |
|             break;
 | |
|         case _RAISE:
 | |
|             oled_write_P(PSTR("F Keys"), false);
 | |
|             break;
 | |
|         case _ADJUST:
 | |
|             oled_write_P(PSTR("RGB   "), false);
 | |
|             break;
 | |
|         default:
 | |
|             oled_write_P(PSTR("Undefined"), false);
 | |
|     }
 | |
| 
 | |
|     //Host Keyboard LED Status
 | |
|     led_t led_state = host_keyboard_led_state();
 | |
|     oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR("       "), false);
 | |
|     oled_write_P(led_state.caps_lock ? PSTR("CAPS ") : PSTR("       "), false);
 | |
|     oled_write_P(led_state.scroll_lock ? PSTR("SCRL") : PSTR("       "), false);
 | |
| }
 | |
| 
 | |
| 
 | |
| // WPM-responsive animation stuff here
 | |
| #define IDLE_FRAMES 5
 | |
| #define IDLE_SPEED 40 // below this wpm value your animation will idle
 | |
| 
 | |
| // #define PREP_FRAMES 1 // uncomment if >1
 | |
| 
 | |
| #define TAP_FRAMES 2
 | |
| #define TAP_SPEED 60 // above this wpm value typing animation to triggere
 | |
| 
 | |
| #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;
 | |
| // uint8_t current_prep_frame = 0; // uncomment if PREP_FRAMES >1
 | |
| uint8_t current_tap_frame = 0;
 | |
| 
 | |
| // Images credit j-inc(/James Incandenza) and pixelbenny. Credit to obosob for initial animation approach.
 | |
| static void render_anim(void) {
 | |
|     static const char PROGMEM idle[IDLE_FRAMES][ANIM_SIZE] = {
 | |
|         {
 | |
|         0,  0,126,126, 24, 60,102, 66,  0, 12, 28,112,112, 28, 12,  0,116,116, 20, 20,124,104,  0,124,124,  0,112,120, 44, 36,124,124,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,  0,128, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16, 16,  8,  8,  4,  4,  4,  8, 48, 64,128,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,128,
 | |
|         0,  0,  0,  0,192, 96, 48, 24, 12,132,198, 98, 35, 51, 17,145,113,241,113,145, 17, 51, 35, 98,198,132, 12, 24, 48, 96,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,100,130,  2,  2,  2,  2,  2,  1,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0, 48, 48,  0,192,193,193,194,  4,  8, 16, 32, 64,128,  0,  0,  0,128,128,128,128, 64, 64, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  8,  8,  8,  8,196,  4,196,  4,196,  2,194,  2,194,  1,  1,  1,  1,  0,  0,  0,
 | |
|         0,  0,252, 15,  1,  0,248, 14, 31,109,140,148,148,164,166,249,224,255,224,249,166,164,148,148,140,109, 31, 14,248,  0,  1, 15,252,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 56,  4,  3,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 13,  1,  0, 64,160, 33, 34, 18, 17, 17, 17,  9,  8,  8,  8,  8,  4,  4,  8,  8, 16, 16, 16, 16, 16, 17, 15,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,170,170,255,255,195,191,127,  3,127,191,195,255,255,170,170,  0,  0,  0,  0,
 | |
|         0,  0, 31,120,192,  0, 15, 56,124,219,152, 20, 20, 18, 50,207,  3,255,  3,207, 50, 18, 20, 20,152,219,124, 56, 15,  0,192,120, 31, 16, 16, 16, 16,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,  2,  3,  2,  2,  1,  1,  1,  1,  1,  1,  2,  2,  4,  4,  8,  8,  8,  8,  8,  7,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,130,135, 31,  7,159,  7, 28,  7,159,  7,159,  7,  2,130,  0,  0,  0,  0,
 | |
|         32, 16, 16, 16, 17, 11, 14, 12, 24, 16, 49, 35, 98,102, 68, 68, 71, 71, 71, 68, 68,102, 98, 35, 49, 16, 24, 12,  6,  3,  1,  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,  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,  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,  0,  0,  0,  7,  8,  8, 23,  0, 15,  1,  2,  1, 15,  0, 15,  2,  5,  8
 | |
|         },
 | |
|         {
 | |
|         0,  0,126,126, 24, 60,102, 66,  0, 12, 28,112,112, 28, 12,  0,116,116, 20, 20,124,104,  0,124,124,  0,112,120, 44, 36,124,124,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,  0,128, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16, 16,  8,  8,  4,  4,  4,  8, 48, 64,128,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,128,
 | |
|         0,  0,  0,  0,192, 96, 48, 24, 12,132,198, 98, 35, 51, 17,145,113,241,113,145, 17, 51, 35, 98,198,132, 12, 24, 48, 96,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,100,130,  2,  2,  2,  2,  2,  1,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0, 48, 48,  0,192,193,193,194,  4,  8, 16, 32, 64,128,  0,  0,  0,128,128,128,128, 64, 64, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  8,  8,  8,  8,196,  4,196,  4,196,  2,194,  2,194,  1,  1,  1,  1,  0,  0,  0,
 | |
|         0,  0,252, 15,  1,  0,248, 14, 31,109,140,148,148,164,166,249,224,255,224,249,166,164,148,148,140,109, 31, 14,248,  0,  1, 15,252,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 56,  4,  3,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 13,  1,  0, 64,160, 33, 34, 18, 17, 17, 17,  9,  8,  8,  8,  8,  4,  4,  8,  8, 16, 16, 16, 16, 16, 17, 15,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,170,170,255,255,195,191,127,  3,127,191,195,255,255,170,170,  0,  0,  0,  0,
 | |
|         0,  0, 31,120,192,  0, 15, 56,124,219,152, 20, 20, 18, 50,207,  3,255,  3,207, 50, 18, 20, 20,152,219,124, 56, 15,  0,192,120, 31, 16, 16, 16, 16,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,  2,  3,  2,  2,  1,  1,  1,  1,  1,  1,  2,  2,  4,  4,  8,  8,  8,  8,  8,  7,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,130,135, 31,  7,159,  7, 28,  7,159,  7,159,  7,  2,130,  0,  0,  0,  0,
 | |
|         32, 16, 16, 16, 17, 11, 14, 12, 24, 16, 49, 35, 98,102, 68, 68, 71, 71, 71, 68, 68,102, 98, 35, 49, 16, 24, 12,  6,  3,  1,  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,  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,  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,  0,  0,  0,  7,  8,  8, 23,  0, 15,  1,  2,  1, 15,  0, 15,  2,  5,  8
 | |
|         },
 | |
|         {
 | |
|         0,  0,126,126, 24, 60,102, 66,  0, 12, 28,112,112, 28, 12,  0,116,116, 20, 20,124,104,  0,124,124,  0,112,120, 44, 36,124,124,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,  0,  0,128,128, 64, 64, 64, 64, 32, 32, 32, 32, 16,  8,  4,  2,  2,  4, 24, 96,128,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,128,
 | |
|         0,  0,  0,  0,192, 96, 48, 24, 12,132,198, 98, 35, 51, 17,145,113,241,113,145, 17, 51, 35, 98,198,132, 12, 24, 48, 96,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,194,  1,  1,  2,  2,  4,  4,  2,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 96,  0,129,130,130,132,  8, 16, 32, 64,128,  0,  0,  0,  0,128,128,128,128, 64, 64, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  8,  8,  8,  8,196,  4,196,  4,196,  2,194,  2,194,  1,  1,  1,  1,  0,  0,  0,
 | |
|         0,  0,252, 15,  1,  0,248, 14, 31,109,140,148,148,164,166,249,224,255,224,249,166,164,148,148,140,109, 31, 14,248,  0,  1, 15,252,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,112, 25,  6,  0,  0,  0,  0,  0,  0,  0, 24, 24, 24, 27,  3,  0, 64,160, 34, 36, 20, 18, 18, 18, 11,  8,  8,  8,  8,  5,  5,  9,  9, 16, 16, 16, 16, 16, 17, 15,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,170,170,255,255,195,191,127,  3,127,191,195,255,255,170,170,  0,  0,  0,  0,
 | |
|         0,  0, 31,120,192,  0, 15, 56,124,219,152, 20, 20, 18, 50,207,  3,255,  3,207, 50, 18, 20, 20,152,219,124, 56, 15,  0,192,120, 31, 16, 16, 16, 16,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,  2,  3,  2,  2,  1,  1,  1,  1,  1,  1,  2,  2,  4,  4,  8,  8,  8,  8,  8,  7,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,130,135, 31,  7,159,  7, 28,  7,159,  7,159,  7,  2,130,  0,  0,  0,  0,
 | |
|         32, 16, 16, 16, 17, 11, 14, 12, 24, 16, 49, 35, 98,102, 68, 68, 71, 71, 71, 68, 68,102, 98, 35, 49, 16, 24, 12,  6,  3,  1,  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,  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,  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,  0,  0,  0,  7,  8,  8, 23,  0, 15,  1,  2,  1, 15,  0, 15,  2,  5,  8
 | |
|         },
 | |
|         {
 | |
|         0,  0,126,126, 24, 60,102, 66,  0, 12, 28,112,112, 28, 12,  0,116,116, 20, 20,124,104,  0,124,124,  0,112,120, 44, 36,124,124,0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,128, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  4,  2,  1,  1,  2, 12, 48, 64,128,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,128,
 | |
|         0,  0,  0,  0,192, 96, 48, 24, 12,132,198, 98, 35, 51, 17,145,113,241,113,145, 17, 51, 35, 98,198,132, 12, 24, 48, 96,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,225,  0,  0,  1,  1,  2,  2,  1,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0, 48, 48,  0,192,193,193,194,  4,  8, 16, 32, 64,128,  0,  0,  0,128,128,128,128, 64, 64, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  8,  8,  8,  8,196,  4,196,  4,196,  2,194,  2,194,  1,  1,  1,  1,  0,  0,  0,
 | |
|         0,  0,252, 15,  1,  0,248, 14, 31,109,140,148,148,164,166,249,224,255,224,249,166,164,148,148,140,109, 31, 14,248,  0,  1, 15,252,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,112, 12,  3,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 13,  1,  0, 64,160, 33, 34, 18, 17, 17, 17,  9,  8,  8,  8,  8,  4,  4,  8,  8, 16, 16, 16, 16, 16, 17, 15,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,170,170,255,255,195,191,127,  3,127,191,195,255,255,170,170,  0,  0,  0,  0,
 | |
|         0,  0, 31,120,192,  0, 15, 56,124,219,152, 20, 20, 18, 50,207,  3,255,  3,207, 50, 18, 20, 20,152,219,124, 56, 15,  0,192,120, 31, 16, 16, 16, 16,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,  2,  3,  2,  2,  1,  1,  1,  1,  1,  1,  2,  2,  4,  4,  8,  8,  8,  8,  8,  7,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,130,135, 31,  7,159,  7, 28,  7,159,  7,159,  7,  2,130,  0,  0,  0,  0,
 | |
|         32, 16, 16, 16, 17, 11, 14, 12, 24, 16, 49, 35, 98,102, 68, 68, 71, 71, 71, 68, 68,102, 98, 35, 49, 16, 24, 12,  6,  3,  1,  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,  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,  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,  0,  0,  0,  7,  8,  8, 23,  0, 15,  1,  2,  1, 15,  0, 15,  2,  5,  8
 | |
|         },
 | |
|         {
 | |
|         0,  0,126,126, 24, 60,102, 66,  0, 12, 28,112,112, 28, 12,  0,116,116, 20, 20,124,104,  0,124,124,  0,112,120, 44, 36,124,124,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,  0,128, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  8,  4,  2,  2,  2,  4, 56, 64,128,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,128,
 | |
|         0,  0,  0,  0,192, 96, 48, 24, 12,132,198, 98, 35, 51, 17,145,113,241,113,145, 17, 51, 35, 98,198,132, 12, 24, 48, 96,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28,226,  1,  1,  2,  2,  2,  2,  1,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0, 48, 48,  0,192,193,193,194,  4,  8, 16, 32, 64,128,  0,  0,  0,128,128,128,128, 64, 64, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  8,  8,  8,  8,196,  4,196,  4,196,  2,194,  2,194,  1,  1,  1,  1,  0,  0,  0,
 | |
|         0,  0,252, 15,  1,  0,248, 14, 31,109,140,148,148,164,166,249,224,255,224,249,166,164,148,148,140,109, 31, 14,248,  0,  1, 15,252,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,112, 12,  3,  0,  0,  0,  0,  0,  0,  0, 12, 12, 12, 13,  1,  0, 64,160, 33, 34, 18, 17, 17, 17,  9,  8,  8,  8,  8,  4,  4,  8,  8, 16, 16, 16, 16, 16, 17, 15,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,170,170,255,255,195,191,127,  3,127,191,195,255,255,170,170,  0,  0,  0,  0,
 | |
|         0,  0, 31,120,192,  0, 15, 56,124,219,152, 20, 20, 18, 50,207,  3,255,  3,207, 50, 18, 20, 20,152,219,124, 56, 15,  0,192,120, 31, 16, 16, 16, 16,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,  2,  3,  2,  2,  1,  1,  1,  1,  1,  1,  2,  2,  4,  4,  8,  8,  8,  8,  8,  7,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,130,135, 31,  7,159,  7, 28,  7,159,  7,159,  7,  2,130,  0,  0,  0,  0,
 | |
|         32, 16, 16, 16, 17, 11, 14, 12, 24, 16, 49, 35, 98,102, 68, 68, 71, 71, 71, 68, 68,102, 98, 35, 49, 16, 24, 12,  6,  3,  1,  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,  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,  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,  0,  0,  0,  7,  8,  8, 23,  0, 15,  1,  2,  1, 15,  0, 15,  2,  5,  8
 | |
|         }
 | |
|     };
 | |
|     static const char PROGMEM prep[][ANIM_SIZE] = {
 | |
|         {
 | |
|         0,  0,126,126, 24, 60,102, 66,  0, 12, 28,112,112, 28, 12,  0,116,116, 20, 20,124,104,  0,124,124,  0,112,120, 44, 36,124,124,0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,128, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  4,  2,  1,  1,  2, 12, 48, 64,128,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,128,
 | |
|         0,  0,  0,  0,192, 96, 48, 24, 12,132,198, 98, 35, 51, 17,145,113,241,113,145, 17, 51, 35, 98,198,132, 12, 24, 48, 96,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,225,  0,  0,  1,  1,  2,  2,129,128,128,  0,  0,128,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0, 48, 48,  0,  0,  1,225, 26,  6,  9, 49, 53,  1,138,124,  0,  0,128,128,128,128, 64, 64, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  8,  8,  8,  8,196,  4,196,  4,196,  2,194,  2,194,  1,  1,  1,  1,  0,  0,  0,
 | |
|         0,  0,252, 15,  1,  0,248, 14, 31,109,140,148,148,164,166,249,224,255,224,249,166,164,148,148,140,109, 31, 14,248,  0,  1, 15,252,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,112, 12,  3,  0,  0, 24,  6,  5,152,153,132,195,124, 65, 65, 64, 64, 32, 33, 34, 18, 17, 17, 17,  9,  8,  8,  8,  8,  4,  4,  4,  4,  4,  4,  2,  2,  2,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,170,170,255,255,195,191,127,  3,127,191,195,255,255,170,170,  0,  0,  0,  0,
 | |
|         0,  0, 31,120,192,  0, 15, 56,124,219,152, 20, 20, 18, 50,207,  3,255,  3,207, 50, 18, 20, 20,152,219,124, 56, 15,  0,192,120, 31, 16, 16, 16, 16,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,  2,  3,  2,  2,  1,  1,  1,  1,  1,  1,  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,  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,  0,  0,  2,130,135, 31,  7,159,  7, 28,  7,159,  7,159,  7,  2,130,  0,  0,  0,  0,
 | |
|         32, 16, 16, 16, 17, 11, 14, 12, 24, 16, 49, 35, 98,102, 68, 68, 71, 71, 71, 68, 68,102, 98, 35, 49, 16, 24, 12,  6,  3,  1,  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,  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,  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,  0,  0,  0,  7,  8,  8, 23,  0, 15,  1,  2,  1, 15,  0, 15,  2,  5,  8
 | |
|         }
 | |
|     };
 | |
|     static const char PROGMEM tap[TAP_FRAMES][ANIM_SIZE] = {
 | |
|         {
 | |
|         0,  0,126,126, 24, 60,102, 66,  0, 12, 28,112,112, 28, 12,  0,116,116, 20, 20,124,104,  0,124,124,  0,112,120, 44, 36,124,124,0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,128, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  4,  2,  1,  1,  2, 12, 48, 64,128,  0,  0,  0,  0,  0,  0,  0,248,248,248,248,  0,  0,  0,  0,  0,128,128,  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,  0,  0,  0,128,128,128,
 | |
|         0,  0,  0,  0,192, 96, 48, 24, 12,132,198, 98, 35, 51, 17,145,113,241,113,145, 17, 51, 35, 98,198,132, 12, 24, 48, 96,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,225,  0,  0,  1,  1,  2,  2,129,128,128,  0,  0,128,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0, 48, 48,  0,  0,  1,  1,  2,  4,  8, 16, 32, 67,135,  7,  1,  0,184,188,190,159, 95, 95, 79, 76, 32, 32, 32, 32, 16, 16, 16, 16,  8,  8,  8,  8,  8,196,  4,196,  4,196,  2,194,  2,194,  1,  1,  1,  1,  0,  0,  0,
 | |
|         0,  0,252, 15,  1,  0,248, 14, 31,109,140,148,148,164,166,249,224,255,224,249,166,164,148,148,140,109, 31, 14,248,  0,  1, 15,252,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,112, 12,  3,  0,  0, 24,  6,  5,152,153,132, 67,124, 65, 65, 64, 64, 32, 33, 34, 18, 17, 17, 17,  9,  8,  8,  8,  8,  4,  4,  8,  8, 16, 16, 16, 16, 16, 17, 15,  1, 61,124,252,252,252,252,252, 60, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,170,170,255,255,195,191,127,  3,127,191,195,255,255,170,170,  0,  0,  0,  0,
 | |
|         0,  0, 31,120,192,  0, 15, 56,124,219,152, 20, 20, 18, 50,207,  3,255,  3,207, 50, 18, 20, 20,152,219,124, 56, 15,  0,192,120, 63, 16, 16, 16, 16,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,  2,  3,  2,  2,  1,  1,  1,  1,  1,  1,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  3,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,130,135, 31,  7,159,  7, 28,  7,159,  7,159,  7,  2,130,  0,  0,  0,  0,
 | |
|         32, 16, 16, 16, 17, 11, 14, 12, 24, 16, 49, 35, 98,102, 68, 68, 71, 71, 71, 68, 68,102, 98, 35, 49, 16, 24, 12,  6,  3,  1,  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,  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,  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,  0,  0,  0,  7,  8,  8, 23,  0, 15,  1,  2,  1, 15,  0, 15,  2,  5,  8
 | |
|         },
 | |
|         {
 | |
|         0,  0,126,126, 24, 60,102, 66,  0, 12, 28,112,112, 28, 12,  0,116,116, 20, 20,124,104,  0,124,124,  0,112,120, 44, 36,124,124,0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,128, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  4,  2,  1,  1,  2, 12, 48, 64,128,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,128,128,
 | |
|         0,  0,  0,  0,192, 96, 48, 24, 12,132,198, 98, 35, 51, 17,145,113,241,113,145, 17, 51, 35, 98,198,132, 12, 24, 48, 96,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,225,  0,  0,  1,  1,  2,  2,  1,  0,  0,  0,  0,128,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0, 48, 48,  0,  0,  1,225, 26,  6,  9, 49, 53,  1,138,124,  0,  0,128,128,128,128, 64, 64, 64, 64, 32, 32, 32, 32, 16, 16, 16, 16,  8,  8,  8,  8,  8,196,  4,196,  4,196,  2,194,  2,194,  1,  1,  1,  1,  0,  0,  0,
 | |
|         0,  0,252, 15,  1,  0,248, 14, 31,109,140,148,148,164,166,249,224,255,224,249,166,164,148,148,140,109, 31, 14,248,  0,  1, 15,252,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,112, 12,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  0, 64,160, 33, 34, 18, 17, 17, 17,  9,  8,  8,  8,  8,  4,  4,  4,  4,  4,  4,  2,  2,  2,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,170,170,255,255,195,191,127,  3,127,191,195,255,255,170,170,  0,  0,  0,  0,
 | |
|         0,  0, 31,120,192,  0, 15, 56,124,219,152, 20, 20, 18, 50,207,  3,255,  3,207, 50, 18, 20, 20,152,219,124, 56, 15,  0,192,120, 31, 16, 16, 16, 16,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,  2,  3,122,122,121,121,121,121, 57, 49,  2,  2,  4,  4,  8,  8,  8,136,136,135,128,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,130,135, 31,  7,159,  7, 28,  7,159,  7,159,  7,  2,130,  0,  0,  0,  0,
 | |
|         32, 16, 16, 16, 17, 11, 14, 12, 24, 16, 49, 35, 98,102, 68, 68, 71, 71, 71, 68, 68,102, 98, 35, 49, 16, 24, 12,  6,  3,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,120,124,254,255, 63,  7,  0,  0,  0,  0,255,255,127,127, 63, 62, 28, 24,  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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  8,  8, 23,  0, 15,  1,  2,  1, 15,  0, 15,  2,  5,  8
 | |
|         },
 | |
|     };
 | |
| 
 | |
|     //assumes 1 frame prep stage
 | |
|     void animation_phase(void) {
 | |
|         if(get_current_wpm() <=IDLE_SPEED){
 | |
|             current_idle_frame = (current_idle_frame + 1) % IDLE_FRAMES;
 | |
|             oled_write_raw_P(idle[abs((IDLE_FRAMES-1)-current_idle_frame)], ANIM_SIZE);
 | |
|          }
 | |
|          if(get_current_wpm() >IDLE_SPEED && get_current_wpm() <TAP_SPEED){
 | |
|              // oled_write_raw_P(prep[abs((PREP_FRAMES-1)-current_prep_frame)], ANIM_SIZE); // uncomment if IDLE_FRAMES >1
 | |
|              oled_write_raw_P(prep[0], ANIM_SIZE);  // remove if IDLE_FRAMES >1
 | |
|          }
 | |
|          if(get_current_wpm() >=TAP_SPEED){
 | |
|              current_tap_frame = (current_tap_frame + 1) % TAP_FRAMES;
 | |
|              oled_write_raw_P(tap[abs((TAP_FRAMES-1)-current_tap_frame)], ANIM_SIZE);
 | |
|          }
 | |
|     }
 | |
|     if(get_current_wpm() != 000) {
 | |
|         oled_on(); // not essential but turns on animation OLED with any alpha keypress
 | |
|         if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
 | |
|             anim_timer = timer_read32();
 | |
|             animation_phase();
 | |
|         }
 | |
|         anim_sleep = timer_read32();
 | |
|     } else {
 | |
|         if(timer_elapsed32(anim_sleep) > OLED_TIMEOUT) {
 | |
|             oled_off();
 | |
|         } else {
 | |
|             if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
 | |
|                 anim_timer = timer_read32();
 | |
|                 animation_phase();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| // static void render_skull(void) { // Helen Tseong (http://shewolfe.co/), the original artist behind the skull, sadly only allowing use of the skull for my personal use. Her (excellent) works are copyright her, and I claim no ownership. Reach out to her for permission!
 | |
| //     static const char PROGMEM skull[] = {
 | |
| //     };
 | |
| //      oled_write_raw_P(skull, 801);
 | |
| //  }
 | |
| 
 | |
| void oled_task_user(void) {
 | |
|     if (is_keyboard_master()) {
 | |
|         //render_skull();
 | |
|         //oled_set_cursor(7,6);
 | |
|         render_status();
 | |
|      // Renders the current keyboard state (layer, lock, caps, scroll, etc)
 | |
|     } else {
 | |
|         render_anim();
 | |
|         oled_set_cursor(0,6);
 | |
|         uint8_t n = get_current_wpm();
 | |
|         wpm_str[3] = '\0';
 | |
|         wpm_str[2] = '0' + n % 10;
 | |
|         wpm_str[1] = '0' + (n /= 10) % 10;
 | |
|         wpm_str[0] = '0' + n / 10 ;
 | |
|         oled_write_P(PSTR("       WPM: "), false);
 | |
|         oled_write(wpm_str, false);
 | |
| 
 | |
|     }
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #ifdef ENCODER_ENABLE
 | |
| bool encoder_update_user(uint8_t index, bool clockwise) {
 | |
|     switch(biton32(layer_state)){
 | |
|         case 1:
 | |
|             if (clockwise) {
 | |
|                 tap_code16(C(KC_TAB));
 | |
|             } else {
 | |
|                 tap_code16(S(C(KC_TAB)));
 | |
|             }
 | |
|             break;
 | |
|         default:
 | |
|             if (clockwise) {
 | |
|                 if (!is_alt_tab_active) {
 | |
|                     is_alt_tab_active = true;
 | |
|                     register_code(KC_LALT);
 | |
|                 }
 | |
|                 alt_tab_timer = timer_read();
 | |
|                 tap_code16(KC_TAB);
 | |
|             } else {
 | |
|                 tap_code16(S(KC_TAB));
 | |
|                 }
 | |
|             break;
 | |
|     }
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| void matrix_scan_user(void) {
 | |
|     if (is_alt_tab_active) {
 | |
|         if (timer_elapsed(alt_tab_timer) > 1250) {
 | |
|             unregister_code(KC_LALT);
 | |
|             is_alt_tab_active = false;
 | |
|             }
 | |
|         }
 | |
| }
 | |
| 
 | |
| #endif
 |