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

BluefinBattServer::BluefinBattServer(const char *name, int numbatt,
                                     int argc, char** argv) :
	BluefinBatteryIF_SK(BluefinBatteryIFServerName)
{
  Boolean debug = True;
  Syslog::write("BluefinBattServer: servicename=%s\n", BluefinBatteryIFServerName);
  _numBatt = numbatt;
  _output = new BluefinBattOutput(numbatt);
  _argv = argv;
//
//  _argv[0] = '\0';
//  for (int i = 0; i < argc; i++)
//  {
//    strcat(_argv, argv[i]);
//    strcat(_argv, " ");
//  }
//
}

BluefinBattServer::~BluefinBattServer()
{
  if (_output) delete _output;
//  if (_argv) delete _argv;
}

short BluefinBattServer::getBatteryQuantity() { return _numBatt; }

void  BluefinBattServer::getBatteryData(short battnum,
                                        BluefinBatteryIF::BfBattData *data)
{
  if (battnum < 1 || battnum > _numBatt) return;
  
  _output->read();
  int b = battnum - 1;
  
  data->state = _output->data[b].state;
  data->fault = _output->data[b].fault;
  data->battSN = _output->data[b].battSN;
  data->voltage = _output->data[b].voltage;
  data->current = _output->data[b].current;
  data->temp = _output->data[b].temp;
  data->minvoltage = _output->data[b].minvoltage;
  data->maxvoltage = _output->data[b].maxvoltage;
  data->waterleak = _output->data[b].waterleak;
  data->capacity = _output->data[b].capacity;

  return;
}

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

    Syslog::write("BluefinBattServer: exec-ing %s %s %s", program, _argv[0], _argv[1]);
    execlp(program, program, _argv[0], _argv[1], 0);

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

    perror(errorBuf);
 
    break;

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

