f946dc6893
Switched the GPIO matrix driver to debouncing using a simple integrator algorithm. Whenever a key is pressed, we now scan at a rate controlled by debounce-scan-period-ms (default 1 ms) until all keys are released, then return to either waiting for an interrupt or polling more slowly. The timers for key press and release can now be controlled separately, so debounce-period is deprecated in favor of debounce-press-ms and debounce-release-ms. Global Kconfig options ZMK_KSCAN_DEBOUNCE_PRESS_MS and ZMK_KSCAN_DEBOUNCE_RELEASE_MS are also added to make these easier to set. Added documentation for debouncing options.
56 lines
1.6 KiB
C
56 lines
1.6 KiB
C
/*
|
|
* Copyright (c) 2021 The ZMK Contributors
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <sys/util.h>
|
|
|
|
#define DEBOUNCE_COUNTER_BITS 14
|
|
#define DEBOUNCE_COUNTER_MAX BIT_MASK(DEBOUNCE_COUNTER_BITS)
|
|
|
|
struct debounce_state {
|
|
bool pressed : 1;
|
|
bool changed : 1;
|
|
uint16_t counter : DEBOUNCE_COUNTER_BITS;
|
|
};
|
|
|
|
struct debounce_config {
|
|
/** Duration a switch must be pressed to latch as pressed. */
|
|
uint32_t debounce_press_ms;
|
|
/** Duration a switch must be released to latch as released. */
|
|
uint32_t debounce_release_ms;
|
|
};
|
|
|
|
/**
|
|
* Debounces one switch.
|
|
*
|
|
* @param state The state for the switch to debounce.
|
|
* @param active Is the switch currently pressed?
|
|
* @param elapsed_ms Time elapsed since the previous update in milliseconds.
|
|
* @param config Debounce settings.
|
|
*/
|
|
void debounce_update(struct debounce_state *state, const bool active, const int elapsed_ms,
|
|
const struct debounce_config *config);
|
|
|
|
/**
|
|
* @returns whether the switch is either latched as pressed or it is potentially
|
|
* pressed but the debouncer has not yet made a decision. If this returns true,
|
|
* the kscan driver should continue to poll quickly.
|
|
*/
|
|
bool debounce_is_active(const struct debounce_state *state);
|
|
|
|
/**
|
|
* @returns whether the switch is latched as pressed.
|
|
*/
|
|
bool debounce_is_pressed(const struct debounce_state *state);
|
|
|
|
/**
|
|
* @returns whether the pressed state of the switch changed in the last call to
|
|
* debounce_update.
|
|
*/
|
|
bool debounce_get_changed(const struct debounce_state *state);
|