From 717d6b63de5e6d9cdb2815f6cba0f73741b96a89 Mon Sep 17 00:00:00 2001 From: VALLONGOL Date: Tue, 14 Oct 2025 13:19:05 +0200 Subject: [PATCH] fix del comportamento della simulazione in editing che non si fermava senza spline --- Temp/spline_preview.csv | 199 +++++++++--------- settings.json | 4 +- target_simulator/core/models.py | 6 + target_simulator/core/simulation_engine.py | 11 + target_simulator/gui/main_view.py | 13 +- .../gui/trajectory_editor_window.py | 2 +- 6 files changed, 126 insertions(+), 109 deletions(-) diff --git a/Temp/spline_preview.csv b/Temp/spline_preview.csv index 8ff5dfb..35dafef 100644 --- a/Temp/spline_preview.csv +++ b/Temp/spline_preview.csv @@ -1,101 +1,100 @@ x_nm,y_nm -0.17452406437283513,9.998476951563912 -0.2859422147817867,10.279638104623308 -0.4421393353133215,10.609933583832394 -0.636432547474389,10.985187585712282 -0.8621389727719386,11.401224306784082 -1.1125757327129193,11.853867943568899 -1.3810599488042814,12.338942692587844 -1.6609087425529734,12.852272750362022 -1.9454392354659444,13.389682313412546 -2.227968549050145,13.946995578260525 -2.5018138048125236,14.520036741427065 -2.7602921242600305,15.104629999433275 -2.996720628899614,15.696599548800267 -3.2044164402382243,16.291769586049142 -3.3766966797828104,16.885964307701016 -3.5068784690403216,17.475007910277 -3.588278929517707,18.054724590298196 -3.6142151827219164,18.620938544285714 -3.578004350159902,19.169473968760666 -3.472963553338606,19.696155060244156 -3.4729635533386065,19.69615506024416 -3.272762644392875,20.217383756990923 -2.964843068011936,20.750866222507394 -2.5631793345343286,21.294382991192247 -2.081745954298589,21.845714597444157 -1.5345174376432555,22.402641575661793 -0.9354682949068648,22.962944460243826 -0.2985730364279542,23.52440378558893 --0.36219382745493856,24.084800086095772 --1.032857786403277,24.641913896163032 --1.699444330078522,25.193525750189377 --2.347978948142139,25.737416182573483 --2.964487130255587,26.271365727714013 --3.5349943660803307,26.793154920009652 --4.045526145277833,27.30056429385906 --4.482107957509558,27.79137438366092 --4.830765292436963,28.263365723813894 --5.077523639721516,28.714318848716662 --5.208408489024677,29.14201429276789 --5.2094453300079095,29.544232590366253 --5.2094453300079095,29.544232590366242 --5.087215806911271,29.93160758132983 --4.8634013589893685,30.31504050771131 --4.54667716842549,30.69271300726126 --4.145718417402923,31.062806717730222 --3.6692002881049564,31.42350327686877 --3.1257979627148766,31.772984322427458 --2.5241866234159707,32.10943149215684 --1.873041452391528,32.43102642380748 --1.1810376318248348,32.735950755129934 --0.4568503438991798,33.02238612387475 -0.29084522920215017,33.28851416779252 -1.0533739052958677,33.53251652463377 -1.822060502198683,33.75257483214907 -2.5882298377273103,33.94687072808898 -3.343206729698462,34.113585850204075 -4.078315995928851,34.25090183624488 -4.784882454235189,34.35700032396197 -5.454230922434187,34.430062951105924 -6.077686218342558,34.46827135542727 -6.077686218342562,34.468271355427284 -6.6950615437258465,34.47971290071672 -7.3476044195818755,34.472832854810775 -8.028791142575807,34.44634971152879 -8.732098009372796,34.3989819646901 -9.451001316637997,34.32944810811404 -10.178977361036566,34.23646663561996 -10.909502439233654,34.11875604102719 -11.636052847894423,33.97503481815507 -12.352104883684024,33.80402146082294 -13.051134843267612,33.60443446285013 -13.726619023310347,33.37499231805599 -14.372033720477376,33.114413520259845 -14.98085523143386,32.82141656328105 -15.546559852844958,32.49471994093893 -16.062623881375814,32.13304214705283 -16.522523613691593,31.735101675442085 -16.919735346457447,31.29961701992603 -17.247735376338525,30.825306674324008 -17.499999999999996,30.310889132455358 -17.499999999999996,30.310889132455355 -17.667951456825268,29.722378176057024 -17.752649951768674,29.034858901953363 -17.76202872985173,28.26065677659477 -17.704021036095945,27.412097266431687 -17.586560115522854,26.501505837914515 -17.417579213153953,25.541207957493693 -17.205011574010783,24.54352909161962 -16.956790443114837,23.52079470674273 -16.68084906548765,22.485330269313444 -16.385120686150735,21.449461245782175 -16.0775385501256,20.425513102599343 -15.766035902433776,19.42581130621538 -15.45854598809677,18.462681323080695 -15.1630020521361,17.5484486196457 -14.88733733957329,16.69543866236083 -14.639485095429851,15.9159769176765 -14.427378564727302,15.222388852043133 -14.258950992487165,14.626999931911136 -14.142135623730947,14.142135623730947 +1.7364817766693033,9.84807753012208 +1.8196915585801245,9.997286852043835 +1.909698355298528,10.164705993254746 +2.006314644389864,10.349354914685591 +2.1093529034194827,10.550253577267155 +2.218625609952734,10.766421941930222 +2.3339452415549684,10.99687996960557 +2.4551242757915364,11.240647621223985 +2.581975190227787,11.496744857716246 +2.714310462429072,11.764191640013136 +2.851942569960741,12.04200792904544 +2.9946839903881437,12.329213685743936 +3.14234720127663,12.624828871039403 +3.2947446801915516,12.927873445862636 +3.4516889046982575,13.237367371144403 +3.612992352362098,13.552330607815493 +3.7784675007484245,13.871783116806688 +3.947926827422586,14.19474485904877 +4.121182809949932,14.520235795472518 +4.298047925895815,14.847275887008719 +4.478334652825583,15.17488509458815 +4.661855468304586,15.502083379141595 +4.848422849898178,15.827890701599843 +5.037849275171705,16.151327022893664 +5.2299472216905185,16.471412303953848 +5.424529167019969,16.787166505711173 +5.621407588725407,17.09760958909643 +5.8203949643721815,17.401761515040384 +6.021303771525644,17.698642244473834 +6.223946487751144,17.987271738327554 +6.4281355906140325,18.26666995753233 +6.6336835576796584,18.535856863018942 +6.840402866513372,18.79385241571817 +6.840402866513374,18.79385241571817 +7.064412663195302,19.043619595904882 +7.319986102939524,19.28896147814137 +7.604166677012322,19.530158164789555 +7.913997876679983,19.767489758211376 +8.246523193208787,20.001236360768743 +8.598786117865023,20.231678074823588 +8.96783014191497,20.459095002737843 +9.350698756624908,20.683767246873423 +9.744435453261131,20.90597490959226 +10.146083723089918,21.12599809325628 +10.552687057377549,21.3441169002274 +10.961288947390312,21.560611432867567 +11.368932884394491,21.775761793538678 +11.772662359656369,21.989848084602684 +12.169520864442228,22.203150408421493 +12.556551890018351,22.41594886735704 +12.930798927651024,22.62852356377125 +13.289305468606532,22.84115460002604 +13.629115004151155,23.054122078483353 +13.947271025551181,23.267706101505095 +14.24081702407289,23.482186771453204 +14.506796490982568,23.6978441906896 +14.742252917546494,23.91495846157622 +14.944229795030958,24.133809686474972 +15.109770614702246,24.354677967747794 +15.23591886782663,24.57784340775661 +15.319718045670406,24.80358610886334 +15.358211639499848,25.032186173429917 +15.348443140581244,25.26392370381826 +15.28745604018088,25.499078802390304 +15.172293829565035,25.737931571507964 +15.0,25.980762113533167 +14.999999999999998,25.98076211353316 +14.76007873005941,26.230939963143115 +14.447076186168827,26.491050501357915 +14.065598841372388,26.760197600053854 +13.62025316871424,27.037485131107207 +13.11564564123853,27.322016966394273 +12.556382731989396,27.612896977791323 +11.947070914010986,27.909229037174644 +11.292316660347446,28.210117016420522 +10.596726444042913,28.514664787405238 +9.86490673814154,28.82197622200508 +9.101464015687464,29.13115519209633 +8.311004749724834,29.441305569555276 +7.498135413297791,29.751531226258194 +6.66746247945048,30.060936034081376 +5.823592421227048,30.368623864901103 +4.971131711671633,30.67369859059366 +4.114686823828384,30.97526408303533 +3.2588642307414455,31.272424214102394 +2.4082704054549575,31.564282855671145 +1.5675118210130687,31.84994387961786 +0.7411949504599216,32.12851115781883 +-0.06607373316034426,32.39908856215034 +-0.8496877568035757,32.660779964488654 +-1.6050406474256338,32.91268923671007 +-2.3275259319823753,33.15392025069089 +-3.0125371374296517,33.38357687830738 +-3.6554677907233284,33.600762991435815 +-4.2517114188192515,33.80458246195249 +-4.796661548673278,33.99413916173369 +-5.285711707241269,34.1685369626557 +-5.714255421479081,34.326879736594805 +-6.077686218342556,34.46827135542728 diff --git a/settings.json b/settings.json index e675819..a2d0f59 100644 --- a/settings.json +++ b/settings.json @@ -114,7 +114,7 @@ "target_azimuth_deg": 45.0 } ], - "use_spline": false + "use_spline": true }, { "target_id": 1, @@ -150,7 +150,7 @@ "target_azimuth_deg": -10.0 } ], - "use_spline": false + "use_spline": true } ] } diff --git a/target_simulator/core/models.py b/target_simulator/core/models.py index b48ea00..1ef3b8a 100644 --- a/target_simulator/core/models.py +++ b/target_simulator/core/models.py @@ -245,6 +245,9 @@ class Target: self._sim_time_s += delta_time_s self._time_in_waypoint_s += delta_time_s if self._current_waypoint_index == -1: + # Traiettoria terminata: disattiva target + self.active = False + self.current_velocity_fps = 0.0 return wp = self.trajectory[self._current_waypoint_index] duration = wp._calculated_duration_s if wp._calculated_duration_s is not None else wp.duration_s or 0.0 @@ -256,6 +259,9 @@ class Target: self.current_altitude_ft = wp.target_altitude_ft or self.current_altitude_ft self._activate_next_waypoint() if self._current_waypoint_index == -1: + # Traiettoria terminata: disattiva target + self.active = False + self.current_velocity_fps = 0.0 return wp = self.trajectory[self._current_waypoint_index] # Get new active waypoint duration = wp._calculated_duration_s if wp._calculated_duration_s is not None else wp.duration_s or 0.0 diff --git a/target_simulator/core/simulation_engine.py b/target_simulator/core/simulation_engine.py index bcaa210..bb9032e 100644 --- a/target_simulator/core/simulation_engine.py +++ b/target_simulator/core/simulation_engine.py @@ -79,6 +79,17 @@ class SimulationEngine(threading.Thread): self.scenario.update_state(simulated_delta_time) updated_targets = self.scenario.get_all_targets() + # --- Check for simulation end --- + if hasattr(self.scenario, 'is_finished') and self.scenario.is_finished(): + self.logger.info("Simulation finished: auto-stopping thread.") + self._stop_event.set() + if self.update_queue: + try: + self.update_queue.put_nowait('SIMULATION_FINISHED') + except Exception: + pass + break + # --- Communication Step (conditional) --- if self.communicator and self.communicator.is_open: if current_time - self._last_update_time >= self.update_interval_s: diff --git a/target_simulator/gui/main_view.py b/target_simulator/gui/main_view.py index 002ab8d..0cd4458 100644 --- a/target_simulator/gui/main_view.py +++ b/target_simulator/gui/main_view.py @@ -145,7 +145,7 @@ class MainView(tk.Tk): ttk.Label(engine_frame, text="Speed:").pack(side=tk.LEFT, padx=(10, 2), pady=5) self.time_multiplier_var = tk.StringVar(value="1x") - self.multiplier_combo = ttk.Combobox(engine_frame, textvariable=self.time_multiplier_var, values=["1x", "2x", "4x", "10x"], state="readonly", width=4) + self.multiplier_combo = ttk.Combobox(engine_frame, textvariable=self.time_multiplier_var, values=["1x", "2x", "4x", "10x", "20x"], state="readonly", width=4) self.multiplier_combo.pack(side=tk.LEFT, padx=(0, 5), pady=5) self.multiplier_combo.bind("<>", self._on_time_multiplier_changed) @@ -336,12 +336,13 @@ class MainView(tk.Tk): def _process_gui_queue(self): try: while not self.gui_update_queue.empty(): - updated_targets: List[Target] = self.gui_update_queue.get_nowait() - self._update_all_views(updated_targets) - # Stop simulation and update buttons if all targets are inactive - if self.is_simulation_running.get(): - if all(not t.active for t in self.scenario.get_all_targets()): + update = self.gui_update_queue.get_nowait() + if update == 'SIMULATION_FINISHED': + self.logger.info("Simulazione terminata: aggiorno pulsanti per nuovo avvio.") self._on_stop_simulation() + else: + updated_targets: List[Target] = update + self._update_all_views(updated_targets) finally: if self.is_simulation_running.get(): self.after(GUI_QUEUE_POLL_INTERVAL_MS, self._process_gui_queue) diff --git a/target_simulator/gui/trajectory_editor_window.py b/target_simulator/gui/trajectory_editor_window.py index df1f175..5a8f8e7 100644 --- a/target_simulator/gui/trajectory_editor_window.py +++ b/target_simulator/gui/trajectory_editor_window.py @@ -96,7 +96,7 @@ class TrajectoryEditorWindow(tk.Toplevel): # ...existing code... ttk.Label(preview_controls, text="Speed:").pack(side=tk.LEFT, padx=(10, 2), pady=5) self.time_multiplier_var = tk.StringVar(value="1x") - self.multiplier_combo = ttk.Combobox(preview_controls, textvariable=self.time_multiplier_var, values=["1x", "2x", "4x", "10x"], state="readonly", width=4) + self.multiplier_combo = ttk.Combobox(preview_controls, textvariable=self.time_multiplier_var, values=["1x", "2x", "4x", "10x", "20x"], state="readonly", width=4) self.multiplier_combo.pack(side=tk.LEFT, padx=(0, 5), pady=5) self.multiplier_combo.bind("<>", self._on_time_multiplier_changed)