mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
ARQ WIP
This commit is contained in:
parent
8f1894da50
commit
e839453806
|
@ -72,10 +72,11 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
self.thread.start()
|
self.thread.start()
|
||||||
|
|
||||||
def send_session_ack(self):
|
def send_session_ack(self):
|
||||||
ack_frame = self.frame_factory.build_arq_session_connect_ack(
|
ack_frame = self.frame_factory.build_arq_session_open_ack(
|
||||||
self.id,
|
self.id,
|
||||||
self.speed,
|
self.dxcall,
|
||||||
self.version)
|
self.version,
|
||||||
|
self.snr)
|
||||||
self.transmit_frame(ack_frame)
|
self.transmit_frame(ack_frame)
|
||||||
|
|
||||||
def send_data_nack(self):
|
def send_data_nack(self):
|
||||||
|
@ -89,11 +90,11 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
raise RuntimeError(f"ARQ Session: Received data while in state {self.state}, expected {self.STATE_WAITING_DATA}")
|
raise RuntimeError(f"ARQ Session: Received data while in state {self.state}, expected {self.STATE_WAITING_DATA}")
|
||||||
self.event_data_received.set()
|
self.event_data_received.set()
|
||||||
|
|
||||||
def on_transfer_ack_received(self, ack):
|
def on_burst_ack_received(self, ack):
|
||||||
self.event_transfer_ack_received.set()
|
self.event_transfer_ack_received.set()
|
||||||
self.speed_level = ack['speed_level']
|
self.speed_level = ack['speed_level']
|
||||||
|
|
||||||
def on_transfer_nack_received(self, nack):
|
def on_burst_nack_received(self, nack):
|
||||||
self.speed_level = nack['speed_level']
|
self.speed_level = nack['speed_level']
|
||||||
|
|
||||||
def on_disconnect_received(self):
|
def on_disconnect_received(self):
|
||||||
|
|
|
@ -4,6 +4,7 @@ import queue
|
||||||
import random
|
import random
|
||||||
from codec2 import FREEDV_MODE
|
from codec2 import FREEDV_MODE
|
||||||
import arq_session
|
import arq_session
|
||||||
|
import helpers
|
||||||
|
|
||||||
class ARQSessionISS(arq_session.ARQSession):
|
class ARQSessionISS(arq_session.ARQSession):
|
||||||
|
|
||||||
|
@ -27,7 +28,8 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
self.state = self.STATE_DISCONNECTED
|
self.state = self.STATE_DISCONNECTED
|
||||||
self.id = self.generate_id()
|
self.id = self.generate_id()
|
||||||
|
|
||||||
self.event_connection_ack_received = threading.Event()
|
self.event_open_ack_received = threading.Event()
|
||||||
|
self.event_info_ack_received = threading.Event()
|
||||||
self.event_transfer_ack_received = threading.Event()
|
self.event_transfer_ack_received = threading.Event()
|
||||||
self.frame_factory = data_frame_factory.DataFrameFactory(self.config)
|
self.frame_factory = data_frame_factory.DataFrameFactory(self.config)
|
||||||
|
|
||||||
|
@ -39,7 +41,12 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
self.state = state
|
self.state = state
|
||||||
|
|
||||||
def runner(self):
|
def runner(self):
|
||||||
if not self.connect():
|
self.state = self.STATE_CONNECTING
|
||||||
|
|
||||||
|
if not self.session_open():
|
||||||
|
return False
|
||||||
|
|
||||||
|
if not self.session_info():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return self.send_data()
|
return self.send_data()
|
||||||
|
@ -48,30 +55,39 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
self.thread = threading.Thread(target=self.runner, name=f"ARQ ISS Session {self.id}", daemon=True)
|
self.thread = threading.Thread(target=self.runner, name=f"ARQ ISS Session {self.id}", daemon=True)
|
||||||
self.thread.run()
|
self.thread.run()
|
||||||
|
|
||||||
def connect(self):
|
def handshake(self, frame, event):
|
||||||
self.state = self.STATE_CONNECTING
|
|
||||||
|
|
||||||
connect_frame = self.frame_factory.build_arq_session_connect(self.dxcall, self.id)
|
|
||||||
|
|
||||||
retries = self.RETRIES_CONNECT
|
retries = self.RETRIES_CONNECT
|
||||||
while retries > 0:
|
while retries > 0:
|
||||||
self.transmit_frame(connect_frame)
|
self.transmit_frame(frame)
|
||||||
self.logger.info("Waiting for CONN ACK...")
|
self.logger.info("Waiting...")
|
||||||
if self.event_connection_ack_received.wait(self.TIMEOUT_CONNECT_ACK):
|
if event.wait(self.TIMEOUT_CONNECT_ACK):
|
||||||
self.setState(self.STATE_CONNECTED)
|
|
||||||
return True
|
return True
|
||||||
retries = retries - 1
|
retries = retries - 1
|
||||||
|
|
||||||
self.setState(self.STATE_DISCONNECTED)
|
self.setState(self.STATE_DISCONNECTED)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def on_connection_ack_received(self, ack):
|
def session_open(self):
|
||||||
|
open_frame = self.frame_factory.build_arq_session_open(self.dxcall, self.id)
|
||||||
|
return self.handshake(open_frame, self.event_open_ack_received)
|
||||||
|
|
||||||
|
def session_info(self):
|
||||||
|
info_frame = self.frame_factory.build_arq_session_info(self.id, len(self.data),
|
||||||
|
helpers.get_crc_32(self.data),
|
||||||
|
self.snr)
|
||||||
|
return self.handshake(info_frame, self.event_info_ack_received)
|
||||||
|
|
||||||
|
def on_open_ack_received(self, ack):
|
||||||
if self.state != self.STATE_CONNECTING:
|
if self.state != self.STATE_CONNECTING:
|
||||||
raise RuntimeError(f"ARQ Session: Received connection ACK while in state {self.state}")
|
raise RuntimeError(f"ARQ Session: Received OPEN ACK while in state {self.state}")
|
||||||
|
|
||||||
self.build_arq_data_framespeed_level = ack['speed_level']
|
self.event_open_ack_received.set()
|
||||||
self.event_connection_ack_received.set()
|
|
||||||
|
|
||||||
|
def on_info_ack_received(self, ack):
|
||||||
|
if self.state != self.STATE_CONNECTING:
|
||||||
|
raise RuntimeError(f"ARQ Session: Received INFO ACK while in state {self.state}")
|
||||||
|
|
||||||
|
self.event_info_ack_received.set()
|
||||||
|
|
||||||
# Sends the full payload in multiple frames
|
# Sends the full payload in multiple frames
|
||||||
def send_data(self):
|
def send_data(self):
|
||||||
|
|
|
@ -216,7 +216,9 @@ class DataFrameFactory:
|
||||||
elif key == "gridsquare":
|
elif key == "gridsquare":
|
||||||
extracted_data[key] = helpers.decode_grid(data)
|
extracted_data[key] = helpers.decode_grid(data)
|
||||||
|
|
||||||
elif key in ["session_id", "speed_level", "frames_per_burst", "version"]:
|
elif key in ["session_id", "speed_level",
|
||||||
|
"frames_per_burst", "version",
|
||||||
|
"snr"]:
|
||||||
extracted_data[key] = int.from_bytes(data, 'big')
|
extracted_data[key] = int.from_bytes(data, 'big')
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -14,7 +14,6 @@ class ARQFrameHandler(frame_handler.FrameHandler):
|
||||||
snr = self.details["snr"]
|
snr = self.details["snr"]
|
||||||
frequency_offset = self.details["frequency_offset"]
|
frequency_offset = self.details["frequency_offset"]
|
||||||
|
|
||||||
# ARQ session open received
|
|
||||||
if frame['frame_type_int'] == FR.ARQ_SESSION_OPEN.value:
|
if frame['frame_type_int'] == FR.ARQ_SESSION_OPEN.value:
|
||||||
session = ARQSessionIRS(self.config,
|
session = ARQSessionIRS(self.config,
|
||||||
self.tx_frame_queue,
|
self.tx_frame_queue,
|
||||||
|
@ -23,16 +22,22 @@ class ARQFrameHandler(frame_handler.FrameHandler):
|
||||||
self.states.register_arq_irs_session(session)
|
self.states.register_arq_irs_session(session)
|
||||||
session.run()
|
session.run()
|
||||||
|
|
||||||
# ARQ session open ack received
|
|
||||||
elif frame['frame_type_int'] == FR.ARQ_SESSION_OPEN_ACK.value:
|
elif frame['frame_type_int'] == FR.ARQ_SESSION_OPEN_ACK.value:
|
||||||
iss_session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
||||||
iss_session.on_connection_ack_received(frame)
|
session.on_open_ack_received(frame)
|
||||||
|
|
||||||
|
elif frame['frame_type_int'] == FR.ARQ_SESSION_INFO_ACK.value:
|
||||||
|
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
||||||
|
session.on_info_ack_received(frame)
|
||||||
|
|
||||||
# ARQ session data frame received
|
|
||||||
elif frame['frame_type_int'] == FR.BURST_FRAME.value:
|
elif frame['frame_type_int'] == FR.BURST_FRAME.value:
|
||||||
print("received data frame....")
|
session:ARQSessionIRS = self.states.get_arq_irs_session(frame['session_id'])
|
||||||
print(frame)
|
session.on_data_received(frame)
|
||||||
|
|
||||||
irs_session:ARQSessionIRS = self.states.get_arq_irs_session(frame['session_id'])
|
elif frame['frame_type_int'] == FR.BURST_ACK.value:
|
||||||
irs_session.on_data_received(frame)
|
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
||||||
irs_session.rx_data_chain(frame, snr, frequency_offset)
|
session.on_burst_ack_received(frame)
|
||||||
|
|
||||||
|
elif frame['frame_type_int'] == FR.BURST_NACK.value:
|
||||||
|
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
||||||
|
session.on_burst_nack_received(frame)
|
||||||
|
|
Loading…
Reference in a new issue