mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
ARQ WIP
This commit is contained in:
parent
000702740f
commit
1fab9f8e53
27
modem/arq_session.py
Normal file
27
modem/arq_session.py
Normal 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]
|
||||
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue