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

#ifndef __RangeFinderIF_H
#define __RangeFinderIF_H

#include "TaskInterface.h"

#include "InstrumentIF.h"
#include "TimeIF.h"

#define RangeFinderIFServerName "RangeFinderIFServer"

class RangeFinderIF : public InstrumentIF {

  friend class RangeFinderIF_SK;

  public:

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

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

  ~RangeFinderIF();

  /*
  CLASS 
  RangeFinderIF
  
  DESCRIPTION
  InstrumentIF for range finder
  
  AUTHOR
  John O'Rieffel
  
  */
  /////////////////////////////////////////////////////////
  // Mounting angle (radians) in the X-Z plane.
  // The mounting angle is defined to be zero when the 
  // line-of-sight (LOS) is parallel with the vehicle +z axis, and 
  // increases as the line-of-sight moves towards the +x axis.  
  void xzAngle(double *radians);

  /////////////////////////////////////////////////////////
  // Nominal maximum range measurable 
  void maxRange(double *meters);

  /////////////////////////////////////////////////////////
  // Get range value and time
  // [output] echoReceived: True if echo received
  // [output] meters: range 
  // [output] time:  time of sample
  DeviceIF::Status range(Boolean *echoReceived, double *meters, TimeIF::TimeSpec *sampleTime);

  /////////////////////////////////////////////////////////
  // Enable data generation
  DeviceIF::Status enable();

  /////////////////////////////////////////////////////////
  // Disable data generation (avoid acoustic interference)
  DeviceIF::Status disable();

  
  protected:

  // Message codes for each method
  enum RangeFinderIFMsgCode {
    XzAngleMsgCode = 8,
    MaxRangeMsgCode,
    RangeMsgCode,
    EnableMsgCode,
    DisableMsgCode
  };

  // Define message structure for each method
  struct XzAngleMsg : Request, Reply {
    double radians;
  
  } _xzAngleMsg;

  struct MaxRangeMsg : Request, Reply {
    double meters;
  
  } _maxRangeMsg;

  struct RangeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Boolean echoReceived;
    double meters;
    TimeIF::TimeSpec sampleTime;
  
  } _rangeMsg;

  struct EnableMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _enableMsg;

  struct DisableMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _disableMsg;

};

#endif

