aboutsummaryrefslogtreecommitdiff
path: root/keyboards/crkbd/keymaps/gotham/oled.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/crkbd/keymaps/gotham/oled.c')
-rw-r--r--keyboards/crkbd/keymaps/gotham/oled.c265
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
3extern 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
10extern audio_config_t audio_config;
11#endif
12
13// 5x3 Logos
14
15void 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
20void 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
27void 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
32void 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
39void 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
60void 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
66void 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)
74void 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
88void render_mod_ctrl(void) {
89 static const char PROGMEM font_ctrl[3] = {0x93, 0x94, 0};
90 oled_write_P(font_ctrl, false);
91};
92
93void render_mod_alt(void) {
94 static const char PROGMEM font_alt[3] = {0xb3, 0xb4, 0};
95 oled_write_P(font_alt, false);
96};
97
98void render_mod_shift(void) {
99 static const char PROGMEM font_shift[3] = {0xd3, 0xd4, 0};
100 oled_write_P(font_shift, false);
101};
102
103void 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
109void 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
117void 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
133void 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
146static uint16_t oled_timer = 0;
147static char keylog_str[KEYLOGGER_LENGTH + 1] = {"\n"};
148// clang-format off
149static 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
169void 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
185void render_keylogger_status(void) {
186 oled_write(keylog_str, false);
187}
188
189void 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
203void 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
226void 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
245oled_rotation_t oled_init_user(oled_rotation_t rotation) {
246 return OLED_ROTATION_270;
247}
248
249void 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}