This commit is contained in:
Pedro 2023-12-12 22:05:32 +01:00
parent 8f1894da50
commit e839453806
4 changed files with 57 additions and 33 deletions

View file

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

View file

@ -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,39 +41,53 @@ 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 return False
if not self.session_info():
return False
return self.send_data() return self.send_data()
def run(self): def run(self):
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):

View file

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

View file

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