Air Manager problème de variable

Programmation LUA, Macros FSUIPC, logiciel LINDA
et codage en LUA des gauges Air Manager

Re: Air Manager problème de variable

Messagede JacquesZ » Mer 23 Aoû 2017 00:54

bon alors si pas d'éclairage cabine, ça donne ça, en prenant en compte le MASTER sur ON en plus:

Code: Tout sélectionner
--MS-760 test lights sur gauge oil--

local night=true

--chargement des images puis on les cache--

----------------------------------------------------------------------------------------------
face_nuit = img_add_fullscreen("ms-oil-face_2_N.png")
visible(face_nuit, false)
img_needle_L_nuit = img_add("ms_oil_needle_LH_N.png", -5, 120, 116, 19)
visible(img_needle_L_nuit,false)
img_needle_R_nuit= img_add("ms_oil_needle_RH_N.png", 142, 122, 112,11)
visible(img_needle_R_nuit, false)
plate_nuit = img_add_fullscreen("ms_oil_faceplate_N.png")
visible(plate_nuit, false)

face_jour = img_add_fullscreen("ms-oil-face_2.png")
visible(face_jour, false)
img_needle_L = img_add("ms_oil_needle_LH.png", -5, 120, 116, 19)
visible(img_needle_L, false)
img_needle_R = img_add("ms_oil_needle_RH.png", 142, 122, 112,11)
visible(img_needle_R, false)
plate_jour = img_add_fullscreen("ms_oil_faceplate.png")
visible(plate_jour, false)

face_lighted = img_add_fullscreen("ms-oil-face_2_L.png")
visible(face_lighted, false)
img_needle_L_lighted = img_add("ms_oil_needle_LH.png", -5, 120, 116, 19)
visible(img_needle_L_lighted, false)
img_needle_R_lighted = img_add("ms_oil_needle_RH.png", 142, 122, 112,11)
visible(img_needle_R_lighted, false)
plate_lighted = img_add_fullscreen("ms_oil_faceplate.png")
visible(plate_lighted, false)

---------------------------------------------------------------------------------------------------

--choix d'image en fontion de l'eclairage--

function new_light_FSX(lightpanel,lightcabin,timeofday,master)
light_panel=lightpanel--fif(lightpanel,1,0)
light_cabin=lightcabin--fif(lightcabin,0,1)
if timeofday==3 then
   night=true
else
   night=false
end
if  night==false then -- on est de jour
   visible(face_jour, true)
   visible(img_needle_L, true)
   visible(img_needle_R,true)
   visible(plate_jour, true)
   visible(face_nuit,false)
   visible(img_needle_L_nuit,false)
   visible(img_needle_R_nuit,  false)
   visible(plate_nuit,false)
   visible(face_lighted, false)
   visible(img_needle_L_lighted, false)
   visible(img_needle_R_lighted, false)
   visible(plate_lighted, false)
   
elseif light_panel==false or master==false then -- on est de nuit, master sur off OU panel light sur off
   visible(face_jour, false)
   visible(img_needle_L, false)
   visible(img_needle_R,false)
   visible(plate_jour, false)
   visible(face_nuit,true)
   visible(img_needle_L_nuit,true)
   visible(img_needle_R_nuit,  true)
   visible(plate_nuit,true)
   visible(face_lighted, false)
   visible(img_needle_L_lighted, false)
   visible(img_needle_R_lighted, false)
   visible(plate_lighted, false)

elseif master==true then -- on est de nuit, panel sur on ET master sur on
   visible(face_jour, false)
   visible(img_needle_L, false)
   visible(img_needle_R,false)
   visible(plate_jour, false)
   visible(face_nuit,false)
   visible(img_needle_L_nuit,false)
   visible(img_needle_R_nuit,  false)
   visible(plate_nuit,false)
   visible(face_lighted, true)
   visible(img_needle_L_lighted, true)
   visible(img_needle_R_lighted, true)
   visible(plate_lighted, true)
end
end
----------------------------------------------------------------------------------------------------
--gestion du déplacement des aiguilles--
function new_oilpress_1(oilpressL)

 
   pressL = var_cap(oilpressL[1], 0, 1280)
   
   img_rotate(img_needle_L, pressL * -1 * 120 / 1150 + 65)
   img_rotate(img_needle_L_nuit, pressL * -1 * 120 / 1150 + 65)
   img_rotate(img_needle_L_lighted, pressL * -1 * 120 / 1150 + 65)
end

function new_oilpress_2(oilpressR)


   pressR = var_cap(oilpressR[1], 0, 1280)
   
   img_rotate(img_needle_R, pressR * -1 * 120 / (-1150) - 65)
   img_rotate(img_needle_R_nuit, pressR * -1 * 120 / (-1150) - 65)
   img_rotate(img_needle_R_lighted, pressR * -1 * 120 / (-1150) - 65)
end

function new_oilpress_FSX(oilpressA,oilpressB)
   oilpress1 = oilpressA*14.5038
   oilpress2 = oilpressB*14.5038
   new_oilpress_1({oilpress1})
   new_oilpress_2({oilpress2})
   
end

-- Bus subscribe --


xpl_dataref_subscribe("sim/cockpit2/engine/indicators/EGT_deg_C", "FLOAT[8]", new_EGT)
fsx_variable_subscribe("LIGHT PANEL","Bool",
                  "LIGHT CABIN","Bool",
                  "TIME OF DAY", "Enum",
                  "ELECTRICAL MASTER BATTERY","Bool", new_light_FSX)
fsx_variable_subscribe("ENG OIL PRESSURE:1", "PSI", "ENG OIL PRESSURE:2", "PSI",new_oilpress_FSX)




bonne nuit!
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Air Manager problème de variable

Messagede fab » Mer 23 Aoû 2017 07:31

algue14 a écrit:
fab a écrit:Tu n'as pas de fonction "test bit" mais tu as des opérateurs logiques, non ?

Ben oui, y'a
Mais on ne peux agir que sur l'état de variables nommées, pas sur l'état de leurs bits.
Si tu regarde la copie d'écran plus haut, tu verras qu'il n'y a aucune indication là dessus.


Je vois que tu as trouvé une solution, je reviens tout de même sur le test de bit, si cela peut aider !

Tu veux tester l'état des bits d'une variable et tu n'as pas de fonction "test bit"
Exemple : tu veux tester si le bit "panel" est sur 1, il te faut la variable à tester (LIGHT ON STATES) et le masque correspondant à "panel" (0x0020)
- tu fais l'opération logique suivante : LIGHT ON STATES and 0x0020
Si le résultat est supérieur à 0, le bit testé est à 1
Si le résultat est 0, le bit testé est à 0

Fabien
Avatar de l’utilisateur
fab
 
Messages: 4414
Inscription: 26/12/12
Localisation: Roubaix

Re: Air Manager problème de variable

Messagede algue14 » Mer 23 Aoû 2017 10:21

fab a écrit:Je vois que tu as trouvé une solution, je reviens tout de même sur le test de bit, si cela peut aider !
Tu veux tester l'état des bits d'une variable et tu n'as pas de fonction "test bit"
Exemple : tu veux tester si le bit "panel" est sur 1, il te faut la variable à tester (LIGHT ON STATES) et le masque correspondant à "panel" (0x0020)
- tu fais l'opération logique suivante : LIGHT ON STATES and 0x0020
Si le résultat est supérieur à 0, le bit testé est à 1
Si le résultat est 0, le bit testé est à 0

Fabien


Merci Fab de t’intéresser à mon(petit)problème
J'ai pas du tout pensé à l'opération que tu indique c'est peut-être une solution.

J'avais quand même pensé à une opération booléenne puisque c'est un masque.

mais j'ai pas persisté dans cette voie car, comme tu peux le voir dans le tableau, il y a d'autres valeurs de masques, donc, comme il peux y avoir plusieurs trucs allumés, la variable peux alors prendre des valeurs différentes.

De plus la variable "LIGHT ON STATE" est marquée comme "Mask" donc ne semble pas avoir une valeurs booléenne(true ou false).

Enfin c'est ce que je me suis dit, mais j'ai peut-être (surement) tort.

Autre hypothèse : le masque est-il à utiliser comme opérande sur la variable correspondante (0x0020 sur LIGHT PANEL ON)
Apparemment non, parce que chez Chistian "LIGHT PANEL ON" fonctionne bien sur FSX(mais ça je le savais pas quand j'ai créé le post)


c'est pour ces raisons que
algue14 a écrit:Reste "LIGHT ON STATES" mais là peurefrayé murrouge furieuxfumée je ne vois pas comment utiliser ça nonbleu
A+

Alain
Avatar de l’utilisateur
algue14
 
Messages: 1626
Inscription: 20/04/09
Localisation: Caen ; Normandie

Re: Air Manager problème de variable

Messagede JacquesZ » Mer 23 Aoû 2017 12:04

Il existe des opérateurs Lua de manipulation de bits

print(3 & 5) -- bitwise and
print(3 | 5) -- bitwise or
print(3 ~ 5) -- bitwise xor
print(7 >> 1) -- bitwise left shift
print(7 << 1) -- bitwise left shift
print(~7) -- bitwise not

Donc pour les masques, ce serait résultat=(variable & 0x0020), 0x0020 étant la valeur du masque en octet?

Jacques
Ma chaîne YouTube Tutos sur l’A320 par un Pilote de Ligne: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2848
Inscription: 24/11/10

Re: Air Manager problème de variable

Messagede fab » Mer 23 Aoû 2017 12:38

Pas d'inquiétude pour la valeur de la variable, c'est le masque qui compte, donc oui, comme je le dis plus haut, l'opération (VARIABLE and masque) donnera 0 si le bit est à zéro ou une valeur supérieur à 0 si le bit est à 1 !!

Exemple extrême : je prends une variable sur 8 bits, je veux tester le bit 2 d'une variable :
- masque = 0x04 (0b00000100)
- Variable = 0xFF (0b11111111)
- Variable and masque = 0x04 (0b00000100)
0b11111111 Variable
0b00000100 Masque
---------------
0b00000100 Résultat de l'opération and

autre valeur
0b11111100 Variable
0b00000100 Masque
---------------
0b00000100 Résultat de l'opération and

0b11111011 Variable
0b00000100 Masque
---------------
0b00000000 Résultat de l'opération and : le bit testé est bien à 0

(rappel de l'opération and :les 2 valeurs doivent avoir le bit à 1 pour avoir 1 en résultat)
Avatar de l’utilisateur
fab
 
Messages: 4414
Inscription: 26/12/12
Localisation: Roubaix

Re: Air Manager problème de variable

Messagede algue14 » Mer 23 Aoû 2017 14:02

Oui mais là tu prends des masques binaires 0 ou 1
alors qu'on a affaire a des nombres (x0020)
l'idée serait donc de transformer ces nombres en binaire
exemple:
0x0002 = 0000 0010
0x0004 = 0000 0100
0x0010 = 0000 1010

si j'applique ça comme dans ton exemple
var and 0x0002 beacon
1111 1111
0000 0010
=0000 0010 on teste le bit 1

var and 0x0008 taxi
1111 1111
0000 0100
=0000 0100 on teste le bit 2

var and 0x0010 strobe
1111 1111
0000 1010
=0000 1010 on teste les bits 1 et 2


donc en testant strobe on testerait également les bits de beacon et taxi gratgrat

Je reste respectueusement sceptique ecroulerire
A+

Alain
Avatar de l’utilisateur
algue14
 
Messages: 1626
Inscription: 20/04/09
Localisation: Caen ; Normandie

Re: Air Manager problème de variable

Messagede fab » Mer 23 Aoû 2017 14:38

Faut pas transformer quoi que se soit nondoightblanc

Oh là, je crois qu'il te manque une information : 0x0010 c'est de l'hexadécimal (préfix "0x") et donc c'est en 16 bits
Donc 0x0010 en binaire sur 16 bits ça donne 0b0000 0000 0001 0000 !!! et non 0000 1010 comme tu l'écris ci-dessous


var and 0x0010 strobe
1111 1111
0000 1010 >>> FAUT ! il faut écrire 0b0000 0000 0001 0000 pour 0x0010
=0000 1010 on teste les bits 1 et 2

soit :
var and 0x0010 strobe
0b1111 1111 1111 1111
0b0000 0000 0001 0000
= on teste uniquement le bit 4 !!
Avatar de l’utilisateur
fab
 
Messages: 4414
Inscription: 26/12/12
Localisation: Roubaix

Re: Air Manager problème de variable

Messagede algue14 » Mer 23 Aoû 2017 15:12

fab a écrit:Faut pas transformer quoi que se soit nondoightblanc

Oh là, je crois qu'il te manque une information : 0x0010 c'est de l'hexadécimal (préfix "0x") et donc c'est en 16 bits
Donc 0x0010 en binaire sur 16 bits ça donne 0b0000 0000 0001 0000 !!! et non 0000 1010 comme tu l'écris ci-dessous



Oh la la, va falloir que je révise moi bizarreviolet rirernoirjaune
J'ai effectivement pas capté que c’était de l'hexa.

Bon, je garde ça sous le coude, je verrai plus tard si j'obtiens quelque chose dans cette voie.
Merci pour ton aide merci affiche
A+

Alain
Avatar de l’utilisateur
algue14
 
Messages: 1626
Inscription: 20/04/09
Localisation: Caen ; Normandie

Re: Air Manager problème de variable

Messagede fab » Mer 23 Aoû 2017 19:29

De rien, je n'ai pas de mérite, j'ai commencé à développer lors qu'il n'y avait pas encore de langage puissant, on faisait tout avec un set de 15 instructions max ... en assembleur zzzzzzzz
Avatar de l’utilisateur
fab
 
Messages: 4414
Inscription: 26/12/12
Localisation: Roubaix

Re: Air Manager problème de variable

Messagede algue14 » Jeu 24 Aoû 2017 11:57

Bon ben.....ça marche pôôô murrouge ^
Fab ton résonnement est juste pour une fonction "and" algébrique, mais Lua ne fonctionne pas comme ça:
c'est un opérateur logique qui travaille avec "true" ou "false"
http://wxlua.developpez.com/tutoriels/lua/general/cours-complet/#L2-f
L'opérateur de conjonction and retourne son premier argument si cette valeur est false ou nil, ou son second argument dans le cas contraire.

Je me suis donc tourné vers l'idée de Jacques

JacquesZ a écrit:Il existe des opérateurs Lua de manipulation de bits

print(3 & 5) -- bitwise and
print(3 | 5) -- bitwise or
print(3 ~ 5) -- bitwise xor
print(7 >> 1) -- bitwise left shift
print(7 << 1) -- bitwise left shift
print(~7) -- bitwise not

Donc pour les masques, ce serait résultat=(variable & 0x0020), 0x0020 étant la valeur du masque en octet?

Jacques


Ben ça marche pôôô non plus tristounet
Le Lua de AM ne reconnait visiblement pas "&" comme opérande, il me retourne une erreur "unexpected symbol"
J'ai essayé un peu toutes les syntaxes avec ou sans ( ) et différemment placées utilisé ou non le x de "x00200"
il me retourne systématiquement une erreur de syntaxe en réclamant ')'
il considère donc & comme un caractère.

En plus, se pose le problème de la variable elle même.Si on considère que le SDK est juste"LIGHT ON STATES" serait réellement et uniquement le masque avec une valeur Hexa de x0020 ; Alors sur quelle variable l'appliquer????

Je pense que l'opération doit se faire à l’intérieur de FS ou P3D et que le résultat de "variable & 0x0020" doit être "PANEL LIGHT ON"
Sauf que si ça marche bien dans FSX comme le souligne arcc, il doit y avoir un bug dans P3D, c'est la seule explication que je trouve, mais le débat reste ouvert.
A+

Alain
Avatar de l’utilisateur
algue14
 
Messages: 1626
Inscription: 20/04/09
Localisation: Caen ; Normandie

PrécédenteSuivante

Retourner vers LUA, Linda, Macros & gauges Air Manager





Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités