AsyncWebServer - Amélioration du code C/C++
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:
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:
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.