#include "LOPC.h"
#include "Syslog.h"
#include <sys/socket.h>
#include <sys/inline.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <time.h>

#define MaxRecordBytes 2000 
#define ReadTimeout 10000
#define InvalidPmt -9999999.

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


LOPCDriver::LOPCDriver(SerialDevice *device, Boolean verbose)
  : StreamSerialDriver("LOPCDriver", device, MaxRecordBytes, "\xd\xa", 
		       ReadTimeout)
{
  _device = device;
  _verbose = verbose;

  char *auvLogDir = getenv(AuvLogDirName);
  if (auvLogDir == NULL) {
	Syslog::write("LOPC::LOPC() - environment variable $s not set\n",
		      AuvLogDirName);
	exit(1);
  }
  char BinFileName[100];
  sprintf(BinFileName, "%s/%s/lopc.bin", auvLogDir, LatestLogDirName);

  _logFd = open(BinFileName, O_CREAT|O_WRONLY|O_APPEND, 0666);
  if (_logFd < 0) {
	Syslog::write("LOPC::LOPC() - unable to open log file %s\n", BinFileName);
	exit(1);
  }
}



LOPCDriver::~LOPCDriver()
{
    close(_logFd);
}


DeviceIF::Status LOPCDriver::initialize()
{
  Syslog::write("in initialize\n");
  _device->raw();
  int bufsize = 30000;
  setsockopt(_device->getFd(), SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(int));
  int readsize = 1000;
  setsockopt(_device->getFd(), SOL_SOCKET, SO_RCVLOWAT, &readsize, sizeof(int));
  struct timeval socktime = {0,500000};
  setsockopt(_device->getFd(), SOL_SOCKET, SO_RCVTIMEO, &socktime, sizeof(struct timeval));
  _device->write("A\n", 3);
  return DeviceIF::Ok;
}


DeviceIF::Status LOPCDriver::readRecord(unsigned char *record,
					  int maxRecordBytes,
					  const char *recordTerminator,
					  unsigned readTimeout,
					  int *nBytesRead)
{
char buf[1000];
struct timespec timeStamp;
int nbytes;
static struct timespec oldTimeStamp={0,0};

   clock_gettime(CLOCK_REALTIME, &timeStamp);
   if (timeStamp.tv_sec - oldTimeStamp.tv_sec > 5) {
	oldTimeStamp.tv_sec = timeStamp.tv_sec;
        oldTimeStamp.tv_nsec = timeStamp.tv_nsec;
   	nbytes = sprintf(buf,"%.4f",
      		(double)(timeStamp.tv_sec + timeStamp.tv_nsec/1.e9));
	buf[nbytes] = 0xd; nbytes +=1;
        write(_device->getFd(), buf, nbytes); //write out timestamp
   }
   int bytesRead = read(_device->getFd(), buf, 1000);

   if (bytesRead > 0) write(_logFd, buf, bytesRead);
    return DeviceIF::Ok;
}
	
DeviceIF::Status LOPCDriver::processRecord(unsigned char *record, 
					      int nRecordBytes)
{
  return DeviceIF::Ok;
}

