2
0

oled.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include <string.h>
  2. #include "oled.h"
  3. // NOTE: Redefined to avoid to use snprintf(); It makes size of firmware big.
  4. const char *read_mode_icon(bool windows_mode) {
  5. static const char logo[][2][3] = {{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}};
  6. static char mode_icon[10];
  7. int mode_number = windows_mode ? 1 : 0;
  8. strcpy(mode_icon, logo[mode_number][0]);
  9. strcat(mode_icon, "\n");
  10. strcat(mode_icon, logo[mode_number][1]);
  11. return mode_icon;
  12. }
  13. const char *read_layer_state(void) {
  14. static char layer_state_str[24];
  15. char layer_name[17];
  16. switch (biton32(layer_state)) {
  17. case L_BASE:
  18. strcpy(layer_name, default_layer_state == 1UL<<_EDVORAK ? "EDVORAK" : "QWERTY");
  19. break;
  20. case _EDVORAKJ1:
  21. case _EDVORAKJ2:
  22. strcpy(layer_name, "JP_EXT");
  23. break;
  24. case _RAISE:
  25. strcpy(layer_name, "Raise");
  26. break;
  27. case _LOWER:
  28. strcpy(layer_name, "Lower");
  29. break;
  30. case _ADJUST:
  31. strcpy(layer_name, "Adjust");
  32. break;
  33. default:
  34. snprintf(layer_name, sizeof(layer_name), "Undef-%ld", layer_state);
  35. }
  36. strcpy(layer_state_str, "Layer: ");
  37. strcat(layer_state_str, layer_name);
  38. strcat(layer_state_str, "\n");
  39. return layer_state_str;
  40. }
  41. const char *read_host_led_state(void) {
  42. static char led_str[24];
  43. bool ext_status = get_enable_jp_extra_layer() && get_japanese_mode();
  44. strcpy(led_str, ext_status ? "EXT" : " ");
  45. strcat(led_str, (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) ? " NMLK" : " ");
  46. strcat(led_str, (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? " CAPS" : " ");
  47. strcat(led_str, (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ? " SCLK" : " ");
  48. return led_str;
  49. }
  50. void matrix_update(struct CharacterMatrix *dest,
  51. const struct CharacterMatrix *source) {
  52. if (memcmp(dest->display, source->display, sizeof(dest->display))) {
  53. memcpy(dest->display, source->display, sizeof(dest->display));
  54. dest->dirty = true;
  55. }
  56. }
  57. void iota_gfx_task_user(void) {
  58. struct CharacterMatrix matrix;
  59. matrix_clear(&matrix);
  60. if (is_master) {
  61. matrix_write(&matrix, read_mode_icon(!get_enable_kc_lang()));
  62. matrix_write(&matrix, " ");
  63. matrix_write(&matrix, read_layer_state());
  64. matrix_write(&matrix, read_host_led_state());
  65. } else {
  66. matrix_write(&matrix, read_logo());
  67. }
  68. matrix_update(&display, &matrix);
  69. }