trafficlight.py 1.5 KB

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