/*----- PROTECTED REGION ID(PespCCDStageClass.h) ENABLED START -----*/
//=============================================================================
//
// file :        PespCCDStageClass.h
//
// description : Include for the PespCCDStage root class.
//               This class is the singleton class for
//                the PespCCDStage device class.
//               It contains all properties and methods which the 
//               PespCCDStage requires only once e.g. the commands.
//
// project :     PespCCDStage
//
// This file is part of Tango device class.
// 
// Tango is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// Tango is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with Tango.  If not, see <http://www.gnu.org/licenses/>.
// 
// $Author: abrami $
//
//
//=============================================================================
//                This file is generated by POGO
//        (Program Obviously used to Generate tango Object)
//=============================================================================


#ifndef PespCCDStageClass_H
#define PespCCDStageClass_H

#include <tango.h>
#include <PespCCDStage.h>

/*----- PROTECTED REGION END -----*/	//	PespCCDStageClass.h


namespace PespCCDStage_ns
{
/*----- PROTECTED REGION ID(PespCCDStageClass::classes for dynamic creation) ENABLED START -----*/


/*----- PROTECTED REGION END -----*/	//	PespCCDStageClass::classes for dynamic creation

//=========================================
//	Define classes for attributes
//=========================================
//	Attribute StageType class definition
class StageTypeAttrib: public Tango::Attr
{
public:
	StageTypeAttrib():Attr("StageType",
			Tango::DEV_STRING, Tango::READ) {};
	~StageTypeAttrib() {};
	virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
		{(static_cast<PespCCDStage *>(dev))->read_StageType(att);}
	virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
		{return (static_cast<PespCCDStage *>(dev))->is_StageType_allowed(ty);}
};

//	Attribute FocusX class definition
class FocusXAttrib: public Tango::Attr
{
public:
	FocusXAttrib():Attr("FocusX",
			Tango::DEV_DOUBLE, Tango::READ_WRITE) {};
	~FocusXAttrib() {};
	virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
		{(static_cast<PespCCDStage *>(dev))->read_FocusX(att);}
	virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att)
		{(static_cast<PespCCDStage *>(dev))->write_FocusX(att);}
	virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
		{return (static_cast<PespCCDStage *>(dev))->is_FocusX_allowed(ty);}
};

//	Attribute FocusZ class definition
class FocusZAttrib: public Tango::Attr
{
public:
	FocusZAttrib():Attr("FocusZ",
			Tango::DEV_DOUBLE, Tango::READ_WRITE) {};
	~FocusZAttrib() {};
	virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
		{(static_cast<PespCCDStage *>(dev))->read_FocusZ(att);}
	virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att)
		{(static_cast<PespCCDStage *>(dev))->write_FocusZ(att);}
	virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
		{return (static_cast<PespCCDStage *>(dev))->is_FocusZ_allowed(ty);}
};

//	Attribute FocusDistance class definition
class FocusDistanceAttrib: public Tango::Attr
{
public:
	FocusDistanceAttrib():Attr("FocusDistance",
			Tango::DEV_DOUBLE, Tango::READ_WRITE) {};
	~FocusDistanceAttrib() {};
	virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
		{(static_cast<PespCCDStage *>(dev))->read_FocusDistance(att);}
	virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att)
		{(static_cast<PespCCDStage *>(dev))->write_FocusDistance(att);}
	virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
		{return (static_cast<PespCCDStage *>(dev))->is_FocusDistance_allowed(ty);}
};

//	Attribute FocusAngle class definition
class FocusAngleAttrib: public Tango::Attr
{
public:
	FocusAngleAttrib():Attr("FocusAngle",
			Tango::DEV_DOUBLE, Tango::READ_WRITE) {};
	~FocusAngleAttrib() {};
	virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
		{(static_cast<PespCCDStage *>(dev))->read_FocusAngle(att);}
	virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att)
		{(static_cast<PespCCDStage *>(dev))->write_FocusAngle(att);}
	virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
		{return (static_cast<PespCCDStage *>(dev))->is_FocusAngle_allowed(ty);}
};

//	Attribute Pitch class definition
class PitchAttrib: public Tango::Attr
{
public:
	PitchAttrib():Attr("Pitch",
			Tango::DEV_DOUBLE, Tango::READ) {};
	~PitchAttrib() {};
	virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
		{(static_cast<PespCCDStage *>(dev))->read_Pitch(att);}
	virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
		{return (static_cast<PespCCDStage *>(dev))->is_Pitch_allowed(ty);}
};

//	Attribute BeamOnYagDisplacement class definition
class BeamOnYagDisplacementAttrib: public Tango::Attr
{
public:
	BeamOnYagDisplacementAttrib():Attr("BeamOnYagDisplacement",
			Tango::DEV_DOUBLE, Tango::READ_WRITE) {};
	~BeamOnYagDisplacementAttrib() {};
	virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
		{(static_cast<PespCCDStage *>(dev))->read_BeamOnYagDisplacement(att);}
	virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att)
		{(static_cast<PespCCDStage *>(dev))->write_BeamOnYagDisplacement(att);}
	virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
		{return (static_cast<PespCCDStage *>(dev))->is_BeamOnYagDisplacement_allowed(ty);}
};

//	Attribute UpdateOnDisplacement class definition
class UpdateOnDisplacementAttrib: public Tango::Attr
{
public:
	UpdateOnDisplacementAttrib():Attr("UpdateOnDisplacement",
			Tango::DEV_BOOLEAN, Tango::READ_WRITE) {};
	~UpdateOnDisplacementAttrib() {};
	virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
		{(static_cast<PespCCDStage *>(dev))->read_UpdateOnDisplacement(att);}
	virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att)
		{(static_cast<PespCCDStage *>(dev))->write_UpdateOnDisplacement(att);}
	virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
		{return (static_cast<PespCCDStage *>(dev))->is_UpdateOnDisplacement_allowed(ty);}
};

//	Attribute FilterTrackEnable class definition
class FilterTrackEnableAttrib: public Tango::Attr
{
public:
	FilterTrackEnableAttrib():Attr("FilterTrackEnable",
			Tango::DEV_BOOLEAN, Tango::READ_WRITE) {};
	~FilterTrackEnableAttrib() {};
	virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
		{(static_cast<PespCCDStage *>(dev))->read_FilterTrackEnable(att);}
	virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att)
		{(static_cast<PespCCDStage *>(dev))->write_FilterTrackEnable(att);}
	virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
		{return (static_cast<PespCCDStage *>(dev))->is_FilterTrackEnable_allowed(ty);}
};


//=========================================
//	Define classes for dynamic attributes
//=========================================
//	Attribute YagSelector class definition
class YagSelectorAttrib: public Tango::Attr
{
public:
	YagSelectorAttrib(const string &att_name):Attr(att_name.c_str(), 
			Tango::DEV_USHORT, Tango::READ_WRITE) {};
	~YagSelectorAttrib() {};
	virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
		{(static_cast<PespCCDStage *>(dev))->read_YagSelector(att);}
	virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att)
		{(static_cast<PespCCDStage *>(dev))->write_YagSelector(att);}
	virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
		{return (static_cast<PespCCDStage *>(dev))->is_YagSelector_allowed(ty);}
};

//	Attribute UpdateOnSelector class definition
class UpdateOnSelectorAttrib: public Tango::Attr
{
public:
	UpdateOnSelectorAttrib(const string &att_name):Attr(att_name.c_str(), 
			Tango::DEV_BOOLEAN, Tango::READ_WRITE) {};
	~UpdateOnSelectorAttrib() {};
	virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
		{(static_cast<PespCCDStage *>(dev))->read_UpdateOnSelector(att);}
	virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att)
		{(static_cast<PespCCDStage *>(dev))->write_UpdateOnSelector(att);}
	virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
		{return (static_cast<PespCCDStage *>(dev))->is_UpdateOnSelector_allowed(ty);}
};


//=========================================
//	Define classes for commands
//=========================================
//	Command SetAngleDistance class definition
class SetAngleDistanceClass : public Tango::Command
{
public:
	SetAngleDistanceClass(const char   *name,
	               Tango::CmdArgType in,
				   Tango::CmdArgType out,
				   const char        *in_desc,
				   const char        *out_desc,
				   Tango::DispLevel  level)
	:Command(name,in,out,in_desc,out_desc, level)	{};

	SetAngleDistanceClass(const char   *name,
	               Tango::CmdArgType in,
				   Tango::CmdArgType out)
	:Command(name,in,out)	{};
	~SetAngleDistanceClass() {};
	
	virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any);
	virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any)
	{return (static_cast<PespCCDStage *>(dev))->is_SetAngleDistance_allowed(any);}
};

//	Command Stop class definition
class StopClass : public Tango::Command
{
public:
	StopClass(const char   *name,
	               Tango::CmdArgType in,
				   Tango::CmdArgType out,
				   const char        *in_desc,
				   const char        *out_desc,
				   Tango::DispLevel  level)
	:Command(name,in,out,in_desc,out_desc, level)	{};

	StopClass(const char   *name,
	               Tango::CmdArgType in,
				   Tango::CmdArgType out)
	:Command(name,in,out)	{};
	~StopClass() {};
	
	virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any);
	virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any)
	{return (static_cast<PespCCDStage *>(dev))->is_Stop_allowed(any);}
};

//	Command GetInstrumentList class definition
class GetInstrumentListClass : public Tango::Command
{
public:
	GetInstrumentListClass(const char   *name,
	               Tango::CmdArgType in,
				   Tango::CmdArgType out,
				   const char        *in_desc,
				   const char        *out_desc,
				   Tango::DispLevel  level)
	:Command(name,in,out,in_desc,out_desc, level)	{};

	GetInstrumentListClass(const char   *name,
	               Tango::CmdArgType in,
				   Tango::CmdArgType out)
	:Command(name,in,out)	{};
	~GetInstrumentListClass() {};
	
	virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any);
	virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any)
	{return (static_cast<PespCCDStage *>(dev))->is_GetInstrumentList_allowed(any);}
};


/**
 *	The PespCCDStageClass singleton definition
 */

#ifdef _TG_WINDOWS_
class __declspec(dllexport)  PespCCDStageClass : public Tango::DeviceClass
#else
class PespCCDStageClass : public Tango::DeviceClass
#endif
{
	/*----- PROTECTED REGION ID(PespCCDStageClass::Additionnal DServer data members) ENABLED START -----*/
	
	
	/*----- PROTECTED REGION END -----*/	//	PespCCDStageClass::Additionnal DServer data members

	public:
		//	write class properties data members
		Tango::DbData	cl_prop;
		Tango::DbData	cl_def_prop;
		Tango::DbData	dev_def_prop;
	
		//	Method prototypes
		static PespCCDStageClass *init(const char *);
		static PespCCDStageClass *instance();
		~PespCCDStageClass();
		Tango::DbDatum	get_class_property(string &);
		Tango::DbDatum	get_default_device_property(string &);
		Tango::DbDatum	get_default_class_property(string &);
	
	protected:
		PespCCDStageClass(string &);
		static PespCCDStageClass *_instance;
		void command_factory();
		void attribute_factory(vector<Tango::Attr *> &);
		void pipe_factory();
		void write_class_property();
		void set_default_property();
		void get_class_property();
		string get_cvstag();
		string get_cvsroot();
	
	private:
		void device_factory(const Tango::DevVarStringArray *);
		void create_static_attribute_list(vector<Tango::Attr *> &);
		void erase_dynamic_attributes(const Tango::DevVarStringArray *,vector<Tango::Attr *> &);
		vector<string>	defaultAttList;
		Tango::Attr *get_attr_object_by_name(vector<Tango::Attr *> &att_list, string attname);
};

}	//	End of namespace

#endif   //	PespCCDStage_H