From e26d5129512b88409b2c8396c557de54abb13996 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sat, 16 Dec 2023 17:21:07 +0100 Subject: [PATCH] WIP ARQ - fixed wrong payload --- modem/arq_session_irs.py | 3 +++ modem/arq_session_iss.py | 4 ++-- modem/data_frame_factory.py | 17 ++++++++--------- modem/modem.py | 1 + 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index 68a0e67f..bddf01cc 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -60,6 +60,9 @@ class ARQSessionIRS(arq_session.ARQSession): return self.received_bytes == len(self.received_data) def final_crc_check(self): + print(self.received_data) + print(self.total_crc) + print(helpers.get_crc_32(bytes(self.received_data)).hex()) return self.total_crc == helpers.get_crc_32(bytes(self.received_data)).hex() def transmit_and_wait(self, frame, timeout, mode): diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index 65644d41..7cb03b45 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -84,6 +84,7 @@ class ARQSessionISS(arq_session.ARQSession): info_frame = self.frame_factory.build_arq_session_info(self.id, len(self.data), helpers.get_crc_32(self.data), self.snr[0]) + self.launch_twr(info_frame, self.TIMEOUT_CONNECT_ACK, self.RETRIES_CONNECT, mode=FREEDV_MODE.signalling) self.set_state(self.STATE_INFO_SENT) @@ -97,8 +98,8 @@ class ARQSessionISS(arq_session.ARQSession): self.set_state(self.STATE_ENDED) self.log("All data transfered!") return - print(self.SPEED_LEVEL_DICT[self.speed_level]) payload_size = self.get_data_payload_size() + print(f"payload size: {payload_size}") burst = [] for f in range(0, self.frames_per_burst): offset = self.confirmed_bytes @@ -107,6 +108,5 @@ class ARQSessionISS(arq_session.ARQSession): self.SPEED_LEVEL_DICT[self.speed_level]["mode"], self.id, self.confirmed_bytes, payload) burst.append(data_frame) - self.launch_twr(burst, self.TIMEOUT_TRANSFER, self.RETRIES_CONNECT, mode='auto') self.set_state(self.STATE_BURST_SENT) diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index d9ccd58f..6d353260 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -156,10 +156,10 @@ class DataFrameFactory: frame_template = self.template_list[frametype.value] if isinstance(frame_template["frame_length"], int): - length = frame_template["frame_length"] + frame_length = frame_template["frame_length"] else: - length = frame_length - + frame_length -= 2 + print(frame_length) frame = bytearray(frame_length) frame[:1] = bytes([frametype.value]) @@ -170,13 +170,11 @@ class DataFrameFactory: if not isinstance(item_length, int): item_length = len(content[key]) - if buffer_position + item_length > frame_length: raise OverflowError("Frame data overflow!") frame[buffer_position: buffer_position + item_length] = content[key] buffer_position += item_length - return frame def deconstruct(self, frame): @@ -197,7 +195,7 @@ class DataFrameFactory: # data is always on the last payload slots if item_length in ["dynamic"] and key in["data"]: - data = frame[buffer_position:] + data = frame[buffer_position:-2] item_length = len(data) else: data = frame[buffer_position: buffer_position + item_length] @@ -232,8 +230,8 @@ class DataFrameFactory: def get_available_data_payload_for_mode(self, type: FR_TYPE, mode:codec2.FREEDV_MODE): whole_frame_length = self.get_bytes_per_frame(mode) - available = whole_frame_length - 2 # - CRC16 - available = available - 1 # - FRAME TYPE + available = whole_frame_length - 2 # 2Bytes CRC16 + available -= 1 # Frame Type print(self.template_list[type.value].items()) for field, length in self.template_list[type.value].items(): if field != 'frame_length' and isinstance(length, int): @@ -354,7 +352,8 @@ class DataFrameFactory: "offset": offset.to_bytes(4, 'big'), "data": data, } - return self.construct(FR_TYPE.ARQ_BURST_FRAME, payload, self.get_bytes_per_frame(freedv_mode)) + frame = self.construct(FR_TYPE.ARQ_BURST_FRAME, payload, self.get_bytes_per_frame(freedv_mode)) + return frame def build_arq_burst_ack(self, session_id: bytes, offset, speed_level: int, frames_per_burst: int, snr: int): diff --git a/modem/modem.py b/modem/modem.py index 3ac854ef..5bbe2923 100644 --- a/modem/modem.py +++ b/modem/modem.py @@ -372,6 +372,7 @@ class RF: # Append CRC to data buffer buffer += crc + assert(bytes_per_frame == len(buffer)) data = (ctypes.c_ubyte * bytes_per_frame).from_buffer_copy(buffer) # modulate DATA and save it into mod_out pointer codec2.api.freedv_rawdatatx(freedv, mod_out, data)