//#include <Arduino.h> // EPS8266
// #include <ESP8266WiFi.h>  // EPS8266
// #include <ESPAsyncTCP.h> // EPS8266
#include <ESPAsyncWebServer.h>
#include <WiFi.h>   // ESP32
//#include "LittleFS.h"  // EPS8266
#include <SPIFFS.h>    // ESP32

#define Version "2022-1208"

const char *ssid ="ON_AIR2022";  // attention aux  probleme avec guillemets (anglais) orientés !!!
const char *password ="cGT...........................................................4";

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
// Create a WebSocket object

AsyncWebSocket ws("/ws");
// Set LED GPIO
//const int ledPin1 = 18;
//const int ledPin2 = 19;
//const int ledPin3 = 15;

const int LED_I = 2; // inbuilt Led
const int LED_Verte = 18; // verte
const int LED_Bleue = 15; //bleue
const int LED_Rouge = 19; // rouge
int DHTPIN = 5 ;        // GPIO 5 <-- Broche du capteur  AM2302 


String message = "";
String sliderValue1 = "0";
String sliderValue2 = "0";
String sliderValue3 = "0";

int dutyCycle1;
int dutyCycle2;
int dutyCycle3;

// Initialize LittleFS
void initFS() 
 {
 // pour ESP32
 if(!SPIFFS.begin())
 {
        Serial.println("An Error has occurred while mounting SPIFFS");
        return;
  }
 // pour ESP8266 
 // if (!LittleFS.begin()) {
 //   Serial.println("An error has occurred while mounting LittleFS");
 //   }
 //   Serial.println("LittleFS mounted successfully");
}

// Initialize WiFi
void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
}

void handleWebSocketMessage(void *arg, uint8_t *data, size_t len) {
  AwsFrameInfo *info = (AwsFrameInfo*)arg;
  if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) {
    data[len] = 0;
    message = (char*)data;
    if (message.indexOf("1s") >= 0) {
      sliderValue1 = message.substring(2);
      dutyCycle1 = map(sliderValue1.toInt(), 0, 100, 0, 1023);
      Serial.println(dutyCycle1);
    }
    if (message.indexOf("2s") >= 0) {
      sliderValue2 = message.substring(2);
      dutyCycle2 = map(sliderValue2.toInt(), 0, 100, 0, 1023);
      Serial.println(dutyCycle2);
    }    
    if (message.indexOf("3s") >= 0) {
      sliderValue3 = message.substring(2);
      dutyCycle3 = map(sliderValue3.toInt(), 0, 100, 0, 1023);
      Serial.println(dutyCycle3);
    }
  }
}
void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
  switch (type) {
    case WS_EVT_CONNECT:
      Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str());
      break;
    case WS_EVT_DISCONNECT:
      Serial.printf("WebSocket client #%u disconnected\n", client->id());
      break;
    case WS_EVT_DATA:
      handleWebSocketMessage(arg, data, len);
      break;
    case WS_EVT_PONG:
    case WS_EVT_ERROR:
      break;
  }
}

void initWebSocket() {
  ws.onEvent(onEvent);
  server.addHandler(&ws);
}
void setup() {
  Serial.begin(115200);
  pinMode(LED_Verte, OUTPUT);
  pinMode(LED_Rouge, OUTPUT);
  pinMode(LED_Bleue, OUTPUT);
  pinMode(LED_I, OUTPUT);   // builtin blue led on module
  Serial.print("ESP32_bleu_Web_Server_Multiple_Sliders_");
  Serial.println(Version);
  initFS();
  initWiFi();
  initWebSocket();
  
  // Web Server Root URL
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
       request->send(SPIFFS, "/index.html", "text/html");
  //  request->send(LittleFS, "/index.html", "text/html");
  });
  
 //  server.serveStatic("/", LittleFS, "/");
   server.serveStatic("/", SPIFFS, "/");


  server.on("/currentValue1", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "/text/plain", String(sliderValue1).c_str());
  });

  server.on("/currentValue2", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "/text/plain", String(sliderValue2).c_str());
  });

  server.on("/currentValue3", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "/text/plain", String(sliderValue3).c_str());
  });

  // Start server
  server.begin();

}

void loop() {
    digitalWrite(LED_I, HIGH);
      delay(500);
  analogWrite(LED_Verte, dutyCycle1);
  analogWrite(LED_Rouge, dutyCycle2);
  analogWrite(LED_Bleue, dutyCycle3);
  ws.cleanupClients();
     digitalWrite(LED_I, LOW);
     delay(500);
}