#!/usr/local/bin/ruby
#

require 'relay_board.rb'

class RelayPanel

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

  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, :s_stirOn, :s_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("  FLORO CAM  ", @rm.rb2, 5, :p_stirOn, :p_stirOff)
    @relays << Relay.new("    OPTODES  ", @rm.rb1, 6, :optodesOn, :optodesOff)
    @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 CLEAN  ", @rm.rb2, 7, :s_cleanOn, :s_cleanOff)
    @relays << Relay.new(" PORT CLEAN  ", @rm.rb2, 6, :p_cleanOn, :p_cleanOff)
    @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("15.     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 <= 15)
    end

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

    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 == 15)
      @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)
    exit
  end
  cp.do_command
end
