//WiFi_SSE.ino
#include "index.h" //HTML Web page
const char* ssid = "WiFi_SSE";const char* password = "12345678";
enum where_is_train {waiting,coming0,approaching0,arriving0,station0,departing0,leaving0,going0, coming1,approaching1,arriving1,station1,departing1,leaving1,going1};enum where_is_train train_loc; //location of train
long save_time; //last updatelong sample_time = 1000; //time between updates
//#include <ESP8266WiFi.h>#include <ESPAsyncTCP.h>#include <ESPAsyncWebServer.h>// Create AsyncWebServer object on port 80AsyncWebServer server(80);
// Create an Event Source on /eventsAsyncEventSource events("/events");
void setup() { Serial.begin(115200); WiFi.mode(WIFI_AP); //Access point only WiFi.softAP(ssid, password); train_loc = waiting; //State machine pinMode(D8,OUTPUT); // Handle Web Server server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", WiFi_Mess); });
// Handle Web Server Events events.onConnect([](AsyncEventSourceClient *client){ // send event with message "hello!", id and current millis // and set reconnect delay to 1 second client->send("hello!", NULL, millis(), 1000); }); server.addHandler(&events); server.begin(); // delay(10000);}
where_is_train simulate( ){ if ((millis( ) - save_time)>sample_time) { save_time = millis( ); switch (train_loc){ case waiting: train_loc = coming0; break; case coming0: train_loc = approaching0; break; case approaching0: train_loc = arriving0; break; case arriving0: train_loc = station0; break; case station0: train_loc = departing0; break; case departing0: train_loc = leaving0; break; case leaving0: train_loc = going0; break; case going0: train_loc = coming1; break; case coming1: train_loc = approaching1; break; case approaching1: train_loc = arriving1; break; case arriving1: train_loc = station1; break; case station1: train_loc = departing1; break; case departing1: train_loc = leaving1; break; case leaving1: train_loc = going1; break; case going1: train_loc = waiting; break; default : train_loc = waiting; } } return train_loc;}//int n = 0;void loop() { static where_is_train save_loc; //n += 1; digitalWrite(D8,HIGH); //delay(100); //events.send(String(n).c_str(),"train_state"); train_loc = simulate( ); if (train_loc != save_loc) { save_loc = train_loc; switch (train_loc){ case waiting : events.send("No trains present.","train_state"); break; case coming0 : events.send("Train coming from North.","train_state"); break; case approaching0 : events.send("Train approaching from North.","train_state"); break; case arriving0 : events.send("Train arriving from North.","train_state"); break; case station0 : events.send("Train from North in station.","train_state"); break; case departing0 : events.send("Train departing to South.","train_state"); break; case leaving0 : events.send("Train leaving to South.","train_state"); break; case going0 : events.send("Train going to South.","train_state"); break; case coming1 : events.send("Train coming from South.","train_state"); break; case approaching1 : events.send("Train approaching from South.","train_state"); break; case arriving1 : events.send("Train arriving from South.","train_state"); break; case station1 : events.send("Train from South in station.","train_state"); break; case departing1 : events.send("Train departing to North.","train_state"); break; case leaving1 : events.send("Train leaving to North.","train_state"); break; case going1 : events.send("Train going to North.","train_state"); break; } } digitalWrite(D8,LOW);}
//index.h const char WiFi_Mess [] PROGMEM = R"(<!DOCTYPE html><HTML> <HEAD> <TITLE>WiFi SSE</TITLE> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" href="data:,"> <style> html { font-family: Arial; text-align: center; } body { max-width: 400px; margin:0px auto; } </style> </HEAD><BODY><H2>WiFi SSE</H2><span id="train">Response to Client Request</span><script>if (!!window.EventSource) { var source = new EventSource('/events'); source.addEventListener('open', function(e) { console.log("Events Connected"); }, false); source.addEventListener('error', function(e) { if (e.target.readyState != EventSource.OPEN) { console.log("Events Disconnected"); } }, false); source.addEventListener('train_state', function(e) { console.log("train_state", e.data); document.getElementById("train").innerHTML = e.data; }, false);}</script> </BODY></HTML>)";