#--
#******************************************************************************
#* 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  :
#* Created  :
#* Modified :
#******************************************************************************

require "getoptlong"
require "rover_utils"
require "rover_environment"
require "acm"
require "aanderaa"
require "relay_board"
require "video"
require "prosilica"
require "rack"
require "ezservo"
require "modem"
require "configman"
require "battery"
require "singleton"
require "clo"

#This class is a singleton, to access it call 'Rover.instance'
class Rover
  include Singleton
  include LogHelper
  
  # A constant that other classes can use to see if system is in test mode
  TEST = false

  attr_accessor :acm, :relay, :video, :rack, :motors, :ref_optode, \
                :modem, :port_optode, :starboard_optode, :cm, :rt, \
                :battery, :transit_cam

  #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.
    #

    self.cm = ConfigMan.instance
    self.rt = RoverTime.instance

    if(Clo.instance.sim)
      initialize_sim()
    else
      self.relay = RelayMan.new          # Using RelayMan relay manager
      self.acm = Acm.new nil, "/dev/acm"
      self.port_optode = Aanderaa.new nil, "/dev/port_optode"
      self.starboard_optode = Aanderaa.new nil, "/dev/starboard_optode"
      self.ref_optode = Aanderaa.new nil, "/dev/ref_optode"
      self.motors = Ezservo.rover
      self.rack = Rack.rover
      self.modem = BenthosModem.rover
      self.battery = BattMan.new
      self.transit_cam = Prosilica.new

      #LogHelper.latest="/cf/rover/logs/testlogs"
      #self.acm = Tcm2Compass.new nil

      if (ip = cm.get("VideoIPAddr"))
        self.video = Video.new(ip)
      else
        self.video = Video.new
      end

      self.rt.warp = Clo.instance.warp
      puts("rover: Rover control system instantiated")
    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 nil, "/dev/acm"
    self.port_optode = SimAanderaa.new nil, "/dev/port_optode"
    self.starboard_optode = SimAanderaa.new nil, "/dev/starboard_optode"
    self.ref_optode = SimAanderaa.new nil, "/dev/ref_optode"
    self.motors = SimEzservo.rover
    self.rack = SimRack.rover
    self.modem = SimModem.rover
    self.video = SimVideo.new
    self.transit_cam = SimProsilica.new
    self.battery = SimBattMan.new
    self.rt.warp = true
  end
end
