/****************************************************************************/
/* Copyright (c) 2000 Bluefin Robotics Co.                                  */
/* Bluefin Robotics Co. Proprietary Information. All rights reserved.       */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : RdiRangeFinder.idl                                            */
/* Author   : Donald Green                                                  */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 04/12/2000                                                    */
/* Modified : 2001.12.13 reed@bluefinrobotics.com                           */
/* Modified : 2002.01.30 reed@bluefinrobotics.com                           */
/* Archived :                                                               */
/**************************************************************************************/
/* Modification History: 2001.10.19, Reed Christenson, reed@bluefinrobotics.com       */
/*                                   Added water velocities, noted coordinate system. */
/*                       2001.12.13, reed, updated coordinate system                  */
/*                       2002.01.30  reed@bluefinrobotics.com                         */ 
/*		                     Updated to new AUV coordinate naming convention. */
/**************************************************************************************/


#include "TimeIF.idl"
#include "InstrumentIF.idl"

/**
@name RdiadcpIF

@memo RdiadcpIF interface to RD Instrument's data.
@doc  RdiadcpIF interface to RD Instrument's data.

@author AUTHOR: Donald Green

@author UPDATE: Reed Christenson reed@bluefinrobotics.com

@doc  Coordinate System Information
@doc  --- coordinate system
@doc  bdy = body coordinates
@doc  lvl = level coordinates
@doc  geo = geographic coordinates
@doc  --- data source
@doc  bot = bottom
@doc  wat = water
@doc  cur = current
@doc  bem = beam
@doc  --- data type
@doc  vel = velocity
@doc  rng = range
@doc  --- velocity components
@doc  stb = starboard direction
@doc  fwd = forward direction
@doc  dwn = down direction
@doc  err = error
*/
interface RdiadcpIF : InstrumentIF {

    //    // Coordinate System
    //    // BEAM, BODY, LEVEL, GEOGRAPHIC
    //    enum coordinateSystem{
    //	        BEM = 0,
    //	        BDY = 1,
    //	        LVL = 2,
    //          GEO = 3
    //    };

    /// Velocity Component: STarBoard, ForWarD, DoWN, ERRor.
    enum velocityComponent{
	STB = 0,
	FWD = 1,
	DWN = 2,
	ERR = 3
    };

    /// Tracking Quality: NONE, WATER, BOTTOM.
    enum trackingType{
	NONE = 0,
	WATER = 1,
	BOTTOM = 2
    };


    ////////////////////////////////////////////////////////
    /// Get Tracking Quality. Returns trackingType.
    Status trackingQuality(out short quality,
			   out TimeIF::TimeSpec sampleTime);

    ////////////////////////////////////////////////////////
    /// Get Body Bottom Velocity Data in meters/second. (Body Coordinates)
    Status bdyBotVel(out double fwdBdyBotVel,
		     out double stbBdyBotVel,
		     out double dwnBdyBotVel,
		     out double errBdyBotVel,
		     out TimeIF::TimeSpec sampleTime);
    /// Get Level Bottom Velocity Data in meters/second. (Level Coordinates)
    Status lvlBotVel(out double fwdLvlBotVel,
		     out double stbLvlBotVel,
		     out double dwnLvlBotVel,
		     out double errLvlBotVel,
		     out TimeIF::TimeSpec sampleTime);

    ////////////////////////////////////////////////////////
    /// Get Bottom Range Data in meters. (Body Coordinates)
    Status bdyBotBemRng(out double bdyBotBemRng1,
			out double bdyBotBemRng2,
			out double bdyBotBemRng3,
			out double bydBotBemRng4,
			out TimeIF::TimeSpec sampleTime);
    // (Level Coordinates)
    // Will go here if useful.

    ////////////////////////////////////////////////////////////////
    /** Get range to (altitude from) bottom in meters. (Body Coordinates) */
    Status bdyBotRng(out double range,
		     out TimeIF::TimeSpec sampleTime); // Why was this sampleTime?
    // (Level Coordinates)
    // Does this really exist?  Will it ever be used?
    //Status lvlBotRng(out double range,
    //                 out TimeIF::TimeSpec sampleTime);

    //////////////////////////////////////////////////////////////////
    /// Get the maximum bottom tracking range in meters.
    Status maxBottomTrackingRange(out double maxBotTrackingRangeM);

    ////////////////////////////////////////////////////////
    /// Get Body Reference Layer Water Velocities in meters per second. (Body Coordinates)
    Status bdyWatVel(out double fwdBdyWatVel,
		     out double stbBdyWatVel,
		     out double dwnBdyWatVel,
		     out double errBdyWatVel,
		     out TimeIF::TimeSpec sampleTime);
    /// Get Level Reference Layer Water Velocities in meters per second. (Level Coordinates)
    Status lvlWatVel(out double fwdLvlWatVel,
		     out double stbLvlWatVel,
		     out double dwnLvlWatVel,
		     out double errLvlWatVel,
		     out TimeIF::TimeSpec sampleTime);

    ////////////////////////////////////////////////////////
    // Get Water Currents
    //    // (Body Coordinates)
    //    Status bdyCurVel(out double fwdBdyCurVel,
    //		     out double stbBdyCurVel,
    //		     out double dwnBdyCurVel, 
    //		     out double errBdyCurVel,
    //		     out TimeIF::TimeSpec sampleTime);
    /// Get Level Water Current Velocities. (Level Coordinates)
    Status lvlCurVel(out double fwdLvlCurVel,
		     out double stbLvlCurVel,
		     out double dwnLvlCurVel, 
		     out double errLvlCurVel,
		     out TimeIF::TimeSpec sampleTime);

    /////////////////////////////////////////////////////////
    // Mounting angle (radians) in the X-Z plane.
    // The mounting angle is defined to be zero when the 
    // line-of-sight (LOS) is parallel with the vehicle +z axis, and 
    // increases as the line-of-sight moves towards the +x axis.  
    /// Mounting angle (radians) in the X-Z plane.
    Status xzAngle(out double radians);

    /////////////////////////////////////////////////
    /// Get heading angle in radians.
    Status heading(out double headingR,
		   out TimeIF::TimeSpec sampleTime);

    /////////////////////////////////////////////////
    /// Get pitch angle in radians.
    Status pitch(out double pitchR,
		 out TimeIF::TimeSpec sampleTime);

    /////////////////////////////////////////////////
    /// Get roll angle in radians.
    Status roll(out double rollR,
		out TimeIF::TimeSpec sampleTime);

    /////////////////////////////////////////////////
    /// Get temperature in degrees C.
    Status temperature(out double temperatureC,
		       out TimeIF::TimeSpec sampleTime);

    ///////////////////////////////////////////////////////
    /// Put dvl/adcp in slave mode.
    Status setSlaveModeOn();

    ///////////////////////////////////////////////////////
    /// Put dvl/adcp in slave mode.
    Status getDriverPID(out long driver_pid);

    ////////////////////////////////////////////////////////
    /// Take dvl/adcp out of slave mode.
    Status setSlaveModeOff();

    ////////////////////////////////////////////////////////
    // gracefully shut down the dvl/adcp services.
    // putting dvl/adcp in powersaving sleep mode in the process.
    /// Gracefully shut down the dvl/adcp services.
    void killRdiAdcp();
};
