/** \file
 *
 *  Contains the DeadReckoner class declaration.
 *
 *  Navigator.h should only be included by DeadReckoner.cpp and children.
 *
 *  Copyright (c) 2013 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
*/
#ifndef DEADRECKONER_H_
#define DEADRECKONER_H_

// include parent class
#include "navigationModule/Navigator.h"
// forward declare classes for which this class includes a pointer
class ConfigReader;

/**
 * General dead reckoner class.
 *
 * DeadReckoner.h should only be included by DeadReckoner.cpp and children.
 *
 * \ingroup modules_navigation
 */
class DeadReckoner : public Navigator
{
public:

    friend class DeadReckonUsingMultipleVelocitySourcesVector;
    friend class DeadReckonUsingMultipleVelocitySources;
    friend class DeadReckonWithRespectToSeafloor;
    friend class DeadReckonWithRespectToWater;
    friend class DeadReckonUsingDVLWaterTrack;

    DeadReckoner( const Str& name, const Module* module );

    virtual ~DeadReckoner();

    void run( void );

protected:

    // TODO: Some of the parameters below may be upgraded to the Navigator superclass.
    double elapsedTime_; // seconds since last computation cycle -- this is the dt used in discrete time integration
    double distance_; // distance traveled during this cycle
    double northing_, easting_; // directional displacements in meters since last computation cycle
    double horizontalDisplacement_; // magnitude of horizontal displacement in meters since last computation cycle

    // perform actual dead reckoning computation
    virtual void deadReckon( void ); // this is a regular virtual, as opposed to a pure virtual -- we still want to be able to override it in subclasses that need to account for water velocity, for example
};

#endif /* DEADRECKONER_H_ */
