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

SonardyneServer::SonardyneServer(SerialParameters *serialParams) 
  : UsblIF_SK()
{
  _serialParams = serialParams;
  _output = new SonardyneOutput(SharedData::ReadWrite);
  _output->data.deviceReady = False;
  _output->write();
  _command = new SonardyneCommand( MessageQueue::ReadWrite );
  Syslog::write("SonardyneServer.cc was last compiled on %s, %s\n",__DATE__, __TIME__);
}


SonardyneServer::~SonardyneServer()
{
  delete _output;
}


void SonardyneServer::name(DeviceIF::Name name)
{
  strcpy(name, "Sonardyne");
}

Boolean SonardyneServer::ready()
{
  _output->read();
  return _output->data.deviceReady;
}

DeviceIF::Status SonardyneServer::set_beacon(UsblIF::String32 newBeaconName)
{
  SonardyneCommand::Command cmd(newBeaconName);
  _command->write(&cmd);
  
  return DeviceIF::Ok;
}

DeviceIF::Status SonardyneServer::start()
{
   //
   // Declare an enum and initialize it.
   SonardyneCommand::SonardyneCommands cmdEnum;
   cmdEnum = SonardyneCommand::Start;
   //
   // Construct an object and initialize it with the enum, set to "Start".
   SonardyneCommand::Command cmdObj(cmdEnum);

  _command->write(&cmdObj);

   Syslog::write("SonardyneServer issued start");
  
  return DeviceIF::Ok;
}

DeviceIF::Status SonardyneServer::stop()
{
   //
   // Declare an enum and initialize it.
   SonardyneCommand::SonardyneCommands cmdEnum;
   cmdEnum = SonardyneCommand::Stop;
   //
   // Construct an object and initialize it with the enum, set to "Start".
   SonardyneCommand::Command cmdObj(cmdEnum);

  _command->write(&cmdObj);

   Syslog::write("SonardyneServer issued stop.");
  
  return DeviceIF::Ok;
}

DeviceIF::Status SonardyneServer::get_range_data(float *range, float *x,
float *y, float *z, short *tat, TimeIF::TimeSpec *sampleTime, UsblIF::UsblDataStatus *status)
{
  _output->read();
  *range = _output->data.range;
  *x = _output->data.x;
  *y = _output->data.y;
  *z = _output->data.z;
  *tat = _output->data.tat;
  *status = _output->data.status;
  sampleTime->seconds = _output->data.updateTime.seconds;
  sampleTime->nanoSeconds = _output->data.updateTime.nanoSeconds;
  
  return DeviceIF::Ok;      
}

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


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


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


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


DeviceIF::Status SonardyneServer::status()
{
  // Dummy implementation for now
  return DeviceIF::Ok;
}


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


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


DeviceIF::Status SonardyneServer::enable()
{
  return DeviceIF::Ok;
}


DeviceIF::Status SonardyneServer::disable()
{
  return DeviceIF::Ok;
}


int SonardyneServer::spawnAuxTasks()
{
  char *program = "sonardyneDriver";
  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;
}
