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.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)

View file

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

View file

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

View file

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

View file

@ -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()