atomic_ext.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. ### Model
  2. from pypdevs.DEVS import *
  3. from pypdevs.infinity import INFINITY
  4. class TrafficLight(AtomicDEVS):
  5. def __init__(self):
  6. AtomicDEVS.__init__(self, "Light")
  7. self.state = "green"
  8. self.elapsed = 0.0
  9. self.observe = self.addOutPort("observer")
  10. self.interrupt = self.addInPort("interrupt")
  11. def intTransition(self):
  12. state = self.state
  13. return {"red": "green",
  14. "yellow": "red",
  15. "green": "yellow"}[state]
  16. def timeAdvance(self):
  17. state = self.state
  18. return {"red": 60,
  19. "yellow": 3,
  20. "green": 57,
  21. "manual": INFINITY}[state]
  22. def outputFnc(self):
  23. state = self.state
  24. if state == "red":
  25. return {self.observe: "show_green"}
  26. elif state == "yellow":
  27. return {self.observe: "show_red"}
  28. elif state == "green":
  29. return {self.observe: "show_yellow"}
  30. def extTransition(self, inputs):
  31. inp = inputs[self.interrupt]
  32. if inp == "manual":
  33. return "manual"
  34. elif inp == "auto":
  35. if self.state == "manual":
  36. return "red"
  37. ### Experiment
  38. from pypdevs.simulator import Simulator
  39. model = TrafficLight()
  40. sim = Simulator(model)
  41. sim.setVerbose()
  42. sim.setTerminationTime(500)
  43. sim.setClassicDEVS()
  44. sim.simulate()