// Define the pin numbers for the LEDs
int lowLightPin = 2;
int highLightPin = 3;
int rightDRLPin = 4;
int leftDRLPin = 5;
int rightBlinkerPin = 6;
int leftBlinkerPin = 7;
int tailLightPin = 8;
int reverseLightPin = 9;

// Define the pin numbers for the toggle switches
int rightBlinkerButtonPin = 11;
int leftBlinkerButtonPin = 12;
int reverseButtonPin = 13;
int drlButtonPin = A1;
int primaryButtonPin = A2;  //Activate low light and tail light 
int highButtonPin = A3;
int hazardButtonPin = A4;
int brakeButtonPin = A5;

int rightBlinkerOn = LOW;
int leftBlinkerOn = LOW;
int reverseOn = LOW;
int drlOn = LOW;
int primaryOn = LOW; //Low light and tail light
int highOn = LOW;
int hazardOn = LOW;
int brakePressed = LOW;
int lastHazardOn = LOW;

unsigned long previousMillisBlinker = 0;
const long intervalBlinker = 250;
unsigned long previousMillisRightDrl = 0;
const long intervalRightDrl = 500;
unsigned long previousMillisLeftDrl = 0;
const long intervalLeftDrl = 500;
const long intervalHazard = 250;

void setup() {
  // Initialize the LED pins as outputs
  pinMode(lowLightPin, OUTPUT);
  pinMode(highLightPin, OUTPUT);
  pinMode(rightDRLPin, OUTPUT);
  pinMode(leftDRLPin, OUTPUT);
  pinMode(rightBlinkerPin, OUTPUT);
  pinMode(leftBlinkerPin, OUTPUT);
  pinMode(tailLightPin, OUTPUT);
  pinMode(reverseLightPin, OUTPUT);

  // Initialize the switch pins as inputs with pull-up resistors
  pinMode(rightBlinkerButtonPin, INPUT_PULLUP);
  pinMode(leftBlinkerButtonPin, INPUT_PULLUP);
  pinMode(reverseButtonPin, INPUT_PULLUP);
  pinMode(drlButtonPin, INPUT_PULLUP);
  pinMode(primaryButtonPin, INPUT_PULLUP);
  pinMode(highButtonPin, INPUT_PULLUP);
  pinMode(hazardButtonPin, INPUT_PULLUP);
  pinMode(brakeButtonPin, INPUT_PULLUP);
}

void loop() {
  brakePressed = digitalRead(brakeButtonPin);
  primaryOn = digitalRead(primaryButtonPin);  // Include low and tail light

  // Read the state of the primary light switch (low and tail)
  if (primaryOn) {
    digitalWrite(lowLightPin, HIGH);analogWrite(tailLightPin, 50);
  } else {
    digitalWrite(lowLightPin, LOW);analogWrite(tailLightPin, 0);
  }
  if (brakePressed) {
    analogWrite(tailLightPin, 255); // Full brightness
  }

  // Read the state of the right blinker switch
  if (digitalRead(rightBlinkerButtonPin) == LOW) {
    rightBlinkerOn = !rightBlinkerOn;
    digitalWrite(rightBlinkerPin, rightBlinkerOn ? HIGH : LOW);
    delay(100);
  }

  // Read the state of the left blinker switch
  if (digitalRead(leftBlinkerButtonPin) == LOW) {
    leftBlinkerOn = !leftBlinkerOn;
    digitalWrite(leftBlinkerPin, leftBlinkerOn ? HIGH : LOW);
    delay(100);
  }

  // Implement blinkers
  unsigned long currentMillisBlinker = millis();
  if ((leftBlinkerOn || rightBlinkerOn) && (currentMillisBlinker - previousMillisBlinker >= intervalBlinker)) {
    previousMillisBlinker = currentMillisBlinker;
    digitalWrite(leftBlinkerPin, leftBlinkerOn ? !digitalRead(leftBlinkerPin) : LOW);
    digitalWrite(rightBlinkerPin, rightBlinkerOn ? !digitalRead(rightBlinkerPin) : LOW);
  }

  // Read the state of the drl
  if (digitalRead(drlButtonPin) == LOW) {
    drlOn = !drlOn;
    digitalWrite(rightDRLPin || leftDRLPin, drlOn ? HIGH : LOW);
    delay(100);
  }

  // Implement right drl
  unsigned long currentMillisRightDrl = millis();
  if ((drlOn) && (currentMillisRightDrl - previousMillisRightDrl >= intervalRightDrl)) {
    previousMillisRightDrl = currentMillisRightDrl;
    digitalWrite(rightDRLPin, drlOn ? !digitalRead(drlButtonPin) : LOW);
  }
  
  // Implement left drl
  unsigned long currentMillisleftDrl = millis();
  if ((drlOn) && (currentMillisleftDrl - previousMillisLeftDrl >= intervalLeftDrl)) {
    previousMillisLeftDrl = currentMillisleftDrl;
    digitalWrite(leftDRLPin, drlOn ? !digitalRead(drlButtonPin) : LOW);
  }

  // Read the state of the reverse button
  if (digitalRead(reverseButtonPin) == LOW) {
    reverseOn = !reverseOn;
    digitalWrite(reverseLightPin, reverseOn ? HIGH : LOW);
    delay(100);
  }

  // Read the state of the high button
  if (digitalRead(highButtonPin) == LOW) {
    highOn = !highOn;
    digitalWrite(highLightPin, highOn ? HIGH : LOW);
    delay(100);
  }

  // Read the state of the hazard button
  int reading = digitalRead(hazardButtonPin);

  // Check if the hazard button state has changed
  if (reading != lastHazardOn) {
    // Button state has changed, save the time
    previousMillisBlinker = millis();
  }

  // Update the hazard button state
  lastHazardOn = reading;

  // Implement hazard lights
  if (reading == LOW && (currentMillisBlinker - previousMillisBlinker >= 50)) {
    hazardbutton();
  }
}

void hazardbutton() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillisBlinker >= intervalHazard) {
    previousMillisBlinker = currentMillis;
    rightBlinkerOn = !rightBlinkerOn;
    leftBlinkerOn = !leftBlinkerOn;

    digitalWrite(rightBlinkerPin, rightBlinkerOn ? HIGH : LOW);
    digitalWrite(leftBlinkerPin, leftBlinkerOn ? HIGH : LOW);
  }
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2
r6:1
r6:2
r7:1
r7:2
r8:1
r8:2
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
btn5:1.l
btn5:2.l
btn5:1.r
btn5:2.r
btn6:1.l
btn6:2.l
btn6:1.r
btn6:2.r
btn7:1.l
btn7:2.l
btn7:1.r
btn7:2.r
btn8:1.l
btn8:2.l
btn8:1.r
btn8:2.r
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
led5:A
led5:C
led6:A
led6:C
led7:A
led7:C
led8:A
led8:C
led9:A
led9:C
led10:A
led10:C
led11:A
led11:C
led12:A
led12:C
led13:A
led13:C
led14:A
led14:C
led15:A
led15:C
led16:A
led16:C
btn9:1.l
btn9:2.l
btn9:1.r
btn9:2.r
vcc1:VCC