From 18534a87aa2206c457258ca626dc4b2113dedee0 Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 12 Dec 2023 21:20:03 +0100 Subject: [PATCH] ARQ WIP --- modem/data_frame_factory.py | 113 +++++++++++++++++------------------- 1 file changed, 54 insertions(+), 59 deletions(-) diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index 70262e5e..2241594e 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -99,30 +99,41 @@ class DataFrameFactory: } def _load_arq_templates(self): - # same structure for narrow and wide types - arq_session_open = { + self.template_list[FR_TYPE.ARQ_SESSION_OPEN.value] = { "frame_length": self.LENGTH_SIG0_FRAME, "destination_crc": 3, - "origin_crc": 3, "origin": 6, "session_id": 1, } - # arq connect frames - self.template_list[FR_TYPE.ARQ_SESSION_OPEN.value] = arq_session_open - # same structure for narrow and wide types - arq_session_open_ack = { + self.template_list[FR_TYPE.ARQ_SESSION_OPEN_ACK.value] = { "frame_length": self.LENGTH_SIG0_FRAME, "session_id": 1, - "speed_level": 1, - "arq_protocol_version": 1 + "origin": 6, + "destination_crc": 3, + "version": 1, + "snr": 1, } - # arq connect ack frames - self.template_list[FR_TYPE.ARQ_SESSION_OPEN_ACK.value] = arq_session_open_ack - # arq data frame - # register n frames + self.template_list[FR_TYPE.ARQ_SESSION_INFO.value] = { + "frame_length": self.LENGTH_SIG0_FRAME, + "session_id": 1, + "total_length": 4, + "total_crc": 4, + "snr": 1, + } + + self.template_list[FR_TYPE.ARQ_SESSION_INFO_ACK.value] = { + "frame_length": self.LENGTH_SIG0_FRAME, + "session_id": 1, + "total_crc": 4, + "snr": 1, + "speed_level": 1, + "frames_per_burst": 1, + } + + # arq data burst frame self.template_list[FR_TYPE.BURST_FRAME.value] = { "frame_length": "dynamic", "n_frames_per_burst": 1, @@ -139,13 +150,6 @@ class DataFrameFactory: "len_arq_rx_frame_buffer": 4 } - # arq frame ack TODO We should rename this to "session ack" - self.template_list[FR_TYPE.FR_ACK.value] = { - "frame_length": self.LENGTH_SIG1_FRAME, - "session_id": 1, - "snr":1 - } - # arq burst nack self.template_list[FR_TYPE.BURST_NACK.value] = { "frame_length": self.LENGTH_SIG1_FRAME, @@ -154,18 +158,6 @@ class DataFrameFactory: "speed_level": 1, "len_arq_rx_frame_buffer": 4, "n_frames_per_burst": 1 - - } - - # arq frame nack --> TODO We should rename this to "session nack" - self.template_list[FR_TYPE.FR_NACK.value] = { - "frame_length": self.LENGTH_SIG1_FRAME, - "session_id": 1, - "snr": 1, - "speed_level": 1, - "len_arq_rx_frame_buffer": 4, - "n_frames_per_burst": 1 - } def construct(self, frametype, content, frame_length=LENGTH_SIG1_FRAME): @@ -223,7 +215,7 @@ class DataFrameFactory: elif key == "gridsquare": extracted_data[key] = helpers.decode_grid(data) - elif key in ["session_id", "speed_level", "n_frames_per_burst", "arq_protocol_version"]: + elif key in ["session_id", "speed_level", "n_frames_per_burst", "version"]: extracted_data[key] = int.from_bytes(data, 'big') else: @@ -320,35 +312,46 @@ class DataFrameFactory: test_frame[:1] = bytes([FR_TYPE.TEST_FRAME.value]) return test_frame - def build_arq_session_connect(self, destination, session_id): - + def build_arq_session_open(self, destination, session_id): payload = { "destination_crc": helpers.get_crc_24(destination), - "origin_crc": helpers.get_crc_24(self.myfullcall), "origin": helpers.callsign_to_bytes(self.myfullcall), "session_id": session_id.to_bytes(1, 'big'), } - channel_type = FR_TYPE.ARQ_SESSION_OPEN - return self.construct(channel_type, payload) - - def build_arq_session_connect_ack(self, session_id, speed_level,arq_protocol_version): - - #connection_frame = bytearray(self.length_sig0_frame) - #connection_frame[:1] = frametype - #connection_frame[1:2] = self.session_id - #connection_frame[8:9] = bytes([self.speed_level]) - #connection_frame[13:14] = bytes([self.arq_protocol_version]) + return self.construct(FR_TYPE.ARQ_SESSION_OPEN, payload) + def build_arq_session_open_ack(self, session_id, destination, version, snr): payload = { "session_id": session_id.to_bytes(1, 'big'), - "speed_level": bytes([speed_level]), - "arq_protocol_version": bytes([arq_protocol_version]), + "origin": helpers.callsign_to_bytes(self.myfullcall), + "destination_crc": helpers.get_crc_24(destination), + "version": bytes([version]), + "snr": snr.to_bytes(1, 'big'), } + return self.construct(FR_TYPE.ARQ_SESSION_OPEN_ACK, payload) + + def build_arq_session_info(self, session_id: int, total_length: int, total_crc: bytes, snr): + payload = { + "session_id": session_id.to_bytes(1, 'big'), + "total_length": total_length.to_bytes(4, 'big'), + "total_crc": total_crc, + "snr": snr.to_bytes(1, 'big'), + } + return self.construct(FR_TYPE.ARQ_SESSION_INFO, payload) - channel_type = FR_TYPE.ARQ_SESSION_OPEN_ACK - return self.construct(channel_type, payload) + def build_arq_session_info_ack(self, session_id, total_crc, snr, speed_level, frames_per_burst): + payload = { + "frame_length": self.LENGTH_SIG0_FRAME, + "session_id": session_id.to_bytes(1, 'big'), + "total_crc": total_crc, + "snr": snr.to_bytes(1, 'big'), + "speed_level": speed_level.to_bytes(1, 'big'), + "frames_per_burst": frames_per_burst.to_bytes(1, 'big'), + } + return self.construct(FR_TYPE.ARQ_SESSION_INFO_ACK, payload) - def build_arq_data_frame(self, session_id: bytes, n_frames_per_burst: int, max_size: int, n_frame: int, frame_payload: bytes): + def build_arq_burst_frame(self, session_id: int, max_size: int, n_frame: int, + frame_payload: bytes): payload = { "n_frames_per_burst": bytes([n_frames_per_burst]), "session_id": session_id.to_bytes(1, 'big'), @@ -359,13 +362,6 @@ class DataFrameFactory: def build_arq_burst_ack(self, session_id: bytes, snr: int, speed_level: int, len_arq_rx_frame_buffer: int): - # ack_frame = bytearray(self.length_sig1_frame) - # ack_frame[:1] = bytes([FR_TYPE.BURST_ACK.value]) - # ack_frame[1:2] = self.session_id - # ack_frame[2:3] = helpers.snr_to_bytes(snr) - # ack_frame[3:4] = bytes([int(self.speed_level)]) - # ack_frame[4:8] = len(self.arq_rx_frame_buffer).to_bytes(4, byteorder="big") - payload = { "session_id": session_id, "snr": helpers.snr_to_bytes(snr), @@ -379,7 +375,6 @@ class DataFrameFactory: # ack_frame[:1] = bytes([FR_TYPE.FR_ACK.value]) # ack_frame[1:2] = self.session_id # ack_frame[2:3] = helpers.snr_to_bytes(snr) - payload = { "session_id": session_id, "snr": helpers.snr_to_bytes(snr)