FreeDATA/modem/frame_handler_arq_session.py

57 lines
2.7 KiB
Python
Raw Normal View History

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):
# self.details == {'frame': {'frame_type': 'BURST_01', 'frame_type_int': 1, 'n_frames_per_burst': 1, 'session_id': 31, 'data': b'Hello world!'}, 'snr': 0, 'frequency_offset': 0, 'freedv_inst': None, 'bytes_per_frame': 15}
2023-12-05 14:40:04 +00:00
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-05 17:50:39 +00:00
session = ARQSessionIRS(self.config,
self.tx_frame_queue,
2023-12-11 18:02:50 +00:00
frame['origin'],
2023-12-12 19:46:22 +00:00
frame['session_id'])
self.states.register_arq_irs_session(session)
2023-12-12 21:33:17 +00:00
session.set_details(snr, frequency_offset)
2023-12-05 14:40:04 +00:00
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)