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):
|
class ARQSessionIRS(arq_session.ARQSession):
|
||||||
|
|
||||||
RETRIES_CONNECT = 3
|
|
||||||
RETRIES_TRANSFER = 3 # we need to increase this
|
|
||||||
|
|
||||||
TIMEOUT_CONNECT = 3
|
TIMEOUT_CONNECT = 3
|
||||||
TIMEOUT_DATA = 12
|
TIMEOUT_DATA = 12
|
||||||
|
|
||||||
|
|
|
@ -67,8 +67,7 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
self.log("Timeout!")
|
self.log("Timeout!")
|
||||||
retries = retries - 1
|
retries = retries - 1
|
||||||
self.set_state(ISS_State.FAILED)
|
self.set_state(ISS_State.FAILED)
|
||||||
self.log("Session failed")
|
self.transmission_failed()
|
||||||
self.event_manager.send_arq_session_finished(True, self.id, self.dxcall, len(self.data), False)
|
|
||||||
|
|
||||||
def launch_twr(self, frame_or_burst, timeout, retries, mode):
|
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])
|
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(
|
self.event_manager.send_arq_session_progress(
|
||||||
True, self.id, self.dxcall, self.confirmed_bytes, len(self.data))
|
True, self.id, self.dxcall, self.confirmed_bytes, len(self.data))
|
||||||
|
|
||||||
if self.confirmed_bytes == len(self.data) and irs_frame["flag"]["FINAL"]:
|
if irs_frame["flag"]["FINAL"]:
|
||||||
self.set_state(ISS_State.ENDED)
|
if self.confirmed_bytes == len(self.data) and irs_frame["flag"]["CHECKSUM"]:
|
||||||
self.log("All data transfered!")
|
self.transmission_ended()
|
||||||
self.event_manager.send_arq_session_finished(True, self.id, self.dxcall, len(self.data), irs_frame["flag"]["CHECKSUM"])
|
return
|
||||||
return
|
else:
|
||||||
|
self.transmission_failed()
|
||||||
|
return
|
||||||
|
|
||||||
payload_size = self.get_data_payload_size()
|
payload_size = self.get_data_payload_size()
|
||||||
burst = []
|
burst = []
|
||||||
|
@ -119,3 +120,13 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
burst.append(data_frame)
|
burst.append(data_frame)
|
||||||
self.launch_twr(burst, self.TIMEOUT_TRANSFER, self.RETRIES_CONNECT, mode='auto')
|
self.launch_twr(burst, self.TIMEOUT_TRANSFER, self.RETRIES_CONNECT, mode='auto')
|
||||||
self.set_state(ISS_State.BURST_SENT)
|
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,
|
"snr": 1,
|
||||||
"speed_level": 1,
|
"speed_level": 1,
|
||||||
"frames_per_burst": 1,
|
"frames_per_burst": 1,
|
||||||
|
"flag": 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
# arq burst frame
|
# arq burst frame
|
||||||
|
@ -228,12 +229,12 @@ class DataFrameFactory:
|
||||||
|
|
||||||
data = int.from_bytes(data, "big")
|
data = int.from_bytes(data, "big")
|
||||||
extracted_data[key] = {}
|
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
|
flag_dict = self.ARQ_FLAGS
|
||||||
for flag in flag_dict:
|
for flag in flag_dict:
|
||||||
# Update extracted_data with the status of each flag
|
# 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
|
# 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)
|
extracted_data[key][flag] = helpers.get_flag(data, flag, flag_dict)
|
||||||
else:
|
else:
|
||||||
extracted_data[key] = data
|
extracted_data[key] = data
|
||||||
|
|
||||||
|
@ -353,7 +354,11 @@ class DataFrameFactory:
|
||||||
}
|
}
|
||||||
return self.construct(FR_TYPE.ARQ_SESSION_INFO, payload)
|
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 = {
|
payload = {
|
||||||
"frame_length": self.LENGTH_SIG0_FRAME,
|
"frame_length": self.LENGTH_SIG0_FRAME,
|
||||||
"session_id": session_id.to_bytes(1, 'big'),
|
"session_id": session_id.to_bytes(1, 'big'),
|
||||||
|
@ -361,6 +366,7 @@ class DataFrameFactory:
|
||||||
"snr": snr.to_bytes(1, 'big'),
|
"snr": snr.to_bytes(1, 'big'),
|
||||||
"speed_level": speed_level.to_bytes(1, 'big'),
|
"speed_level": speed_level.to_bytes(1, 'big'),
|
||||||
"frames_per_burst": frames_per_burst.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)
|
return self.construct(FR_TYPE.ARQ_SESSION_INFO_ACK, payload)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue