Advertisement
Alex1979

External Monitor Control

Aug 21st, 2013
453
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.23 KB | None | 0 0
  1. --<<The program for the control of the drone network, ComputerCraft>>--
  2.              --<<External Monitor  Control, Lua>>--
  3.                --By Aleksandr Kulikov, 2013--
  4.               -- http://pastebin.com/D5ih1eQe --
  5.                 -- pastebin get D5ih1eQe mon_control --
  6.                
  7. local ver_prog = "0.8.2"
  8. local id_sender = 555
  9. local xMaxTerm, yMaxTerm = term.getSize()
  10. local decor_line_term = string.rep("-", xMaxTerm)
  11.  
  12. --*********************************************************************************
  13. local function clearScreenTerm()
  14.  term.clear()
  15.  term.setCursorPos(1,1)
  16. end
  17.  
  18. --*********************************************************************************
  19. local function clearScreenMon()
  20.  mon.clear()
  21.  mon.setCursorPos(1,1)
  22. end
  23. --*********************************************************************************
  24. local function autorunStartUp()
  25.        
  26.         if not os.getComputerLabel() then
  27.             os.setComputerLabel("MonitorEX - "..os.getComputerID())
  28.         end
  29.        
  30.         if  fs.exists("startup") then
  31.               if not fs.exists("startup_backup") then
  32.                 fs.copy("startup","startup_backup")
  33.               end
  34.         end        
  35.         local file = fs.open ("startup", "w")
  36.         file.writeLine ("--Edit the file to execute the program: <"..shell.getRunningProgram()..">")
  37.         file.writeLine ("--A backup copy of the file: <startup_backup>")
  38.         file.writeLine ("shell.run(\""..shell.getRunningProgram().."\")")
  39.         file.close()
  40. end
  41. --*********************************************************************************
  42.  
  43. local function WriteCenter(str)
  44.         local xPos, yPos = mon.getCursorPos()
  45.         str_long = #str
  46.         mon.setCursorPos((xMax/2-str_long/2)+1,yPos)
  47.         mon.write(str)
  48. end
  49.  
  50. --****************************************************************************
  51. local function MonitorOpen()
  52.     local sMonitorSide = nil
  53.         for n,sSide in ipairs( rs.getSides() ) do
  54.             if peripheral.getType( sSide ) == "monitor" then   
  55.                 sMonitorSide = sSide
  56.                 mon = peripheral.wrap(sMonitorSide, true)
  57.                 xMax, yMax = mon.getSize()
  58.                 if xMax ~= 61 or  yMax ~= 19 then
  59.                     print( "ERROR!" )
  60.                     print( "Requires an external monitor 3 to 6 blocks!" )
  61.                     print( "Program stopped." )
  62.                     print( "ID computer: "..os.getComputerID())        
  63.                     error()
  64.                 end
  65.                
  66.                 decor_line = string.rep("-", xMax)
  67.                 break
  68.             end
  69.         end
  70.  
  71.         if sMonitorSide == nil then
  72.             print( "Program stopped." )
  73.             print( "No monitor attached." )
  74.             print( "ID computer: "..os.getComputerID())
  75.             error()
  76.     end
  77. end
  78. --****************************************************************************
  79. local function RedNetOpen()
  80.     local sModemSide = nil
  81.         for n,sSide in ipairs( rs.getSides() ) do
  82.             if peripheral.getType( sSide ) == "modem" then 
  83.                 sModemSide = sSide
  84.                 rednet.open(sModemSide)
  85.                 gps_x, gps_z, gps_y = gps.locate(1)
  86.                     if gps_x == nil then
  87.                         GPS_signal = "No"
  88.                     else
  89.                         GPS_signal = "Yes"
  90.                     end
  91.                 break
  92.             end
  93.         end
  94.  
  95.         if sModemSide == nil then
  96.             print( "Program stopped.")
  97.             print( "No modem attached." )
  98.             print( "ID computer: "..os.getComputerID())
  99.             error()
  100.     end
  101. end
  102. --*********************************************************************************
  103. local function RedNetClose()
  104.     local sModemSide = nil
  105.         for n,sSide in ipairs( rs.getSides() ) do
  106.             if peripheral.getType( sSide ) == "modem" then 
  107.                 sModemSide = sSide
  108.                 rednet.close(sModemSide)
  109.                 break
  110.             end
  111.         end
  112.  
  113.         if sModemSide == nil then
  114.             print( "Program stopped.")
  115.             print( "No modem attached." )
  116.             error()
  117.     end
  118. end
  119.  
  120. --*********************************************************************************
  121. local function ChangeEnterIDserver()
  122.     term.write("Enter ID sender: ")
  123.     id_sender = math.floor(math.abs(tonumber(io.read()) or id_sender))
  124.     local file = fs.open ("id_sender_set.dat", "w")
  125.         file.writeLine (id_sender)
  126.         file.writeLine ("--The server accepts messages only from this ID.")
  127.     file.close()
  128. end
  129. --*********************************************************************************
  130. local function ReadIDsender()
  131.     if  fs.exists("id_sender_set.dat") then    
  132.         local file = fs.open ("id_sender_set.dat", "r")
  133.         id_sender = tonumber (file.readLine ( ))
  134.         file.close ( )
  135.     end
  136. end
  137. --*********************************************************************************
  138. local function UpdateThisProg()
  139.     local Code = "D5ih1eQe"
  140.     local File_name = shell.getRunningProgram() --..os.day()
  141.    
  142.     clearScreenMon()
  143.     if not http then
  144.         print("Pastebin requires http API!!!")
  145.         print("Set enable API_http in ComputerCraft.cfg")
  146.         sleep(5)
  147.         return
  148.     end
  149.    
  150.     print("Connecting to pastebin.com... ")
  151.     local response = http.get(
  152.         "http://pastebin.com/raw.php?i="..textutils.urlEncode(Code)
  153.         )
  154.        
  155.     if response then
  156.         print("Success.")
  157.        
  158.         local sResponse = response.readAll()
  159.         response.close()
  160.        
  161.         local file = fs.open(File_name, "w")
  162.         file.write( sResponse )
  163.         file.close()
  164.        
  165.         print("Downloaded as "..File_name)
  166.         sleep(1)
  167.             for i = 1, 6 do
  168.             clearScreenTerm()
  169.                 print("Reboot system "..(6-i).." sec...")
  170.                 sleep(1)
  171.             end
  172.         os.reboot()
  173.     else
  174.         print( "Failed." )
  175.     end
  176.     sleep(5)
  177. end
  178.  
  179.  
  180. --*********************************************************************************
  181. local function Header()
  182.     clearScreenMon()
  183.     clearScreenTerm()
  184.     WriteCenter("Server ID: "..os.getComputerID()..", Sender ID: "..id_sender..", ver. "..ver_prog)
  185.     mon.setCursorPos(1,2)
  186.     WriteCenter("[Q]-exit, [I]-id sender change, [U]-update, DPI: "..xMax.."x"..yMax)
  187.     print("Server ID "..os.getComputerID().." is ready. Current ID sender: "..id_sender)
  188.     print(decor_line_term)
  189.     print("[Q]-exit, [I]-ID sender change, [U]-update")
  190.     print("Press CTRL+R to restart")
  191.     mon.setCursorPos(1,3)
  192.     mon.write(decor_line)
  193.     mon.setCursorPos(1,yMax-1)
  194.     mon.write(decor_line)
  195.     mon.setCursorPos(1,yMax)
  196.     mon.clearLine()
  197.     mon.write("Distance to sender: ")
  198.     mon.setCursorPos(xMax-9,yMax)
  199.     mon.write("[GPS: "..GPS_signal.."]")
  200.     mon.setCursorPos(1,4)
  201.    
  202. end
  203. --*********************************************************************************
  204. local function ProgExit()
  205.     clearScreenMon()
  206.     clearScreenTerm()
  207.     print("Server OFF! ID: "..os.getComputerID())
  208.     print("Press CTRL+R to restart")
  209.     mon.setCursorPos(1,yMax/2-1)
  210.     WriteCenter("Server OFF! ID: "..os.getComputerID())
  211.     mon.setCursorPos(1,yMax/2)
  212.     WriteCenter("Press CTRL+R to restart")
  213.     mon.setCursorPos(1,yMax)
  214.     RedNetClose()
  215. end
  216. --*********************************************************************************
  217. local function AnimationStart()
  218.     clearScreenTerm()
  219.     print("Start program!")
  220.     term.write("Loading")
  221.         for i = 1, 5 do
  222.             term.write(".")
  223.             sleep(1.5)
  224.         end
  225.         term.write("OK")
  226.         print()
  227.         sleep(1)
  228. end    
  229. --*********************************************************************************
  230. AnimationStart()
  231. autorunStartUp()
  232. MonitorOpen()
  233. RedNetOpen()
  234. clearScreenMon()
  235. clearScreenTerm()
  236. ReadIDsender() 
  237. Header()
  238.  
  239.     while  true do
  240.         local e, p1, p2, p3, p4, p5 = os.pullEvent()
  241.         xPos, yPos = mon.getCursorPos()
  242.         local sender, msg, distance = p3, p4, p5
  243.         if e == "modem_message" then
  244.                     if sender == id_sender then -- receiving messages from a particular sender ID
  245.                    
  246.                         if msg ~= "new_data_packet" and msg ~= "line"  and msg ~= "clear_mon" then
  247.                             mon.clearLine()
  248.                             mon.write(msg)
  249.                             mon.setCursorPos(1,yPos+1)
  250.                             xPos, yPos = mon.getCursorPos()
  251.                             mon.setCursorPos(1,yMax)
  252.                             mon.clearLine()
  253.                             mon.write("Distance to sender: "..math.floor(distance).." meters.")
  254.                             mon.setCursorPos(xMax-9,yMax)
  255.                             mon.write("[GPS: "..GPS_signal.."]")
  256.                             mon.setCursorPos(xPos,yPos)
  257.                         end
  258.                        
  259.                             if msg == "new_data_packet" then
  260.                                 mon.setCursorPos(1,4)
  261.                             end
  262.                         if msg == "line" then
  263.                             mon.write(decor_line)
  264.                             xPos, yPos = mon.getCursorPos()
  265.                             mon.setCursorPos(1,yPos+1)
  266.                         end
  267.                        
  268.                         if msg == "clear_mon" then
  269.                             Header()
  270.                         end
  271.                     end
  272.         elseif e == "key" then
  273.             local key = p1
  274.             if key == keys.i then
  275.                 clearScreenMon()
  276.                 os.pullEvent("char")
  277.                 ChangeEnterIDserver()
  278.                 Header()
  279.             elseif key == keys.u then
  280.                 os.pullEvent("char")
  281.                 UpdateThisProg()   
  282.             elseif key == keys.q then
  283.                 os.pullEvent("char")
  284.                 ProgExit()
  285.                 break
  286.             end
  287.         end
  288.    
  289.        
  290. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement