FreeDATA/freedata_server/frame_handler_cq.py

56 lines
1.9 KiB
Python

import threading
import frame_handler_ping
import helpers
import data_frame_factory
import frame_handler
from message_system_db_messages import DatabaseManagerMessages
import numpy as np
class CQFrameHandler(frame_handler.FrameHandler):
"""Handles received CQ frames.
This class processes received CQ (Calling Any Station) frames and sends
a QRV (Ready to Receive) frame as an acknowledgement if the station is
not currently busy with ARQ. It also checks for queued messages to be
sent based on the configuration.
"""
#def should_respond(self):
# self.logger.debug(f"Respond to CQ: {self.config['MODEM']['respond_to_cq']}")
# return bool(self.config['MODEM']['respond_to_cq'] and not self.states.getARQ())
def follow_protocol(self):
"""Processes the received CQ frame.
This method checks if the modem is currently busy with ARQ. If not,
it sends a QRV frame as an acknowledgement and checks for queued
messages to send.
"""
if self.states.getARQ():
return
self.logger.debug(
f"[Modem] Responding to request from [{self.details['frame']['origin']}]",
snr=self.details['snr'],
)
self.send_ack()
def send_ack(self):
factory = data_frame_factory.DataFrameFactory(self.config)
qrv_frame = factory.build_qrv(self.details['snr'])
# wait some random time and wait if we have an ongoing codec2 transmission
# on our channel. This should prevent some packet collision
random_delay = np.random.randint(0, 6)
threading.Event().wait(random_delay)
self.states.channel_busy_condition_codec2.wait(5)
self.transmit(qrv_frame)
if self.config["MESSAGES"]["enable_auto_repeat"]:
# set message to queued if CQ received
DatabaseManagerMessages(self.event_manager).set_message_to_queued_for_callsign(self.details['frame']["origin"])