qmk_firmware

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

keymap.c (8881B)


      1 // Copyright 2022 zzeneg (@zzeneg)
      2 // SPDX-License-Identifier: GPL-2.0-or-later
      3 
      4 #include QMK_KEYBOARD_H
      5 
      6 #include "hid_display.h"
      7 #include "raw_hid.h"
      8 #include "transactions.h"
      9 
     10 // Left-hand home row mods
     11 #define HOME_A LGUI_T(KC_A)
     12 #define HOME_S LALT_T(KC_S)
     13 #define HOME_D LCTL_T(KC_D)
     14 #define HOME_F LSFT_T(KC_F)
     15 
     16 // Right-hand home row mods
     17 #define HOME_J RSFT_T(KC_J)
     18 #define HOME_K RCTL_T(KC_K)
     19 #define HOME_L LALT_T(KC_L)
     20 #define HOME_SCLN RGUI_T(KC_SCLN)
     21 
     22 // bottom mods
     23 #define SYM_SPC LT(_SYMBOL, KC_SPC)
     24 #define NUM_TAB LT(_NUMBER, KC_TAB)
     25 #define FUNC_ESC LT(_FUNC, KC_ESC)
     26 #define FUNC_ENT LT(_FUNC, KC_ENT)
     27 #define NAV_BSPC LT(_NAV, KC_BSPC)
     28 #define RALT_DEL LALT_T(KC_DEL)
     29 
     30 // game layer mods
     31 #define LALT_Q LALT_T(KC_Q)
     32 #define LSFT_MINS LSFT_T(KC_MINS)
     33 #define LCTL_ESC LCTL_T(KC_ESC)
     34 #define LGUI_QUOT LGUI_T(KC_QUOT)
     35 
     36 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     37     /* QWERTY
     38      *               .---------------------------.                    .---------------------------.
     39      *               |   W  |   E  |   R  |   T  |                    |   Y  |   U  |   I  |   O  |
     40      * .------+------+------+------+------+------|                    |------+------+------+------+------+------.
     41      * |  Q   |   A  |   S  |   D  |   F  |   G  |                    |   H  |   J  |   K  |   L  |   P  |  ;   |
     42      * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
     43      * |  -   |   Z  |   X  |   C  |   V  |   B  |--------.  .--------|   N  |   M  |   ,  |   .  |   /  |  '   |
     44      * '-----------------------------------------/       /    \       \-----------------------------------------'
     45      *                         | Esc  | Tab  |  / Space /      \ Enter \  | Bsps | Del  |
     46      *                         |_FUNC | _NUM | /_SYMBOL/        \ _FUNC \ | _NAV | RAlt |
     47      *                         `-------------''-------'          '-------''-------------'
     48      */
     49     // clang-format off
     50     [_QWERTY] = LAYOUT(
     51                             KC_W,    KC_E,    KC_R,    KC_T,                KC_Y,    KC_U,    KC_I,     KC_O,
     52         KC_Q,     HOME_A,   HOME_S,  HOME_D,  HOME_F,  KC_G,                KC_H,    HOME_J,  HOME_K,   HOME_L,  HOME_SCLN,  KC_P,
     53         KC_MINS,  KC_Z,     KC_X,    KC_C,    KC_V,    KC_B,                KC_N,    KC_M,    KC_COMM,  KC_DOT,  KC_SLSH,    KC_QUOT,
     54                                    FUNC_ESC,  NUM_TAB,  SYM_SPC,     FUNC_ENT,  NAV_BSPC,  RALT_DEL
     55     ),
     56 
     57     [_GAME] = LAYOUT(
     58                             KC_W,    KC_E,    KC_R,    KC_T,               KC_Y,    KC_U,    KC_I,     KC_O,
     59         LALT_Q,     KC_A,   KC_S,    KC_D,    KC_F,    KC_G,               KC_H,    KC_J,    KC_K,     KC_L,    KC_SCLN,  KC_P,
     60         LSFT_MINS,  KC_Z,   KC_X,    KC_C,    KC_V,    KC_B,               KC_N,    KC_M,    KC_COMM,  KC_DOT,  KC_SLSH,  LGUI_QUOT,
     61                                     LCTL_ESC,  NUM_TAB,  SYM_SPC,    FUNC_ENT,  NAV_BSPC,  RALT_DEL
     62     ),
     63 
     64     [_NAV] = LAYOUT(
     65                             XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,             XXXXXXX,  XXXXXXX,  KC_PGDN,  KC_PGUP,
     66         XXXXXXX,  KC_LGUI,  KC_LALT,  KC_LCTL,  KC_LSFT,  XXXXXXX,             XXXXXXX,  KC_LEFT,  KC_DOWN,  KC_UP,    KC_RGHT,  KC_PAUS,
     67         XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,             XXXXXXX,  KC_HOME,  KC_END,   KC_INS,   KC_APP,   XXXXXXX,
     68                                        FUNC_ESC,   NUM_TAB,   SYM_SPC,     XXXXXXX,  _______,  RALT_DEL
     69     ),
     70 
     71     [_NUMBER] = LAYOUT(
     72                             KC_7,    KC_8,    KC_9,    KC_GRV,              XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
     73         KC_EQL,   KC_0,     KC_4,    KC_5,    KC_6,    KC_LBRC,             XXXXXXX,  KC_RSFT,  KC_RCTL,  KC_LALT,  KC_RGUI,  XXXXXXX,
     74         KC_MINS,  KC_BSLS,  KC_1,    KC_2,    KC_3,    KC_RBRC,             XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
     75                                      KC_ENT,  _______,  TG(_GAME),       FUNC_ENT,  NAV_BSPC,  RALT_DEL
     76     ),
     77 
     78     [_SYMBOL] = LAYOUT(
     79                                         LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_GRV),           XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
     80         LSFT(KC_EQL),   LSFT(KC_0),     LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_LBRC),          XXXXXXX,  KC_RSFT,  KC_RCTL,  KC_LALT,  KC_RGUI,  XXXXXXX,
     81         LSFT(KC_MINS),  LSFT(KC_BSLS),  LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_RBRC),          XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
     82                                                                 MO(_SYS),  KC_BSPC, _______,     FUNC_ENT,  NAV_BSPC,  RALT_DEL
     83     ),
     84 
     85     [_FUNC] = LAYOUT(
     86                             KC_F7,   KC_F8,   KC_F9,   KC_CAPS,            XXXXXXX,  KC_PSCR,  KC_SCRL,  KC_NUM,
     87         KC_F12,   KC_F11,   KC_F4,   KC_F5,   KC_F6,   KC_F12,             XXXXXXX,  KC_RSFT,  KC_RCTL,  KC_LALT,  KC_RGUI,  XXXXXXX,
     88         XXXXXXX,  KC_F10,   KC_F1,   KC_F2,   KC_F3,   XXXXXXX,            XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
     89                                          _______, KC_MNXT, KC_MPLY,     _______, XXXXXXX,  MO(_SYS)
     90     ),
     91 
     92     [_SYS] = LAYOUT(
     93                             BL_DOWN,  BL_UP,    BL_TOGG,  XXXXXXX,            XXXXXXX,  RM_TOGG,  RM_NEXT,  RM_PREV,
     94         XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,            XXXXXXX,  RM_HUEU,  RM_SATU,  RM_VALU,  RM_SPDU,  RGB_M_P,
     95         EH_LEFT,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  EH_RGHT,            EH_RGHT,  RM_HUED,  RM_SATD,  RM_VALD,  RM_SPDD,  EH_LEFT,
     96                                             _______, QK_BOOT, _______,     _______, QK_BOOT, _______
     97     )
     98     // clang-format on
     99 };
    100 
    101 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    102     dprintf("process_record_user %u %s %s %d\n", keycode, record->event.pressed ? "pressed" : "depressed", record->tap.interrupted ? "interrupted" : "not interrupted", record->tap.count);
    103 
    104     if (record->event.pressed) {
    105         uint8_t data[32];
    106         data[0] = 0;
    107 
    108         switch (keycode) {
    109             // send hid commands
    110             case KC_VOLU:
    111             case KC_VOLD:
    112                 data[0] = _VOLUME;
    113                 break;
    114         }
    115 
    116         if (data[0]) {
    117             dprintf("raw_hid_send %u\n", data[0]);
    118             raw_hid_send(data, sizeof(data));
    119         }
    120     }
    121 
    122     return true;
    123 }
    124 
    125 /* Caps Word processing */
    126 #ifdef CAPS_WORD_ENABLE
    127 void caps_word_set_user(bool active) {
    128     if (is_display_enabled()) {
    129         display_process_caps_word(active);
    130     } else if (is_keyboard_master() && !is_keyboard_left()) {
    131         dprintf("RPC_ID_USER_CAPS_WORD_SYNC: %s\n", active ? "active" : "inactive");
    132         transaction_rpc_send(RPC_ID_USER_CAPS_WORD_SYNC, 1, &active);
    133     }
    134 }
    135 #endif
    136 
    137 /* Active Layer processing */
    138 layer_state_t layer_state_set_user(layer_state_t state) {
    139     if (is_display_enabled()) {
    140         display_process_layer_state(get_highest_layer(state));
    141     } else if (is_keyboard_master() && !is_keyboard_left()) {
    142         uint8_t layer = get_highest_layer(state);
    143         dprintf("RPC_ID_USER_LAYER_SYNC: %u\n", layer);
    144         transaction_rpc_send(RPC_ID_USER_LAYER_SYNC, 1, &layer);
    145     }
    146 
    147     return state;
    148 }
    149 
    150 /* Raw HID processing*/
    151 void raw_hid_receive(uint8_t *data, uint8_t length) {
    152     dprintf("raw_hid_receive - received %u bytes \n", length);
    153 
    154     if (is_display_enabled()) {
    155         display_process_raw_hid_data(data, length);
    156     } else if (is_keyboard_master() && !is_keyboard_left()) {
    157         dprint("RPC_ID_USER_HID_SYNC \n");
    158         transaction_rpc_send(RPC_ID_USER_HID_SYNC, length, data);
    159     }
    160 }
    161 
    162 void hid_sync(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) {
    163     if (is_display_enabled()) {
    164         display_process_raw_hid_data((uint8_t *)initiator2target_buffer, initiator2target_buffer_size);
    165     }
    166 }
    167 
    168 void layer_sync(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) {
    169     if (is_display_enabled()) {
    170         display_process_layer_state(*(uint8_t *)initiator2target_buffer);
    171     }
    172 }
    173 
    174 void caps_word_sync(uint8_t initiator2target_buffer_size, const void *initiator2target_buffer, uint8_t target2initiator_buffer_size, void *target2initiator_buffer) {
    175     if (is_display_enabled()) {
    176         display_process_caps_word(*(bool *)initiator2target_buffer);
    177     }
    178 }
    179 
    180 void keyboard_post_init_user() {
    181     // sync received hid data
    182     transaction_register_rpc(RPC_ID_USER_HID_SYNC, hid_sync);
    183     // sync highest layer (a bit more performant than standard SPLIT_LAYER_STATE_ENABLE)
    184     transaction_register_rpc(RPC_ID_USER_LAYER_SYNC, layer_sync);
    185     // sync caps word state
    186     transaction_register_rpc(RPC_ID_USER_CAPS_WORD_SYNC, caps_word_sync);
    187 }