Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --<<The program for the control of the drone network, ComputerCraft>>--
- --<<External Monitor Control, Lua>>--
- --By Aleksandr Kulikov, 2013--
- -- http://pastebin.com/D5ih1eQe --
- -- pastebin get D5ih1eQe mon_control --
- local ver_prog = "0.8.2"
- local id_sender = 555
- local xMaxTerm, yMaxTerm = term.getSize()
- local decor_line_term = string.rep("-", xMaxTerm)
- --*********************************************************************************
- local function clearScreenTerm()
- term.clear()
- term.setCursorPos(1,1)
- end
- --*********************************************************************************
- local function clearScreenMon()
- mon.clear()
- mon.setCursorPos(1,1)
- end
- --*********************************************************************************
- local function autorunStartUp()
- if not os.getComputerLabel() then
- os.setComputerLabel("MonitorEX - "..os.getComputerID())
- end
- if fs.exists("startup") then
- if not fs.exists("startup_backup") then
- fs.copy("startup","startup_backup")
- end
- end
- local file = fs.open ("startup", "w")
- file.writeLine ("--Edit the file to execute the program: <"..shell.getRunningProgram()..">")
- file.writeLine ("--A backup copy of the file: <startup_backup>")
- file.writeLine ("shell.run(\""..shell.getRunningProgram().."\")")
- file.close()
- end
- --*********************************************************************************
- local function WriteCenter(str)
- local xPos, yPos = mon.getCursorPos()
- str_long = #str
- mon.setCursorPos((xMax/2-str_long/2)+1,yPos)
- mon.write(str)
- end
- --****************************************************************************
- local function MonitorOpen()
- local sMonitorSide = nil
- for n,sSide in ipairs( rs.getSides() ) do
- if peripheral.getType( sSide ) == "monitor" then
- sMonitorSide = sSide
- mon = peripheral.wrap(sMonitorSide, true)
- xMax, yMax = mon.getSize()
- if xMax ~= 61 or yMax ~= 19 then
- print( "ERROR!" )
- print( "Requires an external monitor 3 to 6 blocks!" )
- print( "Program stopped." )
- print( "ID computer: "..os.getComputerID())
- error()
- end
- decor_line = string.rep("-", xMax)
- break
- end
- end
- if sMonitorSide == nil then
- print( "Program stopped." )
- print( "No monitor attached." )
- print( "ID computer: "..os.getComputerID())
- error()
- end
- end
- --****************************************************************************
- local function RedNetOpen()
- local sModemSide = nil
- for n,sSide in ipairs( rs.getSides() ) do
- if peripheral.getType( sSide ) == "modem" then
- sModemSide = sSide
- rednet.open(sModemSide)
- gps_x, gps_z, gps_y = gps.locate(1)
- if gps_x == nil then
- GPS_signal = "No"
- else
- GPS_signal = "Yes"
- end
- break
- end
- end
- if sModemSide == nil then
- print( "Program stopped.")
- print( "No modem attached." )
- print( "ID computer: "..os.getComputerID())
- error()
- end
- end
- --*********************************************************************************
- local function RedNetClose()
- local sModemSide = nil
- for n,sSide in ipairs( rs.getSides() ) do
- if peripheral.getType( sSide ) == "modem" then
- sModemSide = sSide
- rednet.close(sModemSide)
- break
- end
- end
- if sModemSide == nil then
- print( "Program stopped.")
- print( "No modem attached." )
- error()
- end
- end
- --*********************************************************************************
- local function ChangeEnterIDserver()
- term.write("Enter ID sender: ")
- id_sender = math.floor(math.abs(tonumber(io.read()) or id_sender))
- local file = fs.open ("id_sender_set.dat", "w")
- file.writeLine (id_sender)
- file.writeLine ("--The server accepts messages only from this ID.")
- file.close()
- end
- --*********************************************************************************
- local function ReadIDsender()
- if fs.exists("id_sender_set.dat") then
- local file = fs.open ("id_sender_set.dat", "r")
- id_sender = tonumber (file.readLine ( ))
- file.close ( )
- end
- end
- --*********************************************************************************
- local function UpdateThisProg()
- local Code = "D5ih1eQe"
- local File_name = shell.getRunningProgram() --..os.day()
- clearScreenMon()
- if not http then
- print("Pastebin requires http API!!!")
- print("Set enable API_http in ComputerCraft.cfg")
- sleep(5)
- return
- end
- print("Connecting to pastebin.com... ")
- local response = http.get(
- "http://pastebin.com/raw.php?i="..textutils.urlEncode(Code)
- )
- if response then
- print("Success.")
- local sResponse = response.readAll()
- response.close()
- local file = fs.open(File_name, "w")
- file.write( sResponse )
- file.close()
- print("Downloaded as "..File_name)
- sleep(1)
- for i = 1, 6 do
- clearScreenTerm()
- print("Reboot system "..(6-i).." sec...")
- sleep(1)
- end
- os.reboot()
- else
- print( "Failed." )
- end
- sleep(5)
- end
- --*********************************************************************************
- local function Header()
- clearScreenMon()
- clearScreenTerm()
- WriteCenter("Server ID: "..os.getComputerID()..", Sender ID: "..id_sender..", ver. "..ver_prog)
- mon.setCursorPos(1,2)
- WriteCenter("[Q]-exit, [I]-id sender change, [U]-update, DPI: "..xMax.."x"..yMax)
- print("Server ID "..os.getComputerID().." is ready. Current ID sender: "..id_sender)
- print(decor_line_term)
- print("[Q]-exit, [I]-ID sender change, [U]-update")
- print("Press CTRL+R to restart")
- mon.setCursorPos(1,3)
- mon.write(decor_line)
- mon.setCursorPos(1,yMax-1)
- mon.write(decor_line)
- mon.setCursorPos(1,yMax)
- mon.clearLine()
- mon.write("Distance to sender: ")
- mon.setCursorPos(xMax-9,yMax)
- mon.write("[GPS: "..GPS_signal.."]")
- mon.setCursorPos(1,4)
- end
- --*********************************************************************************
- local function ProgExit()
- clearScreenMon()
- clearScreenTerm()
- print("Server OFF! ID: "..os.getComputerID())
- print("Press CTRL+R to restart")
- mon.setCursorPos(1,yMax/2-1)
- WriteCenter("Server OFF! ID: "..os.getComputerID())
- mon.setCursorPos(1,yMax/2)
- WriteCenter("Press CTRL+R to restart")
- mon.setCursorPos(1,yMax)
- RedNetClose()
- end
- --*********************************************************************************
- local function AnimationStart()
- clearScreenTerm()
- print("Start program!")
- term.write("Loading")
- for i = 1, 5 do
- term.write(".")
- sleep(1.5)
- end
- term.write("OK")
- print()
- sleep(1)
- end
- --*********************************************************************************
- AnimationStart()
- autorunStartUp()
- MonitorOpen()
- RedNetOpen()
- clearScreenMon()
- clearScreenTerm()
- ReadIDsender()
- Header()
- while true do
- local e, p1, p2, p3, p4, p5 = os.pullEvent()
- xPos, yPos = mon.getCursorPos()
- local sender, msg, distance = p3, p4, p5
- if e == "modem_message" then
- if sender == id_sender then -- receiving messages from a particular sender ID
- if msg ~= "new_data_packet" and msg ~= "line" and msg ~= "clear_mon" then
- mon.clearLine()
- mon.write(msg)
- mon.setCursorPos(1,yPos+1)
- xPos, yPos = mon.getCursorPos()
- mon.setCursorPos(1,yMax)
- mon.clearLine()
- mon.write("Distance to sender: "..math.floor(distance).." meters.")
- mon.setCursorPos(xMax-9,yMax)
- mon.write("[GPS: "..GPS_signal.."]")
- mon.setCursorPos(xPos,yPos)
- end
- if msg == "new_data_packet" then
- mon.setCursorPos(1,4)
- end
- if msg == "line" then
- mon.write(decor_line)
- xPos, yPos = mon.getCursorPos()
- mon.setCursorPos(1,yPos+1)
- end
- if msg == "clear_mon" then
- Header()
- end
- end
- elseif e == "key" then
- local key = p1
- if key == keys.i then
- clearScreenMon()
- os.pullEvent("char")
- ChangeEnterIDserver()
- Header()
- elseif key == keys.u then
- os.pullEvent("char")
- UpdateThisProg()
- elseif key == keys.q then
- os.pullEvent("char")
- ProgExit()
- break
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement