//=========================================================================
// Summary  :
// Filename : MMDvl.h
// Author   : paley
// Project  :
// Revision : 1
// Created  : 2001/06/29
// Modified : 2001/06/29
//=========================================================================
// Description :  Dvl device messages
//=========================================================================
#ifndef _MMDVL_H
#define _MMDVL_H

#include "ModemMessage.h"
#include "MMUtils.h"
#include "MMNavigation.h"

#define DvlMessageTimeOut 30

////////////////////////////////////////////////////
class MMDvl : public MMFloatArray
{

public:

	MMDvl(const ModemMessage *pMM);
	MMDvl(float vx, float vy, float vz, float range, int updateTime);

	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMDvl; };
	virtual int iGetDefaultTimeout() const
		{ return DvlMessageTimeOut; };

	float getVx()
		{ return MMFloatArray::getValue(0,MIN_SPEED,MAX_SPEED); };
	void setVx(float value)
		{ MMFloatArray::setValue(0,value,MIN_SPEED,MAX_SPEED); };

	float getVy()
		{ return MMFloatArray::getValue(1,MIN_SPEED,MAX_SPEED); };
	void setVy(float value)
		{ MMFloatArray::setValue(1,value,MIN_SPEED,MAX_SPEED); };

	float getVz()
		{ return MMFloatArray::getValue(2,MIN_SPEED,MAX_SPEED); };
	void setVz(float value)
		{ MMFloatArray::setValue(2,value,MIN_SPEED,MAX_SPEED); };

	float getRange()
		{ return MMFloatArray::getValue(3,MIN_RANGE,MAX_RANGE); };
	void setRange(float value)
		{ MMFloatArray::setValue(3,value,MIN_RANGE,MAX_RANGE); };

	int getUpdateTime()
		{ return m_updateTime; };
	void setUpdateTime(int updateTime)
		{ m_updateTime = updateTime; };

	void toString(char* str);
	static int size() { return 4+MMFloatArray::size(4); };

protected:

	int m_updateTime;
	
};

////////////////////////////////////////////////////
class MMDvlBeamVelocities : public MMFloatArray
{

public:

	MMDvlBeamVelocities(const ModemMessage *pMM);
	MMDvlBeamVelocities(float v1, float v2, float v3, float v4);

	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMDvlBeamVelocities; };
	virtual int iGetDefaultTimeout() const
		{ return DvlMessageTimeOut; };

	float getVelocity1()
		{ return MMFloatArray::getValue(0,MIN_SPEED,MAX_SPEED); };
	void setVelocity1(float value)
		{ MMFloatArray::setValue(0,value,MIN_SPEED,MAX_SPEED); };

	float getVelocity2()
		{ return MMFloatArray::getValue(1,MIN_SPEED,MAX_SPEED); };
	void setVelocity2(float value)
		{ MMFloatArray::setValue(1,value,MIN_SPEED,MAX_SPEED); };

	float getVelocity3()
		{ return MMFloatArray::getValue(2,MIN_SPEED,MAX_SPEED); };
	void setVelocity3(float value)
		{ MMFloatArray::setValue(2,value,MIN_SPEED,MAX_SPEED); };

	float getVelocity4()
		{ return MMFloatArray::getValue(3,MIN_SPEED,MAX_SPEED); };
	void setVelocity4(float value)
		{ MMFloatArray::setValue(3,value,MIN_SPEED,MAX_SPEED); };

	void toString(char* str);
	static int size() { return MMFloatArray::size(4); };

};

////////////////////////////////////////////////////
class MMDvlBeamRanges : public MMFloatArray
{

public:

	MMDvlBeamRanges(const ModemMessage *pMM);
	MMDvlBeamRanges(float r1, float r2, float r3, float r4);

	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMDvlBeamRanges; };
	virtual int iGetDefaultTimeout() const
		{ return DvlMessageTimeOut; };

	float getRange1()
		{ return MMFloatArray::getValue(0,MIN_RANGE,MAX_RANGE); };
	void setRange1(float value)
		{ MMFloatArray::setValue(0,value,MIN_RANGE,MAX_RANGE); };

	float getRange2()
		{ return MMFloatArray::getValue(1,MIN_RANGE,MAX_RANGE); };
	void setRange2(float value)
		{ MMFloatArray::setValue(1,value,MIN_RANGE,MAX_RANGE); };

	float getRange3()
		{ return MMFloatArray::getValue(2,MIN_RANGE,MAX_RANGE); };
	void setRange3(float value)
		{ MMFloatArray::setValue(2,value,MIN_RANGE,MAX_RANGE); };

	float getRange4()
		{ return MMFloatArray::getValue(3,MIN_RANGE,MAX_RANGE); };
	void setRange4(float value)
		{ MMFloatArray::setValue(3,value,MIN_RANGE,MAX_RANGE); };

	void toString(char* str);
	static int size() { return MMFloatArray::size(4); };
};

/////////////////////////////////////////////////////////////////
class MMDvlAttTemp : public MMNavigationAttitude
{

 public:
    
    MMDvlAttTemp(const ModemMessage *pMM);
    MMDvlAttTemp(float roll, float pitch, float yaw, float temp, int updateTime);

    virtual const char* pcRead(const char* sourceBuffer);
    virtual char* pcWrite(char* destBuffer) const;
    
    virtual ModemMessage::Type tGetMessageType() const
	{ return ModemMessage::tMMDvlAttTemp; };
    virtual int iGetDefaultTimeout() const
	{ return DvlMessageTimeOut; };
    
    float getTemp()
	{ return m_temp; };
    void setTemp(float t)
	{ m_temp = t; };
    
 protected:
    
    float m_temp;
};
#endif
