/** \file
 *
 *  Specifies the interface details for the HeadingControl component in the
 *  ControlModule.
 *
 *  HorizontalControl.h should only be included by HeadingControl.cpp
 *  Other classes should include HorizontalControlIF.h
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 */

#ifndef HORIZONTALCONTROLIF_H_
#define HORIZONTALCONTROLIF_H_

#include "data/ElementURI.h"

/**
 *  Specifies the interface details for the HeadingControl component in the
 *  ControlModule.
 *
 *  HorizontalControl.h should only be included by HeadingControl.cpp
 *  Other classes should include HorizontalControlIF.h
 *
 *  \ingroup modules_control
 */
namespace HorizontalControlIF
{
/// Static const for component name
/// (Can be used by other components)
static const Str NAME( "HorizontalControl" );

// Include common ConfigURIs -- must be in namespace and follow definition of NAME
#include "component/HasLoadAtStartupIF.h"

/// Static consts for input settings
/// (Supplied so outputs can be directed to these inputs)
static const DataURI HORIZONTAL_MODE( NAME, "horizontalMode", Units::ENUM );
static const DataURI LATITUDE_CMD( NAME, "latitudeCmd", Units::DEGREE, DOUBLE6 );
static const DataURI LONGITUDE_CMD( NAME, "longitudeCmd", Units::DEGREE, DOUBLE6 );
static const DataURI HEADING_CMD( NAME, "headingCmd", Units::RADIAN );
static const DataURI HEADING_RATE_CMD( NAME, "headingRateCmd", Units::RADIAN_PER_SECOND );
static const DataURI RUDDER_ANGLE_CMD( NAME, "rudderAngleCmd", Units::RADIAN );
static const DataURI BEARING_CMD( NAME, "bearingCmd", Units::RADIAN );

static const DataURI KD_HEADING_OVERRIDE( NAME, "kdHeadingOverride", Units::SECOND );             // Derivative gain
static const DataURI KI_HEADING_OVERRIDE( NAME, "kiHeadingOverride", Units::RECIPROCAL_SECOND );  // Integral gain
static const DataURI KP_HEADING_OVERRIDE( NAME, "kpHeadingOverride", Units::RATIO );              // Proportional gain

/// Configuration
static const ConfigURI KD_HEADING_CFG( NAME, "kdHeading", Units::SECOND );                         // Derivative gain
static const ConfigURI KI_HEADING_CFG( NAME, "kiHeading", Units::RECIPROCAL_SECOND );              // Integral gain
static const ConfigURI KP_HEADING_CFG( NAME, "kpHeading", Units::RATIO );                          // Proportional gain
static const ConfigURI KWP_HEADING_CFG( NAME, "kwpHeading", Units::RADIAN_PER_METER );             // Cross-track error gain
static const ConfigURI KIWP_HEADING_CFG( NAME, "kiwpHeading", Units::RADIAN_PER_SECOND_PER_METER ); // Cross-track integral error gain
static const ConfigURI MAX_HDG_ACCEL_CFG( NAME, "maxHdgAccel", Units::RADIAN_PER_SECOND_SQUARED ); // Max turn accel
static const ConfigURI MAX_HDG_INT_CFG( NAME, "maxHdgInt", Units::RADIAN );                        // Max cmded rudder from hdg int
static const ConfigURI MAX_HDG_RATE_CFG( NAME, "maxHdgRate", Units::RADIAN_PER_SECOND );           // Max turn rate
static const ConfigURI MAX_KXTE_CFG( NAME, "maxKxte", Units::RADIAN );                             // Max heading correction due to kwpHeading
static const ConfigURI RUD_DEADBAND_CFG( NAME, "rudDeadband", Units::RADIAN );                     // Degree of rounding in output values
static const ConfigURI RUD_LIMIT_CFG( NAME, "rudLimit", Units::RADIAN );                           // Max rudder angle

/// Static consts for "Internal" outputs
static const DataURI HEADING_CMD_INTERNAL( NAME, "headingCmdInternal", Units::RADIAN );
static const DataURI SMOOTH_HEADING_CMD_INTERNAL( NAME, "smoothHeadingCmdInternal", Units::RADIAN );
static const DataURI HEADING_INTEGRAL_INTERNAL( NAME, "headingIntegralInternal", Units::RADIAN );
static const DataURI XTE_INTEGRAL_INTERNAL( NAME, "xteIntegralInternal", Units::RADIAN );
static const DataURI BEARING_INTERNAL( NAME, "bearingInternal", Units::RADIAN );
static const DataURI XTE_INTERNAL( NAME, "xteInternal", Units::METER );
static const DataURI KXTE_INTERNAL( NAME, "kxteInternal", Units::RADIAN );

/// Static consts for outputs to Servos
static const DataURI RUDDER_ANGLE_ACTION( NAME, "rudderAngleAction", Units::RADIAN );

/// Defines heading modes
typedef enum
{
    NONE,         // Heading is not controlled
    WAYPOINT,     // Proceed towards the specified waypoint
    HEADING,      // Maintain the specified heading
    HEADING_RATE, // Maintain a specified heading rate
    RUDDER_ANGLE, // Maintain a specified rudder angle
} HorizontalMode;

} // namespace HorizontalControlIF

#endif /*HORIZONTALCONTROLIF_H_*/
