#include "ecoflDriver.h"
#include "Syslog.h"

#define MaxRecordBytes 1024 
#define ReadTimeout 10000

// Serial parameters
#define Baud 19200
#define DataBits 8
#define StopBits 1
#define Parity "NONE"

ecoflLog::ecoflLog(DataLog::FileFormat fileFormat) 
  : DataLogWriter(EcoflLogName, fileFormat, AutoTimeStamp)
{
char name[20];

  //default long name, UNKNOWN units
  addField(_Chl_Ref= new IntegerData("Chl_Ref"));
  _Chl_Ref->setUnits("RAW");

  addField(_Chl_Sig = new IntegerData("Chl_Sig"));
  _Chl_Sig->setUnits("RAW");

  addField(_Thermistor = new IntegerData("Thermistor"));
  _Thermistor->setUnits("RAW");

}


ecoflLog::~ecoflLog()
{

  delete _Chl_Ref;
  delete _Chl_Sig;
  delete _Thermistor;
}


void ecoflLog::setFields()
{
  // Doesn't need to do anything, as ecoflDriver::processRecord() fills
  // field values directly.
}



ecoflDriver::ecoflDriver(SerialDevice *device, Boolean verbose)
  : StreamSerialDriver("ecoflDriver", device, MaxRecordBytes, "\xd", 
		       ReadTimeout)
 {
  _verbose = verbose;
  _log = new ecoflLog(DataLog::BinaryFormat);
}



ecoflDriver::~ecoflDriver()
{
  delete _log;
}


DeviceIF::Status ecoflDriver::initialize()
{
  // Initialize serial port
  _device->setLineFormat(Baud, DataBits, StopBits, Parity);

  return DeviceIF::Ok;
}



DeviceIF::Status ecoflDriver::processRecord(unsigned char *record, 
					      int nRecordBytes)
{
  Boolean debug = _verbose;
  char *val;
  int ntokens = 0;
  int day, month, year;
  int hour, min, sec; 
  int chl_ref, chl_sig, thermistor;

  dprintf("ecoflDriver::processRecord - record=\n%s", record);
  ntokens = sscanf((char *)record,"%d/%d/%d %d:%d:%d %d %d %d",
		   &day, &month, &year,
	     	   &hour, &min, &sec,
		   &chl_ref, &chl_sig, &thermistor);
  if (ntokens != 9) {
	Syslog::write("ecoflDriver::processRecord - incorrect number of tokens: %d\n", ntokens);	
        return DeviceIF::Error;
  }
  if (_verbose) {
    printf("date:%d/%d/%d ", day, month, year);
    printf("time:%d:%d:%d ", hour, min, sec);
    printf("chl_ref:%d chl_sig:%d thermistor:%d\n", chl_ref, chl_sig, thermistor);
  }

  _log->_Chl_Ref->setValue(chl_ref);
  _log->_Chl_Sig->setValue(chl_sig);
  _log->_Thermistor->setValue(thermistor);
  _log->write();

  return DeviceIF::Ok;
}

