UN SIMULATEUR DE BEECHCRAFT B200

UN SIMULATEUR DE BEECHCRAFT B200

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.

 

schema1.png

 

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

schema2.png

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

 



12/03/2019
3 Poster un commentaire

A découvrir aussi


Ces blogs de Loisirs créatifs pourraient vous intéresser

Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 121 autres membres