//Dsp_Train_State.ino#include <LDR_Signals_RAG.h>
//Client file LDR_Signals_RAG.ino (Red Amber Green)//#include "LDR_Signals_RAG.h"
LDR_Signals_RAG signal0(A0,2,3,4);LDR_Signals_RAG signal1(A1,5,6,7);LDR_Signals_RAG signal2(A2,8,9,10);LDR_Signals_RAG signal3(A3,11,12,13);
enum where_is_train {waiting,coming,approaching,arriving,station,departing,leaving,going,vacant,vacant2} the_train;#define SIG0 signal0.drive_signals#define SIG1 signal1.drive_signals#define SIG2 signal2.drive_signals#define SIG3 signal3.drive_signals
#define RED_LIGHT_ON 5000L#define AMBER_LIGHT_ON 5000L #define PROBLEM 20000L#define POLARITY 1void setup() { signal0.begin(POLARITY); signal1.begin(POLARITY); signal2.begin(POLARITY); signal3.begin(POLARITY); the_train = waiting; Serial.begin(115200);} //Version 2: Signals are GREEN, AMBER, RED, RED in waiting state where_is_train train(int s0, int s1, int s2, int s3){ static long start_time; switch (the_train) { case waiting : SIG0(0,0,1); SIG1(0,1,0); SIG2(1,0,0); SIG3(1,0,0); //green,amber,red,red if (s0) the_train = coming; break; case coming : // red, amber, red,red SIG0(1,0,0); //red if (!s0) { start_time = millis( ); the_train = approaching; } break; case approaching : //red,green,red,red SIG1(0,0,1); //green SIG2(0,1,0); //amber if (s1)the_train = arriving; if ((millis( )-start_time)> PROBLEM) the_train= waiting; //false reading break; case arriving : //red,red,amber.red SIG1(1,0,0); //red if (!s1)the_train = station; break; case station : //red,red,green,red SIG2(0,0,1); //green SIG3(0,1,0); //amber if (s2) the_train = departing; break; case departing : //red,red,red,amber SIG2(1,0,0); //red SIG3(0,1,0); //amber if (!s2) the_train = leaving; break; case leaving : //red,red,red,green SIG3(0,0,1); //green if (s3)the_train = going; break; case going : //all red SIG3(1,0,0); //red if (!s3) { the_train = vacant; start_time = millis();} break; case vacant : SIG0(0,1,0); //amber if ((millis( )- start_time) > RED_LIGHT_ON) { the_train = waiting; } break; } return the_train;}/*************OTHER PROJECT ***********************************/
const char Mess_waiting[] PROGMEM ={ "No trains present\n"};const char Mess_coming[] PROGMEM ={ "Train coming\n"};const char Mess_approach[] PROGMEM ={ "Train approaching\n"};const char Mess_arrive[] PROGMEM ={ "Train arriving\n"};const char Mess_station[] PROGMEM ={ "Train in station\n"};
const char Mess_depart[] PROGMEM ={ "Train departing\n"};const char Mess_leave[] PROGMEM ={ "Train leaving\n"};const char Mess_going[] PROGMEM ={ "Train going\n"};const char Mess_vacant[] PROGMEM ={ "Train has vacated section\n"};
void response(const char * dd){ char cc = pgm_read_byte(dd); while (cc != '\0'){ Serial.write(cc); dd++; cc = pgm_read_byte(dd); } } void display_message(where_is_train state_of_train){// Serial.println("Train location unknown!"); switch (state_of_train){ case waiting: response(Mess_waiting); break; case coming: response(Mess_coming); break; case approaching: response(Mess_approach); break; case arriving: response(Mess_arrive); break; case station: response(Mess_station); break; case departing: response(Mess_depart); break; case leaving: response(Mess_leave); break; case going: response(Mess_going); break; case vacant: case vacant2: response(Mess_vacant); break; }}void loop() { static where_is_train last_state = vacant2; int s0 = signal0.train_over_sensor( ); int s1 = signal1.train_over_sensor( ); int s2 = signal2.train_over_sensor( ); int s3 = signal3.train_over_sensor( ); the_train = train(s0,s1,s2,s3); if (the_train != last_state){ last_state = the_train; //Serial.print('.'); display_message(last_state); } }