forked from qmk/qmk_firmware
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Word Per Minute calculation feature (qmk#8054)
* Add Word Per Minute calculation feature * Fix copyright info * Remove header from quantum.c, setup overloadable keycode inclusion for WPM, update docs * Simplify logic for keycode filtering * Adding link from summary to wpm_feature info * Update docs/feature_wpm.md Typo in function prototype example in docs Co-Authored-By: James Young <[email protected]> * Add WPM transport via i2c Co-authored-by: James Young <[email protected]>
- Loading branch information
1 parent
d8f3c28
commit bfb2f8e
Showing
8 changed files
with
169 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
# Word Per Minute (WPM) Calculcation | ||
|
||
The WPM feature uses time between keystrokes to compute a rolling average words | ||
per minute rate and makes this available for various uses. | ||
|
||
Enable the WPM system by adding this to your `rules.mk`: | ||
|
||
WPM_ENABLE = yes | ||
|
||
For split keyboards using soft serial, the computed WPM | ||
score will be available on the master AND slave half. | ||
|
||
## Public Functions | ||
|
||
`uint8_t get_current_wpm(void);` | ||
This function returns the current WPM as an unsigned integer. | ||
|
||
|
||
## Customized keys for WPM calc | ||
|
||
By default, the WPM score only includes letters, numbers, space and some | ||
punctuation. If you want to change the set of characters considered as part of | ||
the WPM calculation, you can implement `wpm_keycode_user(uint16_t keycode)` | ||
and return true for any characters you would like included in the calculation, | ||
or false to not count that particular keycode. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* | ||
* Copyright 2020 Richard Sutherland ([email protected]) | ||
* | ||
* This program is free software: you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation, either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#include "wpm.h" | ||
|
||
//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; | ||
|
||
void set_current_wpm(uint8_t new_wpm) { current_wpm = new_wpm; } | ||
|
||
uint8_t get_current_wpm(void) { return current_wpm; } | ||
|
||
bool wpm_keycode(uint16_t keycode) { return wpm_keycode_kb(keycode); } | ||
|
||
__attribute__((weak)) bool wpm_keycode_kb(uint16_t keycode) { return wpm_keycode_user(keycode); } | ||
|
||
__attribute__((weak)) bool wpm_keycode_user(uint16_t keycode) { | ||
|
||
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_A && keycode <= KC_0) || (keycode >= KC_TAB && keycode <= KC_SLASH)) { | ||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
|
||
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; | ||
} | ||
wpm_timer = timer_read(); | ||
} | ||
} | ||
|
||
void decay_wpm(void) { | ||
if (timer_elapsed(wpm_timer) > 1000) { | ||
current_wpm = (0 - current_wpm) * wpm_smoothing + | ||
current_wpm; | ||
wpm_timer = timer_read(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/* | ||
* Copyright 2020 Richard Sutherland ([email protected]) | ||
* | ||
* This program is free software: you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation, either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#pragma once | ||
|
||
#include "quantum.h" | ||
|
||
bool wpm_keycode(uint16_t keycode); | ||
bool wpm_keycode_kb(uint16_t keycode); | ||
bool wpm_keycode_user(uint16_t keycode); | ||
|
||
void set_current_wpm(uint8_t); | ||
uint8_t get_current_wpm(void); | ||
void update_wpm(uint16_t); | ||
|
||
void decay_wpm(void); |