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

#include <time.h>
#include "MultibeamerIF_SK.h"
#include "MultibeamerServer.h"
#include "FloatAttribute.h"
#include "AngleAttribute.h"

MultibeamerServer::MultibeamerServer(const char *configFileName) 
    : _attributes("MultibeamerServer")
{
  _input = new MultibeamerInput(SharedData::ReadWrite);
  _output = new MultibeamerOutput(SharedData::ReadWrite);

  //AttributeParser::parse(configFileName, &_attributes);
}


MultibeamerServer::~MultibeamerServer()
{
  delete _input;
  delete _output;
}


void MultibeamerServer::name(DeviceIF::Name name)
{
  strcpy(name, "Multibeamer");
}

double MultibeamerServer::range()
{
  _output->read();
  return _output->data.range;
}

void MultibeamerServer::get_status(double *range, TimeIF::TimeSpec *updateTime,
                                    Boolean *goodComms, Boolean *ready)
{
  _output->read();
  *range       = _output->data.range;
  *updateTime  = _output->data.updateTime;
  *goodComms   = _output->data.goodComms;
  *ready       = _output->data.ready;

  return;
}

int MultibeamerServer::spawnAuxTasks()
{
  char *program = "multibeamer";

  char errorBuf[256];
  char buf[256];
 
  pid_t pid;
 
  switch ((pid = fork())) {
     
  case 0:
    // In child
    // Execute driver program
    execlp(program, program, (char *)0);

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

    perror(errorBuf);
 
    break;

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

  return 0;
}
