Air manager, affichage temporaire d'une image

Gauge Composer / Project Magenta / Reality XP, FlightDecksoft, etc...

Re: Air manager, affichage temporaire d'une image

Messagede JacquesZ » Mar 14 Mai 2019 13:56

@Fab
Vachement bien ta jauge Fab. Elle peut même être placée au dessus d’une Jauge AM je pense.
De plus elle peut utiliser des offsets FSUIPC ce que AM ne sait pas faire (par contre AM est aussi compatible XPlane).

Pour simuler un allumage progressif d’un écran cathodique, on peut avec les nouvelles versions d’AM 3.x, en plus de jouer sur la visibilité, faire varier progressivement l’opacité de l’image entre 1.0(100%) et 0.0(transparent) avec un timer et le tour est joué.

@David
Affiches ton code ici, je vais regarder.

La fonction blink() est assez simple en fait. C’est le même principe que pour simuler l’allumage de l’écran LCD, mais avec une astuce en plus.
On va créer un timer avec une répétition infinie avec une période qui correspond à la durée du clignotement en millisecondes.
1- Mais avant ça, une variable booléenne globale de visibilité du voyant est crée et initialisée a false (éteint)
Code: Tout sélectionner
Etat_voyant=false


2- Le voyant éteint est recouvert par l’image du voyant allumé, cette dernière image est rendue invisible par défaut immédiatement après sa création
Code: Tout sélectionner
visible(img_voyant_allume, Etat_voyant)


3- A chaque appel de la fonction blink(), on inverse simplement l’état du voyant Etat_voyant avec cette astuce:
Code: Tout sélectionner
Etat_voyant=not(Etat_voyant)

C’est la magie d’une variable booléenne qui n’a que deux états (true, false), prendre le contraire d’un état quelqu’il soit retourne obligatoirement l’état opposé. C’est assez intuitif, pas(vrai)=faux, et pas(faux)=vrai! lunettesnoires
Si Etat_voyant est à true, not(true) donnera false, s’il est a false, not(false) donnera true...

4-Il suffit ensuite, toujours dans la fonction blink(), de gérer la visibilité de l’image « voyant Allumé »en fonction de deux choses:
- l’état du voyant (inversé à chaque appel du timer) tel qu’on vient de le voir,
- et la demande effective de clignotement qui est elle gérée par une autre variable booléenne globale (par exemple Transit)

Attention. Pour qu’une variable ne soit pas utilisee simplement localement au niveau de la fonction elle doit avoir obligatoirement été créé au préalable dans le code et sa valeur initiale donnera son type (ici booléen).
On aura donc inséré au début du code la ligne pour déclarer la variable Transit et du même coup empêcher le clignotement.
Code: Tout sélectionner
Transit=false


5- Pour terminer la fonction blink(), on mettra donc la ligne suivante qui va gérer la visibilité du voyant allumé en fonction des deux critères décrits précédemment:
Code: Tout sélectionner
visible(img_voyant_allume, Etat_voyant and Transit)


Pour que le voyant s’allume il faudra que les deux conditions soient remplies simultanément (true and true)
Si Transit est à false, quelque soit la valeur de État_voyant, le voyant ne s’allumera pas ((true and false) ou (false and false)).Quand Transit est à true, le voyant s’allumera seulement un coup sur deux, quand État_voyant est également à true (true and true).

6- La fonction blink() est terminée. Pour faire clignoter le voyant, on mettra donc au moment nécessaire dans le code (quand tu as détecté la sortie du train et jusqu’au verrouillage)
Code: Tout sélectionner
Transit=true

Et évidemment on remettra Transit à l’état false lorsqu’on veut que le clignotement s’arrête. Comme la fonction blink() est appelée en permanence par le timer, les prochains appels avec Transit à false n’auront simplement aucun effet sur le voyant...

7- avant de créer notre timer « perpétuel », he conseille au préalable de créer une variable qui contiendra la durée du clignotement en millisecondes, a placer en tout début de code, c’est plus facile pour les réglages lors de la mise au point.
Code: Tout sélectionner
blink_duration=300


8- On appellera pour terminer toutes les XXX msec la fonction blink() avec notre timer « perpétuel »:
Code: Tout sélectionner
timer_start(0,blink_duration,blink)


Et c’est tout...
——-
Seul petit défaut de cette méthode, c’est qu’il y a nécessairement un temps de réaction du clignotement d’une période. Si blink() est appelé par le timer avec Transit=true mais que Etat_voyant est déjà à true, le voyant ne s’allumera effectivement qu’au deuxième appel de blink() par le timer (puisqu’on aura la première fois (false et true))

Quand la période de clignotement est relativement courte (200 a 500 Msec), ça ne se voit pas trop, pour des périodes plus longues, on peut s’apercevoir aléatoirement que le voyant ne réagit qu’apres.
Il faut à ce moment là gérer le timer de manière plus fine, l’arrêter et le redémarrer mais c’est un peu plus compliqué et ça rajoute du code en plus.

Jacques
i7 4770K, 16Go, 1To/SSD 500Go, GTX970,Win7, FSX
3 x 22" + 2 x TV 32"
Tdb:1x17" + 1x19",GNS430 Emuteq,FFB Yoke Brunner
Arduino MEGA+LeoBodnar
Ma chaîne YouTube sur l’A320: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2377
Inscription: 24/11/10

Re: Air manager, affichage temporaire d'une image

Messagede Papagolf » Mar 14 Mai 2019 17:32

Jacques merci affiche merci affiche merci affiche merci affiche
j'ai enfin réussi avec un code beaucoup plus simple que celui que j'avais
Bravo encore pour tes compétences.
Je n'ai plus qu'a affiner le temps de clignotement qui est encore rapide ( pour l'instant je suis à 600 millisec)
le train mets un peu moins de 10 secondes pour se deployer
merci encore à 64 ans on est plus long ecroulerire
Bruno
Papagolf
 
Messages: 87
Inscription: 29/11/15
Localisation: 13

Re: Air manager, affichage temporaire d'une image

Messagede JacquesZ » Mar 14 Mai 2019 17:40

Super. Content que ça t’aie aidé.
Et content de voir les voyants multifunction en action!

Est-ce que tu peux publier ton code ici qu’on y jette un oeil s’il te plaît?
Au fait, tu es sûr que le voyant Transit clignote sur le vrai DC3?
C’est assez rare, parce que ça voudrait dire qu’il y a un système de clignoteur de type automobile dans la réalité.

Jacques
i7 4770K, 16Go, 1To/SSD 500Go, GTX970,Win7, FSX
3 x 22" + 2 x TV 32"
Tdb:1x17" + 1x19",GNS430 Emuteq,FFB Yoke Brunner
Arduino MEGA+LeoBodnar
Ma chaîne YouTube sur l’A320: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2377
Inscription: 24/11/10

Re: Air manager, affichage temporaire d'une image

Messagede F-DEUZ » Mar 14 Mai 2019 19:30

Hello,

Super, ca fonctionne nickel.
Bon je m'attaque à la suite.

merci affiche
Image
P8P67 - Core I7 2600K - 16GO - GTX560 2 GO - WIN 7 64 bits - P3D et XP11 - SIOC - Airmanager
F-DEUZ
 
Messages: 178
Inscription: 14/04/11
Localisation: Manosque 04

Re: Air manager, affichage temporaire d'une image

Messagede Papagolf » Mar 14 Mai 2019 19:34

Voila ce que j'ai pu faire grâce a ton aide
Pour le voyant qui clignote sur un vrai DC3 je sais pas mais c'est surtout pour l'aspect didactique de programmation chouettedoights

Code: Tout sélectionner
img_add_fullscreen("Fond.png")
img_GearLtransit = img_add_fullscreen("lefttransit.png")
img_GearLdown = img_add_fullscreen("leftOn.png")
img_GearRtransit = img_add_fullscreen("Righttransit.png")
img_GearRdown = img_add_fullscreen("rightOn.png")

Etat_voyant = false
visible(img_GearLtransit,Etat_voyant)
visible(img_GearRtransit,Etat_voyant)
Transit= false

--fonction Gear
function Voyant_gear(Battery, geardata)                 

    if geardata[1] == 1 and Battery ==1 then img_visible(img_GearLdown, true) else img_visible(img_GearLdown,false) end
    if geardata[2] ==1 and Battery ==1 then img_visible(img_GearRdown, true) else img_visible(img_GearRdown,false) end
 
    if geardata[1] > 0 and geardata[1] < 1 then
      img_visible(img_GearLtransit, true)
   end
    if geardata[2] > 0 and geardata[2] < 1  then
       img_visible(img_GearRtransit, true)
     end   
end   

function blink()
      Etat_voyant= true
      visible(img_GearLtransit, Etat_voyant)
      visible(img_GearRtransit, Etat_voyant)
      Etat_voyant= not(Etat_voyant)
      Transit = false
      visible(img_GearLtransit, Etat_voyant and Transit)
      visible(img_GearRtransit, Etat_voyant and Transit)
      Transit = true
end

blink_duration=600

timer_start(0, blink_duration, blink)

xpl_dataref_subscribe("sim/cockpit/electrical/battery_on", "INT",             
               "sim/aircraft/parts/acf_gear_deploy","FLOAT[10]",
               Voyant_gear)
Papagolf
 
Messages: 87
Inscription: 29/11/15
Localisation: 13

Re: Air manager, affichage temporaire d'une image

Messagede JacquesZ » Mar 14 Mai 2019 22:37

Bien, si ça a fonctionné c’est parfait. chouettedoights

Puisqu’on est dans la pédagogie, je me permets de te conseiller de simplifier ton code de la manière suivante:
1-Une ligne telle que:
Code: Tout sélectionner
img_visible(img_GearLdown,  geardata[1] == 1.0 and Battery ==1)

Peut remplacer facilement tout la ligne suivante et économise au passage un if then else qui est inclus directement dans le visible():
Code: Tout sélectionner
if geardata[1] ==1 and Battery ==1 then img_visible(img_GearLdown, true) else img_visible(img_GearLdown,false) end


2-La fonction blink() qui est appelée toutes les 600 Msec que cela serve ou pas, ne devrait pas à mon avis contenir d’autres instructions que celles qui font clignoter ton voyant de train en transit. Le reste doit être conservé en dehors puisque les voyants trains sortis ne clignotent pas.
Ça rendra ton code plus rapide car moins d’instructions sont exécutées toutes les 600msec, et c’est toujours ça de gagné pour les FPS si AM est exécuté sur le même ordi que XPlane lunettesnoires
Code: Tout sélectionner
function blink()
      Etat_voyant= not(Etat_voyant)
      visible(img_GearLtransit, Etat_voyant and Transit1)
      visible(img_GearRtransit, Etat_voyant and Transit2)
end


Le reste sera géré au niveau de ta fonction Voyant_gear(), simplifiée comme vu précédemment, avec deux variables Transit (Transit 1 et Transit2), pour chacun des deux voyants. Attention également aux types de tes variables Xplane.
Code: Tout sélectionner
--fonction Gear
function Voyant_gear(Battery, geardata)                 

    img_visible(img_GearLdown,  geardata[1] == 1.0 and Battery ==1)— gear data est un FLOAT, on met 1.0
    img_visible(img_GearRdown,  geardata[2] == 1.0 and Battery ==1)— Battery est un INT, on met 1
 
    if geardata[1] > 0.0 and geardata[1] < 1.0 then Transit1=true else Transit1=false end
    if geardata[2] > 0.0 and geardata[2] < 1.0  then Transit2=true else Transit2=false end
end   
 


Ce qui donnera au final:
Code: Tout sélectionner
img_add_fullscreen("Fond.png")
img_GearLtransit = img_add_fullscreen("lefttransit.png")
img_GearLdown = img_add_fullscreen("leftOn.png")
img_GearRtransit = img_add_fullscreen("Righttransit.png")
img_GearRdown = img_add_fullscreen("rightOn.png")

Etat_voyant = false
Transit1= false
Transit2= false
visible(img_GearLtransit,Transit1)
visible(img_GearRtransit,Transit2)

--fonction Gear
function Voyant_gear(Battery, geardata)                 

    img_visible(img_GearLdown,  geardata[1] == 1.0 and Battery ==1)
    img_visible(img_GearRdown,  geardata[2] == 1.0 and Battery ==1)
 
    if geardata[1] > 0.0 and geardata[1] < 1.0 then Transit1=true else Transit1=false end
    if geardata[2] > 0.0 and geardata[2] < 1.0  then Transit2=true else Transit2=false  end
end   

function blink()
      Etat_voyant= not(Etat_voyant)
      visible(img_GearLtransit, Etat_voyant and Transit1)
      visible(img_GearRtransit, Etat_voyant and Transit2)
end

blink_duration=600

timer_start(0, blink_duration, blink)

xpl_dataref_subscribe("sim/cockpit/electrical/battery_on", "INT",             
               "sim/aircraft/parts/acf_gear_deploy","FLOAT[10]",
               Voyant_gear)

 


Pas testé, mais ça devrait fonctionner.

Jacques
Dernière édition par JacquesZ le Mer 15 Mai 2019 11:33, édité 3 fois.
i7 4770K, 16Go, 1To/SSD 500Go, GTX970,Win7, FSX
3 x 22" + 2 x TV 32"
Tdb:1x17" + 1x19",GNS430 Emuteq,FFB Yoke Brunner
Arduino MEGA+LeoBodnar
Ma chaîne YouTube sur l’A320: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2377
Inscription: 24/11/10

Re: Air manager, affichage temporaire d'une image

Messagede Papagolf » Mer 15 Mai 2019 09:43

Bonjour Jacques Z

Merci encore pour ton aide ça marche parfait en plus avec une bonne tempo de 600
Juste une petite modif du code sur l'image transit right mais c rien.
j'ai enfin compris en plus question pédago tu es au top
merci affiche merci affiche
et continue a nous faire rêver avec ton bureau
le dc3 est sympa et me rappelle ma jeunesse bien que ne l'avoir jamais piloté.
Bruno
Papagolf
 
Messages: 87
Inscription: 29/11/15
Localisation: 13

Re: Air manager, affichage temporaire d'une image

Messagede JacquesZ » Mer 15 Mai 2019 11:27

Papagolf a écrit:Bonjour Jacques Z

Merci encore pour ton aide ça marche parfait en plus avec une bonne tempo de 600
Juste une petite modif du code sur l'image transit right mais c rien.
j'ai enfin compris en plus question pédago tu es au top
merci affiche merci affiche
et continue a nous faire rêver avec ton bureau
le dc3 est sympa et me rappelle ma jeunesse bien que ne l'avoir jamais piloté.
Bruno

My pleasure! chouettedoights
Oui, j’ai fait une erreur de copier/coller dans le choix de l’image img_GearLdown au lieu de img_GearRdown, mais tu as corrigé par toi même! applaublanc
Code: Tout sélectionner
    img_visible(img_GearLdown,  geardata[1] == 1.0 and Battery ==1)— gear data est un FLOAT, on met 1.0
    img_visible(img_GearRdown,  geardata[2] == 1.0 and Battery ==1)— Battery est un INT, on met 1

On peut faire des choses vraiment sympas avec AM, et quelques petits « trucs » de programmation à partager, c’est tout l’objet de ce forum extrêmement convivial (jamais vu un clash depuis que j’y suis inscrit ça doit bien faire 4 ans...), le fait est assez rare pour être souligné.

Jacques
(LROP-LHBP-LROP)
i7 4770K, 16Go, 1To/SSD 500Go, GTX970,Win7, FSX
3 x 22" + 2 x TV 32"
Tdb:1x17" + 1x19",GNS430 Emuteq,FFB Yoke Brunner
Arduino MEGA+LeoBodnar
Ma chaîne YouTube sur l’A320: https://youtube.com/channel/UCljftuoKBcgeR-WBgYJpuoA
Avatar de l’utilisateur
JacquesZ
 
Messages: 2377
Inscription: 24/11/10

Re: Air manager, affichage temporaire d'une image

Messagede tabar57 » Mer 15 Mai 2019 13:41

D'accord avec toi Jacques, pas de clash ici et c'est assez surprenant quand on connait d'autres forums ( même très récemment ).
Je pense que c'est du au fait qu'ici, il n'y a que des mecs qui mettent la main dans le cambouis et savent de quoi ils parlent avec toute la modestie qui va avec et surtout un plaisir de partager et de ne pas se la pêter.
Et c'est super car tout le monde apprend de l'autre et partage, maintenant pour être un ancien du forum ( j'étais déjà inscris dans l'ancienne mouture ) je ne sais pas pourquoi çà marche bien ici et c'est tant mieux

Bernard
Mon blog de construction : http://tabar57.blog4ever.com
Hémicockpit de Beechcraft B200 ( de FlightOne ) P3DV4.1 et 2 PC en réseau W7 64 bits et W10, cartes OC et FDbus, vibreur et yoke rdf de BFFsimulation, météo réelle asp4
Avatar de l’utilisateur
tabar57
 
Messages: 2907
Inscription: 29/12/10
Localisation: Dans ma cabine en Lorraine

Re: Air manager, affichage temporaire d'une image

Messagede Papagolf » Mer 15 Mai 2019 20:31

Bonsoir à tous tout à fait d'accord avec toi aussi Bernard
N'oublions pas que c'est une passion et on est pas la à se mesurer ...... chouettedoights
Bruno
Papagolf
 
Messages: 87
Inscription: 29/11/15
Localisation: 13

Précédente

Retourner vers Add-Ons d'instruments sur un ou plusieurs PC





Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité