From d66e1a26439d43306de0fe786f99fb6a3f95d468 Mon Sep 17 00:00:00 2001 From: Benjamin Koch <bbbsnowball@gmail.com> Date: Sat, 20 May 2023 19:46:46 +0200 Subject: [PATCH] do not transmit continuously --- firmware/rust1/src/dont_abort.rs | 17 +++++++++++++---- firmware/rust1/src/rs485.rs | 15 +++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/firmware/rust1/src/dont_abort.rs b/firmware/rust1/src/dont_abort.rs index 29544a1..8ea3b3f 100644 --- a/firmware/rust1/src/dont_abort.rs +++ b/firmware/rust1/src/dont_abort.rs @@ -2,9 +2,15 @@ use core::future::*; use core::pin::Pin; use core::task::*; +pub enum DontAbortMode { + PanicIfReused, + HangIfReused, +} + pub struct DontAbort<A> { a: A, - done: bool + done: bool, + mode: DontAbortMode, } pub struct DontAbortFuture<'a, A> { @@ -12,8 +18,8 @@ pub struct DontAbortFuture<'a, A> { } impl<A> DontAbort<A> { - pub fn new(a: A) -> DontAbort<A> { - DontAbort { a, done: false } + pub fn new(a: A, mode: DontAbortMode) -> DontAbort<A> { + DontAbort { a, done: false, mode } } #[allow(dead_code)] @@ -38,7 +44,10 @@ where fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { let this = unsafe { self.get_unchecked_mut() }; if this.inner.done { - panic!("Ready future is called again!"); + match this.inner.mode { + DontAbortMode::PanicIfReused => panic!("Ready future is called again!"), + DontAbortMode::HangIfReused => return Poll::Pending, // will never finish because we haven't scheduled ourselves again + } } let a = unsafe { Pin::new_unchecked(&mut this.inner.a) }; if let Poll::Ready(x) = a.poll(cx) { diff --git a/firmware/rust1/src/rs485.rs b/firmware/rust1/src/rs485.rs index 8a22f99..2b1919d 100644 --- a/firmware/rust1/src/rs485.rs +++ b/firmware/rust1/src/rs485.rs @@ -15,6 +15,7 @@ use fixed::traits::ToFixed; use fixed_macro::types::U56F8; use crate::dont_abort::DontAbort; +use crate::dont_abort::DontAbortMode::*; pub struct RS485 { pio: peripherals::PIO0, @@ -255,7 +256,6 @@ impl RS485 { } tx_data[i] = x | ((parity&1) << 8); } - info!("tx_data: {:?}", tx_data); let mut dma_in_ref = self.dma_channel.into_ref(); @@ -263,8 +263,8 @@ impl RS485 { let mut din = [42u32; 9]; let mut bit_index = 0; let mut rx_buf = [0; 1]; - let mut rx_future = DontAbort::new(self.rx.read(&mut rx_buf)); - let mut tx_future = DontAbort::new(sm1.tx().dma_push(dma_tx_ref.reborrow(), &tx_data)); + let mut rx_future = DontAbort::new(self.rx.read(&mut rx_buf), PanicIfReused); + let mut tx_future = DontAbort::new(sm1.tx().dma_push(dma_tx_ref.reborrow(), &tx_data), HangIfReused); loop { let x = select4( irq0.wait(), @@ -361,20 +361,23 @@ impl RS485 { } }, Either4::Third(_) => { - drop(tx_future); - tx_future = DontAbort::new(sm1.tx().dma_push(dma_tx_ref.reborrow(), &tx_data)); + //drop(tx_future); + //tx_future = DontAbort::new(sm1.tx().dma_push(dma_tx_ref.reborrow(), &tx_data), HangIfReused); }, Either4::Fourth(Either::First(x)) => { drop(rx_future); match x { Result::Ok(()) => { info!("RX {:?}", rx_buf); + + drop(tx_future); + tx_future = DontAbort::new(sm1.tx().dma_push(dma_tx_ref.reborrow(), &tx_data), HangIfReused); }, Result::Err(e) => { info!("RX error {:?}", e); }, } - rx_future = DontAbort::new(self.rx.read(&mut rx_buf)); + rx_future = DontAbort::new(self.rx.read(&mut rx_buf), PanicIfReused); }, _ => { }, -- GitLab