Comment économiser des offsets libres FSUIPC en manipulant des bits sous LUA
le bit 2 donc le troisième
Dans cet article je vais essayer de vous expliquer comment progresser en langage LUA en faisant de la manipulation de bits pour économiser des offsets FSUIPC.
Quel est le problème ?
Sous FSUIPC il y a une plage d'offsets libres qui va de 66C0 à 66FF soit 64 octets, certes cette plage comprend 64 octets ou bytes mais elle est quand même relativement restreinte et peut être vite consommée dès lors que la liste de Lvars de votre addon est longue.
Or quand on débute la programmation sous LUA en interfaçant des Lvars avec des Offsets FSUIPC, on est tenté d'utiliser un offset (un byte) par Lvar.
Par exemple : je veux coupler les alarmes vertes bleed air off et les alarmes rouges bleed air fail de l'addon avec les outputs SIOC ( donc les voyants physiques du cockpit ) . En clair quand un de ces voyants s'allume dans le cockpit virtuel ( depuis la vue virtuelle du cockpit) , je veux que la led correspondante s'allume dans mon cockpit physique.
Pour faire cela, je vais "écouter" la Lvar dédiée et quand elle va changer d'état cela provoquera la recopie de cet état dans l'offset libre FSUIPC pour allumer (ou éteindre ) l'output SIOC correspondante selon le schéma ci dessous.
Mais pour faire cela, il va me falloir un offset par Lvar et donc je vais devoir utiliser 4 offsets de 8 bits 66C0, 66C1, 66C2 et 66C3.
C'est un peu du gâchis parce que dans chaque offset seul le bit 0, le bit de poids faible à droite sera mis à 1, les autres bits ne serviront jamais .
Certes nous avons de la place mais il est toujours de bon ton en programmation d'optimiser son code et de le réduire autant que faire se peut et puis c'est plus riche intellectuellement et çà nous apprend plein de choses.
Les explications qui vont suivre vont donc nous permettre de piloter 8 Lvars avec un seul offset FSUIPC sous réserve que ces Lvars n'utilisent qu'un seul bit et c'est le cas pour les alarmes notamment.
Rappel des commandes à utiliser dans le programme Lua
Pour écouter le changement de la Lvar : event.Lvar("L:B200CLbld",100,"Lblair") "Lblair" étant la fonction lancée si la Lvar change
Pour écrire la Lvar dans l'offset libre 66c0 : ipc.writeUB(0x66C0,ipc.readLvar('L:B200CLbld'))
A ce stade pour faire concorder les 4 alarmes vertes et rouges associées aux Bleed Air nous avons donc besoin de 4 offsets Fsuipc, nous allons réduire ce besoin au seul offset 66C0.
Les Lvars concernées ne faisant que modifier leur bit 0 ( le bit de poids faible ), nous allons recopier dans l'offset 66C0 le seul bit 0 de chaque Lvar dans les 4 premiers bits de cet offset et tester dans le programme sioc le changement de ces bits par une fonction TESTBIT pour provoquer l'allumage des outputs concernées.
Les commandes pour manipuler les bits sous Lua
pour mettre un bit à 1 : ipc.setbitsUB(0x66C0,1) par cette commande je passe le bit 0 à 1
Vous vous grattez la tête !!! c'est normal pas de panique je vous explique ...
Il faut comprendre la structure de cette commande et surtout une nouvelle notion qui est celle du masque
En fait, cette commande ipc.setbitsUB passe à l'état 1 le bit 0 de l'offset 66C0 dont le masque est égal à 1.
Un schéma ci dessous
Fort de ces nouvelles connaissances si vous voulez passer le bit 4 à 1 il vous faudra donc passer une commande :
ipc.setbitsUB(0x66C0,16) rappel : le bit 4 est le cinquième bit et non pas le quatrième car on compte de droite à gauche en partant de 0
Maintenant que vous savez passer un bit à 1, il faut aussi savoir le passer à 0, c'est la commande :
ipc.clearbitsUB(0x66C0,4) qui va passer le bit ? à 0
C'est quel bit au fait ? la réponse est en vert clair tout en haut et à droite de l'article
Le test de ces bits dans SIOC
Nous avons donc maintenant un Offset 66C0 qui voit ses bits qui changent individuellement au rythme des changements des Lvars concernées.
Il faut pouvoir pouvoir tester ces changements de bits dans l'offset pour provoquer les différents changement d'état des outputs impliquées
Dans notre programme SIOC il y a donc une ligne de ce type qui déclare l'offset
Var 0154, name LVAR_ALARM1, Link FSUIPC_INout, Offset $66C0, Length 1
Et a minima une ligne déclarant l'output
Var 5336, name LBLAIROFF_LED, Link IOCARD_OUT, device 1, Output 36
Il suffira donc de rajouter une ligne
&LBLAIROFF_LED = TESTBIT &LVAR_ALARM1,2 pour attribuer la valeur du troisième bit de 66C0 au voyant d'alarme verte L Blair Off
Ce qui nous donne pour mon code
Var 0154, name LVAR_ALARM1, Link FSUIPC_INout, Offset $66C0, Length 1 // offset libre pour le premier groupe d'alarmes via LUA
{
&LIGNITION_LED = TESTBIT &LVAR_ALARM1,0 // attribution de la valeur du premier bit au voyant d'alarme verte Lignition
&RIGNITION_LED = TESTBIT &LVAR_ALARM1,1 // attribution de la valeur du second bit au voyant d'alarme verte Rignition
&LBLAIROFF_LED = TESTBIT &LVAR_ALARM1,2 // attribution de la valeur du troisième bit au voyant d'alarme verte L Blair Off
&RBLAIROFF_LED = TESTBIT &LVAR_ALARM1,3 // attribution de la valeur du quatrième bit au voyant d'alarme verte R Blair Off
&Lnotransf_led = TESTBIT &LVAR_ALARM1,4 // attribution de la valeur du cinquième bit au voyant d'alarme jaune L Notransfert
&Rnotransf_led = TESTBIT &LVAR_ALARM1,5 // attribution de la valeur du sixième bit au voyant d'alarme jaune R Notransfert
&RBLAIR_FAILled = TESTBIT &LVAR_ALARM1,6 // attribution de la valeur du septième bit au voyant d'alarme rouge RBlairFail
&LBLAIR_FAILled = TESTBIT &LVAR_ALARM1,7 // attribution de la valeur du huitième bit au voyant d'alarme rouge LBlairFail
}
Voilà cet article terminé, je pense qu'il est plus délicat à digérer que les précédents car la notion de masque n'est pas évidente.
N'hésitez pas à me faire part de vos remarques ou difficultés
Inscrivez-vous au blog
Soyez prévenu par email des prochaines mises à jour
Rejoignez les 122 autres membres