1 #include QMK_KEYBOARD_H
5 #include "split_util.h"
11 extern keymap_config_t keymap_config;
12 extern uint8_t is_master;
14 #ifdef RGBLIGHT_ENABLE
15 //Following line allows macro to read current RGB settings
16 extern rgblight_config_t rgblight_config;
20 RGBRST = NEW_SAFE_RANGE
23 #define LAYOUT_crkbd_base( \
24 K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
25 K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
26 K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \
29 KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_MINS, \
30 KC_TAB, ALT_T(K11), K12, K13, K14, K15, K16, K17, K18, K19, K1A, RGUI_T(KC_QUOT), \
31 OS_LSFT, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), OS_RSFT, \
32 LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \
34 #define LAYOUT_crkbd_base_wrapper(...) LAYOUT_crkbd_base(__VA_ARGS__)
36 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
37 [_QWERTY] = LAYOUT_crkbd_base_wrapper(
38 _________________QWERTY_L1_________________, _________________QWERTY_R1_________________,
39 _________________QWERTY_L2_________________, _________________QWERTY_R2_________________,
40 _________________QWERTY_L3_________________, _________________QWERTY_R3_________________
43 [_COLEMAK] = LAYOUT_crkbd_base_wrapper(
44 _________________COLEMAK_L1________________, _________________COLEMAK_R1________________,
45 _________________COLEMAK_L2________________, _________________COLEMAK_R2________________,
46 _________________COLEMAK_L3________________, _________________COLEMAK_R3________________
49 [_DVORAK] = LAYOUT_crkbd_base_wrapper(
50 _________________DVORAK_L1_________________, _________________DVORAK_R1_________________,
51 _________________DVORAK_L2_________________, _________________DVORAK_R2_________________,
52 _________________DVORAK_L3_________________, _________________DVORAK_R3_________________
55 [_WORKMAN] = LAYOUT_crkbd_base_wrapper(
56 _________________WORKMAN_L1________________, _________________WORKMAN_R1________________,
57 _________________WORKMAN_L2________________, _________________WORKMAN_R2________________,
58 _________________WORKMAN_L3________________, _________________WORKMAN_R3________________
61 [_MODS] = LAYOUT_wrapper(
62 _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
63 _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
64 KC_LSFT, ___________________BLANK___________________, ___________________BLANK___________________, KC_RSFT,
65 _______, _______, _______, _______, _______, _______
68 [_LOWER] = LAYOUT_wrapper(
69 KC_F11, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_F11,
70 KC_F12, _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_PIPE,
71 _______, _________________LOWER_L3__________________, _________________LOWER_R3__________________, _______,
72 _______, _______, _______, _______, _______, _______
75 [_RAISE] = LAYOUT_wrapper( \
76 _______, _________________RAISE_L1__________________, _________________RAISE_R1__________________, _______,
77 _______, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS,
78 _______, _________________RAISE_L3__________________, _________________RAISE_R3__________________, _______,
79 _______, _______, _______, _______, _______, _______
82 [_ADJUST] = LAYOUT_wrapper( \
83 KC_MAKE, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, KC_RESET,
84 VRSN, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, EEP_RST,
85 _______, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY,
86 _______, _______, _______, KC_NUKE, TG_MODS, _______
90 void matrix_init_keymap(void) {
91 //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
93 iota_gfx_init(!has_usb()); // turns on the display
103 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
106 // When add source files to SRC in rules.mk, you can use functions.
107 const char *read_logo(void);
108 char layer_state_str[24];
109 char modifier_state_str[24];
110 char host_led_state_str[24];
111 char keylog_str[24] = {};
112 char keylogs_str[21] = {};
113 int keylogs_str_idx = 0;
115 // const char *read_mode_icon(bool swap);
116 // void set_timelog(void);
117 // const char *read_timelog(void);
119 const char code_to_name[60] = {
120 ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
121 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
122 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
123 '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
124 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
125 '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
127 void set_keylog(uint16_t keycode, keyrecord_t *record) {
130 name = code_to_name[keycode];
134 snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c",
135 record->event.key.row, record->event.key.col,
139 if (keylogs_str_idx == sizeof(keylogs_str) - 1) {
141 for (int i = 0; i < sizeof(keylogs_str) - 1; i++) {
142 keylogs_str[i] = ' ';
146 keylogs_str[keylogs_str_idx] = name;
150 const char *read_keylog(void) {
154 const char *read_keylogs(void) {
159 const char* read_modifier_state(void) {
160 uint8_t modifiers = get_mods();
161 uint8_t one_shot = get_oneshot_mods();
163 snprintf(modifier_state_str, sizeof(modifier_state_str), "Mods:%s %s %s %s",
164 (modifiers & MODS_CTRL_MASK || one_shot & MODS_CTRL_MASK) ? "CTL" : " ",
165 (modifiers & MODS_GUI_MASK || one_shot & MODS_GUI_MASK) ? "GUI" : " ",
166 (modifiers & MODS_ALT_MASK || one_shot & MODS_ALT_MASK) ? "ALT" : " ",
167 (modifiers & MODS_SHIFT_MASK || one_shot & MODS_SHIFT_MASK) ? "SFT" : " "
170 return modifier_state_str;
173 const char *read_host_led_state(void) {
174 uint8_t leds = host_keyboard_leds();
176 snprintf(host_led_state_str, sizeof(host_led_state_str), "NL:%s CL:%s SL:%s",
177 (leds & (1 << USB_LED_NUM_LOCK)) ? "on" : "- ",
178 (leds & (1 << USB_LED_CAPS_LOCK)) ? "on" : "- ",
179 (leds & (1 << USB_LED_SCROLL_LOCK)) ? "on" : "- "
182 return host_led_state_str;
185 const char* read_layer_state(void) {
186 switch (biton32(layer_state)) {
188 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise ");
191 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower ");
194 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust ");
197 switch (biton32(default_layer_state)) {
199 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Qwerty ");
202 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Colemak");
205 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Dvorak ");
208 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Workman");
214 return layer_state_str;
217 void matrix_scan_keymap(void) {
221 void matrix_render_user(struct CharacterMatrix *matrix) {
223 //If you want to change the display of OLED, you need to change here
224 matrix_write_ln(matrix, read_layer_state());
225 matrix_write_ln(matrix, read_modifier_state());
226 // matrix_write_ln(matrix, read_keylog());
227 matrix_write_ln(matrix, read_keylogs());
228 // matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
229 matrix_write(matrix, read_host_led_state());
230 //matrix_write_ln(matrix, read_timelog());
232 matrix_write(matrix, read_logo());
236 void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
237 if (memcmp(dest->display, source->display, sizeof(dest->display))) {
238 memcpy(dest->display, source->display, sizeof(dest->display));
243 void iota_gfx_task_user(void) {
244 struct CharacterMatrix matrix;
245 matrix_clear(&matrix);
246 matrix_render_user(&matrix);
247 matrix_update(&display, &matrix);
250 bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
252 case KC_A ... KC_SLASH:
253 case KC_F1 ... KC_F12:
254 case KC_INSERT ... KC_UP:
255 case KC_KP_SLASH ... KC_KP_DOT:
256 case KC_F13 ... KC_F24:
257 if (record->event.pressed) { set_keylog(keycode, record); }