diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index 65d8e06a..f4463a7e 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -22,6 +22,7 @@ decoded_frame: {'frame_type': 'CQ', 'origin': b'DJ2LS-9', 'gridsquare': 'JN49EA' class DataFrameFactory: LENGTH_SIG0_FRAME = 14 + LENGTH_SIG1_FRAME = 14 def __init__(self, config): self.myfullcall = f"{config['STATION']['mycall']}-{config['STATION']['myssid']}" diff --git a/modem/protocol_arq.py b/modem/protocol_arq.py index 52eb2d13..c5c0c859 100644 --- a/modem/protocol_arq.py +++ b/modem/protocol_arq.py @@ -6,6 +6,7 @@ import helpers import modem import stats import structlog +from data_frame_factory import DataFrameFactory from codec2 import FREEDV_MODE, FREEDV_MODE_USED_SLOTS from modem_frametypes import FRAME_TYPE as FR_TYPE import event_manager @@ -20,6 +21,7 @@ class ARQ: self.states = states self.event_manager = event_manager.EventManager([event_queue]) + self.frame_factory = DataFrameFactory(config) # ARQ PROTOCOL VERSION # v.5 - signalling frame uses datac0 diff --git a/modem/protocol_arq_irs.py b/modem/protocol_arq_irs.py index f307a3c6..03910598 100644 --- a/modem/protocol_arq_irs.py +++ b/modem/protocol_arq_irs.py @@ -432,13 +432,19 @@ class IRS(ARQ): def send_burst_nack_frame(self, snr: bytes) -> None: """Build and send NACK frame for received DATA frame""" - nack_frame = bytearray(self.length_sig1_frame) - nack_frame[:1] = bytes([FR_TYPE.FR_NACK.value]) - nack_frame[1:2] = self.session_id - nack_frame[2:3] = helpers.snr_to_bytes(snr) - nack_frame[3:4] = bytes([int(self.speed_level)]) - nack_frame[4:8] = len(self.arq_rx_frame_buffer).to_bytes(4, byteorder="big") + # nack_frame = bytearray(self.length_sig1_frame) + # nack_frame[:1] = bytes([FR_TYPE.FR_NACK.value]) + # nack_frame[1:2] = self.session_id + # nack_frame[2:3] = helpers.snr_to_bytes(snr) + # nack_frame[3:4] = bytes([int(self.speed_level)]) + # nack_frame[4:8] = len(self.arq_rx_frame_buffer).to_bytes(4, byteorder="big") + + nack_frame = self.frame_factory.build_arq_frame_nack(session_id=self.session_id, + snr=snr, + speed_level=self.speed_level, + len_arq_rx_frame_buffer=len(self.arq_rx_frame_buffer) + ) # TRANSMIT NACK FRAME FOR BURST # TODO Do we have to send ident frame? # self.enqueue_frame_for_tx([ack_frame, self.send_ident_frame(False)], c2_mode=FREEDV_MODE.sig1.value, copies=3, repeat_delay=0) @@ -463,13 +469,20 @@ class IRS(ARQ): # Create and send ACK frame self.log.info("[Modem] ARQ | RX | SENDING NACK") - nack_frame = bytearray(self.length_sig1_frame) - nack_frame[:1] = bytes([FR_TYPE.BURST_NACK.value]) - nack_frame[1:2] = self.session_id - nack_frame[2:3] = helpers.snr_to_bytes(0) - nack_frame[3:4] = bytes([int(self.speed_level)]) - nack_frame[4:5] = bytes([int(tx_n_frames_per_burst)]) - nack_frame[5:9] = len(self.arq_rx_frame_buffer).to_bytes(4, byteorder="big") + # nack_frame = bytearray(self.length_sig1_frame) + # nack_frame[:1] = bytes([FR_TYPE.BURST_NACK.value]) + # nack_frame[1:2] = self.session_id + # nack_frame[2:3] = helpers.snr_to_bytes(0) + # nack_frame[3:4] = bytes([int(self.speed_level)]) + # nack_frame[4:5] = bytes([int(tx_n_frames_per_burst)]) + # nack_frame[5:9] = len(self.arq_rx_frame_buffer).to_bytes(4, byteorder="big") + + nack_frame = self.frame_factory.build_arq_burst_nack(session_id=self.session_id, + snr=0, + speed_level=self.speed_level, + len_arq_rx_frame_buffer=len(self.arq_rx_frame_buffer), + n_frames_per_burst=bytes([int(tx_n_frames_per_burst)]) + ) # wait if we have a channel busy condition if self.states.channel_busy: @@ -783,12 +796,18 @@ class IRS(ARQ): def send_burst_ack_frame(self, snr) -> None: """Build and send ACK frame for burst DATA frame""" - ack_frame = bytearray(self.length_sig1_frame) - ack_frame[:1] = bytes([FR_TYPE.BURST_ACK.value]) - ack_frame[1:2] = self.session_id - ack_frame[2:3] = helpers.snr_to_bytes(snr) - ack_frame[3:4] = bytes([int(self.speed_level)]) - ack_frame[4:8] = len(self.arq_rx_frame_buffer).to_bytes(4, byteorder="big") + # ack_frame = bytearray(self.length_sig1_frame) + # ack_frame[:1] = bytes([FR_TYPE.BURST_ACK.value]) + # ack_frame[1:2] = self.session_id + # ack_frame[2:3] = helpers.snr_to_bytes(snr) + # ack_frame[3:4] = bytes([int(self.speed_level)]) + # ack_frame[4:8] = len(self.arq_rx_frame_buffer).to_bytes(4, byteorder="big") + + ack_frame = self.frame_factory.build_arq_burst_ack(session_id=self.session_id, + snr=snr, + speed_level=self.speed_level, + len_arq_rx_frame_buffer=len(self.arq_rx_frame_buffer) + ) # wait if we have a channel busy condition if self.states.channel_busy: @@ -800,11 +819,12 @@ class IRS(ARQ): def send_data_ack_frame(self, snr) -> None: """Build and send ACK frame for received DATA frame""" - ack_frame = bytearray(self.length_sig1_frame) - ack_frame[:1] = bytes([FR_TYPE.FR_ACK.value]) - ack_frame[1:2] = self.session_id - ack_frame[2:3] = helpers.snr_to_bytes(snr) + # ack_frame = bytearray(self.length_sig1_frame) + # ack_frame[:1] = bytes([FR_TYPE.FR_ACK.value]) + # ack_frame[1:2] = self.session_id + # ack_frame[2:3] = helpers.snr_to_bytes(snr) + ack_frame = self.frame_factory.build_arq_frame_ack(session_id=self.session_id, snr=snr) # wait if we have a channel busy condition if self.states.channel_busy: self.channel_busy_handler()