From 292135783408a901398e3c52d2ef52a2998e2ab2 Mon Sep 17 00:00:00 2001 From: VALLONGOL Date: Fri, 24 Oct 2025 11:22:49 +0200 Subject: [PATCH] sistemata conversione raw/simplified nella schermata di debug --- target_simulator/gui/sfp_debug_window.py | 72 ++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 5 deletions(-) diff --git a/target_simulator/gui/sfp_debug_window.py b/target_simulator/gui/sfp_debug_window.py index 671b256..c4dbece 100644 --- a/target_simulator/gui/sfp_debug_window.py +++ b/target_simulator/gui/sfp_debug_window.py @@ -106,6 +106,10 @@ class SfpDebugWindow(tk.Toplevel): self.destroy() def _process_gui_updates(self): + """ + This method runs on the GUI thread and processes all queued updates. + """ + # 1. Process target updates for the PPI try: while not self.debug_update_queue.empty(): real_targets = self.debug_update_queue.get_nowait() @@ -113,6 +117,7 @@ class SfpDebugWindow(tk.Toplevel): except Empty: pass + # 2. Process other buffered payloads (for text tabs) if self.payload_router: try: new_payloads = self.payload_router.get_and_clear_latest_payloads() @@ -131,24 +136,81 @@ class SfpDebugWindow(tk.Toplevel): import json struct = json.loads(payload.decode("utf-8")) if isinstance(payload, (bytes, bytearray)) else payload - for iid in self.scenario_tree.get_children(): self.scenario_tree.delete(iid) + # --- START OF NEW LOGIC --- + + view_mode = self.scenario_view_mode.get() + decimals = self.simplified_decimals.get() + + # Helper functions for conversion + def to_deg(rad): return rad * 180.0 / math.pi + def m_s_to_ft_s(ms): return ms * 3.28084 + def m_to_ft(m): return m * 3.28084 + def decimal_deg_to_dms(deg, is_lat): + d = abs(deg) + degrees = int(d) + minutes_full = (d - degrees) * 60 + minutes = int(minutes_full) + seconds = (minutes_full - minutes) * 60 + direction = "" + if is_lat: + direction = 'N' if deg >= 0 else 'S' + else: + direction = 'E' if deg >= 0 else 'W' + return f"{degrees}° {minutes}' {seconds:.2f}\" {direction}" + + # 1. Update scenario tree + self.scenario_tree.delete(*self.scenario_tree.get_children()) scenario = struct.get("scenario", {}) if scenario: - for field_name, value in scenario.items(): - self.scenario_tree.insert("", tk.END, values=(field_name, str(value))) + for field, value in scenario.items(): + display_value = value + if view_mode == 'simplified': + if field in ['platform_azimuth', 'true_heading', 'ant_nav_az', 'ant_nav_el']: + display_value = f"{to_deg(value):.{decimals}f}°" + elif field in ['vx', 'vy', 'vz']: + display_value = f"{m_s_to_ft_s(value):.{decimals}f} ft/s" + elif field == 'baro_altitude': + display_value = f"{m_to_ft(value):.{decimals}f} ft" + elif field in ['latitude', 'longitude']: + display_value = decimal_deg_to_dms(value, is_lat=(field == 'latitude')) + elif field == 'mode' and value < len(self._master_mode_names): + display_value = f"{value} ({self._master_mode_names[value].replace('_master_mode', '')})" + elif isinstance(value, list): + display_value = str(value) # Keep arrays as string + + self.scenario_tree.insert("", tk.END, values=(field, display_value)) - for iid in self.ris_tree.get_children(): self.ris_tree.delete(iid) + # 2. Update ris_tree (all targets) + self.ris_tree.delete(*self.ris_tree.get_children()) targets = struct.get("targets", []) for i, t in enumerate(targets): flags_val = t.get("flags", 0) flags_display = f"0x{flags_val:X}" - vals = (i, flags_display, f"{t.get('heading', 0.0):.3f}", f"{t.get('x', 0.0):.3f}", f"{t.get('y', 0.0):.3f}", f"{t.get('z', 0.0):.3f}") + + if view_mode == 'simplified': + heading = f"{to_deg(t.get('heading', 0.0)):.{decimals}f}°" + x_pos = f"{m_to_ft(t.get('x', 0.0)):.{decimals}f} ft" + y_pos = f"{m_to_ft(t.get('y', 0.0)):.{decimals}f} ft" + z_pos = f"{m_to_ft(t.get('z', 0.0)):.{decimals}f} ft" + else: # Raw mode + heading = f"{t.get('heading', 0.0):.6f}" + x_pos = f"{t.get('x', 0.0):.3f}" + y_pos = f"{t.get('y', 0.0):.3f}" + z_pos = f"{t.get('z', 0.0):.3f}" + + vals = (i, flags_display, heading, x_pos, y_pos, z_pos) self.ris_tree.insert("", tk.END, values=vals) + + # --- END OF NEW LOGIC --- + except Exception: self.logger.exception("Failed to update RIS tables from JSON payload.") + except Exception: self.logger.exception("Error while fetching latest payloads from router") + # (raw packet display logic remains unchanged) + if self.payload_router: try: raw_pkt = self.payload_router.get_and_clear_raw_packet() if raw_pkt: