3 #include <HTTP_Method.h> 7 #include <ESPAsyncWebServer/ESPAsyncWebServer.h> 12 #include "freertos/FreeRTOS.h" 13 #include "freertos/queue.h" 16 AsyncWebSocket
ws(
"/test");
30 void onWsEvent(AsyncWebSocket *
server, AsyncWebSocketClient * client, AwsEventType type,
void * arg, uint8_t *data,
size_t len){
31 uint32_t *asInt = (uint32_t *)data;
32 float *asFloat = (
float *)data;
33 if(type == WS_EVT_CONNECT){
37 }
else if(type == WS_EVT_DISCONNECT){
40 }
else if(type == WS_EVT_DATA){
46 uint32_t command = asInt[0];
216 server.on(
"/pidvalues", 0b00000001, [](AsyncWebServerRequest *request){
221 Serial.print(
"args: ");
222 Serial.println(request->args());
223 for(
int i=0; i<request->args(); i++){
224 String key = request->argName(i);
225 if (key.length()>=2){
226 int32_t index = key.substring(1).toInt()-1;
229 float value = request->arg(i).toFloat();
230 if (key.charAt(0)==
'p'){
231 Serial.print(
"Setting P Gain ");
234 Serial.println(value);
237 if (key.charAt(0)==
'i'){
238 Serial.print(
"Setting I Gain ");
241 Serial.println(value);
244 if (key.charAt(0)==
'd'){
245 Serial.print(
"Setting D Gain ");
248 Serial.println(value);
258 if (i!=0) pidvals+=
",";
265 request->send(200,
"text/html", pidvals);
269 server.on(
"/*", 0b00000001, [](AsyncWebServerRequest *request){
270 String url = request->url();
275 if (url ==
"/") url =
"/index.html";
289 xTaskCreatePinnedToCore(
305 if (number>3)
return 0.0;
332 if (number<4) thisPage->
sliders[number]=value;
344 while (xSemaphoreTake(
valuesSem,( TickType_t ) 10)==
false);
345 if(abs(data)<0.00001)
350 if (
values[i].name==name){
351 if(
values[i].value!=data){
361 Serial.println(
"Create '"+name+
"' "+String(i));
377 if (
values[i].used &&
values[i].labelDirty)
return true;
384 if (
values[i].used &&
values[i].valueDirty)
return true;
391 if (
ws.count()==0)
return false;
393 uint8_t * packetBuffer =
new uint8_t[
numValues*8];
396 uint32_t *bufferAsInt32=(uint32_t*)packetBuffer;
397 float *bufferAsFloat=(
float*)packetBuffer;
399 bufferAsInt32[0]=0x0000001e;
402 uint32_t bufferItemCount=0;
405 if (
values[i].valueDirty){
407 bufferAsInt32[(bufferItemCount+1)*2] = i;
408 bufferAsFloat[(bufferItemCount+1)*2+1] =
values[i].value;
414 bufferAsInt32[1]=bufferItemCount;
415 uint32_t packetLength = (bufferItemCount+1)*8;
418 if (bufferItemCount>0){
468 if (xSemaphoreTake(
valuesSem,( TickType_t ) 10)==
false)
return false;
470 uint8_t * labelBuffer =
new uint8_t[lengthPredict];
472 uint32_t *bufferAsInt32=(uint32_t*)labelBuffer;
473 float *bufferAsFloat=(
float*)labelBuffer;
474 char *bufferAsChar=(
char*)labelBuffer;
476 bufferAsInt32[0]=0x0000001d;
479 uint32_t bufferItemCount=0;
482 if (
values[i].labelDirty){
484 bufferAsInt32[(bufferItemCount+1)*3] = i;
485 bufferAsInt32[(bufferItemCount+1)*3 + 1] = 0;
486 bufferAsInt32[(bufferItemCount+1)*3 + 2] =
values[i].name.length()+1;
492 if (bufferItemCount==0) {
497 bufferAsInt32[1]=bufferItemCount;
499 uint32_t startOfStringData=(bufferItemCount+1)*12;
500 uint32_t stringOffset = 0;
502 bufferAsInt32[2]=startOfStringData;
507 for(
int i=0; i<bufferItemCount; i++){
508 uint32_t index = bufferAsInt32[(i+1)*3];
509 uint32_t length = bufferAsInt32[(i+1)*3 + 2];
518 bufferAsInt32[(i+1)*3 + 1] = stringOffset;
519 memcpy(&bufferAsChar[startOfStringData+stringOffset],
values[index].name.c_str(),length);
520 stringOffset+=length;
527 uint32_t packetLength = startOfStringData+stringOffset;
528 packetLength += (4-(packetLength%4));
530 if (bufferItemCount>0){
546 uint32_t *bufferAsInt32=(uint32_t*)buffer;
547 float *bufferAsFloat=(
float*)buffer;
548 bufferAsInt32[0]=0x00000010;
549 bufferAsInt32[1]=index;
561 for(
int i=0;i<
values[index].
name.length();i++){
594 uint8_t * heartbeatBuffer =
new uint8_t[8];
595 uint32_t *bufferAsInt32=(uint32_t*)heartbeatBuffer;
596 bufferAsInt32[0]=0x00000050;
603 uint32_t length = data.length()+1;
604 uint32_t packetLength = length + 8 + (4-(length%4));
605 uint8_t * consolePacket =
new uint8_t[packetLength];
606 uint32_t *bufferAsInt32=(uint32_t*)consolePacket;
608 bufferAsInt32[0]=0x11;
609 bufferAsInt32[1]=length;
610 data.toCharArray((
char *)(consolePacket+8), length);
633 if (
ws.count()==0)
return false;
636 uint8_t * pidsetBuffer =
new uint8_t[20];
637 uint32_t *bufferAsInt32=(uint32_t*)pidsetBuffer;
638 float *bufferAsFloat=(
float*)pidsetBuffer;
639 bufferAsInt32[0]=0x00000060;
640 bufferAsInt32[1]=motor;
656 uint8_t * setpointsetBuffer =
new uint8_t[12];
657 uint32_t *bufferAsInt32=(uint32_t*)setpointsetBuffer;
658 float *bufferAsFloat=(
float*)setpointsetBuffer;
659 bufferAsInt32[0]=0x00000061;
660 bufferAsInt32[1]=motor;
670 if (
ws.enabled() &&
ws.availableForWriteAll()){
671 ws.binaryAll(packet,length);
static WebPage * thisPage
static const int static_files_manifest_count
telemetryValue values[numValues]
bool SendSetpoint(uint32_t motor)
void setSetpoint(float newTargetInDegrees)
void UpdateSetpoint(uint32_t motor, float setpoint)
void setSliderValue(uint32_t number, float value)
AsyncWebSocket ws("/test")
void newButton(String url, void(*handler)(String), String label, String description)
void valueChanged(String name, float value)
void printToWebConsole(String data)
TaskHandle_t updateTaskHandle
float getSliderValue(uint32_t number)
void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len)
void sendValueUpdate(uint32_t index, uint8_t *buffer)
void setValue(String name, float data)
float sliders[numSliders]
static char stringBuffer[200]
void packetTXTask(void *param)
static bool lockOutSending
SemaphoreHandle_t valuesSem
void UpdatePIDValues(uint32_t motor, float p, float i, float d)
#define MAX_POSSIBLE_MOTORS
bool SendPIDValues(uint32_t motor)
bool sendPacket(unsigned char *packet, uint32_t length)
float getCurrentDegrees()
float getJoystickMagnitude()
AsyncWebServer server(80)
void sendLabelUpdate(uint32_t index, uint8_t *buffer)
static Motor * list[MAX_POSSIBLE_MOTORS]
void setJoystickValue(float xpos, float ypos, float angle, float mag)
char * String2Chars(String str)
void setHeartbeatUUID(uint32_t uuid)
void updateTask(void *param)
JoyData * getJoystickData()
static const PACKED_FILE static_files_manifest[]