Page 1 sur 1

Ligne de code mystère

Publié : 28 avr. 2021, 17:40
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)
++

Re: Ligne de code mystère

Publié : 28 avr. 2021, 18:07
par Keros
Tu pourrais nous mettre le lien vers le sketch ?

Re: Ligne de code mystère

Publié : 28 avr. 2021, 21:55
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

Re: Ligne de code mystère

Publié : 28 avr. 2021, 22:10
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

Re: Ligne de code mystère

Publié : 28 avr. 2021, 22:38
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.