#include "EasyUI.h" #include #include // Handle Websockets Communication void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ switch(type) { case WS_EVT_DISCONNECT: Serial.printf("Disconnected!\n"); break; case WS_EVT_CONNECT: { //Serial.printf("[WSc] Connected to url: %s\n", payload); Serial.println("Connected"); EasyUI.handleWebpage(client); Serial.println("JSON Data Sent to Client!"); } break; case WS_EVT_DATA: Serial.print("WS Event"); String msg = ""; for (size_t i = 0; i < len; i++) { msg += (char) data[i]; } Serial.println(msg); StaticJsonBuffer<200> jsonBuffer; JsonObject& root = jsonBuffer.parseObject(data); String mode = root["mode"]; if(mode == "check_tb_status"){ //EasyUI.tbuttonStatus(); } else if(mode == "tb_click"){ String status = root["status"]; String index = root["index"]; //EasyUI.tbClick(index, status); } break; } } void EasyUIClass::title(const char* _title){ ui_title = _title; } // Create Labels void EasyUIClass::label(const char* label_name,const char* label_val){ label_value[l_index] = label_val; label_title[l_index] = label_name; l_index++; } /* // Create Toggle Buttons void EasyUIClass::toggleButton(uint8_t pin, const char* tbutton_label, int start_state, bool swap_state){ pinMode(pin, OUTPUT); digitalWrite(pin, start_state); tbutton_swap[tb_index] = swap_state; tbutton_pinout[tb_index] = pin; tbuttontitle[tb_index] = tbutton_label; tb_index++; } */ // Create a generic Button void EasyUIClass::button(uint8_t pin, const char* tbutton_label, int start_state, bool swap_state){ //TODO: Implement digitalWrite(pin, start_state); tbutton_swap[tb_index] = swap_state; tbutton_pinout[tb_index] = pin; tbuttontitle[tb_index] = tbutton_label; tb_index++; } /* // Check Toggle Buttons States and Transfer to Webpage void EasyUIClass::tbuttonStatus(){ String json; StaticJsonBuffer<200> jsonBuffer; JsonObject& root = jsonBuffer.createObject(); root["mode"] = "t_button_startup"; root["index"] = tb_index; for(int i=0; ibroadcastTXT(json); } */ /* // Handle Toggle Button Click Response void EasyUIClass::tbClick(String _index, String _status){ String json; StaticJsonBuffer<200> jsonBuffer; JsonObject& root = jsonBuffer.createObject(); String name = "tb"+_index; root["mode"] = "t_button_click"; root["index"] = _index; if(_status == "on"){ root[name] = "1"; root.printTo(json); webSocket->broadcastTXT(json); if(tbutton_swap[_index.toInt()]){ digitalWrite(tbutton_pinout[_index.toInt()], LOW); }else{ digitalWrite(tbutton_pinout[_index.toInt()], HIGH); } } else if(_status == "off"){ root[name] = "0"; root.printTo(json); webSocket->broadcastTXT(json); if(tbutton_swap[_index.toInt()]){ digitalWrite(tbutton_pinout[_index.toInt()], HIGH); }else{ digitalWrite(tbutton_pinout[_index.toInt()], LOW); } } } */ // Convert & Transfer Arduino elements to JSON elements void EasyUIClass::handleWebpage(AsyncWebSocketClient * client){ // Labels for(int i=0; i jsonBuffer1; JsonObject& root1 = jsonBuffer1.createObject(); root1["type"] = "domLabel"; root1["l_title"] = String(label_title[i]); root1["label"] = String(label_value[i]); root1.printTo(json); client->text(json); } // Buttons for(int i=0; i jsonBuffer2; JsonObject& root2 = jsonBuffer2.createObject(); root2["type"] = "domButton"; root2["index"] = String(i); root2["label"] = tbuttontitle[i]; root2.printTo(json); client->text(json); } } void EasyUIClass::begin(){ server = new AsyncWebServer(80); ws = new AsyncWebSocket("/ws"); SPIFFS.begin(false); ws->onEvent(onWsEvent); server->addHandler(ws); server->serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm"); //Heap for general Servertest server->on("/heap", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, "text/plain", String(ESP.getFreeHeap())); }); server->onNotFound([](AsyncWebServerRequest *request){ request->send(404); }); server->begin(); Serial.println("UI Initialized"); } EasyUIClass EasyUI;