/****************************************************************************/
/* Copyright (c) 2005 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : SonardyneLog.cc                                               */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 11/15/2005                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include "DataLogWriter.h"
#include "SonardyneLog.h"
#include "SonardyneDriver.h"
#include "SimulatedUsbl.h"
#include "TimeP.h"
#include "Syslog.h"

SonardyneLog::SonardyneLog(SonardyneDriver *sonardyne, DataLog::FileFormat format)
  : _driver(sonardyne), _simDriver(0), 
    DataLogWriter(SonardyneLogName, format, AutoTimeStamp) 
{
   init();
}

SonardyneLog::SonardyneLog(SimulatedUsbl *sonardyne, DataLog::FileFormat format)
  : _driver(0), _simDriver(sonardyne), 
    DataLogWriter(SonardyneLogName, format, AutoTimeStamp) 
{
   init();
}

void SonardyneLog::init()
{
  setMnemonic("usbllog");

  addField(_sonardyneRange       = new DoubleData("sonardyneRange"));
  addField(_sonardyneX           = new DoubleData("sonardyneX"));
  addField(_sonardyneY           = new DoubleData("sonardyneY"));
  addField(_sonardyneZ           = new DoubleData("sonardyneZ"));
  addField(_sonardyneTAT         = new DoubleData("sonardyneTAT"));
  addField(_sonardyneStatus      = new ShortData ("sonardyneStatus"));
  addField(_sonardyneSigLevel    = new DoubleData("sonardyneSigLevel"));
  addField(_sonardyneDetectLevel = new DoubleData("sonardyneDetectLevel"));
  addField(_sonardyneQuality     = new DoubleData("sonardyneQuality"));
  addField(_sonardyneDoppler     = new DoubleData("sonardyneDoppler"));
  addField(_sonardyneAcceptance  = new ShortData ("sonardyneAcceptance"));
  addField(_sonardyneClipped     = new ShortData ("sonardyneClipped"));

  _sonardyneRange->setLongName("Range reading from Sonardyne USBL Transceiver");
  _sonardyneX->setLongName    ("Starboard reading from Sonardyne USBL Transceiver");
  _sonardyneY->setLongName    ("Forward reading from Sonardyne USBL Transceiver");
  _sonardyneZ->setLongName    ("Down reading from Sonardyne USBL Transceiver");
  _sonardyneTAT->setLongName  ("Turnaround time from Sonardyne USBL Transceiver");
  _sonardyneStatus->setLongName  
     ("Status 0:Undefined, 1:AllGood, 2:RangeOnly, 3:Stale");

  _sonardyneRange->setUnits("meters");
  _sonardyneX->setUnits    ("meters");
  _sonardyneY->setUnits    ("meters");
  _sonardyneZ->setUnits    ("meters");
  _sonardyneTAT->setUnits  ("milliseconds");
  _sonardyneStatus->setUnits  ("Status");

}


SonardyneLog::~SonardyneLog()
{
  delete  _sonardyneRange;
  delete  _sonardyneX;
  delete  _sonardyneY;
  delete  _sonardyneZ;
  delete  _sonardyneTAT;
}


void SonardyneLog::setFields()
{
   if( _driver )
   {
      _sonardyneRange->setValue       ((double)_driver->_r);
      _sonardyneX->setValue           ((double)_driver->_x);
      _sonardyneY->setValue           ((double)_driver->_y);
      _sonardyneZ->setValue           ((double)_driver->_z);
      _sonardyneTAT->setValue         ((double)_driver->_output->data.tat);
      _sonardyneStatus->setValue      ((short) _driver->_output->data.status);
      _sonardyneSigLevel->setValue    ((double)_driver->_sigLevel);
      _sonardyneDetectLevel->setValue ((double)_driver->_detectLevel);
      _sonardyneQuality->setValue     ((double)_driver->_quality);
      _sonardyneDoppler->setValue     ((double)_driver->_doppler);
      _sonardyneAcceptance->setValue  ((short) _driver->_acceptance);
      _sonardyneClipped->setValue     ((short) _driver->_clipped);
   }
   else if( _simDriver )
   {
      _sonardyneRange->setValue       ((double)_simDriver->_r);
      _sonardyneX->setValue           ((double)_simDriver->_x);
      _sonardyneY->setValue           ((double)_simDriver->_y);
      _sonardyneZ->setValue           ((double)_simDriver->_z);
      _sonardyneTAT->setValue         ((double)_simDriver->_tat);
      _sonardyneStatus->setValue      ((short) _simDriver->_status);
      _sonardyneSigLevel->setValue    ((double)_simDriver->_sigLevel);
      _sonardyneDetectLevel->setValue ((double)_simDriver->_detectLevel);
      _sonardyneQuality->setValue     ((double)_simDriver->_quality);
      _sonardyneDoppler->setValue     ((double)_simDriver->_doppler);
      _sonardyneAcceptance->setValue  ((short) _simDriver->_acceptance);
   }
}
