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

const Boolean NewNames = True;

EchoSounderLog::EchoSounderLog(EchoSounderDriver *echoSounder, 
			       DataLog::FileFormat format,
			       Boolean profile)
  : _driver(echoSounder), _simDriver(0), 
    DataLogWriter(EchoSounderLogName, format, AutoTimeStamp),
    _profile(profile)
{
   Syslog::write("EchoSounderLog:: Constructor starting.");
   init();
   Syslog::write("EchoSounderLog:: Constructor finishing.");
}

EchoSounderLog::EchoSounderLog(SimulatedEchoSounder *echoSounder, 
			       DataLog::FileFormat format,
			       Boolean profile)
  : _driver(0), _simDriver(echoSounder), 
    DataLogWriter(EchoSounderLogName, format, AutoTimeStamp),
    _profile(profile)
{
   init();
}

void EchoSounderLog::init()
{
   if(NewNames) setMnemonic("es.data");
   else         setMnemonic("dataES");

  if(NewNames) addField(_ESstatus    = new ShortData("es.status"));
  else         addField(_ESstatus    = new ShortData("ESstatus"));
  _ESstatus->setLongName("Command status; 65=> Accepted; 01=> Rejected.");
  _ESstatus->setUnits   ("None");

  if(NewNames) addField(_EStrain     = new ShortData("es.train"));
  else         addField(_EStrain     = new ShortData("EStrain"));
  _EStrain->setLongName("Train angle");
  _EStrain->setUnits   ("Degreesx10");

  if(NewNames) addField(_ESrange     = new ShortData("es.range"));
  else         addField(_ESrange     = new ShortData("ESrange"));
  _ESrange->setLongName("First return range.");
  _ESrange->setUnits   ("Centimeters");


  if(NewNames) addField(_ESaskTime     = new ShortData("es.askTime"));
  else         addField(_ESaskTime     = new ShortData("ESaskTime"));
  _ESaskTime->setLongName("Arm the sonar.");
  _ESaskTime->setUnits   ("milliseconds");

  if(NewNames) addField(_ESansTime     = new ShortData("es.ansTime"));
  else         addField(_ESansTime     = new ShortData("ESansTime"));
  _ESansTime->setLongName("Data received from the sonar.");
  _ESansTime->setUnits   ("milliseconds");

  //_nf=this->nFields();         //Gets around "protected" problem
  //printf("EchoSounderLog::nFields = %d\n", this->nFields());

  if(_simDriver) 
  {
     addField(_ESsimGrazing   = new FloatData("es.simGrazing"));
     _ESsimGrazing->setLongName("Grazing angle");
     _ESsimGrazing->setUnits("radians");
  }


  if( !_profile )
  {
     char nameStr[32];
     for( int i=0; i< EchoSounderIF::EchoArraySize; i++ )
     {
	if(NewNames) sprintf(nameStr, "es.raw%d", i);
	else         sprintf(nameStr, "ESraw%d", i);
	//addField(_ESraw[i]    = new CharData(nameStr));
	addField(_ESraw[i]    = new ShortData(nameStr));
	_ESraw[i]->setLongName("Raw echo data.");
	_ESraw[i]->setUnits   ("None");
     }
  }

}


EchoSounderLog::~EchoSounderLog()
{
  delete  _ESstatus;
  delete  _ESrange;
  delete  _EStrain;
  delete  _ESaskTime;
  delete  _ESansTime;
  if( !_profile ) for( int i=0; i< EchoSounderIF::EchoArraySize; i++ ) {delete _ESraw[i];};
  if( _simDriver ) delete _ESsimGrazing;
}


void EchoSounderLog::setFields()
{
   if( _driver )
   {
      _ESstatus->setValue             ((short)_driver->_serialStatus);
      _EStrain ->setValue             ((short)_driver->_train);
      //
      // _range is integer cm.
      _ESrange ->setValue             ((short)_driver->_range);
      _ESaskTime->setValue            (_driver->_askTime);
      _ESansTime->setValue            (_driver->_ansTime);
      if( !_profile ) 
      {
	 for(int i=0;i<EchoSounderIF::EchoArraySize;i++)
	 {
	    _ESraw[i]->setValue((short) _driver->_echoData[i]);	 
	 }
      }
   }
   else if( _simDriver )
   {
      _ESstatus->setValue             ((short)_simDriver->_serialStatus);
      _EStrain ->setValue             ((short)_simDriver->_train);
      _ESrange ->setValue             ((short)_simDriver->_range);
      _ESaskTime->setValue            (_simDriver->_askTime);
      _ESansTime->setValue            (_simDriver->_ansTime);
      if( !_profile ) 
      {
	 for(int i=0;i<EchoSounderIF::EchoArraySize;i++)
	 {
	    _ESraw[i]->setValue((short) _simDriver->_echoData[i]);	 
	 }
      }
      _ESsimGrazing->setValue         (_simDriver->_grazing);
   }
}
