You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

269 lines
8.3 KiB

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