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

#ifndef __CrossbowIF_H
#define __CrossbowIF_H

#include "TaskInterface.h"

#include "AhrsIF.h"
#include "TimeIF.h"

#define CrossbowIFServerName "CrossbowIFServer"

class CrossbowIF : public AhrsIF {

  friend class CrossbowIF_SK;

  public:

  
  enum Mode {
    Voltage,
    Scaled,
    Angle
  };

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

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

  ~CrossbowIF();

  ////////////////////////////////////////////////////////////
  // Gets all three axes of acceleration (G)
  // [output] accelX: X acceleration
  // [output] accelY: Y acceleration
  // [output] accelZ: Z acceleration
  DeviceIF::Status acceleration(double *accelX, double *accelY, double *accelZ, TimeIF::TimeSpec *sampleTime);

  ////////////////////////////////////////////////////////////
  // Gets all three axes of magnetic vector (gauss)
  // [output] magX: mag vector in the X axis
  // [output] magY: mag vector in the Y axis
  // [output] magZ: mag vector in the Z axis
  DeviceIF::Status magneticVector(double *magX, double *magY, double *magZ, TimeIF::TimeSpec *sampleTime);

  ////////////////////////////////////////////////////////////
  // Get everything
  // [output] roll, pitch, heading
  // [output] rollRate, pitchRate, headingRate
  // [output] accelX, accelY, accelZ
  // [output] magX, magY, magZ,
  // [output] temp (deg C)
  DeviceIF::Status all(AhrsIF::Attitude *attitude, double *accelX, double *accelY, double *accelZ, double *magX, double *magY, double *magZ, double *temperature, TimeIF::TimeSpec *sampleTime);

  
  protected:

  // Message codes for each method
  enum CrossbowIFMsgCode {
    AccelerationMsgCode = 10,
    MagneticVectorMsgCode,
    AllMsgCode
  };

  // Define message structure for each method
  struct AccelerationMsg : Request, Reply {
    DeviceIF::Status returnVal;
    double accelX;
    double accelY;
    double accelZ;
    TimeIF::TimeSpec sampleTime;
  
  } _accelerationMsg;

  struct MagneticVectorMsg : Request, Reply {
    DeviceIF::Status returnVal;
    double magX;
    double magY;
    double magZ;
    TimeIF::TimeSpec sampleTime;
  
  } _magneticVectorMsg;

  struct AllMsg : Request, Reply {
    DeviceIF::Status returnVal;
    AhrsIF::Attitude attitude;
    double accelX;
    double accelY;
    double accelZ;
    double magX;
    double magY;
    double magZ;
    double temperature;
    TimeIF::TimeSpec sampleTime;
  
  } _allMsg;

};

#endif

