class Gps::Device

Attributes

callbacks[R]
last_datetime[RW]

Public Class Methods

new(filename, track_datetime=true) click to toggle source
# File lib/gps/device.rb, line 5
def initialize(filename, track_datetime=true)
  @callbacks = {}
  @track_datetime = track_datetime
  @filename = filename
  @file = File.open(filename, 'rb')
end
open(filename, &block) click to toggle source
# File lib/gps/device.rb, line 12
def self.open(filename, &block)
  device = Device.new filename
  block.call device
  device.close
end

Public Instance Methods

close() click to toggle source
# File lib/gps/device.rb, line 18
def close
  @file.close if @file
end
each_coordinates(&block) click to toggle source
# File lib/gps/device.rb, line 39
def each_coordinates(&block)
  each_sentence do |sentence|
    block.call sentence.lat_long_dec if sentence.has_coordinates?
  end
end
each_line(&block) click to toggle source
# File lib/gps/device.rb, line 22
def each_line(&block)
  @file.each_line do |line|
    line.strip!
    next if line.empty?
    block.call line
  end
end
each_sentence(&block) click to toggle source
# File lib/gps/device.rb, line 30
def each_sentence(&block)
  each_line do |line|
    s = Nmea::Sentence.parse line
    next if s.nil?
    update_datetime s if @track_datetime
    block.call s
  end
end
on_altitude(&block) click to toggle source
# File lib/gps/device.rb, line 133
def on_altitude(&block)
  callbacks[:altitude] ||= []
  callbacks[:altitude] << block
end
on_complete(&block) click to toggle source
# File lib/gps/device.rb, line 138
def on_complete(&block)
  callbacks[:complete] ||= []
  callbacks[:complete] << block
end
on_coordinates(&block) click to toggle source
# File lib/gps/device.rb, line 113
def on_coordinates(&block)
  callbacks[:coordinates] ||= []
  callbacks[:coordinates] << block
end
on_datetime(&block) click to toggle source
# File lib/gps/device.rb, line 118
def on_datetime(&block)
  callbacks[:datetime] ||= []
  callbacks[:datetime] << block
end
on_magnetic_track(&block) click to toggle source
# File lib/gps/device.rb, line 148
def on_magnetic_track(&block)
  callbacks[:magnetic_track] ||= []
  callbacks[:magnetic_track] << block
end
on_speed_kmh(&block) click to toggle source
# File lib/gps/device.rb, line 128
def on_speed_kmh(&block)
  callbacks[:speed_kmh] ||= []
  callbacks[:speed_kmh] << block
end
on_speed_knots(&block) click to toggle source
# File lib/gps/device.rb, line 123
def on_speed_knots(&block)
  callbacks[:speed_knots] ||= []
  callbacks[:speed_knots] << block
end
on_true_track(&block) click to toggle source
# File lib/gps/device.rb, line 143
def on_true_track(&block)
  callbacks[:true_track] ||= []
  callbacks[:true_track] << block
end
rewind() click to toggle source

Rewind file if not a character device

# File lib/gps/device.rb, line 46
def rewind
  @file.rewind unless File.chardev?(@file.path)
end
start() click to toggle source

Begin fetch process with callbacks

# File lib/gps/device.rb, line 51
def start
  @stopped = false
  each_sentence do |sentence|
    break if @stopped

    if @callbacks[:coordinates] && sentence.has_coordinates?
      @callbacks[:coordinates].each do |block|
        block.call sentence.lat_long_dec
      end
    end


    if @callbacks[:datetime] && sentence.has_datetime?
      @callbacks[:datetime].each do |block|
        block.call sentence.datetime
      end
    end

    if @callbacks[:speed_knots] && sentence.respond_to?(:speed_knots)
      @callbacks[:speed_knots].each do |block|
        block.call sentence.speed_knots if sentence.speed_knots
      end
    end

    if @callbacks[:speed_kmh] && sentence.respond_to?(:speed_kmh)
      @callbacks[:speed_kmh].each do |block|
        block.call sentence.speed_kmh if sentence.speed_kmh
      end
    end

    if @callbacks[:altitude] && sentence.respond_to?(:altitude)
      @callbacks[:altitude].each do |block|
        block.call sentence.altitude if sentence.altitude
      end
    end

    if @callbacks[:true_track] && sentence.respond_to?(:true_track)
      @callbacks[:true_track].each do |block|
        block.call sentence.true_track if sentence.true_track
      end
    end

    if @callbacks[:magnetic_track] && sentence.respond_to?(:magnetic_track)
      @callbacks[:magnetic_track].each do |block|
        block.call sentence.magnetic_track if sentence.magnetic_track
      end
    end
  end

  if @callbacks[:complete]
    @callbacks[:complete].each(&:call)
  end
end
start_async() click to toggle source
# File lib/gps/device.rb, line 105
def start_async
  Thread.new(&method(:start))
end
stop() click to toggle source
# File lib/gps/device.rb, line 109
def stop
  @stopped = true
end

Private Instance Methods

update_datetime(sentence) click to toggle source
# File lib/gps/device.rb, line 157
def update_datetime(sentence)
  if sentence.respond_to? :datetime
    @last_datetime = sentence.datetime
  end
end