require 'rover_environment'
require 'rover_utils'
require 'posix/serialport'

################################################################
# MBARI Rover
#
# Driver for Aanderaa Optode
#
# Change history:
#    Date       Who    What
#    ---------  ---    -------------------------------------
#    19-Dec-06  RGH    V1.0 - basic functions incl logging
#
################################################################
class Aanderaa 
  include LogHelper

  # Default configuration
  # /dev/acm 9600,8,N,1
  #
  def initialize config, portname = '/dev/chamber_optode'
    unless config
      config = SerialPort::Configuration.default
      config.baud = 9600
    end
    @dev = Posix::SerialPort.new portname, config
    
    @RAWDATA_ELEMENTS = 9
    
    datalog "#Aanderaa Optode data log"
    datalog "#Optode on port #{portname}"
    datalog "#Oxygen,Saturation,Temp" 
    datalog "#"
    
    @oxy  = -1
    @sat  = 0
    @temp = 0
    @thread = nil
    
  end

  def close
    if self.is_running?
      @thread.kill
      @thread = nil
    end
    @dev.close
  end
  
  def init
    @dev.purge
    puts("Turn off write protect")
    @dev.write("Set_Protect(1)\n")
    puts("Read the response")
    response = @dev.gets
    puts("Response from Set_Protection: #{response}")
    
    puts("Less verbose output")
    @dev.write("Set_Output(0)\n")
    puts("Read the response")
    response = @dev.gets
    puts("Response from Set_Output: #{response}")
    
    puts("Turn on write protect")
    @dev.write("Set_Protect(0)\n")
    puts("Read the response")
    response = @dev.gets
    puts("Response from Set_Protection: #{response}")
  end
  
  def acquire_data
    syslog("_ Obtaining optode data")
    # Aanderaa simply returns data string
    #
    @dev.purge
    @rawdata = @dev.gets
    
    # Process data
    #
    @data = @rawdata.split
    
    # There should be 9 components in the data string
    #
    
    if @data.length == @RAWDATA_ELEMENTS
      @oxy  = @data[4].to_f
      @sat  = @data[6].to_f
      @temp = @data[8].to_f
    else
      puts "Error parsing rawdata, @data array length is: " +
             "#{@data.length} and should be #{@RAWDATA_ELEMENTS}"
      elements_string = "["
      @data.each {|el| elements_string += el + ", "}
      elements_string += "]"
      puts "elements in @data array: #{elements_string}"
      return false
    end
        
    return true
  end

  # Write data to log file
  #
  def log_data
    datalog "#{@oxy},#{@sat},#{@temp}"
  end

  # Run in thread
  #
  def run
    syslog("_ Running optode thread")
    @thread = Thread.new do
      while true
        log_data if acquire_data
      end
    end
  end
  
  def is_running?
    if @thread
      return @thread.alive?
    else
      return false
    end
  end
  
end

