From f6cac6944cb636f15d9fd5baa4c19120f819edf9 Mon Sep 17 00:00:00 2001 From: Ulf Lilleengen Date: Fri, 21 May 2021 13:06:28 +0200 Subject: [PATCH] Makes it possible to use the ADC with different analog pins --- embassy-nrf/src/saadc.rs | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/embassy-nrf/src/saadc.rs b/embassy-nrf/src/saadc.rs index c1afd00d..660096b4 100644 --- a/embassy-nrf/src/saadc.rs +++ b/embassy-nrf/src/saadc.rs @@ -30,9 +30,9 @@ pub use saadc::{ pub enum Error {} /// One-shot saadc. Continuous sample mode TODO. -pub struct OneShot<'d, T: PositivePin> { +pub struct OneShot<'d> { irq: interrupt::SAADC, - phantom: PhantomData<(&'d mut peripherals::SAADC, &'d mut T)>, + phantom: PhantomData<(&'d mut peripherals::SAADC)>, } /// Used to configure the SAADC peripheral. @@ -66,14 +66,13 @@ impl Default for Config { } } -impl<'d, T: PositivePin> OneShot<'d, T> { +impl<'d> OneShot<'d> { pub fn new( _saadc: impl Unborrow + 'd, irq: impl Unborrow + 'd, - positive_pin: impl Unborrow + 'd, config: Config, ) -> Self { - unborrow!(irq, positive_pin); + unborrow!(irq); let r = unsafe { &*SAADC::ptr() }; @@ -106,11 +105,6 @@ impl<'d, T: PositivePin> OneShot<'d, T> { w }); - // Set positive channel - r.ch[0] - .pselp - .write(|w| w.pselp().variant(positive_pin.channel())); - // Disable all events interrupts r.intenclr.write(|w| unsafe { w.bits(0x003F_FFFF) }); @@ -125,7 +119,7 @@ impl<'d, T: PositivePin> OneShot<'d, T> { } } -impl<'d, T: PositivePin> Drop for OneShot<'d, T> { +impl<'d> Drop for OneShot<'d> { fn drop(&mut self) { let r = self.regs(); r.enable.write(|w| w.enable().disabled()); @@ -133,21 +127,25 @@ impl<'d, T: PositivePin> Drop for OneShot<'d, T> { } pub trait Sample { - type SampleFuture<'a>: Future + 'a + type SampleFuture<'a, T>: Future + 'a where + T: PositivePin + 'a, Self: 'a; - fn sample<'a>(&'a mut self) -> Self::SampleFuture<'a>; + fn sample<'a, T: PositivePin>(&'a mut self, pin: &'a T) -> Self::SampleFuture<'a, T>; } -impl<'d, T: PositivePin> Sample for OneShot<'d, T> { +impl<'d> Sample for OneShot<'d> { #[rustfmt::skip] - type SampleFuture<'a> where Self: 'a = impl Future + 'a; + type SampleFuture<'a, T> where Self: 'a, T: PositivePin + 'a = impl Future + 'a; - fn sample<'a>(&'a mut self) -> Self::SampleFuture<'a> { + fn sample<'a, T: PositivePin>(&'a mut self, pin: &'a T) -> Self::SampleFuture<'a, T> { async move { let r = self.regs(); + // Set positive channel + r.ch[0].pselp.write(|w| w.pselp().variant(pin.channel())); + // Set up the DMA let mut val: i16 = 0; r.result