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.

195 lines
6.1 KiB

  1. /* Copyright 2019 kakunpc
  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. #define USE_LED_RIPPLE_EFFECT
  17. // #define RANDOM_RIPPLE_EFFECT
  18. #include QMK_KEYBOARD_H
  19. #include "lufa.h"
  20. #ifdef USE_LED_RIPPLE_EFFECT
  21. struct keybuf {
  22. char col, row;
  23. char frame;
  24. };
  25. struct keybuf keybufs[256];
  26. unsigned char keybuf_begin, keybuf_end;
  27. unsigned char r = 0;
  28. unsigned char g = 112;
  29. unsigned char b = 255;
  30. int col, row;
  31. #endif
  32. enum layers{
  33. BASE = 0,
  34. COMMAND
  35. };
  36. #define KC_COMMAND_NUM LT(COMMAND,KC_F13)
  37. #define KC_COMMAND_KANA LT(COMMAND,KC_F14)
  38. #define KC_COMMAND LT(COMMAND,KC_SPC)
  39. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  40. [BASE] = LAYOUT_all(
  41. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
  42. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
  43. KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
  44. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  45. KC_LCTL, KC_LALT, KC_LGUI, KC_COMMAND_NUM, KC_SPC, KC_SPC, KC_SPC, KC_COMMAND_KANA, KC_RALT, MO(COMMAND),KC_RCTL),
  46. [COMMAND] = LAYOUT_all(
  47. KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC,
  48. KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  49. KC_CAPS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  50. KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  51. KC_LCTL, KC_NO, KC_NO, _______, KC_NO, RGB_MOD, KC_NO, _______, KC_NO, _______, KC_NO),
  52. };
  53. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  54. #ifdef USE_LED_RIPPLE_EFFECT
  55. col = record->event.key.col;
  56. row = record->event.key.row;
  57. if (record->event.pressed) {
  58. int end = keybuf_end;
  59. keybufs[end].col = col;
  60. keybufs[end].row = row;
  61. keybufs[end].frame = 0;
  62. keybuf_end ++;
  63. }
  64. #endif
  65. return true;
  66. }
  67. void keyboard_post_init_user(void) {
  68. #ifdef USE_LED_RIPPLE_EFFECT
  69. rgblight_enable_noeeprom();
  70. rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT);
  71. #endif
  72. }
  73. #ifdef USE_LED_RIPPLE_EFFECT
  74. int scan_count = -10;
  75. int keys[] = { 14, 14, 13, 12, 11 };
  76. int keys_sum[] = { 0, 14, 28, 41, 53 };
  77. unsigned char rgb[14][5][3];
  78. int row_max = 12;
  79. int ToIndex(char _col, char _row) {
  80. return (_col * row_max) + _row;
  81. }
  82. void led_ripple_effect(void){
  83. if (scan_count == -1) {
  84. rgblight_enable_noeeprom();
  85. rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT);
  86. } else if (scan_count >= 0 && scan_count < 5) {
  87. for (unsigned char c=keybuf_begin; c!=keybuf_end; c++) {
  88. int i = c;
  89. // FIXME:
  90. int index = ToIndex(keybufs[i].col,keybufs[i].row);
  91. int coll = 0;
  92. for(int s = 4; s >= 0; --s){
  93. if( index >= keys_sum[s]){
  94. coll = s;
  95. break;
  96. }
  97. }
  98. int roww = MAX(0,index - keys_sum[coll]);
  99. int y = scan_count;
  100. int dist_y = abs(y - coll);
  101. for (int x=0; x<keys[y]; x++) {
  102. int dist = abs(x - roww) + dist_y;
  103. if (dist <= keybufs[i].frame) {
  104. int elevation = MAX(0, (8 + dist - keybufs[i].frame)) << 2;
  105. if (elevation) {
  106. if ((rgb[x][y][0] != 255) && r) { rgb[x][y][0] = MIN(255, elevation + rgb[x][y][0]); }
  107. if ((rgb[x][y][1] != 255) && g) { rgb[x][y][1] = MIN(255, elevation + rgb[x][y][1]); }
  108. if ((rgb[x][y][2] != 255) && b) { rgb[x][y][2] = MIN(255, elevation + rgb[x][y][2]); }
  109. }
  110. }
  111. }
  112. }
  113. } else if (scan_count == 5) {
  114. for (unsigned char c=keybuf_begin; c!=keybuf_end; c++) {
  115. int i = c;
  116. if (keybufs[i].frame < 64) {
  117. keybufs[i].frame ++;
  118. } else {
  119. keybuf_begin ++;
  120. }
  121. }
  122. } else if (scan_count >= 6 && scan_count <= 10) {
  123. int y = scan_count - 6;
  124. for (int x=0; x<keys[y]; x++) {
  125. int at = keys_sum[y] + x;
  126. led[at].r = rgb[x][y][0];
  127. led[at].g = rgb[x][y][1];
  128. led[at].b = rgb[x][y][2];
  129. }
  130. rgblight_set();
  131. } else if (scan_count == 11) {
  132. memset(rgb, 0, sizeof(rgb));
  133. }
  134. scan_count++;
  135. if (scan_count >= 12) { scan_count = 0; }
  136. }
  137. #endif
  138. void matrix_scan_user(void) {
  139. #ifdef USE_LED_RIPPLE_EFFECT
  140. #ifdef RANDOM_RIPPLE_EFFECT
  141. static int timer = 0;
  142. static int timeout = 300;
  143. timer++;
  144. if(timer > timeout){
  145. int end = keybuf_end;
  146. col = rand() % 6;
  147. row = rand() % 12;
  148. keybufs[end].col = col;
  149. keybufs[end].row = row;
  150. keybufs[end].frame = 0;
  151. keybuf_end ++;
  152. timer = rand() % timeout;
  153. }
  154. #endif
  155. led_ripple_effect();
  156. #endif
  157. }
  158. #ifdef OLED_ENABLE
  159. void oled_task_user(void) {
  160. oled_write_P(PSTR("Layer: "), false);
  161. switch (biton32(layer_state)) {
  162. case BASE:
  163. oled_write_P(PSTR("Default\n"), false);
  164. break;
  165. case COMMAND:
  166. oled_write_P(PSTR("COMMAND\n"), false);
  167. break;
  168. default:
  169. // Or use the write_ln shortcut over adding 'n' to the end of your string
  170. oled_write_ln_P(PSTR("Undefined"), false);
  171. }
  172. // Host Keyboard LED Status
  173. oled_write_P(IS_HOST_LED_ON(USB_LED_NUM_LOCK) ? PSTR("NUMLCK ") : PSTR(" "), false);
  174. oled_write_P(IS_HOST_LED_ON(USB_LED_CAPS_LOCK) ? PSTR("CAPLCK ") : PSTR(" "), false);
  175. oled_write_P(IS_HOST_LED_ON(USB_LED_SCROLL_LOCK) ? PSTR("SCRLCK ") : PSTR(" "), false);
  176. }
  177. #endif