qmk_firmware

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

keymap.c (8010B)


      1 /* Copyright 2020 marksard
      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 #include "./common/oled_helper.h"
     18 
     19 enum layer_number {
     20   _BASE,
     21   _LOWER,
     22   _RAISE,
     23   _ADJUST,
     24 };
     25 
     26 enum custom_keycodes {
     27   LOWER = SAFE_RANGE,
     28   RAISE,
     29   ADJUST,
     30   KANJI,
     31   RGBRST
     32 };
     33 
     34 // Base layer mod tap
     35 #define KC_Z_SF  LSFT_T(KC_Z)
     36 #define KC_SLSF  RSFT_T(KC_SLSH)
     37 
     38 // Lower layer mod tap
     39 #define KC_11SF  LSFT_T(KC_F11)
     40 #define KC_GRSF  RSFT_T(KC_GRV)
     41 
     42 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     43   [_BASE] = LAYOUT_ortho_4x10(
     44   //,---------------------------------------------------------------------------------------------------.
     45           KC_Q,     KC_W,     KC_E,     KC_R,     KC_T,     KC_Y,     KC_U,     KC_I,     KC_O,     KC_P,
     46   //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
     47           KC_A,     KC_S,     KC_D,     KC_F,     KC_G,     KC_H,     KC_J,     KC_K,     KC_L,   KC_ENT,
     48   //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
     49        KC_Z_SF,     KC_X,     KC_C,     KC_V,     KC_B,     KC_N,     KC_M,  KC_COMM,   KC_DOT,  KC_SLSF,
     50   //`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
     51        KC_LCTL,  KC_LALT,  KC_LGUI,    LOWER,  KC_BSPC,   KC_SPC,    RAISE,  KC_RGUI,   KC_APP,  KC_RCTL
     52   //,---------------------------------------------------------------------------------------------------.
     53   ),
     54 
     55   [_LOWER] = LAYOUT_ortho_4x10(
     56   //,---------------------------------------------------------------------------------------------------.
     57          KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,  KC_MINS,   KC_EQL,  KC_LBRC,  KC_RBRC,  KC_BSLS,
     58   //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
     59          KC_F6,    KC_F7,    KC_F8,    KC_F9,   KC_F10,  XXXXXXX,  XXXXXXX,  XXXXXXX,  KC_SCLN,  KC_QUOT,
     60   //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
     61        KC_11SF,   KC_F12,   KC_ESC,   KC_TAB,    KANJI,   KC_DEL,  XXXXXXX,  XXXXXXX,  KC_INT1,  KC_GRSF,
     62   //`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
     63        _______,  _______,  _______,  _______,   KC_DEL,  _______,  _______,  _______,  _______,  _______
     64   //,---------------------------------------------------------------------------------------------------.
     65   ),
     66 
     67   [_RAISE] = LAYOUT_ortho_4x10(
     68   //,---------------------------------------------------------------------------------------------------.
     69           KC_1,     KC_2,     KC_3,     KC_4,     KC_5,     KC_6,     KC_7,     KC_8,     KC_9,     KC_0,
     70   //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
     71        KC_LSFT,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  KC_LEFT,  KC_DOWN,    KC_UP,  KC_RGHT,  KC_RSFT,
     72   //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
     73        XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  KC_MINS,  KC_INT1,  KC_COMM,   KC_DOT,  KC_SLSF,
     74   //`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
     75        _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______
     76   //,---------------------------------------------------------------------------------------------------.
     77   ),
     78 
     79   [_ADJUST] = LAYOUT_ortho_4x10(
     80   //,---------------------------------------------------------------------------------------------------.
     81        QK_BOOT,   RGBRST,  AG_NORM,  AG_SWAP,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,   KC_INS,  KC_PSCR,
     82   //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
     83        UG_TOGG,  UG_HUEU,  UG_SATU,  UG_VALU,  XXXXXXX,  MS_LEFT,  MS_DOWN,  MS_UP,    MS_RGHT,  KC_NUM,
     84   //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
     85        UG_NEXT,  UG_HUED,  UG_SATD,  UG_VALD,  XXXXXXX,  MS_BTN1,  MS_BTN2,  XXXXXXX,  XXXXXXX,  XXXXXXX,
     86   //`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
     87        _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______,  _______
     88   //,---------------------------------------------------------------------------------------------------.
     89   )
     90 };
     91 
     92 #define L_BASE _BASE
     93 #define L_LOWER (1<<_LOWER)
     94 #define L_RAISE (1<<_RAISE)
     95 #define L_ADJUST (1<<_ADJUST)
     96 #define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
     97 
     98 #ifdef OLED_ENABLE
     99 #include <stdio.h>
    100 #include <string.h>
    101 
    102 typedef struct {
    103   uint8_t state;
    104   char name[8];
    105 }LAYER_DISPLAY_NAME;
    106 
    107 #define LAYER_DISPLAY_MAX 5
    108 const LAYER_DISPLAY_NAME layer_display_name[LAYER_DISPLAY_MAX] = {
    109   {L_BASE, "Base"},
    110   {L_BASE + 1, "Base"},
    111   {L_LOWER, "Lower"},
    112   {L_RAISE, "Raise"},
    113   {L_ADJUST_TRI, "Adjust"}
    114 };
    115 
    116 static inline const char* get_leyer_status(void) {
    117 
    118   for (uint8_t i = 0; i < LAYER_DISPLAY_MAX; ++i) {
    119     if (layer_state == 0 && layer_display_name[i].state == default_layer_state) {
    120 
    121       return layer_display_name[i].name;
    122     } else if (layer_state != 0 && layer_display_name[i].state == layer_state) {
    123 
    124       return layer_display_name[i].name;
    125     }
    126   }
    127 
    128   return "?";
    129 }
    130 
    131 static char layer_status_buf[24] = "Layer state ready.\n";
    132 static inline void update_keymap_status(void) {
    133 
    134   snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "OS:%s Layer:%s\n",
    135     keymap_config.swap_lalt_lgui? "win" : "mac", get_leyer_status());
    136 }
    137 
    138 static inline void render_keymap_status(void) {
    139 
    140   oled_write(layer_status_buf, false);
    141 }
    142 
    143 #define UPDATE_KEYMAP_STATUS() update_keymap_status()
    144 
    145 static inline void render_status(void) {
    146 
    147   UPDATE_LED_STATUS();
    148   RENDER_LED_STATUS();
    149   render_keymap_status();
    150   RENDER_LOCK_STATUS();
    151   RENDER_KEY_STATUS();
    152 }
    153 
    154 oled_rotation_t oled_init_user(oled_rotation_t rotation) {
    155 
    156   if (is_keyboard_master())
    157     return OLED_ROTATION_180;  // flips the display 180 degrees if offhand
    158   return rotation;
    159 }
    160 
    161 bool oled_task_user(void) {
    162 
    163   if (is_keyboard_master()) {
    164     render_status();
    165   } else {
    166     render_logo();
    167   }
    168     return false;
    169 }
    170 
    171 #else
    172 
    173 #define UPDATE_KEYMAP_STATUS()
    174 
    175 #endif
    176 
    177 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    178 
    179   UPDATE_KEY_STATUS(keycode, record);
    180 
    181   bool result = false;
    182   switch (keycode) {
    183     case LOWER:
    184       if (record->event.pressed) {
    185         layer_on(_LOWER);
    186       } else {
    187         layer_off(_LOWER);
    188       }
    189 
    190       update_tri_layer(_LOWER, _RAISE, _ADJUST);
    191       break;
    192     case RAISE:
    193       if (record->event.pressed) {
    194         layer_on(_RAISE);
    195       } else {
    196         layer_off(_RAISE);
    197       }
    198 
    199       update_tri_layer(_LOWER, _RAISE, _ADJUST);
    200       break;
    201     case KANJI:
    202       if (record->event.pressed) {
    203         if (keymap_config.swap_lalt_lgui == false) {
    204           register_code(KC_LNG2);
    205         } else {
    206           register_code16(A(KC_GRV));
    207         }
    208       } else {
    209         unregister_code(KC_LNG2);
    210       }
    211       break;
    212     #ifdef RGBLIGHT_ENABLE
    213       case RGBRST:
    214           if (record->event.pressed) {
    215             eeconfig_update_rgblight_default();
    216             rgblight_enable();
    217           }
    218         break;
    219     #endif
    220     default:
    221       result = true;
    222       break;
    223   }
    224 
    225   UPDATE_KEYMAP_STATUS();
    226   return result;
    227 }