TrafficLight.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. from enum import Enum
  2. from pypdevs.DEVS import AtomicDEVS
  3. from pypdevs.infinity import INFINITY
  4. class Phase(Enum):
  5. Green = "Green"
  6. Orange = "Orange"
  7. Red = "Red"
  8. TakeOver = "Take Over"
  9. class TrafficLight(AtomicDEVS):
  10. def __init__(self, phases: tuple[int, int, int] = (2.5, 0.5, 3)):
  11. """
  12. :param phases: timings for green yellow/orange red phases of the traffic light
  13. """
  14. AtomicDEVS.__init__(self, "Traffic Light")
  15. self.phases = phases
  16. self.state = Phase.Red
  17. self.takeOver = self.addInPort("takeOver")
  18. def extTransition(self, inputs):
  19. if self.takeOver in inputs:
  20. if inputs[self.takeOver][0]:
  21. return Phase.TakeOver
  22. return Phase.Red
  23. return self.state
  24. def intTransition(self):
  25. if self.state == Phase.Green:
  26. return Phase.Orange
  27. elif self.state == Phase.Orange:
  28. return Phase.Red
  29. elif self.state == Phase.Red:
  30. return Phase.Green
  31. return self.state
  32. def timeAdvance(self):
  33. if self.state == Phase.Green:
  34. return self.phases[0]
  35. elif self.state == Phase.Orange:
  36. return self.phases[1]
  37. elif self.state == Phase.Red:
  38. return self.phases[2]
  39. return INFINITY # Police Take Over