/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : Ips4Server.cc                                                 */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 05/25/2001                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include <process.h>
#include "Syslog.h"
#include "SharedData.h"
#include "Ips4Server.h"
#include "IceDraft.h"



Ips4Server::Ips4Server(const char *driverName, SerialParameters *serialParams)
  : _serialParams(serialParams), Ips4IF_SK()
{
  _driverName = strdup(driverName);
  _output = new Ips4Output(SharedData::ReadWrite);
  _input  = new Ips4Input(SharedData::ReadWrite);
  _input->data._profile = RESET; _input->write();
}


Ips4Server::~Ips4Server()
{
}

void Ips4Server::name(DeviceIF::Name name)
{
  strcpy(name,"Ips4");
}

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

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


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


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


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


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


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


DeviceIF::Status Ips4Server::start()
{
  return DeviceIF::Ok;
}


DeviceIF::Status Ips4Server::stop()
{
  Syslog::write("Ips4Server::stop()\n");
  return DeviceIF::Ok;
}

DeviceIF::Status Ips4Server::startProfile()
{
  _input->data._profile = START_PROFILE;
  _input->write();
  return DeviceIF::Ok;
}


DeviceIF::Status Ips4Server::stopProfile()
{
  _input->data._profile = STOP_PROFILE;
  _input->write();
  return DeviceIF::Ok;
}

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

  char errorBuf[256];
  char buf[256];
 
  pid_t pid;
 
  switch ((pid = fork())) {
     
  case 0:
    // In child
    // Execute server program
    //    printf("-serial %s\n",_serialParams->string());
    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;
}

DeviceIF::Status Ips4Server::get_ice_draft(double patm, short nelem, double cond[],
					   double temp[], double pres[],
					   double *ice_draft)
{
  // Get a copy of the current data from the Ips
  //
  _output->read();
  icedraft_t id = _output->data._iceDraft;

  double avgSOS, avgDens;
  int stat =0;

  // Compute the average speed of sound and density with the given inputs
  //
  stat = calcAvgProp(patm, nelem, cond, temp, pres, &avgSOS, &avgDens);
  if (stat != 0)
  {
    Syslog::write("Ips4Server:Error status from calcAvgProp(): %d\n", stat);
    return DeviceIF::Error;
  }

  // Compute the ice draft and return
  //
  double waterLevel = 0;
  stat = IceDraft(&id, &waterLevel, patm, avgSOS, avgDens);
  if (stat != 0)
  {
    Syslog::write("Ips4Server:Error status from IceDraft(): %d\n", stat);
    return DeviceIF::Error;
  }

  *ice_draft = id.Draft;

  return DeviceIF::Ok;
}
  
