/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : BehaviorFactory.cc                                            */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include <string.h>
#include "ArmTheGulper.h"
#include "BehaviorFactory.h"
#include "BuoyLaunch.h"
#include "Cathx.h"
#include "CARL.h"
#include "Circle.h"
#include "CurrentBuoy.h"
#include "LayeredControl.h"
#include "Ascend.h"
#include "Avoid.h"
#include "ChirpFin.h"
#include "Delta_T.h"
#include "DepthEnvelope.h"
#include "Descend.h"
#include "DownloadData.h"
#include "DropTheWeight.h"
#include "DropWeightSafeMode.h"
#include "edgetech.h"
#include "FireTheGulper.h"
//#include "FireTheGulperAMC.h"
#include "GetGPS.h"
#include "Launch.h"
#include "LowAltitudeFollowing.h"
#include "LowAltitudeFollowingOn.h"
#include "LowAltitudeFollowingOff.h"
#include "MissionTimer.h"
#include "SetControlGains.h"
#include "SetDepth.h"
#include "SetElevator.h"
#include "Setpoint.h"
#include "IpsStartProfile.h"
#include "IpsStopProfile.h"
#include "reson.h"
#include "RotateBuoy.h"
#include "RotateCarousel.h"
#include "RotateToLaunchPosition.h"
#include "SetRudder.h"
#include "StartSurvey.h"
#include "StartCamera.h"
#include "StopCamera.h"
#include "Yoyo.h"
#include "Waypoint.h"
#include "WaypointYoyo.h"
#include "WaypointTempYoyo.h"
#include "WaypointDepth.h"
#include "WaypointHoming.h"
#include "WaypointWall.h"
#include "WaypointWallEscape.h"
#include "WaypointBottom.h"
#include "Undock.h"
#include "Zigzag.h"
#include "AcousticAbort.h"
#include "AcousticUpdate.h"

// Instance starts as null
BehaviorFactory *BehaviorFactory::_instanceOf = 0;


BehaviorFactory *BehaviorFactory::instanceOf()
{
  if (!_instanceOf) 
    // Doesn't exist yet
    _instanceOf = new BehaviorFactory();

  return _instanceOf;
}


BehaviorFactory::BehaviorFactory()
{
}


BehaviorFactory::~BehaviorFactory()
{
}


Behavior *BehaviorFactory::create(const char *typeName) 
{
  Behavior *behavior;

  if (!strcmp(typeName, ArmTheGulperBehaviorName))
    behavior = new ArmTheGulper();

  else if (!strcmp(typeName, AscendBehaviorName))
    behavior = new Ascend();

  else if (!strcmp(typeName, AvoidBehaviorName))
    behavior = new Avoid();

  else if (!strcmp(typeName, BuoyLaunchBehaviorName))
    behavior = new BuoyLaunch();

  else if (!strcmp(typeName, CircleBehaviorName))
    behavior = new Circle();

  else if (!stricmp(typeName, CathxBehaviorName))
    behavior = new Cathx();

  else if (!stricmp(typeName, CARLBehaviorName))
    behavior = new CARL();

  else if (!strcmp(typeName, CurrentBuoyBehaviorName))
    behavior = new CurrentBuoy();

  else if (!strcmp(typeName, ChirpFinBehaviorName))
    behavior = new ChirpFin();

  else if (!strcmp(typeName, DeltaTBehaviorName))
    behavior = new Delta_T();

  else if (!strcmp(typeName, IpsStartProfileBehaviorName))
    behavior = new IpsStartProfile();

  else if (!strcmp(typeName, IpsStopProfileBehaviorName))
    behavior = new IpsStopProfile();

  else if (!strcmp(typeName, DepthEnvelopeBehaviorName))
    behavior = new DepthEnvelope();

  else if (!strcmp(typeName, DescendBehaviorName))
    behavior = new Descend();

  else if (!strcmp(typeName, DownloadDataBehaviorName))
    behavior = new DownloadData();

  else if (!strcmp(typeName, DropTheWeightBehaviorName))
    behavior = new DropTheWeight();

  else if (!strcmp(typeName, DropWeightSafeModeBehaviorName))
    behavior = new DropWeightSafeMode();

  else if (!strcmp(typeName, EdgetechBehaviorName))
	behavior = new edgetech();

  else if (!strcmp(typeName, GetGPSBehaviorName))
    behavior = new GetGPS();

  else if (!strcmp(typeName, LaunchBehaviorName)) 
    behavior = new Launch();

  else if (!strcmp(typeName, LowAltitudeFollowingBehaviorName)) 
    behavior = new LowAltitudeFollowing();

  else if (!strcmp(typeName, LowAltitudeFollowingOnBehaviorName)) 
    behavior = new LowAltitudeFollowingOn();

  else if (!strcmp(typeName, LowAltitudeFollowingOffBehaviorName)) 
    behavior = new LowAltitudeFollowingOff();

  else if (!strcmp(typeName, ResonBehaviorName))
    behavior = new reson();

  else if (!strcmp(typeName, RotateBuoyBehaviorName))
    behavior = new RotateBuoy();

  else if (!strcmp(typeName, RotateCarouselBehaviorName))
    behavior = new RotateCarousel();

  else if (!strcmp(typeName, RotateToLaunchPositionBehaviorName))
    behavior = new RotateToLaunchPosition();

  else if (!strcmp(typeName, MissionTimerBehaviorName))
    behavior = new MissionTimer();

  else if (!strcmp(typeName, SetElevatorBehaviorName))
    behavior = new SetElevator();

  else if (!strcmp(typeName, SetpointBehaviorName))
    behavior = new Setpoint();

  else if (!strcmp(typeName, RotateBuoyBehaviorName))
    behavior = new RotateBuoy();

  else if (!strcmp(typeName, RotateCarouselBehaviorName))
    behavior = new RotateCarousel();

  else if (!strcmp(typeName, SetControlGainsBehaviorName))
    behavior = new SetControlGains();

  else if (!strcmp(typeName, SetDepthBehaviorName))
    behavior = new SetDepth();

  else if (!strcmp(typeName, SetRudderBehaviorName))
    behavior = new SetRudder();

  else if (!strcmp(typeName, StartSurveyBehaviorName))
    behavior = new StartSurvey();

  else if (!strcmp(typeName, StartCameraBehaviorName))
    behavior = new StartCamera();

  else if (!strcmp(typeName, StopCameraBehaviorName))
    behavior = new StopCamera();

  else if (!strcmp(typeName, YoyoBehaviorName))
    behavior = new Yoyo();

  else if (!strcmp(typeName, WaypointBehaviorName))
    behavior = new Waypoint();

  else if (!strcmp(typeName, WaypointYoyoBehaviorName))
    behavior = new WaypointYoyo();

  else if (!strcmp(typeName, WaypointTempYoyoBehaviorName))
    behavior = new WaypointTempYoyo();

  else if (!strcmp(typeName, WaypointDepthBehaviorName))
    behavior = new WaypointDepth();

  else if (!strcmp(typeName, WaypointHomingBehaviorName))
    behavior = new WaypointHoming();

  else if (!strcmp(typeName, WaypointWallBehaviorName))
    behavior = new WaypointWall();

  else if (!strcmp(typeName, WaypointWallEscapeBehaviorName))
    behavior = new WaypointWallEscape();

  else if (!strcmp(typeName, WaypointBottomBehaviorName))
    behavior = new WaypointBottom();

  else if (!strcmp(typeName, UndockBehaviorName))
    behavior = new Undock();

  else if (!strcmp(typeName, ZigzagBehaviorName))
    behavior = new Zigzag();

  else if (!strcmp(typeName, AcousticAbortBehaviorName))
    behavior = new AcousticAbort();

  else if (!strcmp(typeName, FireTheGulperBehaviorName))
   behavior = new FireTheGulper();

  else if (!strcmp(typeName, AcousticUpdateBehaviorName))
   behavior = new AcousticUpdate();

//  else if (!strcmp(typeName, FireTheGulperAMCBehaviorName))
//   behavior = new FireTheGulperAMC();

  else
    // Unknown behavior type name
    behavior = 0;

  return behavior;
}

