Paramétrage LoRa REYAX RYLR890, 2ème partie
publication: 18 janvier 2022 / mis à jour 18 janvier 2022
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:
- écrire un code simple avec des mots déjà connus du dictionnaire FORTH de ESP32Forth;
- offre la possibilité de tester vers le terminal tous les mots de paramétrage du transmetteur LoRa
- possibilité de détourner le flux vers un autre périphérique, par exemple I2S ou UART1, sans avoir à réécrire ces définitions de paramétrage...
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.
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