From 4c3b3d79af59041ef7c7525e4f5ced7c64e681e1 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 12 Dec 2023 22:33:17 +0100 Subject: [PATCH] ARQ WIP --- modem/arq_session.py | 4 ++++ modem/arq_session_irs.py | 32 ++++++++++++++++++------------ modem/arq_session_iss.py | 3 ++- modem/frame_handler_arq_session.py | 13 ++++++++++++ 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/modem/arq_session.py b/modem/arq_session.py index 2e199a2c..b8da1a0e 100644 --- a/modem/arq_session.py +++ b/modem/arq_session.py @@ -54,3 +54,7 @@ class ARQSession(): def get_payload_size(self, speed_level): mode = self.MODE_BY_SPEED[speed_level] return codec2.get_bytes_per_frame(mode) + + def set_details(self, snr, frequency_offset): + self.snr = snr + self.frequency_offset = frequency_offset diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index b711d1f1..f39758f1 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -20,8 +20,10 @@ class ARQSessionIRS(arq_session.ARQSession): self.id = session_id self.speed = 0 + self.frames_per_burst = 3 self.version = 1 self.snr = 0 + self.dx_snr = 0 self.state = self.STATE_CONN_REQ_RECEIVED @@ -29,17 +31,6 @@ class ARQSessionIRS(arq_session.ARQSession): self.frame_factory = data_frame_factory.DataFrameFactory(self.config) - # naming: - # frame = single frame - # burst = one or more frames. A burst will be acknowledged with a ACK - - # this is the buffer which holds received data temporarily for each burst - self.arq_rx_burst_buffer = [] - # this is our buffer, holding data, after we received a full burst - self.arq_rx_frame_buffer = b"" - # this variable holds the amount/size of data we've received the last time - self.arq_burst_last_data_size = 0 - def generate_id(self): pass @@ -63,8 +54,6 @@ class ARQSessionIRS(arq_session.ARQSession): self.state = self.STATE_FAILED return - self.log("Finished ARQ IRS session") - def run(self): self.send_session_ack() self.state = self.STATE_WAITING_DATA @@ -85,6 +74,23 @@ class ARQSessionIRS(arq_session.ARQSession): 1) self.transmit_frame(nack) + def calibrate_speed_settings(self): + # TODO use some heuristics here + self.speed = self.speed + self.frames_per_burst = self.frames_per_burst + + def on_info_received(self, frame): + self.total_length = frame['total_length'] + self.total_crc = frame['total_crc'] + self.dx_snr = frame['snr'] + + self.calibrate_speed_settings() + + info_ack = self.frame_factory.build_arq_session_info_ack(self.id, self.total_crc, + self.snr, self.speed_level, + self.frames_per_burst) + self.transmit_frame(info_ack) + def on_data_received(self, frame): if self.state != self.STATE_WAITING_DATA: raise RuntimeError(f"ARQ Session: Received data while in state {self.state}, expected {self.STATE_WAITING_DATA}") diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index bbc7f7d4..51a7cbaf 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -102,7 +102,8 @@ class ARQSessionISS(arq_session.ARQSession): end_offset = min(len(self.data), max_size) frame_payload = self.data[offset:end_offset] print(self.id) - data_frame = self.frame_factory.build_arq_data_frame(self.id, n_frames_per_burst, max_size, n_frame, frame_payload) + data_frame = self.frame_factory.build_arq_burst_frame( + self.id, offset, frame_payload) self.set_state(self.STATE_SENDING) if not self.send_arq(data_frame): return False diff --git a/modem/frame_handler_arq_session.py b/modem/frame_handler_arq_session.py index 97e843f6..bdf7ae21 100644 --- a/modem/frame_handler_arq_session.py +++ b/modem/frame_handler_arq_session.py @@ -20,24 +20,37 @@ class ARQFrameHandler(frame_handler.FrameHandler): frame['origin'], frame['session_id']) self.states.register_arq_irs_session(session) + session.set_details(snr, frequency_offset) session.run() elif frame['frame_type_int'] == FR.ARQ_SESSION_OPEN_ACK.value: session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id']) + session.set_details(snr, frequency_offset) session.on_open_ack_received(frame) + elif frame['frame_type_int'] == FR.ARQ_SESSION_INFO.value: + session:ARQSessionIRS = self.states.get_arq_irs_session(frame['session_id']) + session.set_details(snr, frequency_offset) + session.on_info_received(frame) + elif frame['frame_type_int'] == FR.ARQ_SESSION_INFO_ACK.value: session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id']) + session.set_details(snr, frequency_offset) session.on_info_ack_received(frame) elif frame['frame_type_int'] == FR.BURST_FRAME.value: session:ARQSessionIRS = self.states.get_arq_irs_session(frame['session_id']) + session.set_details(snr, frequency_offset) session.on_data_received(frame) elif frame['frame_type_int'] == FR.BURST_ACK.value: session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id']) + session.set_details(snr, frequency_offset) session.on_burst_ack_received(frame) elif frame['frame_type_int'] == FR.BURST_NACK.value: session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id']) + session.set_details(snr, frequency_offset) session.on_burst_nack_received(frame) + else: + self.logger.warning("DISCARDING FRAME", frame=frame)