mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
ARQ WIP - session closing
This commit is contained in:
parent
7b712b9369
commit
c81698a698
|
@ -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
|
||||
|
||||
|
|
|
@ -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,10 +101,12 @@ 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"])
|
||||
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()
|
||||
|
@ -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)
|
|
@ -124,6 +124,7 @@ class DataFrameFactory:
|
|||
"snr": 1,
|
||||
"speed_level": 1,
|
||||
"frames_per_burst": 1,
|
||||
"flag": 1,
|
||||
}
|
||||
|
||||
# arq burst frame
|
||||
|
@ -228,7 +229,7 @@ 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
|
||||
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in a new issue