
#include <FastLED.h>
#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

BluetoothSerial SerialBT;
int Reception;                                                        // La valeur de Reception
char ValeurReceptionBT;                                               // La valeur de Reception en "char"

        char  changement;  
const   char  turnON ='a';
const   char  turnOFF ='b';
        int   Cellule = 9 ;                                           // Choix de la cellule
#define       LED_PIN     13                                          // Pin de commande LED
#define       NUM_LEDS    30                                          // Nombre de Led sur le ruban
CRGB leds[NUM_LEDS];

  void setup() 
{  
  pinMode(23, OUTPUT);  
  digitalWrite(23, HIGH);
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  Serial.begin(115200);
  SerialBT.begin("ESP32_LumiCube");                                   // Bluetooth device name
}

  void loop (void)
{


  ValeurReceptionBT =(char)SerialBT.read();
  
  if (  Serial.available()  )    { SerialBT.write(Serial.read()); }
  
  if (SerialBT.available()) 
  {
        
        SerialBT.print("Reception :");                                // write on BT app
        SerialBT.println(ValeurReceptionBT);                          // write on BT app      
        Serial.print ("Reception :");                                 // print on serial monitor
        Serial.println(ValeurReceptionBT);                            // print on serial monitor    
        //SerialBT.println(ValeurReceptionBT);                        // print on the app    
        //SerialBT.write(ValeurReceptionBT);                          // print on serial monitor
        
        if(ValeurReceptionBT == turnON)                               // pour gestion BT
        
        {
              
              while (ValeurReceptionBT == turnON)                     // Si BT -> activation LumiCube
              {
                    changement='a';
                    
                    {                                                 // Start
                    
                        digitalWrite(23, LOW);                        // Etat Bas  = 5v (passage transistor)
                        delayMicroseconds(9);
                        digitalWrite(23, HIGH);                       // Etat Haut = 0v
                    
                    }
                    
                    {                                                 // Selection cellule    
                         SelectionCellule(Cellule);   
                    }
                    
                    {                                                 // Stop
                    
                        digitalWrite(23, LOW);                        // Etat Bas  = 5v (passage transistor)
                        delayMicroseconds(3);
                        digitalWrite(23, HIGH);                       // Etat Haut = 0v
                        delayMicroseconds(3);
                        digitalWrite(23, LOW);                        // Etat Bas  = 5v (passage transistor)
                        delayMicroseconds(3);
                        digitalWrite(23, HIGH);                       // Etat Haut = 0v
                    
                    }
                    
                    for (int i = 0; i <= 29; i++) 
                    {               
                        leds[i] = CRGB ( 0, 0, 255);                  // Selection Bleu 
                        FastLED.show();                               // Utilisation de l'algo FastLed
                        if(SerialBT.read()=='b'){ changement='b';  }  // Detection éventuel d'une action BT 
                         
                        delayMicroseconds(5);                         // delay de 5  us
                        delay(40);                                    // delay de 40 ms
                    }
                    
                    
                    for (int i = 29; i >= 0; i--) 
                    {
                        leds[i] = CRGB ( 255, 0, 0);                  // Selection Rouge
                        FastLED.show();                               // Utilisation de l'algo FastLed
                        if(SerialBT.read()=='b'){ changement='b';  }  // Detection éventuel d'une action BT 
                        
                        delayMicroseconds(5);                         // delay de 5  us
                        delay(40);                                    // delay de 40 ms
                    }
                    
                    Serial.write(SerialBT.read());                    // pour debugage
                    ValeurReceptionBT = changement;                   // pour gestion BT

              }
        }
        
        if(ValeurReceptionBT == turnOFF)                              // Si BT -> aLumiCube OFF
        
            {
              for (int i = 0; i <= 29; i++) 
                {
                 leds[i] = CRGB ( 0, 0, 0);                           // Selection "noir"
                 FastLED.show();                                      // Utilisation de l'algo FastLed
                 delay(40);                                           // delay de 40 ms
                }
            
            }
        
        
        delay(100);                                                   // delay de 100 ms
  
  }                                                                   // fin de if SerialBT.available
  

}                                                                     // fin de loop

void SelectionCellule(int Cellule)
{ 
    delayMicroseconds(2);                                             // Attente suplémentaire pour eviter un 
                                                                      // problème lors du dechargement (5->0) 
                                                                      // du transistor
    for (int i = 0; i <= (Cellule-1); i++) 
    {
        digitalWrite(13, HIGH);                                       // Etat Haut = 3v
        delayMicroseconds(1);
        digitalWrite(13, LOW);                                        // Etat Bas = 3v
        delayMicroseconds(1);
        
    }
}
