byte rate messurement

This commit is contained in:
DJ2LS 2021-03-17 11:22:06 +01:00 committed by GitHub
parent c7f85f8505
commit 70ff859cc3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 61 additions and 23 deletions

View file

@ -26,9 +26,24 @@ 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
@ -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)
@ -173,7 +193,11 @@ def arq_data_received(data_in):
# IF THE FRAME PAYLOAD CRC IS EQUAL TO THE FRAME CRC WHICH IS KNOWN FROM THE HEADER --> SUCCESS
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':

View file

@ -334,17 +334,10 @@ 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)
#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)
#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);
# demod loop
while (static.CHANNEL_STATE == 'RECEIVING_DATA' and static.ARQ_DATA_CHANNEL_MODE == mode) or (static.CHANNEL_STATE == 'RECEIVING_SIGNALLING' and static.FREEDV_SIGNALLING_MODE == mode):
@ -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)
@ -401,7 +396,7 @@ class RF():
#self.c_lib.freedv_set_frames_per_burst(freedv_data, n_frames_per_burst);
if 50 >= frametype >= 10:
if frame != 3 or force == True:
@ -485,7 +480,10 @@ 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
bytes_out = (ctypes.c_ubyte * bytes_per_frame)
@ -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)
@ -515,8 +514,7 @@ class RF():
modem_stats_snr = c_float()
modem_stats_sync = c_int()
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)

View file

@ -11,6 +11,7 @@ import threading
import logging
import json
import asyncio
import time
import static
import data_handler
@ -105,7 +106,10 @@ 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")

View file

@ -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