Advertisement
Pdevo

gestore_itinerari

Sep 30th, 2015
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 12.78 KB | None | 0 0
  1. -- configurazione sistema
  2.  
  3. app = "gestore"
  4. cod = "itinerari"
  5. pro = "scgrc"
  6.  
  7. -- configurazione periferiche
  8.  
  9. modem = nil
  10.  for n,g in pairs(peripheral.getNames()) do
  11.   if peripheral.getType(g) == "modem" then
  12.   modem = g
  13.   break
  14.   end
  15.  end
  16.  
  17. drive = nil
  18.  for n,g in pairs(peripheral.getNames()) do
  19.   if peripheral.getType(g) == "drive" then
  20.   drive = g
  21.   break
  22.   end
  23.  end
  24.  
  25. -- funzioni sistema
  26.  
  27. function sistema_inizializza(tipo,nome)
  28.  
  29. local path = disk.getMountPath(drive)
  30. local file = fs.open(path.."/"..tipo.."/"..nome,"r")
  31. local text = file.readAll()
  32. local data = textutils.unserialize(text)
  33. file.close()
  34. return data
  35.  
  36. end
  37.  
  38. -- funzioni applicativo
  39.  
  40. function configura_fermata(v)
  41.  
  42. cp,cl = nil,nil
  43.  if v == N.ve or v == N.vs then
  44.  cp = N.bf+1
  45.  cl = v*N.cd
  46.  end
  47.  if v == N.vw or v == N.vn then
  48.  cp = N.bf+2
  49.  cl = v*N.cd
  50.  end
  51.  
  52. end
  53.  
  54. function itininerario_configura(d,l,c)
  55.  
  56. cnfg = nil
  57. cnf1 = nil
  58. cnf2 = nil
  59. rednet.broadcast({"configura","itinerario",d,l,c})
  60.  while true do
  61.  local id, scgrc = rednet.receive()
  62.   if scgrc[1] == "itinerario" and scgrc[2] == d and scgrc[3] == l and scgrc[4] == c then
  63.    if scgrc[5] == "deviatoi" then
  64.     if scgrc[6] == "configurato" then
  65.     cnf1 = true
  66.     end
  67.     if scgrc[6] == "indefinito" or  scgrc[6] == "errore" then
  68.     cnf1 = false
  69.     end
  70.    end
  71.    if scgrc[5] == "segnali" then
  72.     if scgrc[6] == "configurato" then
  73.     cnf2 = true
  74.     end
  75.     if scgrc[6] == "indefinito" or  scgrc[6] == "errore" then
  76.     cnf2 = false
  77.     end
  78.    end
  79.   end
  80.   if cnf1 ~= nil and cnf2 ~= nil then
  81.    if cnf1 == true and cnf2 == true then
  82.    cnfg = true
  83.    rednet.broadcast({"aggiornamento","binario",c,"riservato"})
  84.    break
  85.    end
  86.    if cnf1 == false and cnf2 == false then
  87.    cnfg = false
  88.    break
  89.    end
  90.   end
  91.  end
  92.  
  93. end
  94.  
  95. function itininerario_transito(d1,d2,l1,l2,c,k)
  96.  
  97. cnct = nil
  98. cnc1 = nil
  99. cnc2 = nil
  100. itininerario_configura(d1,l1,c)
  101.  if cnfg == true then
  102.  cnc1 = true
  103.  end
  104.  if cnfg == false then
  105.  cnc1 = false
  106.  end
  107. itininerario_configura(d2,l2,k)
  108.  if cnfg == true then
  109.  cnc2 = true
  110.  end
  111.  if cnfg == false then
  112.  cnc2 = false
  113.  end
  114.  if cnc1 ~= nil and cnc2 ~= nil then
  115.   if cnc1 == true and cnc2 == true then
  116.   cnct = true
  117.   end
  118.   if cnc1 == false or cnc2 == false then
  119.   cnct = false
  120.   end
  121.  end
  122.  
  123. end
  124.  
  125. function itininerario_binario(c)
  126.  
  127. erro = nil
  128. rednet.broadcast({"stato","binario",c})
  129.  while true do
  130.  local id, scgrc = rednet.receive()
  131.   if scgrc[1] == "binario" then
  132.    if scgrc[2] == c then
  133.     if scgrc[3] == "libero" then
  134.     erro = false
  135.     break
  136.     end
  137.     if scgrc[3] == "indefinito" or scgrc[3] == "occupato" or scgrc[3] == "transito" or scgrc[3] == "riservato" or scgrc[3] == "vietato" then
  138.     erro = true
  139.     break
  140.     end
  141.    end
  142.   end
  143.  end
  144.  
  145. end
  146.  
  147. function itininerario_elabora(d,b,n)
  148.  
  149. erro = nil
  150.  for p = 0 , b do
  151.   if d == N.ve or d == N.vs then
  152.   j = 1+p
  153.   end
  154.   if d == N.vw or d == N.vn then
  155.   j = b-p
  156.   end
  157.  r = p
  158.  c = j+n
  159.  itininerario_binario(c)
  160.   if erro == false then
  161.   break
  162.   end
  163.  end
  164.  
  165. end
  166.  
  167. function itininerario_prepara(t,d,l,g,s,r,c,erro)
  168.  
  169.  if erro == false then
  170.  itininerario_configura(d,l,c)
  171.   if cnfg == true then
  172.   rednet.broadcast({t,d,g,r,"preparato"})
  173.   end
  174.   if cnfg == false then
  175.   rednet.broadcast({t,d,g,s,"eccezione"})
  176.   end
  177.  end
  178.  if erro == true then
  179.  rednet.broadcast({t,d,g,s,"impossibile"})
  180.  end
  181.  
  182. end
  183.  
  184. function transito_binario(c,k)
  185.  
  186. ste1 = nil
  187. ste2 = nil
  188. itininerario_binario(c)
  189. ste1 = erro
  190. itininerario_binario(k)
  191. ste2 = erro
  192.  
  193. end
  194.  
  195. function transito_elabora(d,b,n,k)
  196.  
  197. ste1 = nil
  198. ste2 = nil
  199. itininerario_elabora(d,b,n)
  200. ste1 = erro
  201. itininerario_binario(k)
  202. ste2 = erro
  203.  
  204. end
  205.  
  206. function transito_prepara(d1,d2,l1,l2,g,s,r,c,k,ste1,ste2)
  207.  
  208. step = nil
  209.  if ste1 == false and ste2 == false then
  210.  step = false
  211.  end
  212.  if ste1 == true or ste2 == true then
  213.  step = true
  214.  end
  215.  if step == false then
  216.  itininerario_transito(d1,d2,l1,l2,c,k)
  217.   if cnct == true then
  218.   rednet.broadcast({"transito",d1,d2,g,r,"preparato"})
  219.   end
  220.   if cnct == false then
  221.    if cnc1 == false then
  222.    rednet.broadcast({"transito",d1,d2,g,s,"imprevisto","binario"})
  223.    end
  224.    if cnc2 == false then
  225.    rednet.broadcast({"transito",d1,d2,g,s,"imprevisto","linea"})
  226.    end  
  227.   rednet.broadcast({"transito",d1,d2,g,s,"eccezione"})
  228.   end
  229.  end
  230.  if step == true then
  231.   if ste1 == true then
  232.   rednet.broadcast({"transito",d1,d2,g,s,"blocco_binario"})
  233.   end
  234.   if ste2 == true then
  235.   rednet.broadcast({"transito",d1,d2,g,s,"blocco_linea"})
  236.   end  
  237.  rednet.broadcast({"transito",d1,d2,g,s,"impossibile"})
  238.  end
  239.  
  240. end
  241.  
  242. function transito_verifica(d,g,f,b,n)
  243.  
  244.  if f == "ammessa" then
  245.  rednet.broadcast({"transito","eccezionale",g,f})
  246.  itininerario_elabora(d,b,n)
  247.  er = r
  248.  ec = c
  249.   if erro == true then
  250.   rednet.broadcast({"transito","eccezionale",g,"impossibile"})  
  251.   vrfy = nil
  252.   end
  253.   if erro == false then
  254.   rednet.broadcast({"transito","eccezionale",g,"possibile"})
  255.   vrfy = g
  256.   end  
  257.  end
  258.  if f == "vietata" then
  259.  rednet.broadcast({"transito","eccezionale",g,f})
  260.  end
  261.  r = nil
  262.  c = nil
  263.  
  264. end
  265.  
  266. function transito_dedicato(d1,d2,l1,l2,g,b,s,r,k,n,u)
  267.  
  268.  if b == 0 then
  269.  rednet.broadcast({"transito","funzione",g,"inesistente"})
  270.  end
  271.  if b ~= 0 then
  272.   if s == nil then
  273.   rednet.broadcast({"transito",d1,d2,g,"indefinito"})
  274.   end    
  275.   if s == "elabora" then  
  276.   transito_elabora(d1,b,n,k)
  277.   transito_prepara(d1,d2,l1,l2,g,s,r,c,k,ste1,ste2)
  278.   g = nil
  279.   end
  280.   if r ~= nil then
  281.   local c = r+n
  282.    if c > u then
  283.    rednet.broadcast({"transito",d1,d2,g,"binario","inesistente"})
  284.    end
  285.    if c <= u then
  286.    transito_binario(c,k)
  287.    transito_prepara(d1,d2,l1,l2,g,s,r,c,k,ste1,ste2)
  288.    end
  289.   end
  290.  end
  291.  
  292. end
  293.  
  294. function transito_eccezionale(d1,d2,l1,l2,g,f,s,r,k)
  295.  
  296.  if f == "vietata" then
  297.  rednet.broadcast({"transito","funzione","eccezionale",f})
  298.  end
  299.  if f == "ammessa" then
  300.   if s == nil then
  301.   rednet.broadcast({"transito",d1,d2,"eccezionale","binario","indefinito"})
  302.   end
  303.   if s == "elabora" then   
  304.   vrfy = nil   
  305.    if vrfy == nil then
  306.    g = "passeggeri"
  307.    transito_verifica(d,g,G.tp,P.bp,N.bp)
  308.    ste1 = erro
  309.    end
  310.    if vrfy == nil then
  311.    g = "merci"
  312.    transito_verifica(d,g,G.tm,P.bm,N.bm)
  313.    ste1 = erro
  314.    end
  315.    if vrfy == nil then
  316.    g = "servizi"         
  317.    transito_verifica(d,g,G.ts,V.bs,N.bs)
  318.    ste1 = erro
  319.    end
  320.   itininerario_binario(k)
  321.   ste2 = erro
  322.   transito_prepara(d1,d2,l1,l2,g,s,er,ec,k,ste1,ste2)
  323.   end
  324.   if r ~= nil then
  325.   local c = r
  326.    if r > N.ls then
  327.    rednet.broadcast({"transito",d1,d2,"eccezionale",r,"limite","sistemi"})
  328.    end
  329.    if r <= N.ls then
  330.    transito_binario(c,k)
  331.    transito_prepara(d1,d2,l1,l2,g,s,r,c,k,ste1,ste2)
  332.    end
  333.   end
  334.  end
  335.  
  336. end
  337.  
  338. function prepara_arrivo(d,l,g,b,s,r,k,n,u)
  339.  
  340.  if b == 0 then
  341.  rednet.broadcast({"arrivo","funzione",g,"inesistente"})
  342.  end
  343.  if b ~= 0 then
  344.   if s == nil then
  345.   rednet.broadcast({"arrivo",d,g,"binario","indefinito"})
  346.   end  
  347.   if s == "elabora" then
  348.   itininerario_elabora(d,b,n)
  349.   itininerario_prepara("arrivo",d,l,g,s,r,c,erro)
  350.   end
  351.   if s ~= nil and s ~= "elabora" then
  352.    if r ~= nil then
  353.    local c = r+n
  354.     if c > u then
  355.     rednet.broadcast({"arrivo",d,g,"binario","inesistente"})
  356.     end
  357.     if c <= u then
  358.     itininerario_binario(c)
  359.     itininerario_prepara("arrivo",d,l,g,s,r,c,erro)
  360.     end  
  361.    end
  362.   end
  363.  end  
  364.  
  365. end
  366.  
  367. function prepara_partenza(d,l,g,b,s,r,k,n,u)
  368.  
  369.  if b == 0 then
  370.  rednet.broadcast({"partenza","funzione",g,"inesistente"})
  371.  end
  372.  if b ~= 0 then
  373.   if s == nil then 
  374.   rednet.broadcast({"partenza",d,g,"binario","indefinito"})
  375.   end    
  376.   if r ~= nil then
  377.   local c = r+n
  378.    if c > u then
  379.    rednet.broadcast({"partenza",d,g,"binario","inesistente"})
  380.    end    
  381.    if c <= u then
  382.    itininerario_binario(k)
  383.    itininerario_prepara("partenza",d,l,g,s,r,c,erro)
  384.    end
  385.   end
  386.  end
  387.  
  388. end
  389.  
  390. function prepara_eccezionale(t,v,d,b,s,r,c,k)
  391.    
  392.  if s == nil then
  393.  rednet.broadcast({t,v,"eccezionale","binario","indefinito"})
  394.  end
  395.  if s ~= nil then
  396.  local c = r
  397.   if c > N.ls then
  398.   rednet.broadcast({t,v,"eccezionale","limite","sistemi"})
  399.   end
  400.   if c <= N.ls then
  401.    if (V.pp <= c and c <= V.up) or (V.pm <= c and c <= V.um) or (V.ps <= c and c <= V.us) then
  402.    itininerario_binario(k)
  403.    itininerario_prepara(t,v,d,"eccezionale",s,r,c,erro)
  404.    else
  405.    rednet.broadcast({t,v,"eccezionale","binario","inesistente"})
  406.    end
  407.   end
  408.  end
  409.  
  410. end
  411.  
  412. function prepara_fermata(v,w,dx,dy,g,f,s,c,k)
  413.  
  414.  if f == "vietata" then
  415.  rednet.broadcast({"fermata","funzione",g,f})
  416.  end
  417.  if f == "ammessa" then
  418.   if s == "arrivo" then  
  419.   itininerario_binario(c)    
  420.   itininerario_prepara("fermata",v,dx,g,s,c,c,erro)
  421.   end
  422.   if s == "partenza" then    
  423.   itininerario_binario(k)    
  424.   itininerario_prepara("fermata",w,dy,g,s,c,c,erro)
  425.   end
  426.  end
  427.  
  428. end
  429.  
  430. -- codice sistema
  431.  
  432. sleep()
  433. print(app.."_"..cod)
  434. rednet.open(modem)
  435. rednet.host(pro,app.."_"..cod)
  436. rednet.broadcast({"avvio",app,cod})
  437.  
  438. -- codice inizializzazione
  439.  
  440. C = sistema_inizializza("settaggi","cataloghi")
  441. N = sistema_inizializza("settaggi","norme")
  442. P = sistema_inizializza("settaggi","parametri")
  443. G = sistema_inizializza("settaggi","gestioni")
  444. V = sistema_inizializza("settaggi","binari")
  445. D = sistema_inizializza("settaggi","direttrici")
  446.  
  447. -- codice applicativo
  448.  
  449. while true do
  450. local id, scgrc = rednet.receive()
  451.  
  452.  if scgrc[1] == "prepara" then
  453.  
  454.   if scgrc[2] == "arrivo" then
  455.  
  456.   t,d,g,s,r = scgrc[2],scgrc[3],scgrc[4],scgrc[5],tonumber(scgrc[5])
  457.  
  458.    if D[d] ~= nil then
  459.     if D[d].vg == "ammessa" then
  460.      if g == "eccezionale" then
  461.      prepara_eccezionale(t,d,D[d].kx,g,s,r,c,D[d].kx)
  462.      elseif g == "passeggeri" or g == "merci" or g == "servizi" then
  463.      prepara_arrivo(d,D[d].kx,g,B[g].vp,s,r,D[d].kx,B[g].vn,B[g].by)
  464.      end
  465.     else
  466.     rednet.broadcast({"arrivo",d,"cardinalita'",D[d].sg})
  467.     end
  468.    else
  469.    rednet.broadcast({"arrivo",d,"cardinalita'","inesistente"})
  470.    end
  471.  
  472.   end
  473.  
  474.   if scgrc[2] == "partenza" then  
  475.  
  476.   t,d,g,s,r = scgrc[2],scgrc[3],scgrc[4],scgrc[5],tonumber(scgrc[5])
  477.  
  478.    if D[d] ~= nil then
  479.     if D[d].vg == "ammessa" then
  480.      if g == "eccezionale" then
  481.      prepara_eccezionale(t,d,D[d].ky,g,s,r,c,D[d].ky)
  482.      elseif g == "passeggeri" or g == "merci" or g == "servizi" then
  483.      prepara_partenza(d,D[d].ky,g,B[g].vp,s,r,D[d].ky,B[g].vn,B[g].by)
  484.      end
  485.     else
  486.     rednet.broadcast({"arrivo",d,"cardinalita'",D[d].sg})
  487.     end
  488.    else
  489.    rednet.broadcast({"arrivo",d,"cardinalita'","inesistente"})
  490.    end
  491.    
  492.   end
  493.  
  494.   if scgrc[2] == "fermata" then
  495.  
  496.   t = scgrc[2]
  497.   v = scgrc[3]
  498.   g = scgrc[4]
  499.   s = scgrc[5]
  500.  
  501.   configura_versori(v)
  502.   configura_fermata(v)
  503.   configura_linea(e,q,v,V.dy)
  504.  
  505.    if e == "esistente" and q == "ammessa" then
  506.     if g == "parallela" then
  507.     prepara_fermata(v,w,V.dx,V.dy,g,G.fp,s,cp,k)
  508.     end
  509.     if g == "lineare" then
  510.     prepara_fermata(v,w,V.dx,V.dy,g,G.fl,s,cl,k)
  511.     end
  512.    end
  513.    
  514.    if e == "esistente" and q == "vietata" then
  515.    rednet.broadcast({"fermata",v,"cardinalita'",q})
  516.    end
  517.    if e == "inesistente" then
  518.    rednet.broadcast({"fermata",v,"cardinalita'",e})
  519.    end
  520.    if v == nil then
  521.    rednet.broadcast({"fermata","cardinalita'","indefinita"})
  522.    end
  523.  
  524.   end
  525.  
  526.   if scgrc[2] == "transito" then
  527.  
  528.   t = scgrc[2]
  529.   v1 = scgrc[3]
  530.   v2 = scgrc[4]
  531.   g = scgrc[5]
  532.   s = scgrc[6]
  533.   r = tonumber(scgrc[6])  
  534.  
  535.   d1 = V.dx
  536.   d2 = V.dy
  537.   configura_versori(v1)
  538.   e1 = e
  539.   g1 = q
  540.   configura_versori(v2)
  541.   e2 = e
  542.   g2 = q
  543.   configura_linea(e,q,v,V.dy)
  544.  
  545.    if e1 == "esistente" and e2 == "esistente" then
  546.    e = "esistente"
  547.    end
  548.    if e1 == "inesistente" or e2 == "inesistente" then
  549.    e = "inesistente"
  550.    end  
  551.    if q1 == "ammessa" and q2 == "ammessa" then
  552.    q = "ammessa"
  553.    end
  554.    if q1 == "vietata" or q2 == "vietata" then
  555.    q = "vietata"
  556.    end
  557.    
  558.    if e == "esistente" and q == "ammessa" then
  559.     if g == "dedicato" then
  560.     transito_dedicato(v1,v2,d1,d2,g,P.bt,s,r,k,N.bt,V.ut)
  561.     end  
  562.     if g == "eccezionale" then   
  563.     transito_eccezionale(v1,v2,d1,d2,g,G.te,s,r,k)
  564.     end
  565.    end  
  566.  
  567.    if e == "esistente" and q == "vietata" then
  568.    rednet.broadcast({"transito",v1,v2,"cardinalita'",q})
  569.    end
  570.    if e == "inesistente" then
  571.    rednet.broadcast({"transito",v1,v2,"cardinalita'",e})
  572.    end  
  573.    if (v1 == nil and v2 ~= nil) or (v2 == nil and v1 ~= nil) then
  574.    rednet.broadcast({"transito","cardinalita'","incompleta"})
  575.    end
  576.    if v1 == nil and v2 == nil then
  577.    rednet.broadcast({"transito","cardinalita'","indefinita"})
  578.    end
  579.  
  580.   end
  581.  
  582.  end
  583.  
  584.  if scgrc[1] == "sistemi" then
  585.  
  586.   if scgrc[2] == app then
  587.  
  588.    if scgrc[3] == cod then
  589.    
  590.     if scgrc[4] == "spegnimento" then
  591.     rednet.broadcast({"spegnimento",app,cod})
  592.     os.shutdown()
  593.     end
  594.     if scgrc[4] == "riavvio" then
  595.     rednet.broadcast({"riavvio",app,cod})
  596.     os.reboot()
  597.     end
  598.    
  599.    end
  600.    
  601.   end
  602.  
  603.  end
  604.  
  605. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement