/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : Zigzag.h                                                    */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#ifndef _Zigzag_H
#define _Zigzag_H

#include "ourTypes.h"
#include "Behavior.h"
#include "DynamicControlIF.h"

#define ZigzagBehaviorName "zigzag"

#define NullLegDuration -1.0

class FloatAttribute;
class AngleAttribute;

/*
CLASS 
Zigzag

DESCRIPTION
This behavior sets heading, depth or pitch, and speed of the vehicle.
Vertical mode can be either Pitch or Depth. Behavior is active for
specified number of "zigs". Each zig has a specified heading deviation.
The fixed rudder angle flips sign each time the heading deviation is exceeded.

Attribute       Type               Meaning
---------       ----               -------
heading         angle              Commanded heading
speed           double             Commanded speed
verticalMode    VerticalMode       Either "depth" or "pitch"
depth           double             Commanded depth if verticalMode is "depth"
pitch           angle              Commanded pitch if verticalMode is "pitch"
maxLegs         integer            Maximum number of legs
headingInc      angle              Increment heading by this amount after 
                                   each leg
*/
class Zigzag : public Behavior {

public:

  Zigzag();

  virtual ~Zigzag();

  virtual void execute();
  Boolean shouldBehaviorStart( void );
  virtual Boolean validInput();

protected:

  // Desired heading; will get incremented after each leg
  double _heading;

  // Desired speed
  double _speed;

  // Vertical mode 
  DynamicControlIF::VerticalMode _verticalMode;

  // Desired depth if verticalMode is Depth
  double _depth;

  // Desired pitch if verticalMode is Pitch
  double _pitch;

  // Maximumm number of legs to do
  long _maxLegs;

  // Deviation from commanded heading:
  double _headingDeviation;

  // Commanded heading
  double _headingCmd;

  // Fixed rudder angle:
  double _rudder;

  // Start of the behavior
  double _legStartTime;

  // Number of legs completed
  int _legsCompleted;

  Boolean _first;

  FloatAttribute *_depthAttribute;
  AngleAttribute *_pitchAttribute;
};



#endif
