Ravn::HAL::Device::

GPS class

Onboard GPS device adapter. The usb “puck”.

Responsible for generating the following events:

  • sys.gps.position

  • sys.gps.time

Attributes

gps R

The gpsd parser.

timer R

A timer status subclass.

Public Class Methods

new( * )

Create a new device adapter for the onboard GPS system.

# File lib/ravn/hal/device/gps.rb, line 37
def initialize( * )
        @gps   = nil
        @timer = self.create_timer
        super
end

Public Instance Methods

create_timer()

Create a Concurrent::TimerTask that speaks to gpsd on an interval.

# File lib/ravn/hal/device/gps.rb, line 87
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
discover()

Connect to the local GPS daemon and signal to it we want to use its polling mode.

# File lib/ravn/hal/device/gps.rb, line 76
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
send_events( * )

Emit relevant HAL messages on an interval.

# File lib/ravn/hal/device/gps.rb, line 53
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
start()

Fire up an interval timer for polling gpsd.

# File lib/ravn/hal/device/gps.rb, line 68
def start
        super
        self.timer.execute
end