This commit is contained in:
Pedro 2023-12-05 18:50:39 +01:00
parent 000702740f
commit 1fab9f8e53
6 changed files with 56 additions and 23 deletions

27
modem/arq_session.py Normal file
View file

@ -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]

View file

@ -18,7 +18,7 @@ class ARQSessionIRS():
self.config = config self.config = config
self.tx_frame_queue = tx_frame_queue self.tx_frame_queue = tx_frame_queue
self.dxcall = dxcall self.dxcall = dxcall
self.session_id = session_id self.id = session_id
self.received_data = b'' self.received_data = b''
@ -44,12 +44,12 @@ class ARQSessionIRS():
def set_modem_decode_modes(self, modes): def set_modem_decode_modes(self, modes):
pass pass
def runner(self, request): def runner(self):
isWideband = True isWideband = True
speed = 1 speed = 1
version = 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.transmit_frame(ack_frame)
self.set_modem_decode_modes(None) self.set_modem_decode_modes(None)

View file

@ -2,8 +2,10 @@ import threading
import data_frame_factory import data_frame_factory
import queue import queue
import random import random
from codec2 import FREEDV_MODE
import arq_session
class ARQSessionISS(): class ARQSessionISS(arq_session.ARQSession):
STATE_DISCONNECTED = 0 STATE_DISCONNECTED = 0
STATE_CONNECTING = 1 STATE_CONNECTING = 1
@ -19,9 +21,7 @@ class ARQSessionISS():
TIMEOUT_TRANSFER = 2 TIMEOUT_TRANSFER = 2
def __init__(self, config: dict, tx_frame_queue: queue.Queue, dxcall: str, data: bytearray): def __init__(self, config: dict, tx_frame_queue: queue.Queue, dxcall: str, data: bytearray):
self.config = config super().__init__(config, tx_frame_queue, dxcall)
self.tx_frame_queue = tx_frame_queue
self.dxcall = dxcall
self.data = data self.data = data
self.state = self.STATE_DISCONNECTED self.state = self.STATE_DISCONNECTED
@ -43,7 +43,7 @@ class ARQSessionISS():
def transmit_frame(self, frame: bytearray): def transmit_frame(self, frame: bytearray):
modem_queue_item = { modem_queue_item = {
'mode': self.mode, 'mode': self.get_mode_by_speed_level(self.speed_level),
'repeat': 1, 'repeat': 1,
'repeat_delay': 1, 'repeat_delay': 1,
'frame': frame, 'frame': frame,
@ -61,7 +61,7 @@ class ARQSessionISS():
self.thread.run() self.thread.run()
def connect(self): 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) connect_frame = self.frame_factory.build_arq_session_connect(True, self.dxcall, self.id)

View file

@ -200,6 +200,10 @@ class DataFrameFactory:
elif key == "gridsquare": elif key == "gridsquare":
extracted_data[key] = helpers.decode_grid(data) extracted_data[key] = helpers.decode_grid(data)
elif key == "session_id":
extracted_data[key] = int.from_bytes(data, 'big')
else: else:
extracted_data[key] = data extracted_data[key] = data

View file

@ -21,18 +21,19 @@ from protocol_arq_session import SESSION
from frame_handler import FrameHandler from frame_handler import FrameHandler
from frame_handler_ping import PingFrameHandler from frame_handler_ping import PingFrameHandler
from frame_handler_cq import CQFrameHandler from frame_handler_cq import CQFrameHandler
from frame_handler_arq import ARQFrameHandler
class DISPATCHER(): class DISPATCHER():
FRAME_HANDLER = { FRAME_HANDLER = {
FR_TYPE.ARQ_DC_OPEN_ACK_N.value: {"class": FrameHandler, "name": "ARQ OPEN ACK (Narrow)"}, FR_TYPE.ARQ_DC_OPEN_ACK_N.value: {"class": ARQFrameHandler, "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_ACK_W.value: {"class": ARQFrameHandler, "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_N.value: {"class": ARQFrameHandler, "name": "ARQ Data Channel Open (Narrow)"},
FR_TYPE.ARQ_DC_OPEN_W.value: {"class": FrameHandler, "name": "ARQ Data Channel Open (Wide)"}, FR_TYPE.ARQ_DC_OPEN_W.value: {"class": ARQFrameHandler, "name": "ARQ Data Channel Open (Wide)"},
FR_TYPE.ARQ_SESSION_CLOSE.value: {"class": FrameHandler, "name": "ARQ CLOSE SESSION"}, FR_TYPE.ARQ_SESSION_CLOSE.value: {"class": ARQFrameHandler, "name": "ARQ CLOSE SESSION"},
FR_TYPE.ARQ_SESSION_HB.value: {"class": FrameHandler, "name": "ARQ HEARTBEAT"}, FR_TYPE.ARQ_SESSION_HB.value: {"class": ARQFrameHandler, "name": "ARQ HEARTBEAT"},
FR_TYPE.ARQ_SESSION_OPEN.value: {"class": FrameHandler, "name": "ARQ OPEN SESSION"}, FR_TYPE.ARQ_SESSION_OPEN.value: {"class": ARQFrameHandler, "name": "ARQ OPEN SESSION"},
FR_TYPE.ARQ_STOP.value: {"class": FrameHandler, "name": "ARQ STOP TX"}, FR_TYPE.ARQ_STOP.value: {"class": ARQFrameHandler, "name": "ARQ STOP TX"},
FR_TYPE.BEACON.value: {"class": FrameHandler, "name": "BEACON"}, FR_TYPE.BEACON.value: {"class": FrameHandler, "name": "BEACON"},
FR_TYPE.BURST_ACK.value: {"class": FrameHandler, "name": "BURST ACK"}, FR_TYPE.BURST_ACK.value: {"class": FrameHandler, "name": "BURST ACK"},
FR_TYPE.BURST_NACK.value: {"class": FrameHandler, "name": "BURST NACK"}, FR_TYPE.BURST_NACK.value: {"class": FrameHandler, "name": "BURST NACK"},
@ -112,8 +113,7 @@ class DISPATCHER():
self.config, self.config,
self.states, self.states,
self.event_manager, self.event_manager,
self.modem_transmit_queue, self.modem_transmit_queue)
self.arq_sessions)
handler.handle(deconstructed_frame, snr, offset, freedv, bytes_per_frame) handler.handle(deconstructed_frame, snr, offset, freedv, bytes_per_frame)

View file

@ -1,7 +1,7 @@
from queue import Queue from queue import Queue
import frame_handler import frame_handler
from modem.event_manager import EventManager from event_manager import EventManager
from modem.state_manager import StateManager from state_manager import StateManager
from modem_frametypes import FRAME_TYPE as FR from modem_frametypes import FRAME_TYPE as FR
from arq_session_irs import ARQSessionIRS from arq_session_irs import ARQSessionIRS
@ -11,7 +11,9 @@ class ARQFrameHandler(frame_handler.FrameHandler):
frame = self.details['frame'] frame = self.details['frame']
# ARQ session open received # ARQ session open received
if frame.frame_type in [FR.ARQ_DC_OPEN_N.value, FR.ARQ_DC_OPEN_W]: 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) session = ARQSessionIRS(self.config,
self.tx_frame_queue,
frame['origin'], frame['session_id'])
self.states.register_arq_irs_session(session) self.states.register_arq_irs_session(session)
session.run() session.run()