X-Git-Url: https://code.octet-stream.net/m17rt/blobdiff_plain/1a444762d8fd7d48e4f56a87c6bd77f837522d5d..3903e719137aba15d30dd58b8d917965ec602400:/m17core/src/tnc.rs?ds=sidebyside diff --git a/m17core/src/tnc.rs b/m17core/src/tnc.rs index 93a4363..b46958c 100644 --- a/m17core/src/tnc.rs +++ b/m17core/src/tnc.rs @@ -102,6 +102,10 @@ impl SoftTnc { /// Process an individual `Frame` that has been decoded by the modem. pub fn handle_frame(&mut self, frame: Frame) { + if self.ptt { + // Ignore self-decodes + return; + } match frame { Frame::Lsf(lsf) => { // A new LSF implies a clean slate. @@ -213,14 +217,13 @@ impl SoftTnc { pub fn set_now(&mut self, now_samples: u64) { self.now = now_samples; - match self.state { - State::TxEndingAtTime(time) => { - if now_samples >= time { - self.ptt = false; - self.state = State::Idle; - } + // TODO: expose this to higher layer so we can schedule a precise delay + // rather than waiting for some soundcard I/O event + if let State::TxEndingAtTime(time) = self.state { + if now_samples >= time { + self.ptt = false; + self.state = State::Idle; } - _ => (), } } @@ -230,11 +233,8 @@ impl SoftTnc { pub fn set_tx_end_time(&mut self, in_samples: usize) { log::debug!("tnc has been told that tx will complete in {in_samples} samples"); - match self.state { - State::TxEnding => { - self.state = State::TxEndingAtTime(self.now + in_samples as u64); - } - _ => (), + if let State::TxEnding = self.state { + self.state = State::TxEndingAtTime(self.now + in_samples as u64); } } @@ -407,7 +407,7 @@ impl SoftTnc { pending.app_data[len..len + 2].copy_from_slice(&packet_crc.to_be_bytes()); pending.app_data_len = len + 2; pending.lsf = Some(LsfFrame::new_packet( - &Address::Callsign(Callsign(b"M17RT-PKT".clone())), + &Address::Callsign(Callsign(*b"M17RT-PKT")), &Address::Broadcast, )); self.packet_queue[self.packet_next] = pending; @@ -487,6 +487,12 @@ impl SoftTnc { } } +impl Default for SoftTnc { + fn default() -> Self { + Self::new() + } +} + #[derive(Debug, PartialEq, Eq, Clone)] pub enum SoftTncError { General(&'static str), @@ -498,6 +504,7 @@ struct OutgoingKiss { sent: usize, } +#[allow(clippy::large_enum_variant)] enum State { /// Nothing happening. We may have TX data queued but we won't act on it until CSMA opens up. Idle,