WIP ARQ - fixed wrong payload

This commit is contained in:
DJ2LS 2023-12-16 17:21:07 +01:00
parent 32317b373f
commit e26d512951
4 changed files with 14 additions and 11 deletions

View file

@ -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):

View file

@ -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)

View file

@ -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):

View file

@ -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)