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 threading
|
||||||
import helpers
|
import helpers
|
||||||
import structlog
|
import structlog
|
||||||
|
@ -10,10 +14,10 @@ from data_handler_broadcasts import BROADCAST
|
||||||
from data_handler_data_broadcasts import DATABROADCAST
|
from data_handler_data_broadcasts import DATABROADCAST
|
||||||
from data_handler_ping import PING
|
from data_handler_ping import PING
|
||||||
|
|
||||||
from data_handler_arq_iss import ISS
|
from protocol_arq_iss import ISS
|
||||||
from data_handler_arq_irs import IRS
|
from protocol_arq_irs import IRS
|
||||||
from data_handler_arq import ARQ
|
from protocol_arq import ARQ
|
||||||
from data_handler_arq_session import SESSION
|
from protocol_arq_session import SESSION
|
||||||
|
|
||||||
|
|
||||||
class DISPATCHER():
|
class DISPATCHER():
|
||||||
|
@ -39,6 +43,7 @@ class DISPATCHER():
|
||||||
self.arq_iss = ISS(config, event_queue, states)
|
self.arq_iss = ISS(config, event_queue, states)
|
||||||
self.arq_session = SESSION(config, event_queue, states)
|
self.arq_session = SESSION(config, event_queue, states)
|
||||||
|
|
||||||
|
|
||||||
self.event_manager = event_manager.EventManager([event_queue])
|
self.event_manager = event_manager.EventManager([event_queue])
|
||||||
|
|
||||||
def _initialize_dispatchers(self):
|
def _initialize_dispatchers(self):
|
||||||
|
@ -55,11 +60,11 @@ class DISPATCHER():
|
||||||
"ARQ OPEN ACK (Wide)",
|
"ARQ OPEN ACK (Wide)",
|
||||||
),
|
),
|
||||||
FR_TYPE.ARQ_DC_OPEN_N.value: (
|
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)",
|
"ARQ Data Channel Open (Narrow)",
|
||||||
),
|
),
|
||||||
FR_TYPE.ARQ_DC_OPEN_W.value: (
|
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)",
|
"ARQ Data Channel Open (Wide)",
|
||||||
),
|
),
|
||||||
FR_TYPE.ARQ_SESSION_CLOSE.value: (
|
FR_TYPE.ARQ_SESSION_CLOSE.value: (
|
||||||
|
@ -146,7 +151,6 @@ class DISPATCHER():
|
||||||
# [4] dxcallsign with ssid str
|
# [4] dxcallsign with ssid str
|
||||||
self.arq_iss.open_dc_and_transmit(data[1], data[2], data[3], data[4])
|
self.arq_iss.open_dc_and_transmit(data[1], data[2], data[3], data[4])
|
||||||
|
|
||||||
|
|
||||||
elif data[0] == "FEC_IS_WRITING":
|
elif data[0] == "FEC_IS_WRITING":
|
||||||
# [1] DATA_OUT bytes
|
# [1] DATA_OUT bytes
|
||||||
# [2] MODE str datac0/1/3...
|
# [2] MODE str datac0/1/3...
|
||||||
|
@ -261,4 +265,29 @@ class DISPATCHER():
|
||||||
]
|
]
|
||||||
):
|
):
|
||||||
return True
|
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
|
from data_handler import DATA
|
||||||
TESTMODE = False
|
TESTMODE = False
|
||||||
class ARQ(DATA):
|
class ARQ:
|
||||||
def __init__(self, config, event_queue, states):
|
def __init__(self, config, event_queue, states):
|
||||||
super().__init__(config, event_queue, states)
|
super().__init__(config, event_queue, states)
|
||||||
|
|
||||||
self.log = structlog.get_logger("DHARQ")
|
self.log = structlog.get_logger("DHARQ")
|
||||||
print(self.test_variable)
|
|
||||||
self.event_queue = event_queue
|
self.event_queue = event_queue
|
||||||
self.states = states
|
self.states = states
|
||||||
self.event_manager = event_manager.EventManager([event_queue])
|
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)
|
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):
|
def check_if_mode_fits_to_busy_slot(self):
|
||||||
"""
|
"""
|
||||||
Check if actual mode is fitting into given busy state
|
Check if actual mode is fitting into given busy state
|
||||||
|
@ -385,6 +383,13 @@ class ARQ(DATA):
|
||||||
"""
|
"""
|
||||||
Cleanup function which clears all ARQ states
|
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:
|
if TESTMODE:
|
||||||
self.log.debug("[Modem] TESTMODE: arq_cleanup: Not performing cleanup.")
|
self.log.debug("[Modem] TESTMODE: arq_cleanup: Not performing cleanup.")
|
||||||
return
|
return
|
||||||
|
@ -433,13 +438,6 @@ class ARQ(DATA):
|
||||||
self.session_connect_max_retries = 10
|
self.session_connect_max_retries = 10
|
||||||
self.data_channel_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.set("arq_session_state", "disconnected")
|
||||||
self.states.arq_speed_list = []
|
self.states.arq_speed_list = []
|
||||||
self.states.set("is_arq_state", False)
|
self.states.set("is_arq_state", False)
|
|
@ -9,7 +9,7 @@ from codec2 import FREEDV_MODE
|
||||||
from queues import RX_BUFFER
|
from queues import RX_BUFFER
|
||||||
from modem_frametypes import FRAME_TYPE as FR_TYPE
|
from modem_frametypes import FRAME_TYPE as FR_TYPE
|
||||||
|
|
||||||
from data_handler_arq import ARQ
|
from protocol_arq import ARQ
|
||||||
|
|
||||||
|
|
||||||
class IRS(ARQ):
|
class IRS(ARQ):
|
||||||
|
@ -178,7 +178,6 @@ class IRS(ARQ):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def arq_received_data_channel_opener(self, data_in: bytes, snr):
|
def arq_received_data_channel_opener(self, data_in: bytes, snr):
|
||||||
"""
|
"""
|
||||||
Received request to open data channel frame
|
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
|
from modem_frametypes import FRAME_TYPE as FR_TYPE
|
||||||
import event_manager
|
import event_manager
|
||||||
|
|
||||||
from data_handler_arq import ARQ
|
from protocol_arq import ARQ
|
||||||
|
|
||||||
class ISS(ARQ):
|
class ISS(ARQ):
|
||||||
def __init__(self, config, event_queue, states):
|
def __init__(self, config, event_queue, states):
|
|
@ -5,7 +5,7 @@ from codec2 import FREEDV_MODE
|
||||||
from queues import MODEM_TRANSMIT_QUEUE
|
from queues import MODEM_TRANSMIT_QUEUE
|
||||||
from modem_frametypes import FRAME_TYPE as FR_TYPE
|
from modem_frametypes import FRAME_TYPE as FR_TYPE
|
||||||
|
|
||||||
from data_handler_arq import ARQ
|
from protocol_arq import ARQ
|
||||||
|
|
||||||
|
|
||||||
class SESSION(ARQ):
|
class SESSION(ARQ):
|
|
@ -30,6 +30,7 @@ class StateManager:
|
||||||
self.dxgrid: bytes = b"------"
|
self.dxgrid: bytes = b"------"
|
||||||
self.heard_stations = []
|
self.heard_stations = []
|
||||||
|
|
||||||
|
self.arq_instance_table = {}
|
||||||
self.arq_session_state = 'disconnected'
|
self.arq_session_state = 'disconnected'
|
||||||
self.arq_speed_level = 0
|
self.arq_speed_level = 0
|
||||||
self.arq_total_bytes = 0
|
self.arq_total_bytes = 0
|
||||||
|
@ -50,6 +51,9 @@ class StateManager:
|
||||||
# Set rig control status regardless or rig control method
|
# Set rig control status regardless or rig control method
|
||||||
self.radio_status = False
|
self.radio_status = False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def sendState (self):
|
def sendState (self):
|
||||||
currentState = self.getAsJSON(False)
|
currentState = self.getAsJSON(False)
|
||||||
self.statequeue.put(currentState)
|
self.statequeue.put(currentState)
|
||||||
|
@ -95,3 +99,20 @@ class StateManager:
|
||||||
|
|
||||||
def waitForTransmission(self):
|
def waitForTransmission(self):
|
||||||
self.transmitting_event.wait()
|
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