diff options
Diffstat (limited to 'users/ericgebhart/oled_stuff.c')
-rwxr-xr-x | users/ericgebhart/oled_stuff.c | 303 |
1 files changed, 303 insertions, 0 deletions
diff --git a/users/ericgebhart/oled_stuff.c b/users/ericgebhart/oled_stuff.c new file mode 100755 index 000000000..99a752ec2 --- /dev/null +++ b/users/ericgebhart/oled_stuff.c | |||
@@ -0,0 +1,303 @@ | |||
1 | /* | ||
2 | Copyright 2018 Eric Gebhart <e.a.gebhart@gmail.com> | ||
3 | |||
4 | This program is free software: you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Public License as published by | ||
6 | the Free Software Foundation, either version 2 of the License, or | ||
7 | (at your option) any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | */ | ||
17 | #include "ericgebhart.h" | ||
18 | #include <string.h> | ||
19 | #include <stdio.h> | ||
20 | |||
21 | void oled_render_default_layer_state(void) { | ||
22 | oled_write_P(PSTR("Layout: "), false); | ||
23 | switch (get_highest_layer(default_layer_state)) { | ||
24 | case _QWERTY: | ||
25 | oled_write_ln_P(PSTR("Qwerty"), false); | ||
26 | break; | ||
27 | case _COLEMAK: | ||
28 | oled_write_ln_P(PSTR("Colemak"), false); | ||
29 | break; | ||
30 | case _DVORAK_BP: | ||
31 | case _DVORAK: | ||
32 | oled_write_ln_P(PSTR("Dvorak"), false); | ||
33 | break; | ||
34 | |||
35 | |||
36 | /* case _WORKMAN: */ | ||
37 | // oled_write_ln_P(PSTR("Workman\n"), false); | ||
38 | /* break; */ | ||
39 | /* case _NORMAN: */ | ||
40 | // oled_write_ln_P(PSTR("Norman\n"), false); | ||
41 | /* break; */ | ||
42 | /* case _MALTRON: */ | ||
43 | // oled_write_ln_P(PSTR("Maltron\n"), false); | ||
44 | /* break; */ | ||
45 | |||
46 | /* case _EUCALYN: */ | ||
47 | // oled_write_ln_P(PSTR("Eucalyn\n"), false); | ||
48 | /* break; */ | ||
49 | /* case _CARPLAX: */ | ||
50 | // oled_write_ln_P(PSTR("Carplax\n"), false); | ||
51 | /* break; */ | ||
52 | |||
53 | case _BEAKL: | ||
54 | case _BEAKL_BP: | ||
55 | oled_write_ln_P(PSTR("Beakl"), false); | ||
56 | break; | ||
57 | case _BEPO: | ||
58 | oled_write_ln_P(PSTR("Bepo"), false); | ||
59 | break; | ||
60 | } | ||
61 | } | ||
62 | |||
63 | void oled_render_layer_state(void) { | ||
64 | oled_write_P(PSTR("Layer: "), false); | ||
65 | switch (get_highest_layer(layer_state)) { | ||
66 | case _NAV: | ||
67 | oled_write_P(PSTR("Navigation"), false); | ||
68 | break; | ||
69 | case _LAYERS: | ||
70 | oled_write_P(PSTR("Layers"), false); | ||
71 | break; | ||
72 | case _RGB: | ||
73 | oled_write_P(PSTR("RGB"), false); | ||
74 | break; | ||
75 | case _TOPROWS: | ||
76 | case _TOPROWS_BP: | ||
77 | oled_write_P(PSTR("TopRows"), false); | ||
78 | break; | ||
79 | case _SYMB: | ||
80 | case _SYMB_BP: | ||
81 | oled_write_P(PSTR("Symbols"), false); | ||
82 | break; | ||
83 | case _KEYPAD: | ||
84 | case _KEYPAD_BP: | ||
85 | oled_write_P(PSTR("Keypad"), false); | ||
86 | break; | ||
87 | case _ADJUST: | ||
88 | oled_write_P(PSTR("Adjust"), false); | ||
89 | break; | ||
90 | } | ||
91 | oled_write_ln_P(PSTR(" "), false); | ||
92 | } | ||
93 | |||
94 | // this is part of my answer to a challenge. | ||
95 | // My friend Ross thinks that the only use of an oled | ||
96 | // is to say which layer. | ||
97 | // I think there is more. this is just a beginning. | ||
98 | void oled_render_layer_map(void) { | ||
99 | uint8_t lyr = get_highest_layer(layer_state); | ||
100 | if (lyr <= _BEPO) { | ||
101 | switch (get_highest_layer(default_layer_state)) { | ||
102 | case _QWERTY: | ||
103 | oled_write_ln_P(PSTR(" qwert yuiop"), false); | ||
104 | oled_write_ln_P(PSTR(" asdfg hjkl;"), false); | ||
105 | oled_write_ln_P(PSTR(" zxcvb nm,./"), false); | ||
106 | break; | ||
107 | case _COLEMAK: | ||
108 | oled_write_ln_P(PSTR(" qwfpb jluy;"), false); | ||
109 | oled_write_ln_P(PSTR(" arstg mneio"), false); | ||
110 | oled_write_ln_P(PSTR(" zxcdv kh,./"), false); | ||
111 | break; | ||
112 | case _DVORAK_BP: | ||
113 | case _DVORAK: | ||
114 | oled_write_ln_P(PSTR(" \",.py fgcrl"), false); | ||
115 | oled_write_ln_P(PSTR(" aoeui dhtns"), false); | ||
116 | oled_write_ln_P(PSTR(" ;qjkx bmwvz "), false); | ||
117 | break; | ||
118 | |||
119 | case _BEAKL: | ||
120 | case _BEAKL_BP: | ||
121 | oled_write_ln_P(PSTR(" qhoux gcrfz"), false); | ||
122 | oled_write_ln_P(PSTR(" yiea. dstnb"), false); | ||
123 | oled_write_ln_P(PSTR(" j/,k' wmlpv"), false); | ||
124 | break; | ||
125 | |||
126 | case _BEPO: | ||
127 | oled_write_P(PSTR(" cbe'po`e vdljz %"), false); | ||
128 | oled_write_P(PSTR(" auie, tsrnmc"), false); | ||
129 | oled_write_P(PSTR(" e^a'yx.k 'qghfw"), false); | ||
130 | break; | ||
131 | } | ||
132 | |||
133 | } else { | ||
134 | |||
135 | switch (lyr) { | ||
136 | case _TOPROWS: | ||
137 | case _TOPROWS_BP: | ||
138 | oled_write_ln_P(PSTR(" !@#$% ^&*()"), false); | ||
139 | oled_write_ln_P(PSTR(" 40123 76598"), false); | ||
140 | oled_write_ln_P(PSTR(" F1- -- -F12"), false); | ||
141 | break; | ||
142 | |||
143 | case _SYMB: | ||
144 | case _SYMB_BP: | ||
145 | oled_write_ln_P(PSTR(" `<$>' ?[_]-"), false); | ||
146 | oled_write_ln_P(PSTR(" -\\(\")# !{:}/;"), false); | ||
147 | oled_write_ln_P(PSTR(" @=*+; %&^~|"), false); | ||
148 | break; | ||
149 | |||
150 | case _NAV: | ||
151 | oled_write_ln_P(PSTR("54321 0 ctn 12345"), false); | ||
152 | oled_write_ln_P(PSTR(" ldur 1 ccv ldur"), false); | ||
153 | oled_write_ln_P(PSTR(" ldur 2 cwq hdue"), false); | ||
154 | break; | ||
155 | |||
156 | case _KEYPAD: | ||
157 | oled_write_ln_P(PSTR(" 523: F9-F12"), false); | ||
158 | oled_write_ln_P(PSTR(" -7.104 F5-F8"), false); | ||
159 | oled_write_ln_P(PSTR(" /698, F1-F4"), false); | ||
160 | break; | ||
161 | |||
162 | case _LAYERS: | ||
163 | oled_write_ln_P(PSTR(" Bp Dv Bk|Nv S K TR"), false); | ||
164 | oled_write_ln_P(PSTR("Q Cl Dv Bk|Nv S K TR"), false); | ||
165 | oled_write_P(PSTR(" "), false); | ||
166 | //oled_write_ln_P(PSTR("Ctrls?-> RGB ___ ___ Adjust"), false); | ||
167 | break; | ||
168 | } | ||
169 | } | ||
170 | } | ||
171 | |||
172 | void oled_render_keylock_status(uint8_t led_usb_state) { | ||
173 | oled_write_P(PSTR(" Lock:"), false); | ||
174 | oled_write_P(PSTR(" "), false); | ||
175 | oled_write_P(PSTR("N"), led_usb_state & (1 << USB_LED_NUM_LOCK)); | ||
176 | oled_write_P(PSTR("C"), led_usb_state & (1 << USB_LED_CAPS_LOCK)); | ||
177 | oled_write_ln_P(PSTR("S"), led_usb_state & (1 << USB_LED_SCROLL_LOCK)); | ||
178 | } | ||
179 | |||
180 | void oled_render_mod_status(uint8_t modifiers) { | ||
181 | oled_write_P(PSTR("Mods:"), false); | ||
182 | oled_write_P(PSTR("S"), (modifiers & MOD_MASK_SHIFT)); | ||
183 | oled_write_P(PSTR("C"), (modifiers & MOD_MASK_CTRL)); | ||
184 | oled_write_P(PSTR("A"), (modifiers & MOD_MASK_ALT)); | ||
185 | oled_write_P(PSTR("G"), (modifiers & MOD_MASK_GUI)); | ||
186 | } | ||
187 | |||
188 | void oled_render_mod_lock_status(){ | ||
189 | oled_render_mod_status(get_mods() | get_oneshot_mods()); | ||
190 | oled_render_keylock_status(host_keyboard_leds()); | ||
191 | } | ||
192 | |||
193 | |||
194 | char mkeylog_str[22] = {}; | ||
195 | |||
196 | const char mcode_to_name[60] = { | ||
197 | ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', | ||
198 | 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', | ||
199 | 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', | ||
200 | '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', | ||
201 | 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\', | ||
202 | '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '}; | ||
203 | |||
204 | |||
205 | void oled_render_keylog(void) { | ||
206 | oled_write_ln(mkeylog_str, false); | ||
207 | // sometimes there's an extra row. this is because sometimes it drops | ||
208 | // to the last line. and this clears it. | ||
209 | oled_write_ln_P(PSTR(" "), false); | ||
210 | } | ||
211 | |||
212 | |||
213 | void add_keylog(uint16_t keycode, keyrecord_t *record) { | ||
214 | char name = ' '; | ||
215 | if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || | ||
216 | (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { | ||
217 | keycode = keycode & 0xFF; | ||
218 | } | ||
219 | if (keycode < 60) { | ||
220 | name = mcode_to_name[keycode]; | ||
221 | } | ||
222 | |||
223 | // update keylog | ||
224 | memset(mkeylog_str, ' ', sizeof(mkeylog_str) - 1); | ||
225 | snprintf(mkeylog_str, sizeof(mkeylog_str), "%dx%d, k%2d : %c", | ||
226 | record->event.key.row, record->event.key.col, | ||
227 | keycode, name); | ||
228 | } | ||
229 | |||
230 | __attribute__((weak)) oled_rotation_t oled_init_keymap(oled_rotation_t rotation) { return rotation; } | ||
231 | |||
232 | oled_rotation_t oled_init_user(oled_rotation_t rotation) { | ||
233 | |||
234 | // for the big screen. | ||
235 | #ifdef OLED_DISPLAY_128X64 | ||
236 | return OLED_ROTATION_180; | ||
237 | #endif | ||
238 | |||
239 | return oled_init_keymap(rotation); | ||
240 | } | ||
241 | |||
242 | /* oled_rotation_t oled_init_user(oled_rotation_t rotation) { */ | ||
243 | /* memset(mkeylog_str, ' ', sizeof(mkeylog_str) - 1); */ | ||
244 | /* if (is_keyboard_master()) { */ | ||
245 | /* return OLED_ROTATION_270; */ | ||
246 | /* } else { */ | ||
247 | /* return OLED_ROTATION_180; */ | ||
248 | /* } */ | ||
249 | /* } */ | ||
250 | |||
251 | bool process_record_user_oled(uint16_t keycode, keyrecord_t *record) { | ||
252 | if (record->event.pressed) { | ||
253 | //oled_timer = timer_read32(); | ||
254 | add_keylog(keycode, record); | ||
255 | //add_keylog(keycode); | ||
256 | } | ||
257 | return true; | ||
258 | } | ||
259 | |||
260 | void render_bootmagic_status(bool status) { | ||
261 | /* Show Ctrl-Gui Swap options */ | ||
262 | static const char PROGMEM logo[][2][3] = { | ||
263 | {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}, | ||
264 | {{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, | ||
265 | }; | ||
266 | if (status) { | ||
267 | oled_write_ln_P(logo[0][0], false); | ||
268 | oled_write_ln_P(logo[0][1], false); | ||
269 | } else { | ||
270 | oled_write_ln_P(logo[1][0], false); | ||
271 | oled_write_ln_P(logo[1][1], false); | ||
272 | } | ||
273 | } | ||
274 | |||
275 | |||
276 | __attribute__((weak)) void oled_render_logo(void) { | ||
277 | // clang-format off | ||
278 | static const char PROGMEM qmk_logo[] = { | ||
279 | 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, | ||
280 | 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, | ||
281 | 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0}; | ||
282 | // clang-format on | ||
283 | oled_write_P(qmk_logo, false); | ||
284 | } | ||
285 | |||
286 | bool oled_task_user(void) { | ||
287 | if (is_keyboard_master()) { | ||
288 | oled_render_mod_lock_status(); | ||
289 | oled_render_default_layer_state(); | ||
290 | oled_render_layer_state(); | ||
291 | #ifdef OLED_DISPLAY_128X64 | ||
292 | oled_render_layer_map(); | ||
293 | #endif | ||
294 | oled_render_keylog(); | ||
295 | } else { | ||
296 | oled_render_logo(); | ||
297 | oled_render_default_layer_state(); | ||
298 | } | ||
299 | return(true); | ||
300 | |||
301 | } | ||
302 | /* oled_render_keylock_status(host_keyboard_leds()); */ | ||
303 | /* oled_render_mod_status(get_mods() | get_oneshot_mods()); */ | ||