/****************************************************************************/
/* 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 "BehaviorFactory.h"
#include "LayeredControl.h"
#include "Ascend.h"
#include "ChirpFin.h"
#include "DepthEnvelope.h"
#include "Descend.h"
#include "GetGPS.h"
#include "Launch.h"
#include "MissionTimer.h"
#include "SetDepth.h"
#include "SetElevator.h"
#include "Setpoint.h"
#include "DownloadData.h"
#include "BuoyLaunch.h"
#include "RotateBuoy.h"
#include "RotateCarousel.h"
#include "SetRudder.h"
#include "Yoyo.h"
#include "Waypoint.h"
#include "Zigzag.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, AscendBehaviorName))
    behavior = new Ascend();

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

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

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

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

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

  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, DownloadDataBehaviorName))
    behavior = new DownloadData();

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

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

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

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

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

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

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

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

  else
    // Unknown behavior type name
    behavior = 0;

  return behavior;
}

