//Signals3_Class.ino#include <LDR_Sensor_Class.h>#include "Signals3_Class.h"Signals3_Class signal(5,4,3);LDR_Sensor_Class sensor(A0);void setup() { signal.begin(1); sensor.begin( );}void loop() {// signal.signal_control(sensor.train_over_sensor());signal.signal_control(sensor.train_over_sensor(),1,8); /* for (int i = 0; i<3 ; i++) { signal.signal_control(1); delay(1000); } for (int i = 0; i<20 ; i++) { signal.signal_control(0); delay(1000); } */}//Signals3_Class.cpp#include "Signals3_Class.h"Signals3_Class:: Signals3_Class(int red_led, int green_led){ _red_led= red_led; _green_led = green_led; }; Signals3_Class:: Signals3_Class(int red_led, int amber_led, int green_led){ _red_led= red_led; _amber_led=amber_led; _green_led = green_led; _external_gate = 0; };void Signals3_Class::begin( ){ pinMode(_red_led,OUTPUT); digitalWrite(_red_led,HIGH); //turn on for testing pinMode(_green_led,OUTPUT); digitalWrite(_green_led,HIGH); //turn on for testing if (!_external_gate) { pinMode(_amber_led,OUTPUT); digitalWrite(_amber_led,HIGH); //turn on for testing }};void Signals3_Class::begin(int pol ){ _pol = pol; begin( ); };
void Signals3_Class::drive_signals(int red,int amber,int green){ if (!_pol) { red ^= 1; amber ^= 1; green ^=1;} digitalWrite(_red_led,red); digitalWrite(_green_led,green); if (!_external_gate) digitalWrite(_amber_led,amber); }
void Signals3_Class::signal_control(int train_status){ switch(signal_state) { case wait4train: //digitalWrite(_red_led,0); digitalWrite(_amber_led,0); digitalWrite(_green_led,1); drive_signals(0,0,1); if (train_status ==1) {signal_state = wait4end;} break; case wait4end: //digitalWrite(_red_led,1); digitalWrite(_amber_led,0); digitalWrite(_green_led,0); drive_signals(1,0,0); if (train_status == 0) { signal_state = wait4red; start_time = millis( ); } break; case wait4red: //digitalWrite(_red_led,1); digitalWrite(_amber_led,0); digitalWrite(_green_led,0); drive_signals(1,0,0); if (millis( )-start_time >= delay4red) { signal_state = wait4amber; start_time = millis( ); } if (train_status ==1) {signal_state = wait4end;} break; case wait4amber: //digitalWrite(_red_led,0); digitalWrite(_amber_led,1); digitalWrite(_green_led,0); drive_signals(0,1,0); if (millis( )-start_time >= delay4amber) { signal_state = wait4train; } if (train_status ==1) {signal_state = wait4end;} break; default: signal_state = wait4train; } }; void Signals3_Class::signal_control(int dsp, int red_wait){ delay4red = red_wait*1000; signal_control(dsp); }void Signals3_Class::signal_control(int dsp, int red_wait, int amber_wait){ delay4amber = amber_wait * 1000; signal_control(dsp,red_wait);} ;//Signals3_Class.h#ifndef Signals3_Class_h #define Signals3_Class_h
#include "Arduino.h" class Signals3_Class { public: Signals3_Class(int red_led, int green_led); Signals3_Class(int red_led, int amber_led, int green_led); void begin( ); void begin(int pol); void signal_control(int dsp); //control lights void signal_control(int dsp, int red_wait); void signal_control(int dsp, int red_wait, int amber_wait); private: int _red_led, _amber_led, _green_led; int _external_gate = 1; int _pol = 1; //set for positive enum state {wait4train, wait4end, wait4red, wait4amber} signal_state =wait4train; void drive_signals(int red, int amber, int green); long start_time; long delay4red = 5000L; //RED remains on for 5 seconds long delay4amber = 5000L; //AMBER on for 5 seconds }; #endif