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
6 changed files with 56 additions and 23 deletions
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.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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue