From 518a739f21563b5fd290a224f1b39b3e8206ffba Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 15 Jan 2024 11:16:33 +0100 Subject: [PATCH] ARQ WIP - only run one ARQ session at a time --- modem/frame_handler_arq_session.py | 3 +++ modem/server.py | 2 ++ modem/state_manager.py | 10 ++++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/modem/frame_handler_arq_session.py b/modem/frame_handler_arq_session.py index 4d3faf2f..8ea805cd 100644 --- a/modem/frame_handler_arq_session.py +++ b/modem/frame_handler_arq_session.py @@ -26,6 +26,9 @@ class ARQFrameHandler(frame_handler.FrameHandler): # Normal case when receiving a SESSION_OPEN for the first time else: + if self.states.check_if_running_arq_session(): + self.logger.warning("DISCARDING SESSION OPEN because of ongoing ARQ session ", frame=frame) + return session = ARQSessionIRS(self.config, self.modem, frame['origin'], diff --git a/modem/server.py b/modem/server.py index 62464966..de16a470 100644 --- a/modem/server.py +++ b/modem/server.py @@ -202,6 +202,8 @@ def post_modem_send_raw(): return api_response({"info": "endpoint for SENDING RAW DATA via POST"}) if not app.state_manager.is_modem_running: api_abort('Modem not running', 503) + if app.state_manager.check_if_running_arq_session(): + api_abort('Modem busy', 503) if enqueue_tx_command(command_arq_raw.ARQRawCommand, request.json): return api_response(request.json) else: diff --git a/modem/state_manager.py b/modem/state_manager.py index 83563788..3f4d2cdb 100644 --- a/modem/state_manager.py +++ b/modem/state_manager.py @@ -21,8 +21,6 @@ class StateManager: self.is_modem_running = False self.is_modem_busy = False self.is_beacon_running = False - self.is_arq_state = False - self.is_arq_session = False # If true, any wait() call is blocking self.transmitting_event = threading.Event() @@ -120,6 +118,14 @@ class StateManager: self.arq_irs_sessions[session.id] = session return True + def check_if_running_arq_session(self, irs=False): + sessions = self.arq_irs_sessions if irs else self.arq_iss_sessions + for session in sessions: + if sessions[session].state.name not in ['ENDED', 'ABORTED', 'FAILED']: + print(f"[State Manager] running session...[{session}]") + return True + return False + def get_arq_iss_session(self, id): if id not in self.arq_iss_sessions: #raise RuntimeError(f"ARQ ISS Session '{id}' not found!")