From ee0e3e4ad3372a866c305226babed53d9c0cbcfb Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Thu, 28 Dec 2023 22:47:17 +0100 Subject: [PATCH] ARQ WIP - introduced tests for session closing --- modem/arq_session_irs.py | 2 +- modem/arq_session_iss.py | 6 +++--- modem/data_frame_factory.py | 6 +++++- tests/test_arq_session.py | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index 860401fb..0117cb2e 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -215,4 +215,4 @@ class ARQSessionIRS(arq_session.ARQSession): self.launch_transmit_and_wait(stop_ack, self.TIMEOUT_CONNECT, mode=FREEDV_MODE.signalling) 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 + False, self.id, self.dxcall, self.total_length, False, self.state) \ No newline at end of file diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index 0991d030..642b2a07 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -50,13 +50,13 @@ class ARQSessionISS(arq_session.ARQSession): FRAME_TYPE.ARQ_SESSION_INFO_ACK.value: 'abort_transmission', }, ISS_State.ABORTING: { - FRAME_TYPE.ARQ_STOP_ACK.value: 'aborted', + FRAME_TYPE.ARQ_STOP_ACK.value: 'transmission_aborted', 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', }, ISS_State.ABORTED: { - FRAME_TYPE.ARQ_STOP_ACK.value: 'aborted', + FRAME_TYPE.ARQ_STOP_ACK.value: 'transmission_aborted', } } @@ -129,7 +129,7 @@ class ARQSessionISS(arq_session.ARQSession): True, self.id, self.dxcall, self.confirmed_bytes, len(self.data), self.state.name) if irs_frame["flag"]["ABORT"]: - self.transmission_aborted() + self.transmission_aborted(irs_frame) return if irs_frame["flag"]["FINAL"]: diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index cb077f05..0bed7e30 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -399,7 +399,7 @@ class DataFrameFactory: return frame def build_arq_burst_ack(self, session_id: bytes, offset, speed_level: int, - frames_per_burst: int, snr: int, flag_final=False, flag_checksum=False): + frames_per_burst: int, snr: int, flag_final=False, flag_checksum=False, flag_abort=False): flag = 0b00000000 if flag_final: flag = helpers.set_flag(flag, 'FINAL', True, self.ARQ_FLAGS) @@ -407,6 +407,10 @@ class DataFrameFactory: if flag_checksum: flag = helpers.set_flag(flag, 'CHECKSUM', True, self.ARQ_FLAGS) + if flag_abort: + flag = helpers.set_flag(flag, 'ABORT', True, self.ARQ_FLAGS) + + payload = { "session_id": session_id.to_bytes(1, 'big'), "offset": offset.to_bytes(4, 'big'), diff --git a/tests/test_arq_session.py b/tests/test_arq_session.py index 72b15b64..c74de584 100644 --- a/tests/test_arq_session.py +++ b/tests/test_arq_session.py @@ -148,5 +148,41 @@ class TestARQSession(unittest.TestCase): self.waitAndCloseChannels() + def testARQSessionAbortTransmissionISS(self): + # set Packet Error Rate (PER) / frame loss probability + self.loss_probability = 0 + + self.establishChannels() + params = { + 'dxcall': "DJ2LS-3", + 'data': base64.b64encode(np.random.bytes(100)), + } + cmd = ARQRawCommand(self.config, self.iss_state_manager, self.iss_event_queue, params) + cmd.run(self.iss_event_queue, self.iss_modem) + + threading.Event().wait(np.random.randint(1,10)) + for id in self.iss_state_manager.arq_iss_sessions: + self.iss_state_manager.arq_iss_sessions[id].abort_transmission() + + self.waitAndCloseChannels() + + def testARQSessionAbortTransmissionIRS(self): + # set Packet Error Rate (PER) / frame loss probability + self.loss_probability = 0 + + self.establishChannels() + params = { + 'dxcall': "DJ2LS-3", + 'data': base64.b64encode(np.random.bytes(100)), + } + cmd = ARQRawCommand(self.config, self.iss_state_manager, self.iss_event_queue, params) + cmd.run(self.iss_event_queue, self.iss_modem) + + threading.Event().wait(np.random.randint(1,10)) + for id in self.irs_state_manager.arq_irs_sessions: + self.irs_state_manager.arq_irs_sessions[id].abort_transmission() + + self.waitAndCloseChannels() + if __name__ == '__main__': unittest.main()