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

#ifndef __DeltaTIF_H
#define __DeltaTIF_H

#include "TaskInterface.h"

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

#define DeltaTIFServerName "DeltaTIFServer"

class DeltaTIF : public TaskInterface {

  friend class DeltaTIF_SK;

  public:

  // Forward declarations of public structures
  struct Data;
  
  enum Constants {
    MaxBeams = 480
  };

  enum Sonar {
    Fwd = 0,
    Side
  };

  
  typedef float FloatArray[480];
  typedef short ShortArray[480];
  
  struct Data {
    TimeIF::TimeSpec update_time;
    Boolean enabled;
    float range;
    // Altitude calculated by the DeltaT 
    short interval;
    // Time between pings in milliseconds 
    short nbeams;
    DeltaTIF::FloatArray beam_ranges;
    DeltaTIF::ShortArray intensities;
  };
  DeltaTIF(const char *name, int timeout = 10);

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

  ~DeltaTIF();

  ///////////////////////////////////////////////////////////////////
  // Set the profile point filtering
  //
  DeviceIF::Status set_profile_point_filter(DeltaTIF::Sonar sonar, short ppf);

  ///////////////////////////////////////////////////////////////////
  // Set the trigger delay
  //
  DeviceIF::Status set_trigger_delay(DeltaTIF::Sonar sonar, long delay);

  ///////////////////////////////////////////////////////////////////
  // Set the trigger edge
  //
  DeviceIF::Status set_trigger_edge(DeltaTIF::Sonar sonar, short edge);

  ///////////////////////////////////////////////////////////////////
  // Set the trigger enable
  //
  DeviceIF::Status set_trigger_enable(DeltaTIF::Sonar sonar, short trig);

  ///////////////////////////////////////////////////////////////////
  // Set the profile minimum range
  //
  DeviceIF::Status set_profile_min_range(DeltaTIF::Sonar sonar, short pmr);

  ///////////////////////////////////////////////////////////////////
  // Set the averaging: [0|1]=>Off, and 3, 5, or 7 shots
  //
  DeviceIF::Status set_averaging(DeltaTIF::Sonar sonar, short avg);

  ///////////////////////////////////////////////////////////////////
  // Set the beam width: 0 for Wide, 1->Normal, 2->Narrow, 3->Narrow-Mixed
  //
  DeviceIF::Status set_beam_width(DeltaTIF::Sonar sonar, short width);

  ///////////////////////////////////////////////////////////////////
  // Set the sector size: 0 for 30 degrees, 1->60, 2->90, 3->120
  //
  DeviceIF::Status set_sector_size(DeltaTIF::Sonar sonar, short size);

  ///////////////////////////////////////////////////////////////////
  // Set the number of beams: 120, 240, or 480
  //
  DeviceIF::Status set_nbeams(DeltaTIF::Sonar sonar, short nbeams);

  ///////////////////////////////////////////////////////////////////
  // Set the speed of sound to 1400 to 1600 m/sec
  //
  DeviceIF::Status set_sos(DeltaTIF::Sonar sonar, float sos);

  ///////////////////////////////////////////////////////////////////
  // Auto-updating of the SOS. Tells the driver to regularly update
  // the beamformer SOS. True = automatic updating.
  //
  DeviceIF::Status set_auto_sos(Boolean automatic);

  ///////////////////////////////////////////////////////////////////
  // Instruct the server to update the SOS using the CTD server.
  // This is one-shot deal. Returns the updated sos.
  //
  DeviceIF::Status update_sos(float *sos);

  ///////////////////////////////////////////////////////////////////
  // Set the range 0 to 100m
  //
  DeviceIF::Status set_range(DeltaTIF::Sonar sonar, short range);

  ///////////////////////////////////////////////////////////////////
  // Set the receive gain 1 to 20db
  //
  DeviceIF::Status set_gain(DeltaTIF::Sonar sonar, short gain);

  ///////////////////////////////////////////////////////////////////
  // Turn gain equalization on or off
  //
  DeviceIF::Status set_gain_eq(DeltaTIF::Sonar sonar, Boolean on);

  ///////////////////////////////////////////////////////////////////
  // Turn 837 data logging on or off
  //
  DeviceIF::Status set_idt_logging(DeltaTIF::Sonar sonar, Boolean on);

  ///////////////////////////////////////////////////////////////////
  // range returns the calculated range from the Multibeam data record
  //
  double range(DeltaTIF::Sonar sonar);

  // Return the number of beams in the DeltaT data records
  //
  unsigned short nbeams(DeltaTIF::Sonar sonar);

  // Return the ping interval
  //
  unsigned short interval(DeltaTIF::Sonar sonar);

  // Return enabled flag
  //
  Boolean enabled(DeltaTIF::Sonar sonar);

  // Return the latest data timestamp
  //
  void update_time(DeltaTIF::Sonar sonar, TimeIF::TimeSpec *timestamp);

  // Return the latest DeltaT data
  //
  void get(DeltaTIF::Sonar sonar, DeltaTIF::Data *data);

  // Return the mounting angles of the sonar (read in by the server
  // from a configuration file)
  //
  void get_mounting_angles(DeltaTIF::Sonar sonar, double *phi, double *theta, double *psi);

  // Begin reading and logging DeltaT data
  //
  void start(DeltaTIF::Sonar sonar);

  // Stop reading and logging DeltaT data
  //
  void stop(DeltaTIF::Sonar sonar);

  
  protected:

  // Message codes for each method
  enum DeltaTIFMsgCode {
    Set_profile_point_filterMsgCode,
    Set_trigger_delayMsgCode,
    Set_trigger_edgeMsgCode,
    Set_trigger_enableMsgCode,
    Set_profile_min_rangeMsgCode,
    Set_averagingMsgCode,
    Set_beam_widthMsgCode,
    Set_sector_sizeMsgCode,
    Set_nbeamsMsgCode,
    Set_sosMsgCode,
    Set_auto_sosMsgCode,
    Update_sosMsgCode,
    Set_rangeMsgCode,
    Set_gainMsgCode,
    Set_gain_eqMsgCode,
    Set_idt_loggingMsgCode,
    RangeMsgCode,
    NbeamsMsgCode,
    IntervalMsgCode,
    EnabledMsgCode,
    Update_timeMsgCode,
    GetMsgCode,
    Get_mounting_anglesMsgCode,
    StartMsgCode,
    StopMsgCode
  };

  // Define message structure for each method
  struct Set_profile_point_filterMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    short ppf;
  
  } _set_profile_point_filterMsg;

  struct Set_trigger_delayMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    long delay;
  
  } _set_trigger_delayMsg;

  struct Set_trigger_edgeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    short edge;
  
  } _set_trigger_edgeMsg;

  struct Set_trigger_enableMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    short trig;
  
  } _set_trigger_enableMsg;

  struct Set_profile_min_rangeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    short pmr;
  
  } _set_profile_min_rangeMsg;

  struct Set_averagingMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    short avg;
  
  } _set_averagingMsg;

  struct Set_beam_widthMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    short width;
  
  } _set_beam_widthMsg;

  struct Set_sector_sizeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    short size;
  
  } _set_sector_sizeMsg;

  struct Set_nbeamsMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    short nbeams;
  
  } _set_nbeamsMsg;

  struct Set_sosMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    float sos;
  
  } _set_sosMsg;

  struct Set_auto_sosMsg : Request, Reply {
    DeviceIF::Status returnVal;
    Boolean automatic;
  
  } _set_auto_sosMsg;

  struct Update_sosMsg : Request, Reply {
    DeviceIF::Status returnVal;
    float sos;
  
  } _update_sosMsg;

  struct Set_rangeMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    short range;
  
  } _set_rangeMsg;

  struct Set_gainMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    short gain;
  
  } _set_gainMsg;

  struct Set_gain_eqMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    Boolean on;
  
  } _set_gain_eqMsg;

  struct Set_idt_loggingMsg : Request, Reply {
    DeviceIF::Status returnVal;
    DeltaTIF::Sonar sonar;
    Boolean on;
  
  } _set_idt_loggingMsg;

  struct RangeMsg : Request, Reply {
    double returnVal;
    DeltaTIF::Sonar sonar;
  
  } _rangeMsg;

  struct NbeamsMsg : Request, Reply {
    unsigned short returnVal;
    DeltaTIF::Sonar sonar;
  
  } _nbeamsMsg;

  struct IntervalMsg : Request, Reply {
    unsigned short returnVal;
    DeltaTIF::Sonar sonar;
  
  } _intervalMsg;

  struct EnabledMsg : Request, Reply {
    Boolean returnVal;
    DeltaTIF::Sonar sonar;
  
  } _enabledMsg;

  struct Update_timeMsg : Request, Reply {
    DeltaTIF::Sonar sonar;
    TimeIF::TimeSpec timestamp;
  
  } _update_timeMsg;

  struct GetMsg : Request, Reply {
    DeltaTIF::Sonar sonar;
    DeltaTIF::Data data;
  
  } _getMsg;

  struct Get_mounting_anglesMsg : Request, Reply {
    DeltaTIF::Sonar sonar;
    double phi;
    double theta;
    double psi;
  
  } _get_mounting_anglesMsg;

  struct StartMsg : Request, Reply {
    DeltaTIF::Sonar sonar;
  
  } _startMsg;

  struct StopMsg : Request, Reply {
    DeltaTIF::Sonar sonar;
  
  } _stopMsg;

};

#endif

