first prototype of registering arq session

This commit is contained in:
DJ2LS 2023-11-23 23:10:53 +01:00
parent 5bb25c3d45
commit dbd1cf1d98
6 changed files with 69 additions and 22 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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