//=========================================================================
// Summary  :
// Filename : MMTailcone.h
// Author   : paley
// Project  :
// Revision : 1
// Created  : 2001/05/14
// Modified : 2001/05/14
//=========================================================================
// Description :  Tailcone message
//=========================================================================
#ifndef _MMTAILCONE_H
#define _MMTAILCONE_H

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

#define TailconeMessageTimeOut 30

class MMTailcone : public MMConvertible
{

public:
	MMTailcone(const ModemMessage *pMM);
	MMTailcone(float propellerRpm, float elevatorAngle, float rudderAngle,
		int updateTime);

	virtual const char* pcRead(const char* sourceBuffer);
	virtual char* pcWrite(char* destBuffer) const;
	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMTailcone; };

	void setPropellerRpm(float propellerRpm)
		{ m_propellerRpm = MMUtil::double2char(propellerRpm,MIN_PROP_RPM,MAX_PROP_RPM); };
	void setElevatorAngle(float elevatorAngle)
		{ m_elevatorAngle = MMUtil::double2char(elevatorAngle,MIN_ACT_ANGLE,MAX_ACT_ANGLE); };
	void setRudderAngle(float rudderAngle)
		{ m_rudderAngle = MMUtil::double2char(rudderAngle,MIN_ACT_ANGLE,MAX_ACT_ANGLE); };
	void setUpdateTime(int updateTime)
		{ m_updateTime = updateTime; };

	float getPropellerRpm()
		{ return MMUtil::char2double(m_propellerRpm,MIN_PROP_RPM,MAX_PROP_RPM); };
	float getElevatorAngle()
		{ return MMUtil::char2double(m_elevatorAngle,MIN_ACT_ANGLE,MAX_ACT_ANGLE); };
	float getRudderAngle()
		{ return MMUtil::char2double(m_rudderAngle,MIN_ACT_ANGLE,MAX_ACT_ANGLE); };
	int getUpdateTime()
		{ return m_updateTime; };

	void toString(char* str);
	virtual int iGetDefaultTimeout() const { return TailconeMessageTimeOut; };
	static int size() { return 7; };

protected:
	//WARNING! m_propellerRpm resolution will be limited to
	// (MAX_PROP_RPM - MIN_PROP_RPM)/255 rpm
	uchar m_propellerRpm;
	//WARNING! m_elevatorAngle and m_rudderAngle resolution will be limited to
	// (MAX_ACT_ANGLE - MIN_ACT_ANGLE)/255 rad
	uchar m_elevatorAngle;
	uchar m_rudderAngle;
	int m_updateTime;

};

// This class is NOT compressed (for accuracy)
class MMTailconeRaw : public MMConvertible
{

public:
	MMTailconeRaw(const ModemMessage *pMM);
	MMTailconeRaw(short propeller, short elevator, short rudder, short throttle,
		int updateTime);

	virtual const char* pcRead(const char* sourceBuffer);
	virtual char* pcWrite(char* destBuffer) const;
	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMTailconeRaw; };

	void setPropeller(short propeller)
		{m_propeller = propeller; };
	void setElevator(short elevator)
		{ m_elevator = elevator; };
	void setRudder(short rudder)
		{ m_rudder = rudder; };
	void setThrottle(short throttle)
		{ m_throttle = throttle; };
	void setUpdateTime(int updateTime)
		{ m_updateTime = updateTime; };

	short getPropeller()
		{ return m_propeller; };
	short getElevator()
		{ return m_elevator; };
	short getRudder()
		{ return m_rudder; };
	short getThrottle ()
		{ return m_throttle; };
	int getUpdateTime()
		{ return m_updateTime; };

	void toString(char* str);
	static int size() { return 12; };

protected:

	short m_propeller;
	short m_elevator;
	short m_rudder;
	short m_throttle;
	int m_updateTime;

};

#endif
