/****************************************************************************/
/* Copyright (c) 2002 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : Hydroscat.h                                                   */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 06/21/2002                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#ifndef _HYDROSCAT_H
#define _HYDROSCAT_H

#include "SerialDeviceDriver.h"
#include "HydroscatLog.h"
#include "HydroscatOutput.h"
#include "Attributes.h"
#include "HS2Cal.h"

/*
CLASS
Hydroscat

DESCRIPTION
Hydroscat Device Driver Interface

AUTHOR
Rich Henthorn

*/

class Hydroscat : public SerialDeviceDriver {
  
  friend class HydroscatLog;

public:

  Hydroscat(SerialDevice *serialDevice, Boolean verbose);

  virtual ~Hydroscat();

protected:

  DeviceIF::Status stop();

  DeviceIF::Status start();


protected:

  HydroscatLog  *_log;

  Boolean    _verbose;

  HS2Cal *_cal;
  HS2Cal::Output _calOut;

  //count of number of checksum errors
  unsigned int _checksumErrorCnt;
  // Data to log
  long   _seconds;
  int    _hseconds;

  int    _snorm1;
  int    _gainstatus1;

  int    _snorm2;
  int    _gainstatus2;

  int    _snorm3;
  int    _gainstatus3;

  int    _depthraw;
  int    _tempraw;
  double _temp;

  int    _error;

  HydroscatOutput *_output;
  ////////////////////////////////////////////////////////////////////
  // initialization routine
  virtual DeviceIF::Status initialize();

  ////////////////////////////////////////////////////////////////////
  // Read a fixed-length record
  virtual DeviceIF::Status readRecord(unsigned char *record,
				      int maxRecordBytes,
				      const char *recordTerminator,
				      unsigned readTimeout,
				      int *nBytesRead);
  
  ////////////////////////////////////////////////////////////////////
  // Get next data record
  int getNextRecord(unsigned char *record,
		    int maxRecordBytes,
		    const char *recordTerminator,
		    unsigned readTimeout);

  int getNextSocketRecord(unsigned char *record,
			  int maxRecordBytes,
			  const char *recordTerminator,
			  unsigned readTimeout);

  ////////////////////////////////////////////////////////////////////
  // Process a record
  virtual DeviceIF::Status  processRecord(unsigned char *record, int nRecordBytes);

  DeviceIF::Status setTime(unsigned long secondsSince1970);


  int _test_i;
  void substitute_test_data();


};

#endif
