mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
ARQ WIP
This commit is contained in:
parent
e839453806
commit
4c3b3d79af
4 changed files with 38 additions and 14 deletions
|
@ -54,3 +54,7 @@ class ARQSession():
|
||||||
def get_payload_size(self, speed_level):
|
def get_payload_size(self, speed_level):
|
||||||
mode = self.MODE_BY_SPEED[speed_level]
|
mode = self.MODE_BY_SPEED[speed_level]
|
||||||
return codec2.get_bytes_per_frame(mode)
|
return codec2.get_bytes_per_frame(mode)
|
||||||
|
|
||||||
|
def set_details(self, snr, frequency_offset):
|
||||||
|
self.snr = snr
|
||||||
|
self.frequency_offset = frequency_offset
|
||||||
|
|
|
@ -20,8 +20,10 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
|
|
||||||
self.id = session_id
|
self.id = session_id
|
||||||
self.speed = 0
|
self.speed = 0
|
||||||
|
self.frames_per_burst = 3
|
||||||
self.version = 1
|
self.version = 1
|
||||||
self.snr = 0
|
self.snr = 0
|
||||||
|
self.dx_snr = 0
|
||||||
|
|
||||||
self.state = self.STATE_CONN_REQ_RECEIVED
|
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)
|
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):
|
def generate_id(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -63,8 +54,6 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
self.state = self.STATE_FAILED
|
self.state = self.STATE_FAILED
|
||||||
return
|
return
|
||||||
|
|
||||||
self.log("Finished ARQ IRS session")
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.send_session_ack()
|
self.send_session_ack()
|
||||||
self.state = self.STATE_WAITING_DATA
|
self.state = self.STATE_WAITING_DATA
|
||||||
|
@ -85,6 +74,23 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
1)
|
1)
|
||||||
self.transmit_frame(nack)
|
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):
|
def on_data_received(self, frame):
|
||||||
if self.state != self.STATE_WAITING_DATA:
|
if self.state != self.STATE_WAITING_DATA:
|
||||||
raise RuntimeError(f"ARQ Session: Received data while in state {self.state}, expected {self.STATE_WAITING_DATA}")
|
raise RuntimeError(f"ARQ Session: Received data while in state {self.state}, expected {self.STATE_WAITING_DATA}")
|
||||||
|
|
|
@ -102,7 +102,8 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
end_offset = min(len(self.data), max_size)
|
end_offset = min(len(self.data), max_size)
|
||||||
frame_payload = self.data[offset:end_offset]
|
frame_payload = self.data[offset:end_offset]
|
||||||
print(self.id)
|
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)
|
self.set_state(self.STATE_SENDING)
|
||||||
if not self.send_arq(data_frame):
|
if not self.send_arq(data_frame):
|
||||||
return False
|
return False
|
||||||
|
|
|
@ -20,24 +20,37 @@ class ARQFrameHandler(frame_handler.FrameHandler):
|
||||||
frame['origin'],
|
frame['origin'],
|
||||||
frame['session_id'])
|
frame['session_id'])
|
||||||
self.states.register_arq_irs_session(session)
|
self.states.register_arq_irs_session(session)
|
||||||
|
session.set_details(snr, frequency_offset)
|
||||||
session.run()
|
session.run()
|
||||||
|
|
||||||
elif frame['frame_type_int'] == FR.ARQ_SESSION_OPEN_ACK.value:
|
elif frame['frame_type_int'] == FR.ARQ_SESSION_OPEN_ACK.value:
|
||||||
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
||||||
|
session.set_details(snr, frequency_offset)
|
||||||
session.on_open_ack_received(frame)
|
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:
|
elif frame['frame_type_int'] == FR.ARQ_SESSION_INFO_ACK.value:
|
||||||
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
||||||
|
session.set_details(snr, frequency_offset)
|
||||||
session.on_info_ack_received(frame)
|
session.on_info_ack_received(frame)
|
||||||
|
|
||||||
elif frame['frame_type_int'] == FR.BURST_FRAME.value:
|
elif frame['frame_type_int'] == FR.BURST_FRAME.value:
|
||||||
session:ARQSessionIRS = self.states.get_arq_irs_session(frame['session_id'])
|
session:ARQSessionIRS = self.states.get_arq_irs_session(frame['session_id'])
|
||||||
|
session.set_details(snr, frequency_offset)
|
||||||
session.on_data_received(frame)
|
session.on_data_received(frame)
|
||||||
|
|
||||||
elif frame['frame_type_int'] == FR.BURST_ACK.value:
|
elif frame['frame_type_int'] == FR.BURST_ACK.value:
|
||||||
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
||||||
|
session.set_details(snr, frequency_offset)
|
||||||
session.on_burst_ack_received(frame)
|
session.on_burst_ack_received(frame)
|
||||||
|
|
||||||
elif frame['frame_type_int'] == FR.BURST_NACK.value:
|
elif frame['frame_type_int'] == FR.BURST_NACK.value:
|
||||||
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
||||||
|
session.set_details(snr, frequency_offset)
|
||||||
session.on_burst_nack_received(frame)
|
session.on_burst_nack_received(frame)
|
||||||
|
else:
|
||||||
|
self.logger.warning("DISCARDING FRAME", frame=frame)
|
||||||
|
|
Loading…
Reference in a new issue