diff options
Diffstat (limited to 'users/drashna/oled_stuff.c')
| -rw-r--r-- | users/drashna/oled_stuff.c | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/users/drashna/oled_stuff.c b/users/drashna/oled_stuff.c new file mode 100644 index 000000000..7580de1d3 --- /dev/null +++ b/users/drashna/oled_stuff.c | |||
| @@ -0,0 +1,278 @@ | |||
| 1 | #include "drashna.h" | ||
| 2 | |||
| 3 | extern uint8_t is_master; | ||
| 4 | |||
| 5 | #ifndef KEYLOGGER_LENGTH | ||
| 6 | // # ifdef OLED_DISPLAY_128X64 | ||
| 7 | # define KEYLOGGER_LENGTH ((int)(OLED_DISPLAY_HEIGHT / OLED_FONT_WIDTH)) | ||
| 8 | // # else | ||
| 9 | // # define KEYLOGGER_LENGTH (uint8_t *(OLED_DISPLAY_WIDTH / OLED_FONT_HEIGHT)) | ||
| 10 | // # endif | ||
| 11 | #endif | ||
| 12 | |||
| 13 | static uint32_t oled_timer = 0; | ||
| 14 | static char keylog_str[KEYLOGGER_LENGTH + 1] = {"\n"}; | ||
| 15 | static uint16_t log_timer = 0; | ||
| 16 | |||
| 17 | // clang-format off | ||
| 18 | static const char PROGMEM code_to_name[0xFF] = { | ||
| 19 | // 0 1 2 3 4 5 6 7 8 9 A B c D E F | ||
| 20 | ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', // 0x | ||
| 21 | 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', // 1x | ||
| 22 | '3', '4', '5', '6', '7', '8', '9', '0', 20, 19, 27, 26, 22, '-', '=', '[', // 2x | ||
| 23 | ']','\\', '#', ';','\'', '`', ',', '.', '/', 128, ' ', ' ', ' ', ' ', ' ', ' ', // 3x | ||
| 24 | ' ', ' ', ' ', ' ', ' ', ' ', 'P', 'S', ' ', ' ', ' ', ' ', 16, ' ', ' ', ' ', // 4x | ||
| 25 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 5x | ||
| 26 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 6x | ||
| 27 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 7x | ||
| 28 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 8x | ||
| 29 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 9x | ||
| 30 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ax | ||
| 31 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Bx | ||
| 32 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Cx | ||
| 33 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Dx | ||
| 34 | 'C', 'S', 'A', 'C', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ex | ||
| 35 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' // Fx | ||
| 36 | }; | ||
| 37 | // clang-format on | ||
| 38 | |||
| 39 | void add_keylog(uint16_t keycode) { | ||
| 40 | if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX) || (keycode >= QK_MODS && keycode <= QK_MODS_MAX)) { | ||
| 41 | keycode = keycode & 0xFF; | ||
| 42 | } else if (keycode > 0xFF) { | ||
| 43 | keycode = 0; | ||
| 44 | } | ||
| 45 | |||
| 46 | for (uint8_t i = (KEYLOGGER_LENGTH - 1); i > 0; --i) { | ||
| 47 | keylog_str[i] = keylog_str[i - 1]; | ||
| 48 | } | ||
| 49 | |||
| 50 | if (keycode < (sizeof(code_to_name) / sizeof(char))) { | ||
| 51 | keylog_str[0] = pgm_read_byte(&code_to_name[keycode]); | ||
| 52 | } | ||
| 53 | |||
| 54 | log_timer = timer_read(); | ||
| 55 | } | ||
| 56 | |||
| 57 | bool process_record_user_oled(uint16_t keycode, keyrecord_t *record) { | ||
| 58 | if (record->event.pressed) { | ||
| 59 | #ifdef OLED_DRIVER_ENABLE | ||
| 60 | oled_timer = timer_read32(); | ||
| 61 | add_keylog(keycode); | ||
| 62 | #endif | ||
| 63 | } | ||
| 64 | return true; | ||
| 65 | } | ||
| 66 | |||
| 67 | void update_log(void) { | ||
| 68 | if (timer_elapsed(log_timer) > 750) { | ||
| 69 | // add_keylog(0); | ||
| 70 | } | ||
| 71 | } | ||
| 72 | |||
| 73 | void render_keylogger_status(void) { | ||
| 74 | oled_write_P(PSTR(OLED_RENDER_KEYLOGGER), false); | ||
| 75 | oled_write(keylog_str, false); | ||
| 76 | } | ||
| 77 | |||
| 78 | void render_default_layer_state(void) { | ||
| 79 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_NAME), false); | ||
| 80 | switch (get_highest_layer(default_layer_state)) { | ||
| 81 | case _QWERTY: | ||
| 82 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_QWERTY), false); | ||
| 83 | break; | ||
| 84 | case _COLEMAK: | ||
| 85 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_COLEMAK), false); | ||
| 86 | break; | ||
| 87 | case _DVORAK: | ||
| 88 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_DVORAK), false); | ||
| 89 | break; | ||
| 90 | case _WORKMAN: | ||
| 91 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_WORKMAN), false); | ||
| 92 | break; | ||
| 93 | case _NORMAN: | ||
| 94 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_NORMAN), false); | ||
| 95 | break; | ||
| 96 | case _MALTRON: | ||
| 97 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_MALTRON), false); | ||
| 98 | break; | ||
| 99 | case _EUCALYN: | ||
| 100 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_EUCALYN), false); | ||
| 101 | break; | ||
| 102 | case _CARPLAX: | ||
| 103 | oled_write_P(PSTR(OLED_RENDER_LAYOUT_CARPLAX), false); | ||
| 104 | break; | ||
| 105 | } | ||
| 106 | #ifdef OLED_DISPLAY_128X64 | ||
| 107 | oled_advance_page(true); | ||
| 108 | #endif | ||
| 109 | } | ||
| 110 | |||
| 111 | void render_layer_state(void) { | ||
| 112 | oled_write_P(PSTR(OLED_RENDER_LAYER_NAME), false); | ||
| 113 | #ifdef OLED_DISPLAY_128X64 | ||
| 114 | oled_write_P(PSTR(" "), false); | ||
| 115 | #endif | ||
| 116 | oled_write_P(PSTR(OLED_RENDER_LAYER_LOWER), layer_state_is(_LOWER)); | ||
| 117 | #ifdef OLED_DISPLAY_128X64 | ||
| 118 | oled_write_P(PSTR(" "), false); | ||
| 119 | #endif | ||
| 120 | oled_write_P(PSTR(OLED_RENDER_LAYER_RAISE), layer_state_is(_RAISE)); | ||
| 121 | #if _MODS | ||
| 122 | # ifdef OLED_DISPLAY_128X64 | ||
| 123 | oled_write_P(PSTR(" "), false); | ||
| 124 | # endif | ||
| 125 | oled_write_P(PSTR(OLED_RENDER_LAYER_MODS), layer_state_is(_MODS)); | ||
| 126 | #endif | ||
| 127 | #ifdef OLED_DISPLAY_128X64 | ||
| 128 | oled_advance_page(true); | ||
| 129 | #endif | ||
| 130 | } | ||
| 131 | |||
| 132 | void render_keylock_status(uint8_t led_usb_state) { | ||
| 133 | oled_write_P(PSTR(OLED_RENDER_LOCK_NAME), false); | ||
| 134 | oled_write_P(PSTR(" "), false); | ||
| 135 | oled_write_P(PSTR(OLED_RENDER_LOCK_NUML), led_usb_state & (1 << USB_LED_NUM_LOCK)); | ||
| 136 | #ifdef OLED_DISPLAY_128X64 | ||
| 137 | oled_write_P(PSTR(" "), false); | ||
| 138 | #endif | ||
| 139 | oled_write_P(PSTR(OLED_RENDER_LOCK_CAPS), led_usb_state & (1 << USB_LED_CAPS_LOCK)); | ||
| 140 | #ifdef OLED_DISPLAY_128X64 | ||
| 141 | oled_write_P(PSTR(" "), false); | ||
| 142 | #endif | ||
| 143 | oled_write_P(PSTR(OLED_RENDER_LOCK_SCLK), led_usb_state & (1 << USB_LED_SCROLL_LOCK)); | ||
| 144 | #ifndef OLED_DISPLAY_128X64 | ||
| 145 | oled_advance_page(true); | ||
| 146 | #endif | ||
| 147 | } | ||
| 148 | |||
| 149 | void render_mod_status(uint8_t modifiers) { | ||
| 150 | oled_write_P(PSTR(OLED_RENDER_MODS_NAME), false); | ||
| 151 | oled_write_P(PSTR(OLED_RENDER_MODS_SFT), (modifiers & MOD_MASK_SHIFT)); | ||
| 152 | #ifdef OLED_DISPLAY_128X64 | ||
| 153 | oled_write_P(PSTR(" "), false); | ||
| 154 | #endif | ||
| 155 | oled_write_P(PSTR(OLED_RENDER_MODS_CTL), (modifiers & MOD_MASK_CTRL)); | ||
| 156 | #ifdef OLED_DISPLAY_128X64 | ||
| 157 | oled_write_P(PSTR(" "), false); | ||
| 158 | #endif | ||
| 159 | oled_write_P(PSTR(OLED_RENDER_MODS_ALT), (modifiers & MOD_MASK_ALT)); | ||
| 160 | #ifdef OLED_DISPLAY_128X64 | ||
| 161 | oled_write_P(PSTR(" "), false); | ||
| 162 | #endif | ||
| 163 | oled_write_P(PSTR(OLED_RENDER_MODS_GUI), (modifiers & MOD_MASK_GUI)); | ||
| 164 | } | ||
| 165 | |||
| 166 | void render_bootmagic_status(void) { | ||
| 167 | /* Show Ctrl-Gui Swap options */ | ||
| 168 | static const char PROGMEM logo[][2][3] = { | ||
| 169 | {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}, | ||
| 170 | {{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, | ||
| 171 | }; | ||
| 172 | |||
| 173 | oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NAME), false); | ||
| 174 | #ifdef OLED_DISPLAY_128X64 | ||
| 175 | if (keymap_config.swap_lctl_lgui) | ||
| 176 | #else | ||
| 177 | oled_write_P(PSTR(" "), false); | ||
| 178 | #endif | ||
| 179 | { | ||
| 180 | oled_write_P(logo[1][0], false); | ||
| 181 | #ifdef OLED_DISPLAY_128X64 | ||
| 182 | } else { | ||
| 183 | #endif | ||
| 184 | oled_write_P(logo[0][0], false); | ||
| 185 | } | ||
| 186 | oled_write_P(PSTR(" "), false); | ||
| 187 | #ifdef OLED_DISPLAY_128X64 | ||
| 188 | oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NKRO), keymap_config.nkro); | ||
| 189 | oled_write_P(PSTR(" "), false); | ||
| 190 | oled_write_ln_P(PSTR(OLED_RENDER_BOOTMAGIC_NOGUI), !keymap_config.no_gui); | ||
| 191 | oled_write_P(PSTR("Magic "), false); | ||
| 192 | if (keymap_config.swap_lctl_lgui) | ||
| 193 | #endif | ||
| 194 | { | ||
| 195 | oled_write_P(logo[1][1], false); | ||
| 196 | #ifdef OLED_DISPLAY_128X64 | ||
| 197 | } else { | ||
| 198 | #endif | ||
| 199 | oled_write_P(logo[0][1], false); | ||
| 200 | } | ||
| 201 | oled_write_P(PSTR(" "), false); | ||
| 202 | #ifdef OLED_DISPLAY_128X64 | ||
| 203 | oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_GRV), keymap_config.swap_grave_esc); | ||
| 204 | oled_write_P(PSTR(" "), false); | ||
| 205 | oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_CAPS), keymap_config.swap_control_capslock); | ||
| 206 | oled_advance_page(true); | ||
| 207 | #else | ||
| 208 | oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NKRO), keymap_config.nkro); | ||
| 209 | #endif | ||
| 210 | } | ||
| 211 | |||
| 212 | void render_user_status(void) { | ||
| 213 | oled_write_P(PSTR(OLED_RENDER_USER_NAME), false); | ||
| 214 | oled_write_P(PSTR(" "), false); | ||
| 215 | oled_write_P(PSTR(OLED_RENDER_USER_ANIM), userspace_config.rgb_matrix_idle_anim); | ||
| 216 | oled_write_P(PSTR(" "), false); | ||
| 217 | oled_write_P(PSTR(OLED_RENDER_USER_LAYR), userspace_config.rgb_layer_change); | ||
| 218 | oled_write_P(PSTR(" "), false); | ||
| 219 | oled_write_P(PSTR(OLED_RENDER_USER_NUKE), userspace_config.nuke_switch); | ||
| 220 | #ifdef OLED_DISPLAY_128X64 | ||
| 221 | oled_advance_page(true); | ||
| 222 | #endif | ||
| 223 | } | ||
| 224 | |||
| 225 | __attribute__((weak)) void oled_driver_render_logo(void) { | ||
| 226 | // clang-format off | ||
| 227 | static const char PROGMEM qmk_logo[] = { | ||
| 228 | 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, | ||
| 229 | 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, | ||
| 230 | 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0}; | ||
| 231 | // clang-format on | ||
| 232 | oled_write_P(qmk_logo, false); | ||
| 233 | } | ||
| 234 | |||
| 235 | void render_status_secondary(void) { | ||
| 236 | #if !defined(SPLIT_TRANSPORT_MIRROR) || defined(OLED_DRIVER_128x64) | ||
| 237 | oled_driver_render_logo(); | ||
| 238 | #endif | ||
| 239 | #ifdef SPLIT_TRANSPORT_MIRROR | ||
| 240 | /* Show Keyboard Layout */ | ||
| 241 | render_default_layer_state(); | ||
| 242 | render_layer_state(); | ||
| 243 | render_mod_status(get_mods() | get_oneshot_mods()); | ||
| 244 | render_keylogger_status(); | ||
| 245 | |||
| 246 | #endif | ||
| 247 | } | ||
| 248 | // clang-format on | ||
| 249 | |||
| 250 | void render_status_main(void) { | ||
| 251 | /* Show Keyboard Layout */ | ||
| 252 | render_default_layer_state(); | ||
| 253 | render_keylock_status(host_keyboard_leds()); | ||
| 254 | render_bootmagic_status(); | ||
| 255 | render_user_status(); | ||
| 256 | |||
| 257 | render_keylogger_status(); | ||
| 258 | } | ||
| 259 | |||
| 260 | void oled_task_user(void) { | ||
| 261 | if (timer_elapsed32(oled_timer) > 30000) { | ||
| 262 | oled_off(); | ||
| 263 | return; | ||
| 264 | } | ||
| 265 | #ifndef SPLIT_KEYBOARD | ||
| 266 | else { | ||
| 267 | oled_on(); | ||
| 268 | } | ||
| 269 | #endif | ||
| 270 | |||
| 271 | update_log(); | ||
| 272 | |||
| 273 | if (is_master) { | ||
| 274 | render_status_main(); // Renders the current keyboard state (layer, lock, caps, scroll, etc) | ||
| 275 | } else { | ||
| 276 | render_status_secondary(); | ||
| 277 | } | ||
| 278 | } | ||
