mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
preparing for mode gear shifting
This commit is contained in:
parent
5895fc1a8e
commit
8ea5c0de3f
3 changed files with 52 additions and 34 deletions
|
@ -897,7 +897,8 @@
|
||||||
<div class="input-group input-group-sm"> <span class="input-group-text" id="basic-addon1">Mode</span>
|
<div class="input-group input-group-sm"> <span class="input-group-text" id="basic-addon1">Mode</span>
|
||||||
<select class="form-select form-select-sm" aria-label=".form-select-sm" id="datamode">
|
<select class="form-select form-select-sm" aria-label=".form-select-sm" id="datamode">
|
||||||
<!--<option value="14">low SNR (DC0)</option>-->
|
<!--<option value="14">low SNR (DC0)</option>-->
|
||||||
<option selected value="10">HIGH SNR (DC1)</option>
|
<option selected value="255">AUTO</option>
|
||||||
|
<option value="10">HIGH SNR (DC1)</option>
|
||||||
<option value="12">MED SNR (DC3)</option>
|
<option value="12">MED SNR (DC3)</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -18,6 +18,7 @@ import modem
|
||||||
import helpers
|
import helpers
|
||||||
modem = modem.RF()
|
modem = modem.RF()
|
||||||
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
Author: DJ2LS
|
Author: DJ2LS
|
||||||
Description:
|
Description:
|
||||||
|
@ -38,8 +39,8 @@ and moving them to module wide globals
|
||||||
# MODULE GLOBALS
|
# MODULE GLOBALS
|
||||||
|
|
||||||
DATA_CHANNEL_LAST_RECEIVED = 0.0 # time of last "live sign" of a frame
|
DATA_CHANNEL_LAST_RECEIVED = 0.0 # time of last "live sign" of a frame
|
||||||
DATA_CHANNEL_MODE = 0 # mode for data channel
|
|
||||||
|
|
||||||
|
BURST_ACK_SNR = 0 # SNR from received ack frames
|
||||||
BURST_ACK_RECEIVED = False # if we received an acknowledge frame for a burst
|
BURST_ACK_RECEIVED = False # if we received an acknowledge frame for a burst
|
||||||
DATA_FRAME_ACK_RECEIVED = False # if we received an acknowledge frame for a data frame
|
DATA_FRAME_ACK_RECEIVED = False # if we received an acknowledge frame for a data frame
|
||||||
RPT_REQUEST_RECEIVED = False # if we received an request for repeater frames
|
RPT_REQUEST_RECEIVED = False # if we received an request for repeater frames
|
||||||
|
@ -51,7 +52,7 @@ DATA_FRAME_BOF = b'BOF'#b'\xAA\xAA' # 2 bytes for the BOF End
|
||||||
DATA_FRAME_EOF = b'EOF'#b'\xFF\xFF' # 2 bytes for the EOF End of File indicator in a data frame
|
DATA_FRAME_EOF = b'EOF'#b'\xFF\xFF' # 2 bytes for the EOF End of File indicator in a data frame
|
||||||
|
|
||||||
|
|
||||||
def arq_data_received(data_in:bytes, bytes_per_frame:int):
|
def arq_data_received(data_in:bytes, bytes_per_frame:int, snr:int):
|
||||||
data_in = bytes(data_in)
|
data_in = bytes(data_in)
|
||||||
|
|
||||||
# we neeed to declare our global variables, so the thread has access to them
|
# we neeed to declare our global variables, so the thread has access to them
|
||||||
|
@ -112,7 +113,7 @@ def arq_data_received(data_in:bytes, bytes_per_frame:int):
|
||||||
ack_frame[:1] = bytes([60])
|
ack_frame[:1] = bytes([60])
|
||||||
ack_frame[1:2] = static.DXCALLSIGN_CRC8
|
ack_frame[1:2] = static.DXCALLSIGN_CRC8
|
||||||
ack_frame[2:3] = static.MYCALLSIGN_CRC8
|
ack_frame[2:3] = static.MYCALLSIGN_CRC8
|
||||||
|
ack_frame[3:4] = snr
|
||||||
# and transmit it
|
# and transmit it
|
||||||
txbuffer = [ack_frame]
|
txbuffer = [ack_frame]
|
||||||
structlog.get_logger("structlog").info("[TNC] ARQ | RX | ACK")
|
structlog.get_logger("structlog").info("[TNC] ARQ | RX | ACK")
|
||||||
|
@ -241,13 +242,12 @@ def arq_transmit(data_out:bytes, mode:int, n_frames_per_burst:int):
|
||||||
global DATA_FRAME_ACK_RECEIVED
|
global DATA_FRAME_ACK_RECEIVED
|
||||||
global RPT_REQUEST_RECEIVED
|
global RPT_REQUEST_RECEIVED
|
||||||
global BURST_ACK_RECEIVED
|
global BURST_ACK_RECEIVED
|
||||||
|
global BURST_ACK_SNR
|
||||||
#global TX_START_OF_TRANSMISSION
|
#global TX_START_OF_TRANSMISSION
|
||||||
global DATA_FRAME_BOF
|
global DATA_FRAME_BOF
|
||||||
global DATA_FRAME_EOF
|
global DATA_FRAME_EOF
|
||||||
|
|
||||||
|
|
||||||
DATA_CHANNEL_MODE = mode
|
|
||||||
|
|
||||||
TX_N_SENT_BYTES = 0 # already sent bytes per data frame
|
TX_N_SENT_BYTES = 0 # already sent bytes per data frame
|
||||||
TX_N_RETRIES_PER_BURST = 0 # retries we already sent data
|
TX_N_RETRIES_PER_BURST = 0 # retries we already sent data
|
||||||
TX_N_MAX_RETRIES_PER_BURST = 5 # max amount of retries we sent before frame is lost
|
TX_N_MAX_RETRIES_PER_BURST = 5 # max amount of retries we sent before frame is lost
|
||||||
|
@ -260,7 +260,7 @@ def arq_transmit(data_out:bytes, mode:int, n_frames_per_burst:int):
|
||||||
RPT_ACK_TIMEOUT_SECONDS = 3.0 # timeout for rpt frame acknowledges
|
RPT_ACK_TIMEOUT_SECONDS = 3.0 # timeout for rpt frame acknowledges
|
||||||
|
|
||||||
static.INFO.append("ARQ;TRANSMITTING")
|
static.INFO.append("ARQ;TRANSMITTING")
|
||||||
structlog.get_logger("structlog").info("[TNC] | TX | DATACHANNEL", mode=DATA_CHANNEL_MODE, bytes=len(data_out))
|
structlog.get_logger("structlog").info("[TNC] | TX | DATACHANNEL", mode=mode, bytes=len(data_out))
|
||||||
|
|
||||||
# save len of data_out to TOTAL_BYTES for our statistics
|
# save len of data_out to TOTAL_BYTES for our statistics
|
||||||
static.TOTAL_BYTES = len(data_out)
|
static.TOTAL_BYTES = len(data_out)
|
||||||
|
@ -283,10 +283,28 @@ def arq_transmit(data_out:bytes, mode:int, n_frames_per_burst:int):
|
||||||
while bufferposition < len(data_out) and not DATA_FRAME_ACK_RECEIVED and static.ARQ_STATE:
|
while bufferposition < len(data_out) and not DATA_FRAME_ACK_RECEIVED and static.ARQ_STATE:
|
||||||
print(DATA_FRAME_ACK_RECEIVED)
|
print(DATA_FRAME_ACK_RECEIVED)
|
||||||
|
|
||||||
|
|
||||||
# we have TX_N_MAX_RETRIES_PER_BURST attempts for sending a burst
|
# we have TX_N_MAX_RETRIES_PER_BURST attempts for sending a burst
|
||||||
for TX_N_RETRIES_PER_BURST in range(0,TX_N_MAX_RETRIES_PER_BURST):
|
for TX_N_RETRIES_PER_BURST in range(0,TX_N_MAX_RETRIES_PER_BURST):
|
||||||
|
|
||||||
|
|
||||||
|
# TEST WITH MODE GEAR SHIFTING
|
||||||
|
print(mode)
|
||||||
|
print(BURST_ACK_SNR)
|
||||||
|
if mode != 255:
|
||||||
|
data_mode = mode
|
||||||
|
else:
|
||||||
|
if BURST_ACK_SNR == 0:
|
||||||
|
data_mode = 12
|
||||||
|
BURST_ACK_SNR = 15
|
||||||
|
elif BURST_ACK_SNR > 10:
|
||||||
|
data_mode = 10
|
||||||
|
|
||||||
|
|
||||||
|
print(mode)
|
||||||
|
print(data_mode)
|
||||||
# payload information
|
# payload information
|
||||||
payload_per_frame = modem.get_bytes_per_frame(mode) -2
|
payload_per_frame = modem.get_bytes_per_frame(data_mode) -2
|
||||||
# tempbuffer list for storing our data frames
|
# tempbuffer list for storing our data frames
|
||||||
tempbuffer = []
|
tempbuffer = []
|
||||||
# append data frames with TX_N_FRAMES_PER_BURST to tempbuffer
|
# append data frames with TX_N_FRAMES_PER_BURST to tempbuffer
|
||||||
|
@ -320,8 +338,8 @@ def arq_transmit(data_out:bytes, mode:int, n_frames_per_burst:int):
|
||||||
|
|
||||||
tempbuffer.append(frame)
|
tempbuffer.append(frame)
|
||||||
|
|
||||||
structlog.get_logger("structlog").info("[TNC] ARQ | TX | FRAMES", mode=DATA_CHANNEL_MODE, fpb=TX_N_FRAMES_PER_BURST, retry=TX_N_RETRIES_PER_BURST)
|
structlog.get_logger("structlog").info("[TNC] ARQ | TX | FRAMES", mode=data_mode, fpb=TX_N_FRAMES_PER_BURST, retry=TX_N_RETRIES_PER_BURST)
|
||||||
modem.transmit(mode=DATA_CHANNEL_MODE, repeats=1, repeat_delay=0, frames=tempbuffer)
|
modem.transmit(mode=data_mode, repeats=1, repeat_delay=0, frames=tempbuffer)
|
||||||
|
|
||||||
# lets wait for an ACK or RPT frame
|
# lets wait for an ACK or RPT frame
|
||||||
burstacktimeout = time.time() + BURST_ACK_TIMEOUT_SECONDS
|
burstacktimeout = time.time() + BURST_ACK_TIMEOUT_SECONDS
|
||||||
|
@ -391,15 +409,17 @@ def arq_transmit(data_out:bytes, mode:int, n_frames_per_burst:int):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def burst_ack_received():
|
def burst_ack_received(snr):
|
||||||
global BURST_ACK_RECEIVED
|
global BURST_ACK_RECEIVED
|
||||||
|
global BURST_ACK_SNR
|
||||||
global DATA_CHANNEL_LAST_RECEIVED
|
global DATA_CHANNEL_LAST_RECEIVED
|
||||||
|
|
||||||
# only process data if we are in ARQ and BUSY state
|
# only process data if we are in ARQ and BUSY state
|
||||||
if static.ARQ_STATE:
|
if static.ARQ_STATE:
|
||||||
BURST_ACK_RECEIVED = True # Force data loops of TNC to stop and continue with next frame
|
BURST_ACK_RECEIVED = True # Force data loops of TNC to stop and continue with next frame
|
||||||
DATA_CHANNEL_LAST_RECEIVED = int(time.time()) # we need to update our timeout timestamp
|
DATA_CHANNEL_LAST_RECEIVED = int(time.time()) # we need to update our timeout timestamp
|
||||||
|
BURST_ACK_SNR = snr
|
||||||
|
print(BURST_ACK_SNR)
|
||||||
|
|
||||||
def frame_ack_received():
|
def frame_ack_received():
|
||||||
global DATA_FRAME_ACK_RECEIVED
|
global DATA_FRAME_ACK_RECEIVED
|
||||||
|
@ -411,7 +431,7 @@ def frame_ack_received():
|
||||||
DATA_CHANNEL_LAST_RECEIVED = int(time.time()) # we need to update our timeout timestamp
|
DATA_CHANNEL_LAST_RECEIVED = int(time.time()) # we need to update our timeout timestamp
|
||||||
|
|
||||||
|
|
||||||
def frame_nack_received():
|
def frame_nack_received(data_in:bytes):
|
||||||
static.INFO.append("ARQ;TRANSMITTING;FAILED")
|
static.INFO.append("ARQ;TRANSMITTING;FAILED")
|
||||||
arq_cleanup()
|
arq_cleanup()
|
||||||
|
|
||||||
|
@ -464,7 +484,6 @@ def arq_open_data_channel(mode:int, data_len:int):
|
||||||
|
|
||||||
DATA_CHANNEL_MAX_RETRIES = 5 # N attempts for connecting to another station
|
DATA_CHANNEL_MAX_RETRIES = 5 # N attempts for connecting to another station
|
||||||
|
|
||||||
#DATA_CHANNEL_MODE = int(mode)
|
|
||||||
DATA_CHANNEL_LAST_RECEIVED = int(time.time())
|
DATA_CHANNEL_LAST_RECEIVED = int(time.time())
|
||||||
|
|
||||||
# multiply compression factor for reducing it from float to int
|
# multiply compression factor for reducing it from float to int
|
||||||
|
@ -511,7 +530,6 @@ def arq_open_data_channel(mode:int, data_len:int):
|
||||||
|
|
||||||
def arq_received_data_channel_opener(data_in:bytes):
|
def arq_received_data_channel_opener(data_in:bytes):
|
||||||
|
|
||||||
#global DATA_CHANNEL_MODE
|
|
||||||
global DATA_CHANNEL_LAST_RECEIVED
|
global DATA_CHANNEL_LAST_RECEIVED
|
||||||
global RX_START_OF_TRANSMISSION
|
global RX_START_OF_TRANSMISSION
|
||||||
|
|
||||||
|
@ -557,7 +575,6 @@ def arq_received_data_channel_opener(data_in:bytes):
|
||||||
def arq_received_channel_is_open(data_in:bytes):
|
def arq_received_channel_is_open(data_in:bytes):
|
||||||
|
|
||||||
global DATA_CHANNEL_LAST_RECEIVED
|
global DATA_CHANNEL_LAST_RECEIVED
|
||||||
global DATA_CHANNEL_MODE
|
|
||||||
|
|
||||||
static.INFO.append("DATACHANNEL;OPEN")
|
static.INFO.append("DATACHANNEL;OPEN")
|
||||||
static.DXCALLSIGN_CRC8 = bytes(data_in[2:3]).rstrip(b'\x00')
|
static.DXCALLSIGN_CRC8 = bytes(data_in[2:3]).rstrip(b'\x00')
|
||||||
|
@ -566,19 +583,11 @@ def arq_received_channel_is_open(data_in:bytes):
|
||||||
|
|
||||||
DATA_CHANNEL_LAST_RECEIVED = int(time.time())
|
DATA_CHANNEL_LAST_RECEIVED = int(time.time())
|
||||||
|
|
||||||
# we are doing a mode check here, but this doesn't seem to be necessary since we have simultaneous decoding
|
|
||||||
# we are forcing doing a transmission at the moment --> see else statement
|
|
||||||
if DATA_CHANNEL_MODE == int.from_bytes(bytes(data_in[12:13]), "big"):
|
|
||||||
structlog.get_logger("structlog").info("[TNC] ARQ | DATA | TX | [" + str(static.MYCALLSIGN, 'utf-8') + "]>>|<<[" + str(static.DXCALLSIGN, 'utf-8') + "]", snr=static.SNR)
|
structlog.get_logger("structlog").info("[TNC] ARQ | DATA | TX | [" + str(static.MYCALLSIGN, 'utf-8') + "]>>|<<[" + str(static.DXCALLSIGN, 'utf-8') + "]", snr=static.SNR)
|
||||||
|
|
||||||
# as soon as we set ARQ_STATE to DATA, transmission starts
|
# as soon as we set ARQ_STATE to DATA, transmission starts
|
||||||
static.ARQ_STATE = True
|
static.ARQ_STATE = True
|
||||||
DATA_CHANNEL_LAST_RECEIVED = int(time.time())
|
DATA_CHANNEL_LAST_RECEIVED = int(time.time())
|
||||||
else:
|
|
||||||
structlog.get_logger("structlog").info("[TNC] ARQ | DATA | TX | [" + str(static.MYCALLSIGN, 'utf-8') + "]>>|<<[" + str(static.DXCALLSIGN, 'utf-8') + "]", snr=static.SNR, info="wrong mode rcvd")
|
|
||||||
# as soon as we set ARQ_STATE to DATA, transmission starts
|
|
||||||
static.ARQ_STATE = True
|
|
||||||
DATA_CHANNEL_LAST_RECEIVED = int(time.time())
|
|
||||||
|
|
||||||
# ############################################################################################################
|
# ############################################################################################################
|
||||||
# PING HANDLER
|
# PING HANDLER
|
||||||
|
@ -795,6 +804,7 @@ def arq_cleanup():
|
||||||
global DATA_FRAME_ACK_RECEIVED
|
global DATA_FRAME_ACK_RECEIVED
|
||||||
global RX_FRAME_BOF_RECEIVED
|
global RX_FRAME_BOF_RECEIVED
|
||||||
global RX_FRAME_EOF_RECEIVED
|
global RX_FRAME_EOF_RECEIVED
|
||||||
|
global BURST_ACK_SNR
|
||||||
|
|
||||||
RX_FRAME_BOF_RECEIVED = False
|
RX_FRAME_BOF_RECEIVED = False
|
||||||
RX_FRAME_EOF_RECEIVED = False
|
RX_FRAME_EOF_RECEIVED = False
|
||||||
|
@ -805,7 +815,7 @@ def arq_cleanup():
|
||||||
DATA_FRAME_ACK_RECEIVED = False
|
DATA_FRAME_ACK_RECEIVED = False
|
||||||
static.RX_BURST_BUFFER = []
|
static.RX_BURST_BUFFER = []
|
||||||
static.RX_FRAME_BUFFER = b''
|
static.RX_FRAME_BUFFER = b''
|
||||||
|
BURST_ACK_SNR = 255
|
||||||
|
|
||||||
def arq_reset_ack(state:bool):
|
def arq_reset_ack(state:bool):
|
||||||
"""
|
"""
|
||||||
|
|
11
tnc/modem.py
11
tnc/modem.py
|
@ -348,6 +348,9 @@ class RF():
|
||||||
while True:
|
while True:
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
data = self.dataqueue.get()
|
data = self.dataqueue.get()
|
||||||
|
# data[0] = bytes_out
|
||||||
|
# data[1] = freedv session
|
||||||
|
# data[2] = bytes_per_frame
|
||||||
self.process_data(data[0], data[1], data[2])
|
self.process_data(data[0], data[1], data[2])
|
||||||
self.dataqueue.task_done()
|
self.dataqueue.task_done()
|
||||||
|
|
||||||
|
@ -372,8 +375,11 @@ class RF():
|
||||||
|
|
||||||
if 50 >= frametype >= 10:
|
if 50 >= frametype >= 10:
|
||||||
|
|
||||||
|
# get snr of received data
|
||||||
|
snr = calculate_snr(self, freedv)
|
||||||
|
|
||||||
# send payload data to arq checker without CRC16
|
# send payload data to arq checker without CRC16
|
||||||
data_handler.arq_data_received(bytes(bytes_out[:-2]), bytes_per_frame)
|
data_handler.arq_data_received(bytes(bytes_out[:-2]), bytes_per_frame, snr)
|
||||||
|
|
||||||
# if we received the last frame of a burst or the last remaining rpt frame, do a modem unsync
|
# if we received the last frame of a burst or the last remaining rpt frame, do a modem unsync
|
||||||
if static.RX_BURST_BUFFER.count(None) <= 1 or (frame+1) == n_frames_per_burst:
|
if static.RX_BURST_BUFFER.count(None) <= 1 or (frame+1) == n_frames_per_burst:
|
||||||
|
@ -384,7 +390,8 @@ class RF():
|
||||||
# BURST ACK
|
# BURST ACK
|
||||||
elif frametype == 60:
|
elif frametype == 60:
|
||||||
logging.debug("ACK RECEIVED....")
|
logging.debug("ACK RECEIVED....")
|
||||||
data_handler.burst_ack_received()
|
snr = int.from_bytes(bytes(bytes_out[3:4]), "big")
|
||||||
|
data_handler.burst_ack_received(snr)
|
||||||
|
|
||||||
# FRAME ACK
|
# FRAME ACK
|
||||||
elif frametype == 61:
|
elif frametype == 61:
|
||||||
|
|
Loading…
Reference in a new issue