maybe working multiclient

This commit is contained in:
2024-12-01 15:57:06 +01:00
parent 3ab47977f8
commit 96f27d891c

View File

@@ -20,21 +20,19 @@ class TrackerData:
trackers = {} trackers = {}
ws_clients = set()
for i in range(NUM_TRACKERS): for i in range(NUM_TRACKERS):
trackers[i] = psn.Tracker(i, f"Tracker {i}") trackers[i] = psn.Tracker(i, f"Tracker {i}")
trackers[i].set_pos(psn.Float3(0, 0, 0)) 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 global trackers
tracker_data = [TrackerData(**data) for data in json.loads(tracker_data_json)] tracker = TrackerData(**json.loads(tracker_data_json))
for tracker in tracker_data:
trackers[tracker.id].set_pos(psn.Float3(tracker.x, tracker.y, 0)) trackers[tracker.id].set_pos(psn.Float3(tracker.x, tracker.y, 0))
def trackers_to_json(): 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) 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): def pic_to_scene_coords(x, y):
return x / 200, y / 200 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") encoder = psn.Encoder("Server 1")
packets = encoder.encode_data(trackers, get_elapsed_time_ms()) packets = encoder.encode_data(trackers, get_elapsed_time_ms())
@@ -67,15 +68,17 @@ async def handle_websocket(request):
await ws.prepare(request) await ws.prepare(request)
logging.debug("Websocket connection ready") logging.debug("Websocket connection ready")
ws.send_str(trackers_to_json()) ws_clients.add(ws)
await ws.send_str(trackers_to_json())
try: try:
async for msg in ws: async for msg in ws:
logging.debug(f"Websocket data: {msg}") logging.debug(f"Websocket data: {msg}")
if msg.type == web.WSMsgType.TEXT: if msg.type == web.WSMsgType.TEXT:
logging.debug("Received message: %s" % msg.data) # Each message is a single tracker object
update_trackers(msg.data) update_tracker(msg.data)
send_positions() await update_all_clients()
elif msg.type == web.WSMsgType.ERROR: elif msg.type == web.WSMsgType.ERROR:
logging.error("ws connection closed with exception %s" % ws.exception()) logging.error("ws connection closed with exception %s" % ws.exception())
@@ -87,6 +90,8 @@ async def handle_websocket(request):
logging.debug("Websocket connection closing") logging.debug("Websocket connection closing")
await ws.close() await ws.close()
ws_clients.remove(ws)
return ws return ws
@@ -99,8 +104,8 @@ async def handle_root(request):
def create_app(): def create_app():
app = web.Application() app = web.Application()
app.router.add_get("/", handle_root) app.router.add_get("/", handle_root)
app.router.add_static("/", "./static")
app.router.add_get("/ws", handle_websocket) app.router.add_get("/ws", handle_websocket)
app.router.add_static("/", "./static")
return app return app