/*
********************************************************
Copyright 2000 MBARI.
MBARI Proprietary Information. All rights reserved.
NOTE: This file is automatically generated.
DO NOT MODIFY.
********************************************************
*/

#ifndef __NavigationIF_H
#define __NavigationIF_H

#include "TaskInterface.h"


#define NavigationIFServerName "NavigationIFServer"

/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : NavigationIF.idl                                              */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
/*
CLASS 
NavigationIF

DESCRIPTION
TaskInterface to Navigation

AUTHOR
Tom O'Reilly

*/
class NavigationIF : public TaskInterface {

  friend class NavigationIF_SK;

  public:

  // Forward declarations of public structures
  struct Attitude;
  struct Position;
  struct LogData;
  
  ////////////////////////////////////////////////////////////
  // Defined events
  enum Event {
    NewOutput,
    NoAttitude,
    NoPosition
  };

  ////////////////////////////////////////////////////////////
  // Calculation mode
  enum Mode {
    DeadReckoning,
    Measured
  };

  
  
  ////////////////////////////////////////////////////////////
  // Vehicle attitude and rates
  struct Attitude {
    double roll;
    double pitch;
    double yaw;
    double omega_B_x;
    double omega_B_y;
    double omega_B_z;
    long updateTime;
    short quality;
  };
  ////////////////////////////////////////////////////////////
  // Vehicle position and rates
  struct Position {
    double x;
    double y;
    double z;
    double altitude;
    double xRate;
    double yRate;
    double zRate;
    double depthRate;
    double altitudeRate;
    long updateTime;
    short quality;
  };
  ////////////////////////////////////////////////////////////
  // Data to be logged
  struct LogData {
    double x;
    double y;
    double z;
  };
  NavigationIF(const char *name, int timeout = 10);

  NavigationIF(const char *name, const char *serverName, int timeout = 10);

  ~NavigationIF();

  ////////////////////////////////////////////////////////////
  // Get data to be logged
  void getLogData(NavigationIF::LogData *data);

  ////////////////////////////////////////////////////////////
  // Current navigation State
  // [output] position: Vehicle Position
  // [output] attitude: Vehicle Attitude
  void state(NavigationIF::Position *position, NavigationIF::Attitude *attitude);

  ////////////////////////////////////////////////////////////
  // Vehicle heading
  // [output] heading: Heading (degrees)
  void heading(double *heading);

  ////////////////////////////////////////////////////////////
  // Vehicle location
  // [ouput] latitude: Latitude (degrees)
  // [output] longitude: Longitude (degrees)
  // [output] depth: Depth (meters)
  // [output] altitude: Altitude (meters)
  void location(double *latitude, double *longitude, double *depth, double *altitude);

  ////////////////////////////////////////////////////////////
  // Vehicle speed 
  float speed();

  ////////////////////////////////////////////////////////////
  // Vehicle course
  double course();

  ////////////////////////////////////////////////////////////
  // Vehicle depth
  double depth();

  ////////////////////////////////////////////////////////////
  // Vehicle altitude
  double altitude();

  ////////////////////////////////////////////////////////////
  // Vehicle pitch
  double pitch();

  ////////////////////////////////////////////////////////////
  // Set magnetic variation
  // [input] angle: variation (degrees)
  void setMagneticVariation(double angle);

  ////////////////////////////////////////////////////////////
  // Magnetic variation angle (degrees)
  double magneticVariation();

  ///////////////////////////////////////////////////////////////////
  // Get calculation mode
  void mode(NavigationIF::Mode *mode);

  
  protected:

  // Message codes for each method
  enum NavigationIFMsgCode {
    GetLogDataMsgCode,
    StateMsgCode,
    HeadingMsgCode,
    LocationMsgCode,
    SpeedMsgCode,
    CourseMsgCode,
    DepthMsgCode,
    AltitudeMsgCode,
    PitchMsgCode,
    SetMagneticVariationMsgCode,
    MagneticVariationMsgCode,
    ModeMsgCode
  };

  // Define message structure for each method
  struct GetLogDataMsg : Request, Reply {
    NavigationIF::LogData data;
  
  } _getLogDataMsg;

  struct StateMsg : Request, Reply {
    NavigationIF::Position position;
    NavigationIF::Attitude attitude;
  
  } _stateMsg;

  struct HeadingMsg : Request, Reply {
    double heading;
  
  } _headingMsg;

  struct LocationMsg : Request, Reply {
    double latitude;
    double longitude;
    double depth;
    double altitude;
  
  } _locationMsg;

  struct SpeedMsg : Request, Reply {
    float returnVal;
  
  } _speedMsg;

  struct CourseMsg : Request, Reply {
    double returnVal;
  
  } _courseMsg;

  struct DepthMsg : Request, Reply {
    double returnVal;
  
  } _depthMsg;

  struct AltitudeMsg : Request, Reply {
    double returnVal;
  
  } _altitudeMsg;

  struct PitchMsg : Request, Reply {
    double returnVal;
  
  } _pitchMsg;

  struct SetMagneticVariationMsg : Request, Reply {
    double angle;
  
  } _setMagneticVariationMsg;

  struct MagneticVariationMsg : Request, Reply {
    double returnVal;
  
  } _magneticVariationMsg;

  struct ModeMsg : Request, Reply {
    NavigationIF::Mode mode;
  
  } _modeMsg;

};

#endif

