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

#ifndef __TailConeIF_H
#define __TailConeIF_H

#include "TaskInterface.h"

#include "DeviceIF.h"
#include "TimeIF.h"

#define TailConeIFServerName "TailConeIFServer"

class TailConeIF : public DeviceIF {

  friend class TailConeIF_SK;

  public:

  
  /*
  CLASS 
  TailConeIF
  
  DESCRIPTION
  TaskInterface to TailCone device driver
  
  AUTHOR
  Tom O'Reilly
  */
  enum Type {
    Dorado,
    Odyssey,
    Simulated
  };

  enum Event {
    Initialized,
    SetDeadman
  };

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

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

  ~TailConeIF();

  /////////////////////////////////////////////////////////
  // Set propeller speed 
  // [input] radsPerDeg: Propeller speed in radians per sec
  DeviceIF::Status setPropellerSpeed(double radsPerSec);

  /////////////////////////////////////////////////////////
  // Set elevator angle
  // [input] angle: Angle in radians
  DeviceIF::Status setElevator(double angle);

  /////////////////////////////////////////////////////////
  // Set rudder angle
  // [input] angle: Angle in radians
  DeviceIF::Status setRudder(double angle);

  /////////////////////////////////////////////////////////
  // Command speed, elevator, and rudder angles
  // [input] propOmega: prop angular velocity (radians/sec)
  // [input] elevator: Elevator angle in radians
  // [input] rudder: Rudder angle in radians
  DeviceIF::Status command(double propOmega, double elevator, double rudder);

  /////////////////////////////////////////////////////////
  // Set thruster deadman timeout value
  DeviceIF::Status setDeadman(short milliseconds);

  /////////////////////////////////////////////////////////
  // Get thruster deadman timeout value (milliseconds)
  DeviceIF::Status deadman(short *milliseconds);

  /////////////////////////////////////////////////////////
  // Enable motor
  void enableThruster();

  /////////////////////////////////////////////////////////
  // Disable motor
  void disableThruster();

  /////////////////////////////////////////////////////////
  // Test to see if the thruster is enabled. (]
  Boolean thrusterEnabled();

  /////////////////////////////////////////////////////////
  // return TailCone Type 
  TailConeIF::Type tailConeType();

  /////////////////////////////////////////////////////////
  // Propeller speed
  // [output] speed: Propeller speed (rad/sec)
  // [output] time: Sample time
  DeviceIF::Status propellerSpeed(double *omega_M, TimeIF::TimeSpec *time);

  /////////////////////////////////////////////////////////
  // Elevator angle
  // [output] angle: Elevator angle (rad)
  // [output] time: Sample time
  DeviceIF::Status elevator(double *angle, TimeIF::TimeSpec *time);

  /////////////////////////////////////////////////////////
  // Rudder angle
  // [output] angle: Rudder angle (rad)
  // [output] time: Sample time
  DeviceIF::Status rudder(double *angle, TimeIF::TimeSpec *time);

  /////////////////////////////////////////////////////////
  // Get propeller speed, elevator, and rudder angles
  // [output] speed: Propeller speed (rad/sec)
  // [output] elevator: Elevator angle (rad)
  // [output] rudder: Rudder angle (rad)
  // [output] time: Sample time
  DeviceIF::Status actual(double *omega_M, double *elevator, double *rudder, TimeIF::TimeSpec *time);

  
  protected:

  // Message codes for each method
  enum TailConeIFMsgCode {
    SetPropellerSpeedMsgCode = 6,
    SetElevatorMsgCode,
    SetRudderMsgCode,
    CommandMsgCode,
    SetDeadmanMsgCode,
    DeadmanMsgCode,
    EnableThrusterMsgCode,
    DisableThrusterMsgCode,
    ThrusterEnabledMsgCode,
    TailConeTypeMsgCode,
    PropellerSpeedMsgCode,
    ElevatorMsgCode,
    RudderMsgCode,
    ActualMsgCode
  };

  // Define message structure for each method
  struct SetPropellerSpeedMsg : Request, Reply {
    DeviceIF::Status returnVal;
    double radsPerSec;
  
  } _setPropellerSpeedMsg;

  struct SetElevatorMsg : Request, Reply {
    DeviceIF::Status returnVal;
    double angle;
  
  } _setElevatorMsg;

  struct SetRudderMsg : Request, Reply {
    DeviceIF::Status returnVal;
    double angle;
  
  } _setRudderMsg;

  struct CommandMsg : Request, Reply {
    DeviceIF::Status returnVal;
    double propOmega;
    double elevator;
    double rudder;
  
  } _commandMsg;

  struct SetDeadmanMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short milliseconds;
  
  } _setDeadmanMsg;

  struct DeadmanMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short milliseconds;
  
  } _deadmanMsg;

  struct EnableThrusterMsg : Request, Reply {
  
  } _enableThrusterMsg;

  struct DisableThrusterMsg : Request, Reply {
  
  } _disableThrusterMsg;

  struct ThrusterEnabledMsg : Request, Reply {
    Boolean returnVal;
  
  } _thrusterEnabledMsg;

  struct TailConeTypeMsg : Request, Reply {
    TailConeIF::Type returnVal;
  
  } _tailConeTypeMsg;

  struct PropellerSpeedMsg : Request, Reply {
    DeviceIF::Status returnVal;
    double omega_M;
    TimeIF::TimeSpec time;
  
  } _propellerSpeedMsg;

  struct ElevatorMsg : Request, Reply {
    DeviceIF::Status returnVal;
    double angle;
    TimeIF::TimeSpec time;
  
  } _elevatorMsg;

  struct RudderMsg : Request, Reply {
    DeviceIF::Status returnVal;
    double angle;
    TimeIF::TimeSpec time;
  
  } _rudderMsg;

  struct ActualMsg : Request, Reply {
    DeviceIF::Status returnVal;
    double omega_M;
    double elevator;
    double rudder;
    TimeIF::TimeSpec time;
  
  } _actualMsg;

};

#endif

