/****************************************************************************/
/* Copyright (c) 2000 MIT Sea Grant                                         */
/* MIT Sea Grant Proprietary Information. All rights reserved.              */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : LblServer.cc                                                  */
/* Author   : Don Eickstedt                                                 */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 05/25/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/

#include <sys/kernel.h>
#include <time.h>
#include "LblServer.h"
#include "Syslog.h"
#include "process.h"
#include "Task.h"

LblServer::LblServer(const char *name, SerialParameters *serialParams)
  :LblIF_SK()
{
  Boolean debug = False;
  _log = new LblLog();
   dprintf(" LblServer: Serial Port String = %s\n", serialParams->string());
  _driverOutput = new LblDriverOutput(SharedData::Read);
  _serialParams = serialParams;
}


LblServer::~LblServer()
{
  delete _log;
  delete _driverOutput;
}

//called by NavSensor every nav cycle
long LblServer::get_tof(LblIF::RTimes *tof)
{
  _driverOutput->read();

  memcpy((void *)tof, (void *)&_driverOutput->data.tofs, 
	 sizeof(LblIF::RTimes));
 
  return 0;
}

//called by Navsensor every nav cycle
long LblServer::get_ptime(TimeIF::TimeSpec *ping_time)
{
  // Read shared memory to get ping time from driver
  _driverOutput->read();
  *ping_time = _driverOutput->data.pingTime;
  
  return 0L;
}


//spawn driver process
int LblServer::spawnAuxTasks()
{
  char *program = "ps8000";
  char errorBuf[256];
  char buf[256];

  switch ((driver_pid = fork())) {

  case 0:
    // In child
    // Execute server program


    execlp(program, program, "-serial", _serialParams->string(), 0);

    //execlp(program, program, "-dev","/dev/ser11",NULL);

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

    perror(errorBuf);

    break;

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

  return 0;
}


//send ping command to PS8000 driver
//
long LblServer::ping()
{

  Task::Command scommand,rcommand;

  //code for ping command
  scommand.code = 1;

  Send(driver_pid,&scommand,&rcommand,sizeof(scommand),sizeof(rcommand));
  return 0L;
}

//change range gates on PS8000
//not implemented yet
long LblServer::change_gate()
{
  //not implemented yet
  return 0L;
}

