/****************************************************************************/
/* Copyright (c) 2013 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : Delta_T.cc                                                  */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 01/22/2013                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/

#include "Delta_T.h"
#include "BooleanAttribute.h"
#include "IntegerAttribute.h"
#include "FloatAttribute.h"
#include "StringAttribute.h"
#include "VerticalModeAttribute.h"
#include "MissionTimeAttribute.h"
#include "MathP.h"
#include "Syslog.h"

#define DEFAULT_STRING_ATTR "\"\""
#define NotSpecified -100000.0

Delta_T::Delta_T()
  : _server(NULL), Behavior(DeltaTBehaviorName, Sequential)
{
  _init = False;

  Boolean debug = False;

  //  Controls logging on the MVC 
  attributes.add(new IntegerAttribute("logMode",
                                      "MVC Driver Logging on/off switch (1=On,0=Off)",
				      &_logMode, -1));
  //  Controls 837 data logging on the  Imagenex
  attributes.add(new IntegerAttribute("idtMode",
                                      "837 Data Logging on/off switch (1=On,0=Off)",
				      &_idtMode, -1));

  attributes.add(new IntegerAttribute("soundSpeed",
                                      "Speed of Sound in dm/sec (14000 to 16000)",
				      &_sos, -1));
  attributes.add(new IntegerAttribute("receiveGain",
                                      "Gain in dB (1 to 20)",
				      &_gain, -1));
  attributes.add(new IntegerAttribute("gainEq",
                                      "Gain Equalization on/off switch (1=On,0=Off)",
				      &_gainEq, -1));
  attributes.add(new IntegerAttribute("range",
                                      "Set sonar range (1 to 100)",
				      &_range, -1));
  attributes.add(new IntegerAttribute("nBeams",
                                      "The number of beams to use (120, 240, 480)",
				      &_nBeams, -1));
  attributes.add(new IntegerAttribute("beamWidth",
                                      "Width of sonar beam (0=Wide,1=Normal,2=Narrow,3=Narrow-Mixed)",
				      &_width, -1));
  attributes.add(new IntegerAttribute("sectorSize",
                                      "Size of scan area (30deg, 60, 90, 120)",
				      &_size, -1));
  attributes.add(new IntegerAttribute("averaging",
                                      "Number of shots to average (0->off, 3, 5, 7)",
				      &_avg, -1));
}

Delta_T::~Delta_T()
{
   if( !_server) 
   {
      delete _server;
      _server = NULL;
   }
}


Boolean Delta_T::shouldBehaviorStart( void ) 
{
  if (!_server) {
    try
    {
      _server = new DeltaTIF(DeltaTIFServerName);
    }
    catch (SharedObjectClient::MissingServer e) 
    {
      Syslog::write("Delta_T::Delta_T() - Missing server: %s; "
		    "continuing.\n",
		    e.msg);
      _server = NULL;
      return False;
    }
  }

  return horizontalSequence();
}

void Delta_T::execute()
{
  DeviceIF::Status status;
  Boolean debug = True;

  // Perform the actions
  if (_logMode >= 0)
  {
    unsigned char errorCnt = 0;
    if (_logMode != 0)
    {
      Syslog::write("Delta_T Behavior: Starting logging");
      _server->start();
    }
    else
    {
      Syslog::write("Delta_T Behavior: Stopping logging");
      _server->stop();
    }
    _logMode = -1;
  }

  if (_idtMode >= 0)
  {
    if (_idtMode != 0)
    {
      Syslog::write("Delta_T Behavior: Starting 837 Data logging");
      _server->set_idt_logging(True);
    }
    else
    {
      Syslog::write("Delta_T Behavior: Stopping 837 Data logging");
      _server->set_idt_logging(False);
    }
    _idtMode = -1;
  }

  if (_sos >= 14000) {
    _server->set_sos(_sos);
  }

  if (_gain > 0) {
    _server->set_gain(_gain);
  }

  if (_gainEq >= 0) {
    _server->set_gain_eq(_gainEq);
  }

  if (_range > 1) {
    _server->set_range(_range);
  }

  if (_nBeams > 0) {
    _server->set_nbeams(_nBeams);
  }

  if (_width >= 0) {
    _server->set_beam_width(_width);
  }

  if (_size >= 30) {
    _server->set_sector_size(_size);
  }

  if (_avg >= 0) {
    _server->set_averaging(_avg);
  }

  setState(Finished);

  return;
}


Boolean Delta_T::validInput()
{
  Boolean valid = False;

//  if (_logMode != -1)
    valid = True;

  return valid;
}

