This commit is contained in:
Pedro 2023-12-12 22:33:17 +01:00
parent e839453806
commit 4c3b3d79af
4 changed files with 38 additions and 14 deletions

View file

@ -54,3 +54,7 @@ class ARQSession():
def get_payload_size(self, speed_level):
mode = self.MODE_BY_SPEED[speed_level]
return codec2.get_bytes_per_frame(mode)
def set_details(self, snr, frequency_offset):
self.snr = snr
self.frequency_offset = frequency_offset

View file

@ -20,8 +20,10 @@ class ARQSessionIRS(arq_session.ARQSession):
self.id = session_id
self.speed = 0
self.frames_per_burst = 3
self.version = 1
self.snr = 0
self.dx_snr = 0
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)
# 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):
pass
@ -63,8 +54,6 @@ class ARQSessionIRS(arq_session.ARQSession):
self.state = self.STATE_FAILED
return
self.log("Finished ARQ IRS session")
def run(self):
self.send_session_ack()
self.state = self.STATE_WAITING_DATA
@ -85,6 +74,23 @@ class ARQSessionIRS(arq_session.ARQSession):
1)
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):
if self.state != self.STATE_WAITING_DATA:
raise RuntimeError(f"ARQ Session: Received data while in state {self.state}, expected {self.STATE_WAITING_DATA}")

View file

@ -102,7 +102,8 @@ class ARQSessionISS(arq_session.ARQSession):
end_offset = min(len(self.data), max_size)
frame_payload = self.data[offset:end_offset]
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)
if not self.send_arq(data_frame):
return False

View file

@ -20,24 +20,37 @@ class ARQFrameHandler(frame_handler.FrameHandler):
frame['origin'],
frame['session_id'])
self.states.register_arq_irs_session(session)
session.set_details(snr, frequency_offset)
session.run()
elif frame['frame_type_int'] == FR.ARQ_SESSION_OPEN_ACK.value:
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
session.set_details(snr, frequency_offset)
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:
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
session.set_details(snr, frequency_offset)
session.on_info_ack_received(frame)
elif frame['frame_type_int'] == FR.BURST_FRAME.value:
session:ARQSessionIRS = self.states.get_arq_irs_session(frame['session_id'])
session.set_details(snr, frequency_offset)
session.on_data_received(frame)
elif frame['frame_type_int'] == FR.BURST_ACK.value:
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
session.set_details(snr, frequency_offset)
session.on_burst_ack_received(frame)
elif frame['frame_type_int'] == FR.BURST_NACK.value:
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
session.set_details(snr, frequency_offset)
session.on_burst_nack_received(frame)
else:
self.logger.warning("DISCARDING FRAME", frame=frame)