Difference between revisions of "Gps (program)"

From ComputerCraft Wiki
Jump to: navigation, search
(Page creation)
 
Line 3: Line 3:
  
 
== Usage ==
 
== Usage ==
 +
  
 
{| border="1" cellpadding="2" cellspacing="0"
 
{| border="1" cellpadding="2" cellspacing="0"
Line 20: Line 21:
 
|}
 
|}
  
 +
 +
<nowiki>
 +
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
 +
</nowiki>
 
[[Category:Notable Programs]]
 
[[Category:Notable Programs]]

Revision as of 01:06, 28 July 2012

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.


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