--- /dev/null
+#include QMK_KEYBOARD_H
+#ifdef PROTOCOL_LUFA
+ #include "split_util.h"
+#endif
+#ifdef SSD1306OLED
+ #include "oled.h"
+#endif
+
+#include "edvorakjp.h"
+
+/*
+ * enum custom_keycodes {
+ * KC_LOCK = NEW_SAFE_RANGE,
+ * };
+ */
+
+#define KC_ KC_TRNS
+
+#define KC_TMB1 LGUI_T(KC_TAB)
+#define KC_TMB2 LSFT_T(KC_SPC)
+#define KC_TMB3 TD(TD_LOWER) // act as LOWER when hold, as KC_LANG2(=English) when tapped
+#define KC_TMB4 TD(TD_RAISE) // act as RAISE when hold, as KC_LANG1(=Japanese) when tapped
+#define KC_TMB5 RCTL_T(KC_BSPC)
+#define KC_TMB6 RALT_T(KC_ENT)
+#define KC_TMB7 KC_DEL
+#define KC_TMB8 RALT(KC_ENT)
+#define KC_TMB9 LGUI(KC_TAB)
+
+#define KC_RST RESET
+#define KC_DBUG DEBUG
+#define KC_RTOG RGB_TOG
+#define KC_EDJP EDVORAK
+#define KC_QWER QWERTY
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_EDVORAK] = LAYOUT_kc(
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ ESC ,QUOT,COMM,DOT , Y , P , F , G , R , W , Q ,BSLS,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ EQL , A , O , E , I , U , D , T , N , S , M ,MINS,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ GRV ,SCLN, X , C , V , Z , B , H , J , K , L ,SLSH,
+ //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----'
+ TMB1,TMB2,TMB3, TMB4,TMB5,TMB6
+ // `----+----+----' `----+----+----'
+ ),
+
+ [_EDVORAKJ1] = LAYOUT_kc(
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , AI , OU , EI , , , , , , , , ,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , , , , , , , , , Y , , ,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ ,ANN ,ONN ,ENN ,INN ,UNN , , , , , , ,
+ //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----'
+ , , , , ,
+ // `----+----+----' `----+----+----'
+ ),
+
+ [_EDVORAKJ2] = LAYOUT_kc(
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , AI , OU , EI , , , , , , , , ,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , , , , , , , Y , , , , ,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ ,ANN ,ONN ,ENN ,INN ,UNN , , , , , , ,
+ //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----'
+ , , , , ,
+ // `----+----+----' `----+----+----'
+ ),
+
+ [_QWERTY] = LAYOUT_kc(
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ EQL , A , S , D , F , G , H , J , K , L ,SCLN,QUOT,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ GRV , Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,BSLS,
+ //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----'
+ , , , , ,
+ // `----+----+----' `----+----+----'
+ ),
+
+ [_LOWER] = LAYOUT_kc(
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , , ,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , 1 ,EXLM, AT ,HASH,DLR , PERC,CIRC,AMPR,ASTR, 0 , ,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , , LT ,LCBR,LPRN,LBRC, RBRC,RPRN,RCBR, GT , , ,
+ //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----'
+ , , , ,TMB7,TMB8
+ // `----+----+----' `----+----+----'
+ ),
+
+ [_RAISE] = LAYOUT_kc(
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 , ,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ ,F11 ,F12 ,PSCR,SLCK,PAUS, ,HOME,PGDN,PGUP,END , ,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , , , , , , ,LEFT,DOWN, UP ,RGHT, ,
+ //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----'
+ TMB9, , , , ,
+ // `----+----+----' `----+----+----'
+ ),
+
+ [_ADJUST] = LAYOUT_kc(
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , , , ,EXTOFF, , ,EXTON, , , , ,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , , ,QWER,WIN ,RST , RTOG,MAC ,EDJP, , , ,
+ //|----+----+----+----+----+----| |----+----+----+----+----+----|
+ , , , , , , , , , , , ,
+ //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----'
+ , , , , ,
+ // `----+----+----' `----+----+----'
+ )
+};
+
+#ifdef SSD1306OLED
+void matrix_init_keymap(void) {
+ //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
+ iota_gfx_init(!has_usb()); // turns on the display
+}
+
+void matrix_scan_user(void) {
+ iota_gfx_task(); // this is what updates the display continuously
+}
+#endif
+
+#ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT
+uint32_t layer_state_set_keymap(uint32_t state) {
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+ switch (biton32(state)) {
+ case _EDVORAKJ1:
+ case _EDVORAKJ2:
+ // _EDVORAKJ1 & J2 are same colored
+ rgblight_sethsv_noeeprom_white();
+ break;
+ case _LOWER:
+ rgblight_sethsv_noeeprom_red();
+ break;
+ case _RAISE:
+ rgblight_sethsv_noeeprom_blue();
+ break;
+ case _ADJUST:
+ rgblight_sethsv_noeeprom_green();
+ break;
+ default: // for any other layers, or the default layer
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT + 3);
+ rgblight_sethsv_noeeprom_red();
+ break;
+ }
+ return state;
+}
+#endif
--- /dev/null
+#include <string.h>
+#include "oled.h"
+
+// NOTE: Redefined to avoid to use snprintf(); It makes size of firmware big.
+const char *read_mode_icon(bool windows_mode) {
+ static const char logo[][2][3] = {{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}};
+ static char mode_icon[10];
+
+ int mode_number = windows_mode ? 1 : 0;
+ strcpy(mode_icon, logo[mode_number][0]);
+
+ strcat(mode_icon, "\n");
+ strcat(mode_icon, logo[mode_number][1]);
+
+ return mode_icon;
+}
+
+const char *read_layer_state(void) {
+ static char layer_state_str[24];
+ char layer_name[17];
+
+ switch (biton32(layer_state)) {
+ case L_BASE:
+ strcpy(layer_name, default_layer_state == 1UL<<_EDVORAK ? "EDVORAK" : "QWERTY");
+ break;
+ case _EDVORAKJ1:
+ case _EDVORAKJ2:
+ strcpy(layer_name, "JP_EXT");
+ break;
+ case _RAISE:
+ strcpy(layer_name, "Raise");
+ break;
+ case _LOWER:
+ strcpy(layer_name, "Lower");
+ break;
+ case _ADJUST:
+ strcpy(layer_name, "Adjust");
+ break;
+ default:
+ snprintf(layer_name, sizeof(layer_name), "Undef-%ld", layer_state);
+ }
+
+ strcpy(layer_state_str, "Layer: ");
+
+ strcat(layer_state_str, layer_name);
+ strcat(layer_state_str, "\n");
+ return layer_state_str;
+}
+
+const char *read_host_led_state(void) {
+ static char led_str[24];
+ bool ext_status = get_enable_jp_extra_layer() && get_japanese_mode();
+ strcpy(led_str, ext_status ? "EXT" : " ");
+
+ strcat(led_str, (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) ? " NMLK" : " ");
+ strcat(led_str, (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? " CAPS" : " ");
+ strcat(led_str, (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ? " SCLK" : " ");
+ return led_str;
+}
+
+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);
+ if (is_master) {
+ matrix_write(&matrix, read_mode_icon(!get_enable_kc_lang()));
+ matrix_write(&matrix, " ");
+ matrix_write(&matrix, read_layer_state());
+ matrix_write(&matrix, read_host_led_state());
+ } else {
+ matrix_write(&matrix, read_logo());
+ }
+ matrix_update(&display, &matrix);
+}