#!/usr/local/bin/ruby
#
=begin
 ******************************************************************************
 * Copyright 1990-2009 MBARI
 * MBARI Proprietary Information. All rights reserved.
 ******************************************************************************
 * Summary  : Front panel app used to provide simple access to device functions
 *            without having to run a mission script.
 * Filename : front_panel.rb
 * Author   : Henthorn
 * Project  : Benthic Rover
 * Version  : 1
 * Created  : June-09 Basic functionality (relay control)
 * Modified : 
 ******************************************************************************
=end

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


require 'device/relay_board.rb'

class RelayPanel

  ALL_OFF = 15
  Relay = Struct.new(:name, :rb, :relay_num, :on, :off)

  attr_reader :rm
  
  def initialize
    @rm = RelayMan.new

    @relays = Array.new
    @relays << Relay.new("MAIN MOTORS  ", @rm.rb1, 1, :motorsOn,  :motorsOff)
    @relays << Relay.new("STIR MOTORS  ", @rm.rb1, 8, :stirOn,    :stirOff)
    @relays << Relay.new("AXIS SERVER  ", @rm.rb2, 8, :videoOn,   :videoOff)
    @relays << Relay.new("  AXIS CAMS  ", @rm.rb2, 2, :camerasOn, :camerasOff)
    @relays << Relay.new("  TRANS CAM  ", @rm.rb2, 3, :transitOn, :transitOff)
    @relays << Relay.new(" FLUORO CAM  ", @rm.rb2, 5, :fluoroOn,  :fluoroOff)
    @relays << Relay.new("CHBR OPTODES ", @rm.rb1, 6, :optodesOn, :optodesOff)
    @relays << Relay.new("STBD REF OP  ", @rm.rb2, 7, :s_refoptOn,:s_refoptOff)
    @relays << Relay.new("PORT REF OP  ", @rm.rb2, 6, :p_refoptOn,:p_refoptOff)
    @relays << Relay.new("        ACM  ", @rm.rb1, 3, :acmOn,     :acmOff)
    @relays << Relay.new(" STBD VALVE  ", @rm.rb1, 5, :s_valveOn, :s_valveOff)
    @relays << Relay.new(" PORT VALVE  ", @rm.rb2, 4, :p_valveOn, :p_valveOff)
    @relays << Relay.new("  STBD RACK  ", @rm.rb1, 7, :s_rackOn,  :s_rackOff)
    @relays << Relay.new("  PORT RACK  ", @rm.rb2, 1, :p_rackOn,  :p_rackOff)
  end

  def relay_indicator(state)
    return "+" if (state == "1")
    " "
  end

  def display_relays
    puts("\n")
    puts( "=== Switch Board ===")

    i = 1
    @relays.each do |r|
      si = sprintf("%2s",i)
      print("#{si}. #{r.name} ")
      puts(relay_indicator(r.rb.get_status(r.relay_num)))
      i += 1
    end
    puts("#{ALL_OFF}.     All Off")
  end

  def get_command
    valid = false
    while (!valid) do
      print("\nEnter number('q' to quit) > ")
      @num = gets("\n")
      return false if (@num =~ /q/)

      valid = true if (@num.to_i >= 1 && @num.to_i <= ALL_OFF)
    end

    return true if (@num.to_i == ALL_OFF)

    valid = false
    while (!valid)
      print("\n0->Off or 1->On('q' to quit) > ")
      @val = gets("\n")
      return false if (@val =~ /q/)

      valid = true if (@val.to_i >= 0 && @val.to_i <= 1)
    end

    return true
  end

  def do_command
    num = (@num.to_i) - 1
    val = @val.to_i
    if (@num.to_i == ALL_OFF)
      @rm.allOff
      return
    end
    @rm.send(@relays[num].on)  if (val == 1)
    @rm.send(@relays[num].off) if (val == 0)
  end
end

cp = RelayPanel.new
while (true) do
  cp.display_relays
  if (!cp.get_command)
    cp.rm.allOff
    exit
  end
  cp.do_command
end
