mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
ARQ progress
This commit is contained in:
parent
bef2e80acc
commit
c98b37db96
|
@ -30,7 +30,6 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
|
|
||||||
self.event_info_received = threading.Event()
|
self.event_info_received = threading.Event()
|
||||||
self.event_data_received = threading.Event()
|
self.event_data_received = threading.Event()
|
||||||
|
|
||||||
|
|
||||||
self.frame_factory = data_frame_factory.DataFrameFactory(self.config)
|
self.frame_factory = data_frame_factory.DataFrameFactory(self.config)
|
||||||
|
|
||||||
|
@ -91,6 +90,7 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
return False
|
return False
|
||||||
if not self.receive_data():
|
if not self.receive_data():
|
||||||
return False
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.set_state(self.STATE_WAITING_DATA)
|
self.set_state(self.STATE_WAITING_DATA)
|
||||||
|
@ -141,11 +141,22 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
|
|
||||||
def process_incoming_data(self):
|
def process_incoming_data(self):
|
||||||
if self.received_frame['offset'] != self.received_bytes:
|
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
|
return False
|
||||||
|
|
||||||
self.received_data[self.received_frame['offset']:] = self.received_frame['data']
|
remaining_data_length = len(self.receive_data) - self.received_bytes
|
||||||
self.received_bytes += len(self.received_frame['data'])
|
|
||||||
|
# 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
|
return True
|
||||||
|
|
||||||
def on_burst_ack_received(self, ack):
|
def on_burst_ack_received(self, ack):
|
||||||
|
|
|
@ -64,7 +64,7 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
return True
|
return True
|
||||||
retries = retries - 1
|
retries = retries - 1
|
||||||
|
|
||||||
self.setState(self.STATE_DISCONNECTED)
|
self.set_state(self.STATE_DISCONNECTED)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def session_open(self):
|
def session_open(self):
|
||||||
|
|
|
@ -222,6 +222,15 @@ class DataFrameFactory:
|
||||||
freedv = codec2.open_instance(mode.value)
|
freedv = codec2.open_instance(mode.value)
|
||||||
bytes_per_frame = int(codec2.api.freedv_get_bits_per_modem_frame(freedv) / 8)
|
bytes_per_frame = int(codec2.api.freedv_get_bits_per_modem_frame(freedv) / 8)
|
||||||
return bytes_per_frame
|
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):
|
def build_ping(self, destination):
|
||||||
payload = {
|
payload = {
|
||||||
|
|
|
@ -98,7 +98,7 @@ class DISPATCHER():
|
||||||
data['frequency_offset'],
|
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
|
# get frame as dictionary
|
||||||
deconstructed_frame = self.frame_factory.deconstruct(bytes_out)
|
deconstructed_frame = self.frame_factory.deconstruct(bytes_out)
|
||||||
frametype = deconstructed_frame["frame_type_int"]
|
frametype = deconstructed_frame["frame_type_int"]
|
||||||
|
@ -116,7 +116,7 @@ class DISPATCHER():
|
||||||
self.event_manager,
|
self.event_manager,
|
||||||
self.modem_transmit_queue)
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ class TestARQSession(unittest.TestCase):
|
||||||
def testARQSession(self):
|
def testARQSession(self):
|
||||||
|
|
||||||
# set Packet Error Rate (PER) / frame loss probability
|
# set Packet Error Rate (PER) / frame loss probability
|
||||||
self.loss_probability = 0
|
self.loss_probability = 50
|
||||||
|
|
||||||
self.establishChannels()
|
self.establishChannels()
|
||||||
params = {
|
params = {
|
||||||
|
|
|
@ -6,6 +6,7 @@ from config import CONFIG
|
||||||
from data_frame_factory import DataFrameFactory
|
from data_frame_factory import DataFrameFactory
|
||||||
from codec2 import FREEDV_MODE
|
from codec2 import FREEDV_MODE
|
||||||
import helpers
|
import helpers
|
||||||
|
from modem_frametypes import FRAME_TYPE
|
||||||
|
|
||||||
class TestDataFrameFactory(unittest.TestCase):
|
class TestDataFrameFactory(unittest.TestCase):
|
||||||
|
|
||||||
|
@ -58,6 +59,10 @@ class TestDataFrameFactory(unittest.TestCase):
|
||||||
payload = payload * 1000
|
payload = payload * 1000
|
||||||
self.assertRaises(OverflowError, self.factory.build_arq_burst_frame,
|
self.assertRaises(OverflowError, self.factory.build_arq_burst_frame,
|
||||||
FREEDV_MODE.datac3, session_id, offset, payload)
|
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__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in a new issue