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

#ifndef __DoradoTailConeIF_H
#define __DoradoTailConeIF_H

#include "TaskInterface.h"

#include "TailConeIF.h"
#include "TimeIF.h"

#define DoradoTailConeIFServerName "DoradoTailConeIFServer"

class DoradoTailConeIF : public TailConeIF {

  friend class DoradoTailConeIF_SK;

  public:

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

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

  ~DoradoTailConeIF();

  /*
  CLASS 
  DoradoTailConeIF
  
  DESCRIPTION
  TaskInterface to Dorado TailCone device driver
  
  AUTHOR
  Andy Pearce
  */
  /////////////////////////////////////////////////////////
  // Set Motor counts directly.  For I&T.
  // [input] counts: Sets the pwm command directly on the motor control board.
  DeviceIF::Status setMotorCounts(long counts);

  /////////////////////////////////////////////////////////
  // Set elevator actuator counts directly.  For I&T.
  // [input] counts: Sets the pwm command directly on the motor control board.
  DeviceIF::Status setElevatorCounts(short counts);

  /////////////////////////////////////////////////////////
  // Set rudder actuator counts directly.  For I&T.
  // [input] counts: Sets the pwm command directly on the motor control board.
  DeviceIF::Status setRudderCounts(short counts);

  /////////////////////////////////////////////////////////
  // Get motor and actuator currents
  // [output] elevatorCurrent: Elevator current (milliamps)
  // [output] rudderCurrent: Rudder current (milliamps)
  // [output] motorCurrent1: Motor current #1 (milliamps)
  // [output] motorCurrent2: Motor current #2 (milliamps)
  // [output] time: Sample time
  DeviceIF::Status currents(short *elevatorCurrent, short *rudderCurrent, short *propCurrent1, short *propCurrent2, TimeIF::TimeSpec *time);

  DeviceIF::Status readTelemValues(double *omega_M, double *elevator, double *rudder, TimeIF::TimeSpec *time);

  
  protected:

  // Message codes for each method
  enum DoradoTailConeIFMsgCode {
    SetMotorCountsMsgCode = 20,
    SetElevatorCountsMsgCode,
    SetRudderCountsMsgCode,
    CurrentsMsgCode,
    ReadTelemValuesMsgCode
  };

  // Define message structure for each method
  struct SetMotorCountsMsg : Request, Reply {
    DeviceIF::Status returnVal;
    long counts;
  
  } _setMotorCountsMsg;

  struct SetElevatorCountsMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short counts;
  
  } _setElevatorCountsMsg;

  struct SetRudderCountsMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short counts;
  
  } _setRudderCountsMsg;

  struct CurrentsMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short elevatorCurrent;
    short rudderCurrent;
    short propCurrent1;
    short propCurrent2;
    TimeIF::TimeSpec time;
  
  } _currentsMsg;

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

};

#endif

