/****************************************************************************/
/* Copyright (c) 2012 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : DeltaT.h                                                 */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 09/17/2012                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#ifndef _DELTAT_H
#define _DELTAT_H

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "TimeP.h"
#include "PeriodicTask.h"
#include "DeviceIF.h"
#include "DeltaTInput.h"
#include "DeltaTOutput.h"
#include "DeltaTLog.h"
#include "DeltaTMessage.h"

#define DeltaTTaskName "deltaT"
#define DeltaTDefaultPort 4040

/*
CLASS 
DeltaT

DESCRIPTION
Imagenex DeltaT Device Driver Interface

AUTHOR
Henthorn

*/

class DeltaT {

  friend class DeltaTLog;

public:
  
  /////////////////////////////////////////////////////////
  // Constructor, not used...
  DeltaT(const char* name = DeltaTTaskName, 
	 unsigned int port = DeltaTDefaultPort,
	 const char *host = NULL);

  /////////////////////////////////////////////////////////
  // overloaded Constructor
  //DeltaT();

  ///////////////////////////////////////////////////////
  //destructor
  virtual  ~DeltaT();

  //////////////////////////////////////////////////////////////// 
  // initialization function
  virtual DeviceIF::Status initialize();

  // Start logging
  //
  virtual void start();

  // Stop logging
  //
  virtual void stop();

  ////////////////////////////////////////////////////////////////////
  // run
  virtual void run(Boolean forever);

protected:
  int _sockfd, _port;
  struct sockaddr_in _client_addr;
  struct sockaddr_in _server_addr;
  struct timeval     _server_tv;

  Boolean _xmit;
  Boolean _enabled;

  long _sos;
  char _send_buf[256];
  unsigned char _receive_buf[2500];
  unsigned int  _offset;  // Used to point into _receive_buf

  char* _host;
  DeltaTLog *_log;
  DeltaTInput  *_input;
  DeltaTOutput *_output;
  DeltaTMessage *_msgQ;

  ////////////////////////////////////////////////////////////////////
  // DeltaT beam forming app comms
  int  processPacket(int nbytes_in_record);
  void process83PData();
  void setExternalControlSwitches();
  void sendExternalControlSwitches();

  ////////////////////////////////////////////////////////////////////
  // DeltaTIF interface functions
  //
  int  messageHandler();
  void set_idt_logging(int on);
  void set_mvc_logging(int on);
  void set_averaging(long avg);
  void set_beam_width(long width);
  void set_sector_size(long size);
  void set_nbeams(long nb);
  void set_sos(long sos);
  void set_range(long range);
  void set_gain(long gain);
  void set_gain_eq(int on);

};

#endif
