Advertisement
qwertz19281

[ComputerCraft] Turtle offline GPS

Aug 25th, 2016
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.19 KB | None | 0 0
  1. --TurtleGPS
  2. --load it with os.loadAPI
  3. --INFO: for calibration, in front of the turtle must be air to recognize direction
  4.  
  5. timeout=5
  6.  
  7. function setDefaultTimeout(to)
  8.     timeout=to
  9. end
  10.  
  11. dir=0
  12. posX=0
  13. posY=0
  14. posZ=0
  15.  
  16. function fixDir()
  17.     if(dir<0) then
  18.         dir=dir+4
  19.     end
  20.     if(dir>3) then
  21.         dir=dir-4
  22.     end
  23. end
  24.  
  25. function mov(x,z)
  26.     if(dir==0) then
  27.         posZ=posZ-z
  28.         posX=posX+x
  29.     elseif(dir==2) then
  30.         posZ=posZ+z
  31.         posX=posX-x
  32.     elseif(dir==1) then
  33.         posZ=posZ+x
  34.         posX=posX+z
  35.     elseif(dir==2) then
  36.         posZ=posZ-x
  37.         posX=posX-z
  38.     end
  39. end
  40.  
  41. function getPos()
  42.     return getPos(timeout)
  43. end
  44.  
  45. verbosity=true
  46.  
  47. function setSilence(silence)
  48.     verbosity=(not silence)
  49. end
  50.  
  51. function getPos(tout)
  52.     to=timeout
  53.     if(tout) then
  54.         to=tout
  55.     end
  56.     gx,gy,gz=gps.qwgps_orig_locate(tout)
  57.     if((gx~=nil and (not(x ~= x)))and((gx~=posX)or(gy~=posY)or(gz~=posZ))) then
  58.         if verbosity then
  59.             print("[qwgps] INFO local coords don't equal with remote coords: LocalX"..tostring(posX).."Y"..tostring(posY).."Z"..tostring(posZ).." SatX"..tostring(gx).."Y"..tostring(gy).."Z"..tostring(gz))
  60.         end
  61.         posX=gx
  62.         posY=gy
  63.         posZ=gz
  64.         pcall(writeCD)
  65.     end
  66.    
  67.     return posX,posY,posZ
  68. end
  69.  
  70. function getPosNoScan()
  71.     return posX,posY,posZ
  72. end
  73.  
  74. function init()
  75.     turtle.qwgps_orig_back=turtle.back
  76.     turtle.back=function()
  77.         ok=turtle.qwgps_orig_back()
  78.         if ok then
  79.             mov(0,-1)
  80.             pcall(writeCD)
  81.         end
  82.         return ok
  83.     end
  84.     turtle.qwgps_orig_forward=turtle.forward
  85.     turtle.forward=function()
  86.         ok=turtle.qwgps_orig_forward()
  87.         if ok then
  88.             mov(0,1)
  89.             pcall(writeCD)
  90.         end
  91.         return ok
  92.     end
  93.     turtle.qwgps_orig_goLeft=turtle.left
  94.     turtle.left=function()
  95.         ok=turtle.qwgps_orig_goLeft()
  96.         if ok then
  97.             mov(-1,0)
  98.             pcall(writeCD)
  99.         end
  100.         return ok
  101.     end
  102.     turtle.qwgps_orig_goRight=turtle.right
  103.     turtle.right=function()
  104.         ok=turtle.qwgps_orig_goRight()
  105.         if ok then
  106.             mov(1,0)
  107.             pcall(writeCD)
  108.         end
  109.         return ok
  110.     end
  111.     turtle.qwgps_orig_up=turtle.up
  112.     turtle.up=function()
  113.         ok=turtle.qwgps_orig_up()
  114.         if ok then
  115.             posY=posY+1
  116.             pcall(writeCD)
  117.         end
  118.         return ok
  119.     end
  120.     turtle.qwgps_orig_down=turtle.down
  121.     turtle.down=function()
  122.         ok=turtle.qwgps_orig_down()
  123.         if ok then
  124.             posY=posY-1
  125.             pcall(writeCD)
  126.         end
  127.         return ok
  128.     end
  129.     turtle.qwgps_orig_turnLeft=turtle.turnLeft
  130.     turtle.turnLeft=function()
  131.         ok=turtle.qwgps_orig_turnLeft()
  132.         if ok then
  133.             dir=dir-1
  134.             pcall(writeCD)
  135.         end
  136.         return ok
  137.     end
  138.     turtle.qwgps_orig_turnRight=turtle.turnRight
  139.     turtle.turnRight=function()
  140.         ok=turtle.qwgps_orig_turnRight()
  141.         if ok then
  142.             dir=dir+1
  143.             pcall(writeCD)
  144.         end
  145.         return ok
  146.     end
  147.     gps.qwgps_orig_locate=gps.locate
  148. end
  149.  
  150. function overrideGpsDotLocate()
  151.     gps.locate=function(tout,debug)
  152.         return getPos(tout)
  153.     end
  154. end
  155.  
  156. function restoreAPIs()
  157.     turtle.forward=turtle.qwgps_orig_forward
  158.     turtle.back=turtle.qwgps_orig_back
  159.     turtle.left=turtle.qwgps_orig_goLeft
  160.     turtle.right=turtle.qwgps_orig_goRight
  161.     turtle.up=turtle.qwgps_orig_up
  162.     turtle.down=turtle.qwgps_orig_down
  163.     turtle.turnLeft=turtle.qwgps_orig_turnLeft
  164.     turtle.turnRight=turtle.qwgps_orig_turnRight
  165.     gps.locate=gps.qwgps_orig_locate
  166. end
  167.  
  168. function calib_scan()
  169.     fx,fy,fz=gps.qwgps_orig_locate(timeout)
  170.     if(fx==nil) then
  171.         print("Enter turtle's current Coords: ")
  172.         term.write("X")
  173.         fx=tonumber(read())
  174.         term.write("Y")
  175.         fy=tonumber(read())
  176.         term.write("Z")
  177.         fz=tonumber(read())
  178.     end
  179.     return fx,fy,fz
  180. end
  181. init()
  182. overrideGpsDotLocate()
  183. function readCD()
  184.     if(fs.exists("qwgps_coords")) then
  185.         h=fs.open("qwgps_coords","r")
  186.         dir=tonumber(h.readLine())
  187.         posX=tonumber(h.readLine())
  188.         posY=tonumber(h.readLine())
  189.         posZ=tonumber(h.readLine())
  190.         h.close()
  191.         return true
  192.     end
  193.     return false
  194. end
  195. function writeCD()
  196.     h=fs.open("qwgps_coords","w")
  197.     h.writeLine(tostring(dir))
  198.     h.writeLine(tostring(posX))
  199.     h.writeLine(tostring(posY))
  200.     h.writeLine(tostring(posZ))
  201.     h.flush()
  202.     h.close()
  203. end
  204. function calibrate()
  205.     ax,ay,az=calib_scan()
  206.     while not turtle.qwgps_orig_forward() do
  207.         print("[qwgps] In front of the turtle must be air")
  208.         sleep(4)
  209.     end
  210.     bx,by,bz=calib_scan()
  211.     while not turtle.qwgps_orig_back() do
  212.         print("[qwgps] On back side of the turtle must be air")
  213.         sleep(4)
  214.     end
  215.     if(bx>ax) then
  216.         dir=1
  217.     elseif(bx<ax) then
  218.         dir=3
  219.     elseif(bz>az) then
  220.         dir=2
  221.     elseif(bz<az) then
  222.         dir=0
  223.     end
  224.     posX=ax
  225.     posY=ay
  226.     posZ=az
  227. end
  228. if not readCD() then
  229.     calibrate()
  230.     writeCD()
  231. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement