mirror of https://github.com/DJ2LS/FreeDATA.git
52 lines
2.0 KiB
Python
52 lines
2.0 KiB
Python
import socket
|
|
import structlog
|
|
import threading
|
|
|
|
|
|
def send_adif_qso_data(ctx, adif_data):
|
|
"""
|
|
Sends ADIF QSO data to the specified server via UDP in a non-blocking manner.
|
|
|
|
Parameters:
|
|
ctx.config_manager (dict): ctx.config_manageruration settings.
|
|
ctx.event_manager: An event manager to log success/failure.
|
|
adif_data (str): ADIF-formatted QSO data.
|
|
"""
|
|
log = structlog.get_logger()
|
|
|
|
# Check if ADIF UDP logging is enabled
|
|
adif = ctx.config_manager.config["QSO_LOGGING"].get("enable_adif_udp", "False")
|
|
if not adif:
|
|
return # Exit if ADIF UDP logging is disabled
|
|
|
|
adif_log_host = ctx.config_manager.config["QSO_LOGGING"].get("adif_udp_host", "127.0.0.1")
|
|
adif_log_port = int(ctx.config_manager.config["QSO_LOGGING"].get("adif_udp_port", "2237"))
|
|
|
|
def send_thread():
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
# Set a timeout of 3 seconds to avoid blocking indefinitely
|
|
sock.settimeout(3)
|
|
|
|
callsign_start = adif_data.find(">") + 1
|
|
callsign_end = adif_data.find("<QSO_DATE", callsign_start)
|
|
call_value = adif_data[callsign_start:callsign_end]
|
|
|
|
try:
|
|
sock.sendto(adif_data.encode("utf-8"), (adif_log_host, adif_log_port))
|
|
log.info(f"[CHAT] ADIF QSO data sent to: {adif_log_host}:{adif_log_port}")
|
|
ctx.event_manager.freedata_logging(type="udp", status=True, message=f" {call_value} ")
|
|
|
|
except socket.timeout:
|
|
log.info(f"[CHAT] Timeout occurred sending ADIF data to {adif_log_host}:{adif_log_port}")
|
|
ctx.event_manager.freedata_logging(type="udp", status=True, message=f" {call_value} ")
|
|
except Exception as e:
|
|
log.info(f"[CHAT] Error sending ADIF data: {e}")
|
|
ctx.event_manager.freedata_logging(type="udp", status=True, message=f" {call_value} ")
|
|
|
|
finally:
|
|
sock.close()
|
|
|
|
# Run the sending function in a separate thread
|
|
thread = threading.Thread(target=send_thread, daemon=True)
|
|
thread.start()
|