mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
data channel speed improvements
and some code cleanup as well
This commit is contained in:
parent
d001f29609
commit
d741778306
2 changed files with 22 additions and 90 deletions
|
@ -102,10 +102,6 @@ def arq_data_received(data_in, bytes_per_frame):
|
|||
# but better doing this, to avoid problems caused by old chunks in data
|
||||
if RX_N_FRAME_OF_DATA_FRAME == 1:
|
||||
static.RX_FRAME_BUFFER = []
|
||||
#
|
||||
# # we set the start of transmission - 7 seconds, which is more or less the transfer time for the first frame
|
||||
# RX_START_OF_TRANSMISSION = time.time() - 7
|
||||
# calculate_transfer_rate()
|
||||
|
||||
#try appending data to frame buffer
|
||||
try:
|
||||
|
@ -124,10 +120,6 @@ def arq_data_received(data_in, bytes_per_frame):
|
|||
|
||||
static.RX_FRAME_BUFFER[RX_N_FRAME_OF_DATA_FRAME] = bytes(data_in)
|
||||
|
||||
#if RX_N_FRAME_OF_BURST == 1:
|
||||
# static.ARQ_START_OF_BURST = time.time() - 6
|
||||
|
||||
|
||||
# try appending data to burst buffer
|
||||
try:
|
||||
static.RX_BURST_BUFFER[RX_N_FRAME_OF_BURST] = bytes(data_in)
|
||||
|
@ -155,14 +147,9 @@ def arq_data_received(data_in, bytes_per_frame):
|
|||
ack_frame[1:2] = static.DXCALLSIGN_CRC8
|
||||
ack_frame[2:3] = static.MYCALLSIGN_CRC8
|
||||
|
||||
|
||||
# TRANSMIT ACK FRAME FOR BURST-----------------------------------------------
|
||||
#helpers.wait(0.3)
|
||||
|
||||
txbuffer = [ack_frame]
|
||||
modem.transmit(mode=14, repeats=1, repeat_delay=0, frames=txbuffer)
|
||||
|
||||
#static.CHANNEL_STATE = 'RECEIVING_DATA'
|
||||
# clear burst buffer
|
||||
static.RX_BURST_BUFFER = []
|
||||
|
||||
|
@ -182,6 +169,7 @@ def arq_data_received(data_in, bytes_per_frame):
|
|||
missing_frames += frame_number
|
||||
|
||||
structlog.get_logger("structlog").warning("[TNC] ARQ | RX | RPT FRAMES", snr=static.SNR, frames=missing_frames)
|
||||
|
||||
# BUILDING RPT FRAME FOR BURST -----------------------------------------------
|
||||
rpt_frame = bytearray(14)
|
||||
rpt_frame[:1] = bytes([62])
|
||||
|
@ -192,9 +180,6 @@ def arq_data_received(data_in, bytes_per_frame):
|
|||
# TRANSMIT RPT FRAME FOR BURST-----------------------------------------------
|
||||
txbuffer = [rpt_frame]
|
||||
modem.transmit(mode=14, repeats=1, repeat_delay=0, frames=txbuffer)
|
||||
#while not modem.transmit_signalling(rpt_frame, 1):
|
||||
# time.sleep(0.01)
|
||||
#static.CHANNEL_STATE = 'RECEIVING_DATA'
|
||||
|
||||
# ---------------------------- FRAME MACHINE
|
||||
# --------------- IF LIST NOT CONTAINS "None" stick everything together
|
||||
|
@ -266,15 +251,10 @@ def arq_data_received(data_in, bytes_per_frame):
|
|||
|
||||
# TRANSMIT ACK FRAME FOR BURST-----------------------------------------------
|
||||
structlog.get_logger("structlog").info("[TNC] ARQ | RX | SENDING DATA FRAME ACK", snr=static.SNR, crc=data_frame_crc.hex())
|
||||
# since simultaneous decoding it seems, we don't have to wait anymore
|
||||
# however, we will wait a little bit for easier ptt debugging
|
||||
# possibly we can remove this later
|
||||
helpers.wait(0.5)
|
||||
|
||||
|
||||
txbuffer = [ack_frame]
|
||||
modem.transmit(mode=14, repeats=2, repeat_delay=250, frames=txbuffer)
|
||||
#while not modem.transmit_signalling(ack_frame, 3):
|
||||
# time.sleep(0.01)
|
||||
|
||||
calculate_transfer_rate_rx(RX_N_FRAMES_PER_DATA_FRAME, RX_N_FRAME_OF_DATA_FRAME, RX_START_OF_TRANSMISSION, RX_PAYLOAD_PER_ARQ_FRAME)
|
||||
|
||||
|
@ -349,8 +329,6 @@ def arq_transmit(data_out, mode, n_frames_per_burst):
|
|||
TX_PAYLOAD_PER_ARQ_FRAME = payload_per_frame - 8
|
||||
frame_header_length = 6
|
||||
|
||||
#n_arq_frames_per_data_frame = (len(data_out) + frame_header_length) // TX_PAYLOAD_PER_ARQ_FRAME + ((len(data_out) + frame_header_length) % TX_PAYLOAD_PER_ARQ_FRAME > 0)
|
||||
|
||||
frame_payload_crc = helpers.get_crc_16(data_out)
|
||||
|
||||
# This is the total frame with frame header, which will be send
|
||||
|
@ -416,7 +394,6 @@ def arq_transmit(data_out, mode, n_frames_per_burst):
|
|||
n_current_arq_frame = TX_N_SENT_FRAMES + n + 1
|
||||
n_current_arq_frame = n_current_arq_frame.to_bytes(2, byteorder='big')
|
||||
n_total_arq_frame = len(TX_BUFFER)
|
||||
#static.ARQ_TX_N_TOTAL_ARQ_FRAMES = n_total_arq_frame
|
||||
|
||||
arqframe = frame_type + \
|
||||
bytes([TX_N_FRAMES_PER_BURST]) + \
|
||||
|
@ -430,12 +407,6 @@ def arq_transmit(data_out, mode, n_frames_per_burst):
|
|||
|
||||
modem.transmit(mode=DATA_CHANNEL_MODE, repeats=1, repeat_delay=0, frames=tempbuffer)
|
||||
|
||||
#while not modem.transmit_arq_burst(DATA_CHANNEL_MODE, tempbuffer):
|
||||
# time.sleep(0.01)
|
||||
|
||||
## lets wait during sending. After sending is finished we will continue
|
||||
#while static.CHANNEL_STATE == 'SENDING_DATA':
|
||||
# time.sleep(0.01)
|
||||
|
||||
# --------------------------- START TIMER FOR WAITING FOR ACK ---> IF TIMEOUT REACHED, ACK_TIMEOUT = 1
|
||||
|
||||
|
@ -486,14 +457,6 @@ def arq_transmit(data_out, mode, n_frames_per_burst):
|
|||
|
||||
modem.transmit(mode=DATA_CHANNEL_MODE, repeats=1, repeat_delay=0, frames=tempbuffer)
|
||||
|
||||
#while not modem.transmit_arq_burst(DATA_CHANNEL_MODE, tempbuffer):
|
||||
# time.sleep(0.01)
|
||||
|
||||
# lets wait during sending. After sending is finished we will continue
|
||||
#while static.ARQ_STATE == 'SENDING_DATA':
|
||||
# time.sleep(0.01)
|
||||
#static.CHANNEL_STATE = 'RECEIVING_SIGNALLING'
|
||||
|
||||
arq_reset_ack(False)
|
||||
|
||||
rpttimeout = time.time() + RPT_ACK_TIMEOUT_SECONDS
|
||||
|
@ -538,34 +501,22 @@ def arq_transmit(data_out, mode, n_frames_per_burst):
|
|||
|
||||
calculate_transfer_rate_tx(TX_N_SENT_FRAMES, TX_PAYLOAD_PER_ARQ_FRAME, TX_START_OF_TRANSMISSION, TX_BUFFER_SIZE)
|
||||
logging.info("ARQ | RX | ACK [" + str(static.ARQ_BITS_PER_SECOND) + " bit/s | " + str(static.ARQ_BYTES_PER_MINUTE) + " B/min]")
|
||||
|
||||
# lets wait a little bit before we are processing the next frame
|
||||
helpers.wait(0.3)
|
||||
|
||||
|
||||
break
|
||||
|
||||
else:
|
||||
logging.info("--->NO RULE MATCHED OR TRANSMISSION STOPPED!")
|
||||
print("ARQ_ACK_RECEIVED " + str(BURST_ACK_RECEIVED))
|
||||
print(f"TX_N_SENT_FRAMES: {TX_N_SENT_FRAMES}")
|
||||
print(f"TX_BUFFER_SIZE: {TX_BUFFER_SIZE}")
|
||||
print(f"DATA_FRAME_ACK_RECEIVED: {DATA_FRAME_ACK_RECEIVED}")
|
||||
logging.debug("--->NO RULE MATCHED OR TRANSMISSION STOPPED!")
|
||||
logging.debug("ARQ_ACK_RECEIVED " + str(BURST_ACK_RECEIVED))
|
||||
logging.debug(f"TX_N_SENT_FRAMES: {TX_N_SENT_FRAMES}") # SENT FRAMES WILL INCREMENT AFTER ACK RECEIVED!
|
||||
logging.debug(f"TX_BUFFER_SIZE: {TX_BUFFER_SIZE}")
|
||||
logging.debug(f"DATA_FRAME_ACK_RECEIVED: {DATA_FRAME_ACK_RECEIVED}")
|
||||
break
|
||||
|
||||
# --------------------------------WAITING AREA FOR FRAME ACKs
|
||||
|
||||
#static.CHANNEL_STATE = 'RECEIVING_SIGNALLING'
|
||||
|
||||
frameacktimeout = time.time() + DATA_FRAME_ACK_TIMEOUT_SECONDS
|
||||
# wait for frame ACK if we processed the last frame/burst
|
||||
|
||||
print(f"TX_N_SENT_FRAMES: {TX_N_SENT_FRAMES}")
|
||||
print(f"TX_BUFFER_SIZE: {TX_BUFFER_SIZE}")
|
||||
print(f"DATA_FRAME_ACK_RECEIVED: {DATA_FRAME_ACK_RECEIVED}")
|
||||
print(f"{time.time()} {frameacktimeout}")
|
||||
while not DATA_FRAME_ACK_RECEIVED and time.time() < frameacktimeout and TX_N_SENT_FRAMES == TX_BUFFER_SIZE:
|
||||
print("kommen wir hier überhaupt an?!?!?!?!?")
|
||||
time.sleep(0.01) # lets reduce CPU load a little bit
|
||||
logging.debug("WAITING FOR FRAME ACK")
|
||||
|
||||
|
@ -577,10 +528,9 @@ def arq_transmit(data_out, mode, n_frames_per_burst):
|
|||
|
||||
# -------------------------BREAK TX BUFFER LOOP IF ALL PACKETS HAVE BEEN SENT AND WE GOT A FRAME ACK
|
||||
elif TX_N_SENT_FRAMES == TX_BUFFER_SIZE and DATA_FRAME_ACK_RECEIVED:
|
||||
print(TX_N_SENT_FRAMES)
|
||||
calculate_transfer_rate_tx(TX_N_SENT_FRAMES, TX_PAYLOAD_PER_ARQ_FRAME, TX_START_OF_TRANSMISSION, TX_BUFFER_SIZE)
|
||||
static.INFO.append("ARQ;TRANSMITTING;SUCCESS")
|
||||
logging.log(25, "ARQ | RX | FRAME ACK! - DATA TRANSMITTED! [" + str(static.ARQ_BITS_PER_SECOND) + " bit/s | " + str(static.ARQ_BYTES_PER_MINUTE) + " B/min]")
|
||||
logging.info("ARQ | RX | FRAME ACK! - DATA TRANSMITTED! [" + str(static.ARQ_BITS_PER_SECOND) + " bit/s | " + str(static.ARQ_BYTES_PER_MINUTE) + " B/min]")
|
||||
break
|
||||
|
||||
elif not DATA_FRAME_ACK_RECEIVED and time.time() > frameacktimeout:
|
||||
|
@ -666,14 +616,6 @@ def open_dc_and_transmit(data_out, mode, n_frames_per_burst):
|
|||
while not DATA_CHANNEL_READY_FOR_DATA:
|
||||
time.sleep(0.01)
|
||||
|
||||
# lets wait a little bit so RX station is ready for receiving
|
||||
#wait_before_data_timer = time.time() + 0.8
|
||||
#while time.time() < wait_before_data_timer:
|
||||
# pass
|
||||
helpers.wait(0.8)
|
||||
|
||||
|
||||
# transmit data
|
||||
arq_transmit(data_out, mode, n_frames_per_burst)
|
||||
|
||||
|
||||
|
@ -755,10 +697,6 @@ def arq_received_data_channel_opener(data_in):
|
|||
|
||||
structlog.get_logger("structlog").info("[TNC] DATA [" + str(static.MYCALLSIGN, 'utf-8') + "]>>|<<[" + str(static.DXCALLSIGN, 'utf-8') + "]", snr=static.SNR, mode=mode)
|
||||
|
||||
#static.CHANNEL_STATE = 'RECEIVING_DATA'
|
||||
# and now we are going to "RECEIVING_DATA" mode....
|
||||
|
||||
|
||||
def arq_received_channel_is_open(data_in):
|
||||
|
||||
global DATA_CHANNEL_LAST_RECEIVED
|
||||
|
@ -777,18 +715,12 @@ def arq_received_channel_is_open(data_in):
|
|||
if DATA_CHANNEL_MODE == int.from_bytes(bytes(data_in[12:13]), "big"):
|
||||
structlog.get_logger("structlog").info("[TNC] DATA [" + str(static.MYCALLSIGN, 'utf-8') + "]>>|<<[" + str(static.DXCALLSIGN, 'utf-8') + "]", snr=static.SNR)
|
||||
|
||||
# wait a little bit so other station is ready ( PTT toggle )
|
||||
print("wait.....")
|
||||
print(time.time())
|
||||
helpers.wait(0.5)
|
||||
print(time.time())
|
||||
# as soon as we set ARQ_STATE to DATA, transmission starts
|
||||
static.ARQ_STATE = 'DATA'
|
||||
DATA_CHANNEL_READY_FOR_DATA = True
|
||||
DATA_CHANNEL_LAST_RECEIVED = int(time.time())
|
||||
else:
|
||||
structlog.get_logger("structlog").info("[TNC] DATA [" + str(static.MYCALLSIGN, 'utf-8') + "]>>|<<[" + str(static.DXCALLSIGN, 'utf-8') + "]", snr=static.SNR, info="wrong mode rcvd")
|
||||
helpers.wait(0.5)
|
||||
# as soon as we set ARQ_STATE to DATA, transmission starts
|
||||
static.ARQ_STATE = 'DATA'
|
||||
DATA_CHANNEL_READY_FOR_DATA = True
|
||||
|
@ -1015,7 +947,7 @@ def watchdog():
|
|||
watchdog master function. Frome here we call the watchdogs
|
||||
"""
|
||||
while True:
|
||||
time.sleep(0.01)
|
||||
time.sleep(0.5)
|
||||
data_channel_keep_alive_watchdog()
|
||||
|
||||
|
||||
|
|
10
tnc/modem.py
10
tnc/modem.py
|
@ -169,6 +169,9 @@ class RF():
|
|||
)
|
||||
|
||||
|
||||
# --------------------------------------------INIT AND OPEN HAMLIB
|
||||
self.hamlib = rig.radio()
|
||||
self.hamlib.open_rig(devicename=static.HAMLIB_DEVICE_NAME, deviceport=static.HAMLIB_DEVICE_PORT, hamlib_ptt_type=static.HAMLIB_PTT_TYPE, serialspeed=static.HAMLIB_SERIAL_SPEED)
|
||||
|
||||
# --------------------------------------------START DECODER THREAD
|
||||
|
||||
|
@ -184,9 +187,6 @@ class RF():
|
|||
WORKER_THREAD = threading.Thread(target=self.worker, name="WORKER_THREAD")
|
||||
WORKER_THREAD.start()
|
||||
|
||||
# --------------------------------------------INIT AND OPEN HAMLIB
|
||||
self.hamlib = rig.radio()
|
||||
self.hamlib.open_rig(devicename=static.HAMLIB_DEVICE_NAME, deviceport=static.HAMLIB_DEVICE_PORT, hamlib_ptt_type=static.HAMLIB_PTT_TYPE, serialspeed=static.HAMLIB_SERIAL_SPEED)
|
||||
|
||||
# --------------------------------------------------------------------------------------------------------
|
||||
def audio_callback(self, data_in48k, frame_count, time_info, status):
|
||||
|
@ -497,7 +497,7 @@ class RF():
|
|||
# worker for FIFO queue for processing received frames
|
||||
def worker(self):
|
||||
while True:
|
||||
time.sleep(0.01)
|
||||
time.sleep(0.1)
|
||||
data = self.dataqueue.get()
|
||||
self.process_data(data[0], data[1], data[2])
|
||||
self.dataqueue.task_done()
|
||||
|
@ -660,7 +660,7 @@ class RF():
|
|||
|
||||
def update_rig_data(self):
|
||||
while True:
|
||||
time.sleep(0.1)
|
||||
time.sleep(0.5)
|
||||
#(static.HAMLIB_FREQUENCY, static.HAMLIB_MODE, static.HAMLIB_BANDWITH, static.PTT_STATE) = self.hamlib.get_rig_data()
|
||||
static.HAMLIB_FREQUENCY = self.hamlib.get_frequency()
|
||||
static.HAMLIB_MODE = self.hamlib.get_mode()
|
||||
|
|
Loading…
Reference in a new issue