require "rover_utils"
require "rover_environment"
require "acm"
#require "mock_acm"
require "aanderaa"
#require "mock_aanderaa"
require "relay_board"
#require "mock_relay_board"
require "video"
#require "mock_video"
require "rack"
#require "mock_rack"
require "ezservo"
#require "mock_ezservo"
require "modem"
#require "mock_modem"
require "singleton"

$CLEAN_FIRST = nil
$LAUNCH_TIME_1_MIN = nil
$SAFE_MOVE = nil

#This class is a singleton, to access it call 'Rover.instance'
class Rover
  include Singleton
  
  #a global variable that other classes can use to test if system is in test mode
  TEST = false
  #when this is set to true all the classes that interact with hardware will
  #be replaced with mock classes. This variable most be set before instantiating
  #the class (i.e. before Rover.instance is ever called
  USE_MOCKS = false
  
  attr_accessor :acm, :relay, :video, :rack, :motors, \
                :ref_optode, :modem, :port_optode, :starboard_optode

  #in the future, this should be where a config file is read to initialize
  #all the rover's subsystems.
  def initialize
    if(USE_MOCKS)
#      initialize_mocks()
    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.video = Video.new
      self.motors = Ezservo.rover
      self.rack = Rack.rover
      self.modem = BenthosModem.rover
      #LogHelper.latest="/cf/rover/logs/testlogs"
      #self.acm = Tcm2Compass.new nil
    end
  end

  def initialize_mocks  
    self.relay = MockRelayBoard.new nil, "/dev/relay"
    self.acm = MockAcm.new nil, "/dev/acm"
    self.port_optode = MockAanderaa.new nil, "/dev/port_optode"
    self.starboard_optode = MockAanderaa.new nil, "/dev/starboard_optode"
    self.ref_optode = MockAanderaa.new nil, "/dev/ref_optode"
    self.video = MockVideo.new
    self.motors = MockEzservo.rover
    self.rack = MockRack.rover
  end
end
