/****************************************************************************/
/* Summary  :                                                               */
/* Filename : LeicaCompassIF.idl                                            */
/* Author   : Aaron Marsh                                                   */
/* Project  :                                                               */
/* Version  : $Revision: 1.4 $                                    */
/* Created  : 04/07/00                                                      */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/

/*
CLASS 
LeicaCompassIF

DESCRIPTION
Task interface to Leica Digital Magnetic Compass

AUTHOR
Marsh
*/

#include "TimeIF.idl"
#include "DeviceIF.idl"
#include "CompassIF.idl"

interface LeicaCompassIF : CompassIF {

     enum Mode {
	  UnknownMode = 0,
	  ContAngle = 1,
	  ContMag = 2,
	  SingleAngle = 3,
	  SingleMag = 4,
	  Raw = 5,
	  Calibration = 6,
	  ContAngleAccel = 10,
	  ContMagAccel = 11,
	  SingleAngleAccel = 12,
	  SingleMagAccel = 13
     };

     enum CalibMode {
	  UnknownCalibMode = 0,
	  HardWeighted,
	  HardNonWeighted,
	  HardSoftWeighted,
	  HardSoftNonWeighted
     };

     enum Encoding {
	  UnknownEncoding = 0,
	  DecimalEncoding,
	  HexEncoding
     };

     struct LeicaAttitude {
	  double azimuth;
	  double elevation;
	  double roll;
	  boolean valid;
     };

     struct LeicaAccel {
	  double accelX;
	  double accelY;
	  double accelZ;
	  boolean valid;
     };

     struct LeicaMag {
	  double magX;
	  double magY;
	  double magZ;
	  boolean valid;
     };

     struct LeicaData {
	  TimeIF::TimeSpec sampleTime;
	  LeicaAttitude attitude;
	  LeicaAccel accel;
	  LeicaMag mag;
     };

     ///////////////////////////////////////////////////////
     // Set the encoding
     DeviceIF::Status setEncoding( in Encoding encoding );

     ///////////////////////////////////////////////////////
     // Set the mode
     DeviceIF::Status setMode( in Mode mode );

     ///////////////////////////////////////////////////////
     // Save the current configuration
     DeviceIF::Status saveConfig();

     ///////////////////////////////////////////////////////
     // Set the measurement range
     DeviceIF::Status setMeasureRange( in long range );

     ///////////////////////////////////////////////////////
     // Set integration time
     DeviceIF::Status setIntegration( in float intTime );
     
     ///////////////////////////////////////////////////////
     // Read device status
     DeviceIF::Status requestStatus();

     ///////////////////////////////////////////////////////
     // Retrieve the attitude
     DeviceIF::Status getAttitude( out LeicaAttitude attitude );
     DeviceIF::Status getAttitude( out LeicaAttitude attitude,
				   out TimeIF::TimeSpec sampleTime );

     ///////////////////////////////////////////////////////
     // Retrieve the mag
     DeviceIF::Status getMag( out LeicaMag mag );

     ///////////////////////////////////////////////////////
     // Retrieve the accelerometers
     DeviceIF::Status getAccel( out LeicaAccel accel );

     ///////////////////////////////////////////////////////
     // Get all the data
     DeviceIF::Status getData( out LeicaData data );

     ///////////////////////////////////////////////////////
     // Set the compass to calibration mode
     DeviceIF::Status setCalibrationMode( in CalibMode cMode );

     ///////////////////////////////////////////////////////
     // Take a compass calibration
     DeviceIF::Status takeCalibration( );

     ///////////////////////////////////////////////////////
     // Query number of calibration remaining
     DeviceIF::Status calibrationsRemaining( out long count );

     ///////////////////////////////////////////////////////
     // Return latest calibration accuracy
     DeviceIF::Status calibrationAccuracy( out float accuracy );

     ///////////////////////////////////////////////////////
     // Reset widget
     DeviceIF::Status reset();

};
