diff --git a/modem/arq_session.py b/modem/arq_session.py new file mode 100644 index 00000000..17481acc --- /dev/null +++ b/modem/arq_session.py @@ -0,0 +1,27 @@ +import queue, threading +from codec2 import FREEDV_MODE +import data_frame_factory + +class ARQSession(): + + MODE_BY_SPEED = [ + FREEDV_MODE.datac4.value, + FREEDV_MODE.datac3.value, + FREEDV_MODE.datac1.value, + ] + + def __init__(self, config: dict, tx_frame_queue: queue.Queue, dxcall: str): + self.config = config + + self.dxcall = dxcall + + self.tx_frame_queue = tx_frame_queue + self.speed_level = 0 + + self.frame_factory = data_frame_factory.DataFrameFactory(self.config) + + self.id = None + + def get_mode_by_speed_level(self, speed_level): + return self.MODE_BY_SPEED[speed_level] + diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index 3c8f0d4a..81a2ae75 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -18,7 +18,7 @@ class ARQSessionIRS(): self.config = config self.tx_frame_queue = tx_frame_queue self.dxcall = dxcall - self.session_id = session_id + self.id = session_id self.received_data = b'' @@ -44,12 +44,12 @@ class ARQSessionIRS(): def set_modem_decode_modes(self, modes): pass - def runner(self, request): + def runner(self): isWideband = True speed = 1 version = 1 - ack_frame = self.frame_factory.build_arq_connect_ack(isWideband, self.session_id, speed, version) + ack_frame = self.frame_factory.build_arq_connect_ack(isWideband, self.id, speed, version) self.transmit_frame(ack_frame) self.set_modem_decode_modes(None) diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index a299fb02..979e2602 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -2,8 +2,10 @@ import threading import data_frame_factory import queue import random +from codec2 import FREEDV_MODE +import arq_session -class ARQSessionISS(): +class ARQSessionISS(arq_session.ARQSession): STATE_DISCONNECTED = 0 STATE_CONNECTING = 1 @@ -19,9 +21,7 @@ class ARQSessionISS(): TIMEOUT_TRANSFER = 2 def __init__(self, config: dict, tx_frame_queue: queue.Queue, dxcall: str, data: bytearray): - self.config = config - self.tx_frame_queue = tx_frame_queue - self.dxcall = dxcall + super().__init__(config, tx_frame_queue, dxcall) self.data = data self.state = self.STATE_DISCONNECTED @@ -43,7 +43,7 @@ class ARQSessionISS(): def transmit_frame(self, frame: bytearray): modem_queue_item = { - 'mode': self.mode, + 'mode': self.get_mode_by_speed_level(self.speed_level), 'repeat': 1, 'repeat_delay': 1, 'frame': frame, @@ -61,7 +61,7 @@ class ARQSessionISS(): self.thread.run() def connect(self): - self.set_state(self.STATE_CONNECTING) + self.state = self.STATE_CONNECTING connect_frame = self.frame_factory.build_arq_session_connect(True, self.dxcall, self.id) diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index fff948e7..8165e254 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -200,6 +200,10 @@ class DataFrameFactory: elif key == "gridsquare": extracted_data[key] = helpers.decode_grid(data) + + elif key == "session_id": + extracted_data[key] = int.from_bytes(data, 'big') + else: extracted_data[key] = data diff --git a/modem/frame_dispatcher.py b/modem/frame_dispatcher.py index 4078e47f..02803876 100644 --- a/modem/frame_dispatcher.py +++ b/modem/frame_dispatcher.py @@ -21,18 +21,19 @@ from protocol_arq_session import SESSION from frame_handler import FrameHandler from frame_handler_ping import PingFrameHandler from frame_handler_cq import CQFrameHandler +from frame_handler_arq import ARQFrameHandler class DISPATCHER(): FRAME_HANDLER = { - FR_TYPE.ARQ_DC_OPEN_ACK_N.value: {"class": FrameHandler, "name": "ARQ OPEN ACK (Narrow)"}, - FR_TYPE.ARQ_DC_OPEN_ACK_W.value: {"class": FrameHandler, "name": "ARQ OPEN ACK (Wide)"}, - FR_TYPE.ARQ_DC_OPEN_N.value: {"class": FrameHandler, "name": "ARQ Data Channel Open (Narrow)"}, - FR_TYPE.ARQ_DC_OPEN_W.value: {"class": FrameHandler, "name": "ARQ Data Channel Open (Wide)"}, - FR_TYPE.ARQ_SESSION_CLOSE.value: {"class": FrameHandler, "name": "ARQ CLOSE SESSION"}, - FR_TYPE.ARQ_SESSION_HB.value: {"class": FrameHandler, "name": "ARQ HEARTBEAT"}, - FR_TYPE.ARQ_SESSION_OPEN.value: {"class": FrameHandler, "name": "ARQ OPEN SESSION"}, - FR_TYPE.ARQ_STOP.value: {"class": FrameHandler, "name": "ARQ STOP TX"}, + FR_TYPE.ARQ_DC_OPEN_ACK_N.value: {"class": ARQFrameHandler, "name": "ARQ OPEN ACK (Narrow)"}, + FR_TYPE.ARQ_DC_OPEN_ACK_W.value: {"class": ARQFrameHandler, "name": "ARQ OPEN ACK (Wide)"}, + FR_TYPE.ARQ_DC_OPEN_N.value: {"class": ARQFrameHandler, "name": "ARQ Data Channel Open (Narrow)"}, + FR_TYPE.ARQ_DC_OPEN_W.value: {"class": ARQFrameHandler, "name": "ARQ Data Channel Open (Wide)"}, + FR_TYPE.ARQ_SESSION_CLOSE.value: {"class": ARQFrameHandler, "name": "ARQ CLOSE SESSION"}, + FR_TYPE.ARQ_SESSION_HB.value: {"class": ARQFrameHandler, "name": "ARQ HEARTBEAT"}, + FR_TYPE.ARQ_SESSION_OPEN.value: {"class": ARQFrameHandler, "name": "ARQ OPEN SESSION"}, + FR_TYPE.ARQ_STOP.value: {"class": ARQFrameHandler, "name": "ARQ STOP TX"}, FR_TYPE.BEACON.value: {"class": FrameHandler, "name": "BEACON"}, FR_TYPE.BURST_ACK.value: {"class": FrameHandler, "name": "BURST ACK"}, FR_TYPE.BURST_NACK.value: {"class": FrameHandler, "name": "BURST NACK"}, @@ -112,8 +113,7 @@ class DISPATCHER(): self.config, self.states, self.event_manager, - self.modem_transmit_queue, - self.arq_sessions) + self.modem_transmit_queue) handler.handle(deconstructed_frame, snr, offset, freedv, bytes_per_frame) diff --git a/modem/frame_handler_arq.py b/modem/frame_handler_arq.py index d84f7795..85f90102 100644 --- a/modem/frame_handler_arq.py +++ b/modem/frame_handler_arq.py @@ -1,7 +1,7 @@ from queue import Queue import frame_handler -from modem.event_manager import EventManager -from modem.state_manager import StateManager +from event_manager import EventManager +from state_manager import StateManager from modem_frametypes import FRAME_TYPE as FR from arq_session_irs import ARQSessionIRS @@ -11,7 +11,9 @@ class ARQFrameHandler(frame_handler.FrameHandler): frame = self.details['frame'] # ARQ session open received - if frame.frame_type in [FR.ARQ_DC_OPEN_N.value, FR.ARQ_DC_OPEN_W]: - session = ARQSessionIRS(self.config, self.tx_frame_queue, frame.origin, frame.session_id) + if frame['frame_type_int'] in [FR.ARQ_DC_OPEN_N.value, FR.ARQ_DC_OPEN_W.value]: + session = ARQSessionIRS(self.config, + self.tx_frame_queue, + frame['origin'], frame['session_id']) self.states.register_arq_irs_session(session) session.run()