Autres articles / Other articles

Gestion rationnelle des fichiers du testeur de batterie

publication: 9 avril 2024 / mis à jour 12 avril 2024

Read this page in english

 

Appel à collaboration

Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.

Partagez-les ici sur ce site.

ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.

Vos montages peuvent aider d'autres développeurs.

Les montages des autres développeurs peuvent vous aider.

Pour proposer un article ou un montage, cliquez ici


Retrouvez l'ensemble des fichiers du projet Testeur de batterie ici:
ESP32forth/__my projects/sensors/B25 Voltage Module

Le nombre et le contenu de ces fichiers est susceptible d'évoluer sans avertissement.

Organisation des fichiers du projet

Reprenons les fichiers du projet tel que décrit dans le précédent article:

📁 ESP32developments
    📁 __sandbox
        📁 B25 VCC Module
            🖹 b25.fs

Il y a quatre fichiers essentiels à rajouter dans le répertoire B25 VCC Module:

📁 ESP32developments
    📁 __sandbox
        📁 B25 VCC Module
            🖹 autoexec.fs
            🖹 config.fs
            🖹 main.fs
            🖹 tests.fs
            🖹 b25.fs

On reprendra quasi systématiquement ces quatre fichiers dans le répertoire de chaque projet.

La méthode d'organisation décrite ici est donnée à titre de conseil. Ce n'est en aucun cas une norme. Cette méthode s'inspire des modèles MVC (en PHP par exemple), de méthode Agile pour la souplesse méthodologique, la modularité du code en langage C...

Vous êtes libre de suivre ces recommandations ou de les adapter et les améliorer pour permettre une programmation plus efficace, avec des codes sources réutilisables pour tous vos autres projets.

Voyons en détail comment remplir chaque fichier. Vous allez rapidement comprendre l'intérêt de cette organisation.

Le fichier autoexec.fs

Vous pouvez reprendre le contenu du fichier autoexec.fs disponible ici.

Si vous n'avez jamais utilisé RECORDFILE, la première opération à effectuer est de copier le code depuis create crlf 13 C, 10 C, jusqu'à la fin de la définition de RECORDFILE. Collez ce code dans le terminal relié à la carte ESP32. Ceci doit compiler le mot RECORDFILE.

Vérifiez la disponibilité de RECORDFILE en tapant words dans la fenêtre de terminal:

--> words
MAIN RECORDFILE crlf FORTH oled timers interrupts telnetd registers
webui login web-interface httpd ok LED OUTPUT INPUT HIGH LOW tone freq 
duty adc pin default-key? default-key default-type visual set-title... 

Si le mot RECORDFILE s'affiche en début du dictionnaire, l'opération suivante consiste à copier, depuis le PC, le contenu du fichier autoexec.fs et le coller à nouveau dans la fenêtre du terminal.

Cette fois-ci, toute la partie de code située entre RECORDFILE et <EOF> sera enregistrée dans le fichier autoexec.fs du système de fichiers SPIFFS de la carte ESP32.

Vérifions le contenu du fichier autoexec.fs entregistré sur la carte ESP32:

--> cat /spiffs/autoexec.fs
create crlf 13 C, 10 C,
: RECORDFILE  ( "filename" "filecontents" "<EOF>" -- )
    bl parse
    W/O CREATE-FILE throw >R
    BEGIN
.....[removed code].....
internals 120 to line-width
forth
 ok

Redémarrez la carte ESP32. ESP32forth est programmé pour charger automatiquement le contenu du fichier

autoexec.fs

au démarrage. Tapez words pour vérifier la présence des mots MAIN RECORDFILE crlf.

On va maintenant s'intéresser à la définition du mot MAIN définit en fin de fichier autoexec.fs:

: MAIN 
    s" /spiffs/main.fs"       included 
  ; 

Si on exécute le mot MAIN, il va tenter de charger le contenu du fichier main.fs.

Le fichier main.fs

Ce fichier est le squelette du projet. En l'état des fichiers décrits précédemment, voici son contenu:

RECORDFILE /spiffs/main.fs 
DEFINED? --b25 [if] forget --b25  [then] 
create --b25 
 
s" /spiffs/b25.fs"              included 
s" /spiffs/config.fs"           included 
 
s" /spiffs/tests.fs"            included 
<EOF> 

Copiez ce contenu, depuis RECORDFILE jusqu'à <EOF> inclus. Collez ce contenu dans le terminal. Cette action va enregistrer un fichier main.fs dans le système de fichiers SPIFFS de la carte ESP32.

Vérifions la bonne présence de ces fichiers en exécutant ls:

--> ls /spiffs/
autoexec.fs
main.fs
 ok

Vous pouvez remarquer que le fichier config.fs est chargé après b25.fs. C'est contre-intuitif, mais la configuration globale de certains paramètres sera exécutée après chargement de tous les autres fichiers applicatifs.

Le fichier main.fs ne doit contenir que des appels aux fichiers applicatifs, puis de configuration et enfin de tests.

Le fichier config.fs

Revenons sur le code écrit dans b25.fs:

02 value B25_NUM_1 
03 value B25_NUM_2
 
\ init GPIOs used by B25 modules 
: B25.init ( -- ) 
    B25_NUM_1 INPUT pinmode 
    B25_NUM_2 INPUT pinmode 
  ;

Ici, en rouge, on a prédéfini les deux ports GPIO utilisés par nos modules B25. On va réécrire ce code comme ceci:

\ set GPIOs used by B25 modules, values set in config.fs 
0 value B25_NUM_1 
0 value B25_NUM_2 
 
\ init GPIOs used by B25 modules 
: B25.init ( -- ) 
    B25_NUM_1 INPUT pinmode 
    B25_NUM_2 INPUT pinmode 
  ; 

Puis on définit le paramétrage des valeurs B25_NUM1 et B25_NUM2 dans le fichier config.fs ainsi:

\ *** set parameters for B25 modules *** file b25.fs ****************** 
 
\ set GPIOs used by B25 modules 
DEFINED? B25_NUM_1 [IF]  
    4 to B25_NUM_1          \ GPIO 4 to first B25 module 
[THEN] 
DEFINED? B25_NUM_2 [IF]  
    3 to B25_NUM_2          \ GPIO 3 to second B25 module 
[THEN] 

Cette manière de procéder peut sembler lourde. Mais l'intérêt est de permettre une adaptation rapide du code FORTH sans avoir à modifier le code des fichiers applicatifs.

J'ai écrit mon code pour la carte ESP32-C3-Zero-M. Sur une autre carte ESP32, l'utilisation de ces ports peut ne pas vous convenir. Si vous cablez les modules sur les ports GPIO 17 et 18 par exemple, vous n'aurez que deux lignes de code à modifier dans config.fs.

En l'état, l'alourdissement de notre code FORTH n'est pas nécessaire. Mais ça devient intéressant quand on commence à avoir beaucoup de fichiers applicatifs, ce qui va rapidement arriver à notre projet si on veut gérer un affichage texte sur écran OLED, déclencher un buzzer...

Le fichier tests.fs

C'est le dernier fichier chargé par main.fs.

Il ne doit contenir que des des tests unitaires, des essais de portion de code.

Pour ma part, j'ai rajouté un ingrédient, un fichier assert.fs, qui ne sera chargé que par tests.fs.

Le fichier assert.fs contient les définitions permettant d'effectuer des tests unitaires.

RECORDFILE /spiffs/tests.fs 
 
\ *** UNIT TESTS ********************* 
s" /spiffs/assert.fs"         included 
 
\ test B25 GPIOs correctly initialized 
assert( B25_NUM_1 4 = ) 
assert( B25_NUM_2 3 = )  
 
<EOF> 

Si le test est réussi, assert( n'émet aucun message. Dans le cas contraire, il génère une erreur. Exemple:

assert( 3 4 = )     \ send error message 
assert( 2 10 < )    \ send no error 

L'intérêt des tests unitaire permet de contrôler le comportement de définitions sensibles. Si vous êtes amené à améliorer une définition, assert( détectera toute altération des résultats.

Notre fichier tests.fs permet aussi de tester l'application. Prenons un peu d'avance sur les prochains articles, voici comment j'exécute le test du projet depuis tests.fs:

buzzer.init 
B25.init 
wire.init 
Oled128x32Init 

Evidemment, à un certain stade de développement, l'appel de ces mots sera intégré à l'application définitive. Quand on en sera à cette étape, on pourra débrancher l'appel à tests.fs.


Legal: site web personnel sans commerce / personal site without seling