diff --git a/backend/psn_server.py b/backend/psn_server.py index a492e99..3e91006 100644 --- a/backend/psn_server.py +++ b/backend/psn_server.py @@ -20,21 +20,19 @@ class TrackerData: trackers = {} - +ws_clients = set() for i in range(NUM_TRACKERS): trackers[i] = psn.Tracker(i, f"Tracker {i}") trackers[i].set_pos(psn.Float3(0, 0, 0)) -def update_trackers(tracker_data_json: str): +def update_tracker(tracker_data_json: str): global trackers - tracker_data = [TrackerData(**data) for data in json.loads(tracker_data_json)] - - for tracker in tracker_data: - trackers[tracker.id].set_pos(psn.Float3(tracker.x, tracker.y, 0)) + tracker = TrackerData(**json.loads(tracker_data_json)) + trackers[tracker.id].set_pos(psn.Float3(tracker.x, tracker.y, 0)) def trackers_to_json(): - return json.dumps([{"id": tracker.id, "x": tracker.pos.x, "y": tracker.pos.y} for tracker in trackers.values()]) + return json.dumps([{"id": tracker.get_id(), "x": tracker.get_pos().x, "y": tracker.get_pos().y} for tracker in trackers.values()]) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) @@ -52,8 +50,11 @@ def get_elapsed_time_ms(): def pic_to_scene_coords(x, y): return x / 200, y / 200 +async def update_all_clients(): + for ws in ws_clients: + await ws.send_str(trackers_to_json()) -def send_positions(): +def send_psn_positions(): encoder = psn.Encoder("Server 1") packets = encoder.encode_data(trackers, get_elapsed_time_ms()) @@ -67,15 +68,17 @@ async def handle_websocket(request): await ws.prepare(request) logging.debug("Websocket connection ready") - ws.send_str(trackers_to_json()) + ws_clients.add(ws) + + await ws.send_str(trackers_to_json()) try: async for msg in ws: logging.debug(f"Websocket data: {msg}") if msg.type == web.WSMsgType.TEXT: - logging.debug("Received message: %s" % msg.data) - update_trackers(msg.data) - send_positions() + # Each message is a single tracker object + update_tracker(msg.data) + await update_all_clients() elif msg.type == web.WSMsgType.ERROR: logging.error("ws connection closed with exception %s" % ws.exception()) @@ -87,6 +90,8 @@ async def handle_websocket(request): logging.debug("Websocket connection closing") await ws.close() + ws_clients.remove(ws) + return ws @@ -99,8 +104,8 @@ async def handle_root(request): def create_app(): app = web.Application() app.router.add_get("/", handle_root) - app.router.add_static("/", "./static") app.router.add_get("/ws", handle_websocket) + app.router.add_static("/", "./static") return app