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