#include "DataLogWriter.h"
#include "epiBattLog.h"
#include "epiBatt.h"
#include "TimeP.h"
#include "Syslog.h"

epiBattLog::epiBattLog(epiBatt *epiBatt, DataLog::FileFormat fileFormat, const char *name)
           :DataLogWriter(name, fileFormat, AutoTimeStamp) 
{
   //setMnemonic("epi");
   char nameStr[64];
   sprintf(nameStr,"%s.data",name);
   setMnemonic(nameStr);
  _epiBatt = epiBatt;

  char buf[100];
  Boolean debug = False;

  // Create and initialize data structures for each battery in the array.
  // And setup units and longname fields for logging
  //
  _data = new battdata;
  char fieldName[64];

  sprintf(fieldName,"%s.gasGuage",name);
  addField(_data->gasGauge = new DoubleData(fieldName));
  _data->gasGauge->setUnits("Ah");
  _data->gasGauge->setLongName("Elapsed Capacity in Ah");

  for (int i=0;i<8;i++)
  {
     sprintf(buf, "%s.voltage_%d", name,i);
     addField((_data->cellVoltage[i] = new DoubleData(buf)));
     _data->cellVoltage[i]->setUnits("Volts");
  }

  sprintf(fieldName,"%s.current",name);
  addField((_data->current = new DoubleData(fieldName)));
  _data->current->setUnits("Amps");


  for (i=0;i<9;i++)
  {
     sprintf(buf, "%s.temp_%d", name, i);
     addField(_data->temp[i] = new IntegerData(buf));
     _data->temp[i]->setUnits("Centigrade");
  }
  
  sprintf(fieldName,"%s.rH",name);
  addField((_data->rH               = new IntegerData(fieldName)));
  sprintf(fieldName,"%s.balance",name);
  addField((_data->balance          = new IntegerData(fieldName)));
  sprintf(fieldName,"%s.tempAlertFlag",name);
  addField((_data->tempAlertFlag    = new IntegerData(fieldName)));
  sprintf(fieldName,"%s.voltAlertFlag",name);
  addField((_data->voltAlertFlag    = new IntegerData(fieldName)));
  sprintf(fieldName,"%s.batteryStateFlag",name);
  addField((_data->batteryStateFlag = new IntegerData(fieldName)));
}


epiBattLog::~epiBattLog()
{
   delete _data->gasGauge;
   for (int i=0;i<8;i++)
   {
      delete _data->cellVoltage[i];
   }
   delete _data->current;
   for (i=0;i<9;i++)
   {
      delete _data->temp[i];
   }
   delete _data->rH;
   delete _data->balance;
   delete _data->tempAlertFlag;
   delete _data->voltAlertFlag;
   delete _data->batteryStateFlag;
   
   delete _data;
}


void epiBattLog::setFields()
{

   _data->gasGauge->setValue(_epiBatt->_battState.gasGauge);

   for (int i=0;i<8;i++)
   {
      _data->cellVoltage[i]->setValue(_epiBatt->_battState.cellVoltage[i]);
   }
   _data->current->setValue(_epiBatt->_battState.current);
   for (i=0;i<9;i++)
   {
      _data->temp[i]->setValue(_epiBatt->_battState.temp[i]);
   }
   _data->rH->setValue(_epiBatt->_battState.rH);
   _data->balance->setValue(_epiBatt->_battState.balance);
   _data->tempAlertFlag->setValue(_epiBatt->_battState.tempAlertFlag);
   _data->voltAlertFlag->setValue(_epiBatt->_battState.voltAlertFlag);
   _data->batteryStateFlag->setValue(_epiBatt->_battState.batteryStateFlag);
}

