diff --git a/modem/arq_session.py b/modem/arq_session.py index bbb13403..aecc4537 100644 --- a/modem/arq_session.py +++ b/modem/arq_session.py @@ -1,6 +1,7 @@ import queue, threading from codec2 import FREEDV_MODE import data_frame_factory +import structlog class ARQSession(): @@ -11,6 +12,7 @@ class ARQSession(): ] def __init__(self, config: dict, tx_frame_queue: queue.Queue, dxcall: str): + self.logger = structlog.get_logger(type(self).__name__) self.config = config self.dxcall = dxcall @@ -34,3 +36,6 @@ class ARQSession(): } self.tx_frame_queue.put(modem_queue_item) + def setState(self, state): + self.state = state + self.logger.info(f"state changed to {state}") diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index cc445beb..c44cd396 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -77,10 +77,10 @@ class ARQSessionISS(arq_session.ARQSession): # Sends the full payload in multiple frames def send_data(self): offset = 0 - while offset < len(self.payload): + while offset < len(self.data): max_size = self.get_max_size_for_speed_level(self.speed_level) - end_offset = min(len(self.payload), max_size) - frame_payload = self.payload[offset:end_offset] + end_offset = min(len(self.data), max_size) + frame_payload = self.data[offset:end_offset] data_frame = self.frame_factory.build_arq_session_send(self.speed_level, self.dxcall, frame_payload) diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index 8165e254..6c328672 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -201,7 +201,7 @@ class DataFrameFactory: elif key == "gridsquare": extracted_data[key] = helpers.decode_grid(data) - elif key == "session_id": + elif key in ["session_id", "speed_level"]: extracted_data[key] = int.from_bytes(data, 'big') else: diff --git a/modem/frame_handler_arq.py b/modem/frame_handler_arq.py index 85f90102..c811e1a0 100644 --- a/modem/frame_handler_arq.py +++ b/modem/frame_handler_arq.py @@ -4,6 +4,7 @@ from event_manager import EventManager from state_manager import StateManager from modem_frametypes import FRAME_TYPE as FR from arq_session_irs import ARQSessionIRS +from arq_session_iss import ARQSessionISS class ARQFrameHandler(frame_handler.FrameHandler): @@ -17,3 +18,8 @@ class ARQFrameHandler(frame_handler.FrameHandler): frame['origin'], frame['session_id']) self.states.register_arq_irs_session(session) session.run() + + # ARQ session open ack received + if frame['frame_type_int'] in [FR.ARQ_DC_OPEN_ACK_N.value, FR.ARQ_DC_OPEN_ACK_W.value]: + iss_session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id']) + iss_session.on_connection_ack_received(frame) diff --git a/modem/state_manager.py b/modem/state_manager.py index ba61fe33..f59cab10 100644 --- a/modem/state_manager.py +++ b/modem/state_manager.py @@ -127,10 +127,12 @@ class StateManager: def get_arq_iss_session(self, id): if id not in self.arq_iss_sessions: raise RuntimeError(f"ARQ ISS Session '{id}' not found!") + return self.arq_iss_sessions[id] def get_arq_irs_session(self, id): if id not in self.arq_irs_sessions: raise RuntimeError(f"ARQ IRS Session '{id}' not found!") + return self.arq_irs_sessions[id] def remove_arq_iss_session(self, id): if id not in self.arq_iss_sessions: