#!/usr/bin/env ruby ################### logxp2i -- brent@mbari.org ####################### # Copyright (C) 2006 MBARI # MBARI Proprietary Information. All rights reserved. # # Log pressure data from a Crystal Engineering Corp. XP2i # connected on specified serial port # ######################################################################## require 'getoptlong' opts = GetoptLong.new( ["--reset", "-r", GetoptLong::NO_ARGUMENT], ["--help", "-h", GetoptLong::NO_ARGUMENT] ) progName = File.basename $0 def putHelp $stderr.puts "\ Log serial data from Crystal XP2i pressure sensor -- 12/11/06 brent@mbari.org Options: --help #displays this text --reset #reset the gauge before monitoring pressure #(this takes about 30 seconds) First argument is the name of the serial port to which the pressure sensor is connected. Defaults to /dev/xp2i The logged pressure data (ASCII) is written to stdout. " exit end reset=false opts.each do |opt, arg| case opt when "--reset" reset=true else putHelp end end putHelp if ARGV.size > 1 deviceFn = ARGV.size == 0 ? '/dev/xp2i' : ARGV.first require 'fcntl' require 'termios' include ::Termios def cmd(string, device=$device) sleep .05 # puts(string) device.print(string, "\r") device.flush end def rsp(terminator=nil, device=$device) response = terminator ? device.gets(terminator) : device.gets response.chop! # puts(response.dump) response end def query(string, terminator=nil, device=$device) cmd(string) rsp(terminator, device) end def purgeInput delay=0.5, device=$device purger = Thread.new {nil while(device.getc)} #throw away any spurious input $stdout.flush sleep delay purger.kill end OK='A,0' open(deviceFn, File::RDWR | File::NONBLOCK) do |device| begin device.ioctl(0x540c,0) #TIOCEXCL -- prevent others from opening this device device.sync=false tio = new_termios() tio.iflag = IGNPAR tio.cflag = CLOCAL | CS8 | CREAD tio.oflag = tio.lflag = 0 tio.ispeed = tio.ospeed = B9600 tio.cc[VTIME] = 0 tio.cc[VMIN] = 1 device.tcsetattr(TCSANOW, tio) device.fcntl(Fcntl::F_SETFL, device.fcntl(Fcntl::F_GETFL,0) & ~File::NONBLOCK) $device=device puts "#{Time.now} --#{' Reset' if reset} "\ "XP2i pressure sensor on #{device.path}" purgeInput if reset print "Rcv'd boot signature: ", query("!RST","\r"), "\n" purgeInput 15 end cmd "!NAO" #be sure to cancel auto-off raise "Invalid Response to Auto-Off disable" unless rsp.strip == 'NO' and rsp.strip == 'AUTO' and rsp.strip == 'OFF' and rsp == OK product=query("?SN#").strip #query product code & serial number sn=rsp.strip ver=query "?VER" puts "Product code #{product}, Serial ##{sn}, Version #{ver}" begin raise "Invalid Response to Stream Start" if query("!SP1") != OK minute = Time.now loop { begin puts rsp $stdout.flush end while ((now=Time.now) - minute < 60) puts minute=now } ensure cmd("!SP0") puts "Stopped streaming." end ensure device.ioctl(0x540D,0) #release device end end