=begin
 ******************************************************************************
 * Copyright 1990-2007 MBARI
 * MBARI Proprietary Information. All rights reserved.
 ******************************************************************************
 * Summary  : Contain the rover software component objects
 * Filename : rover.rb
 * Author   : Henthorn
 * Project  : Benthic Rover
 * Version  : 2
 * Created  : Nov 08
 * Modified : Updated for lib.2
 ******************************************************************************
=end

# Refer to Rover-code home directory as base
#
require "#{ENV['ROVER_HOME']}/utils/rover_environment"
#

require "singleton"
require "getoptlong"

require "utils/misc"
require "utils/options"
require "device/acm"
require "device/aanderaa"
require "device/relay_board"
require "device/axis"
require "device/prosilica"
require "device/rack"
require "device/ezservo"
require "device/modem"
require "device/hesc"
require "device/battery"

#This class is a singleton, to access it call 'Rover.instance'
class Rover
  include Singleton
  include SyslogWriter
  
  attr_accessor :acm, :relay, :video, :port_rack, :motors, :stbd_ref_optode, \
                :modem, :port_optode, :starboard_optode, :cm, :rt, :battery, \
                :port_ref_optode, :transit_cam, :fluoro_cam, :stbd_rack, :hesc

  #in the future, this should be where a config file is read to initialize
  #all the rover's subsystems.
  def initialize
    # Get command-line options. Must be valid before proceeding.
    #

    if(Options.instance.sim)
      initialize_sim()
    else
      self.relay = RelayMan.new
      self.acm = Acm.new("/dev/acm")
      self.port_optode = Aanderaa.new("/dev/port_optode")
      self.starboard_optode = Aanderaa.new("/dev/starboard_optode")
      self.stbd_ref_optode = Aanderaa.new("/dev/stbd_ref_optode")
      self.port_ref_optode = Aanderaa.new("/dev/port_ref_optode")
      self.motors = Ezservo.rover
      self.port_rack = Rack.rover_port
      self.stbd_rack = Rack.rover_stbd
      self.battery = BatteryMon.new
      # self.transit_cam = Prosilica.new(53010)
      self.transit_cam = Prosilica.new(123528)    # Spare installed 06/19/2015
      self.fluoro_cam = Prosilica.new(36132)
      self.video = Axis.new
      self.hesc = Hesc.new

#      self.rt.warp = Options.instance.warp
      puts("rover: Rover control system instantiated")
    end
  end

  #####
  def new_ez
    if(Options.instance.sim)
      self.motors = SimEzservo.rover
    else
      self.motors.close
      self.motors = nil
      self.motors = Ezservo.rover
    end
  end
  #####


  # Switch the ethernet port on the TS board on or off
  #
  def ethernet(on_off)
    # on_off parameter evaluates to true or false
    #
    if (on_off)
      syslog("_ ethernet on")
      `/cf/rover/ext/cctl -w ether=on`
    else
      syslog("_ ethernet off")
      `/cf/rover/ext/cctl -w ether=off`
    end
  end

  def sleep_cpu(time_in_seconds)
    sleepcmd = "/cf/rover/lib/bat3 --sleep #{time_in_seconds}"
    syslog("_ " + sleepcmd)
    sleep(1)
    system(sleepcmd)
  end
    
  def initialize_sim
    self.relay = SimRelayMan.new
    self.acm = SimAcm.new("/dev/acm")
    self.port_optode = SimAanderaa.new("/dev/port_optode")
    self.starboard_optode = SimAanderaa.new("/dev/starboard_optode")
    self.stbd_ref_optode = SimAanderaa.new("/dev/stbd_ref_optode")
    self.port_ref_optode = SimAanderaa.new("/dev/port_ref_optode")
    self.motors = SimEzservo.rover
    self.port_rack = SimRack.rover_port
    self.stbd_rack = SimRack.rover_stbd
#    self.modem = SimModem.new
    self.video = SimAxis.new
    self.hesc = SimHesc.new
    self.transit_cam = SimProsilica.new(53010)
    self.fluoro_cam = SimProsilica.new(36132)
    self.battery = SimBatteryMon.new
#    self.rt.warp = true
  end
end
