From 6e984a8b5e34ba181b0893a929af569a1faef2b6 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Tue, 18 Dec 2018 15:21:25 -0500 Subject: Update to arm_atsam wait and timer routines Microsecond (us) delays are now handled by a busy wait loop according to MCU frequency. This replaces the system counter method which had an overhead of around 12us. TC5 device and supporting routines removed as it was the old us delay counter. wait_ms is now properly a macro to CLK_delay_ms. wait_us is now properly a macro to CLK_delay_us. Removed CLK_get_us as it has no use. All calls to CLK_get_ms() have been replaced by timer_read64() with corrected typing. All calls to CLK_delay_ms() have been replaced by wait_ms(). All calls to CLK_delay_us() have been replaced by wait_us() and timings verified or updated as needed after review on scope. Corrected typing of variables using 64bit ms timer readings if needed. --- keyboards/massdrop/alt/matrix.c | 12 +++--------- keyboards/massdrop/ctrl/matrix.c | 12 +++--------- 2 files changed, 6 insertions(+), 18 deletions(-) (limited to 'keyboards/massdrop') diff --git a/keyboards/massdrop/alt/matrix.c b/keyboards/massdrop/alt/matrix.c index 892d38791..472479d30 100644 --- a/keyboards/massdrop/alt/matrix.c +++ b/keyboards/massdrop/alt/matrix.c @@ -79,8 +79,6 @@ void matrix_init(void) matrix_init_quantum(); } -#define MATRIX_SCAN_DELAY 10 //Delay after setting a col to output (in us) - uint64_t mdebouncing = 0; uint8_t matrix_scan(void) { @@ -89,9 +87,7 @@ uint8_t matrix_scan(void) uint8_t col; uint32_t scans[2]; //PA PB - if (CLK_get_ms() < mdebouncing) return 1; //mdebouncing == 0 when no debouncing active - - //DBG_1_OFF; //Profiling scans + if (timer_read64() < mdebouncing) return 1; //mdebouncing == 0 when no debouncing active memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); //Zero the result buffer @@ -99,7 +95,7 @@ uint8_t matrix_scan(void) { PORT->Group[col_ports[col]].OUTSET.reg = 1 << col_pins[col]; //Set col output - CLK_delay_us(MATRIX_SCAN_DELAY); //Delay for output + wait_us(1); //Delay for output scans[PA] = PORT->Group[PA].IN.reg & row_masks[PA]; //Read PA row pins data scans[PB] = PORT->Group[PB].IN.reg & row_masks[PB]; //Read PB row pins data @@ -132,11 +128,9 @@ uint8_t matrix_scan(void) else { //Begin or extend debounce on change - mdebouncing = CLK_get_ms() + DEBOUNCING_DELAY; + mdebouncing = timer_read64() + DEBOUNCING_DELAY; } - //DBG_1_ON; //Profiling scans - matrix_scan_quantum(); return 1; diff --git a/keyboards/massdrop/ctrl/matrix.c b/keyboards/massdrop/ctrl/matrix.c index 3580577dc..5f1741e58 100644 --- a/keyboards/massdrop/ctrl/matrix.c +++ b/keyboards/massdrop/ctrl/matrix.c @@ -79,8 +79,6 @@ void matrix_init(void) matrix_init_quantum(); } -#define MATRIX_SCAN_DELAY 10 //Delay after setting a col to output (in us) - uint64_t mdebouncing = 0; uint8_t matrix_scan(void) { @@ -89,9 +87,7 @@ uint8_t matrix_scan(void) uint8_t col; uint32_t scans[2]; //PA PB - if (CLK_get_ms() < mdebouncing) return 1; //mdebouncing == 0 when no debouncing active - - //DBG_1_OFF; //Profiling scans + if (timer_read64() < mdebouncing) return 1; //mdebouncing == 0 when no debouncing active memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); //Zero the result buffer @@ -99,7 +95,7 @@ uint8_t matrix_scan(void) { PORT->Group[col_ports[col]].OUTSET.reg = 1 << col_pins[col]; //Set col output - CLK_delay_us(MATRIX_SCAN_DELAY); //Delay for output + wait_us(1); //Delay for output scans[PA] = PORT->Group[PA].IN.reg & row_masks[PA]; //Read PA row pins data scans[PB] = PORT->Group[PB].IN.reg & row_masks[PB]; //Read PB row pins data @@ -132,11 +128,9 @@ uint8_t matrix_scan(void) else { //Begin or extend debounce on change - mdebouncing = CLK_get_ms() + DEBOUNCING_DELAY; + mdebouncing = timer_read64() + DEBOUNCING_DELAY; } - //DBG_1_ON; //Profiling scans - matrix_scan_quantum(); return 1; -- cgit v1.2.3-24-g4f1b From 67adc29aa35719eea2de43bacf9cd5e8b5dfd79e Mon Sep 17 00:00:00 2001 From: fauxpark Date: Fri, 11 Jan 2019 09:50:14 +1100 Subject: Remove empty fn_actions[] --- keyboards/massdrop/alt/keymaps/default/keymap.c | 4 ---- keyboards/massdrop/alt/keymaps/mac/keymap.c | 4 ---- keyboards/massdrop/alt/keymaps/reywood/keymap.c | 4 ---- keyboards/massdrop/ctrl/keymaps/default/keymap.c | 4 ---- keyboards/massdrop/ctrl/keymaps/mac/keymap.c | 4 ---- 5 files changed, 20 deletions(-) (limited to 'keyboards/massdrop') diff --git a/keyboards/massdrop/alt/keymaps/default/keymap.c b/keyboards/massdrop/alt/keymaps/default/keymap.c index a5c443ffc..7ffa53dca 100644 --- a/keyboards/massdrop/alt/keymaps/default/keymap.c +++ b/keyboards/massdrop/alt/keymaps/default/keymap.c @@ -52,10 +52,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ }; -const uint16_t PROGMEM fn_actions[] = { - -}; - // Runs just one time when the keyboard initializes. void matrix_init_user(void) { }; diff --git a/keyboards/massdrop/alt/keymaps/mac/keymap.c b/keyboards/massdrop/alt/keymaps/mac/keymap.c index d6978fd80..9fd4816cc 100644 --- a/keyboards/massdrop/alt/keymaps/mac/keymap.c +++ b/keyboards/massdrop/alt/keymaps/mac/keymap.c @@ -52,10 +52,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ }; -const uint16_t PROGMEM fn_actions[] = { - -}; - // Runs just one time when the keyboard initializes. void matrix_init_user(void) { }; diff --git a/keyboards/massdrop/alt/keymaps/reywood/keymap.c b/keyboards/massdrop/alt/keymaps/reywood/keymap.c index 8b69f0e8e..48b804efe 100644 --- a/keyboards/massdrop/alt/keymaps/reywood/keymap.c +++ b/keyboards/massdrop/alt/keymaps/reywood/keymap.c @@ -52,10 +52,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { - -}; - // Runs just one time when the keyboard initializes. void matrix_init_user(void) { }; diff --git a/keyboards/massdrop/ctrl/keymaps/default/keymap.c b/keyboards/massdrop/ctrl/keymaps/default/keymap.c index 88c1ac312..11597f987 100644 --- a/keyboards/massdrop/ctrl/keymaps/default/keymap.c +++ b/keyboards/massdrop/ctrl/keymaps/default/keymap.c @@ -55,10 +55,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ }; -const uint16_t PROGMEM fn_actions[] = { - -}; - // Runs just one time when the keyboard initializes. void matrix_init_user(void) { }; diff --git a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c index 6c5dfe19c..badb566b3 100644 --- a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c +++ b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c @@ -55,10 +55,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ }; -const uint16_t PROGMEM fn_actions[] = { - -}; - // Runs just one time when the keyboard initializes. void matrix_init_user(void) { }; -- cgit v1.2.3-24-g4f1b From d53432393bc409db0f01a1b668bf3f5fc6bebb4f Mon Sep 17 00:00:00 2001 From: Valen Cheung Date: Fri, 18 Jan 2019 08:57:31 +0800 Subject: [Keymap] added custom led effect keymap.c (#4856) --- .../ctrl/keymaps/responsive_pattern/keymap.c | 939 +++++++++++++++++++++ 1 file changed, 939 insertions(+) create mode 100644 keyboards/massdrop/ctrl/keymaps/responsive_pattern/keymap.c (limited to 'keyboards/massdrop') 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 @@ +#include QMK_KEYBOARD_H + +// uint8_t keyboard_leds(void) +#include + + +#if ISSI3733_LED_COUNT == 119 +# define KEY_LED_COUNT 87 +#elif ISSI3733_LED_COUNT == 105 +# define KEY_LED_COUNT 67 +#endif + +#define min(x, y) (x < y ? x : y) + + +extern issi3733_led_t *lede; +extern issi3733_led_t led_map[]; +extern led_disp_t disp; + +enum ctrl_keycodes { + L_BRI = SAFE_RANGE, //LED Brightness Increase + L_BRD, //LED Brightness Decrease + L_PTN, //LED Pattern Select Next + L_PTP, //LED Pattern Select Previous + L_PSI, //LED Pattern Speed Increase + L_PSD, //LED Pattern Speed Decrease + L_T_MD, //LED Toggle Mode + L_T_ONF, //LED Toggle On / Off + L_ON, //LED On + L_OFF, //LED Off + L_T_BR, //LED Toggle Breath Effect + L_T_PTD, //LED Toggle Scrolling Pattern Direction + U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active + U_T_AGCR, //USB Toggle Automatic GCR control + DBG_TOG, //DEBUG Toggle On / Off + DBG_MTRX, //DEBUG Toggle Matrix Prints + DBG_KBD, //DEBUG Toggle Keyboard Prints + DBG_MOU, //DEBUG Toggle Mouse Prints + MD_BOOT, //Restart into bootloader after hold timeout + + L_SP_PR, //LED Splash Pattern Select Previous + L_SP_NE, //LED Splash Pattern Select Next + + L_SP_WD, //LED Splash Widen Wavefront width + L_SP_NW, //LED Splash Narrow Wavefront width + + L_SP_FA, //LED Splash wave travel speed faster (shorter period) + L_SP_SL, //LED Splash wave travel speed slower (longer period) + + L_CP_PR, //LED Color Pattern Select Previous + L_CP_NX, //LEB Color Pattern Select Next +}; + +#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode +#define ______ KC_TRNS + +keymap_config_t keymap_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + 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, \ + 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, \ + 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, \ + 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_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, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + [1] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, \ + L_T_BR, L_PSD, L_BRI, L_PSI, _______, _______, _______, U_T_AUTO,U_T_AGCR,_______, MO(2), _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \ + L_T_PTD, L_PTP, L_BRD, L_PTN, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, L_T_MD, L_T_ONF, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + L_CP_NX, L_SP_SL, L_SP_WD, L_SP_FA, _______, _______, L_CP_NX, L_SP_SL, L_SP_WD, L_SP_FA, _______, _______, _______, _______, _______, _______, _______, \ + L_CP_PR, L_SP_PR, L_SP_NW, L_SP_NE, _______, _______, L_CP_PR, L_SP_PR, L_SP_NW, L_SP_NE, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + /* + [X] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + */ +}; + +// see: /tmk_core/common/keycode.h +uint8_t KEYCODE_TO_LED_ID[256]; +uint8_t DISTANCE_MAP[KEY_LED_COUNT+1][KEY_LED_COUNT+1]; +struct user_led_t { + uint8_t state; + uint8_t r; + uint8_t g; + uint8_t b; +} USER_LED[KEY_LED_COUNT] = { + +}; + +struct { + uint8_t PATTERN_INDEX; + uint8_t WAVE_FRONT_WIDTH; + uint16_t WAVE_PERIOD; + uint8_t COLOR_PATTERN_INDEX; + uint8_t TRAVEL_DISTANCE; +} USER_CONFIG = { + .PATTERN_INDEX = 1, + .WAVE_FRONT_WIDTH = 3, + .WAVE_PERIOD = 50, + .COLOR_PATTERN_INDEX = 0, + .TRAVEL_DISTANCE = 25, +}; + +uint8_t ktli(uint16_t keycode){ + if(keycode < 256){ + // the array is initialized in `matrix_init_user()` + return KEYCODE_TO_LED_ID[keycode]; + } + switch(keycode){ + // definition of MO(layer): quantum/quantum_keycodes.h: line 614 + case MO(1): return 82; + } + return 0; +}; + +// Runs just one time when the keyboard initializes. +static void init_keycode_to_led_map(void){ + uint16_t LED_MAP[MATRIX_ROWS][MATRIX_COLS] = LAYOUT( + 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, + 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35, + 36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51, + 52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67, +#if KEY_LED_COUNT >= 87 + 68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87 +#endif + ); + + uint16_t key = 0; + for(uint8_t y = 0; y < MATRIX_ROWS; ++y){ + for(uint8_t x = 0; x < MATRIX_COLS; ++x){ + key = keymaps[0][y][x]; + if(key < 256){ + KEYCODE_TO_LED_ID[key] = LED_MAP[y][x]; + } + } + } +} +// https://docs.qmk.fm/#/feature_terminal +#define KEY_POSITION_MAP_ROWS 6 +#define KEY_POSITION_MAP_COLUMNS 20 +static void init_distance_map(void){ + uint16_t KEY_POSITION_MAP[KEY_POSITION_MAP_ROWS][KEY_POSITION_MAP_COLUMNS] = { + { 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, }, + // { 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, }, + { 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, }, + { 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, }, + { 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, }, + { 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, }, + { 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, }, + }; + uint8_t columns = KEY_POSITION_MAP_COLUMNS; + uint8_t rows = KEY_POSITION_MAP_ROWS; + + for(uint8_t y = 0; y < rows; ++y){ + for(uint8_t x = 0; x < columns; ++x){ + uint8_t id1 = ktli(KEY_POSITION_MAP[y][x]); + + for(uint8_t j = y; j < rows; ++j){ + for(uint8_t i = 0; i < columns; ++i){ + uint8_t id2 = ktli(KEY_POSITION_MAP[j][i]); + + if(id1 == id2) continue; + + uint8_t dx = abs(i - x); + uint8_t dy = abs(j - y); + uint8_t dis = dx + dy; + if(i < x && j > y){ + dis -= min(dx, dy); + } + + uint8_t _dis = DISTANCE_MAP[id1][id2]; + if(_dis && _dis <= dis) continue; + DISTANCE_MAP[id1][id2] = dis; + DISTANCE_MAP[id2][id1] = dis; + } + } + } + } +} +void matrix_init_user(void) { + init_keycode_to_led_map(); + init_distance_map(); +}; + +// /tmk_core/protocol/arm_atsam/led_matrix.c: line 244 +uint8_t led_enabled; +float led_animation_speed; +uint8_t led_animation_direction; +uint8_t led_animation_orientation; +uint8_t led_animation_breathing; +uint8_t led_animation_breathe_cur; +uint8_t breathe_step; +uint8_t breathe_dir; +uint64_t led_next_run; + +uint8_t led_animation_id; +uint8_t led_lighting_mode; + +issi3733_led_t *led_cur; +uint8_t led_per_run; +float breathe_mult; + +// overrided /tmk_core/protocol/arm_atsam/led_matrix.c: line 484 +void rgb_matrix_init_user(void){ + led_animation_speed = ANIMATION_SPEED_STEP * 15; + led_per_run = 15; +} + +// overrided /tmk_core/protocol/arm_atsam/led_matrix.c: line 262 +void led_matrix_run(void) +{ + float ro; + float go; + float bo; + float po; + uint8_t led_this_run = 0; + led_setup_t *f = (led_setup_t*)led_setups[led_animation_id]; + + if (led_cur == 0) //Denotes start of new processing cycle in the case of chunked processing + { + led_cur = led_map; + + disp.frame += 1; + + breathe_mult = 1; + + if (led_animation_breathing) + { + led_animation_breathe_cur += breathe_step * breathe_dir; + + if (led_animation_breathe_cur >= BREATHE_MAX_STEP) + breathe_dir = -1; + else if (led_animation_breathe_cur <= BREATHE_MIN_STEP) + breathe_dir = 1; + + //Brightness curve created for 256 steps, 0 - ~98% + breathe_mult = 0.000015 * led_animation_breathe_cur * led_animation_breathe_cur; + if (breathe_mult > 1) breathe_mult = 1; + else if (breathe_mult < 0) breathe_mult = 0; + } + } + + uint8_t fcur = 0; + uint8_t fmax = 0; + + //Frames setup + while (f[fcur].end != 1) + { + fcur++; //Count frames + } + + fmax = fcur; //Store total frames count + + struct user_led_t user_led_cur; + while (led_cur < lede && led_this_run < led_per_run) + { + ro = 0; + go = 0; + bo = 0; + + uint8_t led_index = led_cur - led_map; // only this part differs from the original function. + if(led_index < KEY_LED_COUNT){ // + user_led_cur = USER_LED[led_index]; // `struct user_led_t USER_LED[]` is stored globally. + } // + // + if(led_index < KEY_LED_COUNT && user_led_cur.state){ // `user_led_cur` is just for convenience + ro = user_led_cur.r; // + go = user_led_cur.g; // + bo = user_led_cur.b; // + } // + else if (led_lighting_mode == LED_MODE_KEYS_ONLY && led_cur->scan == 255) + { + //Do not act on this LED + } + else if (led_lighting_mode == LED_MODE_NON_KEYS_ONLY && led_cur->scan != 255) + { + //Do not act on this LED + } + else if (led_lighting_mode == LED_MODE_INDICATORS_ONLY) + { + //Do not act on this LED (Only show indicators) + } + else + { + //Act on LED + for (fcur = 0; fcur < fmax; fcur++) + { + + if (led_animation_orientation) + { + po = led_cur->py; + } + else + { + po = led_cur->px; + } + + float pomod; + pomod = (float)(disp.frame % (uint32_t)(1000.0f / led_animation_speed)) / 10.0f * led_animation_speed; + + //Add in any moving effects + if ((!led_animation_direction && f[fcur].ef & EF_SCR_R) || (led_animation_direction && (f[fcur].ef & EF_SCR_L))) + { + pomod *= 100.0f; + pomod = (uint32_t)pomod % 10000; + pomod /= 100.0f; + + po -= pomod; + + if (po > 100) po -= 100; + else if (po < 0) po += 100; + } + else if ((!led_animation_direction && f[fcur].ef & EF_SCR_L) || (led_animation_direction && (f[fcur].ef & EF_SCR_R))) + { + pomod *= 100.0f; + pomod = (uint32_t)pomod % 10000; + pomod /= 100.0f; + po += pomod; + + if (po > 100) po -= 100; + else if (po < 0) po += 100; + } + + //Check if LED's po is in current frame + if (po < f[fcur].hs) continue; + if (po > f[fcur].he) continue; + //note: < 0 or > 100 continue + + //Calculate the po within the start-stop percentage for color blending + po = (po - f[fcur].hs) / (f[fcur].he - f[fcur].hs); + + //Add in any color effects + if (f[fcur].ef & EF_OVER) + { + ro = (po * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; + go = (po * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; + bo = (po * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; + } + else if (f[fcur].ef & EF_SUBTRACT) + { + ro -= (po * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; + go -= (po * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; + bo -= (po * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; + } + else + { + ro += (po * (f[fcur].re - f[fcur].rs)) + f[fcur].rs;// + 0.5; + go += (po * (f[fcur].ge - f[fcur].gs)) + f[fcur].gs;// + 0.5; + bo += (po * (f[fcur].be - f[fcur].bs)) + f[fcur].bs;// + 0.5; + } + } + } + + //Clamp values 0-255 + if (ro > 255) ro = 255; else if (ro < 0) ro = 0; + if (go > 255) go = 255; else if (go < 0) go = 0; + if (bo > 255) bo = 255; else if (bo < 0) bo = 0; + + if (led_animation_breathing) + { + ro *= breathe_mult; + go *= breathe_mult; + bo *= breathe_mult; + } + + *led_cur->rgb.r = (uint8_t)ro; + *led_cur->rgb.g = (uint8_t)go; + *led_cur->rgb.b = (uint8_t)bo; + +#ifdef USB_LED_INDICATOR_ENABLE + if (keyboard_leds()) + { + uint8_t kbled = keyboard_leds(); + if ( + #if USB_LED_NUM_LOCK_SCANCODE != 255 + (led_cur->scan == USB_LED_NUM_LOCK_SCANCODE && kbled & (1<scan == USB_LED_CAPS_LOCK_SCANCODE && kbled & (1<scan == USB_LED_SCROLL_LOCK_SCANCODE && kbled & (1<scan == USB_LED_COMPOSE_SCANCODE && kbled & (1<scan == USB_LED_KANA_SCANCODE && kbled & (1<rgb.r > 127) *led_cur->rgb.r = 0; + else *led_cur->rgb.r = 255; + if (*led_cur->rgb.g > 127) *led_cur->rgb.g = 0; + else *led_cur->rgb.g = 255; + if (*led_cur->rgb.b > 127) *led_cur->rgb.b = 0; + else *led_cur->rgb.b = 255; + } + } +#endif //USB_LED_INDICATOR_ENABLE + + led_cur++; + led_this_run++; + } +} + +#define KEY_STROKES_LENGTH 20 +struct { + bool alive; + uint8_t led_id; + uint32_t time; +} KEY_STROKES[KEY_STROKES_LENGTH] = {{}}; + + + + +void set_led_rgb(uint8_t led_id, uint8_t r, uint8_t g, uint8_t b){ + issi3733_led_t *target_led = (led_map + led_id); + *target_led->rgb.r = r; + *target_led->rgb.g = g; + *target_led->rgb.b = b; +} + + +uint8_t DISTANCE_FROM_LAST_KEYSTROKE[KEY_LED_COUNT+1]; +void calculate_keystroke_distance(void){ + bool alive; + uint8_t led_id, period_passed; + uint32_t t; + + + for(uint8_t i = 0; i <= KEY_LED_COUNT; ++i){ + DISTANCE_FROM_LAST_KEYSTROKE[i] = 0; + } + + for(uint8_t i = 0; i < KEY_STROKES_LENGTH; ++i){ + if(KEY_STROKES[i].alive){ + t = timer_elapsed32(KEY_STROKES[i].time); + alive = 0; + led_id = KEY_STROKES[i].led_id; + period_passed = t / USER_CONFIG.WAVE_PERIOD; + + uint8_t delta_period; + for(uint8_t j = 1; j <= KEY_LED_COUNT; ++j){ + delta_period = period_passed - DISTANCE_MAP[led_id][j]; + if(( delta_period < USER_CONFIG.WAVE_FRONT_WIDTH) && ( + DISTANCE_MAP[led_id][j] <= USER_CONFIG.TRAVEL_DISTANCE + )){ + switch(USER_CONFIG.PATTERN_INDEX){ + case 3: + case 4: + case 5: + case 6: + DISTANCE_FROM_LAST_KEYSTROKE[j] += delta_period; + break; + default: + DISTANCE_FROM_LAST_KEYSTROKE[j] = 1; + break; + } + alive = 1; + } + } + KEY_STROKES[i].alive = alive; + } + } +} + +#define COLOR_PATTERN_RGB_COUNT 18 +static uint8_t COLOR_PATTERNS[][COLOR_PATTERN_RGB_COUNT][3] = { + { // default rainbow color + {255, 0, 0}, {255, 0, 0}, {255, 127, 0}, + {255, 127, 0}, {255, 255, 0}, {255, 255, 0}, + {120, 255, 0}, {120, 255, 0}, { 0, 255, 0}, + { 0, 255, 0}, { 0, 255, 120}, { 0, 255, 120}, + { 0, 0, 255}, { 0, 0, 255}, { 75, 0, 130}, + { 75, 0, 130}, { 43, 0, 130}, { 43, 0, 130}, + }, { // light rainbow color + {248, 12, 18}, {238, 17, 0}, {255, 51, 17}, + {255, 68, 32}, {255, 102, 68}, {255, 153, 51}, + {254, 174, 45}, {204, 187, 51}, {208, 195, 16}, + {170, 204, 34}, {105, 208, 37}, { 34, 204, 170}, + { 18, 189, 185}, { 17, 170, 187}, { 68, 68, 221}, + { 51, 17, 187}, { 59, 12, 189}, { 68, 34, 153}, + }, { // white flat + {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, + {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, + {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, + {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, + {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, + {255, 255, 255}, {255, 255, 255}, {255, 255, 255}, + }, { // white fade, cos curve + {255, 255, 255}, {255, 255, 255}, {252, 252, 252}, + {247, 247, 247}, {240, 240, 240}, {232, 232, 232}, + {221, 221, 221}, {209, 209, 209}, {196, 196, 196}, + {181, 181, 181}, {164, 164, 164}, {147, 147, 147}, + {128, 128, 128}, {108, 108, 108}, { 88, 88, 88}, + { 66, 66, 66}, { 45, 45, 45}, { 23, 23, 23}, + }, +}; +static const uint8_t COLOR_PATTERNS_COUNT = ( + sizeof(COLOR_PATTERNS) / sizeof(COLOR_PATTERNS[0])); + +void set_user_led_rgb(uint8_t i, uint8_t r, uint8_t g, uint8_t b){ + USER_LED[i-1].state = 1; + USER_LED[i-1].r = r; + USER_LED[i-1].g = g; + USER_LED[i-1].b = b; +} +void unset_user_led_rgb(uint8_t i){ + USER_LED[i-1].state = 0; +} +void set_indicator_led_rgb(uint8_t i, + uint8_t layer, uint8_t r, uint8_t g, uint8_t b){ + USER_LED[i-1].state |= 1 << layer; + USER_LED[i-1].r = r; + USER_LED[i-1].g = g; + USER_LED[i-1].b = b; +} +void unset_indicator_led_rgb(uint8_t i, uint8_t layer){ + USER_LED[i-1].state &= ~(1 << layer); +} + +void refresh_pattern_indicators(void){ + static uint8_t GRV_123456[] = { + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, + }; + + if(layer_state >= 0x04){ + for(uint8_t i = 0; i < 7; ++i){ + if(i == USER_CONFIG.PATTERN_INDEX){ + set_indicator_led_rgb(ktli(GRV_123456[i]), 2, 0, 0, 255); + } else{ + set_indicator_led_rgb(ktli(GRV_123456[i]), 2, 0, 255, 0); + } + } + } else{ + for(uint8_t i = 0; i < 7; ++i){ + unset_indicator_led_rgb(ktli(GRV_123456[i]), 2); + } + } +} +void refresh_color_pattern_indicators(void){ + static uint8_t ZXCVBNM_COMM_DOT[] = { + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, + }; + + if(layer_state >= 0x04){ + uint8_t (*c)[3] = &COLOR_PATTERNS[USER_CONFIG.COLOR_PATTERN_INDEX][0]; + for(uint8_t i = 0; i < 9; ++i){ + set_indicator_led_rgb(ktli(ZXCVBNM_COMM_DOT[i]), + 2, c[i][0], c[i][1], c[i][2]); + } + } else{ + for(uint8_t i = 0; i < 9; ++i){ + unset_indicator_led_rgb(ktli(ZXCVBNM_COMM_DOT[i]), 2); + } + } +} + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + static uint32_t scan_timer = 0; + static uint8_t last_layer = 0; + + uint8_t layer = 0; + if(layer_state >= 0x04){ + layer = 2; + } else if(layer_state >= 0x02){ + layer = 1; + } + + calculate_keystroke_distance(); + + + #define USE_PATTERN 0 + #define BLACK_RGB 1 + #define COLOR_RGB 2 + uint8_t ci; // color index + uint8_t *rgb; + uint8_t handle_type; + uint8_t distance; + for(uint8_t i = 1; i <= KEY_LED_COUNT; ++i){ + if(USER_LED[i-1].state >= 2) continue; + + handle_type = USE_PATTERN; + distance = DISTANCE_FROM_LAST_KEYSTROKE[i]; + + switch(USER_CONFIG.PATTERN_INDEX){ + case 0: handle_type = USE_PATTERN; break; + case 1: handle_type = distance ? USE_PATTERN : BLACK_RGB; break; + case 2: handle_type = distance ? BLACK_RGB : USE_PATTERN; break; + case 3: handle_type = distance ? COLOR_RGB : BLACK_RGB; break; + case 4: handle_type = distance ? COLOR_RGB : USE_PATTERN; break; + case 5: + case 6: handle_type = distance ? COLOR_RGB : USE_PATTERN; break; + } + switch(handle_type){ + case USE_PATTERN: unset_user_led_rgb(i); break; + case BLACK_RGB: set_user_led_rgb(i, 0, 0, 0); break; + case COLOR_RGB: + ci = (DISTANCE_FROM_LAST_KEYSTROKE[i] * COLOR_PATTERN_RGB_COUNT / + USER_CONFIG.WAVE_FRONT_WIDTH) % COLOR_PATTERN_RGB_COUNT; + rgb = &COLOR_PATTERNS[USER_CONFIG.COLOR_PATTERN_INDEX][ci][0]; + + set_user_led_rgb(i, rgb[0], rgb[1], rgb[2]); + break; + } + } + + + // could be moved to process_record_user() + if(layer != last_layer){ + + static uint8_t QWEASDP[] = { + KC_Q, KC_W, KC_E, KC_A, KC_S, KC_D, KC_P, + }; + static uint8_t YUIOHJKL[] = { + KC_Y, KC_U, KC_I, KC_O, KC_H, KC_J, KC_K, KC_L, + }; + + switch(last_layer){ + case 1: + for(uint8_t i = 0; i < 7; ++i){ + unset_indicator_led_rgb(ktli(QWEASDP[i]), 1); + } + break; + case 2: + for(uint8_t i = 0; i < 6; ++i){ + unset_indicator_led_rgb(ktli(QWEASDP[i]), 2); + } + for(uint8_t i = 0; i < 8; ++i){ + unset_indicator_led_rgb(ktli(YUIOHJKL[i]), 2); + } + unset_indicator_led_rgb(ktli(KC_TAB), 2); + unset_indicator_led_rgb(ktli(KC_CAPS), 2); + break; + } + + + switch(layer){ + case 1: + for(uint8_t i = 0; i < 7; ++i){ + set_indicator_led_rgb(ktli(QWEASDP[i]), 1, 255, 0, 0); + } + break; + case 2: + for(uint8_t i = 0; i < 6; ++i){ + set_indicator_led_rgb(ktli(QWEASDP[i]), 2, 0, 255, 0); + } + for(uint8_t i = 0; i < 8; ++i){ + set_indicator_led_rgb(ktli(YUIOHJKL[i]), 2, 0, 255, 0); + } + set_indicator_led_rgb(ktli(KC_TAB), 2, 0, 255, 0); + set_indicator_led_rgb(ktli(KC_CAPS), 2, 0, 255, 0); + break; + } + + refresh_pattern_indicators(); + refresh_color_pattern_indicators(); + last_layer = layer; + } + + + switch(layer){ + case 0: + if(timer_elapsed32(scan_timer) > 2000){ + scan_timer = timer_read32(); + } else if(timer_elapsed32(scan_timer) > 1000){ + // set_user_led_rgb(ktli(KC_F5), 255, 255, 255); + } + break; + case 1: + break; + case 2: + break; + } + +}; + +#define MODS_SHIFT (keyboard_report->mods & MOD_BIT(KC_LSHIFT) || keyboard_report->mods & MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL (keyboard_report->mods & MOD_BIT(KC_LCTL) || keyboard_report->mods & MOD_BIT(KC_RCTRL)) +#define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint32_t key_timer; + + + switch (keycode) { + case L_BRI: + if (record->event.pressed) { + if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX; + else gcr_desired += LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_BRD: + if (record->event.pressed) { + if (LED_GCR_STEP > gcr_desired) gcr_desired = 0; + else gcr_desired -= LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_PTN: + if (record->event.pressed) { + if (led_animation_id == led_setups_count - 1) led_animation_id = 0; + else led_animation_id++; + } + return false; + case L_PTP: + if (record->event.pressed) { + if (led_animation_id == 0) led_animation_id = led_setups_count - 1; + else led_animation_id--; + } + return false; + case L_PSI: + if (record->event.pressed) { + led_animation_speed += ANIMATION_SPEED_STEP; + } + return false; + case L_PSD: + if (record->event.pressed) { + led_animation_speed -= ANIMATION_SPEED_STEP; + if (led_animation_speed < 0) led_animation_speed = 0; + } + return false; + case L_T_MD: + if (record->event.pressed) { + led_lighting_mode++; + if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL; + } + return false; + case L_T_ONF: + if (record->event.pressed) { + led_enabled = !led_enabled; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_ON: + if (record->event.pressed) { + led_enabled = 1; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_OFF: + if (record->event.pressed) { + led_enabled = 0; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_T_BR: + if (record->event.pressed) { + led_animation_breathing = !led_animation_breathing; + if (led_animation_breathing) { + gcr_breathe = gcr_desired; + led_animation_breathe_cur = BREATHE_MIN_STEP; + breathe_dir = 1; + } + } + return false; + case L_T_PTD: + if (record->event.pressed) { + led_animation_direction = !led_animation_direction; + } + return false; + case U_T_AUTO: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); + } + return false; + case U_T_AGCR: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); + } + return false; + case DBG_TOG: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); + } + return false; + case DBG_MTRX: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); + } + return false; + case DBG_KBD: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); + } + return false; + case DBG_MOU: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); + } + return false; + case MD_BOOT: + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 500) { + reset_keyboard(); + } + } + return false; + + + + + + + + + + + + + + + + + + case L_SP_PR: // previous dripple pattern + case L_SP_NE: // next dripple pattern + if (record->event.pressed) { +#define PATTERN_COUNT 7 + uint8_t incre = keycode == L_SP_PR ? PATTERN_COUNT-1 : 1; + USER_CONFIG.PATTERN_INDEX += incre; + USER_CONFIG.PATTERN_INDEX %= PATTERN_COUNT; + + if(USER_CONFIG.PATTERN_INDEX <= 4){ + USER_CONFIG.TRAVEL_DISTANCE = 25; + USER_CONFIG.COLOR_PATTERN_INDEX = 0; + USER_CONFIG.WAVE_PERIOD = 50; + } + + switch(USER_CONFIG.PATTERN_INDEX){ + case 0: // None + break; + case 1: // background off, wave on + USER_CONFIG.WAVE_FRONT_WIDTH = 2; + break; + case 2: // background on, wave off + USER_CONFIG.WAVE_FRONT_WIDTH = 5; + break; + case 3: // background off, rainbow wave + USER_CONFIG.WAVE_FRONT_WIDTH = 10; + break; + case 4: // background on, rainbow wave + USER_CONFIG.WAVE_FRONT_WIDTH = 10; + break; + case 5: + USER_CONFIG.WAVE_FRONT_WIDTH = 10; + + USER_CONFIG.COLOR_PATTERN_INDEX = 2; + USER_CONFIG.TRAVEL_DISTANCE = 0; + USER_CONFIG.WAVE_PERIOD = 100; + break; + case 6: + USER_CONFIG.WAVE_FRONT_WIDTH = 25; + + USER_CONFIG.COLOR_PATTERN_INDEX = 3; + USER_CONFIG.TRAVEL_DISTANCE = 2; + USER_CONFIG.WAVE_PERIOD = 10; + break; + } + + // remove effect after changing pattern + for(int i = 0; i < KEY_STROKES_LENGTH; ++i){ + KEY_STROKES[i].alive = 0; + } + refresh_pattern_indicators(); + refresh_color_pattern_indicators(); + } + return false; + case L_SP_WD: + case L_SP_NW: + if(record->event.pressed){ + short incre = keycode == L_SP_WD ? 1 : -1; + USER_CONFIG.WAVE_FRONT_WIDTH += incre; + if(USER_CONFIG.WAVE_FRONT_WIDTH < 1){ + USER_CONFIG.WAVE_FRONT_WIDTH = 1; + } + } + return false; + case L_SP_FA: + case L_SP_SL: + if(record->event.pressed){ + short incre = keycode == L_SP_FA ? -1 : 1; + + USER_CONFIG.WAVE_PERIOD += 10 * incre; + if(USER_CONFIG.WAVE_PERIOD < 10){ + USER_CONFIG.WAVE_PERIOD = 10; + } + } + return false; + // these are the keys not in range 0x04 - 0x52 + case L_CP_PR: + case L_CP_NX: + if(record->event.pressed){ + uint8_t incre = keycode == L_CP_PR ? COLOR_PATTERNS_COUNT - 1 : 1; + USER_CONFIG.COLOR_PATTERN_INDEX += incre; + USER_CONFIG.COLOR_PATTERN_INDEX %= COLOR_PATTERNS_COUNT; + refresh_color_pattern_indicators(); + } + return false; + default: + if (record->event.pressed){ + uint8_t led_id = ktli(keycode); + if(led_id){ + for(int i = 0; i < KEY_STROKES_LENGTH; ++i){ + if(!KEY_STROKES[i].alive){ + KEY_STROKES[i].alive = 1; + KEY_STROKES[i].led_id = led_id; + KEY_STROKES[i].time = timer_read32(); + break; + } + } + } + } + return true; //Process all other keycodes normally + } +} -- cgit v1.2.3-24-g4f1b