/****************************************************************************/
/* Copyright (c) 2005 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : SonardyneDriver.h                                             */
/* Author   : henthorn                                                      */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 11/15/2005                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#ifndef _SONARDYNEDRIVER_H
#define _SONARDYNEDRIVER_H
#include "PeriodicTask.h"
#include "Attributes.h"
#include "SerialDevice.h"

#include "UsblIF.h"
#include "SonardyneOutput.h"
#include "SonardyneCommand.h"
#include "SonardyneLog.h"

const int MAX_LW = 5;
const double DEFAULT_ESV = 1485.;
const unsigned SonardynePollPeriod = 1000;  //millisec.


class SonardyneDriver : public Task {

   friend class SonardyneLog;

   public:
      SonardyneDriver(SerialDevice *serialDevice, char* configfile = "sonardyne.cfg");
      ~SonardyneDriver();

      ////////////////////////////////////////////////////////////////////
      // Run.  This is an infinite loop that requests a ping, then blocks 
      // until either the data is received, or too much time passes.
      virtual void run();

   protected:
      SerialDevice     *_device;
      SonardyneLog     *_log;
      SonardyneOutput  *_output;
      SonardyneCommand *_command;
      char* _config;
      char  _interrogation[32];
      char  _response[64];
      unsigned _timeout;
      unsigned _diagCount;
      Boolean _running;
                  
      // Output
      //
      double _r, _x, _y, _z;
      short int _dataStatus, _tat;
      double _sigLevel, _detectLevel, _quality;
      int _doppler, _acceptance, _clipped;
      // Config attributes
      //
      long _pg, _pl, _lw, _vjse, _mrpl;
      long _pingDelay;
      double _esv;
      char* _beacon;
      long _alwaysOn;
      
      Attributes _attributes;
      
      void init();
      void acquireRangeData();
      void acquireDiagData();
      void zeroDiagCountdown() { _diagCount = 0; }
      void resetDiagCountdown() { _diagCount = 5; }
      void createCfgAttributes();
      void loadConfigFile(const char* file);
      void reportCfgAttributes();
      
   private:
};

#endif
