ARQ progress

This commit is contained in:
Pedro 2023-12-13 16:56:11 +01:00
parent bef2e80acc
commit c98b37db96
6 changed files with 33 additions and 8 deletions

View file

@ -30,7 +30,6 @@ class ARQSessionIRS(arq_session.ARQSession):
self.event_info_received = threading.Event()
self.event_data_received = threading.Event()
self.frame_factory = data_frame_factory.DataFrameFactory(self.config)
@ -91,6 +90,7 @@ class ARQSessionIRS(arq_session.ARQSession):
return False
if not self.receive_data():
return False
return True
def run(self):
self.set_state(self.STATE_WAITING_DATA)
@ -141,11 +141,22 @@ class ARQSessionIRS(arq_session.ARQSession):
def process_incoming_data(self):
if self.received_frame['offset'] != self.received_bytes:
self.logger.info(f"Discarding data frame", frame=self.frame_received)
self.logger.info(f"Discarding data frame due to wrong offset", frame=self.frame_received)
return False
self.received_data[self.received_frame['offset']:] = self.received_frame['data']
self.received_bytes += len(self.received_frame['data'])
remaining_data_length = len(self.receive_data) - self.received_bytes
# Is this the last data part?
if len(self.received_frame['data']) <= remaining_data_length:
# we only want the remaining length, not the entire frame data
data_part = self.received_frame['data'][:remaining_data_length]
else:
# we want the entire frame data
data_part = self.received_frame['data']
self.received_data[self.received_frame['offset']:] = data_part
self.received_bytes += len(data_part)
return True
def on_burst_ack_received(self, ack):

View file

@ -64,7 +64,7 @@ class ARQSessionISS(arq_session.ARQSession):
return True
retries = retries - 1
self.setState(self.STATE_DISCONNECTED)
self.set_state(self.STATE_DISCONNECTED)
return False
def session_open(self):

View file

@ -222,6 +222,15 @@ class DataFrameFactory:
freedv = codec2.open_instance(mode.value)
bytes_per_frame = int(codec2.api.freedv_get_bits_per_modem_frame(freedv) / 8)
return bytes_per_frame
def get_available_data_payload_for_mode(self, type: FR_TYPE, mode:codec2.FREEDV_MODE):
whole_frame_length = self.get_bytes_per_frame(mode)
available = whole_frame_length
for field, length in self.template_list[type.value].items():
if field != 'frame_length' and isinstance(length, int):
available -= length
return available
def build_ping(self, destination):
payload = {

View file

@ -98,7 +98,7 @@ class DISPATCHER():
data['frequency_offset'],
)
def new_process_data(self, bytes_out, freedv, bytes_per_frame: int, snr, offset) -> None:
def new_process_data(self, bytes_out, freedv, bytes_per_frame: int, snr, frequency_offset) -> None:
# get frame as dictionary
deconstructed_frame = self.frame_factory.deconstruct(bytes_out)
frametype = deconstructed_frame["frame_type_int"]
@ -116,7 +116,7 @@ class DISPATCHER():
self.event_manager,
self.modem_transmit_queue)
handler.handle(deconstructed_frame, snr, offset, freedv, bytes_per_frame)
handler.handle(deconstructed_frame, snr, frequency_offset, freedv, bytes_per_frame)

View file

@ -72,7 +72,7 @@ class TestARQSession(unittest.TestCase):
def testARQSession(self):
# set Packet Error Rate (PER) / frame loss probability
self.loss_probability = 0
self.loss_probability = 50
self.establishChannels()
params = {

View file

@ -6,6 +6,7 @@ from config import CONFIG
from data_frame_factory import DataFrameFactory
from codec2 import FREEDV_MODE
import helpers
from modem_frametypes import FRAME_TYPE
class TestDataFrameFactory(unittest.TestCase):
@ -58,6 +59,10 @@ class TestDataFrameFactory(unittest.TestCase):
payload = payload * 1000
self.assertRaises(OverflowError, self.factory.build_arq_burst_frame,
FREEDV_MODE.datac3, session_id, offset, payload)
def testAvailablePayload(self):
avail = self.factory.get_available_data_payload_for_mode(FRAME_TYPE.BURST_FRAME, FREEDV_MODE.datac3)
self.assertEqual(avail, 123) # 128 bytes datac3 frame payload - BURST frame overhead
if __name__ == '__main__':
unittest.main()