From 60c1b141162f682a22d51d99395856cb1658a16f Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Fri, 5 Jan 2024 15:52:22 +0100 Subject: [PATCH] adjusted demod error handling --- modem/demodulator.py | 85 ++++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/modem/demodulator.py b/modem/demodulator.py index bb01f435..49673c5e 100644 --- a/modem/demodulator.py +++ b/modem/demodulator.py @@ -206,50 +206,57 @@ class Demodulator(): bytes_per_frame= self.MODE_DICT[mode]["bytes_per_frame"] state_buffer = self.MODE_DICT[mode]["state_buffer"] mode_name = self.MODE_DICT[mode]["name"] - - while self.stream.active: - threading.Event().wait(0.01) - while audiobuffer.nbuffer >= nin: - # demodulate audio - nbytes = codec2.api.freedv_rawdatarx( - freedv, bytes_out, audiobuffer.buffer.ctypes - ) - # get current modem states and write to list - # 1 trial - # 2 sync - # 3 trial sync - # 6 decoded - # 10 error decoding == NACK - rx_status = codec2.api.freedv_get_rx_status(freedv) - - if rx_status not in [0]: - self.is_codec2_traffic_counter = self.is_codec2_traffic_cooldown - self.log.debug( - "[MDM] [demod_audio] modem state", mode=mode_name, rx_status=rx_status, - sync_flag=codec2.api.rx_sync_flags_to_text[rx_status] + try: + while self.stream.active: + threading.Event().wait(0.01) + while audiobuffer.nbuffer >= nin: + # demodulate audio + nbytes = codec2.api.freedv_rawdatarx( + freedv, bytes_out, audiobuffer.buffer.ctypes ) + # get current modem states and write to list + # 1 trial + # 2 sync + # 3 trial sync + # 6 decoded + # 10 error decoding == NACK + rx_status = codec2.api.freedv_get_rx_status(freedv) - # decrement codec traffic counter for making state smoother - if self.is_codec2_traffic_counter > 0: - self.is_codec2_traffic_counter -= 1 - self.states.set_channel_busy_condition_codec2(True) - else: - self.states.set_channel_busy_condition_codec2(False) - if rx_status == 10: - state_buffer.append(rx_status) + if rx_status not in [0]: + self.is_codec2_traffic_counter = self.is_codec2_traffic_cooldown + self.log.debug( + "[MDM] [demod_audio] modem state", mode=mode_name, rx_status=rx_status, + sync_flag=codec2.api.rx_sync_flags_to_text[rx_status] + ) - audiobuffer.pop(nin) - nin = codec2.api.freedv_nin(freedv) - if nbytes == bytes_per_frame: - self.log.debug( - "[MDM] [demod_audio] Pushing received data to received_queue", nbytes=nbytes - ) - snr = self.calculate_snr(freedv) - self.get_scatter(freedv) + # decrement codec traffic counter for making state smoother + if self.is_codec2_traffic_counter > 0: + self.is_codec2_traffic_counter -= 1 + self.states.set_channel_busy_condition_codec2(True) + else: + self.states.set_channel_busy_condition_codec2(False) + if rx_status == 10: + state_buffer.append(rx_status) - self.modem_received_queue.put([bytes_out, freedv, bytes_per_frame, snr]) - state_buffer = [] + audiobuffer.pop(nin) + nin = codec2.api.freedv_nin(freedv) + if nbytes == bytes_per_frame: + self.log.debug( + "[MDM] [demod_audio] Pushing received data to received_queue", nbytes=nbytes + ) + snr = self.calculate_snr(freedv) + self.get_scatter(freedv) + self.modem_received_queue.put([bytes_out, freedv, bytes_per_frame, snr]) + state_buffer = [] + except Exception as e: + error_message = str(e) + # we expect this error when shutdown + if "PortAudio not initialized" in error_message: + e = None + self.log.debug( + "[MDM] [demod_audio] demod loop ended", mode=mode_name, e=e + ) def tci_rx_callback(self) -> None: """ Callback for TCI RX