Move velocikey to within rgblight (#22123)

This commit is contained in:
Joel Challis 2023-09-25 17:48:10 +01:00 committed by GitHub
parent 1052c03a5b
commit 339bff6339
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 124 additions and 150 deletions

View file

@ -342,6 +342,10 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
ifeq ($(strip $(RGBLIGHT_DRIVER)), apa102) ifeq ($(strip $(RGBLIGHT_DRIVER)), apa102)
APA102_DRIVER_REQUIRED := yes APA102_DRIVER_REQUIRED := yes
endif endif
ifeq ($(strip $(VELOCIKEY_ENABLE)), yes)
OPT_DEFS += -DVELOCIKEY_ENABLE
endif
endif endif
# Deprecated driver names - do not use # Deprecated driver names - do not use

View file

@ -37,7 +37,6 @@ GENERIC_FEATURES = \
SPACE_CADET \ SPACE_CADET \
SWAP_HANDS \ SWAP_HANDS \
TAP_DANCE \ TAP_DANCE \
VELOCIKEY \
WPM \ WPM \
DYNAMIC_TAPPING_TERM \ DYNAMIC_TAPPING_TERM \
TRI_LAYER TRI_LAYER

View file

@ -126,7 +126,6 @@
* [PS/2 Mouse](feature_ps2_mouse.md) * [PS/2 Mouse](feature_ps2_mouse.md)
* [Split Keyboard](feature_split_keyboard.md) * [Split Keyboard](feature_split_keyboard.md)
* [Stenography](feature_stenography.md) * [Stenography](feature_stenography.md)
* [Velocikey](feature_velocikey.md)
* Keyboard Building * Keyboard Building
* [Easy Maker for One Offs](easy_maker.md) * [Easy Maker for One Offs](easy_maker.md)

View file

@ -552,3 +552,33 @@ In addition to setting the Clipping Range, you can use `RGBLIGHT_LED_MAP` togeth
## Hardware Modification ## Hardware Modification
If your keyboard lacks onboard underglow LEDs, you may often be able to solder on an RGB LED strip yourself. You will need to find an unused pin to wire to the data pin of your LED strip. Some keyboards may break out unused pins from the MCU to make soldering easier. The other two pins, VCC and GND, must also be connected to the appropriate power pins. If your keyboard lacks onboard underglow LEDs, you may often be able to solder on an RGB LED strip yourself. You will need to find an unused pin to wire to the data pin of your LED strip. Some keyboards may break out unused pins from the MCU to make soldering easier. The other two pins, VCC and GND, must also be connected to the appropriate power pins.
## Velocikey
Velocikey is a feature that lets you control the speed of lighting effects (like the Rainbow Swirl effect) with the speed of your typing. The faster you type, the faster the lights will go!
### Usage
For Velocikey to take effect, there are two steps. First, when compiling your keyboard, you'll need to set `VELOCIKEY_ENABLE=yes` in `rules.mk`, e.g.:
```
MOUSEKEY_ENABLE = no
STENO_ENABLE = no
EXTRAKEY_ENABLE = yes
VELOCIKEY_ENABLE = yes
```
Then, while using your keyboard, you need to also turn it on with the `VK_TOGG` keycode, which toggles the feature on and off.
The following light effects will all be controlled by Velocikey when it is enabled:
- RGB Breathing
- RGB Rainbow Mood
- RGB Rainbow Swirl
- RGB Snake
- RGB Knight
Support for LED breathing effects is planned but not available yet.
As long as Velocikey is enabled, it will control the speed regardless of any other speed setting that your RGB lights are currently on.
### Configuration
Velocikey doesn't currently support any configuration via keyboard settings. If you want to adjust something like the speed increase or decay rate, you would need to edit `velocikey.c` and adjust the values there to achieve the kinds of speeds that you like.

View file

@ -1,29 +0,0 @@
# Velocikey
Velocikey is a feature that lets you control the speed of lighting effects (like the Rainbow Swirl effect) with the speed of your typing. The faster you type, the faster the lights will go!
## Usage
For Velocikey to take effect, there are two steps. First, when compiling your keyboard, you'll need to set `VELOCIKEY_ENABLE=yes` in `rules.mk`, e.g.:
```
MOUSEKEY_ENABLE = no
STENO_ENABLE = no
EXTRAKEY_ENABLE = yes
VELOCIKEY_ENABLE = yes
```
Then, while using your keyboard, you need to also turn it on with the `VK_TOGG` keycode, which toggles the feature on and off.
The following light effects will all be controlled by Velocikey when it is enabled:
- RGB Breathing
- RGB Rainbow Mood
- RGB Rainbow Swirl
- RGB Snake
- RGB Knight
Support for LED breathing effects is planned but not available yet.
As long as Velocikey is enabled, it will control the speed regardless of any other speed setting that your RGB lights are currently on.
## Configuration
Velocikey doesn't currently support any configuration via keyboard settings. If you want to adjust something like the speed increase or decay rate, you would need to edit `velocikey.c` and adjust the values there to achieve the kinds of speeds that you like.

View file

@ -112,7 +112,6 @@
* [分割キーボード](ja/feature_split_keyboard.md) * [分割キーボード](ja/feature_split_keyboard.md)
* [速記](ja/feature_stenography.md) * [速記](ja/feature_stenography.md)
* [感熱式プリンタ](ja/feature_thermal_printer.md) * [感熱式プリンタ](ja/feature_thermal_printer.md)
* [Velocikey](ja/feature_velocikey.md)
* QMK の開発 * QMK の開発
* [PR チェックリスト](ja/pr_checklist.md) * [PR チェックリスト](ja/pr_checklist.md)

View file

@ -1,34 +0,0 @@
# Velocikey
<!---
original document: 0.8.147:docs/feature_velocikey.md
git diff 0.8.147 HEAD -- docs/feature_velocikey.md | cat
-->
Velocikey は入力の速度を使って(レインボー渦巻効果のような)ライト効果の速度を制御できる機能です。速く入力すればするほどライトが速くなります!
## 使用法
Velocikey を使うためには、2つのステップがあります。最初に、キーボードをコンパイルする時に、`rules.mk` に `VELOCIKEY_ENABLE=yes` を設定する必要があります。例えば:
```
MOUSEKEY_ENABLE = no
STENO_ENABLE = no
EXTRAKEY_ENABLE = yes
VELOCIKEY_ENABLE = yes
```
次に、キーボードの使用中に、VLK_TOG キーコードを使って Velocikey を有効にする必要もあります。これは機能をオンおよびオフにします。
以下の全てのライト効果が、Velocikey を有効にすることで制御されます:
- RGB 明滅動作
- RGB レインボームード
- RGB レインボー渦巻
- RGB スネーク
- RGB ナイト
LED 明滅動作の効果のサポートは計画されていますがまだ利用できません。
Velocikey が有効になっている限り、現在オンになっている RGB ライトの他の全ての速度設定に関係なく、速度が制御されます。
## 設定
Velocikey は現在のところキーボード設定を介したどのような設定もサポートしません。速度の増加あるいは減少率などを調整したい場合は、`velocikey.c` を編集し、そこで値を調整して、好みの速度を実現する必要があります。

View file

@ -121,7 +121,6 @@
* [分体式键盘](zh-cn/feature_split_keyboard.md) * [分体式键盘](zh-cn/feature_split_keyboard.md)
* [速记](zh-cn/feature_stenography.md) * [速记](zh-cn/feature_stenography.md)
* [热敏打印机](zh-cn/feature_thermal_printer.md) * [热敏打印机](zh-cn/feature_thermal_printer.md)
* [Velocikey](zh-cn/feature_velocikey.md)
* QMK开发 * QMK开发
* [PR Checklist](zh-cn/pr_checklist.md) * [PR Checklist](zh-cn/pr_checklist.md)

View file

@ -57,7 +57,7 @@ void eeconfig_init_quantum(void) {
eeprom_update_byte(EECONFIG_AUDIO, 0xFF); // On by default eeprom_update_byte(EECONFIG_AUDIO, 0xFF); // On by default
eeprom_update_dword(EECONFIG_RGBLIGHT, 0); eeprom_update_dword(EECONFIG_RGBLIGHT, 0);
eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, 0); eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, 0);
eeprom_update_byte(EECONFIG_VELOCIKEY, 0); eeprom_update_byte(EECONFIG_UNUSED, 0);
eeprom_update_byte(EECONFIG_UNICODEMODE, 0); eeprom_update_byte(EECONFIG_UNICODEMODE, 0);
eeprom_update_byte(EECONFIG_STENOMODE, 0); eeprom_update_byte(EECONFIG_STENOMODE, 0);
uint64_t dummy = 0; uint64_t dummy = 0;

View file

@ -39,7 +39,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define EECONFIG_HANDEDNESS (uint8_t *)14 #define EECONFIG_HANDEDNESS (uint8_t *)14
#define EECONFIG_KEYBOARD (uint32_t *)15 #define EECONFIG_KEYBOARD (uint32_t *)15
#define EECONFIG_USER (uint32_t *)19 #define EECONFIG_USER (uint32_t *)19
#define EECONFIG_VELOCIKEY (uint8_t *)23 #define EECONFIG_UNUSED (uint8_t *)23
// Mutually exclusive // Mutually exclusive
#define EECONFIG_LED_MATRIX (uint32_t *)24 #define EECONFIG_LED_MATRIX (uint32_t *)24
#define EECONFIG_RGB_MATRIX (uint64_t *)24 #define EECONFIG_RGB_MATRIX (uint64_t *)24

View file

@ -99,9 +99,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifdef ST7565_ENABLE #ifdef ST7565_ENABLE
# include "st7565.h" # include "st7565.h"
#endif #endif
#ifdef VELOCIKEY_ENABLE
# include "velocikey.h"
#endif
#ifdef VIA_ENABLE #ifdef VIA_ENABLE
# include "via.h" # include "via.h"
#endif #endif
@ -708,12 +705,6 @@ void keyboard_task(void) {
midi_task(); midi_task();
#endif #endif
#ifdef VELOCIKEY_ENABLE
if (velocikey_enabled()) {
velocikey_decelerate();
}
#endif
#ifdef JOYSTICK_ENABLE #ifdef JOYSTICK_ENABLE
joystick_task(); joystick_task();
#endif #endif

View file

@ -68,10 +68,6 @@
# include "process_unicode_common.h" # include "process_unicode_common.h"
#endif #endif
#ifdef VELOCIKEY_ENABLE
# include "velocikey.h"
#endif
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
# ifndef GOODBYE_SONG # ifndef GOODBYE_SONG
# define GOODBYE_SONG SONG(GOODBYE_SOUND) # define GOODBYE_SONG SONG(GOODBYE_SOUND)
@ -288,9 +284,9 @@ bool process_record_quantum(keyrecord_t *record) {
} }
#endif #endif
#ifdef VELOCIKEY_ENABLE #ifdef RGBLIGHT_ENABLE
if (velocikey_enabled() && record->event.pressed) { if (record->event.pressed) {
velocikey_accelerate(); preprocess_rgblight();
} }
#endif #endif

View file

@ -27,9 +27,6 @@
#ifdef EEPROM_ENABLE #ifdef EEPROM_ENABLE
# include "eeprom.h" # include "eeprom.h"
#endif #endif
#ifdef VELOCIKEY_ENABLE
# include "velocikey.h"
#endif
#ifdef RGBLIGHT_SPLIT #ifdef RGBLIGHT_SPLIT
/* for split keyboard */ /* for split keyboard */
@ -199,6 +196,7 @@ void eeconfig_update_rgblight_current(void) {
void eeconfig_update_rgblight_default(void) { void eeconfig_update_rgblight_default(void) {
rgblight_config.enable = 1; rgblight_config.enable = 1;
rgblight_config.velocikey = 0;
rgblight_config.mode = RGBLIGHT_DEFAULT_MODE; rgblight_config.mode = RGBLIGHT_DEFAULT_MODE;
rgblight_config.hue = RGBLIGHT_DEFAULT_HUE; rgblight_config.hue = RGBLIGHT_DEFAULT_HUE;
rgblight_config.sat = RGBLIGHT_DEFAULT_SAT; rgblight_config.sat = RGBLIGHT_DEFAULT_SAT;
@ -211,6 +209,7 @@ void eeconfig_update_rgblight_default(void) {
void eeconfig_debug_rgblight(void) { void eeconfig_debug_rgblight(void) {
dprintf("rgblight_config EEPROM:\n"); dprintf("rgblight_config EEPROM:\n");
dprintf("rgblight_config.enable = %d\n", rgblight_config.enable); dprintf("rgblight_config.enable = %d\n", rgblight_config.enable);
dprintf("rgblight_config.velocikey = %d\n", rgblight_config.velocikey);
dprintf("rghlight_config.mode = %d\n", rgblight_config.mode); dprintf("rghlight_config.mode = %d\n", rgblight_config.mode);
dprintf("rgblight_config.hue = %d\n", rgblight_config.hue); dprintf("rgblight_config.hue = %d\n", rgblight_config.hue);
dprintf("rgblight_config.sat = %d\n", rgblight_config.sat); dprintf("rgblight_config.sat = %d\n", rgblight_config.sat);
@ -689,7 +688,7 @@ void rgblight_sethsv_at(uint8_t hue, uint8_t sat, uint8_t val, uint8_t index) {
static uint8_t get_interval_time(const uint8_t *default_interval_address, uint8_t velocikey_min, uint8_t velocikey_max) { static uint8_t get_interval_time(const uint8_t *default_interval_address, uint8_t velocikey_min, uint8_t velocikey_max) {
return return
# ifdef VELOCIKEY_ENABLE # ifdef VELOCIKEY_ENABLE
velocikey_enabled() ? velocikey_match_speed(velocikey_min, velocikey_max) : rgblight_velocikey_enabled() ? rgblight_velocikey_match_speed(velocikey_min, velocikey_max) :
# endif # endif
pgm_read_byte(default_interval_address); pgm_read_byte(default_interval_address);
} }
@ -1049,7 +1048,7 @@ static void rgblight_effect_dummy(animation_status_t *anim) {
**/ **/
} }
void rgblight_task(void) { void rgblight_timer_task(void) {
if (rgblight_status.timer_enabled) { if (rgblight_status.timer_enabled) {
effect_func_t effect_func = rgblight_effect_dummy; effect_func_t effect_func = rgblight_effect_dummy;
uint16_t interval_time = 2000; // dummy interval uint16_t interval_time = 2000; // dummy interval
@ -1519,3 +1518,61 @@ void rgblight_effect_twinkle(animation_status_t *anim) {
rgblight_set(); rgblight_set();
} }
#endif #endif
void preprocess_rgblight(void) {
#ifdef VELOCIKEY_ENABLE
if (rgblight_velocikey_enabled()) {
rgblight_velocikey_accelerate();
}
#endif
}
void rgblight_task(void) {
#ifdef RGBLIGHT_USE_TIMER
rgblight_timer_task();
#endif
#ifdef VELOCIKEY_ENABLE
if (rgblight_velocikey_enabled()) {
rgblight_velocikey_decelerate();
}
#endif
}
#ifdef VELOCIKEY_ENABLE
# define TYPING_SPEED_MAX_VALUE 200
static uint8_t typing_speed = 0;
bool rgblight_velocikey_enabled(void) {
return rgblight_config.velocikey;
}
void rgblight_velocikey_toggle(void) {
dprintf("rgblight velocikey toggle [EEPROM]: rgblight_config.velocikey = %u\n", !rgblight_config.velocikey);
rgblight_config.velocikey = !rgblight_config.velocikey;
eeconfig_update_rgblight_current();
}
void rgblight_velocikey_accelerate(void) {
if (typing_speed < TYPING_SPEED_MAX_VALUE) typing_speed += (TYPING_SPEED_MAX_VALUE / 100);
}
void rgblight_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 rgblight_velocikey_match_speed(uint8_t minValue, uint8_t maxValue) {
return MAX(minValue, maxValue - (maxValue - minValue) * ((float)typing_speed / TYPING_SPEED_MAX_VALUE));
}
#endif

View file

@ -248,7 +248,8 @@ typedef union {
uint64_t raw; uint64_t raw;
struct { struct {
bool enable : 1; bool enable : 1;
uint8_t mode : 7; bool velocikey : 1;
uint8_t mode : 6;
uint8_t hue : 8; uint8_t hue : 8;
uint8_t sat : 8; uint8_t sat : 8;
uint8_t val : 8; uint8_t val : 8;
@ -385,14 +386,15 @@ void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom);
#define EZ_RGB(val) rgblight_show_solid_color((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF) #define EZ_RGB(val) rgblight_show_solid_color((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF)
void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b); void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b);
#ifdef RGBLIGHT_USE_TIMER void preprocess_rgblight(void);
void rgblight_task(void); void rgblight_task(void);
#ifdef RGBLIGHT_USE_TIMER
void rgblight_timer_init(void); void rgblight_timer_init(void);
void rgblight_timer_enable(void); void rgblight_timer_enable(void);
void rgblight_timer_disable(void); void rgblight_timer_disable(void);
void rgblight_timer_toggle(void); void rgblight_timer_toggle(void);
#else #else
# define rgblight_task()
# define rgblight_timer_init() # define rgblight_timer_init()
# define rgblight_timer_enable() # define rgblight_timer_enable()
# define rgblight_timer_disable() # define rgblight_timer_disable()
@ -446,3 +448,14 @@ void rgblight_effect_alternating(animation_status_t *anim);
void rgblight_effect_twinkle(animation_status_t *anim); void rgblight_effect_twinkle(animation_status_t *anim);
#endif #endif
#ifdef VELOCIKEY_ENABLE
bool rgblight_velocikey_enabled(void);
void rgblight_velocikey_toggle(void);
void rgblight_velocikey_accelerate(void);
void rgblight_velocikey_decelerate(void);
uint8_t rgblight_velocikey_match_speed(uint8_t minValue, uint8_t maxValue);
# define velocikey_enabled rgblight_velocikey_enabled
# define velocikey_toggle rgblight_velocikey_toggle
#endif

View file

@ -1,40 +0,0 @@
#include "velocikey.h"
#include "timer.h"
#include "eeconfig.h"
#include "eeprom.h"
#include "util.h"
#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));
}

View file

@ -1,10 +0,0 @@
#pragma once
#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);