require "rover"
require "rover_thread"

class Measure < Monitor
  include LogHelper
  
  attr_reader :thr
  attr_accessor :relay, :video, :rack, :chop
    
  def initialize
    @relay = Rover.instance.relay
    @video = Rover.instance.video
    @rack  = Rover.instance.rack
    @chop  = Rover.instance.chamber_optode
    @thr   = 0
    @pct   = 0
  end

  def acquireOptodeData
    self.relay.optodeOn
    syslog("_ starting oxygen measurement")
    self.chop.run
    syslog("_ gather data for 30 seconds")
    sleep(30)
    self.chop.close
    self.relay.optodeOff
    syslog("_ oxygen measurement complete")
  end
  
  def imageCapture camera, name = "test"
      # Turn on video server and capture an image of the measurement site
      #
      syslog("_ Measure turning on video, waiting 30 sec")
      self.relay.videoOn
      sleep(30)               # Wait for server to boot
      
      syslog("_ Measure capturing image")
      unless (@video.captureImage(camera, name))
        syslog ("! Unable to capture image of sediment")
      end
      
      syslog("_ Measure turning off video")
      self.relay.videoOff
  end
  
  def run
    @thr = Thread.new do
    
      self.percentComplete=0
      self.imageCapture(Video::CHAMBER_1, "before")
      self.percentComplete=10
    
      # Lower the chambers into the sediment
      #
      syslog("_ Initialize rack")
      self.rack.close
      self.relay.rackOff
      sleep(1)
      self.relay.rackOn
      sleep(2)
      Rover.instance.rack = Rack.rover
      self.rack = Rover.instance.rack
      self.percentComplete=20
      
      syslog("_ Inserting chamber 1")
      unless (rack.insert_chamber)
        syslog ("! Unable to insert chambers in sediment")
      end
      self.percentComplete=50
    
      # Take another image of the measurement site
      #
      self.imageCapture(Video::CHAMBER_1, "after")
      self.percentComplete=60
      
      # Measure the oxygen in the chamber
      #
      acquireOptodeData
      Rover.instance.chamber_optode = Aanderaa.new nil, "/dev/chamber_optode"
      self.percentComplete=70
      
      
      # Raise the chamber back to home position
      #
      unless (@rack.home)
        syslog ("! Unable to home chambers")
      end
      # self.rack.close
      self.relay.rackOff
      self.percentComplete=100
      
    end      # thread
    
  end        # run
  
  def percentComplete
  #  self.synchronize do
      return @pct
   # end
  end

private 
  
  def percentComplete= p
#    self.synchronize do
      op = @pct
      @pct = p
      return op
 #   end
  end
  
end        # class Measure
  
