/** \file
 *
 *  Contains the DeadReckonUsingCompactModelForecast class declaration.
 *
 *  DeadReckonUsingCompactModelForecast.h should only be included by DeadReckonUsingCompactModelForecast.cpp
 *  Other classes should include DeadReckonUsingCompactModelForecastIF.h
 *
 *  Copyright (c) 2013 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
*/
#ifndef DEADRECKONUSINGCOMPACTMODELFORECAST_H_
#define DEADRECKONUSINGCOMPACTMODELFORECAST_H_

// include parent class
#include "navigationModule/DeadReckoner.h" // should include component/Component.h in turn

// forward declare classes for which this class includes a pointer
class UniversalDataReader;

/**
 * Dead Reckoning navigator using:
 *  - UniversalURI::PLATFORM_SPEED_WRT_SEA_WATER
 *  - UniversalURI::SURFACE_NORTHWARD_SEA_WATER_VELOCITY
 *  - UniversalURI::SURFACE_EASTWARD_SEA_WATER_VELOCITY
 *
 * DeadReckonUsingCompactModelForecast.h should only be included by DeadReckonUsingCompactModelForecast.cpp
 * Other classes should include DeadReckonUsingCompactModelForecast.h
 *
 * \ingroup modules_navigation
 */
class DeadReckonUsingCompactModelForecast : public DeadReckoner
{
public:
    DeadReckonUsingCompactModelForecast( const Module* module );
    virtual ~DeadReckonUsingCompactModelForecast();
    void initialize( void );

protected: // TODO: why private vs. protected?
    UniversalDataReader* speedWaterReader_; // TODO: change to vector reader
    UniversalDataReader* uForecastReader_; // TODO: change to vector reader
    UniversalDataReader* vForecastReader_; // TODO: change to vector reader

    // variables specific to DR using compact model forecast
    Point3D velocityRelativeToWaterInVehicleFrame_; // from UniversalURI::PLATFORM_SPEED_WRT_SEA_WATER
    Point3D velocityRelativeToWaterInNavigationFrame_; // rotated into navigation frame
    Point3D velocityOfWaterRelativeToGroundInNavigationFrame_; // from compact model forecast

    // read in velocity required for dead reckoning calculation
    void readVehicleVelocity( void );

    // override deadReckon to include water velocities
    void deadReckon( void );
    // TODO: Consider makeing DeadReckoneWithRespectToSeawater a superclass that can read vehicle velocity and seawater velocity from many different sources.

    // all other parameters and methods are inherited
};

#endif /* DEADRECKONUSINGCOMPACTMODELFORECAST_H_ */
