diff --git a/target_simulator/gui/sfp_debug_window.py b/target_simulator/gui/sfp_debug_window.py index a42e293..8735b9d 100644 --- a/target_simulator/gui/sfp_debug_window.py +++ b/target_simulator/gui/sfp_debug_window.py @@ -731,6 +731,33 @@ class SfpDebugWindow(tk.Toplevel): except Exception: return None + def decimal_deg_to_dms(deg, is_lat=True): + """Convert decimal degrees to DMS string with direction. + + Examples: + 45.50417 -> 45°30'15" N + -73.9876 -> 73°59'15" W + """ + try: + d = float(deg) + except Exception: + return str(deg) + + # direction + if is_lat: + direction = "N" if d >= 0 else "S" + else: + direction = "E" if d >= 0 else "W" + + ad = abs(d) + degrees = int(ad) + minutes_full = (ad - degrees) * 60 + minutes = int(minutes_full) + seconds = (minutes_full - minutes) * 60 + + # Format seconds with 2 decimal places to keep it compact + return f"{degrees}°{minutes}'{seconds:.2f}\" {direction}" + # collect rows first so we can log the exact label->value mapping scenario_rows = [] for label, key, unit in order: @@ -783,8 +810,9 @@ class SfpDebugWindow(tk.Toplevel): elif key in ("latitude", "longitude"): fv = try_float(val) if fv is not None: - # show decimal degrees with higher precision per request - display_val = f"{fv:.{8}f} °" + # show as degrees/minutes/seconds with direction + is_lat = key == "latitude" + display_val = decimal_deg_to_dms(fv, is_lat=is_lat) else: display_val = str(val) elif key == "flags":