crkbd.c (5733B)
1 /* 2 Copyright 2019 @foostan 3 Copyright 2020 Drashna Jaelre <@drashna> 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation, either version 2 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #include "quantum.h" 20 21 #ifdef SWAP_HANDS_ENABLE 22 __attribute__((weak)) const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { 23 // Left 24 {{0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}}, 25 {{0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}}, 26 {{0, 6}, {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}}, 27 {{0, 7}, {1, 7}, {2, 7}, {3, 7}, {4, 7}, {5, 7}}, 28 // Right 29 {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}}, 30 {{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}}, 31 {{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}}, 32 {{0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}} 33 }; 34 #endif 35 36 #ifdef OLED_ENABLE 37 38 oled_rotation_t oled_init_kb(oled_rotation_t rotation) { 39 if (!is_keyboard_master()) { 40 return OLED_ROTATION_180; // flips the display 180 degrees if offhand 41 } 42 return rotation; 43 } 44 45 static void oled_render_layer_state(void) { 46 oled_write_P(PSTR("Layer: "), false); 47 switch (get_highest_layer(layer_state)) { 48 case 0: 49 oled_write_ln_P(PSTR("Default"), false); 50 break; 51 case 1: 52 oled_write_ln_P(PSTR("Lower"), false); 53 break; 54 case 2: 55 oled_write_ln_P(PSTR("Raise"), false); 56 break; 57 case 3: 58 oled_write_ln_P(PSTR("Adjust"), false); 59 break; 60 default: 61 oled_write_ln_P(PSTR("Undef"), false); 62 break; 63 } 64 } 65 66 char key_name = ' '; 67 uint16_t last_keycode; 68 uint8_t last_row; 69 uint8_t last_col; 70 71 static const char PROGMEM code_to_name[60] = {' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\', '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '}; 72 73 static void set_keylog(uint16_t keycode, keyrecord_t *record) { 74 // save the row and column (useful even if we can't find a keycode to show) 75 last_row = record->event.key.row; 76 last_col = record->event.key.col; 77 78 key_name = ' '; 79 last_keycode = keycode; 80 if (IS_QK_MOD_TAP(keycode)) { 81 if (record->tap.count) { 82 keycode = QK_MOD_TAP_GET_TAP_KEYCODE(keycode); 83 } else { 84 keycode = 0xE0 + biton(QK_MOD_TAP_GET_MODS(keycode) & 0xF) + biton(QK_MOD_TAP_GET_MODS(keycode) & 0x10); 85 } 86 } else if (IS_QK_LAYER_TAP(keycode) && record->tap.count) { 87 keycode = QK_LAYER_TAP_GET_TAP_KEYCODE(keycode); 88 } else if (IS_QK_MODS(keycode)) { 89 keycode = QK_MODS_GET_BASIC_KEYCODE(keycode); 90 } else if (IS_QK_ONE_SHOT_MOD(keycode)) { 91 keycode = 0xE0 + biton(QK_ONE_SHOT_MOD_GET_MODS(keycode) & 0xF) + biton(QK_ONE_SHOT_MOD_GET_MODS(keycode) & 0x10); 92 } 93 if (keycode > ARRAY_SIZE(code_to_name)) { 94 return; 95 } 96 97 // update keylog 98 key_name = pgm_read_byte(&code_to_name[keycode]); 99 } 100 101 static const char *depad_str(const char *depad_str, char depad_char) { 102 while (*depad_str == depad_char) 103 ++depad_str; 104 return depad_str; 105 } 106 107 static void oled_render_keylog(void) { 108 oled_write_char('0' + last_row, false); 109 oled_write_P(PSTR("x"), false); 110 oled_write_char('0' + last_col, false); 111 oled_write_P(PSTR(", k"), false); 112 const char *last_keycode_str = get_u16_str(last_keycode, ' '); 113 oled_write(depad_str(last_keycode_str, ' '), false); 114 oled_write_P(PSTR(":"), false); 115 oled_write_char(key_name, false); 116 oled_advance_page(true); 117 } 118 119 // static void render_bootmagic_status(bool status) { 120 // /* Show Ctrl-Gui Swap options */ 121 // static const char PROGMEM logo[][2][3] = { 122 // {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}, 123 // {{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, 124 // }; 125 // if (status) { 126 // oled_write_ln_P(logo[0][0], false); 127 // oled_write_ln_P(logo[0][1], false); 128 // } else { 129 // oled_write_ln_P(logo[1][0], false); 130 // oled_write_ln_P(logo[1][1], false); 131 // } 132 // } 133 134 __attribute__((weak)) void oled_render_logo(void) { 135 // clang-format off 136 static const char PROGMEM crkbd_logo[] = { 137 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 138 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 139 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 140 0}; 141 // clang-format on 142 oled_write_P(crkbd_logo, false); 143 } 144 145 bool oled_task_kb(void) { 146 if (!oled_task_user()) { 147 return false; 148 } 149 if (is_keyboard_master()) { 150 oled_render_layer_state(); 151 oled_render_keylog(); 152 } else { 153 oled_render_logo(); 154 } 155 return false; 156 } 157 158 bool process_record_kb(uint16_t keycode, keyrecord_t *record) { 159 if (record->event.pressed) { 160 set_keylog(keycode, record); 161 } 162 return process_record_user(keycode, record); 163 } 164 #endif // OLED_ENABLE