//Track_Train_ESP_Class.ino
#include "Track_Train_ESP_Class.h"
//ser_in, load, clk_in, ser_out, clk_outTrack_Train_ESP_Class train_obj(D0,D5,D6,D2,D1);
enum where_is_train train_loc;
void setup() { train_obj.begin( ); // train_obj.begin(1,1,4);}
void loop() { train_loc = train_obj.monitor_train( );}
//Track_Train_ESP_Class.cpp
//Track_Train_ESP_Class.cpp
#include "Track_Train_ESP_Class.h"
Track_Train_ESP_Class::Track_Train_ESP_Class (int ser_in,int load, int clk_in,int ser_out, int clk_out): LDR_Serial_Sensor_Class (ser_in,load, clk_in), Signals3_Serial_Class(ser_out,clk_out) {_ser_in = ser_in; _clk_in = clk_in;_ser_out= ser_out; _load= load; _clk_out= clk_out;}
void Track_Train_ESP_Class::begin( ){ Signals3_Serial_Class::begin( ); //default values LDR_Serial_Sensor_Class::begin(); signal_control (3,1); //turn red signal_control (2,1); //turn red signal_control (1,1); //turn red signal_control (0,1); //turn red the_train = waiting; Serial.begin(115200);}void Track_Train_ESP_Class::begin(int ext, int pol, int sets){ Signals3_Serial_Class::begin(ext,pol,sets); LDR_Serial_Sensor_Class::begin(); the_train = waiting; Serial.begin(115200);}
//tests for next state - no other action//returns next state. enum where_is_train Track_Train_ESP_Class::train(int s0, int s1, int s2, int s3){ switch (the_train) { 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 Track_Train_ESP_Class::dump_loc(where_is_train loc){ //static where_is_train save_loc=going0; static where_is_train save_loc=station0; static long wdt; if (millis( )>(wdt + WDT_TIME)) { loc = waiting; //reset - need to return state wdt = millis( ); } //if (loc != save_loc) { save_loc = loc; wdt = millis( ); switch (loc) { case waiting : Serial.println("No trains"); signal_control(3,0); //signals will all go GREEN signal_control(2,0); //via RED-AMBER-GREEN sequence signal_control(1,0); signal_control(0,0); break; case coming0 : Serial.println("Coming from North"); signal_control (0,1); //coming RED break; case approaching0 : Serial.println("Approaching from North"); break; case arriving0 : Serial.println("Arriving from North"); signal_control(1,1); //Arriving RED break; case station0 : Serial.println("Train from North in station"); break; case departing0 : Serial.println("Departing to South"); signal_control(2,1); //Departing RED signal_control (0,0); //Release coming to go Green break; case leaving0 : Serial.println("Leaving to South"); break; case going0 : Serial.println("Going to South"); signal_control(3,1); //Going RED signal_control (1,0); //Release arriving to go GREEN break; case coming1 : Serial.println("Coming from South"); signal_control (3,1); //Coming RED break; case approaching1 : Serial.println("Approaching from South"); break; case arriving1 : Serial.println("Arriving from South"); signal_control(2,1); //Arriving RED break; case station1 : Serial.println("Train from South in station"); break; case departing1 : Serial.println("Departing to North"); signal_control(1,1); //Departing RED signal_control (3,0); //Release coming to go Green break; case leaving1 : Serial.println("Leaving to North"); break; case going1 : Serial.println("Going to North"); signal_control(0,1); //Going RED signal_control (2,0); //release arriving to go GREEN break; default : Serial.println("Unknown state!"); } } return loc; //needed return when reset state with wdt}enum where_is_train Track_Train_ESP_Class::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;} the_train = train(s0,s1,s2,s3); //test for next state the_train = dump_loc(the_train); //text message for state //signal_control(3,s0); //control signals //signal_control(2,s1); //RED then AMBER - GREEN //signal_control(0,s2); //updated to different sequence// signal_control(1,s3); //see dump_loc(where_is_train loc) return the_train;}//Track_Train_ESP_Class.h
#ifndef TRACK_TRAIN_ESP_CLASS_H#define TRACK_TRAIN_ESP_CLASS_H#include <Signals3_Serial_Class.h>#include <LDR_Serial_Sensor_Class.h>#include "Arduino.h"
enum where_is_train {waiting,coming0,approaching0,arriving0,station0,departing0,leaving0,going0, coming1,approaching1,arriving1,station1,departing1,leaving1,going1};
#define WDT_TIME 200000 //200 seconds -class Track_Train_ESP_Class: public LDR_Serial_Sensor_Class, public Signals3_Serial_Class { public: Track_Train_ESP_Class (int ser_in, int load, int clk_in,int ser_out, int clk_out); void begin( ); void begin(int ext, int pol, int sets); enum where_is_train monitor_train( ); private: int _ser_in; int _load; int _clk_in; int _ser_out; int _clk_out; enum where_is_train the_train; enum where_is_train dump_loc(where_is_train loc ); enum where_is_train train(int s0, int s1, int s2, int s3); }; //add semi colon
#endif