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
4 changed files with 57 additions and 33 deletions
|
@ -72,10 +72,11 @@ class ARQSessionIRS(arq_session.ARQSession):
|
|||
self.thread.start()
|
||||
|
||||
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.speed,
|
||||
self.version)
|
||||
self.dxcall,
|
||||
self.version,
|
||||
self.snr)
|
||||
self.transmit_frame(ack_frame)
|
||||
|
||||
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}")
|
||||
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.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']
|
||||
|
||||
def on_disconnect_received(self):
|
||||
|
|
|
@ -4,6 +4,7 @@ import queue
|
|||
import random
|
||||
from codec2 import FREEDV_MODE
|
||||
import arq_session
|
||||
import helpers
|
||||
|
||||
class ARQSessionISS(arq_session.ARQSession):
|
||||
|
||||
|
@ -27,7 +28,8 @@ class ARQSessionISS(arq_session.ARQSession):
|
|||
self.state = self.STATE_DISCONNECTED
|
||||
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.frame_factory = data_frame_factory.DataFrameFactory(self.config)
|
||||
|
||||
|
@ -39,7 +41,12 @@ class ARQSessionISS(arq_session.ARQSession):
|
|||
self.state = state
|
||||
|
||||
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 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.run()
|
||||
|
||||
def connect(self):
|
||||
self.state = self.STATE_CONNECTING
|
||||
|
||||
connect_frame = self.frame_factory.build_arq_session_connect(self.dxcall, self.id)
|
||||
|
||||
def handshake(self, frame, event):
|
||||
retries = self.RETRIES_CONNECT
|
||||
while retries > 0:
|
||||
self.transmit_frame(connect_frame)
|
||||
self.logger.info("Waiting for CONN ACK...")
|
||||
if self.event_connection_ack_received.wait(self.TIMEOUT_CONNECT_ACK):
|
||||
self.setState(self.STATE_CONNECTED)
|
||||
self.transmit_frame(frame)
|
||||
self.logger.info("Waiting...")
|
||||
if event.wait(self.TIMEOUT_CONNECT_ACK):
|
||||
return True
|
||||
retries = retries - 1
|
||||
|
||||
self.setState(self.STATE_DISCONNECTED)
|
||||
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:
|
||||
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_connection_ack_received.set()
|
||||
self.event_open_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
|
||||
def send_data(self):
|
||||
|
|
|
@ -216,7 +216,9 @@ class DataFrameFactory:
|
|||
elif key == "gridsquare":
|
||||
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')
|
||||
|
||||
else:
|
||||
|
|
|
@ -14,7 +14,6 @@ class ARQFrameHandler(frame_handler.FrameHandler):
|
|||
snr = self.details["snr"]
|
||||
frequency_offset = self.details["frequency_offset"]
|
||||
|
||||
# ARQ session open received
|
||||
if frame['frame_type_int'] == FR.ARQ_SESSION_OPEN.value:
|
||||
session = ARQSessionIRS(self.config,
|
||||
self.tx_frame_queue,
|
||||
|
@ -23,16 +22,22 @@ class ARQFrameHandler(frame_handler.FrameHandler):
|
|||
self.states.register_arq_irs_session(session)
|
||||
session.run()
|
||||
|
||||
# ARQ session open ack received
|
||||
elif frame['frame_type_int'] == FR.ARQ_SESSION_OPEN_ACK.value:
|
||||
iss_session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
||||
iss_session.on_connection_ack_received(frame)
|
||||
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
||||
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:
|
||||
print("received data frame....")
|
||||
print(frame)
|
||||
session:ARQSessionIRS = self.states.get_arq_irs_session(frame['session_id'])
|
||||
session.on_data_received(frame)
|
||||
|
||||
irs_session:ARQSessionIRS = self.states.get_arq_irs_session(frame['session_id'])
|
||||
irs_session.on_data_received(frame)
|
||||
irs_session.rx_data_chain(frame, snr, frequency_offset)
|
||||
elif frame['frame_type_int'] == FR.BURST_ACK.value:
|
||||
session:ARQSessionISS = self.states.get_arq_iss_session(frame['session_id'])
|
||||
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