mirror of
https://github.com/Keychron/qmk_firmware.git
synced 2024-11-30 04:37:14 +06:00
105 lines
2.7 KiB
C
105 lines
2.7 KiB
C
|
#ifdef SSD1306OLED
|
||
|
#include QMK_KEYBOARD_H
|
||
|
#include "ssd1306.h"
|
||
|
#ifdef PROTOCOL_LUFA
|
||
|
#include "lufa.h"
|
||
|
#include "split_util.h"
|
||
|
#endif
|
||
|
|
||
|
extern uint8_t is_master;
|
||
|
|
||
|
// When add source files to SRC in rules.mk, you can use functions.
|
||
|
const char *read_logo(void);
|
||
|
const char *read_keylog(void);
|
||
|
const char *read_keylogs(void);
|
||
|
void set_keylog(uint16_t keycode, keyrecord_t *record);
|
||
|
|
||
|
void matrix_scan_user(void) { iota_gfx_task(); }
|
||
|
|
||
|
typedef struct {
|
||
|
uint8_t state;
|
||
|
char name[8];
|
||
|
} LAYER_DISPLAY_NAME;
|
||
|
|
||
|
#define LAYER_DISPLAY_MAX 5
|
||
|
const LAYER_DISPLAY_NAME layer_display_name[LAYER_DISPLAY_MAX] = {
|
||
|
{0, "Base"},
|
||
|
{2, "Code"},
|
||
|
{4, "Fn"},
|
||
|
{6, "Fn+Code"},
|
||
|
{__UINT8_MAX__, "?"},
|
||
|
};
|
||
|
static uint8_t layer_name_idx;
|
||
|
static char layer_status_buf[24] = "Layer: Base\n";
|
||
|
|
||
|
#ifdef RGBLIGHT_ENABLE
|
||
|
// Following line allows macro to read current RGB settings
|
||
|
extern rgblight_config_t rgblight_config;
|
||
|
void update_keymap_status(void) {
|
||
|
snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "Layer:%s RGB: %d\n",
|
||
|
layer_display_name[layer_name_idx].name, rgblight_config.mode);
|
||
|
}
|
||
|
#else
|
||
|
void update_keymap_status(void) {
|
||
|
snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "Layer:%s\n",
|
||
|
layer_display_name[layer_name_idx].name);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
void matrix_init_user(void) {
|
||
|
iota_gfx_init(!has_usb()); // turns on the display
|
||
|
update_keymap_status();
|
||
|
}
|
||
|
|
||
|
// declared in users/rs/rs.c
|
||
|
void rgb_mod_changed_keymap(void) {
|
||
|
update_keymap_status();
|
||
|
}
|
||
|
|
||
|
// declared in users/rs/rs.c
|
||
|
void keylog_set_keymap(uint16_t keycode, keyrecord_t *record) {
|
||
|
set_keylog(keycode, record);
|
||
|
}
|
||
|
|
||
|
uint32_t layer_state_set_user(uint32_t state) {
|
||
|
for (layer_name_idx = 0; layer_name_idx < LAYER_DISPLAY_MAX; ++layer_name_idx) {
|
||
|
if (state == 0 && layer_display_name[layer_name_idx].state == default_layer_state) {
|
||
|
break;
|
||
|
} else if (state != 0 && layer_display_name[layer_name_idx].state == state) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
update_keymap_status();
|
||
|
return state;
|
||
|
}
|
||
|
|
||
|
static inline void render_keymap_status(struct CharacterMatrix *matrix) {
|
||
|
matrix_write(matrix, layer_status_buf);
|
||
|
}
|
||
|
|
||
|
void matrix_render_user(struct CharacterMatrix *matrix) {
|
||
|
if (is_master) {
|
||
|
render_keymap_status(matrix);
|
||
|
matrix_write_ln(matrix, read_keylog());
|
||
|
matrix_write_ln(matrix, read_keylogs());
|
||
|
} else {
|
||
|
matrix_write(matrix, read_logo());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
|
||
|
if (memcmp(dest->display, source->display, sizeof(dest->display))) {
|
||
|
memcpy(dest->display, source->display, sizeof(dest->display));
|
||
|
dest->dirty = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void iota_gfx_task_user(void) {
|
||
|
struct CharacterMatrix matrix;
|
||
|
matrix_clear(&matrix);
|
||
|
matrix_render_user(&matrix);
|
||
|
matrix_update(&display, &matrix);
|
||
|
}
|
||
|
|
||
|
#endif
|