Bonjour à tous,
J'ai pratiquement terminé le développement d'un projet de domotique sur ESP32 et j'en suis au stade des améliorations dans le but d'optimiser le code. La partie suivante est, sans aucun doute, mal foutue!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
serveur.on("/API", HTTP_GET, [](AsyncWebServerRequest *req){
    if(!clientConnected){
      req->send(408,"text/html", "Timeout");
      return;
    }
    String reponse = "" , equipement= "", taux = "";
    String commande[8], action[8];
    int nbArgs = req->args();
    for(int i=0;i<nbArgs;i++){
      commande[i] = req->argName(i);
      action[i]=req->arg(i);
    }
    //modification d'un programme horaire
    if(commande[0] == "Cmd" && action[0]=="modif"){
      uint8_t prg = action[1].toInt();
      reponse= String(pg[prg]);
      req->send(200,"text/plain", reponse);
    }
    //demande ouverture volet
    else if( commande[0] == "Cmd"  && action[0] == "O" && commande[1] == "volet") {
      equipement = req->arg(1);
      taux = req->arg(2);
      reponse = "Ok" + equipement + "O" + taux;
      req->send(200,"text/plain", reponse);
      if(taux=="100") taux="00";
      cmdCl[0]= 'O'; cmdCl[1]= equipement.charAt(0); cmdCl[2]= taux.charAt(0); cmdCl[3]=taux.charAt(1);
      cmdCl[4]='Z'; cmdCl[5]='\0';
      commandeRecu=true;
    }
    //demande fermeture volet
    else if(commande[0] == "Cmd" && action[0] == "F" && commande[1] == "volet" ){
      equipement = req->arg(1);
      reponse = "Ok"+ equipement + "F" + "00";
      req->send(200,"text/plain", reponse);
      cmdCl[0]= 'F'; cmdCl[1]= equipement.charAt(0); cmdCl[2]= 'Z'; cmdCl[3]='\0';
      commandeRecu=true;
    }
    //demande etat volet(s)
    else if(commande[0] == "Cmd" && action[0] == "E" && commande[1] == "volet" ){
      //E=Cmd Etat & commande[1] carte=arg[1]=A (c'est un volet) & commande[2] valeur=arg[2]=adresse carte 
      equipement = req->arg(2);
      String tempo = "";
      if(equipement != "0"){    //****un seul volet****
        uint8_t etatduVolet = etatVol[equipement.toInt() -1];
        if(etatduVolet == 0){
          reponse = "Ok" + equipement + "00"; //en fermeture totale
        }
        else{
          tempo = (etatduVolet == 100)? "OT" : String(etatduVolet-100);
          reponse = "Ok" + equipement +  tempo;
        }
        req->send(200,"text/plain", reponse);
      }
      else{                 //****tous les volets****
        reponse = "Ok";
        for(i=0; i<NB_VOLETS; i++){
          if(etatVol[i]== 0) tempo = "00";
          else if(etatVol[i]==100) tempo="OT";
          else tempo= String(etatVol[i]-100);
          reponse += tempo;
        }
        req->send(200,"text/plain",reponse);
      }
    }
     .............
   }
Et ainsi de suite, avec une vingtaine de commandes.
Est-il possible de supprimer les "String"?
Puis-je écrire une API simple qui appellerait une procédure d'analyse en passant en argument les tableaux commande[] et action[], un peu comme cela:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
serveur.on("/API", HTTP_GET, [](AsyncWebServerRequest *req){
    if(!clientConnected){
      req->send(408,"text/html", "Timeout");
      return;
    }
    String reponse = "" , equipement= "", taux = "";
    String commande[8], action[8];
    int nbArgs = req->args();
    for(int i=0;i<nbArgs;i++){
      commande[i] = req->argName(i);
      action[i]=req->arg(i);
    }
     analyseCommandes(commande,action);
  }
Je dois avouer que je me mélange encore les pinceaux avec les pointeurs.
Un peu d'aide me serait bénéfique.