Switch to new frame dispatcher process data with new class based frame handlers.

This commit is contained in:
Pedro 2023-11-30 09:24:36 +01:00
parent 32e1aa7edb
commit 16786d4a7e
4 changed files with 37 additions and 15 deletions

View file

@ -22,6 +22,7 @@ from protocol_arq_session import SESSION
from frame_handler import FrameHandler
from frame_handler_ping import PingFrameHandler
from frame_handler_cq import CQFrameHandler
class DISPATCHER():
@ -37,7 +38,7 @@ class DISPATCHER():
FR_TYPE.BEACON.value: {"class": FrameHandler, "name": "BEACON"},
FR_TYPE.BURST_ACK.value: {"class": FrameHandler, "name": "BURST ACK"},
FR_TYPE.BURST_NACK.value: {"class": FrameHandler, "name": "BURST NACK"},
FR_TYPE.CQ.value: {"class": FrameHandler, "name": "CQ"},
FR_TYPE.CQ.value: {"class": CQFrameHandler, "name": "CQ"},
FR_TYPE.FR_ACK.value: {"class": FrameHandler, "name": "FRAME ACK"},
FR_TYPE.FR_NACK.value: {"class": FrameHandler, "name": "FRAME NACK"},
FR_TYPE.FR_REPEAT.value: {"class": FrameHandler, "name": "REPEAT REQUEST"},
@ -150,9 +151,6 @@ class DISPATCHER():
# [1] freedv instance
# [2] bytes_per_frame
# [3] snr
self.old_process_data(
bytes_out=data[0], freedv=data[1], bytes_per_frame=data[2], snr=data[3]
)
self.new_process_data(
bytes_out=data[0], freedv=data[1], bytes_per_frame=data[2], snr=data[3]
)

View file

@ -30,6 +30,10 @@ class FrameHandler():
def add_to_heard_stations(self):
frame = self.details['frame']
if 'origin' not in frame:
return
dxgrid = frame['gridsquare'] if 'gridsquare' in frame else "------"
helpers.add_to_heard_stations(
frame['origin'],

16
modem/frame_handler_cq.py Normal file
View file

@ -0,0 +1,16 @@
import frame_handler_ping
import helpers
import data_frame_factory
class CQFrameHandler(frame_handler_ping.PingFrameHandler):
def should_respond(self):
self.logger.debug(f"Respond to CQ: {self.config['MODEM']['respond_to_cq']}")
return self.config['MODEM']['respond_to_cq']
def send_ack(self):
factory = data_frame_factory.DataFrameFactory(self.config)
qrv_frame = factory.build_qrv(
self.details['snr']
)
self.transmit(qrv_frame)

View file

@ -4,25 +4,29 @@ import data_frame_factory
class PingFrameHandler(frame_handler.FrameHandler):
def follow_protocol(self):
deconstructed_frame = self.details['frame']
origin = deconstructed_frame["origin"]
def is_frame_for_me(self):
# check if callsign ssid override
valid, mycallsign = helpers.check_callsign(
self.config['STATION']['mycall'],
deconstructed_frame["destination_crc"],
self.details["frame"]["destination_crc"],
self.config['STATION']['ssid_list'])
if not valid:
# PING packet not for me.
self.logger.debug("[Modem] received_ping: ping not for this station.")
ft = self.details['frame']['frame_type']
self.logger.info(f"[Modem] {ft} received but not for us.")
return valid
def should_respond(self):
return self.is_frame_for_me()
def follow_protocol(self):
if not self.should_respond():
return
self.dxcallsign_crc = deconstructed_frame["origin_crc"]
self.dxcallsign = origin
self.logger.info(
f"[Modem] PING REQ from [{origin}] to [{mycallsign}]",
self.logger.debug(
f"[Modem] Responding to request from [{self.details['frame']['origin']}]",
snr=self.details['snr'],
)