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

GulperServer::GulperServer(const char *driverName, 
				   SerialParameters *serialParams) 
  : GulperIF_SK()
{
  _serialParams = serialParams;
  _gulperOutput = new GulperOutput();
  _gulperOutput->data.FireGulper = -1;
  _gulperOutput->write();
  _driverName = strdup(driverName);

  for( int i=0; i<NGULPERS; i++ ) _gulperState[i] = GulperIF::Ready;

}


GulperServer::~GulperServer()
{
  free((void *)_driverName);
  delete _gulperOutput;
}


void GulperServer::fireGulper(long gulperToFire)
{
  _gulperOutput->data.FireGulper = gulperToFire;
  _gulperOutput->write();

  if (gulperToFire == NGULPERS) // If sending a firing signal to the virtual gulper #10 (i.e., firing all gulpers).
    {
      for(int i=0; i<NGULPERS; i++) 
	_gulperState[i] = GulperIF::Used;
    }
  else
    _gulperState[gulperToFire] = GulperIF::Used;
}

void GulperServer::state( GulperIF::gs gulperState )
{
   for( int i=0; i<NGULPERS; i++ ) gulperState[i] = _gulperState[i];
}

int GulperServer::spawnAuxTasks()
{
  char *program = (char *)_driverName;

  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;
}

