Tutoriel Lua pour interfacer des Lvars avec des inputs et outputs SIOC
Je profite du changement de modèle d'avion pour vous écrire un tutoriel sur la façon d'interfacer des Lvars avec des Inputs et Outputs SIOC.
Cette méthode diffère de la méthode que je vous avais décrite il y a quelque temps pour interfacer l'inverter avec une Lvar en ce sens qu'il faut plonger dans l'écriture d'un script Lua.
Sur mon nouvel avion en l'occurence le B200 de flightOne qui remplace désormais le KA350 natif de P3DV4 il y a pas mal de Lvars que je souhaite utiliser pour avoir de nouvelles fonctionnalités et simplifier ma gestion des alarmes.
Je ne vais pas rentrer dans tous les détails pour l'instant et je vais prendre l'exemple des interrupteurs Bleed Air et des leurs alarmes rouges et vertes associées.
Les interrupteurs Bleed Air sont situés sur le panneau Copilote gauche, ils ont chacun 3 positions.
En bas ils sont Off, au milieu Instruments et Env Off et en haut Open
Quand ils sont en bas, l'alarme rouge Bleed Air fail droite ou gauche s'allume sur le panneau des warning
Au milieu, les alarmes rouges respectives s'éteignent et seules les alarmes vertes Bleed Air Off sur le panneau des Caution sont allumées
Les interrupteurs placés en position Open éteignent les alarmes vertes.
J'ai donc sur le simulateur 2 interrupteurs à 3 positions, ce qui fait 4 inputs SIOC et 4 voyants d'alarmes donc 4 outputs SIOC à gérer.
Le problème c'est qu'on ne peut pas interfacer directement une input ou une output SIOC avec Lua, il faut passer par des variables FSUIPC et pour se faire on va devoir trouver des variables libres.
Ca tombe bien nous en avons dans la plage 66C0.
La première chose à faire c'est d'établir la liste des Lvars de l'avion.
Pour se faire je vous invite à lire l'article sur le codage de l'inverter avec Lvar, j'y décris la méthode pour avoir la liste des Lvars de votre avion.
Seul impératif je vous le rappelle, il faut une version enregistrée donc payante de FSUIPC
Une fois votre liste de Lvars imprimée, il faut trouver la ou les Lvars qui nous intéresse.
Pour ce tuto je vais utiliser les Lvars suivantes :
L:B200LBleedSwitch inter de gauche
L:B200RBleedSwitch inter de droite
L:B200CLBld voyant alarme verte caution Bleed Air Off gauche
L:B200CRBld voyant alarme verte caution Bleed Air Off droite
L:B200WLBlAirFail voyant alarme rouge warning Bleed Air fail gauche
L:B200WRBlAirFail voyant alarme rouge warning Bleed Air fail droite
Le code SIOC
Maintenant que j'ai mes Lvars, il faut que je déclare 6 variables dans mon code Sioc, ces variables seront des Offsets libres de FSUIPC et ce sont elles qui seront en quelque sorte tampons pour le programme Lua qui va tourner en boucle.
Ces variables seront de longueur 1 donc voici les lignes de code rajoutées dans mon SIOC
Var 0156, name LVAR_LBLD, Link FSUIPC_INout, Offset $66C2, Length 1 // Voyant L bleed air off
Var 0157, name LVAR_RBLD, Link FSUIPC_INout, Offset $66C3, Length 1 // Voyant R bleed air off
Var 0158, name LVAR_LBLDSW, Link FSUIPC_INout, Offset $66C4, Length 1 // position du switch L bleed air ( 2 = off, 1 = Env off, 0 = Open )
Var 0159, name LVAR_RBLDSW, Link FSUIPC_INout, Offset $66C5, Length 1 // position du switch R bleed air ( 2 = off, 1 = Env off, 0 = Open
Var 0161, name LVAR_MLBLD, Link FSUIPC_INout, Offset $66C7, Length 1 // Voyant rouge L bleed air fail
Var 0162, name LVAR_MRBLD, Link FSUIPC_INout, Offset $66C8, Length 1 // Voyant rouge R bleed air fail
Ces variables déclarées, il faut maintenant avoir une input pour chaque position de chaque switch
Je vais rester sur le switch de gauche, je vous laisse le soin de faire la même chose pour le droit
Donc , déclarons les 2 inputs pour notre switch
var 150, name BleedL1_sw, link iocard ......
var 151, name BleedL2_sw, ......
En position bas l'inter doit donner la valeur 2 à l'offset Fsuipc, en position médiane l'offset doit prendre la valeur 1 et en position haute il doit prendre la valeur 0.
On rejoint la programmation classique, chaque fois que l'inter bouge, il donne une valeur à l'offset correspondant
var 150, name BleedL2_sw, link iocard ...... // position basse du switch
{
If &BleedL2_sw = 1
{
&LVAR_LBLDSW = 2 // l'offset va prendre la valeur 2 off
}
else
{
&LVAR_LBLDSW = 1 // l'offset va prendre la valeur 1 instr et env off
}
}
var 151, name BleedL1_sw, link iocard ......
{
If &BleedL1_sw = 1
{
&LVAR_LBLDSW = 0
}
else
{
&LVAR_LBLDSW = 1 // l'offset va prendre la valeur 1 instr et env off
}
}
Vous suivez ? Pause
Maintenant que nos déclarations de switchs sont faites, il faut s'occuper des outputs pour piloter les leds vertes et rouges.
Donc déclarations classique de 4 variables Outputs
var 160, name bleedLgreenLed, link iocard, device 1, output 12 // alarme verte gauche
Et comme c'est l'offset Fsuipc qui va changer ( $66Cx ), c'est lui qui commandera l'output et non pas l'inverse !
Il va falloir rajouter une section sous chaque offset du style ....
Var 0156, name LVAR_LBLD, Link FSUIPC_INout, Offset $66C2, Length 1 // Voyant L bleed air off
{
&bleedLgreenLed = & LVAR_LBLD
}
Le code SIOC étant prêt , il faut maintenant écrire le script Lua.
Le script LUA
Ce script va tourner en boucle et on verra un peu plus loin comment le lancer de façon automatique par FSUIPC.
Ce script fera 2 choses, il récupèrera en permanence la valeur des interrupteurs depuis SIOC et rangera ces valeurs dans les Lvars
L:B200LBleedSwitch et :B200RBleedSwitch et il copiera en permanence les valeurs des Lvars
L:B200CLBld, L:B200CRBld, L:B200WLBlAirFail et L:B200WRBlAirFail dans les offsets qui piloterons les Outputs SIOC
Pour tourner en permanence ce script va commencer par une instruction
While 1 do
end
A l'intérieur de cette boucle nous allons mettre les instructions pour copier les Lvars des voyants d'alarmes dans les Offsets libres de Fsuipc qui eux se chargerons de changer les valeurs des Outputs donc des leds correspondantes
ipc.writeUB(0x66C0,ipc.readLvar('L:B200CLIgnition'))
ipc.writeUB(0x66C1,ipc.readLvar('L:B200CRIgnition'))
ipc.writeUB(0x66C2,ipc.readLvar('L:B200CLbld'))
ipc.writeUB(0x66C3,ipc.readLvar('L:B200CRbld'))
Chaque ligne d'instruction se charge de lire ( ipc.readLvar ) la Lvar et de l'écrire ( ipc.writeUB ) dans l'offset correspondant.
Pour les switchs c'est un peu différent
On teste si la Lvar est différente de la valeur de l'offset du switch
if ipc.readLvar('L:B200LBleedSwitch')~=ipc.readUB(0x66c4) et si c'est différent alors
then on écrit la valeur du switch dans la Lvar
ipc.writeLvar('L:B200LBleedSwitch',ipc.readUB(0x66c4))
end
On intercale un sleep pour ralentir un peu la boucle
ipc.sleep(100)
Voici donc le script Lua complet pour la gestion des Bleed Air
Très Important : la façon de programmer décrite ci dessous n'est pas bonne car elle fait tourner un programme en boucle, c'est contre productif et n'est pas digne d'un informaticien mais pour l'instant cela vous permet d'aborder en douceur la programmation Lua.
On verra par la suite comment faire pour transformer ce programme afin qu'il ne lance une action que lorsqu'un changement de valeur de variable s'opère.
while 1 do
ipc.writeUB(0x66C0,ipc.readLvar('L:B200CLIgnition'))
ipc.writeUB(0x66C1,ipc.readLvar('L:B200CRIgnition'))
ipc.writeUB(0x66C2,ipc.readLvar('L:B200CLbld'))
ipc.writeUB(0x66C3,ipc.readLvar('L:B200CRbld'))
-- pour les inters bleed air
-- faire correspondre l'inter et la Lvar inter off = 2, env off = 1, open = 0
if ipc.readLvar('L:B200LBleedSwitch')~=ipc.readUB(0x66c4) then
ipc.writeLvar('L:B200LBleedSwitch',ipc.readUB(0x66c4))
end
if ipc.readLvar('L:B200RBleedSwitch')~=ipc.readUB(0x66c5) then
ipc.writeLvar('L:B200RBleedSwitch',ipc.readUB(0x66c5))
end
ipc.sleep(100)
end
Ce script sera sauvegardé en fichier portant l'extension .lua dans le répertoire modules de P3DV4, le même répertoire où se trouve FSUIPC
dans mon cas le fichier s'appelle B200F1.lua
Pour finir on modifie le fichier Fsuipc.ini en rajoutant à la fin la section [AUTO] avec une ligne contenant le nom du fichier sous cette forme
[AUTO]
1= lua B200F1 B200F1 c'est le nom de mon fichier .lua
C'est cette section rajoutée qui permettra le lancement automatique du script lors du lancement de P3DV4 et donc de Fsuipc
A découvrir aussi
Inscrivez-vous au blog
Soyez prévenu par email des prochaines mises à jour
Rejoignez les 122 autres membres