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

#ifndef LINECAPTUREIF_H_
#define LINECAPTUREIF_H_

#include "data/ElementURI.h"

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

/// Static consts for input configurations

/* TerminalGuidance config settings */

/// Terminal guidance will execute arming actions once this range is reached.
static const ConfigURI ARM_RANGE_CFG( NAME, "armRange", "Range to trigger arming actions "
                                      "(e.g., deploy docking whiskers).", Units::METER );

/// Thruster speed when armed.
static const ConfigURI ARM_SPEED_CFG( NAME, "armSpeed", "Thruster seed when armed.",
                                      Units::METER_PER_SECOND );

/// Range in which terminal guidance stops updating the heading cmd
static const ConfigURI LOCKOUT_RANGE_CFG( NAME, "lockoutRange", "Range in which terminal guidance "
        "stops updating the heading cmd.", Units::METER );

/// Range at which further ranges are ignored in final approach. Used because azimuth becomes very noisy as elevation angle increases to 90. Vehicle will continue navigating to the projected waypoint.
static const ConfigURI SHORTFINAL_RANGE_CFG( NAME, "shortFinalRange", "Range at which further ranges are ignored in final approach."
        "Vehicle continues to navigate to the projected dock location.", Units::METER );

// Time duration to run in intercept mode until satisfying.
static const ConfigURI INTERCEPT_TIMEOUT_CFG( NAME, "interceptTimeout", "Max time duration to run in "
        "intercept mode.", Units::SECOND );

// Time duration to wait after cable present first turns true until closing the latch
static const ConfigURI LATCH_DELAY_TIMEOUT_CFG( NAME, "latchDelayTimeout", "How long to wait after cable present until "
        "closing the latch.", Units::SECOND );

/// Distance to move away from the target (rollout) in response to a miss.
static const ConfigURI ROLLOUT_DISTANCE_CFG( NAME, "rolloutDistance", "Distance to move away from the target "
        "(rollout) in response to a miss.", Units::METER );

/// Thruster speed during rollout.
static const ConfigURI ROLLOUT_SPEED_CFG( NAME, "rolloutSpeed", "Thruster seed during rollout.",
        Units::METER_PER_SECOND );

// Max time duration to run in rollout mode.
static const ConfigURI ROLLOUT_TIMEOUT_CFG( NAME, "rolloutTimeout", "Max time duration to run in "
        "rollout mode.", Units::SECOND );

/// HorizontalControl heading proportional gain during TERMINAL_GUIDANCE
static const ConfigURI KP_HEADING_TERMINAL_GUIDANCE( NAME, "kpHeadingTerminalGuidance", "HorizontalControl heading "
        "proportional gain during TERMINAL GUIDANCE", Units::RATIO );

/// HorizontalControl heading integral gain during TERMINAL_GUIDANCE
static const ConfigURI KI_HEADING_TERMINAL_GUIDANCE( NAME, "kiHeadingTerminalGuidance", "HorizontalControl heading "
        "integral gain during TERMINAL GUIDANCE", Units::RECIPROCAL_SECOND );

/// HorizontalControl heading proportional gain during FINAL_APPROACH
static const ConfigURI KP_HEADING_FINAL_APPROACH( NAME, "kpHeadingFinalApproach", "HorizontalControl heading "
        "proportional gain during FINAL APPROACH", Units::RATIO );

/// HorizontalControl heading integral gain during FINAL_APPROACH
static const ConfigURI KI_HEADING_FINAL_APPROACH( NAME, "kiHeadingFinalApproach", "HorizontalControl heading "
        "integral gain during FINAL APPROACH", Units::RECIPROCAL_SECOND );

static const ConfigURI PRONAV_GAIN( NAME, "navigationGain", "Unitless proportional navigation gain (constant)."
                                    " Set between 3 to 5.", Units::NONE );

/// Report state transitions to shore
static const ConfigURI VERBOSE( NAME, "verbose", "Report state transitions to shore when true", Units::BOOL );

/// Reflects the state of LineCapture
static const DataURI LINE_CAPTURE_GUIDANCE_MODE( NAME, "guidanceMode", Units::ENUM );


/* Additional TerminalGuidance config settings */

static const ConfigURI TERMINAL_RANGE_CFG( NAME, "terminalRange", "Range at which the vehicle should switch "
        "from navigating to the dock wp and start homing to the target using acoustic tracking data", Units::METER );

static const ConfigURI ACOUSTIC_TIMEOUT_CFG( NAME, "acousticTimeout", "Maximum time duration allowed between "
        "pings during terminal guidance", Units::MINUTE );


/* Midcourse config settings */

/// Desired vehicle depth during Midcourse
static const ConfigURI MIDCOURSE_DEPTH_CFG( NAME, "midcourseDepth", "Desired vehicle depth when navigating to "
        "dock WP (during Midcourse phase)", Units::SECOND );

/// Thruster speed during Midcourse
static const ConfigURI MIDCOURSE_SPEED_CFG( NAME, "midcourseSpeed", "Thruster speed during Midcourse guidance.",
        Units::METER_PER_SECOND );

/// Maximum time duration to run in Midcourse guidance mode
static const ConfigURI MIDCOURSE_TIMEOUT_CFG( NAME, "midcourseTimeout", "Maximum time duration for running "
        "in midcourse guidance mode.", Units::SECOND );


/* Search pattern config settings */

/// Maximum time duration to run in Midcourse guidance mode
static const ConfigURI SEARCH_TIMEOUT_CFG( NAME, "searchTimeout", "Maximum time duration for running the "
        "search pattern.", Units::MINUTE );

/// Maximum time duration to run in Midcourse guidance mode
static const ConfigURI SEARCH_CIRCLE_RADIUS_CFG( NAME, "searchCircleRadius", "Radius of circle around the dock waypoint.",
        Units::METER );

static const SettingURI IIR_FILTER_DECAY_SETTING( "iirFilterDecay", "Single-pole IIR low-pass filter decay setting. "
        "Decay value is in (0, 1), set to 0 to disable filtering.", Units::NONE );

static const DataURI INTERNAL_PN_CMD( NAME, "proNavCmd", "Filtered bearing rate command after pro-nav gain is applied.", Units::RADIAN_PER_SECOND_SQUARED );

static const DataURI INTERNAL_BEARING_RATE( NAME, "bearingRate", "Filtered bearing rate.", Units::RADIAN_PER_SECOND );

static const DataURI INTERNAL_RAW_BEARING_RATE( NAME, "rawBearingRate", "Raw bearing rate (before low-pass filter).", Units::RADIAN_PER_SECOND );

static const DataURI RANGE_CLOSING( NAME, "rangeClosing", "Is range closing?", Units::BOOL );

}

#endif /*LINECAPTUREIF_H_*/
