1pub struct Keypad<'a>(
2 core::slice::Iter<'a, crate::KeyEvent>,
3 Option<embassy_time::Instant>,
4 bool,
5);
6
7#[cfg(test)]
8impl<'a> Keypad<'a> {
9 pub fn new(events: &'a [crate::KeyEvent]) -> Self {
10 let driver = embassy_time::MockDriver::get();
11 driver.reset();
12 Self(events.iter(), None, false)
13 }
14
15 pub fn pending(&mut self) {
16 self.2 = true;
17 }
18
19 pub fn advance_by_millis(&self, millis: u64) {
20 embassy_time::MockDriver::get().advance(embassy_time::Duration::from_millis(millis));
21 }
22}
23
24impl<'a> crate::Keypad for Keypad<'a> {
25 async fn event(&mut self) -> crate::KeyEvent {
26 if self.2 {
27 core::future::pending().await
28 } else {
29 let result = self.0.next().unwrap().clone();
30 self.1.replace(embassy_time::Instant::now());
31
32 result
33 }
34 }
35
36 fn last_pressed(&mut self) -> Option<embassy_time::Duration> {
37 if let Some(last_time_pressed) = self.1 {
38 return Some(embassy_time::Instant::now() - last_time_pressed);
39 }
40 None
41 }
42}
43
44#[cfg(test)]
45mod test {
46 use futures_executor::block_on;
47
48 use crate::Keypad;
49
50 #[test]
51 fn test_keypad() {
52 block_on(async {
53 let mut keypad = super::Keypad::new(&[
54 crate::KeyEvent::Down(crate::Key::Two),
55 crate::KeyEvent::Down(crate::Key::Three),
56 ]);
57
58 assert_eq!(keypad.last_pressed(), None);
59 assert_eq!(keypad.event().await, crate::KeyEvent::Down(crate::Key::Two));
60 assert_eq!(
61 keypad.last_pressed(),
62 Some(embassy_time::Duration::from_secs(0))
63 );
64 assert_eq!(
65 keypad.event().await,
66 crate::KeyEvent::Down(crate::Key::Three)
67 );
68 keypad.advance_by_millis(1000);
69 assert_eq!(
70 keypad.last_pressed(),
71 Some(embassy_time::Duration::from_millis(1000))
72 );
73 });
74 }
75}