From 463c8c38296c596b544fd99570b7dd0f51a4a13f Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Wed, 13 Dec 2023 22:25:22 +0100 Subject: [PATCH] WIP ARQ - introduced additional info state --- modem/arq_session_irs.py | 27 +++++++++++++++++++-------- modem/frame_handler_arq_session.py | 2 +- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index 4647d307..22da422d 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -6,8 +6,9 @@ import arq_session class ARQSessionIRS(arq_session.ARQSession): STATE_CONN_REQ_RECEIVED = 0 - STATE_WAITING_DATA = 1 - STATE_FAILED = 2 + STATE_WAITING_INFO = 1 + STATE_WAITING_DATA = 2 + STATE_FAILED = 3 STATE_ENDED = 10 RETRIES_CONNECT = 3 @@ -51,10 +52,15 @@ class ARQSessionIRS(arq_session.ARQSession): def _all_data_received(self): return self.received_bytes == len(self.received_data) - def handshake(self): - self.send_open_ack() + def handshake_session(self): + if self.state in [self.STATE_CONN_REQ_RECEIVED, self.STATE_WAITING_INFO]: + self.send_open_ack() + self.set_state(self.STATE_WAITING_INFO) + return True + return False - if not self.event_info_received.wait(self.TIMEOUT_CONNECT): + def handshake_info(self): + if self.state == self.STATE_WAITING_INFO and not self.event_info_received.wait(self.TIMEOUT_CONNECT): return False self.send_info_ack() @@ -86,14 +92,19 @@ class ARQSessionIRS(arq_session.ARQSession): def runner(self): - if not self.handshake(): + + if not self.handshake_session(): return False + + if not self.handshake_info(): + return False + if not self.receive_data(): return False return True def run(self): - self.set_state(self.STATE_WAITING_DATA) + self.set_state(self.STATE_CONN_REQ_RECEIVED) self.thread = threading.Thread(target=self.runner, name=f"ARQ IRS Session {self.id}", daemon=False) self.thread.start() @@ -124,7 +135,7 @@ class ARQSessionIRS(arq_session.ARQSession): self.frames_per_burst = self.frames_per_burst def on_info_received(self, frame): - if self.state != self.STATE_CONN_REQ_RECEIVED: + if self.state != self.STATE_WAITING_INFO: self.logger.warning("Discarding received INFO.") return diff --git a/modem/frame_handler_arq_session.py b/modem/frame_handler_arq_session.py index 7c0cdca7..06def124 100644 --- a/modem/frame_handler_arq_session.py +++ b/modem/frame_handler_arq_session.py @@ -17,7 +17,7 @@ class ARQFrameHandler(frame_handler.FrameHandler): # Lost OPEN_ACK case .. ISS will retry opening a session if frame['session_id'] in self.states.arq_irs_sessions: session = self.states.arq_irs_sessions[frame['session_id']] - if session.state == ARQSessionIRS.STATE_CONN_REQ_RECEIVED: + if session.state in [ARQSessionIRS.STATE_CONN_REQ_RECEIVED, ARQSessionIRS.STATE_WAITING_INFO]: session.set_details(snr, frequency_offset) else: self.logger.warning(f"IRS Session conflict for session {session.id}")