diff --git a/scenario_simulator/gui/gui.py b/scenario_simulator/gui/gui.py index ae6a3ec..dd5dd13 100644 --- a/scenario_simulator/gui/gui.py +++ b/scenario_simulator/gui/gui.py @@ -422,9 +422,9 @@ class App(tk.Tk): report = [] max_range = radar_math.calculate_max_unambiguous_range(radar_cfg.prf) max_vel = radar_math.calculate_max_unambiguous_velocity(radar_cfg.carrier_frequency, radar_cfg.prf) - report.append(f"--- Radar Configuration Analysis ---") + report.append("--- Radar Configuration Analysis ---") report.append(f"Max Unambiguous Range: {max_range:,.0f} m") - report.append(f"Max Unambiguous Velocity: b1{max_vel:,.1f} m/s") + report.append(f"Max Unambiguous Velocity: +/-{max_vel:,.1f} m/s") report.append(f"Current Antenna Azimuth: {current_az_deg:,.1f} deg") if radar_cfg.scan_config.mode != 'staring' and radar_cfg.scan_config.scan_speed_deg_s > 0: dwell_time = radar_math.calculate_dwell_time(radar_cfg.antenna_config.beamwidth_az_deg, radar_cfg.scan_config.scan_speed_deg_s) @@ -433,7 +433,7 @@ class App(tk.Tk): report.append(f"Calculated Pulses on Target: {pulses_on_target:,}") if pulses_on_target < self.vars["num_pulses_cpi"].get(): report.append("WARNING: Pulses per CPI > Pulses on Target") - report.append(f"\n--- Target Analysis ---") + report.append("\n--- Target Analysis ---") if not targets: report.append("No targets defined.") else: @@ -453,29 +453,50 @@ class App(tk.Tk): beamwidth = self.vars["beamwidth_az_deg"].get() scan_mode = self.vars["scan_mode"].get() scan_speed = self.vars["scan_speed_deg_s"].get() - pri = 1.0 / prf - pulse_width = pri * (duty_cycle / 100.0) - self.vars["pulse_width_text"].set(f"Pulse Width: {pulse_width * 1e6:, .2f} µs") - self.vars["listening_time_text"].set(f"Listening Window: {pri * 1e6:, .2f} µs (Max Range Time)") + + if prf > 0: + pri = 1.0 / prf + pulse_width = pri * (duty_cycle / 100.0) + self.vars["pulse_width_text"].set(f"Pulse Width: {pulse_width * 1e6:,.2f} µs") + self.vars["listening_time_text"].set(f"Listening Window: {pri * 1e6:,.2f} µs (Max Range Time)") + else: + self.vars["pulse_width_text"].set("Pulse Width: N/A (PRF is zero)") + self.vars["listening_time_text"].set("Listening Window: N/A (PRF is zero)") + max_range = radar_math.calculate_max_unambiguous_range(prf) + if np.isinf(max_range): + self.vars["max_range_text"].set("Max Unambiguous Range: Infinite (PRF is zero)") + else: + self.vars["max_range_text"].set(f"Max Unambiguous Range: {max_range:,.0f} m") + max_vel = radar_math.calculate_max_unambiguous_velocity(carrier_freq, prf) - self.vars["max_range_text"].set(f"Max Unambiguous Range: {max_range:, .0f} m") - self.vars["max_velocity_text"].set(f"Max Unambiguous Velocity: b1{max_vel:, .1f} m/s") - if scan_mode == 'staring': + if np.isinf(max_vel): + self.vars["max_velocity_text"].set("Max Unambiguous Velocity: Infinite (carrier freq is zero)") + else: + self.vars["max_velocity_text"].set(f"Max Unambiguous Velocity: +/-{max_vel:,.1f} m/s") + + if scan_mode == 'staring' or scan_speed <= 0: self.vars["dwell_time_text"].set("Dwell Time: N/A (Staring)") self.vars["pulses_on_target_text"].set("Pulses on Target: N/A (Staring)") else: dwell_time = radar_math.calculate_dwell_time(beamwidth, scan_speed) pulses_on_target = radar_math.calculate_pulses_on_target(dwell_time, prf) - self.vars["dwell_time_text"].set(f"Dwell Time: {dwell_time * 1e3:, .2f} ms") - self.vars["pulses_on_target_text"].set(f"Pulses on Target: {pulses_on_target:,}") + if np.isinf(dwell_time): + self.vars["dwell_time_text"].set("Dwell Time: Infinite (Scan Speed is zero)") + self.vars["pulses_on_target_text"].set("Pulses on Target: Infinite") + else: + self.vars["dwell_time_text"].set(f"Dwell Time: {dwell_time * 1e3:,.2f} ms") + self.vars["pulses_on_target_text"].set(f"Pulses on Target: {pulses_on_target:,}") + self.check_target_warnings() self._update_scan_info_text() - except (tk.TclError, ValueError, ZeroDivisionError): pass + except (tk.TclError, ValueError) as e: + self.log.error(f"Error updating derived parameters: {e}") def _update_scan_info_text(self): mode = self.vars['scan_mode'].get() - if mode == 'staring': self.vars['scan_info_text'].set("Mode: Staring") + if mode == 'staring': + self.vars['scan_info_text'].set("Mode: Staring") else: min_az, max_az, speed = self.vars['min_az_deg'].get(), self.vars['max_az_deg'].get(), self.vars['scan_speed_deg_s'].get() self.vars['scan_info_text'].set(f"Mode: Sector Scan\nAz: [{min_az}°, {max_az}°] @ {speed}°/s") @@ -492,11 +513,11 @@ class App(tk.Tk): target_initial_range = np.linalg.norm(values[0:3]) if target_initial_range > 0: target_radial_vel = np.dot(values[3:6], values[0:3] / target_initial_range) else: target_radial_vel = 0 - if target_initial_range > max_range: range_warning = True - if abs(target_radial_vel) > max_vel: vel_warning = True + if not np.isinf(max_range) and target_initial_range > max_range: range_warning = True + if not np.isinf(max_vel) and abs(target_radial_vel) > max_vel: vel_warning = True self.max_range_label.config(foreground='orange' if range_warning else 'black') self.max_velocity_label.config(foreground='orange' if vel_warning else 'black') - except (tk.TclError, ValueError, ZeroDivisionError): + except (tk.TclError, ValueError, ZeroDivisionError): if hasattr(self, 'max_range_label'): self.max_range_label.config(foreground='black') if hasattr(self, 'max_velocity_label'): self.max_velocity_label.config(foreground='black') @@ -573,4 +594,4 @@ class App(tk.Tk): def start_gui(): """Entry point to launch the Tkinter GUI application.""" app = App() - app.mainloop() + app.mainloop() \ No newline at end of file diff --git a/scenario_simulator/utils/logger.py b/scenario_simulator/utils/logger.py index a105011..f039617 100644 --- a/scenario_simulator/utils/logger.py +++ b/scenario_simulator/utils/logger.py @@ -1,4 +1,4 @@ -# FlightMonitor/utils/logger.py +# scenario_simulator/utils/logger.py import logging import logging.handlers # For RotatingFileHandler import tkinter as tk