/** \file
 *
 *  Specifies the interface details for the Simulator component in the
 *  SimulatorModule.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 */

#ifndef SIMULATORIF_H_
#define SIMULATORIF_H_

#include "data/ElementURI.h"

/**
 *  Specifies the interface details for the Simulator component in the
 *  SimulatorModule.
 *
 *  \ingroup modules_simulator
 */
namespace SimulatorIF
{
// Component name
static const Str NAME( "Simulator" );

static const ConfigURI INIT_LAT_CFG( NAME, "initLat", Units::DEGREE );
static const ConfigURI INIT_LON_CFG( NAME, "initLon", Units::DEGREE );

static const ConfigURI INIT_Z_CFG( NAME, "initZ", Units::METER );
static const ConfigURI INIT_PITCH_CFG( NAME, "initPitch", Units::RADIAN );
static const ConfigURI INIT_ROLL_CFG( NAME, "initRoll", Units::RADIAN );
static const ConfigURI INIT_YAW_CFG( NAME, "initYaw", Units::RADIAN );

static const ConfigURI INIT_U_CFG( NAME, "initU", Units::METER_PER_SECOND );
static const ConfigURI INIT_V_CFG( NAME, "initV", Units::METER_PER_SECOND );
static const ConfigURI INIT_W_CFG( NAME, "initW", Units::METER_PER_SECOND );
static const ConfigURI INIT_P_CFG( NAME, "initP", Units::RADIAN_PER_SECOND );
static const ConfigURI INIT_Q_CFG( NAME, "initQ", Units::RADIAN_PER_SECOND );
static const ConfigURI INIT_R_CFG( NAME, "initR", Units::RADIAN_PER_SECOND );

static const ConfigURI INIT_NORTH_CURRENT_CFG( NAME, "northCurrent", Units::METER_PER_SECOND );
static const ConfigURI INIT_EAST_CURRENT_CFG( NAME, "eastCurrent", Units::METER_PER_SECOND );
static const ConfigURI INIT_VERT_CURRENT_CFG( NAME, "vertCurrent", Units::METER_PER_SECOND );

static const ConfigURI MAGNETIC_VARIATION_CFG( NAME, "magneticVariation", Units::DEGREE );
static const ConfigURI SOUND_SPEED_CFG( NAME, "soundSpeed", Units::METER_PER_SECOND );

static const ConfigURI SST_CFG( NAME, "sst", Units::CELSIUS );
static const ConfigURI T_MIXED_CFG( NAME, "tMixed", Units::CELSIUS );
static const ConfigURI T_300_CFG( NAME, "t300", Units::CELSIUS );

static const ConfigURI SSS_CFG( NAME, "sss", Units::PART_PER_THOUSAND );
static const ConfigURI S_MIXED_CFG( NAME, "sMixed", Units::PART_PER_THOUSAND );
static const ConfigURI S_300_CFG( NAME, "s300", Units::PART_PER_THOUSAND );

static const ConfigURI MIXED_LAYER_DEPTH_CFG( NAME, "mixedLayerDepth", Units::METER );

static const ConfigURI OCEAN_MODEL_DATA_CFG( NAME, "oceanModelData", Units::NONE, STRVALUE );
static const ConfigURI DEFAULT_OCEAN_DENSITY_CFG( NAME, "defaultDensity", Units::KILOGRAM_PER_CUBIC_METER );

// Mass Properties -- from vehicle.cfg
static const ConfigURI VEHICLE_MASS_CFG( NAME, "mass", Units::KILOGRAM ); // mass kg; Vehicle mass
static const ConfigURI MOVABLE_MASS_CFG( NAME, "movableMass", Units::KILOGRAM ); // mass kg; Vehicle mass
static const ConfigURI VEHICLE_VOLUME_CFG( NAME, "volume", Units::CUBIC_METER ); // volume m3
static const ConfigURI VEHICLE_ENTRAINED_AIR_CFG( NAME, "entrainedAir", Units::CUBIC_CENTIMETER );

// Stability Derivatives -- from vehicle.cfg
//effDragCoef        = .21;        // effDragCoef, unitless; veh drag in x; related to Xuu
static const ConfigURI XUABU_CFG( NAME, "Xuabu", Units::KILOGRAM_PER_METER ); // Xuabu, Force Derivative, kg/meter

// Initialize the center of mass -- from vehicle.cfg
static const ConfigURI CENTER_OF_MASS_X_CFG( NAME, "centerOfMassX", Units::METER ); // centerOfMassX
static const ConfigURI CENTER_OF_MASS_Y_CFG( NAME, "centerOfMassY", Units::METER ); // centerOfMassY
static const ConfigURI CENTER_OF_MASS_Z_CFG( NAME, "centerOfMassZ", Units::METER ); // centerOfMassZ

// Initialize the center of mass -- from vehicle.cfg
static const ConfigURI CENTER_OF_MOVABLE_MASS_X_CFG( NAME, "centerOfMovableMassX", Units::METER ); // centerOfMass
static const ConfigURI CENTER_OF_MOVABLE_MASS_Y_CFG( NAME, "centerOfMovableMassY", Units::METER ); // centerOfMassY
static const ConfigURI CENTER_OF_MOVABLE_MASS_Z_CFG( NAME, "centerOfMovableMassZ", Units::METER ); // centerOfMassZ

// Initialize the center of buoyancy -- from vehicle.cfg
static const ConfigURI CENTER_OF_BUOY_X_CFG( NAME, "centerOfBuoyX", Units::METER ); // centerOfBuoyX
static const ConfigURI CENTER_OF_BUOY_Y_CFG( NAME, "centerOfBuoyY", Units::METER ); // centerOfBuoyY
static const ConfigURI CENTER_OF_BUOY_Z_CFG( NAME, "centerOfBuoyZ", Units::METER ); // centerOfBuoyZ

/// Initialize the fins locations -- from vehicle.cfg
static const ConfigURI LOWER_RUDDER_X_POS_CFG( NAME, "lowerRudX", Units::METER ); // lowerRudX
static const ConfigURI LOWER_RUDDER_Y_POS_CFG( NAME, "lowerRudY", Units::METER ); // lowerRudY
static const ConfigURI LOWER_RUDDER_Z_POS_CFG( NAME, "lowerRudZ", Units::METER ); // lowerRudZ

static const ConfigURI UPPER_RUDDER_X_POS_CFG( NAME, "upperRudX", Units::METER ); // upperRudX
static const ConfigURI UPPER_RUDDER_Y_POS_CFG( NAME, "upperRudY", Units::METER ); // upperRudY
static const ConfigURI UPPER_RUDDER_Z_POS_CFG( NAME, "upperRudZ", Units::METER ); // upperRudZ

static const ConfigURI PORT_ELEVATOR_X_POS_CFG( NAME, "portElevX", Units::METER ); // portElevX
static const ConfigURI PORT_ELEVATOR_Y_POS_CFG( NAME, "portElevY", Units::METER ); // portElevY
static const ConfigURI PORT_ELEVATOR_Z_POS_CFG( NAME, "portElevZ", Units::METER ); // portElevZ

static const ConfigURI STBD_ELEVATOR_X_POS_CFG( NAME, "stbdElevX", Units::METER ); // stbdElevX
static const ConfigURI STBD_ELEVATOR_Y_POS_CFG( NAME, "stbdElevY", Units::METER ); // stbdElevY
static const ConfigURI STBD_ELEVATOR_Z_POS_CFG( NAME, "stbdElevZ", Units::METER ); // stbdElevZ

static const ConfigURI DESIGN_SPEED_CFG( NAME, "designSpeed", Units::METER_PER_SECOND ); // designSpeed
static const ConfigURI DESIGN_PROP_EFFICIENCY_CFG( NAME, "designPropEff", Units::RATIO ); // designPropEff
static const ConfigURI DESIGN_PROP_OMEGA_CFG( NAME, "designOmega", Units::RADIAN_PER_SECOND ); // designOmega
static const ConfigURI DESIGN_PROP_THRUST_CFG( NAME, "designThrust", Units::NEWTON ); // designThrust
static const ConfigURI DESIGN_PROP_TORQUE_CFG( NAME, "designTorque", Units::NEWTON_METER ); // designTorque

static const ConfigURI DROP_WEIGHT_VOLUME_CFG( NAME, "dropWt1Volume", Units::CUBIC_METER ); // dropWt1Volume
static const ConfigURI DROP_WEIGHT_MASS_CFG( NAME, "dropWt1Mass", Units::KILOGRAM ); //dropWt1Mass
static const ConfigURI DROP_WEIGHT_X_POS_CFG( NAME, "dropWt1X", Units::METER ); // dropWt1X
static const ConfigURI DROP_WEIGHT_Y_POS_CFG( NAME, "dropWt1Y", Units::METER ); // dropWt1Y
static const ConfigURI DROP_WEIGHT_Z_POS_CFG( NAME, "dropWt1Z", Units::METER ); // dropWt1Z

static const ConfigURI VEHICLE_BODY_CYLINDER_LENGTH_CFG( NAME, "cylinderLength", Units::METER );
static const ConfigURI VEHICLE_BODY_CYLINDER_RADIUS_CFG( NAME, "cylinderRadius", Units::METER );

// Moment of Intertia terms
static const ConfigURI IXX_CFG( NAME, "Ixx", Units::KILOGRAM_METER_SQUARED ); // Ixx, kg-m^2.
static const ConfigURI IYY_CFG( NAME, "Iyy", Units::KILOGRAM_METER_SQUARED ); // Iyy, kg-m^2.
static const ConfigURI IZZ_CFG( NAME, "Izz", Units::KILOGRAM_METER_SQUARED ); // Izz, kg-m^2.

// Added mass terms
static const ConfigURI KPDOT_CFG( NAME, "Kpdot", Units::KILOGRAM_METER_SQUARED ); // Kpdot, kg-m^2.
static const ConfigURI MQDOT_CFG( NAME, "Mqdot", Units::KILOGRAM_METER_SQUARED ); // Mqdot, kg-m^2.
static const ConfigURI NRDOT_CFG( NAME, "Nrdot", Units::KILOGRAM_METER_SQUARED ); // Nrdot, kg-m^2.
static const ConfigURI XUDOT_CFG( NAME, "Xudot", Units::KILOGRAM ); // Xudot, kg.
static const ConfigURI YVDOT_CFG( NAME, "Yvdot", Units::KILOGRAM ); // Yvdot, kg.
static const ConfigURI ZWDOT_CFG( NAME, "Zwdot", Units::KILOGRAM ); // Zwdot, kg.

// Added mass cross terms
static const ConfigURI KVDOT_CFG( NAME, "Kvdot", Units::KILOGRAM_METER ); // Kvdot, kg-m.
static const ConfigURI MWDOT_CFG( NAME, "Mwdot", Units::KILOGRAM_METER ); // Mwdot, kg-m.
static const ConfigURI NVDOT_CFG( NAME, "Nvdot", Units::KILOGRAM_METER ); // Nvdot, kg-m.
static const ConfigURI YRDOT_CFG( NAME, "Yrdot", Units::KILOGRAM_METER ); // Yrdot, kg-m.
static const ConfigURI YPDOT_CFG( NAME, "Ypdot", Units::KILOGRAM_METER ); // Ypdot, kg-m.
static const ConfigURI ZQDOT_CFG( NAME, "Zqdot", Units::KILOGRAM_METER ); // Zqdot, kg-m.

// Quadratic drag
static const ConfigURI KPABP_CFG( NAME, "Kpabp", Units::KILOGRAM_METER_SQUARED ); // Kpabp, Kp|p| , kg-m^2
static const ConfigURI MQABQ_CFG( NAME, "Mqabq", Units::KILOGRAM_METER_SQUARED ); // Mqabq, Mq|q| , kg-m^2
static const ConfigURI NRABR_CFG( NAME, "Nrabr", Units::KILOGRAM_METER_SQUARED ); // Nrabr, Nr|r| , kg-m^2
static const ConfigURI YVABV_CFG( NAME, "Yvabv", Units::KILOGRAM_METER ); // Yvabv, Yv|v| , kg/m
static const ConfigURI ZWABW_CFG( NAME, "Zwabw", Units::KILOGRAM_METER ); // Zwabw, Zw|w| , kg/m

// Quadratic drag cross terms
static const ConfigURI MWABW_CFG( NAME, "Mwabw", Units::KILOGRAM ); // Mwabw, Mw|w| , kg
static const ConfigURI NVABV_CFG( NAME, "Nvabv", Units::KILOGRAM ); // Nvabv, Nv|v| , kg
static const ConfigURI YRABR_CFG( NAME, "Yrabr", Units::NONE ); // Yrabr, Yr|r| , ?
static const ConfigURI ZQABQ_CFG( NAME, "Zqabq", Units::NONE ); // Zqabq, Zq|q| , ?

// In-line lift and drag
static const ConfigURI MUQ_CFG( NAME, "Muq", Units::KILOGRAM_METER ); // Muq, kg-m
static const ConfigURI MUW_CFG( NAME, "Muw", Units::KILOGRAM ); // Muw, kg
static const ConfigURI MPR_CFG( NAME, "Mpr", Units::KILOGRAM_METER_SQUARED ); // Mpr, kg-m^2

static const ConfigURI NUR_CFG( NAME, "Nur", Units::KILOGRAM_METER ); // Nur, kg-m
static const ConfigURI NUV_CFG( NAME, "Nuv", Units::KILOGRAM ); // Nuv, kg
static const ConfigURI NPQ_CFG( NAME, "Npq", Units::KILOGRAM_METER_SQUARED ); // Npq, kg-m^2

static const ConfigURI XVV_CFG( NAME, "Xvv", Units::KILOGRAM_PER_METER ); // Xvv, kg/m
static const ConfigURI XWW_CFG( NAME, "Xww", Units::KILOGRAM_PER_METER ); // Xww, kg/m
static const ConfigURI XVR_CFG( NAME, "Xvr", Units::KILOGRAM ); // Xvr, kg
static const ConfigURI XWQ_CFG( NAME, "Xwq", Units::KILOGRAM ); // Xwq, kg
static const ConfigURI XRR_CFG( NAME, "Xrr", Units::KILOGRAM_METER ); // Xrr, kg-m
static const ConfigURI XQQ_CFG( NAME, "Xqq", Units::KILOGRAM_METER ); // Xqq, kg-m

static const ConfigURI YUR_CFG( NAME, "Yur", Units::KILOGRAM ); // Yur, kg
static const ConfigURI YUV_CFG( NAME, "Yuv", Units::KILOGRAM_PER_METER ); // Yuv, kg/m
static const ConfigURI YWP_CFG( NAME, "Ywp", Units::KILOGRAM_METER ); // Ywp, kg-m

static const ConfigURI ZUQ_CFG( NAME, "Zuq", Units::KILOGRAM ); // Zuq, kg
static const ConfigURI ZUW_CFG( NAME, "Zuw", Units::KILOGRAM_PER_METER ); // Zuw, kg/m
static const ConfigURI ZVP_CFG( NAME, "Zvp", Units::KILOGRAM ); // Zvp, kg

static const ConfigURI KVT2_CFG( NAME, "Kvt2", Units::NONE ); // Kvt2, ?

// Actuator parameters
static const ConfigURI FIN_ASPECT_RATIO_CFG( NAME, "aspectRatio", Units::RATIO ); // aspectRatio
static const ConfigURI FIN_STALL_ANGLE_CFG( NAME, "stallAngle", Units::RADIAN ); // stallAngle
static const ConfigURI FIN_AREA_CFG( NAME, "finArea", Units::SQUARE_METER ); // finArea, m^2
static const ConfigURI FIN_DRAG_COEFF_CFG( NAME, "CDc", Units::RATIO ); // CDc, Coef. of Drag, Unitless
static const ConfigURI FIN_LIFT_COEFF_CFG( NAME, "dCL", Units::RATIO ); // dCL, Coef. of Lift, Unitless

static const ConfigURI RUDDER_HYST_WIDTH_CFG( NAME, "wideHystRud", Units::RADIAN );
static const ConfigURI RUDDER_HYST_CENTER_CFG( NAME, "centerHystRud", Units::RADIAN );
static const ConfigURI RUDDER_SPEED_CFG( NAME, "speedRud", Units::RADIAN_PER_SECOND );

static const ConfigURI ELEVATOR_HYST_WIDTH_CFG( NAME, "wideHystElev", Units::RADIAN );
static const ConfigURI ELEVATOR_HYST_CENTER_CFG( NAME, "centerHystElev", Units::RADIAN );
static const ConfigURI ELEVATOR_SPEED_CFG( NAME, "speedElev", Units::RADIAN_PER_SECOND );

static const ConfigURI MASS_INIT_POS_CFG( NAME, "initMassPosition", Units::METER );
static const ConfigURI MASS_POSITION_OFFSET_CFG( NAME, "massPositionOffset", Units::METER );
static const ConfigURI MASS_HYST_WIDTH_CFG( NAME, "wideHystMovableMass", Units::METER );
static const ConfigURI MASS_HYST_CENTER_CFG( NAME, "centerHystMovableMass", Units::METER );
static const ConfigURI MASS_SPEED_CFG( NAME, "speedMovableMass", Units::METER_PER_SECOND );

static const ConfigURI BUOY_INIT_POS_CFG( NAME, "initBuoyancyPosition", Units::CUBIC_METER );
static const ConfigURI BUOY_NEUTRAL_OFFSET_CFG( NAME, "buoyancyNeutralOffset", Units::CUBIC_METER );
static const ConfigURI BUOY_HYST_WIDTH_CFG( NAME, "wideHystBuoyancy", Units::CUBIC_METER );
static const ConfigURI BUOY_HYST_CENTER_CFG( NAME, "centerHystBuoyancy", Units::CUBIC_METER );
static const ConfigURI BUOY_SPEED_CFG( NAME, "speedBuoyancy", Units::CUBIC_METER_PER_SECOND );

// Simulated sensor parameters
static const ConfigURI DVL_BOTTOM_LOCK_GONE_CFG( NAME, "bottomLockGone", Units::METER );

// Simulated ACommms targets
static const ConfigURI NUM_HOMING_TARGETS_CFG( NAME, "numberOfHomingTragets", Units::COUNT );
static const ConfigURI HOMING_SENSOR_TAT_CFG( NAME, "homingSensorTat", Units::SECOND );

}

#endif /*SIMULATOR_H_*/
