run.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import sys
  2. import importlib.util
  3. import atexit
  4. import tkinter
  5. from tkinter.constants import BOTH, NO
  6. from lib import gui, simulator
  7. from lib.test import print_trace
  8. def my_import(name, path):
  9. spec = importlib.util.spec_from_file_location(name, path)
  10. module = importlib.util.module_from_spec(spec)
  11. sys.modules[name] = module
  12. spec.loader.exec_module(module)
  13. return module
  14. def run_demo(model_module, time_scale):
  15. input_trace = []
  16. output_trace = []
  17. sc = model_module.Statechart()
  18. controller = simulator.Controller()
  19. sc.timer_service = simulator.TimerService(controller, time_scale)
  20. tk = tkinter.Tk()
  21. tk.withdraw()
  22. toplevel = tkinter.Toplevel(tk)
  23. toplevel.resizable(width=NO, height=NO)
  24. toplevel.title("Microwave oven simulator")
  25. g = gui.GUI(toplevel)
  26. def on_update():
  27. pass
  28. sim = simulator.RealTimeSimulation(controller, toplevel, on_update)
  29. def send_event(event: str):
  30. timestamp = sim.add_input(sc, event)
  31. input_trace.append((timestamp, event, None))
  32. g.send_event = send_event
  33. class MyObserver():
  34. def __init__(self, event):
  35. self.event = event
  36. def next(self, value=None):
  37. print("Time = %03dms - Output event: %s" % (controller.get_simtime_seconds()*1000, self.event))
  38. g.handle_event(self.event, value)
  39. output_trace.append((controller.simulated_time, self.event, value))
  40. sc.turn_magnetron_on_observable.subscribe(MyObserver("turn_magnetron_on"))
  41. sc.turn_magnetron_off_observable.subscribe(MyObserver("turn_magnetron_off"))
  42. sc.set_displayed_time_observable.subscribe(MyObserver("set_displayed_time"))
  43. sc.ring_bell_observable.subscribe(MyObserver("ring_bell"))
  44. def print_exit_trace():
  45. print("Exiting...")
  46. print("Full trace (you can add this to the SCENARIOS in test.py)...")
  47. print("{")
  48. print(" \"name\": \"interactive\",")
  49. print(" \"input_trace\": ", end='')
  50. print_trace(input_trace, 4)
  51. print(",")
  52. print(" \"output_trace\": ", end='')
  53. print_trace(output_trace, 4)
  54. print(",")
  55. print("}")
  56. atexit.register(print_exit_trace)
  57. controller.start()
  58. sc.enter()
  59. sim.interrupt() # schedule first wakeup
  60. tk.mainloop()
  61. if __name__ == "__main__":
  62. if len(sys.argv) < 2:
  63. print("Usage:")
  64. print(" python run.py MODELNAME [TIME_SCALE]")
  65. print("")
  66. print("Example:")
  67. print(" python run.py 50_History 2.0")
  68. sys.exit(1)
  69. model_name = sys.argv[1]
  70. if len(sys.argv) == 3:
  71. time_scale = float(sys.argv[2])
  72. else:
  73. time_scale = 1.0
  74. model_module = my_import("sc", "YAKINDU_WORKSPACE/" + model_name + "/srcgen/statechart.py")
  75. run_demo(model_module, time_scale)