use super::hal; use heapless::consts; pub struct Dac0Output { outputs: heapless::spsc::Queue, spi: hal::spi::Spi, timer: hal::timer::Timer, } impl Dac0Output { pub fn new( spi: hal::spi::Spi, mut timer: hal::timer::Timer, ) -> Self { spi.inner().cr1.modify(|_, w| w.cstart().started()); timer.pause(); timer.reset_counter(); timer.clear_irq(); timer.listen(hal::timer::Event::TimeOut); Self { spi, outputs: heapless::spsc::Queue::new(), timer, } } pub fn push(&mut self, value: u16) { self.outputs.enqueue(value).unwrap(); self.timer.resume(); } pub fn update(&mut self) { self.timer.clear_irq(); match self.outputs.dequeue() { Some(value) => self.write(value), None => self.timer.pause(), } } pub fn write(&mut self, value: u16) { unsafe { core::ptr::write_volatile( &self.spi.inner().txdr as *const _ as *mut u16, value, ); } } } pub struct Dac1Output { outputs: heapless::spsc::Queue, spi: hal::spi::Spi, timer: hal::timer::Timer, } impl Dac1Output { pub fn new( spi: hal::spi::Spi, mut timer: hal::timer::Timer, ) -> Self { spi.inner().cr1.modify(|_, w| w.cstart().started()); timer.pause(); timer.reset_counter(); timer.clear_irq(); timer.listen(hal::timer::Event::TimeOut); Self { spi, outputs: heapless::spsc::Queue::new(), timer, } } pub fn push(&mut self, value: u16) { self.outputs.enqueue(value).unwrap(); self.timer.resume(); } pub fn update(&mut self) { self.timer.clear_irq(); match self.outputs.dequeue() { Some(value) => self.write(value), None => self.timer.pause(), } } pub fn write(&mut self, value: u16) { unsafe { core::ptr::write_volatile( &self.spi.inner().txdr as *const _ as *mut u16, value, ); } } }