From 9872b52741c645bbd6cf0f97f1f2bcb18c36cb63 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 26 Nov 2023 11:41:37 +0100 Subject: [PATCH] first attempt using frame deconstructor --- modem/data_frame_factory.py | 5 +++++ modem/data_handler_ping.py | 16 ++++++++++++---- modem/frame_dispatcher.py | 24 ++++++++++++++---------- modem/modem_frametypes.py | 2 +- modem/protocol_arq.py | 2 +- modem/protocol_arq_irs.py | 4 ++-- 6 files changed, 35 insertions(+), 18 deletions(-) diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index 34d212d9..779cca52 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -121,6 +121,11 @@ class DataFrameFactory: # we are overriding the tempaltes mycallsign, because it will become # the dxcallsign when receiving extracted_data["dxcallsign"] = helpers.bytes_to_callsign(data) + elif key == "dxcallsign": + # we are overriding the tempaltes dxcallsign, because it will become + # the mycallsign when receiving + extracted_data["mycallsign"] = helpers.bytes_to_callsign(data) + elif key == "gridsquare": extracted_data[key] = helpers.decode_grid(data) else: diff --git a/modem/data_handler_ping.py b/modem/data_handler_ping.py index 48307218..5b1b5cca 100644 --- a/modem/data_handler_ping.py +++ b/modem/data_handler_ping.py @@ -68,7 +68,7 @@ class PING(DATA): else: self.enqueue_frame_for_tx([ping_frame], c2_mode=FREEDV_MODE.sig0.value) - def received_ping(self, data_in: bytes, snr) -> None: + def received_ping(self, deconstructed_frame: list, snr) -> None: """ Called if we received a ping @@ -76,11 +76,19 @@ class PING(DATA): data_in:bytes: """ - dxcallsign_crc = bytes(data_in[4:7]) - dxcallsign = helpers.bytes_to_callsign(bytes(data_in[7:13])) + # use --> deconstructed_frame + + + + + #dxcallsign_crc = bytes(data_in[4:7]) + mycallsign_crc = deconstructed_frame["mycallsign_crc"] + dxcallsign_crc = deconstructed_frame["dxcallsign_crc"] + dxcallsign = deconstructed_frame["dxcallsign"] + #dxcallsign = helpers.bytes_to_callsign(bytes(data_in[7:13])) # check if callsign ssid override - valid, mycallsign = helpers.check_callsign(self.mycallsign, data_in[1:4], self.ssid_list) + valid, mycallsign = helpers.check_callsign(self.mycallsign, mycallsign_crc, self.ssid_list) if not valid: # PING packet not for me. self.log.debug("[Modem] received_ping: ping not for this station.") diff --git a/modem/frame_dispatcher.py b/modem/frame_dispatcher.py index 0e99c4b7..78edde91 100644 --- a/modem/frame_dispatcher.py +++ b/modem/frame_dispatcher.py @@ -9,6 +9,8 @@ import structlog from modem_frametypes import FRAME_TYPE as FR_TYPE import event_manager from queues import DATA_QUEUE_RECEIVED, DATA_QUEUE_TRANSMIT, MODEM_TRANSMIT_QUEUE +from data_frame_factory import DataFrameFactory + from data_handler_broadcasts import BROADCAST from data_handler_data_broadcasts import DATABROADCAST @@ -34,6 +36,10 @@ class DISPATCHER(): def _initialize_handlers(self, config, event_queue, states): """Initializes various data handlers.""" + + self.frame_factory = DataFrameFactory() + + self.broadcasts = BROADCAST(config, event_queue, states) self.data_broadcasts = DATABROADCAST(config, event_queue, states) self.ping = PING(config, event_queue, states) @@ -142,22 +148,20 @@ class DISPATCHER(): """ if self.check_if_valid_frame(bytes_out): - frametype = int.from_bytes(bytes(bytes_out[:1]), "big") - # Dispatch activity based on received frametype + # get frame as dictionary + deconstructed_frame = self.frame_factory.deconstruct(bytes_out) + frametype = deconstructed_frame["frame_type"] + + # Dispatch activity based on received frametype if frametype in self.rx_dispatcher: # Process frames "known" by rx_dispatcher # self.log.debug(f"[Modem] {self.rx_dispatcher[frametype][1]} RECEIVED....") - self.rx_dispatcher[frametype][0](bytes_out[:-2], snr) + self.rx_dispatcher[frametype][0](deconstructed_frame, snr) # Process frametypes requiring a different set of arguments. elif FR_TYPE.BURST_51.value >= frametype >= FR_TYPE.BURST_01.value: - # get snr of received data - # FIXME find a fix for this - after moving to classes, this no longer works - # snr = self.calculate_snr(freedv) - self.log.debug("[Modem] RX SNR", snr=snr) - # send payload data to arq checker without CRC16 self.arq_irs.arq_data_received( - bytes(bytes_out[:-2]), bytes_per_frame, snr, freedv + deconstructed_frame, bytes_per_frame, snr, freedv ) # if we received the last frame of a burst or the last remaining rpt frame, do a modem unsync @@ -167,7 +171,7 @@ class DISPATCHER(): # TESTFRAMES elif frametype == FR_TYPE.TEST_FRAME.value: - self.log.debug("[Modem] TESTFRAME RECEIVED", frame=bytes_out[:]) + self.log.debug("[Modem] TESTFRAME RECEIVED", frame=deconstructed_frame) # Unknown frame type else: diff --git a/modem/modem_frametypes.py b/modem/modem_frametypes.py index 82cb5117..6c1a9d6c 100644 --- a/modem/modem_frametypes.py +++ b/modem/modem_frametypes.py @@ -38,4 +38,4 @@ class FRAME_TYPE(Enum): FEC = 251 FEC_WAKEUP = 252 IDENT = 254 - TEST_FRAME = 255 \ No newline at end of file + TEST_FRAME = 255 diff --git a/modem/protocol_arq.py b/modem/protocol_arq.py index 9794e9cc..d05d1234 100644 --- a/modem/protocol_arq.py +++ b/modem/protocol_arq.py @@ -324,7 +324,7 @@ class ARQ: self.arq_cleanup() def received_stop_transmission( - self, data_in: bytes + self, deconstructed_frame: list ) -> None: # pylint: disable=unused-argument """ Received a transmission stop diff --git a/modem/protocol_arq_irs.py b/modem/protocol_arq_irs.py index d2a9b8e5..f307a3c6 100644 --- a/modem/protocol_arq_irs.py +++ b/modem/protocol_arq_irs.py @@ -482,7 +482,7 @@ class IRS(ARQ): self.frame_received_counter = 0 def arq_data_received( - self, data_in: bytes, bytes_per_frame: int, snr: float, freedv + self, deconstructed_frame: list, bytes_per_frame: int, snr: float, freedv ) -> None: """ Args: @@ -495,7 +495,7 @@ class IRS(ARQ): """ # We've arrived here from process_data which already checked that the frame # is intended for this station. - data_in = bytes(data_in) + data_in = deconstructed_frame["data"] # only process data if we are in ARQ and BUSY state else return to quit if not self.states.is_arq_state and not self.states.is_modem_busy: