You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.6 KiB
56 lines
1.6 KiB
/* |
|
* 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);
|
|
|