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 [_NORMAN] = LAYOUT_crkbd_base_wrapper(
62 _________________NORMAN_L1_________________, _________________NORMAN_L1_________________,
63 _________________NORMAN_L2_________________, _________________NORMAN_R2_________________,
64 _________________NORMAN_L3_________________, _________________NORMAN_R3_________________
67 [_MALTRON] = LAYOUT_crkbd_base_wrapper(
68 _________________MALTRON_L1________________, _________________MALTRON_R1________________,
69 _________________MALTRON_L2________________, _________________MALTRON_R2________________,
70 _________________MALTRON_L3________________, _________________MALTRON_R3________________
73 [_EUCALYN] = LAYOUT_crkbd_base_wrapper(
74 _________________EUCALYN_L1________________, _________________EUCALYN_R1________________,
75 _________________EUCALYN_L2________________, _________________EUCALYN_R2________________,
76 _________________EUCALYN_L3________________, _________________EUCALYN_R3________________
79 [_CARPLAX] = LAYOUT_crkbd_base_wrapper(
80 _____________CARPLAX_QFMLWY_L1_____________, _____________CARPLAX_QFMLWY_R1_____________,
81 _____________CARPLAX_QFMLWY_L2_____________, _____________CARPLAX_QFMLWY_R2_____________,
82 _____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
85 [_MODS] = LAYOUT_wrapper(
86 _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
87 _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
88 KC_LSFT, ___________________BLANK___________________, ___________________BLANK___________________, KC_RSFT,
89 _______, _______, _______, _______, _______, _______
92 [_LOWER] = LAYOUT_wrapper(
93 KC_F11, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_F11,
94 KC_F12, _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_PIPE,
95 _______, _________________LOWER_L3__________________, _________________LOWER_R3__________________, _______,
96 _______, _______, _______, _______, _______, _______
99 [_RAISE] = LAYOUT_wrapper( \
100 _______, _________________RAISE_L1__________________, _________________RAISE_R1__________________, _______,
101 _______, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS,
102 _______, _________________RAISE_L3__________________, _________________RAISE_R3__________________, _______,
103 _______, _______, _______, _______, _______, _______
106 [_ADJUST] = LAYOUT_wrapper( \
107 KC_MAKE, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, KC_RESET,
108 VRSN, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, EEP_RST,
109 _______, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY,
110 _______, _______, _______, KC_NUKE, TG_MODS, _______
114 void matrix_init_keymap(void) {
115 //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
117 iota_gfx_init(!has_usb()); // turns on the display
120 #ifndef CONVERT_TO_PROTON_C
129 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
132 // When add source files to SRC in rules.mk, you can use functions.
133 const char *read_logo(void);
134 char layer_state_str[24];
135 char modifier_state_str[24];
136 char host_led_state_str[24];
137 char keylog_str[24] = {};
138 char keylogs_str[21] = {};
139 int keylogs_str_idx = 0;
141 // const char *read_mode_icon(bool swap);
142 // void set_timelog(void);
143 // const char *read_timelog(void);
145 const char code_to_name[60] = {
146 ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
147 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
148 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
149 '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
150 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
151 '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
153 void set_keylog(uint16_t keycode, keyrecord_t *record) {
155 if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { keycode = keycode & 0xFF; }
157 name = code_to_name[keycode];
160 snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c",
161 record->event.key.row, record->event.key.col,
165 if (keylogs_str_idx == sizeof(keylogs_str) - 1) {
167 for (int i = 0; i < sizeof(keylogs_str) - 1; i++) {
168 keylogs_str[i] = ' ';
172 keylogs_str[keylogs_str_idx] = name;
176 const char *read_keylog(void) {
180 const char *read_keylogs(void) {
185 const char* read_modifier_state(void) {
186 uint8_t modifiers = get_mods();
187 uint8_t one_shot = get_oneshot_mods();
189 snprintf(modifier_state_str, sizeof(modifier_state_str), "Mods:%s %s %s %s",
190 (modifiers & MODS_CTRL_MASK || one_shot & MODS_CTRL_MASK) ? "CTL" : " ",
191 (modifiers & MODS_GUI_MASK || one_shot & MODS_GUI_MASK) ? "GUI" : " ",
192 (modifiers & MODS_ALT_MASK || one_shot & MODS_ALT_MASK) ? "ALT" : " ",
193 (modifiers & MODS_SHIFT_MASK || one_shot & MODS_SHIFT_MASK) ? "SFT" : " "
196 return modifier_state_str;
199 const char *read_host_led_state(void) {
200 uint8_t leds = host_keyboard_leds();
202 snprintf(host_led_state_str, sizeof(host_led_state_str), "NL:%s CL:%s SL:%s",
203 (leds & (1 << USB_LED_NUM_LOCK)) ? "on" : "- ",
204 (leds & (1 << USB_LED_CAPS_LOCK)) ? "on" : "- ",
205 (leds & (1 << USB_LED_SCROLL_LOCK)) ? "on" : "- "
208 return host_led_state_str;
211 const char* read_layer_state(void) {
212 switch (biton32(layer_state)) {
214 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise ");
217 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower ");
220 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust ");
223 switch (biton32(default_layer_state)) {
225 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Qwerty ");
228 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Colemak");
231 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Dvorak ");
234 snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Workman");
240 return layer_state_str;
243 void matrix_scan_keymap(void) {
247 void matrix_render_user(struct CharacterMatrix *matrix) {
249 //If you want to change the display of OLED, you need to change here
250 matrix_write_ln(matrix, read_layer_state());
251 matrix_write_ln(matrix, read_modifier_state());
252 // matrix_write_ln(matrix, read_keylog());
253 matrix_write_ln(matrix, read_keylogs());
254 // matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
255 matrix_write(matrix, read_host_led_state());
256 //matrix_write_ln(matrix, read_timelog());
258 matrix_write(matrix, read_logo());
262 void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
263 if (memcmp(dest->display, source->display, sizeof(dest->display))) {
264 memcpy(dest->display, source->display, sizeof(dest->display));
269 void iota_gfx_task_user(void) {
270 struct CharacterMatrix matrix;
271 matrix_clear(&matrix);
272 matrix_render_user(&matrix);
273 matrix_update(&display, &matrix);
276 bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
278 case KC_A ... KC_SLASH:
279 case KC_F1 ... KC_F12:
280 case KC_INSERT ... KC_UP:
281 case KC_KP_SLASH ... KC_KP_DOT:
282 case KC_F13 ... KC_F24:
283 if (record->event.pressed) { set_keylog(keycode, record); }