From 27b3f114f00262cd0d261549785c3045c409a721 Mon Sep 17 00:00:00 2001 From: FReenen Date: Mon, 12 Aug 2024 16:14:44 +0200 Subject: [PATCH] gs: add log commands --- commander.html | 3 +-- ground-station.py | 50 +++++++++++++++++++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/commander.html b/commander.html index 2ed8cd7..3d16960 100644 --- a/commander.html +++ b/commander.html @@ -42,8 +42,7 @@ const boatjesEl = document.getElementById('boatjes'); const clientsEl = document.getElementById('clients'); - // const serverURL = 'ws://10.254.0.1:8080/'; - const serverURL = 'ws://localhost:8080/'; + const serverURL = 'ws://10.254.0.1:8080/'; var conn = new WebSocket(serverURL, ['mbcRcRf']); diff --git a/ground-station.py b/ground-station.py index e6a10f3..7233c91 100644 --- a/ground-station.py +++ b/ground-station.py @@ -3,6 +3,7 @@ import asyncio from websockets.server import serve from datetime import datetime +import json ADMIN_ID = "1234" BOAT_DATA_INTERVAL_MAX = 0.1 # seconds @@ -15,6 +16,10 @@ BOAT_STATE_TERMINATED = -1 Boats = [] Clients = [] +async def sendToBoat(boat, cmd): + client['boat']['log'].append({"t": datetime.timestamp(datetime.now()), "type": "tx", "msg": cmd}) + await client['boat']['ws'].send(cmd) + async def echo_boats(client): """echo list of all not locked boats to client""" data = "boats:" @@ -84,6 +89,24 @@ async def lock_boat(boat): boat["state"] = BOAT_STATE_LOCKED break +async def getlog(client, data): + """send boat log to client""" + for b in Boats: + if b['id'] == data[2]: + await client['ws'].send("log;" + b['id'] + ";" + json.dumps(b['log'])) + return + +async def sendcmd(data): + """send command to boat""" + for b in Boats: + if b['id'] == data[2]: + del data[0] + del data[1] + data = ";".join(data) + await sendToBoat(b, data) + return + + async def on_message(message, client): @@ -97,13 +120,11 @@ async def on_message(message, client): elif data[1] == "ctrl": await take_controll(client, data[2]) elif data[1] == "end": - await take_controll(client, -1) - elif data[1] == "free": - if client["id"] == ADMIN_ID: - await free_boat(data[2]) - elif data[1] == "lock": - if client["id"] == ADMIN_ID: - await lock_boat(data[2]) + await take_controll(client, "noBoat") + elif data[1] == "free" and client["id"] == ADMIN_ID: + await free_boat(data[2]) + elif data[1] == "lock" and client["id"] == ADMIN_ID: + await lock_boat(data[2]) elif data[1] == "locked": await echo_locked_boats(client) elif data[1] == "kick": @@ -114,9 +135,13 @@ async def on_message(message, client): if client['boat'] is None: print("WARN: controll cmd (" + client['id'] + ") to None: " + data[2]) elif client['boat']['lastMsg'] + BOAT_DATA_INTERVAL_MAX < datetime.timestamp(datetime.now()): - print("INFO: controll cmd (" + client['id'] + ") to " + client['boat']['name'] + ": " + data[2]) - await client['boat']['ws'].send("d:" + data[2] + "\n") + # print("INFO: controll cmd (" + client['id'] + ") to " + client['boat']['name'] + ": " + data[2]) + sendToBoat(client['boat'], "d:" + data[2] + "\n") client['boat']['lastMsg'] = datetime.timestamp(datetime.now()) + elif data[1] == "getlog" and client['id'] == ADMIN_ID: + await getlog(client, data) + elif data[1] == "sendcmd" and client['id'] == ADMIN_ID: + await sendcmd(data) else: print("WARN: invalid command (" + client['id'] + "): '" + data[1] + "'") @@ -136,7 +161,7 @@ async def new_client(clientId, ws): async def new_boat(boatId, name, ws): """handler for every new boat connection""" - boat = { "id": boatId, "name": name, "ws": ws, "state": BOAT_STATE_AVAILABLE, "lastMsg": 0 } + boat = { "id": boatId, "name": name, "ws": ws, "state": BOAT_STATE_AVAILABLE, "lastMsg": 0, "log": [] } print("new boat connected: " + boatId) for bo in Boats: if bo['id'] == boat['id']: @@ -174,6 +199,11 @@ async def run(ws, path): if len(message) == 0: continue print("boat" + client['id'] + " says '" + message + "'") + client['log'].append({ + "t": datetime.timestamp(datetime.now()), + "type": "rx", + "msg": message + }) break async def main():