mai 2009
|
troisième édition |
Mais avant d'oaborder la programmation SIOC, quelques précisions concernant les cartes IOCards elles-mêmes, leur présentation, leurs fonctions et leur montage, ne sont pas superflues.
1 - le montage d'une carte Master
La carte Master et la solution barrettes-relais à vis, très pratique.
SIOC est un langage de programmation très puissant, permettant d'agir sur toutes les fonctions internes de Flight Simulator, d'effectuer toutes les opérations simples, mais aussi d'incorporer dans un cockpit des fonctions logiques complexes, des temporisations, etc... On pourra ainsi facilement créer des fonctions du genre "j'allume une alarme clignotante si la vitesse est inférieure à 130 Kts , si le train est rentré, si les volets sont sortis". Tous les cockpits peuvent être entièrement commandés par SIOC, du Cessna à l'Airbus, sans aucun logiciel ou carte autre que IO Card, à la seule condition que l'avion utilisé soit un standard de Flight Simulator, c'est à dire qu'il utilise les "variables" connues de FS, ce qui est le cas de la grosse majorité des add-on , mais exclut complètement les avions de PMDG, PSS, Wilco, qui utilisent des variables inconnues. Ces avions ne peuvent pas être utilisés dans un cockpit, quel qu'il soit. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Nico Kaan, un réalisateur de cockpit néerlandais très connu, dit "même à des débutants, je recommande d'utiliser SIOC ... " Il est vrai qu'il ajoute "il est bien sûr préférable d'avoir quelques notions en programmation informatique..." (Avsim, 14 mars 2006) En fait, les notions de programmation ne sont pas vraiment indispensables, ce qui compte avant tout, la seule chose qui soit vraiment indispensable est d'avoir un esprit logique. Quand on sait exactement ce qu'on veut obtenir, ce qui suppose de bien connaître l'avion qu'on modélise, on peut facilement décrire une fonction, définir tout ce qu'il lui faut pour agir, et dès lors transposer ce cahier des charges en SIOC est assez simple. Que les nuls en programmation se rassurent , l'objectif de ce tutoriel est de leur apporter l'essentiel de ce qu'il faut savoir pour faire fonctionner un cockpit.
Les nuls peuvent aussi examiner les fichiers de programmation SIOC (les .ssi) d'autres utilisateurs, les comparer, essayer, c'est sans aucun risque et très instructif. On y va ?
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment fonctionne Flight Simulator ?
Flight Simulator fonctionne en interne avec des "variables" qui transportent les instructions pour toutes ses fonctions, et pas seulement ce qui concerne le vol. Peter Dowson a réussi à décortiquer le code de Flight Simulator et a identifier ces variables. A partir de là, il nous est possible de les sélectionner et de les modifier dans un logiciel comme SIOC, et de les transmettre à FS par l'intermédiaire de FSUIPC, il suffit de leur donner une "adresse" et elles y vont ... La liste des variables de Flight Simulator figure dans les documents à télécharger de ce site, et également sur le site de Peter Dowson. Il y en a des centaines, mais pas de panique, si nous oublions les variables définissant la météo, les coordonnées géographiques, ou des caractéristiques physiques d'un avion, ce qui entre réellement dans un cockpit est beaucoup plus réduit.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Quand le pilote ferme l'interrupteur incorporé dans la manette de train pour le sortir , cet interrupteur établit un contact entre une des 72 entrées de la carte Master et la masse "GND" du groupe correspondant (voir plus haut). L'entrée de la carte Master ainsi mise à la masse change d'état -elle était auparavant à +5Volts, elle passe à 0 V, et SIOC, toujours à l'affut de ce qui se passe, détecte immédiatement ce changement d'état. La programmation SIOC propre à notre avion a été prévue pour dire " si cette entrée change d'état, il faudra immédiatement changer la valeur de la variable du train. Les cartes IOCards discutent avec Flight Simulator par l'intermédiaire de FSUIPC. SIOC peut aussi utiliser FSUIPC et les "variables" classiques. Mais il peut aussi utiliser sa propre interface, appelée IOCP ou "protocole" IOCP, qui fait exactement la même chose que FSUIPC, un peu plus rapidement . Ne compliquons pas les choses, FSUIPC nous ira très bien, même pour faire un cockpit complexe. Les programmeurs remarqueront qu'il n'y a pas un programme SIOC pour tout un cockpit, mais des multitudes de petits programmes mis bout à bout, qui fonctionnent indépendamment. Ce qui est très pratique pour essayer interrupteur après interrupteur. SIOC est par défaut au repos, et n'agit que si un "évènement" nouveau se produit, par exemple un interrupteur qu'on vient de fermer. De ce fait, SIOC est très rapide et très peu gourmand en ressources. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Quels logiciels faut-il installer ? Après avoir chargé sur le site de OpenCockpits (section downloads), ou au chapitre "Téléchargements" de SimuCockpit.com la dernière version de SIOC, on décompresse le tout dans un même dossier , en principe Program Files / IOCards. C'est un peu fouillis, mais on va faire un raccourci sur le bureau pour sioc.exe, le plus important. Un coup d'oeil rapide. Pour que les choses soient plus parlantes, lançons d'abord Flight Simulator. Lançons maintenant sioc.exe, la fenêtre ci-dessous s'affiche.
Elle est très claire, on y voit d'abord le rappel de la version de SIOC utilisée, ici la 3.5. IOCards Module nous indique que cette carte est bien branchée (running) . Le paragraphe en dessous FSUIPC Module, nous confirme entre autres que FSUIPC version 3.75.0 est bien en marche. Ici, FS2004 est utilisé, mais SIOC fonctionne aussi bien avec FSX. Oublions pour le moment les cases "IOCP" , qui nous suggèrent que IOCP peut agir comme un "serveur" avec des "clients", ce qui veut dire, entre autres, que SIOC peut fonctionner avec plusieurs ordinateurs, sans utiliser WideFS de Peter Dowson. La fenêtre USB Devices est importante: elle rappelle que sur mon cockpit j'utilise une carte Master, qui porte le numéro d'Index 0 et le numéro de "Device" 85, ainsi qu'une carte USB Outputs, Index 1 et Device 84. Nous consacrerons un chapitre à ces choses bizarres. Dans la bande bleue en bas se trouve quelque chose de beaucoup plus intéressant: c:\Program Files\IOCards\SIOC.ssi Les fichiers .ssi sont les fichiers de programmation qu'utilise SIOC, créés par chaque utilisateur pour chaque avion. Un coup d'oeil dans Program Filles \ Iocards et effectivement on trouve ce fichier... qui est vide. C'est simplement pour le cas où vous voudriez appeler votre fichier .ssi "sioc.ssi" il suffira à chaque changement d'écraser le précédent en gardant le même nom. Mais si vous préférez appler votre .ssi "mon_avion.ssi" c'est tout aussi bien. Vous avez vu d'ailleurs que quand on a décompressé le dossier sioc.exe de nombreux .ssi , comme "ejemplo_displays.ssi" , se sont créés. Ce ne sont que des exemples. Pour retrouver plus facilement nos petits, il n'est pas inutile d'afficher les nombreux fichiers de Program Files \IOCards en les classant par type. Ce qui nous amène à jeter un oeil sur le fichier d'initialisation sioc.ini, toujours dans le même Program Files \IOCards. Ce petit fichier texte doit comprendre l'indication du fichier .ssi à utiliser, c'est TRES IMPORTANT . Exemple: [SIOC] Remarquez le .\ devant le nom du fichier .ssi. Si donc vous changez de nom de fichier .ssi il ne faut pas oublier de modifier le fichier sioc.ini pour lui indiquer le nouveau nom de .ssi à utiliser. Par défaut, SIOC.exe s'ouvre avec le fichier .ssi enregistré dans sioc.ini, et lors de sa première utilisation, il ouvre le fichier "sioc.ssi" Remarquez aussi que ce fichier .ini concerne également IOCards classique, FSUIPC, etc... il regroupe plusieurs modules (mais pas tous les modules possibles). Enfin dans la série des boutons, très pratiques, on trouve: RELOAD: à utiliser à chaque fois qu'on a enregistré une modification dans notre fichier .ssi, pour transmettre effectivement la nouvelle configuration à Flight Simulator. CONFIG appelle le fichier .ssi signalé dans sioc.ini, pour le modifier, par exemple. Dans notre cas, si nous cliquons dessus, nous allons avoir un avis "Blank File" puisque pour le moment notre sioc.ssi est vide. Profitons de cette visite à Config pour sélectionner l'anglais ou l'espagnol dans le menu Languages. IOCP Console appelle le vérificateur de fonctionnement du même nom, nous verrons cela plus tard. TRAY envoie la fenêtre SIOC dans la barre des notifications, à droite de la barre des tâches. EXIT vous indique le chemin de la sortie ... |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vous êtes impatient de voir ce que donne SIOC sur votre cockpit. Nous allons donc tout bêtement recopier un petit programme existant, et l'essayer. Cet exercice va nous permettre de voir comment on peut transformer un fichier de programmation sous forme de texte en un fichier .ssi utilisable par SIOC. Importons un petit fichier texte intitulé essai_1 Une page de choses bizarres s'affiche, c'est un fichier SIOC sous forme de texte, il s'agit ici d'une commande de volets à trois positions: // *****************************************************************************
Var 0001, name FLAPS, Link FSUIPC_INOUT, Offset $0BDC, Length 4 // Commande des volets Var 0400, name FLAPS_UP_SW, Link IOCARD_SW, Input 33 // Volets position "Rentrés" Var 0401, name FLAPS_DN_SW, Link IOCARD_SW, Input 34 // Volets position "sortis" Faites CTRL A pour tout sélectionner, puis CTRL C pour copier. Dans Démarrer/Tous les programmes/ Accessoires, ouvrez le bloc notes et faites CTRL V pour copier ce texte . Vérifiez bien une chose importante: quand on importe de cette manière un fichier ssi sous forme de texte, il arrive que des lignes soient tronquées: au lieu d'avoir une ligne Var 0001, name FLAPS, Link FSUIPC_INOUT, Offset $0BDC, Length 4 // Commande des volets on parfois, quand la place manque, un retour à la ligne intempestif, du genre: Var 0001, name FLAPS, Link FSUIPC_INOUT, Offset $0BDC, Length 4 // Commande des volets à A éviter absolument car lorsqu'une ligne, ici la deuxième, commence par autre chose qu'une variable ou un //, SIOC prend cela pour un ordre de programmation à exécuter, et n'y comprend plus rien. Donc toujours vérifier que les lignes sont complètes. Notre fichier texte ayant une bonne tête, nous l'enregistrons sous le nom essai_1.txt dans Program Files / IOCards. Dans la fenêtre de SIOC, cliquons sur le bouton CONFIG. Config_sioc s'ouvre sur la page blanche de sioc.ssi. Nous allons créer un autre sioc.ssi à partir de notre fichier essai_1.txt. Cliquons sur Files puis sur Import TXT .
Choisissons notre fichier essai_1.txt et le temps d'un clic nous avons deux choses: d'abord un "log de compilation" :
On y voit que la "compilation" ou transformation d'un fichier texte en programme, s'est faite en trois phases, c'est toujours les cas, et que tout est OK, on y voit surtout un OK vert rassurant en bas, signe que tout s'est bien passé. Une croix rouge signifierait par exemple qu'on a oublié de copier un bout du fichier essai_1 et peut être qu'une parenthèse } est passée à la trappe, ou que nous avions un retour à la ligne intempestif. Cela arrive souvent quand on copie un bout de programme de quelqu'un. Deuxième chose, fermons le log de compilation devenu inutile en cliquant sur OK, et nous retrouvons notre texte dans la fenêtre SIOC, mais sous une forme différente: il est devenu un .ssi.
Prenons l'habitude de l'enregistrer, comme nous le ferons à chaque fois qu'un fichier .ssi aura été modifié : Files /Save as, et on lui donne le nom de sioc.ssi fichier qui, désormais, ne sera plus vide.
Si vous fermez puis ouvrez de nouveau sioc.exe, vous constaterez que SIOC s'ouvre avec le dernier fichier .ssi utilisé, c'est pratique. Est-ce qu'on peut maintenant essayer ce .ssi dans FS ? Non, pas tout de suite, car les interrupteurs de volets de votre cockpit sont certainement sur d'autres entrées de la carte Master que celles prévues dans cet exemple de .ssi A la ligne de la variable 0400, nous voyons "Input 33 " C'est le numéro de l'entrée sur la carte Master, qu'il faut modifier si cela ne correspond pas à vos attributions d'entrées. Si vous voulez faire cette modification, double-cliquez sur la ligne de la variable 400 : il apparaît une nouvelle fenêtre très pratique, la fenêtre des Paramètres:
Dans les données IOCards (IOCards Data) nous avons le numéro de l'entrée initialement sélectionnée, 33. Nous pourrions indiquer une autre entrée au lieu de 33, mais pour notre exemple 33 nous ira très bien. Après cette opération, l'arborescence de la variable 400 a disparu dans le fichier .ssi, pour la revoir il suffit de cliquer sur le + qui la précède. Dans le menu See on peut aussi choisir de déployer ou de comprimer l'affichage. Enregistrons d'abord cette modification dans le fichier sioc.ssi ( Files/Save) puis cliquons sur le bouton RELOAD de SIOC pour envoyer les nouvelles données à Flight Simulator. Dans FS, actionnons le levier de volets: les volets fonctionnent avec leurs trois positions (si vous avez un B737, cela bougera quand même...) Nous allons maintenant utiliser ce petit programme pour entrer dans les détails. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Des variables liées. Les Var400, Var401, etc... qu'on voit dans notre fichier .ssi sont des variables propres à SIOC, définies comme le souhaite l'utilisateur. Ces variables SIOC peuvent être liées à pas mal de choses (d'où le mot Link qui revient souvent) : - on peut les lier à FSUIPC, donc leur demander d'agir sur un offset de la liste de Peter Dowson, et ce dans tous les sens: la variable SIOC va: - une variable SIOC peut aussi être "liée" à un élément physique de IOCards: une entrée sur sa carte Master, comme les variables commandant les interrupteurs, ou une sortie (LED), ou un afficheur (Display) , ou une carte additionnelle comme la carte Servos, la carte Stepper, etc... La variable est précédée dans ce cas d'une icône "carte verte", c'est le cas de nos variables 400 et 401, liées à "IOCard Switches". - une variable SIOC peut également être liée à un module IOCP (icône "<- -> IOCP" (à voir plus tard...) - enfin une variable SIOC peut être liée à rien du tout, et dans ce cas le changement de valeur de la variable en question n'agira que sur elle-même. Une variable non liée est précédée d'un carré blanc. Comment définir un numéro de variable ? SIOC peut admettre 9999 numéros de variables, numéros définis par l'utilisateur. Comme il y a de la place entre 0000 et 9999, on créera des "classes" de variables, ce qui permettra d'ajouter facilement des variables nouvelles, et de faciliter la lecture du code.
Un exemple de classification (parmi beaucoup d'autres):
et si on a besoin de plus de 100 variables pour les interrupteurs par exemple ? On ajoute un 1 et on commence une série 1400 à 1499... TRES IMPORTANT: les variables peuvent n'être définies que par un numéro. Pas de problème pour un très petit programme. Mais lorsque le fichier .ssi grossit, et cela vient très vite, il devient impossible de comprendre le programme à la lecture de simples numéros, on ne sait plus à quoi cela correspond, il faut chercher plus haut, ou plus bas (?) dans le programme pour avoir la définition de ce numéro. Pour éviter cet écueil, SIOC permet de nommer les variables, c'est l'objet de la fenêtre " NAME" à côté du numéro. Nommer nos variables est une habitude à prendre dès maintenant, pour toutes les variables, cela permet de se relire facilement, mais cela permet aussi d'échanger des fichiers avec d'autres utilisateurs, qui sans variables nommées seraient complètement perdus. Dans un même programme, mieux vaut également toujours employer le même langage pour nommer des variables: par exemple toutes les variables d'affichage par LEDs comporteront le mot LED. Chacun peut définir ce langage qui lui convient, l'essentiel étant que tout le monde le comprenne immédiatement. Pour ma part, mais vous n'êtes nullement obligés de suivre cet exemple, j'ai employé une forme anglaise pour nommer mes variables: la fonction Cap du pilote automatique s’appellera AP_HDG plutôt que CAP_PA, ceci toujours pour faciliter les échanges de fichiers. Exemple: Mes variables de commande de FS ($...) ont simplement un nom explicite, ainsi que les Subroutines et les variables internes. Les variables des sorties Output se terminent toujours par _LED. Les variables des encodeurs se terminent toujours par _ROT Les variables de sons , moins utilisées depuis les dernières versions de SIOC, se terminent toujours par _SND.
Enfin, plus souvent que nécessaire, les actions sont décrites –en français (!)- derrière le signe // d'un fichier texte, ou dans la case "Description" de la fenêtre des Paramètres vue ci-dessus améliore grandement la compréhension.
Cette variable , non obligatoire, portant le numéro 0000 et qu'on peut nommer INI ou INIT par exemple, est un peu spéciale. La seule exception est la variable 000 d'initialisation, qui est lue et exécutée systématiquement au démarrage de SIOC. C'est donc l'endroit idéal pour mettre les paramètres qu'on souhaite voir exécuter avant tout vol. En voila un exemple, extrait d'un fichier .ssi quelconque:
La variable d'initialisation ci-dessus comporte trois commandes: au démarrage, les volets seront toujours remis à zéro, le train sera sorti, le frein de parking serré. Nous verrons plus loin comment imposer une valeur à une variable. Vous avez peut être remarqué que la fenêtre des paramètres de certaines variables comporte une case "INITIAL VALUE" . Quelle est la différence avec la variable d'initialisation, puisqu'on peut mettre une valeur dans INITIAL VALUE, que la variable prendra en compte ? La variable d'initialisation est toujours prioritaire au démarrage de SIOC: si on demande que les volets soient rentrés, mettre FLAPS=0 dans la variable INI suffit. Mais s'il n'y a rien dans la variable INI concernant une variable, c'est l'INITIAL VALUE qui est prise en compte, SIOC modifie la valeur de la variable en conséquence. Les valeurs INITIAL VALUE sont souvent utilisées avec les afficheurs, si on souhaite par exemple que, au démarrage, la vitesse verticale affichée soit égale à 500 pieds/minute. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Lecture: une variable liée à IOCards, avec conditions IF et ELSE. Les lignes qui suivent sont très intéressantes:
Nous avons physiquement un commutateur rotatif à trois positions, un interrupteur en fait, branché sur les entrées 33 et 34 de notre carte Master. Ce petit bout de programme SIOC , qu'on appelle un script, commande la position des volets avec ce commutateur. C'est le rôle tout d'abord de la variable que nous avons appelée 400 ou mieux "FLAPS_UP_SW" . Cette variable est liée à "SWITCHES" dans la liste déroulante des Links, et tout naturellement, nous avons 33 comme numéro d'entrée Input. Vous pouvez cliquer sur la ligne Var 0400 pour revoir ces paramètres. Les lignes en dessous se lisent de la manière suivante: " Si (IF) la variable FLAPS_UP_SW a une valeur 1, (c'est à dire si l'interrupteur est "fermé"), alors la variable FLAPS (la $0BDC) doit prendre la valeur 0 " . Ceci correspond à la valeur de $0BDC quand les volets sont en position UP ou complètement rentrés. Autrement dit, et pour être le plus clair possible, l'interrupteur sur la 33 étant le commutateur rotatif 3 positions en position volets rentrés (UP) , cet interrupteur est fermé, et les volets se mettent en position rentrés. S'ils y sont déjà, il ne se passe rien, la variable n'a pas changé de valeur, SIOC reste en sommeil. La ligne en dessous définit alors ce qui se passe quand cet interrupteur est ouvert (levier des volets ailleurs que sur la position" rentrés", c'est à dire soit sur la position intermédiaire "Approche", soit sur la position basse "sortis") : "Autrement (ELSE) la variable FLAPS doit prendre la valeur 8191 ", c'est à dire volets en position Approche. Bien entendu quand le levier des volets est en position Full Flaps tout sorti, c'est l'interrupteur de la variable 403 FLAPS_DN_SW, relié à l'entrée 34 qui entre en jeu:
Ce qui se lit:" la variable FLAPS_DN_SW est liée à un interrupteur relié à l'entrée 34 de la carte Master (position volets pleinement sortis)", L'usage de IF et de ELSE permet ici d'éviter de définir trois positions de volets, avec seulement deux variables.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ecriture: une commande de train avec IF et ELSE Cet exemple va nous permettre de revoir les notions importantes exposées précédemment, et d'y ajouter la commande de LEDs de signalisation. Notre fichier d'exemple se résume pour le moment à ceci:
Nous allons y ajouter une variable pour le train d'atterrissage, et les diodes vertes associées. Pour ajouter une nouvelle variable à la fin de la liste, il suffirait de cliquer sur Edit / New Var. Ici, nous nous proposons de donner le numéro 010 à notre nouvelle variable, par conséquent on va l'insérer entre la 001 et la 400. Double-clic sur la ligne de la variable 400 pour la sélectionner, puis dans le menu Edit, on choisit Insert Var. La nouvelle variable, pour le moment un carré blanc, va s'insérer au dessus de la ligne sélectionnée. Cliquons sur le carré blanc, (flèche sur la capture ci-dessous), la page des paramètres apparaît:
Il serait souhaitable que le train soit sorti lorsqu'on démarre un vol, en principe au sol... Nous allons donc créer une variable d'initialisation, numéro 000, au dessus de la variable 001, avec Edit/Insert Var (on peut faire un clic droit).
Nous allons maintenant mettre une commande dans cette variable, pour obliger la variable de train à avoir la valeur 16383 au démarrage de SIOC.
Il nous faut maintenant définir des variables SIOC pour les fonctions suivantes: - allumage d'une LED rouge quand le train est en transit, Nous allons donc créer 4 nouvelles variables, et comme elles doivent commander des LEDs, ces variables seront liées aux sorties OUT de la carte Master IOCard : Link to: IOCard Output ( variables avec l'icône "carte verte") Les variables de LEDs ayant des numéros dans les 700 (choix tout personnel), elles seront à la fin de notre fichier .ssi actuel, donc ce sera Edit/New Var. Les numéros de sortie de la carte Master sont ici choisis au hasard.
Vous remarquerez au passage que si vous oubliez d'indiquer le n° de sortie de la carte Master, la fenêtre refusera de se fermer. Des sécurités de ce genre sont nombreuses dans ce mode d'enregistrement d'un fichier .ssi, et c'est une raison majeure pour le préférer à l'enregistrement direct sous forme de texte. Par contre, vous pouvez enregistrer deux fois la sortie 36 par exemple, il est tout à fait possible de commander une même LED par deux variables. Occupons nous d'abord de la variable 402 ou GEAR_SW, la manette de train. Que voulons-nous ? Un petit tableau pour clarifier:
Passons à SIOC, attention aux clics : 1° sélectionner la ligne de la variable GEAR_SW
Ceci est la première condition "si l'inter de train est fermé ". 5° sélectionner cette nouvelle ligne "IF GEAR_SW=1" et faites un clic DROIT dessus : un nouveau cadre d'icône est créé, et l'arborescence en pointillés indique cette fois que ce que nous allons ajouter concerne bien la ligne IF GEAR_SW=1 (important à vérifier), et non par exemple la ligne de la variable 402 GEAR_SW Nous allons maintenant entrer la deuxième condition: ELSE. Cette condition est rattachée à la variable GEAR_SW, tout comme l'était la condition IF, c'est logique : si.... autrement. 7° sélectionner de nouveau la ligne de la variable GEAR_SW et faites un clic DROIT dessus: un nouveau cadre d'icône est créé, et l'arborescence en pointillés indique bien qu'il est relié à la variable GEAR_SW. Nous avons écrit la deuxième partie de la phrase "autrement la variable $0BE8 sera égale à 0". Ce genre de raisonnement, volontairement très détaillé ici, devient vite une habitude et la programmation est très rapide.
Nota: vous aurez remarqué dans les fenêtres de paramètres que le travail est bien préparé, quand une condition concerne une variable la liste de toutes les variables créées dans votre .ssi figure dans une liste déroulante, il n'y a plus qu'à cliquer. De même pour les signes = ou > etc...
Enregistrez ces modifications au .ssi, relancez SIOC avec le bouton RELOAD, et essayez cette commande de train dans Flight Silmulator, après avoir supprimé la variable $0BE8 et l'inter correspondant dans Config IOCards si vous utilisez conjointement IOCards classique.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
L'affichage de la position du train: trois conditions IF et ELSE L'exemple précédent , la manette de train, était relativement simple, le train est rentré ou sorti. Une seule condition IF et ELSE était attachée à la variable. Nous avons préparé précédemment les variables 700 à 703 concernant les diodes LED d'affichage de la position du train, nous allons nous en servir. Flight Simulator utilise plusieurs variables pour ce qui concerne le train: Nous avons déjà créé les variables 700 à 703 liées à une sortie Master, il nous reste à créer les variables liées aux variables de position. Nous y ajouterons par la même occasion une commande indiquant que le train est en transit, commande liée à la diode rouge, mais sans création d'une nouvelle variable, l'état ne sera déterminé que par l'état des autres variables. Nos variables de "commande" étant classées dans la série 001 à 299, nous aurons ainsi: Var 011 ou L_GR_POS, position du train gauche ($0BF4) associée à Var 701 ou L_GEAR_LED, diode verte du train gauche, agissant sur la variable Var 700 ou GEAR_TRANS_LED du transit. Var 012 ou R_GEAR_POS, position du train droit ($0BF0) + Var 702 ou R_GEAR_LED, diode verte du train droit, agissant sur la variable Var 700 ou GEAR_TRANS_LED du transit. Var 013 ou NOSE_GEAR_POS, position du train avant ($0BEC) + Var 703 ou NOSE_GEAR_LED, diode verte du train avant, agissant sur la variable Var 700 ou GEAR_TRANS_LED du transit. Commencez par créer ces trois variables, nous y ajouterons ensuite leurs commandes associées. Nous pouvons commencer par créer la variable 013 NOSE_GEAR_POS pour $0BEC, en remarquant bien qu'il s'agit ici d'une variable liée à FSUIPC bien entendu, mais uniquement en entrée (Link To: FSUIPC In) puisque la variable reçoit des informations de la part de FSUIPC, mais ne lui transmet rien en retour. Nous insèrerons ensuite les variables 011 et 012. Définition de ce qu'on veut obtenir, pour le train avant:
ce qui fait trois conditions IF, d'où un décalage de l'arborescence à chaque fois qu'une condition nouvelle est exposé, décalage symbolisé sur le tableau ci-dessus par un changement de colonnes. Pour ajouter plusieurs attributions (Assign) à la suite, il suffit de faire plusieurs fois un clic droit sur la condition IF, et de choisir les ASSIGN nécessaires. Transposons donc dans les commandes SIOC les fonctions définies par le tableau ci-dessus. Il n'y a plus qu'à faire la même chose pour les variables de position train droit et gauche, et voilà ce que cela donne à la fin sur le fichier .ssi:
Remarquez en particulier le décalage d'un cran des arborescences à chaque fois que l'on passe à la condition suivante. En cas d'erreur d'ailleurs, SIOC refuserait de prendre en compte les nouveaux paramètres. Un IF et son ELSE correspondant sont toujours sur un même plan. Qu'est-ce que cela donnerait en langage texte ? Cliquez sur File / Export to TXT, choisissez le nom essai_1.txt et enregistrez. Nota: nous avons utilisé dans cet exemple des signes comme >=, ce sont des "opérateurs logiques". Vous en trouverez le détail un peu plus loin.
Enregistrez ce nouveau sioc.ssi et essayez-le dans FS (en faisant RELOAD dans SIOC) . C'est magique ! Variante: on peut aussi dire des choses comme "SI l'inter de batterie est ON, ET SI le moteur 1 est en marche, ET SI la génératrice 1 est sur OFF, ALORS l'alarme de charge batterie est sur ON. Cela fait trois IF pour une seule assignation, et cela s'écrit en décalant d'un cran à chaque fois chaque condition vers la droite. Nota: la condition ELSE n'est pas strictement obligatoire après un IF, parfois on s'en passe.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Jusque maintenant nous avons visualisé directement dans Flight Simulator le résultat de nos essais. C'est très bien quand il s'agit de vérifier le fonctionnement d'un train d'atterrissage, par contre, il y a des cas plus complexes, où on ne "voit" pas ce qui se passe. Ouvrez Flight Simulator, puis allez à la fenêtre principale de SIOC, cliquez sur le bouton IOCPCONSOLE, puis, dans la fenêtre qui vient de s'ouvrir, cliquez sur CONNECT. La fenêtre indique alors l'état de toutes les variables que vous avez créées dans le fichier SIOC actuellement en service. Extrait de mon propre code pour Beech 200:
Nous pouvons lire que la variable 32 concernant le train d'atterrissage a une valeur décimale de 16383, qui correspond au train sorti. Bien entendu, si nous rentrions le train, la valeur passerait à 0. Vous pouvez également cliquer sur LOG ON et vous aurez un journal de tout ce qui se passe dans votre FS (très pratique pour traquer des anomalies, elles sautent aux yeux). Attardons-nous sur la colonne "Binary Value", pleine de 0 et de 1. Vous savez que les variables de Flight Simulator, celles qui sont dans la liste de Peter Dowson, ont une "longueur" de 1, 2 ou 4. 00000000 00000000 et ces 16 bits en deux octets auront les numéros: 15, 14, 13, 12, 11, 10, 9, 8, et 7, 6, 5, 4, 3, 2, 1, 0 Tout ceci pour vous dire que les variables dites "booléennes" , celles qui ne connaissent que deux états, Ouvert ou Fermé, ou 0 ou 1, se contentent d'un seul bit, quand on allume une LED, la valeur binaire passe de 0 à 1, c'est tout. C'est plus compliqué quand il s'agit d'afficher la valeur binaire de 16383, comme le train, voyez la succession de 0 et de 1, sur la capture d'écran ci-dessus. Comme la variable du train, $0BE8 a une longueur de 4 octets, soit 32 bits, en fait c'est toute la ligne de 0 et 1 qui indique la valeur binaire de cette variable à ce moment là. Encore plus intéressant, il existe dans Flight Simulator la possibilité de changer la valeur d'une variable en agissant directement au niveau d'un bit. Vous pouvez créer, à titre d'exemple, une nouvelle variable SIOC, en utilisant l'offset $3300 correspondant à la capture d'un LOC ou NAV ou Glide. Incorporez cet offset dans votre fichier .ssi, mettez l'avion en position d'interception d'un ILS, laissez-le faire, et regardez comment les valeurs décimales et binaires vont changer quand le LOC va être capturé. Vous verrez qu'un seul bit change à la capture du LOC, le bit n°8. Lorsque le Glide est capturé, c'est le bit n° 9 de cette même variable qui passe de 0 à 1. Pour faire des essais, même en l'absence de Flight Simulator, IOCP Console permet d'entrer n'importe quelle valeur pour une variable. L'observation dans la colonne LOG de ce qui se passe permet de vérifier que les commandes prévues ont bien été exécutées. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Il s'agit de variables temporaires, très pratiques pour simplifier l'écriture. Les définitions de variables intermédiaires seront beaucoup plus simples: ALTI_1=L0 Dès qu'un calcul intervient et se répète, une variable locale simplifie bien les choses. Ces variables locales ne sont valables qu'à l'intérieur d'un même script (groupe de commandes, ou sous-ensemble de programmation, entre un { et un } en texte, exécuté lorsque la variable change de valeur) . Les variables locales peuvent avoir une valeur numérique, décimale ou entière, positive ou négative, dans ce cas nous les appellerons L0, L1 et L2, car il n'y en a que trois à notre disposition. Elles peuvent aussi avoir une valeur dite "booléenne" c'est à dire 1 ou 0, VRAI ou FAUX. Dans ce cas nous les appellerons C0, C1 et C2. Evidemment, les variables locales C correspondront souvent à une variable sur un interrupteur, ayant la valeur 0 ou 1. On peut aussi combiner les variables locales L avec les C dans une même formule. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
A ne pas confondre avec les variables "locales" du paragraphe précédent. Il peut arriver que certaines fonctions présentes sur un avion "add-on" à Flight Simulator ne correspondent à rien à l'intérieur de FS. Et par conséquent, il n'y a aucune variable correspondante dans la liste de Peter Dowson. Exemple: sur son Beech 200 , Aeroworx a prévu un interrupteur pour le convertisseur (Inverter), commande importante puisque si l'interrupteur est ouvert, la gauge de Torque ne fonctionne pas, et un voyant d'alarme s'allume en rouge. Or, l'Inverter, FS ne connaît pas... Puisqu'il n'existe pas de variable, rien de plus simple que d'en créer une nous-mêmes. On peut créer une variable portant n'importe quel numéro, par exemple var 900 (il paraît qu'il vaut mieux rester en dessous de 2000). On pourra lui associer une variable d'interrupteur, liée à IOCard Switches, une variable de sortie Output pour une LED, et bien entendu également, on pourra mettre dans le script d'une variable interne toutes les commandes habituelles, IF, ELSE etc... Exemple:
Remarquez que la variable interne INVERTER est non liée, puisque ne correspondant à rien dans Flight Simulator, Non liée, mais parfaitement fonctionnelle, puisque l'interrupteur de la var 420 pourra très bien déterminer que la var 900 = 1 si lui même est = 1 (dans ce cas, au lieu de faire des IF et des ELSE, il vaut mieux on ajouter une commande ASSIGN à la var 420 pour dire "var900=var420" ou INVERTER = INVERTER_SW. Souvenez-vous, la variable SUIT l'interrupteur, donc INVERTER = INVERTER_SW, mais c'est l'interrupteur qui commande, donc la commande en question est à mettre dans le script de la variable interrupteur, et non dans INVERTER. De même, la LED SUIT sa variable, mais c'est la variable qui commande)
On imagine le parti qu'on peut tirer des variables internes pour, par exemple, réaliser un Overhead, sachant qu'une variable SIOC, y compris interne peut déclencher un équivalent clavier, donc actionner Key2Mouse, donc cliquer sur un interrupteur caché et commander ce qui n'est pas commandable autrement. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Il s'agit un peu de la même démarche que pour les variables locales, simplifier des conditions répétitives. Les subroutines sont également très utiles lorsqu'on doit faire intervenir plusieurs variables pour déterminer l'état d'une autre. Exemple (complexe) : Dans cette subroutine pour alarme de circuit hydraulique, on définit tout d'abord avec des variables locales la valeur de la pression hydraulique totale, circuits de droite + circuits de gauche. Ce total va être analysé et s'il est insuffisant une alarme à LEDs va s'allumer. Par la même occasion on va dire que si aucun des moteurs de fonctionne, l'alarme s'allumera également.
La procédure est la suivante: 1° créer la subroutine. C'est une nouvelle variable, donc nous appelons Edit / Insert Var. Dans Link To: on va choisir SIOC SUBROUTINE, la variable sera précédée dans le .ssi d'une icône jaune.
2° Définir les commandes et paramètres de cette nouvelle variable, ce qu'elle devra faire, comment elle va fonctionner: ce sont des commandes classiques telles que nous les avons vues. 3° Enfin, dans chaque variable ayant servi au calcul dans la subroutine, nous mettrons une instruction CALL:
Dans l'exemple ci-dessus, nous faisons appel aux variables L_HYDR_PRESS et R_HYDR_PRESS, ainsi qu'aux variables L _ENG_FIRING et R_ENG_FIRING pour déterminer l'état des LEDs d'alarme. Dans chacune de ces quatre variables (mais pas dans les variables des LEDs), nous mettrons la commande CALL et le nom de la subroutine à appeler. Exemple pour les deux premières:
Dans l'exemple ci-dessus, on voit également, à la dernière ligne, qu'une subroutine peut également faire appel à une autre subroutine. Une subroutine étant un petit programme indépendant, il est fréquent que la variable de subroutine soit appelée dans plusieurs scripts. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Dans la page de définition des commandes, IF, ELSE et autres, les conditions comportent des "opérateurs logiques", le plus courant étant "="
Les autres opérateurs possibles sont:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Une fonction: DELAY Comme son nom l'indique, cette fonction a pour but d'introduire un certain retard dans l'exécution d'une variable. Reprenons l'exemple du train d'atterrissage. En temps normal, et même si nous utilisons trois variables pour indiquer la position du train, ce que nous avons fait plus haut, les trois vertes s'allument en même temps. Il est plus réaliste de faire en sorte qu'il y ait un petit décalage entre chaque allumage, les trains arrivent parfois en retard ... Ne touchons pas à la variable NOSE_GEAR_POS ($0BEC), qui transmet la position du train avant. Comme vu plus haut, cette variable est liée à une variable Output, la NOSE_GEAR_LED, allumant la diode verte "train avant sorti" Par contre, nous allons faire en sorte que la variable R_GEAR_POS allumant la diode verte du train droit ait un retard de 0,4 seconde. Reprenons notre fichier .ssi et faites un double clic sur la ligne R_GEAR_LED=1
Le tableau des paramètres de cette variable apparaît:
Dans Command / Type, déroulons la liste et au lieu de ASSIGN, cliquons sur FUNCTION: la case Function à droite est activée. Choisissons dans sa liste DELAY. C'est maintenant le paragraphe FUNCTION / CALL qui est actif. Dans VAR : indiquons le numéro de la variable que nous voulons temporiser, en l'occurrence R_GEAR_LED.
Désormais notre ligne de commande sera la suivante: Faites de même pour la variable L_GEAR_LED du train gauche, en introduisant un retard de 1,2 seconde. Nous rencontrerons bien d'autres fonctions par la suite, dans notre voyage en SIOC.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
La fonction TIMER déclenche des évènements en fonction d'un chronomètre paramétrable. La variable prend la forme: On trouve des exemples de Timer sur l' excellent site de Nico Kaan, ces scripts fonctionnent très bien, mais indéfiniment. Ce n'est pas grave en soi, la consommation de SIOC étant insignifiante. Par contre cela peut perturber la lecture de IOCP Console, et obliger à déselectionner toutes les variables (bouton Deselect All), et re-sélectionner uniquement celles qui nous intéressent (petit rectangle entre le numéro et le nom de la variable). Deux cas peuvent se présenter: On utilise le TIMER pour des fonctions très limitées, et on ne souhaite pas avoir un compteur TIMER fonctionnant en permanence. Il faut donc déclencher puis arrêter le TIMER à la demande, autrement dit, il faut mettre un interrupteur. Le premier paramètre de la fonction TIMER est, nous l'avons dit, la valeur de fin, la limite. Si la limite est 0, un TIMER à valeur décroissante n’ira pas plus loin que 0. Si la limite est 9999, solution présentée à tort comme un TIMER fonctionnant indéfiniment, un TIMER à incrémentation positive s’arrêtera lorsqu’il dépassera 9999. Si notre TIMER a un cycle par seconde, sa « durée de vie » sera de 9999 secondes, il s’arrêtera donc au bout de 2,7 heures. Donc si vous voulez faire des vols de longue durée, il faudra prévoir une remise à zéro du TIMER (SI TIMER=9999 > TIMER=0), sinon vous aurez peut être des surprises à la fin du vol, le clignotant ne fonctionnant plus. Je propose la solution suivante: l'interrupteur donnera à la variable munie d'un TIMER, la valeur limite prévue. Par exemple, si nous avons un TIMER qui décompte de -1 à chaque cycle , à partir d'une valeur de départ égale à 10, le script sera du genre: Var 0001, name SWITCH, Link IOCARD_SW, Input 27, Type I ELSE // si le Switch est égal à 0 Var 0002, name CLIGNOT
Le ELSE permet d’assigner une condition importante: si l’interrupteur est OFF, le clignotant prend la valeur 0. Comme il a une incrémentation de -1, il prend immédiatement la valeur -1. Et comme la valeur -1 est inférieure à la valeur de fin, fixée à 0, le clignotant s’arrête. Le fonctionnement de ce temporisateur peut être vérifié avec IOCP Console. Si nous voulons faire un TIMER « infini » en mettant 9999, comme valeur limite, s’il dépasse cette valeur, il s’arrête. Prenons le cas d'un TIMER qui commence à compter à partir de 1, avec une incrémentation de +1 à chaque cycle , et ce, toutes les secondes: Var 0001, name SWITCH, Link IOCARD_SW, Input 27 { IF &SWITCH = 1 &CLIGNOT = 1 // valeur de démarrage &CLIGNOT = TIMER 9999 ,1 ,100 } } ELSE // SI LE SWITCH EST = 0 { &CLIGNOT = 9999 } } dans ce cas, lorsqu’on met l’interrupteur sur OFF, le TIMER prend la valeur 9999, comme son incrémentation est ici de +1, il passe au cycle suivant à la valeur 10000, et comme cette valeur est supérieure à sa valeur limite, il s’arrête. C’est la valeur de la variable CLIGNOT qui va déterminer si la LED est allumée ou éteinte. Heureusement pour nous, il existe dans la liste des fonctions la fonction MOD, pour "Module", qui donne un résultat 1 ou 0 selon que la valeur de CLIGNOT est un nombre pair ou un nombre impair. Avec une incrémentation de 1, on aura donc une LED qui s’allumera un cycle sur deux. Ajoutons donc une LED: Var 0002, name LED, Link IOCARD_OUT, Output 25 Notre Script de TIMER devient alors : Var 0001, name SWITCH, Link IOCARD_SW, Input 27 { IF &SWITCH = 1 { IF &LED = 0 // par sécurité, pas indispensable { &CLIGNOT = 1// valeur de démarrage &CLIGNOT = TIMER 9999 ,1 ,100 } } ELSE // SI LE SWITCH EST 0 { &CLIGNOT = 9999 } } et ajoutons la fonction MOD à la variable CLIGNOT: Var 0003, name CLIGNOT { L0 = MOD &CLIGNOT ,2 IF L0 = 0 { &LED = 0 // LED éteinte } ELSE { &LED = 1 // LED allumée } } Remarque : on pourrait écrire directement ELSE // SI LE SWITCH EST 0 { &CLIGNOT = 10000 au lieu de 9999, mais dans ce cas le TIMER prendrait la valeur d’arrêt 10000+1=10001 soit un nombre impair, et la LED resterait allumée, alors qu’avec 9999 le TIMER s’arrête sur un nombre pair : 10000, et la LED reste éteinte. Inutile de préciser que l’interrupteur, ici dénommé SWITCH peut être n’importe quelle commande dans une variable, une subroutine, etc… qui lancera le clignotant, ou l’éteindra. ______________________________________________________________________________________________________________
Deuxième cas: on utilise le TIMER pour des fonctions multiples, à usage fréquent, comme le clignotement de l'alarme MASTER WARNING ou MASTER CAUTION. Ici, il devient intéressant d'avoir un compteur fonctionnant en permanence, lancé dès le démarrage de SIOC, et d'y faire appel, y compris à partir de plusieurs sources, lorsque c'est nécessaire. La meilleure solution a été développée par Pierre Brandeis, et exposée sur le site SimuBaron . La solution de Pierre est excellente car non seulement elle permet d'utiliser une seule "centrale clignotante" pour plusieurs alarmes, mais en plus elle isole en quelque sorte le clignotant de ses commandes, ce qui évite des variations désagréables du rythme de clignotement quand les commandes sont à conditions multiples. Reportez-vous au site SimuBaron pour les explications détaillées. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Cette fonction analyse en permanence l'état d'un bit déterminé dans une variable. S'il vient à changer, une commande s'exécute. Pour mettre en place une fonction TESTBIT, il faut bien entendu : La page des paramètres ressemble à ceci:
et le .ssi à cela:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Les fonctions SETBIT, CLEARBIT, CHANGEBIT Ces fonctions permettent de changer l'état d'un bit pour obtenir une commande déterminée, et inversement d'annuler cette modification pour revenir à l'état antérieur. Exemple déjà cité: les phares. On va mettre un SETBIT sur la variable $0D0C, "Lights" bit n° 0 pour allumer les feux de navigation, et un CLEARBIT sur le même bit pour les éteindre. Ici, c'est la variable de l'interrupteur qui va avoir une condition IF avec SETBIT et une ELSE avec CLEARBIT:
La fonction CHANGEBIT change la valeur d'un bit dans une variable. CHANGEBIT N fait la même chose, en inverse. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Rien de bien compliqué. Exemple, pour l'encodeur de cap: Var 0607 , name HDG, Link IOCARD_ENCODER, Input 86, Acceleration 6 //Heading Donc: définition de la variable, agissant comme un encodeur et non un interrupteur, première entrée sur la carte Master: 86, accélération à définir selon le type d'encodeur pour obtenir un déplacement sans à-coups. Il n'y a plus qu'à définir ensuite les conditions de fonctionnement de cet encodeur. De nombreux exemples d'utilisation des encodeurs se trouvent sur les sites spécialisés d'Internet. Les encodeurs font souvent appel à des "fonctions". |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Pas plus compliqué que les encodeurs, on pourra définir les positions 0, centre et maximum du potentiomètre utilisé. Exemple: c'est à dire que la variable L_THROTTLE est commandée par un potentiomètre branché sur l'entrée analogique n°1 de la carte d'interface USB . La course du potentiomètre est divisée en 255 "positions". Le potentiomètre aura le calibrage suivant : sa valeur 0 Ohms sera la position de butée gauche, sa valeur en ohms maximum (10 Kilohms) correspondra à la position extrême 255, et si nous voulons que sa courbe de variation soit linéaire, sa position médiane correspondra à 255/2, soit 127. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Nous en avons vu quelques exemples ci-dessus, ces variables ne comportent rien de bien particulier. Exemple d'une variable de sortie: Var 0703, name AP_ALT_LED, Link IOCARD_OUT, Output 20 // Voyant PA mode ALT
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Ceci concerne principalement la carte USB Outputs, mais aussi les cartes Servos, Stepper, etc...
Le numéro IDXLe numéro d’Index IDX (0,1,2, etc… par défaut) est très important, c’est lui qui va déterminer si une variable Output devant par exemple allumer une LED sur la sortie Output n°11, doit le faire sur la 11 de la carte Master (J2) ou sur la 11 de la USB Output. Le numéro de « device »Le numéro de « device », dans la capture d’écran ci-dessus 85 ou 84, change à chaque fois qu’on change de port USB sur l’ordinateur ou sur un hub USB. Le fichier sioc.ini, et le logiciel Config SIOC ini.Pour configurer correctement ce fichier, il est recommandé d’utiliser le petit logiciel « config SIOC ini » de Fernando Brea, très visuel. Dans « File » de ce logiciel on choisit le fichier « sioc.ini » et ensuite dans l’onglet « Masters » on ajoute la carte USB Output (Enable coché):
Ici, nous avons laissé les IDX 0 et 1, la carte Master/USB Expansion portant le n°0 est donc la carte par défaut.
La première Master est la carte Master classique. Elle a le numéro d’index 0, le chiffre 4 correspond à une Master branchée sur la carte USB Expansion, le 1 indique qu’il n’y a qu’une seule Master utilisée, et le 85, qui changera avec chaque prise USB, est le n° de « device ». La deuxième Master est en fait la carte USB Output, son index est 1, le 6 signifie carte USB Output, le 1 indique qu’il n’y en a qu’une, et le 84 est le n° de « device ». Même principe en cas de cartes multiples (plusieurs cartes servos par exemple). |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
SIOC permet bien entendu d'afficher sur des afficheurs 7 digits la valeur d'une variable. Ce peut être une fréquence radio, un cap, le niveau de carburant, la pression barométrique, mais aussi la valeur quelconque d'une variable interne. Une variable d'affichage sera tout naturellement liée à la carte Display multiplexée, et donc on choisira Link To: IOCARD_DISPLAY. Rappel 1: pour qu'une variable puisse prendre en compte des valeurs négatives, il faut que dans ses paramètres soit indiqué "Type 1". Rappel 2: la carte Display est dite "multiplexée", car elle fournit une alimentation intermittente à ses afficheurs, à tour de rôle. Les variables d'affichage peuvent aussi prendre des valeurs "spéciales" parfois très utiles:
N'oubliez pas le signe - devant ces valeurs. De nombreux exemples d'utilisation des afficheurs se trouvent sur le Forum SIOC de OpenCockpits. Les 1 fixes : on peut économiser des sorties de la carte Display en remarquant que les 1 des fréquences radio (ex: 118.60) sont fixes, c'est bien connu. On peut les brancher directement sur l'alimentation avec une résistance . Inconvénient, ils sont trop lumineux et quand on éteint l'afficheur, ils restent allumés. Solution possible: relier l'anode des segments, qui sont des LEDs, à une ou plusieurs sorties J2 de la carte Master, en faisant attention à ne pas dépasser 20 mA par sortie.Les cathodes, multiplexées, étant communes sur les afficheurs, et reliées à la carte Display, les segments ainsi alimentés seront eux aussi multiplexés, et fonctionneront comme leurs voisins, avec la même luminosité, et sans qu'il soit nécessaire d'intercaler une résistance. Attention: le nombre d'afficheurs doit correspondre au nombre maximum de chiffres à afficher, sinon gros cafouillages. Exemple d'utilisation: afficher la température extérieure OAT. Var 0031, name OAT, Link FSUIPC_IN, Offset $0E8C, Length 2, Type 1 // température extérieure Var 0600, name OAT_DIS, Link IOCARD_DISPLAY, Digit 0, Numbers 3 // Affichage Temp. extérieure La variable OAT est de Type 1, pour prendre en compte les températures négatives. On divise sa valeur par 256 pour obtenir la valeur en degrés centigrades. On utilise ensuite la fonction TRUNC pour arrondir cette valeur et être sûr de ne pas dépasser le nombre de chiffres: ici nous avons deux afficheurs pour les chiffres plus un pour le signe moins, soit trois afficheurs, les n° 0,1 et 2 sur la carte Display. On voit également qu'une variable quelconque, ici OAT, mais ce pourrait être aussi une subroutine, peut commander directement la valeur d'une variable d'affichage, sans variable interne intermédiaire. On peut bien entendu faire intervenir autant de conditions qu'on le souhaite. Un autre exemple: un afficheur digital indique la tension du bus gauche, sur un Beech 200. Si l'inter de batterie =1, la batterie =1. Deuxième condition: si le générateur gauche a la valeur 2, c'est à dire qu'il est en marche, l'afficheur de tension va indiquer 28 (volts) . Si on coupe le générateur , l'afficheur indiquera 22 volts, la tension de la batterie seule. Si la batterie est coupée, l'afficheur indiquera 0. Jusque là, pas de problème. Mais on a un gros dévoreur de courant à bord, le dégivrage de l'hélice. Quand il est en marche, la tension du générateur chute de 1 volt, malgré sa régulation. On pourra donc écrire: si dégivrage =1 alors afficheur = afficheur -1. Au lieu d'indiquer 28 volts, l'afficheur indiquera 27 volts. Si on coupe le dégivrage, le ELSE prévoit que dans ce cas c'est la subroutine définissant les conditions d'affichage qui reprend la main, et la tension remonte à 28 volts. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment générer des équivalents clavier avec SIOC
1° Dans le fichier SIOC.ini, attribuer des équivalents clavier à chaque numéro #. Ceci suit les mêmes règles que pour l’attribution à la carte USB Keys, en particulier :
Enregistrer le fichier SIOC.ini modifié (Program Files/IOCards)
2° Dans le fichier ssi, créer une variable « Keys », par exemple : Var001, name Keys, Link KEYS Link KEYS est dans la liste des liens possibles sous le nom Keyboard Emulator, et non USB Keys… A chaque fois qu’on demandera une action à un interrupteur, il se réfèrera à cette variable et lui attribuera un numéro, donc un équivalent clavier selon les attributions de sioc.ini Exemple : un interrupteur var 002, name Inter, link IOCARD_SW, input 01 // inter pour essais Si var 002 a une valeur 1, on lui assigne Keys=1 pour lui faire envoyer un G minuscule, ou Keys=2 pour lui faire envoyer un F7, etc… F Après ce premier ASSIGN, il faut en mettre un deuxième, pour faire une remise à zéro, et permettre que l’interrupteur puisse envoyer de nouveau son code. Exemple: la machine à café du Beech 200: Var 0474, name COFFEE_MACH_SW, Link IOCARD_SW, Input 44 // Poussoir son machine à café |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Une variable SIOC peut très bien déclencher un son, qu'il s'agisse d'une variable liée à un interrupteur ("Fasten Seat Belts") ou d'une variable déclenchée par une autre ou un calcul (par exemple un son d'alarme quand l'altitude de l'avion arrive à + ou - 1000 pieds de l'altitude demandée au sélecteur d'altitude). Les fichiers sons peuvent être n'importe quel fichier .wav, ils n'ont rien à voir avec FSUIPC ni même avec les fichiers sons de l'avion. Il suffit que les fichiers en question soient placés dans le même dossier que les fichiers SIOC. Le plus simple est de tout mettre dans Program Files \ IOCards. On aura par exemple dans le dossier SIOC:
A noter que l'utilisation de IOC Sound.exe n'est plus nécessaire avec les dernières versions de SIOC. Ensuite, il faut s'occuper du fichier sioc.ini, et modifier le paragraphe [SOUND MODULE] en indiquant des numéros d'ordre, commençant par #1, pour chaque fichier son qui sera utilisé dans le programme .ssi de chaque avion. Cela donnera dans notre exemple:
[SOUND MODULE] [ #1 ] [ #2 ] [ #3 ] [ #4 ] [ #5 ] [ #6 ]
Les paramètres -1, -1, 0 correspondent à : Sauf cas particulier, on ne retouchera que rarement ces paramètres. A noter également que notre son #2 est précédé d'un *, qui signifie que ce son devra être joué en boucle. Ensuite, plusieurs méthodes sont possibles, mais je suivrai la suggestion de Guda, qui préconise de créer deux variables, l'une pour lancer tous les sons , ceux qui sont joués une fois et ceux qui sont joués en boucle, et une autre pour arrêter les sons en boucle uniquement. Ces variables seront liées au module SOUND. A noter que la variable d'arrêt comporte le paramètre "Type S" , indispensable dans ce cas.
Il ne restera plus qu'à indiquer dans la variable qui commandera le son, un interrupteur par exemple, quel numéro de fichier son la variable PLAY_SOUND devra lancer, et de reprendre le même numéro dans la variable STOP_SOUND. Mais attention, quand une variable a pris une valeur quelconque, il n'y a aucune raison qu'elle en change, à moins qu'on ne l'y force. Quand votre interrupteur qui commande les signaux passagers, par exemple, a pris la valeur 1 pour appeler le son n°1, si vous voulez de nouveau actionner cet interrupteur, il faudra au préalable que la variable PLAY_SOUND ait repris la valeur 0, sinon il ne se passera rien. La remise de l'interrupteur en position OFF pourrait s'en charger, mais c'est une bonne habitude que de remettre la variable PLAY_SOUND à zéro immédiatement après qu'elle ait lancé un son. Exemple:
Sur cet exemple, on voit aussi qu'il est inutile d'utiliser la variable STOP_SOUND, puisqu'il s'agit d'un son joué une fois, qui s'arrête de lui même. Si par contre on lance un son en boucle, comme l'alarme incendie appelant le son FIRE_BELL.wav, il est indispensable non seulement de remettre à zéro la variable PLAY_SOUND, mais également la variable STOP_SOUND, sinon votre avion pourra brûler une fois, mais pas deux ...
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
TRUNC: Lorsque la valeur d'une variable est le résultat d'un calcul, comme V0001=V0002*(100/16384),le résultat de l'opération n'est pas arrondi dans Flight Simulator pour être pris en compte par une gauge, mais "tronqué", c'est à dire écourté: 15,780 ne sera pas pris en compte comme 15,8 ni comme 16, mais comme 15. Quand ce mode de prise en compte est obligatoire, on utilise le paramètre TRUNC. Par exemple, V0003=TRUNC L0 ROUND: à l'inverse de TRUNC, cette fonction arrondit la valeur d'un calcul à une valeur entière, sans décimales. NOT: change la valeur 0 ou 1 d'une variable booléenne, en lui donnant la valeur inverse de ce qui est indiqué dans le paramètre 1 FROM BCD convertit en valeur décimale une valeur en binaire. TO BCD fait l'inverse. ROTATE: exécute des incrémentations ou des décrémentations cycliques. Permet de simplifier la programmation des encodeurs. TOGGLE: modifie à 1 puis à 0, ou inversement, la valeur d'un bit d'une variable. ABS: renvoie à une valeur absolue. LIMIT: incrémente une variable en fonction de certaines limites . Exemple si on veut écrire DIV: calcule le résultat entier d'une division entre deux nombres Note: les variables ont toujours une valeur numérique, exprimée soit en décimal, soit en hexadécimal. Et comme pour toute valeur numérique, il est possible d'y appliquer des formules mathématiques. On peut ainsi multiplier une variable par une autre (*) ou la diviser par une autre ou par un nombre fixe (/) , additionner deux variables (+) , etc...
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Quand on a fait ou recopié le code d'un script déterminé, on l'essaye avant d'aller plus loin. Ce qu'il ne faut pas faire est de changer pour essais les numéros d'entrée ou de sortie d'un interrupteur ou d'une LED déja installés pour les utiliser pour l'essai d'une fonction nouvelle. On arrive vite à des oublis, des confusions de numéros, bref quand quelque chose fonctionne on n'y touche plus. Il est tentant d'utiliser les afficheurs digitaux du niveau de carburant par exemple, pour vérifier si le transpondeur fonctionne, mais l'opération est risquée. Il m'est rapidement apparu qu'il fallait avoir un banc de test pour faire les essais sans toucher au reste. Pour ce faire, si on crée un code SIOC nouveau, on va se réserver tout d'abord des variables de test : si nos variables des interrupteurs sont dans la série 400 à 499, on créera des variables pour tester des interrupteurs dans la série 2400 à 2499 par exemple. Quand le script nouveau fonctionnera, on attribuera des numéros définitifs en retirant le 2 pour ne garder que le 400. Dans le même ordre d'idées, il est indispensable de se réserver des numéros d'entrées, sorties et afficheurs pour faire les essais. Ce sera par exemple le dernier groupe d'entrées de la carte Master, soit les numéros 63 à 71 avec la masse commune GND8 si on n'a qu'une seule carte Master, soit, c'est plus probable, si on en utilise deux, le groupe 135 à 143 avec la masse GND16. Ceci permet le test de deux interrupteurs à levier, de deux boutons poussoirs et de deux encodeurs. Il est très pratique d'utiliser le tableau des attributions de Joël Péruffo, qui dans le dernier cas indiquera :
On peut de même se réserver les sorties 54 et 55 de la première Master ou les 118 et 119 de la deuxième pour essayer des LEDs, et on gardera 5 afficheurs sur une des cartes Display uniquement pour les tests. Cela peut paraître un gaspillage des sorties, mais en fait on y gagne largement.
Nous avons donc des variables de test dans la série 2000, des entrées Master, des sorties LEDs et des sorties Displays réservées, reste à savoir à quoi cela correspond physiquement.
Une petite console de test . L'investissement n'est pas considérable, on mettra dans un petit boitier deux interrupteurs, deux poussoirs, deux LEDs sans résistance puisqu'elles seront branchées sur les deux sorties Output réservées, un bloc de 5 afficheurs pouvant par exemple afficher l'altitude sélectionnée (5 chiffres) mais aussi un cap à trois chiffres, et deux encodeurs CTS 288 pour pouvoir tester les radios. Cette petite console peut rester branchée en permanence sur le cockpit, elle fonctionnera avec nos variables de test en fonction des besoins.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Conclusion Ce court tutoriel donne un aperçu des possibilités de SIOC. A partir de ces bases, il est facile de concevoir les commandes les plus complexes, . SIOC est un outil remarquablement puissant, d'une stabilité totale, on comprend qu'il soit devenu le langage de programmation des cockpits le plus répandu dans le monde. Merci à Manuel Vélez |