]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/cannonkeys/satisfaction75/satisfaction_oled.c
Update keyboards/kbdfans/kbd67/readme.md
[qmk_firmware.git] / keyboards / cannonkeys / satisfaction75 / satisfaction_oled.c
1 #include "satisfaction75.h"
2 #include "micro_oled.h"
3
4 __attribute__ ((weak))
5 void draw_ui() {
6   clear_buffer();
7   last_flush = timer_read();
8   send_command(DISPLAYON);
9   if(clock_set_mode){
10     draw_clock();
11     return;
12   }
13   switch (oled_mode){
14     default:
15     case OLED_DEFAULT:
16       draw_default();
17       break;
18     case OLED_TIME:
19       draw_clock();
20       break;
21     case OLED_OFF:
22       send_command(DISPLAYOFF);
23       break;
24   }
25 }
26
27 void draw_encoder(int8_t startX, int8_t startY, bool show_legend){
28   if(show_legend){
29     draw_string(startX + 1, startY + 2, "ENC", PIXEL_ON, NORM, 0);
30   } else {
31     startX -= 22;
32   }
33   draw_rect_filled_soft(startX + 22, startY + 1, 3 + (3 * 6), 9, PIXEL_ON, NORM);
34   char* mode_string = "";
35   switch(encoder_mode){
36     default:
37     case ENC_MODE_VOLUME:
38       mode_string = "VOL";
39       break;
40     case ENC_MODE_MEDIA:
41       mode_string = "MED";
42       break;
43     case ENC_MODE_SCROLL:
44       mode_string = "SCR";
45       break;
46     case ENC_MODE_BRIGHTNESS:
47       mode_string = "BRT";
48       break;
49     case ENC_MODE_BACKLIGHT:
50       mode_string = "BKL";
51       break;
52     case ENC_MODE_CLOCK_SET:
53       mode_string = "CLK";
54       break;
55     case ENC_MODE_CUSTOM0:
56       mode_string = "CS0";
57       break;
58     case ENC_MODE_CUSTOM1:
59       mode_string = "CS1";
60       break;
61     case ENC_MODE_CUSTOM2:
62       mode_string = "CS2";
63       break;
64   }
65   draw_string(startX + 24, startY + 2, mode_string, PIXEL_ON, XOR, 0);
66 }
67
68 void draw_layer_section(int8_t startX, int8_t startY, bool show_legend){
69   if(show_legend){
70     draw_string(startX + 1, startY + 2, "LAYER", PIXEL_ON, NORM, 0);
71   } else {
72     startX -= 32;
73   }
74   draw_rect_filled_soft(startX + 32, startY + 1, 9, 9, PIXEL_ON, NORM);
75   draw_char(startX + 34, startY + 2, layer + 0x30, PIXEL_ON, XOR, 0);
76 }
77
78 void draw_default(){
79   uint8_t hour = last_minute / 60;
80   uint16_t minute = last_minute % 60;
81
82   if(encoder_mode == ENC_MODE_CLOCK_SET){
83     hour = hour_config;
84     minute = minute_config;
85   }
86
87   bool is_pm = (hour / 12) > 0;
88   hour = hour % 12;
89   if (hour == 0){
90     hour = 12;
91   }
92   char hour_str[2] = "";
93   char min_str[2] = "";
94
95   sprintf(hour_str, "%02d", hour);
96   sprintf(min_str, "%02d", minute);
97
98   uint8_t mods = get_mods();
99
100 /* Layer indicator is 41 x 10 pixels */
101   draw_layer_section(0,0,true);
102
103 #define ENCODER_INDICATOR_X 45
104 #define ENCODER_INDICATOR_Y 0
105   draw_encoder(ENCODER_INDICATOR_X, ENCODER_INDICATOR_Y, true);
106 /* Matrix display is 19 x 9 pixels */
107 #define MATRIX_DISPLAY_X 0
108 #define MATRIX_DISPLAY_Y 18
109
110   for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
111     for (uint8_t y = 0; y < MATRIX_COLS; y++) {
112       draw_pixel(MATRIX_DISPLAY_X + y + 2, MATRIX_DISPLAY_Y + x + 2,(matrix_get_row(x) & (1 << y)) > 0, NORM);
113     }
114   }
115   draw_rect_soft(MATRIX_DISPLAY_X, MATRIX_DISPLAY_Y, 19, 9, PIXEL_ON, NORM);
116   /* hadron oled location on thumbnail */
117   draw_rect_filled_soft(MATRIX_DISPLAY_X + 14, MATRIX_DISPLAY_Y + 2, 3, 1, PIXEL_ON, NORM);
118
119 /* Mod display is 41 x 16 pixels */
120 #define MOD_DISPLAY_X 30
121 #define MOD_DISPLAY_Y 18
122
123   if (mods & MOD_LSFT) {
124     draw_rect_filled_soft(MOD_DISPLAY_X + 0, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
125     draw_string(MOD_DISPLAY_X + 3, MOD_DISPLAY_Y + 2, "S", PIXEL_OFF, NORM, 0);
126   } else {
127     draw_string(MOD_DISPLAY_X + 3, MOD_DISPLAY_Y + 2, "S", PIXEL_ON, NORM, 0);
128   }
129   if (mods & MOD_LCTL) {
130     draw_rect_filled_soft(MOD_DISPLAY_X + 10, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
131     draw_string(MOD_DISPLAY_X + 13, MOD_DISPLAY_Y + 2, "C", PIXEL_OFF, NORM, 0);
132   } else {
133     draw_string(MOD_DISPLAY_X + 13, MOD_DISPLAY_Y + 2, "C", PIXEL_ON, NORM, 0);
134   }
135   if (mods & MOD_LALT) {
136     draw_rect_filled_soft(MOD_DISPLAY_X + 20, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
137     draw_string(MOD_DISPLAY_X + 23, MOD_DISPLAY_Y + 2, "A", PIXEL_OFF, NORM, 0);
138   } else {
139     draw_string(MOD_DISPLAY_X + 23, MOD_DISPLAY_Y + 2, "A", PIXEL_ON, NORM, 0);
140   }
141   if (mods & MOD_LGUI) {
142     draw_rect_filled_soft(MOD_DISPLAY_X + 30, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
143     draw_string(MOD_DISPLAY_X + 33, MOD_DISPLAY_Y + 2, "G", PIXEL_OFF, NORM, 0);
144   } else {
145     draw_string(MOD_DISPLAY_X + 33, MOD_DISPLAY_Y + 2, "G", PIXEL_ON, NORM, 0);
146   }
147
148 /* Lock display is 23 x 21 */
149 #define LOCK_DISPLAY_X 100
150 #define LOCK_DISPLAY_Y 0
151
152   if (led_capslock == true) {
153     draw_rect_filled_soft(LOCK_DISPLAY_X + 0, LOCK_DISPLAY_Y, 5 + (3 * 6), 9, PIXEL_ON, NORM);
154     draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y +1, "CAP", PIXEL_OFF, NORM, 0);
155   } else if (led_capslock == false) {
156     draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y +1, "CAP", PIXEL_ON, NORM, 0);
157   }
158
159   if (led_scrolllock == true) {
160     draw_rect_filled_soft(LOCK_DISPLAY_X + 0, LOCK_DISPLAY_Y + 11, 5 + (3 * 6), 9, PIXEL_ON, NORM);
161     draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 11 +1, "SCR", PIXEL_OFF, NORM, 0);
162   } else if (led_scrolllock == false) {
163     draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 11 +1, "SCR", PIXEL_ON, NORM, 0);
164   }
165
166 #define TIME_DISPLAY_X 82
167 #define TIME_DISPLAY_Y 22
168   draw_string(TIME_DISPLAY_X, TIME_DISPLAY_Y, hour_str, PIXEL_ON, NORM, 0);
169   draw_string(TIME_DISPLAY_X + 11, TIME_DISPLAY_Y, ":", PIXEL_ON, NORM, 0);
170   draw_string(TIME_DISPLAY_X + 15, TIME_DISPLAY_Y, min_str, PIXEL_ON, NORM, 0);
171   if(is_pm){
172     draw_string(TIME_DISPLAY_X + 27, TIME_DISPLAY_Y, "pm", PIXEL_ON, NORM, 0);
173   } else{
174     draw_string(TIME_DISPLAY_X + 27, TIME_DISPLAY_Y, "am", PIXEL_ON, NORM, 0);
175   }
176
177   send_buffer();
178 }
179
180 void draw_clock(){
181   int8_t hour = last_minute / 60;
182   int16_t minute = last_minute % 60;
183   int16_t year = last_timespec.year + 1980;
184   int8_t month = last_timespec.month;
185   int8_t day = last_timespec.day;
186
187   if(encoder_mode == ENC_MODE_CLOCK_SET){
188     hour = hour_config;
189     minute = minute_config;
190     year = year_config + 1980;
191     month = month_config;
192     day = day_config;
193   }
194
195   bool is_pm = (hour / 12) > 0;
196   hour = hour % 12;
197   if (hour == 0){
198     hour = 12;
199   }
200   char hour_str[2] = "";
201   char min_str[2] = "";
202   char year_str[4] = "";
203   char month_str[2] = "";
204   char day_str[2] = "";
205
206   sprintf(hour_str, "%02d", hour);
207   sprintf(min_str, "%02d", minute);
208   sprintf(year_str, "%d", year);
209   sprintf(month_str, "%02d", month);
210   sprintf(day_str, "%02d", day);
211
212
213 #define DATE_DISPLAY_X 6
214 #define DATE_DISPLAY_Y 0
215   draw_string(DATE_DISPLAY_X, DATE_DISPLAY_Y, year_str, PIXEL_ON, NORM, 0);
216   draw_string(DATE_DISPLAY_X + 25, DATE_DISPLAY_Y, "-", PIXEL_ON, NORM, 0);
217   draw_string(DATE_DISPLAY_X + 31, DATE_DISPLAY_Y, month_str, PIXEL_ON, NORM, 0);
218   draw_string(DATE_DISPLAY_X + 44, DATE_DISPLAY_Y, "-", PIXEL_ON, NORM, 0);
219   draw_string(DATE_DISPLAY_X + 50, DATE_DISPLAY_Y, day_str, PIXEL_ON, NORM, 0);
220
221 #define CLOCK_DISPLAY_X 6
222 #define CLOCK_DISPLAY_Y 14
223   draw_string(CLOCK_DISPLAY_X, CLOCK_DISPLAY_Y, hour_str, PIXEL_ON, NORM, 1);
224   draw_string(CLOCK_DISPLAY_X + 17, CLOCK_DISPLAY_Y, ":", PIXEL_ON, NORM, 1);
225   draw_string(CLOCK_DISPLAY_X + 25, CLOCK_DISPLAY_Y, min_str, PIXEL_ON, NORM, 1);
226   if(is_pm){
227     draw_string(CLOCK_DISPLAY_X + 41, CLOCK_DISPLAY_Y, "pm", PIXEL_ON, NORM, 1);
228   } else{
229     draw_string(CLOCK_DISPLAY_X + 41, CLOCK_DISPLAY_Y, "am", PIXEL_ON, NORM, 1);
230   }
231
232   if(clock_set_mode){
233     switch(time_config_idx){
234       case 0: // hour
235       default:
236         draw_line(CLOCK_DISPLAY_X, CLOCK_DISPLAY_Y + 17, CLOCK_DISPLAY_X + 16, CLOCK_DISPLAY_Y + 17, PIXEL_ON, NORM);
237         break;
238       case 1: // minute
239         draw_line(CLOCK_DISPLAY_X + 25, CLOCK_DISPLAY_Y + 17, CLOCK_DISPLAY_X + 41, CLOCK_DISPLAY_Y + 17, PIXEL_ON, NORM);
240         break;
241       case 2: // year
242         draw_line(DATE_DISPLAY_X, DATE_DISPLAY_Y + 9, DATE_DISPLAY_X + 23, DATE_DISPLAY_Y + 9, PIXEL_ON, NORM);
243         break;
244       case 3: // month
245         draw_line(DATE_DISPLAY_X + 31, DATE_DISPLAY_Y + 9, DATE_DISPLAY_X + 43, DATE_DISPLAY_Y + 9, PIXEL_ON, NORM);
246         break;
247       case 4: //day
248         draw_line(DATE_DISPLAY_X + 50, DATE_DISPLAY_Y + 9, DATE_DISPLAY_X + 61, DATE_DISPLAY_Y + 9,PIXEL_ON, NORM);
249         break;
250     }
251   }
252
253   draw_encoder(80, 0, true);
254   draw_layer_section(80, 11, true);
255
256 #define CAPS_DISPLAY_X 86
257 #define CAPS_DISPLAY_Y 22
258
259   if (led_capslock == true) {
260     draw_rect_filled_soft(CAPS_DISPLAY_X, CAPS_DISPLAY_Y, 5 + (4 * 6), 9, PIXEL_ON, NORM);
261     draw_string(CAPS_DISPLAY_X + 3, CAPS_DISPLAY_Y +1, "CAPS", PIXEL_OFF, NORM, 0);
262   } else if (led_capslock == false) {
263     draw_string(CAPS_DISPLAY_X + 3, CAPS_DISPLAY_Y +1, "CAPS", PIXEL_ON, NORM, 0);
264   }
265
266
267   send_buffer();
268
269 }