#include <process.h>
#include <time.h>
#include "MetraByteServer.h"
#include "Syslog.h"

MetraByteServer::MetraByteServer(const char *name, 
				 SerialParameters *serialParams)
  : MetraByteIF_SK()
{
  _serialParams = serialParams;
  _output = new MetraByteOutput(SharedData::ReadWrite);
}


MetraByteServer::~MetraByteServer()
{
  delete _output;
}


virtual long MetraByteServer::IandV(double *current, double *voltage, long *t)
{
  _output->read();
  *current = _output->data.current;
  *voltage = _output->data.voltage;
  *t = _output->data.sampleTime.tv_sec;
  return 0;
}

virtual long MetraByteServer::current(float *value, long *t)
{
  _output->read();
  *value = _output->data.current;
  *t = _output->data.sampleTime.tv_sec;
  return 0;
}

virtual long MetraByteServer::voltage(float *value, long *t)
{
  _output->read();
  *value = _output->data.voltage;
  *t = _output->data.sampleTime.tv_sec;
  
  return 0;
}


void MetraByteServer::name(DeviceIF::Name name)
{
  strcpy(name, "MetraByte");
}

void MetraByteServer::serialNumber(DeviceIF::Name id)
{
  strcpy(id, "XXX");
}

DeviceIF::Status MetraByteServer::initialize()
{
  return DeviceIF::Ok;
}

DeviceIF::Status MetraByteServer::powerOn()
{
  return DeviceIF::Ok;
}

DeviceIF::Status MetraByteServer::powerOff()
{
  return DeviceIF::Ok;
}

DeviceIF::Status MetraByteServer::status()
{
  return DeviceIF::Ok;
}


int MetraByteServer::spawnAuxTasks()
{
  char *program = "metrabyteDriver";
  char errorBuf[256];
 
  pid_t pid;
 
  switch ((pid = fork())) {
     
  case 0:
    // In child
    // Execute server program

    execlp(program, program, "-serial", _serialParams->string(), 0);

    sprintf(errorBuf, 
	    "Task::spawnServer() - execlp() of \"%s\" failed", program);

    perror(errorBuf);
 
    break;

  case -1:
    perror("Task::spawnServer() - fork() failed");
    return -1;
  }
    
  return 0;
}
 

