keymap.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. /* Copyright 2020 Adam Naldal <adamnaldal@gmail.com>
  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 "keymap_danish.h"
  18. #include <stdio.h>
  19. enum layers {
  20. _QWERTY = 0,
  21. _COLEMAK,
  22. _NN,
  23. _MS,
  24. _SP
  25. };
  26. // Default layer switching
  27. #define QWERT DF(_QWERTY)
  28. #define COLEM DF(_COLEMAK)
  29. // Layer tap codes
  30. #define LT_SPC LT(_NN, KC_SPC)
  31. #define LT_TAB LT(_MS, KC_TAB)
  32. #define LT_ENT LT(_MS, KC_ENT)
  33. #define LT_BSPC LT(_NN, KC_BSPC)
  34. // Qwerty homerow mods
  35. #define A_CTL LCTL_T(KC_A)
  36. #define S_ALT LALT_T(KC_S)
  37. #define D_GUI LGUI_T(KC_D)
  38. #define F_SFT LSFT_T(KC_F)
  39. #define J_SFT RSFT_T(KC_J)
  40. #define K_GUI RGUI_T(KC_K)
  41. #define L_ALT RALT_T(KC_L)
  42. #define AE_CTL RCTL_T(DK_AE)
  43. // Colemak homerow mods
  44. #define R_ALT LALT_T(KC_R)
  45. #define S_GUI LGUI_T(KC_S)
  46. #define T_SFT LSFT_T(KC_T)
  47. #define N_SFT RSFT_T(KC_N)
  48. #define E_GUI RGUI_T(KC_E)
  49. #define I_ALT RALT_T(KC_I)
  50. #define O_CTL RCTL_T(KC_O)
  51. // Navigation and numbers homerow mods
  52. #define RGHT_SFT LSFT_T(KC_RGHT)
  53. #define DOWN_GUI LGUI_T(KC_DOWN)
  54. #define LEFT_ALT LALT_T(KC_LEFT)
  55. #define N4_SFT RSFT_T(KC_4)
  56. #define N5_GUI RGUI_T(KC_5)
  57. #define N6_ALT RALT_T(KC_6)
  58. #define OE_CTL RCTL_T(DK_OSTR)
  59. // Undefined or wrong symbols (homebrew)
  60. #define HB_LCBR S(A(KC_8)) // {
  61. #define HB_RCBR S(A(KC_9)) // }
  62. #define HB_LABR KC_GRV // <
  63. #define HB_RABR S(KC_GRV) // >
  64. #define HB_USD KC_NUBS // $
  65. #define HB_PRGF S(KC_NUBS) // §
  66. #define HB_AT A(KC_NUHS) // @
  67. #define HB_EUR S(KC_4) // €
  68. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  69. /*
  70. * Base Layer: QWERTY
  71. *
  72. * ,-------------------------------------------. ,-------------------------------------------.
  73. * | | Q | W | E | R | T | | Y | U | I | O | P | Å |
  74. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  75. * | | A | S | D | F | G | | H | J | K | L | Æ | Ø |
  76. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  77. * | | Z | X | C | V | B | | N | M | , ; | . : | - _ | |
  78. * `------------------------⫟------⫟------⫟------⫟------. ,-----⫟------⫟------⫟------⫟-------------------------'
  79. * | MUTE | Esc | Space| Tab | | Enter| Bksp | Caps| PLAY|
  80. * |(enc) | | _NN | _MS | | _MS | _NN | |(enc)|
  81. * `---------------------------' `---------------------------'
  82. */
  83. [_QWERTY] = LAYOUT_split_3x6_4(
  84. //,-----------------------------------------------------. ,-----------------------------------------------------.
  85. XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, DK_ARNG,
  86. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  87. XXXXXXX, A_CTL, S_ALT, D_GUI, F_SFT, KC_G, KC_H, J_SFT, K_GUI, L_ALT, AE_CTL, DK_OSTR,
  88. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  89. XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, DK_MINS, XXXXXXX,
  90. //|--------+--------+-----------⫟--------⫟--------⫟--------⫟--------. .--------⫟--------⫟--------⫟--------⫟-----------+--------+--------|
  91. KC_MUTE, KC_ESC, LT_SPC, LT_TAB, LT_ENT, LT_BSPC, KC_CAPS, KC_MPLY
  92. //`------------------------------------' '------------------------------------'
  93. ),
  94. /*
  95. * Base Layer: COLEMAK
  96. *
  97. * ,-------------------------------------------. ,-------------------------------------------.
  98. * | | Q | W | F | P | B | | J | L | U | Y | Å | |
  99. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  100. * | | A | R | S | T | G | | M | N | E | I | O | |
  101. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  102. * | | Z | X | C | D | V | | K | H | , ; | . : | Æ | |
  103. * `------------------------⫟------⫟------⫟------⫟------. ,-----⫟------⫟------⫟------⫟-------------------------'
  104. * | MUTE | Esc | Space| Tab | | Enter| Bksp | Caps | PLAY|
  105. * |(enc) | | _NN | _MS | | _MS | _NN | | (enc)|
  106. * `---------------------------' `---------------------------'
  107. */
  108. [_COLEMAK] = LAYOUT_split_3x6_4(
  109. //,-----------------------------------------------------. ,-----------------------------------------------------.
  110. XXXXXXX, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, DK_ARNG, XXXXXXX,
  111. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  112. XXXXXXX, A_CTL, R_ALT, S_GUI, T_SFT, KC_G, KC_M, N_SFT, E_GUI, I_ALT, O_CTL, XXXXXXX,
  113. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  114. XXXXXXX, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, DK_AE, XXXXXXX,
  115. //|--------+--------+-----------⫟--------⫟--------⫟--------⫟--------. .--------⫟--------⫟--------⫟--------⫟-----------+--------+--------|
  116. KC_MUTE, KC_ESC, LT_SPC, LT_TAB, LT_ENT, LT_BSPC, KC_CAPS, KC_MPLY
  117. //`------------------------------------' '------------------------------------'
  118. ),
  119. /*
  120. * Navigation and Numbers: _NN
  121. *
  122. * ,-------------------------------------------. ,-------------------------------------------.
  123. * | | | Home | Up | End | pgUp | | * | 7 | 8 | 9 | + | |
  124. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  125. * | | | Left | Down | Right| pgDwn| | / | 4 | 5 | 6 | Ø | |
  126. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  127. * | | | Cut | Copy | | Paste| | = | 1 | 2 | 3 | - | |
  128. * `------------------------⫟------⫟------⫟------⫟------. ,-----⫟------⫟------⫟------⫟-------------------------'
  129. * | MUTE | Del | Space| Tab | | Enter| Bksp | 0 | PLAY |
  130. * |(enc) | | _NN | _MS | | _MS | _NN | |(enc) |
  131. * `---------------------------' `---------------------------'
  132. */
  133. [_NN] = LAYOUT_split_3x6_4(
  134. //,-----------------------------------------------------. ,-----------------------------------------------------.
  135. XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_END, KC_PGUP, DK_ASTR, KC_7, KC_8, KC_9, DK_PLUS, XXXXXXX,
  136. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  137. XXXXXXX, KC_LCTL,LEFT_ALT,DOWN_GUI,RGHT_SFT, KC_PGDN, DK_SLSH, N4_SFT, N5_GUI, N6_ALT, OE_CTL, XXXXXXX,
  138. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  139. XXXXXXX, XXXXXXX, G(KC_X), G(KC_C), XXXXXXX, G(KC_V), DK_EQL, KC_1, KC_2, KC_3, DK_MINS, XXXXXXX,
  140. //|--------+--------+-----------⫟--------⫟--------⫟--------⫟--------. .--------⫟--------⫟--------⫟--------⫟-----------+--------+--------|
  141. KC_MUTE, KC_DEL, _______, _______, _______, _______, KC_0, KC_MPLY
  142. //`------------------------------------' '------------------------------------'
  143. ),
  144. /*
  145. * Media and Symbols: _MS
  146. *
  147. * ,-------------------------------------------. ,-------------------------------------------.
  148. * | | | | [ | ] | F1 | | $ | / | ( | ) | ? | |
  149. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  150. * | |brght-|brght+| { | } | F2 | | @ | € | % | & | ' | |
  151. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  152. * | | | | < | > | F3 | | § | ! | " | # | _ | |
  153. * `------------------------⫟------⫟------⫟------⫟------. ,-----⫟------⫟------⫟------⫟-------------------------'
  154. * | MUTE | Esc | Space| Tab | | Enter| Bksp | Caps | PLAY|
  155. * |(enc) | | _NN | _MS | | _MS | _NN | | (enc)|
  156. * `---------------------------' `---------------------------'
  157. */
  158. [_MS] = LAYOUT_split_3x6_4(
  159. //,-----------------------------------------------------. ,-----------------------------------------------------.
  160. XXXXXXX, XXXXXXX, XXXXXXX, DK_LBRC, DK_RBRC, KC_F1, HB_USD, DK_SLSH, DK_LPRN, DK_RPRN, DK_QUES, XXXXXXX,
  161. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  162. XXXXXXX, KC_BRID, KC_BRIU, HB_LCBR, HB_RCBR, KC_F2, HB_AT, HB_EUR, DK_PERC, DK_AMPR, DK_QUOT, XXXXXXX,
  163. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  164. XXXXXXX, XXXXXXX, XXXXXXX, HB_LABR, HB_RABR, KC_F3, HB_PRGF, DK_EXLM, DK_DQUO, DK_HASH, DK_UNDS, XXXXXXX,
  165. //|--------+--------+-----------⫟--------⫟--------⫟--------⫟--------. .--------⫟--------⫟--------⫟--------⫟-----------+--------+--------|
  166. KC_MUTE, KC_ESC, _______, _______, _______, _______, KC_CAPS, KC_MPLY
  167. //`------------------------------------' '------------------------------------'
  168. ),
  169. /*
  170. * Special functions: _SP
  171. *
  172. * ,-------------------------------------------. ,-------------------------------------------.
  173. * | |QWERTY| | | RESET| | | | | | | | |
  174. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  175. * | | | | DEBUG| | | | | | | | | |
  176. * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
  177. * | | | |COLEMK| | | | | | | | | |
  178. * `------------------------⫟------⫟------⫟------⫟------. ,-----⫟------⫟------⫟------⫟-------------------------'
  179. * | GUI | Del | Space| Nav +| |Media+| Bksp | Enter| AltGr|
  180. * | | | |Number| |symbol| | | |
  181. * `---------------------------' `---------------------------'
  182. */
  183. [_SP] = LAYOUT_split_3x6_4(
  184. //,-----------------------------------------------------. ,-----------------------------------------------------.
  185. XXXXXXX, QWERT, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  186. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  187. XXXXXXX, XXXXXXX, XXXXXXX, DEBUG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  188. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  189. XXXXXXX, XXXXXXX, XXXXXXX, COLEM, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  190. //|--------+--------+-----------⫟--------⫟--------⫟--------⫟--------. .--------⫟--------⫟--------⫟--------⫟-----------+--------+--------|
  191. KC_MUTE, KC_ESC, _______, _______, _______, _______, KC_CAPS, KC_MPLY
  192. //`------------------------------------' '------------------------------------'
  193. ),
  194. };
  195. layer_state_t layer_state_set_user(layer_state_t state) {
  196. return update_tri_layer_state(state, _NN, _MS, _SP);
  197. }
  198. #ifdef OLED_DRIVER_ENABLE
  199. char wpm_str[10];
  200. // static void render_logo(void) {
  201. // static const char PROGMEM qmk_logo[] = {
  202. // 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94,
  203. // 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4,
  204. // 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00
  205. // };
  206. //
  207. // oled_write_P(qmk_logo, false);
  208. // }
  209. static void print_status_narrow(void) {
  210. // Print current mode
  211. oled_write_P(PSTR("\n"), false);
  212. oled_write_ln_P(PSTR("MODE"), false);
  213. oled_write_ln_P(PSTR(""), false);
  214. switch (get_highest_layer(default_layer_state)) {
  215. case _QWERTY:
  216. oled_write_ln_P(PSTR("Qwrt"), false);
  217. break;
  218. case _COLEMAK:
  219. oled_write_ln_P(PSTR("Clmk"), false);
  220. break;
  221. default:
  222. oled_write_P(PSTR("Undef"), false);
  223. }
  224. oled_write_P(PSTR("\n\n"), false);
  225. // Print current layer
  226. oled_write_ln_P(PSTR("LAYER"), false);
  227. switch (get_highest_layer(layer_state)) {
  228. case _QWERTY:
  229. oled_write_P(PSTR("Base\n"), false);
  230. break;
  231. case _NN:
  232. oled_write_P(PSTR("Nums\n"), false);
  233. break;
  234. case _MS:
  235. oled_write_P(PSTR("Sym\n"), false);
  236. break;
  237. case _SP:
  238. oled_write_P(PSTR("Spec\n"), false);
  239. break;
  240. default:
  241. oled_write_ln_P(PSTR("Undef\n"), false);
  242. }
  243. oled_write_P(PSTR("\n\n"), false);
  244. led_t led_usb_state = host_keyboard_led_state();
  245. oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock);
  246. }
  247. #define ANIM_NUM_FRAMES 2 // number of frames in the animation
  248. #define MAX_DURATION 10000
  249. #define ANIM_BEGIN 30
  250. uint16_t anim_frame_duration = 100; // how long each frame lasts
  251. // #define ANIM_REVERSE // define this if you want the animation to run backwards at the end
  252. #ifdef ANIM_REVERSE
  253. #define ANIM_TOTAL_FRAMES (2*((ANIM_NUM_FRAMES)-1))
  254. #else
  255. #define ANIM_TOTAL_FRAMES ANIM_NUM_FRAMES
  256. #endif
  257. uint16_t anim_timer = 0;
  258. uint8_t current_anim_frame = 0;
  259. static void render_anim(void) {
  260. static const char PROGMEM frame[ANIM_NUM_FRAMES][512] = {
  261. {
  262. // 'pokemon experiment frame 1', 32x128px
  263. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  264. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  265. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x10, 0x08, 0x04, 0x04, 0x02, 0x02, 0x02,
  266. 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x08, 0x30, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  267. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x3c, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  268. 0x04, 0xf2, 0x3a, 0x1c, 0x3c, 0xf8, 0xe0, 0x00, 0x00, 0x01, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00,
  269. 0x00, 0x00, 0x00, 0x70, 0x8c, 0x03, 0x41, 0x82, 0x02, 0x03, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00,
  270. 0x00, 0x07, 0x04, 0x84, 0x84, 0xc7, 0x63, 0x00, 0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0x00, 0x00,
  271. 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x04, 0x1c, 0x28, 0x58, 0xa4, 0xa4, 0x44, 0x42, 0x42,
  272. 0x23, 0x97, 0x91, 0x48, 0x24, 0x23, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  273. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
  274. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  275. 0x00, 0x00, 0x80, 0x70, 0x08, 0x04, 0x04, 0x08, 0x08, 0x50, 0x20, 0x10, 0x10, 0x10, 0x90, 0x90,
  276. 0x90, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x10, 0x08, 0x08, 0x04, 0x04, 0x08, 0xf0, 0x00, 0x00,
  277. 0x80, 0x78, 0x1f, 0x3a, 0xf2, 0xc4, 0x00, 0x00, 0x30, 0x60, 0x00, 0x06, 0x8f, 0xcf, 0xe7, 0x03,
  278. 0x01, 0x00, 0x04, 0xf2, 0x3a, 0x1c, 0x1c, 0x78, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0,
  279. 0x1f, 0x64, 0xb4, 0x64, 0xa7, 0x23, 0x40, 0x48, 0x50, 0x40, 0x80, 0x80, 0x91, 0x89, 0x80, 0x80,
  280. 0x80, 0x40, 0x40, 0x47, 0x44, 0x44, 0xa4, 0x64, 0x27, 0x13, 0x08, 0x00, 0x00, 0x80, 0x60, 0x1f,
  281. 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x0c,
  282. 0x0c, 0x0c, 0x0a, 0x0a, 0x09, 0x05, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00,
  283. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  284. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  285. 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04,
  286. 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00,
  287. 0x00, 0x00, 0x00, 0xfc, 0x1b, 0x3c, 0xfc, 0xf9, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  288. 0x00, 0x00, 0x00, 0x02, 0xf1, 0x39, 0x1c, 0x3c, 0xfc, 0xf8, 0xf0, 0x00, 0x00, 0x03, 0x0c, 0xf0,
  289. 0x00, 0xf8, 0x06, 0x01, 0x32, 0x02, 0x03, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  290. 0x00, 0x00, 0x00, 0x00, 0x07, 0x04, 0x84, 0x84, 0x47, 0xe3, 0x01, 0x00, 0x00, 0x00, 0xc0, 0x3f,
  291. 0x00, 0x00, 0x01, 0x02, 0x06, 0x0a, 0x14, 0x28, 0x48, 0x44, 0x44, 0xc2, 0xc2, 0xc2, 0xa2, 0xa2,
  292. 0xa1, 0x91, 0x91, 0x89, 0x49, 0x45, 0x44, 0x22, 0x21, 0x10, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00,
  293. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  294. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  295. },
  296. {
  297. // 'pokemon experiment frame 2', 32x128px
  298. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
  299. 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  300. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x18, 0x84, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00,
  301. 0x00, 0x80, 0x80, 0x00, 0x01, 0x01, 0x01, 0x02, 0x0c, 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
  302. 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x87, 0x8f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  303. 0x01, 0xfc, 0x0e, 0x07, 0x0f, 0xfe, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00,
  304. 0x00, 0x00, 0x00, 0x1c, 0x63, 0x80, 0x10, 0x20, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00,
  305. 0x00, 0x81, 0x81, 0x41, 0x41, 0x21, 0x10, 0x00, 0x80, 0x60, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00,
  306. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x06, 0x04, 0x04, 0x0a, 0x0a, 0x0a, 0x0a, 0x09,
  307. 0x05, 0x07, 0x04, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  308. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  309. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  310. 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x08, 0x10, 0x10, 0xa0, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20,
  311. 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x10, 0xe0, 0x00, 0x00,
  312. 0x00, 0xf0, 0x3f, 0x72, 0xe2, 0x80, 0x00, 0x00, 0x60, 0xc0, 0x00, 0x0c, 0x1e, 0x9e, 0xcf, 0x07,
  313. 0x03, 0x00, 0x00, 0xe2, 0x72, 0x38, 0x38, 0xf0, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x01, 0x1e, 0xe0,
  314. 0x3f, 0xc8, 0x68, 0x48, 0x8f, 0x87, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x43, 0x23, 0x01, 0x00,
  315. 0x00, 0x00, 0x00, 0x0f, 0x08, 0x88, 0x88, 0x48, 0x4f, 0x27, 0x10, 0x00, 0x00, 0x00, 0xc0, 0x3f,
  316. 0x00, 0x00, 0x01, 0x02, 0x02, 0x06, 0x05, 0x09, 0x09, 0x09, 0x12, 0x12, 0x12, 0x12, 0x11, 0x11,
  317. 0x11, 0x11, 0x11, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00,
  318. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  319. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  320. 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x90, 0x88, 0x88, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02,
  321. 0x02, 0x02, 0x02, 0x82, 0x82, 0x84, 0x04, 0x04, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00,
  322. 0x00, 0x00, 0x00, 0xfe, 0x0d, 0x1e, 0xfe, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  323. 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1c, 0x0e, 0x1e, 0xfe, 0xfc, 0xf8, 0x00, 0x00, 0x01, 0x06, 0xf8,
  324. 0x00, 0x78, 0x87, 0x00, 0x31, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  325. 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x82, 0x82, 0x43, 0x61, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f,
  326. 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x04, 0x0c, 0x08, 0x14, 0x12, 0x12, 0x12, 0x22, 0x22, 0x22,
  327. 0x21, 0x21, 0x21, 0x21, 0x11, 0x11, 0x10, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00,
  328. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  329. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  330. }
  331. };
  332. if (get_current_wpm() > ANIM_BEGIN){
  333. if(timer_elapsed(anim_timer) > anim_frame_duration) {
  334. anim_timer = timer_read();
  335. current_anim_frame = (current_anim_frame + 1) % ANIM_TOTAL_FRAMES;
  336. oled_clear();
  337. oled_write_raw_P(frame[abs((ANIM_NUM_FRAMES-1)-current_anim_frame)], 512);
  338. if (get_current_wpm() > ANIM_BEGIN){
  339. anim_frame_duration = MAX_DURATION/get_current_wpm();
  340. }
  341. }
  342. } else {
  343. oled_write_raw_P(frame[0],512);
  344. }
  345. }
  346. oled_rotation_t oled_init_user(oled_rotation_t rotation) {
  347. if (is_keyboard_master()) {
  348. return OLED_ROTATION_270;
  349. }
  350. if (is_keyboard_master() != true){
  351. return OLED_ROTATION_270;
  352. }
  353. return rotation;
  354. }
  355. void oled_task_user(void) {
  356. if (is_keyboard_master()) {
  357. print_status_narrow();
  358. sprintf(wpm_str, "%03d", get_current_wpm());
  359. oled_write(wpm_str, false);
  360. } else {
  361. render_anim();
  362. }
  363. }
  364. #endif
  365. #ifdef ENCODER_ENABLE
  366. bool encoder_update_user(uint8_t index, bool clockwise) {
  367. if (index == 0) {
  368. // master side thumb encoder
  369. // Volume control
  370. if (clockwise) {
  371. tap_code(KC_VOLU);
  372. } else {
  373. tap_code(KC_VOLD);
  374. }
  375. }
  376. else if (index == 1) {
  377. // master side pinky encoder
  378. // Page down / Page up
  379. if (clockwise) {
  380. tap_code(KC_PGDN);
  381. } else {
  382. tap_code(KC_PGUP);
  383. }
  384. }
  385. else if (index == 2) {
  386. // minion side thumb encoder
  387. // Next track / Previous track
  388. if (clockwise) {
  389. tap_code(KC_MFFD);
  390. } else {
  391. tap_code(KC_MRWD);
  392. }
  393. }
  394. else if (index == 3) {
  395. // minion side pinky encoder
  396. // Page end / Page home
  397. if (clockwise) {
  398. tap_code(KC_END);
  399. } else {
  400. tap_code(KC_HOME);
  401. }
  402. }
  403. return true;
  404. }
  405. #endif