/** \file
 *
 *  Contains the DeadReckonUsingMultipleVelocitySources class declaration.
 *
 *  DeadReckonUsingMultipleVelocitySources.h should only be included by
 *  DeadReckonUsingMultipleVelocitySources.cpp
 *  Other classes should include DeadReckonUsingMultipleVelocitySourcesIF.h
 *
 *  Copyright (c) 2013 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
*/
#ifndef DEADRECKONUSINGMULTIPLEVELOCITYSOURCES_H_
#define DEADRECKONUSINGMULTIPLEVELOCITYSOURCES_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 multiple sources for velocity:
 *
 * first choice:    UniversalURI::PLATFORM_VELOCITY_WRT_GROUND
 * second choice:   (deprecated)
 * third choice:    (deprecated)
 * fourth choice:   SpeedCalculator::PLATFORM_SPEED_WRT_SEA_WATER
 *
 *
 * DeadReckonUsingMultipleVelocitySources.h should only be included by
 * DeadReckonUsingMultipleVelocitySources.cpp
 * Other classes should include DeadReckonUsingMultipleVelocitySources.h
 *
 * \ingroup modules_navigation
 */
class DeadReckonUsingMultipleVelocitySources : public DeadReckoner
{
public:
    DeadReckonUsingMultipleVelocitySources( const Module* module );
    virtual ~DeadReckonUsingMultipleVelocitySources();
    void initialize( void );

protected: // TODO: why private vs. protected?
    UniversalBlobReader* velocityBottomReader_;
    UniversalBlobReader* velocityWaterReader_;
    UniversalDataReader* speedWaterReader_;
    DataReader* speedCalculatorReader_;
    DataWriter* velocitySourceWriter_;
    DataWriter* cyclesSinceSuccessfulReadWriter_;

    int velocitySource_, cyclesSinceSuccessfulRead_, maxCyclesToUseSameData_;

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

    // all other parameters and methods are inherited
};

#endif /* DEADRECKONUSINGMULTIPLEVELOCITYSOURCES_H_ */
