oled.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #ifdef SSD1306OLED
  2. #include QMK_KEYBOARD_H
  3. #include "ssd1306.h"
  4. #ifdef PROTOCOL_LUFA
  5. #include "lufa.h"
  6. #include "split_util.h"
  7. #endif
  8. extern uint8_t is_master;
  9. // When add source files to SRC in rules.mk, you can use functions.
  10. const char *read_logo(void);
  11. const char *read_keylog(void);
  12. const char *read_keylogs(void);
  13. void set_keylog(uint16_t keycode, keyrecord_t *record);
  14. void matrix_scan_user(void) { iota_gfx_task(); }
  15. typedef struct {
  16. uint8_t state;
  17. char name[8];
  18. } LAYER_DISPLAY_NAME;
  19. #define LAYER_DISPLAY_MAX 5
  20. const LAYER_DISPLAY_NAME layer_display_name[LAYER_DISPLAY_MAX] = {
  21. {0, "Base"},
  22. {2, "Code"},
  23. {4, "Fn"},
  24. {6, "Fn+Code"},
  25. {__UINT8_MAX__, "?"},
  26. };
  27. static uint8_t layer_name_idx;
  28. static char layer_status_buf[24] = "Layer: Base\n";
  29. #ifdef RGBLIGHT_ENABLE
  30. // Following line allows macro to read current RGB settings
  31. extern rgblight_config_t rgblight_config;
  32. void update_keymap_status(void) {
  33. snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "Layer:%s RGB: %d\n",
  34. layer_display_name[layer_name_idx].name, rgblight_config.mode);
  35. }
  36. #else
  37. void update_keymap_status(void) {
  38. snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "Layer:%s\n",
  39. layer_display_name[layer_name_idx].name);
  40. }
  41. #endif
  42. void matrix_init_user(void) {
  43. iota_gfx_init(!has_usb()); // turns on the display
  44. update_keymap_status();
  45. }
  46. // declared in users/rs/rs.c
  47. void rgb_mod_changed_keymap(void) {
  48. update_keymap_status();
  49. }
  50. // declared in users/rs/rs.c
  51. void keylog_set_keymap(uint16_t keycode, keyrecord_t *record) {
  52. set_keylog(keycode, record);
  53. }
  54. uint32_t layer_state_set_user(uint32_t state) {
  55. for (layer_name_idx = 0; layer_name_idx < LAYER_DISPLAY_MAX; ++layer_name_idx) {
  56. if (state == 0 && layer_display_name[layer_name_idx].state == default_layer_state) {
  57. break;
  58. } else if (state != 0 && layer_display_name[layer_name_idx].state == state) {
  59. break;
  60. }
  61. }
  62. update_keymap_status();
  63. return state;
  64. }
  65. static inline void render_keymap_status(struct CharacterMatrix *matrix) {
  66. matrix_write(matrix, layer_status_buf);
  67. }
  68. void matrix_render_user(struct CharacterMatrix *matrix) {
  69. if (is_master) {
  70. render_keymap_status(matrix);
  71. matrix_write_ln(matrix, read_keylog());
  72. matrix_write_ln(matrix, read_keylogs());
  73. } else {
  74. matrix_write(matrix, read_logo());
  75. }
  76. }
  77. void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
  78. if (memcmp(dest->display, source->display, sizeof(dest->display))) {
  79. memcpy(dest->display, source->display, sizeof(dest->display));
  80. dest->dirty = true;
  81. }
  82. }
  83. void iota_gfx_task_user(void) {
  84. struct CharacterMatrix matrix;
  85. matrix_clear(&matrix);
  86. matrix_render_user(&matrix);
  87. matrix_update(&display, &matrix);
  88. }
  89. #endif