ARQ WIP - session closing

This commit is contained in:
DJ2LS 2023-12-20 19:30:38 +01:00
parent 7b712b9369
commit c81698a698
3 changed files with 30 additions and 16 deletions

View file

@ -16,9 +16,6 @@ class IRS_State(Enum):
class ARQSessionIRS(arq_session.ARQSession):
RETRIES_CONNECT = 3
RETRIES_TRANSFER = 3 # we need to increase this
TIMEOUT_CONNECT = 3
TIMEOUT_DATA = 12

View file

@ -67,8 +67,7 @@ class ARQSessionISS(arq_session.ARQSession):
self.log("Timeout!")
retries = retries - 1
self.set_state(ISS_State.FAILED)
self.log("Session failed")
self.event_manager.send_arq_session_finished(True, self.id, self.dxcall, len(self.data), False)
self.transmission_failed()
def launch_twr(self, frame_or_burst, timeout, retries, mode):
twr = threading.Thread(target = self.transmit_wait_and_retry, args=[frame_or_burst, timeout, retries, mode])
@ -102,11 +101,13 @@ class ARQSessionISS(arq_session.ARQSession):
self.event_manager.send_arq_session_progress(
True, self.id, self.dxcall, self.confirmed_bytes, len(self.data))
if self.confirmed_bytes == len(self.data) and irs_frame["flag"]["FINAL"]:
self.set_state(ISS_State.ENDED)
self.log("All data transfered!")
self.event_manager.send_arq_session_finished(True, self.id, self.dxcall, len(self.data), irs_frame["flag"]["CHECKSUM"])
return
if irs_frame["flag"]["FINAL"]:
if self.confirmed_bytes == len(self.data) and irs_frame["flag"]["CHECKSUM"]:
self.transmission_ended()
return
else:
self.transmission_failed()
return
payload_size = self.get_data_payload_size()
burst = []
@ -119,3 +120,13 @@ class ARQSessionISS(arq_session.ARQSession):
burst.append(data_frame)
self.launch_twr(burst, self.TIMEOUT_TRANSFER, self.RETRIES_CONNECT, mode='auto')
self.set_state(ISS_State.BURST_SENT)
def transmission_ended(self):
self.set_state(ISS_State.ENDED)
self.log("All data transfered!")
self.event_manager.send_arq_session_finished(True, self.id, self.dxcall, len(self.data),True)
def transmission_failed(self):
self.set_state(ISS_State.FAILED)
self.log("Transmission failed!")
self.event_manager.send_arq_session_finished(True, self.id, self.dxcall, len(self.data),False)

View file

@ -124,6 +124,7 @@ class DataFrameFactory:
"snr": 1,
"speed_level": 1,
"frames_per_burst": 1,
"flag": 1,
}
# arq burst frame
@ -228,12 +229,12 @@ class DataFrameFactory:
data = int.from_bytes(data, "big")
extracted_data[key] = {}
if frametype == FR_TYPE.ARQ_BURST_ACK.value:
if frametype in [FR_TYPE.ARQ_BURST_ACK.value, FR_TYPE.ARQ_SESSION_INFO_ACK.value]:
flag_dict = self.ARQ_FLAGS
for flag in flag_dict:
# Update extracted_data with the status of each flag
# get_flag returns True or False based on the bit value at the flag's position
extracted_data[key][flag] = helpers.get_flag(data, flag, flag_dict)
for flag in flag_dict:
# Update extracted_data with the status of each flag
# get_flag returns True or False based on the bit value at the flag's position
extracted_data[key][flag] = helpers.get_flag(data, flag, flag_dict)
else:
extracted_data[key] = data
@ -353,7 +354,11 @@ class DataFrameFactory:
}
return self.construct(FR_TYPE.ARQ_SESSION_INFO, payload)
def build_arq_session_info_ack(self, session_id, total_crc, snr, speed_level, frames_per_burst):
def build_arq_session_info_ack(self, session_id, total_crc, snr, speed_level, frames_per_burst, flag_final=False):
flag = 0b00000000
if flag_final:
flag = helpers.set_flag(flag, 'FINAL', True, self.ARQ_FLAGS)
payload = {
"frame_length": self.LENGTH_SIG0_FRAME,
"session_id": session_id.to_bytes(1, 'big'),
@ -361,6 +366,7 @@ class DataFrameFactory:
"snr": snr.to_bytes(1, 'big'),
"speed_level": speed_level.to_bytes(1, 'big'),
"frames_per_burst": frames_per_burst.to_bytes(1, 'big'),
"flag": flag.to_bytes(1, 'big'),
}
return self.construct(FR_TYPE.ARQ_SESSION_INFO_ACK, payload)