From 5e9f92dfa68a9a8841c4a10a1e8a68b3c3d9401d Mon Sep 17 00:00:00 2001 From: Hemna Date: Thu, 17 Oct 2024 17:04:33 -0400 Subject: [PATCH] Added color logging of thread names at keepalive This patch adds logging of the thread name in color during keepalive loop output. --- aprsd/threads/keep_alive.py | 9 +++++- aprsd/utils/__init__.py | 55 +++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/aprsd/threads/keep_alive.py b/aprsd/threads/keep_alive.py index 9671c1a..b212ac4 100644 --- a/aprsd/threads/keep_alive.py +++ b/aprsd/threads/keep_alive.py @@ -3,6 +3,7 @@ import logging import time import tracemalloc +from loguru import logger from oslo_config import cfg from aprsd import packets, utils @@ -14,6 +15,7 @@ from aprsd.threads import APRSDThread, APRSDThreadList CONF = cfg.CONF LOG = logging.getLogger("APRSD") +LOGU = logger class KeepAliveThread(APRSDThread): @@ -87,7 +89,12 @@ class KeepAliveThread(APRSDThread): key = thread["name"] if not alive: LOG.error(f"Thread {thread}") - LOG.info(f"{key: <15} Alive? {str(alive): <5} {str(age): <20}") + + thread_hex = f"fg {utils.hex_from_name(key)}" + t_name = f"<{thread_hex}>{key:<15}" + thread_msg = f"{t_name} Alive? {str(alive): <5} {str(age): <20}" + LOGU.opt(colors=True).info(thread_msg) + # LOG.info(f"{key: <15} Alive? {str(alive): <5} {str(age): <20}") # check the APRS connection cl = client_factory.create() diff --git a/aprsd/utils/__init__.py b/aprsd/utils/__init__.py index eb24fac..b924ec3 100644 --- a/aprsd/utils/__init__.py +++ b/aprsd/utils/__init__.py @@ -2,6 +2,7 @@ import errno import functools +import math import os import re import sys @@ -82,6 +83,16 @@ def rgb_from_name(name): return red, green, blue +def hextriplet(colortuple): + """Convert a color tuple to a hex triplet.""" + return "#" + "".join(f"{i:02X}" for i in colortuple) + + +def hex_from_name(name): + """Create a hex color from a string.""" + return hextriplet(rgb_from_name(name)) + + def human_size(bytes, units=None): """Returns a human readable string representation of bytes""" if not units: @@ -161,3 +172,47 @@ def load_entry_points(group): except Exception as e: print(f"Extension {ep.name} of group {group} failed to load with {e}", file=sys.stderr) print(traceback.format_exc(), file=sys.stderr) + + +def calculate_initial_compass_bearing(start, end): + if (type(start) != tuple) or (type(end) != tuple): + raise TypeError("Only tuples are supported as arguments") + + lat1 = math.radians(float(start[0])) + lat2 = math.radians(float(end[0])) + + diffLong = math.radians(float(end[1]) - float(start[1])) + + x = math.sin(diffLong) * math.cos(lat2) + y = math.cos(lat1) * math.sin(lat2) - ( + math.sin(lat1) + * math.cos(lat2) * math.cos(diffLong) + ) + + initial_bearing = math.atan2(x, y) + + # Now we have the initial bearing but math.atan2 return values + # from -180° to + 180° which is not what we want for a compass bearing + # The solution is to normalize the initial bearing as shown below + initial_bearing = math.degrees(initial_bearing) + compass_bearing = (initial_bearing + 360) % 360 + + return compass_bearing + + +def degrees_to_cardinal(bearing, full_string=False): + if full_string: + DIRECTIONS = [ + "North", "North-Northeast", "Northeast", "East-Northeast", "East", "East-Southeast", + "Southeast", "South-Southeast", "South", "South-Southwest", "Southwest", "West-Southwest", + "West", "West-Northwest", "Northwest", "North-Northwest", "North", + ] + else: + DIRECTIONS = [ + "N", "NNE", "NE", "ENE", "E", "ESE", + "SE", "SSE", "S", "SSW", "SW", "WSW", + "W", "WNW", "NW", "NNW", "N", + ] + + cardinal = DIRECTIONS[round(bearing / 22.5)] + return cardinal