qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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