From f28e47f44155c32cb5f65e5959f34947b652dead Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sat, 9 Dec 2023 13:28:32 +0100 Subject: [PATCH] WIP adding arq data frame --- modem/arq_session_irs.py | 12 ++++++++---- modem/arq_session_iss.py | 3 ++- modem/data_frame_factory.py | 4 ++-- modem/frame_handler_arq_session.py | 7 +++++++ modem/modem_frametypes.py | 3 +-- 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index 677fb79d..4a2cfe3e 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -13,7 +13,7 @@ class ARQSessionIRS(arq_session.ARQSession): RETRIES_CONNECT = 3 RETRIES_TRANSFER = 3 - TIMEOUT_DATA = 2 + TIMEOUT_DATA = 6 def __init__(self, config: dict, tx_frame_queue: queue.Queue, dxcall: str, session_id: int): super().__init__(config, tx_frame_queue, dxcall) @@ -35,7 +35,7 @@ class ARQSessionIRS(arq_session.ARQSession): pass def set_state(self, state): - self.log(f"ARQ Session {self.id} state {self.state}") + self.log(f"ARQ Session IRS {self.id} state {self.state}") self.state = state def set_modem_decode_modes(self, modes): @@ -50,13 +50,15 @@ class ARQSessionIRS(arq_session.ARQSession): self.transmit_frame(ack_frame) self.set_modem_decode_modes(None) - self.state = self.STATE_WAITING_DATA while self.state == self.STATE_WAITING_DATA: if not self.event_data_received.wait(self.TIMEOUT_DATA): self.log("Timeout waiting for data") self.state = self.STATE_FAILED return + else: + print("data received") + print(self.frame) self.log("Finished ARQ IRS session") @@ -66,8 +68,9 @@ class ARQSessionIRS(arq_session.ARQSession): def on_data_received(self, data_frame): if self.state != self.STATE_WAITING_DATA: - raise RuntimeError(f"ARQ Session: Received data while in state {self.state}") + raise RuntimeError(f"ARQ Session: Received data while in state {self.state}, expected {self.STATE_WAITING_DATA}") + self.received_data = data_frame["data"] self.event_data_received.set() @@ -87,3 +90,4 @@ class ARQSessionIRS(arq_session.ARQSession): self.event_connection_ack_received.clear() self.event_transfer_feedback.set() self.event_transfer_feedback.clear() + self.received_data = b'' diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index ffa33259..39a6cd73 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -35,7 +35,7 @@ class ARQSessionISS(arq_session.ARQSession): return random.randint(1,255) def set_state(self, state): - self.logger.info(f"ARQ Session {self.id} state {self.state}") + self.logger.info(f"ARQ Session ISS {self.id} state {self.state}") self.state = state def runner(self): @@ -72,6 +72,7 @@ class ARQSessionISS(arq_session.ARQSession): self.build_arq_data_framespeed_level = ack['speed_level'] self.event_connection_ack_received.set() + # Sends the full payload in multiple frames def send_data(self): # Todo make this n frames per burst stuff part of the protocol again diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index 3a18db3d..1d2b96b7 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -127,8 +127,8 @@ class DataFrameFactory: # arq data frame # register n frames - for n_frame in range(0,50): - self.template_list[FR_TYPE.BURST_01.value + n_frame] = { + for n_frame in range(1,5): + self.template_list[FR_TYPE.BURST_01.value + (n_frame-1)] = { "frame_length": "dynamic", "n_frames_per_burst": 1, "session_id": 1, diff --git a/modem/frame_handler_arq_session.py b/modem/frame_handler_arq_session.py index f929763a..df5e41d7 100644 --- a/modem/frame_handler_arq_session.py +++ b/modem/frame_handler_arq_session.py @@ -23,3 +23,10 @@ class ARQFrameHandler(frame_handler.FrameHandler): if frame['frame_type_int'] in [FR.ARQ_SESSION_OPEN_ACK_N.value, FR.ARQ_SESSION_OPEN_ACK_W.value]: iss_session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id']) iss_session.on_connection_ack_received(frame) + + + # ARQ session data frame received + if frame['frame_type_int'] in [FR.BURST_01.value, FR.BURST_02.value, FR.BURST_03.value, FR.BURST_04.value, FR.BURST_05.value]: + print("received data frame....") + irs_session:ARQSessionIRS = self.states.get_arq_irs_session(frame['session_id']) + irs_session.on_data_received(frame) \ No newline at end of file diff --git a/modem/modem_frametypes.py b/modem/modem_frametypes.py index ce315c9e..23e07c4f 100644 --- a/modem/modem_frametypes.py +++ b/modem/modem_frametypes.py @@ -11,8 +11,7 @@ class FRAME_TYPE(Enum): BURST_02 = 2 BURST_03 = 3 BURST_04 = 4 - # ... - BURST_50 = 50 + BURST_05 = 5 BURST_ACK = 60 FR_ACK = 61 FR_REPEAT = 62