diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index 231c3cc5..e1be4fad 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -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 diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index 43f584ba..4c57896f 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -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) \ No newline at end of file diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index 96397066..b7583501 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -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)