mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
WIP ARQ - fixed wrong payload
This commit is contained in:
parent
32317b373f
commit
e26d512951
|
@ -60,6 +60,9 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
return self.received_bytes == len(self.received_data)
|
return self.received_bytes == len(self.received_data)
|
||||||
|
|
||||||
def final_crc_check(self):
|
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()
|
return self.total_crc == helpers.get_crc_32(bytes(self.received_data)).hex()
|
||||||
|
|
||||||
def transmit_and_wait(self, frame, timeout, mode):
|
def transmit_and_wait(self, frame, timeout, mode):
|
||||||
|
|
|
@ -84,6 +84,7 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
info_frame = self.frame_factory.build_arq_session_info(self.id, len(self.data),
|
info_frame = self.frame_factory.build_arq_session_info(self.id, len(self.data),
|
||||||
helpers.get_crc_32(self.data),
|
helpers.get_crc_32(self.data),
|
||||||
self.snr[0])
|
self.snr[0])
|
||||||
|
|
||||||
self.launch_twr(info_frame, self.TIMEOUT_CONNECT_ACK, self.RETRIES_CONNECT, mode=FREEDV_MODE.signalling)
|
self.launch_twr(info_frame, self.TIMEOUT_CONNECT_ACK, self.RETRIES_CONNECT, mode=FREEDV_MODE.signalling)
|
||||||
self.set_state(self.STATE_INFO_SENT)
|
self.set_state(self.STATE_INFO_SENT)
|
||||||
|
|
||||||
|
@ -97,8 +98,8 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
self.set_state(self.STATE_ENDED)
|
self.set_state(self.STATE_ENDED)
|
||||||
self.log("All data transfered!")
|
self.log("All data transfered!")
|
||||||
return
|
return
|
||||||
print(self.SPEED_LEVEL_DICT[self.speed_level])
|
|
||||||
payload_size = self.get_data_payload_size()
|
payload_size = self.get_data_payload_size()
|
||||||
|
print(f"payload size: {payload_size}")
|
||||||
burst = []
|
burst = []
|
||||||
for f in range(0, self.frames_per_burst):
|
for f in range(0, self.frames_per_burst):
|
||||||
offset = self.confirmed_bytes
|
offset = self.confirmed_bytes
|
||||||
|
@ -107,6 +108,5 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
self.SPEED_LEVEL_DICT[self.speed_level]["mode"],
|
self.SPEED_LEVEL_DICT[self.speed_level]["mode"],
|
||||||
self.id, self.confirmed_bytes, payload)
|
self.id, self.confirmed_bytes, payload)
|
||||||
burst.append(data_frame)
|
burst.append(data_frame)
|
||||||
|
|
||||||
self.launch_twr(burst, self.TIMEOUT_TRANSFER, self.RETRIES_CONNECT, mode='auto')
|
self.launch_twr(burst, self.TIMEOUT_TRANSFER, self.RETRIES_CONNECT, mode='auto')
|
||||||
self.set_state(self.STATE_BURST_SENT)
|
self.set_state(self.STATE_BURST_SENT)
|
||||||
|
|
|
@ -156,10 +156,10 @@ class DataFrameFactory:
|
||||||
frame_template = self.template_list[frametype.value]
|
frame_template = self.template_list[frametype.value]
|
||||||
|
|
||||||
if isinstance(frame_template["frame_length"], int):
|
if isinstance(frame_template["frame_length"], int):
|
||||||
length = frame_template["frame_length"]
|
frame_length = frame_template["frame_length"]
|
||||||
else:
|
else:
|
||||||
length = frame_length
|
frame_length -= 2
|
||||||
|
print(frame_length)
|
||||||
frame = bytearray(frame_length)
|
frame = bytearray(frame_length)
|
||||||
frame[:1] = bytes([frametype.value])
|
frame[:1] = bytes([frametype.value])
|
||||||
|
|
||||||
|
@ -170,13 +170,11 @@ class DataFrameFactory:
|
||||||
|
|
||||||
if not isinstance(item_length, int):
|
if not isinstance(item_length, int):
|
||||||
item_length = len(content[key])
|
item_length = len(content[key])
|
||||||
|
|
||||||
if buffer_position + item_length > frame_length:
|
if buffer_position + item_length > frame_length:
|
||||||
raise OverflowError("Frame data overflow!")
|
raise OverflowError("Frame data overflow!")
|
||||||
|
|
||||||
frame[buffer_position: buffer_position + item_length] = content[key]
|
frame[buffer_position: buffer_position + item_length] = content[key]
|
||||||
buffer_position += item_length
|
buffer_position += item_length
|
||||||
|
|
||||||
return frame
|
return frame
|
||||||
|
|
||||||
def deconstruct(self, frame):
|
def deconstruct(self, frame):
|
||||||
|
@ -197,7 +195,7 @@ class DataFrameFactory:
|
||||||
|
|
||||||
# data is always on the last payload slots
|
# data is always on the last payload slots
|
||||||
if item_length in ["dynamic"] and key in["data"]:
|
if item_length in ["dynamic"] and key in["data"]:
|
||||||
data = frame[buffer_position:]
|
data = frame[buffer_position:-2]
|
||||||
item_length = len(data)
|
item_length = len(data)
|
||||||
else:
|
else:
|
||||||
data = frame[buffer_position: buffer_position + item_length]
|
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):
|
def get_available_data_payload_for_mode(self, type: FR_TYPE, mode:codec2.FREEDV_MODE):
|
||||||
whole_frame_length = self.get_bytes_per_frame(mode)
|
whole_frame_length = self.get_bytes_per_frame(mode)
|
||||||
available = whole_frame_length - 2 # - CRC16
|
available = whole_frame_length - 2 # 2Bytes CRC16
|
||||||
available = available - 1 # - FRAME TYPE
|
available -= 1 # Frame Type
|
||||||
print(self.template_list[type.value].items())
|
print(self.template_list[type.value].items())
|
||||||
for field, length in self.template_list[type.value].items():
|
for field, length in self.template_list[type.value].items():
|
||||||
if field != 'frame_length' and isinstance(length, int):
|
if field != 'frame_length' and isinstance(length, int):
|
||||||
|
@ -354,7 +352,8 @@ class DataFrameFactory:
|
||||||
"offset": offset.to_bytes(4, 'big'),
|
"offset": offset.to_bytes(4, 'big'),
|
||||||
"data": data,
|
"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,
|
def build_arq_burst_ack(self, session_id: bytes, offset, speed_level: int,
|
||||||
frames_per_burst: int, snr: int):
|
frames_per_burst: int, snr: int):
|
||||||
|
|
|
@ -372,6 +372,7 @@ class RF:
|
||||||
# Append CRC to data buffer
|
# Append CRC to data buffer
|
||||||
buffer += crc
|
buffer += crc
|
||||||
|
|
||||||
|
assert(bytes_per_frame == len(buffer))
|
||||||
data = (ctypes.c_ubyte * bytes_per_frame).from_buffer_copy(buffer)
|
data = (ctypes.c_ubyte * bytes_per_frame).from_buffer_copy(buffer)
|
||||||
# modulate DATA and save it into mod_out pointer
|
# modulate DATA and save it into mod_out pointer
|
||||||
codec2.api.freedv_rawdatatx(freedv, mod_out, data)
|
codec2.api.freedv_rawdatatx(freedv, mod_out, data)
|
||||||
|
|
Loading…
Reference in a new issue