//Client, Application, Test file Single_Track_Class.ino#include "Single_Track_Class.h"
Single_Track_Class lights1(A0,2,3,4);Single_Track_Class lights2(A1,5,6,7);
enum track_activity {vacant, train1, train2} train_status;//#define RESET_TIME 300000 //5 minutes#define POLARITY 1void setup() {lights1.begin(POLARITY);lights2.begin(POLARITY);train_status = vacant;}
void loop() { // lights1.signal_control(lights1.train_over_sensor()); // lights2.signal_control(lights2.train_over_sensor()); // long start_time; int sen1 = lights1.train_over_sensor(); int sen2 = lights2.train_over_sensor(); switch (train_status){ case vacant : //start_time = millis( ); lights1.signal_control(0); //not red lights2.signal_control(0); if (sen1) train_status = train1; else if(sen2) train_status = train2; break; case train1 : lights2.your_track( ); if (lights1.my_track(sen1,sen2)) train_status = vacant; //if ((millis( ) - start_time)> RESET_TIME) train_status = vacant; break; case train2 : lights1.your_track( ); if (lights2.my_track(sen2,sen1)) train_status = vacant; //if ((millis( ) - start_time)> RESET_TIME) train_status = vacant; break; } }
//Implementation file Single_Track_Class.cpp#include "Single_Track_Class.h"
Single_Track_Class::Single_Track_Class(int sensor, int red, int amber, int green) : LDR_Signals3_Class(sensor, red, amber, green) {}
void Single_Track_Class::begin(int polarity){ LDR_Signals3_Class::begin(polarity); signal_control(0); //green lights train_location = waiting;}int Single_Track_Class::train_over_sensor(){ return LDR_Signals3_Class::train_over_sensor();}
void Single_Track_Class::signal_control(int dsp){ LDR_Signals3_Class::signal_control(dsp);}
int Single_Track_Class::my_track(int my_sensor, int your_sensor){long start_time; switch (train_location) { case waiting : train_location = wait2pass; return 0; case wait2pass: if (!my_sensor) { train_location = wait2arrive; start_time=millis(); }return 0; case wait2arrive: signal_control(1); if (your_sensor) train_location = wait2dept; return 0; case wait2dept: if (your_sensor) return 0; else {train_location = waiting; return 1; } }};
void Single_Track_Class:: your_track( ){ signal_control(1); //turn red light on};
//Header file: Single_Track_Class.h#ifndef SINGLE_TRACK_CLASS_H#define SINGLE_TRACK_CLASS_H#include <LDR_Signals3_Class.h>
#include "Arduino.h"
class Single_Track_Class : public LDR_Signals3_Class { public : Single_Track_Class(int sensor, int red, int amber, int green); void begin(int polarity); //polarity of signals int train_over_sensor( ); void signal_control(int dsp); int my_track(int my_sensor, int your_sensor); void your_track( ); private: enum track_status {waiting, wait2pass, wait2arrive, wait2dept} train_location; };#endif