From 19cbaa0f11095c99e406e8fcad8d56e04effca69 Mon Sep 17 00:00:00 2001 From: dj2ls Date: Sat, 15 Jan 2022 20:17:19 +0100 Subject: [PATCH] buffer overflow counter count while an ongoing file transfer #106 --- tnc/data_handler.py | 20 +++++++++++--------- tnc/modem.py | 22 +++++++++++++++------- tnc/static.py | 2 +- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/tnc/data_handler.py b/tnc/data_handler.py index 96df8f8f..be351d76 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -415,7 +415,7 @@ class DATA(): else: static.INFO.append("ARQ;RECEIVING;FAILED") - structlog.get_logger("structlog").warning("[TNC] ARQ | RX | DATA FRAME NOT SUCESSFULLY RECEIVED!", e="wrong crc", expected=data_frame_crc, received=data_frame_crc_received) + structlog.get_logger("structlog").warning("[TNC] ARQ | RX | DATA FRAME NOT SUCESSFULLY RECEIVED!", e="wrong crc", expected=data_frame_crc, received=data_frame_crc_received, overflows=static.BUFFER_OVERFLOW_COUNTER) # BUILDING NACK FRAME FOR DATA FRAME nack_frame = bytearray(14) @@ -500,7 +500,7 @@ class DATA(): # as soon as we received an ACK for the current burst, speed_level will increase # by 1. # the can be optimised by checking the optimal speed level for the current conditions - print(self.tx_n_retry_of_burst) + if not self.tx_n_retry_of_burst % 2 and self.tx_n_retry_of_burst > 0: self.speed_level -= 1 if self.speed_level < 0: @@ -511,8 +511,7 @@ class DATA(): # if self.speed_level >= len(self.mode_list)-1: # self.speed_level = len(self.mode_list)-1 data_mode = self.mode_list[self.speed_level] - print(f"data_mode {data_mode} speed_level {self.speed_level}") - + structlog.get_logger("structlog").debug("Speed-level", level=self.speed_level, retry=self.tx_n_retry_of_burst) @@ -570,7 +569,7 @@ class DATA(): burstacktimeout = time.time() + BURST_ACK_TIMEOUT_SECONDS while not self.burst_ack and not self.rpt_request_received and not self.data_frame_ack_received and time.time() < burstacktimeout and static.ARQ_STATE: time.sleep(0.01) - structlog.get_logger("structlog").debug("[TNC] waiting for ack", burst_ack=self.burst_ack, frame_ack = self.data_frame_ack_received, arq_state = static.ARQ_STATE) + structlog.get_logger("structlog").debug("[TNC] waiting for ack", burst_ack=self.burst_ack, frame_ack = self.data_frame_ack_received, arq_state = static.ARQ_STATE, overflows=static.BUFFER_OVERFLOW_COUNTER) # once we received a burst ack, reset its state and break the RETRIES loop @@ -594,7 +593,7 @@ class DATA(): # NEXT ATTEMPT - structlog.get_logger("structlog").debug("ATTEMPT", retry=self.tx_n_retry_of_burst, maxretries=TX_N_MAX_RETRIES_PER_BURST) + structlog.get_logger("structlog").debug("ATTEMPT", retry=self.tx_n_retry_of_burst, maxretries=TX_N_MAX_RETRIES_PER_BURST,overflows=static.BUFFER_OVERFLOW_COUNTER) # update buffer position bufferposition = bufferposition_end @@ -608,13 +607,13 @@ class DATA(): static.INFO.append("ARQ;TRANSMITTING;SUCCESS") - structlog.get_logger("structlog").info("ARQ | TX | DATA TRANSMITTED!", BytesPerMinute=static.ARQ_BYTES_PER_MINUTE, BitsPerSecond=static.ARQ_BITS_PER_SECOND) + structlog.get_logger("structlog").info("ARQ | TX | DATA TRANSMITTED!", BytesPerMinute=static.ARQ_BYTES_PER_MINUTE, BitsPerSecond=static.ARQ_BITS_PER_SECOND, overflows=static.BUFFER_OVERFLOW_COUNTER) else: static.INFO.append("ARQ;TRANSMITTING;FAILED") - structlog.get_logger("structlog").info("ARQ | TX | TRANSMISSION FAILED OR TIME OUT!") + structlog.get_logger("structlog").info("ARQ | TX | TRANSMISSION FAILED OR TIME OUT!", overflows=static.BUFFER_OVERFLOW_COUNTER) # and last but not least doing a state cleanup # do cleanup only when not in testmode @@ -1044,7 +1043,10 @@ class DATA(): # reset modem receiving state to reduce cpu load modem.RECEIVE_DATAC1 = False modem.RECEIVE_DATAC3 = False - + + # reset buffer overflow counter + static.BUFFER_OVERFLOW_COUNTER = [0,0,0] + def arq_reset_ack(self,state:bool): self.burst_ack = state diff --git a/tnc/modem.py b/tnc/modem.py index 33e168c0..955f7a8f 100644 --- a/tnc/modem.py +++ b/tnc/modem.py @@ -220,18 +220,26 @@ class RF(): x = np.frombuffer(data_in48k, dtype=np.int16) x = self.resampler.resample48_to_8(x) - - + # avoid buffer overflow by filling only if buffer not full if not self.datac0_buffer.nbuffer+len(x) > self.datac0_buffer.size: self.datac0_buffer.push(x) + else: + static.BUFFER_OVERFLOW_COUNTER[0] += 1 + # avoid buffer overflow by filling only if buffer not full and selected datachannel mode - if not self.datac1_buffer.nbuffer+len(x) > self.datac1_buffer.size and RECEIVE_DATAC1: - self.datac1_buffer.push(x) + if not self.datac1_buffer.nbuffer+len(x) > self.datac1_buffer.size: + if RECEIVE_DATAC1: + self.datac1_buffer.push(x) + else: + static.BUFFER_OVERFLOW_COUNTER[1] += 1 + # avoid buffer overflow by filling only if buffer not full and selected datachannel mode - if not self.datac3_buffer.nbuffer+len(x) > self.datac3_buffer.size and RECEIVE_DATAC3: - self.datac3_buffer.push(x) - + if not self.datac3_buffer.nbuffer+len(x) > self.datac3_buffer.size: + if RECEIVE_DATAC3: + self.datac3_buffer.push(x) + else: + static.BUFFER_OVERFLOW_COUNTER[2] += 1 if self.modoutqueue.empty(): data_out48k = bytes(self.AUDIO_FRAMES_PER_BUFFER_TX*2) diff --git a/tnc/static.py b/tnc/static.py index 36b503e0..bd669661 100644 --- a/tnc/static.py +++ b/tnc/static.py @@ -61,7 +61,7 @@ SCATTER = [] # Audio Defaults AUDIO_INPUT_DEVICE = -2 AUDIO_OUTPUT_DEVICE = -2 - +BUFFER_OVERFLOW_COUNTER = [0,0,0] AUDIO_RMS = 0 FFT = []