mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
first prototype of registering arq session
This commit is contained in:
parent
5bb25c3d45
commit
dbd1cf1d98
6 changed files with 69 additions and 22 deletions
|
@ -1,4 +1,8 @@
|
|||
"""
|
||||
FRAME DISPATCHER - We are dispatching the received frames to the needed functions
|
||||
|
||||
|
||||
"""
|
||||
import threading
|
||||
import helpers
|
||||
import structlog
|
||||
|
@ -10,10 +14,10 @@ from data_handler_broadcasts import BROADCAST
|
|||
from data_handler_data_broadcasts import DATABROADCAST
|
||||
from data_handler_ping import PING
|
||||
|
||||
from data_handler_arq_iss import ISS
|
||||
from data_handler_arq_irs import IRS
|
||||
from data_handler_arq import ARQ
|
||||
from data_handler_arq_session import SESSION
|
||||
from protocol_arq_iss import ISS
|
||||
from protocol_arq_irs import IRS
|
||||
from protocol_arq import ARQ
|
||||
from protocol_arq_session import SESSION
|
||||
|
||||
|
||||
class DISPATCHER():
|
||||
|
@ -39,6 +43,7 @@ class DISPATCHER():
|
|||
self.arq_iss = ISS(config, event_queue, states)
|
||||
self.arq_session = SESSION(config, event_queue, states)
|
||||
|
||||
|
||||
self.event_manager = event_manager.EventManager([event_queue])
|
||||
|
||||
def _initialize_dispatchers(self):
|
||||
|
@ -55,11 +60,11 @@ class DISPATCHER():
|
|||
"ARQ OPEN ACK (Wide)",
|
||||
),
|
||||
FR_TYPE.ARQ_DC_OPEN_N.value: (
|
||||
self.arq_irs.arq_received_data_channel_opener,
|
||||
self.initialize_arq_transmission_irs,
|
||||
"ARQ Data Channel Open (Narrow)",
|
||||
),
|
||||
FR_TYPE.ARQ_DC_OPEN_W.value: (
|
||||
self.arq_irs.arq_received_data_channel_opener,
|
||||
self.initialize_arq_transmission_irs,
|
||||
"ARQ Data Channel Open (Wide)",
|
||||
),
|
||||
FR_TYPE.ARQ_SESSION_CLOSE.value: (
|
||||
|
@ -146,7 +151,6 @@ class DISPATCHER():
|
|||
# [4] dxcallsign with ssid str
|
||||
self.arq_iss.open_dc_and_transmit(data[1], data[2], data[3], data[4])
|
||||
|
||||
|
||||
elif data[0] == "FEC_IS_WRITING":
|
||||
# [1] DATA_OUT bytes
|
||||
# [2] MODE str datac0/1/3...
|
||||
|
@ -261,4 +265,29 @@ class DISPATCHER():
|
|||
]
|
||||
):
|
||||
return True
|
||||
return False
|
||||
return False
|
||||
|
||||
def get_id_from_frame(self, data):
|
||||
if data[:1] in [FR_TYPE.ARQ_DC_OPEN_N, FR_TYPE.ARQ_DC_OPEN_W]:
|
||||
session_id = data[13:14]
|
||||
return session_id
|
||||
return None
|
||||
|
||||
def initialize_arq_instance(self):
|
||||
self.arq = ARQ(self.config, self.event_queue, self.states)
|
||||
self.arq_irs = IRS(self.config, self.event_queue, self.states)
|
||||
self.arq_iss = ISS(self.config, self.event_queue, self.states)
|
||||
self.arq_session = SESSION(self.config, self.event_queue, self.states)
|
||||
|
||||
return {
|
||||
'arq': self.arq,
|
||||
'arq_irs': self.arq_irs,
|
||||
'arq_iss': self.arq_iss,
|
||||
'arq_session': self.arq_session
|
||||
}
|
||||
|
||||
def initialize_arq_transmission_irs(self, data):
|
||||
if id := self.get_id_from_frame(data):
|
||||
instance = self.initialize_arq_instance()
|
||||
self.states.register_arq_instance_by_id(id, instance)
|
||||
instance['arq_irs'].arq_received_data_channel_opener
|
|
@ -12,12 +12,11 @@ import event_manager
|
|||
|
||||
from data_handler import DATA
|
||||
TESTMODE = False
|
||||
class ARQ(DATA):
|
||||
class ARQ:
|
||||
def __init__(self, config, event_queue, states):
|
||||
super().__init__(config, event_queue, states)
|
||||
|
||||
self.log = structlog.get_logger("DHARQ")
|
||||
print(self.test_variable)
|
||||
self.event_queue = event_queue
|
||||
self.states = states
|
||||
self.event_manager = event_manager.EventManager([event_queue])
|
||||
|
@ -224,7 +223,6 @@ class ARQ(DATA):
|
|||
self.enqueue_frame_for_tx([disconnection_frame], c2_mode=FREEDV_MODE.sig0.value, copies=3, repeat_delay=0)
|
||||
|
||||
|
||||
|
||||
def check_if_mode_fits_to_busy_slot(self):
|
||||
"""
|
||||
Check if actual mode is fitting into given busy state
|
||||
|
@ -385,6 +383,13 @@ class ARQ(DATA):
|
|||
"""
|
||||
Cleanup function which clears all ARQ states
|
||||
"""
|
||||
|
||||
# TODO
|
||||
# We need to check if we are in a ARQ session
|
||||
# Then we cant delete the session_id for now
|
||||
self.states.delete_arq_instance_by_id(self.session_id)
|
||||
|
||||
|
||||
if TESTMODE:
|
||||
self.log.debug("[Modem] TESTMODE: arq_cleanup: Not performing cleanup.")
|
||||
return
|
||||
|
@ -433,13 +438,6 @@ class ARQ(DATA):
|
|||
self.session_connect_max_retries = 10
|
||||
self.data_channel_max_retries = 10
|
||||
|
||||
# we need to keep these values if in ARQ_SESSION
|
||||
if not self.states.is_arq_session:
|
||||
self.states.set("is_modem_busy", False)
|
||||
self.dxcallsign = b"AA0AA-0"
|
||||
self.mycallsign = self.mycallsign
|
||||
self.session_id = bytes(1)
|
||||
|
||||
self.states.set("arq_session_state", "disconnected")
|
||||
self.states.arq_speed_list = []
|
||||
self.states.set("is_arq_state", False)
|
|
@ -9,7 +9,7 @@ from codec2 import FREEDV_MODE
|
|||
from queues import RX_BUFFER
|
||||
from modem_frametypes import FRAME_TYPE as FR_TYPE
|
||||
|
||||
from data_handler_arq import ARQ
|
||||
from protocol_arq import ARQ
|
||||
|
||||
|
||||
class IRS(ARQ):
|
||||
|
@ -178,7 +178,6 @@ class IRS(ARQ):
|
|||
)
|
||||
|
||||
|
||||
|
||||
def arq_received_data_channel_opener(self, data_in: bytes, snr):
|
||||
"""
|
||||
Received request to open data channel frame
|
|
@ -13,7 +13,7 @@ from codec2 import FREEDV_MODE
|
|||
from modem_frametypes import FRAME_TYPE as FR_TYPE
|
||||
import event_manager
|
||||
|
||||
from data_handler_arq import ARQ
|
||||
from protocol_arq import ARQ
|
||||
|
||||
class ISS(ARQ):
|
||||
def __init__(self, config, event_queue, states):
|
|
@ -5,7 +5,7 @@ from codec2 import FREEDV_MODE
|
|||
from queues import MODEM_TRANSMIT_QUEUE
|
||||
from modem_frametypes import FRAME_TYPE as FR_TYPE
|
||||
|
||||
from data_handler_arq import ARQ
|
||||
from protocol_arq import ARQ
|
||||
|
||||
|
||||
class SESSION(ARQ):
|
|
@ -30,6 +30,7 @@ class StateManager:
|
|||
self.dxgrid: bytes = b"------"
|
||||
self.heard_stations = []
|
||||
|
||||
self.arq_instance_table = {}
|
||||
self.arq_session_state = 'disconnected'
|
||||
self.arq_speed_level = 0
|
||||
self.arq_total_bytes = 0
|
||||
|
@ -50,6 +51,9 @@ class StateManager:
|
|||
# Set rig control status regardless or rig control method
|
||||
self.radio_status = False
|
||||
|
||||
|
||||
|
||||
|
||||
def sendState (self):
|
||||
currentState = self.getAsJSON(False)
|
||||
self.statequeue.put(currentState)
|
||||
|
@ -95,3 +99,20 @@ class StateManager:
|
|||
|
||||
def waitForTransmission(self):
|
||||
self.transmitting_event.wait()
|
||||
|
||||
|
||||
|
||||
def register_arq_instance_by_id(self, id, instance):
|
||||
self.arq_instance_table[id] = instance
|
||||
|
||||
def get_arq_instance_by_id(self, id):
|
||||
return self.arq_instance_table.get(id)
|
||||
|
||||
def delete_arq_instance_by_id(self, id):
|
||||
instances = self.arq_instance_table.pop(id, None)
|
||||
if None not in instances:
|
||||
for key in instances:
|
||||
del instances[key]
|
||||
return True
|
||||
return False
|
||||
|
||||
|
|
Loading…
Reference in a new issue