/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : SimulatedTailCone.h                                           */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#ifndef _SimulatedTailCone_H
#define _SimulatedTailCone_H
#include "TailConeIF_SK.h"
#include "SimulatorIF.h"

class SimulatedTailCone : public TailConeIF_SK {

  friend class OdysseyTailCone;

public:

  SimulatedTailCone();
  ~SimulatedTailCone();

protected:

  virtual void name(DeviceIF::Name name);
  virtual void serialNumber(DeviceIF::Name id);
  virtual DeviceIF::Status initialize();
  virtual DeviceIF::Status powerOn();
  virtual DeviceIF::Status powerOff();
  virtual DeviceIF::Status status();

  virtual DeviceIF::Status setPropellerSpeed(double radsPerSec);
  virtual DeviceIF::Status setElevator(double angle);
  virtual DeviceIF::Status setRudder(double angle);
  virtual DeviceIF::Status command(double vehicleSpeed, double elevator, double rudder);
  virtual DeviceIF::Status setDeadman(short milliseconds);
  virtual DeviceIF::Status deadman(short *milliseconds);
  virtual void enableThruster();
  virtual void disableThruster();
  virtual Boolean thrusterEnabled();
  virtual DeviceIF::Status propellerSpeed(double *omega_M, TimeIF::TimeSpec *time);
  virtual DeviceIF::Status elevator(double *angle, TimeIF::TimeSpec *time);
  virtual DeviceIF::Status rudder(double *angle, TimeIF::TimeSpec *time);
  virtual DeviceIF::Status actual(double *omega_M, double *elevator, double *rudder, TimeIF::TimeSpec *time);
  virtual DeviceIF::Status readTelemValues(double *omega_M, double *elevator, double *rudder, TimeIF::TimeSpec *time);

  virtual TailConeIF::Type tailConeType();
  
  // Declare callbacks corresponding to each method
  Boolean setPropellerSpeedCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean setElevatorCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean setRudderCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean commandCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean setDeadmanCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean enableThrusterCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean disableThrusterCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean thrusterEnabledCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean TailConeTypeCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean propellerSpeedCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean waterSpeedCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean elevatorCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean rudderCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean actualCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);

  Boolean readTelemValuesCallback(Request *request, int nReqBytes,
                 Reply **reply, int *nReplyBytes);


  Boolean _thrusterEnabled;

  virtual int spawnAuxTasks();

  SimulatorIF *_simulator;

  double _propSpeed, _elevator, _rudder;
};

#endif
