qmk_firmware

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

keymap.c (4637B)


      1 /* Copyright 2021 Ben Roesner (keycapsss.com)
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 2 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15  */
     16 
     17 #include QMK_KEYBOARD_H
     18 #include <stdio.h>
     19 
     20 enum layers {
     21     _NUMPAD,
     22     _NAVIGATION,
     23     _MEDIA
     24 };
     25 
     26 enum combos {
     27   COMBO1,
     28   COMBO2,
     29   COMBO3
     30 };
     31 
     32 
     33 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     34     /* NUMPAD layer
     35     * ,-----------------------,
     36     * |  7  |  8  |  9  |  /  |
     37     * |-----+-----+-----+-----|
     38     * |  4  |  5  |  6  |  *  |
     39     * |-----+-----+-----+-----|
     40     * |  1  |  2  |  3  |  -  |
     41     * |-----+-----+-----+-----|
     42     * |  0  |  .  |  =  |  +  |
     43     * `-----------------------'
     44     */
     45     [_NUMPAD] = LAYOUT_ortho_4x4(
     46         KC_P7, KC_P8,   KC_P9,    KC_PSLS,
     47         KC_P4, KC_P5,   KC_P6,    KC_PAST,
     48         KC_P1, KC_P2,   KC_P3,    KC_PMNS,
     49         KC_P0, KC_PDOT, KC_PEQL,  KC_PPLS
     50     ),
     51     /* Navigation layer
     52     */
     53     [_NAVIGATION] = LAYOUT_ortho_4x4(
     54         MS_BTN1, MS_UP,   MS_BTN2, XXXXXXX,
     55         MS_LEFT, MS_DOWN, MS_RGHT, XXXXXXX,
     56         XXXXXXX, KC_UP,   XXXXXXX, XXXXXXX,
     57         KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX
     58     ),
     59     /* MEDIA layer
     60     */
     61     [_MEDIA] = LAYOUT_ortho_4x4(
     62         KC_SYSTEM_SLEEP,     XXXXXXX,             XXXXXXX,             KC_AUDIO_MUTE,
     63         XXXXXXX,             XXXXXXX,             XXXXXXX,             XXXXXXX,
     64         KC_AUDIO_VOL_DOWN,   KC_AUDIO_MUTE,       KC_AUDIO_VOL_UP,     XXXXXXX,
     65         KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, XXXXXXX
     66     ),
     67 
     68 };
     69 
     70 // Combos for switching layers
     71 const uint16_t PROGMEM zeroDot_combo[] = {KC_P0, KC_PDOT, COMBO_END};
     72 const uint16_t PROGMEM leftDown_combo[] = {KC_LEFT, KC_DOWN, COMBO_END};
     73 const uint16_t PROGMEM prevPlay_combo[] = {KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, COMBO_END};
     74 
     75 combo_t key_combos[] = {
     76   [COMBO1] = COMBO_ACTION(zeroDot_combo),
     77   [COMBO2] = COMBO_ACTION(leftDown_combo),
     78   [COMBO3] = COMBO_ACTION(prevPlay_combo),
     79 };
     80 
     81 void process_combo_event(uint16_t combo_index, bool pressed) {
     82   switch(combo_index) {
     83     case COMBO1:
     84       if (pressed) {
     85         layer_move(_NAVIGATION);
     86       }
     87       break;
     88     case COMBO2:
     89       if (pressed) {
     90         layer_move(_MEDIA);
     91       }
     92       break;
     93     case COMBO3:
     94       if (pressed) {
     95         layer_move(_NUMPAD);
     96       }
     97       break;
     98   }
     99 }
    100 
    101 #ifdef OLED_ENABLE
    102 
    103 void render_space(void) {
    104   oled_write_P(PSTR("     "), false);
    105 }
    106 
    107 
    108 void oled_render_layer_state(void) {
    109   oled_write_P(PSTR("Layer: "), false);
    110   if(layer_state_is(_MEDIA)) {
    111     oled_write_ln_P(PSTR("MEDIA"), false);
    112   } else if(layer_state_is(_NAVIGATION)) {
    113     oled_write_ln_P(PSTR("NAVIGATION"), false);
    114   } else {
    115     oled_write_ln_P(PSTR("NUMPAD"), false);
    116   }
    117 }
    118 
    119 
    120 bool oled_task_user(void) {
    121   oled_write_ln_P(PSTR("Plaid-Pad ///////////"), false);
    122   oled_render_layer_state();
    123     return false;
    124 }
    125 
    126 #endif
    127 
    128 #ifdef ENCODER_MAP_ENABLE
    129 /*
    130     ,-----------------------,
    131     |  E1 |  E2 |  E3 |  E4 |
    132     |-----+-----+-----+-----|
    133     |     |     |     |  E3 |
    134     |-----+-----+-----+-----|
    135     |     |     |     |  E2 |
    136     |-----+-----+-----+-----|
    137     |     |     |     |  E1 |
    138     `-----------------------'
    139  */
    140 const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
    141 #ifdef KEYBOARD_keycapsss_plaid_pad_rev1
    142   [_NUMPAD]     = { ENCODER_CCW_CW(KC_F18,       KC_F17),    ENCODER_CCW_CW(KC_F20,  KC_F19)  },
    143   [_NAVIGATION] = { ENCODER_CCW_CW(C(S(KC_TAB)), C(KC_TAB)), ENCODER_CCW_CW(KC_PGUP, KC_PGDN) },
    144   [_MEDIA]      = { ENCODER_CCW_CW(KC_F18,       KC_F17),    ENCODER_CCW_CW(KC_F20,  KC_F19)  }
    145 #else
    146   [_NUMPAD]     = { ENCODER_CCW_CW(KC_F18,       KC_F17),    ENCODER_CCW_CW(KC_F20,  KC_F19),  ENCODER_CCW_CW(KC_F22,  KC_F21),  ENCODER_CCW_CW(KC_F24,  KC_F23)  },
    147   [_NAVIGATION] = { ENCODER_CCW_CW(C(S(KC_TAB)), C(KC_TAB)), ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
    148   [_MEDIA]      = { ENCODER_CCW_CW(KC_F18,       KC_F17),    ENCODER_CCW_CW(KC_F20,  KC_F19),  ENCODER_CCW_CW(KC_BRID, KC_BRIU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }
    149 #endif
    150 };
    151 
    152 #endif