You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-i18n/tde-i18n-fr/docs/tdeedu/kstars/scriptbuilder.docbook

146 lines
24 KiB

<sect1 id="tool-scriptbuilder">
<title>L'outil de génération de scripts</title>
<indexterm><primary>Outils</primary>
<secondary>Génération de scripts</secondary>
</indexterm>
<para>Les applications KDE peuvent être pilotées de l'extérieur par un autre programme, depuis une invite de console ou depuis un script shell en utilisant le Desktop COmmunication Protocol (<abbrev>DCOP</abbrev>). KStars utilise cette fonction pour permettre à des comportements plutôt complexes d'être scriptés et rejoués à n'importe quel moment. Ceci peut être utilisé par exemple pour créer une démonstration de salle en classe pour illustrer un concept astronomique. </para>
<para>Le problème avec les scripts DCOP est que leur écriture ressemble à de la programmation, et peut sembler difficile à ceux qui n'ont pas l'expérience de la programmation. L'outil de génération de scripts fournit une interface graphique de type pointer-cliquer pour construire des scripts DCOP pour KStars, rendant très facile l'écriture de scripts complexes. </para>
<sect2 id="sb-intro">
<title>Introduction au générateur de scripts</title>
<para>Avant d'expliquer comment utiliser le générateur de scripts, je fournis une très brève introduction à tous les composants d'interface graphique ; pour plus d'informations, utilisez la fonction « Qu'est-ce que c'est ? ». </para>
<screenshot>
<screeninfo>L'outil de génération de scripts </screeninfo>
<mediaobject>
<imageobject>
<imagedata fileref="scriptbuilder.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Outil de génération de scripts</phrase>
</textobject>
</mediaobject>
</screenshot>
<para>Le générateur de scripts est affiché dans la capture d'écran ci-dessus. La zone à gauche est la <firstterm>zone de script courant</firstterm> ; elle affiche la liste des commandes que comprend le script actuellement en fonctionnement. La zone à droite est le <firstterm>navigateur de fonctions</firstterm> ; il affiche la liste de toutes les fonctions de script disponibles. Sous le navigateur de fonctions, se trouve un petit panneau qui affiche une courte documentation sur la fonction de script surlignée dans le navigateur de fonction. Le panneau sous la zone de script courante est le <firstterm>panneau des arguments de fonctions</firstterm> ; quand une fonction est surlignée dans la zone de script courant, ce panneau contient des éléments pour spécifier les valeurs pour n'importe quel argument que la fonction surlignée nécessite. </para><para>Le long du haut de la fenêtre, il y a une rangée de boutons qui opèrent sur le script comme un tout. De la gauche vers la droite, il y a : <guibutton>Nouveau script</guibutton>, <guibutton>Ouvrir un script</guibutton>, <guibutton>Enregistrer le script</guibutton>, <guibutton>Enregistrer le script sous...</guibutton> et <guibutton>Tester le script</guibutton>. La fonction de ces boutons devrait être évidente, sauf peut-être le dernier bouton. En actionnant <guibutton>Tester le script</guibutton>, vous tenterez de lancer le script courant dans la fenêtre principale de KStars. Vous devrez déplacer la fenêtre de générateur de script hors du chemin avant d'actionner cela, et ainsi, vous pourrez voir le résultat. </para><para>Au centre de la fenêtre, se trouve une colonne de boutons qui opèrent sur une fonction individuelle du script. Du haut vers le bas, ce sont : <guibutton>Ajouter une fonction</guibutton>, <guibutton>Supprimer une fonction</guibutton>, <guibutton>Copier une fonction</guibutton>, <guibutton>Monter</guibutton> et <guibutton>Descendre</guibutton>. <guibutton>Ajouter une fonction</guibutton> ajoute la fonction actuellement sélectionnée dans le navigateur de fonctions à la zone de script courant (vous pouvez aussi ajouter une fonction en double-cliquant dessus). Le reste des boutons opère sur la fonction surlignée dans la zone de script courant, soit en l'enlevant, soit en le dupliquant, soit en changeant sa position dans le script courant. </para>
</sect2>
<sect2 id="sb-using">
<title>Utilisation du générateur de scripts</title>
<para>Pour illustrer l'utilisation du générateur de scripts, nous présentons un petit didacticiel où nous faisons un script qui suit la Lune, alors que l'horloge fonctionne à une vitesse accélérée. </para><para>Si nous voulons suivre la Lune, nous aurons besoin de pointer l'affichage dessus d'abord. La fonction <firstterm>lookToward</firstterm> est utilisée pour faire cela. Surlignez cette fonction dans le navigateur de fonctions et notez la documentation affichée dans le panneau au-dessous. Actionnez le bouton <guibutton>Ajouter une fonction</guibutton> pour ajouter cette fonction à la zone de script courante. Le panneau des arguments de fonction comportera maintenant une liste combinée libellée <quote>dir</quote>, abréviation de direction. C'est la direction dans laquelle l'affichage doit être pointé. La liste combinée ne contient que les points cardinaux, pas la Lune ni d'autres objets. Vous pouvez soit écrire <quote>Lune</quote> dans la zone à la main, soit actionner le bouton <guibutton>Objet</guibutton> pour utiliser la fenêtre de <guilabel>recherche d'objet</guilabel> pour sélectionner la Lune dans la liste des objets nommés. Notez que, comme d'habitude, un centrage sur un objet engage automatiquement le mode de suivi, de telle manière qu'il n'y a pas besoin d'ajouter la fonction <firstterm>setTracking</firstterm> après lookToward. </para><para>Maintenant que nous avons pris soin de pointer la Lune, nous voulons ensuite faire passer le temps en accéléré. Utilisez la fonction <firstterm>setClockScale</firstterm> pour cela. Ajoutez-la au script en double-cliquant dessus dans le navigateur de fonctions. Le panneau des arguments de fonctions contient un compteur de pas du temps pour régler le pas désiré pour l'horloge de simulation. Changez le pas sur 3 heures. </para><para>Bien. Nous avons pointé la Lune et accéléré l'horloge. Maintenant, nous voulons simplement que le script attende plusieurs secondes pendant que l'affichage suit la Lune. Ajoutez la fonction <firstterm>waitFor</firstterm> au script, et utilisez le panneau des arguments de fonction pour spécifier qu'il devrait attendre 20 secondes avant de continuer. </para><para>Pour finir, réinitialisons le pas d'horloge à la valeur normale d'une seconde. Ajoutez une autre instance de setClockScale, et positionnez sa valeur sur 1 sec. </para><para>En fait, tout n'est pas fini. Nous devons probablement nous assurer que l'affichage utilise les coordonnées équatoriales avant que le script ne suive la Lune avec le pas accéléré. Sinon, si l'affichage utilise les coordonnées horizontales, il tournera très vite sur de grands angles au lever et au coucher de la Lune. Ceci peut être troublant, et on l'évite en réglant l'option d'affichage <firstterm>UseAltAz</firstterm> sur <quote>false</quote>. Pour changer une option d'affichage, utilisez la fonction <firstterm>changeViewOption</firstterm>. Ajoutez cette fonction au script, et examinez le panneau des arguments de fonction. Il y a une liste combinée qui contient la liste de toutes les options d'affichage qui peuvent être ajustées par changeViewOption. Comme nous savons que nous voulons l'option UseAltAz, nous pouvons simplement la sélectionner dans la liste combinée. Cependant, la liste est assez longue, et il n'y a pas d'explication sur l'utilisation de chaque élément. Pour cela, il peut être plus facile d'actionner le bouton <guibutton>Parcourir l'arborescence</guibutton>, qui ouvrira une fenêtre contenant une vue arborescente des options disponibles, organisées par sujet. De plus, chaque élément a une courte explication sur ce que fait l'option, et le type de donnée de valeur de l'option. Nous trouvons UseAltAz sous la catégorie <guilabel>Options de carte du ciel</guilabel>. Surlignez simplement cet élément et actionnez <guibutton>OK</guibutton>, et elle sera sélectionnée dans la liste combinée du panneau des arguments de fonctions. Enfin, rendez sa valeur <quote>false</quote> ou <quote>0</quote>. </para><para>Une dernière étape : le changement d'
</sect2>
<sect2 id="sb-indi">
<title>Automatisation du matériel avec INDI</title>
<para>La planification et l'automatisation du matériel est gérée pour tous les matériels compatibles <link linkend="what-is-indi">INDI</link>. Vous pouvez coordonner autant de matériel pour effectuer des opérations complexes avec le <link linkend="sb-intro">générateur de scripts</link> de &kstars;. Ceci se fait en utilisant l'interface INDI DCOP de &kstars;, qui fournit différentes classes de fonctions pour s'adapter à vos tâches. Les fonctions INDI DCOP peuvent se décomposer en cinq classes différentes. Ce qui suit est un survol des fonctions et de leurs arguments, comme ils sont gérés par KStars. Il est très recommandé de lire la section <link linkend="indi-concepts">Concepts INDI</link>, car nous emploierons des concepts INDI dans ce didacticiel.</para>
<orderedlist>
<listitem><para>Fonctions génériques du matériel : fonctions pour établir/arrêter le matériel, etc.</para>
<itemizedlist>
<listitem><para><function>startINDI (TQString deviceName, bool useLocal)</function> : établir un service INDI, soit en local, soit en serveur.</para></listitem>
<listitem><para><function>shutdownINDI (TQString deviceName)</function> : arrêter le service INDI.</para></listitem>
<listitem><para><function>switchINDI(TQString deviceName, bool turnOn)</function> : connecter ou déconnecter un service INDI.</para></listitem>
<listitem><para><function>setINDIPort(TQString deviceName, TQString port)</function> : déterminer le port de connexion du matériel.</para></listitem>
<listitem><para><function>setINDIAction(TQString deviceName, TQString action)</function> : active une action INDI. L'action peut êtren'importequel <emphasis>élément</emphasis> dans une <emphasis>propriété d'interrpution</emphasis></para></listitem>
<listitem><para><function>waitForINDIAction(TQString deviceName, TQString action)</function> : mettre en pause l'exécution du script jusqu'à ce que l'action spécifiée <emphasis>property</emphasis> retourne l'état OK.</para></listitem>
</itemizedlist>
</listitem>
<listitem><para>Fonctions de télescope : les fonctions pour contrôler le mouvement et l'état du télescope.</para>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(TQString deviceName, TQString action)</function> : détermine le mode ou l'action du télescope. Les options disponibles sont SLEW, TRACK, SYNC, PARK, et ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString deviceName, double RA, double DEC)</function> : détermine les coordonnées de la cible JNow du télescope à <emphasis>AD</emphasis> et <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString deviceName, double RA, double DEC)</function> : Détermine les coordonnées de cible JNow du télescope de <emphasis>objectName</emphasis>. KStars cherchera le nom de l'objet dans sa base de données et cherchera l'AD et la Déc une fois trouvé.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString deviceName, double longitude, double latitude)</function> : détermine l'emplacement géographique du télescope aux longitude et latitude spécifiées. La longitude est mesurée depuis Greenwich, Angleterre, vers l'Est. Cependant, alors qu'il est habituel d'utiliser des longitudes négatives vers l'Ouest, INDI utilise des longitudes entre 0 et 360 degrés. Ainsi, si vous avez une longitude négative, ajoutez simplement 360 degrés pour obtenir la valeur que INDI attend. Par exemple, les coordonnées de Calgary, Canada dans &kstars; sont -114 04 58; latitude: 51 02 58. Vous devrez fournir une longitude de 360 - 114.069 = 245.931 degrés.</para></listitem>
<listitem><para><function>setINDIUTC(TQString ddeviceName, TQString UTCDateTime)</function> : détermine la date et l'heure UTC en format ISO 8601. Le format est AAAA-MM-JJTHH:MM:SS (&pex; 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</listitem>
<listitem><para><function>setINDIUTC(TQString ddeviceName, TQString UTCDateTime)</function> : fonctions pour contrôler les propriétés et l'état des caméras et CCD.</para>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(TQString deviceName, int temp)</function> : détermine la température de la puce cible en degrés Celsius.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString deviceName, TQString type)</function> : détermine le type de cadre CCD. Les options disponibles sont FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, et FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(TQString deviceName, int timeout)</function> : commencer l'exposition CCD/Caméra pour la durée spécifiée par <emphasis>timeout</emphasis> en secondes.</para></listitem>
</itemizedlist>
</listitem>
<listitem><para>Fonctions de focus : fonctions pour contrôler le mouvement et l'état du viseur.</para>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(TQString deviceName, TQString action)</function> : déterminer la vitesse du viseur. Les options disponibles sont FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, et FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString deviceName, int timeout)</function> : déterminer la durée en secondes pour n'importe quelle opération consécutive à startINDIFocus.</para></listitem>
<listitem><para><function>startINDIFocus(TQString deviceName, int focusDir)</function> : déplacer le viseur soit en rapprochement (focusDir = 0), soit en éloignement (focusDir = 1). La vitesse et la durée de cette opération sont déterminées par les fonctions <function>setINDIFocusSpeed()</function> et <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</listitem>
<listitem><para>Fonctions de filtrage : fonctions pour contrôler la position du filtre.</para>
<itemizedlist>
<listitem><para><function>setINDIFilterNum(TQString deviceName, int filter_num)</function> : changer la position du filtre en <varname>filter_num</varname>. L'utilisateur peut assigner des alias aux numéros des filtres dans la boîte de dialogue <guimenuitem>Configuration d'INDI</guimenuitem> sous le menu <guimenu>Périphériques</guimenu> (&pex; Filter 1 = Red, Filter 2 = Green..etc).</para></listitem>
</itemizedlist>
</listitem>
</orderedlist>
<para>Notez que le nom du périphérique est le premier argument de toutes les fonctions INDI. Ceci permet à différentes commandes d'être envoyées à différents périphériques INDI en étant mélangées dans le script. L'outil de génération de scripts fournit deux options pour faciliter la création et l'édition des scripts INDI.</para>
<itemizedlist>
<listitem><para><option>Append waitForINDIAction after any INDI action</option> : lorsque coché, l'outil de génération de scripts ajoutera automatiquement <function>waitForINDIAction()</function> après toute action qu'il reconnaît. Par exemple, si vous ajoutez une fonction <function>switchINDI()</function> au script, et que cette option est cochée, le générateur de scripts ajoutera "waitForINDIAction CONNECTION" dans le script juste après <function>switchINDI()</function>. Ceci fera que le script s'arrêtera après <function>switchINDI()</function> jusqu'à ce que <function>switchINDI()</function> retourne l'état OK (&pex; que la connexion au périphérique a réussi). Il est vital de savoir que le générateur de scripts ne peut pas ajouter automatiquement <function>waitForINDIAction()</function> pour les actions génériques ajoutées en utilisant la fonction <function>setINDIAction()</function>. Ceci est dû au fait que KStars ne peut pas déterminer la propriété parente pour les actions génériques. Pour cela, vous devez ajouter à la main <function>waitForINDIAction()</function> après les actions génériques si désiré.</para>
</listitem>
<listitem><para><option>Reuse INDI device name</option> : lorsque coché, le champ de nom du périphérique de toutes les fonctions subséquentes est automatiquement rempli par le dernier nom de périphérique. Le dernier nom de périphérique est déterminé à chaque fois que la fonction <function>startINDI()</function> est ajoutée au script courant. Lorsqu'on travaille avec de multiples périphériques, il est recommandé que cette option soit désactivée.</para>
</listitem>
</itemizedlist>
<para>Maintenant, nous sommes prêts à créer un script de démonstration qui contrôle un télescope LX200 GPS, en plusd'une caméra CCD Finger Lakes. Notre tâche est simple. Nous demanderons au télescope de se déplacer et de suivre Mars, puis nous demanderons à la caméra de prendre trois images de 10 secondes, séparées chacune de 20 secondes.</para>
<important><para>Comme il n'y a pas de retour direct depuis l'interface DCOP INDI concernant la progression, la valeur ou l'état des opérations ou des paramètres du périphérique (sauf pour <function>waitForINDIAction()</function>), l'automatisation du périphérique dans KStars est semblable à un système de contrôle à boucle ouverte. Dans un tel système, il n'y a habituellement pas de renseignement en retour pour mesurer la progression du système et corriger les erreurs. En conséquence, vous devez concevoir vos scripts d'automatisation du périphérique avec soin. Tous les scripts d'automatisation doivent être sujets à des tests rigoureux avant déploiement.</para></important>
<screenshot>
<screeninfo>L'outil de génération de scripts </screeninfo>
<mediaobject>
<imageobject>
<imagedata fileref="indiscript.png" format="PNG"/>
</imageobject>
<textobject>
<phrase>Outil de génération de scripts</phrase>
</textobject>
</mediaobject>
</screenshot>
<para>Le script de démonstration est montré dans la capture d'écran ci-dessus. Notez que nous avons coché <option>"Append waitForINDIAction after any INDI action"</option> et décoché <option>"Reuse INDI device name"</option>. La première fonction à ajouter est <function>startINDI()</function>, comme montré ci-dessus. Nous voulons lancer nos périphériques locaux, ainsi, nous ne changerons pas le mode de service fourni dans la fenêtre des arguments de fonction. Nous écrivons notre nom de périphérique, commençant par le télescope "LX200 GPS". Nous répétons la même opération pour "FLI CCD". Il y a une fonction <function>waitFor()</function> après cela. Il est généralement recommandé d'utiliser la fonction <function>waitFor()</function> juste après <function>startINDI()</function> pour mettre en pause le script pendant 1 à 5 secondes. Ceci assurera que toutes les propriétés sont construites et sont prêtes à recevoir des commandes. C'est aussi utile pour contrôler des périphériques distants, car les trouver et construire leurs propriétés peut prendre du temps. Dans la fonction suivante, <function>switchINDI()</function>, nous connectons chaque périphérique.</para>
<para>Comme <option>"Append waitForINDIAction after any INDI action"</option> est coché, nous n'avons pas besoin d'ajouter de fonction <function>waitForINDIAction()</function> après <function>switchINDI()</function> pour s'assurer que nous continuons seulement à exécuter le script après une connexion correcte. Ceci est dû au fait que l'outil de génération de scripts fera ceci automatiquement pour nous lorsque nous enregistrerons le script. Maintenant, réglons le télescope en mode suivi, cliquons sur la fonction <function>setINDIScopeAction()</function>, et sélectionnons TRACK. Notez que nous avons besoin de régler le mode du télescope sur suivi, <emphasis>avant</emphasis> de fournir les coordonnées dont il a besoin pour le suivi. La fonction <function>setINDIScopeAction()</function> est fournie pour des raisons pratiques, car, dans cet exemple, elle fournit simplement une fonction générique <function>setINDIAction()</function>, suivie par le mot-clé TRACK. Cependant, le bénéfice d'utiliser <function>setINDIScopeAction()</function> est que KStars peut ajouter automatiquement <function>waitForINDIAction()</function> après, lorsque nécessaire. Cette facilité n'est pas disponible automatiquement aux actions génériques, comme nous en avons discuté plus tôt.</para>
<para>Ensuite, nous utiliserons la fonction <function>setINDITargetName()</function> et la déterminerons sur Mars. Enfin, les quelques dernières étapes impliquent la capture d'une image pendant 10 secondes, ce qui peut se faire en utilisant la fonction <function>startINDIExposure()</function>, et l'attente pendant 20 secondes entre elles, ce qui peut se faire en utilisant la fonction <function>waitFor()</function> avec une valeur de 20.</para>
<para>Nous pouvons, maintenant, enregistrer notre script et l'exécuter n'importe quand. Le script enregistré sera semblable à ceci :</para>
<blockquote><programlisting>#!/bin/bash
#KStars DCOP script: Demo Script
#by Jasem Mutlaq
#last modified: Thu Jan 6 2005 09:58:26
#
KSTARS=`dcopfind -a 'kstars*'`
MAIN=KStarsInterface
CLOCK=clock#1
dcop $KSTARS $MAIN startINDI "LX200 GPS" true
dcop $KSTARS $MAIN startINDI "FLI CCD" true
dcop $KSTARS $MAIN waitFor 3
dcop $KSTARS $MAIN switchINDI "LX200 GPS" true
dcop $KSTARS $MAIN waitForINDIAction "LX200 GPS" CONNECTION
dcop $KSTARS $MAIN switchINDI "FLI CCD" true
dcop $KSTARS $MAIN waitForINDIAction "FLI CCD" CONNECTION
dcop $KSTARS $MAIN setINDIScopeAction "LX200 GPS" TRACK
dcop $KSTARS $MAIN waitForINDIAction "LX200 GPS" ON_COORD_SET
dcop $KSTARS $MAIN setINDITargetName "LX200 GPS" Mars
dcop $KSTARS $MAIN waitForINDIAction "LX200 GPS" EQUATORIAL_EOD_COORD
dcop $KSTARS $MAIN startINDIExposure "FLI CCD" 10
dcop $KSTARS $MAIN waitForINDIAction "FLI CCD" EXPOSE_DURATION
dcop $KSTARS $MAIN waitFor 20
dcop $KSTARS $MAIN startINDIExposure "FLI CCD" 10
dcop $KSTARS $MAIN waitForINDIAction "FLI CCD" EXPOSE_DURATION
dcop $KSTARS $MAIN waitFor 20
dcop $KSTARS $MAIN startINDIExposure "FLI CCD" 10
dcop $KSTARS $MAIN waitForINDIAction "FLI CCD" EXPOSE_DURATION
</programlisting>
</blockquote>
<note>
<para>La bibliothèque INDI fournit des outils de scriptage robustes pour permettre aux développeurs d'orchestrer des scripts très complexes. Pour plus de détails, référez-vous au <ulink url="http://indi.sourceforge.net/manual/book1.html">Manuel du développeur INDI</ulink>.</para>
</note>
</sect2>
</sect1>