1 #include QMK_KEYBOARD_H
4 extern keymap_config_t keymap_config;
5 extern uint8_t is_master;
8 //Following line allows macro to read current RGB settings
9 extern rgblight_config_t rgblight_config;
13 RGBRST = NEW_SAFE_RANGE
16 #define LAYOUT_crkbd_base( \
17 K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
18 K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
19 K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \
22 KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_MINS, \
23 KC_TAB, ALT_T(K11), K12, K13, K14, K15, K16, K17, K18, K19, K1A, RGUI_T(KC_QUOT), \
24 OS_LSFT, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, RCTL_T(K2A), OS_RSFT, \
25 LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \
27 #define LAYOUT_crkbd_base_wrapper(...) LAYOUT_crkbd_base(__VA_ARGS__)
29 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
30 [_QWERTY] = LAYOUT_crkbd_base_wrapper(
31 _________________QWERTY_L1_________________, _________________QWERTY_R1_________________,
32 _________________QWERTY_L2_________________, _________________QWERTY_R2_________________,
33 _________________QWERTY_L3_________________, _________________QWERTY_R3_________________
36 [_COLEMAK] = LAYOUT_crkbd_base_wrapper(
37 _________________COLEMAK_L1________________, _________________COLEMAK_R1________________,
38 _________________COLEMAK_L2________________, _________________COLEMAK_R2________________,
39 _________________COLEMAK_L3________________, _________________COLEMAK_R3________________
42 [_DVORAK] = LAYOUT_crkbd_base_wrapper(
43 _________________DVORAK_L1_________________, _________________DVORAK_R1_________________,
44 _________________DVORAK_L2_________________, _________________DVORAK_R2_________________,
45 _________________DVORAK_L3_________________, _________________DVORAK_R3_________________
48 [_WORKMAN] = LAYOUT_crkbd_base_wrapper(
49 _________________WORKMAN_L1________________, _________________WORKMAN_R1________________,
50 _________________WORKMAN_L2________________, _________________WORKMAN_R2________________,
51 _________________WORKMAN_L3________________, _________________WORKMAN_R3________________
54 [_NORMAN] = LAYOUT_crkbd_base_wrapper(
55 _________________NORMAN_L1_________________, _________________NORMAN_L1_________________,
56 _________________NORMAN_L2_________________, _________________NORMAN_R2_________________,
57 _________________NORMAN_L3_________________, _________________NORMAN_R3_________________
60 [_MALTRON] = LAYOUT_crkbd_base_wrapper(
61 _________________MALTRON_L1________________, _________________MALTRON_R1________________,
62 _________________MALTRON_L2________________, _________________MALTRON_R2________________,
63 _________________MALTRON_L3________________, _________________MALTRON_R3________________
66 [_EUCALYN] = LAYOUT_crkbd_base_wrapper(
67 _________________EUCALYN_L1________________, _________________EUCALYN_R1________________,
68 _________________EUCALYN_L2________________, _________________EUCALYN_R2________________,
69 _________________EUCALYN_L3________________, _________________EUCALYN_R3________________
72 [_CARPLAX] = LAYOUT_crkbd_base_wrapper(
73 _____________CARPLAX_QFMLWY_L1_____________, _____________CARPLAX_QFMLWY_R1_____________,
74 _____________CARPLAX_QFMLWY_L2_____________, _____________CARPLAX_QFMLWY_R2_____________,
75 _____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
78 [_MODS] = LAYOUT_wrapper(
79 _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
80 _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
81 KC_LSFT, ___________________BLANK___________________, ___________________BLANK___________________, KC_RSFT,
82 _______, _______, _______, _______, _______, _______
85 [_LOWER] = LAYOUT_wrapper(
86 KC_F11, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_F11,
87 KC_F12, _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_PIPE,
88 _______, _________________LOWER_L3__________________, _________________LOWER_R3__________________, _______,
89 _______, _______, _______, _______, _______, _______
92 [_RAISE] = LAYOUT_wrapper( \
93 _______, _________________RAISE_L1__________________, _________________RAISE_R1__________________, _______,
94 _______, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS,
95 _______, _________________RAISE_L3__________________, _________________RAISE_R3__________________, _______,
96 _______, _______, _______, _______, _______, _______
99 [_ADJUST] = LAYOUT_wrapper( \
100 KC_MAKE, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, KC_RESET,
101 VRSN, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, EEP_RST,
102 _______, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY,
103 _______, _______, _______, KC_NUKE, TG_MODS, _______
107 void matrix_init_keymap(void) {
108 #ifndef CONVERT_TO_PROTON_C
118 #ifdef OLED_DRIVER_ENABLE
119 oled_rotation_t oled_init_user(oled_rotation_t rotation) {
121 return OLED_ROTATION_270;
127 void render_crkbd_logo(void) {
128 static const char PROGMEM crkbd_logo[] = {
129 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
130 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
131 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
133 oled_write_P(crkbd_logo, false);
136 #define KEYLOG_LEN (int)(32 / OLED_FONT_WIDTH)
137 char keylog_str[KEYLOG_LEN] = {};
138 uint8_t keylogs_str_idx = 0;
139 uint16_t log_timer = 0;
141 const char code_to_name[60] = {
142 ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
143 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
144 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
145 '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
146 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
147 '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
149 void add_keylog(uint16_t keycode) {
150 if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) ||
151 (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { keycode = keycode & 0xFF; }
153 for (uint8_t i = KEYLOG_LEN - 1; i > 0; i--) {
154 keylog_str[i] = keylog_str[i - 1];
157 keylog_str[0] = code_to_name[keycode];
159 log_timer = timer_read();
162 void update_log(void) {
163 if (timer_elapsed(log_timer) > 750) {
169 bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
170 if (record->event.pressed) { add_keylog(keycode); }
174 void render_status(void) {
176 oled_write_P(PSTR("Layer"), false);
177 switch (biton32(layer_state)) {
179 oled_write_P(PSTR("Base "), false);
182 oled_write_P(PSTR("Raise"), false);
185 oled_write_P(PSTR("Lower"), false);
188 oled_write_P(PSTR("Adjst"), false);
191 oled_write_P(PSTR("Unkn "), false);
194 oled_write_P(PSTR("Lyout"), false);
195 switch (biton32(default_layer_state)) {
197 oled_write_P(PSTR("QWRTY"), false);
200 oled_write_P(PSTR("COLMK"), false);
203 oled_write_P(PSTR("DVRAK"), false);
206 oled_write_P(PSTR("WRKMN"), false);
209 oled_write_P(PSTR("NORMN"), false);
212 oled_write_P(PSTR("MLTRN"), false);
215 oled_write_P(PSTR("ECLYN"), false);
218 oled_write_P(PSTR("CRPLX"), false);
222 uint8_t modifiers = get_mods();
223 uint8_t one_shot = get_oneshot_mods();
225 oled_write_P(PSTR("Mods:"), false);
226 oled_write_P( (modifiers & MOD_MASK_SHIFT || one_shot & MOD_MASK_SHIFT) ? PSTR(" SFT ") : PSTR(" "), false);
227 oled_write_P( (modifiers & MOD_MASK_CTRL || one_shot & MOD_MASK_CTRL ) ? PSTR(" CTL ") : PSTR(" "), false);
228 oled_write_P( (modifiers & MOD_MASK_ALT || one_shot & MOD_MASK_ALT ) ? PSTR(" ALT ") : PSTR(" "), false);
229 oled_write_P( (modifiers & MOD_MASK_GUI || one_shot & MOD_MASK_GUI ) ? PSTR(" GUI ") : PSTR(" "), false);
232 oled_write_P(PSTR("BTMGK"), false);
234 if (keymap_config.swap_lalt_lgui) {
235 oled_write_P(PSTR(" Mac "), false);
237 oled_write_P(PSTR(" Win "), false);
240 uint8_t led_usb_state = host_keyboard_leds();
241 oled_write_P(PSTR("Lock:"), false);
242 oled_write_P(led_usb_state & (1<<USB_LED_NUM_LOCK) ? PSTR(" NUM ") : PSTR(" "), false);
243 oled_write_P(led_usb_state & (1<<USB_LED_CAPS_LOCK) ? PSTR(" CAPS") : PSTR(" "), false);
244 oled_write_P(led_usb_state & (1<<USB_LED_SCROLL_LOCK) ? PSTR(" SCRL") : PSTR(" "), false);
246 oled_write(keylog_str, false);
250 void oled_task_user(void) {
252 render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
255 oled_scroll_left(); // Turns on scrolling
259 void matrix_scan_keymap(void) { update_log(); }
262 uint16_t get_tapping_term(uint16_t keycode) {
265 return TAPPING_TERM + 100;