satisfaction_oled.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. #include "satisfaction75.h"
  2. #include "micro_oled.h"
  3. __attribute__ ((weak))
  4. void draw_ui() {
  5. #ifdef QWIIC_MICRO_OLED_ENABLE
  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. #endif
  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. void draw_layer_section(int8_t startX, int8_t startY, bool show_legend){
  68. if(show_legend){
  69. draw_string(startX + 1, startY + 2, "LAYER", PIXEL_ON, NORM, 0);
  70. } else {
  71. startX -= 32;
  72. }
  73. draw_rect_filled_soft(startX + 32, startY + 1, 9, 9, PIXEL_ON, NORM);
  74. draw_char(startX + 34, startY + 2, layer + 0x30, PIXEL_ON, XOR, 0);
  75. }
  76. void draw_default(){
  77. uint8_t hour = last_minute / 60;
  78. uint16_t minute = last_minute % 60;
  79. if(encoder_mode == ENC_MODE_CLOCK_SET){
  80. hour = hour_config;
  81. minute = minute_config;
  82. }
  83. bool is_pm = (hour / 12) > 0;
  84. hour = hour % 12;
  85. if (hour == 0){
  86. hour = 12;
  87. }
  88. char hour_str[2] = "";
  89. char min_str[2] = "";
  90. sprintf(hour_str, "%02d", hour);
  91. sprintf(min_str, "%02d", minute);
  92. uint8_t mods = get_mods();
  93. /* Layer indicator is 41 x 10 pixels */
  94. draw_layer_section(0,0,true);
  95. #define ENCODER_INDICATOR_X 45
  96. #define ENCODER_INDICATOR_Y 0
  97. draw_encoder(ENCODER_INDICATOR_X, ENCODER_INDICATOR_Y, true);
  98. /* Matrix display is 19 x 9 pixels */
  99. #define MATRIX_DISPLAY_X 0
  100. #define MATRIX_DISPLAY_Y 18
  101. for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
  102. for (uint8_t y = 0; y < MATRIX_COLS; y++) {
  103. draw_pixel(MATRIX_DISPLAY_X + y + 2, MATRIX_DISPLAY_Y + x + 2,(matrix_get_row(x) & (1 << y)) > 0, NORM);
  104. }
  105. }
  106. draw_rect_soft(MATRIX_DISPLAY_X, MATRIX_DISPLAY_Y, 19, 9, PIXEL_ON, NORM);
  107. /* hadron oled location on thumbnail */
  108. draw_rect_filled_soft(MATRIX_DISPLAY_X + 14, MATRIX_DISPLAY_Y + 2, 3, 1, PIXEL_ON, NORM);
  109. /* Mod display is 41 x 16 pixels */
  110. #define MOD_DISPLAY_X 30
  111. #define MOD_DISPLAY_Y 18
  112. if (mods & MOD_LSFT) {
  113. draw_rect_filled_soft(MOD_DISPLAY_X + 0, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
  114. draw_string(MOD_DISPLAY_X + 3, MOD_DISPLAY_Y + 2, "S", PIXEL_OFF, NORM, 0);
  115. } else {
  116. draw_string(MOD_DISPLAY_X + 3, MOD_DISPLAY_Y + 2, "S", PIXEL_ON, NORM, 0);
  117. }
  118. if (mods & MOD_LCTL) {
  119. draw_rect_filled_soft(MOD_DISPLAY_X + 10, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
  120. draw_string(MOD_DISPLAY_X + 13, MOD_DISPLAY_Y + 2, "C", PIXEL_OFF, NORM, 0);
  121. } else {
  122. draw_string(MOD_DISPLAY_X + 13, MOD_DISPLAY_Y + 2, "C", PIXEL_ON, NORM, 0);
  123. }
  124. if (mods & MOD_LALT) {
  125. draw_rect_filled_soft(MOD_DISPLAY_X + 20, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
  126. draw_string(MOD_DISPLAY_X + 23, MOD_DISPLAY_Y + 2, "A", PIXEL_OFF, NORM, 0);
  127. } else {
  128. draw_string(MOD_DISPLAY_X + 23, MOD_DISPLAY_Y + 2, "A", PIXEL_ON, NORM, 0);
  129. }
  130. if (mods & MOD_LGUI) {
  131. draw_rect_filled_soft(MOD_DISPLAY_X + 30, MOD_DISPLAY_Y, 5 + (1 * 6), 11, PIXEL_ON, NORM);
  132. draw_string(MOD_DISPLAY_X + 33, MOD_DISPLAY_Y + 2, "G", PIXEL_OFF, NORM, 0);
  133. } else {
  134. draw_string(MOD_DISPLAY_X + 33, MOD_DISPLAY_Y + 2, "G", PIXEL_ON, NORM, 0);
  135. }
  136. /* Lock display is 23 x 21 */
  137. #define LOCK_DISPLAY_X 100
  138. #define LOCK_DISPLAY_Y 0
  139. if (led_capslock == true) {
  140. draw_rect_filled_soft(LOCK_DISPLAY_X + 0, LOCK_DISPLAY_Y, 5 + (3 * 6), 9, PIXEL_ON, NORM);
  141. draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y +1, "CAP", PIXEL_OFF, NORM, 0);
  142. } else if (led_capslock == false) {
  143. draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y +1, "CAP", PIXEL_ON, NORM, 0);
  144. }
  145. if (led_scrolllock == true) {
  146. draw_rect_filled_soft(LOCK_DISPLAY_X + 0, LOCK_DISPLAY_Y + 11, 5 + (3 * 6), 9, PIXEL_ON, NORM);
  147. draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 11 +1, "SCR", PIXEL_OFF, NORM, 0);
  148. } else if (led_scrolllock == false) {
  149. draw_string(LOCK_DISPLAY_X + 3, LOCK_DISPLAY_Y + 11 +1, "SCR", PIXEL_ON, NORM, 0);
  150. }
  151. #define TIME_DISPLAY_X 82
  152. #define TIME_DISPLAY_Y 22
  153. draw_string(TIME_DISPLAY_X, TIME_DISPLAY_Y, hour_str, PIXEL_ON, NORM, 0);
  154. draw_string(TIME_DISPLAY_X + 11, TIME_DISPLAY_Y, ":", PIXEL_ON, NORM, 0);
  155. draw_string(TIME_DISPLAY_X + 15, TIME_DISPLAY_Y, min_str, PIXEL_ON, NORM, 0);
  156. if(is_pm){
  157. draw_string(TIME_DISPLAY_X + 27, TIME_DISPLAY_Y, "pm", PIXEL_ON, NORM, 0);
  158. } else{
  159. draw_string(TIME_DISPLAY_X + 27, TIME_DISPLAY_Y, "am", PIXEL_ON, NORM, 0);
  160. }
  161. send_buffer();
  162. }
  163. void draw_clock(){
  164. int8_t hour = last_minute / 60;
  165. int16_t minute = last_minute % 60;
  166. int16_t year = last_timespec.year + 1980;
  167. int8_t month = last_timespec.month;
  168. int8_t day = last_timespec.day;
  169. if(encoder_mode == ENC_MODE_CLOCK_SET){
  170. hour = hour_config;
  171. minute = minute_config;
  172. year = year_config + 1980;
  173. month = month_config;
  174. day = day_config;
  175. }
  176. bool is_pm = (hour / 12) > 0;
  177. hour = hour % 12;
  178. if (hour == 0){
  179. hour = 12;
  180. }
  181. char hour_str[2] = "";
  182. char min_str[2] = "";
  183. char year_str[4] = "";
  184. char month_str[2] = "";
  185. char day_str[2] = "";
  186. sprintf(hour_str, "%02d", hour);
  187. sprintf(min_str, "%02d", minute);
  188. sprintf(year_str, "%d", year);
  189. sprintf(month_str, "%02d", month);
  190. sprintf(day_str, "%02d", day);
  191. #define DATE_DISPLAY_X 6
  192. #define DATE_DISPLAY_Y 0
  193. draw_string(DATE_DISPLAY_X, DATE_DISPLAY_Y, year_str, PIXEL_ON, NORM, 0);
  194. draw_string(DATE_DISPLAY_X + 25, DATE_DISPLAY_Y, "-", PIXEL_ON, NORM, 0);
  195. draw_string(DATE_DISPLAY_X + 31, DATE_DISPLAY_Y, month_str, PIXEL_ON, NORM, 0);
  196. draw_string(DATE_DISPLAY_X + 44, DATE_DISPLAY_Y, "-", PIXEL_ON, NORM, 0);
  197. draw_string(DATE_DISPLAY_X + 50, DATE_DISPLAY_Y, day_str, PIXEL_ON, NORM, 0);
  198. #define CLOCK_DISPLAY_X 6
  199. #define CLOCK_DISPLAY_Y 14
  200. draw_string(CLOCK_DISPLAY_X, CLOCK_DISPLAY_Y, hour_str, PIXEL_ON, NORM, 1);
  201. draw_string(CLOCK_DISPLAY_X + 17, CLOCK_DISPLAY_Y, ":", PIXEL_ON, NORM, 1);
  202. draw_string(CLOCK_DISPLAY_X + 25, CLOCK_DISPLAY_Y, min_str, PIXEL_ON, NORM, 1);
  203. if(is_pm){
  204. draw_string(CLOCK_DISPLAY_X + 41, CLOCK_DISPLAY_Y, "pm", PIXEL_ON, NORM, 1);
  205. } else{
  206. draw_string(CLOCK_DISPLAY_X + 41, CLOCK_DISPLAY_Y, "am", PIXEL_ON, NORM, 1);
  207. }
  208. if(clock_set_mode){
  209. switch(time_config_idx){
  210. case 0: // hour
  211. default:
  212. draw_line(CLOCK_DISPLAY_X, CLOCK_DISPLAY_Y + 17, CLOCK_DISPLAY_X + 16, CLOCK_DISPLAY_Y + 17, PIXEL_ON, NORM);
  213. break;
  214. case 1: // minute
  215. draw_line(CLOCK_DISPLAY_X + 25, CLOCK_DISPLAY_Y + 17, CLOCK_DISPLAY_X + 41, CLOCK_DISPLAY_Y + 17, PIXEL_ON, NORM);
  216. break;
  217. case 2: // year
  218. draw_line(DATE_DISPLAY_X, DATE_DISPLAY_Y + 9, DATE_DISPLAY_X + 23, DATE_DISPLAY_Y + 9, PIXEL_ON, NORM);
  219. break;
  220. case 3: // month
  221. draw_line(DATE_DISPLAY_X + 31, DATE_DISPLAY_Y + 9, DATE_DISPLAY_X + 43, DATE_DISPLAY_Y + 9, PIXEL_ON, NORM);
  222. break;
  223. case 4: //day
  224. draw_line(DATE_DISPLAY_X + 50, DATE_DISPLAY_Y + 9, DATE_DISPLAY_X + 61, DATE_DISPLAY_Y + 9,PIXEL_ON, NORM);
  225. break;
  226. }
  227. }
  228. draw_encoder(80, 0, true);
  229. draw_layer_section(80, 11, true);
  230. #define CAPS_DISPLAY_X 86
  231. #define CAPS_DISPLAY_Y 22
  232. if (led_capslock == true) {
  233. draw_rect_filled_soft(CAPS_DISPLAY_X, CAPS_DISPLAY_Y, 5 + (4 * 6), 9, PIXEL_ON, NORM);
  234. draw_string(CAPS_DISPLAY_X + 3, CAPS_DISPLAY_Y +1, "CAPS", PIXEL_OFF, NORM, 0);
  235. } else if (led_capslock == false) {
  236. draw_string(CAPS_DISPLAY_X + 3, CAPS_DISPLAY_Y +1, "CAPS", PIXEL_ON, NORM, 0);
  237. }
  238. send_buffer();
  239. }