diff --git a/src/decoders/trx-wefax/src/decoder.rs b/src/decoders/trx-wefax/src/decoder.rs index 9cf5f2f..69e3634 100644 --- a/src/decoders/trx-wefax/src/decoder.rs +++ b/src/decoders/trx-wefax/src/decoder.rs @@ -325,8 +325,15 @@ impl WefaxDecoder { events } - /// Reset the decoder, discarding any in-progress image. - pub fn reset(&mut self) { + /// Reset the decoder. Saves the in-progress image (if any) before + /// returning to Idle. Returns any completion events produced. + pub fn reset(&mut self) -> Vec { + let events = match self.state { + State::Receiving { ioc, lpm } | State::Phasing { ioc, lpm } => { + self.finalize_image(ioc, lpm) + } + _ => Vec::new(), + }; let default_lpm = self.config.lpm.unwrap_or(120); self.state = State::Idle; self.resampler.reset(); @@ -341,6 +348,7 @@ impl WefaxDecoder { self.sent_idle_event = false; self.signal_detect_count = 0; self.signal_detect_buf.clear(); + events } /// Check if the decoder is currently receiving an image. diff --git a/src/trx-server/src/audio.rs b/src/trx-server/src/audio.rs index 845b39a..096d9a1 100644 --- a/src/trx-server/src/audio.rs +++ b/src/trx-server/src/audio.rs @@ -2742,7 +2742,13 @@ pub async fn run_wefax_decoder( if reset_seq != last_reset_seq { last_reset_seq = reset_seq; - decoder.reset(); + // Reset saves any in-progress image. + for evt in decoder.reset() { + if let WefaxEvent::Complete(msg) = evt { + histories.record_wefax_message(msg.clone()); + let _ = decode_tx.send(DecodedMessage::Wefax(msg)); + } + } info!("WEFAX decoder reset (seq={})", last_reset_seq); pcm_rx = pcm_rx.resubscribe(); continue; @@ -2750,7 +2756,12 @@ pub async fn run_wefax_decoder( if !process_enabled { if was_active { - decoder.reset(); + for evt in decoder.reset() { + if let WefaxEvent::Complete(msg) = evt { + histories.record_wefax_message(msg.clone()); + let _ = decode_tx.send(DecodedMessage::Wefax(msg)); + } + } was_active = false; } active = false; @@ -2778,7 +2789,12 @@ pub async fn run_wefax_decoder( state_rx.borrow().reset_seqs.wefax_decode_reset_seq; if latest_reset_seq != reset_seq { last_reset_seq = latest_reset_seq; - decoder.reset(); + for evt in decoder.reset() { + if let WefaxEvent::Complete(msg) = evt { + histories.record_wefax_message(msg.clone()); + let _ = decode_tx.send(DecodedMessage::Wefax(msg)); + } + } info!("WEFAX decoder reset (seq={})", last_reset_seq); pcm_rx = pcm_rx.resubscribe(); continue;