2023-12-05 14:40:04 +00:00
|
|
|
from queue import Queue
|
|
|
|
import frame_handler
|
2023-12-05 17:50:39 +00:00
|
|
|
from event_manager import EventManager
|
|
|
|
from state_manager import StateManager
|
2023-12-05 14:40:04 +00:00
|
|
|
from modem_frametypes import FRAME_TYPE as FR
|
|
|
|
from arq_session_irs import ARQSessionIRS
|
2023-12-05 18:12:21 +00:00
|
|
|
from arq_session_iss import ARQSessionISS
|
2023-12-05 14:40:04 +00:00
|
|
|
|
|
|
|
class ARQFrameHandler(frame_handler.FrameHandler):
|
|
|
|
|
|
|
|
def follow_protocol(self):
|
|
|
|
frame = self.details['frame']
|
2023-12-12 08:46:22 +00:00
|
|
|
snr = self.details["snr"]
|
|
|
|
frequency_offset = self.details["frequency_offset"]
|
2023-12-05 14:40:04 +00:00
|
|
|
|
2023-12-12 19:46:22 +00:00
|
|
|
if frame['frame_type_int'] == FR.ARQ_SESSION_OPEN.value:
|
2023-12-13 17:27:55 +00:00
|
|
|
# Lost OPEN_ACK case .. ISS will retry opening a session
|
|
|
|
if frame['session_id'] in self.states.arq_irs_sessions:
|
|
|
|
session = self.states.arq_irs_sessions[frame['session_id']]
|
2023-12-13 21:25:22 +00:00
|
|
|
if session.state in [ARQSessionIRS.STATE_CONN_REQ_RECEIVED, ARQSessionIRS.STATE_WAITING_INFO]:
|
2023-12-13 17:27:55 +00:00
|
|
|
session.set_details(snr, frequency_offset)
|
|
|
|
else:
|
|
|
|
self.logger.warning(f"IRS Session conflict for session {session.id}")
|
|
|
|
# Normal case when receiving a SESSION_OPEN for the first time
|
|
|
|
else:
|
|
|
|
session = ARQSessionIRS(self.config,
|
|
|
|
self.tx_frame_queue,
|
|
|
|
frame['origin'],
|
|
|
|
frame['session_id'])
|
|
|
|
self.states.register_arq_irs_session(session)
|
|
|
|
session.set_details(snr, frequency_offset)
|
|
|
|
session.run()
|
2023-12-05 18:12:21 +00:00
|
|
|
|
2023-12-12 19:46:22 +00:00
|
|
|
elif frame['frame_type_int'] == FR.ARQ_SESSION_OPEN_ACK.value:
|
2023-12-12 21:05:32 +00:00
|
|
|
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
2023-12-12 21:33:17 +00:00
|
|
|
session.set_details(snr, frequency_offset)
|
2023-12-12 21:05:32 +00:00
|
|
|
session.on_open_ack_received(frame)
|
|
|
|
|
2023-12-12 21:33:17 +00:00
|
|
|
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)
|
|
|
|
|
2023-12-12 21:05:32 +00:00
|
|
|
elif frame['frame_type_int'] == FR.ARQ_SESSION_INFO_ACK.value:
|
|
|
|
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
2023-12-12 21:33:17 +00:00
|
|
|
session.set_details(snr, frequency_offset)
|
2023-12-12 21:05:32 +00:00
|
|
|
session.on_info_ack_received(frame)
|
2023-12-09 12:28:32 +00:00
|
|
|
|
2023-12-12 19:46:22 +00:00
|
|
|
elif frame['frame_type_int'] == FR.BURST_FRAME.value:
|
2023-12-12 21:05:32 +00:00
|
|
|
session:ARQSessionIRS = self.states.get_arq_irs_session(frame['session_id'])
|
2023-12-12 21:33:17 +00:00
|
|
|
session.set_details(snr, frequency_offset)
|
2023-12-12 21:05:32 +00:00
|
|
|
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'])
|
2023-12-12 21:33:17 +00:00
|
|
|
session.set_details(snr, frequency_offset)
|
2023-12-12 21:05:32 +00:00
|
|
|
session.on_burst_ack_received(frame)
|
2023-12-12 08:46:22 +00:00
|
|
|
|
2023-12-12 21:05:32 +00:00
|
|
|
elif frame['frame_type_int'] == FR.BURST_NACK.value:
|
|
|
|
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
2023-12-12 21:33:17 +00:00
|
|
|
session.set_details(snr, frequency_offset)
|
2023-12-12 21:05:32 +00:00
|
|
|
session.on_burst_nack_received(frame)
|
2023-12-12 21:33:17 +00:00
|
|
|
else:
|
|
|
|
self.logger.warning("DISCARDING FRAME", frame=frame)
|