/****************************************************************************/
/* 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 "DropWeightServer.h"

DropWeightServer::DropWeightServer(const char *driverName, 
				   SerialParameters *serialParams) 
  : DropWeightIF_SK()
{
  _serialParams = serialParams;
  _dwOutput = new DropWeightOutput();
  _watchDogTimeout = 0;
  _driverName = strdup(driverName);
}


DropWeightServer::~DropWeightServer()
{
  free((void *)_driverName);
  delete _dwOutput;
}


void DropWeightServer::release(void)
{
  _dwOutput->data.Release = 1;
  _dwOutput->write();
}


Boolean DropWeightServer::released(void)
{
  _dwOutput->read();
  if( _dwOutput->ReleaseState == Dropped ) return True;
  return False;
}

Boolean DropWeightServer::ACommsDN(void)
{
  _dwOutput->read();
  if( _dwOutput->data.ACommsDN == 1 ) return True;
  return False;
}


short DropWeightServer::watchdogTimeout(void)
{
  _dwOutput->read();
  return _dwOutput->data.Wdt;
}


short DropWeightServer::burnwireTimeout(void)
{
  _dwOutput->read();
  return _dwOutput->data.Bwt;
}


short DropWeightServer::DW_out(void)
{
  _dwOutput->read();
  return _dwOutput->data.DW_out;
}


void DropWeightServer::resetWatchdog(void)
{
  _dwOutput->data.Reset = 1;
  _dwOutput->write();
}


void DropWeightServer::resetRelayAndCounters(void)
{
  _dwOutput->data.Reset = 2;
  _dwOutput->write();
}


void DropWeightServer::resetRelayAndPIC(void)
{
  _dwOutput->data.Reset = 3;
  _dwOutput->write();
}


void DropWeightServer::fireGulper(void)
{
  _dwOutput->data.FireGulper = 1;
  _dwOutput->write();
}

int DropWeightServer::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;
}

#if 0
void DropWeightServer::name(DeviceIF::Name name)
{
  strcpy(name, "DropWeight");
}


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


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


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


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


DeviceIF::Status DropWeightServer::status()
{
  return DeviceIF::Ok;
}


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


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

#endif
