mirror of https://github.com/DJ2LS/FreeDATA.git
ARQ progress
parent
bef2e80acc
commit
c98b37db96
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue