#include <IRremote.hpp>


const int rearLightRight = 4;
const int rearLightLeft = 6;
const int indicatorSound = 7;
const int policeSirens = 9;
const int controlPin1 = 2;
const int controlPin2 = 3;
const int controlPin3 = 10;
const int controlPin4 = 12;  

const int trig = 8;
const int echo = 11;

const int IR_RECEIVE_PIN = 5;  // IR receiver pin

// Variables
int motorSpeed = 255;



void setup() {
    // Set motor control pins as outputs
    pinMode(controlPin1, OUTPUT);
    pinMode(controlPin2, OUTPUT);
    pinMode(controlPin3, OUTPUT);
    pinMode(controlPin4, OUTPUT);

    pinMode(rearLightRight, OUTPUT);
    pinMode(rearLightLeft, OUTPUT);
    pinMode(indicatorSound, OUTPUT);


    pinMode(policeSirens, OUTPUT);

    pinMode(trig, OUTPUT);
    pinMode(echo, INPUT);

    Serial.begin(9600);
   
   IrReceiver.begin(IR_RECEIVE_PIN);

    stop();
   
    Serial.println("System ready");
}

void loop() {
digitalWrite(trig,LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);

long duration = pulseIn(echo, HIGH);
float distance = duration/148;

if(distance <= 1.0){
              stop();
            }

if (IrReceiver.decodedIRData.command == 0x1F) {
digitalWrite(rearLightRight, HIGH);
digitalWrite(rearLightLeft, LOW);
digitalWrite(indicatorSound, HIGH);
}
else if (IrReceiver.decodedIRData.command == 0x4B) {
digitalWrite(rearLightLeft, HIGH);
digitalWrite(rearLightRight, LOW);
digitalWrite(indicatorSound, HIGH);
}
    if (IrReceiver.decode()) {

        Serial.print("IR command: 0x");
        Serial.println(IrReceiver.decodedIRData.command, HEX);
       
        // Movement commands
        if (IrReceiver.decodedIRData.command == 0x60) { // UP button
            forwards();
            


        } else if (IrReceiver.decodedIRData.command == 0x61) { // DOWN button
            backwards();

        } else if (IrReceiver.decodedIRData.command == 0x65) { // LEFT button
            left();
    
        } else if (IrReceiver.decodedIRData.command == 0x62) { // RIGHT button
            right();
          
        } else if (IrReceiver.decodedIRData.command == 0x68) { // STOP/OK button
            stop();
            digitalWrite(policeSirens, LOW);
          
        } else if (IrReceiver.decodedIRData.command == 0x1A) {
          digitalWrite(policeSirens, HIGH);
        } else if (IrReceiver.decodedIRData.command == 0x9F) {
          digitalWrite(policeSirens, LOW);
          digitalWrite(rearLightLeft, LOW);
          digitalWrite(rearLightRight, LOW);
          digitalWrite(indicatorSound, HIGH);
        }
        //Optional speed control.
        /*
        else if (IrReceiver.decodedIRData.command == 0x7) { // Increase speed
            motorSpeed = min(motorSpeed + 25, 255);  // Cap speed at 255
            Serial.print("Increased speed to: ");
            Serial.println(motorSpeed);
            analogWrite(enablePin, motorSpeed);
            analogWrite(enablePin2, motorSpeed);
        } else if (IrReceiver.decodedIRData.command == 0xB) { // Decrease speed
            motorSpeed = max(motorSpeed - 25, 0);  
            Serial.print("Decreased speed to: ");
            Serial.println(motorSpeed);
            analogWrite(enablePin, motorSpeed);
            analogWrite(enablePin2, motorSpeed);
        }
       */
       
        IrReceiver.resume();
    }
}



void forwards(){
  Serial.println("Forwards");
    digitalWrite(controlPin1,LOW);
    digitalWrite(controlPin2,HIGH);
    digitalWrite(controlPin3,HIGH);
    digitalWrite(controlPin4,LOW);
}
void backwards(){
  Serial.println("Backwards");
    digitalWrite(controlPin1, HIGH);
    digitalWrite(controlPin2,LOW);
    digitalWrite(controlPin3, LOW);
    digitalWrite(controlPin4,HIGH);
}
 void right(){
  Serial.println("Right");
    digitalWrite(controlPin1,LOW);
    digitalWrite(controlPin2,LOW);
    digitalWrite(controlPin3,LOW);
   digitalWrite(controlPin4,HIGH);
 }
  void left(){
    Serial.println("Left");
    digitalWrite(controlPin1,HIGH);
    digitalWrite(controlPin2,LOW);
    digitalWrite(controlPin3,LOW);
   digitalWrite(controlPin4,LOW);
 }
  void stop(){
    Serial.println("Stop");
   digitalWrite(controlPin1,LOW);
   digitalWrite(controlPin2,LOW);
   digitalWrite(controlPin3,LOW);
   digitalWrite(controlPin4,LOW);
 }