diff --git a/data_handler.py b/data_handler.py index 1a83d9ec..a9fe3e4b 100644 --- a/data_handler.py +++ b/data_handler.py @@ -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': diff --git a/modem.py b/modem.py index 78d1746c..c2f932a8 100644 --- a/modem.py +++ b/modem.py @@ -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) diff --git a/sock.py b/sock.py index c586345b..b3df0e7c 100644 --- a/sock.py +++ b/sock.py @@ -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") diff --git a/static.py b/static.py index 77b62db3..3aab5b05 100644 --- a/static.py +++ b/static.py @@ -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