#include "DataLogWriter.h"
#include "BluefinBattLog.h"
#include "BluefinBatt.h"
#include "TimeP.h"
#include "Syslog.h"

BluefinBattLog::BluefinBattLog(BluefinBatt *bluefinBatt, 
			       DataLog::FileFormat fileFormat,
			       int numbatts) 
    : _numBatts(numbatts),
      DataLogWriter(BluefinBattLogName, fileFormat, AutoTimeStamp) 
{
  char buf[30];
  setMnemonic("bluefinBattLog");

  // Create and initialize data structures for each battery in the array
  //
  _data = new struct battdata[_numBatts];

  for (int i = 0; i < _numBatts; i++)
  {
    sprintf(buf,      "voltage_%d", i);
    addField((_data[i].voltage = new DoubleData(buf)));

    sprintf(buf,      "current_%d", i);
    addField((_data[i].current = new DoubleData(buf)));

    sprintf(buf,      "temp_%d", i);
    addField((_data[i].temp = new DoubleData(buf)));

    sprintf(buf,      "minvoltage_%d", i);
    addField((_data[i].minvoltage = new DoubleData(buf)));

    sprintf(buf,      "maxvoltage_%d", i);
    addField((_data[i].maxvoltage = new DoubleData(buf)));

    sprintf(buf,      "waterleak_%d", i);
    addField((_data[i].waterleak = new IntegerData(buf)));

    sprintf(buf,      "capacity_%d", i);
    addField((_data[i].capacity = new DoubleData(buf)));
  }

  _bluefinBatt = bluefinBatt;
}


BluefinBattLog::~BluefinBattLog()
{
  for (int i = 0; i < _numBatts; i++) {
    delete _data[i].voltage;
    delete _data[i].current;
    delete _data[i].temp;
    delete _data[i].minvoltage;
    delete _data[i].maxvoltage;
    delete _data[i].waterleak;
    delete _data[i].capacity;
  }

  delete _data;
}


void BluefinBattLog::setFields()
{

  // Set values
  for (int i = 0; i < _numBatts; i++)
  {
    _data[i].voltage->setValue(_bluefinBatt->_output->data[i].voltage);
    _data[i].current->setValue(_bluefinBatt->_output->data[i].current);
    _data[i].temp->setValue(_bluefinBatt->_output->data[i].temp);
    _data[i].minvoltage->setValue(_bluefinBatt->_output->data[i].minvoltage);
    _data[i].maxvoltage->setValue(_bluefinBatt->_output->data[i].maxvoltage);
    _data[i].waterleak->setValue(_bluefinBatt->_output->data[i].waterleak);
    _data[i].capacity->setValue(_bluefinBatt->_output->data[i].capacity);
  }

}

