1use alloc::rc::{Rc, Weak};
7use core::cell::{Ref, RefCell};
8use core::future::Future;
9use core::mem;
10use core::pin::Pin;
11use core::task::{Context, Poll};
12use core::time::Duration;
13
14use crossbeam_queue::ArrayQueue;
15use futures_util::{stream::Stream, task::AtomicWaker, StreamExt};
16use ignore_result::Ignore;
17use ndless::input::{iter_keys, Key};
18use ndless::prelude::*;
19use ndless::timer::{get_ticks, Ticks, TICKS_PER_SECOND};
20
21use crate::timer::TimerListener;
22
23#[derive(Eq, PartialEq, Copy, Clone, Debug, Hash)]
25pub enum KeyState {
26 Pressed,
27 Released,
28}
29
30#[derive(Eq, PartialEq, Copy, Clone, Debug, Hash)]
32pub struct KeyEvent {
33 pub key: Key,
34 pub state: KeyState,
35 pub tick_at: u32,
37}
38
39struct SharedKeyQueue {
40 queue: ArrayQueue<KeyEvent>,
41 waker: AtomicWaker,
42}
43
44#[derive(Default)]
45struct KeypadListenerInner {
46 queues: RefCell<Vec<Rc<SharedKeyQueue>>>,
47 keys: RefCell<Vec<Key>>,
48}
49
50impl KeypadListenerInner {
51 fn poll(&self) {
52 let mut queues = self.queues.borrow_mut();
53 queues.retain(|queue| Rc::strong_count(queue) > 1);
54 if queues.is_empty() {
55 return;
56 }
57 let mut keys = self.keys.borrow_mut();
58 let mut retain_i = 0;
59 let mut change = false;
60 iter_keys().for_each(|key| {
61 if let Some((i, _)) = keys.iter().enumerate().find(|(_, other)| key == **other) {
62 if i > retain_i {
63 let (beginning, end) = keys.split_at_mut(i);
64 mem::swap(&mut beginning[retain_i], &mut end[0]);
65 }
66 retain_i += 1;
67 } else {
68 change = true;
69 keys.push(key);
70 let tick_at = get_ticks();
71 queues.iter_mut().for_each(|queue| {
72 queue
73 .queue
74 .push(KeyEvent {
75 key,
76 state: KeyState::Pressed,
77 tick_at,
78 })
79 .ignore()
80 });
81 if keys.len() > retain_i + 1 {
82 let (last, beginning) = keys.split_last_mut().unwrap();
83 mem::swap(&mut beginning[retain_i], last);
84 }
85 retain_i += 1;
86 }
87 });
88 let tick_at = get_ticks();
89 for _ in retain_i..keys.len() {
90 change = true;
91 let key = keys.pop().unwrap();
92 queues.iter_mut().for_each(|queue| {
93 queue
94 .queue
95 .push(KeyEvent {
96 key,
97 state: KeyState::Released,
98 tick_at,
99 })
100 .ignore()
101 });
102 }
103 if change {
104 queues.iter_mut().for_each(|queue| queue.waker.wake());
105 }
106 }
107}
108
109pub struct KeypadListener<'a> {
134 timer_listener: Option<&'a TimerListener>,
135 rate: u32,
136 interval: RefCell<Weak<RefCell<dyn Future<Output = ()> + Unpin>>>,
137 inner: Rc<KeypadListenerInner>,
138}
139
140impl<'a> KeypadListener<'a> {
141 pub fn new(timer_listener: &'a TimerListener) -> Self {
146 Self::new_with_hz(timer_listener, 30)
147 }
148 pub fn new_with_hz(timer_listener: &'a TimerListener, hz: u32) -> Self {
151 Self::new_with_ticks(timer_listener, TICKS_PER_SECOND / hz)
152 }
153 pub fn new_with_ms(timer_listener: &'a TimerListener, dur: u32) -> Self {
156 Self::new_with_rate(timer_listener, Duration::from_millis(dur as u64))
157 }
158 pub fn new_with_rate(timer_listener: &'a TimerListener, dur: Duration) -> Self {
161 Self::new_with_ticks(timer_listener, dur.as_ticks())
162 }
163 pub fn new_with_ticks(timer_listener: &'a TimerListener, ticks: u32) -> Self {
166 Self {
167 timer_listener: Some(timer_listener),
168 rate: ticks,
169 interval: RefCell::new(Weak::<RefCell<futures_util::future::Ready<()>>>::new()),
170 inner: Default::default(),
171 }
172 }
173 pub fn new_manually_polled() -> Self {
177 Self {
178 timer_listener: None,
179 rate: 0,
180 interval: RefCell::new(Weak::<RefCell<futures_util::future::Ready<()>>>::new()),
181 inner: Rc::new(Default::default()),
182 }
183 }
184 fn interval(&self) -> Rc<RefCell<dyn Future<Output = ()> + Unpin>> {
185 if let Some(interval) = self.interval.borrow().upgrade() {
186 return interval;
187 }
188 let listener = self.inner.clone();
189 let interval: Rc<RefCell<dyn Future<Output = ()> + Unpin>> =
190 if let Some(timer_listener) = self.timer_listener {
191 Rc::new(RefCell::new(
192 timer_listener.every_ticks(self.rate).for_each(move |_| {
193 listener.poll();
194 futures_util::future::ready(())
195 }),
196 ))
197 } else {
198 Rc::new(RefCell::new(futures_util::future::pending()))
199 };
200 self.interval.replace(Rc::downgrade(&interval));
201 interval
202 }
203 pub fn poll(&self) {
205 self.inner.poll();
206 }
207 pub fn stream(&self) -> KeyStream {
220 let mut queues = self.inner.queues.borrow_mut();
221 let queue = Rc::new(SharedKeyQueue {
222 queue: ArrayQueue::new(100),
223 waker: AtomicWaker::new(),
224 });
225 queues.push(queue.clone());
226 KeyStream {
227 queue,
228 interval: self.interval(),
229 }
230 }
231 pub fn stream_with_buffer(&self, size: usize) -> KeyStream {
241 let mut queues = self.inner.queues.borrow_mut();
242 let queue = Rc::new(SharedKeyQueue {
243 queue: ArrayQueue::new(size),
244 waker: AtomicWaker::new(),
245 });
246 queues.push(queue.clone());
247 KeyStream {
248 queue,
249 interval: self.interval(),
250 }
251 }
252 pub fn list_keys(&self) -> Ref<Vec<Key>> {
257 self.inner.keys.borrow()
258 }
259}
260
261pub struct KeyStream {
278 queue: Rc<SharedKeyQueue>,
279 interval: Rc<RefCell<dyn Future<Output = ()> + Unpin>>,
280}
281
282impl Stream for KeyStream {
283 type Item = KeyEvent;
284
285 fn poll_next(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
286 let mut interval = self.interval.borrow_mut();
287 let _ = Pin::new(&mut *interval).poll(cx);
288 self.queue.waker.register(cx.waker());
289 if let Ok(key) = self.queue.queue.pop() {
290 Poll::Ready(Some(key))
291 } else {
292 Poll::Pending
293 }
294 }
295}