/** \file
 *
 *  Specifies the interface details for the Tracking component in the
 *  EstimationModule.
 *
 *  Tracking.h should only be included by Tracking.cpp
 *  Other classes should include TrackingIF.h
 *
 *  Copyright (c) 2013 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 */

#ifndef TRACKINGIF_H_
#define TRACKINGIF_H_

#include "data/ElementURI.h"

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

#include "component/HasEnableBroadcastIF.h"

// Inputs from the mission .xml file
static const SettingURI CONTACT_DEPTH_SETTING( "contactDepthSetting", "Depth of tracked contact (optioanl setting). If the depth of the contact is known and fixed (e.g., when tracking a surface vessel), users can pass this arg to improve the 2D projected position estimates in the world-frame-of-reference.", Units::METER );
static const SettingURI CONTACT_LABEL_SETTING( "contactLabelSetting", "Label of the contact to track. Currently, this is an integer acoustic address for the remote Benthos Acoustic Modem or DAT. In the future, it may be a more general label (e.g., Benthos-0, LRAUV-Tethys, ChlorophyllMax).", Units::ENUM );
static const SettingURI UPDATE_PERIOD_SETTING( "updatePeriodSetting", "How often to observe the target, in seconds. (Currently not implemented. Will initially be how long to wait in between queries to the remote modem.)", Units::SECOND );
static const SettingURI NUMBER_OF_SAMPLES_SETTING( "numberOfSamplesSetting", "How many samples to average before reporting a tracking fix. (Currently not implemented.)", Units::COUNT );
static const SettingURI NUMBER_OF_FIXES_LOWPASS_SETTING( "numFixesLowPassSetting", "How many fixes to average (for low-pass filtering)", Units::COUNT );
static const SettingURI NUMBER_OF_STARTING_FIXES_TOIGNORE_SETTING( "numStartingFixesToIgnoreSetting", "How many fixes to ignore at the start of mission (as the vehicle just leaves surface, contact's location estimate especailly bearing can be erroneous)", Units::COUNT );

// Outputs to mission: (and for logging, hopefully!)
// XXX DO NOT USE OutputURI for this purpose!
static const DataURI CONTACT_LABEL( NAME, "contact_label", Units::ENUM );
static const DataURI CONTACT_LATITUDE( NAME, "contact_latitude", Units::DEGREE ); // UniversalURI for vehicle latitude is in degrees
static const DataURI CONTACT_LATITUDE_LOWPASS( NAME, "contact_latitude_lowpass", Units::DEGREE ); // UniversalURI for vehicle latitude is in degrees
static const DataURI CONTACT_LONGITUDE( NAME, "contact_longitude", Units::DEGREE ); // UniversalURI for vehicle longitude is in degrees
static const DataURI CONTACT_LONGITUDE_LOWPASS( NAME, "contact_longitude_lowpass", Units::DEGREE ); // UniversalURI for vehicle longitude is in degrees
static const DataURI CONTACT_DEPTH( NAME, "contact_depth", Units::METER );
static const DataURI CONTACT_DEPTH_LOWPASS( NAME, "contact_depth_lowpass", Units::METER );
static const DataURI RANGE_TO_CONTACT( NAME, "range_to_contact", Units::METER );
static const DataURI AZIMUTH_TO_CONTACT_VF( NAME, "azimuth_to_contact_vehicleFrame", Units::RADIAN );
static const DataURI ELEVATION_TO_CONTACT_VF( NAME, "elevation_to_contact_vehicleFrame", Units::RADIAN );
static const DataURI HEADING_TO_CONTACT( NAME, "heading_to_contact", Units::RADIAN ); // forget consistency with platform_orientation -- be consistent with other angular quantities
static const DataURI EASTINGS_TO_CONTACT( NAME, "eastings_to_contact", Units::METER );
static const DataURI NORTHINGS_TO_CONTACT( NAME, "northings_to_contact", Units::METER );
// TODO add descriptions to these?

// outputs to logging
static const BlobURI DIRECTION_VF( NAME, "direction_vehicleFrame", Units::NONE, BLOB_FLOAT64LE, 3 );
static const BlobURI DIRECTION_NF( NAME, "direction_navigationFrame", Units::NONE, BLOB_FLOAT64LE, 3 );
static const BlobURI RELATIVE_POSITION_VF( NAME, "relativePosition_vehicleFrame", Units::METER, BLOB_FLOAT64LE, 3 );
static const BlobURI RELATIVE_POSITION_NF( NAME, "relativePosition_navigationFrame", Units::METER, BLOB_FLOAT64LE, 3 );

}

#endif /*TRACKINGIF_H_*/
