#include <stdio.h>
#include <string.h>
#include QMK_KEYBOARD_H
#ifdef SSD1306OLED
#include "ssd1306.h"
#endif
enum layer_number {
_QWERTY = 0,
_COLEMAK,
_DVORAK,
_LOWER,
_RAISE,
_ADJUST
};
#if defined(SSD1306OLED) || defined(OLED_DRIVER_ENABLE)
# if defined(OLED_DRIVER_ENABLE)
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
if (is_keyboard_master()) {
return OLED_ROTATION_0;
} else {
return OLED_ROTATION_180;
}
}
# else
# define oled_write(data,flag) matrix_write(matrix, data)
# define oled_write_P(data,flag) matrix_write_P(matrix, data)
# endif
# ifdef SSD1306OLED
void matrix_scan_user(void) {
iota_gfx_task(); }
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;
}
}
# endif
#define L_BASE 0
#define L_LOWER (1<<_LOWER)
#define L_RAISE (1<<_RAISE)
#define L_ADJUST (1<<_ADJUST)
#define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
# ifdef SSD1306OLED
static void render_logo(struct CharacterMatrix *matrix) {
# else
static void render_logo(void) {
# endif
static const char helix_logo[] PROGMEM ={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,
0};
oled_write_P(helix_logo, false);
}
# ifdef SSD1306OLED
static void render_rgbled_status(bool full, struct CharacterMatrix *matrix) {
# else
static void render_rgbled_status(bool full) {
# endif
# ifdef RGBLIGHT_ENABLE
char buf[30];
if (RGBLIGHT_MODES > 1 && rgblight_is_enabled()) {
if (full) {
snprintf(buf, sizeof(buf), " LED %2d: %d,%d,%d ",
rgblight_get_mode(),
rgblight_get_hue()/RGBLIGHT_HUE_STEP,
rgblight_get_sat()/RGBLIGHT_SAT_STEP,
rgblight_get_val()/RGBLIGHT_VAL_STEP);
} else {
snprintf(buf, sizeof(buf), "[%2d] ", rgblight_get_mode());
}
oled_write(buf, false);
}
# endif
}
# ifdef SSD1306OLED
static void render_layer_status(struct CharacterMatrix *matrix) {
# else
static void render_layer_status(void) {
# endif
char buf[10];
oled_write_P(PSTR("Layer: "), false);
switch (layer_state) {
case L_BASE:
oled_write_P(PSTR("Default"), false);
break;
case L_RAISE:
oled_write_P(PSTR("Raise"), false);
break;
case L_LOWER:
oled_write_P(PSTR("Lower"), false);
break;
case L_ADJUST:
case L_ADJUST_TRI:
oled_write_P(PSTR("Adjust"), false);
break;
default:
oled_write_P(PSTR("Undef-"), false);
snprintf(buf,sizeof(buf), "%ld", layer_state);
oled_write(buf, false);
}
oled_write_P(PSTR("\n"), false);
}
# ifdef SSD1306OLED
void render_status(struct CharacterMatrix *matrix) {
# else
void render_status(void) {
# endif
static const char os_logo[][2][3] PROGMEM = {{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}};
if (is_mac_mode()) {
oled_write_P(os_logo[0][0], false);
oled_write_P(PSTR("\n"), false);
oled_write_P(os_logo[0][1], false);
} else {
oled_write_P(os_logo[1][0], false);
oled_write_P(PSTR("\n"), false);
oled_write_P(os_logo[1][1], false);
}
oled_write_P(PSTR(" "), false);
# ifdef SSD1306OLED
render_layer_status(matrix);
# else
render_layer_status();
# endif
led_t led_state = host_keyboard_led_state();
oled_write_P(led_state.num_lock ? PSTR("NUMLOCK") : PSTR(" "), false);
oled_write_P(led_state.caps_lock ? PSTR("CAPS") : PSTR(" "), false);
oled_write_P(led_state.scroll_lock ? PSTR("SCLK") : PSTR(" "), false);
oled_write_P(PSTR("\n"), false);
# ifdef SSD1306OLED
render_rgbled_status(true, matrix);
# else
render_rgbled_status(true);
oled_write_P(PSTR("\n"), false);
# endif
}
# ifdef SSD1306OLED
# if OLED_UPDATE_INTERVAL > 0
uint16_t oled_update_timeout;
# endif
void iota_gfx_task_user(void) {
struct CharacterMatrix matrix;
# if DEBUG_TO_SCREEN
if (debug_enable) {
return;
}
# endif
#if OLED_UPDATE_INTERVAL > 0
if (timer_elapsed(oled_update_timeout) < OLED_UPDATE_INTERVAL) {
return;
}
oled_update_timeout = timer_read();
#endif
matrix_clear(&matrix);
if (is_keyboard_master()) {
render_status(&matrix);
} else {
render_logo(&matrix);
render_rgbled_status(false, &matrix);
render_layer_status(&matrix);
}
matrix_update(&display, &matrix);
}
# else
void oled_task_user(void) {
# if DEBUG_TO_SCREEN
if (debug_enable) {
return;
}
# endif
if (is_keyboard_master()) {
render_status();
} else {
render_logo();
render_rgbled_status(false);
render_layer_status();
}
}
# endif
#endif