Autres articles / Other articles

Paramétrage LoRa REYAX RYLR890, 2ème partie

publication: 18 janvier 2022 / mis à jour 18 janvier 2022

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


 

Listing complet: Setting up the REYAX RYLR890 LoRa transmitter

Vectorisation des émissions de caractères

Si vous avez suivi jusque là le développement de nos mots permettant de paramétrer le transmetteur LoRa REYAX RYLR890, quelque chose vous a certainement surpris:

\ Set the ADDRESS of LoRa transmitter:
\  s" <adress>" value in interval [0..65535][?] (default 0)
: ATaddress ( addr len -- )
    ." AT+ADDRESS="
    type  crlf
  ;

Car, sauf erreur, cette séquence ." AT+ADDRESS=" envoie la chaîne de caractères vers notre terminal, et non pas vers le transmetteur UART2, donc vers le transmetteur LoRa!

On comprend votre surprise. Et nous allons voir comment détourner le flux de caractères vers le transmetteur LoRa sans rien changer à la définition de notre mot ATaddress.

Comprendre la vectorisation en FORTH

Le langage FORTH dispose de certains atouts totalement inexistants dans bien d'autres langages de programmation. Parmi ces atouts, citons le mot defer. Ce mot permet de créer un mot dont l'action est différée:

defer myWords 

defer crée un mot myWords qui ne fait RIEN!!!

Oui!

C'est à nous maintenant de lui donner une action. Voyons cette définition:

: (myWords) ( -- ) 
    cr ." I display my words: " 
  ; 

Pour que myWords exécute (myWords) on récupère le code d'action de (myWords) et l'affecter à myWords:

' (myWords) is myWords 

A partir de maintenant, si on tape myWords, c'est l'action définie dans (myWords) qui sera exécutée.

OK.

Mais là, est-ce nécessaire de faire une telle surcharge de code si on peut simplement exécuter (myWords)?

Et vous avez parfaitement raison de poser cette question. Mais on peut changer l'action de myWords:

' vlist is myWords 

Maintenant, si on tape myWords, c'est le mot vlist qui s'exécute.

Nous allons voir comment utiliser ce mécanisme pour modifier le comportment de ESP32Forth...

La vectorisation dans ESP32Forth

Commençons par un peu d'ingénie inverse. En fouillant le code de ESP32Forth, on trouve ceci pour le mot .":

: ."
    postpone s" state @ if postpone type else type then ; immediate

Ici, le mot qui nous intéresse est type dont la définition est:

defer type

Ahhhh.....

Commencez-vous à comprendre?

Quelle action exécute type? On trouve ceci dans le code source de ESP32Forth:

: serial-type ( a n -- ) Serial.write drop ; 
: default-type serial-type ; 
 
' default-type is type 

Si on s'intéresse au mot emit, on trouve cette définition dans le code source de ESP32Forth:

: emit ( n -- ) 
    >r rp@ 1 type rdrop ; 

Là encore, on retrouve type.

C'est donc sur ce mot type que nous allons agir pour détourner l'émission de caratères vers le port série UART2.

Vectoriser type vers le port série UART2

C'est en regardant la définition de serial-type que nous définissons notre version pour transmettre vers le posrt série UART2:

: serial2-type ( a n -- )  
    Serial2.write drop ; 

Ça va jusque là?

C'est pas trop difficile?

OK.

Donc, maintenant, pour détourner le flux d'émission des caractères de ESP32Forth vers le port série UART2, il suffit d'exécuter la séquence ' serial2-type is type.

Sauf que si vous faites ça, vous aurez un peu de mar à revenir à un comportement normal de ESP32Forth sauf à restituer à type son action initiale avec la séquence ' default-type is type.

Encapsulons ces séquences dans ces deux mots:

: typeToLoRa ( -- ) 
    ['] serial2-type is type 
  ; 
 
: typeToTerm ( -- ) 
    ['] default-type is type 
  ; 

Et maintenant, pour exécuter notre mot ATaddress en lui faisant transmettre les caractères vers le port série UART2, il suffit de taper:

typeToLoRa  
s" 45" ATaddress   \ send AT+ADDRESS=45  to UART2 
typeToTerm 

Et là, j'attend votre remarque: mais quel intérêt de passer par la vectorisation?

Dans notre cas, la vectorisation offre beaucoup d'avantages:

Indépendamment de notre gestion des paramètres du transmetteur LoRa, on comprend qu'il suffit d'exploiter ce même mécanisme de vectorisation pour les caractères reçus depuis le port série UART2 pour prendre facilement le contrôle de ESP32Forth depuis ce port série!

C'est d'ailleurs ce que fait ESP32Forth si on active le port WiFi ou Bluetooth! Je vous invite à explorer le code source de ESP32Forth. Regardez la définition de server:

: server ( port -- ) 
   server 
   ['] serve-key is key 
   ['] serve-type is type 
   webserver-task start-task 
; 

Conclusion

Pour comprendre le mécanisme d'un mot défini par defer, pensez aux aiguillages des trains. Le mot défini par defer c'est l'aiguillage.

Aiguillage de train

Ce mécanisme d'exécution différe de mots n'existe pas dans la plupart des autres langages de programmation. En langage C, on peut définir des prototypes dont le comportement définitif est indiqué dans les librairies rattachées. Mais en C on ne peut pas changer le comportement d'une fonction prototype une fois le programme compilé. En FORTH on peut agir non seulement sur notre programme, mais n'importe quelle nouvelle définition peut agir sur les définitions du noyau FORTH pour tous les mots définis par defer.


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