Lenteur LUA avec P3D V4.5

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

Lenteur LUA avec P3D V4.5

Messagede Ptitgars45 » Mar 9 Juil 2019 17:31

Bonjour à tous,

Après les premières démos effectuées et la première mise en route officielle de tous l'ensemble du simu, je suis confronté à un problème majeur gratgrat . Je m'explique.

Le Nemeth AS355 fonctionne avec ses propres variables. J'utilise donc un LUA pour "jouer" avec les variables. Et c'est là que le problème se pose. I
l y a un décalage monstrueux (~ 2 secondes) entre une action physique dans le pit et son action effective sur le modèle dans P3D, et le même décalage dans l'autre sens, c'est à dire action du modèle P3D vers une gauge du pit (pour les moteurs par exemple). Du coup pas évident de piloter dans ces conditions.

Le reste de ma configuration fonctionnant parfaitement (liaison Ethernet entre les PCs, communication WideFs...), j'en suis venu à la conclusion qu'il y avait un problème au niveau de mon fichier LUA. Je le joint ici afin que les cadors de la programmation puisse y jeter un coup d’œil et m'aiguiller. Le fait de modifier le ipc.sleep(50) à une valeur plus faible ne change rien, je vous ai vu venir !!!!! sourirebis sourirebis

J'émet également un doute quant à la programmation faite par les développeurs sur le taux de rafraichissement du modèle de vol et donc des gauges, mais celles-ci fonctionnent en instantanés sur l'écran, donc...

A la recherche d'une bonne aide..................

Merci d'avance...

Code: Tout sélectionner
while 1 do

-- Fenetre de débuggage
ipc.display(
"\nTrue_Heading="..ipc.readUD(0x66EC).."\nFF_FS_G="..ipc.readUB(0x66DB).."\nENG_G="..ipc.readLvar('L:engine1 off').."\nENG1_N1_%="..ipc.readLvar('L:engine1 n2').."\nENG1_N1_OVH="..ipc.readLvar('L:engine1 n1 overall').."\nENG1_N1="..ipc.readLvar('L:engine1 n1')..
"\nRTR_RPM="..ipc.readLvar('L:rotor1 rpm')..
"\nRTR_RPM="..ipc.readLvar("L:rotor rpm turns")..
"\nRTR_RPM="..ipc.readUW(0x66D2)..
"\nTHM G ="..ipc.readLvar('L:engine1 oil temp')..
"\nPHM G ="..ipc.readLvar('L:engine1 oil press')..
"\nTHM D ="..ipc.readLvar('L:engine2 oil temp')..
"\nPHM D ="..ipc.readLvar('L:engine2 oil press')..
"\nPHM G SIOC="..ipc.readUB(0x66C0)..
"\nENG1 start selector="..ipc.readLvar('L:engine starter select 1')
)
-- Synchro inters
if ipc.readLvar('L:battery1 button') ~= ipc.readUB(0x6800) then ipc.writeLvar('L:battery1 button', ipc.readUB(0x6800)) end -- Batterie G
if ipc.readLvar('L:battery2 button') ~= ipc.readUB(0x6801) then ipc.writeLvar('L:battery2 button', ipc.readUB(0x6801)) end -- Batterie D
if ipc.readLvar('L:generator1 button') ~= ipc.readUB(0x6802) then ipc.writeLvar('L:generator1 button', ipc.readUB(0x6802)) end -- Géné G
if ipc.readLvar('L:generator2 button') ~= ipc.readUB(0x6803) then ipc.writeLvar('L:generator2 button', ipc.readUB(0x6803)) end -- Géné G
if ipc.readLvar('L:engine starter select 1') ~= ipc.readUB(0x6804) then ipc.writeLvar('L:engine starter select 1', ipc.readUB(0x6804)) end -- AEV G
if ipc.readLvar('L:engine starter select 2') ~= ipc.readUB(0x6805) then ipc.writeLvar('L:engine starter select 2', ipc.readUB(0x6805)) end -- AEV D
if ipc.readLvar('L:lever rotor brake') ~= ipc.readUB(0x6806) then ipc.writeLvar('L:lever rotor brake', ipc.readUB(0x6806)) end -- Rotor brake
if ipc.readLvar('L:fuel flow control lewer 1') ~= ipc.readUW(0x6807) then ipc.writeLvar('L:fuel flow control lewer 1', ipc.readUW(0x6807)) end -- Manette de débit G en %
if ipc.readLvar('L:fuel flow control lewer 2') ~= ipc.readUW(0x6809) then ipc.writeLvar('L:fuel flow control lewer 2', ipc.readUW(0x6809)) end -- Manette de débit D en %

-- Bloquage des inters
if ipc.readLvar('L:fuel boost pump no1 button') ~= 0 then ipc.writeLvar('L:fuel boost pump no1 button', 0) end -- Fuel Pump 1
if ipc.readLvar('L:fuel boost pump no2 button') ~= 0 then ipc.writeLvar('L:fuel boost pump no2 button', 0) end -- Fuel Pump 2
if ipc.readLvar('L:avionic button') ~= 0 then ipc.writeLvar('L:avionic button', 0) end -- Avionics avec Batt

-- Lecture des LVars
ENG1_OIL_PRESS = ipc.readLvar("L:engine1 oil press")
ENG2_OIL_PRESS = ipc.readLvar("L:engine2 oil press")
ENG1_OIL_TEMP = ipc.readLvar("L:engine1 oil temp")
ENG2_OIL_TEMP = ipc.readLvar("L:engine2 oil temp")
ENG1_EGT = ipc.readLvar("L:engine1 egt overall")
ENG2_EGT = ipc.readLvar("L:engine2 egt overall")
ENG1_Ng = ipc.readLvar("L:engine1 n1 overall")
ENG2_Ng = ipc.readLvar("L:engine2 n1 overall")
ENG1_DNg = ipc.readLvar("L:eng1 delta ng")
ENG2_DNg = ipc.readLvar("L:eng2 delta ng")
ENG1_TRQ = ipc.readLvar("L:engine1 torque overall")
ENG2_TRQ = ipc.readLvar("L:engine2 torque overall")
ENG1_NTL = ipc.readLvar("L:engine1 n2 base")
ENG2_NTL = ipc.readLvar("L:engine2 n2 base")
GEN1_AMP = ipc.readLvar("L:gen1 amp")
GEN2_AMP = ipc.readLvar("L:gen2 amp")
NR = ipc.readLvar("L:rotor rpm turns")
ENG1_FF_FS = ipc.readLvar("L:engine1 fuel flow")
ENG2_FF_FS = ipc.readLvar("L:engine2 fuel flow")
ALT_G = ipc.readLvar("L:ann inv1")
ALT_D = ipc.readLvar("L:ann inv2")
BAT_G = ipc.readLvar("L:ann battery1")
BAT_D = ipc.readLvar("L:ann battery2")
GEN_G = ipc.readLvar("L:ann generator1")
GEN_D = ipc.readLvar("L:ann generator2")
ENG1_OFF = ipc.readLvar("L:engine1 off")
ENG2_OFF = ipc.readLvar("L:engine2 off")

-- Mise en forme des LVars
XENG1_OIL_PRESS = ENG1_OIL_PRESS * 10
XENG2_OIL_PRESS = ENG2_OIL_PRESS * 10
XENG1_DNg = ENG1_DNg * -1
XENG2_DNg = ENG2_DNg * -1
XGEN1_AMP = GEN1_AMP * 0.38
XGEN2_AMP = GEN2_AMP * 0.42
XENG1_FF_FS = ENG1_FF_FS * 1.23 -- Conversion débit kg -> L
XENG2_FF_FS = ENG2_FF_FS * 1.22 -- Conversion débit kg -> L
XENG1_Ng = ENG1_Ng * 10
XENG2_Ng = ENG2_Ng * 10

-- Ecriture dans Offsets Libres
ipc.writeUB(0x66C0, XENG1_OIL_PRESS)
ipc.writeUB(0x66C1, XENG2_OIL_PRESS)
ipc.writeUB(0x66C2, ENG1_OIL_TEMP)
ipc.writeUB(0x66C3, ENG2_OIL_TEMP)
ipc.writeUW(0x66C4, ENG1_EGT)
ipc.writeUW(0x66C6, ENG2_EGT)
ipc.writeSW(0x66C8, XENG1_Ng)
ipc.writeSW(0x66DD, XENG2_Ng)
ipc.writeUB(0x66CA, XENG1_DNg)
ipc.writeUB(0x66CB, XENG2_DNg)
ipc.writeSB(0x66CC, ENG1_TRQ)
ipc.writeSB(0x66CD, ENG2_TRQ)
ipc.writeUB(0x66CE, ENG1_NTL)
ipc.writeUB(0x66CF, ENG2_NTL)
ipc.writeUB(0x66D0, XGEN1_AMP)
ipc.writeUB(0x66D1, XGEN2_AMP)
ipc.writeUW(0x66D2, NR)
ipc.writeUB(0x66D4, BATT_G)
ipc.writeUB(0x66D5, ALT_G) --Voyant ALT G
ipc.writeUB(0x66D6, ALT_D) --Voyant ALT D
ipc.writeUB(0x66D7, BAT_G) --Voyant BAT G
ipc.writeUB(0x66D8, BAT_D) --Voyant BAT D
ipc.writeUB(0x66D9, GEN_G) --Voyant GEN G
ipc.writeUB(0x66DA, GEN_D) --Voyant GEN D
ipc.writeUB(0x66DB, XENG1_FF_FS)
ipc.writeUB(0x66DC, XENG2_FF_FS)
ipc.writeUB(0x66EA, ENG1_OFF)
ipc.writeUB(0x66EB, ENG2_OFF)

ipc.sleep(50)

end


P.S. : Les photos du pit' arriveront très prochainement !!!
Matthieu
Image Image Image
Avatar de l’utilisateur
Ptitgars45
 
Messages: 225
Inscription: 25/09/11
Localisation: Orange (LFMO)

Re: Lenteur LUA avec P3D V4.5

Messagede tabar57 » Jeu 11 Juil 2019 12:34

Bonjour,

Il faut que tu revois complètement ta façon de programmer en Lua, en clair PAS de while 1 do.
il te faut passer par des fonctions qui ne sont lançées que lorsque la variable en question change de valeur.
Le while 1 do ne sert qu'à faire quelque essais avec une ou 2 variables mais pas plus
Peut être que tu trouveras quelques idées sur mon blog : https://tabar57.blog4ever.com/articles/le-code-sioc
et là : https://tabar57.blog4ever.com/comment-g ... flight-one

Cordialement

Bernard
Mon blog de construction : http://tabar57.blog4ever.com
Hémicockpit de Beechcraft B200 ( de FlightOne ) P3DV4.5 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: 3651
Inscription: 29/12/10
Localisation: Dans ma cabine en Lorraine

Re: Lenteur LUA avec P3D V4.5

Messagede JacquesZ » Jeu 11 Juil 2019 13:24

Bernard a raison, lancer une boucle répétitive et lire des variables qui ne changent que de temps en temps est consommateur en ressources.

Il vaut bien mieux gérer ton code par événement, c’est à dire n’activer une fonction que lorsque la variable ou l’offset correspondant change.

Il existe une fonction fonction fsuipc event.control() qui fait exactement ça:
Code: Tout sélectionner
function flaps_dec(controlnum, param)
   ipc.display("Flaps decrement”)
end

event.control(65759, "flaps_dec")


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: Lenteur LUA avec P3D V4.5

Messagede tabar57 » Jeu 11 Juil 2019 18:19

Tout à fait Jacques et dans le cas de Mathieu ce sera plutôt un eventOffset qu'il devra utiliser du style

event.offset("66D4","UB","bat_gen") pour lancer une fonction bat_gen quand l'offset changera

cette fonction remettra d'équerre la Lvar et le switch ou le voyant associé à 66D4

Bernard
Mon blog de construction : http://tabar57.blog4ever.com
Hémicockpit de Beechcraft B200 ( de FlightOne ) P3DV4.5 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: 3651
Inscription: 29/12/10
Localisation: Dans ma cabine en Lorraine

Re: Lenteur LUA avec P3D V4.5

Messagede arcc » Dim 14 Juil 2019 18:00

Bonsoir

Je rebondis sur ce Post très intéressant.
J'utilise moi même ces fameuses boucles "while 1 do".
Dire que j'ai passé le week end à essayé de comprendre serait exagéré, mais pas tant que ca.

J'utilise cette boucle pour écrire dans des offset libre, les Lvar de mon Twin, puis utilisé ces offset pour les gauges (a base de X27) Donc directe de Lua vers Fdbus
Par exemple :
while 1 do

ipc.writeSW(0X9224,ipc.readLvar("L:Hydraulic_main_press"))
ipc.writeSW(0X9228,ipc.readLvar("L:Hydraulic_brake_press"))
ipc.writeSW(0X922C,ipc.readLvar("L:TW_Bat_Ext_Bus_voltage"))
ipc.writeSW(0X9230,ipc.readLvar("L:Ampmeter_val"))
ipc.writeSW(0X9234,ipc.readLvar("L:Batt_Temp_Meter"))

ipc.sleep(50)

end


Ca fonctionne bien mais j'essaie, avec l'aide de ton blog, de remplacer ce script.
Ce que j'ai compris:

Je dois surveiller une variation de valeur de la LVar et si il y a changement, je dois l'écrire dans l'offset.
Je dois m'orienté plutôt vers un event.Lvar("L:Hydraulic_main_press",......)

Dans ton Blog je vois
event.Lvar("L:B200CLbld",100,"Lblair") "Lblair" étant la fonction lancée si la Lvar change

A quoi correspond le 100 ?

A+
Christian
Un ancien sous-marinier qui a pris de la hauteur.
Avatar de l’utilisateur
arcc
 
Messages: 715
Inscription: 16/12/13
Localisation: La ou fini la terre (Finistere)

Re: Lenteur LUA avec P3D V4.5

Messagede JacquesZ » Dim 14 Juil 2019 18:21

Le 100 correspond à la période de la boucle de vérification interne de la fonction event.Lvar(), en millisecondes.
La fonction attrapera un événement (Évent sur changement de valeur de Lvar FSX/P3D) s’il se produit toutes les 100 msecondes ou plus.
Tu peux diminuer la valeur d’intervalle s’il s’agit d’une valeur qui change fréquemment

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: Lenteur LUA avec P3D V4.5

Messagede tabar57 » Lun 15 Juil 2019 19:23

Merci Jacques, j'ai pas eu le temps de dégainer lolaffiche

Bernard
Mon blog de construction : http://tabar57.blog4ever.com
Hémicockpit de Beechcraft B200 ( de FlightOne ) P3DV4.5 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: 3651
Inscription: 29/12/10
Localisation: Dans ma cabine en Lorraine

Re: Lenteur LUA avec P3D V4.5

Messagede arcc » Mar 16 Juil 2019 19:54

Merci, mais alors on retombe sur une boucle... gratgrat
Sinon j'ai raison avec mon "event Lvar" plutot que "event offset" ?

A+
Christian
Un ancien sous-marinier qui a pris de la hauteur.
Avatar de l’utilisateur
arcc
 
Messages: 715
Inscription: 16/12/13
Localisation: La ou fini la terre (Finistere)

Re: Lenteur LUA avec P3D V4.5

Messagede tabar57 » Mer 17 Juil 2019 16:27

Oui mais sans rapport avec while do ...
Tu as raison pour l'event.Lvar puisque tu teste dans le cas présent un changement de Lvar, si elle change tu attribue sa valeur à un offset FSUIPC

Cordialement

Bernard
Mon blog de construction : http://tabar57.blog4ever.com
Hémicockpit de Beechcraft B200 ( de FlightOne ) P3DV4.5 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: 3651
Inscription: 29/12/10
Localisation: Dans ma cabine en Lorraine

Re: Lenteur LUA avec P3D V4.5

Messagede JacquesZ » Mer 17 Juil 2019 17:09

Oui il y a boucle, mais cette boucle interne est faite en interne directement au niveau de Fsuipc, programmée en assembleur par Dowson et elle a accès direct au registre mémoire de FSX.
Donc largement mieux optimisée qu’une boucle “while 1 do...” en Lua qui nécessite d’être Interprétée à chaque itération, possède en plus dans son code un ipc.sleep de 50 Msec pendant lequel tout le processus est bloqué.
Dernier avantage, seules les variables ayant réellement changé seront réécrites.
A mon avis en termes de charge processeur y’a pas photo.

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

Suivante

Retourner vers LUA, Linda, Macros & gauges Air Manager





Qui est en ligne

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