Fix up tap_code functionality (#4609)

* Add delay in Tap Code to avoid issues

I think a few people have reporting issues with it working properly, and it may be a timing issue.  The 'register_code' uses this sort of delay in some of the functions, and
this is probably why.

Adding the 100ms delay should hopefully fix any issues with it.

* Make tap_code delay configurable

* Update documentation

* Bring tap_code16 inline with changes

* Fix type for tap_code16

Bad copy-paste job

* Just use the value check for the define

* Clarify timing in docs

Co-Authored-By: drashna <drashna@live.com>

* Wordsmithing

Co-Authored-By: drashna <drashna@live.com>
This commit is contained in:
Drashna Jaelre 2018-12-14 09:01:58 -08:00 committed by MechMerlin
parent 80dfd34fe4
commit 02d44beb44
6 changed files with 26 additions and 2 deletions

View file

@ -160,6 +160,8 @@ If you define these options you will enable the associated feature, which may in
* Set this to the number of combos that you're using in the [Combo](feature_combo.md) feature. * Set this to the number of combos that you're using in the [Combo](feature_combo.md) feature.
* `#define COMBO_TERM 200` * `#define COMBO_TERM 200`
* how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined. * how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined.
* `#define TAP_CODE_DELAY 100`
* Sets the delay between `register_code` and `unregister_code`, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds.
## RGB Light Configuration ## RGB Light Configuration

View file

@ -250,6 +250,8 @@ Parallel to `register_code` function, this sends the `<kc>` keyup event to the c
This will send `register_code(<kc>)` and then `unregister_code(<kc>)`. This is useful if you want to send both the press and release events ("tap" the key, rather than hold it). This will send `register_code(<kc>)` and then `unregister_code(<kc>)`. This is useful if you want to send both the press and release events ("tap" the key, rather than hold it).
If you're having issues with taps (un)registering, you can add a delay between the register and unregister events by setting `#define TAP_CODE_DELAY 100` in your `config.h` file. The value is in milliseconds.
### `clear_keyboard();` ### `clear_keyboard();`
This will clear all mods and keys currently pressed. This will clear all mods and keys currently pressed.

View file

@ -132,6 +132,14 @@ void unregister_code16 (uint16_t code) {
} }
} }
void tap_code16(uint16_t code) {
register_code16(code);
#if TAP_CODE_DELAY > 0
wait_ms(TAP_CODE_DELAY);
#endif
unregister_code16(code);
}
__attribute__ ((weak)) __attribute__ ((weak))
bool process_action_kb(keyrecord_t *record) { bool process_action_kb(keyrecord_t *record) {
return true; return true;

View file

@ -243,7 +243,7 @@ void shutdown_user(void);
void register_code16(uint16_t code); void register_code16(uint16_t code);
void unregister_code16(uint16_t code); void unregister_code16(uint16_t code);
inline void tap_code16(uint16_t code) { register_code16(code); unregister_code16(code); } void tap_code16(uint16_t code);
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
void backlight_init_ports(void); void backlight_init_ports(void);

View file

@ -847,6 +847,18 @@ void unregister_code(uint8_t code)
#endif #endif
} }
/** \brief Utilities for actions. (FIXME: Needs better description)
*
* FIXME: Needs documentation.
*/
void tap_code(uint8_t code) {
register_code(code);
#if TAP_CODE_DELAY > 0
wait_ms(TAP_CODE_DELAY);
#endif
unregister_code(code);
}
/** \brief Utilities for actions. (FIXME: Needs better description) /** \brief Utilities for actions. (FIXME: Needs better description)
* *
* FIXME: Needs documentation. * FIXME: Needs documentation.

View file

@ -88,7 +88,7 @@ void process_record(keyrecord_t *record);
void process_action(keyrecord_t *record, action_t action); void process_action(keyrecord_t *record, action_t action);
void register_code(uint8_t code); void register_code(uint8_t code);
void unregister_code(uint8_t code); void unregister_code(uint8_t code);
inline void tap_code(uint8_t code) { register_code(code); unregister_code(code); } void tap_code(uint8_t code);
void register_mods(uint8_t mods); void register_mods(uint8_t mods);
void unregister_mods(uint8_t mods); void unregister_mods(uint8_t mods);
//void set_mods(uint8_t mods); //void set_mods(uint8_t mods);