/ docs / src / hal / halmodule_fr.txt
halmodule_fr.txt
  1  :lang: fr
  2  :toc:
  3  
  4  = Créer des composants de l'espace utilisateur 
  5  
  6  == Utilisation de base en Python
  7  
  8  Un composant de l'espace utilisateur commence par créer ses pins et
  9  ses paramètres, puis il entre dans une boucle dans laquelle il va
 10  positionner périodiquement toutes ses sorties en fonction de ses
 11  entrées. Le composant suivant, un passe-tout, copie la valeur vue sur
 12  ses pins d'entrée (_passe_tout.in_) vers ses pins de sortie
 13  (_passe_tout.out_) approximativement une fois par seconde.
 14  ----
 15  #!/usr/bin/env python
 16  import hal, time
 17  h = hal.component("passe_tout")
 18  h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
 19  h.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT)
 20  h.ready()
 21  try:
 22      while 1:
 23          time.sleep(1)
 24          h['out'] = h['in']
 25  except KeyboardInterrupt:
 26      raise SystemExit
 27  ----
 28  
 29  Copier le listing précédent dans un fichier nommé _passe_tout_, le
 30  rendre exécutable par un _chmod +x_ et le placer dans son _$PATH_. 
 31  On peut alors l'essayer en faisant:
 32  
 33  
 34  +*halrun*+ 
 35  
 36  +halcmd: *loadusr passe_tout*+ 
 37  
 38  +halcmd: *show pin*+ 
 39  
 40      Component Pins: 
 41      Owner Type  Dir     Value  Name 
 42       03   float IN          0  passe_tout.in 
 43       03   float OUT         0  passe_tout.out 
 44  
 45  +halcmd: *setp passe_tout.in 3.14*+ 
 46  
 47  +halcmd: *show pin*+ 
 48  
 49      Component Pins: 
 50      Owner Type  Dir     Value  Name 
 51       03   float IN       3.14  passe_tout.in 
 52       03   float OUT      3.14  passe_tout.out 
 53  
 54  
 55  == Composants de l'espace utilisateur et délais
 56  
 57  Si vous tapez rapidement _show pin_, vous pourrez voir que
 58  _passe_tout.out_ conserve un moment son ancienne valeur de 0. Ceci
 59  est dû à l'appel de la fonction _time.sleep(1)_, qui fait que les pins 
 60  de sortie changent d'état, au plus, une fois par seconde. 
 61  Parce-que ce composant appartient à l'espace utilisateur, 
 62  ce délai peut apparaître plus long, par exemple si la mémoire utilisée 
 63  par le composant pass_tout est échangée avec le disque dur, 
 64  le délai peut être allongé jusqu'au rafraîchissement de la mémoire.
 65  
 66  Ces composants de l'espace utilisateur conviennent parfaitement pour
 67  des éléments tels que des panneaux de contrôle pour lesquels des délais
 68  de l'ordre de quelques millisecondes sont imperceptibles. Ils ne
 69  conviennent pas, en revanche, pour envoyer des impulsions de pas vers
 70  une carte de pilotage de périphériques pour lesquelles les délais
 71  doivent rester de l'ordre de quelques microsecondes, dans tous les
 72  cas.
 73  
 74  == Créer les pins et les paramètres
 75  
 76  +h = hal.component("passe_tout")+ 
 77  
 78  Le composant lui-même est créé par l'appel du constructeur
 79  _hal.component_. Les arguments sont le nom du composant HAL et
 80  optionnellement, le préfixe utilisé pour les noms de pin et de paramètre. 
 81  Si le préfixe n'est pas spécifié, le nom du composant est utilisé.
 82  
 83  +h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)+ 
 84  
 85  Puis les pins sont créées par appels des méthodes sur l'objet
 86  composant. Les arguments sont: pin nom suffixe, type de pin et
 87  direction de la pin. Pour les paramètres, les arguments sont: paramètre
 88  nom suffixe, type de paramètre et direction du paramètre.
 89  
 90  .Noms des options de HAL
 91  
 92  [width="95%", options="header"]
 93  |========================================
 94  |*Types de Pin et Paramètre:* | HAL_BIT | HAL_FLOAT | HAL_S32 | HAL_U32
 95  |*Directions des pins:* | HAL_IN | HAL_OUT | HAL_IO | 
 96  |*Directions des paramètres:* | HAL_RO | HAL_RW |  | 
 97  |========================================
 98  
 99  Le nom complet d'une pin ou d'un paramètre est formé en joignant le
100  préfixe avec le suffixe par un *.*, comme dans l'exemple où la pin
101  créée est appelée _passe_tout.in_.
102  
103  +h.ready()+ 
104  
105  Une fois toutes les pins et les paramètres créés, la méthode _.ready()_
106  est appelée.
107  
108  === Changer le préfixe
109  
110  Le préfixe peut être changé en appelant la méthode _.setprefix()_. Le
111  préfixe courant peut être retrouvé en appelant la méthode
112  _.getprefix()_.
113  
114  == Lire et écrire les pins et les paramètres
115  
116  Pour les pins et les paramètres qui sont aussi des identifiants
117  Python, la valeur est accessible ou ajustable en utilisant la syntaxe
118  des attributs suivante:
119  
120  +h.out = h.in+ 
121  
122  Pour les pins et les paramètres qui sont aussi des identifiants
123  Python, la valeur est accessible ou ajustable en utilisant la syntaxe
124  de sous-script suivante:
125  
126  +h['out'] = h['in']+ 
127  
128  === Pilotage des pins de sortie (HAL_OUT)
129  
130  Périodiquement, habituellement dans le temps de réponse de l'horloge,
131  toutes les pins HAL_OUT doivent être _pilotées_ en leur assignant une
132  nouvelle valeur. Ceci doit être fait que la valeur soit différente ou
133  non de la valeur précédemment assignée. Quand la pin est connectée au
134  signal, l'ancienne valeur de sortie n'est pas copiée vers le signal, la
135  valeur correcte n'apparaîtra donc sur le signal qu'une fois que le
136  composant lui aura assigné une nouvelle valeur.
137  
138  === Pilotage des pins bidirectionnelles (HAL_IO)
139  
140  La règle mentionnée ci-dessus ne s'applique pas aux pins
141  bidirectionnelles. Au lieux de cela, une pin bidirectionnelle doit
142  seulement être pilotée par le composant et quand le composant souhaite
143  changer sa valeur. Par exemple, dans l'interface codeur, le composant
144  codeur positionne seulement la pin _index-enable_ à _FALSE_ quand une
145  impulsion d'index est vue et que l'ancienne valeur est _TRUE_, mais ne
146  la positionne jamais à _TRUE_. Positionner de manière répétitive la 
147  pin à _FALSE_ pourrait faire qu'un autre composant connecté agisse 
148  comme si une nouvelle impulsion d'index avait été vue.
149  
150  == Quitter
151  
152  Une requête _halcmd unload_ pour le composant est délivrée comme une
153  exception _KeyboardInterrupt_ . Quand une requête de déchargement
154  arrive, le processus doit quitter
155   dans un court laps de temps ou appeler la méthode _.exit()_ sur le
156  composant si un travail substantiel, comme la lecture ou
157  l'écriture de fichiers, doit être fourni pour terminer le processus
158  d'arrêt.
159  
160  == Idées de projets
161  
162   - Créer un panneau de contrôle extérieur avec boutons poussoirs,
163     interrupteurs et voyants. Connecter le tout à un microcontrôleur et
164     raccorder le microcontrôleur à un PC en utilisant une liaison série.
165     Python est vraiment capable d'interfacer une liaison série grâce à son
166     module http://pyserial.sourceforge.net/[pyserial] (Paquet 
167     _python-serial_, dans les dépôts universe d'Ubuntu)
168   - Relier un module d'affichage à LCD
169     http://lcdproc.omnipotent.net/[LCDProc] et l'utiliser pour afficher les
170     informations de votre choix (Paquet _lcdproc_, dans les dépôts universe
171     d'Ubuntu)
172   - Créer un panneau de contrôle virtuel utilisant n'importe quelle
173     librairie d'interface graphique supportée par Python (gtk, qt,
174     wxwindows, etc)
175  
176