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 67 68 69 70 71 72 73 74 75 76 77
| // Côté ESP32
case 'E': {
if (iParam == 0 && (numCarte > NB_VOLET || nbCarSaisis != 5)) {
sprintf(buf, "%s", ERCOM);
afficMsg(buf, true, 10, 20);
return;
}
else if (iParam == 0) { //Exy00 demande etat d'un volet
#define MAX_RETRY 3
bool transmission_ok = false;
int retries = 0;
// --- DÉBUT DE LA BOUCLE DE RENVOI ---
while (retries < MAX_RETRY && !transmission_ok) {
if (retries > 0) {
Serial.printf("Echec, tentative %d/%d...\n", retries + 1, MAX_RETRY);
delay(100); // Petit délai avant de renvoyer
}
sprintf(buf, "Etat %s %d demande?", VOL, numCarte);
afficMsg(buf); // Affiche la demande (ex: "Etat Volet 12 demande?")
// 1. Appel de xmit()
if (xmit(carCom)) {
// 2. SUCCÈS: xmit() a reçu un 'Z'. Vérifions le contenu de mRetour
int adresse = 0;
int posVol = 0;
// mRetour contient "K12=56E" (le 'Z' a été remplacé par '\0')
// Votre sscanf d'origine était donc correct !
if (sscanf(mRetour, "K%d=%dE", &adresse, &posVol) == 2) {
Serial.printf("Retour OK: adresse = %d Valeur: %d\n", adresse, posVol);
transmission_ok = true; // C'est bon, on sort de la boucle while
// --- Début de votre code d'affichage ---
if (posVol == 100) {
sprintf(buf, "%s %d est en %s totale", VOL, numCarte, OUV);
} else if (posVol == 0) {
sprintf(buf, "Etat %s %d en %s totale", VOL, numCarte, FER);
} else {
sprintf(buf, "%s %d est %s de %d%c", VOL, numCarte, OUV, posVol, '%');
}
effaceMsg(false, true);
afficMsg(buf, true, 10, 20);
// --- Fin de votre code d'affichage ---
} else {
// Erreur de format: on a reçu un 'Z' mais le message est corrompu
Serial.printf("Erreur format (mRetour): %s\n", mRetour);
afficMsg("Reponse CORROMPUE", true, 10, 20);
// On laisse transmission_ok = false, la boucle va recommencer
}
} else {
// ECHEC: xmit() a eu un TIMEOUT (le 'Z' n'est jamais arrivé)
// (xmit s'occupe déjà d'afficher TIMOUT)
Serial.println(ERACK);
// On laisse transmission_ok = false, la boucle va recommencer
}
retries++; // On passe à l'essai suivant
} // --- FIN DE LA BOUCLE DE RENVOI ---
// 3. Vérification finale
if (!transmission_ok) {
Serial.println("Echec final apres 3 tentatives.");
effaceMsg(false, true); // Efface la ligne du bas
afficMsg("ECHEC COM. FINAL", true, 10, 20); // Affiche l'échec final
}
}
}
break; |
Partager