Ligne de code mystère

Forum dédie aux capteurs et gateway mysensors.org
Gilles BILLARD
Messages : 75
Inscription : 09 oct. 2017, 09:34
Localisation : 45km sud Paris

Ligne de code mystère

Message par Gilles BILLARD »

Bonjour,
Ca va paraitre un peu bête, mais en lisant un sketch, je lis une ligne que je comprend, mais dont j'ignore l'origine syntaxique

Code : Tout sélectionner

digitalWrite(RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF);
Ce qui me pose question est de savoir de quel langage et ou je peux trouver l'orthographe officielle du test effectué sur le booléen pour en déduire la sortie relai ?
(le point d'interrogation et le point-virgule, pour etre précis, sont les deux signes qui m'interpellent)
++
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Ligne de code mystère

Message par Keros »

Tu pourrais nous mettre le lien vers le sketch ?
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Gilles BILLARD
Messages : 75
Inscription : 09 oct. 2017, 09:34
Localisation : 45km sud Paris

Re: Ligne de code mystère

Message par Gilles BILLARD »

ici:
https://github.com/mysensors/MySensors/ ... tuator.ino
.. a la fin, dans receive().
PS : Ooops, je m'aperçois que ce sont deux points ":" pas point-virgule
domdom
Messages : 79
Inscription : 20 mai 2016, 10:48
Localisation : Ille-et-Vilaine

Re: Ligne de code mystère

Message par domdom »

Il s'agit de langage C.

A la base, tu as qqch comme :

Code : Tout sélectionner

digitalWrite(numeroDeLaBroche, etatDeLabrocheEnSortie);
avec etatDeLabrocheEnSortie qui vaut 1 (présence d'électricité en sortie) ou 0 (absence).

Suivant comment tu câbles ton relais, il peut être alimenté lorsque la sortie est à 0 ou à 1. Pour éviter d'avoir à t'en souvenir quand tu code, tu vas définir les deux états en leur donnant un nom. Par exemple :

Code : Tout sélectionner

#define  RELAY_OFF   1
#define  RELAY_ON    0
Du coup, dans ton code, tu vas alors écrire, pour alimenter ton relais :

Code : Tout sélectionner

digitalWrite(numeroDeLaBroche, RELAY_ON);
et pour couper son alimentation :

Code : Tout sélectionner

digitalWrite(numeroDeLaBroche, RELAY_OFF);
Imagine maintenant que tu utilises une entrée (par exemple avec un interrupteur) dont l'état pilote le relais.
Tu vas par exemple écrire le code suivante :

Code : Tout sélectionner

if (digitalRead(entree) == 0) {
    digitalWrite(numeroDeLaBroche, RELAY_OFF);
} else {
    digitalWrite(numeroDeLaBroche, RELAY_ON);
}
C'est facile à lire, mais ça prend 5 lignes de code... Du coup, il est possible de remplacer ces 5 lignes par :

Code : Tout sélectionner

digitalWrite(digitalRead(entree) ?RELAY_OFF: RELAY_ON);
C'est exactement pareil, une fois compilé, ça ne doit pas aller plus vite, mais c'est plus compact, plus facile à lire quand on a l'habitude, et moins source de bug lors de la modification du code.

Dans ton code, ce n'est pas l'état d'une entrée qui pilote le relais, mais la valeur d'un booléen transmis dans un message et accessible via l'appel message.getBool().
Ce qui revient donc à faire :

Code : Tout sélectionner

if (message.getBool() == 0) {
    digitalWrite(RELAY_PIN, RELAY_OFF);
} else {
    digitalWrite(RELAY_PIN, RELAY_ON);
}
Si tu veux aller plus loin, tu peux aller consulter ce lien :
https://c.developpez.com/cours/poly-c/? ... 2#LII-B-18
Gilles BILLARD
Messages : 75
Inscription : 09 oct. 2017, 09:34
Localisation : 45km sud Paris

Re: Ligne de code mystère

Message par Gilles BILLARD »

Merci pour tout;
J'avais bien compris le sens de la ligne, mais c'est l'écriture compactée qui m'interrogeait; Avec le lien vers Developpez.com (que je fréquente quand je veux apprendre) j'ai ma réponse---> l'expression conditionnelle que je ne connaissais pas.
Ma question était de la simple curiosité car dans mon sketch, je ne l'utiliserai pas car je dois traiter différemment les deux possibilités.
Répondre