diff --git a/sw/utility/simulation/management.py b/sw/utility/simulation/management.py index 15b9008..4fc5992 100644 --- a/sw/utility/simulation/management.py +++ b/sw/utility/simulation/management.py @@ -8,6 +8,7 @@ from pathlib import Path import platform from datetime import datetime import timeit +import collections.abc from utility import misc @@ -120,7 +121,14 @@ class SimulationDeSerializer: self._save_metadata(sim_name, metadata) # Save results - df = simulator.get_current_results() + data = {} + for key, value in simulator.get_current_results().items(): + if not isinstance(value, collections.abc.Sequence): + value = [value] + + data[misc.slugify(key)] = value + + df = pd.DataFrame(data) df.to_csv(self._get_results_path(sim_name)) def read_results(self, sim_name: str) -> typing.Tuple[ @@ -165,10 +173,6 @@ class SimulationManager: self._metadata = {"duration": 0} self._sim_start_time = None - signal.signal(signal.SIGINT, self._exit_gracefully) - signal.signal(signal.SIGTERM, self._exit_gracefully) - signal.signal(signal.SIGHUP, self._exit_gracefully) - def _sim_configured(self) -> bool: """Check whether 'configure_simulation()' has been called.""" return (self._simulator is not None) and ( @@ -224,13 +228,16 @@ class SimulationManager: """Start the simulation. This is a blocking call.""" assert self._sim_configured() - self._sim_start_time = timeit.default_timer() + try: + self._sim_start_time = timeit.default_timer() - self._simulator.start() + self._simulator.start_or_continue() - self._metadata["end_time"] = f"{datetime.now(tz=None)}" - self._metadata["duration"] \ - += timeit.default_timer() - self._sim_start_time + self._metadata["end_time"] = f"{datetime.now(tz=None)}" + self._metadata["duration"] \ + += timeit.default_timer() - self._sim_start_time - self._de_serializer.save_results(self._simulator, self._sim_name, - self._metadata) + self._de_serializer.save_results(self._simulator, self._sim_name, + self._metadata) + except KeyboardInterrupt: + self._exit_gracefully()