votre première fonction do_read_ulica()commence comme cela
1 2 3 4 5 6 7 8
| if (millis() - period_ulica < 600000 && period_ulica != 0) // 10 mn
return;
}
if (millis() - t_fn < 1000)
{
return;
} |
donc si period_ulica est non nulle (faudrait commencer par tester cela d'abord au lieu de faire le calcul avec millis, ce serait plus efficace) et qu'il est écoulé moins de 10 minutes la fonction ne fait rien. idem s'il s'est écoulé moins d'une seconde depuis t_fn alors qu'un message peut-être dans le buffer de réception
Ensuite seulement vous testez
if (millis() - period_ulica > 300000) // 5 mn
si 5 minutes se sont écoulées et dans ce cas vous regardez si un message radio est disponible.
la question à se poser c'est à quoi servent tous ces tests puisque la fonction n'indique rien en retour.
Moi je testerais à chaque appel la présence d'un message, si oui je mets à jour une variable temporelle de dernier message reçu. je modifierais aussi la fonction pour qu'elle dise à l'appelant ce qu'il se passe.
Ce serait quelque chose comme cela (tapé à la volée ici donc il y a peut être des fautes, mais c'est le principe)
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
| enum t_etat : byte {MESSAGE_RECU, SIGNAL_PERDU, RIEN_DE_NEUF}; // il faut que l'appelant connaisse aussi cet enum pour connaître les types, donc voir les .h et .cpp si vous ne faites pas des .ino
t_etat do_read_ulica() { //<==== module déporté
const uint32_t dureeMaxSansSignal = 60000ul; // après 10 minutes sans message radio on considère qu'on a perdu le signal
static uint32_t dernierSignal = millis();
t_etat etat = RIEN_DE_NEUF;
byte pipeNo;
// détection du Signal
if ( radio.available(&pipeNo)) {
// traiter le message
// éventuellement en utilisant dernierSignal
// ==> s'il est trop récent ne pas mettre dans le log
...
etat = MESSAGE_RECU;
dernierSignal = millis();
}
// détection de la perte de signal
if (millis() - dernierSignal >= dureeMaxSansSignal) {
etat = SIGNAL_PERDU;
}
// on retourne notre état
return etat;
} |
Partager