diff options
Diffstat (limited to 'keyboards/splitkb/kyria/keymaps/john-ezra/oled.c')
| -rw-r--r-- | keyboards/splitkb/kyria/keymaps/john-ezra/oled.c | 540 |
1 files changed, 443 insertions, 97 deletions
diff --git a/keyboards/splitkb/kyria/keymaps/john-ezra/oled.c b/keyboards/splitkb/kyria/keymaps/john-ezra/oled.c index e02783912..fe9c96d55 100644 --- a/keyboards/splitkb/kyria/keymaps/john-ezra/oled.c +++ b/keyboards/splitkb/kyria/keymaps/john-ezra/oled.c | |||
| @@ -1,18 +1,18 @@ | |||
| 1 | /* Copyright 2021 John Ezra | 1 | /* Copyright 2021 John Ezra |
| 2 | * | 2 | * |
| 3 | * This program is free software: you can redistribute it and/or modify | 3 | * This program is free software: you can redistribute it and/or modify |
| 4 | * it under the terms of the GNU General Public License as published by | 4 | * it under the terms of the GNU General Public License as published by |
| 5 | * the Free Software Foundation, either version 2 of the License, or | 5 | * the Free Software Foundation, either version 2 of the License, or |
| 6 | * (at your option) any later version. | 6 | * (at your option) any later version. |
| 7 | * | 7 | * |
| 8 | * This program is distributed in the hope that it will be useful, | 8 | * This program is distributed in the hope that it will be useful, |
| 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 11 | * GNU General Public License for more details. | 11 | * GNU General Public License for more details. |
| 12 | * | 12 | * |
| 13 | * You should have received a copy of the GNU General Public License | 13 | * You should have received a copy of the GNU General Public License |
| 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | //Sets up what the OLED screens display. | 17 | //Sets up what the OLED screens display. |
| 18 | 18 | ||
| @@ -26,7 +26,7 @@ int vert_count = 0; | |||
| 26 | 26 | ||
| 27 | //============= USER CONFIG PARAMS =============== | 27 | //============= USER CONFIG PARAMS =============== |
| 28 | float max_wpm = 150.0f; //WPM value at the top of the graph window | 28 | float max_wpm = 150.0f; //WPM value at the top of the graph window |
| 29 | int graph_refresh_interval = 80; //in milliseconds | 29 | int graph_refresh_interval = 100; //in milliseconds |
| 30 | int graph_area_fill_interval = 3; //determines how dense the horizontal lines under the graph line are; lower = more dense | 30 | int graph_area_fill_interval = 3; //determines how dense the horizontal lines under the graph line are; lower = more dense |
| 31 | int vert_interval = 3; //determines frequency of vertical lines under the graph line | 31 | int vert_interval = 3; //determines frequency of vertical lines under the graph line |
| 32 | bool vert_line = false; //determines whether to draw vertical lines | 32 | bool vert_line = false; //determines whether to draw vertical lines |
| @@ -34,110 +34,456 @@ int graph_line_thickness = 2; //determines thickness of graph line in pixels | |||
| 34 | //============= END USER PARAMS =============== | 34 | //============= END USER PARAMS =============== |
| 35 | 35 | ||
| 36 | #ifdef OLED_ENABLE | 36 | #ifdef OLED_ENABLE |
| 37 | oled_rotation_t oled_init_user(oled_rotation_t rotation) { | 37 | oled_rotation_t oled_init_user(oled_rotation_t rotation) { |
| 38 | return OLED_ROTATION_180; | 38 | return OLED_ROTATION_180; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | static void render_qmk_logo(void) { | 41 | static void render_qmk_logo(void) { |
| 42 | static const char PROGMEM qmk_logo[] = { | 42 | static const char PROGMEM qmk_logo[] = { |
| 43 | 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, | 43 | 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xf0, 0x70, 0x70, 0x7e, 0xf0, 0xf0, 0xfe, 0xf0, 0x70, 0x7e, |
| 44 | 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, | 44 | 0x70, 0xf0, 0xfe, 0xf0, 0xf0, 0x7e, 0x70, 0x70, 0xf0, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 45 | 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0}; | 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 46 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 47 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 50 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 51 | 0x00, 0x92, 0x92, 0x92, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, | ||
| 52 | 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x92, 0x92, 0x92, 0x00, 0x00, | ||
| 53 | 0xf8, 0xfc, 0x0e, 0x06, 0x06, 0x06, 0x0e, 0xfc, 0xf8, 0x00, 0xfe, 0xfe, 0x1c, 0x38, 0x70, 0xe0, | ||
| 54 | 0x70, 0x38, 0x1c, 0xfe, 0xfe, 0x00, 0xfe, 0xfe, 0xe0, 0xf0, 0xb8, 0x1c, 0x0e, 0x06, 0x00, 0x00, | ||
| 55 | 0x00, 0xfe, 0xfe, 0xc6, 0xc6, 0xc6, 0x06, 0x00, 0xe6, 0xe6, 0x00, 0xf0, 0xf0, 0x60, 0x30, 0x30, | ||
| 56 | 0x60, 0x00, 0xf0, 0xf0, 0x30, 0x30, 0xe0, 0xc0, 0x30, 0x30, 0x30, 0xe0, 0xc0, 0x00, 0xf0, 0xf0, | ||
| 57 | 0x00, 0xc0, 0xe0, 0x70, 0xe0, 0xc0, 0x00, 0xf0, 0xf0, 0x00, 0x20, 0xb0, 0x90, 0xb0, 0xf0, 0xe0, | ||
| 58 | 0x00, 0xf0, 0xf0, 0x60, 0x30, 0x30, 0x60, 0x00, 0xc0, 0xe0, 0x30, 0x30, 0x30, 0xe0, 0xc0, 0x00, | ||
| 59 | 0x00, 0x24, 0x24, 0x24, 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xf1, 0xe3, 0xe3, 0x00, 0x00, | ||
| 60 | 0x00, 0xe3, 0xe3, 0xf1, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0x24, 0x24, 0x24, 0x00, 0x00, | ||
| 61 | 0x03, 0x07, 0x0e, 0x0c, 0x0c, 0x1c, 0x1e, 0x17, 0x13, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, | ||
| 62 | 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x00, 0x01, 0x03, 0x07, 0x0e, 0x0c, 0x00, 0x00, | ||
| 63 | 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, | ||
| 64 | 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x01, 0x0f, | ||
| 65 | 0x0f, 0x07, 0x01, 0x00, 0x01, 0x07, 0x0f, 0x0f, 0x01, 0x00, 0x07, 0x0f, 0x0c, 0x04, 0x0f, 0x0f, | ||
| 66 | 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0d, 0x09, 0x09, 0x0d, 0x04, 0x00, | ||
| 67 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x07, 0x3f, 0x07, 0x07, 0x3f, 0x07, 0x07, 0x3f, | ||
| 68 | 0x07, 0x07, 0x3f, 0x07, 0x07, 0x3f, 0x07, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 70 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 71 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 72 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 74 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||
| 75 | }; | ||
| 76 | oled_write_raw_P(qmk_logo, sizeof(qmk_logo)); | ||
| 77 | } | ||
| 78 | |||
| 79 | // Loop to create line by line rendering for Horizontal display | ||
| 80 | // Input is oled_render_image(how many rows tall, how many pixels wide, what to render, X pos, Y pos, Frame offset) | ||
| 81 | void oled_render_image(int lines, int px, const char render_line[][px], int X_pos, int Y_pos, int frame) { | ||
| 82 | for (uint8_t i = 0; i < lines; i++){ | ||
| 83 | oled_set_cursor(X_pos, Y_pos + i); | ||
| 84 | oled_write_raw_P(render_line[i + frame], px); | ||
| 85 | } | ||
| 86 | } | ||
| 87 | |||
| 88 | static void render_layers(void) { | ||
| 89 | static const char PROGMEM layer_background_r1[1][38] = { | ||
| 90 | {0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, 0x82, 0x42, | ||
| 91 | 0x42, 0x42, 0x22, 0x22, 0x22, 0x42, 0x42, 0x42, 0x82, 0x82, 0x82, 0x02, 0x02, 0x02, 0x02, 0x02, | ||
| 92 | 0x02, 0x02, 0x02, 0x02, 0x02, 0xfe} | ||
| 93 | }; | ||
| 94 | static const char PROGMEM layer_background_r2[1][38] = { | ||
| 95 | {0x00, 0xff, 0x00, 0x44, 0x44, 0x44, 0xaa, 0xaa, 0xaa, 0x11, 0x11, 0x11, 0x20, 0x20, 0x20, 0x40, | ||
| 96 | 0x40, 0x40, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x11, 0x11, 0x11, 0xaa, 0xaa, | ||
| 97 | 0xaa, 0x44, 0x44, 0x44, 0x00, 0xff} | ||
| 98 | }; | ||
| 99 | static const char PROGMEM layer_background_r3[1][38] = { | ||
| 100 | {0x00, 0xff, 0x00, 0x44, 0x44, 0x44, 0xaa, 0xaa, 0xaa, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x44, | ||
| 101 | 0x44, 0x44, 0x88, 0x88, 0x88, 0x44, 0x44, 0x44, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0xaa, 0xaa, | ||
| 102 | 0xaa, 0x44, 0x44, 0x44, 0x00, 0xff} | ||
| 103 | }; | ||
| 104 | static const char PROGMEM layer_background_r4[1][38] = { | ||
| 105 | {0x00, 0x7f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x44, | ||
| 106 | 0x44, 0x44, 0x48, 0x48, 0x48, 0x44, 0x44, 0x44, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, 0x40, 0x40, | ||
| 107 | 0x40, 0x40, 0x40, 0x40, 0x40, 0x7f} | ||
| 108 | }; | ||
| 109 | static const char PROGMEM base[1][38] = { | ||
| 110 | {0x00, 0xff, 0x00, 0x44, 0x44, 0x44, 0xae, 0xae, 0xae, 0x1f, 0x1f, 0x1f, 0x3e, 0x3e, 0x3e, 0x7c, | ||
| 111 | 0x7c, 0x7c, 0xf8, 0xf8, 0xf8, 0x7c, 0x7c, 0x7c, 0x3e, 0x3e, 0x3e, 0x1f, 0x1f, 0x1f, 0xae, 0xae, | ||
| 112 | 0xae, 0x44, 0x44, 0x44, 0x00, 0xff} | ||
| 113 | }; | ||
| 114 | static const char PROGMEM lower[2][38] = { | ||
| 115 | {0x00, 0xff, 0x00, 0x44, 0x44, 0x44, 0xea, 0xea, 0xea, 0xf1, 0xf1, 0xf1, 0xe2, 0xe2, 0xe2, 0xc4, | ||
| 116 | 0xc4, 0xc4, 0x88, 0x88, 0x88, 0xc4, 0xc4, 0xc4, 0xe2, 0xe2, 0xe2, 0xf1, 0xf1, 0xf1, 0xea, 0xea, | ||
| 117 | 0xea, 0x44, 0x44, 0x44, 0x00, 0xff}, | ||
| 118 | {0x00, 0x7f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x43, 0x43, 0x43, 0x47, | ||
| 119 | 0x47, 0x47, 0x4f, 0x4f, 0x4f, 0x47, 0x47, 0x47, 0x43, 0x43, 0x43, 0x41, 0x41, 0x41, 0x40, 0x40, | ||
| 120 | 0x40, 0x40, 0x40, 0x40, 0x40, 0x7f} | ||
| 121 | }; | ||
| 122 | static const char PROGMEM raise[][38] = { | ||
| 123 | {0x00, 0xff, 0x00, 0x44, 0x44, 0x44, 0xea, 0xea, 0xea, 0xf1, 0xf1, 0xf1, 0xe0, 0xe0, 0xe0, 0xc0, | ||
| 124 | 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xf1, 0xf1, 0xf1, 0xea, 0xea, | ||
| 125 | 0xea, 0x44, 0x44, 0x44, 0x00, 0xff}, | ||
| 126 | {0x00, 0xff, 0x00, 0x44, 0x44, 0x44, 0xaa, 0xaa, 0xaa, 0x11, 0x11, 0x11, 0x23, 0x23, 0x23, 0x47, | ||
| 127 | 0x47, 0x47, 0x8f, 0x8f, 0x8f, 0x47, 0x47, 0x47, 0x23, 0x23, 0x23, 0x11, 0x11, 0x11, 0xaa, 0xaa, | ||
| 128 | 0xaa, 0x44, 0x44, 0x44, 0x00, 0xff} | ||
| 129 | }; | ||
| 130 | static const char PROGMEM adjust[][38] = { | ||
| 131 | {0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, 0x82, 0xc2, | ||
| 132 | 0xc2, 0xc2, 0xe2, 0xe2, 0xe2, 0xc2, 0xc2, 0xc2, 0x82, 0x82, 0x82, 0x02, 0x02, 0x02, 0x02, 0x02, | ||
| 133 | 0x02, 0x02, 0x02, 0x02, 0x02, 0xfe}, | ||
| 134 | {0x00, 0xff, 0x00, 0x44, 0x44, 0x44, 0xae, 0xae, 0xae, 0x1f, 0x1f, 0x1f, 0x3f, 0x3f, 0x3f, 0x7f, | ||
| 135 | 0x7f, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x3f, 0x3f, 0x3f, 0x1f, 0x1f, 0x1f, 0xae, 0xae, | ||
| 136 | 0xae, 0x44, 0x44, 0x44, 0x00, 0xff} | ||
| 137 | }; | ||
| 138 | static const char PROGMEM custom[][38] = { | ||
| 139 | {0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, 0x82, 0x42, | ||
| 140 | 0xc2, 0x42, 0xa2, 0x62, 0xa2, 0x42, 0xc2, 0x42, 0x82, 0x82, 0x82, 0x02, 0x02, 0x02, 0x02, 0x02, | ||
| 141 | 0x02, 0x02, 0x02, 0x02, 0x02, 0xfe}, | ||
| 142 | {0x00, 0xff, 0x00, 0x44, 0x44, 0x44, 0xaa, 0xee, 0xaa, 0x55, 0xbb, 0x55, 0xaa, 0x75, 0xaa, 0x55, | ||
| 143 | 0xea, 0x55, 0xaa, 0xd5, 0xaa, 0x55, 0xea, 0x55, 0xaa, 0x75, 0xaa, 0x55, 0xbb, 0x55, 0xaa, 0xee, | ||
| 144 | 0xaa, 0x44, 0x44, 0x44, 0x00, 0xff}, | ||
| 145 | {0x00, 0xff, 0x00, 0x44, 0x44, 0x44, 0xaa, 0xee, 0xaa, 0x55, 0xbb, 0x55, 0xaa, 0x77, 0xaa, 0x55, | ||
| 146 | 0xee, 0x55, 0xaa, 0xdd, 0xaa, 0x55, 0xee, 0x55, 0xaa, 0x77, 0xaa, 0x55, 0xbb, 0x55, 0xaa, 0xee, | ||
| 147 | 0xaa, 0x44, 0x44, 0x44, 0x00, 0xff}, | ||
| 148 | {0x00, 0x7f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x42, 0x43, 0x42, 0x45, | ||
| 149 | 0x46, 0x45, 0x4a, 0x4d, 0x4a, 0x45, 0x46, 0x45, 0x42, 0x43, 0x42, 0x41, 0x41, 0x41, 0x40, 0x40, | ||
| 150 | 0x40, 0x40, 0x40, 0x40, 0x40, 0x7f} | ||
| 151 | }; | ||
| 46 | 152 | ||
| 47 | oled_write_P(qmk_logo, false); | 153 | switch (get_highest_layer(layer_state)) { |
| 154 | case 0: | ||
| 155 | oled_render_image(1, 38, layer_background_r1, 15, 4, 0); | ||
| 156 | oled_render_image(1, 38, layer_background_r2, 15, 5, 0); | ||
| 157 | oled_render_image(1, 38, base, 15, 6, 0); | ||
| 158 | oled_render_image(1, 38, layer_background_r4, 15, 7, 0); | ||
| 159 | break; | ||
| 160 | case 3: | ||
| 161 | oled_render_image(2, 38, lower, 15, 6, 0); | ||
| 162 | break; | ||
| 163 | case 4: | ||
| 164 | oled_render_image(1, 38, layer_background_r1, 15, 4, 0); | ||
| 165 | oled_render_image(2, 38, raise, 15, 5, 0); | ||
| 166 | oled_render_image(1, 38, layer_background_r4, 15, 7, 0); | ||
| 167 | break; | ||
| 168 | case 5: | ||
| 169 | oled_render_image(2, 38, adjust, 15, 4, 0); | ||
| 170 | oled_render_image(1, 38, layer_background_r3, 15, 6, 0); | ||
| 171 | oled_render_image(1, 38, layer_background_r4, 15, 7, 0); | ||
| 172 | break; | ||
| 173 | default: | ||
| 174 | oled_render_image(4, 38, custom, 15, 4, 0); | ||
| 175 | break; | ||
| 176 | } | ||
| 177 | } | ||
| 178 | |||
| 179 | void render_mod_state(uint8_t modifiers) { | ||
| 180 | static const char PROGMEM gui_off [][3]= {{0x80, 0x81, 0}, {0xa0, 0xa1, 0}}; | ||
| 181 | static const char PROGMEM gui_on [][3]= {{0xc0, 0xc1, 0}, {0xe0, 0xe1, 0}}; | ||
| 182 | static const char PROGMEM alt_off [][3]= {{0x82, 0x83, 0}, {0xa2, 0xa3, 0}}; | ||
| 183 | static const char PROGMEM alt_on [][3]= {{0xc2, 0xc3, 0}, {0xe2, 0xe3, 0}}; | ||
| 184 | static const char PROGMEM ctrl_off [][3]= {{0x84, 0x85, 0}, {0xa4, 0xa5, 0}}; | ||
| 185 | static const char PROGMEM ctrl_on [][3]= {{0xc4, 0xc5, 0}, {0xe4, 0xe5, 0}}; | ||
| 186 | static const char PROGMEM shift_off [][3]= {{0x86, 0x87, 0}, {0xa6, 0xa7, 0}}; | ||
| 187 | static const char PROGMEM shift_on [][3]= {{0xc6, 0xc7, 0}, {0xe6, 0xe7, 0}}; | ||
| 188 | |||
| 189 | // fillers between the modifier icons bleed into the icon frames | ||
| 190 | |||
| 191 | static const char PROGMEM off_off [][2]= {{0x9e, 0}, {0xbe, 0}}; | ||
| 192 | static const char PROGMEM on_on [][2]= {{0xdf, 0}, {0xff, 0}}; | ||
| 193 | static const char PROGMEM on_off [][2]= {{0xde, 0}, {0xfe, 0}}; | ||
| 194 | static const char PROGMEM off_on [][2]= {{0x9f, 0}, {0xbf, 0}}; | ||
| 195 | |||
| 196 | // render icons | ||
| 197 | |||
| 198 | if(modifiers & MOD_MASK_GUI) { | ||
| 199 | oled_set_cursor(0, 4); | ||
| 200 | oled_write_P(gui_on[0], false); | ||
| 201 | oled_set_cursor(0, 5); | ||
| 202 | oled_write_P(gui_on[1], false); | ||
| 203 | } else { | ||
| 204 | oled_set_cursor(0, 4); | ||
| 205 | oled_write_P(gui_off[0], false); | ||
| 206 | oled_set_cursor(0, 5); | ||
| 207 | oled_write_P(gui_off[1], false); | ||
| 208 | } | ||
| 209 | if(modifiers & MOD_MASK_ALT) { | ||
| 210 | oled_set_cursor(3, 4); | ||
| 211 | oled_write_P(alt_on[0], false); | ||
| 212 | oled_set_cursor(3, 5); | ||
| 213 | oled_write_P(alt_on[1], false); | ||
| 214 | } else { | ||
| 215 | oled_set_cursor(3, 4); | ||
| 216 | oled_write_P(alt_off[0], false); | ||
| 217 | oled_set_cursor(3, 5); | ||
| 218 | oled_write_P(alt_off[1], false); | ||
| 219 | } | ||
| 220 | if(modifiers & MOD_MASK_CTRL) { | ||
| 221 | oled_set_cursor(0, 6); | ||
| 222 | oled_write_P(ctrl_on[0], false); | ||
| 223 | oled_set_cursor(0, 7); | ||
| 224 | oled_write_P(ctrl_on[1], false); | ||
| 225 | } else { | ||
| 226 | oled_set_cursor(0, 6); | ||
| 227 | oled_write_P(ctrl_off[0], false); | ||
| 228 | oled_set_cursor(0, 7); | ||
| 229 | oled_write_P(ctrl_off[1], false); | ||
| 230 | } | ||
| 231 | if(modifiers & MOD_MASK_SHIFT) { | ||
| 232 | oled_set_cursor(3, 6); | ||
| 233 | oled_write_P(shift_on[0], false); | ||
| 234 | oled_set_cursor(3, 7); | ||
| 235 | oled_write_P(shift_on[1], false); | ||
| 236 | } else { | ||
| 237 | oled_set_cursor(3, 6); | ||
| 238 | oled_write_P(shift_off[0], false); | ||
| 239 | oled_set_cursor(3, 7); | ||
| 240 | oled_write_P(shift_off[1], false); | ||
| 241 | } | ||
| 242 | |||
| 243 | // render fillers | ||
| 244 | |||
| 245 | if ((modifiers & MOD_MASK_GUI) && (modifiers & MOD_MASK_ALT)) { | ||
| 246 | oled_set_cursor(2, 4); | ||
| 247 | oled_write_P(on_on[0], false); | ||
| 248 | oled_set_cursor(2, 5); | ||
| 249 | oled_write_P(on_on[1], false); | ||
| 250 | } else if(modifiers & MOD_MASK_GUI) { | ||
| 251 | oled_set_cursor(2, 4); | ||
| 252 | oled_write_P(on_off[0], false); | ||
| 253 | oled_set_cursor(2, 5); | ||
| 254 | oled_write_P(on_off[1], false); | ||
| 255 | } else if(modifiers & MOD_MASK_ALT) { | ||
| 256 | oled_set_cursor(2, 4); | ||
| 257 | oled_write_P(off_on[0], false); | ||
| 258 | oled_set_cursor(2, 5); | ||
| 259 | oled_write_P(off_on[1], false); | ||
| 260 | } else { | ||
| 261 | oled_set_cursor(2, 4); | ||
| 262 | oled_write_P(off_off[0], false); | ||
| 263 | oled_set_cursor(2, 5); | ||
| 264 | oled_write_P(off_off[1], false); | ||
| 265 | } | ||
| 266 | |||
| 267 | if ((modifiers & MOD_MASK_CTRL) && (modifiers & MOD_MASK_SHIFT)) { | ||
| 268 | oled_set_cursor(2, 6); | ||
| 269 | oled_write_P(on_on[0], false); | ||
| 270 | oled_set_cursor(2, 7); | ||
| 271 | oled_write_P(on_on[1], false); | ||
| 272 | } else if(modifiers & MOD_MASK_CTRL) { | ||
| 273 | oled_set_cursor(2, 6); | ||
| 274 | oled_write_P(on_off[0], false); | ||
| 275 | oled_set_cursor(2, 7); | ||
| 276 | oled_write_P(on_off[1], false); | ||
| 277 | } else if(modifiers & MOD_MASK_SHIFT) { | ||
| 278 | oled_set_cursor(2, 6); | ||
| 279 | oled_write_P(off_on[0], false); | ||
| 280 | oled_set_cursor(2, 7); | ||
| 281 | oled_write_P(off_on[1], false); | ||
| 282 | } else { | ||
| 283 | oled_set_cursor(2, 6); | ||
| 284 | oled_write_P(off_off[0], false); | ||
| 285 | oled_set_cursor(2, 7); | ||
| 286 | oled_write_P(off_off[1], false); | ||
| 287 | } | ||
| 48 | } | 288 | } |
| 49 | 289 | ||
| 50 | void render_bootmagic_status(void) { | 290 | void render_bootmagic_status(void) { |
| 51 | oled_write_P((keymap_config.swap_lctl_lgui) ? PSTR("OS: Windows\n\n") : PSTR("OS: MacOS\n\n"), false); | 291 | static const char PROGMEM nkro_off [][3]= {{0x88, 0x89, 0}, {0xa8, 0xa9, 0}}; |
| 52 | oled_write_P((keymap_config.nkro) ? PSTR("NKRO ") : PSTR(" "), false); | 292 | static const char PROGMEM nkro_on [][3]= {{0xc8, 0xc9, 0}, {0xe8, 0xe9, 0}}; |
| 293 | static const char PROGMEM mac_os_off [][6]= {{0x90, 0x91, 0x92, 0x93, 0x94, 0}, {0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0}}; | ||
| 294 | static const char PROGMEM mac_os_on [][6]= {{0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0}, {0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0}}; | ||
| 295 | static const char PROGMEM windows_off [][6]= {{0x95, 0x96, 0x97, 0x98, 0x99, 0}, {0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0}}; | ||
| 296 | static const char PROGMEM windows_on [][6]= {{0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0}, {0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0}}; | ||
| 297 | |||
| 298 | if (keymap_config.nkro) { | ||
| 299 | oled_set_cursor(5, 4); | ||
| 300 | oled_write_P(nkro_on[0], false); | ||
| 301 | oled_set_cursor(5, 5); | ||
| 302 | oled_write_P(nkro_on[1], false); | ||
| 303 | } else { | ||
| 304 | oled_set_cursor(5, 4); | ||
| 305 | oled_write_P(nkro_off[0], false); | ||
| 306 | oled_set_cursor(5, 5); | ||
| 307 | oled_write_P(nkro_off[1], false); | ||
| 308 | } | ||
| 309 | if (keymap_config.swap_lctl_lgui) { | ||
| 310 | oled_set_cursor(10, 6); | ||
| 311 | oled_write_P(windows_on[0], false); | ||
| 312 | oled_set_cursor(10, 7); | ||
| 313 | oled_write_P(windows_on[1], false); | ||
| 314 | oled_set_cursor(10, 4); | ||
| 315 | oled_write_P(mac_os_off[0], false); | ||
| 316 | oled_set_cursor(10, 5); | ||
| 317 | oled_write_P(mac_os_off[1], false); | ||
| 318 | } else { | ||
| 319 | oled_set_cursor(10, 4); | ||
| 320 | oled_write_P(mac_os_on[0], false); | ||
| 321 | oled_set_cursor(10, 5); | ||
| 322 | oled_write_P(mac_os_on[1], false); | ||
| 323 | oled_set_cursor(10, 6); | ||
| 324 | oled_write_P(windows_off[0], false); | ||
| 325 | oled_set_cursor(10, 7); | ||
| 326 | oled_write_P(windows_off[1], false); | ||
| 327 | } | ||
| 328 | } | ||
| 329 | |||
| 330 | void render_lock_status(void) { | ||
| 331 | static const char PROGMEM caps_off [][3]= {{0x8a, 0x8b, 0}, {0xaa, 0xab, 0}}; | ||
| 332 | static const char PROGMEM caps_on [][3]= {{0xca, 0xcb, 0}, {0xea, 0xeb, 0}}; | ||
| 333 | static const char PROGMEM num_off [][3]= {{0x8c, 0x8d, 0}, {0xac, 0xad, 0}}; | ||
| 334 | static const char PROGMEM num_on [][3]= {{0xcc, 0xcd, 0}, {0xec, 0xed, 0}}; | ||
| 335 | static const char PROGMEM scrl_off [][3]= {{0x8e, 0x8f, 0}, {0xae, 0xaf, 0}}; | ||
| 336 | static const char PROGMEM scrl_on [][3]= {{0xce, 0xcf, 0}, {0xee, 0xef, 0}}; | ||
| 337 | |||
| 338 | static const char PROGMEM off_off [][2]= {{0x9e, 0}, {0xbe, 0}}; | ||
| 339 | static const char PROGMEM on_on [][2]= {{0xdf, 0}, {0xff, 0}}; | ||
| 340 | static const char PROGMEM on_off [][2]= {{0xde, 0}, {0xfe, 0}}; | ||
| 341 | static const char PROGMEM off_on [][2]= {{0x9f, 0}, {0xbf, 0}}; | ||
| 342 | |||
| 343 | led_t led_usb_state = host_keyboard_led_state(); | ||
| 344 | if (led_usb_state.caps_lock) { | ||
| 345 | oled_set_cursor(8, 4); | ||
| 346 | oled_write_P(caps_on[0], false); | ||
| 347 | oled_set_cursor(8, 5); | ||
| 348 | oled_write_P(caps_on[1], false); | ||
| 349 | } else { | ||
| 350 | oled_set_cursor(8, 4); | ||
| 351 | oled_write_P(caps_off[0], false); | ||
| 352 | oled_set_cursor(8, 5); | ||
| 353 | oled_write_P(caps_off[1], false); | ||
| 354 | } | ||
| 355 | if (led_usb_state.num_lock) { | ||
| 356 | oled_set_cursor(5, 6); | ||
| 357 | oled_write_P(num_on[0], false); | ||
| 358 | oled_set_cursor(5, 7); | ||
| 359 | oled_write_P(num_on[1], false); | ||
| 360 | } else { | ||
| 361 | oled_set_cursor(5, 6); | ||
| 362 | oled_write_P(num_off[0], false); | ||
| 363 | oled_set_cursor(5, 7); | ||
| 364 | oled_write_P(num_off[1], false); | ||
| 365 | } | ||
| 366 | if (led_usb_state.scroll_lock) { | ||
| 367 | oled_set_cursor(8, 6); | ||
| 368 | oled_write_P(scrl_on[0], false); | ||
| 369 | oled_set_cursor(8, 7); | ||
| 370 | oled_write_P(scrl_on[1], false); | ||
| 371 | } else { | ||
| 372 | oled_set_cursor(8, 6); | ||
| 373 | oled_write_P(scrl_off[0], false); | ||
| 374 | oled_set_cursor(8, 7); | ||
| 375 | oled_write_P(scrl_off[1], false); | ||
| 376 | } | ||
| 377 | |||
| 378 | // render fillers | ||
| 379 | |||
| 380 | if ((led_usb_state.caps_lock) && (keymap_config.nkro)) { | ||
| 381 | oled_set_cursor(7, 4); | ||
| 382 | oled_write_P(on_on[0], false); | ||
| 383 | oled_set_cursor(7, 5); | ||
| 384 | oled_write_P(on_on[1], false); | ||
| 385 | } else if(keymap_config.nkro) { | ||
| 386 | oled_set_cursor(7, 4); | ||
| 387 | oled_write_P(on_off[0], false); | ||
| 388 | oled_set_cursor(7, 5); | ||
| 389 | oled_write_P(on_off[1], false); | ||
| 390 | } else if(led_usb_state.caps_lock) { | ||
| 391 | oled_set_cursor(7, 4); | ||
| 392 | oled_write_P(off_on[0], false); | ||
| 393 | oled_set_cursor(7, 5); | ||
| 394 | oled_write_P(off_on[1], false); | ||
| 395 | } else { | ||
| 396 | oled_set_cursor(7, 4); | ||
| 397 | oled_write_P(off_off[0], false); | ||
| 398 | oled_set_cursor(7, 5); | ||
| 399 | oled_write_P(off_off[1], false); | ||
| 400 | } | ||
| 401 | if ((led_usb_state.num_lock) && (led_usb_state.scroll_lock)) { | ||
| 402 | oled_set_cursor(7, 6); | ||
| 403 | oled_write_P(on_on[0], false); | ||
| 404 | oled_set_cursor(7, 7); | ||
| 405 | oled_write_P(on_on[1], false); | ||
| 406 | } else if(led_usb_state.num_lock) { | ||
| 407 | oled_set_cursor(7, 6); | ||
| 408 | oled_write_P(on_off[0], false); | ||
| 409 | oled_set_cursor(7, 7); | ||
| 410 | oled_write_P(on_off[1], false); | ||
| 411 | } else if(led_usb_state.scroll_lock) { | ||
| 412 | oled_set_cursor(7, 6); | ||
| 413 | oled_write_P(off_on[0], false); | ||
| 414 | oled_set_cursor(7, 7); | ||
| 415 | oled_write_P(off_on[1], false); | ||
| 416 | } else { | ||
| 417 | oled_set_cursor(7, 6); | ||
| 418 | oled_write_P(off_off[0], false); | ||
| 419 | oled_set_cursor(7, 7); | ||
| 420 | oled_write_P(off_off[1], false); | ||
| 421 | } | ||
| 53 | } | 422 | } |
| 54 | 423 | ||
| 55 | void render_wpm(void) { | 424 | |
| 56 | //get current WPM value | 425 | |
| 57 | currwpm = get_current_wpm(); | 426 | void render_wpm_graph(void) { |
| 58 | //check if it's been long enough before refreshing graph | 427 | currwpm = get_current_wpm(); //get current WPM value |
| 59 | if(timer_elapsed(timer) > graph_refresh_interval){ | 428 | if(timer_elapsed(timer) > graph_refresh_interval){ //check if it's been long enough before refreshing graph |
| 60 | // main calculation to plot graph line | 429 | x = 63 - ((currwpm / max_wpm) * 63); // main calculation to plot graph line |
| 61 | x = 64 - ((currwpm / max_wpm) * 64); | 430 | for(int i = 0; i <= graph_line_thickness - 1; i++){ //first draw actual value line |
| 62 | //first draw actual value line | 431 | oled_write_pixel(1, x + i, true); |
| 63 | for(int i = 0; i <= graph_line_thickness - 1; i++){ | ||
| 64 | oled_write_pixel(1, x + i, true); | ||
| 65 | } | 432 | } |
| 66 | //then fill in area below the value line | 433 | if(vert_line){ //then fill in area below the value line |
| 67 | if(vert_line){ | 434 | if(vert_count == vert_interval){ |
| 68 | if(vert_count == vert_interval){ | 435 | vert_count = 0; |
| 69 | vert_count = 0; | 436 | while(x <= 63){ |
| 70 | while(x <= 64){ | 437 | oled_write_pixel(1, x, true); |
| 71 | oled_write_pixel(1, x, true); | 438 | x++; |
| 72 | x++; | ||
| 73 | } | ||
| 74 | } else { | ||
| 75 | for(int i = 64; i > x; i--){ | ||
| 76 | if(i % graph_area_fill_interval == 0){ | ||
| 77 | oled_write_pixel(1, i, true); | ||
| 78 | } | ||
| 79 | } | 439 | } |
| 80 | vert_count++; | ||
| 81 | } | ||
| 82 | } else { | 440 | } else { |
| 83 | for(int i = 64; i > x; i--){ | 441 | for(int i = 63; i > x; i--){ |
| 84 | if(i % graph_area_fill_interval == 0){ | 442 | if(i % graph_area_fill_interval == 0){ |
| 85 | oled_write_pixel(1, i, true); | 443 | oled_write_pixel(1, i, true); |
| 86 | } | 444 | } |
| 87 | } | 445 | } |
| 446 | vert_count++; | ||
| 447 | } | ||
| 448 | } else { | ||
| 449 | for(int i = 63; i > x; i--){ | ||
| 450 | if(i % graph_area_fill_interval == 0){ | ||
| 451 | oled_write_pixel(1, i, true); | ||
| 452 | } | ||
| 88 | } | 453 | } |
| 89 | //then move the entire graph one pixel to the right | ||
| 90 | oled_pan(false); | ||
| 91 | //refresh the timer for the next iteration | ||
| 92 | timer = timer_read(); | ||
| 93 | } | 454 | } |
| 94 | //format current WPM value into a printable string | 455 | oled_pan(false); //then move the entire graph one pixel to the right |
| 95 | char buf[4]; | 456 | timer = timer_read(); //refresh the timer for the next iteration |
| 96 | oled_set_cursor(14, 0); | 457 | } |
| 97 | oled_write("WPM:", false); | 458 | char buf[4]; //format current WPM value into a printable string |
| 98 | buf[0] = currwpm >= 100 ? ((currwpm/100) + '0') : ' '; | 459 | oled_set_cursor(14, 0); |
| 99 | buf[1] = currwpm >= 10 ? (((currwpm/10) % 10) + '0') : ' '; | 460 | oled_write("WPM:", false); |
| 100 | buf[2] = (currwpm % 10) + '0'; | 461 | buf[0] = currwpm >= 100 ? ((currwpm/100) + '0') : ' '; |
| 101 | buf[3] = 0; | 462 | buf[1] = currwpm >= 10 ? (((currwpm/10) % 10) + '0') : ' '; |
| 102 | oled_write(buf, false); | 463 | buf[2] = (currwpm % 10) + '0'; |
| 464 | buf[3] = 0; | ||
| 465 | oled_write(buf, false); | ||
| 103 | } | 466 | } |
| 104 | 467 | ||
| 105 | static void render_status(void) { | 468 | void render_status_main(void) { |
| 106 | // QMK Logo and version information | 469 | render_qmk_logo(); |
| 107 | render_qmk_logo(); | 470 | render_layers(); |
| 108 | oled_write_P(PSTR("Kyria: Rev1.0\n"), false); | 471 | render_mod_state(get_mods()); |
| 109 | 472 | render_bootmagic_status(); | |
| 110 | // Host Keyboard Layer Status | 473 | render_lock_status(); |
| 111 | oled_write_P(PSTR("Layer: "), false); | 474 | |
| 112 | switch (get_highest_layer(layer_state)) { | 475 | } |
| 113 | case 0: | 476 | |
| 114 | oled_write_P(PSTR("Default\n"), false); | 477 | void render_status_secondary(void) { |
| 115 | break; | 478 | render_wpm_graph(); |
| 116 | case 1: | ||
| 117 | oled_write_P(PSTR("Lower\n"), false); | ||
| 118 | break; | ||
| 119 | case 2: | ||
| 120 | oled_write_P(PSTR("Raise\n"), false); | ||
| 121 | break; | ||
| 122 | case 3: | ||
| 123 | oled_write_P(PSTR("Adjust\n"), false); | ||
| 124 | break; | ||
| 125 | default: | ||
| 126 | oled_write_P(PSTR("Undefined\n"), false); | ||
| 127 | } | ||
| 128 | |||
| 129 | render_bootmagic_status(); | ||
| 130 | |||
| 131 | // Host Keyboard LED Status | ||
| 132 | led_t led_state = host_keyboard_led_state(); | ||
| 133 | oled_write_P(led_state.caps_lock ? PSTR("CAPLCK ") : PSTR(" "), false); | ||
| 134 | } | 479 | } |
| 135 | 480 | ||
| 136 | void oled_task_user(void) { | 481 | void oled_task_user(void) { |
| 137 | if (is_keyboard_master()) { | 482 | if (is_keyboard_master()) { |
| 138 | render_status(); | 483 | render_status_main(); // Renders the current keyboard state (layer, lock, caps, scroll, etc) |
| 139 | } else { | 484 | } else { |
| 140 | render_wpm(); | 485 | render_status_secondary(); |
| 141 | } | 486 | } |
| 142 | } | 487 | } |
| 488 | |||
| 143 | #endif | 489 | #endif |
