Ravn::HAL::Device::
GPS
class
Onboard GPS
device adapter. The usb “puck”.
Responsible for generating the following events:
-
sys.gps.position
-
sys.gps.time
- gps R
The gpsd parser.
- timer R
A timer status subclass.
Create a new device adapter for the onboard GPS
system.
def initialize( * )
@gps = nil
@timer = self.create_timer
super
end
Create a Concurrent::TimerTask that speaks to gpsd on an interval.
def create_timer
timer = Concurrent::TimerTask.new( &self.method(:send_events) )
timer.execution_interval = self.class.status_frequency
timer.add_observer( Ravn::LoggingTaskObserver.new(:update_timer) )
return timer
end
Connect to the local GPS
daemon and signal to it we want to use its polling mode.
def discover
@gps = Ravn::GPSClient.new
self.gps.connect
rescue RuntimeError, Errno::ECONNREFUSED => err
self.log.error "Error while starting: %s" % [ err.message ]
sleep( RESET_THROTTLE_TIME )
self.core&.parent&.tell( reset_device: self )
end
Emit relevant HAL messages on an interval.
def send_events( * )
data = self.gps.fetch_state or return
msg = Ravn::HAL::Message.new( 'sys.gps.time', data: { time: data[:time] } )
self.filter_up( msg )
if data[ :gps ]
msg = Ravn::HAL::Message.new( 'sys.gps.position', data: data[:gps] )
self.filter_up( msg )
end
end
Fire up an interval timer for polling gpsd.
def start
super
self.timer.execute
end