qmk_firmware

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

keymap.c (31947B)


      1  /* Copyright 2021 HellSingCoder
      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 
     19 #ifdef JOYSTICK_ENABLE
     20 #   include "analog.h"
     21 #endif
     22 
     23 enum lime_layers {
     24     /* _M_XYZ = Mac Os, _W_XYZ = Win/Linux */
     25     _QWERTY,
     26     _COLEMAK,
     27     _LOWER,
     28     _RAISE,
     29     _ADJUST,
     30 };
     31 
     32 enum custom_keycodes {
     33     KC_LOWER = SAFE_RANGE,
     34     KC_RAISE,
     35     KC_ADJUST,
     36     KC_PRVWD,
     37     KC_NXTWD,
     38     KC_LSTRT,
     39     KC_LEND,
     40     KC_DLINE,
     41     KC_BSPC_DEL,
     42     KC_THUMB_SWAP,
     43     KC_THUMB_LEFT,
     44     KC_THUMB_RIGHT,
     45     KC_JOYSTICK_DEBUG,
     46 };
     47 
     48 #define KC_QWERTY PDF(_QWERTY)
     49 #define KC_COLEMAK PDF(_COLEMAK)
     50 
     51 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     52 /*
     53  * QWERTY
     54  * ,-----------------------------------------.                    ,-----------------------------------------.
     55  * | Esc  |   1  |   2  |   3  |   4  |   5  |                    |   6  |   7  |   8  |   9  |   0  |  BS  |
     56  * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
     57  * | Tab  |   Q  |   W  |   E  |   R  |   T  |                    |   Y  |   U  |   I  |   O  |   P  |  `   |
     58  * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
     59  * | Caps |   A  |   S  |   D  |   F  |   G  |-------.    ,-------|   H  |   J  |   K  |   L  |   ;  |  '   |
     60  * |------+------+------+------+------+------|       |    |  Mute |------+------+------+------+------+------|
     61  * |LShift|   Z  |   X  |   C  |   V  |   B  |-------|    |-------|   N  |   M  |   ,  |   .  |   /  |  \   |
     62  * `-----------------------------------------/       /     \      \-----------------------------------------'
     63  *     |Lower | LGUI | LAlt | DEL  | LCTR | /Enter  /       \Space \  |Raise |  [   |  ]   |  -   |  =   |
     64  *     |      |      |      |      |      |/       /         \      \ |      |      |      |      |      |
     65  *      `----------------------------------------'            '------''----------------------------------'
     66  */
     67 
     68 [_QWERTY] = LAYOUT(
     69   KC_ESC,   KC_1,   KC_2,    KC_3,    KC_4,    KC_5,                            KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_BSPC_DEL,
     70   KC_TAB,   KC_Q,   KC_W,    KC_E,    KC_R,    KC_T,                            KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,     KC_GRV,
     71   KC_CAPS,  KC_A,   KC_S,    KC_D,    KC_F,    KC_G,                            KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN,  KC_QUOT,
     72   KC_LSFT,  KC_Z,   KC_X,    KC_C,    KC_V,    KC_B,  XXXXXXX,        KC_MUTE,  KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,  KC_BSLS,
     73         KC_LOWER, KC_LGUI,KC_LALT,KC_DEL, KC_LCTL,  KC_THUMB_LEFT,       KC_THUMB_RIGHT,  KC_RAISE, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL
     74 ),
     75 
     76 /*
     77  * COLEMAK
     78  * ,-----------------------------------------.                    ,-----------------------------------------.
     79  * | Esc  |   1  |   2  |   3  |   4  |   5  |                    |   6  |   7  |   8  |   9  |   0  |  BS  |
     80  * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
     81  * | Tab  |   Q  |   W  |   F  |   P  |   G  |                    |   J  |   L  |   U  |   Y  |   ;  |  `   |
     82  * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
     83  * | Caps |   A  |   R  |   S  |   T  |   D  |-------.    ,-------|   H  |   N  |   E  |   I  |   O  |  '   |
     84  * |------+------+------+------+------+------|       |    |  Mute |------+------+------+------+------+------|
     85  * |LShift|   Z  |   X  |   C  |   V  |   B  |-------|    |-------|   K  |   M  |   ,  |   .  |   /  |  \   |
     86  * `-----------------------------------------/       /     \      \-----------------------------------------'
     87  *     |Lower | LGUI | LAlt | DEL  | LCTR | /Enter  /       \Space \  |Raise |  [   |  ]   |  -   |  =   |
     88  *     |      |      |      |      |      |/       /         \      \ |      |      |      |      |      |
     89  *      `----------------------------------------'            '------''----------------------------------'
     90  */
     91 
     92 [_COLEMAK] = LAYOUT(
     93   KC_ESC,   KC_1,   KC_2,    KC_3,    KC_4,    KC_5,                            KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_BSPC_DEL,
     94   KC_TAB,   KC_Q,   KC_W,    KC_F,    KC_P,    KC_G,                            KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN,  KC_GRV,
     95   KC_CAPS,  KC_A,   KC_R,    KC_S,    KC_T,    KC_D,                            KC_H,    KC_N,    KC_E,    KC_I,    KC_O,     KC_QUOT,
     96   KC_LSFT,  KC_Z,   KC_X,    KC_C,    KC_V,    KC_B,  XXXXXXX,        KC_MUTE,  KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,  KC_BSLS,
     97         KC_LOWER, KC_LGUI,KC_LALT,KC_DEL, KC_LCTL,  KC_THUMB_LEFT,       KC_THUMB_RIGHT,  KC_RAISE, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL
     98 ),
     99 
    100 /* RAISE
    101  * ,-----------------------------------------.                    ,-----------------------------------------.
    102  * | Esc  |      |      |      |      |      |                    |      |      |      |      |      |      |
    103  * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
    104  * | Tab  | Ins  | Pscr | Menu |      |      |                    |      | PWrd |  Up  | NWrd |      |      |
    105  * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
    106  * | Caps | LAt  | LCtl |LShift|      |      |-------.    ,-------|      | Left | Down | Rigth|      |      |
    107  * |------+------+------+------+------+------|       |    |  Mute |------+------+------+------+------+------|
    108  * |LShift|      |      |      |      |      |-------|    |-------|      | LStr | DLine| LEnd |      |      |
    109  * `-----------------------------------------/       /     \      \-----------------------------------------'
    110  *     |Lower | LGUI | LAlt | DEL  | LCTR | /Enter  /       \Space \  |Raise |      |      |      |      |
    111  *     |      |      |      |      |      |/       /         \      \ |      |      |      |      |      |
    112  *      `----------------------------------------'            '------''----------------------------------'
    113  */
    114 [_RAISE] = LAYOUT(
    115   _______, _______ , _______ , _______ , _______ , _______,                        _______,  _______ ,  _______ ,  _______ ,  _______ , _______,
    116   _______, KC_INS,   KC_PSCR,  KC_APP,   XXXXXXX,  XXXXXXX,                        KC_PGUP,  KC_PRVWD,  KC_UP,     KC_NXTWD,  XXXXXXX, XXXXXXX,
    117   _______, KC_LALT,  KC_LCTL,  KC_LSFT,  XXXXXXX,  XXXXXXX,                        KC_PGDN,  KC_LEFT,   KC_DOWN,   KC_RGHT,   XXXXXXX,   XXXXXXX,
    118   _______, XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  _______,    _______,  XXXXXXX,  KC_LSTRT,  KC_DLINE,   KC_LEND,   XXXXXXX,  XXXXXXX,
    119          _______, _______, _______, _______, _______, _______,                  _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
    120 ),
    121 
    122 /* LOWER
    123  * ,-----------------------------------------.                    ,-----------------------------------------.
    124  * | Esc  |  F1  |  F2  |  F3  |  F4  |  F5  |                    |  F6  |  F7  |  F8  |  F9  | F10  | F11  |
    125  * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
    126  * | Tab  |   1  |   2  |   3  |   4  |   5  |                    |   6  |   7  |   8  |   9  |   0  | F12  |
    127  * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
    128  * | Caps |   !  |   @  |   #  |   $  |   %  |-------.    ,-------|   ^  |   &  |   *  |   (  |   )  |   |  |
    129  * |------+------+------+------+------+------|       |    |  Mute |------+------+------+------+------+------|
    130  * |LShift|  =   |  -   |  +   |   {  |   }  |-------|    |-------|   [  |   ]  |   ;  |   :  |   \  |  `   |
    131  * `-----------------------------------------/       /     \      \-----------------------------------------'
    132  *     |Lower | LGUI | LAlt | DEL  | LCTR | /Enter  /       \Space \  |Raise |      |      |      |      |
    133  *     |      |      |      |      |      |/       /         \      \ |      |      |      |      |      |
    134  *      `----------------------------------------'            '------''----------------------------------'
    135  */
    136 [_LOWER] = LAYOUT(
    137   _______,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,                           KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,
    138   _______,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                            KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_F12,
    139   _______,  KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC,                         KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE,
    140   _______,  KC_EQL,  KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______,       _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, KC_BSLS, KC_GRV,
    141          _______, _______, _______, _______, _______, _______,              _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
    142 ),
    143 
    144 /* ADJUST
    145  * ,-----------------------------------------.                    ,-----------------------------------------.
    146  * | QK_BOOT|      |      |      |      |      |                    |      |      |      |      |      |      |
    147  * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
    148  * |      |QWERTY|      |      |      |      |                    |      |      |      |      |      |      |
    149  * |------+------+------+------+------+------|                    |------+------+------+------+------+------|
    150  * |      |      |      |JDEBUG|      |      |-------.    ,-------|      | VOLDO| MUTE | VOLUP|      |      |
    151  * |------+------+------+------+------+------|       |    |  Mute |------+------+------+------+------+------|
    152  * |      |      |      |COLEMA|      |      |-------|    |-------|      | PREV | PLAY | NEXT |      |      |
    153  * `-----------------------------------------/       /     \      \-----------------------------------------'
    154  *     |Lower |MACWIN|      |      |      | / Swap  /       \      \  |Raise |      |      |      |      |
    155  *     |      |      |      |      |      |/       /         \      \ |      |      |      |      |      |
    156  *      `----------------------------------------'            '------''----------------------------------'
    157  */
    158   [_ADJUST] = LAYOUT(
    159   QK_BOOT, XXXXXXX,    XXXXXXX,   XXXXXXX,          XXXXXXX, XXXXXXX,                       XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    160   XXXXXXX, KC_QWERTY,  XXXXXXX,   XXXXXXX,          CG_TOGG, XXXXXXX,                       XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    161   XXXXXXX, XXXXXXX,    XXXXXXX,   KC_JOYSTICK_DEBUG,XXXXXXX, XXXXXXX,                       XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX,
    162   XXXXXXX, XXXXXXX,    XXXXXXX,   KC_COLEMAK,       XXXXXXX, XXXXXXX, XXXXXXX,     _______, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
    163          _______, CG_TOGG, XXXXXXX, XXXXXXX,    XXXXXXX, KC_THUMB_SWAP,                  XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
    164   )
    165 };
    166 
    167 #ifdef JOYSTICK_ENABLE
    168     /* Joystick pins */
    169 #   ifndef JOYSTICK_X_PIN
    170 #       define JOYSTICK_X_PIN F5
    171 #       define JOYSTICK_Y_PIN F4
    172 #   endif
    173 
    174     /* Joystick + Encoder fix */
    175     void keyboard_post_init_user(void) {
    176         if (is_keyboard_master()) {
    177             gpio_write_pin_low(JOYSTICK_X_PIN);
    178             gpio_write_pin_low(JOYSTICK_Y_PIN);
    179         }
    180     }
    181 
    182     /* Joystick axes settings */
    183     joystick_config_t joystick_axes[JOYSTICK_AXIS_COUNT] = {
    184         [0] = JOYSTICK_AXIS_IN(JOYSTICK_X_PIN, 268, 514, 813),
    185         [1] = JOYSTICK_AXIS_IN(JOYSTICK_Y_PIN, 865, 519, 260)
    186     };
    187 #endif
    188 
    189 /* Joystick Debug */
    190 bool joystick_debug = false;
    191 
    192 /* Space Enter swap */
    193 bool swap_space_enter = false;
    194 
    195 /* Smart Backspace Delete */
    196 bool shift_held = false;
    197 static uint16_t held_shift = 0;
    198 
    199 /* keyboard pet jump status variables */
    200 bool isJumping = false;
    201 bool showedJump = true;
    202 
    203 #ifdef OLED_ENABLE
    204     /* Keyboard logo (from gdlcfont.c) */
    205     static void render_logo(void) {
    206         static const char PROGMEM lime_logo[] = {
    207             0x80, 0x81, 0x82, 0x83, 0x84,
    208             0xA0, 0xA1, 0xA2, 0xA3, 0xA4,
    209             0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0
    210         };
    211 
    212         oled_write_P(lime_logo, false);
    213     }
    214 
    215     /* Keyboard Pet settings */
    216     #define MIN_WALK_SPEED 10
    217     #define MIN_RUN_SPEED 50
    218     #define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
    219     #define ANIM_SIZE 96 // number of bytes per image
    220 
    221     /* Keyboard Pet status variables */
    222     led_t led_usb_state;
    223     uint8_t current_wpm = 0;
    224     uint8_t current_frame = 0;
    225     uint32_t anim_timer = 0;
    226     uint32_t anim_sleep = 0;
    227 
    228     /* Keyboard Pet logic */
    229     static void render_keyboard_pet(int KEYBOARD_PET_X, int KEYBOARD_PET_Y) {
    230 
    231         /* Sit */
    232         static const char PROGMEM sit[2][ANIM_SIZE] = {
    233             {
    234                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c,
    235                 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    236                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x68, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00,
    237                 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    238                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28,
    239                 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    240             },
    241             {
    242                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c,
    243                 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    244                 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x90, 0x08, 0x18, 0x60, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00,
    245                 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    246                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28,
    247                 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    248             }
    249         };
    250 
    251         /* Walk */
    252         static const char PROGMEM walk[2][ANIM_SIZE] = {
    253             {
    254                 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x90, 0x90, 0x90, 0xa0, 0xc0, 0x80, 0x80,
    255                 0x80, 0x70, 0x08, 0x14, 0x08, 0x90, 0x10, 0x10, 0x08, 0xa4, 0x78, 0x80, 0x00, 0x00, 0x00, 0x00,
    256                 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
    257                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0xea, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00,
    258                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x03,
    259                 0x06, 0x18, 0x20, 0x20, 0x3c, 0x0c, 0x12, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    260             },
    261             {
    262                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00,
    263                 0x00, 0xe0, 0x10, 0x28, 0x10, 0x20, 0x20, 0x20, 0x10, 0x48, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
    264                 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0xf8, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
    265                 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x30, 0xd5, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00,
    266                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e,
    267                 0x02, 0x1c, 0x14, 0x08, 0x10, 0x20, 0x2c, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    268             }
    269         };
    270 
    271         /* Run */
    272         static const char PROGMEM run[2][ANIM_SIZE] = {
    273             {
    274                 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x08, 0xc8, 0xb0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
    275                 0x80, 0x40, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00,
    276                 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc4, 0xa4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
    277                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x58, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00,
    278                 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x09, 0x04, 0x04, 0x04, 0x04, 0x02, 0x03, 0x02, 0x01, 0x01,
    279                 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00
    280             },
    281             {
    282                 0x00, 0x00, 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    283                 0x80, 0x80, 0x78, 0x28, 0x08, 0x10, 0x20, 0x30, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00,
    284                 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
    285                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xb0, 0x50, 0x55, 0x20, 0x1f, 0x00, 0x00,
    286                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37,
    287                 0x02, 0x1e, 0x20, 0x20, 0x18, 0x0c, 0x14, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    288             }
    289         };
    290 
    291         /* Bark */
    292         static const char PROGMEM bark[2][ANIM_SIZE] = {
    293             {
    294                 0x00, 0xc0, 0x20, 0x10, 0xd0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40,
    295                 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
    296                 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
    297                 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
    298                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02,
    299                 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    300             },
    301             {
    302                 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40,
    303                 0x40, 0x2c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00,
    304                 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
    305                 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x20, 0x4a, 0x09, 0x10,
    306                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02,
    307                 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    308             }
    309         };
    310 
    311         /* animation */
    312         void animate_keyboard_pet(void) {
    313 
    314             /* jump */
    315             if (isJumping || !showedJump) {
    316                 oled_set_cursor(KEYBOARD_PET_X,KEYBOARD_PET_Y +2);
    317                 oled_write_P(PSTR("     "), false);
    318                 oled_set_cursor(KEYBOARD_PET_X,KEYBOARD_PET_Y -1);
    319                 showedJump = true;
    320             } else {
    321                 oled_set_cursor(KEYBOARD_PET_X,KEYBOARD_PET_Y -1);
    322                 oled_write_P(PSTR("     "), false);
    323                 oled_set_cursor(KEYBOARD_PET_X,KEYBOARD_PET_Y);
    324             }
    325 
    326             /* switch frame */
    327             current_frame = (current_frame + 1) % 2;
    328 
    329             /* current animation status */
    330             if(led_usb_state.caps_lock) {
    331                 oled_write_raw_P(bark[abs(1 - current_frame)], ANIM_SIZE);
    332             } else if(current_wpm <= MIN_WALK_SPEED) {
    333                 oled_write_raw_P(sit[abs(1 - current_frame)], ANIM_SIZE);
    334             } else if(current_wpm <= MIN_RUN_SPEED) {
    335                 oled_write_raw_P(walk[abs(1 - current_frame)], ANIM_SIZE);
    336             } else {
    337                 oled_write_raw_P(run[abs(1 - current_frame)], ANIM_SIZE);
    338             }
    339         }
    340 
    341         /* animation timer */
    342         if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
    343             anim_timer = timer_read32();
    344             if(timer_elapsed32(anim_sleep) < OLED_TIMEOUT) {
    345                 animate_keyboard_pet();
    346             }
    347         }
    348 
    349         if (current_wpm > 0) {
    350             anim_sleep = timer_read32();
    351         } else if(timer_elapsed32(anim_sleep) > OLED_TIMEOUT) {
    352             oled_off();
    353         }
    354 
    355     }
    356 
    357     static void print_logo_narrow(void) {
    358 
    359         /* Keyboard logo */
    360         render_logo();
    361 
    362         /* wpm counter */
    363         char wpm_str[5];
    364         wpm_str[4] = '\0';
    365         wpm_str[3] = '0' + current_wpm % 10;
    366         wpm_str[2] = '0' + ( current_wpm /= 10) % 10;
    367         wpm_str[1] = '0' + current_wpm / 10;
    368         wpm_str[0] = ' ';
    369         oled_set_cursor(0,14);
    370         oled_write(wpm_str, false);
    371         oled_write_P(PSTR("  wpm"), false);
    372     }
    373 
    374     static void print_status_narrow(void) {
    375 
    376         /* Print current OS */
    377         oled_set_cursor(2,0);
    378         if (keymap_config.swap_lctl_lgui) {
    379             oled_write_P(PSTR("\x9E"), false);
    380         } else {
    381             oled_write_P(PSTR("\x9F"), false);
    382         }
    383 
    384         /* Print current layout */
    385         oled_set_cursor(0,2);
    386         switch (get_highest_layer(default_layer_state)) {
    387             case _QWERTY:
    388                 oled_write_P(PSTR("QWRTY"), false);
    389                 break;
    390             case _COLEMAK:
    391                 oled_write_P(PSTR("COLMK"), false);
    392                 break;
    393             default:
    394                 oled_write_P(PSTR("UNDEF"), false);
    395         }
    396 
    397         /* Print current layer */
    398         oled_set_cursor(0,4);
    399         oled_write_P(PSTR("LAYER"), false);
    400         oled_set_cursor(0,5);
    401         switch (get_highest_layer(layer_state)) {
    402             case _QWERTY:
    403                 oled_write_P(PSTR("Base "), false);
    404                 break;
    405             case _RAISE:
    406                 oled_write_P(PSTR("Raise"), false);
    407                 break;
    408             case _LOWER:
    409                 oled_write_P(PSTR("Lower"), false);
    410                 break;
    411             case _ADJUST:
    412                 oled_write_P(PSTR("Adj  "), false);
    413                 break;
    414             default:
    415                 oled_write_P(PSTR("Undef"), false);
    416         }
    417 
    418         /* caps lock */
    419         oled_set_cursor(0,7);
    420         oled_write_P(PSTR("CAPS"), false);
    421         if (led_usb_state.caps_lock) {
    422             oled_write_P(PSTR("\x9A"), false);
    423         } else {
    424             oled_write_P(PSTR("\x99"), false);
    425         }
    426 
    427         /* Space Enter swap */
    428         oled_set_cursor(0,9);
    429         oled_write_P(PSTR("\x9B"), false);
    430         oled_set_cursor(2,9);
    431         oled_write_P(PSTR("\x9C"), !swap_space_enter);
    432         oled_set_cursor(4,9);
    433         oled_write_P(PSTR("\x9D"), swap_space_enter);
    434 
    435        /* Joystick debugging */
    436 #      ifdef JOYSTICK_ENABLE
    437             if (joystick_debug) {
    438                 oled_set_cursor(0,10);
    439                 oled_write_P(PSTR("X:"), false);
    440                 uint16_t val = analogReadPin(JOYSTICK_X_PIN);
    441                 char val_str[3];
    442                 itoa(val, val_str, 10);
    443                 oled_write(val_str, false);
    444                 oled_set_cursor(0,11);
    445                 oled_write_P(PSTR("Y:"), false);
    446                 val = analogReadPin(JOYSTICK_Y_PIN);
    447                 itoa(val, val_str, 10);
    448                 oled_write(val_str, false);
    449             } else {
    450                 oled_set_cursor(0,10);
    451                 oled_write_P(PSTR("     "), false);
    452                 oled_set_cursor(0,11);
    453                 oled_write_P(PSTR("     "), false);
    454             }
    455 #       endif
    456 
    457         /* Keyboard Pet Render */
    458         render_keyboard_pet(0,13);
    459     }
    460 
    461     /* vertical screens orientation fix */
    462     oled_rotation_t oled_init_user(oled_rotation_t rotation) {
    463         return OLED_ROTATION_270;
    464     }
    465 
    466     bool oled_task_user(void) {
    467 
    468         /* Keyboard Pet Variables */
    469         current_wpm = get_current_wpm();
    470         led_usb_state = host_keyboard_led_state();
    471 
    472         if (is_keyboard_master()) {
    473             print_status_narrow();
    474         } else {
    475             print_logo_narrow();
    476         }
    477         return false;
    478     }
    479 
    480 #endif
    481 
    482 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    483     switch (keycode) {
    484         case KC_LOWER:
    485             if (record->event.pressed) {
    486                 layer_on(_LOWER);
    487                 update_tri_layer(_LOWER, _RAISE, _ADJUST);
    488             } else {
    489                 layer_off(_LOWER);
    490                 update_tri_layer(_LOWER, _RAISE, _ADJUST);
    491             }
    492             return false;
    493         case KC_RAISE:
    494             if (record->event.pressed) {
    495                 layer_on(_RAISE);
    496                 update_tri_layer(_LOWER, _RAISE, _ADJUST);
    497             } else {
    498                 layer_off(_RAISE);
    499                 update_tri_layer(_LOWER, _RAISE, _ADJUST);
    500             }
    501             return false;
    502         case KC_ADJUST:
    503             if (record->event.pressed) {
    504                 layer_on(_ADJUST);
    505             } else {
    506                 layer_off(_ADJUST);
    507             }
    508             return false;
    509         case KC_PRVWD:
    510             if (record->event.pressed) {
    511                 if (keymap_config.swap_lctl_lgui) {
    512                     register_mods(mod_config(MOD_LALT));
    513                     register_code(KC_LEFT);
    514                 } else {
    515                     register_mods(mod_config(MOD_LCTL));
    516                     register_code(KC_LEFT);
    517                 }
    518             } else {
    519                 if (keymap_config.swap_lctl_lgui) {
    520                     unregister_mods(mod_config(MOD_LALT));
    521                     unregister_code(KC_LEFT);
    522                 } else {
    523                     unregister_mods(mod_config(MOD_LCTL));
    524                     unregister_code(KC_LEFT);
    525                 }
    526             }
    527             break;
    528         case KC_NXTWD:
    529              if (record->event.pressed) {
    530                 if (keymap_config.swap_lctl_lgui) {
    531                     register_mods(mod_config(MOD_LALT));
    532                     register_code(KC_RIGHT);
    533                 } else {
    534                     register_mods(mod_config(MOD_LCTL));
    535                     register_code(KC_RIGHT);
    536                 }
    537             } else {
    538                 if (keymap_config.swap_lctl_lgui) {
    539                     unregister_mods(mod_config(MOD_LALT));
    540                     unregister_code(KC_RIGHT);
    541                 } else {
    542                     unregister_mods(mod_config(MOD_LCTL));
    543                     unregister_code(KC_RIGHT);
    544                 }
    545             }
    546             break;
    547         case KC_LSTRT:
    548             if (record->event.pressed) {
    549                 if (keymap_config.swap_lctl_lgui) {
    550                      /* CMD-arrow on Mac, but we have CTL and GUI swapped */
    551                     register_mods(mod_config(MOD_LCTL));
    552                     register_code(KC_LEFT);
    553                 } else {
    554                     register_code(KC_HOME);
    555                 }
    556             } else {
    557                 if (keymap_config.swap_lctl_lgui) {
    558                     unregister_mods(mod_config(MOD_LCTL));
    559                     unregister_code(KC_LEFT);
    560                 } else {
    561                     unregister_code(KC_HOME);
    562                 }
    563             }
    564             break;
    565         case KC_LEND:
    566             if (record->event.pressed) {
    567                 if (keymap_config.swap_lctl_lgui) {
    568                     /* CMD-arrow on Mac, but we have CTL and GUI swapped */
    569                     register_mods(mod_config(MOD_LCTL));
    570                     register_code(KC_RIGHT);
    571                 } else {
    572                     register_code(KC_END);
    573                 }
    574             } else {
    575                 if (keymap_config.swap_lctl_lgui) {
    576                     unregister_mods(mod_config(MOD_LCTL));
    577                     unregister_code(KC_RIGHT);
    578                 } else {
    579                     unregister_code(KC_END);
    580                 }
    581             }
    582             break;
    583         case KC_DLINE:
    584             if (record->event.pressed) {
    585                 register_mods(mod_config(MOD_LCTL));
    586                 register_code(KC_BSPC);
    587             } else {
    588                 unregister_mods(mod_config(MOD_LCTL));
    589                 unregister_code(KC_BSPC);
    590             }
    591             break;
    592 
    593         case KC_JOYSTICK_DEBUG:
    594             if (record->event.pressed) {
    595                 joystick_debug = !joystick_debug;
    596             }
    597             return false;
    598             break;
    599 
    600         /* Space Enter swap */
    601         case KC_THUMB_SWAP:
    602             if (record->event.pressed) {
    603                 swap_space_enter = !swap_space_enter;
    604             }
    605             return false;
    606             break;
    607         case KC_THUMB_LEFT:
    608             if (record->event.pressed) {
    609                 if (swap_space_enter) {
    610                     register_code(KC_SPC);
    611 
    612                     /*Keyboard Pet jump*/
    613                     isJumping = true;
    614                     showedJump = false;
    615                 } else {
    616                     register_code(KC_ENT);
    617                 }
    618             } else {
    619                 if (swap_space_enter) {
    620                     unregister_code(KC_SPC);
    621 
    622                     /*Keyboard Pet jump reset*/
    623                     isJumping = false;
    624                 } else {
    625                     unregister_code(KC_ENT);
    626                 }
    627             }
    628             return false;
    629         case KC_THUMB_RIGHT:
    630             if (record->event.pressed) {
    631                 if (swap_space_enter) {
    632                     register_code(KC_ENT);
    633                 } else {
    634                     register_code(KC_SPC);
    635                     isJumping = true;
    636                     showedJump = false;
    637                 }
    638             } else {
    639                 if (swap_space_enter) {
    640                     unregister_code(KC_ENT);
    641                 } else {
    642                     unregister_code(KC_SPC);
    643                     isJumping = false;
    644                 }
    645             }
    646             return false;
    647 
    648         /* Smart Backspace Delete */
    649         case KC_RSFT:
    650         case KC_LSFT:
    651             shift_held = record->event.pressed;
    652             held_shift = keycode;
    653             break;
    654         case KC_BSPC_DEL:
    655             if (record->event.pressed) {
    656                 if (shift_held) {
    657                     unregister_code(held_shift);
    658                     register_code(KC_DEL);
    659                 } else {
    660                     register_code(KC_BSPC);
    661                 }
    662             } else {
    663                 unregister_code(KC_DEL);
    664                 unregister_code(KC_BSPC);
    665                 if (shift_held) {
    666                     register_code(held_shift);
    667                 }
    668             }
    669             return false;
    670     }
    671     return true;
    672 }
    673 
    674 /* The default rotary encoder code can be found at the bottom of qmk_firmware/keyboards/lime/rev1/rev1.c
    675  * These default settings can be overriden by your own settings in your keymap.c
    676  * For your convenience, here's a copy of those settings so that you can uncomment them if you wish to apply your own modifications.
    677  * DO NOT edit the rev1.c file; instead override the weakly defined default functions by your own.
    678  */
    679 
    680 /* DELETE THIS LINE TO UNCOMMENT (1/2)
    681 
    682 // Encoders
    683 #ifdef ENCODER_ENABLE
    684     bool encoder_update_user(uint8_t index, bool clockwise) {
    685 
    686         if (index == 0) {
    687             if (clockwise) {
    688                 tap_code(KC_MNXT);
    689             } else {
    690                 tap_code(KC_MPRV);
    691             }
    692         } else if (index == 1) {
    693             if (clockwise) {
    694                 tap_code(KC_VOLU);
    695             } else {
    696                 tap_code(KC_VOLD);
    697             }
    698         }
    699         return false;
    700     }
    701 #endif
    702 
    703 #endif
    704 DELETE THIS LINE TO UNCOMMENT (2/2) */