From 06ec029ee7ee2a6020ffc31cd9b387d30e7f272d Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Fri, 29 Dec 2023 19:25:59 +0100 Subject: [PATCH] ARQ WIP - adjusted session closing --- modem/arq_session_iss.py | 27 +++++++++------------------ tests/test_arq_session.py | 4 ++-- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index 642b2a07..a9b4ed0f 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -15,9 +15,8 @@ class ISS_State(Enum): BURST_SENT = 3 ENDED = 4 FAILED = 5 - BREAK = 6 # state for interrupting actual retries - ABORTING = 7 # state while running abort sequence and waiting for stop ack - ABORTED = 8 # stop ack received + ABORTING = 6 # state while running abort sequence and waiting for stop ack + ABORTED = 7 # stop ack received class ARQSessionISS(arq_session.ARQSession): @@ -27,6 +26,7 @@ class ARQSessionISS(arq_session.ARQSession): # DJ2LS: 3.5 seconds is working well WITHOUT a channel busy detection delay TIMEOUT_CONNECT_ACK = 3.5 TIMEOUT_TRANSFER = 3.5 + TIMEOUT_STOP_ACK = 3.5 STATE_TRANSITION = { ISS_State.OPEN_SENT: { @@ -42,12 +42,7 @@ class ARQSessionISS(arq_session.ARQSession): FRAME_TYPE.ARQ_BURST_ACK.value: 'send_data', }, ISS_State.FAILED:{ - FRAME_TYPE.ARQ_STOP_ACK.value: 'transmission_failed' - }, - ISS_State.BREAK: { - FRAME_TYPE.ARQ_BURST_ACK.value: 'abort_transmission', - FRAME_TYPE.ARQ_SESSION_OPEN_ACK.value: 'abort_transmission', - FRAME_TYPE.ARQ_SESSION_INFO_ACK.value: 'abort_transmission', + FRAME_TYPE.ARQ_STOP_ACK.value: 'transmission_aborted' }, ISS_State.ABORTING: { FRAME_TYPE.ARQ_STOP_ACK.value: 'transmission_aborted', @@ -75,7 +70,7 @@ class ARQSessionISS(arq_session.ARQSession): return random.randint(1,255) def transmit_wait_and_retry(self, frame_or_burst, timeout, retries, mode): - while retries > 0 and self.state not in [ISS_State.BREAK, ISS_State.ABORTED]: + while retries > 0: self.event_frame_received = threading.Event() if isinstance(frame_or_burst, list): burst = frame_or_burst else: burst = [frame_or_burst] @@ -87,10 +82,6 @@ class ARQSessionISS(arq_session.ARQSession): return self.log("Timeout!") retries = retries - 1 - - if self.state == ISS_State.ABORTED: - self.log("session aborted initiated...") - return self.set_state(ISS_State.FAILED) self.transmission_failed() @@ -167,22 +158,22 @@ class ARQSessionISS(arq_session.ARQSession): def abort_transmission(self, irs_frame=None): # function for starting the abort sequence self.log(f"aborting transmission...") + self.set_state(ISS_State.ABORTING) + self.event_manager.send_arq_session_finished( True, self.id, self.dxcall, len(self.data), False, self.state.name) # break actual retries - self.set_state(ISS_State.BREAK) + self.event_frame_received.set() # start with abort sequence # TODO: We have to wait some time here for avoiding collisions with actual transmissions... # This could be done by the channel busy detection, for example, if part of def transmit() in modem.py - self.set_state(ISS_State.ABORTING) - self.send_stop() def send_stop(self): stop_frame = self.frame_factory.build_arq_stop(self.id) - self.launch_twr(stop_frame, 15, self.RETRIES_CONNECT, mode=FREEDV_MODE.signalling) + self.launch_twr(stop_frame, self.TIMEOUT_STOP_ACK, self.RETRIES_CONNECT, mode=FREEDV_MODE.signalling) def transmission_aborted(self, irs_frame): self.log("session aborted") diff --git a/tests/test_arq_session.py b/tests/test_arq_session.py index c74de584..716ea530 100644 --- a/tests/test_arq_session.py +++ b/tests/test_arq_session.py @@ -98,10 +98,10 @@ class TestARQSession(unittest.TestCase): key = 'arq-transfer-outbound' if outbound else 'arq-transfer-inbound' while True: ev = q.get() - if key in ev and 'success' in ev[key]: + if key in ev and ('success' in ev[key] or 'ABORTED' in ev[key]): self.logger.info(f"[{threading.current_thread().name}] {key} session ended.") break - + def establishChannels(self): self.channels_running = True self.iss_to_irs_channel = threading.Thread(target=self.channelWorker,