Advertisement
Pdevo

gestore_test

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