You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

714 lines
32 KiB

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