From a970f96165cea7f213a4d9a33158d15a51431ac8 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Fri, 15 Dec 2023 16:22:38 +0100 Subject: [PATCH] WIP ARQ - more fixes --- gui/src/js/api.js | 2 +- modem/arq_session.py | 2 +- modem/arq_session_irs.py | 9 +++++++++ modem/arq_session_iss.py | 12 +++++------- modem/command_arq_raw.py | 3 +-- modem/data_frame_factory.py | 5 +++-- modem/demodulator.py | 2 +- modem/modem.py | 2 ++ 8 files changed, 23 insertions(+), 14 deletions(-) diff --git a/gui/src/js/api.js b/gui/src/js/api.js index 27e9901e..ad7daa67 100644 --- a/gui/src/js/api.js +++ b/gui/src/js/api.js @@ -91,7 +91,7 @@ export function sendModemPing(dxcall) { export function sendModemARQRaw(mycall, dxcall, data, uuid) { return apiPost("/modem/send_arq_raw", { mycallsign: mycall, - dxcallsign: dxcall, + dxcall: dxcall, data: data, uuid: uuid, }); diff --git a/modem/arq_session.py b/modem/arq_session.py index b8ab0655..20e8d2f5 100644 --- a/modem/arq_session.py +++ b/modem/arq_session.py @@ -54,7 +54,7 @@ class ARQSession(): def transmit_frame(self, frame: bytearray, mode='auto'): self.log("Transmitting frame") if mode in ['auto']: - self.get_mode_by_speed_level(self.speed_level) + mode = self.get_mode_by_speed_level(self.speed_level) modem_queue_item = { 'mode': mode, diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index a9f1ecf2..421ec0c9 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -100,6 +100,7 @@ class ARQSessionIRS(arq_session.ARQSession): self.dx_snr.append(info_frame['snr']) self.calibrate_speed_settings() + self.set_modem_listening_modes(self.speed_level) info_ack = self.frame_factory.build_arq_session_info_ack( self.id, self.total_crc, self.snr[0], self.speed_level, self.frames_per_burst) @@ -108,9 +109,17 @@ class ARQSessionIRS(arq_session.ARQSession): def send_burst_nack(self): self.calibrate_speed_settings() + self.set_modem_listening_modes(self.speed_level) nack = self.frame_factory.build_arq_burst_ack(self.id, self.received_bytes, self.speed_level, self.frames_per_burst, self.snr[0]) self.transmit_and_wait(nack) + + def set_modem_listening_modes(self, speed_level): + # TODO + # We want to set the modems listening modes somehow... + return + + def process_incoming_data(self, frame): if frame['offset'] != self.received_bytes: self.logger.info(f"Discarding data frame due to wrong offset", frame=self.frame_received) diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index abe005e7..861645cf 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -17,10 +17,8 @@ class ARQSessionISS(arq_session.ARQSession): STATE_FAILED = 5 RETRIES_CONNECT = 3 - RETRIES_TRANSFER = 3 - - TIMEOUT_CONNECT_ACK = 5 - TIMEOUT_TRANSFER = 2 + TIMEOUT_CONNECT_ACK = 7 + TIMEOUT_TRANSFER = 3 STATE_TRANSITION = { STATE_OPEN_SENT: { @@ -81,7 +79,7 @@ class ARQSessionISS(arq_session.ARQSession): self.frames_per_burst = frame['frames_per_burst'] self.log(f"Frames per burst set to {self.frames_per_burst}") - def send_info(self, open_ack_frame): + def send_info(self, frame): info_frame = self.frame_factory.build_arq_session_info(self.id, len(self.data), helpers.get_crc_32(self.data), self.snr[0]) @@ -98,7 +96,7 @@ class ARQSessionISS(arq_session.ARQSession): self.set_state(self.STATE_ENDED) self.log("All data transfered!") return - + print(self.SPEED_LEVEL_DICT[self.speed_level]) payload_size = self.get_data_payload_size() burst = [] for f in range(0, self.frames_per_burst): @@ -109,5 +107,5 @@ class ARQSessionISS(arq_session.ARQSession): self.id, self.confirmed_bytes, payload) burst.append(data_frame) - self.launch_twr(burst, self.TIMEOUT_CONNECT_ACK, self.RETRIES_CONNECT, mode='auto') + self.launch_twr(burst, self.TIMEOUT_TRANSFER, self.RETRIES_CONNECT, mode='auto') self.set_state(self.STATE_BURST_SENT) diff --git a/modem/command_arq_raw.py b/modem/command_arq_raw.py index ecda72b5..09d14373 100644 --- a/modem/command_arq_raw.py +++ b/modem/command_arq_raw.py @@ -7,8 +7,7 @@ from arq_session_iss import ARQSessionISS class ARQRawCommand(TxCommand): def set_params_from_api(self, apiParams): - print(apiParams) - self.dxcall = apiParams['dxcallsign'] + self.dxcall = apiParams['dxcall'] if not api_validations.validate_freedata_callsign(self.dxcall): self.dxcall = f"{self.dxcall}-0" diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index f00a634f..eeed8609 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -153,7 +153,6 @@ class DataFrameFactory: } def construct(self, frametype, content, frame_length = LENGTH_SIG1_FRAME): - frame_template = self.template_list[frametype.value] if isinstance(frame_template["frame_length"], int): @@ -233,11 +232,13 @@ class DataFrameFactory: 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 - 2 # - CRC16 + #available = available - 1 # - FRAME TYPE - 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): diff --git a/modem/demodulator.py b/modem/demodulator.py index e41338dd..21a6edcb 100644 --- a/modem/demodulator.py +++ b/modem/demodulator.py @@ -526,7 +526,7 @@ class Demodulator(): (self.sig1_datac13_buffer, self.RECEIVE_SIG1), (self.dat0_datac1_buffer, self.RECEIVE_DATAC1), (self.dat0_datac3_buffer, self.RECEIVE_DATAC3), - (self.dat0_datac4_buffer, RECEIVE_DATAC4), + (self.dat0_datac4_buffer, self.RECEIVE_DATAC4), (self.fsk_ldpc_buffer_0, self.enable_fsk), (self.fsk_ldpc_buffer_1, self.enable_fsk), ]: diff --git a/modem/modem.py b/modem/modem.py index 3fa552fd..146b1090 100644 --- a/modem/modem.py +++ b/modem/modem.py @@ -280,6 +280,8 @@ class RF: if mode in mode_transition: freedv = mode_transition[mode] else: + print("wrong mode.................") + print(mode) return False # Wait for some other thread that might be transmitting