// Hardware: ESP32-CAM and PCA9685


// ESP32-CAM Pins:
#define SDA_PIN                    13  // Fixed for TL_RAM PCB
#define SCL_PIN                    14  // Fixed for TL_RAM PCB
#define PCA_ENABLE_PIN_NO           3  //  Fixed for TL_RAM PCB 
#define LED_RED_INBUILD_PIN_NO     33  //  Fixed for ESP32-CAM 
#define LED_FLASH_INBUILD_PIN_NO    4  //  Fixed for ESP32-CAM 

// PCA9685 Connections 
//#define PWM_CHANNEL_NO_M0          0
//#define PWM_CHANNEL_NO_M1          1
//#define PWM_CHANNEL_NO_M2          2
                                   
#define PWM_CHANNEL_NO_LED_01_GREEN     15 
//#define PWM_CHANNEL_NO_SERVO_M3       14 // Not used in ESRC July 2024
#define PWM_CHANNEL_NO_LED_02_WHITE     13 
#define PWM_CHANNEL_NO_LED_03_BLUE      12 

#define PWM_CHANNEL_NO_LASER            11  // Not Connected for now
#define PWM_CHANNEL_NO_BUZZER           10  
#define PWM_CHANNEL_NO_EM                9  // Yellow/Orange LED
//#define PWM_CHANNEL_NO_EXTRA_PWM       8  // Not Implemented in Hardware: RED LED


#define LED_INBUILD_ON  0
#define LED_INBUILD_OFF 1

#define BASE_PCB_ENABLE  LOW
#define BASE_PCB_DISABLE HIGH


#include <Wire.h>
////#include <Adafruit_I2CDevice.h>
#include <Adafruit_PWMServoDriver.h> // PCA9685


////TFT_eSPI tft = TFT_eSPI();  // Invoke custom library
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); // Default I2C address 0x40
////BluetoothSerial SerialBT;

void setup()
{
    // ESP32-CAM Pins:
    pinMode(LED_FLASH_INBUILD_PIN_NO, OUTPUT);  digitalWrite(LED_FLASH_INBUILD_PIN_NO, LOW); // Flash light OFF
    pinMode(LED_RED_INBUILD_PIN_NO, OUTPUT);    digitalWrite(LED_RED_INBUILD_PIN_NO, LED_INBUILD_OFF); 
    pinMode(PCA_ENABLE_PIN_NO, OUTPUT);         
    //digitalWrite(PCA_ENABLE_PIN_NO, BASE_PCB_DISABLE);
    digitalWrite(PCA_ENABLE_PIN_NO, BASE_PCB_ENABLE);       


    digitalWrite(PCA_ENABLE_PIN_NO, BASE_PCB_ENABLE);
    delay(1);
    Wire.begin(SDA_PIN, SCL_PIN);
    pwm.begin(); //
    pwm.setOscillatorFrequency(25000000); // 23 - 27 MHz [ c a l i b r a t i o n ]
    pwm.setPWMFreq(50);  // Analog servos run at ~50 Hz updates

    for(int i =1; i<=5; i++)
    {
            pwm.setPWM(PWM_CHANNEL_NO_BUZZER, 4096,     0);  // BUZZER ON
            delay(200);
            pwm.setPWM(PWM_CHANNEL_NO_BUZZER,    0,  4096);  // BUZZER OFF
            delay(200);
    }

}


void loop()
{

    pwm.setPWM(PWM_CHANNEL_NO_LED_01_GREEN, 4096,    0);
    delay(200);
    pwm.setPWM(PWM_CHANNEL_NO_LED_01_GREEN,    0, 4096);
    delay(200);

    pwm.setPWM(PWM_CHANNEL_NO_LED_02_WHITE, 4096,    0);
    delay(200);
    pwm.setPWM(PWM_CHANNEL_NO_LED_02_WHITE,    0, 4096);
    delay(200);

    pwm.setPWM(PWM_CHANNEL_NO_LED_03_BLUE , 4096,    0);    
    delay(200);
    pwm.setPWM(PWM_CHANNEL_NO_LED_03_BLUE ,    0, 4096);
    delay(200);


    pwm.setPWM(PWM_CHANNEL_NO_EM,           4096,    0);  // EM OFF
    delay(200);
    pwm.setPWM(PWM_CHANNEL_NO_EM,              0, 4096);  // EM ON : Yellow/Orange LED
    delay(200);

    //pwm.setPWM(PWM_CHANNEL_NO_LASER, 0,     4096);  // LASER ON? check
    //delay(200);
    //pwm.setPWM(PWM_CHANNEL_NO_LASER, 4096,     0);  // LASER OFF? check
    //delay(200);


    delay(200);
}