From 022d7ef2585a75c89975e271e1778d81f4082ff4 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 14 Jan 2024 23:33:06 +0100 Subject: [PATCH] ARQ WIP - check if frame is for us --- modem/arq_session_iss.py | 1 - modem/frame_dispatcher.py | 38 ------------------------------ modem/frame_handler.py | 36 ++++++++++++++++++++++++++++ modem/frame_handler_arq_session.py | 4 ++++ modem/frame_handler_ping.py | 25 ++++++++++---------- tests/test_arq_session.py | 8 +++---- 6 files changed, 56 insertions(+), 56 deletions(-) diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index f48c4608..dba0ad83 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -191,6 +191,5 @@ class ARQSessionISS(arq_session.ARQSession): self.set_state(ISS_State.ABORTED) # break actual retries self.event_frame_received.set() - self.event_manager.send_arq_session_finished( True, self.id, self.dxcall, len(self.data), False, self.state.name) \ No newline at end of file diff --git a/modem/frame_dispatcher.py b/modem/frame_dispatcher.py index dc8d4c09..e7dfb719 100644 --- a/modem/frame_dispatcher.py +++ b/modem/frame_dispatcher.py @@ -97,41 +97,3 @@ class DISPATCHER(): if data[:1] == FR_TYPE.ARQ_SESSION_OPEN: return data[13:14] return None - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modem/frame_handler.py b/modem/frame_handler.py index a164d44f..d292fb75 100644 --- a/modem/frame_handler.py +++ b/modem/frame_handler.py @@ -28,6 +28,42 @@ class FrameHandler(): 'bytes_per_frame': 0 } + def is_frame_for_me(self): + call_with_ssid = self.config['STATION']['mycall'] + "-" + str(self.config['STATION']['myssid']) + ft = self.details['frame']['frame_type'] + print(self.details) + + # Check for callsign checksum + if ft in ['ARQ_SESSION_OPEN', 'ARQ_SESSION_OPEN_ACK', 'PING', 'PING_ACK']: + valid, mycallsign = helpers.check_callsign( + call_with_ssid, + self.details["frame"]["destination_crc"], + self.config['STATION']['ssid_list']) + + # Check for session id on IRS side + elif ft in ['ARQ_SESSION_INFO', 'ARQ_BURST_FRAME', 'ARQ_STOP']: + session_id = self.details['frame']['session_id'] + if session_id in self.states.arq_irs_sessions: + valid = True + + # Check for session id on ISS side + elif ft in ['ARQ_SESSION_INFO_ACK', 'ARQ_BURST_ACK', 'ARQ_STOP_ACK']: + session_id = self.details['frame']['session_id'] + if session_id in self.states.arq_iss_sessions: + valid = True + else: + valid = False + + if not valid: + self.logger.info(f"[Frame handler] {ft} received but not for us.") + + return valid + + + + def should_respond(self): + return self.is_frame_for_me() + def add_to_activity_list(self): diff --git a/modem/frame_handler_arq_session.py b/modem/frame_handler_arq_session.py index c0bbef95..4d3faf2f 100644 --- a/modem/frame_handler_arq_session.py +++ b/modem/frame_handler_arq_session.py @@ -9,6 +9,10 @@ from arq_session_iss import ARQSessionISS class ARQFrameHandler(frame_handler.FrameHandler): def follow_protocol(self): + + if not self.should_respond(): + return + frame = self.details['frame'] session_id = frame['session_id'] snr = self.details["snr"] diff --git a/modem/frame_handler_ping.py b/modem/frame_handler_ping.py index 34459938..cf8f6499 100644 --- a/modem/frame_handler_ping.py +++ b/modem/frame_handler_ping.py @@ -4,21 +4,20 @@ import data_frame_factory class PingFrameHandler(frame_handler.FrameHandler): - def is_frame_for_me(self): - call_with_ssid = self.config['STATION']['mycall'] + "-" + str(self.config['STATION']['myssid']) - valid, mycallsign = helpers.check_callsign( - call_with_ssid, - self.details["frame"]["destination_crc"], - self.config['STATION']['ssid_list']) + #def is_frame_for_me(self): + # call_with_ssid = self.config['STATION']['mycall'] + "-" + str(self.config['STATION']['myssid']) + # valid, mycallsign = helpers.check_callsign( + # call_with_ssid, + # self.details["frame"]["destination_crc"], + # self.config['STATION']['ssid_list']) - if not valid: - ft = self.details['frame']['frame_type'] - self.logger.info(f"[Modem] {ft} received but not for us.") - - return valid + # if not valid: + # ft = self.details['frame']['frame_type'] + # self.logger.info(f"[Modem] {ft} received but not for us.") + # return valid - def should_respond(self): - return self.is_frame_for_me() + #def should_respond(self): + # return self.is_frame_for_me() def follow_protocol(self): diff --git a/tests/test_arq_session.py b/tests/test_arq_session.py index 9f9666f8..c9a8ceb6 100644 --- a/tests/test_arq_session.py +++ b/tests/test_arq_session.py @@ -129,7 +129,7 @@ class TestARQSession(unittest.TestCase): self.establishChannels() params = { - 'dxcall': "DJ2LS-3", + 'dxcall': "XX1XXX-1", 'data': base64.b64encode(bytes("Hello world!", encoding="utf-8")), } cmd = ARQRawCommand(self.config, self.iss_state_manager, self.iss_event_queue, params) @@ -142,7 +142,7 @@ class TestARQSession(unittest.TestCase): self.establishChannels() params = { - 'dxcall': "DJ2LS-3", + 'dxcall': "XX1XXX-1", 'data': base64.b64encode(np.random.bytes(1000)), } cmd = ARQRawCommand(self.config, self.iss_state_manager, self.iss_event_queue, params) @@ -156,7 +156,7 @@ class TestARQSession(unittest.TestCase): self.establishChannels() params = { - 'dxcall': "DJ2LS-3", + 'dxcall': "XX1XXX-1", 'data': base64.b64encode(np.random.bytes(100)), } cmd = ARQRawCommand(self.config, self.iss_state_manager, self.iss_event_queue, params) @@ -174,7 +174,7 @@ class TestARQSession(unittest.TestCase): self.establishChannels() params = { - 'dxcall': "DJ2LS-3", + 'dxcall': "XX1XXX-1", 'data': base64.b64encode(np.random.bytes(100)), } cmd = ARQRawCommand(self.config, self.iss_state_manager, self.iss_event_queue, params)