/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : TailConeServer.h                                              */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#ifndef _TailConeServer_H
#define _TailConeServer_H
#include "DoradoTailConeIF_SK.h"
#include "SerialDevice.h"
#include "time.h"
#include "TailConeInput.h"
#include "TailConeOutput.h"

class TailConeServer : public DoradoTailConeIF_SK {

public:

  TailConeServer(SerialParameters *params);
  ~TailConeServer();


  enum Command {
    Initialize, SetDeadman
  };

protected:

  virtual void name(DeviceIF::Name name);
  virtual void serialNumber(DeviceIF::Name id);

  virtual DeviceIF::Status powerOn();
  virtual DeviceIF::Status powerOff();
  virtual DeviceIF::Status status();

  virtual DeviceIF::Status initialize();

  virtual DeviceIF::Status health(long *statusWord, TimeIF::TimeSpec *time);

  virtual DeviceIF::Status setPropellerSpeed(double radsPerSec);

  virtual DeviceIF::Status setElevator(double angle);

  virtual DeviceIF::Status setElevatorCounts(short counts);

  virtual DeviceIF::Status setRudder(double angle);

  virtual DeviceIF::Status setRudderCounts(short counts);

  virtual DeviceIF::Status setMotorCounts(long counts);

  virtual DeviceIF::Status command(double propOmega, 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 TailConeIF::Type tailConeType();

  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 DeviceIF::Status currents(short *elevatorCurrent,
				    short *rudderCurrent,
				    short *propCurrent1,
				    short *propCurrent2,
				    TimeIF::TimeSpec *time);


  virtual int spawnAuxTasks();

  TailConeInput *_input;

  TailConeOutput *_output;

  pid_t _driverPid;

  Boolean _thrusterEnabled;

  SerialParameters *_driverSerialParams;
};

#endif
