diff options
Diffstat (limited to 'keyboards/crkbd/keymaps/gotham/oled.c')
| -rw-r--r-- | keyboards/crkbd/keymaps/gotham/oled.c | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/keyboards/crkbd/keymaps/gotham/oled.c b/keyboards/crkbd/keymaps/gotham/oled.c new file mode 100644 index 000000000..ac6f236fc --- /dev/null +++ b/keyboards/crkbd/keymaps/gotham/oled.c | |||
| @@ -0,0 +1,265 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | extern uint8_t is_master; | ||
| 4 | |||
| 5 | #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) | ||
| 6 | # include "rgb.c" | ||
| 7 | #endif | ||
| 8 | |||
| 9 | #ifdef AUDIO_ENABLE | ||
| 10 | extern audio_config_t audio_config; | ||
| 11 | #endif | ||
| 12 | |||
| 13 | // 5x3 Logos | ||
| 14 | |||
| 15 | void render_corne_logo(void) { | ||
| 16 | static const char PROGMEM font_logo[16] = {0x80, 0x81, 0x82, 0x83, 0x84, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0}; | ||
| 17 | oled_write_P(font_logo, false); | ||
| 18 | }; | ||
| 19 | |||
| 20 | void render_qmk_logo(void) { | ||
| 21 | static const char PROGMEM font_qmk_logo[16] = {0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0}; | ||
| 22 | oled_write_P(font_qmk_logo, false); | ||
| 23 | }; | ||
| 24 | |||
| 25 | // 5x2 Keyboard, Controller logos | ||
| 26 | |||
| 27 | void render_keyboard(void) { | ||
| 28 | static const char PROGMEM font_keyboard[11] = {0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0}; | ||
| 29 | oled_write_P(font_keyboard, false); | ||
| 30 | }; | ||
| 31 | |||
| 32 | void render_kb_split(void) { | ||
| 33 | static const char PROGMEM font_kb_split[11] = {0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0}; | ||
| 34 | oled_write_P(font_kb_split, false); | ||
| 35 | }; | ||
| 36 | |||
| 37 | // 5x1 Layer indicator | ||
| 38 | |||
| 39 | void render_layer(void) { | ||
| 40 | static const char PROGMEM font_layer[4][6] = { | ||
| 41 | {0x85, 0x86, 0x87, 0x88, 0x89, 0}, | ||
| 42 | {0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0}, | ||
| 43 | {0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0}, | ||
| 44 | {0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0}, | ||
| 45 | }; | ||
| 46 | uint8_t layer = 0; | ||
| 47 | if (layer_state_is(_LOWER)) { | ||
| 48 | layer = 1; | ||
| 49 | } else if (layer_state_is(_RAISE)) { | ||
| 50 | layer = 2; | ||
| 51 | } else if (layer_state_is(_ADJUST)) { | ||
| 52 | layer = 3; | ||
| 53 | } | ||
| 54 | oled_write_P(font_layer[layer], false); | ||
| 55 | }; | ||
| 56 | |||
| 57 | // 2x1 Audio, clicky and RGB status indicators | ||
| 58 | |||
| 59 | #ifdef AUDIO_ENABLE | ||
| 60 | void render_audio_status(void) { | ||
| 61 | static const char PROGMEM font_audio_off[3] = {0x8f, 0x90, 0}; | ||
| 62 | static const char PROGMEM font_audio_on[3] = {0x91, 0x92, 0}; | ||
| 63 | oled_write_P(audio_config.enable ? font_audio_on : font_audio_off, false); | ||
| 64 | }; | ||
| 65 | |||
| 66 | void render_clicky_status(void) { | ||
| 67 | static const char PROGMEM font_clicky_off[3] = {0xaf, 0xb0, 0}; | ||
| 68 | static const char PROGMEM font_clicky_on[3] = {0xb1, 0xb2, 0}; | ||
| 69 | oled_write_P(audio_config.clicky_enable ? font_clicky_on : font_clicky_off, false); | ||
| 70 | }; | ||
| 71 | #endif | ||
| 72 | |||
| 73 | #if defined(RGB_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLE) | ||
| 74 | void render_rgb_status(void) { | ||
| 75 | static const char PROGMEM font_rgb_off[3] = {0xcf, 0xd0, 0}; | ||
| 76 | static const char PROGMEM font_rgb_on[3] = {0xd1, 0xd2, 0}; | ||
| 77 | # ifdef RGBLIGHT_ENABLE | ||
| 78 | bool rgb_enabled = rgblight_config.enable; | ||
| 79 | # elif RGB_MATRIX_ENABLE | ||
| 80 | bool rgb_enabled = rgb_matrix_config.enable; | ||
| 81 | # endif | ||
| 82 | oled_write_P(rgb_enabled ? font_rgb_on : font_rgb_off, false); | ||
| 83 | }; | ||
| 84 | #endif | ||
| 85 | |||
| 86 | // 2x1 Ctrl, Alt, Shift, GUI, Mouse | ||
| 87 | |||
| 88 | void render_mod_ctrl(void) { | ||
| 89 | static const char PROGMEM font_ctrl[3] = {0x93, 0x94, 0}; | ||
| 90 | oled_write_P(font_ctrl, false); | ||
| 91 | }; | ||
| 92 | |||
| 93 | void render_mod_alt(void) { | ||
| 94 | static const char PROGMEM font_alt[3] = {0xb3, 0xb4, 0}; | ||
| 95 | oled_write_P(font_alt, false); | ||
| 96 | }; | ||
| 97 | |||
| 98 | void render_mod_shift(void) { | ||
| 99 | static const char PROGMEM font_shift[3] = {0xd3, 0xd4, 0}; | ||
| 100 | oled_write_P(font_shift, false); | ||
| 101 | }; | ||
| 102 | |||
| 103 | void render_mod_gui(void) { | ||
| 104 | static const char PROGMEM font_gui[3] = {0x95, 0x96, 0}; | ||
| 105 | oled_write_P(font_gui, false); | ||
| 106 | }; | ||
| 107 | |||
| 108 | #ifdef MOUSEKEY_ENABLE | ||
| 109 | void render_mod_mouse(void) { | ||
| 110 | static const char PROGMEM font_mouse[3] = {0x97, 0x98, 0}; | ||
| 111 | oled_write_P(font_mouse, false); | ||
| 112 | }; | ||
| 113 | #endif | ||
| 114 | |||
| 115 | // 5x2 Mod and feature indicator clusters | ||
| 116 | |||
| 117 | void render_mod_status(void) { | ||
| 118 | #ifdef NO_ACTION_ONESHOT | ||
| 119 | uint8_t modifiers = get_mods(); | ||
| 120 | #else | ||
| 121 | uint8_t modifiers = get_mods() | get_oneshot_mods(); | ||
| 122 | #endif | ||
| 123 | |||
| 124 | (modifiers & MOD_MASK_CTRL) ? render_mod_ctrl() : oled_write_P(PSTR(" "), false); | ||
| 125 | oled_write_P(PSTR(" "), false); | ||
| 126 | (modifiers & MOD_MASK_SHIFT) ? render_mod_shift() : oled_write_P(PSTR(" "), false); | ||
| 127 | |||
| 128 | (modifiers & MOD_MASK_ALT) ? render_mod_alt() : oled_write_P(PSTR(" "), false); | ||
| 129 | oled_write_P(PSTR(" "), false); | ||
| 130 | (modifiers & MOD_MASK_GUI) ? render_mod_gui() : oled_write_P(PSTR(" "), false); | ||
| 131 | } | ||
| 132 | |||
| 133 | void render_feature_status(void) { | ||
| 134 | #if defined(RGB_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLE) | ||
| 135 | render_rgb_status(); | ||
| 136 | #endif | ||
| 137 | |||
| 138 | #ifdef AUDIO_ENABLE | ||
| 139 | oled_write_P(PSTR(" "), false); | ||
| 140 | render_audio_status(); | ||
| 141 | #endif | ||
| 142 | }; | ||
| 143 | |||
| 144 | // Keylogger | ||
| 145 | #define KEYLOGGER_LENGTH 5 | ||
| 146 | static uint16_t oled_timer = 0; | ||
| 147 | static char keylog_str[KEYLOGGER_LENGTH + 1] = {"\n"}; | ||
| 148 | // clang-format off | ||
| 149 | static const char PROGMEM code_to_name[0xFF] = { | ||
| 150 | // 0 1 2 3 4 5 6 7 8 9 A B C D E F | ||
| 151 | ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', // 0x | ||
| 152 | 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', // 1x | ||
| 153 | '3', '4', '5', '6', '7', '8', '9', '0', 20, 19, 27, 26, 22, '-', '=', '[', // 2x | ||
| 154 | ']','\\', '#', ';','\'', '`', ',', '.', '/', 128, ' ', ' ', ' ', ' ', ' ', ' ', // 3x | ||
| 155 | ' ', ' ', ' ', ' ', ' ', ' ', 'P', 'S', ' ', ' ', ' ', ' ', 16, ' ', ' ', ' ', // 4x | ||
| 156 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 5x | ||
| 157 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 6x | ||
| 158 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 7x | ||
| 159 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 8x | ||
| 160 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 9x | ||
| 161 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ax | ||
| 162 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Bx | ||
| 163 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Cx | ||
| 164 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Dx | ||
| 165 | 'C', 'S', 'A', 'C', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ex | ||
| 166 | ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' // Fx | ||
| 167 | }; | ||
| 168 | |||
| 169 | void add_keylog(uint16_t keycode) { | ||
| 170 | 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)) { | ||
| 171 | keycode = keycode & 0xFF; | ||
| 172 | } else if (keycode > 0xFF) { | ||
| 173 | keycode = 0; | ||
| 174 | } | ||
| 175 | |||
| 176 | for (uint8_t i = (KEYLOGGER_LENGTH - 1); i > 0; --i) { | ||
| 177 | keylog_str[i] = keylog_str[i - 1]; | ||
| 178 | } | ||
| 179 | |||
| 180 | if (keycode < (sizeof(code_to_name) / sizeof(char))) { | ||
| 181 | keylog_str[0] = pgm_read_byte(&code_to_name[keycode]); | ||
| 182 | } | ||
| 183 | } | ||
| 184 | |||
| 185 | void render_keylogger_status(void) { | ||
| 186 | oled_write(keylog_str, false); | ||
| 187 | } | ||
| 188 | |||
| 189 | void render_prompt(void) { | ||
| 190 | bool blink = (timer_read() % 1000) < 500; | ||
| 191 | |||
| 192 | if (layer_state_is(_LOWER)) { | ||
| 193 | oled_write_ln_P(blink ? PSTR("> lo_") : PSTR("> lo "), false); | ||
| 194 | } else if (layer_state_is(_RAISE)) { | ||
| 195 | oled_write_ln_P(blink ? PSTR("> hi_") : PSTR("> hi "), false); | ||
| 196 | } else if (layer_state_is(_ADJUST)) { | ||
| 197 | oled_write_ln_P(blink ? PSTR("> aj_") : PSTR("> aj "), false); | ||
| 198 | } else { | ||
| 199 | oled_write_ln_P(blink ? PSTR("> _ ") : PSTR("> "), false); | ||
| 200 | } | ||
| 201 | }; | ||
| 202 | |||
| 203 | void render_status_secondary(void) { | ||
| 204 | oled_write_ln("", false); | ||
| 205 | oled_write_ln("", false); | ||
| 206 | |||
| 207 | render_kb_split(); | ||
| 208 | |||
| 209 | oled_write_ln("", false); | ||
| 210 | oled_write_ln("", false); | ||
| 211 | oled_write_ln("", false); | ||
| 212 | |||
| 213 | render_layer(); | ||
| 214 | |||
| 215 | oled_write_ln("", false); | ||
| 216 | oled_write_ln("", false); | ||
| 217 | oled_write_ln("", false); | ||
| 218 | |||
| 219 | #if defined(RGB_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLE) || defined(AUDIO_ENABLE) | ||
| 220 | layer_state_is(_ADJUST) ? render_feature_status() : render_mod_status(); | ||
| 221 | #else | ||
| 222 | render_mod_status(); | ||
| 223 | #endif | ||
| 224 | }; | ||
| 225 | |||
| 226 | void render_status_main(void) { | ||
| 227 | oled_write_ln("", false); | ||
| 228 | oled_write_ln("", false); | ||
| 229 | |||
| 230 | render_corne_logo(); | ||
| 231 | |||
| 232 | oled_write_ln("", false); | ||
| 233 | oled_write_ln("", false); | ||
| 234 | oled_write_ln("", false); | ||
| 235 | |||
| 236 | render_qmk_logo(); | ||
| 237 | |||
| 238 | oled_write_ln("", false); | ||
| 239 | oled_write_ln("", false); | ||
| 240 | oled_write_ln("", false); | ||
| 241 | |||
| 242 | render_prompt(); | ||
| 243 | } | ||
| 244 | |||
| 245 | oled_rotation_t oled_init_user(oled_rotation_t rotation) { | ||
| 246 | return OLED_ROTATION_270; | ||
| 247 | } | ||
| 248 | |||
| 249 | void oled_task_user(void) { | ||
| 250 | if (timer_elapsed(oled_timer) > 10000) { | ||
| 251 | oled_off(); | ||
| 252 | return; | ||
| 253 | } | ||
| 254 | #ifndef SPLIT_KEYBOARD | ||
| 255 | else { | ||
| 256 | oled_on(); | ||
| 257 | } | ||
| 258 | #endif | ||
| 259 | |||
| 260 | if (is_master) { | ||
| 261 | render_status_main(); | ||
| 262 | } else { | ||
| 263 | render_status_secondary(); | ||
| 264 | } | ||
| 265 | } | ||
