use core::time::Duration;
pub const DEFAULT_DEBOUNCE: Duration = Duration::from_micros(900);
pub const DEFAULT_RELEASE: Duration = Duration::from_millis(150);
pub const DEFAULT_HOLD: Duration = Duration::from_millis(500);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ButtonConfig<D = Duration> {
pub debounce: D,
pub release: D,
pub hold: D,
pub mode: Mode,
}
impl<D> ButtonConfig<D> {
pub fn new(debounce: D, release: D, hold: D, mode: Mode) -> Self {
Self {
debounce,
release,
hold,
mode,
}
}
}
impl Default for ButtonConfig<Duration> {
fn default() -> Self {
Self {
debounce: DEFAULT_DEBOUNCE,
release: DEFAULT_RELEASE,
hold: DEFAULT_HOLD,
mode: Mode::default(),
}
}
}
#[cfg(feature = "embassy")]
impl Default for ButtonConfig<embassy_time::Duration> {
fn default() -> Self {
use embassy_time::Duration;
Self {
debounce: Duration::from_micros(DEFAULT_DEBOUNCE.as_micros() as u64),
release: Duration::from_millis(DEFAULT_RELEASE.as_millis() as u64),
hold: Duration::from_millis(DEFAULT_HOLD.as_millis() as u64),
mode: Mode::default(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Mode {
#[default]
PullUp,
PullDown,
}
impl Mode {
pub const fn is_pullup(&self) -> bool {
matches!(self, Mode::PullUp)
}
pub const fn is_pulldown(&self) -> bool {
!self.is_pullup()
}
}