/****************************************************************************/
/* Copyright (c) 2012 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : DeltaTServer.h                                           */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 09/17/2012                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include <iostream.h>
#include "DeltaTInput.h"
#include "DeltaTOutput.h"
#include "Attributes.h"
#include "AttributeParser.h"
#include "TimeP.h"
#include "FastCatIF.h"
#include "DeviceIF.h"
#include "DeltaTIF_SK.h"

#define FWD  0
#define SIDE 1


/*
CLASS
DeltaTServer

DESCRIPTION
Server Interface for Multibeam Sonar

AUTHOR
Henthorn

*/

#include "DeltaTMessage.h"

class DeltaTServer : public DeltaTIF_SK {

public:

  DeltaTServer(const char *configFile);
  ~DeltaTServer();

  virtual DeviceIF::Status set_profile_point_filter(DeltaTIF::Sonar sonar, short ppf);
  virtual DeviceIF::Status set_trigger_delay(DeltaTIF::Sonar sonar, long delay);
  virtual DeviceIF::Status set_trigger_edge(DeltaTIF::Sonar sonar, short edge);
  virtual DeviceIF::Status set_trigger_enable(DeltaTIF::Sonar sonar, short enable);
  virtual DeviceIF::Status set_profile_min_range(DeltaTIF::Sonar sonar, short range);
  virtual DeviceIF::Status set_averaging(DeltaTIF::Sonar sonar, short avg);
  virtual DeviceIF::Status set_beam_width(DeltaTIF::Sonar sonar, short width);
  virtual DeviceIF::Status set_sector_size(DeltaTIF::Sonar sonar, short size);
  virtual DeviceIF::Status set_nbeams(DeltaTIF::Sonar sonar, short nb);
  virtual DeviceIF::Status set_sos(DeltaTIF::Sonar sonar, float sos);
  virtual DeviceIF::Status update_sos(float *sos);
  virtual DeviceIF::Status set_range(DeltaTIF::Sonar sonar, short range);
  virtual DeviceIF::Status set_gain_eq(DeltaTIF::Sonar sonar, Boolean on);
  virtual DeviceIF::Status set_idt_logging(DeltaTIF::Sonar sonar, Boolean on);
  virtual DeviceIF::Status set_gain(DeltaTIF::Sonar sonar, short gain);
  virtual double range(DeltaTIF::Sonar sonar);
  virtual Boolean enabled(DeltaTIF::Sonar sonar);
  virtual unsigned short  nbeams(DeltaTIF::Sonar sonar);
  virtual unsigned short  interval(DeltaTIF::Sonar sonar);
  virtual void   update_time(DeltaTIF::Sonar sonar, TimeIF::TimeSpec *timestamp);
  virtual void   get(DeltaTIF::Sonar sonar, DeltaTIF::Data *data);
  virtual DeviceIF::Status set_auto_sos(Boolean automatic);
  virtual void   get_mounting_angles(DeltaTIF::Sonar sonar,
				     double *phi, double *theta, double *psi) {
    *phi = _phi[sonar];
    *theta = _theta[sonar];
    *psi = _psi[sonar];
  }
  virtual void   start(DeltaTIF::Sonar sonar);
  virtual void   stop(DeltaTIF::Sonar sonar);
  virtual Boolean auto_sos();  // Returns true if server configured for auto sos updates
  virtual int spawnAuxTasks();
  float get_sos_data(DeltaTIF::Sonar sonar);

protected:

  static void usr1SignalHandler(int sig);
  virtual void name(DeviceIF::Name name);

  void set_timer();
  void attach_ctd_server(int wait_time = 1); //Attach CTD with variable wait time
  void config_drivers();

  FastCatIF *_ctd;

  // Server/Driver configuration settings
  double _sos, _phi[2], _theta[2], _psi[2], _tdelay[2];
  char* _host[2];
  char* _name[2];
  char* _port[2];
  long  _log83P, _pmr[2], _tilt[2], _tenable[2], _tedge[2],  _xdo[2], _ppf[2], _gain[2], _range[2], _sector[2];
  Boolean _auto_sos;
  
  DeltaTInput *_input[2];
  DeltaTOutput *_output[2];
  DeltaTMessage *_msgQ[2];

  Attributes _attributes;

};


