traffic light sends orchestrator its status on change;
This commit is contained in:
@@ -1,21 +1,21 @@
|
||||
import pickle
|
||||
import threading
|
||||
import time
|
||||
from datetime import datetime
|
||||
from enum import Enum
|
||||
|
||||
from circuitbreaker import circuit
|
||||
|
||||
# Default switching time in seconds
|
||||
from shared import TrafficLightColor
|
||||
from shared.TrafficLightColor import Color
|
||||
from shared.message_broker_wrapper import MBWrapper
|
||||
|
||||
SWITCHING_TIME = 120
|
||||
# Scale speed of switching by factor x
|
||||
SCALING = 100
|
||||
|
||||
|
||||
class TrafficLight:
|
||||
class Color(Enum):
|
||||
GREEN = 0
|
||||
RED = 1
|
||||
|
||||
# id of traffic light
|
||||
tlid: str
|
||||
# time between switches in seconds
|
||||
@@ -31,6 +31,9 @@ class TrafficLight:
|
||||
# stores runner thread
|
||||
_t: threading.Thread
|
||||
|
||||
# outgoing traffic light state MBWrapper
|
||||
_tl_mb: MBWrapper
|
||||
|
||||
def __init__(self,
|
||||
tlid: str,
|
||||
switching_time: int = SWITCHING_TIME,
|
||||
@@ -39,16 +42,19 @@ class TrafficLight:
|
||||
self.switching_time = switching_time
|
||||
self._starting_color = starting_color
|
||||
|
||||
self._tl_mb = MBWrapper(exchange_name='traffic_light_state_{}'.format(self.tlid))
|
||||
self._tl_mb.setup_sender()
|
||||
|
||||
def start(self):
|
||||
self.running = True
|
||||
|
||||
def switcher():
|
||||
num_colors = len(self.Color)
|
||||
num_colors = len(TrafficLightColor.Color)
|
||||
# set current color to the one before starting color, because switch immediately happens in loop
|
||||
# therefore it sleeps on the end of the loop and first status is immediately sent to msg broker
|
||||
self.current_color = TrafficLight.Color((self._starting_color.value - 1) % num_colors)
|
||||
self.current_color = Color((self._starting_color.value - 1) % num_colors)
|
||||
while self.running:
|
||||
self.current_color = TrafficLight.Color((self.current_color.value + 1) % num_colors)
|
||||
self.current_color = Color((self.current_color.value + 1) % num_colors)
|
||||
self.last_switch = datetime.now()
|
||||
self.send_status_update()
|
||||
time.sleep(self.switching_time / SCALING)
|
||||
@@ -61,10 +67,24 @@ class TrafficLight:
|
||||
|
||||
@circuit(failure_threshold=10, expected_exception=ConnectionError)
|
||||
def send_status_update(self):
|
||||
# TODO inform the message broker about the current status
|
||||
print(self.tlid, self.current_color, self.last_switch)
|
||||
self._tl_mb.send(pickle.dumps({
|
||||
'tlid': self.tlid,
|
||||
'color': self.current_color,
|
||||
'last_switch': self.last_switch
|
||||
}))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
tl1 = TrafficLight(tlid='tl1')
|
||||
# TODO fetch and use data from Entity Ident
|
||||
|
||||
tl1 = TrafficLight(tlid='traffic-light-1', switching_time=120)
|
||||
tl1.start()
|
||||
|
||||
time.sleep(1)
|
||||
tl2 = TrafficLight(tlid='traffic-light-2', switching_time=240)
|
||||
tl2.start()
|
||||
|
||||
time.sleep(1)
|
||||
tl3 = TrafficLight(tlid='traffic-light-3', switching_time=360)
|
||||
tl3.start()
|
||||
|
||||
@@ -7,9 +7,9 @@ from typing import Union
|
||||
import geopy
|
||||
import geopy.distance
|
||||
from circuitbreaker import circuit
|
||||
from wrappers.daf import DAF
|
||||
from shared.daf import DAF
|
||||
|
||||
from wrappers.message_broker_wrapper import MBWrapper
|
||||
from shared.message_broker_wrapper import MBWrapper
|
||||
|
||||
# Lat, Long
|
||||
STARTING_POINT = geopy.Point(48.853, 2.349)
|
||||
@@ -212,10 +212,15 @@ class Vehicle:
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# TODO fetch and use data from Entity Ident
|
||||
|
||||
v1 = Vehicle(vin='SB164ABN1PE082000')
|
||||
v1.start_driving()
|
||||
|
||||
time.sleep(1)
|
||||
v2 = Vehicle(vin='SB999ABN1PE082111')
|
||||
v2.start_driving()
|
||||
# stop manually
|
||||
|
||||
time.sleep(0.5)
|
||||
v3 = Vehicle(vin='SB555ABN1PE082555')
|
||||
v3.start_driving()
|
||||
|
||||
Reference in New Issue
Block a user