/****************************************************************************/
/* Copyright (c) 2006 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : IsusServer.cc                                                 */
/* Author   : Frederic Py                                                   */
/* Project  : Autonomy                                                      */
/* Version  : 1.0                                                           */
/* Created  : 11/01/2007                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include <process.h>

#include <time.h>
#include "IsusServer.h"
#include "Syslog.h"

IsusServer::IsusServer(const char *name, SerialParameters *serialParams,
			     const char *instName)
  : IsusIF_SK()
{
  _serialParams = serialParams;
  _output = new IsusOutput(SharedData::ReadWrite);
  _output->data._deviceReady = False;

  _output->write();
}


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


void IsusServer::name(DeviceIF::Name name)
{
  strcpy(name, "Isus");
}


void IsusServer::serialNumber(DeviceIF::Name number)
{
  strcpy(number, "XXX");
}


DeviceIF::Status IsusServer::initialize()
{
  // Dummy implementation for now
  return DeviceIF::Ok;
}


DeviceIF::Status IsusServer::powerOn()
{
  // Dummy implementation for now
  return DeviceIF::Ok;
}


DeviceIF::Status IsusServer::powerOff()
{
  // Dummy implementation for now
  return DeviceIF::Ok;
}


DeviceIF::Status IsusServer::status()
{
  // Dummy implementation for now
  return DeviceIF::Ok;
}


DeviceIF::Status IsusServer::dataLoggingOn()
{
  // Dummy implementation for now
  return DeviceIF::Ok;
}


DeviceIF::Status IsusServer::dataLoggingOff()
{
  // Dummy implementation for now
  return DeviceIF::Ok;
}

Boolean IsusServer::ready()
{
  _output->read();
  if (!_output->data._deviceReady)
    return False;
  else
    return True;
}

DeviceIF::Status IsusServer::getData(IsusIF::Data *data)
{
  Boolean debug = False;

  if (!ready()) {
    dprintf("isusServer::getData() - device NOT ready");
    return DeviceIF::Error;
  }

  dprintf("isusServer::getData() - device ready");
  memcpy(data, &(_output->data), sizeof(IsusIF::Data));
  return DeviceIF::Ok;
}


int IsusServer::spawnAuxTasks()
{
 
  char *program = "isus";
  char errorBuf[256];
  char buf[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;
}

