Gps (program)

From ComputerCraft Wiki
Jump to: navigation, search

gps is a stock program designed to make use of the positioning capabilities introduced in ComputerCraft 1.31.


Usage

Method name Description
gps host The computer will act as a gps host.

The computer's own location is retrieved using the gps.

gps host <x> <y> <z> The computer will act as a gps host.

You manually provide the computer's own location (x, y and z).

gps locate It will try to retrieve the computer or turtle own location.


Source code

local function printUsage()
	print( "Usages:" )
	print( "gps host" )
	print( "gps host <x> <y> <z>" )
	print( "gps locate" )
end

local tArgs = { ... }
if #tArgs < 1 then
	printUsage()
	return
end

local function readNumber()
	local num = nil
	while num == nil do
		num = tonumber(read())
		if not num then
			write( "Not a number. Try again: " )
		end
	end
	return math.floor( num + 0.5 )
end

local function open()
	local bOpen, sFreeSide = false, nil
	for n,sSide in pairs(rs.getSides()) do	
		if peripheral.getType( sSide ) == "modem" then
			sFreeSide = sSide
			if rednet.isOpen( sSide ) then
				bOpen = true
				break
			end
		end
	end
	
	if not bOpen then
		if sFreeSide then
			print( "No modem active. Opening "..sFreeSide.." modem" )
			rednet.open( sFreeSide )
			return true
		else
			print( "No modem attached" )
			return false
		end
	end
	return true
end
	
local sCommand = tArgs[1]
if sCommand == "locate" then
	if open() then
		gps.locate( 2, true )
	end
	
elseif sCommand == "host" then
	if turtle then
		print( "Turtles cannot act as GPS hosts." )
		return
	end

	if open() then
		local x,y,z
		if #tArgs >= 4 then
			x = tonumber(tArgs[2])
			y = tonumber(tArgs[3])
			z = tonumber(tArgs[4])
			if x == nil or y == nil or z == nil then
				printUsage()
				return
			end
			print( "Position is "..x..","..y..","..z )
		else
			x,y,z = gps.locate( 2, true )
			if x == nil then
				print( "Run \"gps host <x> <y> <z>\" to set position manually" )
				return
			end
		end
	
		print( "Serving GPS requests" )
	
		local nServed = 0
		while true do
			sender,message,distance = rednet.receive()
			if message == "PING" then
				rednet.send(sender, textutils.serialize({x,y,z}))
				
				nServed = nServed + 1
				if nServed > 1 then
					local x,y = term.getCursorPos()
					term.setCursorPos(1,y-1)
				end
				print( nServed.." GPS Requests served" )
			end
		end
	end
	
else
	printUsage()
	return
end