Compare commits

...

2 Commits

Author SHA1 Message Date
c3737936c4
update 2024-08-12 21:22:06 +02:00
3adec932bf
gs: fix client echo 2024-08-12 20:03:49 +02:00
3 changed files with 101 additions and 50 deletions

View File

@ -73,9 +73,13 @@
const boatjesEl = document.getElementById('boatjes');
const clientsEl = document.getElementById('clients');
const kickIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-slash-circle\" viewBox=\"0 0 16 16\"><path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16\"/><path d=\"M11.354 4.646a.5.5 0 0 0-.708 0l-6 6a.5.5 0 0 0 .708.708l6-6a.5.5 0 0 0 0-.708\"/></svg>";
const kickIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-hand-thumbs-down\" viewBox=\"0 0 16 16\"><path d=\"M8.864 15.674c-.956.24-1.843-.484-1.908-1.42-.072-1.05-.23-2.015-.428-2.59-.125-.36-.479-1.012-1.04-1.638-.557-.624-1.282-1.179-2.131-1.41C2.685 8.432 2 7.85 2 7V3c0-.845.682-1.464 1.448-1.546 1.07-.113 1.564-.415 2.068-.723l.048-.029c.272-.166.578-.349.97-.484C6.931.08 7.395 0 8 0h3.5c.937 0 1.599.478 1.934 1.064.164.287.254.607.254.913 0 .152-.023.312-.077.464.201.262.38.577.488.9.11.33.172.762.004 1.15.069.13.12.268.159.403.077.27.113.567.113.856s-.036.586-.113.856c-.035.12-.08.244-.138.363.394.571.418 1.2.234 1.733-.206.592-.682 1.1-1.2 1.272-.847.283-1.803.276-2.516.211a10 10 0 0 1-.443-.05 9.36 9.36 0 0 1-.062 4.51c-.138.508-.55.848-1.012.964zM11.5 1H8c-.51 0-.863.068-1.14.163-.281.097-.506.229-.776.393l-.04.025c-.555.338-1.198.73-2.49.868-.333.035-.554.29-.554.55V7c0 .255.226.543.62.65 1.095.3 1.977.997 2.614 1.709.635.71 1.064 1.475 1.238 1.977.243.7.407 1.768.482 2.85.025.362.36.595.667.518l.262-.065c.16-.04.258-.144.288-.255a8.34 8.34 0 0 0-.145-4.726.5.5 0 0 1 .595-.643h.003l.014.004.058.013a9 9 0 0 0 1.036.157c.663.06 1.457.054 2.11-.163.175-.059.45-.301.57-.651.107-.308.087-.67-.266-1.021L12.793 7l.353-.354c.043-.042.105-.14.154-.315.048-.167.075-.37.075-.581s-.027-.414-.075-.581c-.05-.174-.111-.273-.154-.315l-.353-.354.353-.354c.047-.047.109-.176.005-.488a2.2 2.2 0 0 0-.505-.804l-.353-.354.353-.354c.006-.005.041-.05.041-.17a.9.9 0 0 0-.121-.415C12.4 1.272 12.063 1 11.5 1\"/></svg>"
const banIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-slash-circle\" viewBox=\"0 0 16 16\"><path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16\"/><path d=\"M11.354 4.646a.5.5 0 0 0-.708 0l-6 6a.5.5 0 0 0 .708.708l6-6a.5.5 0 0 0 0-.708\"/></svg>";
const openIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-key\" viewBox=\"0 0 16 16\"><path d=\"M0 8a4 4 0 0 1 7.465-2H14a.5.5 0 0 1 .354.146l1.5 1.5a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0L13 9.207l-.646.647a.5.5 0 0 1-.708 0L11 9.207l-.646.647a.5.5 0 0 1-.708 0L9 9.207l-.646.647A.5.5 0 0 1 8 10h-.535A4 4 0 0 1 0 8m4-3a3 3 0 1 0 2.712 4.285A.5.5 0 0 1 7.163 9h.63l.853-.854a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.793-.793-1-1h-6.63a.5.5 0 0 1-.451-.285A3 3 0 0 0 4 5\"/><path d=\"M4 8a1 1 0 1 1-2 0 1 1 0 0 1 2 0\"/></svg>";
const lockIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-lock\" viewBox=\"0 0 16 16\"><path d=\"M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2m3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2M5 8h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1\"/></svg>";
const freeIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-calendar-event\" viewBox=\"0 0 16 16\"><path d=\"M11 6.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5z\"/><path d=\"M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h1V.5a.5.5 0 0 1 .5-.5M1 4v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4z\"/></svg>"
const logIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-list-check\" viewBox=\"0 0 16 16\"> <path fill-rule=\"evenodd\" d=\"M5 11.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5m0-4a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5m0-4a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5M3.854 2.146a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0l-.5-.5a.5.5 0 1 1 .708-.708L2 3.293l1.146-1.147a.5.5 0 0 1 .708 0m0 4a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0l-.5-.5a.5.5 0 1 1 .708-.708L2 7.293l1.146-1.147a.5.5 0 0 1 .708 0m0 4a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0l-.5-.5a.5.5 0 0 1 .708-.708l.146.147 1.146-1.147a.5.5 0 0 1 .708 0\"/></svg>"
const serverURL = 'ws://10.254.0.1:8080/';
@ -168,6 +172,11 @@
conn.send(passEl.value + ";lock;" + boat['id']);
}
fucntion getBoatLog(e)
{
alert("loggy log");
}
function reqBoats()
{
conn.send(passEl.value + ";boats");
@ -220,17 +229,19 @@
boatCells[2].innerText = boat[2];
let lockBtn = document.createElement("div");
lockBtn.className = "btn";
if (boatRow.dataset['state'] == "locked")
{
lockBtn.innerHTML = openIcon;
lockBtn.addEventListener('click', freeBoat);
}
else
{
lockBtn.innerHTML = lockIcon;
lockBtn.addEventListener('click', lockBoat);
}
boatCells[3].append(lockBtn);
let freeBtn = document.createElement("div");
freeBtn.className = "btn";
freeBtn.innerHTML = freeIcon;
freeBtn.addEventListener('click', freeBoat);
boatCells[3].append(freeBtn);
let logBtn = document.createElement("div");
logBtn.className = "btn";
logBtn.innerHTML = logIcon;
logBtn.addEventListener('click', getBoatLog);
boatCells[3].append(logBtn);
for (cell in boatCells)
{
boatRow.append(boatCells[cell]);

View File

@ -23,6 +23,7 @@ async def sendToBoat(boat, cmd):
async def echo_boats(client):
"""echo list of all not locked boats to client"""
data = "boats:"
if client['state'] != "kicked":
for boat in Boats:
if boat['state'] != BOAT_STATE_LOCKED and boat['state'] != BOAT_STATE_TERMINATED:
data += str(boat['id']) + ";" + str(boat['name']) + ";"
@ -46,10 +47,13 @@ async def echo_clients(client):
if client['id'] == ADMIN_ID:
data = "clients:"
for clie in Clients:
clientId = clie['id']
if (clie['id'] == ADMIN_ID):
data += "admin;" + str(clie['boat']) + ";" + str(clie['state']) + ":"
else:
data += str(clie['id']) + ";" + str(clie['boat']) + ";" + str(clie['state']) + ":"
clientId = "admin"
boatId = "----"
if (clie['boat'] is not None):
boatId = clie['boat']['id']
data += clientId + ";" + boatId + ";" + str(clie['state']) + ":"
await client['ws'].send(data + '\n')
async def take_controll(client, boat):
@ -108,6 +112,17 @@ async def sendcmd(data):
await sendToBoat(b, data)
return
async def kick_client(clientId):
"""kick a client"""
for client in Clients:
if client['id'] == client and client['state'] == "terminated":
if client['state'] is not None:
client['boat']['state'] = BOAT_STATE_AVAILABLE
client['boat'] = None
client['state'] = "kicked"
await client['ws'].send("FAIL")
return
@ -127,10 +142,10 @@ async def on_message(message, client):
await free_boat(data[2])
elif data[1] == "lock" and client["id"] == ADMIN_ID:
await lock_boat(data[2])
elif data[1] == "locked":
elif data[1] == "locked" and client["id"] == ADMIN_ID:
await echo_locked_boats(client)
elif data[1] == "kick":
print("kick")
elif data[1] == "kick" and client["id"] == ADMIN_ID:
await kick_client(data[2])
elif data[1] == "clients":
await echo_clients(client)
elif data[1] == "d":
@ -158,6 +173,8 @@ async def new_client(clientId, ws):
print("new client connected: " + client['id'])
for clie in Clients:
if clie['id'] == client['id']:
if client['state'] == "kicked":
client['state'] = "kicked"
clie['state'] = 'terminated'
Clients.append(client)
return client

View File

@ -29,26 +29,29 @@
var boatListEl = document.getElementById('boats');
var stickEl = document.getElementById('canvas');
var connection = new WebSocket('ws://' + "10.254.0.1" + ':8080/', ['mbcRcRf']);
var connection = false;
var refresh_timer = false;
var state = "connecting";
connection.onopen = function ()
function conn_onopen()
{
connection.send(clientId + ';4675;' + Math.floor(new Date().getTime()/1000.0).toString());
setTimeout(() => { connection.send(clientId + ';boats'); }, 100);
state = "connected";
};
connection.onerror = function (error)
function conn_onerror(error)
{
console.log('WebSocket Error ', error);
alert('WebSocket Error ', error);
//connection.onmessage({ data: "boats:50;test 1;available:164;tosti;available" })
};
connection.onmessage = function (e)
function conn_onmessage(e)
{
let data = e.data.split(':');
if (data[0] == "boats")
{
if (state == 'connected')
{
console.log("boats: ", data);
boatListEl.innerHTML = "";
@ -74,6 +77,17 @@
boatListEl.appendChild(el);
}
}
if (refresh_timer)
{
clearTimeout(refresh_timer);
}
refresh_timer = setTimeout(()=>{connection.send(clientId + ';boats')}, 1000)
}
}
else if (data[0] == "FAIL")
{
console.error("ground station send FAIL");
connection.send(clientId + ';boats');
}
else
{
@ -81,8 +95,17 @@
}
};
function connect()
{
connection = new WebSocket('ws://10.254.0.1:8080/', ['mbcRcRf']);
connection.onopen = conn_onopen;
connection.onerror = conn_onerror;
connection.onmessage = conn_onmessage;
}
function selectBoat(e)
{
clearTimeout(refresh_timer);
connection.send(clientId + ';ctrl;' + e.target.id.split('boat')[1]);
console.log('ctrl:', e.target.id.split('boat')[1]);
stickEl.style.display = 'block';