1use core::time::Duration;
2
3pub const DEFAULT_DEBOUNCE: Duration = Duration::from_micros(900);
5pub const DEFAULT_RELEASE: Duration = Duration::from_millis(150);
7pub const DEFAULT_HOLD: Duration = Duration::from_millis(500);
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub struct ButtonConfig<D = Duration> {
13 pub debounce: D,
15 pub release: D,
17 pub hold: D,
19 pub mode: Mode,
21}
22
23impl<D> ButtonConfig<D> {
24 pub fn new(debounce: D, release: D, hold: D, mode: Mode) -> Self {
28 Self {
29 debounce,
30 release,
31 hold,
32 mode,
33 }
34 }
35}
36
37impl Default for ButtonConfig<Duration> {
38 fn default() -> Self {
39 Self {
40 debounce: DEFAULT_DEBOUNCE,
41 release: DEFAULT_RELEASE,
42 hold: DEFAULT_HOLD,
43 mode: Mode::default(),
44 }
45 }
46}
47
48#[cfg(feature = "embassy")]
49impl Default for ButtonConfig<embassy_time::Duration> {
50 fn default() -> Self {
51 use embassy_time::Duration;
52 Self {
54 debounce: Duration::from_micros(DEFAULT_DEBOUNCE.as_micros() as u64),
55 release: Duration::from_millis(DEFAULT_RELEASE.as_millis() as u64),
56 hold: Duration::from_millis(DEFAULT_HOLD.as_millis() as u64),
57 mode: Mode::default(),
58 }
59 }
60}
61
62#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
64pub enum Mode {
65 #[default]
67 PullUp,
68 PullDown,
70}
71
72impl Mode {
73 pub const fn is_pullup(&self) -> bool {
75 matches!(self, Mode::PullUp)
76 }
77
78 pub const fn is_pulldown(&self) -> bool {
80 !self.is_pullup()
81 }
82}