diff --git a/MapView/datasource.py b/MapView/datasource.py index 22c4703..752e0b0 100644 --- a/MapView/datasource.py +++ b/MapView/datasource.py @@ -75,6 +75,7 @@ class Datasource: processed_agent_data.latitude, processed_agent_data.longitude, processed_agent_data.road_state, + processed_agent_data.user_id ) for processed_agent_data in processed_agent_data_list ] diff --git a/MapView/main.py b/MapView/main.py index d97feb3..a93cfdb 100644 --- a/MapView/main.py +++ b/MapView/main.py @@ -5,6 +5,14 @@ from kivy.clock import Clock from lineMapLayer import LineMapLayer from datasource import Datasource +line_layer_colors = [ + [1, 0, 0, 1], + [1, 0.5, 0, 1], + [0, 1, 0, 1], + [0, 1, 1, 1], + [0, 0, 1, 1], + [1, 0, 1, 1], +] class MapViewApp(App): def __init__(self, **kwargs): @@ -12,8 +20,8 @@ class MapViewApp(App): self.mapview = None self.datasource = Datasource(user_id=1) - self.line_layer = None - self.car_marker = None + self.line_layers = dict() + self.car_markers = dict() # додати необхідні змінні self.bump_markers = [] @@ -23,7 +31,8 @@ class MapViewApp(App): """ Встановлює необхідні маркери, викликає функцію для оновлення мапи """ - Clock.schedule_once(lambda dt: self.set_bump_marker((50.4501, 30.5234)), 0) + self.update() + Clock.schedule_interval(self.update, 5) def update(self, *args): """ @@ -36,13 +45,17 @@ class MapViewApp(App): for point in new_points: - lat, lon, road_state = point + lat, lon, road_state, user_id = point # Оновлює лінію маршрута - self.line_layer.add_point((lat, lon)) + if user_id not in self.line_layers: + self.line_layers[user_id] = LineMapLayer(color = line_layer_colors[user_id % len(line_layer_colors)]) + self.mapview.add_layer(self.line_layers[user_id]) + + self.line_layers[user_id].add_point((lat, lon)) # Оновлює маркер маниши - self.update_car_marker((lat, lon)) + self.update_car_marker(lat, lon, user_id) # Перевіряємо стан дороги self.check_road_quality(point) @@ -55,26 +68,24 @@ class MapViewApp(App): if len(point) < 3: return - lat, lon, road_state = point + lat, lon, road_state, user_id = point if road_state == "pothole": self.set_pothole_marker((lat, lon)) elif road_state == "bump": self.set_bump_marker((lat, lon)) - def update_car_marker(self, point): + def update_car_marker(self, lat, lon, user_id): """ Оновлює відображення маркера машини на мапі :param point: GPS координати """ - lat, lon = point[0], point[1] - - if not hasattr(self, 'car_marker'): - self.car_marker = MapMarker(lat=lat, lon=lon, source='./images/car') - self.mapview.add_marker(self.car_marker) + if user_id not in self.car_markers: + self.car_markers[user_id] = MapMarker(lat=lat, lon=lon, source='./images/car.png') + self.mapview.add_marker(self.car_markers[user_id]) else: - self.car_marker.lat = lat - self.car_marker.lon = lon + self.car_markers[user_id].lat = lat + self.car_markers[user_id].lon = lon self.mapview.center_on(lat, lon) @@ -128,9 +139,6 @@ class MapViewApp(App): lon=30.5234 ) - self.line_layer = LineMapLayer() - self.mapview.add_layer(self.line_layer) - return self.mapview diff --git a/store/main.py b/store/main.py index a5bd8e4..00d0f4e 100644 --- a/store/main.py +++ b/store/main.py @@ -40,10 +40,24 @@ subscriptions: Dict[int, Set[WebSocket]] = {} @app.websocket("/ws/{user_id}") async def websocket_endpoint(websocket: WebSocket, user_id: int): await websocket.accept() + if user_id not in subscriptions: subscriptions[user_id] = set() + subscriptions[user_id].add(websocket) + try: + # send already available data + r = processed_agent_data.select() + stored_data = SessionLocal().execute(r).fetchall() + + jsonable_data = [{c.name: getattr(i, c.name) for c in processed_agent_data.columns} for i in stored_data] + for i in jsonable_data: + i['timestamp'] = i['timestamp'].strftime("%Y-%m-%dT%H:%M:%SZ") + + await websocket.send_json(json.dumps(jsonable_data)) + + # receive forever while True: await websocket.receive_text() except WebSocketDisconnect: