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

#ifndef __TailConeIF_SK_H
#define __TailConeIF_SK_H

#include "TaskServer.h"
#include "TailConeIF.h"
#include "DeviceIF_SK.h"

class TailConeIF_SK : public DeviceIF_SK {

  public:

  // Constructor for server with default name
  TailConeIF_SK();

  // Constructor for server with specific name
  TailConeIF_SK(const char *serverName);

  virtual ~TailConeIF_SK();
  
  protected:

  // These methods must be defined in subclass
  virtual DeviceIF::Status setPropellerSpeed(double radsPerSec) = 0;
  virtual DeviceIF::Status setElevator(double angle) = 0;
  virtual DeviceIF::Status setRudder(double angle) = 0;
  virtual DeviceIF::Status command(double propOmega, double elevator, double rudder) = 0;
  virtual DeviceIF::Status setDeadman(short milliseconds) = 0;
  virtual DeviceIF::Status deadman(short *milliseconds) = 0;
  virtual void enableThruster() = 0;
  virtual void disableThruster() = 0;
  virtual Boolean thrusterEnabled() = 0;
  virtual TailConeIF::Type tailConeType() = 0;
  virtual DeviceIF::Status propellerSpeed(double *omega_M, TimeIF::TimeSpec *time) = 0;
  virtual DeviceIF::Status elevator(double *angle, TimeIF::TimeSpec *time) = 0;
  virtual DeviceIF::Status rudder(double *angle, TimeIF::TimeSpec *time) = 0;
  virtual DeviceIF::Status actual(double *omega_M, double *elevator, double *rudder, TimeIF::TimeSpec *time) = 0;
  
  // 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 deadmanCallback(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 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);

  
  // Message structure pointer for each method
  TailConeIF::SetPropellerSpeedMsg *_setPropellerSpeedMsg;
  TailConeIF::SetElevatorMsg *_setElevatorMsg;
  TailConeIF::SetRudderMsg *_setRudderMsg;
  TailConeIF::CommandMsg *_commandMsg;
  TailConeIF::SetDeadmanMsg *_setDeadmanMsg;
  TailConeIF::DeadmanMsg *_deadmanMsg;
  TailConeIF::EnableThrusterMsg *_enableThrusterMsg;
  TailConeIF::DisableThrusterMsg *_disableThrusterMsg;
  TailConeIF::ThrusterEnabledMsg *_thrusterEnabledMsg;
  TailConeIF::TailConeTypeMsg *_tailConeTypeMsg;
  TailConeIF::PropellerSpeedMsg *_propellerSpeedMsg;
  TailConeIF::ElevatorMsg *_elevatorMsg;
  TailConeIF::RudderMsg *_rudderMsg;
  TailConeIF::ActualMsg *_actualMsg;
  
  // Determine max bytes required for message buffer
  virtual size_t maxRequestBytes();

  // Allocate buffer for messages, set pointers, etc
  virtual void allocateBuffers();

  private:

  // Initializer method called by constructors
  int init();

};

#endif

