//=========================================================================
// Summary  : 
// Filename : PowerSystemIF.idl
// Author   : Marsh
// Project  : 
// Version  : $Revision: #2 $
// Created  : 04/12/00
// Modified : 
// Archived : 
//=========================================================================
// Modification History:
//=========================================================================

/*
CLASS 
DwpPowerIF

DESCRIPTION
Generic power system interface.  In fact, this IF is not
as generic as it should be.  It was based exclusively on the
interface to the power board built for the early Deep-Water
Prototype vehicle (spring/summer 2001).  Abstractions should
improve later.

AUTHOR
Marsh

*/

#include "InstrumentIF.idl"
#include "DeviceIF.idl"


interface PowerSystemIF : InstrumentIF {

     typedef sequence<char,64> Name;
    
    enum Event {
      NewVersion,
      NewCircuitStatusData,
      NewFullStatusData,
      NewCircuitCurrentData,
      NewFullCurrentData,
      NewCircuitVoltageData,
      NewFullVoltageData,
      NewTemperatureData,
      NewGroundFaultData,
      NewError,
      NewGroundFaultError,
      NewTemperatureError,
      NewWaterLeakError,
      NewHighTemperatureError,
      NewPICWatchdogError,
      LostCommunications
    };
    
     struct CircuitInfo {
	  short number;
	  Name name;
	  Name devices;
	  Name comment;

	  boolean hasSwitch;

	  boolean hasCurrentSensor;
	  short rawCurrent;
	  float current;

	  boolean hasVoltageSensor;
	  short rawVoltage;
	  float voltage;

	  boolean status; 
	  boolean doAllOn;
	  boolean doAllOff;
     };

     struct TempInfo {
	  short number;
	  Name name;
	  short rawTemp;
	  float temp;
     };

     struct GroundFaultInfo {
       short number;
       Name name;
       short rawCurrent;
       float current;
       short rawResistance;
       float resistance;
     };

	DeviceIF::Status getStatus();

     DeviceIF::Status findCircuitByDevice( in Name device, out short circuit );

     ////////////////////////////////////////////////////////////
     DeviceIF::Status requestVersion();
     
     ////////////////////////////////////////////////////////////
     DeviceIF::Status getCircuitCount( out short circuitCount );

     ////////////////////////////////////////////////////////////
     DeviceIF::Status getCircuitInfo( in short circuit, 
				      out CircuitInfo circuitInfo );

     ////////////////////////////////////////////////////////////
     // Read the current from a DC-DC converter
     DeviceIF::Status current( in short circuit, out float current );
     boolean circuitHasCurrent( in short circuit );

     ////////////////////////////////////////////////////////////
     // Read the voltage from the circuit
     DeviceIF::Status voltage( in short circuit, out float voltage );
     boolean circuitHasVoltage( in short circuit );

     ////////////////////////////////////////////////////////////
     // Turns nets off
     DeviceIF::Status netOff( in short circuit );
     DeviceIF::Status netOffByDevice( in Name device );

     ////////////////////////////////////////////////////////////
     // Turns nets on
     DeviceIF::Status netOn( in short circuit );
     DeviceIF::Status netOnByDevice( in Name device );

     DeviceIF::Status allOn( );
     DeviceIF::Status allOff( );

     boolean circuitHasSwitch( in short circuit );

     ////////////////////////////////////////////////////////////
     // Status
     DeviceIF::Status getStatus( in short circuit );
     DeviceIF::Status getAllStatus( );
     DeviceIF::Status status( in short circuit, out boolean enabled );

     ////////////////////////////////////////////////////////////
     // Browse the temperature table
     DeviceIF::Status getTempCount( out short tempCount );
     DeviceIF::Status getTempInfo( in short temp, out TempInfo tempInfo );

     ////////////////////////////////////////////////////////////
     // Take a temperature reading
     DeviceIF::Status temperature( in short temp, out float temperature );

     ////////////////////////////////////////////////////////////
     // Browse the ground fault table
     DeviceIF::Status getGroundFaultCount( out short faultCount );
     DeviceIF::Status getGroundFaultInfo( in short circuit, 
					  out GroundFaultInfo gfInfo );

     ////////////////////////////////////////////////////////////
     // Take a ground fault measurement
     DeviceIF::Status groundFault( in short circuit, out float current );

    ////////////////////////////////////////////////////////////
    // Enable main watchdog functions
    DeviceIF::Status enableSystemWatchdog();
    
    ////////////////////////////////////////////////////////////
    // Disable main watchdog functions
    DeviceIF::Status disableSystemWatchdog();
    
    ////////////////////////////////////////////////////////////
    // Enable tailcone watchdog
    DeviceIF::Status enableTailconeWatchdog();
    
    ////////////////////////////////////////////////////////////
    // Disable tailcone watchdog
    DeviceIF::Status disableTailconeWatchdog();
    
    ////////////////////////////////////////////////////////////
    // 'touch' the tailcone watchdog
    DeviceIF::Status touchTailconeWatchdog();
    
};
