diff options
Diffstat (limited to 'waffle/oled.c')
-rw-r--r-- | waffle/oled.c | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/waffle/oled.c b/waffle/oled.c new file mode 100644 index 0000000..4b2cdcb --- /dev/null +++ b/waffle/oled.c @@ -0,0 +1,247 @@ +// Copyright 2022 jack (@waffle87) +// SPDX-License-Identifier: GPL-2.0-or-later +#include "waffle.h" +uint32_t oled_timer = 0; + +void render_wpm(void) { + oled_write(PSTR("WPM: "), false); + oled_write_ln(get_u8_str(get_current_wpm(), ' '), false); +} + +#ifdef DEBUG_MATRIX_SCAN_RATE +void render_scan_rate(void) { + oled_write(get_u16_str(get_matrix_scan_rate(), ' '), false); + oled_write_ln(PSTR("/s"), false); +} +#endif + +#ifdef RAW_ENABLE +void host_info(uint8_t data) { + char buffer[3]; + oled_write_ln((char*)itoa(data, buffer, 10), false); +} + +void render_time(void) { + if (user_state.hour < 10) + oled_write(PSTR("0"), false); + host_info(user_state.hour); + oled_write(PSTR(":"), false); + if (user_state.min < 10) + oled_write(PSTR("0"), false); + host_info(user_state.min); +} +#endif + +void qmk_logo(void) { + static const char PROGMEM qmk_logo[16] = {0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0}; + oled_write(qmk_logo, false); +}; + +void render_keyboard(void) { + static const char PROGMEM keyboard[16] = {0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0}; + oled_write(keyboard, false); +}; + +void layer_status(void) { + bool blink = (timer_read() % 1000) < 500; + switch (get_highest_layer(layer_state)) { + case _RAISE: + oled_write_ln(PSTR("> hi"), false); + break; + case _LOWER: + oled_write_ln(PSTR("> lo"), false); + break; + case _ADJUST: + oled_write_ln(PSTR("> ad"), false); + break; + default: + oled_write_ln(blink ? PSTR("> _") : PSTR("> "), false); + } +}; + +void mod_status(uint8_t mods) { + static const char PROGMEM status [4][3] = {{0xd3, 0xd4, 0}, {0x93, 0x94, 0}, {0xb3, 0xb4, 0}, {0x95, 0x96, 0}}; + bool blink = (timer_read() % 1000) < 500; + if (mods & MOD_MASK_CTRL) { + oled_set_cursor(2, 11); + oled_write(status[0], false); + } else if (mods & MOD_MASK_SHIFT) { + oled_set_cursor(2, 11); + oled_write(status[1], false); + } else if (mods & MOD_MASK_ALT) { + oled_set_cursor(2, 11); + oled_write(status[2], false); + } else if (mods & MOD_MASK_GUI) { + oled_set_cursor(2, 11); + oled_write(status[3], false); + } else + oled_write_ln(blink ? PSTR("$ _") : PSTR("$ "), false); +} + +void keylock_status(led_t led_usb_state) { + bool blink = (timer_read() % 1000) < 500; + if (led_usb_state.caps_lock) + oled_write_ln(PSTR("% cap"), false); + else if (led_usb_state.num_lock) + oled_write_ln(PSTR("% num"), false); + else if (led_usb_state.scroll_lock) + oled_write_ln(PSTR("% scr"), false); + else + oled_write_ln(blink ? PSTR("% _") : PSTR("% "), false); +} + +static uint16_t log_timer = 0; +char keylog_str[5] = {0}; +const char code_to_name[60] = { + ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', + 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\', + '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' ' +}; + +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; + for (uint8_t i = 4; i > 0; i--) + keylog_str[i] = keylog_str[i - 1]; + if (keycode < 60) + keylog_str[0] = code_to_name[keycode]; + keylog_str[4] = 0; + log_timer = timer_read(); +} + +void render_keylogger(void) { oled_write(keylog_str, false); } + +void keylogger_status(void) { + bool blink = (timer_read() % 1000) < 500; + oled_write_ln(blink ? PSTR("~ _") : PSTR("~ "), false); +} + +void anim_frame(uint16_t size, char const action[][size]) { + static uint8_t current_frame = 0; + current_frame = (current_frame + 1) & 1; + oled_write_raw(action[current_frame], size); +} + +#ifdef FELIX_DOG +void felix(void) { + static uint16_t felix_anim_timer = 0; + bool shifted = get_mods() & MOD_MASK_SHIFT || host_keyboard_led_state().caps_lock || is_caps_word_on(); + void animate(void) { + if (shifted) + anim_frame(96, felix_bark); + else if (get_mods() & MOD_MASK_CAG) + anim_frame(96, felix_sneak); + else if (get_current_wpm() > 40) + anim_frame(96, felix_run); + else if (get_current_wpm() > 30 && get_current_wpm() <= 40) + anim_frame(96, felix_walk); + else + anim_frame(96, felix_sit); + } + if (timer_elapsed(felix_anim_timer) > 200) { + felix_anim_timer = timer_read(); + animate(); + } +} +#endif + +#ifdef BONGO_CAT +void bongo(void) { + static uint16_t bongo_anim_timer = 0; + void animate(void) { + if (get_current_wpm() <= 30) { + anim_frame(512, bongo_idle); + } if (get_current_wpm() > 30 && get_current_wpm() <= 40) { + anim_frame(512, bongo_prep); + } if (get_current_wpm() > 40) { + anim_frame(512, bongo_tap); + } + } + if (timer_elapsed(bongo_anim_timer) > 200) { + bongo_anim_timer = timer_read(); + animate(); + } +} +#endif + +#ifdef WPM_GRAPH +void wpm_graph(void) { + float max_wpm = 160; + static uint8_t height = OLED_DISPLAY_HEIGHT - 1, vert_count = 0; + static uint16_t graph_timer = 0; + if (timer_elapsed(graph_timer) > 100) { + height = 63 - ((get_current_wpm() / max_wpm) * 63); + for (uint8_t i = 0; i <= 1; i++) + oled_write_pixel(3, height + i, true); + if (vert_count == 3) { + vert_count = 0; + while (height <= 63) { + oled_write_pixel(3, height, true); + height++; + } + } else { + for (uint8_t i = 63; i > height; i--) + if (i % 3 == 0) + oled_write_pixel(3, i, true); + vert_count++; + } + for (uint16_t y = 0; y < 8; y++) { + for (uint16_t x = 124; x > 0; x--) { + uint16_t i = y * OLED_DISPLAY_WIDTH + x; + oled_buffer[i] = oled_buffer[i - 1]; + oled_dirty |= ((OLED_BLOCK_TYPE)1 << (i / OLED_BLOCK_SIZE)); + } + } + graph_timer = timer_read(); + } +} +#endif + +#ifdef LAYER_ANIM +void layer_anim(void) { + static uint16_t layer_anim_timer = 0; + void animate(void) { + switch (get_highest_layer(layer_state)) { + case _RAISE: + anim_frame(650, tap_sym); + break; + case _LOWER: + anim_frame(520, tap_num); + break; + case _ADJUST: + anim_frame(520, tap_sys); + break; + default: + bongo(); + } + } + if (timer_elapsed(layer_anim_timer) > 200) { + layer_anim_timer = timer_read(); + animate(); + } +} +#endif + +__attribute__((weak)) bool oled_task_keymap(void) { + return true; +} + +bool oled_task_user(void) { + if (is_keyboard_master()) { + if (timer_elapsed32(oled_timer) > 180000) { + oled_off(); + return false; + } else + oled_on(); + } + if (!oled_task_keymap()) + return false; + return false; +} + +void oled_timer_reset(void) { + oled_timer = timer_read32(); +} |