~ruther/qmk_firmware

39d3d92364039b278f8e4db0b1c63eb057ab8016 — Seebs 7 years ago b669d11
Allow multiple process_record() calls per scan

This is particularly relevant for, e.g., the ergodox EZ and
other keyboards with slow scan rates. Without changing the API or
behavior of individual process_record() calls, we allow a
configuration flag to make multiple calls in a single scan.

This will probably have miniscule effects on non-steno users,
and it's not enabled by default for any keyboards. Added note
about it to ergodox README.

Signed-off-by: seebs <seebs@seebs.net>
3 files changed, 25 insertions(+), 0 deletions(-)

M docs/config_options.md
M keyboards/ergodox_ez/readme.md
M tmk_core/common/keyboard.c
M docs/config_options.md => docs/config_options.md +9 -0
@@ 123,6 123,15 @@ If you define these options you will enable the associated feature, which may in
  * how many taps before oneshot toggle is triggered
* `#define IGNORE_MOD_TAP_INTERRUPT`
  * makes it possible to do rolling combos (zx) with keys that convert to other keys on hold
* `#define QMK_KEYS_PER_SCAN 4`
  * Allows sending more than one key per scan. By default, only one key event gets
    sent via `process_record()` per scan. This has little impact on most typing, but
    if you're doing a lot of chords, or your scan rate is slow to begin with, you can
    have some delay in processing key events. Each press and release is a separate
    event. For a keyboard with 1ms or so scan times, even a very fast typist isn't
    going to produce the 500 keystrokes a second needed to actually get more than a
    few ms of delay from this. But if you're doing chording on something with 3-4ms
    scan times? You probably want this.

### RGB Light Configuration


M keyboards/ergodox_ez/readme.md => keyboards/ergodox_ez/readme.md +5 -0
@@ 31,3 31,8 @@ To flash with ´teensy-loader-cli´:

  - Press the Reset button by inserting a paperclip gently into the reset hole
    in the top right corder.

## Settings

You may want to enable QMK_KEYS_PER_SCAN because the Ergodox has a relatively
slow scan rate.

M tmk_core/common/keyboard.c => tmk_core/common/keyboard.c +11 -0
@@ 177,6 177,9 @@ void keyboard_task(void)
    static uint8_t led_status = 0;
    matrix_row_t matrix_row = 0;
    matrix_row_t matrix_change = 0;
#ifdef QMK_KEYS_PER_SCAN
    uint8_t keys_processed = 0;
#endif

    matrix_scan();
    if (is_keyboard_master()) {


@@ 208,6 211,10 @@ void keyboard_task(void)
                        });
                        // record a processed key
                        matrix_prev[r] ^= ((matrix_row_t)1<<c);
#ifdef QMK_KEYS_PER_SCAN
                        // only jump out if we have processed "enough" keys.
                        if (++keys_processed >= QMK_KEYS_PER_SCAN)
#endif
                        // process a key per task call
                        goto MATRIX_LOOP_END;
                    }


@@ 216,6 223,10 @@ void keyboard_task(void)
        }
    }
    // call with pseudo tick event when no real key event.
#ifdef QMK_KEYS_PER_SCAN
    // we can get here with some keys processed now.
    if (!keys_processed)
#endif
    action_exec(TICK);

MATRIX_LOOP_END: