/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : ParosciServer.cc                                              */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include <process.h>

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

ParosciServer::ParosciServer(const char *name, SerialParameters *serialParams )
  : DepthSensorIF_SK()
{
  _output = new ParosciOutput(SharedData::ReadWrite);
  _output->data.deviceStatus = DeviceIF::Initializing;
  _output->write();
  _serialParams = serialParams;
}


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


void ParosciServer::name(DeviceIF::Name name)
{
  strcpy(name, "ParoSci");
}


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


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


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


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


DeviceIF::Status ParosciServer::status()
{
  _output->read();
  return _output->data.deviceStatus;
}


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


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


DeviceIF::Status ParosciServer::depth(double *value, TimeIF::TimeSpec *t)
{
  Boolean debug = True;

  _output->read();

  if (_output->data.deviceStatus == DeviceIF::Initializing) {
    dprintf("ParosciServer::depth() - initializing");
    return DeviceIF::Initializing;
  }
  
  if (_output->data.deviceStatus == DeviceIF::Error) {
    dprintf("ParosciServer::depth() - error");
    return DeviceIF::Error;
  }

  *value = _output->data.depth;
  t->seconds = (long)_output->data.updateTime.tv_sec;
  t->nanoSeconds = (long)_output->data.updateTime.tv_nsec;

  return DeviceIF::Ok;
}

DeviceIF::Status ParosciServer::pressure(double *value, TimeIF::TimeSpec *t)
{
  Boolean debug = True;
  _output->read();

  if (_output->data.deviceStatus == DeviceIF::Initializing) {
    dprintf("ParosciServer::depth() - initializing");
    return DeviceIF::Initializing;
  }
  
  if (_output->data.deviceStatus == DeviceIF::Error) {
    dprintf("ParosciServer::depth() - error");
    return DeviceIF::Error;
  }

  *value = _output->data.pressure;
  t->seconds = (long)_output->data.updateTime.tv_sec;
  t->nanoSeconds = (long)_output->data.updateTime.tv_nsec;  

  return DeviceIF::Ok;
}

DeviceIF::Status ParosciServer::temp(double *value, TimeIF::TimeSpec *t)
{
  Boolean debug = True;
  _output->read();

  if (_output->data.deviceStatus == DeviceIF::Initializing) {
    dprintf("ParosciServer::depth() - initializing");
    return DeviceIF::Initializing;
  }
  
  if (_output->data.deviceStatus == DeviceIF::Error) {
    dprintf("ParosciServer::depth() - error");
    return DeviceIF::Error;
  }

  *value = _output->data.temp;
  t->seconds = (long)_output->data.updateTime.tv_sec;
  t->nanoSeconds = (long)_output->data.updateTime.tv_nsec;
  
  return DeviceIF::Ok;
}

DeviceIF::Status ParosciServer::calibrate()
{
  // Not implemented
  Syslog::write("ParosciServer::calibrate() - not implemented");
  return DeviceIF::Ok;
}

int ParosciServer::spawnAuxTasks()
{
  char *program = "parosci";
  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;
}

