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

#ifndef __Reson6046IF_H
#define __Reson6046IF_H

#include "TaskInterface.h"

#include "InstrumentIF.h"

#define Reson6046IFServerName "Reson6046IFServer"

class Reson6046IF : public InstrumentIF {

  friend class Reson6046IF_SK;

  public:

  
  enum ResonSonarSystems {
    PLC = -1,
    Multibeam,
    Dummy,
    SubBottom,
    SideScanLow,
    SideScanHigh,
    SideScanBoth,
    EdgetechAll
  };

  
  typedef char String32[32];
  
  Reson6046IF(const char *name, int timeout = 10);

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

  ~Reson6046IF();

  // Start/stop payload sonar logging.
  DeviceIF::Status startLogging();

  DeviceIF::Status stopLogging();

  DeviceIF::Status start7KCenterLogging();

  DeviceIF::Status stop7KCenterLogging();

  DeviceIF::Status startSubsystem(Reson6046IF::ResonSonarSystems sonarSystem);

  DeviceIF::Status stopSubsystem(Reson6046IF::ResonSonarSystems sonarSystem);

  DeviceIF::Status pingStatus(Reson6046IF::ResonSonarSystems sonarSystem, unsigned short *pingStatus);

  DeviceIF::Status setPulseFilename(Reson6046IF::ResonSonarSystems sonarSystem, Reson6046IF::String32 pulseFilename);

  DeviceIF::Status setPingRange(Reson6046IF::ResonSonarSystems sonarSystem, float pingRange);

  DeviceIF::Status setPingRate(Reson6046IF::ResonSonarSystems sonarSystem, float pingRate);

  DeviceIF::Status setPingPower(Reson6046IF::ResonSonarSystems sonarSystem, float pingPower);

  DeviceIF::Status setRxGain(Reson6046IF::ResonSonarSystems sonarSystem, float gain);

  DeviceIF::Status setMBBottomDetectionFilters(float minRange, float maxRange, float minDepth, float maxDepth);

  DeviceIF::Status setMBBottomDetectDepthRangeOn(Boolean d_on_off, Boolean r_on_off);

  DeviceIF::Status setMBBottomDetectRecalc();

  DeviceIF::Status setMBBottomDetectRecalcInterval(short seconds);

  DeviceIF::Status setMBSnippetControl(Boolean on_eq_true, unsigned short window_size);

  DeviceIF::Status setPulseWidth(Reson6046IF::ResonSonarSystems sonarSystem, float pulseWidth);

  DeviceIF::Status setMBSpreadingLoss(float spreadingLoss_dB);

  DeviceIF::Status setMBSoundVelocity(float meters_per_sec);

  DeviceIF::Status setMBAbsorptionLoss(float absorptionLoss_dB_per_km);

  DeviceIF::Status setSBPGain(float gain);

  DeviceIF::Status setSBPDuration(float duration_milliseconds);

  DeviceIF::Status setTime();

  DeviceIF::Status setVerboseMode(unsigned short flag);

  DeviceIF::Status getVersion();

  DeviceIF::Status getSonarStatus(Reson6046IF::ResonSonarSystems sonarSystem);

  DeviceIF::Status getModules();

  DeviceIF::Status getRunList();

  DeviceIF::Status sonarReboot();

  DeviceIF::Status sonarSystemReboot();

  DeviceIF::Status sonarShutdown();

  DeviceIF::Status sonarSystemShutdown();

  DeviceIF::Status sonarSystemPowerOn();

  DeviceIF::Status sonarSystemPowerOff();

  // Control status logging of Reson 6046 Driver.
  DeviceIF::Status dataLoggingOn();

  DeviceIF::Status dataLoggingOff();

  
  protected:

  // Message codes for each method
  enum Reson6046IFMsgCode {
    StartLoggingMsgCode = 8,
    StopLoggingMsgCode,
    Start7KCenterLoggingMsgCode,
    Stop7KCenterLoggingMsgCode,
    StartSubsystemMsgCode,
    StopSubsystemMsgCode,
    PingStatusMsgCode,
    SetPulseFilenameMsgCode,
    SetPingRangeMsgCode,
    SetPingRateMsgCode,
    SetPingPowerMsgCode,
    SetRxGainMsgCode,
    SetMBBottomDetectionFiltersMsgCode,
    SetMBBottomDetectDepthRangeOnMsgCode,
    SetMBBottomDetectRecalcMsgCode,
    SetMBBottomDetectRecalcIntervalMsgCode,
    SetMBSnippetControlMsgCode,
    SetPulseWidthMsgCode,
    SetMBSpreadingLossMsgCode,
    SetMBSoundVelocityMsgCode,
    SetMBAbsorptionLossMsgCode,
    SetSBPGainMsgCode,
    SetSBPDurationMsgCode,
    SetTimeMsgCode,
    SetVerboseModeMsgCode,
    GetVersionMsgCode,
    GetSonarStatusMsgCode,
    GetModulesMsgCode,
    GetRunListMsgCode,
    SonarRebootMsgCode,
    SonarSystemRebootMsgCode,
    SonarShutdownMsgCode,
    SonarSystemShutdownMsgCode,
    SonarSystemPowerOnMsgCode,
    SonarSystemPowerOffMsgCode,
    DataLoggingOnMsgCode,
    DataLoggingOffMsgCode
  };

  // Define message structure for each method
  struct StartLoggingMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _startLoggingMsg;

  struct StopLoggingMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _stopLoggingMsg;

  struct Start7KCenterLoggingMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _start7KCenterLoggingMsg;

  struct Stop7KCenterLoggingMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _stop7KCenterLoggingMsg;

  struct StartSubsystemMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Reson6046IF::ResonSonarSystems sonarSystem;
  
  } _startSubsystemMsg;

  struct StopSubsystemMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Reson6046IF::ResonSonarSystems sonarSystem;
  
  } _stopSubsystemMsg;

  struct PingStatusMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Reson6046IF::ResonSonarSystems sonarSystem;
    unsigned short pingStatus;
  
  } _pingStatusMsg;

  struct SetPulseFilenameMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Reson6046IF::ResonSonarSystems sonarSystem;
    Reson6046IF::String32 pulseFilename;
  
  } _setPulseFilenameMsg;

  struct SetPingRangeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Reson6046IF::ResonSonarSystems sonarSystem;
    float pingRange;
  
  } _setPingRangeMsg;

  struct SetPingRateMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Reson6046IF::ResonSonarSystems sonarSystem;
    float pingRate;
  
  } _setPingRateMsg;

  struct SetPingPowerMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Reson6046IF::ResonSonarSystems sonarSystem;
    float pingPower;
  
  } _setPingPowerMsg;

  struct SetRxGainMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Reson6046IF::ResonSonarSystems sonarSystem;
    float gain;
  
  } _setRxGainMsg;

  struct SetMBBottomDetectionFiltersMsg : Request, Reply {
    DeviceIF::Status returnVal;
    float minRange;
    float maxRange;
    float minDepth;
    float maxDepth;
  
  } _setMBBottomDetectionFiltersMsg;

  struct SetMBBottomDetectDepthRangeOnMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Boolean d_on_off;
    Boolean r_on_off;
  
  } _setMBBottomDetectDepthRangeOnMsg;

  struct SetMBBottomDetectRecalcMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _setMBBottomDetectRecalcMsg;

  struct SetMBBottomDetectRecalcIntervalMsg : Request, Reply {
    DeviceIF::Status returnVal;
    short seconds;
  
  } _setMBBottomDetectRecalcIntervalMsg;

  struct SetMBSnippetControlMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Boolean on_eq_true;
    unsigned short window_size;
  
  } _setMBSnippetControlMsg;

  struct SetPulseWidthMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Reson6046IF::ResonSonarSystems sonarSystem;
    float pulseWidth;
  
  } _setPulseWidthMsg;

  struct SetMBSpreadingLossMsg : Request, Reply {
    DeviceIF::Status returnVal;
    float spreadingLoss_dB;
  
  } _setMBSpreadingLossMsg;

  struct SetMBSoundVelocityMsg : Request, Reply {
    DeviceIF::Status returnVal;
    float meters_per_sec;
  
  } _setMBSoundVelocityMsg;

  struct SetMBAbsorptionLossMsg : Request, Reply {
    DeviceIF::Status returnVal;
    float absorptionLoss_dB_per_km;
  
  } _setMBAbsorptionLossMsg;

  struct SetSBPGainMsg : Request, Reply {
    DeviceIF::Status returnVal;
    float gain;
  
  } _setSBPGainMsg;

  struct SetSBPDurationMsg : Request, Reply {
    DeviceIF::Status returnVal;
    float duration_milliseconds;
  
  } _setSBPDurationMsg;

  struct SetTimeMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _setTimeMsg;

  struct SetVerboseModeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    unsigned short flag;
  
  } _setVerboseModeMsg;

  struct GetVersionMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _getVersionMsg;

  struct GetSonarStatusMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Reson6046IF::ResonSonarSystems sonarSystem;
  
  } _getSonarStatusMsg;

  struct GetModulesMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _getModulesMsg;

  struct GetRunListMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _getRunListMsg;

  struct SonarRebootMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _sonarRebootMsg;

  struct SonarSystemRebootMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _sonarSystemRebootMsg;

  struct SonarShutdownMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _sonarShutdownMsg;

  struct SonarSystemShutdownMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _sonarSystemShutdownMsg;

  struct SonarSystemPowerOnMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _sonarSystemPowerOnMsg;

  struct SonarSystemPowerOffMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _sonarSystemPowerOffMsg;

  struct DataLoggingOnMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _dataLoggingOnMsg;

  struct DataLoggingOffMsg : Request, Reply {
    DeviceIF::Status returnVal;
  
  } _dataLoggingOffMsg;

};

#endif

