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():