1 #include "satisfaction75.h"
2 #include "micro_oled.h"
6 #ifdef QWIIC_MICRO_OLED_ENABLE
8 last_flush = timer_read();
9 send_command(DISPLAYON);
23 send_command(DISPLAYOFF);
29 void draw_encoder(int8_t startX, int8_t startY, bool show_legend){
31 draw_string(startX + 1, startY + 2, "ENC", PIXEL_ON, NORM, 0);
35 draw_rect_filled_soft(startX + 22, startY + 1, 3 + (3 * 6), 9, PIXEL_ON, NORM);
36 char* mode_string = "";
48 case ENC_MODE_BRIGHTNESS:
51 case ENC_MODE_BACKLIGHT:
54 case ENC_MODE_CLOCK_SET:
57 case ENC_MODE_CUSTOM0:
60 case ENC_MODE_CUSTOM1:
63 case ENC_MODE_CUSTOM2:
67 draw_string(startX + 24, startY + 2, mode_string, PIXEL_ON, XOR, 0);
70 void draw_layer_section(int8_t startX, int8_t startY, bool show_legend){
72 draw_string(startX + 1, startY + 2, "LAYER", PIXEL_ON, NORM, 0);
76 draw_rect_filled_soft(startX + 32, startY + 1, 9, 9, PIXEL_ON, NORM);
77 draw_char(startX + 34, startY + 2, layer + 0x30, PIXEL_ON, XOR, 0);
81 uint8_t hour = last_minute / 60;
82 uint16_t minute = last_minute % 60;
84 if(encoder_mode == ENC_MODE_CLOCK_SET){
86 minute = minute_config;
89 bool is_pm = (hour / 12) > 0;
94 char hour_str[2] = "";
97 sprintf(hour_str, "%02d", hour);
98 sprintf(min_str, "%02d", minute);
100 uint8_t mods = get_mods();
102 /* Layer indicator is 41 x 10 pixels */
103 draw_layer_section(0,0,true);
105 #define ENCODER_INDICATOR_X 45
106 #define ENCODER_INDICATOR_Y 0
107 draw_encoder(ENCODER_INDICATOR_X, ENCODER_INDICATOR_Y, true);
108 /* Matrix display is 19 x 9 pixels */
109 #define MATRIX_DISPLAY_X 0
110 #define MATRIX_DISPLAY_Y 18
112 for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
113 for (uint8_t y = 0; y < MATRIX_COLS; y++) {
114 draw_pixel(MATRIX_DISPLAY_X + y + 2, MATRIX_DISPLAY_Y + x + 2,(matrix_get_row(x) & (1 << y)) > 0, NORM);
117 draw_rect_soft(MATRIX_DISPLAY_X, MATRIX_DISPLAY_Y, 19, 9, PIXEL_ON, NORM);
118 /* hadron oled location on thumbnail */
119 draw_rect_filled_soft(MATRIX_DISPLAY_X + 14, MATRIX_DISPLAY_Y + 2, 3, 1, PIXEL_ON, NORM);
121 /* Mod display is 41 x 16 pixels */
122 #define MOD_DISPLAY_X 30
123 #define MOD_DISPLAY_Y 18
125 if (mods & MOD_LSFT) {
126 draw_rect_filled_soft(MOD_DISPLAY_X + 0, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
127 draw_string(MOD_DISPLAY_X + 3, MOD_DISPLAY_Y + 2, "S", PIXEL_OFF, NORM, 0);
129 draw_string(MOD_DISPLAY_X + 3, MOD_DISPLAY_Y + 2, "S", PIXEL_ON, NORM, 0);
131 if (mods & MOD_LCTL) {
132 draw_rect_filled_soft(MOD_DISPLAY_X + 10, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
133 draw_string(MOD_DISPLAY_X + 13, MOD_DISPLAY_Y + 2, "C", PIXEL_OFF, NORM, 0);
135 draw_string(MOD_DISPLAY_X + 13, MOD_DISPLAY_Y + 2, "C", PIXEL_ON, NORM, 0);
137 if (mods & MOD_LALT) {
138 draw_rect_filled_soft(MOD_DISPLAY_X + 20, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
139 draw_string(MOD_DISPLAY_X + 23, MOD_DISPLAY_Y + 2, "A", PIXEL_OFF, NORM, 0);
141 draw_string(MOD_DISPLAY_X + 23, MOD_DISPLAY_Y + 2, "A", PIXEL_ON, NORM, 0);
143 if (mods & MOD_LGUI) {
144 draw_rect_filled_soft(MOD_DISPLAY_X + 30, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
145 draw_string(MOD_DISPLAY_X + 33, MOD_DISPLAY_Y + 2, "G", PIXEL_OFF, NORM, 0);
147 draw_string(MOD_DISPLAY_X + 33, MOD_DISPLAY_Y + 2, "G", PIXEL_ON, NORM, 0);
150 /* Lock display is 23 x 21 */
151 #define LOCK_DISPLAY_X 100
152 #define LOCK_DISPLAY_Y 0
154 if (led_capslock == true) {
155 draw_rect_filled_soft(LOCK_DISPLAY_X + 0, LOCK_DISPLAY_Y, 5 + (3 * 6), 9, PIXEL_ON, NORM);
156 draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y +1, "CAP", PIXEL_OFF, NORM, 0);
157 } else if (led_capslock == false) {
158 draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y +1, "CAP", PIXEL_ON, NORM, 0);
161 if (led_scrolllock == true) {
162 draw_rect_filled_soft(LOCK_DISPLAY_X + 0, LOCK_DISPLAY_Y + 11, 5 + (3 * 6), 9, PIXEL_ON, NORM);
163 draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 11 +1, "SCR", PIXEL_OFF, NORM, 0);
164 } else if (led_scrolllock == false) {
165 draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 11 +1, "SCR", PIXEL_ON, NORM, 0);
168 #define TIME_DISPLAY_X 82
169 #define TIME_DISPLAY_Y 22
170 draw_string(TIME_DISPLAY_X, TIME_DISPLAY_Y, hour_str, PIXEL_ON, NORM, 0);
171 draw_string(TIME_DISPLAY_X + 11, TIME_DISPLAY_Y, ":", PIXEL_ON, NORM, 0);
172 draw_string(TIME_DISPLAY_X + 15, TIME_DISPLAY_Y, min_str, PIXEL_ON, NORM, 0);
174 draw_string(TIME_DISPLAY_X + 27, TIME_DISPLAY_Y, "pm", PIXEL_ON, NORM, 0);
176 draw_string(TIME_DISPLAY_X + 27, TIME_DISPLAY_Y, "am", PIXEL_ON, NORM, 0);
183 int8_t hour = last_minute / 60;
184 int16_t minute = last_minute % 60;
185 int16_t year = last_timespec.year + 1980;
186 int8_t month = last_timespec.month;
187 int8_t day = last_timespec.day;
189 if(encoder_mode == ENC_MODE_CLOCK_SET){
191 minute = minute_config;
192 year = year_config + 1980;
193 month = month_config;
197 bool is_pm = (hour / 12) > 0;
202 char hour_str[2] = "";
203 char min_str[2] = "";
204 char year_str[4] = "";
205 char month_str[2] = "";
206 char day_str[2] = "";
208 sprintf(hour_str, "%02d", hour);
209 sprintf(min_str, "%02d", minute);
210 sprintf(year_str, "%d", year);
211 sprintf(month_str, "%02d", month);
212 sprintf(day_str, "%02d", day);
215 #define DATE_DISPLAY_X 6
216 #define DATE_DISPLAY_Y 0
217 draw_string(DATE_DISPLAY_X, DATE_DISPLAY_Y, year_str, PIXEL_ON, NORM, 0);
218 draw_string(DATE_DISPLAY_X + 25, DATE_DISPLAY_Y, "-", PIXEL_ON, NORM, 0);
219 draw_string(DATE_DISPLAY_X + 31, DATE_DISPLAY_Y, month_str, PIXEL_ON, NORM, 0);
220 draw_string(DATE_DISPLAY_X + 44, DATE_DISPLAY_Y, "-", PIXEL_ON, NORM, 0);
221 draw_string(DATE_DISPLAY_X + 50, DATE_DISPLAY_Y, day_str, PIXEL_ON, NORM, 0);
223 #define CLOCK_DISPLAY_X 6
224 #define CLOCK_DISPLAY_Y 14
225 draw_string(CLOCK_DISPLAY_X, CLOCK_DISPLAY_Y, hour_str, PIXEL_ON, NORM, 1);
226 draw_string(CLOCK_DISPLAY_X + 17, CLOCK_DISPLAY_Y, ":", PIXEL_ON, NORM, 1);
227 draw_string(CLOCK_DISPLAY_X + 25, CLOCK_DISPLAY_Y, min_str, PIXEL_ON, NORM, 1);
229 draw_string(CLOCK_DISPLAY_X + 41, CLOCK_DISPLAY_Y, "pm", PIXEL_ON, NORM, 1);
231 draw_string(CLOCK_DISPLAY_X + 41, CLOCK_DISPLAY_Y, "am", PIXEL_ON, NORM, 1);
235 switch(time_config_idx){
238 draw_line(CLOCK_DISPLAY_X, CLOCK_DISPLAY_Y + 17, CLOCK_DISPLAY_X + 16, CLOCK_DISPLAY_Y + 17, PIXEL_ON, NORM);
241 draw_line(CLOCK_DISPLAY_X + 25, CLOCK_DISPLAY_Y + 17, CLOCK_DISPLAY_X + 41, CLOCK_DISPLAY_Y + 17, PIXEL_ON, NORM);
244 draw_line(DATE_DISPLAY_X, DATE_DISPLAY_Y + 9, DATE_DISPLAY_X + 23, DATE_DISPLAY_Y + 9, PIXEL_ON, NORM);
247 draw_line(DATE_DISPLAY_X + 31, DATE_DISPLAY_Y + 9, DATE_DISPLAY_X + 43, DATE_DISPLAY_Y + 9, PIXEL_ON, NORM);
250 draw_line(DATE_DISPLAY_X + 50, DATE_DISPLAY_Y + 9, DATE_DISPLAY_X + 61, DATE_DISPLAY_Y + 9,PIXEL_ON, NORM);
255 draw_encoder(80, 0, true);
256 draw_layer_section(80, 11, true);
258 #define CAPS_DISPLAY_X 86
259 #define CAPS_DISPLAY_Y 22
261 if (led_capslock == true) {
262 draw_rect_filled_soft(CAPS_DISPLAY_X, CAPS_DISPLAY_Y, 5 + (4 * 6), 9, PIXEL_ON, NORM);
263 draw_string(CAPS_DISPLAY_X + 3, CAPS_DISPLAY_Y +1, "CAPS", PIXEL_OFF, NORM, 0);
264 } else if (led_capslock == false) {
265 draw_string(CAPS_DISPLAY_X + 3, CAPS_DISPLAY_Y +1, "CAPS", PIXEL_ON, NORM, 0);