From 26c9c1c492afef7a8f7e3e2a85ae45a29eac8731 Mon Sep 17 00:00:00 2001 From: Stephen D <webmaster@scd31.com> Date: Sun, 5 Nov 2023 09:37:40 -0400 Subject: [PATCH] basic --- src/lib.rs | 41 ++++++++++++++++++++++------------------- src/rx.rs | 2 +- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index d9b2afa..1f46b82 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -135,42 +135,45 @@ where &mut self, new_buf: Option<&'a mut [u8; MAX_PACKET_LEN]>, ) -> Result<Option<RxPacket<MAX_PACKET_LEN>>, Spi::Error> { - let (set_idle, ret) = match &mut self.state { + let mut old_state = InternalState::Idle; + core::mem::swap(&mut old_state, &mut self.state); + + let ret = match old_state { InternalState::Rx { data, received, i, rssi, - } if *received => { - let ret_rssi = match *rssi { + } if received => { + let ret_rssi = match rssi { Some(x) => x, None => self.radio.get_rssi()?, }; - let ret = if self.rx_forever { + if self.rx_forever { let new_buf = new_buf.expect("rx_forever=true and no replacement buffer given"); - self.radio.clear_ph_and_modem_interrupts()?; - core::mem::swap(new_buf, data); - *i = 0; - *received = false; - *rssi = None; + self.state = InternalState::Rx { + data: new_buf, + i: 0, + received: false, + rssi: None, + }; + } - (false, Some(RxPacket::new(new_buf, *i, ret_rssi))) - } else { - (true, Some(RxPacket::new(data, *i, ret_rssi))) - }; + // state is implicitly Idle now if rx_forever=false, based on the mem::swap we did above - ret + Some(RxPacket::new(data, i, ret_rssi)) } - _ => (false, None), - }; + _ => { + // swap our states back + core::mem::swap(&mut old_state, &mut self.state); - if set_idle { - self.state = InternalState::Idle; - } + None + } + }; Ok(ret) } diff --git a/src/rx.rs b/src/rx.rs index e7f99d6..644281d 100644 --- a/src/rx.rs +++ b/src/rx.rs @@ -18,7 +18,7 @@ impl<'a, const N: usize> RxPacket<'a, N> { self.rssi } - fn into_buf(self) -> &'a mut [u8; N] { + pub fn into_buf(self) -> &'a mut [u8; N] { self.data } } -- GitLab