//=========================================================================
// Summary  :
// Filename : MMPower.h
// Author   : paley
// Project  :
// Revision : 1
// Created  : 2001/05/15
// Modified : 2001/05/15
//=========================================================================
// Description :  Power system messages
//=========================================================================
#ifndef _MMPOWER_H
#define _MMPOWER_H

#include "ModemMessage.h"
#include "MMUtils.h"
#include <string>

#define PowerMessageTimeOut 30

////////////////////////////////////////////////////
class MMCircuit : public MMNumberedBoolean
{

public:
	MMCircuit(const ModemMessage *pMM);
	MMCircuit(int number, Boolean value);

	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMCircuit; };
	virtual int iGetDefaultTimeout() const
		{ return PowerMessageTimeOut; };
	virtual Priority pGetDefaultPriority() const
		{ return pHIGH; };

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

////////////////////////////////////////////////////
class MMCircuitBatch : public MMBooleanArray
{

public:

	MMCircuitBatch(const ModemMessage *pMM);
	MMCircuitBatch(int number);

	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMCircuitBatch; };
	virtual int iGetDefaultTimeout() const
		{ return PowerMessageTimeOut; };
	virtual Priority pGetDefaultPriority() const
		{ return pHIGH; };

	void toString(char* str, int number);
	static int size(int n) { return MMBooleanArray::size(n); };
};

////////////////////////////////////////////////////
class MMCircuitCurrent : public MMNumberedFloat
{

public:
	MMCircuitCurrent(const ModemMessage *pMM);
	MMCircuitCurrent(int number, float value);
	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMCircuitCurrent; };
	virtual Priority pGetDefaultPriority() const
		{ return pHIGH; };

	virtual float getValue()
		{ return MMNumberedFloat::getValue(MIN_CIRCUIT_CUR,MAX_CIRCUIT_CUR); };
	virtual void setValue(float value)
		{ MMNumberedFloat::setValue(m_value,MIN_CIRCUIT_CUR,MAX_CIRCUIT_CUR); };

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

};

////////////////////////////////////////////////////
class MMCircuitCurrentBatch : public MMFloatArray
{

public:

	MMCircuitCurrentBatch(const ModemMessage *pMM);
	MMCircuitCurrentBatch(int number);

	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMCircuitCurrentBatch; };
	virtual int iGetDefaultTimeout() const
		{ return PowerMessageTimeOut; };
	virtual Priority pGetDefaultPriority() const
		{ return pHIGH; };

	float getValue(int number)
		{ return MMFloatArray::getValue(number,MIN_CIRCUIT_CUR,MAX_CIRCUIT_CUR); };
	void setValue(int number, float value)
	    { MMFloatArray::setValue(number,value,MIN_CIRCUIT_CUR,MAX_CIRCUIT_CUR); };

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

//////////////////////////////////////////////////////////
class MMCircuitInfo : public MMConvertible
{

 public:

    MMCircuitInfo(const ModemMessage *pMM);
    MMCircuitInfo(short num, const char* name);
    
    virtual ModemMessage::Type tGetMessageType() const
	{ return ModemMessage::tMMCircuitInfo; };
    virtual int iGetDefaultTimeout() const 
	{ return PowerMessageTimeOut; };
    virtual const char* pcRead(const char* sourceBuffer);
    virtual char* pcWrite(char* destbuffer) const;
    
    short getNum()
	{ return m_circNum; };
    void setNum(int num)
	{ m_circNum = num; };

    const char *getName()
	{ return m_circName.c_str(); };
 private:

    short m_circNum;
    string m_circName;
    uchar m_status;
};
    


////////////////////////////////////////////////////
class MMGroundFaultCurrent : public MMNumberedFloat
{

public:
	MMGroundFaultCurrent(const ModemMessage *pMM);
	MMGroundFaultCurrent(int number, float value);
	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMGroundFaultCurrent; };
	virtual Priority pGetDefaultPriority() const
		{ return pHIGH; };

	virtual float getValue()
		{ return MMNumberedFloat::getValue(MIN_GFAULT_CUR,MAX_GFAULT_CUR); };
	virtual void setValue(float value)
		{ MMNumberedFloat::setValue(m_value,MIN_GFAULT_CUR,MAX_GFAULT_CUR); };

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

////////////////////////////////////////////////////
class MMGroundFaultCurrentBatch : public MMFloatArray
{

public:

	MMGroundFaultCurrentBatch(const ModemMessage *pMM);
	MMGroundFaultCurrentBatch(int number);

	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMGroundFaultCurrentBatch; };
	virtual int iGetDefaultTimeout() const
		{ return PowerMessageTimeOut; };
	virtual Priority pGetDefaultPriority() const
		{ return pHIGH; };

	float getValue(int number)
		{ return MMFloatArray::getValue(number,MIN_GFAULT_CUR,MAX_GFAULT_CUR); };
	void setValue(int number, float value)
		{ MMFloatArray::setValue(number,value,MIN_GFAULT_CUR,MAX_GFAULT_CUR); };

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

};

////////////////////////////////////////////////////
class MMTemperature : public MMNumberedFloat
{

public:
	MMTemperature(const ModemMessage *pMM);
	MMTemperature(int number, float value);
	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMTemperature; };
	virtual Priority pGetDefaultPriority() const
		{ return pHIGH; };

	virtual float getValue()
		{ return MMNumberedFloat::getValue(MIN_TEMP,MAX_TEMP); };
	virtual void setValue(float value)
		{ MMNumberedFloat::setValue(m_value,MIN_TEMP,MAX_TEMP); };

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

////////////////////////////////////////////////////
class MMTemperatureBatch : public MMFloatArray
{

public:

	MMTemperatureBatch(const ModemMessage *pMM);
	MMTemperatureBatch(int number);

	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMTemperatureBatch; };
	virtual int iGetDefaultTimeout() const
		{ return PowerMessageTimeOut; };
	virtual Priority pGetDefaultPriority() const
		{ return pHIGH; };

	float getValue(int number)
		{ return MMFloatArray::getValue(number,MIN_TEMP,MAX_TEMP); };
	void setValue(int number, float value)
		{ MMFloatArray::setValue(number,value,MIN_TEMP,MAX_TEMP); };

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

////////////////////////////////////////////////////
class MMWatchdog : public MMNumberedBoolean
{

public:

	enum Watchdog
	{
		MVC = 0,
		Tailcone,
		//insert here
		numWatchdogs
	};


	MMWatchdog(const ModemMessage *pMM);
	MMWatchdog(int number, Boolean value);

	virtual ModemMessage::Type tGetMessageType() const
		{ return ModemMessage::tMMWatchdog; };
	virtual int iGetDefaultTimeout() const
		{ return PowerMessageTimeOut; };
	virtual Priority pGetDefaultPriority() const
		{ return pHIGH; };

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

#endif
