//=========================================================================
// Summary  : */
// Filename : VehicleConfigurationServer.h
// Author   : */
// Project  : */
// Revision : 1
// Created  : 2000/08/19
// Modified : 2000/08/19
//=========================================================================
// Description :
//=========================================================================
#ifndef _VehicleConfigurationServer_H
#define _VehicleConfigurationServer_H
#include "VehicleConfigurationIF_SK.h"
#include "Attributes.h"

#include "VehicleConstants.h"
#include "ProcessList.h"

#define AuvConfigDirName "AUV_CONFIG_DIR"


class VehicleConfigurationServer : public VehicleConfigurationIF_SK {

public:

  VehicleConfigurationServer(const char *name, const char *fileName,
			     Boolean isSim );
  ~VehicleConfigurationServer();


protected:

  short loadTables( void );

  virtual void kill( void );
  virtual void reloadTables( void );

  virtual short processCount();
  virtual short findProcess(VehicleConfigurationIF::Name name);
  virtual short findProcessByServerName( VehicleConfigurationIF::Name name);
  virtual short getProcessServer(short index,
				VehicleConfigurationIF::Driver driver);
  virtual short getProcessServer(VehicleConfigurationIF::Name name,
				VehicleConfigurationIF::Driver driver);
  virtual short getProcessDriver(short index,
				 VehicleConfigurationIF::Driver driver );
  virtual short getProcessDriver(VehicleConfigurationIF::Name name,
				 VehicleConfigurationIF::Driver driver );
  virtual short getProcessDriver2(short index,
				 VehicleConfigurationIF::Driver driver );
  virtual short getProcessDriver2(VehicleConfigurationIF::Name name,
				 VehicleConfigurationIF::Driver driver );
  virtual short getProcessDriver3(short index,
				 VehicleConfigurationIF::Driver driver );
  virtual short getProcessDriver3(VehicleConfigurationIF::Name name,
				 VehicleConfigurationIF::Driver driver );
  
  virtual Boolean getDriverPersists(short index, short driverIndex);
  virtual Boolean getDriverPersists(VehicleConfigurationIF::Name name, short driverIndex);
					
  virtual short getProcessFaultAction(VehicleConfigurationIF::Name name,
				 VehicleConfigurationIF::Name onFault );
  virtual short getProcessFailureAction(VehicleConfigurationIF::Name name,
				 VehicleConfigurationIF::Name onFailure );

  virtual short getNode( short index );
  virtual short getNode( VehicleConfigurationIF::Name name );
  virtual short getLogNode( short index );
  virtual short getLogNode( VehicleConfigurationIF::Name name );
  virtual short getProcessName( short index,
			       VehicleConfigurationIF::Name name );
  virtual short getProcessName( VehicleConfigurationIF::Name ifName,
                   VehicleConfigurationIF::Name processName );
  virtual short getProcessNameFromDriver( VehicleConfigurationIF::Driver driver,
                   VehicleConfigurationIF::Name processName );
  virtual short getTaskName( VehicleConfigurationIF::Name ifName, VehicleConfigurationIF::Name taskName );

  virtual short processInfo(short index,
			   VehicleConfigurationIF::Name name,
			   VehicleConfigurationIF::Driver driver,
			   short *priority);
  virtual short processInfo(VehicleConfigurationIF::Name name,
			   VehicleConfigurationIF::Driver driver,
			   short *priority);
  virtual short deviceInfo(short index,
			   VehicleConfigurationIF::DeviceInfo *devInfo );
  virtual short deviceInfo(VehicleConfigurationIF::Name name,
			   VehicleConfigurationIF::DeviceInfo *devInfo );

  virtual short getPID(short index );
  virtual short getPID(VehicleConfigurationIF::Name name );
  virtual short setPID(short index, short pid);
  virtual short setPID(VehicleConfigurationIF::Name name, short pid);
  virtual short getIFName(short index,
				 VehicleConfigurationIF::Name IFName);
  virtual short getIFName(VehicleConfigurationIF::Name name,
				 VehicleConfigurationIF::Name IFName);
  virtual short setIFName(short index,
				 VehicleConfigurationIF::Name IFName);
  virtual short setIFName(VehicleConfigurationIF::Name name,
				 VehicleConfigurationIF::Name IFName);

  virtual short registerInterfaceName(VehicleConfigurationIF::Name name, VehicleConfigurationIF::Name ifName);
  virtual short registerInterfaceName(short index, VehicleConfigurationIF::Name ifName);
  virtual short getInterfaceCount(VehicleConfigurationIF::Name name);
  virtual short getInterfaceCount(short index);
  virtual short getInterface(VehicleConfigurationIF::Name name, short ifNum, VehicleConfigurationIF::Name ifName);
  virtual short getInterface(short index, short ifNum, VehicleConfigurationIF::Name ifName);
  virtual short findInterface(VehicleConfigurationIF::Name name, short *index );
  virtual Boolean hasInterface(VehicleConfigurationIF::Name name, VehicleConfigurationIF::Name ifName);
  virtual Boolean hasInterface(short index, VehicleConfigurationIF::Name ifName);
  /*
  virtual short setSlayIfSpawned(VehicleConfigurationIF::Name name, Boolean newSlayIfSpawned);
  virtual short setSlayIfSpawned(short index, Boolean newSlayIfSpawned);
  virtual Boolean getSlayIfSpawned(VehicleConfigurationIF::Name name);
  virtual Boolean getSlayIfSpawned(short index);
  virtual short setDoSlay(VehicleConfigurationIF::Name name, Boolean doSlay);
  virtual short setDoSlay(short index, Boolean doSlay);
  virtual Boolean getDoSlay(VehicleConfigurationIF::Name name);
  virtual Boolean getDoSlay(short index);
  */
  virtual short invalidateEntry( short index );

  virtual short getDebug( VehicleConfigurationIF::Name ifName );
  virtual short getDebug( short index );

  virtual void vehicleName(VehicleConfigurationIF::Name name);

  virtual double getMissionStartTime( void );

  virtual double propPitch();
  virtual double mass();
  virtual double buoyancy();
  virtual double kpHeading();
  virtual double kdHeading();
  virtual double kiHeading();
  virtual double kiHeadingLimit();
  virtual double kwpHeading();
  virtual double maxHdgRate();
  virtual double rudLimit();
  virtual double rudActLimit();
  virtual double rudActRateLimit();
  virtual double kpPitch();
  virtual double kdPitch();
  virtual double kiPitch();
  virtual double kiPitchLimit();
  virtual double pitchLimit();
  virtual double maxDiveRate();
  virtual double kpDepth();
  virtual double kiDepth();
  virtual double elevLimit();
  virtual double elevActLimit();
  virtual double elevActRateLimit();
  virtual double Ts();
  virtual double effDragCoef();
  virtual double tau();
  virtual double maxDepthInt();
  virtual double maxHdgInt();
  virtual double maxPitchInt();
  virtual double xuabu();

  virtual void centerOfMass(VehicleConfigurationIF::Vector v);

  virtual void centerOfBuoyancy(VehicleConfigurationIF::Vector v);

  virtual double propEfficiency();

  virtual double ductArea();

  virtual short nDropWeights();

  virtual short dropWeight(short weightNo, double *mass, double *buoyancy,
			  VehicleConfigurationIF::Vector location);

  virtual void finLocations(VehicleConfigurationIF::Vector lowerRudder,
			    VehicleConfigurationIF::Vector portElevator,
			    VehicleConfigurationIF::Vector upperRudder,
			    VehicleConfigurationIF::Vector stbdElevator);

  virtual double highModePercent();
  virtual double lowModePercent();

  virtual Boolean isSimulated()
      { return _isSim; };

  virtual int spawnAuxTasks();

  //-----------------------------------------------------------------------
  // Structure for storing vehicle constants
  VehicleConstants *_constants;


  //-----------------------------------------------------------------------
  // Structure for storing device configuration details.
  ProcessList *_procList;

//  DeviceList *_devList;

  debug_t debug;

  //-----------------------------------------------------------------------
  //
  double _startTime;

  //
  //
  const char *_filename;
  Boolean _isSim;

  // Local statics
  static void signalHandler( int sigNo );
  static VehicleConfigurationServer *_theServer;
};

#endif
