53 lines
1.3 KiB
Ruby
53 lines
1.3 KiB
Ruby
require "socket"
|
|
require 'json'
|
|
|
|
# Represents a +Receiver+ that obtains information from GPSD.
|
|
module Gps::Receivers
|
|
class Gpsd < Gps::Receiver
|
|
attr_reader :host, :port
|
|
|
|
# Accepts an options +Hash+ consisting of the following:
|
|
# * _:host_: The host to which to connect
|
|
# * _:port_: The port to which to connect
|
|
def initialize(options = {})
|
|
super
|
|
@host ||= options[:host] ||= "localhost"
|
|
@port = options[:port] ||= 2947
|
|
end
|
|
|
|
def start
|
|
@socket = TCPSocket.new(@host, @port)
|
|
@socket.puts("?WATCH={\"enable\":true,\"json\": true}")
|
|
super
|
|
end
|
|
|
|
def update
|
|
line = @socket.gets.chomp
|
|
return if !line
|
|
jline = JSON.parse(line)
|
|
#puts jline.inspect
|
|
|
|
msgtype = jline['class']
|
|
case msgtype
|
|
when 'TPV'
|
|
@last_tag = jline['tag']
|
|
@timestamp = jline['time']
|
|
@timestamp_error_estimate = jline['ept']
|
|
@latitude = jline['lat']
|
|
@longitude = jline['lon']
|
|
@altitude = jline['lon']
|
|
@horizontal_error_estimate = jline['epx']
|
|
@vertical_error_estimate = jline['epv']
|
|
@course = jline['track']
|
|
@speed = jline['speed']
|
|
@climb = jline['climb']
|
|
@course_error_estimate = jline['epd']
|
|
@speed_error_estimate = jline['eps']
|
|
@climb_error_estimate = jline['epc']
|
|
when 'SKY'
|
|
@satellites = jline['satellites']
|
|
end
|
|
end
|
|
end
|
|
end
|