
static std::vector<AsyncClient*> clients; // a list to hold all clients
long temps = 0;

// Evènement "erreur de connexion du client"
static void handleError(void* arg, AsyncClient* client, int8_t error)
{
  Serial.printf("\n connection error %s from client %s \n", client->errorToString(error), client->remoteIP().toString().c_str());
}


// Evènement "Données recues par le client"
static void handleData(void* arg, AsyncClient* client, void *data, size_t len)
{
  if(len > 8) len = 8; //protection

  float delai = (float)(millis() - temps);
  temps = millis();

  //Données reçues
  Serial.printf("\nData from %s (%2.0f Hz) : ", client->remoteIP().toString().c_str(), 1000.0/delai );
  Serial.write((uint8_t*)data, len);

  //Envoi des données à l'écran
  tft_mouse(data, len);
  
  // Réponse du serveur au client
  if (client->space() > 32 && client->canSend())
  {
    char reply[32];
    sprintf(reply, "this is from %s", SERVER_HOST_NAME);
    client->add(reply, strlen(reply));
    client->send();
  }
}


// Evènement "Le client s'est déconnecté"
static void handleDisconnect(void* arg, AsyncClient* client)
{
  Serial.printf("\n client %s disconnected \n", client->remoteIP().toString().c_str());
}


// Evènement "Le client n'a pas confirmé la réception de ses données à temps"
static void handleTimeOut(void* arg, AsyncClient* client, uint32_t time)
{
  Serial.printf("\n client ACK timeout ip: %s \n", client->remoteIP().toString().c_str());
}


//Evènement "Un nouveau client se connecte"
static void handleNewClient(void* arg, AsyncClient* client) {
  Serial.printf("\n new client has been connected to server, ip: %s", client->remoteIP().toString().c_str());

  // Ajout du nouveau client "client" à la liste des clients existants
  clients.push_back(client);
  
  // Activation des 4 évènements précédents pour ce client
  client->onData(&handleData, NULL);
  client->onError(&handleError, NULL);
  client->onDisconnect(&handleDisconnect, NULL);
  client->onTimeout(&handleTimeOut, NULL);
}
