first attempt using frame deconstructor

This commit is contained in:
DJ2LS 2023-11-26 11:41:37 +01:00
parent 8883616e67
commit 9872b52741
6 changed files with 35 additions and 18 deletions

View file

@ -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:

View file

@ -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.")

View file

@ -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:

View file

@ -38,4 +38,4 @@ class FRAME_TYPE(Enum):
FEC = 251
FEC_WAKEUP = 252
IDENT = 254
TEST_FRAME = 255
TEST_FRAME = 255

View file

@ -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

View file

@ -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: