View difference between Paste ID: ifAbt8LA and zjn3E5LS
SHOW: | | - or go back to the newest paste.
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