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

LayeredControlServer::LayeredControlServer( int nArgc, char **nArgv )
  : LayeredControlIF_SK()
{
  _argv = nArgv;
  _argc = nArgc;

  try {
    _input = new LayeredControlInput(SharedData::Write, True);
  }
  catch (...) {
    Syslog::write("LayeredControlServer::LayeredControlServer() - "
		  "LayeredControlInput constructor failed\n");

    return;
  }


  try {
    _output = new LayeredControlOutput(SharedData::Read, True);
  }
  catch (...) {
    Syslog::write("LayeredControlServer::LayeredControlServer() - "
		  "LayeredControlOutput constructor failed\n");

    return;
  }

}


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


double LayeredControlServer::elapsedMissionTime()
{
  _output->read();
  return _output->data.elapsedSeconds;
}


void LayeredControlServer::abortMission()
{
  _input->data.abort = True;
  _input->write();
}


Boolean LayeredControlServer::abortingMission()
{
  _output->read();
  if (_output->data.missionState == LayeredControlIF::Aborting)
    return True;
  else
    return False;
}


void LayeredControlServer::state(double *elapsedTime,
				 LayeredControlIF::MissionState *state, 
				 LayeredControlIF::Name behaviorName, 
				 short *behaviorIndex)
{
  _output->read();
  *elapsedTime = _output->data.elapsedSeconds;
  *state = _output->data.missionState;
  *behaviorIndex = _output->data.behaviorIndex;

  strncpy(behaviorName, _output->data.behaviorName, 
	  sizeof(LayeredControlIF::Name));

  behaviorName[sizeof(LayeredControlIF::Name)-1] = '\0';
}



int LayeredControlServer::spawnAuxTasks()
{
  char *program = "layeredControl";
  char errorBuf[256];

  pid_t pid;

  strcpy( _argv[0], program );
  _argv[_argc] = NULL;

  switch ((pid = fork())) {
    
  case 0:
    // In child
    // Execute server program
    execv(program, (char const * const *)&_argv[0] );

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

    perror(errorBuf);

    break;

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

  return 0;
}
