qmk_firmware

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

keymap.c (19313B)


      1 #include QMK_KEYBOARD_H
      2 #include "keymap_bepo.h"
      3 
      4 
      5 // Each layer gets a name for readability, which is then used in the keymap matrix below.
      6 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
      7 #define _BASE 0
      8 #define _SYMBOLS 1
      9 #define _MEDIA 2
     10 #define _TRNS 8
     11 
     12 #define PEDAL_DELAY 250
     13 #define KEY_DELAY 130
     14 
     15 enum custom_keycodes {
     16     M_LP = SAFE_RANGE, // left pedal
     17     M_RP,   // right pedal
     18     M_SF,   // shift
     19     M_SFS,  // shift and space
     20     M_L1E,  // L1 and space
     21     L2INS,  // L2 and insert
     22     L2LOC,  // Lock L2
     23     M_UN,   // undo
     24     M_CUT,  // cut
     25     M_CP,   // copy
     26     M_PS,   // paste
     27     M_SE,   // search
     28     M_SFU,  // shift and underscore
     29 };
     30 
     31 static uint16_t key_timer_left_pedal;
     32 static uint16_t key_timer_right_pedal;
     33 static uint16_t key_timer_shift;
     34 static uint16_t key_timer_1;
     35 static uint16_t key_timer_2;
     36 
     37 static uint16_t shift_count = 0; //this is used to keep track of shift state and avoid inserting non breakable space
     38 static uint16_t l2_locked = 0; //this indicate wether L2 is locked
     39 
     40 #define BP_CBSP  CTL_T(KC_BSPC)
     41 #define BP_CDEL  CTL_T(KC_DEL)
     42 
     43 //layout : http://www.keyboard-layout-editor.com/#/gists/4480e3ab8026eb7c710a7e22203ef4aa
     44 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     45 /* base
     46  *   left foot clicked is right click
     47  *   left foot pressed is layer 2
     48  *   right foot clicked is left click
     49  *   right foot pressed is layer 1 + scroll lock (used with autohotkey for easier scrolling with trackballs)
     50  *                      ,------.                                    ..                                    ,------.                      *
     51  *               ,------|  F3  |-------------.                      ..                      ,-------------|  F10 |------.               *
     52  *        ,------|  F2  |------|  F4  |  F5  |------.               ..               ,------|  F8  |  F9  |------| F11  |------.        *
     53  *        |  F1  |------| »/3  |------|------|  F6  |               ..               |  F7  |------|------| -/8  |------|  F12 |        *
     54  * ,------+------| «/2  |------|  (/4 | )/5  |------|               ..               |------| @/6  | +/7  |------| //9  |------+------. *
     55  * |  ESC | "/1  |------|  O   |------|------|  ¨   |               ..               |  ^   |------|------|  D   |------| * /0 |BCKSP | *
     56  * |------+------|  É   |------|  P   |  È   |------|               ..               |------|  K   |  V   |------|  L   |------+------| *
     57  * | TAB  |  B   |------|  E   |------|------|  _   |               ..               | =/°  |------|------|  S   |------|  J   |ENTER | *
     58  * |------+------|  U   |------|  I   |  F   |------|               ..               |------|  C   |  T   |------|  R   |------+------| *
     59  * | `    |  A   |------|  Y   |------|------|  ;   |               ..               |  !   |------|------|  UP  |------|  N   |  '/? | *
     60  * |------+------|  À   |------|  X   |  W   |------|-------------. .. .-------------|------|  M   |  G   |------|  H   |------+------| *
     61  * | SHIFT|  Z   |------|  .   |------|------|sp/sh |bsp/ct|L2/ins| .. |L2lock|del/CT|sp/sh |------|------| DOWN |------|  Q   |SHIFT | *
     62  * |------+------|  /   |------|  ,   | space|------|------|------  ..  ------|------|------| L1/sp| LEFT |------|  UP  |------+------| *
     63  * | CTRL | win  |------/      \-------------| L1   | alt  |        ..        | CAPS | L1   |-------------/      \------| :    | CTRL | *
     64  * `-------------/                           \-------------/        ..        \-------------/                           \-------------/ *
     65  */
     66 [_BASE] = LAYOUT(
     67            KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,                                          KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,
     68   KC_ESC,  BP_DQUO, BP_LDAQ, BP_RDAQ, BP_LPRN, BP_RPRN, BP_DIAE,                                        BP_DCIR, BP_AT,   BP_PLUS, BP_MINS, BP_SLSH, BP_ASTR, KC_BSPC,
     69   KC_TAB,  BP_B,    BP_EACU, BP_O,    BP_P,    BP_EGRV, BP_UNDS,                                        BP_EQL,  BP_K,    BP_V,    BP_D,    BP_L,    BP_J,    KC_ENT,
     70   BP_GRV,  BP_A,    BP_U,    BP_E,    BP_I,    BP_F,    BP_SCLN,                                        BP_EXLM, BP_C,    BP_T,    BP_S,    BP_R,    BP_N,    BP_QUOT,
     71   M_SF,    BP_Z,    BP_AGRV, BP_Y,    BP_X,    KC_RBRC, M_SFS,   BP_CBSP, L2INS,        L2LOC, BP_CDEL, M_SFS,   BP_M,    BP_G,    KC_UP,   BP_H,    BP_Q,    M_SF,
     72   KC_LCTL, KC_LGUI, KC_PSLS, BP_DOT,  BP_COMM, KC_SPACE,M_L1E,   KC_LALT,                     KC_CAPS, M_L1E,  KC_SPACE,  KC_LEFT, KC_DOWN, KC_RIGHT,BP_COLN, KC_RCTL,
     73   //left pedals
     74   M_LP, M_RP, KC_TRNS,
     75   //right pedals
     76   M_LP, M_RP, KC_TRNS
     77 ),
     78 
     79  /* Larer 1 for symbols.
     80  *   left foot is middle click
     81   *                      ,------.                                    ..                                    ,------.                      *
     82   *               ,------|      |-------------.                      ..                      ,-------------|      |------.               *
     83   *        ,------|      |------|      |      |------.               ..               ,------|      |      |------|      |------.        *
     84   *        |      |------|  §   |------|------|      |               ..               |      |------|------|  ±   |------|      |        *
     85   * ,------+------|  ¶   |------|  µ   |      |------|               ..               |------|  ≤   |  ≥   |------|  ÷   |------+------. *
     86   * |      |  ¤   |------|  {   |------|------|  ~   |               ..               |  ˇ   |------|------|  ]   |------|  ×   |      | *
     87   * |------+------|  *   |------|  }   |  `   |------|               ..               |------|  #   |  [   |------|  %   |------+------| *
     88   * |      |  \   |------|  (   |------|------|      |               ..               |  ≠   |------|------|  >   |------|  ‰  |      | *
     89   * |------+------|  Ù   |------|  )   |  +   |------|               ..               |------|  Ç   |  <   |------|  &   |------+------| *
     90   * |      |  =   |------| copy |------|------|  :   |               ..               |  ?   |------|------| PGUP |------|  _   |      | *
     91   * |------+------|  cut |------| paste|search|------|-------------. .. .-------------|------|  $   |  =   |------|  |   |------+------| *
     92   * |      | undo |------|  \   |------|------|      |      |      | .. |      |      |      |------|------| PGDN |------|  /   |      | *
     93   * |------+------|      |------|      |      |------|------|------  ..  ------|------|------|      | HOME |------| PGDN |------+------| *
     94   * |      |      |------/      \-------------|      |      |        ..        |      |      |-------------/      \------|      |      | *
     95   * `-------------/                           \-------------/        ..        \-------------/                           \-------------/ *
     96   *
     97   */
     98 [_SYMBOLS] = LAYOUT(
     99            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                                       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    100   KC_TRNS, BP_CURR, BP_PARA, BP_SECT, BP_DGRK, KC_TRNS, BP_TILD,                                       BP_CARN, BP_LEQL, BP_GEQL, BP_PLMN, BP_DIV,  BP_MUL,  KC_TRNS,
    101   KC_TRNS, BP_BSLS, BP_ASTR, BP_LCBR, BP_RCBR, BP_GRV,  KC_TRNS,                                       BP_NEQL, BP_HASH, BP_LBRC, BP_RBRC, BP_PERC, BP_PERM, KC_TRNS,
    102   KC_TRNS, BP_EQL,  BP_UGRV, BP_LPRN, BP_RPRN, BP_PLUS, BP_COLN,                                       BP_QUES, BP_CCED, BP_LABK, BP_RABK, BP_AMPR, BP_UNDS, KC_TRNS,
    103   KC_TRNS, M_UN,    M_CUT,   M_CP,    M_PS,    M_SE,    KC_TRNS, KC_TRNS, KC_TRNS,   KC_TRNS, KC_TRNS, KC_TRNS, BP_DLR,  BP_EQL,  KC_PGUP, BP_PIPE, BP_SLSH, KC_TRNS,
    104   KC_TRNS, KC_TRNS, BP_BSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                     KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END,  KC_TRNS, KC_TRNS,
    105   //left pedals
    106   KC_TRNS, MS_BTN1, KC_TRNS,
    107   //right pedals
    108   KC_TRNS, MS_BTN1, KC_TRNS
    109 ),
    110 
    111  /* MEDIA, mouse and numpad.
    112   * right pedal is left clic
    113   *                      ,------.                                    ..                                    ,------.                      *
    114   *               ,------|PAUSE |-------------.                      ..                      ,-------------| PRINT|------.               *
    115   *        ,------|SCROLL|------|MUTE  |VOLUD |------.               ..               ,------| pre  | next |------| calc |------.        *
    116   *        |QK_BOOT |------| stop |------|------|VOLDU |               ..               | play |------|------| stop |------| num  |        *
    117   * ,------+------|      |------| pre  | next |------|               ..               |------| pre  | next |------|      |------+------. *
    118   * |      |      |------|scrolu|------|------| play |               ..               | play |------|------|  8   |------|  -   |      | *
    119   * |------+------|      |------|      | bt4  |------|               ..               |------| next |  7   |------|  9   |------+------| *
    120   * |      |      |------|scrold|------|------| bt5  |               ..               | pre  |------|------|  5   |------|  +   |      | *
    121   * |------+------|      |------|mclic | rclic|------|               ..               |------| rclic|  4   |------|  6   |------+------| *
    122   * |      |      |------|      |------|------| lclic|               ..               | lclic|------|------|  2   |------|  *   |      | *
    123   * |------+------|      |------|      | mclck|------|-------------. .. .-------------|------| mclic|  1   |------|  3   |------+------| *
    124   * |      |      |------|      |------|------|      |      |      | .. |      |      |      |------|------| num. |------|  /   |      | *
    125   * |------+------|      |------|      |      |------|------|------  ..  ------|------|------|      |  0   |------|  .   |------+------| *
    126   * |      |      |------/      \-------------|      |      |        ..        |      |      |-------------/      \------|  ,   |      | *
    127   * `-------------/                           \-------------/        ..        \-------------/                           \-------------/ *
    128   *
    129   */
    130 [_MEDIA] = LAYOUT(
    131            QK_BOOT, KC_SCRL, KC_PAUS, KC_MUTE, KC_VOLD, KC_VOLU,                                     KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_CALC, KC_NUM,
    132   KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP, KC_MPRV, KC_MNXT, KC_MPLY,                                     KC_MPLY, KC_MPRV, KC_MNXT, KC_MSTP, KC_TRNS, KC_PMNS, KC_TRNS,
    133   KC_TRNS, KC_TRNS, KC_TRNS, MS_WHLU, KC_TRNS, MS_BTN4, MS_BTN5,                                     MS_BTN4, MS_BTN5, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, KC_TRNS,
    134   KC_TRNS, KC_TRNS, KC_TRNS, MS_WHLD, MS_BTN3, MS_BTN2, MS_BTN1,                                     MS_BTN1, MS_BTN2, KC_KP_4, KC_KP_5, KC_KP_6, KC_PAST, KC_TRNS,
    135   KC_TRNS, M_UN,    M_CUT,   M_CP,    M_PS,    MS_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN3, KC_KP_1, KC_KP_2, KC_KP_3, KC_PSLS, KC_TRNS,
    136   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_0, KC_PDOT, BP_DOT,  BP_COMM, KC_TRNS,
    137   //left pedals
    138   MS_BTN3, M_RP,    KC_TRNS,
    139   //right pedals
    140   MS_BTN3, M_RP,    KC_TRNS
    141 ),
    142 
    143 /* TRNS - skeleton for laters
    144  *                      ,------.                                    ..                                    ,------.                      *
    145  *               ,------|      |-------------.                      ..                      ,-------------|      |------.               *
    146  *        ,------|      |------|      |      |------.               ..               ,------|      |      |------|      |------.        *
    147  *        |      |------|      |------|------|      |               ..               |      |------|------|      |------|      |        *
    148  * ,------+------|      |------|      |      |------|               ..               |------|      |      |------|      |------+------. *
    149  * |      |      |------|      |------|------|      |               ..               |      |------|------|      |------|      |      | *
    150  * |------+------|      |------|      |      |------|               ..               |------|      |      |------|      |------+------| *
    151  * |      |      |------|      |------|------|      |               ..               |      |------|------|      |------|      |      | *
    152  * |------+------|      |------|      |      |------|               ..               |------|      |      |------|      |------+------| *
    153  * |      |      |------|      |------|------|      |               ..               |      |------|------|      |------|      |      | *
    154  * |------+------|      |------|      |      |------|-------------. .. .-------------|------|      |      |------|      |------+------| *
    155  * |      |      |------|      |------|------|      |      |      | .. |      |      |      |------|------|      |------|      |      | *
    156  * |------+------|      |------|      |      |------|------|------  ..  ------|------|------|      |      |------|      |------+------| *
    157  * |      |      |------/      \-------------|      |      |        ..        |      |      |-------------/      \------|      |      | *
    158  * `-------------/                           \-------------/        ..        \-------------/                           \-------------/ *
    159  *
    160  */
    161 
    162 [_TRNS] = LAYOUT(
    163            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                                     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    164   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                                     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    165   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                                     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    166   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                                     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    167   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    168   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
    169   //left pedals
    170   MS_BTN3, M_RP,    KC_TRNS,
    171   //right pedals
    172   MS_BTN3, M_RP,    KC_TRNS
    173 ),
    174 
    175 };
    176 
    177 void hold_shift(void) {
    178   shift_count = shift_count + 1;
    179   register_code(KC_LSFT);
    180 }
    181 
    182 void release_shift(void) {
    183   shift_count = shift_count - 1;
    184   if(shift_count <= 0){
    185     unregister_code(KC_LSFT);
    186     shift_count = 0;
    187   }
    188 }
    189 
    190 void press_space(void) {
    191   if(shift_count > 0) unregister_code (KC_LSFT);
    192   tap_code(KC_SPACE);
    193   if(shift_count > 0) register_code (KC_LSFT);
    194 }
    195 
    196 void press_enter(void) {
    197   if(shift_count > 0) unregister_code (KC_LSFT);
    198   tap_code (KC_ENT);
    199   if(shift_count > 0) register_code (KC_LSFT);
    200 }
    201 
    202 void press_underscore(void) {
    203   if(shift_count > 0) unregister_code (KC_LSFT);
    204   tap_code ((unsigned char) BP_UNDS);
    205   if(shift_count > 0) register_code (KC_LSFT);
    206 }
    207 
    208 // Bleah globals need to be initialized.
    209 uint8_t old_layer=_BASE;
    210 
    211 void matrix_scan_user(void) {
    212     uint8_t layer = get_highest_layer(layer_state);
    213 
    214     frenchdev_led_1_off();
    215     frenchdev_led_2_off();
    216     switch (layer) {
    217         case _BASE:
    218             frenchdev_led_2_on();
    219             break;
    220         case _SYMBOLS:
    221             frenchdev_led_1_on();
    222             break;
    223         case _MEDIA:
    224            frenchdev_led_1_on();
    225            frenchdev_led_2_on();
    226         default:
    227             // none
    228             break;
    229     }
    230 }
    231 
    232 
    233 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    234   switch(keycode) {
    235     case M_LP: //left pedal
    236       if (record->event.pressed) {
    237         layer_on(1);
    238         register_code (KC_SCRL);
    239         key_timer_left_pedal = timer_read(); // if the key is being pressed, we start the timer.
    240       } else {
    241         if (timer_elapsed(key_timer_left_pedal) < KEY_DELAY) {
    242            tap_code (MS_BTN2);
    243         }
    244         unregister_code (KC_SCRL);
    245         layer_off(1);
    246       }
    247       break;
    248     case M_RP: //right pedal
    249       if (record->event.pressed) {
    250         layer_on(2);
    251         key_timer_right_pedal = timer_read(); // if the key is being pressed, we start the timer.
    252       } else {
    253         if (timer_elapsed(key_timer_right_pedal) < PEDAL_DELAY) {
    254            tap_code (MS_BTN1);
    255         }
    256         layer_off(2);
    257       }
    258       break;
    259     case M_SF: // shift, using macro to keep track of shift state and avoid inserting nbsp by mistake
    260       if (record->event.pressed) {
    261         hold_shift();
    262       } else {
    263         release_shift();
    264       }
    265       break;
    266     case M_SFS: // shift when held, space when tapped
    267       if (record->event.pressed) {
    268         hold_shift();
    269         key_timer_shift = timer_read(); // if the key is being pressed, we start the timer.
    270       } else {
    271         if (timer_elapsed(key_timer_shift) < KEY_DELAY) {
    272           press_space();
    273         }
    274         release_shift();
    275       }
    276       break;
    277     case M_SFU: // shift when held, _ when tapped
    278       if (record->event.pressed) {
    279         hold_shift();
    280         key_timer_shift = timer_read(); // if the key is being pressed, we start the timer.
    281       } else {
    282         if (timer_elapsed(key_timer_shift) < KEY_DELAY) {
    283           press_space();
    284         }
    285         release_shift();
    286       }
    287       break;
    288     case M_L1E: // L1 when held, space when tapped
    289       if (record->event.pressed) {
    290         layer_on(1);
    291         key_timer_1 = timer_read(); // if the key is being pressed, we start the timer.
    292       } else {
    293         if (timer_elapsed(key_timer_1) < KEY_DELAY) {
    294           press_enter();
    295         }
    296         layer_off(1);
    297       }
    298       break;
    299     case L2INS: //activate layer 2, if released before 100ms trigger INS. basicaly equivalent to LT(2, KC_INS) but without delay for activation of layer 2
    300       if (record->event.pressed) {
    301         layer_on(2);
    302         key_timer_2 = timer_read(); // if the key is being pressed, we start the timer.
    303       } else {
    304         if (timer_elapsed(key_timer_2) < KEY_DELAY) {
    305            tap_code (KC_INS);
    306         }
    307         l2_locked = 0;
    308         layer_off(2);
    309       }
    310       break;
    311     case L2LOC: //lock L2
    312       if (record->event.pressed) {
    313         key_timer_2 = timer_read(); // if the key is being pressed, we start the timer.
    314         layer_on(2);
    315       } else {
    316         if (timer_elapsed(key_timer_2) < KEY_DELAY && l2_locked == 0) {
    317           l2_locked = 1;
    318           layer_on(2);
    319         } else {
    320           l2_locked = 0;
    321           layer_off(2);
    322         }
    323       }
    324       break;
    325     case M_UN: // undo
    326       if (record->event.pressed) {
    327         tap_code16(C(BP_Z));
    328       }
    329       break;
    330     case M_CUT: // cut
    331       if (record->event.pressed) {
    332         tap_code16(C(BP_X));
    333       }
    334       break;
    335     case M_CP: // copy
    336       if (record->event.pressed) {
    337         tap_code16(C(BP_C));
    338       }
    339       break;
    340     case M_PS: // paste
    341       if (record->event.pressed) {
    342         tap_code16(C(BP_V));
    343       }
    344       break;
    345     case M_SE: // search
    346       if (record->event.pressed) {
    347         tap_code16(C(BP_F));
    348       }
    349       break;
    350   }
    351   return true;
    352 }
    353 
    354 bool led_update_user(led_t led_state) {
    355   if (led_state.caps_lock){
    356     frenchdev_led_3_on();
    357   } else {
    358     frenchdev_led_3_off();
    359   }
    360   return false;
    361 }