/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : Server.cc                                                     */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/* Henthorn  2015/04/24: If simulating, do not create a driver task as      */
/*                       calling TerrainAid will be done in the Simulator.  */
/****************************************************************************/

#include "Syslog.h"
#include "TerrainAidServer.h"


TerrainAidServer::TerrainAidServer(const char *driverName) 
  : TerrainAidIF_SK()
{
  _msgQ     = new TerrainAidMsg();
  _terrainAidOutput = new TerrainAidOutput();

  _terrainAidOutput->data.deltaNorthing = 0.;
  _terrainAidOutput->data.deltaEasting  = 0.;

  _driverName = strdup(driverName);
}

TerrainAidServer::TerrainAidServer(const char *driverName, Boolean test,
				                           Boolean fastSim)
  : TerrainAidIF_SK(), _test(test), _fastSim(fastSim)
{
   _msgQ = new TerrainAidMsg();

   _terrainAidOutput = new TerrainAidOutput();

   _terrainAidOutput->data.deltaNorthing = 0.;
   _terrainAidOutput->data.deltaEasting  = 0.;
  
   _driverName = strdup(driverName);
  if (_fastSim) Syslog::write("TerrainAidServer::TerrainAidServer - sim");
}

TerrainAidServer::~TerrainAidServer()
{
  free((void *)_driverName);
  delete _msgQ;
  delete _terrainAidOutput;
}

//long TerrainAidServer::counter( void )
short TerrainAidServer::counter( void )
{
  _terrainAidOutput->read();
  return _terrainAidOutput->data.cntr;
}

void TerrainAidServer::get( TerrainAidIF::Data *data )
{
  _terrainAidOutput->read();

  memcpy((void *)data, (void *)&_terrainAidOutput->data,
  sizeof(TerrainAidIF::Data));
}

void TerrainAidServer::reinitFilter()
{
  TerrainAidMsg::Message msg(TerrainAidMsg::ReinitFilter);
  _msgQ->write(&msg);
}

Boolean TerrainAidServer::trnConnected(void)
{
  _terrainAidOutput->read();
   return _terrainAidOutput->data.trnConnected;
}

Boolean TerrainAidServer::converged(void)
{
  _terrainAidOutput->read();
   return _terrainAidOutput->data.valid;
}

void TerrainAidServer::offset( double dn, double de)
{
  _terrainAidOutput->read();

  _terrainAidOutput->data.deltaNorthing = dn;
  _terrainAidOutput->data.deltaEasting  = de;

  _terrainAidOutput->write();
  if( dn != 0. || de != 0. )
  {
     Syslog::write("TerrainAidServer - Offsetting the Trn filter by "
		   "(%.1f, %.1f).", dn, de );
  }

}

int TerrainAidServer::spawnAuxTasks()
{
  // 04/24/2015
  // Do not create the driver task if we're simulating. The reading
  // and writing of TRN inputs and outputs will be handled by sim.
  // But the server will still serve-up the output as before.
  //
  if (_fastSim) return 0;

  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);
    //execlp(program, program, "", 0, 0);
     if(_test) 
	execlp(program, program, "-test", 0, 0);
     else 
	execlp(program, program, "", 0, 0);

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

    perror(errorBuf);
 
    break;

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

  return 0;
}

