This commit is contained in:
2024-12-02 17:54:25 +01:00
parent fa74e1e15a
commit f3d94345f6
2 changed files with 20 additions and 15 deletions

View File

@@ -1,18 +1,20 @@
import psn
import time
import socket
import json
from aiohttp import web
import logging
import asyncio
import json
import logging
import socket
import time
from dataclasses import dataclass
import psn
from aiohttp import web
PSN_DEFAULT_UDP_PORT = 56565
PSN_DEFAULT_UDP_MCAST_ADDRESS = "236.10.10.10"
PORT = 8000
IP = "0.0.0.0"
NUM_TRACKERS = 3
# Internal state is a list of TrackerData objects
@dataclass
class TrackerData:
@@ -20,7 +22,6 @@ class TrackerData:
x: float
y: float
def to_tracker(self):
tracker = psn.Tracker(self.id, f"Tracker {self.id}")
x, y = pic_to_scene_coords(self.x, self.y)
@@ -52,9 +53,11 @@ def pic_to_scene_coords(x, y):
return x / 200, -y / 200
async def update_all_clients(app: web.Application):
for ws in app["ws_clients"]:
await ws.send_str(trackers_to_json(app))
async def update_all_clients(app: web.Application, ws: web.WebSocketResponse = None):
for ws_send in app["ws_clients"]:
if ws_send == ws:
continue
await ws_send.send_str(trackers_to_json(app))
async def handle_websocket(request):
@@ -72,7 +75,7 @@ async def handle_websocket(request):
if msg.type == web.WSMsgType.TEXT:
# Each message is a single tracker object
update_tracker(msg.data, request.app)
await update_all_clients(request.app)
await update_all_clients(request.app, ws)
elif msg.type == web.WSMsgType.ERROR:
logging.error("ws connection closed with exception %s" % ws.exception())
@@ -101,7 +104,9 @@ async def broadcast_psn_data(app):
trackers[tracker_data.id] = tracker_data.to_tracker()
packets = encoder.encode_data(trackers, get_elapsed_time_ms())
for packet in packets:
app["sock"].sendto(packet, (PSN_DEFAULT_UDP_MCAST_ADDRESS, PSN_DEFAULT_UDP_PORT))
app["sock"].sendto(
packet, (PSN_DEFAULT_UDP_MCAST_ADDRESS, PSN_DEFAULT_UDP_PORT)
)
await asyncio.sleep(0.033) # ~30fps

View File

@@ -23,7 +23,7 @@
</script>
<div class="relative">
<img src="/bg.png" alt="" bind:this={image} class="scale-50" />
<img src="/scene_drawing.png" alt="" bind:this={image} class="scale-50" />
<div
bind:this={parent}
class="absolute inset-0 border border-red-500"