diff --git a/examples/embassy/src/bin/async-gpio.rs b/examples/embassy/src/bin/async-gpio.rs index 2ec3bfe..33b7bf7 100644 --- a/examples/embassy/src/bin/async-gpio.rs +++ b/examples/embassy/src/bin/async-gpio.rs @@ -8,7 +8,7 @@ use embedded_hal::digital::{InputPin, OutputPin, StatefulOutputPin}; use panic_rtt_target as _; use rtt_target::{rprintln, rtt_init_print}; use va108xx_embassy::embassy; -use va108xx_hal::gpio::{handle_interrupt_for_async_gpio, InputPinAsync}; +use va108xx_hal::gpio::{handle_interrupt_for_async_gpio, InputDynPinAsync, InputPinAsync, PinsB}; use va108xx_hal::{ gpio::{DynPin, PinsA}, pac::{self, interrupt}, @@ -41,7 +41,11 @@ pub enum GpioCmdType { } // Declare a bounded channel of 3 u32s. -static CHANNEL: Channel = Channel::new(); +static CHANNEL_PA0_PA1: Channel = Channel::new(); +static CHANNEL_PB22_TO_PB23: Channel = Channel::new(); + +const CHECK_PA0_TO_PA1: bool = true; +const CHECK_PB22_TO_PB23: bool = true; #[embassy_executor::main] async fn main(spawner: Spawner) { @@ -62,24 +66,52 @@ async fn main(spawner: Spawner) { }; let porta = PinsA::new(&mut dp.sysconfig, Some(dp.ioconfig), dp.porta); + let portb = PinsB::new(&mut dp.sysconfig, Some(dp.ioconfig), dp.portb); let led0 = porta.pa10.into_readable_push_pull_output(); - let out = porta.pa0.into_readable_push_pull_output(); - let input = porta.pa1.into_floating_input(); - let mut async_input = InputPinAsync::new(input, pac::Interrupt::OC10); - let out_dyn = out.downgrade(); - let mut led_0_dyn = led0.downgrade(); + let out_pa0 = porta.pa0.into_readable_push_pull_output(); + let in_pa1 = porta.pa1.into_floating_input(); + let out_pb22 = portb.pb22.into_readable_push_pull_output(); + let in_pb23 = portb.pb23.into_floating_input(); - spawner.spawn(output_task(out_dyn)).unwrap(); + let mut in_pa1_async = InputPinAsync::new(in_pa1, pac::Interrupt::OC10); + let out_pa0_dyn = out_pa0.downgrade(); + let mut in_pb23_async = InputPinAsync::new(in_pb23, pac::Interrupt::OC10); + let out_pb22_dyn = out_pb22.downgrade(); + + spawner.spawn(output_task(out_pa0_dyn)).unwrap(); + + if CHECK_PA0_TO_PA1 { + check_pin_to_pin_async_ops(&CHANNEL_PA0_PA1, in_pa1_async); + } + if CHECK_PB22_TO_PB23 { + check_pin_to_pin_async_ops(&CHANNEL_PB22_TO_PB23, in_pb23_async); + } + + rprintln!("Example done, toggling LED0"); + loop { + led0.toggle().unwrap(); + Timer::after(Duration::from_millis(500)).await; + } +} + +async fn check_pin_to_pin_async_ops( + ch: &'static Channel, + async_input: InputDynPinAsync, +) { rprintln!( "sending SetHigh command ({} ms)", Instant::now().as_millis() ); - CHANNEL.send(GpioCmd::new(GpioCmdType::SetHigh, 20)).await; + CHANNEL_PA0_PA1 + .send(GpioCmd::new(GpioCmdType::SetHigh, 20)) + .await; async_input.wait_for_high().await; rprintln!("Input pin is high now ({} ms)", Instant::now().as_millis()); rprintln!("sending SetLow command ({} ms)", Instant::now().as_millis()); - CHANNEL.send(GpioCmd::new(GpioCmdType::SetLow, 20)).await; + CHANNEL_PA0_PA1 + .send(GpioCmd::new(GpioCmdType::SetLow, 20)) + .await; async_input.wait_for_low().await; rprintln!("Input pin is low now ({} ms)", Instant::now().as_millis()); @@ -87,7 +119,7 @@ async fn main(spawner: Spawner) { "sending RisingEdge command ({} ms)", Instant::now().as_millis() ); - CHANNEL + CHANNEL_PA0_PA1 .send(GpioCmd::new(GpioCmdType::RisingEdge, 20)) .await; async_input.wait_for_rising_edge().await; @@ -100,7 +132,7 @@ async fn main(spawner: Spawner) { "sending Falling command ({} ms)", Instant::now().as_millis() ); - CHANNEL + CHANNEL_PA0_PA1 .send(GpioCmd::new(GpioCmdType::FallingEdge, 20)) .await; async_input.wait_for_falling_edge().await; @@ -113,7 +145,7 @@ async fn main(spawner: Spawner) { "sending Falling command ({} ms)", Instant::now().as_millis() ); - CHANNEL + CHANNEL_PA0_PA1 .send(GpioCmd::new(GpioCmdType::FallingEdge, 20)) .await; async_input.wait_for_any_edge().await; @@ -126,7 +158,7 @@ async fn main(spawner: Spawner) { "sending Falling command ({} ms)", Instant::now().as_millis() ); - CHANNEL + CHANNEL_PA0_PA1 .send(GpioCmd::new(GpioCmdType::RisingEdge, 20)) .await; async_input.wait_for_any_edge().await; @@ -134,18 +166,12 @@ async fn main(spawner: Spawner) { "input pin had a rising (any) edge ({} ms)", Instant::now().as_millis() ); - - rprintln!("Example done, toggling LED0"); - loop { - led_0_dyn.toggle().unwrap(); - Timer::after(Duration::from_millis(500)).await; - } } #[embassy_executor::task] async fn output_task(mut out: DynPin) { loop { - let next_cmd = CHANNEL.receive().await; + let next_cmd = CHANNEL_PA0_PA1.receive().await; Timer::after(Duration::from_millis(next_cmd.after_delay.into())).await; match next_cmd.cmd_type { GpioCmdType::SetHigh => {