gpiote: change port api to directly return futures.
This commit is contained in:
		| @@ -1,6 +1,8 @@ | ||||
| use anyfmt::{panic, *}; | ||||
| use core::cell::Cell; | ||||
| use core::future::Future; | ||||
| use core::ptr; | ||||
| use core::task::{Context, Poll}; | ||||
| use embassy::util::Signal; | ||||
|  | ||||
| use crate::hal::gpio::{Input, Level, Output, Pin, Port}; | ||||
| @@ -201,10 +203,18 @@ impl Gpiote { | ||||
|         }) | ||||
|     } | ||||
|  | ||||
|     pub fn new_port_input<'a, T>(&'a self, pin: Pin<Input<T>>) -> PortInput<'a, T> { | ||||
|     pub fn wait_port_input<'a, T>( | ||||
|         &'a self, | ||||
|         pin: &'a Pin<Input<T>>, | ||||
|         polarity: PortInputPolarity, | ||||
|     ) -> PortInputFuture<'a, T> { | ||||
|         interrupt::free(|_| { | ||||
|             unsafe { INSTANCE = self }; | ||||
|             PortInput { gpiote: self, pin } | ||||
|             PortInputFuture { | ||||
|                 gpiote: self, | ||||
|                 pin, | ||||
|                 polarity, | ||||
|             } | ||||
|         }) | ||||
|     } | ||||
|  | ||||
| @@ -285,29 +295,28 @@ impl Gpiote { | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub struct PortInput<'a, T> { | ||||
| pub struct PortInputFuture<'a, T> { | ||||
|     gpiote: &'a Gpiote, | ||||
|     pin: Pin<Input<T>>, | ||||
|     pin: &'a Pin<Input<T>>, | ||||
|     polarity: PortInputPolarity, | ||||
| } | ||||
|  | ||||
| impl<'a, T> Drop for PortInput<'a, T> { | ||||
| impl<'a, T> Drop for PortInputFuture<'a, T> { | ||||
|     fn drop(&mut self) { | ||||
|         pin_conf(&self.pin).modify(|_, w| w.sense().disabled()); | ||||
|         self.gpiote.port_signals[pin_num(&self.pin)].reset(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl<'a, T> PortInput<'a, T> { | ||||
|     pub async fn wait(&self, polarity: PortInputPolarity) { | ||||
|         pin_conf(&self.pin).modify(|_, w| match polarity { | ||||
| impl<'a, T> Future for PortInputFuture<'a, T> { | ||||
|     type Output = (); | ||||
|  | ||||
|     fn poll(self: core::pin::Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { | ||||
|         pin_conf(&self.pin).modify(|_, w| match self.polarity { | ||||
|             PortInputPolarity::Low => w.sense().low(), | ||||
|             PortInputPolarity::High => w.sense().high(), | ||||
|         }); | ||||
|         self.gpiote.port_signals[pin_num(&self.pin)].wait().await; | ||||
|     } | ||||
|  | ||||
|     pub fn pin(&self) -> &Pin<Input<T>> { | ||||
|         &self.pin | ||||
|         self.gpiote.port_signals[pin_num(&self.pin)].poll_wait(cx) | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user