diff --git a/examples/ads1256/src/bin/multiplex.rs b/examples/ads1256/src/bin/multiplex.rs index d35a011..df5a1ac 100644 --- a/examples/ads1256/src/bin/multiplex.rs +++ b/examples/ads1256/src/bin/multiplex.rs @@ -33,8 +33,8 @@ use embassy_stm32::peripherals::{EXTI6, PF6, PF7, SPI3}; use embassy_sync::blocking_mutex::raw::NoopRawMutex; use embassy_sync::pubsub::PubSubChannel; use physical_ads1256::{standard_input, SingleEnded}; -use physical_node::transducer::input::RawStatePubInput; -use physical_node::transducer::Publisher; +use physical_node::transducer::input::StatefulPublisher; +use physical_node::transducer::Publish; const AUTOCAL_CONF: Config = Config { status: Status::setting(Buffer::Enabled, AutoCal::Enabled, BitOrder::MostSigFirst), @@ -58,9 +58,9 @@ impl ads1256::BlockingDelay for Ads1256Delay { } struct Inputs { - ai1: RawStatePubInput, - ai2: RawStatePubInput, - ai3: RawStatePubInput, + ai1: StatefulPublisher, + ai2: StatefulPublisher, + ai3: StatefulPublisher, } // Inputs @@ -101,17 +101,17 @@ async fn main(spawner: Spawner) { let ads_1256 = ADS_1256.init(Ads1256::new(Ads1256Delay, select_ads1256, ads1256_data_ready)); let inputs = &*ANALOG_INPUTS.init(Inputs { - ai1: RawStatePubInput::new( - Cell::new(f32::ElectricPotential::new::(-1000.0)), - PubSubChannel::new(), + ai1: StatefulPublisher::new( + Cell::new(f32::ElectricPotential::new::(-1000.0)).into(), + PubSubChannel::new().into(), ), - ai2: RawStatePubInput::new( - Cell::new(f32::ElectricPotential::new::(-1000.0)), - PubSubChannel::new(), + ai2: StatefulPublisher::new( + Cell::new(f32::ElectricPotential::new::(-1000.0)).into(), + PubSubChannel::new().into(), ), - ai3: RawStatePubInput::new( - Cell::new(f32::ElectricPotential::new::(-1000.0)), - PubSubChannel::new(), + ai3: StatefulPublisher::new( + Cell::new(f32::ElectricPotential::new::(-1000.0)).into(), + PubSubChannel::new().into(), ), }); diff --git a/node/src/transducer/input.rs b/node/src/transducer/input.rs index 43f0885..dedbf72 100644 --- a/node/src/transducer/input.rs +++ b/node/src/transducer/input.rs @@ -1,105 +1,68 @@ use crate::cell::CellView; -use crate::transducer::Publisher; +use crate::transducer::{Publish, Publisher}; use core::cell::Cell; #[cfg(feature = "embassy-sync")] use embassy_sync::blocking_mutex::raw::RawMutex; #[cfg(feature = "embassy-sync")] -use embassy_sync::pubsub::PubSubChannel; -use embassy_sync::pubsub::{Error, PubSubBehavior, Subscriber}; +use embassy_sync::pubsub::{Error, PubSubChannel, Subscriber}; pub use physical::transducer::input::*; -use physical::transducer::Stateful; +use physical::transducer::{State, Stateful}; #[cfg(feature = "embassy-sync")] -pub struct RawPublishInput -{ - pub channel: PubSubChannel, -} - -impl - RawPublishInput -{ - #[inline(always)] - pub fn new(channel: PubSubChannel) -> Self { - Self { channel } - } - - #[inline(always)] - pub fn update(&self, value: T) { - self.channel.publish_immediate(value); - } -} - -impl - Publisher for RawPublishInput -{ - type Value = T; - type Mutex = MutexT; - - #[inline(always)] - fn subscribe( - &self, - ) -> Result, Error> { - self.channel.subscriber() - } -} - -#[cfg(feature = "embassy-sync")] -pub struct RawStatePubInput< +pub struct StatefulPublisher< T: Copy, MutexT: RawMutex, const CAPACITY: usize, const NUM_SUBS: usize, > { - pub state_cell: Cell, - pub channel: PubSubChannel, + pub state: State, + pub publisher: Publisher, } impl - RawStatePubInput + StatefulPublisher { #[inline(always)] pub fn new( - state_cell: Cell, - channel: PubSubChannel, + state: State, + publisher: Publisher, ) -> Self { - Self { - state_cell, - channel, - } + Self { state, publisher } } - #[inline] + #[inline(always)] pub fn update(&self, value: T) { - self.state_cell.set(value); - self.channel.publish_immediate(value); + self.state.update(value); + self.publisher.update(value); } } impl Stateful - for RawStatePubInput + for StatefulPublisher { type Value = T; #[inline(always)] fn state_cell(&self) -> CellView { - (&self.state_cell).into() + self.state.state_cell() } #[inline(always)] fn state(&self) -> Self::Value { - self.state_cell.get() + self.state.state() } } impl - Publisher for RawStatePubInput + Publish for StatefulPublisher { type Value = T; type Mutex = MutexT; + #[inline(always)] fn subscribe( &self, ) -> Result, Error> { - self.channel.subscriber() + self.publisher.subscribe() } } diff --git a/node/src/transducer/mod.rs b/node/src/transducer/mod.rs index c698b30..a9ac243 100644 --- a/node/src/transducer/mod.rs +++ b/node/src/transducer/mod.rs @@ -8,10 +8,10 @@ use embassy_sync::blocking_mutex::raw::RawMutex; #[cfg(feature = "embassy-sync")] use embassy_sync::pubsub; #[cfg(feature = "embassy-sync")] -use embassy_sync::pubsub::Subscriber; +use embassy_sync::pubsub::{PubSubBehavior, PubSubChannel, Subscriber}; #[cfg(feature = "embassy-sync")] -pub trait Publisher { +pub trait Publish { type Value: Copy; type Mutex: RawMutex; @@ -19,3 +19,46 @@ pub trait Publisher { &self, ) -> Result, pubsub::Error>; } + +#[cfg(feature = "embassy-sync")] +pub struct Publisher { + channel: PubSubChannel, +} + +impl + Publisher +{ + #[inline(always)] + pub fn new(channel: PubSubChannel) -> Self { + Self { channel } + } + + #[inline(always)] + pub fn update(&self, value: T) { + self.channel.publish_immediate(value); + } +} + +impl + Publish for Publisher +{ + type Value = T; + type Mutex = MutexT; + + #[inline(always)] + fn subscribe( + &self, + ) -> Result, pubsub::Error> { + self.channel.subscriber() + } +} + +impl +From> +for Publisher +{ + #[inline(always)] + fn from(channel: PubSubChannel) -> Self { + Publisher::new(channel) + } +} diff --git a/src/transducer/input.rs b/src/transducer/input.rs index 12540ba..e6b07fe 100644 --- a/src/transducer/input.rs +++ b/src/transducer/input.rs @@ -5,33 +5,3 @@ use crate::transducer::Stateful; pub trait Poll { async fn poll() -> T; } - -pub struct RawStatefulInput { - pub state_cell: Cell, -} - -impl RawStatefulInput { - #[inline(always)] - pub fn new(state_cell: Cell) -> Self { - Self { state_cell } - } - - #[inline(always)] - pub fn raw_update(&self, value: T) { - self.state_cell.set(value); - } -} - -impl Stateful for RawStatefulInput { - type Value = T; - - #[inline(always)] - fn state_cell(&self) -> CellView { - (&self.state_cell).into() - } - - #[inline(always)] - fn state(&self) -> Self::Value { - self.state_cell.get() - } -} diff --git a/src/transducer/mod.rs b/src/transducer/mod.rs index eada613..8948ca0 100644 --- a/src/transducer/mod.rs +++ b/src/transducer/mod.rs @@ -1,3 +1,4 @@ +use core::cell::Cell; use crate::cell::CellView; pub mod input; @@ -11,8 +12,42 @@ pub trait Stateful { fn state_cell(&self) -> CellView; + fn state(&self) -> Self::Value; +} + +pub struct State { + state_cell: Cell, +} + +impl State { #[inline(always)] - fn state(&self) -> Self::Value { - self.state_cell().get() + pub fn new(state_cell: Cell) -> Self { + Self { state_cell } + } + + #[inline(always)] + pub fn update(&self, value: T) { + self.state_cell.set(value); + } +} + +impl Stateful for State { + type Value = T; + + #[inline(always)] + fn state_cell(&self) -> CellView { + (&self.state_cell).into() + } + + #[inline(always)] + fn state(&self) -> Self::Value { + self.state_cell.get() + } +} + +impl From> for State { + #[inline(always)] + fn from(state_cell: Cell) -> Self { + State::new(state_cell) } } diff --git a/src/transducer/output.rs b/src/transducer/output.rs index 989830e..be5e963 100644 --- a/src/transducer/output.rs +++ b/src/transducer/output.rs @@ -3,5 +3,5 @@ pub trait Output { //TODO: return result //TODO: Make maybe async - fn set(&mut self, setting: Self::Value); + fn output(&mut self, setting: Self::Value); } \ No newline at end of file