From 1c856dca0e8859f865a0b9e1f06279835cf981e0 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Fri, 13 Mar 2026 18:58:28 +0200 Subject: [PATCH 1/5] fix MapView/main.py crash due to wrong check condition --- MapView/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MapView/main.py b/MapView/main.py index d97feb3..91d701a 100644 --- a/MapView/main.py +++ b/MapView/main.py @@ -69,7 +69,7 @@ class MapViewApp(App): """ lat, lon = point[0], point[1] - if not hasattr(self, 'car_marker'): + if not self.car_marker: self.car_marker = MapMarker(lat=lat, lon=lon, source='./images/car') self.mapview.add_marker(self.car_marker) else: From da9fe69d4e408f966413887dd173eca2a9b1a50e Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Fri, 13 Mar 2026 19:01:33 +0200 Subject: [PATCH 2/5] add initial server->client update with all current DB data --- store/main.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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: From ee509f72a4663e4e99809c2cd416391f17987614 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Fri, 13 Mar 2026 19:02:07 +0200 Subject: [PATCH 3/5] pull data in MapView/main.py from actual data source --- MapView/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MapView/main.py b/MapView/main.py index 91d701a..af4445f 100644 --- a/MapView/main.py +++ b/MapView/main.py @@ -23,7 +23,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): """ From 63aca15824dd955f99b8a5589e8b56b00b70d6e7 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Fri, 13 Mar 2026 20:41:16 +0200 Subject: [PATCH 4/5] add multiuser rendering support --- MapView/datasource.py | 1 + MapView/main.py | 41 ++++++++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 17 deletions(-) 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 af4445f..93d6537 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 = [] @@ -37,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]) + 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) @@ -56,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 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) @@ -129,9 +139,6 @@ class MapViewApp(App): lon=30.5234 ) - self.line_layer = LineMapLayer() - self.mapview.add_layer(self.line_layer) - return self.mapview From 8af68d6dd923ea11f5be576ff1c9264f559f7312 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Fri, 13 Mar 2026 20:47:09 +0200 Subject: [PATCH 5/5] hotfix: index overflow on user_id --- MapView/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MapView/main.py b/MapView/main.py index 93d6537..a93cfdb 100644 --- a/MapView/main.py +++ b/MapView/main.py @@ -49,7 +49,7 @@ class MapViewApp(App): # Оновлює лінію маршрута if user_id not in self.line_layers: - self.line_layers[user_id] = LineMapLayer(color = line_layer_colors[user_id]) + 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))