First rough implementation of websockets
This commit is contained in:
parent
3c163a8f15
commit
8c515fa156
8 changed files with 114 additions and 49 deletions
1
modules/control/Firmware/.gitignore
vendored
1
modules/control/Firmware/.gitignore
vendored
|
@ -3,3 +3,4 @@
|
||||||
.vscode/c_cpp_properties.json
|
.vscode/c_cpp_properties.json
|
||||||
.vscode/launch.json
|
.vscode/launch.json
|
||||||
.vscode/ipch
|
.vscode/ipch
|
||||||
|
include/Credentials.h
|
|
@ -0,0 +1,2 @@
|
||||||
|
#define WIFI_SSID "ssid"
|
||||||
|
#define WIFI_PW "password"
|
|
@ -1,39 +0,0 @@
|
||||||
|
|
||||||
This directory is intended for project header files.
|
|
||||||
|
|
||||||
A header file is a file containing C declarations and macro definitions
|
|
||||||
to be shared between several project source files. You request the use of a
|
|
||||||
header file in your project source file (C, C++, etc) located in `src` folder
|
|
||||||
by including it, with the C preprocessing directive `#include'.
|
|
||||||
|
|
||||||
```src/main.c
|
|
||||||
|
|
||||||
#include "header.h"
|
|
||||||
|
|
||||||
int main (void)
|
|
||||||
{
|
|
||||||
...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Including a header file produces the same results as copying the header file
|
|
||||||
into each source file that needs it. Such copying would be time-consuming
|
|
||||||
and error-prone. With a header file, the related declarations appear
|
|
||||||
in only one place. If they need to be changed, they can be changed in one
|
|
||||||
place, and programs that include the header file will automatically use the
|
|
||||||
new version when next recompiled. The header file eliminates the labor of
|
|
||||||
finding and changing all the copies as well as the risk that a failure to
|
|
||||||
find one copy will result in inconsistencies within a program.
|
|
||||||
|
|
||||||
In C, the usual convention is to give header files names that end with `.h'.
|
|
||||||
It is most portable to use only letters, digits, dashes, and underscores in
|
|
||||||
header file names, and at most one dot.
|
|
||||||
|
|
||||||
Read more about using header files in official GCC documentation:
|
|
||||||
|
|
||||||
* Include Syntax
|
|
||||||
* Include Operation
|
|
||||||
* Once-Only Headers
|
|
||||||
* Computed Includes
|
|
||||||
|
|
||||||
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
#include <WebsocketCommunicator.h>
|
||||||
|
#include <ESPAsyncWebServer.h>
|
||||||
|
|
||||||
|
WebsocketCommunicator::WebsocketCommunicator(AsyncWebSocket &socket, AsyncWebServer &server, __SIZE_TYPE__ bufferSize) : Communicator(bufferSize), socket(socket), server(server)
|
||||||
|
{
|
||||||
|
AwsEventHandler onEvent = [this](AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type,
|
||||||
|
void *arg, uint8_t *data, size_t len)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case WS_EVT_CONNECT:
|
||||||
|
Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str());
|
||||||
|
break;
|
||||||
|
case WS_EVT_DISCONNECT:
|
||||||
|
Serial.printf("WebSocket client #%u disconnected\n", client->id());
|
||||||
|
break;
|
||||||
|
case WS_EVT_DATA:
|
||||||
|
handleMessage(arg, data, len);
|
||||||
|
break;
|
||||||
|
case WS_EVT_PONG:
|
||||||
|
case WS_EVT_ERROR:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
socket.onEvent(onEvent);
|
||||||
|
server.addHandler(&socket);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebsocketCommunicator::sendMessage(int *values, __SIZE_TYPE__ numberOfValues)
|
||||||
|
{
|
||||||
|
char message[calculateMessageOutSize(numberOfValues)];
|
||||||
|
parseIDs(values, numberOfValues, message);
|
||||||
|
sendMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebsocketCommunicator::sendMessage(const char message[])
|
||||||
|
{
|
||||||
|
socket.textAll(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *WebsocketCommunicator::receiveMessage()
|
||||||
|
{
|
||||||
|
return getBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebsocketCommunicator::handleMessage(void *arg, uint8_t *data, size_t len)
|
||||||
|
{
|
||||||
|
Serial.println("data");
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
#include <Communicator.h>
|
||||||
|
#include <ESPAsyncWebServer.h>
|
||||||
|
|
||||||
|
class WebsocketCommunicator : public Communicator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
void handleMessage(void *arg, uint8_t *data, size_t len);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AsyncWebSocket &socket;
|
||||||
|
AsyncWebServer &server;
|
||||||
|
|
||||||
|
public:
|
||||||
|
WebsocketCommunicator(AsyncWebSocket &socket, AsyncWebServer &server, __SIZE_TYPE__ bufferSize);
|
||||||
|
void sendMessage(int *values, __SIZE_TYPE__ numberOfValues) override;
|
||||||
|
void sendMessage(const char message[]) override;
|
||||||
|
char *receiveMessage() override;
|
||||||
|
};
|
|
@ -17,4 +17,7 @@ board = az-delivery-devkit-v4
|
||||||
framework = arduino
|
framework = arduino
|
||||||
upload_port = COM8
|
upload_port = COM8
|
||||||
monitor_port = COM8
|
monitor_port = COM8
|
||||||
lib_deps = erropix/ESP32 AnalogWrite@^0.2
|
lib_deps =
|
||||||
|
erropix/ESP32 AnalogWrite@^0.2
|
||||||
|
ESP Async WebServer
|
||||||
|
board_build.partitions = huge_app.csv
|
||||||
|
|
|
@ -2,29 +2,59 @@
|
||||||
#include <LightController.h>
|
#include <LightController.h>
|
||||||
#include <SerialCommunicator.h>
|
#include <SerialCommunicator.h>
|
||||||
#include <BluetoothCommunicator.h>
|
#include <BluetoothCommunicator.h>
|
||||||
#include <PinMap.h>
|
#include <WebsocketCommunicator.h>
|
||||||
|
#include <PinMap/PinMap.h>
|
||||||
|
#include <esp_spi_flash.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <ESPAsyncWebServer.h>
|
||||||
|
#include <Credentials/Credentials.h>
|
||||||
|
|
||||||
StreamCommunicator *computer;
|
|
||||||
StreamCommunicator *phone;
|
|
||||||
LightController *light;
|
|
||||||
const int STEPS = 5;
|
const int STEPS = 5;
|
||||||
|
|
||||||
BluetoothSerial bt;
|
BluetoothSerial bt;
|
||||||
|
AsyncWebServer server(80);
|
||||||
|
AsyncWebSocket ws("/ws");
|
||||||
|
|
||||||
|
Communicator *computer;
|
||||||
|
Communicator *phone;
|
||||||
|
Communicator *websocket;
|
||||||
|
LightController *light;
|
||||||
|
|
||||||
|
void TaskBlink(void *pvParameters);
|
||||||
|
void TaskAnalogRead(void *pvParameters);
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
|
|
||||||
int bjtCount = 4;
|
int bjtCount = 4;
|
||||||
const int bjtPin[bjtCount] = {SIG1A, SIG1B, SIG2A, SIG2B};
|
const int bjtPin[bjtCount] = {SIG1A, SIG1B, SIG2A, SIG2B};
|
||||||
computer = new SerialCommunicator(Serial, 9600, 5, 50);
|
computer = new SerialCommunicator(Serial, 9600, 5, 50);
|
||||||
phone = new BluetoothCommunicator(bt,5,50);
|
phone = new BluetoothCommunicator(bt, 5, 50);
|
||||||
light = new LightController(bjtPin, bjtCount);
|
light = new LightController(bjtPin, bjtCount);
|
||||||
|
|
||||||
|
WiFi.begin(WIFI_SSID, WIFI_PW);
|
||||||
|
Serial.println("Connecting to WiFi");
|
||||||
|
while (WiFi.status() != WL_CONNECTED)
|
||||||
|
{
|
||||||
|
Serial.print(".");
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
Serial.println(WiFi.localIP());
|
||||||
|
|
||||||
|
websocket = new WebsocketCommunicator(ws, server, 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
light->updateState(computer->receiveMessage(), STEPS);
|
light->updateState(computer->receiveMessage(), STEPS);
|
||||||
light->updateState(phone->receiveMessage(), STEPS);
|
light->updateState(phone->receiveMessage(), STEPS);
|
||||||
computer->sendMessage(light->getBjtState(), light->getBjtCount());
|
websocket->sendMessage(light->getBjtState(), light->getBjtCount());
|
||||||
computer->clearBuffer();
|
websocket->clearBuffer();
|
||||||
phone->sendMessage(light->getBjtState(), light->getBjtCount());
|
// computer->sendMessage(light->getBjtState(), light->getBjtCount());
|
||||||
phone->clearBuffer();
|
// computer->clearBuffer();
|
||||||
|
// phone->sendMessage(light->getBjtState(), light->getBjtCount());
|
||||||
|
// phone->clearBuffer();
|
||||||
|
|
||||||
|
ws.cleanupClients();
|
||||||
|
server.begin();
|
||||||
}
|
}
|
Reference in a new issue