Velocikey: Match RGB animation speed to typing speed (#3754)
* Draft commit of typing speed RGB control * More information in the readme * Support all RGB animation modes (Fixes #1) * Added support for all RGB light modes to use typing speed Except christmas lights because that is seizure-inducing at high speeds! * Introduced a value range specific to each RGB mode Because some modes are a little too much when running at full speed! * Update readme.md * Update readme.md * Re-arrange typing_speed definitions (Fixes #5) (#6) * Re-arrange variable definitions to avoid including quantum.h from rgblight.c * Fix a compilation error when trying to run make test:all * Tweaks to the typing speed decay rate * Renamed to momentum; moved implementation into dedicated files * Groundwork for toggling momentum on/off (currently always on) * Add EEPROM toggle for momentum-matching * Moved momentum out of RGBLIGHT_ENABLE toggles so it's more generic * Move momentum decay task out of rgblight_task() * Fix missing momentum.h in lufa.c * Experimental LED support (untested) * Draft commit of typing speed RGB control * More information in the readme * Support all RGB animation modes (Fixes #1) * Added support for all RGB light modes to use typing speed Except christmas lights because that is seizure-inducing at high speeds! * Introduced a value range specific to each RGB mode Because some modes are a little too much when running at full speed! * Update readme.md * Update readme.md * Re-arrange typing_speed definitions (Fixes #5) (#6) * Re-arrange variable definitions to avoid including quantum.h from rgblight.c * Fix a compilation error when trying to run make test:all * Tweaks to the typing speed decay rate * Renamed to momentum; moved implementation into dedicated files * Groundwork for toggling momentum on/off (currently always on) * Add EEPROM toggle for momentum-matching * Moved momentum out of RGBLIGHT_ENABLE toggles so it's more generic * Move momentum decay task out of rgblight_task() * Fix missing momentum.h in lufa.c * Added documentation * Renamed feature to velocikey * Reverted readme to original state * Correct the readme title * Updated feature name in the docs * Update EECONFIG name * Add compile-time toggles for velocikey * Update feature documentation * Revert "Merge branch 'led-support' into master" This reverts commit e123ff5febf61639b9a9020748e1c2e2313460ff, reversing changes made to df111a55b9d4929182e16108b1c0ead15b16df97. * Move velocikey EECONFIG definition to depend on VELOCIKEY_ENABLE * Rename decay_task function to decelerate * Apply suggestions from code review Co-Authored-By: chrislewisdev <chris@chrislewisdev.com> * Re-order eeconfig definitions * Apply coding conventions * Apply #ifdef check in lufa.c * Refactored interval time checks into one functionc * Small rename * Fix unused function error for layouts not using all rgb effects * Only update EEPROM if Velocikey is enabled * Incorporate code review feedback * Small adjustment to top-end decay rate * Add Velocikey documentation to table of contents * Bring tetris:default keymap size down by disabling audio
This commit is contained in:
		
							parent
							
								
									9f1d781fcb
								
							
						
					
					
						commit
						c1c5922aae
					
				
					 11 changed files with 158 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -47,6 +47,10 @@ extern backlight_config_t backlight_config;
 | 
			
		|||
#include "process_midi.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef VELOCIKEY_ENABLE
 | 
			
		||||
#include "velocikey.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAPTIC_ENABLE
 | 
			
		||||
    #include "haptic.h"
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -251,6 +255,10 @@ bool process_record_quantum(keyrecord_t *record) {
 | 
			
		|||
    //   return false;
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
  #ifdef VELOCIKEY_ENABLE
 | 
			
		||||
    if (velocikey_enabled() && record->event.pressed) { velocikey_accelerate(); }
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #ifdef TAP_DANCE_ENABLE
 | 
			
		||||
    preprocess_tap_dance(keycode, record);
 | 
			
		||||
  #endif
 | 
			
		||||
| 
						 | 
				
			
			@ -568,7 +576,14 @@ bool process_record_quantum(keyrecord_t *record) {
 | 
			
		|||
  #endif
 | 
			
		||||
    return false;
 | 
			
		||||
  #endif // defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
 | 
			
		||||
    #ifdef PROTOCOL_LUFA
 | 
			
		||||
  #ifdef VELOCIKEY_ENABLE
 | 
			
		||||
    case VLK_TOG:
 | 
			
		||||
      if (record->event.pressed) {
 | 
			
		||||
        velocikey_toggle();
 | 
			
		||||
      }
 | 
			
		||||
      return false;
 | 
			
		||||
  #endif
 | 
			
		||||
  #ifdef PROTOCOL_LUFA
 | 
			
		||||
    case OUT_AUTO:
 | 
			
		||||
      if (record->event.pressed) {
 | 
			
		||||
        set_output(OUTPUT_AUTO);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -422,6 +422,9 @@ enum quantum_keycodes {
 | 
			
		|||
    RGB_MODE_GRADIENT,
 | 
			
		||||
    RGB_MODE_RGBTEST,
 | 
			
		||||
 | 
			
		||||
    //Momentum matching toggle
 | 
			
		||||
    VLK_TOG,
 | 
			
		||||
 | 
			
		||||
    // Left shift, open paren
 | 
			
		||||
    KC_LSPO,
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,9 @@
 | 
			
		|||
#include "rgblight.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "led_tables.h"
 | 
			
		||||
#ifdef VELOCIKEY_ENABLE
 | 
			
		||||
  #include "velocikey.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define _RGBM_SINGLE_STATIC(sym)   RGBLIGHT_MODE_ ## sym,
 | 
			
		||||
#define _RGBM_SINGLE_DYNAMIC(sym)
 | 
			
		||||
| 
						 | 
				
			
			@ -607,6 +610,19 @@ void rgblight_sethsv_at(uint16_t hue, uint8_t sat, uint8_t val, uint8_t index) {
 | 
			
		|||
  rgblight_setrgb_at(tmp_led.r, tmp_led.g, tmp_led.b, index);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(RGBLIGHT_EFFECT_BREATHING) || defined(RGBLIGHT_EFFECT_RAINBOW_MOOD) || defined(RGBLIGHT_EFFECT_RAINBOW_SWIRL) \
 | 
			
		||||
  || defined(RGBLIGHT_EFFECT_SNAKE) || defined(RGBLIGHT_EFFECT_KNIGHT)
 | 
			
		||||
 | 
			
		||||
static uint8_t get_interval_time(const uint8_t* default_interval_address, uint8_t velocikey_min, uint8_t velocikey_max) {
 | 
			
		||||
  return 
 | 
			
		||||
#ifdef VELOCIKEY_ENABLE
 | 
			
		||||
    velocikey_enabled() ? velocikey_match_speed(velocikey_min, velocikey_max) :
 | 
			
		||||
#endif
 | 
			
		||||
    pgm_read_byte(default_interval_address);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void rgblight_setrgb_range(uint8_t r, uint8_t g, uint8_t b, uint8_t start, uint8_t end) {
 | 
			
		||||
  if (!rgblight_config.enable || start < 0 || start >= end || end > RGBLED_NUM) { return; }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -707,6 +723,7 @@ void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void rgblight_task(void) {
 | 
			
		||||
 | 
			
		||||
  if (rgblight_timer_enabled) {
 | 
			
		||||
    // static light mode, do nothing here
 | 
			
		||||
    if ( 1 == 0 ) { //dummy
 | 
			
		||||
| 
						 | 
				
			
			@ -778,7 +795,9 @@ void rgblight_effect_breathing(uint8_t interval) {
 | 
			
		|||
  static uint16_t last_timer = 0;
 | 
			
		||||
  float val;
 | 
			
		||||
 | 
			
		||||
  if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_BREATHING_INTERVALS[interval])) {
 | 
			
		||||
  uint8_t interval_time = get_interval_time(&RGBLED_RAINBOW_SWIRL_INTERVALS[interval / 2], 1, 100);
 | 
			
		||||
  
 | 
			
		||||
  if (timer_elapsed(last_timer) < interval_time) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  last_timer = timer_read();
 | 
			
		||||
| 
						 | 
				
			
			@ -798,7 +817,9 @@ void rgblight_effect_rainbow_mood(uint8_t interval) {
 | 
			
		|||
  static uint16_t current_hue = 0;
 | 
			
		||||
  static uint16_t last_timer = 0;
 | 
			
		||||
 | 
			
		||||
  if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_RAINBOW_MOOD_INTERVALS[interval])) {
 | 
			
		||||
  uint8_t interval_time = get_interval_time(&RGBLED_RAINBOW_MOOD_INTERVALS[interval], 5, 100);
 | 
			
		||||
 | 
			
		||||
  if (timer_elapsed(last_timer) < interval_time) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  last_timer = timer_read();
 | 
			
		||||
| 
						 | 
				
			
			@ -820,7 +841,10 @@ void rgblight_effect_rainbow_swirl(uint8_t interval) {
 | 
			
		|||
  static uint16_t last_timer = 0;
 | 
			
		||||
  uint16_t hue;
 | 
			
		||||
  uint8_t i;
 | 
			
		||||
  if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_RAINBOW_SWIRL_INTERVALS[interval / 2])) {
 | 
			
		||||
 | 
			
		||||
  uint8_t interval_time = get_interval_time(&RGBLED_RAINBOW_SWIRL_INTERVALS[interval / 2], 1, 100);
 | 
			
		||||
 | 
			
		||||
  if (timer_elapsed(last_timer) < interval_time) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  last_timer = timer_read();
 | 
			
		||||
| 
						 | 
				
			
			@ -855,7 +879,10 @@ void rgblight_effect_snake(uint8_t interval) {
 | 
			
		|||
  if (interval % 2) {
 | 
			
		||||
    increment = -1;
 | 
			
		||||
  }
 | 
			
		||||
  if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_SNAKE_INTERVALS[interval / 2])) {
 | 
			
		||||
 | 
			
		||||
  uint8_t interval_time = get_interval_time(&RGBLED_SNAKE_INTERVALS[interval / 2], 1, 200);
 | 
			
		||||
 | 
			
		||||
  if (timer_elapsed(last_timer) < interval_time) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  last_timer = timer_read();
 | 
			
		||||
| 
						 | 
				
			
			@ -892,7 +919,10 @@ const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31};
 | 
			
		|||
 | 
			
		||||
void rgblight_effect_knight(uint8_t interval) {
 | 
			
		||||
  static uint16_t last_timer = 0;
 | 
			
		||||
  if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_KNIGHT_INTERVALS[interval])) {
 | 
			
		||||
 | 
			
		||||
  uint8_t interval_time = get_interval_time(&RGBLED_KNIGHT_INTERVALS[interval], 5, 100);
 | 
			
		||||
 | 
			
		||||
  if (timer_elapsed(last_timer) < interval_time) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  last_timer = timer_read();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										46
									
								
								quantum/velocikey.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								quantum/velocikey.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,46 @@
 | 
			
		|||
#include "velocikey.h"
 | 
			
		||||
#include "timer.h"
 | 
			
		||||
#include "eeconfig.h"
 | 
			
		||||
#include "eeprom.h"
 | 
			
		||||
 | 
			
		||||
#ifndef MIN
 | 
			
		||||
#define MIN(a,b) (((a)<(b))?(a):(b))
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef MAX
 | 
			
		||||
#define MAX(a,b) (((a)>(b))?(a):(b))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define TYPING_SPEED_MAX_VALUE 200
 | 
			
		||||
uint8_t typing_speed = 0;
 | 
			
		||||
 | 
			
		||||
bool velocikey_enabled(void) {
 | 
			
		||||
    return eeprom_read_byte(EECONFIG_VELOCIKEY) == 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void velocikey_toggle(void) {
 | 
			
		||||
    if (velocikey_enabled()) 
 | 
			
		||||
        eeprom_update_byte(EECONFIG_VELOCIKEY, 0);
 | 
			
		||||
    else 
 | 
			
		||||
        eeprom_update_byte(EECONFIG_VELOCIKEY, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void velocikey_accelerate(void) {
 | 
			
		||||
    if (typing_speed < TYPING_SPEED_MAX_VALUE) typing_speed += (TYPING_SPEED_MAX_VALUE / 100);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void velocikey_decelerate(void) {
 | 
			
		||||
  static uint16_t decay_timer = 0;
 | 
			
		||||
 | 
			
		||||
  if (timer_elapsed(decay_timer) > 500 || decay_timer == 0) {
 | 
			
		||||
    if (typing_speed > 0) typing_speed -= 1;
 | 
			
		||||
    //Decay a little faster at half of max speed
 | 
			
		||||
    if (typing_speed > TYPING_SPEED_MAX_VALUE / 2) typing_speed -= 1;
 | 
			
		||||
    //Decay even faster at 3/4 of max speed
 | 
			
		||||
    if (typing_speed > TYPING_SPEED_MAX_VALUE / 4 * 3) typing_speed -= 2;
 | 
			
		||||
    decay_timer = timer_read();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t velocikey_match_speed(uint8_t minValue, uint8_t maxValue) {
 | 
			
		||||
  return MAX(minValue, maxValue - (maxValue - minValue) * ((float)typing_speed / TYPING_SPEED_MAX_VALUE));
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								quantum/velocikey.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								quantum/velocikey.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
#ifndef VELOCIKEY_H
 | 
			
		||||
#define VELOCIKEY_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
bool velocikey_enabled(void);
 | 
			
		||||
void velocikey_toggle(void);
 | 
			
		||||
void velocikey_accelerate(void);
 | 
			
		||||
void velocikey_decelerate(void);
 | 
			
		||||
uint8_t velocikey_match_speed(uint8_t minValue, uint8_t maxValue);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue