/*----- PROTECTED REGION ID(AccessConfClass.cpp) ENABLED START -----*/
static const char *TagName = "$Name: $";
static const char *CvsPath = "$Source: /home/cvsadm/cvsroot/fermi/servers/accessconf/src/AccessConfClass.cpp,v $";
static const char *SvnPath = "$HeadURL: $";
static const char *HttpServer = "http://www.esrf.eu/computing/cs/tango/tango_doc/ds_doc/";
//=============================================================================
//
// file : AccessConfClass.cpp
//
// description : C++ source for the AccessConfClass. A singleton
// class derived from DeviceClass. It implements the
// command list and all properties and methods required
// by the �name� once per process.
//
// project : Storage Ring Access.
//
// $Author: graziano $
//
// $Revision: 1.2 $
// $Date: 2019-11-06 08:23:36 $
//
// SVN only:
// $HeadURL: $
//
// CVS only:
// $Source: /home/cvsadm/cvsroot/fermi/servers/accessconf/src/AccessConfClass.cpp,v $
// $Log: AccessConfClass.cpp,v $
// Revision 1.2 2019-11-06 08:23:36 graziano
// Added cutoff_ind to change/disable index for cutoff
//
// Revision 1.1 2012-10-30 09:29:15 graziano
// *** empty log message ***
//
//
//
//=============================================================================
// This file is generated by POGO
// (Program Obviously used to Generate tango Object)
//=============================================================================
#include <AccessConfClass.h>
/*----- PROTECTED REGION END -----*/
//-------------------------------------------------------------------
/**
* Create AccessConfClass singleton and
* return it in a C function for Python usage
*/
//-------------------------------------------------------------------
extern "C" {
#ifdef _TG_WINDOWS_
__declspec(dllexport)
#endif
Tango::DeviceClass *_create_AccessConf_class(const char *name) {
return AccessConf_ns::AccessConfClass::init(name);
}
}
namespace AccessConf_ns
{
//===================================================================
// Initialize pointer for singleton pattern
//===================================================================
AccessConfClass *AccessConfClass::_instance = NULL;
//--------------------------------------------------------
/**
* method : AccessConfClass::AccessConfClass(string &s)
* description : constructor for the AccessConfClass
*
* @param s The class name
*/
//--------------------------------------------------------
AccessConfClass::AccessConfClass(string &s):DeviceClass(s)
{
cout2 << "Entering AccessConfClass constructor" << endl;
set_default_property();
get_class_property();
write_class_property();
/*----- PROTECTED REGION ID(AccessConf::Class::constructor) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AccessConf::Class::constructor
cout2 << "Leaving AccessConfClass constructor" << endl;
}
//--------------------------------------------------------
/**
* method : AccessConfClass::~AccessConfClass()
* description : destructor for the AccessConfClass
*/
//--------------------------------------------------------
AccessConfClass::~AccessConfClass()
{
/*----- PROTECTED REGION ID(AccessConf::Class::destructor) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AccessConf::Class::destructor
_instance = NULL;
}
//--------------------------------------------------------
/**
* method : AccessConfClass::init
* description : Create the object if not already done.
* Otherwise, just return a pointer to the object
*
* @param name The class name
*/
//--------------------------------------------------------
AccessConfClass *AccessConfClass::init(const char *name)
{
if (_instance == NULL)
{
try
{
string s(name);
_instance = new AccessConfClass(s);
}
catch (bad_alloc)
{
throw;
}
}
return _instance;
}
//--------------------------------------------------------
/**
* method : AccessConfClass::instance
* description : Check if object already created,
* and return a pointer to the object
*/
//--------------------------------------------------------
AccessConfClass *AccessConfClass::instance()
{
if (_instance == NULL)
{
cerr << "Class is not initialised !!" << endl;
exit(-1);
}
return _instance;
}
//===================================================================
// Command execution method calls
//===================================================================
//===================================================================
// Properties management
//===================================================================
//--------------------------------------------------------
/**
* method : AccessConfClass::get_class_property
* description : Get the class property for specified name.
*
* @param name The property name
*/
//--------------------------------------------------------
Tango::DbDatum AccessConfClass::get_class_property(string &prop_name)
{
for (unsigned int i=0 ; i<cl_prop.size() ; i++)
if (cl_prop[i].name == prop_name)
return cl_prop[i];
// if not found, returns an empty DbDatum
return Tango::DbDatum(prop_name);
}
//--------------------------------------------------------
/**
* Method : AccessConf::AccessConfClass::get_default_device_property()()
* Description : Return the default value for device property.
*/
//--------------------------------------------------------
Tango::DbDatum AccessConfClass::get_default_device_property(string &prop_name)
{
for (unsigned int i=0 ; i<dev_def_prop.size() ; i++)
if (dev_def_prop[i].name == prop_name)
return dev_def_prop[i];
// if not found, return an empty DbDatum
return Tango::DbDatum(prop_name);
}
//--------------------------------------------------------
/**
* Method : AccessConf::AccessConfClass::get_default_class_property()()
* Description : Return the default value for class property.
*/
//--------------------------------------------------------
Tango::DbDatum AccessConfClass::get_default_class_property(string &prop_name)
{
for (unsigned int i=0 ; i<cl_def_prop.size() ; i++)
if (cl_def_prop[i].name == prop_name)
return cl_def_prop[i];
// if not found, return an empty DbDatum
return Tango::DbDatum(prop_name);
}
//--------------------------------------------------------
/**
* Method : AccessConf::AccessConfClass::get_class_property()
* Description : // Add your own code to initialize
*/
//--------------------------------------------------------
void AccessConfClass::get_class_property()
{
}
//--------------------------------------------------------
/**
* Method : AccessConf::AccessConfClass::set_default_property()
* Description : Set default property (class and device) for wizard.
* For each property, add to wizard property name and description.
* If default value has been set, add it to wizard property and.
* store it in a DbDatum.
*/
//--------------------------------------------------------
void AccessConfClass::set_default_property()
{
string prop_name;
string prop_desc;
string prop_def;
vector<string> vect_data;
// Set Default Class Properties
// Set Default Device Properties
prop_name = "Low_level_srv";
prop_desc = "";
prop_def = "";
vect_data.clear();
if (prop_def.length()>0)
{
Tango::DbDatum data(prop_name);
data << vect_data ;
dev_def_prop.push_back(data);
add_wiz_dev_prop(prop_name, prop_desc, prop_def);
}
else
add_wiz_dev_prop(prop_name, prop_desc);
prop_name = "Attr_config_prop";
prop_desc = "";
prop_def = "";
vect_data.clear();
if (prop_def.length()>0)
{
Tango::DbDatum data(prop_name);
data << vect_data ;
dev_def_prop.push_back(data);
add_wiz_dev_prop(prop_name, prop_desc, prop_def);
}
else
add_wiz_dev_prop(prop_name, prop_desc);
prop_name = "Attr_config_file";
prop_desc = "";
prop_def = "";
vect_data.clear();
if (prop_def.length()>0)
{
Tango::DbDatum data(prop_name);
data << vect_data ;
dev_def_prop.push_back(data);
add_wiz_dev_prop(prop_name, prop_desc, prop_def);
}
else
add_wiz_dev_prop(prop_name, prop_desc);
prop_name = "Cutoff_ind";
prop_desc = "";
prop_def = "3";
vect_data.clear();
if (prop_def.length()>0)
{
Tango::DbDatum data(prop_name);
data << vect_data ;
dev_def_prop.push_back(data);
add_wiz_dev_prop(prop_name, prop_desc, prop_def);
}
else
add_wiz_dev_prop(prop_name, prop_desc);
}
//--------------------------------------------------------
/**
* Method : AccessConf::AccessConfClass::write_class_property()
* Description : Set class description fields as property in database
*/
//--------------------------------------------------------
void AccessConfClass::write_class_property()
{
// First time, check if database used
if (Tango::Util::_UseDb == false)
return;
Tango::DbData data;
string classname = get_name();
string header;
string::size_type start, end;
// Put title
Tango::DbDatum title("ProjectTitle");
string str_title("Storage Ring Access");
title << str_title;
data.push_back(title);
// Put Description
Tango::DbDatum description("Description");
vector<string> str_desc;
str_desc.push_back("");
description << str_desc;
data.push_back(description);
// put cvs or svn location
string filename("AccessConf");
filename += "Class.cpp";
// check for cvs information
string src_path(CvsPath);
start = src_path.find("/");
if (start!=string::npos)
{
end = src_path.find(filename);
if (end>start)
{
string strloc = src_path.substr(start, end-start);
// Check if specific repository
start = strloc.find("/cvsroot/");
if (start!=string::npos && start>0)
{
string repository = strloc.substr(0, start);
if (repository.find("/segfs/")!=string::npos)
strloc = "ESRF:" + strloc.substr(start, strloc.length()-start);
}
Tango::DbDatum cvs_loc("cvs_location");
cvs_loc << strloc;
data.push_back(cvs_loc);
}
}
// check for svn information
else
{
string src_path(SvnPath);
start = src_path.find("://");
if (start!=string::npos)
{
end = src_path.find(filename);
if (end>start)
{
header = "$HeadURL: ";
start = header.length();
string strloc = src_path.substr(start, (end-start));
Tango::DbDatum svn_loc("svn_location");
svn_loc << strloc;
data.push_back(svn_loc);
}
}
}
// Get CVS or SVN revision tag
// CVS tag
string tagname(TagName);
header = "$Name: ";
start = header.length();
string endstr(" $");
end = tagname.find(endstr);
if (end!=string::npos && end>start)
{
string strtag = tagname.substr(start, end-start);
Tango::DbDatum cvs_tag("cvs_tag");
cvs_tag << strtag;
data.push_back(cvs_tag);
}
// SVN tag
string svnpath(SvnPath);
header = "$HeadURL: ";
start = header.length();
end = svnpath.find(endstr);
if (end!=string::npos && end>start)
{
string strloc = svnpath.substr(start, end-start);
string tagstr ("/tags/");
start = strloc.find(tagstr);
if ( start!=string::npos )
{
start = start + tagstr.length();
end = strloc.find(filename);
string strtag = strloc.substr(start, end-start-1);
Tango::DbDatum svn_tag("svn_tag");
svn_tag << strtag;
data.push_back(svn_tag);
}
}
// Get URL location
string httpServ(HttpServer);
if (httpServ.length()>0)
{
Tango::DbDatum db_doc_url("doc_url");
db_doc_url << httpServ;
data.push_back(db_doc_url);
}
// Put inheritance
Tango::DbDatum inher_datum("InheritedFrom");
vector<string> inheritance;
inheritance.push_back("Device_Impl");
inher_datum << inheritance;
data.push_back(inher_datum);
// Call database and and values
get_db_class()->put_property(data);
}
//===================================================================
// Factory methods
//===================================================================
//--------------------------------------------------------
/**
* method : AccessConfClass::device_factory
* description : Create the device object(s)
* and store them in the device list
*
* @param *devlist_ptr The device name list
*/
//--------------------------------------------------------
void AccessConfClass::device_factory(const Tango::DevVarStringArray *devlist_ptr)
{
/*----- PROTECTED REGION ID(AccessConf::Class::device_factory_before) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // AccessConf::Class::device_factory_before
// Create devices and add it into the device list
for (unsigned long i=0 ; i<devlist_ptr->length() ; i++)
{
cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl;
device_list.push_back(new AccessConf(this, (*devlist_ptr)[i]));
}
// Manage dynamic attributes if any
erase_dynamic_attributes(devlist_ptr, get_class_attr()->get_attr_list());
// Export devices to the outside world
for (unsigned long i=1 ; i<=devlist_ptr->length() ; i++)
{
// Add dynamic attributes if any
AccessConf *dev = static_cast<AccessConf *>(device_list[device_list.size()-i]);
dev->add_dynamic_attributes();
// Check before if database used.
if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false))
export_device(dev);
else
export_device(dev, dev->get_name().c_str());
}
/*----- PROTECTED REGION ID(AccessConf::Class::device_factory_after) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // AccessConf::Class::device_factory_after
}
//--------------------------------------------------------
/**
* Method : AccessConf::AccessConfClass::attribute_factory()
* Description : Create the attribute object(s)
* and store them in the attribute list
*/
//--------------------------------------------------------
void AccessConfClass::attribute_factory(vector<Tango::Attr *> &att_list)
{
/*----- PROTECTED REGION ID(AccessConf::Class::attribute_factory_before) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // AccessConf::Class::attribute_factory_before
#if 0
// Attribute : BoolScalarDyn
BoolScalarDynAttrib *boolscalardyn = new BoolScalarDynAttrib();
Tango::UserDefaultAttrProp boolscalardyn_prop;
// description not set for BoolScalarDyn
// label not set for BoolScalarDyn
// unit not set for BoolScalarDyn
// standard_unit not set for BoolScalarDyn
// display_unit not set for BoolScalarDyn
// format not set for BoolScalarDyn
// max_value not set for BoolScalarDyn
// min_value not set for BoolScalarDyn
// max_alarm not set for BoolScalarDyn
// min_alarm not set for BoolScalarDyn
// max_warning not set for BoolScalarDyn
// min_warning not set for BoolScalarDyn
// delta_t not set for BoolScalarDyn
// delta_val not set for BoolScalarDyn
boolscalardyn->set_default_properties(boolscalardyn_prop);
// Not Polled
boolscalardyn->set_disp_level(Tango::OPERATOR);
// Not memorized
// BoolScalarDyn does not fire change event
// BoolScalarDyn does not fire archive event
// BoolScalarDyn does not fire data_ready event
att_list.push_back(boolscalardyn);
// Attribute : BoolSpectrumDyn
BoolSpectrumDynAttrib *boolspectrumdyn = new BoolSpectrumDynAttrib();
Tango::UserDefaultAttrProp boolspectrumdyn_prop;
// description not set for BoolSpectrumDyn
// label not set for BoolSpectrumDyn
// unit not set for BoolSpectrumDyn
// standard_unit not set for BoolSpectrumDyn
// display_unit not set for BoolSpectrumDyn
// format not set for BoolSpectrumDyn
// max_value not set for BoolSpectrumDyn
// min_value not set for BoolSpectrumDyn
// max_alarm not set for BoolSpectrumDyn
// min_alarm not set for BoolSpectrumDyn
// max_warning not set for BoolSpectrumDyn
// min_warning not set for BoolSpectrumDyn
// delta_t not set for BoolSpectrumDyn
// delta_val not set for BoolSpectrumDyn
boolspectrumdyn->set_default_properties(boolspectrumdyn_prop);
// Not Polled
boolspectrumdyn->set_disp_level(Tango::OPERATOR);
// Not memorized
// BoolSpectrumDyn does not fire change event
// BoolSpectrumDyn does not fire archive event
// BoolSpectrumDyn does not fire data_ready event
att_list.push_back(boolspectrumdyn);
#endif
// Attribute : Version
VersionAttrib *version = new VersionAttrib();
Tango::UserDefaultAttrProp version_prop;
// description not set for Version
// label not set for Version
// unit not set for Version
// standard_unit not set for Version
// display_unit not set for Version
// format not set for Version
// max_value not set for Version
// min_value not set for Version
// max_alarm not set for Version
// min_alarm not set for Version
// max_warning not set for Version
// min_warning not set for Version
// delta_t not set for Version
// delta_val not set for Version
version->set_default_properties(version_prop);
// Not Polled
version->set_disp_level(Tango::OPERATOR);
// Not memorized
// Version does not fire change event
// Version does not fire archive event
// Version does not fire data_ready event
att_list.push_back(version);
// Create a list of static attributes
create_static_attribute_list(get_class_attr()->get_attr_list());
/*----- PROTECTED REGION ID(AccessConf::Class::attribute_factory_after) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // AccessConf::Class::attribute_factory_after
}
//--------------------------------------------------------
/**
* Method : AccessConf::AccessConfClass::command_factory()
* Description : Create the command object(s)
* and store them in the command list
*/
//--------------------------------------------------------
void AccessConfClass::command_factory()
{
/*----- PROTECTED REGION ID(AccessConf::Class::command_factory_before) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AccessConf::Class::command_factory_before
/*----- PROTECTED REGION ID(AccessConf::Class::command_factory_after) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AccessConf::Class::command_factory_after
}
//===================================================================
// Dynamic attributes related methods
//===================================================================
//--------------------------------------------------------
/**
* method : AccessConfClass::create_static_attribute_list
* description : Create the a list of static attributes
*
* @param att_list the ceated attribute list
*/
//--------------------------------------------------------
void AccessConfClass::create_static_attribute_list(vector<Tango::Attr *> &att_list)
{
for (unsigned long i=0 ; i<att_list.size() ; i++)
{
string att_name(att_list[i]->get_name());
transform(att_name.begin(), att_name.end(), att_name.begin(), ::tolower);
defaultAttList.push_back(att_name);
}
cout2 << defaultAttList.size() << " attributes in default list" << endl;
/*----- PROTECTED REGION ID(AccessConf::Class::create_static_att_list) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AccessConf::Class::create_static_att_list
}
//--------------------------------------------------------
/**
* method : AccessConfClass::erase_dynamic_attributes
* description : delete the dynamic attributes if any.
*
* @param devlist_ptr the device list pointer
* @param list of all attributes
*/
//--------------------------------------------------------
void AccessConfClass::erase_dynamic_attributes(const Tango::DevVarStringArray *devlist_ptr, vector<Tango::Attr *> &att_list)
{
Tango::Util *tg = Tango::Util::instance();
//cout << __FUNCTION__<< ": entering..."<<endl;
for (unsigned long i=0 ; i<devlist_ptr->length() ; i++)
{
Tango::DeviceImpl *dev_impl = tg->get_device_by_name(((string)(*devlist_ptr)[i]).c_str());
AccessConf *dev = static_cast<AccessConf *> (dev_impl);
vector<Tango::Attribute *> &dev_att_list = dev->get_device_attr()->get_attribute_list();
vector<Tango::Attribute *>::iterator ite_att;
for (ite_att=dev_att_list.begin() ; ite_att != dev_att_list.end() ; ++ite_att)
{
string att_name((*ite_att)->get_name_lower());
if ((att_name == "state") || (att_name == "status"))
continue;
vector<string>::iterator ite_str = find(defaultAttList.begin(), defaultAttList.end(), att_name);
if (ite_str == defaultAttList.end())
{
cout2 << att_name << " is a UNWANTED dynamic attribute for device " << (*devlist_ptr)[i] << endl;
Tango::Attribute &att = dev->get_device_attr()->get_attr_by_name(att_name.c_str());
dev->remove_attribute(att_list[att.get_attr_idx()],true);
--ite_att;
}
}
}
/*----- PROTECTED REGION ID(AccessConf::Class::erase_dynamic_attributes) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AccessConf::Class::erase_dynamic_attributes
}
/*----- PROTECTED REGION ID(AccessConf::Class::Additional Methods) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AccessConf::Class::Additional Methods
} // namespace