class GpsdBaudRate

Constants

LOG_LEVELS
VERSION

Attributes

version[R]

Public Class Methods

baud_rate() click to toggle source

~~~~~~~~~~~~~~~~~~~~~~~~ baud rate ~~~~~~~~~~~~~~~~~~~

# File lib/gpsd_baud_rate.rb, line 104
def self.baud_rate
  %x| sudo stty -F "#{@@device}"|.split('; ')[0].split(/\W+/)[1].to_i
end
baud_rate?(b_rate) click to toggle source
# File lib/gpsd_baud_rate.rb, line 108
def self.baud_rate?(b_rate)
  b_rate==baud_rate
end
check_device?() click to toggle source

returns true if device exists

# File lib/gpsd_baud_rate.rb, line 75
def self.check_device?
  # Does the @@device exist and is it a character device
  # [[ ]] returns true (0) if 'file' exists
  "0\n" == %x| [ -c "#{@@device}" ] ; echo $?|

end
gpsd_active?() click to toggle source
# File lib/gpsd_baud_rate.rb, line 82
def self.gpsd_active?
  arry = %x|sudo systemctl status "#{@@socket}"|.split(/\n/)
  s = arry.select!{ |e| e.include? "Active:"}[0].split(/\W+/)[2]
  s == 'active'
end
gpsd_start() click to toggle source
# File lib/gpsd_baud_rate.rb, line 95
def self.gpsd_start
  %x|sudo systemctl start "#{@@service}"|
  %x|sudo systemctl start "#{@@socket}"|
  sleep 1
  %x|sudo systemctl daemon-reload|
end
gpsd_stop() click to toggle source
# File lib/gpsd_baud_rate.rb, line 88
def self.gpsd_stop
  %x|sudo systemctl stop "#{@@socket}"|
  %x|sudo systemctl stop "#{@@service}"|
  sleep 1
  %x|sudo systemctl daemon-reload|
end
new(goal_rate = @@baud_rates[0]) click to toggle source
# File lib/gpsd_baud_rate.rb, line 18
  def initialize goal_rate = @@baud_rates[0]

    @logger = new_logger path: "log/GpsdBaudRate.log", progname: "GpsdBaudRate", time_format: "'%Y-%m-%d %T.%N %z %Z'", level: Logger::DEBUG
    @logger.info "GpsdBaudRate Gem - Version: #{@@version}"

    unless self.class.check_device?
      msg = "Device: #{@@device} not found"
      @logger.error msg
      raise StandardError.new msg
    else
      @logger.info "Device: #{@@device} Okay"
    end
#    pid= %x|pgrep -f "ruby /home/deploy/bin/set_baud.rb"|
#    @logger.debug "Pid:  #{pid}, $$: #{$$}, $BASHPID: #{$BASHPID}"

    @goal_rate = goal_rate.to_i
    @logger.debug  "Goal_rate: #{@goal_rate}"
  end

Public Instance Methods

baud_rate=( b_rate) click to toggle source

returns original baud_rate

# File lib/gpsd_baud_rate.rb, line 113
def baud_rate=( b_rate)
  msg= %x| sudo stty #{b_rate} -F "#{@@device}"|
  msg.each {|m| @logger.debug m}
end
set_baud_rate(b_rate = @goal_rate) click to toggle source
# File lib/gpsd_baud_rate.rb, line 37
  def set_baud_rate b_rate = @goal_rate
    @logger.debug "In set_baud_rate"
    GpsdBaudRate::gpsd_start unless GpsdBaudRate::gpsd_active?   #make sure it's running

    @logger.debug "Service Status: #{GpsdBaudRate::gpsd_active?}"
    @logger.debug "Baud Rate: #{active_rate = GpsdBaudRate::baud_rate}"
    GpsdBaudRate::gpsd_stop
    @logger.debug "Service Status: #{GpsdBaudRate::gpsd_active?}"
    @logger.debug "Baud Rate: #{inactive_rate = GpsdBaudRate::baud_rate}"

    if active_rate == b_rate
      @logger.debug "Already at Goal Baud Rate"
    else
      @logger.debug "~~~~~~~~~~~~ Read at #{active_rate} baud ~~~~~~~~~~~~~~"
      unless (read_from_device active_rate)
        @logger.debug "Read at #{active_rate} baud Failed"
      else
        @logger.debug "Setting Goal Rate (#{b_rate})"
        set_PMTK_baud_rate active_rate, b_rate
        @logger.debug "Attempting Read at #{b_rate}"
        if read_from_device b_rate
          @logger.debug "Baud Rate Modification Successful"
          @logger.debug "Goal Baud Rate (#{b_rate}) has been set"
        else
          @logger.debug "Setting Baud Rate Failed"
        end
      end
    end
#
#   Cleanup
    GpsdBaudRate::gpsd_start
    @logger.debug "Service Status: #{GpsdBaudRate::gpsd_active?}"

  end
test_baud_rate(b_rate) click to toggle source

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# File lib/gpsd_baud_rate.rb, line 120
def test_baud_rate b_rate
  read_from_device b_rate
end

Private Instance Methods

find_baud_rate() click to toggle source
# File lib/gpsd_baud_rate.rb, line 196
def find_baud_rate
  @logger.debug %x| sudo stty -F "#{@@device}"|
  GpsdBaudRate::gpsd_stop
  @logger.debug %x|sudo stty -F "#{@@device}"|
  GpsdBaudRate::gpsd_start
end
new_logger( progname: nil, path:, format: nil, time_format: nil, level: LOG_LEVELS[:debug]) click to toggle source
# File lib/gpsd_baud_rate.rb, line 223
def new_logger( progname: nil, path:, format: nil, time_format: nil, level:  LOG_LEVELS[:debug])
  logger = Logger.new(path)
  logger.progname = progname if progname
  logger.format = format if format
  logger.level = level if level
  logger.datetime_format = time_format if time_format
  logger
end
nmea_checksum(cmmd) click to toggle source
# File lib/gpsd_baud_rate.rb, line 210
def nmea_checksum cmmd
  @logger.debug "In nmea_checksum, cmmd: #{cmmd}"
  sum=0
  cmmd.each_byte { |i| sum = sum ^ i.ord}
  sum = sum & 0xff
  new_cmmd = "\$#{cmmd}*#{sum.to_s(16)}".upcase
  @logger.debug "new_cmmd: #{new_cmmd}"
  new_cmmd
end
read_from_device( baud) click to toggle source

Attempts to read from serial port using the baud rate specified Will try to receive five 'lines' of text Expects to receive NMEA sentences Returns true if at least two of the received lines start with the NMEA '$GPxxx' sentence codes in @@NMEA_sentences

# File lib/gpsd_baud_rate.rb, line 130
def read_from_device( baud)
  GpsdBaudRate::gpsd_stop
  begin
    results = []
    count = 0
    ser = SerialPort.open(@@device, baud.to_i, 8, 1, SerialPort::NONE ) { |ser|
      ser.read_timeout = 900
      @logger.debug "ReadTimeout: #{ser.read_timeout} ms"
      5.times { results << ser.readline(100)}
      results.each { |s| @logger.debug s.strip!}
      results.each do |r|
        count += 1 if @@NMEA_sentences.any? { |s| s == r[0,6]}
      end
      @logger.debug "Count: #{count}"
    }
  rescue IOError => e
    @logger.debug "IOError: #{e.inspect}"
  rescue  => e
    @logger.debug "Error: #{e.inspect}"
  end
  @logger.debug "SerialPort Closed"
  GpsdBaudRate::gpsd_start
  count >= 2
end
set_PMTK_baud_rate(active_rate, goal_rate) click to toggle source
# File lib/gpsd_baud_rate.rb, line 203
def set_PMTK_baud_rate active_rate, goal_rate
  @logger.debug "In set_PMTK_baud_rate"
  type = 251
  cmmd = nmea_checksum("PMTK#{type},#{goal_rate}")
  write_to_device cmmd, active_rate
end
write_to_device(cmmd, active_rate) click to toggle source
# File lib/gpsd_baud_rate.rb, line 155
def write_to_device cmmd, active_rate
  count=0
  results=[]
  GpsdBaudRate::gpsd_stop

  begin
    @logger.debug "In write_to_device"
    @logger.debug "cmmd: #{cmmd}, class: #{cmmd.class}"
    @logger.debug "baud: #{active_rate}, class: #{active_rate.class}"
    @logger.debug "Send to device @ #{active_rate}"
    ser = SerialPort.open( @@device, active_rate, 8, 1, SerialPort::NONE) { |ser|
      count = ser.write cmmd+"\r\n"
    }
  rescue IOError => e
    @logger.debug "IOError: #{e.inspect}"
  rescue  => e
    @logger.debug "Error: #{e.inspect}"
  end
  @logger.debug "Bytes Written: #{count}"

  @logger.debug "Sleeping 1/2 second..."
  sleep 0.5

  begin
    @logger.debug "Receive response @ #{@goal_rate}, #{@goal_rate.class}"
    ser = SerialPort.open( @@device, @goal_rate, 8, 1, SerialPort::NONE) { |ser|
      ser.read_timeout = 900
      10.times {results << ser.readline(100)}
    }
  rescue IOError => e
    @logger.debug "IOError: #{e.inspect}"
  rescue  => e
    @logger.debug "Error: #{e.inspect}"
  end
  results.each { |r| @logger.debug "Results: #{r.strip!}"}

  GpsdBaudRate::gpsd_start

end