diff options
| author | Valen Cheung <xvalen214x@gmail.com> | 2019-01-18 08:57:31 +0800 |
|---|---|---|
| committer | Drashna Jaelre <drashna@live.com> | 2019-01-17 16:57:31 -0800 |
| commit | d53432393bc409db0f01a1b668bf3f5fc6bebb4f (patch) | |
| tree | 7c6407b2dc9b719523863d4c54f7d2f52a8e5cb2 | |
| parent | 28929ad0174bdcb38e09f6d272a23b9be6aa430c (diff) | |
| download | qmk_firmware-d53432393bc409db0f01a1b668bf3f5fc6bebb4f.tar.gz qmk_firmware-d53432393bc409db0f01a1b668bf3f5fc6bebb4f.zip | |
[Keymap] added custom led effect keymap.c (#4856)
| -rw-r--r-- | keyboards/massdrop/ctrl/keymaps/responsive_pattern/keymap.c | 939 |
1 files changed, 939 insertions, 0 deletions
diff --git a/keyboards/massdrop/ctrl/keymaps/responsive_pattern/keymap.c b/keyboards/massdrop/ctrl/keymaps/responsive_pattern/keymap.c new file mode 100644 index 000000000..eabd8d23a --- /dev/null +++ b/keyboards/massdrop/ctrl/keymaps/responsive_pattern/keymap.c | |||
| @@ -0,0 +1,939 @@ | |||
| 1 | #include QMK_KEYBOARD_H | ||
| 2 | |||
| 3 | // uint8_t keyboard_leds(void) | ||
| 4 | #include <tmk_core/protocol/arm_atsam/main_arm_atsam.h> | ||
| 5 | |||
| 6 | |||
| 7 | #if ISSI3733_LED_COUNT == 119 | ||
| 8 | # define KEY_LED_COUNT 87 | ||
| 9 | #elif ISSI3733_LED_COUNT == 105 | ||
| 10 | # define KEY_LED_COUNT 67 | ||
| 11 | #endif | ||
| 12 | |||
| 13 | #define min(x, y) (x < y ? x : y) | ||
| 14 | |||
| 15 | |||
| 16 | extern issi3733_led_t *lede; | ||
| 17 | extern issi3733_led_t led_map[]; | ||
| 18 | extern led_disp_t disp; | ||
| 19 | |||
| 20 | enum ctrl_keycodes { | ||
| 21 | L_BRI = SAFE_RANGE, //LED Brightness Increase | ||
| 22 | L_BRD, //LED Brightness Decrease | ||
| 23 | L_PTN, //LED Pattern Select Next | ||
| 24 | L_PTP, //LED Pattern Select Previous | ||
| 25 | L_PSI, //LED Pattern Speed Increase | ||
| 26 | L_PSD, //LED Pattern Speed Decrease | ||
| 27 | L_T_MD, //LED Toggle Mode | ||
| 28 | L_T_ONF, //LED Toggle On / Off | ||
| 29 | L_ON, //LED On | ||
| 30 | L_OFF, //LED Off | ||
| 31 | L_T_BR, //LED Toggle Breath Effect | ||
| 32 | L_T_PTD, //LED Toggle Scrolling Pattern Direction | ||
| 33 | U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active | ||
| 34 | U_T_AGCR, //USB Toggle Automatic GCR control | ||
| 35 | DBG_TOG, //DEBUG Toggle On / Off | ||
| 36 | DBG_MTRX, //DEBUG Toggle Matrix Prints | ||
| 37 | DBG_KBD, //DEBUG Toggle Keyboard Prints | ||
| 38 | DBG_MOU, //DEBUG Toggle Mouse Prints | ||
| 39 | MD_BOOT, //Restart into bootloader after hold timeout | ||
| 40 | |||
| 41 | L_SP_PR, //LED Splash Pattern Select Previous | ||
| 42 | L_SP_NE, //LED Splash Pattern Select Next | ||
| 43 | |||
| 44 | L_SP_WD, //LED Splash Widen Wavefront width | ||
| 45 | L_SP_NW, //LED Splash Narrow Wavefront width | ||
| 46 | |||
| 47 | L_SP_FA, //LED Splash wave travel speed faster (shorter period) | ||
| 48 | L_SP_SL, //LED Splash wave travel speed slower (longer period) | ||
| 49 | |||
| 50 | L_CP_PR, //LED Color Pattern Select Previous | ||
| 51 | L_CP_NX, //LEB Color Pattern Select Next | ||
| 52 | }; | ||
| 53 | |||
| 54 | #define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode | ||
| 55 | #define ______ KC_TRNS | ||
| 56 | |||
| 57 | keymap_config_t keymap_config; | ||
| 58 | |||
| 59 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
| 60 | [0] = LAYOUT( | ||
| 61 | 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_PSCR, KC_SLCK, KC_PAUS, \ | ||
| 62 | 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, KC_INS, KC_HOME, KC_PGUP, \ | ||
| 63 | 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, KC_DEL, KC_END, KC_PGDN, \ | ||
| 64 | KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ | ||
| 65 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \ | ||
| 66 | KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ | ||
| 67 | ), | ||
| 68 | [1] = LAYOUT( | ||
| 69 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, \ | ||
| 70 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, \ | ||
| 71 | L_T_BR, L_PSD, L_BRI, L_PSI, _______, _______, _______, U_T_AUTO,U_T_AGCR,_______, MO(2), _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \ | ||
| 72 | L_T_PTD, L_PTP, L_BRD, L_PTN, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | ||
| 73 | _______, L_T_MD, L_T_ONF, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, \ | ||
| 74 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ | ||
| 75 | ), | ||
| 76 | [2] = LAYOUT( | ||
| 77 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | ||
| 78 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | ||
| 79 | L_CP_NX, L_SP_SL, L_SP_WD, L_SP_FA, _______, _______, L_CP_NX, L_SP_SL, L_SP_WD, L_SP_FA, _______, _______, _______, _______, _______, _______, _______, \ | ||
| 80 | L_CP_PR, L_SP_PR, L_SP_NW, L_SP_NE, _______, _______, L_CP_PR, L_SP_PR, L_SP_NW, L_SP_NE, _______, _______, _______, \ | ||
| 81 | _______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, \ | ||
| 82 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ | ||
| 83 | ), | ||
| 84 | /* | ||
| 85 | [X] = LAYOUT( | ||
| 86 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | ||
| 87 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | ||
| 88 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | ||
| 89 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ | ||
| 90 | _______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, \ | ||
| 91 | _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ | ||
| 92 | ), | ||
| 93 | */ | ||
| 94 | }; | ||
| 95 | |||
| 96 | // see: /tmk_core/common/keycode.h | ||
| 97 | uint8_t KEYCODE_TO_LED_ID[256]; | ||
| 98 | uint8_t DISTANCE_MAP[KEY_LED_COUNT+1][KEY_LED_COUNT+1]; | ||
| 99 | struct user_led_t { | ||
| 100 | uint8_t state; | ||
| 101 | uint8_t r; | ||
| 102 | uint8_t g; | ||
| 103 | uint8_t b; | ||
| 104 | } USER_LED[KEY_LED_COUNT] = { | ||
| 105 | |||
| 106 | }; | ||
| 107 | |||
| 108 | struct { | ||
| 109 | uint8_t PATTERN_INDEX; | ||
| 110 | uint8_t WAVE_FRONT_WIDTH; | ||
| 111 | uint16_t WAVE_PERIOD; | ||
| 112 | uint8_t COLOR_PATTERN_INDEX; | ||
| 113 | uint8_t TRAVEL_DISTANCE; | ||
| 114 | } USER_CONFIG = { | ||
| 115 | .PATTERN_INDEX = 1, | ||
| 116 | .WAVE_FRONT_WIDTH = 3, | ||
| 117 | .WAVE_PERIOD = 50, | ||
| 118 | .COLOR_PATTERN_INDEX = 0, | ||
| 119 | .TRAVEL_DISTANCE = 25, | ||
| 120 | }; | ||
| 121 | |||
| 122 | uint8_t ktli(uint16_t keycode){ | ||
| 123 | if(keycode < 256){ | ||
| 124 | // the array is initialized in `matrix_init_user()` | ||
| 125 | return KEYCODE_TO_LED_ID[keycode]; | ||
| 126 | } | ||
| 127 | switch(keycode){ | ||
| 128 | // definition of MO(layer): quantum/quantum_keycodes.h: line 614 | ||
| 129 | case MO(1): return 82; | ||
| 130 | } | ||
| 131 | return 0; | ||
| 132 | }; | ||
| 133 | |||
| 134 | // Runs just one time when the keyboard initializes. | ||
| 135 | static void init_keycode_to_led_map(void){ | ||
| 136 | uint16_t LED_MAP[MATRIX_ROWS][MATRIX_COLS] = LAYOUT( | ||
| 137 | 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, | ||
| 138 | 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35, | ||
| 139 | 36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51, | ||
| 140 | 52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67, | ||
| 141 | #if KEY_LED_COUNT >= 87 | ||
| 142 | 68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87 | ||
| 143 | #endif | ||
| 144 | ); | ||
| 145 | |||
| 146 | uint16_t key = 0; | ||
| 147 | for(uint8_t y = 0; y < MATRIX_ROWS; ++y){ | ||
| 148 | for(uint8_t x = 0; x < MATRIX_COLS; ++x){ | ||
| 149 | key = keymaps[0][y][x]; | ||
| 150 | if(key < 256){ | ||
| 151 | KEYCODE_TO_LED_ID[key] = LED_MAP[y][x]; | ||
| 152 | } | ||
| 153 | } | ||
| 154 | } | ||
| 155 | } | ||
| 156 | // https://docs.qmk.fm/#/feature_terminal | ||
| 157 | #define KEY_POSITION_MAP_ROWS 6 | ||
| 158 | #define KEY_POSITION_MAP_COLUMNS 20 | ||
| 159 | static void init_distance_map(void){ | ||
| 160 | uint16_t KEY_POSITION_MAP[KEY_POSITION_MAP_ROWS][KEY_POSITION_MAP_COLUMNS] = { | ||
| 161 | { KC_NO, KC_ESC, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_NO, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, }, | ||
| 162 | // { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, | ||
| 163 | { KC_NO, 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, KC_BSPC, KC_NO, KC_INS, KC_HOME, KC_PGUP, }, | ||
| 164 | { KC_NO, 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, KC_BSLS, KC_NO, KC_DEL, KC_END, KC_PGDN, }, | ||
| 165 | { KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_ENT, KC_NO, KC_NO, KC_NO, KC_NO, }, | ||
| 166 | { KC_NO, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_RSFT, KC_RSFT, KC_NO, KC_NO, KC_UP, KC_NO, }, | ||
| 167 | { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_NO, MO(1), KC_APP, KC_RCTL, KC_RCTL, KC_RCTL, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, }, | ||
| 168 | }; | ||
| 169 | uint8_t columns = KEY_POSITION_MAP_COLUMNS; | ||
| 170 | uint8_t rows = KEY_POSITION_MAP_ROWS; | ||
| 171 | |||
| 172 | for(uint8_t y = 0; y < rows; ++y){ | ||
| 173 | for(uint8_t x = 0; x < columns; ++x){ | ||
| 174 | uint8_t id1 = ktli(KEY_POSITION_MAP[y][x]); | ||
| 175 | |||
| 176 | for(uint8_t j = y; j < rows; ++j){ | ||
| 177 | for(uint8_t i = 0; i < columns; ++i){ | ||
| 178 | uint8_t id2 = ktli(KEY_POSITION_MAP[j][i]); | ||
| 179 | |||
| 180 | if(id1 == id2) continue; | ||
| 181 | |||
| 182 | uint8_t dx = abs(i - x); | ||
| 183 | uint8_t dy = abs(j - y); | ||
| 184 | uint8_t dis = dx + dy; | ||
| 185 | if(i < x && j > y){ | ||
| 186 | dis -= min(dx, dy); | ||
| 187 | } | ||
| 188 | |||
| 189 | uint8_t _dis = DISTANCE_MAP[id1][id2]; | ||
| 190 | if(_dis && _dis <= dis) continue; | ||
| 191 | DISTANCE_MAP[id1][id2] = dis; | ||
| 192 | DISTANCE_MAP[id2][id1] = dis; | ||
| 193 | } | ||
| 194 | } | ||
| 195 | } | ||
| 196 | } | ||
| 197 | } | ||
| 198 | void matrix_init_user(void) { | ||
| 199 | init_keycode_to_led_map(); | ||
| 200 | init_distance_map(); | ||
| 201 | }; | ||
| 202 | |||
| 203 | // /tmk_core/protocol/arm_atsam/led_matrix.c: line 244 | ||
| 204 | uint8_t led_enabled; | ||
| 205 | float led_animation_speed; | ||
| 206 | uint8_t led_animation_direction; | ||
| 207 | uint8_t led_animation_orientation; | ||
| 208 | uint8_t led_animation_breathing; | ||
| 209 | uint8_t led_animation_breathe_cur; | ||
| 210 | uint8_t breathe_step; | ||
| 211 | uint8_t breathe_dir; | ||
| 212 | uint64_t led_next_run; | ||
| 213 | |||
| 214 | uint8_t led_animation_id; | ||
| 215 | uint8_t led_lighting_mode; | ||
| 216 | |||
| 217 | issi3733_led_t *led_cur; | ||
| 218 | uint8_t led_per_run; | ||
| 219 | float breathe_mult; | ||
| 220 | |||
| 221 | // overrided /tmk_core/protocol/arm_atsam/led_matrix.c: line 484 | ||
| 222 | void rgb_matrix_init_user(void){ | ||
| 223 | led_animation_speed = ANIMATION_SPEED_STEP * 15; | ||
| 224 | led_per_run = 15; | ||
| 225 | } | ||
| 226 | |||
| 227 | // overrided /tmk_core/protocol/arm_atsam/led_matrix.c: line 262 | ||
| 228 | void led_matrix_run(void) | ||
| 229 | { | ||
| 230 | float ro; | ||
| 231 | float go; | ||
| 232 | float bo; | ||
| 233 | float po; | ||
| 234 | uint8_t led_this_run = 0; | ||
| 235 | led_setup_t *f = (led_setup_t*)led_setups[led_animation_id]; | ||
| 236 | |||
| 237 | if (led_cur == 0) //Denotes start of new processing cycle in the case of chunked processing | ||
| 238 | { | ||
| 239 | led_cur = led_map; | ||
| 240 | |||
| 241 | disp.frame += 1; | ||
| 242 | |||
| 243 | breathe_mult = 1; | ||
| 244 | |||
| 245 | if (led_animation_breathing) | ||
| 246 | { | ||
| 247 | led_animation_breathe_cur += breathe_step * breathe_dir; | ||
| 248 | |||
| 249 | if (led_animation_breathe_cur >= BREATHE_MAX_STEP) | ||
| 250 | breathe_dir = -1; | ||
| 251 | else if (led_animation_breathe_cur <= BREATHE_MIN_STEP) | ||
| 252 | breathe_dir = 1; | ||
| 253 | |||
| 254 | //Brightness curve created for 256 steps, 0 - ~98% | ||
| 255 | breathe_mult = 0.000015 * led_animation_breathe_cur * led_animation_breathe_cur; | ||
| 256 | if (breathe_mult > 1) breathe_mult = 1; | ||
| 257 | else if (breathe_mult < 0) breathe_mult = 0; | ||
| 258 | } | ||
| 259 | } | ||
| 260 | |||
| 261 | uint8_t fcur = 0; | ||
| 262 | uint8_t fmax = 0; | ||
| 263 | |||
| 264 | //Frames setup | ||
| 265 | while (f[fcur].end != 1) | ||
| 266 | { | ||
| 267 | fcur++; //Count frames | ||
| 268 | } | ||
| 269 | |||
| 270 | fmax = fcur; //Store total frames count | ||
| 271 | |||
| 272 | struct user_led_t user_led_cur; | ||
| 273 | while (led_cur < lede && led_this_run < led_per_run) | ||
| 274 | { | ||
| 275 | ro = 0; | ||
| 276 | go = 0; | ||
| 277 | bo = 0; | ||
| 278 | |||
| 279 | uint8_t led_index = led_cur - led_map; // only this part differs from the original function. | ||
| 280 | if(led_index < KEY_LED_COUNT){ // | ||
| 281 | user_led_cur = USER_LED[led_index]; // `struct user_led_t USER_LED[]` is stored globally. | ||
| 282 | } // | ||
| 283 | // | ||
| 284 | if(led_index < KEY_LED_COUNT && user_led_cur.state){ // `user_led_cur` is just for convenience | ||
| 285 | ro = user_led_cur.r; // | ||
| 286 | go = user_led_cur.g; // | ||
| 287 | bo = user_led_cur.b; // | ||
| 288 | } // | ||
| 289 | else if (led_lighting_mode == LED_MODE_KEYS_ONLY && led_cur->scan == 255) | ||
| 290 | { | ||
| 291 | //Do not act on this LED | ||
| 292 | } | ||
| 293 | else if (led_lighting_mode == LED_MODE_NON_KEYS_ONLY && led_cur->scan != 255) | ||
| 294 | { | ||
| 295 | //Do not act on this LED | ||
| 296 | } | ||
| 297 | else if (led_lighting_mode == LED_MODE_INDICATORS_ONLY) | ||
| 298 | { | ||
| 299 | //Do not act on this LED (Only show indicators) | ||
| 300 | } | ||
| 301 | else | ||
| 302 | { | ||
| 303 | //Act on LED | ||
| 304 | for (fcur = 0; fcur < fmax; fcur++) | ||
| 305 | { | ||
| 306 | |||
| 307 | if (led_animation_orientation) | ||
| 308 | { | ||
| 309 | po = led_cur->py; | ||
| 310 | } | ||
| 311 | else | ||
| 312 | { | ||
| 313 | po = led_cur->px; | ||
| 314 | } | ||
| 315 | |||
| 316 | float pomod; | ||
| 317 | pomod = (float)(disp.frame % (uint32_t)(1000.0f / led_animation_speed)) / 10.0f * led_animation_speed; | ||
| 318 | |||
| 319 | //Add in any moving effects | ||
| 320 | if ((!led_animation_direction && f[fcur].ef & EF_SCR_R) || (led_animation_direction && (f[fcur].ef & EF_SCR_L))) | ||
| 321 | { | ||
| 322 | pomod *= 100.0f; | ||
| 323 | pomod = (uint32_t)pomod % 10000; | ||
| 324 | pomod /= 100.0f; | ||
| 325 | |||
| 326 | po -= pomod; | ||
| 327 | |||
| 328 | if (po > 100) po -= 100; | ||
| 329 | else if (po < 0) po += 100; | ||
| 330 | } | ||
| 331 | else if ((!led_animation_direction && f[fcur].ef & EF_SCR_L) || (led_animation_direction && (f[fcur].ef & EF_SCR_R))) | ||
| 332 | { | ||
| 333 | pomod *= 100.0f; | ||
| 334 | pomod = (uint32_t)pomod % 10000; | ||
| 335 | pomod /= 100.0f; | ||
| 336 | po += pomod; | ||
| 337 | |||
| 338 | if (po > 100) po -= 100; | ||
| 339 | else if (po < 0) po += 100; | ||
| 340 | } | ||
| 341 | |||
| 342 | //Check if LED's po is in current frame | ||
| 343 | if (po < f[fcur].hs) continue; | ||
| 344 | if (po > f[fcur].he) continue; | ||
| 345 | //note: < 0 or > 100 continue | ||
| 346 | |||
| 347 | //Calculate the po within the start-stop percentage for color blending | ||
| 348 | po = (po - f[fcur].hs) / (f[fcur].he - f[fcur].hs); | ||
| 349 | |||
| 350 | //Add in any color effects | ||
| 351 | if (f[fcur].ef & EF_OVER) | ||
| 352 | { | ||
| 353 | ro = (po * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; | ||
| 354 | go = (po * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; | ||
| 355 | bo = (po * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; | ||
| 356 | } | ||
| 357 | else if (f[fcur].ef & EF_SUBTRACT) | ||
| 358 | { | ||
| 359 | ro -= (po * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; | ||
| 360 | go -= (po * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; | ||
| 361 | bo -= (po * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; | ||
| 362 | } | ||
| 363 | else | ||
| 364 | { | ||
| 365 | ro += (po * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; | ||
| 366 | go += (po * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; | ||
| 367 | bo += (po * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; | ||
| 368 | } | ||
| 369 | } | ||
| 370 | } | ||
| 371 | |||
| 372 | //Clamp values 0-255 | ||
| 373 | if (ro > 255) ro = 255; else if (ro < 0) ro = 0; | ||
| 374 | if (go > 255) go = 255; else if (go < 0) go = 0; | ||
| 375 | if (bo > 255) bo = 255; else if (bo < 0) bo = 0; | ||
| 376 | |||
| 377 | if (led_animation_breathing) | ||
| 378 | { | ||
| 379 | ro *= breathe_mult; | ||
| 380 | go *= breathe_mult; | ||
| 381 | bo *= breathe_mult; | ||
| 382 | } | ||
| 383 | |||
| 384 | *led_cur->rgb.r = (uint8_t)ro; | ||
| 385 | *led_cur->rgb.g = (uint8_t)go; | ||
| 386 | *led_cur->rgb.b = (uint8_t)bo; | ||
| 387 | |||
| 388 | #ifdef USB_LED_INDICATOR_ENABLE | ||
| 389 | if (keyboard_leds()) | ||
| 390 | { | ||
| 391 | uint8_t kbled = keyboard_leds(); | ||
| 392 | if ( | ||
| 393 | #if USB_LED_NUM_LOCK_SCANCODE != 255 | ||
| 394 | (led_cur->scan == USB_LED_NUM_LOCK_SCANCODE && kbled & (1<<USB_LED_NUM_LOCK)) || | ||
| 395 | #endif //NUM LOCK | ||
| 396 | #if USB_LED_CAPS_LOCK_SCANCODE != 255 | ||
| 397 | (led_cur->scan == USB_LED_CAPS_LOCK_SCANCODE && kbled & (1<<USB_LED_CAPS_LOCK)) || | ||
| 398 | #endif //CAPS LOCK | ||
| 399 | #if USB_LED_SCROLL_LOCK_SCANCODE != 255 | ||
| 400 | (led_cur->scan == USB_LED_SCROLL_LOCK_SCANCODE && kbled & (1<<USB_LED_SCROLL_LOCK)) || | ||
| 401 | #endif //SCROLL LOCK | ||
| 402 | #if USB_LED_COMPOSE_SCANCODE != 255 | ||
| 403 | (led_cur->scan == USB_LED_COMPOSE_SCANCODE && kbled & (1<<USB_LED_COMPOSE)) || | ||
| 404 | #endif //COMPOSE | ||
| 405 | #if USB_LED_KANA_SCANCODE != 255 | ||
| 406 | (led_cur->scan == USB_LED_KANA_SCANCODE && kbled & (1<<USB_LED_KANA)) || | ||
| 407 | #endif //KANA | ||
| 408 | (0)) | ||
| 409 | { | ||
| 410 | if (*led_cur->rgb.r > 127) *led_cur->rgb.r = 0; | ||
| 411 | else *led_cur->rgb.r = 255; | ||
| 412 | if (*led_cur->rgb.g > 127) *led_cur->rgb.g = 0; | ||
| 413 | else *led_cur->rgb.g = 255; | ||
| 414 | if (*led_cur->rgb.b > 127) *led_cur->rgb.b = 0; | ||
| 415 | else *led_cur->rgb.b = 255; | ||
| 416 | } | ||
| 417 | } | ||
| 418 | #endif //USB_LED_INDICATOR_ENABLE | ||
| 419 | |||
| 420 | led_cur++; | ||
| 421 | led_this_run++; | ||
| 422 | } | ||
| 423 | } | ||
| 424 | |||
| 425 | #define KEY_STROKES_LENGTH 20 | ||
| 426 | struct { | ||
| 427 | bool alive; | ||
| 428 | uint8_t led_id; | ||
| 429 | uint32_t time; | ||
| 430 | } KEY_STROKES[KEY_STROKES_LENGTH] = {{}}; | ||
| 431 | |||
| 432 | |||
| 433 | |||
| 434 | |||
| 435 | void set_led_rgb(uint8_t led_id, uint8_t r, uint8_t g, uint8_t b){ | ||
| 436 | issi3733_led_t *target_led = (led_map + led_id); | ||
| 437 | *target_led->rgb.r = r; | ||
| 438 | *target_led->rgb.g = g; | ||
| 439 | *target_led->rgb.b = b; | ||
| 440 | } | ||
| 441 | |||
| 442 | |||
| 443 | uint8_t DISTANCE_FROM_LAST_KEYSTROKE[KEY_LED_COUNT+1]; | ||
| 444 | void calculate_keystroke_distance(void){ | ||
| 445 | bool alive; | ||
| 446 | uint8_t led_id, period_passed; | ||
| 447 | uint32_t t; | ||
| 448 | |||
| 449 | |||
| 450 | for(uint8_t i = 0; i <= KEY_LED_COUNT; ++i){ | ||
| 451 | DISTANCE_FROM_LAST_KEYSTROKE[i] = 0; | ||
| 452 | } | ||
| 453 | |||
| 454 | for(uint8_t i = 0; i < KEY_STROKES_LENGTH; ++i){ | ||
| 455 | if(KEY_STROKES[i].alive){ | ||
| 456 | t = timer_elapsed32(KEY_STROKES[i].time); | ||
| 457 | alive = 0; | ||
| 458 | led_id = KEY_STROKES[i].led_id; | ||
| 459 | period_passed = t / USER_CONFIG.WAVE_PERIOD; | ||
| 460 | |||
| 461 | uint8_t delta_period; | ||
| 462 | for(uint8_t j = 1; j <= KEY_LED_COUNT; ++j){ | ||
| 463 | delta_period = period_passed - DISTANCE_MAP[led_id][j]; | ||
| 464 | if(( delta_period < USER_CONFIG.WAVE_FRONT_WIDTH) && ( | ||
| 465 | DISTANCE_MAP[led_id][j] <= USER_CONFIG.TRAVEL_DISTANCE | ||
| 466 | )){ | ||
| 467 | switch(USER_CONFIG.PATTERN_INDEX){ | ||
| 468 | case 3: | ||
| 469 | case 4: | ||
| 470 | case 5: | ||
| 471 | case 6: | ||
| 472 | DISTANCE_FROM_LAST_KEYSTROKE[j] += delta_period; | ||
| 473 | break; | ||
| 474 | default: | ||
| 475 | DISTANCE_FROM_LAST_KEYSTROKE[j] = 1; | ||
| 476 | break; | ||
| 477 | } | ||
| 478 | alive = 1; | ||
| 479 | } | ||
| 480 | } | ||
| 481 | KEY_STROKES[i].alive = alive; | ||
| 482 | } | ||
| 483 | } | ||
| 484 | } | ||
| 485 | |||
| 486 | #define COLOR_PATTERN_RGB_COUNT 18 | ||
| 487 | static uint8_t COLOR_PATTERNS[][COLOR_PATTERN_RGB_COUNT][3] = { | ||
| 488 | { // default rainbow color | ||
| 489 | {255, 0, 0}, {255, 0, 0}, {255, 127, 0}, | ||
| 490 | {255, 127, 0}, {255, 255, 0}, {255, 255, 0}, | ||
| 491 | {120, 255, 0}, {120, 255, 0}, { 0, 255, 0}, | ||
| 492 | { 0, 255, 0}, { 0, 255, 120}, { 0, 255, 120}, | ||
| 493 | { 0, 0, 255}, { 0, 0, 255}, { 75, 0, 130}, | ||
| 494 | { 75, 0, 130}, { 43, 0, 130}, { 43, 0, 130}, | ||
| 495 | }, { // light rainbow color | ||
| 496 | {248, 12, 18}, {238, 17, 0}, {255, 51, 17}, | ||
| 497 | {255, 68, 32}, {255, 102, 68}, {255, 153, 51}, | ||
| 498 | {254, 174, 45}, {204, 187, 51}, {208, 195, 16}, | ||
| 499 | {170, 204, 34}, {105, 208, 37}, { 34, 204, 170}, | ||
| 500 | { 18, 189, 185}, { 17, 170, 187}, { 68, 68, 221}, | ||
| 501 | { 51, 17, 187}, { 59, 12, 189}, { 68, 34, 153}, | ||
| 502 | }, { // white flat | ||
| 503 | {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, | ||
| 504 | {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, | ||
| 505 | {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, | ||
| 506 | {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, | ||
| 507 | {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, | ||
| 508 | {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, | ||
| 509 | }, { // white fade, cos curve | ||
| 510 | {255, 255, 255}, {255, 255, 255}, {252, 252, 252}, | ||
| 511 | {247, 247, 247}, {240, 240, 240}, {232, 232, 232}, | ||
| 512 | {221, 221, 221}, {209, 209, 209}, {196, 196, 196}, | ||
| 513 | {181, 181, 181}, {164, 164, 164}, {147, 147, 147}, | ||
| 514 | {128, 128, 128}, {108, 108, 108}, { 88, 88, 88}, | ||
| 515 | { 66, 66, 66}, { 45, 45, 45}, { 23, 23, 23}, | ||
| 516 | }, | ||
| 517 | }; | ||
| 518 | static const uint8_t COLOR_PATTERNS_COUNT = ( | ||
| 519 | sizeof(COLOR_PATTERNS) / sizeof(COLOR_PATTERNS[0])); | ||
| 520 | |||
| 521 | void set_user_led_rgb(uint8_t i, uint8_t r, uint8_t g, uint8_t b){ | ||
| 522 | USER_LED[i-1].state = 1; | ||
| 523 | USER_LED[i-1].r = r; | ||
| 524 | USER_LED[i-1].g = g; | ||
| 525 | USER_LED[i-1].b = b; | ||
| 526 | } | ||
| 527 | void unset_user_led_rgb(uint8_t i){ | ||
| 528 | USER_LED[i-1].state = 0; | ||
| 529 | } | ||
| 530 | void set_indicator_led_rgb(uint8_t i, | ||
| 531 | uint8_t layer, uint8_t r, uint8_t g, uint8_t b){ | ||
| 532 | USER_LED[i-1].state |= 1 << layer; | ||
| 533 | USER_LED[i-1].r = r; | ||
| 534 | USER_LED[i-1].g = g; | ||
| 535 | USER_LED[i-1].b = b; | ||
| 536 | } | ||
| 537 | void unset_indicator_led_rgb(uint8_t i, uint8_t layer){ | ||
| 538 | USER_LED[i-1].state &= ~(1 << layer); | ||
| 539 | } | ||
| 540 | |||
| 541 | void refresh_pattern_indicators(void){ | ||
| 542 | static uint8_t GRV_123456[] = { | ||
| 543 | KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, | ||
| 544 | }; | ||
| 545 | |||
| 546 | if(layer_state >= 0x04){ | ||
| 547 | for(uint8_t i = 0; i < 7; ++i){ | ||
| 548 | if(i == USER_CONFIG.PATTERN_INDEX){ | ||
| 549 | set_indicator_led_rgb(ktli(GRV_123456[i]), 2, 0, 0, 255); | ||
| 550 | } else{ | ||
| 551 | set_indicator_led_rgb(ktli(GRV_123456[i]), 2, 0, 255, 0); | ||
| 552 | } | ||
| 553 | } | ||
| 554 | } else{ | ||
| 555 | for(uint8_t i = 0; i < 7; ++i){ | ||
| 556 | unset_indicator_led_rgb(ktli(GRV_123456[i]), 2); | ||
| 557 | } | ||
| 558 | } | ||
| 559 | } | ||
| 560 | void refresh_color_pattern_indicators(void){ | ||
| 561 | static uint8_t ZXCVBNM_COMM_DOT[] = { | ||
| 562 | KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, | ||
| 563 | }; | ||
| 564 | |||
| 565 | if(layer_state >= 0x04){ | ||
| 566 | uint8_t (*c)[3] = &COLOR_PATTERNS[USER_CONFIG.COLOR_PATTERN_INDEX][0]; | ||
| 567 | for(uint8_t i = 0; i < 9; ++i){ | ||
| 568 | set_indicator_led_rgb(ktli(ZXCVBNM_COMM_DOT[i]), | ||
| 569 | 2, c[i][0], c[i][1], c[i][2]); | ||
| 570 | } | ||
| 571 | } else{ | ||
| 572 | for(uint8_t i = 0; i < 9; ++i){ | ||
| 573 | unset_indicator_led_rgb(ktli(ZXCVBNM_COMM_DOT[i]), 2); | ||
| 574 | } | ||
| 575 | } | ||
| 576 | } | ||
| 577 | |||
| 578 | // Runs constantly in the background, in a loop. | ||
| 579 | void matrix_scan_user(void) { | ||
| 580 | static uint32_t scan_timer = 0; | ||
| 581 | static uint8_t last_layer = 0; | ||
| 582 | |||
| 583 | uint8_t layer = 0; | ||
| 584 | if(layer_state >= 0x04){ | ||
| 585 | layer = 2; | ||
| 586 | } else if(layer_state >= 0x02){ | ||
| 587 | layer = 1; | ||
| 588 | } | ||
| 589 | |||
| 590 | calculate_keystroke_distance(); | ||
| 591 | |||
| 592 | |||
| 593 | #define USE_PATTERN 0 | ||
| 594 | #define BLACK_RGB 1 | ||
| 595 | #define COLOR_RGB 2 | ||
| 596 | uint8_t ci; // color index | ||
| 597 | uint8_t *rgb; | ||
| 598 | uint8_t handle_type; | ||
| 599 | uint8_t distance; | ||
| 600 | for(uint8_t i = 1; i <= KEY_LED_COUNT; ++i){ | ||
| 601 | if(USER_LED[i-1].state >= 2) continue; | ||
| 602 | |||
| 603 | handle_type = USE_PATTERN; | ||
| 604 | distance = DISTANCE_FROM_LAST_KEYSTROKE[i]; | ||
| 605 | |||
| 606 | switch(USER_CONFIG.PATTERN_INDEX){ | ||
| 607 | case 0: handle_type = USE_PATTERN; break; | ||
| 608 | case 1: handle_type = distance ? USE_PATTERN : BLACK_RGB; break; | ||
| 609 | case 2: handle_type = distance ? BLACK_RGB : USE_PATTERN; break; | ||
| 610 | case 3: handle_type = distance ? COLOR_RGB : BLACK_RGB; break; | ||
| 611 | case 4: handle_type = distance ? COLOR_RGB : USE_PATTERN; break; | ||
| 612 | case 5: | ||
| 613 | case 6: handle_type = distance ? COLOR_RGB : USE_PATTERN; break; | ||
| 614 | } | ||
| 615 | switch(handle_type){ | ||
| 616 | case USE_PATTERN: unset_user_led_rgb(i); break; | ||
| 617 | case BLACK_RGB: set_user_led_rgb(i, 0, 0, 0); break; | ||
| 618 | case COLOR_RGB: | ||
| 619 | ci = (DISTANCE_FROM_LAST_KEYSTROKE[i] * COLOR_PATTERN_RGB_COUNT / | ||
| 620 | USER_CONFIG.WAVE_FRONT_WIDTH) % COLOR_PATTERN_RGB_COUNT; | ||
| 621 | rgb = &COLOR_PATTERNS[USER_CONFIG.COLOR_PATTERN_INDEX][ci][0]; | ||
| 622 | |||
| 623 | set_user_led_rgb(i, rgb[0], rgb[1], rgb[2]); | ||
| 624 | break; | ||
| 625 | } | ||
| 626 | } | ||
| 627 | |||
| 628 | |||
| 629 | // could be moved to process_record_user() | ||
| 630 | if(layer != last_layer){ | ||
| 631 | |||
| 632 | static uint8_t QWEASDP[] = { | ||
| 633 | KC_Q, KC_W, KC_E, KC_A, KC_S, KC_D, KC_P, | ||
| 634 | }; | ||
| 635 | static uint8_t YUIOHJKL[] = { | ||
| 636 | KC_Y, KC_U, KC_I, KC_O, KC_H, KC_J, KC_K, KC_L, | ||
| 637 | }; | ||
| 638 | |||
| 639 | switch(last_layer){ | ||
| 640 | case 1: | ||
| 641 | for(uint8_t i = 0; i < 7; ++i){ | ||
| 642 | unset_indicator_led_rgb(ktli(QWEASDP[i]), 1); | ||
| 643 | } | ||
| 644 | break; | ||
| 645 | case 2: | ||
| 646 | for(uint8_t i = 0; i < 6; ++i){ | ||
| 647 | unset_indicator_led_rgb(ktli(QWEASDP[i]), 2); | ||
| 648 | } | ||
| 649 | for(uint8_t i = 0; i < 8; ++i){ | ||
| 650 | unset_indicator_led_rgb(ktli(YUIOHJKL[i]), 2); | ||
| 651 | } | ||
| 652 | unset_indicator_led_rgb(ktli(KC_TAB), 2); | ||
| 653 | unset_indicator_led_rgb(ktli(KC_CAPS), 2); | ||
| 654 | break; | ||
| 655 | } | ||
| 656 | |||
| 657 | |||
| 658 | switch(layer){ | ||
| 659 | case 1: | ||
| 660 | for(uint8_t i = 0; i < 7; ++i){ | ||
| 661 | set_indicator_led_rgb(ktli(QWEASDP[i]), 1, 255, 0, 0); | ||
| 662 | } | ||
| 663 | break; | ||
| 664 | case 2: | ||
| 665 | for(uint8_t i = 0; i < 6; ++i){ | ||
| 666 | set_indicator_led_rgb(ktli(QWEASDP[i]), 2, 0, 255, 0); | ||
| 667 | } | ||
| 668 | for(uint8_t i = 0; i < 8; ++i){ | ||
| 669 | set_indicator_led_rgb(ktli(YUIOHJKL[i]), 2, 0, 255, 0); | ||
| 670 | } | ||
| 671 | set_indicator_led_rgb(ktli(KC_TAB), 2, 0, 255, 0); | ||
| 672 | set_indicator_led_rgb(ktli(KC_CAPS), 2, 0, 255, 0); | ||
| 673 | break; | ||
| 674 | } | ||
| 675 | |||
| 676 | refresh_pattern_indicators(); | ||
| 677 | refresh_color_pattern_indicators(); | ||
| 678 | last_layer = layer; | ||
| 679 | } | ||
| 680 | |||
| 681 | |||
| 682 | switch(layer){ | ||
| 683 | case 0: | ||
| 684 | if(timer_elapsed32(scan_timer) > 2000){ | ||
| 685 | scan_timer = timer_read32(); | ||
| 686 | } else if(timer_elapsed32(scan_timer) > 1000){ | ||
| 687 | // set_user_led_rgb(ktli(KC_F5), 255, 255, 255); | ||
| 688 | } | ||
| 689 | break; | ||
| 690 | case 1: | ||
| 691 | break; | ||
| 692 | case 2: | ||
| 693 | break; | ||
| 694 | } | ||
| 695 | |||
| 696 | }; | ||
| 697 | |||
| 698 | #define MODS_SHIFT (keyboard_report->mods & MOD_BIT(KC_LSHIFT) || keyboard_report->mods & MOD_BIT(KC_RSHIFT)) | ||
| 699 | #define MODS_CTRL (keyboard_report->mods & MOD_BIT(KC_LCTL) || keyboard_report->mods & MOD_BIT(KC_RCTRL)) | ||
| 700 | #define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) | ||
| 701 | |||
| 702 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
| 703 | static uint32_t key_timer; | ||
| 704 | |||
| 705 | |||
| 706 | switch (keycode) { | ||
| 707 | case L_BRI: | ||
| 708 | if (record->event.pressed) { | ||
| 709 | if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX; | ||
| 710 | else gcr_desired += LED_GCR_STEP; | ||
| 711 | if (led_animation_breathing) gcr_breathe = gcr_desired; | ||
| 712 | } | ||
| 713 | return false; | ||
| 714 | case L_BRD: | ||
| 715 | if (record->event.pressed) { | ||
| 716 | if (LED_GCR_STEP > gcr_desired) gcr_desired = 0; | ||
| 717 | else gcr_desired -= LED_GCR_STEP; | ||
| 718 | if (led_animation_breathing) gcr_breathe = gcr_desired; | ||
| 719 | } | ||
| 720 | return false; | ||
| 721 | case L_PTN: | ||
| 722 | if (record->event.pressed) { | ||
| 723 | if (led_animation_id == led_setups_count - 1) led_animation_id = 0; | ||
| 724 | else led_animation_id++; | ||
| 725 | } | ||
| 726 | return false; | ||
| 727 | case L_PTP: | ||
| 728 | if (record->event.pressed) { | ||
| 729 | if (led_animation_id == 0) led_animation_id = led_setups_count - 1; | ||
| 730 | else led_animation_id--; | ||
| 731 | } | ||
| 732 | return false; | ||
| 733 | case L_PSI: | ||
| 734 | if (record->event.pressed) { | ||
| 735 | led_animation_speed += ANIMATION_SPEED_STEP; | ||
| 736 | } | ||
| 737 | return false; | ||
| 738 | case L_PSD: | ||
| 739 | if (record->event.pressed) { | ||
| 740 | led_animation_speed -= ANIMATION_SPEED_STEP; | ||
| 741 | if (led_animation_speed < 0) led_animation_speed = 0; | ||
| 742 | } | ||
| 743 | return false; | ||
| 744 | case L_T_MD: | ||
| 745 | if (record->event.pressed) { | ||
| 746 | led_lighting_mode++; | ||
| 747 | if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL; | ||
| 748 | } | ||
| 749 | return false; | ||
| 750 | case L_T_ONF: | ||
| 751 | if (record->event.pressed) { | ||
| 752 | led_enabled = !led_enabled; | ||
| 753 | I2C3733_Control_Set(led_enabled); | ||
| 754 | } | ||
| 755 | return false; | ||
| 756 | case L_ON: | ||
| 757 | if (record->event.pressed) { | ||
| 758 | led_enabled = 1; | ||
| 759 | I2C3733_Control_Set(led_enabled); | ||
| 760 | } | ||
| 761 | return false; | ||
| 762 | case L_OFF: | ||
| 763 | if (record->event.pressed) { | ||
| 764 | led_enabled = 0; | ||
| 765 | I2C3733_Control_Set(led_enabled); | ||
| 766 | } | ||
| 767 | return false; | ||
| 768 | case L_T_BR: | ||
| 769 | if (record->event.pressed) { | ||
| 770 | led_animation_breathing = !led_animation_breathing; | ||
| 771 | if (led_animation_breathing) { | ||
| 772 | gcr_breathe = gcr_desired; | ||
| 773 | led_animation_breathe_cur = BREATHE_MIN_STEP; | ||
| 774 | breathe_dir = 1; | ||
| 775 | } | ||
| 776 | } | ||
| 777 | return false; | ||
| 778 | case L_T_PTD: | ||
| 779 | if (record->event.pressed) { | ||
| 780 | led_animation_direction = !led_animation_direction; | ||
| 781 | } | ||
| 782 | return false; | ||
| 783 | case U_T_AUTO: | ||
| 784 | if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { | ||
| 785 | TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); | ||
| 786 | } | ||
| 787 | return false; | ||
| 788 | case U_T_AGCR: | ||
| 789 | if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { | ||
| 790 | TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); | ||
| 791 | } | ||
| 792 | return false; | ||
| 793 | case DBG_TOG: | ||
| 794 | if (record->event.pressed) { | ||
| 795 | TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); | ||
| 796 | } | ||
| 797 | return false; | ||
| 798 | case DBG_MTRX: | ||
| 799 | if (record->event.pressed) { | ||
| 800 | TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); | ||
| 801 | } | ||
| 802 | return false; | ||
| 803 | case DBG_KBD: | ||
| 804 | if (record->event.pressed) { | ||
| 805 | TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); | ||
| 806 | } | ||
| 807 | return false; | ||
| 808 | case DBG_MOU: | ||
| 809 | if (record->event.pressed) { | ||
| 810 | TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); | ||
| 811 | } | ||
| 812 | return false; | ||
| 813 | case MD_BOOT: | ||
| 814 | if (record->event.pressed) { | ||
| 815 | key_timer = timer_read32(); | ||
| 816 | } else { | ||
| 817 | if (timer_elapsed32(key_timer) >= 500) { | ||
| 818 | reset_keyboard(); | ||
| 819 | } | ||
| 820 | } | ||
| 821 | return false; | ||
| 822 | |||
| 823 | |||
| 824 | |||
| 825 | |||
| 826 | |||
| 827 | |||
| 828 | |||
| 829 | |||
| 830 | |||
| 831 | |||
| 832 | |||
| 833 | |||
| 834 | |||
| 835 | |||
| 836 | |||
| 837 | |||
| 838 | |||
| 839 | case L_SP_PR: // previous dripple pattern | ||
| 840 | case L_SP_NE: // next dripple pattern | ||
| 841 | if (record->event.pressed) { | ||
| 842 | #define PATTERN_COUNT 7 | ||
| 843 | uint8_t incre = keycode == L_SP_PR ? PATTERN_COUNT-1 : 1; | ||
| 844 | USER_CONFIG.PATTERN_INDEX += incre; | ||
| 845 | USER_CONFIG.PATTERN_INDEX %= PATTERN_COUNT; | ||
| 846 | |||
| 847 | if(USER_CONFIG.PATTERN_INDEX <= 4){ | ||
| 848 | USER_CONFIG.TRAVEL_DISTANCE = 25; | ||
| 849 | USER_CONFIG.COLOR_PATTERN_INDEX = 0; | ||
| 850 | USER_CONFIG.WAVE_PERIOD = 50; | ||
| 851 | } | ||
| 852 | |||
| 853 | switch(USER_CONFIG.PATTERN_INDEX){ | ||
| 854 | case 0: // None | ||
| 855 | break; | ||
| 856 | case 1: // background off, wave on | ||
| 857 | USER_CONFIG.WAVE_FRONT_WIDTH = 2; | ||
| 858 | break; | ||
| 859 | case 2: // background on, wave off | ||
| 860 | USER_CONFIG.WAVE_FRONT_WIDTH = 5; | ||
| 861 | break; | ||
| 862 | case 3: // background off, rainbow wave | ||
| 863 | USER_CONFIG.WAVE_FRONT_WIDTH = 10; | ||
| 864 | break; | ||
| 865 | case 4: // background on, rainbow wave | ||
| 866 | USER_CONFIG.WAVE_FRONT_WIDTH = 10; | ||
| 867 | break; | ||
| 868 | case 5: | ||
| 869 | USER_CONFIG.WAVE_FRONT_WIDTH = 10; | ||
| 870 | |||
| 871 | USER_CONFIG.COLOR_PATTERN_INDEX = 2; | ||
| 872 | USER_CONFIG.TRAVEL_DISTANCE = 0; | ||
| 873 | USER_CONFIG.WAVE_PERIOD = 100; | ||
| 874 | break; | ||
| 875 | case 6: | ||
| 876 | USER_CONFIG.WAVE_FRONT_WIDTH = 25; | ||
| 877 | |||
| 878 | USER_CONFIG.COLOR_PATTERN_INDEX = 3; | ||
| 879 | USER_CONFIG.TRAVEL_DISTANCE = 2; | ||
| 880 | USER_CONFIG.WAVE_PERIOD = 10; | ||
| 881 | break; | ||
| 882 | } | ||
| 883 | |||
| 884 | // remove effect after changing pattern | ||
| 885 | for(int i = 0; i < KEY_STROKES_LENGTH; ++i){ | ||
| 886 | KEY_STROKES[i].alive = 0; | ||
| 887 | } | ||
| 888 | refresh_pattern_indicators(); | ||
| 889 | refresh_color_pattern_indicators(); | ||
| 890 | } | ||
| 891 | return false; | ||
| 892 | case L_SP_WD: | ||
| 893 | case L_SP_NW: | ||
| 894 | if(record->event.pressed){ | ||
| 895 | short incre = keycode == L_SP_WD ? 1 : -1; | ||
| 896 | USER_CONFIG.WAVE_FRONT_WIDTH += incre; | ||
| 897 | if(USER_CONFIG.WAVE_FRONT_WIDTH < 1){ | ||
| 898 | USER_CONFIG.WAVE_FRONT_WIDTH = 1; | ||
| 899 | } | ||
| 900 | } | ||
| 901 | return false; | ||
| 902 | case L_SP_FA: | ||
| 903 | case L_SP_SL: | ||
| 904 | if(record->event.pressed){ | ||
| 905 | short incre = keycode == L_SP_FA ? -1 : 1; | ||
| 906 | |||
| 907 | USER_CONFIG.WAVE_PERIOD += 10 * incre; | ||
| 908 | if(USER_CONFIG.WAVE_PERIOD < 10){ | ||
| 909 | USER_CONFIG.WAVE_PERIOD = 10; | ||
| 910 | } | ||
| 911 | } | ||
| 912 | return false; | ||
| 913 | // these are the keys not in range 0x04 - 0x52 | ||
| 914 | case L_CP_PR: | ||
| 915 | case L_CP_NX: | ||
| 916 | if(record->event.pressed){ | ||
| 917 | uint8_t incre = keycode == L_CP_PR ? COLOR_PATTERNS_COUNT - 1 : 1; | ||
| 918 | USER_CONFIG.COLOR_PATTERN_INDEX += incre; | ||
| 919 | USER_CONFIG.COLOR_PATTERN_INDEX %= COLOR_PATTERNS_COUNT; | ||
| 920 | refresh_color_pattern_indicators(); | ||
| 921 | } | ||
| 922 | return false; | ||
| 923 | default: | ||
| 924 | if (record->event.pressed){ | ||
| 925 | uint8_t led_id = ktli(keycode); | ||
| 926 | if(led_id){ | ||
| 927 | for(int i = 0; i < KEY_STROKES_LENGTH; ++i){ | ||
| 928 | if(!KEY_STROKES[i].alive){ | ||
| 929 | KEY_STROKES[i].alive = 1; | ||
| 930 | KEY_STROKES[i].led_id = led_id; | ||
| 931 | KEY_STROKES[i].time = timer_read32(); | ||
| 932 | break; | ||
| 933 | } | ||
| 934 | } | ||
| 935 | } | ||
| 936 | } | ||
| 937 | return true; //Process all other keycodes normally | ||
| 938 | } | ||
| 939 | } | ||
