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

#ifndef __AcousticModemIF_H
#define __AcousticModemIF_H

#include "TaskInterface.h"

#include "DeviceIF.h"

#define AcousticModemIFServerName "AcousticModemIFServer"

class AcousticModemIF : public TaskInterface {

  friend class AcousticModemIF_SK;

  public:

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

  
  typedef char modemString[180];
  
  struct SMAC_SAN_RECORD {
    // Data from WinFrog
    float wfTime;
    // Timestamp 
    float wfLat;
    // Latitude 
    float wfLong;
    // Longitude 
    float wfSlant;
  };
  AcousticModemIF(const char *name, int timeout = 10);

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

  ~AcousticModemIF();

  DeviceIF::Status setRegister(short reg_number, short value);

  DeviceIF::Status power(short powerLevel);

  // 1 lowest, 8 highest 
  DeviceIF::Status transpond(short tenths_of_kHz);

  // 90 lowest, 140 highest 
  DeviceIF::Status range(short remoteModem, float *meters);

  DeviceIF::Status dopplerCorrection(Boolean on_off);

  DeviceIF::Status writeString(AcousticModemIF::modemString mstr);

  DeviceIF::Status sendStatus();

  DeviceIF::Status getSANFix(AcousticModemIF::SMAC_SAN_RECORD *sanFix, Boolean *newData);

  DeviceIF::Status getSMACCmd(AcousticModemIF::SMAC_CMD_TYPE *cmd, Boolean *newCmd);

  
  protected:

  // Message codes for each method
  enum AcousticModemIFMsgCode {
    SetRegisterMsgCode,
    PowerMsgCode,
    TranspondMsgCode,
    RangeMsgCode,
    DopplerCorrectionMsgCode,
    WriteStringMsgCode,
    SendStatusMsgCode,
    GetSANFixMsgCode,
    GetSMACCmdMsgCode
  };

  // Define message structure for each method
  struct SetRegisterMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short reg_number;
    short value;
  
  } _setRegisterMsg;

  struct PowerMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short powerLevel;
  
  } _powerMsg;

  struct TranspondMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short tenths_of_kHz;
  
  } _transpondMsg;

  struct RangeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short remoteModem;
    float meters;
  
  } _rangeMsg;

  struct DopplerCorrectionMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Boolean on_off;
  
  } _dopplerCorrectionMsg;

  struct WriteStringMsg : Request, Reply {
    DeviceIF::Status returnVal;
    AcousticModemIF::modemString mstr;
  
  } _writeStringMsg;

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

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

  struct GetSMACCmdMsg : Request, Reply {
    DeviceIF::Status returnVal;
    AcousticModemIF::SMAC_CMD_TYPE cmd;
    Boolean newCmd;
  
  } _getSMACCmdMsg;

};

#endif

