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) */