From d5a0464fd901b90cf74bdbb66ea778470123bf1c Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Mon, 5 Dec 2022 15:23:03 +0100 Subject: [PATCH] first attempt with catching modem error states for early NACK --- tnc/data_handler.py | 2 +- tnc/main.py | 1 + tnc/modem.py | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/tnc/data_handler.py b/tnc/data_handler.py index 19df8332..fd51b247 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -2838,7 +2838,7 @@ class DATA: # We want to reach this state only if connected ( == return above not called ) if ( self.data_channel_last_received + self.time_list[self.speed_level] - <= time.time() + <= time.time() or modem.get_modem_error_state() ): self.log.warning( "[TNC] Frame timeout", diff --git a/tnc/main.py b/tnc/main.py index c66ff9df..1dc30a6c 100755 --- a/tnc/main.py +++ b/tnc/main.py @@ -308,6 +308,7 @@ if __name__ == "__main__": static.RESPOND_TO_CQ = config['TNC']['qrv'] static.RX_BUFFER_SIZE = config['TNC']['rxbuffersize'] static.ENABLE_EXPLORER = config['TNC']['explorer'] + except KeyError as e: log.warning("[CFG] Error reading config file near", key=str(e)) except Exception as e: diff --git a/tnc/modem.py b/tnc/modem.py index c7c59eb8..0df0719c 100644 --- a/tnc/modem.py +++ b/tnc/modem.py @@ -38,6 +38,13 @@ RECEIVE_DATAC1 = False RECEIVE_DATAC3 = False RECEIVE_FSK_LDPC_1 = False +# state buffer +SIG0_DATAC0_STATE = [] +SIG1_DATAC0_STATE = [] +DAT0_DATAC1_STATE = [] +DAT0_DATAC3_STATE = [] + + class RF: """Class to encapsulate interactions between the audio device and codec2""" @@ -550,6 +557,7 @@ class RF: freedv: ctypes.c_void_p, bytes_out, bytes_per_frame, + state_buffer, ) -> int: """ De-modulate supplied audio stream with supplied codec2 instance. @@ -577,6 +585,16 @@ class RF: 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 + state = codec2.api.freedv_get_rx_status(freedv) + if state == 10: + state_buffer.append(state) + audiobuffer.pop(nin) nin = codec2.api.freedv_nin(freedv) if nbytes == bytes_per_frame: @@ -588,6 +606,7 @@ class RF: self.modem_received_queue.put([bytes_out, freedv, bytes_per_frame]) self.get_scatter(freedv) self.calculate_snr(freedv) + state_buffer = [] else: self.log.warning( "[MDM] [demod_audio] received frame but ignored processing", @@ -675,6 +694,7 @@ class RF: self.sig0_datac0_freedv, self.sig0_datac0_bytes_out, self.sig0_datac0_bytes_per_frame, + SIG0_DATAC0_STATE ) def audio_sig1_datac0(self) -> None: @@ -685,6 +705,7 @@ class RF: self.sig1_datac0_freedv, self.sig1_datac0_bytes_out, self.sig1_datac0_bytes_per_frame, + SIG1_DATAC0_STATE ) def audio_dat0_datac1(self) -> None: @@ -695,6 +716,7 @@ class RF: self.dat0_datac1_freedv, self.dat0_datac1_bytes_out, self.dat0_datac1_bytes_per_frame, + DAT0_DATAC1_STATE ) def audio_dat0_datac3(self) -> None: @@ -705,6 +727,7 @@ class RF: self.dat0_datac3_freedv, self.dat0_datac3_bytes_out, self.dat0_datac3_bytes_per_frame, + DAT0_DATAC3_STATE ) def audio_fsk_ldpc_0(self) -> None: @@ -1032,3 +1055,19 @@ def set_audio_volume(datalist, volume: float) -> np.int16: # Scale samples by the ratio of volume / 100.0 data = np.fromstring(datalist, np.int16) * (volume / 100.0) # type: ignore return data.astype(np.int16) + + +def get_modem_error_state(): + """ + get current state buffer and return True of contains 10 + + """ + + if RECEIVE_DATAC1 and 10 in DAT0_DATAC1_STATE: + DAT0_DATAC1_STATE.clear() + return True + if RECEIVE_DATAC3 and 10 in DAT0_DATAC3_STATE: + DAT0_DATAC3_STATE.clear() + return True + + return False