Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Code by TechicalParadox, 8/2/16
- -- Program is meant to run in the background so a remote controller can run any of the commands listed
- -- Everything works except where "-- Crashes here" is, the os.sleep(5) and the prints are for testing
- -- No error message is listed, I run this program as a bg thread on an advanced turtle and it simply closes at the start of the while loop.
- -- SLAVE BACKGROUND PROCESS
- slaveControllerID = 1
- gotoX = 0
- gotoY = 0
- gotoZ = 0
- gotoPos = nil
- updateFreq = 60
- gotoUpdateFreq = 15
- -- prevent termination
- os.pullEvent = os.pullEventRaw
- -- initiate rednet
- if peripheral.isPresent("left") and peripheral.getType("left") == "modem" then
- rednet.open("left")
- elseif peripheral.isPresent("right") and peripheral.getType("right") == "modem" then
- rednet.open("right")
- else
- -- no rednet
- while true do -- spin forever
- turtle.turnRight()
- end
- end
- -- alert slave controller of connection
- rednet.send(slaveControllerID, "Connected")
- -- communicate with slave controller forever
- while true do
- -- send gps location
- x, y, z = gps.locate(1)
- if not x then -- gps failed to locate
- rednet.send(slaveControllerID, "posUnknown")
- else
- rednet.send(slaveControllerID, ("posCurrent"..x..","..y..","..z))
- end
- -- wait for command
- id, message = rednet.receive(updateFreq)
- if not id == slaveControllerID then -- if no message from slaveController
- -- do nothing
- elseif message == "PING" then
- -- respond
- rednet.send(slaveControllerID, "Here...")
- elseif message == "STOP" then
- -- force other programs to stop by rebooting
- rednet.send(slaveControllerID, "Rebooting...")
- os.reboot()
- elseif message == "GOTO" then
- -- authorize sending
- rednet.send(slaveControllerID, "Send Coordinates...")
- -- wait for coordinates from slave controller
- id, message = rednet.receive()
- while not id == slaveControllerID do
- id, message = rednet.receive()
- end
- -- x coordinate
- gotoX = message
- id, message = rednet.receive()
- while not id == slaveControllerID or id == SPAID do
- id, message = rednet.receive()
- end
- -- y coordinate
- gotoY = message
- id, message = rednet.receive()
- while not id == slaveControllerID or id == SPAID do
- id, message = rednet.receive()
- end
- -- z coordinate
- gotoZ = message
- print("goto"..gotoX..","..gotoY..","..gotoZ)
- -- tell slave controller
- rednet.send(slaveControllerID, ("Going to "..gotoX..","..gotoY..","..gotoZ.."..."))
- -- GOTO COORD
- curX, curY, curZ = gps.locate() -- get pos
- -- get heading
- heading = ""
- x1, y1, z1 = gps.locate()
- while (turtle.detect()) do
- turtle.dig()
- end
- turtle.forward()
- x2, y2, z2 = gps.locate()
- xD = x2 - x1
- yD = y2 - y1
- zD = z2 - z1
- if xD == 1 then
- heading = "X+"
- elseif xD == -1 then
- heading = "X-"
- elseif zD == 1 then
- heading = "Z+"
- elseif zD == -1 then
- heading = "Z-"
- end
- -- Loop until arrival
- print(heading)
- moves = 0
- print(moves)
- os.sleep(5)
- -- Crashes here
- while ((curX ~= gotoX) or (curY ~= gotoY) or (curZ ~= gotoZ)) do
- os.sleep(1)
- print ("test")
- -- update position
- curX, curY, curZ = gps.locate()
- if moves >= gotoUpdateFreq then
- rednet.send(slaveControllerID, gps.locate())
- moves = 0
- end
- -- Go to proper Y
- if curY < gotoY then
- -- go up
- while turtle.detectUp() do
- turtle.digUp()
- end
- turtle.up()
- elseif curY > gotoY then
- -- go down
- while turtle.detectDown() do
- turtle.digDown()
- end
- turtle.down()
- -- Go to proper X
- elseif curX < gotoX then
- -- go positive x
- if heading == "X-" then
- turtle.turnRight()
- turtle.turnRight()
- heading = "X+"
- elseif heading == "Z+" then
- turtle.turnLeft()
- heading = "X+"
- elseif heading == "Z-" then
- turtle.turnRight()
- heading = "X+"
- end
- while turtle.detect() do
- turtle.dig()
- end
- turtle.forward()
- elseif curX > gotoX then
- -- go negative x
- if heading == "X+" then
- turtle.turnRight()
- turtle.turnRight()
- heading = "X-"
- elseif heading == "Z+" then
- turtle.turnRight()
- heading = "X-"
- elseif heading == "Z-" then
- turtle.turnLeft()
- heading = "X-"
- end
- while turtle.detect() do
- turtle.dig()
- end
- turtle.forward()
- elseif curZ < gotoZ then
- -- go positive z
- if heading == "Z-" then
- turtle.turnRight()
- turtle.turnRight()
- heading = "Z+"
- elseif heading == "X+" then
- turtle.turnRight()
- heading = "Z+"
- elseif heading == "X-" then
- turtle.turnLeft()
- heading = "Z+"
- end
- while turtle.detect() do
- turtle.dig()
- end
- turtle.forward()
- elseif curZ > gotoZ then
- -- go negative z
- if heading == "Z+" then
- turtle.turnRight()
- turtle.turnRIght()
- heading = "Z-"
- elseif heading == "X+" then
- turtle.turnLeft()
- heading = "Z-"
- elseif heading == "X-" then
- turtle.turnRight()
- heading = "Z-"
- end
- while turtle.detect() do
- turtle.dig()
- end
- turtle.forward()
- end
- end
- print("got to end")
- os.sleep(5)
- -- finished goto
- rednet.send(slaveControllerID, ("Finished GOTO @ "..gps.locate()))
- elseif message == "EXCAVATE" then
- -- wait for size
- id, message = rednet.receive()
- while not id == slaveControllerID do
- id, message = rednet.receive()
- end
- shell.run("bg excavate "..tonumber(message))
- -- respond
- rednet.send(slaveControllerID, ("Excavating "..message.."x"..message))
- elseif message == "BURROW" then
- rednet.send(slaveControllerID, "Burrowing...")
- -- go as far down as possible
- turtle.digDown()
- while turtle.down() do
- turtle.digDown()
- end
- elseif message == "ELEVATE" then
- rednet.send(slaveControllerID, "Elevating...")
- -- go as far up as possible
- while turtle.detectUp() do
- turtle.digUp()
- end
- while turtle.up() do
- turtle.digUp()
- end
- elseif message == "UPDATEFREQ" then
- rednet.send(slaveControllerID, "Send new frequency...")
- -- wait for new freq
- id, message = rednet.receive()
- while not id == slaveControllerID do
- id, message = rednet.receive()
- end
- updateFreq = tonumber(message)
- -- respond
- rednet.send(slaveControllerID, ("Frequency updated to "..updateFreq))
- elseif message == "HEADING" then
- -- figure out heading
- heading = ""
- pos1 = vector.new(gps.locate(1))
- while turtle.detect() do
- turtle.dig()
- end
- turtle.forward()
- pos2 = vector.new(gps.locate(1))
- xD = pos2.x - pos1.x
- zD = pos2.z - pos1.z
- if xD == 1 then
- heading = "+X"
- elseif xD == -1 then -- facing -X
- heading = "-X"
- elseif zD == 1 then -- facing +Z
- heading = "+Z"
- elseif zD == -1 then -- facing -Z
- heading = "-Z"
- end
- s = ("Heading: "..heading)
- rednet.send(slaveControllerID,s)
- elseif message == "LOCATE" then
- x, y, z = gps.locate(1)
- rednet.send(slaveControllerID, ("GPS POSITION: "..x..","..y..","..z))
- elseif message == "FORWARD" then
- while turtle.detect() do
- turtle.dig()
- end
- turtle.forward()
- rednet.send(slaveControllerID,"Moved")
- elseif message == "TURNR" then
- turtle.turnRight()
- rednet.send(slaveControllerID,"Turned")
- elseif message == "TURNL" then
- turtle.turnLeft()
- rednet.send(slaveControllerID,"Turned")
- elseif message == "DOWN" then
- while turtle.detectDown() do
- turtle.digDown()
- end
- turtle.down()
- rednet.send(slaveControllerID,"Moved")
- elseif message == "UP" then
- while turtle.detectUp() do
- turtle.digUp()
- end
- turtle.up()
- rednet.send(slaveControllerID,"Moved")
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment