mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
pep related improvements to ARQ
This commit is contained in:
parent
ff6ef4b130
commit
cc6b3eb958
3 changed files with 25 additions and 26 deletions
|
@ -1,5 +1,5 @@
|
||||||
import datetime
|
import datetime
|
||||||
import queue, threading
|
import threading
|
||||||
import codec2
|
import codec2
|
||||||
import data_frame_factory
|
import data_frame_factory
|
||||||
import structlog
|
import structlog
|
||||||
|
@ -9,7 +9,7 @@ import time
|
||||||
from arq_data_type_handler import ARQDataTypeHandler
|
from arq_data_type_handler import ARQDataTypeHandler
|
||||||
|
|
||||||
|
|
||||||
class ARQSession():
|
class ARQSession:
|
||||||
|
|
||||||
SPEED_LEVEL_DICT = {
|
SPEED_LEVEL_DICT = {
|
||||||
0: {
|
0: {
|
||||||
|
@ -63,7 +63,7 @@ class ARQSession():
|
||||||
self.bpm_histogram = []
|
self.bpm_histogram = []
|
||||||
self.time_histogram = []
|
self.time_histogram = []
|
||||||
|
|
||||||
def log(self, message, isWarning = False):
|
def log(self, message, isWarning=False):
|
||||||
msg = f"[{type(self).__name__}][id={self.id}][state={self.state}]: {message}"
|
msg = f"[{type(self).__name__}][id={self.id}][state={self.state}]: {message}"
|
||||||
logger = self.logger.warn if isWarning else self.logger.info
|
logger = self.logger.warn if isWarning else self.logger.info
|
||||||
logger(msg)
|
logger(msg)
|
||||||
|
@ -99,21 +99,22 @@ class ARQSession():
|
||||||
self.event_frame_received.set()
|
self.event_frame_received.set()
|
||||||
self.log(f"Received {frame['frame_type']}")
|
self.log(f"Received {frame['frame_type']}")
|
||||||
frame_type = frame['frame_type_int']
|
frame_type = frame['frame_type_int']
|
||||||
if self.state in self.STATE_TRANSITION:
|
if self.state in self.STATE_TRANSITION and frame_type in self.STATE_TRANSITION[self.state]:
|
||||||
if frame_type in self.STATE_TRANSITION[self.state]:
|
action_name = self.STATE_TRANSITION[self.state][frame_type]
|
||||||
action_name = self.STATE_TRANSITION[self.state][frame_type]
|
received_data, type_byte = getattr(self, action_name)(frame)
|
||||||
received_data, type_byte = getattr(self, action_name)(frame)
|
if isinstance(received_data, bytearray) and isinstance(type_byte, int):
|
||||||
if isinstance(received_data, bytearray) and isinstance(type_byte, int):
|
self.arq_data_type_handler.dispatch(type_byte, received_data, self.update_histograms(len(received_data), len(received_data)))
|
||||||
self.arq_data_type_handler.dispatch(type_byte, received_data, self.update_histograms(len(received_data), len(received_data)))
|
return
|
||||||
return
|
|
||||||
|
|
||||||
self.log(f"Ignoring unknown transition from state {self.state.name} with frame {frame['frame_type']}")
|
self.log(f"Ignoring unknown transition from state {self.state.name} with frame {frame['frame_type']}")
|
||||||
|
|
||||||
def is_session_outdated(self):
|
def is_session_outdated(self):
|
||||||
session_alivetime = time.time() - self.session_max_age
|
session_alivetime = time.time() - self.session_max_age
|
||||||
if self.session_ended < session_alivetime and self.state.name in ['FAILED', 'ENDED', 'ABORTED']:
|
return self.session_ended < session_alivetime and self.state.name in [
|
||||||
return True
|
'FAILED',
|
||||||
return False
|
'ENDED',
|
||||||
|
'ABORTED',
|
||||||
|
]
|
||||||
|
|
||||||
def calculate_session_duration(self):
|
def calculate_session_duration(self):
|
||||||
if self.session_ended == 0:
|
if self.session_ended == 0:
|
||||||
|
@ -123,7 +124,7 @@ class ARQSession():
|
||||||
|
|
||||||
def calculate_session_statistics(self, confirmed_bytes, total_bytes):
|
def calculate_session_statistics(self, confirmed_bytes, total_bytes):
|
||||||
duration = self.calculate_session_duration()
|
duration = self.calculate_session_duration()
|
||||||
#total_bytes = self.total_length
|
# total_bytes = self.total_length
|
||||||
# self.total_length
|
# self.total_length
|
||||||
duration_in_minutes = duration / 60 # Convert duration from seconds to minutes
|
duration_in_minutes = duration / 60 # Convert duration from seconds to minutes
|
||||||
|
|
||||||
|
@ -134,9 +135,9 @@ class ARQSession():
|
||||||
bytes_per_minute = 0
|
bytes_per_minute = 0
|
||||||
|
|
||||||
# Convert histograms lists to dictionaries
|
# Convert histograms lists to dictionaries
|
||||||
time_histogram_dict = {i: timestamp for i, timestamp in enumerate(self.time_histogram)}
|
time_histogram_dict = dict(enumerate(self.time_histogram))
|
||||||
snr_histogram_dict = {i: snr for i, snr in enumerate(self.snr_histogram)}
|
snr_histogram_dict = dict(enumerate(self.snr_histogram))
|
||||||
bpm_histogram_dict = {i: bpm for i, bpm in enumerate(self.bpm_histogram)}
|
bpm_histogram_dict = dict(enumerate(self.bpm_histogram))
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'total_bytes': total_bytes,
|
'total_bytes': total_bytes,
|
||||||
|
|
|
@ -82,8 +82,7 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
return self.total_length == self.received_bytes
|
return self.total_length == self.received_bytes
|
||||||
|
|
||||||
def final_crc_matches(self) -> bool:
|
def final_crc_matches(self) -> bool:
|
||||||
match = self.total_crc == helpers.get_crc_32(bytes(self.received_data)).hex()
|
return self.total_crc == helpers.get_crc_32(bytes(self.received_data)).hex()
|
||||||
return match
|
|
||||||
|
|
||||||
def transmit_and_wait(self, frame, timeout, mode):
|
def transmit_and_wait(self, frame, timeout, mode):
|
||||||
self.event_frame_received.clear()
|
self.event_frame_received.clear()
|
||||||
|
@ -247,7 +246,7 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
return self.speed_level
|
return self.speed_level
|
||||||
|
|
||||||
def abort_transmission(self):
|
def abort_transmission(self):
|
||||||
self.log(f"Aborting transmission... setting abort flag")
|
self.log("Aborting transmission... setting abort flag")
|
||||||
self.abort = True
|
self.abort = True
|
||||||
|
|
||||||
def send_stop_ack(self, stop_frame):
|
def send_stop_ack(self, stop_frame):
|
||||||
|
@ -263,7 +262,7 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
# final function for failed transmissions
|
# final function for failed transmissions
|
||||||
self.session_ended = time.time()
|
self.session_ended = time.time()
|
||||||
self.set_state(IRS_State.FAILED)
|
self.set_state(IRS_State.FAILED)
|
||||||
self.log(f"Transmission failed!")
|
self.log("Transmission failed!")
|
||||||
self.event_manager.send_arq_session_finished(True, self.id, self.dxcall,False, self.state.name, statistics=self.calculate_session_statistics(self.received_bytes, self.total_length))
|
self.event_manager.send_arq_session_finished(True, self.id, self.dxcall,False, self.state.name, statistics=self.calculate_session_statistics(self.received_bytes, self.total_length))
|
||||||
self.states.setARQ(False)
|
self.states.setARQ(False)
|
||||||
return None, None
|
return None, None
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import threading
|
import threading
|
||||||
import data_frame_factory
|
import data_frame_factory
|
||||||
import queue
|
|
||||||
import random
|
import random
|
||||||
from codec2 import FREEDV_MODE
|
from codec2 import FREEDV_MODE
|
||||||
from modem_frametypes import FRAME_TYPE
|
from modem_frametypes import FRAME_TYPE
|
||||||
|
@ -174,7 +173,7 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
|
|
||||||
payload_size = self.get_data_payload_size()
|
payload_size = self.get_data_payload_size()
|
||||||
burst = []
|
burst = []
|
||||||
for f in range(0, self.frames_per_burst):
|
for _ in range(0, self.frames_per_burst):
|
||||||
offset = self.confirmed_bytes
|
offset = self.confirmed_bytes
|
||||||
payload = self.data[offset : offset + payload_size]
|
payload = self.data[offset : offset + payload_size]
|
||||||
data_frame = self.frame_factory.build_arq_burst_frame(
|
data_frame = self.frame_factory.build_arq_burst_frame(
|
||||||
|
@ -200,7 +199,7 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
# final function for failed transmissions
|
# final function for failed transmissions
|
||||||
self.session_ended = time.time()
|
self.session_ended = time.time()
|
||||||
self.set_state(ISS_State.FAILED)
|
self.set_state(ISS_State.FAILED)
|
||||||
self.log(f"Transmission failed!")
|
self.log("Transmission failed!")
|
||||||
self.event_manager.send_arq_session_finished(True, self.id, self.dxcall,False, self.state.name, statistics=self.calculate_session_statistics(self.confirmed_bytes, self.total_length))
|
self.event_manager.send_arq_session_finished(True, self.id, self.dxcall,False, self.state.name, statistics=self.calculate_session_statistics(self.confirmed_bytes, self.total_length))
|
||||||
self.states.setARQ(False)
|
self.states.setARQ(False)
|
||||||
|
|
||||||
|
@ -209,7 +208,7 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
|
|
||||||
def abort_transmission(self, irs_frame=None):
|
def abort_transmission(self, irs_frame=None):
|
||||||
# function for starting the abort sequence
|
# function for starting the abort sequence
|
||||||
self.log(f"aborting transmission...")
|
self.log("aborting transmission...")
|
||||||
self.set_state(ISS_State.ABORTING)
|
self.set_state(ISS_State.ABORTING)
|
||||||
|
|
||||||
self.event_manager.send_arq_session_finished(
|
self.event_manager.send_arq_session_finished(
|
||||||
|
|
Loading…
Reference in a new issue