Décodeur pour signaux SNCF à base d'Arduino

Toutes les discussions sur l'Arduino !

Modérateur : MOD

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par jlb » mar. 16 déc. 2014, 15:11

Il ne trouve pas TinyWireS.h

Je viens de regarder comment les bibliothèques incluent les .h, qu'ils soient dans le même répertoire ou issus d'une autre bibliothèque

C'est :

Code : Tout sélectionner

#include "fichier.h"
et pas

Code : Tout sélectionner

#include <fichier.h>
Remplace les < > par des " "

et met defined ()

Avatar du membre
Arduino
Prolixe
Messages : 1699
Enregistré le : mer. 25 sept. 2013, 17:14

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par Arduino » mar. 16 déc. 2014, 17:17

Si j'ai bien compris le cours sur les microcontrôleurs de Coursera, on utilise les guillemets "fichier.h" pour une bibliothèque qui se trouve dans le même répertoire que le programme .ino (donc une bibliothèque perso par exemple) et on utilise les crochets <fichier.h> pour une bibliothèque qui se trouve dans le répertoire libraries.

Est-ce que je me trompe ?

macsddau
Papotier
Messages : 114
Enregistré le : jeu. 17 oct. 2013, 22:46
Echelle pratiquée : N

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par macsddau » mar. 16 déc. 2014, 17:58

Arduino a écrit :Si j'ai bien compris le cours sur les microcontrôleurs de Coursera, on utilise les guillemets "fichier.h" pour une bibliothèque qui se trouve dans le même répertoire que le programme .ino (donc une bibliothèque perso par exemple) et on utilise les crochets <fichier.h> pour une bibliothèque qui se trouve dans le répertoire libraries.

Est-ce que je me trompe ?
Ayant suivi le même cours que toi, il me semble aussi que ce soit le cas. Mais comme je le découvre peu à peu il y a beaucoup de bizarreries dans Arduino. Je n'ai donc plus aucune certitude.
MS2 CC2 S-DEC-4-DC Rocrail

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par jlb » mar. 16 déc. 2014, 18:07

Ça c'est l'histoire courte.
Voici l'histoire longue

Les includes avec < > sont en dur dans la chaine de compilation et ne concerne que les libs. D'après ce que je comprends de la manière dont c'est fait dans l'Arduino, je pense que ça ne concerne que les libs dont les headers sont dans hardware/tools/avr/avr/include mais je n'en suis pas sûr

Les includes avec " " sont des includes « utilisateur » et comprennent également les libs Arduino qui sont à la fois dans le libraries qui est dans Documents et dans le libraries qui est dans hardware/arduino/avr. Les emplacements cherchés sont déterminés par le répertoire courant et les chemin donnés par l'option -I au compilateur (transmis au préprocesseur C).

Les includes des sketchs avec < > sont traités par le pré-processeur spécifique aux sketch pour détecter les libs utilisées et les compiler et de faire l'édition de liens.

Dans les préférences de l'IDE, cochez « activer les résultats détaillés pendant la compilation » pour voir ce qui est fait sous le capot. Pas de panique, c'est très verbeux.

macsddau
Papotier
Messages : 114
Enregistré le : jeu. 17 oct. 2013, 22:46
Echelle pratiquée : N

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par macsddau » jeu. 18 déc. 2014, 07:31

J'ai oublié les deux résistance en pullup sur la liaison i2c. C'est corrigé.
Image
Image
Fichiers joints
Signal I2C maître Arduino_bb.png
Signla SPI Arduino as ISP_bb.png
MS2 CC2 S-DEC-4-DC Rocrail

macsddau
Papotier
Messages : 114
Enregistré le : jeu. 17 oct. 2013, 22:46
Echelle pratiquée : N

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par macsddau » jeu. 18 déc. 2014, 17:43

Une question sur les pointeurs.

J'ai défini dans mon programme principal une variable (un tableau) locale. Je transmet le pointeur de cette variable à une fonction via les paramètres. Est-il possible de modifier le contenu de la variable pointée dans la fonction ?
MS2 CC2 S-DEC-4-DC Rocrail

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par jlb » jeu. 18 déc. 2014, 17:49

Oui

macsddau
Papotier
Messages : 114
Enregistré le : jeu. 17 oct. 2013, 22:46
Echelle pratiquée : N

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par macsddau » jeu. 18 déc. 2014, 18:09

jlb a écrit :Oui
Alors comment ce fait-il que ceci ne fonctionne pas.
mon programme d'exemple : Signal.ino

Code : Tout sélectionner

#include <Signal.h>
#include <avr/pgmspace.h>

#define FEU_OE  0
#define FEU_A   1
#define FEU_S   2
#define FEU_VL  3
#define FEU_M   4
#define FEU_C   5
#define FEU_R   6
#define FEU_RR  7
#define NOMBRE_FEUX  8 // 8 maximum

const prog_uchar PIN_FEU[] = {
  4,  // OE
  5,  // A
  6,  // S
  7,  // VL
  8,  // M
  9,  // C
  10, // R
  11  // RR
};

#define MOTIF_A   0
#define MOTIF_S   1
#define MOTIF_VL  2
#define MOTIF_CR  3
#define MOTIF_PA  4
#define MOTIF_DR  5
#define MOTIF_M   6
#define MOTIF_CV  7
#define MOTIF_R   8
#define MOTIF_RR  9
#define NOMBRE_MOTIFS  10

const prog_uchar MOTIF[] = {
  (1 << FEU_OE) | (1 << FEU_A),  // A
  (1 << FEU_OE) | (1 << FEU_S),  // S
  (1 << FEU_OE) | (1 << FEU_VL), // VL
  (1 << FEU_S)  | (1 << FEU_C),  // CR
  (1 << FEU_A)  | (1 << FEU_VL), // PA
  (1 << FEU_C),                  // DR
  (1 << FEU_M),                  // M
  (1 << FEU_C),                  // CV
  (1 << FEU_R),                  // R
  (1 << FEU_RR)                  // RR
};

const prog_uchar GROUPE_MOTIF[] = {
  SIGNAL_GROUPE_BAS,  // A
  SIGNAL_GROUPE_BAS,  // S
  SIGNAL_GROUPE_BAS,  // VL
  SIGNAL_GROUPE_BAS,  // C
  SIGNAL_GROUPE_BAS,  // PA
  SIGNAL_GROUPE_BAS,  // DR
  SIGNAL_GROUPE_BAS,  // M
  SIGNAL_GROUPE_BAS,  // CV
  SIGNAL_GROUPE_HAUT, // R
  SIGNAL_GROUPE_HAUT  // RR
};

const prog_uchar MOTIF_PEUT_CLIGNOTTER [] = {
  SIGNAL_AUTORISER_CLIGNOTTEMENT,  // A
  SIGNAL_AUTORISER_CLIGNOTTEMENT,  // S
  SIGNAL_AUTORISER_CLIGNOTTEMENT,  // VL
  SIGNAL_REFUSER_CLIGNOTTEMENT,    // CR
  SIGNAL_REFUSER_CLIGNOTTEMENT,    // PA
  SIGNAL_REFUSER_CLIGNOTTEMENT,    // DR
  SIGNAL_AUTORISER_CLIGNOTTEMENT,  // M
  SIGNAL_REFUSER_CLIGNOTTEMENT,    // CV
  SIGNAL_AUTORISER_CLIGNOTTEMENT,  // R
  SIGNAL_AUTORISER_CLIGNOTTEMENT   // RR
};

motif_t motif[NOMBRE_MOTIFS];

void setup() { 
  Serial.begin(9600);
  
  for (unsigned char m = 0; m < NOMBRE_MOTIFS; m++) {
    motif[m].motif  = MOTIF[m];
    motif[m].groupe = GROUPE_MOTIF[m];
    motif[m].statut = MOTIF_PEUT_CLIGNOTTER[m];
  }
  
  Signal.definir((unsigned char*)&PIN_FEU[0], 
                 NOMBRE_FEUX, 
                 &motif[0], 
                 NOMBRE_MOTIFS);
}

void loop() {
  for (unsigned char m = 0; m < NOMBRE_MOTIFS; m++) {
    Serial.print("motif[");
    Serial.print(m, DEC);
    Serial.println("]");
    Serial.println("ouvrir ...");
    Signal.ouvrir(m, SIGNAL_FERMER_CLIGNOTTANT);
    
    for (unsigned char i = 0; i < 20; i++) {
      Signal.afficher();
      delay(1000);
    }
    
    Serial.println("... faire clignotter ...");
    Signal.ouvrir(m, SIGNAL_OUVRIR_CLIGNOTTANT);
    
    for (unsigned char i = 0; i < 20; i++) {
      Signal.afficher();
      delay(1000);
    }
    
    Serial.println("... fermer");
    Signal.fermer(m);
    
    for (unsigned char i = 0; i < 20; i++) {
      Signal.afficher();
      delay(1000);
    }
  }   
}
la libraire : Signal.h

Code : Tout sélectionner

//
//  Signal.h
//  
//
//  Created by macsddau on 17/12/14.
//
//

#ifndef _Signal_h
#define _Signal_h

#define SIGNAL_GROUPE_BAS   0x01
#define SIGNAL_GROUPE_HAUT  0x02

#define SIGNAL_BIT_STATUT_CLIGNOTTEMENT_AUTORISE    0
#define SIGNAL_BIT_STATUT_MOTIF_VISIBLE             1
#define SIGNAL_BIT_STATUT_MOTIF_CLIGNOTTE           2

#define SIGNAL_AUTORISER_CLIGNOTTEMENT  (1 << SIGNAL_BIT_STATUT_CLIGNOTTEMENT_AUTORISE)
#define SIGNAL_REFUSER_CLIGNOTTEMENT    (0 << SIGNAL_BIT_STATUT_CLIGNOTTEMENT_AUTORISE)

#define SIGNAL_OUVRIR_CLIGNOTTANT     1
#define SIGNAL_FERMER_CLIGNOTTANT     0

#ifndef ARDUINO_DEBUG_SERIAL
#define ARDUINO_DEBUG_SERIAL 1
#endif

typedef struct {
    unsigned char motif;
    unsigned char groupe;
    unsigned char statut;
} motif_t;
typedef motif_t* pmotif_t;

class SIGNAL_c {
private:
    unsigned char*  ppinFeu;
    unsigned char   nombrefeux;
    pmotif_t        pmotif;
    unsigned char   nombreMotifs;
    
public:
    SIGNAL_c();
    void definir(unsigned char*, unsigned char, pmotif_t, unsigned char);
    void ouvrir(unsigned char, unsigned char);
    void fermer(unsigned char);
    void afficher(void);
};

extern SIGNAL_c Signal;

#endif
et Signal.cpp

Code : Tout sélectionner

//
//  Signal.cpp
//  
//
//  Created by macsddau on 17/12/14.
//
//

#include "Arduino.h"
#include "Signal.h"

#define SIGNAL_MOTIF(m)     ((motif_t)(*(pmotif + m)))
#define SIGNAL_PIN_FEU(f)   ((unsigned char)(*(ppinFeu + f)))

#define SIGNAL_STATUT_MOTIF_PEUT_CLIGNOTTER     (1 << SIGNAL_BIT_STATUT_CLIGNOTTEMENT_AUTORISE)
#define SIGNAL_STATUT_MOTIF_VISIBLE             (1 << SIGNAL_BIT_STATUT_MOTIF_VISIBLE)
#define SIGNAL_STATUT_MOTIF_CLIGNOTTE           (1 << SIGNAL_BIT_STATUT_MOTIF_CLIGNOTTE)

SIGNAL_c::SIGNAL_c() {
}

void SIGNAL_c::definir(unsigned char*   pfx,
                       unsigned char    nf,
                       pmotif_t         pmot,
                       unsigned char    nm) {
    ppinFeu         = pfx;
    nombrefeux      = nf;
    pmotif          = pmot;
    nombreMotifs    = nm;
    
    for (unsigned char f = 0; f < nombrefeux; f++) {
        pinMode(SIGNAL_PIN_FEU(f), OUTPUT);
        digitalWrite(SIGNAL_PIN_FEU(f), LOW);
        delay(100); // chenillard
    }

#if (ARDUINO_DEBUG_SERIAL)
    for (unsigned char m = 0; m < nombreMotifs; m++) {
        Serial.print("SIGNAL_c::definir\tmotif[");
        Serial.print(m, DEC);
        Serial.print("] @ 0x");
        Serial.print((unsigned int)(pmotif + m), HEX);
        Serial.print(" : motif = 0x");
        Serial.print(SIGNAL_MOTIF(m).motif, HEX);
        Serial.print("\tgroupe = 0x");
        Serial.print(SIGNAL_MOTIF(m).groupe, HEX);
        Serial.print("\tstatut = 0b");
        Serial.println(SIGNAL_MOTIF(m).statut, BIN);
    }
}
#endif

void SIGNAL_c::ouvrir(unsigned char mot, unsigned char clg) {
    // fermer les motifs du même groupe
    for (unsigned char m = 0; m < nombreMotifs; m++) {
        if (SIGNAL_MOTIF(m).groupe & SIGNAL_MOTIF(mot).groupe) {
            fermer(m);
        }
    }
    
    // ouvrir le motif
    SIGNAL_MOTIF(mot).statut |= SIGNAL_STATUT_MOTIF_VISIBLE;
    
    // définir le clignottement si il est autorisé
    if (clg && (SIGNAL_MOTIF(mot).statut & SIGNAL_STATUT_MOTIF_PEUT_CLIGNOTTER)) {
        SIGNAL_MOTIF(mot).statut |= SIGNAL_STATUT_MOTIF_CLIGNOTTE;
    } else {
        SIGNAL_MOTIF(mot).statut &= ~SIGNAL_STATUT_MOTIF_CLIGNOTTE;
    }
    
#if (ARDUINO_DEBUG_SERIAL)
    Serial.print("SIGNAL_c::ouvrir\tmotif[");
    Serial.print(mot, DEC);
    Serial.print("].statut = 0b");
    Serial.println(SIGNAL_MOTIF(mot).statut, BIN);
#endif
}

void SIGNAL_c::fermer(unsigned char mot) {
    // fermer le motif
    SIGNAL_MOTIF(mot).statut &= ~SIGNAL_STATUT_MOTIF_VISIBLE;

#if (ARDUINO_DEBUG_SERIAL)
    Serial.print("SIGNAL_c::fermer\tmotif[");
    Serial.print(mot, DEC);
    Serial.print("].statut = 0b");
    Serial.println(SIGNAL_MOTIF(mot).statut, BIN);
#endif
}

void SIGNAL_c::afficher(void) {
    // éteindre tout les feux
    unsigned char feux = 0x00;
    
    // combiner les motif
    for (unsigned char m = 0; m < nombreMotifs; m++) {
        if (SIGNAL_MOTIF(m).statut & SIGNAL_STATUT_MOTIF_VISIBLE) {
            if (SIGNAL_MOTIF(m).statut & SIGNAL_STATUT_MOTIF_CLIGNOTTE) {
                // inverser le feu
                feux ^= SIGNAL_MOTIF(m).motif;
            } else {
                // allumer le feu
                feux |= SIGNAL_MOTIF(m).motif;
            }
        }
    }
    
    // afficher
    for (unsigned char f = 0; f < nombrefeux; f++) {
        digitalWrite(SIGNAL_PIN_FEU(f), feux & (1 << f) ? LOW : HIGH);
    }
}

SIGNAL_c Signal = SIGNAL_c();
ATTENTION ! la librairie n'est pas encore aboutie. Il s'agit d'une version de développement.

La trace fournie sur la console, montre aucun changement de la variable statut dans les fonctions "ouvrir" et "fermer". Par conséquent la fonction "afficher" n'affiche rien.
MS2 CC2 S-DEC-4-DC Rocrail

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par jlb » jeu. 18 déc. 2014, 19:41

À froid comme ça je ne peux pas dire. Mais ça ne vient sans doute pas du pointeur.

Tu peux facilement vérifier l'égalité des deux pointeurs en affichant l'adresse pointée par le premier :

Serial.print((unsigned int)motif,HEX);

dans ton setup(). Puis afficher le pointeur situé dans ta classe dans chacune des méthodes ouvrir, fermer et afficher :

Serial.print((unsigned int)pmotif,HEX);

Si ils sont égaux le bug est ailleurs => test unitaire

Ensuite, je ne comprends pas d'où peut venir ce goût immodéré pour les macros.
Définir :

#define SIGNAL_MOTIF(m) ((motif_t)(*(pmotif + m)))

et

#define SIGNAL_PIN_FEU(f) ((unsigned char)(*(ppinFeu + f)))

me semble excessif. En effet, ((motif_t)(*(pmotif + m))) est équivalent à pmotif[m] et ((unsigned char)(*(ppinFeu + f))) est équivalent à ppinfeu[f]

Adopter ces écritures sans utiliser de macro permet de gagner en clarté.

La variable qui nomme un tableau, motif, sans [] est un pointeur constant sur l'élément 0, &motif[0] est donc équivalement à motif.

Je relève toutefois un bug ici :

digitalWrite(SIGNAL_PIN_FEU(f), feux & (1 << f) ? LOW : HIGH);

f va de 0 à 9 dans la boucle englobante. Par conséquent 1 << 8 puis 1 << 9 sont des masques qui tombent en dehors de feux qui est sur 8 bits.

macsddau
Papotier
Messages : 114
Enregistré le : jeu. 17 oct. 2013, 22:46
Echelle pratiquée : N

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par macsddau » jeu. 18 déc. 2014, 20:39

jlb a écrit :À froid comme ça je ne peux pas dire. Mais ça ne vient sans doute pas du pointeur.

Tu peux facilement vérifier l'égalité des deux pointeurs en affichant l'adresse pointée par le premier :

Serial.print((unsigned int)motif,HEX);

dans ton setup(). Puis afficher le pointeur situé dans ta classe dans chacune des méthodes ouvrir, fermer et afficher :

Serial.print((unsigned int)pmotif,HEX);

Si ils sont égaux le bug est ailleurs => test unitaire
C'est ce que j'ai déjà fait. Les pointeurs sont bien égaux.
jlb a écrit :Ensuite, je ne comprends pas d'où peut venir ce goût immodéré pour les macros.
Etant donné que j'utilise plusieurs fois les formules suivantes il me paraissait plus simple de les définir dans des macros.
job a écrit :Définir :

#define SIGNAL_MOTIF(m) ((motif_t)(*(pmotif + m)))

et

#define SIGNAL_PIN_FEU(f) ((unsigned char)(*(ppinFeu + f)))

me semble excessif. En effet, ((motif_t)(*(pmotif + m))) est équivalent à pmotif[m] et ((unsigned char)(*(ppinFeu + f))) est équivalent à ppinfeu[f]

Adopter ces écritures sans utiliser de macro permet de gagner en clarté.
La variable qui nomme un tableau, motif, sans [] est un pointeur constant sur l'élément 0, &motif[0] est donc équivalement à motif.
Dans le setup je passe le pointeur du premier élément à ma bibliothèque &pinFeu[0], &motif[0]. dans définir j'enregistre ces pointeurs dans les variable privée de la classe ppinFeu = pfx; pmotif = pmot;.
Si j'utilise motif[m], le programme ne va-t-il pas aller chercher le "miène" élément de la table pmotif (qui n'existe pas puisque pmotif n'est pas une table) et qui serai du type pmotif_t et non motif_t ?
si j'utilise *(pmotif[m]).statut, vais-je obtenir le résultat souhaité ?
Il va me falloir relire mes bouquins (pour les nuls !) traitant des sujets tableaux et pointeurs.
job a écrit :Je relève toutefois un bug ici :
digitalWrite(SIGNAL_PIN_FEU(f), feux & (1 << f) ? LOW : HIGH);
f va de 0 à 9 dans la boucle englobante. Par conséquent 1 << 8 puis 1 << 9 sont des masques qui tombent en dehors de feux qui est sur 8 bits.
la boucle est la suivante :

Code : Tout sélectionner

for (unsigned char f = 0; f < nombrefeux; f++) {
nombreFeux = 8. Je parcours bien de 0 à 7. Dans le premier membre du digitalWrite la "macro" :wink: doit me retourner le "fième" élément de la table définie dans le programme principal qui ne comporte que 8 éléments. Dans le deuxième membre, le décalage à gauche est incrémenté de 0 à 7 (taille de l'octet). Il y a donc bien correspondance entre les deux membres de la fonction. Je ne pense pas avoir fait d'erreur dans cette partie du programme.

Je me replonge dans mon bouquin jaune…

A suivre...
MS2 CC2 S-DEC-4-DC Rocrail

macsddau
Papotier
Messages : 114
Enregistré le : jeu. 17 oct. 2013, 22:46
Echelle pratiquée : N

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par macsddau » jeu. 18 déc. 2014, 20:50

Autre élément en faveur de mes macros :
Dans la fonction ouvrir

Code : Tout sélectionner

    for (unsigned char m = 0; m < nombreMotifs; m++) {
        if (SIGNAL_MOTIF(m).groupe & SIGNAL_MOTIF(mot).groupe) {
            fermer(m);
        }
    }

Fonctionne parfaitement puisque la trace sur le terminal me montre bien que seuls les motifs du même groupe sont impactés.
Par contre dans la même fonction

Code : Tout sélectionner

    if (clg && (SIGNAL_MOTIF(mot).statut & SIGNAL_STATUT_MOTIF_PEUT_CLIGNOTTER)) {
        SIGNAL_MOTIF(mot).statut |= SIGNAL_STATUT_MOTIF_CLIGNOTTE;
    } else {
        SIGNAL_MOTIF(mot).statut &= ~SIGNAL_STATUT_MOTIF_CLIGNOTTE;
    }
rien ne se passe. Cela vient peut-être de la condition du if. Je creuse...
MS2 CC2 S-DEC-4-DC Rocrail

macsddau
Papotier
Messages : 114
Enregistré le : jeu. 17 oct. 2013, 22:46
Echelle pratiquée : N

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par macsddau » jeu. 18 déc. 2014, 21:12

les macros ont été modifiée comme suit :

Code : Tout sélectionner

#define SIGNAL_MOTIF(m)     (*(pmotif + m))
#define SIGNAL_PIN_FEU(f)   (*(ppinFeu + f))
Ca fonctionne. En voici la trace

Code : Tout sélectionner

SIGNAL_c::definir	motif[0] @ 0x1F4 : motif = 0x3	groupe = 0x1	statut = 0b1
SIGNAL_c::definir	motif[1] @ 0x1F7 : motif = 0x5	groupe = 0x1	statut = 0b1
SIGNAL_c::definir	motif[2] @ 0x1FA : motif = 0x9	groupe = 0x1	statut = 0b1
SIGNAL_c::definir	motif[3] @ 0x1FD : motif = 0x24	groupe = 0x1	statut = 0b0
SIGNAL_c::definir	motif[4] @ 0x200 : motif = 0xA	groupe = 0x1	statut = 0b0
SIGNAL_c::definir	motif[5] @ 0x203 : motif = 0x20	groupe = 0x1	statut = 0b0
SIGNAL_c::definir	motif[6] @ 0x206 : motif = 0x10	groupe = 0x1	statut = 0b1
SIGNAL_c::definir	motif[7] @ 0x209 : motif = 0x20	groupe = 0x1	statut = 0b0
SIGNAL_c::definir	motif[8] @ 0x20C : motif = 0x40	groupe = 0x2	statut = 0b1
SIGNAL_c::definir	motif[9] @ 0x20F : motif = 0x80	groupe = 0x2	statut = 0b1
motif[0]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b1
SIGNAL_c::fermer	motif[1].statut = 0b1
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[0].statut = 0b11
... faire clignotter ...
SIGNAL_c::fermer	motif[0].statut = 0b1
SIGNAL_c::fermer	motif[1].statut = 0b1
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[0].statut = 0b111
... fermer
SIGNAL_c::fermer	motif[0].statut = 0b101
motif[1]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b1
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[1].statut = 0b11
... faire clignotter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b1
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[1].statut = 0b111
... fermer
SIGNAL_c::fermer	motif[1].statut = 0b101
motif[2]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[2].statut = 0b11
... faire clignotter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[2].statut = 0b111
... fermer
SIGNAL_c::fermer	motif[2].statut = 0b101
motif[3]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[3].statut = 0b10
... faire clignotter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[3].statut = 0b10
... fermer
SIGNAL_c::fermer	motif[3].statut = 0b0
motif[4]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[4].statut = 0b10
... faire clignotter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[4].statut = 0b10
... fermer
SIGNAL_c::fermer	motif[4].statut = 0b0
motif[5]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[5].statut = 0b10
... faire clignotter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[5].statut = 0b10
... fermer
SIGNAL_c::fermer	motif[5].statut = 0b0
motif[6]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[6].statut = 0b11
... faire clignotter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[6].statut = 0b111
... fermer
SIGNAL_c::fermer	motif[6].statut = 0b101
motif[7]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b101
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[7].statut = 0b10
... faire clignotter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b101
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[7].statut = 0b10
... fermer
SIGNAL_c::fermer	motif[7].statut = 0b0
motif[8]
ouvrir ...
SIGNAL_c::fermer	motif[8].statut = 0b1
SIGNAL_c::fermer	motif[9].statut = 0b1
SIGNAL_c::ouvrir	motif[8].statut = 0b11
... faire clignotter ...
SIGNAL_c::fermer	motif[8].statut = 0b1
SIGNAL_c::fermer	motif[9].statut = 0b1
SIGNAL_c::ouvrir	motif[8].statut = 0b111
... fermer
SIGNAL_c::fermer	motif[8].statut = 0b101
motif[9]
ouvrir ...
SIGNAL_c::fermer	motif[8].statut = 0b101
SIGNAL_c::fermer	motif[9].statut = 0b1
SIGNAL_c::ouvrir	motif[9].statut = 0b11
... faire clignotter ...
SIGNAL_c::fermer	motif[8].statut = 0b101
SIGNAL_c::fermer	motif[9].statut = 0b1
SIGNAL_c::ouvrir	motif[9].statut = 0b111
... fermer
SIGNAL_c::fermer	motif[9].statut = 0b101
Il ne reste plus que le clignotement a mettre au point (avec un seul t).
MS2 CC2 S-DEC-4-DC Rocrail

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par jlb » jeu. 18 déc. 2014, 22:49

Je n'ai pas dit que le problème venait de tes macros. Je dis juste que c'est inélégant et inapproprié.

Avatar du membre
jlb
Fécond
Messages : 694
Enregistré le : jeu. 04 oct. 2012, 16:38
Echelle pratiquée : N
Prénom : Jean-Luc
Site Internet : http://modelleisenbahn.triskell.org

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par jlb » jeu. 18 déc. 2014, 23:06

macsddau a écrit : Si j'utilise motif[m], le programme ne va-t-il pas aller chercher le "miène" élément de la table pmotif (qui n'existe pas puisque pmotif n'est pas une table) et qui serai du type pmotif_t et non motif_t ?
si j'utilise *(pmotif[m]).statut, vais-je obtenir le résultat souhaité ?
Il va me falloir relire mes bouquins (pour les nuls !) traitant des sujets tableaux et pointeurs
En réalité, les tableaux n'existent pas dans le langage C. La notation [] est du sucre syntaxique permettant l'allocation d'une zone mémoire et la mise en œuvre de l'arithmétique des pointeurs de manière plus amicale. Seuls les pointeurs existent. Ainsi la déclaration

Code : Tout sélectionner

int a[10];
Déclare en fait à comment étant un const int* et réserve la place mémoire pour ranger 10 int. La syntaxe :

Code : Tout sélectionner

a[5]= 3;
N'est pas seulement équivalente à

Code : Tout sélectionner

*(a + 5) = 3
C'est *(a + 5) = 3. Tu peux d'ailleurs utiliser cette syntaxe en lieu et place.

Mais ce n'est pas pour ça qu'il faut l'utiliser car elle est moins lisible.

macsddau
Papotier
Messages : 114
Enregistré le : jeu. 17 oct. 2013, 22:46
Echelle pratiquée : N

Re: Décodeur pour signaux SNCF à base d'Arduino

Message par macsddau » jeu. 18 déc. 2014, 23:15

jlb a écrit :Je n'ai pas dit que le problème venait de tes macros. Je dis juste que c'est inélégant et inapproprié.
Si c'est une question de goût, les goûts et les couleurs ça ne se discutent pas.

Repassons au chose sérieuse. La librairie fonctionne :D
Je vous donne le code avant nettoyage du debug.
Signal.h (a placer dans le dossier Signal de votre librairie arduino)

Code : Tout sélectionner

//
//  Signal.h
//  
//
//  Created by macsddau on 17/12/14.
//
//

#ifndef ARDUINO_DEBUG_SERIAL
#define ARDUINO_DEBUG_SERIAL 1
#endif

#ifndef _Signal_h
#define _Signal_h

#define SIGNAL_BIT_STATUT_CLIGNOTEMENT_AUTORISE 0
#define SIGNAL_BIT_STATUT_MOTIF_VISIBLE         1
#define SIGNAL_BIT_STATUT_MOTIF_CLIGNOTE        2

#define SIGNAL_AUTORISER_CLIGNOTEMENT  (1 << SIGNAL_BIT_STATUT_CLIGNOTEMENT_AUTORISE)
#define SIGNAL_REFUSER_CLIGNOTEMENT    (0 << SIGNAL_BIT_STATUT_CLIGNOTEMENT_AUTORISE)

#define SIGNAL_OUVRIR_CLIGNOTTANT     1
#define SIGNAL_FERMER_CLIGNOTTANT     0

typedef struct {
    unsigned char motif;
    unsigned char groupe;
    unsigned char statut;
} motif_t;
typedef motif_t* pmotif_t;

class SIGNAL_c {
private:
    unsigned char*  ppinFeu;
    unsigned char   masqueClignotant;
    unsigned char   nombreFeux;
    pmotif_t        pmotif;
    unsigned char   nombreMotifs;
    unsigned char   feux;
    
public:
    SIGNAL_c();
    void definir(unsigned char*, unsigned char, unsigned char, pmotif_t, unsigned char);
    void ouvrir(unsigned char, unsigned char);
    void fermer(unsigned char);
    void afficher(void);
};

extern SIGNAL_c Signal;

#endif
Signal.cpp (à placer dans le même dossier)

Code : Tout sélectionner

//
//  Signal.cpp
//  
//
//  Created by macsddau on 17/12/14.
//
//

#include "Arduino.h"
#include "Signal.h"

#define SIGNAL_MOTIF(m)     (*(pmotif + m))
#define SIGNAL_PIN_FEU(f)   (*(ppinFeu + f))

#define SIGNAL_STATUT_MOTIF_PEUT_CLIGNOTER      (1 << SIGNAL_BIT_STATUT_CLIGNOTEMENT_AUTORISE)
#define SIGNAL_STATUT_MOTIF_VISIBLE             (1 << SIGNAL_BIT_STATUT_MOTIF_VISIBLE)
#define SIGNAL_STATUT_MOTIF_CLIGNOTE            (1 << SIGNAL_BIT_STATUT_MOTIF_CLIGNOTE)

SIGNAL_c::SIGNAL_c() {
    feux = 0x00;
}

void SIGNAL_c::definir(unsigned char*   pfx,
                       unsigned char    mc,
                       unsigned char    nf,
                       pmotif_t         pmot,
                       unsigned char    nm) {
    ppinFeu             = pfx;
    masqueClignotant    = mc;
    nombreFeux          = nf;
    pmotif              = pmot;
    nombreMotifs        = nm;
    
    for (unsigned char f = 0; f < nombreFeux; f++) {
        pinMode(SIGNAL_PIN_FEU(f), OUTPUT);
        digitalWrite(SIGNAL_PIN_FEU(f), LOW);
        delay(100); // chenillard
    }

#if (ARDUINO_DEBUG_SERIAL)
    for (unsigned char m = 0; m < nombreMotifs; m++) {
        Serial.print("SIGNAL_c::definir\tmotif[");
        Serial.print(m, DEC);
        Serial.print("] @ 0x");
        Serial.print((unsigned int)(pmotif + m), HEX);
        Serial.print(" : motif = 0x");
        Serial.print(SIGNAL_MOTIF(m).motif, HEX);
        Serial.print("\tgroupe = 0x");
        Serial.print(SIGNAL_MOTIF(m).groupe, HEX);
        Serial.print("\tstatut = 0b");
        Serial.println(SIGNAL_MOTIF(m).statut, BIN);
    }
#endif
}

void SIGNAL_c::ouvrir(unsigned char mot, unsigned char clg) {
    // fermer les motifs du même groupe
    for (unsigned char m = 0; m < nombreMotifs; m++) {
        if (SIGNAL_MOTIF(m).groupe & SIGNAL_MOTIF(mot).groupe) {
            fermer(m);
        }
    }
    
    // ouvrir le motif
    SIGNAL_MOTIF(mot).statut |= SIGNAL_STATUT_MOTIF_VISIBLE;
    feux |= SIGNAL_MOTIF(mot).motif;
    
    // définir le clignotement si il est autorisé
    if (clg) {
        if (SIGNAL_MOTIF(mot).statut & SIGNAL_STATUT_MOTIF_PEUT_CLIGNOTER) {
            SIGNAL_MOTIF(mot).statut |= SIGNAL_STATUT_MOTIF_CLIGNOTE;
        }
    } else {
        SIGNAL_MOTIF(mot).statut &= ~SIGNAL_STATUT_MOTIF_CLIGNOTE;
    }
    
#if (ARDUINO_DEBUG_SERIAL)
    Serial.print("SIGNAL_c::ouvrir\tmotif[");
    Serial.print(mot, DEC);
    Serial.print("].statut = 0b");
    Serial.println(SIGNAL_MOTIF(mot).statut, BIN);
#endif
}

void SIGNAL_c::fermer(unsigned char mot) {
    // fermer le motif
    SIGNAL_MOTIF(mot).statut &= ~SIGNAL_STATUT_MOTIF_VISIBLE;
    feux &= ~(SIGNAL_MOTIF(mot).motif);

#if (ARDUINO_DEBUG_SERIAL)
    Serial.print("SIGNAL_c::fermer\tmotif[");
    Serial.print(mot, DEC);
    Serial.print("].statut = 0b");
    Serial.println(SIGNAL_MOTIF(mot).statut, BIN);
#endif
}

void SIGNAL_c::afficher(void) {
    for (unsigned char m = 0; m < nombreMotifs; m++) {
        if (SIGNAL_MOTIF(m).statut & SIGNAL_STATUT_MOTIF_VISIBLE) {
            if (SIGNAL_MOTIF(m).statut & SIGNAL_STATUT_MOTIF_CLIGNOTE) {
                // inverser le feu
                feux ^= SIGNAL_MOTIF(m).motif & masqueClignotant;
            }
        }
    }
    
    // afficher
    for (unsigned char f = 0; f < nombreFeux; f++) {
        digitalWrite(SIGNAL_PIN_FEU(f), feux & (1 << f) ? LOW : HIGH);
    }

#if (ARDUINO_DEBUG_SERIAL)
    Serial.print("SIGNAL_c::afficher\tfeux = 0b");
    Serial.println(feux, BIN);
#endif
}

SIGNAL_c Signal = SIGNAL_c();
keywords.txt (toujours dans le même dossier)

Code : Tout sélectionner

#######################################
# Syntax Coloring Map For Signal
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################
SIGNAL  KEYWORD1
motif_t KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################

definir     KEYWORD2
ouvrir      KEYWORD2
fermer      KEYWORD2
afficher	KEYWORD2

#######################################
# Instances (KEYWORD2)
#######################################

Signal	KEYWORD2

#######################################
# Constants (LITERAL1)
#######################################

SIGNAL_OUVRIR_CLIGNOTTANT       LITERAL1
SIGNAL_FERMER_CLIGNOTTANT       LITERAL1
SIGNAL_AUTORISER_CLIGNOTEMENT  LITERAL1
SIGNAL_REFUSER_CLIGNOTEMENT    LITERAL1
Signal.ino (a placer dans le dossier exemples du dossier Signal de votre librairie Arduino)

Code : Tout sélectionner

#include <Signal.h>
#include <avr/pgmspace.h>

#define FEU_OE  0
#define FEU_A   1
#define FEU_S   2
#define FEU_VL  3
#define FEU_M   4
#define FEU_C   5
#define FEU_R   6
#define FEU_RR  7
#define NOMBRE_FEUX  8 // 8 maximum

const prog_uchar PIN_FEU[] = {
  4,  // OE
  5,  // A
  6,  // S
  7,  // VL
  8,  // M
  9,  // C
  10, // R
  11  // RR
};

#define MASQUE_CLIGNOTANT   \
  (0 << FEU_OE)  | /* OE */ \
  (1 << FEU_A)   | /* A  */ \ 
  (1 << FEU_S)   | /* S  */ \ 
  (1 << FEU_VL)  | /* VL */ \ 
  (1 << FEU_M)   | /* M  */ \ 
  (0 << FEU_C)   | /* C  */ \ 
  (1 << FEU_R)   | /* R  */ \ 
  (1 << FEU_RR)    /* RR */

#define MOTIF_A   0
#define MOTIF_S   1
#define MOTIF_VL  2
#define MOTIF_CR  3
#define MOTIF_PA  4
#define MOTIF_DR  5
#define MOTIF_M   6
#define MOTIF_CV  7
#define MOTIF_R   8
#define MOTIF_RR  9
#define NOMBRE_MOTIFS  10

const prog_uchar MOTIF[] = {
  (1 << FEU_OE) | (1 << FEU_A),  // A
  (1 << FEU_OE) | (1 << FEU_S),  // S
  (1 << FEU_OE) | (1 << FEU_VL), // VL
  (1 << FEU_S)  | (1 << FEU_C),  // CR
  (1 << FEU_A)  | (1 << FEU_C),  // PA
  (1 << FEU_C),                  // DR
  (1 << FEU_M),                  // M
  (1 << FEU_C),                  // CV
  (1 << FEU_R),                  // R
  (1 << FEU_RR)                  // RR
};

const prog_uchar GROUPE_MOTIF[] = {
  1,  // A
  1,  // S
  1,  // VL
  1,  // C
  1,  // PA
  1,  // DR
  1,  // M
  1,  // CV
  2,  // R
  2   // RR
};

const prog_uchar MOTIF_PEUT_CLIGNOTER [] = {
  SIGNAL_AUTORISER_CLIGNOTEMENT,  // A
  SIGNAL_AUTORISER_CLIGNOTEMENT,  // S
  SIGNAL_AUTORISER_CLIGNOTEMENT,  // VL
  SIGNAL_REFUSER_CLIGNOTEMENT,    // CR
  SIGNAL_REFUSER_CLIGNOTEMENT,    // PA
  SIGNAL_REFUSER_CLIGNOTEMENT,    // DR
  SIGNAL_AUTORISER_CLIGNOTEMENT,  // M
  SIGNAL_REFUSER_CLIGNOTEMENT,    // CV
  SIGNAL_AUTORISER_CLIGNOTEMENT,  // R
  SIGNAL_AUTORISER_CLIGNOTEMENT   // RR
};

motif_t motif[NOMBRE_MOTIFS];

void setup() { 
  Serial.begin(9600);
  
  for (unsigned char m = 0; m < NOMBRE_MOTIFS; m++) {
    motif[m].motif  = MOTIF[m];
    motif[m].groupe = GROUPE_MOTIF[m];
    motif[m].statut = MOTIF_PEUT_CLIGNOTER[m];
  }
  
  Signal.definir((unsigned char*)&PIN_FEU[0],
                 MASQUE_CLIGNOTANT, 
                 NOMBRE_FEUX, 
                 &motif[0], 
                 NOMBRE_MOTIFS);
}

void loop() {
  for (unsigned char m = 0; m < NOMBRE_MOTIFS; m++) {
    Serial.print("motif[");
    Serial.print(m, DEC);
    Serial.println("]");
    Serial.println("ouvrir ...");
    Signal.ouvrir(m, SIGNAL_FERMER_CLIGNOTTANT);
    
    for (unsigned char i = 0; i < 20; i++) {
      Signal.afficher();
      delay(1000);
    }
    
    Serial.println("... faire clignoter ...");
    Signal.ouvrir(m, SIGNAL_OUVRIR_CLIGNOTTANT);
    
    for (unsigned char i = 0; i < 20; i++) {
      Signal.afficher();
      delay(1000);
    }
    
    Serial.println("... fermer");
    Signal.fermer(m);
    
    for (unsigned char i = 0; i < 20; i++) {
      Signal.afficher();
      delay(1000);
    }
  }   
}
Les leds branchées sur la plaque d'essai s'allument comme il faut.

Voici la trace que j'obtient sur la console.

Code : Tout sélectionner

SIGNAL_c::definir	motif[0] @ 0x210 : motif = 0x3	groupe = 0x1	statut = 0b1
SIGNAL_c::definir	motif[1] @ 0x213 : motif = 0x5	groupe = 0x1	statut = 0b1
SIGNAL_c::definir	motif[2] @ 0x216 : motif = 0x9	groupe = 0x1	statut = 0b1
SIGNAL_c::definir	motif[3] @ 0x219 : motif = 0x24	groupe = 0x1	statut = 0b0
SIGNAL_c::definir	motif[4] @ 0x21C : motif = 0x22	groupe = 0x1	statut = 0b0
SIGNAL_c::definir	motif[5] @ 0x21F : motif = 0x20	groupe = 0x1	statut = 0b0
SIGNAL_c::definir	motif[6] @ 0x222 : motif = 0x10	groupe = 0x1	statut = 0b1
SIGNAL_c::definir	motif[7] @ 0x225 : motif = 0x20	groupe = 0x1	statut = 0b0
SIGNAL_c::definir	motif[8] @ 0x228 : motif = 0x40	groupe = 0x2	statut = 0b1
SIGNAL_c::definir	motif[9] @ 0x22B : motif = 0x80	groupe = 0x2	statut = 0b1
motif[0]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b1
SIGNAL_c::fermer	motif[1].statut = 0b1
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[0].statut = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b11
... faire clignoter ...
SIGNAL_c::fermer	motif[0].statut = 0b1
SIGNAL_c::fermer	motif[1].statut = 0b1
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[0].statut = 0b111
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b11
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b11
... fermer
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
motif[1]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b1
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[1].statut = 0b11
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b101
... faire clignoter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b1
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[1].statut = 0b111
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b101
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b101
... fermer
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
motif[2]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[2].statut = 0b11
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1001
... faire clignoter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b1
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[2].statut = 0b111
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b1001
SIGNAL_c::afficher	feux = 0b1
SIGNAL_c::afficher	feux = 0b1001
... fermer
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
motif[3]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[3].statut = 0b10
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
... faire clignoter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[3].statut = 0b10
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
SIGNAL_c::afficher	feux = 0b100100
... fermer
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
motif[4]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[4].statut = 0b10
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
... faire clignoter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[4].statut = 0b10
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
SIGNAL_c::afficher	feux = 0b100010
... fermer
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
motif[5]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[5].statut = 0b10
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
... faire clignoter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[5].statut = 0b10
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
... fermer
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
motif[6]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[6].statut = 0b11
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b10000
... faire clignoter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b1
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[6].statut = 0b111
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000
... fermer
SIGNAL_c::fermer	motif[6].statut = 0b101
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
motif[7]
ouvrir ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b101
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[7].statut = 0b10
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
... faire clignoter ...
SIGNAL_c::fermer	motif[0].statut = 0b101
SIGNAL_c::fermer	motif[1].statut = 0b101
SIGNAL_c::fermer	motif[2].statut = 0b101
SIGNAL_c::fermer	motif[3].statut = 0b0
SIGNAL_c::fermer	motif[4].statut = 0b0
SIGNAL_c::fermer	motif[5].statut = 0b0
SIGNAL_c::fermer	motif[6].statut = 0b101
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::ouvrir	motif[7].statut = 0b10
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
SIGNAL_c::afficher	feux = 0b100000
... fermer
SIGNAL_c::fermer	motif[7].statut = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
motif[8]
ouvrir ...
SIGNAL_c::fermer	motif[8].statut = 0b1
SIGNAL_c::fermer	motif[9].statut = 0b1
SIGNAL_c::ouvrir	motif[8].statut = 0b11
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b1000000
... faire clignoter ...
SIGNAL_c::fermer	motif[8].statut = 0b1
SIGNAL_c::fermer	motif[9].statut = 0b1
SIGNAL_c::ouvrir	motif[8].statut = 0b111
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b1000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b1000000
... fermer
SIGNAL_c::fermer	motif[8].statut = 0b101
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
motif[9]
ouvrir ...
SIGNAL_c::fermer	motif[8].statut = 0b101
SIGNAL_c::fermer	motif[9].statut = 0b1
SIGNAL_c::ouvrir	motif[9].statut = 0b11
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b10000000
... faire clignoter ...
SIGNAL_c::fermer	motif[8].statut = 0b101
SIGNAL_c::fermer	motif[9].statut = 0b1
SIGNAL_c::ouvrir	motif[9].statut = 0b111
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000000
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b10000000
... fermer
SIGNAL_c::fermer	motif[9].statut = 0b101
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
SIGNAL_c::afficher	feux = 0b0
MS2 CC2 S-DEC-4-DC Rocrail

Répondre