18) Les premières actions du programme complet.

Maintenant que nous avons analysé les diverses options du programme, définir en détail « la sauvegarde du contexte » et présenter finement les premières actions du logiciel, celle déroulées par void setup(), devient possible. La Fig.63 déroule à sa façon les premières actions réalisées par le programme suite à un RESET. Commentons cette représentation simplifiée. La procédure représentée n’est exécutée qu’une seule fois, puis void loop() prend la relève. Comme dans tout programme quel qu’il soit, on commence en (1) par configurer le matériel. (Les E/S, l’afficheur LCD etc.) Puis en  (2) le logiciel se présente, suivi en (3) de l’attente d’un BP pour laisser à l’utilisateur le temps de lire l’écran. Notez que chaque invitation clavier s’accompagne d’un clignotement rapide de la LED verte. En (4) on propose  d’aller consulter l’historique éventuellement sauvegardé en mémoire non volatile. Pour faciliter la vie de l’opérateur, pour chaque questionnement le comportement du programme sera identique : Le bouton UP valide l’option. Bien que l’écran laisse à penser que seul le bouton situé en dessous DOWN veut dire NON, ce sont tous les BP autres que UP qui sont considérés comme des réponses négatives. En (5) on laisse du temps pour lire et décider. Si en (6) la réponse est positive, on passe à un sous-programme en (7) dont la sortie ne peut se faire que par un RESET. Dans le cas contraire, c’est que l’on désire procéder à un mesurage. L’écran propose alors en (8) de reprendre un test qui pour une quelconque raison aurait été suspendu. Si la réponse est OUI le programme vérifie en (11) qu’il y a bien des données en EEPROM. Si ce n’est pas le cas, l’information  (12) est affichée et la LED verte clignote rapidement. Seul un RESET fait sortir de cette situation. S’il y a bien des échantillons en EEPROM, c’est qu’un mesurage a bien été commencé puis suspendu. Dans ce cas les données pertinentes sont restituées en (13) et le programme poursuit en (18). L’opérateur désirant en (8) débuter un nouveau mesurage, le contexte est alors effacé en (10). Le programme ne peut savoir quelle est la valeur de la capacité théorique de la batterie qui va se voir évaluée. Donc en (14) il présente la valeur par défaut que vous aurez défini dans le code source avec la directive :
#define Capacite_indiquee_sur_la_batterie 33.
Puis attente en (15) et analyse de la réponse en (16). Statistiquement vous aurez presque toujours à tester le même candidat, la valeur par défaut vous conviendra. Toutefois, en (17) il sera aisé de changer la valeur. UP et DOWN augmentent ou diminuent la valeur de 10, RIGTH et LEFT  d’une unité, SELECT valide la valeur saisie. La fourchette autorisée est comprise entre 0 et 50Ah, tout débordement provoquera un BIP d’erreur. Enfin, en (18) le programme vous invite à brancher la batterie avec l’attende banale en (19) pour vous laisser lire. Dès que la batterie est branchée elle commence à se décharger. Hors le programme attend un BP pour passer à la boucle de base qui effectue les mesures. Aussi, il vous incite fortement à ne pas traîner sur la ligne du bas. Il aurait été envisageable de ne laisser cet écran que durant trois à quatre secondes puis de passer en mode mesurage. Ce n’est pas possible, car si vous prenez votre temps pour brancher, une tension nulle est détectée et le logiciel l’interprétera comme étant le résultat d’une décharge complète. La représentation de cet organigramme ne respecte pas totalement l’architecture exacte du programme. (Pour obtenir un dessin le plus aéré possible.) Dans la réalité, toutes les actions (10), (14), (15), (16) et (17) sont incluses dans une procédure unique nommée void Efface_le_contexte_et_INIT_BAT(). Dans mes programmes je regroupe souvent des « paquets » d’instructions dans des subroutines pour rendre le logiciel global plus lisible.

Sauvegarder / Restituer le CONTEXTE.

Cité à diverses reprises, CONTEXTE est une notion qui mérite de se voir expliciter pour en saisir le sens exact. Pour faire court, CONTEXTE désigne le nombre minimal de données qui permettent de reprendre une activité qui a été suspendue. Pour minimiser la place occupée par les données qui sont logées en EEPROM, on n’y loge que celles qui sont intrinsèques, c’est à dire qui ne peuvent pas se déduire des autres. Par exemple, il sera inutile d’écrire la valeur du pointeur de mémoire INDEX. En effet, par nature il se trouve juste à la suite du dernier échantillon. Comme le premier échantillon commence à l’adresse zéro, pour rétablir INDEX il suffit globalement de multiplier le nombre des échantillons par quatre. L’instruction exacte est :

INDEX = (4 * NB_echantillons) – 4; // Pointe le début du dernier échantillon.

Cette instruction n’est invoquée qu’après avoir restitué dans NB_echantillons la valeur de la cellule d’adresse 1023. Évidemment il importe de restituer la valeur actuellement mesurée de Capacite, mais vous vous en doutiez. Moins évident, Capacite_theorique doit également être restituée pour que l’affichage analogique du sablier puisse se gérer correctement. Enfin, avant de calculer la valeur  d’INDEX pour qu’il pointe la première cellule libre dans l’historique, il faut avoir cherché le temps qui s’est écoulé depuis le début des mesures effectuées. Cette durée est sauvegardée dans le dernier échantillon de l’historique. Naturellement, la sauvegarde doit inscrire ces mêmes valeurs pertinentes.

Exploiter un historique enregistré en EEPROM.

Mis à part que cette séquence boucle à l’infini, son traitement est assez banal. Comme pour la saisie des caractéristiques d’une batterie, chaque échantillon affiché comme sur la Fig.64 pourra se voir exposé à l’écran LCD, la procédure restant pratiquement identique. UP et DOWN font avancer ou reculer de 10 échantillons, RIGTH et LEFT d’un seul, SELECT pour son compte affiche l’écran de la Fig.65 qui indique la valeur de la capacité mesurée ainsi que le nombre d’échantillons disponibles. Toute tentative d’accéder à des échantillons inférieurs à 1 ou supérieurs au nombre disponible engendrera un BIP d’erreur. Comme tous les BP sont exploités, il n’en reste plus pour sortir de cette subroutine sauf … un petit clic sur RESET !
Encore faut-il qu’un historique soit présent dans l’EEPROM. On peut très bien déclencher un nouveau processus, et le quitter précisément au début, en (19) de la Fig.63 juste avant de valider le branchement de la batterie. Dans ce cas le contexte a été effacé. Le nombre d’échantillons a été remis à 000. Pour nous prévenir qu’il n’y a rien dans l’historique, le message d’erreur de la Fig.66 est affiché avec un BIP d’alerte. Le programme boucle alors sans fin jusqu’à un RESET comme pour toutes les ALERTES.

Utilisation du clavier dans la boucle de base.

Traitée directement dans vood loop() et précisé en (2) sur l’organigramme de la Fig.57 la séquence qui s’occupe du traitement des touches durant un mesurage n’a pas été entièrement détaillée. UP présente l’écran A de la Fig.60 alors que DOWN celui en B. Nous savons que LEFT permet d’alterner entre les informations C et D. Il reste à décrire l’effet des deux autres touches. Le bouton SELECT pour sa part fait alterner entre un écran lumineux et un écran très sombre, c’est alors le mode VEILLE qui permet d’économiser l’écran durant les longues périodes où l’on ne vient pas voir l’appareil. Bien que sombres, les informations restent toutefois visibles. Notez que toute action sur une touche fait immédiatement repasser l’écran en arrière-plan lumineux pour en faciliter la lecture. RIGTH est utilisé comme « bouton potentiellement à risque » car il est placé juste à coté de RESET. Cliquer sur ce dernier fait afficher l’écran de la Fig.67 pour proposer de figer le mesurage en cours. Seule UP validera cette proposition. Les données sont alors sauvegardées. Puis le programme passe à la séquence infinie qui marque la fin d’un mesurage par l’affichage de la Fig.68 déjà mentionnée tout en bas de l’organigramme de la boucle de base vood loop().

La suite est ici.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *