qmk_firmware

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

keymap.c (6212B)


      1 /* Copyright 2022 schwarzer-geiger
      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 #include QMK_KEYBOARD_H
     17 
     18 enum layer_names {
     19     _BASE,
     20     _LOWER,
     21     _RAISE,
     22     _ADJUST
     23 };
     24 
     25 #define LOWER  MO(_LOWER)
     26 #define RAISE  MO(_RAISE)
     27 #define ADJUST MO(_ADJUST)
     28 
     29 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     30   [_BASE] = LAYOUT(
     31     KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,      KC_T,               KC_Y,     KC_U,     KC_I,     KC_O,     KC_P,     KC_BSPC,
     32     KC_LCTL,  KC_A,     KC_S,     KC_D,     KC_F,      KC_G,               KC_H,     KC_J,     KC_K,     KC_L,     KC_SCLN,  KC_QUOT,
     33     KC_LSFT,  KC_Z,     KC_X,     KC_C,     KC_V,      KC_B,               KC_N,     KC_M,     KC_COMM,  KC_DOT,   KC_SLSH,  RSFT_T(KC_ENT),
     34                                             KC_LALT,   LOWER,    KC_SPC,   RAISE,    KC_RGUI
     35   ),
     36 
     37   [_LOWER] = LAYOUT(
     38     _______,  KC_EXLM,  KC_AT,    KC_HASH,  KC_DLR,    KC_PERC,            KC_CIRC,  KC_AMPR,  KC_ASTR,  KC_LPRN,  KC_RPRN,  KC_DEL,
     39     _______,  KC_UNDS,  KC_PLUS,  KC_LCBR,  KC_RCBR,   KC_PIPE,            KC_LEFT,  KC_DOWN,  KC_UP,    KC_RGHT,  KC_GRV,   KC_TILD,
     40     _______,  KC_ESC,   KC_LGUI,  KC_LALT,  KC_CAPS,   KC_DQUO,            KC_HOME,  KC_END,   KC_PGUP,  KC_PGDN,  KC_PSCR,  RSFT_T(KC_SPC),
     41                                             _______,   _______,  KC_ENT,   _______,  _______
     42   ),
     43 
     44   [_RAISE] = LAYOUT(
     45     _______,  KC_1,     KC_2,     KC_3,     KC_4,      KC_5,               KC_6,     KC_7,     KC_8,     KC_9,     KC_0,     KC_DEL,
     46     _______,  KC_MINS,  KC_EQL,   KC_LBRC,  KC_RBRC,   KC_BSLS,            KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,
     47     _______,  KC_ESC,   KC_RGUI,  KC_RALT,  KC_CAPS,   KC_QUOT,            KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,
     48                                             _______,   _______,  KC_BSPC,  _______,  _______
     49   ),
     50 
     51   [_ADJUST] = LAYOUT(
     52     UG_VALU,   UG_SATU, UG_HUEU,  UG_NEXT,  XXXXXXX,   UG_TOGG,            XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
     53     UG_VALD,   UG_SATD, UG_HUED,  UG_PREV,  XXXXXXX,   XXXXXXX,            XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
     54     XXXXXXX,   XXXXXXX, XXXXXXX,  XXXXXXX,  XXXXXXX,   XXXXXXX,            QK_BOOT,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,
     55                                             _______,   _______,  XXXXXXX,  _______,  _______
     56   ),
     57 };
     58 
     59 
     60 // Thumbstick keymap, change KC_XXX to whatever you need
     61 
     62 #define THUMBSTICK_RIGHT_TAP KC_RIGHT
     63 #define THUMBSTICK_LEFT_TAP KC_LEFT
     64 #define THUMBSTICK_UP_TAP KC_UP
     65 #define THUMBSTICK_DOWN_TAP KC_DOWN
     66 
     67 // Thumbstick code, no customisation needed
     68 
     69 bool cursor_mode = false;
     70 bool scrolling_mode = false;
     71 bool tapping_mode = false;
     72 
     73 // tracks if thumbstick was released
     74 bool returned_to_zero = true;
     75 
     76 // tracks how many times mouse_report.x/y have been read zero in succession
     77 uint16_t zero_reads = 0;
     78 
     79 // set mode depending on layer
     80 layer_state_t layer_state_set_user(layer_state_t state) {
     81     state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
     82     switch (get_highest_layer(state)) {
     83         case SCROLLING_LAYER:
     84             if (scrolling_mode == false) {
     85             scrolling_mode = true;
     86             }
     87             if (tapping_mode) {
     88                 tapping_mode = false;
     89             }
     90             if (cursor_mode) {
     91                 cursor_mode = false;
     92             }
     93             break;
     94         case TAPPING_LAYER:
     95             if (tapping_mode == false) {
     96                 tapping_mode = true;
     97             }
     98             if (cursor_mode) {
     99                 cursor_mode = false;
    100             }
    101             if (scrolling_mode) {
    102                 scrolling_mode = false;
    103             }
    104             break;
    105         default:
    106             if (scrolling_mode) {
    107                 scrolling_mode = false;
    108             }
    109             if (tapping_mode) {
    110                 tapping_mode = false;
    111             }
    112             if (cursor_mode == false) {
    113                 cursor_mode = true;
    114             }
    115             break;
    116     }
    117     return state;
    118 }
    119 
    120 // manipulate mouse report based on current mode
    121 report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
    122 
    123     if (cursor_mode) {
    124         mouse_report.x = CURSOR_SPEED * mouse_report.x/100;
    125         mouse_report.y = CURSOR_SPEED * mouse_report.y/100;
    126     }
    127     if (scrolling_mode) {
    128         mouse_report.h = SCROLL_SPEED * mouse_report.x/100;
    129         mouse_report.v = SCROLL_SPEED * mouse_report.y/100;
    130         mouse_report.x = 0;
    131         mouse_report.y = 0;
    132         if ((mouse_report.h != 0) | (mouse_report.v != 0)) {
    133             _delay_ms(SCROLL_DELAY_MS);
    134         }
    135 
    136     } else if (tapping_mode) {
    137         if ((mouse_report.x || mouse_report.y) != 0) {
    138             if (returned_to_zero) {
    139                 if (mouse_report.x > 0) {
    140                     tap_code16(THUMBSTICK_RIGHT_TAP);
    141                 }
    142                 if (mouse_report.x < 0) {
    143                     tap_code16(THUMBSTICK_LEFT_TAP);
    144                 }
    145                 if (mouse_report.y > 0) {
    146                     tap_code16(THUMBSTICK_DOWN_TAP);
    147                 }
    148                 if (mouse_report.y < 0) {
    149                     tap_code16(THUMBSTICK_UP_TAP);
    150                 }
    151                 returned_to_zero = false;
    152             }
    153             zero_reads = 0;
    154         } else if (zero_reads < 20) {
    155             zero_reads++;
    156         }
    157         if (zero_reads >= 20) {
    158             if (returned_to_zero == false) {
    159                 returned_to_zero = true;
    160             }
    161         }
    162         mouse_report.x = 0;
    163         mouse_report.y = 0;
    164     }
    165 
    166     return mouse_report;
    167 }