/****************************************************************************/
/* Copyright (c) 2012 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : DeltaTLog.cc                                                  */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 09/17/2012                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include "DeltaTLog.h"
#include "TimeP.h"

class DeltaT;

DeltaTLog::DeltaTLog(uint16_t maxbeams, DataLog::FileFormat fileFormat)
    : DataLogWriter(DeltaTLogName, fileFormat, AutoTimeStamp),
      _maxbeams(maxbeams)
{
  init();
}

void DeltaTLog::init(void)
{
  if (_maxbeams > IDT_MAX_BEAMS) _maxbeams = IDT_MAX_BEAMS;

  char dname[100];
  sprintf(dname, "%s.data", name());
  setMnemonic(dname);

  sprintf(dname, "%s.DeltaT_Altitude", name());
  addField((_dt_altitude = new FloatData(dname)));

  sprintf(dname, "%s.NumberOfBeams", name());
  addField((_nbeams = new IntegerData(dname)));

  sprintf(dname, "%s.PingNumber", name());
  addField((_ping_number = new FloatData(dname)));

  // Create the data fields for the beam data
  //
  for (int i = 0; i < _maxbeams; i++) {
    sprintf(dname, "%s.BeamRange%d", name(), i+1);
    addField((_beam_ranges[i] = new FloatData(dname)));
    sprintf(dname, "%s.Intensity%d", name(), i+1);
    addField((_intensities[i] = new IntegerData(dname)));
  }

  sprintf(dname, "%s.InterrogationTime", name());
  addField((_interrogation_time = new DoubleData(dname)));

  sprintf(dname, "%s.DataLatency", name());
  addField((_data_latency = new FloatData(dname)));

  sprintf(dname, "%s.RepetitionRate", name());
  addField((_repetition_rate = new FloatData(dname)));
}


DeltaTLog::~DeltaTLog()
{
  if (_dt_altitude) delete _dt_altitude;
  if (_nbeams) delete _nbeams;
  if (_ping_number) delete _ping_number;
  if (_data_latency) delete _data_latency;
  if (_repetition_rate) delete _repetition_rate;
  for (int i = 0; i < _maxbeams; i++) {
    if (_beam_ranges[i]) delete _beam_ranges[i];
    if (_intensities) delete _intensities[i];
  }
}


void DeltaTLog::setFields(Idt83pData *data)
{
   _dt_altitude->setValue(data->altitude);
   _interrogation_time->setValue(data->pingtime);
   _nbeams->setValue(data->nbeams);
   _ping_number->setValue((float)data->pingnumber);

   // Convert from tenths of a millisecond to milliseconds
   _data_latency->setValue(0.);

   _repetition_rate->setValue((float)(data->interval));

   for (int i = 0; i < data->nbeams && i < _maxbeams; i++) {
      _beam_ranges[i]->setValue(data->range[i]);
      _intensities[i]->setValue(data->intense[i]);
   }
}
