mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
byte rate messurement
This commit is contained in:
parent
c7f85f8505
commit
70ff859cc3
4 changed files with 61 additions and 23 deletions
|
@ -26,10 +26,25 @@ modem = modem.RF()
|
|||
|
||||
|
||||
def arq_data_received(data_in):
|
||||
# define some frame sizes so we can calculate the baud rate e.g.
|
||||
if static.ARQ_DATA_CHANNEL_MODE == 10:
|
||||
payload_per_frame = 512 - 2
|
||||
elif static.ARQ_DATA_CHANNEL_MODE == 11:
|
||||
payload_per_frame = 256 - 2
|
||||
elif static.ARQ_DATA_CHANNEL_MODE == 12:
|
||||
payload_per_frame = 128 - 2
|
||||
elif static.ARQ_DATA_CHANNEL_MODE == 14:
|
||||
payload_per_frame = 16 - 2
|
||||
else:
|
||||
payload_per_frame = 16 - 2
|
||||
|
||||
static.ARQ_PAYLOAD_PER_FRAME = payload_per_frame - 8
|
||||
|
||||
#
|
||||
static.TNC_STATE = 'BUSY'
|
||||
static.ARQ_DATA_CHANNEL_LAST_RECEIVED = int(time.time())
|
||||
|
||||
|
||||
static.ARQ_N_FRAME = int.from_bytes(bytes(data_in[:1]), "big") - 10 # get number of burst frame
|
||||
static.ARQ_N_RX_FRAMES_PER_BURSTS = int.from_bytes(bytes(data_in[1:2]), "big") # get number of bursts from received frame
|
||||
static.ARQ_RX_N_CURRENT_ARQ_FRAME = int.from_bytes(bytes(data_in[2:4]), "big") # get current number of total frames
|
||||
|
@ -59,6 +74,10 @@ def arq_data_received(data_in):
|
|||
except IndexError:
|
||||
|
||||
static.ARQ_RX_FRAME_BUFFER = []
|
||||
|
||||
#on a new transmission we reset the timer
|
||||
static.ARQ_START_OF_TRANSMISSION = int(time.time()) + 4
|
||||
|
||||
for i in range(0, static.ARQ_N_ARQ_FRAMES_PER_DATA_FRAME + 1):
|
||||
static.ARQ_RX_FRAME_BUFFER.insert(i, None)
|
||||
|
||||
|
@ -72,6 +91,7 @@ def arq_data_received(data_in):
|
|||
except IndexError:
|
||||
|
||||
static.ARQ_RX_BURST_BUFFER = []
|
||||
|
||||
for i in range(0, static.ARQ_N_RX_FRAMES_PER_BURSTS + 1):
|
||||
static.ARQ_RX_BURST_BUFFER.insert(i, None)
|
||||
|
||||
|
@ -174,6 +194,10 @@ def arq_data_received(data_in):
|
|||
if frame_payload_crc == static.FRAME_CRC:
|
||||
logging.log(25, "ARQ | RX | DATA FRAME SUCESSFULLY RECEIVED! :-) ")
|
||||
|
||||
transfer_rates = helpers.calculate_transfer_rate()
|
||||
print(str(transfer_rates[0]) + " bit/s")
|
||||
print(str(transfer_rates[1]) + " B/min")
|
||||
|
||||
# append received frame to RX_BUFFER
|
||||
static.RX_BUFFER.append(complete_data_frame)
|
||||
|
||||
|
@ -184,7 +208,7 @@ def arq_data_received(data_in):
|
|||
ack_frame[2:3] = static.MYCALLSIGN_CRC8
|
||||
|
||||
# TRANSMIT ACK FRAME FOR BURST-----------------------------------------------
|
||||
time.sleep(1) # 0.5
|
||||
time.sleep(0.5) # 0.5
|
||||
logging.info("ARQ | TX | ARQ DATA FRAME ACK [" + str(static.FRAME_CRC.hex()) + "] [BER." + str(static.BER) + "]")
|
||||
|
||||
modem.transmit_signalling(ack_frame)
|
||||
|
@ -413,7 +437,9 @@ def arq_transmit(data_out):
|
|||
pass
|
||||
|
||||
# IF TX BUFFER IS EMPTY / ALL FRAMES HAVE BEEN SENT --> HERE WE COULD ADD AN static.VAR for IDLE STATE
|
||||
|
||||
transfer_rates = helpers.calculate_transfer_rate()
|
||||
print(str(transfer_rates[0]) + " bit/s")
|
||||
print(str(transfer_rates[1]) + " B/min")
|
||||
logging.info("ARQ | TX | BUFFER EMPTY")
|
||||
helpers.arq_reset_frame_machine()
|
||||
# await asyncio.sleep(2)
|
||||
|
@ -434,6 +460,11 @@ def get_n_frames_per_burst():
|
|||
return n_frames_per_burst
|
||||
|
||||
|
||||
def get_best_mode_for_transmission():
|
||||
return 12
|
||||
|
||||
|
||||
|
||||
def burst_ack_received():
|
||||
static.ARQ_ACK_RECEIVED = True # Force data loops of TNC to stop and continue with next frame
|
||||
static.ARQ_DATA_CHANNEL_LAST_RECEIVED = int(time.time()) # we need to update our timeout timestamp
|
||||
|
@ -466,7 +497,7 @@ async def arq_open_data_channel():
|
|||
|
||||
logging.info("DATA [" + str(static.MYCALLSIGN, 'utf-8') + "]>> <<[" + str(static.DXCALLSIGN, 'utf-8') + "] [BER." + str(static.BER) + "]")
|
||||
|
||||
static.ARQ_DATA_CHANNEL_MODE = 12
|
||||
static.ARQ_DATA_CHANNEL_MODE = get_best_mode_for_transmission()
|
||||
static.ARQ_DATA_CHANNEL_LAST_RECEIVED = int(time.time())
|
||||
|
||||
while static.CHANNEL_STATE == 'SENDING_SIGNALLING':
|
||||
|
|
24
modem.py
24
modem.py
|
@ -334,16 +334,9 @@ class RF():
|
|||
self.c_lib.freedv_set_sync(freedv, 0)
|
||||
|
||||
# here we do a buffer cleanup before returning to demod loop
|
||||
dummy_mod = bytes(self.c_lib.freedv_nin(freedv))
|
||||
self.c_lib.freedv_rawdatarx(freedv, bytes_out, dummy_mod)
|
||||
|
||||
|
||||
#stats = 0
|
||||
#stats = self.c_lib.freedv_get_modem_extended_stats(freedv, stats);
|
||||
#print(stats)
|
||||
|
||||
# freedv_get_modem_stats(freedv, &sync, &snr_est);
|
||||
#freedv_get_modem_extended_stats(freedv, &stats);
|
||||
#for i in range(0, 10):
|
||||
# dummy_mod = bytes(self.c_lib.freedv_nin(freedv))
|
||||
# self.c_lib.freedv_rawdatarx(freedv, bytes_out, dummy_mod)
|
||||
|
||||
|
||||
# demod loop
|
||||
|
@ -382,9 +375,11 @@ class RF():
|
|||
stuck_in_sync_counter = 0
|
||||
stuck_in_sync_10_counter = 0
|
||||
# -----------------------------------
|
||||
|
||||
#self.calculate_ber(freedv)
|
||||
self.calculate_snr(freedv)
|
||||
# forward data only if broadcast or we are the receiver
|
||||
if nbytes == bytes_per_frame and bytes(bytes_out[1:2]) == static.MYCALLSIGN_CRC8 or bytes(bytes_out[1:2]) == b'\x01':
|
||||
# bytes_out[1:2] == callsign check for signalling frames, bytes_out[6:7] == callsign check for data frames, bytes_out[1:2] == b'\x01' --> broadcasts like CQ
|
||||
if nbytes == bytes_per_frame and bytes(bytes_out[1:2]) == static.MYCALLSIGN_CRC8 or bytes(bytes_out[6:7]) == static.MYCALLSIGN_CRC8 or bytes(bytes_out[1:2]) == b'\x01':
|
||||
self.calculate_ber(freedv)
|
||||
self.calculate_snr(freedv)
|
||||
|
||||
|
@ -485,6 +480,9 @@ class RF():
|
|||
if frame == n_frames_per_burst:
|
||||
logging.debug("LAST FRAME ---> UNSYNC")
|
||||
self.c_lib.freedv_set_sync(freedv, 0) # FORCE UNSYNC
|
||||
for i in range(0, 10):
|
||||
dummy_mod = bytes(self.c_lib.freedv_nin(freedv))
|
||||
self.c_lib.freedv_rawdatarx(freedv, bytes_out, dummy_mod)
|
||||
|
||||
# clear bytes_out buffer to be ready for next frames after successfull decoding
|
||||
|
||||
|
@ -504,6 +502,7 @@ class RF():
|
|||
def calculate_ber(self, freedv):
|
||||
Tbits = self.c_lib.freedv_get_total_bits(freedv)
|
||||
Terrs = self.c_lib.freedv_get_total_bit_errors(freedv)
|
||||
|
||||
if Tbits != 0:
|
||||
ber = (Terrs / Tbits) * 100
|
||||
static.BER = int(ber)
|
||||
|
@ -519,4 +518,3 @@ class RF():
|
|||
self.c_lib.freedv_get_modem_stats(freedv,byref(modem_stats_sync), byref(modem_stats_snr))
|
||||
modem_stats_snr = modem_stats_snr.value
|
||||
static.SNR = int(modem_stats_snr)
|
||||
print(static.SNR)
|
||||
|
|
4
sock.py
4
sock.py
|
@ -11,6 +11,7 @@ import threading
|
|||
import logging
|
||||
import json
|
||||
import asyncio
|
||||
import time
|
||||
|
||||
import static
|
||||
import data_handler
|
||||
|
@ -106,6 +107,9 @@ class CMDTCPRequestHandler(socketserver.BaseRequestHandler):
|
|||
if received_json["command"] == "ARQ:DATA" and static.ARQ_READY_FOR_DATA == True: # and static.ARQ_STATE == 'CONNECTED' :
|
||||
static.TNC_STATE = 'BUSY'
|
||||
|
||||
#on a new transmission we reset the timer
|
||||
static.ARQ_START_OF_TRANSMISSION = int(time.time())
|
||||
|
||||
data_out = bytes(received_json["data"], 'utf-8')
|
||||
|
||||
ARQ_DATA_THREAD = threading.Thread(target=data_handler.arq_transmit, args=[data_out], name="ARQ_DATA")
|
||||
|
|
|
@ -79,7 +79,7 @@ AUDIO_RMS = 0
|
|||
# ---------------------------------
|
||||
|
||||
# ARQ DEFAULTS
|
||||
TX_N_MAX_RETRIES = 5
|
||||
TX_N_MAX_RETRIES = 2
|
||||
TX_N_RETRIES = 0
|
||||
|
||||
ARQ_TX_N_FRAMES_PER_BURST = 0
|
||||
|
@ -151,9 +151,14 @@ TNC_STATE = 'IDLE'
|
|||
|
||||
# MODE FOR SENDING AN RECEIVING DATA DURING ARQ SESSION
|
||||
ARQ_READY_FOR_DATA = False
|
||||
ARQ_DATA_CHANNEL_MODE = 12
|
||||
ARQ_DATA_CHANNEL_MODE = 0
|
||||
ARQ_DATA_CHANNEL_LAST_RECEIVED = 0
|
||||
|
||||
# BIT RATE MESSUREMENT
|
||||
ARQ_START_OF_TRANSMISSION = 0
|
||||
#ARQ_END_OF_TRANSMISSION = 0
|
||||
ARQ_BITS_PER_SECOND = 0
|
||||
ARQ_BYTES_PER_MINUTE = 0
|
||||
|
||||
# ------- TX BUFFER
|
||||
TX_BUFFER_SIZE = 0
|
||||
|
|
Loading…
Reference in a new issue