target rosso per real, target verde per simulato
This commit is contained in:
parent
5c0731f0b4
commit
323e3dfdac
@ -38,6 +38,8 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
,
|
||||||
|
"ppi_trail_length": 100
|
||||||
},
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
"enable_io_trace": true,
|
"enable_io_trace": true,
|
||||||
|
|||||||
@ -26,7 +26,7 @@ class PPIDisplay(ttk.Frame):
|
|||||||
"""
|
"""
|
||||||
TRAIL_LENGTH = 100 # Number of historical points to show in a target's trail
|
TRAIL_LENGTH = 100 # Number of historical points to show in a target's trail
|
||||||
|
|
||||||
def __init__(self, master, max_range_nm: int = 100, scan_limit_deg: int = 60):
|
def __init__(self, master, max_range_nm: int = 100, scan_limit_deg: int = 60, trail_length: int = None):
|
||||||
super().__init__(master)
|
super().__init__(master)
|
||||||
self.max_range = max_range_nm
|
self.max_range = max_range_nm
|
||||||
self.scan_limit_deg = scan_limit_deg
|
self.scan_limit_deg = scan_limit_deg
|
||||||
@ -38,10 +38,14 @@ class PPIDisplay(ttk.Frame):
|
|||||||
self.real_trail_artists = []
|
self.real_trail_artists = []
|
||||||
self.target_label_artists = []
|
self.target_label_artists = []
|
||||||
|
|
||||||
# Data store for target trails
|
# Data store for target trails. Use a bounded deque per-target whose
|
||||||
|
# max length is configurable (via constructor). The widget no longer
|
||||||
|
# supports an unbounded "full trail" mode — use a sufficiently large
|
||||||
|
# trail_length if you need a longer history.
|
||||||
|
self.trail_length = trail_length or self.TRAIL_LENGTH
|
||||||
self._trails = {
|
self._trails = {
|
||||||
"simulated": collections.defaultdict(lambda: collections.deque(maxlen=self.TRAIL_LENGTH)),
|
"simulated": collections.defaultdict(lambda: collections.deque(maxlen=self.trail_length)),
|
||||||
"real": collections.defaultdict(lambda: collections.deque(maxlen=self.TRAIL_LENGTH))
|
"real": collections.defaultdict(lambda: collections.deque(maxlen=self.trail_length)),
|
||||||
}
|
}
|
||||||
|
|
||||||
# Artists for trajectory preview
|
# Artists for trajectory preview
|
||||||
@ -156,6 +160,22 @@ class PPIDisplay(ttk.Frame):
|
|||||||
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
|
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
|
||||||
self._update_scan_lines()
|
self._update_scan_lines()
|
||||||
|
|
||||||
|
def _init_trails(self):
|
||||||
|
"""(Removed) kept for historical reasons but no longer used."""
|
||||||
|
# This method is intentionally left as a no-op. Trails are initialized
|
||||||
|
# during construction and are always bounded by `trail_length`.
|
||||||
|
return
|
||||||
|
|
||||||
|
def _on_full_trail_toggled(self):
|
||||||
|
"""Toggle between bounded trail and full trail while preserving data.
|
||||||
|
|
||||||
|
When switching modes we transfer existing points into the new structure
|
||||||
|
to avoid losing history unexpectedly.
|
||||||
|
"""
|
||||||
|
# Full-trail toggling has been removed. Keep the method present so
|
||||||
|
# callers won't fail if they still reference it, but do nothing.
|
||||||
|
return
|
||||||
|
|
||||||
def update_targets(self, targets_data: Union[List[Target], Dict[str, List[Target]]]):
|
def update_targets(self, targets_data: Union[List[Target], Dict[str, List[Target]]]):
|
||||||
"""
|
"""
|
||||||
Updates the display with the current state of targets.
|
Updates the display with the current state of targets.
|
||||||
|
|||||||
@ -415,7 +415,15 @@ class SfpDebugWindow(tk.Toplevel):
|
|||||||
paned.add(right, weight=2)
|
paned.add(right, weight=2)
|
||||||
# Create PPI widget inside ris_ppi_container but keep it hidden
|
# Create PPI widget inside ris_ppi_container but keep it hidden
|
||||||
try:
|
try:
|
||||||
self.ris_ppi_widget = PPIDisplay(self.ris_ppi_container, max_range_nm=100)
|
# Determine trail length from the configuration manager if available
|
||||||
|
gm = getattr(self.master, "config_manager", None)
|
||||||
|
trail_len = None
|
||||||
|
try:
|
||||||
|
general = gm.get_general_settings() if gm else {}
|
||||||
|
trail_len = general.get("ppi_trail_length") if isinstance(general, dict) else None
|
||||||
|
except Exception:
|
||||||
|
trail_len = None
|
||||||
|
self.ris_ppi_widget = PPIDisplay(self.ris_ppi_container, max_range_nm=100, trail_length=trail_len)
|
||||||
self.ris_ppi_widget.pack(fill=tk.BOTH, expand=True)
|
self.ris_ppi_widget.pack(fill=tk.BOTH, expand=True)
|
||||||
except Exception:
|
except Exception:
|
||||||
self.ris_ppi_widget = None
|
self.ris_ppi_widget = None
|
||||||
@ -1331,7 +1339,11 @@ class SfpDebugWindow(tk.Toplevel):
|
|||||||
f"PPI target sample: id={getattr(pt, 'target_id', None)} r_nm={getattr(pt,'current_range_nm',None):.2f} az={getattr(pt,'current_azimuth_deg',None):.2f} hdg={getattr(pt,'current_heading_deg',None):.2f}",
|
f"PPI target sample: id={getattr(pt, 'target_id', None)} r_nm={getattr(pt,'current_range_nm',None):.2f} az={getattr(pt,'current_azimuth_deg',None):.2f} hdg={getattr(pt,'current_heading_deg',None):.2f}",
|
||||||
"DEBUG",
|
"DEBUG",
|
||||||
)
|
)
|
||||||
self.update_ppi_targets(ppi_targets)
|
# Mark these as server-sent 'real' targets so
|
||||||
|
# PPIDisplay will draw them using the 'real'
|
||||||
|
# styling (red). Use the dict form expected
|
||||||
|
# by PPIDisplay to distinguish origins.
|
||||||
|
self.update_ppi_targets({"real": ppi_targets})
|
||||||
except Exception:
|
except Exception:
|
||||||
self.logger.exception(
|
self.logger.exception(
|
||||||
"Failed to push targets to PPI"
|
"Failed to push targets to PPI"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user