See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: Le tableau de commande de Mars Bleu  (Read 41715 times)

0 Members and 1 Guest are viewing this topic.

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #100 - 26 February 2018, 18:47:48
Quote
Dis-moi... tu as commencé ton "tableau de commande" il y a combien de temps déjà ??  :wonder:

Oùoùoùoulaâââ... Ça commence à remonter loin. J'ai commencé à regarder comment faire avec Lua fin 2013,
et dès début 2014, j'ai pu me lancer dans les premiers TP d'électronique. Mais il y a eu des essais infructueux,
 des impasses, ce qui fait que ça n'a pas pu aller aussi vite que j’aurais voulu. Et puis, il y a aussi les impératifs
 de la vie domestique, le travail (les travaux). En été, j'avance moins vite qu'en hiver, car les journées plus
longues me permettent de travailler davantage à l'extérieur.
En ce moment, je finalise les pilotes automatiques( Airspeed, Descent, Attitude, plus pilotes auto orbitaux
(pro/retrograde, N+/N-)), avec toute une flopée d'afficheurs 7 segments devant afficher les consignes.
Ensuite, je me pencherai sur la propulsion (Main, Scram, Hover), avec une approche plus facile   originale.
                                        Mais ça ne sera pas encore fini... :badfinger:
Parallèlement, je veux aménager le coin qui accueillera mon beau simpit (pas comme dans la pub EdF :) )
C'est que je commence à avoir pas mal de bazar, avec tous ces panels qui commencent à s'accumuler...

                    :explique:  :explique: :explique: De patience, preuve nous devons faire! :explique: :explique: :explique:



Offline hysot

  • Full Member
  • ***
  • Posts: 120
  • Country: Canada ca
  • Karma: 8
Reply #101 - 08 March 2018, 15:04:27
Salut Mars Bleu,

Je reviens un petit peu avec mon projet de cockpit toujours en tete.
J'ai regarde avec interet ton projet. Tu fais du tres bon boulot.
Je souhaiterais concevoir le miens sur une base similaire. J'essaie d'apprendre le Lua tout comme toi. C'est pas simple mais ca vient doucement.

J'essaie de faire fonctionner le bout de Lua de ton message  PREMIER CHALLENGE: Lire un fichier SCN mais sans succes...
Je parle bien evidemment de ces 4 bouts de codes:

Code: [Select]
-- ******************************************
-- ********read number lines from scn file***
-- ******************************************
function line_read (file)
    number_lines=0
    local g = io.open(file,"r")
    if g ~= nil then
        repeat
            t = g:read()
            number_lines=number_lines+1
        until t == nil
    g:close()
    end
end
-- *****************************************
-- *********end function line_read *********
-- *****************************************

Code: [Select]
-- *******************************************
-- ********load lines from scn file***********
-- *******************************************
function load_scnfile (file,n)
    slist={}
    local f = io.open(file,"r")
    if f ~= nil then
        for i=1,n do
            t = f:read()
            if t == nil then break end
            slist[i]=t
        end     
        f:close()
    end
    return slist
end
-- ******************************************
-- *********end function load_scnfile *******
-- ******************************************

Code: [Select]
-- *******************************************
-- ***********load ship status****************
-- *******************************************
function load_xr2_status (pattern)
    for i=1,number_lines-1 do
       s1 = slist[i]
       _,_,name,classname = string.find (s1, "(.-):(.+)")
       if (classname=='XR2Ravenstar') and (ship=='XR2Ravenstar') then
           name_ship=name
           for j=i, number_lines-1 do
               if string.match (slist[j], 'NOSECONE')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
                   note:set_text('NOSECONE=>'..status..' '..level)
                   proc.wait_sysdt(0.41)
               elseif string.match (slist[j], 'GEAR')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
                    note:set_text('GEAR=>'..status..' '..level)
                   proc.wait_sysdt(0.41)
               elseif string.match (slist[j], 'RADIATOR')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
                   note:set_text('RADIATOR=>'..status..' '..level)
                   proc.wait_sysdt(0.41)
               elseif string.match (slist[j], 'HATCH')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
                   note:set_text('HATCH=>'..status..' '..level)
    elseif slist[j]=='END' then
                   flag_out=1
                   break
               end                     
           end

Code: [Select]
--****************************************************************************
-- ********** begin program ************************* begin program *********
--*****************************************************************************
note = oapi.create_annotation()
note:set_pos (0.35,0.1,0.8,0.95)
note:set_colour ({r=0.9,g=0.5,b=0.2})

data_path = 'Scenarios/(Current state).scn'
intro = 'Load scn data'

note:set_text(intro)
proc.wait_sysdt(0.5)

note:set_colour ({r=0.9,g=0.0,b=0.0})

v=vessel.get_focusinterface()
ship=v:get_classname()
name_ship_focused=v:get_name()


-- ******************************************************
-- ***********begin call functions for scn file**********
-- ******************************************************

sfirst = line_read (data_path)

slist = load_file (data_path,number_lines)


if  ship=='XR2Ravenstar' then
    lstatus = load_xr2_status (ship)
elseif ship=='Xr5Vanguard' then
    note:set_text('Toward function loop load of XR5Vanguard')
    proc.wait_sysdt(2.01)
elseif ship=='ShuttleA' then
    note:set_text('Toward function loop load of ShuttleA')
    proc.wait_sysdt(2.01)
else
    note:set_text('vessel not implemented, simpit not activated')
    proc.wait_sysdt(2.01)
end
-- ******************************************************
-- ************ end call functions for scn file**********
-- ******************************************************
note:set_text('End of program')
proc.wait_sysdt(1)
note:set_text('  ')
proc.wait_sysdt(1)

On est bien d'accord que ce code est fait pour afficher les donnees directement dans orbiter?
On est bien d'accord que ces 4 bouts de code doivent etre assembles dans un meme et unique fichier script comme suit:

Code: [Select]
-- ******************************************
-- ********read number lines from scn file***
-- ******************************************
function line_read (file)
    number_lines=0
    local g = io.open(file,"r")
    if g ~= nil then
        repeat
            t = g:read()
            number_lines=number_lines+1
        until t == nil
    g:close()
    end
end
-- *****************************************
-- *********end function line_read *********
-- *****************************************

-- *******************************************
-- ********load lines from scn file***********
-- *******************************************
function load_scnfile (file,n)
    slist={}
    local f = io.open(file,"r")
    if f ~= nil then
        for i=1,n do
            t = f:read()
            if t == nil then break end
            slist[i]=t
        end     
        f:close()
    end
    return slist
end
-- ******************************************
-- *********end function load_scnfile *******
-- ******************************************

-- *******************************************
-- ***********load ship status****************
-- *******************************************
function load_xr2_status (pattern)
    for i=1,number_lines-1 do
       s1 = slist[i]
       _,_,name,classname = string.find (s1, "(.-):(.+)")
       if (classname=='XR2Ravenstar') and (ship=='XR2Ravenstar') then
           name_ship=name
           for j=i, number_lines-1 do
               if string.match (slist[j], 'NOSECONE')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
                   note:set_text('NOSECONE=>'..status..' '..level)
                   proc.wait_sysdt(0.41)
               elseif string.match (slist[j], 'GEAR')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
                    note:set_text('GEAR=>'..status..' '..level)
                   proc.wait_sysdt(0.41)
               elseif string.match (slist[j], 'RADIATOR')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
                   note:set_text('RADIATOR=>'..status..' '..level)
                   proc.wait_sysdt(0.41)
               elseif string.match (slist[j], 'HATCH')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
                   note:set_text('HATCH=>'..status..' '..level)
    elseif slist[j]=='END' then
                   flag_out=1
                   break
               end                     
           end


--*****************************************************************************
- ********** begin program ************************* begin program *********
--*****************************************************************************
note = oapi.create_annotation()
note:set_pos (0.35,0.1,0.8,0.95)
note:set_colour ({r=0.9,g=0.5,b=0.2})

data_path = 'Scenarios/(Current state).scn'
intro = 'Load scn data'

noteTop:set_text (intro)
proc.wait_sysdt(0.5)

note:set_colour ({r=0.9,g=0.0,b=0.0})

v=vessel.get_focusinterface()
ship=v:get_classname()
name_ship_focused=v:get_name()


-- ******************************************************
-- ***********begin call functions for scn file**********
-- ******************************************************

sfirst = line_read (data_path)

slist = load_file (data_path,number_lines)


if  ship=='XR2Ravenstar' then
    lstatus = load_xr2_status (ship)
elseif ship=='Xr5Vanguard' then
    note:set_text('Toward function loop load of XR5Vanguard')
    proc.wait_sysdt(2.01)
elseif ship=='ShuttleA' then
    note:set_text('Toward function loop load of ShuttleA')
    proc.wait_sysdt(2.01)
else
    note:set_text('vessel not implemented, simpit not activated')
    proc.wait_sysdt(2.01)
end
-- ******************************************************
-- ************ end call functions for scn file**********
-- ******************************************************
note:set_text('End of program')
proc.wait_sysdt(1)
note:set_text('  ')
proc.wait_sysdt(1)


J'ai bien fait attention au fait que tu utilises le scenario (Current state).scn pour le lancement du script. J'ai bien compris comment lancer un script lua dans un scenario orbiter et j'ai aussi pu afficher des donnees directement dans orbiter mais mon code etait different. Pourtant, avec le tiens, rien ne se passe. Du coup, si tu pouvais m'eclaircir un peu. Deja, est ce que mon script est correct ou manque t'il une partie que tu n'avais pas mentionee? L'ordre dans lequel j'ai positionne les codes est peut etre mauvais?

merci du coup de pousse :)

hysot

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #102 - 11 March 2018, 09:32:27
Dans Orbiter, Lua est assez farceur, car il suffit d'un simple oubli de parenthèse, ou bien d'une
erreur dans la structure du script pour que plus rien ne marche, sans aucune indication sur l'endroit
et le type d'erreur.
C'est pour ça que je développe à tout petits pas, et que je fait de nombreuses sauvegardes intermédiaires.

Je voulais mettre le script en entier d'un bloc, mais j'ai atteint la limite de 20 000 caractères. C'est pour
ça que j'ai mis la fonction "xr2_payload_setting (payload_tank, nb_tank_payload,payload_max_capacity,payload_set,payload_i) dans une autre post, à fusionner pour que ça soit fonctionnel. Je l'ai mis au point hier soir, en
enlevant les parties ne concernant pas la transmission des données, ni la boucle de rafraîchissement.
On se concentre juste sur la lecture du fichier SCN.

Code: [Select]
-- ******************************************
-- ********read number lines from scn file***
-- ******************************************
function line_read (file)
    number_lines=0
    local g = io.open(file,"r")
    if g ~= nil then
        repeat
            t = g:read()
            number_lines=number_lines+1
        until t == nil
    g:close()
    end
end
-- *****************************************
-- *********end function line_read *********
-- *****************************************

-- *******************************************
-- ********load lines from scn file***********
-- *******************************************
function load_file (file,n)
    slist={}
    local f = io.open(file,"r")
    if f ~= nil then
        for i=1,n do
            t = f:read()
            if t == nil then break end
            slist[i]=t
        end     
        f:close()
    end
    return slist
end
-- ******************************************
-- *********end function load_scnfile *******
-- ******************************************


-- *******************************************
-- ***********load xr2 status****************
-- *******************************************

function load_xr2_status (pattern)
    status_array={}
    level_array={}
position={}
RCSstatus=1--valeur par dÈfaut dans le SCN
docked=0--valeur par dÈfaut dans le SCN
Miscstatus=1--valeur par dÈfaut (RCS en ROT)
    flag_out=0
    main_fuel_tank=0
    scram_fuel_tank=0
    lox_tank=0
    nb_tank_main_fuel=0
    nb_tank_scram_fuel=0
    nb_tank_lox=0
    name_ship=""
SIPOstatus=0
SIPOtransit_status=0
    for i=1,40 do
        status_array[i]=""
        level_array[i]=""
if (i<19)==true then
position[i]=""
end
    end
    for i=1,number_lines-1 do
       s1 = slist[i]
       _,_,name,classname = string.find (s1, "(.-):(.+)")
--***************************************************************************
--*****************************************************Begin Xr2 settings****
--***************************************************************************
       if (classname=='XR2Ravenstar')  and (name==name_ship_focused) then
           name_ship=name
           status_array[1]=v:get_rcsmode()
           note:set_text('Mode rcs'..'=>'..status_array[1])
           proc.wait_sysdt(0.21*afficher)
           main_fuel=v:get_propellanthandle(0)
           level_array[1]=v:get_propellantmass(main_fuel)
           note:set_text('Main fuel=>'..level_array[1]..'kg')
           proc.wait_sysdt(0.21*afficher)
           rcs_fuel=v:get_propellanthandle(1)
           level_array[2]=v:get_propellantmass(rcs_fuel)
           note:set_text('Rcs fuel=>'..level_array[2]..'kg')
           proc.wait_sysdt(0.21*afficher)
           scram_fuel=v:get_propellanthandle(2)
           level_array[3]=v:get_propellantmass(scram_fuel)
           note:set_text('Scram fuel=>'..level_array[3]..'kg')
           proc.wait_sysdt(0.5*afficher)
           for j=i, number_lines-1 do           
               if string.match (slist[j], 'APU_FUEL_QTY')~=nil then
                   _,_,aux,level = string.find(slist[j],"(.+) (.+)")
                   level_array[4]=level*268
                   note:set_text('APU fuel'..'=>'..level_array[4]..'kg')
                   proc.wait_sysdt(0.5*afficher)
               elseif string.match (slist[j], 'APU_STATUS')~=nil then   --dÈbut process 13 auxiliaires
                   _,_,aux,status = string.find(slist[j],"(.+) (.+)")
                   power=15
   level=0
   delay=0
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)    
   note:set_text('Status APU'..'=>'..SIPOstatus)
                   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'NOSECONE')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=14
   delay=20000
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)
   note:set_text('NOSECONE==>'..SIPOstatus..' '..SIPOtransit_status)
                   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'AIRLOCK')~=nil and string.match (slist[j], 'IAIRLOCK')==nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=13
   delay=10000
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)
   note:set_text('AIRLOCK==>'..SIPOstatus..' '..SIPOtransit_status)
                   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'CHAMBER')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=12
   delay=28000
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)
   note:set_text('CHAMBER==>'..SIPOstatus..' '..SIPOtransit_status)
                   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'IAIRLOCK')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=11
   delay=10000
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)
   note:set_text('IAIRLOCK==>'..SIPOstatus..' '..SIPOtransit_status)
                   proc.wait_sysdt(0.5*afficher)    
               elseif string.match (slist[j], 'BAY_DOORS')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=10
   delay=22000
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)
   note:set_text('BAY DOORS==>'..SIPOstatus..' '..SIPOtransit_status)
                   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'SCRAM_DOORS')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=9
   delay=3000
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)
   note:set_text('SCRAMDOORS==>'..SIPOstatus..' '..SIPOtransit_status)
                   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'HOVER_DOORS')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=8
   delay=5000
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)
   note:set_text('HOVERDOORS==>'..SIPOstatus..' '..SIPOtransit_status)
                   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'RCOVER')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=7
   delay=33000
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)
   note:set_text('RETRODOORS==>'..SIPOstatus..' '..SIPOtransit_status)
                   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'HATCH')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=6
   delay=6600
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)
   note:set_text('HATCH==>'..SIPOstatus..' '..SIPOtransit_status)
                   proc.wait_sysdt(0.5*afficher)
               elseif string.match (slist[j], 'RADIATOR')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=5
   delay=32000
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)    
                   note:set_text('RADIATOR=>'..SIPOstatus..' '..SIPOtransit_status..'  Position:'..position[5])
                   proc.wait_sysdt(0.5*afficher)
               elseif string.match (slist[j], 'AIRBRAKE')~=nil then
                   _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=4
   delay=3300
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)    
                   note:set_text('AIRBRAKE=>'..SIPOstatus..' '..SIPOtransit_status)
                   proc.wait_sysdt(0.5*afficher)
          --[[     elseif string.match (slist[j], 'GEAR')~=nil then
       _,_,_,status,level = string.find(slist[j],"(.+) (.+) (.+)")
   power=3
   delay=6700
   sprocess=process(SIPOtransit_status,SIPOstatus,power,status,level,delay)    
                   note:set_text('GEAR=>'..SIPOstatus..' '..SIPOtransit_status)
                   proc.wait_sysdt(0.5*afficher)]] --fin traitement des 13 aux
   elseif string.match (slist[j], 'Landed')~=nil then
   --MSB de position[3] laissÈ ‡ 0 afin d'indiquer que le vaisseau est posÈ. Calcul fait par position[3]=position[3]+32768
   flightflag=0
   note:set_text('Ship landed')
   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'Orbiting')~=nil then
   --MSB de position[3] ‡ 1 afin d'indiquer que le vaisseau est en vol. Calcul fait par position[3]=position[3]+32768
   flightflag=1
   note:set_text('Ship not landed')
   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'MAIN0DIR')~=nil then
   _,_,_,main_yaw,main_pitch,main= string.find(slist[j],"(.+) (.+) (.+) (.+)")
   position[15]=math.floor(-143225.43*main_pitch+2500) --calcul position main pitch en ms
   position[16]=math.floor(27720.027*main_yaw+3600)--calcul position main yaw en ms
   note:set_text(' Main pitch='..position[15]..' Main yaw='..position[16])
   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'SCRAM0DIR')~=nil then
   _,_,_,scram_yaw,scram_pitch,scram= string.find(slist[j],"(.+) (.+) (.+) (.+)")
   position[17]=math.floor(-34421.038*scram_pitch+3000) --calcul position scram pitch en ms
   note:set_text(' Scram pitch='..position[17])
   proc.wait_sysdt(0.5*afficher)    
   elseif string.match (slist[j], 'ATTITUDE_HOLD_DATA')~=nil then
   _,_,_,pitch,bank,status1,PitchAoA,level = string.find(slist[j],"(.+) (.+) (.+) (.+) (.+) (.+)")
   position[18]=math.floor(-6804.3742*level+28000) -- calcul de la valeur de position de gravity shift en 1.25 ms
   pitch=10*pitch--on met pitch en dixiËmes de degrÈs. Par contre, bank reste en degrÈs.
   bank=1*bank
   note:set_text('Data ATTITUDE_HOLD_DATA')
   proc.wait_sysdt(0.5*afficher)
   note:set_text('pitch='..pitch)
   proc.wait_sysdt(0.5*afficher)    
   note:set_text('bank='..bank)
   proc.wait_sysdt(0.5*afficher)    
   note:set_text('status1='..status1)
   proc.wait_sysdt(0.5*afficher)    
   note:set_text('PitchAoA='..PitchAoA)
   proc.wait_sysdt(0.5*afficher)
   note:set_text('level='..level)
   proc.wait_sysdt(0.5*afficher)
   note:set_text('Gravity Shift='..position[18])
   proc.wait_sysdt(0.5*afficher)
   PitchAoA=16*PitchAoA
   elseif string.match (slist[j], 'RCSMODE')~=nil then --dÈbut Èlaboration Miscstatus comprenant l'Ètat des RCS...
   _,_,aux,RCSstatus = string.find(slist[j],"(.+) (.+)")
   note:set_text('Etat RCS='..RCSstatus)
   proc.wait_sysdt(0.5)
   elseif string.match (slist[j], 'DOCKINFO')~=nil then  --...savoir si on est dockÈ ou non...
       docked=4
   elseif string.match (slist[j], 'LOX_QTY')~=nil then
                   _,_,aux,level = string.find(slist[j],"(.+) (.+)")
                   level_array[24]=level*364
                   note:set_text('LOX quantity'..'=>'..level_array[24]..'kg')
                   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'CUSTOM_AUTOPILOT_MODE')~=nil then --... savoir si Descent ou Attitude en fonction...
   _,_,aux,Autopilot_status = string.find(slist[j],"(.+) (.+)")
   Autopilot_status = Autopilot_status*64--Autopilot_status=1 pour Attitude Hold ON/AutopÓlot_status=2 pour Descent ON
--=>Autopilot varie entre 64 et 128
   elseif string.match (slist[j], 'AIRSPEED_HOLD_ENGAGED')~=nil then-- ... savoir si Airspeed hold en fonction...
   _,_,aux,Airspeed_autopilot_status = string.find(slist[j],"(.+) (.+)")
   Airspeed_autopilot_status = Airspeed_autopilot_status*8
   elseif string.match (slist[j], 'AIRSPEED_HOLD_DATA')~=nil then
   _,_,aux,Airspeed_set = string.find(slist[j],"(.+) (.+)")
   Airspeed_set=Airspeed_set*10
   Airspeed_set=math.min(Airspeed_set, 65535)
   note:set_text('Airspeed setting'..'=>'..Airspeed_set..'dm/s')
                   proc.wait_sysdt(0.5*afficher)
   elseif string.match (slist[j], 'DESCENT_HOLD_DATA')~=nil then -- ...savoir si Autoland en fonction, et la consigne (Descent_set)
       _,_,_,Descent_set,Set2,Autoland= string.find(slist[j],"(.+) (.+) (.+) (.+)")
   note:set_colour ({r=0.2,g=0.5,b=0.9})
   note:set_text('Descent_set=>'..Descent_set..'  Set2==>'..Set2..' Autoland==>'..Autoland)
   proc.wait_sysdt(0.5)
   Autoland=Autoland*32
   Descent_sign=0
   Descent_set=Descent_set*10--on doit transmettre des dÈcimËtres.
   if Descent_set<0 then     --(Type d'unitÈ incompatible, sinon?) On multiplie par 10 pour avoir des dÈcimËtres par seconde.
       Descent_sign=256      -- RÈglage du 9∞ bit pour Miscstatus
   end
   Descent_set=math.abs(Descent_set)
   note:set_colour ({r=0.9,g=0.5,b=0.2})
   note:set_text('Descent_sign=>'..Descent_sign..'  Set2==>'..Set2..' Autoland==>'..Autoland)
   proc.wait_sysdt(0.5)    
elseif slist[j]=='END' then
                   flag_out=1
   if pitch>=0 then-- rÈglage du signe du pitch
Pitch_set=pitch
   else
Pitch_set=math.abs(pitch)--si pitch<0, calcul pour retrouver une valeur <0 sur la Leonardo
   end
   if bank>=0 then-- rÈglage du signe du bank
Bank_set=bank
   else
Bank_set=math.abs(bank)--si bank<0, calcul pour retrouver une valeur <0 sur la Leonardo
   end    
   Miscstatus=Descent_sign+Autopilot_status+Autoland+PitchAoA+Airspeed_autopilot_status+docked+RCSstatus -- ici, on a un octet occupÈ
--le multiplicateur suivant est 256 (9∞bit)
   note:set_text('SIPOstatus=>'..SIPOstatus..'  SIPOtransit_status==>'..SIPOtransit_status)
   proc.wait_sysdt(0.5)
   note:set_text('Miscstatus=>'..Miscstatus)
   proc.wait_sysdt(0.5)    
                   break
               end                      --Endif du Xr2
 
           end                          --Next j
--***************************************************************
--************************************End Xr2 settings***********
--***************************************************************
--************************************Begin Xr2 payload setting**
--***************************************************************

       elseif(classname=='XR2PayloadCHM') then
           CHM_set=0
           CHM_capacity=0
           CHM_i=i
           lpayload=xr2_payload_setting(main_fuel_tank, nb_tank_main_fuel, CHM_capacity,CHM_set,CHM_i)
       elseif(classname=='XR2PayloadMainFuel') then
           main_fuel_set=4
           main_fuel_max_capacity=3350
           main_fuel_i=i
           lpayload=xr2_payload_setting(main_fuel_tank, nb_tank_main_fuel, main_fuel_max_capacity, main_fuel_set,main_fuel_i)
       elseif(classname=='XR2PayloadSCRAMFuel') then
           scram_fuel_set=6
           scram_fuel_max_capacity=3350
           scram_fuel_i=i
           lpayload=xr2_payload_setting(scram_fuel_tank, nb_tank_scram_fuel, scram_fuel_max_capacity, scram_fuel_set,scram_fuel_i)
       elseif(classname=='XR2PayloadLOX') then
           lox_set=9
           lox_max_capacity=10545
           lox_i=i
           lpayload=xr2_payload_setting(lox_tank, nb_tank_lox, lox_max_capacity, lox_set, lox_i)
       elseif(classname=='XR2PayloadLOX_Half') then
           lox_set=9
           lox_max_capacity=5272.5
           lox_i=i
           lpayload=xr2_payload_setting(lox_tank, nb_tank_lox, lox_max_capacity, lox_set, lox_i)
       elseif(classname=='XR2PayloadEmptyLOX') then
           lox_set=9
           lox_max_capacity=0
           lox_i=i
           lpayload=xr2_payload_setting(lox_tank, nb_tank_lox, lox_max_capacity, lox_set, lox_i)
--********************************************************
--*****************************End Xr2 payload setting****
--********************************************************
       end
    end                                 --Next i




end
-- ****************************************
-- *******end function load_xr2_status ***
-- ****************************************

-- ********************************************
-- *******begin function process APU_status ***
-- ********************************************
function process(SIPOtransit_stat,SIPOstat,power,status,level,delay)
   if((status%2)==1)then
SIPOstatus=SIPOstat+(2^power)
   end
   if(status%3==2)then
   --if (status==2)==true then
    note:set_text('Status vu ‡ 2 ou 3='..status)
proc.wait_sysdt(0.5)
SIPOtransit_status=SIPOtransit_stat+(2^power)
   end
    if(status%4==3)then
--if(status==3)==true then
    note:set_text('Status vu ‡ 3='..status)
proc.wait_sysdt(0.5)
SIPOtransit_status=SIPOtransit_stat+(2^power)
   end
   if (power<15)then
position[power]=level*delay
   end
end

-- ******************************************
-- *******end function process APU_status ***
-- ******************************************

Quelques commentaires:
La fonction principale (Main) se trouve à la fin. Je pense que mettre les fonctions appelées dans le Main
est une façon de déclarer ces fonctions.
La fonction "line_read(file) ouvre le fichier "current scenario.scn" afin de connaître le nombre de lignes à lire.
Load_file (file, n) va charger dans le tableau slist[] chaque ligne du SCN.
Une fois le fichier SCN chargé dans le tableau, et les initialisation effectuées, la fonction"load_xr2_status (pattern) va ouvrir une boucle chargée de repérer la partie "Xr2" dans le SCN.
Ceci fait, on charge ce qui nous intéresse pour l'initialisation du cockpit; il y en a pas mal en tout.
La partie"Xr2 payload setting" est un peu en friche pour l'instant. Mais elle est tout à fait capable
de prendre en compte une éventuelle cargaison à bord.
La fonction " process(SIPOtransit_stat,SIPOstat,power,status,level,delay)" va élaborer l'ensemble des données
à transmettre à la Leonardo afin qu'elle puisse les utiliser convenablement.
Enfin, la fonction "function xr2_payload_setting (payload_tank, nb_tank_payload,payload_max_capacity,payload_set,payload_i)" qui suit est sûrement à revoir, car elle n'a pas
été retouchée depuis le début de mes travaux.


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #103 - 11 March 2018, 09:40:35
Voici la dernière fonction pour que ça soit complet:
Code: [Select]
-- ***********************************************
-- *********** Xr2 payload setting ***************
-- ***********************************************
function xr2_payload_setting (payload_tank, nb_tank_payload,payload_max_capacity,payload_set,payload_i)
    for k=payload_i, number_lines-1 do
        if string.match (slist[k], 'ATTACHED')~=nil then
            _,_,attached,slot,carrier = string.find(slist[k],"(.+):(.+),(.+)")
        elseif (string.match (slist[k], 'PRPLEVEL')~=nil or classname=='XR2PayloadEmptyLOX') and name_ship_focused==carrier then
            if classname~='XR2PayloadEmptyLOX' then
                _,_,aux,level = string.find(slist[k],"(.+):(.+)")
            elseif classname=='XR2PayloadEmptyLOX' then
                level=0
            end
            carrier=""
            payload_tank=level*payload_max_capacity+payload_tank
            nb_tank_payload=nb_tank_payload+1
            level_array[payload_set+nb_tank_payload]=level*payload_max_capacity
            status_array[payload_set+nb_tank_payload]=slot+1
            flag_out=1
            if payload_set==4 then                                 
                nb_tank_main_fuel=nb_tank_payload
            elseif payload_set==6 then
                nb_tank_scram_fuel=nb_tank_payload
            elseif payload_set==9 then
                nb_tank_lox=nb_tank_payload
            end
            break
        elseif (classname=='XR2PayloadCHM') and (name_ship_focused==carrier) then
            carrier=""
            level_array[9]=1
            status_array[9]=1
            flag_out=1
            break   
        elseif slist[k]=='END' then
            break
        end
    end
end
-- ****************************************
-- ******* end function payload setting ***
-- ****************************************
Mais ça pourra être plus simple si l'appel de cette fonction est inactivé, car pour l'instant, elle n'est
pas de grande utilité. Pour inactiver, enlever tous les "elseif" du "payload setting".

En ce qui concerne mes travaux actuels, beaucoup de soudures et de câblages: je suis en train de
faire les affichages numériques des consignes des pilotes automatiques (qui, par ailleurs sont fonctionnels).
Il y a 21 afficheurs 7 segments à câbler, plus les lumineux On/Off, Pitch/AoA, etc... :siffle:


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #104 - 11 March 2018, 09:44:37
Et j'allais oublier la fonction "Main", celle qui appelle les autres, à mettre tout à la fin du script:
Code: [Select]
--********************************************************************************
-- ********** begin program ************************* begin program ***************
-- ********************************************************************************
note = oapi.create_annotation()
note:set_pos (0.55,0.1,0.8,0.95)
note:set_colour ({r=0.9,g=0.5,b=0.2})


intro = "Lecture des données du Xr2 Ravenstar"
note:set_text(intro)
proc.wait_sysdt(1)

note:set_text("  ")
proc.wait_sysdt(0.5)

data_path = 'Scenarios/(Current state).scn'
note:set_text(data_path)
proc.wait_sysdt(1)


v=vessel.get_focusinterface()
ship=v:get_classname()
name_ship_focused=v:get_name()

-- ******************************************************
-- ***********begin call functions for scn file**********
-- ******************************************************
afficher=2   --value <>0 for screen display
sfirst = line_read (data_path)

slist = load_file (data_path,number_lines)

if  ship=='XR2Ravenstar' then
    lstatus = load_xr2_status (ship)
    note:set_text('Toward function loop load of XR2')
    proc.wait_sysdt(1)
note:set_text('')
 
-- ici, mettre la boucle de scrutation pour rafraîchissement des données du cockpit
elseif ship=='Xr5Vanguard' then
    note:set_text('Toward function loop load of XR5Vanguard')
    proc.wait_sysdt(2.01)
elseif ship=='ShuttleA' then
    note:set_text('Toward function loop load of ShuttleA')
    proc.wait_sysdt(2.01)
else
    note:set_text('vessel not implemented, simpit not activated')
    proc.wait_sysdt(2.01)
end
-- ******************************************************
-- ************ end call functions for scn file**********
-- ******************************************************
    note:set_text('End program')
    proc.wait_sysdt(1.5)
note:set_text('')


Offline jacquesmomo

  • Le budget !!!
  • Legend
  • ******
  • Posts: 7408
  • Country: France fr
  • Karma: 598
  • Plus on rate, plus on a de chances de réussir !..
Reply #105 - 11 March 2018, 11:51:18
 :music: Aîe don't bien comprendre C++  :trucdeouf: It is impressionnant...  :eek: indeed!!!

Mes add-ons sont là !

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #106 - 11 March 2018, 23:21:53
Nan, c'est pas compliqué...  ;) Ce que nous avons ci-dessus, est en Lua. Ce script lit les données,
les met en forme pour les transmettre par le port USB. Dans l'Arduino tourne un sketch en C++, ou presque.
(Le langage Arduino est proche du C et du C++). Je l'ai fait pour qu'il reçoive ces données, les traite et gère
les lumineux par l'intermédiaire de modules Parallel Input Serial Output (PISO) et de modules Serial Input Parallel Output (SIPO) :mouais:


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #107 - 29 June 2018, 21:25:57
J'ai malheureusement été assez silencieux dernièrement.... Le peu de temps disponible a été mis à profit pour programmer les pilotes automatiques du Xr2. C'est le pilote auto d'attitude qui m'a le plus donné du fil à retordre.
En effet, il a fallu garder la cohérence du pilote du Xr2 avec l'affichage du pitch/AoA et du bank. Ceci malgré de nombreuses exceptions à gérer. En particulier le bank inversé, et les domaines de vol interdits.
De plus, j'ai relevé des incohérences dans le Xr2, auxquelles j'ai pu remédier dans une certaine mesure, mais
pas partout.
J'essaierai de faire un post montrant les solutions retenues pour l'assemblage des afficheurs numériques avant la
fin de la semaine prochaine.


Offline antoo

  • Legend
  • ******
  • Posts: 3659
  • Country: France fr
  • Karma: 179
  • MSFS ❤️
Reply #108 - 29 June 2018, 23:27:43
Cool d'avoir des news !

---------------------------------------------------------------------------------------------------
"ET C´EST PARTI!!" Youri Gagarine au lancement de vostok 1 le 12 avril 1961

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #109 - 30 June 2018, 09:59:54
Merci, Antoo.
J'ai vu que de ton côté, ça n'a pas l'air facile. J'espère que vous allez vous en sortir.
Malheureusement, je ne sais pas assez de choses pour pouvoir vous sortir de là.
Bon courage!


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #110 - 06 July 2018, 09:20:57
Comme hostingpics n'est plus, j'ai  hébergé des images chez casimages.
Un utilisateur de casimages sait-il quel lien utiliser pour les faire apparaître dans le texte?
J'ai essayé les liens proposés sans succès pour l'instant... Merci pour tout renseignement.


Offline jacquesmomo

  • Le budget !!!
  • Legend
  • ******
  • Posts: 7408
  • Country: France fr
  • Karma: 598
  • Plus on rate, plus on a de chances de réussir !..
Reply #111 - 06 July 2018, 11:46:35
Moi, sur les conseils de Pappy2, j'utilise Zupimage
https://www.zupimages.net/

C'est gratuit, ça marche bien, et les liens aussi.
Donc, à tester.... :beer:

Mes add-ons sont là !

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #112 - 06 July 2018, 12:43:49
Merci, Jacquesmomo!
J'essaie ça tout de suite. Tant pis pour casimages...


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #113 - 06 July 2018, 15:12:24
Avant de partir en vacances, je tenais à vous faire part de....
Construction d'afficheurs


Il a fallu pas mal de tâtonnements pour arriver à un montage pratique. J'ai finalement choisi de placer
les displays et les convertisseurs BCD sur un ensemble de petites cartes empilées les unes sur les autres.

Pour commencer, les displays sont fixés sur des barrettes sécables elles mêmes soudées sur une petite
plaque à pastilles. Les câblage se fait en faisant arriver les 9 câbles sous les displays 7 segments (Vcc,
segment a, b, c, d, e, f et g, plus le DP), et au dessus de la plaque à trous. On peigne bien les câbles...
Et voilà ce que ça donne pour le display du contrôle d'attitude. Trois groupes de displays: de gauche
à droite, un groupe de deux displays pour le calibre (0.5°, ou bien 2.5°), un deuxième groupe de displays
pour le pitch, avec un signe "-", le troisième groupe pour l'affichage du bank.

ATTENTION: Les displays sont à anode commune. Pour allumer le segment, on met le segment à GND.




Notez que le 3° display à partir de la gauche a moins de câbles: il s'agit du signe moins du pitch.

L'image suivante montre une carte portant les CD4543 convertissant un demi-octet pour un affichage
sur les 7 segments. J'ai mis des résistances de 1kohms pour régler la luminosité.



Ici, les cartes empilées. Il s'agit de l'afficheur "airspeed". Le premier groupe de trois afficheurs est là
pour la calibration: 25, 5, 1, ou 0.1 m/s. Le deuxième groupe de 5 afficheurs affiche la consigne "airspeed"
en m/s, et un chiffre après la virgule (DP)


Là, autre point de vue...


Enfin, pour relier la sortie des modules SIPO concernés aux entrées des circuits BCD, j'ai dû faire pas mal
de neuro-chirurgie... (Quatre connecteurs 2X13 pôles, ça fait 104 soudures, tout de même!)


Après, "yapuka" faire les bons branchements et programmer tout ça...

Voilà un petit aperçu de ce que j'ai bricolé, en attendant les faces avant gravées au laser...



Prochainement, je vous raconterai comment j'ai programmé tout ça. A bientôt! :salut: