/****************************************************************************/
/* 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 "DataLogWriter.h"
#include "DeltaTLog.h"
#include "DeltaT.h"
#include "ShortData.h"
#include "TimeP.h"
#include "Syslog.h"

class DeltaT;

DeltaTLog::DeltaTLog(DeltaT *dt, 
			     DataLog::FileFormat fileFormat) 
   : _delta_t(dt), _sim_delta_t(0),
    DataLogWriter(DeltaTLogName, fileFormat, AutoTimeStamp) 
{
   init();
}

DeltaTLog::DeltaTLog(SimulatedDeltaT *dt, 
			     DataLog::FileFormat fileFormat) 
   : _delta_t(0), _sim_delta_t(dt),
    DataLogWriter(DeltaTLogName, fileFormat, AutoTimeStamp) 
{
   init();
}


void DeltaTLog::init(void)
{
  setMnemonic("idt.data");

  addField((_dt_altitude = new FloatData("idt.DeltaT_Altitude")));
  addField((_nbeams = new IntegerData("idt.NumberOfBeams")));

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


DeltaTLog::~DeltaTLog()
{
  delete _dt_altitude;
  delete _nbeams;
  for (int i = 0; i < 120; i++) {
    delete _beam_ranges[i];
    delete _intensities[i];
  }
}


void DeltaTLog::setFields()
{
   Boolean debug = False;


   if( _delta_t )
   {

      DeltaTOutput *output = _delta_t->_output;

      _dt_altitude->setValue(output->data.dt_range);
      _nbeams->setValue(output->data.nbeams);

      // Straight copy if nbeams is 120
      //
      if (_nbeams->value() == 120) {
	 for (int i = 0; i < 120; i++) {
	    _beam_ranges[i]->setValue(output->data.beam_ranges[i]);
	    _intensities[i]->setValue(output->data.intensities[i]);
	 }
      }
      else {
	 // Otherwise, some multiple of 120 so we average values
	 // and place the results into the data fields.
	 //
	 int navg = _nbeams->value()/120;
	 dprintf("Averaging %d beams per value\n", navg);
	 for (int i = 0; i < 120; i++) {
	    float avg_r = 0.;
	    int   avg_i = 0;
	    for (int j = 0; j < navg; j++) {
	       avg_r += output->data.beam_ranges[(i*navg)+j];
	       avg_i += output->data.intensities[(i*navg)+j];
	    }
	    avg_r = avg_r/navg;
	    avg_i = avg_i/navg;
	    _beam_ranges[i]->setValue(avg_r);
	    _intensities[i]->setValue(avg_i);
	 }
      }

   }
   else if( _sim_delta_t )
   {

      _dt_altitude->setValue(_sim_delta_t->_range);
      _nbeams->setValue(_sim_delta_t->_nbeams);
      //
      // Straight copy if nbeams is 120
      //
      if (_nbeams->value() == 120) {
	 for (int i = 0; i < 120; i++) {
	    _beam_ranges[i]->setValue(_sim_delta_t->_beam_ranges[i]);
	    _intensities[i]->setValue(_sim_delta_t->_intensities[i]);
	 }
      }
   }

}



