/*----- PROTECTED REGION ID(IfchangeServer::DynAttrUtils.cpp) ENABLED START -----*/
static const char *RcsId = "$Id:  $";
//=============================================================================
//
// file :        IfchangeServerDynAttrUtils.cpp
//
// description : Dynamic attributes utilities file for the IfchangeServer class
//
// project :     
//
// 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:  $
//
// $Revision:  $
// $Date:  $
//
// $HeadURL:  $
//
//=============================================================================
//                This file is generated by POGO
//        (Program Obviously used to Generate tango Object)
//=============================================================================


#include <IfchangeServer.h>
#include <IfchangeServerClass.h>

/*----- PROTECTED REGION END -----*/	//	IfchangeServer::DynAttrUtils.cpp

//================================================================
//  Attributes managed is:
//================================================================
//  ioattr  |  Tango::DevDouble	Scalar
//================================================================

//	For compatibility reason, this file (IfchangeServerDynAttrUtils)
//	manage also the dynamic command utilities.
//================================================================
//  The following table gives the correspondence
//  between command and method names.
//
//  Command name  |  Method name
//================================================================
//  iocmd         |  iocmd
//================================================================

namespace IfchangeServer_ns
{
//=============================================================
//	Add/Remove dynamic attribute methods
//=============================================================

//--------------------------------------------------------
/**
 *	Add a ioattr dynamic attribute.
 *
 *  parameter attname: attribute name to be cretated and added.
 */
//--------------------------------------------------------
void IfchangeServer::add_ioattr_dynamic_attribute(std::string attname)
{
	//	Attribute : ioattr
	ioattrAttrib	*ioattr = new ioattrAttrib(attname);
	Tango::UserDefaultAttrProp	ioattr_prop;
	//	description	not set for ioattr
	//	label	not set for ioattr
	//	unit	not set for ioattr
	//	standard_unit	not set for ioattr
	//	display_unit	not set for ioattr
	//	format	not set for ioattr
	//	max_value	not set for ioattr
	//	min_value	not set for ioattr
	//	max_alarm	not set for ioattr
	//	min_alarm	not set for ioattr
	//	max_warning	not set for ioattr
	//	min_warning	not set for ioattr
	//	delta_t	not set for ioattr
	//	delta_val	not set for ioattr
	
	/*----- PROTECTED REGION ID(IfchangeServer::att_ioattr_dynamic_attribute) ENABLED START -----*/
	
	
	/*----- PROTECTED REGION END -----*/	//	IfchangeServer::att_ioattr_dynamic_attribute
	ioattr->set_default_properties(ioattr_prop);
	//	Not Polled
	ioattr->set_disp_level(Tango::OPERATOR);
	//	Not Memorized
	ioattr_data.insert(make_pair(attname, 0.0));
	add_attribute(ioattr);
}
//--------------------------------------------------------
/**
 *	remove a ioattr dynamic attribute.
 *
 *  parameter attname: attribute name to be removed.
 */
//--------------------------------------------------------
void IfchangeServer::remove_ioattr_dynamic_attribute(std::string attname)
{
	remove_attribute(attname, true);
	map<std::string,Tango::DevDouble>::iterator ite;
    if ((ite=ioattr_data.find(attname))!=ioattr_data.end())
    {
    	/*----- PROTECTED REGION ID(IfchangeServer::remove_ioattr_dynamic_attribute) ENABLED START -----*/
    	
    	/*----- PROTECTED REGION END -----*/	//	IfchangeServer::remove_ioattr_dynamic_attribute
		ioattr_data.erase(ite);
	}
}


//============================================================
//	Tool methods to get pointer on attribute data buffer 
//============================================================
//--------------------------------------------------------
/**
 *	Return a pointer on ioattr data.
 *
 *  parameter attname: the specified attribute name.
 */
//--------------------------------------------------------
Tango::DevDouble *IfchangeServer::get_ioattr_data_ptr(std::string &name)
{
	map<std::string,Tango::DevDouble>::iterator ite;
    if ((ite=ioattr_data.find(name))==ioattr_data.end())
    {
		TangoSys_OMemStream	tms;
		tms << "Dynamic attribute " << name << " has not been created";
		Tango::Except::throw_exception(
					(const char *)"ATTRIBUTE_NOT_FOUND",
					tms.str().c_str(),
					(const char *)"IfchangeServer::get_ioattr_data_ptr()");
    }
	return  &(ite->second);
}


//=============================================================
//	Add/Remove dynamic command methods
//=============================================================

//--------------------------------------------------------
/**
 *	Add a iocmd dynamic command.
 *
 *  parameter cmdname: command name to be cretated and added.
 *  parameter device:  Set this flag to true if the command must be added for only this device.
 */
//--------------------------------------------------------
void IfchangeServer::add_iocmd_dynamic_command(std::string cmdname, bool device)
{
	iocmdClass	*piocmdCmd =
		new iocmdClass(cmdname.c_str(),
			Tango::DEV_VOID, Tango::DEV_VOID,
			"",
			"",
			Tango::OPERATOR);
	add_command(piocmdCmd, device);
}
//--------------------------------------------------------
/**
 *	remove a iocmd dynamic command.
 *
 *  parameter cmdname: command name to be removed.
 */
//--------------------------------------------------------
void IfchangeServer::remove_iocmd_dynamic_command(std::string cmdname)
{
	remove_command(cmdname, true);
}

} //	namespace
