diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index 10c10142..875f055f 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -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): diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index 24bd7e87..cc69e2b7 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -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): diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index c488222f..04030582 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -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 = { diff --git a/modem/frame_dispatcher.py b/modem/frame_dispatcher.py index 3fd30aa6..55dae01d 100644 --- a/modem/frame_dispatcher.py +++ b/modem/frame_dispatcher.py @@ -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) diff --git a/tests/test_arq_session.py b/tests/test_arq_session.py index 305c5acf..668de4d7 100644 --- a/tests/test_arq_session.py +++ b/tests/test_arq_session.py @@ -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 = { diff --git a/tests/test_data_frame_factory.py b/tests/test_data_frame_factory.py index c49d4562..16004275 100755 --- a/tests/test_data_frame_factory.py +++ b/tests/test_data_frame_factory.py @@ -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()