Advertisement
HPWebcamAble

[CC][1.0] ControlMe (Turtle)

Jan 22nd, 2016
5,658
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.27 KB | None | 0 0
  1. --[[
  2. HPWebcamAble presents...
  3. ControlMe
  4.  
  5. --=== Description ===--
  6. This program lets you control a turtle from a pocket computer!
  7.  
  8. This version of the program is for the TURTLE
  9. Get the Pocket Computer version here: pastebin.com/mTGccYbM
  10.  
  11.  
  12. --=== Installation ===--
  13. Pastebin Code: zjn3E5LS
  14.  
  15. To download a file from pastebin, run this command in a computer:
  16. pastebin get <code> <file name>
  17.  
  18.  
  19. --=== Update History ===--
  20. The pastebin will always have the most recent version
  21.  
  22. |1.0|
  23. -Release
  24. ]]
  25.  
  26. --=== Variables ===--
  27. local args = {...}
  28. local protocalName = "controlme"
  29. local computerID
  30. local w,h = term.getSize()
  31.  
  32.  
  33. --=== Functions ===--
  34. local function color(text,back)
  35.   local temp = text and term.setTextColor(text) or nil
  36.   temp = back and term.setBackgroundColor(back) or nil
  37. end
  38.  
  39. local function printC(text,y)
  40.   if type(text) ~= "string" or type(y) ~= "number" then error("expected string,number, got "..type(text)..","..type(y),2) end
  41.   local lenght = #text
  42.   local start = math.floor((w-lenght)/2)+1
  43.   term.setCursorPos(start,y)
  44.   term.write(text)
  45.   return start,start+lenght
  46. end
  47.  
  48. local function checkMessage(event,skipTableCheck,skipIDCheck)
  49.   return event[4] == protocalName and (skipTableCheck or type(event[3]) == "table") and (skipIDCheck or event[2] == computerID)
  50. end
  51.  
  52. local function message(message)
  53.   rednet.send(computerID,message,protocalName)
  54. end
  55.  
  56. local function broadcast(message)
  57.   rednet.broadcast(message,protocalName)
  58. end
  59.  
  60. local function getModem()
  61.   for a,b in pairs(rs.getSides()) do
  62.     if peripheral.getType(b) == "modem" and peripheral.call(b,"isWireless") then
  63.       return b
  64.     end
  65.   end
  66. end
  67.  
  68. local function getFreeSlot()
  69.   for i = 1, 16 do
  70.     local result = turtle.getItemCount(i)
  71.     if result == 0 then
  72.       return i
  73.     end
  74.   end
  75.   return false
  76. end
  77.  
  78. local function getTool(side)
  79.   if peripheral.getType(side) then
  80.     return peripheral.getType(side)
  81.   end
  82.   local slot = getFreeSlot()
  83.   local curSlot = turtle.getSelectedSlot()
  84.   local equipSide = "equip"..string.sub(side,1,1):upper()..string.sub(side,2)
  85.   if slot then
  86.     turtle.select(slot)
  87.     turtle[equipSide]()
  88.     local item = turtle.getItemDetail()
  89.     turtle[equipSide]()
  90.     turtle.select(curSlot)
  91.     return (item~=nil and item.name or "none")
  92.   end
  93.   return "failed_no_slot"
  94. end
  95.  
  96. --=== Program ===--
  97. if not turtle then
  98.   printError("This program requires a turtle!")
  99.   return
  100. elseif args[1] == "help" then
  101.   print("ControlMe")
  102.   print("By HPWebcamAble")
  103.   print("")
  104.   print("Use this program to remotly control your turtle!")
  105.   print("Start this program on the turtle and the corresponding program on a pockect computer and control away!")
  106. end
  107.  
  108. do
  109.   local modemSide = getModem()
  110.   if modemSide then
  111.     rednet.open(modemSide)
  112.   else
  113.     printError("This program requires a wireless modem")
  114.     print("Place one in the turtle's inventory and use the 'equip' program")
  115.     return
  116.   end
  117. end
  118. color(colors.white,colors.black)
  119. term.clear()
  120. printC("Waiting for connection...",5)
  121. printC("My ID is "..os.getComputerID(),6)
  122.  
  123. while true do
  124.   local event = {os.pullEventRaw()}
  125.   if event[1] == "terminate" then
  126.     term.clear() term.setCursorPos(1,1) print("Program terminated")
  127.     return
  128.   elseif event[1] == "rednet_message" then
  129.     if checkMessage(event,true,true) then
  130.       if event[3] == "turtle_locate" then
  131.         broadcast("turtle_here")
  132.       elseif type(event[3]) == "table" and event[3].action == "connect" and event[3].id == os.getComputerID() then
  133.         computerID = event[2]
  134.         message("connected")
  135.         break
  136.       end
  137.     end
  138.   end
  139. end
  140.  
  141. term.clear()
  142. printC("ControlMe is running!",5)
  143. printC("Connected to ID "..computerID,6)
  144.  
  145. local function heartbeat()
  146.  
  147.   local timer = os.startTimer(5)
  148.   while true do
  149.     local event = {os.pullEvent()}
  150.     if event[1] == "rednet_message" then
  151.       if checkMessage(event,true) then
  152.         if event[3] == "ping" then
  153.           message("pong")
  154.           timer = os.startTimer(5)
  155.         end
  156.       end
  157.     elseif event[1] == "timer" and event[2] == timer then
  158.       color(colors.white,colors.black) term.setCursorPos(1,1) term.clear() print("Lost contact with Pocket Computer!")
  159.       error("FORCEQUIT")
  160.     end
  161.   end
  162.  
  163. end
  164.  
  165. local function main()
  166.  
  167.   while true do
  168.     local event = {os.pullEvent()}
  169.     if event[1] == "rednet_message" and checkMessage(event) then
  170.       local msg = event[3]
  171.       if msg.action == "execute" then
  172.         local func = loadstring("return "..msg.func)
  173.         local result = {pcall(func)}
  174.         message({action = "completed",result = select(2,unpack(result))})
  175.       elseif msg.action == "getLeftTool" then
  176.         message({action="getLeftTool",result=getTool("left")})
  177.       elseif msg.action == "getRightTool" then
  178.         message({action="getRightTool",result=getTool("right")})
  179.       end
  180.     end
  181.   end
  182.  
  183. end
  184.  
  185. local function run()
  186.   parallel.waitForAny(main,heartbeat)
  187. end
  188.  
  189. local state,err = pcall(run)
  190.  
  191. if err and not err:find("Terminated") and not err:find("FORCEQUIT") then
  192.   color(colors.white,colors.black)
  193.   term.clear()
  194.   printC("An error occured:",1)
  195.   term.setCursorPos(1,3)
  196.   print(err)
  197. elseif not err:find("FORCEQUIT") then
  198.   color(colors.white,colors.black)
  199.   term.clear()
  200.   term.setCursorPos(1,1)
  201. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement