const int RTS_IN = A0;
const int LTS_IN = A1;
//break signal
const int BS_IN = A2;
const int BS_OUT = 11;
//reverse signal
const int RS_IN = A3;
const int RS_OUT = 10;
const int NR_OF_LEDS = 4;
const int RIGHTLEDS[NR_OF_LEDS] = { 6, 7, 8, 9 };
const int LEFTLEDS[NR_OF_LEDS] = { 5, 4, 3, 2 };
const int interval = 100;
int nrOfRightLedsOn = 0;
int nrOfLeftLedsOn = 0;
unsigned long t = 0;
void StateRight();
void StateRightProcess();
void StateLeft();
void StateLeftProcess();
boolean oldSwitchStateRS = LOW;
boolean newSwitchStateRS = LOW;
boolean oldSwitchStateBS = LOW;
boolean newSwitchStateBS = LOW;
void setup()
{
Serial.begin(9600);
pinMode(RTS_IN, INPUT);
pinMode(LTS_IN, INPUT);
for (int led = 0; led < NR_OF_LEDS; led++)
{
pinMode(RIGHTLEDS[led], OUTPUT);
}
for (int led = 0; led < NR_OF_LEDS; led++)
{
pinMode(LEFTLEDS[led], OUTPUT);
}
}
void loop()
{
StateRight();
StateLeft();
newSwitchStateBS = digitalRead(BS_IN);
if(newSwitchStateBS != oldSwitchStateBS)
{
if(newSwitchStateBS == HIGH)
{
digitalWrite(BS_OUT, HIGH);
}
else
digitalWrite(BS_OUT, LOW);
oldSwitchStateBS = newSwitchStateBS;
}
newSwitchStateRS = digitalRead(RS_IN);
if(newSwitchStateRS != oldSwitchStateRS)
{
if(newSwitchStateRS == HIGH)
{
digitalWrite(RS_OUT, HIGH);
}
else
digitalWrite(RS_OUT, LOW);
oldSwitchStateRS = newSwitchStateRS;
}
}
void StateRight()
{
if(digitalRead(RTS_IN) == LOW)
{
SwitchRightLedsOff();
nrOfRightLedsOn = 0;
t = millis() + interval;
}
else if (nrOfRightLedsOn < NR_OF_LEDS)
{
StateRightProcess();
}
else
{
if(millis() >= t + interval)
{
t = millis();
SwitchRightLedsOff();
nrOfRightLedsOn = 0;
}
}
}
void StateRightProcess()
{
if(millis() >= t + interval)
{
t = millis();
digitalWrite(RIGHTLEDS[nrOfRightLedsOn], HIGH);
nrOfRightLedsOn++;
}
}
void SwitchRightLedsOff()
{
for (int led = 0; led < NR_OF_LEDS; led++)
{
digitalWrite(RIGHTLEDS[led], LOW);
}
}
void StateLeft()
{
if(digitalRead(LTS_IN) == LOW)
{
SwitchLeftLedsOff();
nrOfLeftLedsOn = 0;
t = millis() + interval;
}
else if (nrOfLeftLedsOn < NR_OF_LEDS)
{
StateLeftProcess();
}
else
{
if (millis() >= t + interval)
{
t = millis();
SwitchLeftLedsOff;
nrOfLeftLedsOn = 0;
}
}
}
void StateLeftProcess()
{
if (millis() >= t + interval)
{
t = millis();
digitalWrite(LEFTLEDS[nrOfLeftLedsOn], HIGH);
nrOfLeftLedsOn++;
}
}
void SwitchLeftLedsOff()
{
for (int led = 0; led < NR_OF_LEDS; led++)
{
digitalWrite(LEFTLEDS[led], LOW);
}
}