diff options
Diffstat (limited to 'quantum/wpm.c')
| -rw-r--r-- | quantum/wpm.c | 38 | 
1 files changed, 32 insertions, 6 deletions
| diff --git a/quantum/wpm.c b/quantum/wpm.c index da30bd252c..bec419a48e 100644 --- a/quantum/wpm.c +++ b/quantum/wpm.c @@ -19,11 +19,10 @@  // WPM Stuff  static uint8_t  current_wpm = 0; -static uint8_t  latest_wpm  = 0;  static uint16_t wpm_timer   = 0;  // This smoothing is 40 keystrokes -static const float wpm_smoothing = 0.0487; +static const float wpm_smoothing = WPM_SMOOTHING;  void set_current_wpm(uint8_t new_wpm) { current_wpm = new_wpm; } @@ -46,19 +45,46 @@ __attribute__((weak)) bool wpm_keycode_user(uint16_t keycode) {      return false;  } +#ifdef WPM_ALLOW_COUNT_REGRESSION +__attribute__((weak)) uint8_t wpm_regress_count(uint16_t keycode) { +    bool weak_modded = (keycode >= QK_LCTL && keycode < QK_LSFT) || (keycode >= QK_RCTL && keycode < QK_RSFT); + +    if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX) || (keycode >= QK_MODS && keycode <= QK_MODS_MAX)) { +        keycode = keycode & 0xFF; +    } else if (keycode > 0xFF) { +        keycode = 0; +    } +    if (keycode == KC_DEL || keycode == KC_BSPC) { +        if (((get_mods() | get_oneshot_mods()) & MOD_MASK_CTRL) || weak_modded) { +            return WPM_ESTIMATED_WORD_SIZE; +        } else { +            return 1; +        } +    } else { +        return 0; +    } +} +#endif +  void update_wpm(uint16_t keycode) {      if (wpm_keycode(keycode)) {          if (wpm_timer > 0) { -            latest_wpm  = 60000 / timer_elapsed(wpm_timer) / 5; -            current_wpm = (latest_wpm - current_wpm) * wpm_smoothing + current_wpm; +            current_wpm += ((60000 / timer_elapsed(wpm_timer) / WPM_ESTIMATED_WORD_SIZE) - current_wpm) * wpm_smoothing;          }          wpm_timer = timer_read();      } +#ifdef WPM_ALLOW_COUNT_REGRESSION +    uint8_t regress = wpm_regress_count(keycode); +    if (regress) { +        current_wpm -= regress; +        wpm_timer = timer_read(); +    } +#endif  }  void decay_wpm(void) {      if (timer_elapsed(wpm_timer) > 1000) { -        current_wpm = (0 - current_wpm) * wpm_smoothing + current_wpm; -        wpm_timer   = timer_read(); +        current_wpm += (-current_wpm) * wpm_smoothing; +        wpm_timer = timer_read();      }  } | 
