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

#ifndef __AvTrakIF_H
#define __AvTrakIF_H

#include "TaskInterface.h"

#include "DeviceIF.h"
#include "TimeIF.h"

#define AvTrakIFServerName "AvTrakIFServer"

class AvTrakIF : public TaskInterface {

  friend class AvTrakIF_SK;

  public:

  // Forward declarations of public structures
  struct SCL_SAN_RECORD;
  
  // Slant range 
  enum SCL_CMD_TYPE {
    REQ_STAT,
    REQ_SAN_ON,
    REQ_SAN_OFF,
    ABORT_MISSION,
    START_SURVEY,
    INVALID_CMD
  };

  
  typedef char AvTrakString[256];
  typedef char String32[32];
  
  struct SCL_SAN_RECORD {
    // Data from WinFrog
    float wfTime;
    // Timestamp 
    float wfLat;
    // Latitude 
    float wfLong;
    // Longitude 
    float wfSlant;
  };
  AvTrakIF(const char *name, int timeout = 10);

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

  ~AvTrakIF();

  /////////////////////////////////////////////////////////
  // Return true if device is ready to go, otherwise false
  Boolean ready();

  DeviceIF::Status set_time(AvTrakIF::AvTrakString str, TimeIF::TimeSpec *time);

  DeviceIF::Status sendStatus(short address);

  DeviceIF::Status getSANFix(AvTrakIF::SCL_SAN_RECORD *sanFix, Boolean *newData);

  DeviceIF::Status getSCLCmd(AvTrakIF::SCL_CMD_TYPE *cmd, Boolean *newCmd);

  DeviceIF::Status sendSMS(short address, AvTrakIF::AvTrakString msg, short nbytes);

  DeviceIF::Status sendSCLCmd(short address, AvTrakIF::SCL_CMD_TYPE cmd);

  DeviceIF::Status measureRange(short address);

  DeviceIF::Status requestStatus(short address);

  DeviceIF::Status requestLocalStatus();

  
  protected:

  // Message codes for each method
  enum AvTrakIFMsgCode {
    ReadyMsgCode,
    Set_timeMsgCode,
    SendStatusMsgCode,
    GetSANFixMsgCode,
    GetSCLCmdMsgCode,
    SendSMSMsgCode,
    SendSCLCmdMsgCode,
    MeasureRangeMsgCode,
    RequestStatusMsgCode,
    RequestLocalStatusMsgCode
  };

  // Define message structure for each method
  struct ReadyMsg : Request, Reply {
    Boolean returnVal;
  
  } _readyMsg;

  struct Set_timeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    AvTrakIF::AvTrakString str;
    TimeIF::TimeSpec time;
  
  } _set_timeMsg;

  struct SendStatusMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short address;
  
  } _sendStatusMsg;

  struct GetSANFixMsg : Request, Reply {
    DeviceIF::Status returnVal;
    AvTrakIF::SCL_SAN_RECORD sanFix;
    Boolean newData;
  
  } _getSANFixMsg;

  struct GetSCLCmdMsg : Request, Reply {
    DeviceIF::Status returnVal;
    AvTrakIF::SCL_CMD_TYPE cmd;
    Boolean newCmd;
  
  } _getSCLCmdMsg;

  struct SendSMSMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short address;
    AvTrakIF::AvTrakString msg;
    short nbytes;
  
  } _sendSMSMsg;

  struct SendSCLCmdMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short address;
    AvTrakIF::SCL_CMD_TYPE cmd;
  
  } _sendSCLCmdMsg;

  struct MeasureRangeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short address;
  
  } _measureRangeMsg;

  struct RequestStatusMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short address;
  
  } _requestStatusMsg;

  struct RequestLocalStatusMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _requestLocalStatusMsg;

};

#endif

