From ca7e7f655839b22f2b85d6fa6c0bda4daab1ac26 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 25 Dec 2023 13:26:51 +0100 Subject: [PATCH] ARQ WIP - added more events --- modem/arq_session_irs.py | 16 +++++++++------- modem/arq_session_iss.py | 14 +++++++++----- modem/event_manager.py | 9 ++++++--- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index 770d84bc..28dc0030 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -17,7 +17,7 @@ class IRS_State(Enum): class ARQSessionIRS(arq_session.ARQSession): TIMEOUT_CONNECT = 10 - TIMEOUT_DATA = 12 + TIMEOUT_DATA = 60 STATE_TRANSITION = { IRS_State.NEW: { @@ -87,7 +87,7 @@ class ARQSessionIRS(arq_session.ARQSession): if not self.event_frame_received.wait(timeout): self.log("Timeout waiting for ISS. Session failed.") self.set_state(IRS_State.FAILED) - self.event_manager.send_arq_session_finished(False, self.id, self.dxcall, self.total_length, False) + self.event_manager.send_arq_session_finished(False, self.id, self.dxcall, self.total_length, False, self.state.name) def launch_transmit_and_wait(self, frame, timeout, mode): thread_wait = threading.Thread(target = self.transmit_and_wait, @@ -111,7 +111,7 @@ class ARQSessionIRS(arq_session.ARQSession): self.dx_snr.append(info_frame['snr']) self.log(f"New transfer of {self.total_length} bytes") - self.event_manager.send_arq_session_new(False, self.id, self.dxcall, self.total_length) + self.event_manager.send_arq_session_new(False, self.id, self.dxcall, self.total_length, self.state) self.calibrate_speed_settings() self.set_decode_mode() @@ -142,7 +142,7 @@ class ARQSessionIRS(arq_session.ARQSession): self.received_bytes += len(data_part) self.log(f"Received {self.received_bytes}/{self.total_length} bytes") self.event_manager.send_arq_session_progress( - False, self.id, self.dxcall, self.received_bytes, self.total_length) + False, self.id, self.dxcall, self.received_bytes, self.total_length, self.state.name) return True @@ -174,7 +174,7 @@ class ARQSessionIRS(arq_session.ARQSession): self.log("ACK sent") self.set_state(IRS_State.ENDED) self.event_manager.send_arq_session_finished( - False, self.id, self.dxcall, self.total_length, True) + False, self.id, self.dxcall, self.total_length, True, self.state.name) else: @@ -189,7 +189,7 @@ class ARQSessionIRS(arq_session.ARQSession): self.log("CRC fail at the end of transmission!") self.set_state(IRS_State.FAILED) self.event_manager.send_arq_session_finished( - False, self.id, self.dxcall, self.total_length, False) + False, self.id, self.dxcall, self.total_length, False, self.state.name) def calibrate_speed_settings(self): @@ -211,4 +211,6 @@ class ARQSessionIRS(arq_session.ARQSession): def send_stop_ack(self, stop_frame): stop_ack = self.frame_factory.build_arq_stop_ack(self.id) self.launch_transmit_and_wait(stop_ack, self.TIMEOUT_CONNECT, mode=FREEDV_MODE.signalling) - self.set_state(IRS_State.FAILED) \ No newline at end of file + self.set_state(IRS_State.ABORTED) + self.event_manager.send_arq_session_finished( + False, self.id, self.dxcall, self.total_length, False, self.status) \ No newline at end of file diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index 64a83c0a..5f9dfa94 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -129,7 +129,7 @@ class ARQSessionISS(arq_session.ARQSession): self.confirmed_bytes = irs_frame['offset'] self.log(f"IRS confirmed {self.confirmed_bytes}/{len(self.data)} bytes") 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), self.state.name) if irs_frame["flag"]["FINAL"]: if self.confirmed_bytes == len(self.data) and irs_frame["flag"]["CHECKSUM"]: @@ -154,15 +154,17 @@ class ARQSessionISS(arq_session.ARQSession): def transmission_ended(self, irs_frame): self.set_state(ISS_State.ENDED) self.log(f"All data transfered! flag_final={irs_frame['flag']['FINAL']}, flag_checksum={irs_frame['flag']['CHECKSUM']}") - self.event_manager.send_arq_session_finished(True, self.id, self.dxcall, len(self.data),True) + self.event_manager.send_arq_session_finished(True, self.id, self.dxcall, len(self.data),True, self.state.name) def transmission_failed(self, irs_frame=None): self.set_state(ISS_State.FAILED) self.log(f"Transmission failed!") - self.event_manager.send_arq_session_finished(True, self.id, self.dxcall, len(self.data),False) + self.event_manager.send_arq_session_finished(True, self.id, self.dxcall, len(self.data),False, self.state.name) def abort_transmission(self, irs_frame=None): - self.log(f"Stopping transmission...") + self.log(f"aborting transmission...") + self.event_manager.send_arq_session_finished( + True, self.id, self.dxcall, self.total_length, False, self.state.name) self.set_state(ISS_State.ABORTING) # interrupt possible pending retries self.retry = False @@ -175,4 +177,6 @@ class ARQSessionISS(arq_session.ARQSession): def aborted(self, irs_frame): self.log("session aborted") - self.set_state(ISS_State.ABORTED) \ No newline at end of file + self.set_state(ISS_State.ABORTED) + self.event_manager.send_arq_session_finished( + True, self.id, self.dxcall, self.total_length, False, self.state.name) \ No newline at end of file diff --git a/modem/event_manager.py b/modem/event_manager.py index 156c22cf..b8fd23b0 100644 --- a/modem/event_manager.py +++ b/modem/event_manager.py @@ -28,18 +28,19 @@ class EventManager: def send_custom_event(self, **event_data): self.broadcast(event_data) - def send_arq_session_new(self, outbound: bool, session_id, dxcall, total_bytes): + def send_arq_session_new(self, outbound: bool, session_id, dxcall, total_bytes, state): direction = 'outbound' if outbound else 'inbound' event = { f"arq-transfer-{direction}": { 'session_id': session_id, 'dxcall': dxcall, 'total_bytes': total_bytes, + 'state': state, } } self.broadcast(event) - def send_arq_session_progress(self, outbound: bool, session_id, dxcall, received_bytes, total_bytes): + def send_arq_session_progress(self, outbound: bool, session_id, dxcall, received_bytes, total_bytes, state): direction = 'outbound' if outbound else 'inbound' event = { f"arq-transfer-{direction}": { @@ -47,11 +48,12 @@ class EventManager: 'dxcall': dxcall, 'received_bytes': received_bytes, 'total_bytes': total_bytes, + 'state': state, } } self.broadcast(event) - def send_arq_session_finished(self, outbound: bool, session_id, dxcall, total_bytes, success: bool): + def send_arq_session_finished(self, outbound: bool, session_id, dxcall, total_bytes, success: bool, state): direction = 'outbound' if outbound else 'inbound' event = { f"arq-transfer-{direction}": { @@ -59,6 +61,7 @@ class EventManager: 'dxcall': dxcall, 'total_bytes': total_bytes, 'success': success, + 'state': state, } } self.broadcast(event)