Compare commits
2 Commits
33cee85edb
...
7844c38e51
| Author | SHA1 | Date | |
|---|---|---|---|
|
7844c38e51
|
|||
|
6d22572a75
|
@@ -3,21 +3,21 @@
|
||||
import asyncio
|
||||
from websockets.server import serve
|
||||
|
||||
adminId = "1234"
|
||||
ADMIN_ID = "1234"
|
||||
|
||||
BOAT_STATE_INCTRL = 1
|
||||
BOAT_STATE_AVAILABLE = 0
|
||||
BOAT_STATE_LOCKED = -1
|
||||
BOAT_STATE_INCTRL = 2
|
||||
BOAT_STATE_AVAILABLE = 1
|
||||
BOAT_STATE_LOCKED = 0
|
||||
BOAT_STATE_TERMINATED = -1
|
||||
|
||||
boats = []
|
||||
clients = []
|
||||
Boats = []
|
||||
Clients = []
|
||||
|
||||
async def echo_boats(client):
|
||||
"""echo list of all not locked boats to client"""
|
||||
global boats
|
||||
data = "boats:"
|
||||
for boat in boats:
|
||||
if boat['state'] != BOAT_STATE_LOCKED:
|
||||
for boat in Boats:
|
||||
if boat['state'] != BOAT_STATE_LOCKED and boat['state'] != BOAT_STATE_TERMINATED:
|
||||
data += str(boat['id']) + ";" + str(boat['name']) + ";"
|
||||
if boat["state"] == BOAT_STATE_AVAILABLE:
|
||||
data += 'available:'
|
||||
@@ -27,20 +27,19 @@ async def echo_boats(client):
|
||||
|
||||
async def echo_locked_boats(client):
|
||||
"""echo list of all locked boats to client"""
|
||||
global boats
|
||||
if client['id'] == adminId:
|
||||
if client['id'] == ADMIN_ID:
|
||||
data = "lockedBoats:"
|
||||
for boat in boats:
|
||||
for boat in Boats:
|
||||
if boat['state'] == BOAT_STATE_LOCKED:
|
||||
data += str(boat['id']) + ";" + str(boat['name']) + ";locked:"
|
||||
await client['ws'].send(data + '\n')
|
||||
|
||||
async def echo_clients(client):
|
||||
"""echo list of all clients to client"""
|
||||
if client['id'] == adminId:
|
||||
if client['id'] == ADMIN_ID:
|
||||
data = "clients:"
|
||||
for client in clients:
|
||||
data += str(client['id']) + ";" + str(client['boat']) + ";" + str(client['state']) + ":"
|
||||
for clie in Clients:
|
||||
data += str(clie['id']) + ";" + str(clie['boat']) + ";" + str(clie['state']) + ":"
|
||||
await client['ws'].send(data + '\n')
|
||||
|
||||
async def take_controll(client, boat):
|
||||
@@ -48,8 +47,8 @@ async def take_controll(client, boat):
|
||||
if client['boat'] is not None:
|
||||
client['boat']["state"] = BOAT_STATE_AVAILABLE
|
||||
client["boat"] = None
|
||||
for b in boats:
|
||||
if b['id'] == boat:
|
||||
for b in Boats:
|
||||
if b['id'] == boat and b['state'] != BOAT_STATE_TERMINATED:
|
||||
if b['state'] == BOAT_STATE_AVAILABLE:
|
||||
b["state"] = BOAT_STATE_INCTRL
|
||||
print("take controll: " + str(client["id"]) + " -> " + b["name"])
|
||||
@@ -62,24 +61,24 @@ async def take_controll(client, boat):
|
||||
|
||||
async def free_boat(boat):
|
||||
"""make boat available for next client"""
|
||||
for client in clients:
|
||||
for client in Clients:
|
||||
if client["boat"]['id'] == boat:
|
||||
client["boat"] = None
|
||||
break
|
||||
for b in boats:
|
||||
if b['id'] == boat:
|
||||
for b in Boats:
|
||||
if b['id'] == boat and b['state'] != BOAT_STATE_TERMINATED:
|
||||
if boat['state'] == BOAT_STATE_INCTRL:
|
||||
boat["state"] = BOAT_STATE_AVAILABLE
|
||||
break
|
||||
|
||||
async def lock_boat(boat):
|
||||
"""lock a boat so client can't take controll over it"""
|
||||
for client in clients:
|
||||
for client in Clients:
|
||||
if client["boat"]['id'] == boat:
|
||||
client["boat"] = None
|
||||
break
|
||||
for b in boats:
|
||||
if b['id'] == int(boat):
|
||||
for b in Boats:
|
||||
if b['id'] == boat and b['state'] != BOAT_STATE_TERMINATED:
|
||||
boat["state"] = BOAT_STATE_LOCKED
|
||||
break
|
||||
|
||||
@@ -98,10 +97,10 @@ async def on_message(message, client):
|
||||
elif data[1] == "end":
|
||||
await take_controll(client, -1)
|
||||
elif data[1] == "free":
|
||||
if client["id"] == adminId:
|
||||
if client["id"] == ADMIN_ID:
|
||||
await free_boat(data[2])
|
||||
elif data[1] == "lock":
|
||||
if client["id"] == adminId:
|
||||
if client["id"] == ADMIN_ID:
|
||||
await lock_boat(data[2])
|
||||
elif data[1] == "locked":
|
||||
await echo_locked_boats(client)
|
||||
@@ -122,11 +121,11 @@ async def new_client(clientId, ws):
|
||||
"""handler for every new client connection"""
|
||||
client = { "id": clientId, "boat": None, "ws": ws, "state": "active" }
|
||||
print("new client connected: " + client['id'])
|
||||
for clie in clients:
|
||||
for clie in Clients:
|
||||
if clie['id'] == client['id']:
|
||||
clie['state'] = 'terminated'
|
||||
clients.append(client)
|
||||
if client['id'] == adminId:
|
||||
Clients.append(client)
|
||||
if client['id'] == ADMIN_ID:
|
||||
await echo_boats(client)
|
||||
await echo_locked_boats(client)
|
||||
await echo_clients(client)
|
||||
@@ -136,10 +135,11 @@ async def new_boat(boatId, name, ws):
|
||||
"""handler for every new boat connection"""
|
||||
boat = { "id": boatId, "name": name, "ws": ws, "state": BOAT_STATE_AVAILABLE }
|
||||
print("new boat connected: " + boatId)
|
||||
for bo in boats:
|
||||
for bo in Boats:
|
||||
if bo['id'] == boat['id']:
|
||||
bo['state'] = 'terminated'
|
||||
boats.append(boat)
|
||||
bo['state'] = BOAT_STATE_TERMINATED
|
||||
await bo['ws'].close()
|
||||
Boats.append(boat)
|
||||
return boat
|
||||
|
||||
async def run(ws, path):
|
||||
@@ -160,7 +160,7 @@ async def run(ws, path):
|
||||
client = await new_boat(message[0], message[2], ws)
|
||||
if client is not None:
|
||||
async for message in ws:
|
||||
print("boat" + client['id'] + " says " + message)
|
||||
print("boat" + client['id'] + " says '" + message + "'")
|
||||
break
|
||||
|
||||
async def main():
|
||||
|
||||
Submodule rx_esp32/lib/cli updated: ae59563e7d...8204cb0865
@@ -3,18 +3,10 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
// #define WIFI_SSID "UPC46273"
|
||||
// #define WIFI_AUTH WIFI_AUTH_WPA_PSK
|
||||
// #define WIFI_PASS "SPHZHKRY"
|
||||
// #define WIFI_SSID "Wifi Ding"
|
||||
// #define WIFI_AUTH WIFI_AUTH_WPA_WPA2_PSK
|
||||
// #define WIFI_PASS "Weet ik niet."
|
||||
#define WIFI_SSID "MBCBootjes"
|
||||
#define WIFI_AUTH WIFI_AUTH_WPA_WPA2_PSK
|
||||
#define WIFI_PASS "hetgrootedok"
|
||||
|
||||
// #define UDP_PORT 1234
|
||||
|
||||
#define BOAT_NAME "Test boat"
|
||||
static uint8_t BoatId = 1;
|
||||
|
||||
@@ -28,7 +20,8 @@ static uint8_t BoatId = 1;
|
||||
#define SERVOS_CH5
|
||||
#define SERVOS_CH6
|
||||
|
||||
#define WS_RX_BUFFER_LEN 512
|
||||
#define WS_RX_BUFFER_LEN 1024
|
||||
#define WS_TX_BUFFER_LEN 128
|
||||
#define WS_URL "ws://10.254.0.1:8080/"
|
||||
|
||||
#define LOGGER_BUFFER_SIZE 65536
|
||||
|
||||
@@ -21,6 +21,12 @@ void logger_printf(const char *fmt, ...)
|
||||
|
||||
puts(&Logger_buff[Logger_buff_wp]);
|
||||
Logger_buff_wp += len + 1;
|
||||
|
||||
if (Logger_buff_wp >= LOGGER_BUFFER_SIZE)
|
||||
{
|
||||
logger_clearBuffer();
|
||||
LOG_W("buffer cleard, becouse it was full");
|
||||
}
|
||||
}
|
||||
|
||||
void logger_printFullLog(CLI_t* cli)
|
||||
|
||||
@@ -134,12 +134,13 @@ void app_main() {
|
||||
|
||||
case STATE_WS_CONNECTING:
|
||||
ws_client = ws_connect(WS_URL);
|
||||
cli_ws_client = CLI_init((CLI_charOutFn)&ws_putchar, cmdList);
|
||||
MainState = STATE_WS_WAIT_CONNECTION;
|
||||
break;
|
||||
case STATE_WS_WAIT_CONNECTION:
|
||||
if (ws_client->connected)
|
||||
{
|
||||
cli_ws_client = CLI_init((CLI_charOutFn)&charOut_ws, cmdList);
|
||||
cli_ws_client.echo = false;
|
||||
MainState = STATE_IDEL;
|
||||
}
|
||||
break;
|
||||
@@ -149,14 +150,16 @@ void app_main() {
|
||||
case STATE_DRIVING:
|
||||
if (!ws_client->connected)
|
||||
{
|
||||
CLI_deinit(&cli_ws_client);
|
||||
MainState = STATE_WS_WAIT_CONNECTION;
|
||||
}
|
||||
|
||||
charIn = ws_getchar(ws_client);
|
||||
if (charIn != 255)
|
||||
// charIn = ws_getchar(ws_client);
|
||||
while ((charIn = ws_getchar(ws_client)) != 255)
|
||||
{
|
||||
CLI_charIn(&cli_ws_client, charIn);
|
||||
}
|
||||
ws_sendData(ws_client);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,20 +42,22 @@ static void ws_event_handler(void* handler_args, esp_event_base_t base, int32_t
|
||||
break;
|
||||
|
||||
case WEBSOCKET_EVENT_DATA:
|
||||
LOG_D("ws_event_handler: data recieved (opcode=%02x)", data->op_code);
|
||||
if (data->op_code == 0x2)
|
||||
// LOG_D("ws_event_handler: data recieved opcode %d", data->op_code);
|
||||
if (data->op_code == 0x02)
|
||||
{
|
||||
LOG_D("ws_event_handler: binary data recieved");
|
||||
// ESP_LOG_BUFFER_HEX("Received binary data", data->data_ptr, data->data_len);
|
||||
}
|
||||
}
|
||||
else if (data->op_code == 0x08 && data->data_len == 2)
|
||||
{
|
||||
LOG_W("ws_event_handler: recieved closed message (code: %d)", (((int16_t)(data->data_ptr[0]))<<8) + data->data_ptr[1]);
|
||||
// ESP_LOGW(TAG, "Received closed message with code=%d", 256 * data->data_ptr[0] + data->data_ptr[1]);
|
||||
}
|
||||
else
|
||||
}
|
||||
else if (data->op_code == 0x09 || data->op_code == 0x0A)
|
||||
{ // pong or pong packet
|
||||
// do nothing, handled by esp_websocket
|
||||
}
|
||||
else if (data->op_code == 0x01 && data->data_len > 0)
|
||||
{
|
||||
LOG_D("ws_event_handler: data recieved (opcode: %02x, size: %d): '%.*s'", data->op_code, data->data_len, data->data_len, (char*) data->data_ptr);
|
||||
// LOG_D("ws_event_handler: cmd recieved (len: %d): '%.*s'", data->data_len, data->data_len, (char*) data->data_ptr);
|
||||
uint16_t sizeLeft = WS_RX_BUFFER_LEN + client->rxBuffer_rp - client->rxBuffer_wp;
|
||||
if (sizeLeft > WS_RX_BUFFER_LEN)
|
||||
{
|
||||
@@ -74,12 +76,20 @@ static void ws_event_handler(void* handler_args, esp_event_base_t base, int32_t
|
||||
memcpy(&client->rxBuffer[0], data->data_ptr + sizeLeft, data->data_len - sizeLeft);
|
||||
}
|
||||
client->rxBuffer_wp += data->data_len;
|
||||
if (client->txBuffer_wp >= WS_RX_BUFFER_LEN)
|
||||
{
|
||||
client->txBuffer_wp -= WS_RX_BUFFER_LEN;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_E("ws_event_handler: no space left in buffer. data ignored (free space: %u)", data->data_len, sizeLeft + client->rxBuffer_rp);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_D("ws_event_handler: data recieved (opcode: 0x%02x, size: %d): '%.*s'", data->op_code, data->data_len, data->data_len, (char*) data->data_ptr);
|
||||
}
|
||||
break;
|
||||
case WEBSOCKET_EVENT_ERROR:
|
||||
if (data->error_handle.esp_ws_handshake_status_code != 0)
|
||||
@@ -94,6 +104,9 @@ static void ws_event_handler(void* handler_args, esp_event_base_t base, int32_t
|
||||
LOG_E("ws_event_handler: captured as transport's socket errno %d", data->error_handle.esp_transport_sock_errno);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
LOG_D("ws_event_handler: a unkown event happened: %d", event_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,6 +115,7 @@ ws_client_t ws_connect(char *url)
|
||||
ws_client_t client = malloc(sizeof(ws_client_data_t));
|
||||
client->rxBuffer_rp = 0;
|
||||
client->rxBuffer_wp = 0;
|
||||
client->txBuffer_wp = 0;
|
||||
memset(&(client->rxBuffer[0]), 0, WS_RX_BUFFER_LEN);
|
||||
|
||||
const esp_websocket_client_config_t ws_conf = {
|
||||
@@ -132,5 +146,27 @@ int ws_getchar(ws_client_t client)
|
||||
|
||||
void ws_putchar(ws_client_t client, char c)
|
||||
{
|
||||
esp_websocket_client_send_text(client->handle, &c, 1, 1000); //TODO: convert RTOS tick in ms
|
||||
if (client->txBuffer_wp == WS_TX_BUFFER_LEN)
|
||||
{
|
||||
ws_sendData(client);
|
||||
|
||||
if (client->txBuffer_wp == WS_TX_BUFFER_LEN)
|
||||
{
|
||||
LOG_E("ws_sendData: no space left in tx buffer. data ignored");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
client->txBuffer[client->txBuffer_wp] = c;
|
||||
client->txBuffer_wp++;
|
||||
}
|
||||
|
||||
void ws_sendData(ws_client_t client)
|
||||
{
|
||||
if ((client->txBuffer_wp > 0) && esp_websocket_client_is_connected(client->handle))
|
||||
{
|
||||
LOG_D("ws_sendData: (%d b) '%.*s'", client->txBuffer_wp, client->txBuffer_wp, (char *)&client->txBuffer[0]);
|
||||
esp_websocket_client_send_text(client->handle, (char *)&client->txBuffer[0], client->txBuffer_wp, 1000 * portTICK_PERIOD_MS);
|
||||
client->txBuffer_wp = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,11 +13,14 @@ typedef struct {
|
||||
unsigned char rxBuffer[WS_RX_BUFFER_LEN];
|
||||
uint16_t rxBuffer_wp;
|
||||
uint16_t rxBuffer_rp;
|
||||
unsigned char txBuffer[WS_TX_BUFFER_LEN];
|
||||
uint16_t txBuffer_wp;
|
||||
} ws_client_data_t;
|
||||
typedef ws_client_data_t* ws_client_t;
|
||||
|
||||
ws_client_t ws_connect(char *url);
|
||||
int ws_getchar(ws_client_t client);
|
||||
void ws_putchar(ws_client_t client, char c);
|
||||
void ws_sendData(ws_client_t client);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user