//Header file: LDR_ESP_WiFi_SSE.h#ifndef LDR_ESP_WiFi_SSE_H#define LDR_ESP_WIFI_SSE_H#include "Arduino.h"#include <LDR_Ser_Sig3_Ser_Class.h>
#define COMING_SEN 0 #define ARRIVE_SEN 1#define DEPART_SEN 5#define GOING_SEN 4#define COMING_SIG 0#define ARRIVE_SIG 1#define DEPART_SIG 2#define GOING_SIG 3
enum where_is_train {startup,waiting,coming0,approaching0,arriving0,station0,departing0,leaving0,going0, coming1,approaching1,arriving1,station1,departing1,leaving1,going1};
class LDR_ESP_WiFi_SSE : public LDR_Ser_Sig3_Ser_Class { public : LDR_ESP_WiFi_SSE ( ); //use default values for pins void begin(const char* ssid, const char* password ); //use default values void WiFi_message(char* mess); enum where_is_train monitor_train(uint8_t test = 0 ); private : enum where_is_train train_state(int s0, int s1, int s2, int s3); enum where_is_train the_train; }; //semi colon important#endif;
----------------------------------------------------------------//Implmentation file LDR_ESP_WiFi_SSE.cpp#include "LDR_ESP_WiFi_SSE.h"#include "index.h" //HTML Code#include <ESPAsyncTCP.h>#include <ESPAsyncWebServer.h>// Create AsyncWebServer object on port 80AsyncWebServer server(80);
// Create an Event Source on /eventsAsyncEventSource events("/events");
LDR_ESP_WiFi_SSE::LDR_ESP_WiFi_SSE ( ) : LDR_Ser_Sig3_Ser_Class ( ) { }
void LDR_ESP_WiFi_SSE::begin (const char* ssid, const char* password ) { LDR_Ser_Sig3_Ser_Class::begin(1,1,4); //- external NOR gate, +ve logic 4 signals the_train = startup; WiFi.mode(WIFI_AP); //Access point only WiFi.softAP(ssid, password); // 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(); }void LDR_ESP_WiFi_SSE::WiFi_message(char* mess){ events.send(mess,"train_state"); }
//tests for next state - no other action//returns next state. enum where_is_train LDR_ESP_WiFi_SSE::train_state(int s0, int s1, int s2, int s3){ switch (the_train) { case startup : the_train = waiting; break; //always case waiting : if (s0) the_train = coming0; if (s3) the_train = coming1; break; case coming0 : if (!s0) the_train = approaching0; break; case approaching0 : if (s1)the_train = arriving0; break; case arriving0 : if (!s1)the_train = station0; break; case station0 : if (s2) the_train = departing0; break; case departing0 : if (!s2) the_train = leaving0; break; case leaving0 : if (s3)the_train = going0; break; case going0 : if (!s3) the_train = waiting; break; case coming1 : if (!s3) the_train = approaching1; break; case approaching1 : if (s2)the_train = arriving1; break; case arriving1 : if (!s2)the_train = station1; break; case station1 : if (s1) the_train = departing1; break; case departing1 : if (!s1) the_train = leaving1; break; case leaving1 : if (s0)the_train = going1; break; case going1 : if (!s0) the_train = waiting; break; } return the_train;}
enum where_is_train LDR_ESP_WiFi_SSE::monitor_train(uint8_t test ) {//parameter test added to allow shorting sensor to ground for train detected int s0 = train_over_sensor(COMING_SEN); //shorthand for sensors int s1 = train_over_sensor(ARRIVE_SEN); int s2 = train_over_sensor(DEPART_SEN); int s3 = train_over_sensor(GOING_SEN); if (test) { s0 =!s0; s1=!s1; s2=!s2; s3=!s3;} signal_control(COMING_SIG,s0); //control signals signal_control(ARRIVE_SIG,s1); //RED then AMBER - GREEN signal_control(DEPART_SIG,s2); signal_control(GOING_SIG,s3); return train_state(s0,s1,s2,s3); //find next state}
----------------------------------------------//LDR_ESP_WiFi_SSE.ino Client file//LDR_ESP_WiFi_SSE.ino Client file#include "LDR_ESP_WiFi_SSE.h";
const char* ssid = "Monitor_Trains";const char* password = "12345678";
LDR_ESP_WiFi_SSE train; //no parenthesis
enum where_is_train train_loc;
void setup() { train.begin(ssid,password ); //defaults to 1,1,4 }
void loop() { static where_is_train save_loc = startup ; train_loc = train.monitor_train(); //parameter = 1 for testing without LDR if (train_loc != save_loc) { save_loc = train_loc; switch (train_loc){ case waiting : train.WiFi_message("No trains present."); break; case coming0 : train.WiFi_message("Train coming from North."); break; case approaching0 : train.WiFi_message("Train approaching from North."); break; case arriving0 : train.WiFi_message("Train arriving from North."); break; case station0 : train.WiFi_message("Train from North in station."); break; case departing0 : train.WiFi_message("Train departing to South."); break; case leaving0 : train.WiFi_message("Train leaving to South."); break; case going0 : train.WiFi_message("Train going to South."); break; case coming1 : train.WiFi_message("Train coming from South."); break; case approaching1 : train.WiFi_message("Train approaching from South."); break; case arriving1 : train.WiFi_message("Train arriving from South."); break; case station1 : train.WiFi_message("Train from South in station."); break; case departing1 : train.WiFi_message("Train departing to North."); break; case leaving1 : train.WiFi_message("Train leaving to North."); break; case going1 : train.WiFi_message("Train going to North."); break; default : train.WiFi_message("Train is lost!"); } }}
---------------------------------//index.h const char WiFi_Mess [] PROGMEM = R"(<!DOCTYPE html><HTML> <HEAD> <TITLE>Monitor Trains</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>Monitor Trains.</H2><span id="train">Monitoring Trains!</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>)";