-
Graziano Scalamera authored67ebbd02
ConexAgpClass.cpp 24.55 KiB
/*----- PROTECTED REGION ID(ConexAgpClass.cpp) ENABLED START -----*/
static const char *RcsId = "$Id: ConexAgpClass.cpp,v 1.1 2017-12-21 11:26:12 graziano Exp $";
static const char *TagName = "$Name: $";
static const char *CvsPath = "$Source: /home/cvsadm/cvsroot/fermi/servers/conexagp/src/ConexAgpClass.cpp,v $";
static const char *SvnPath = "$HeadURL: $";
static const char *HttpServer = "http://www.esrf.eu/computing/cs/tango/tango_doc/ds_doc/";
//=============================================================================
//
// file : ConexAgpClass.cpp
//
// description : C++ source for the ConexAgpClass.
// A singleton class derived from DeviceClass.
// It implements the command and attribute list
// and all properties and methods required
// by the ConexAgp once per process.
//
// project : Newport ConexAgp Agilis-D controller
//
// 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: graziano $
//
// $Revision: 1.1 $
// $Date: 2017-12-21 11:26:12 $
//
// $HeadURL: $
//
//=============================================================================
// This file is generated by POGO
// (Program Obviously used to Generate tango Object)
//=============================================================================
#include <ConexAgpClass.h>
/*----- PROTECTED REGION END -----*/ // ConexAgpClass.cpp
//-------------------------------------------------------------------
/**
* Create ConexAgpClass singleton and
* return it in a C function for Python usage
*/
//-------------------------------------------------------------------
extern "C" {
#ifdef _TG_WINDOWS_
__declspec(dllexport)
#endif
Tango::DeviceClass *_create_ConexAgp_class(const char *name) {
return ConexAgp_ns::ConexAgpClass::init(name);
}
}
namespace ConexAgp_ns
{
//===================================================================
// Initialize pointer for singleton pattern
//===================================================================
ConexAgpClass *ConexAgpClass::_instance = NULL;
//--------------------------------------------------------
/**
* method : ConexAgpClass::ConexAgpClass(string &s)
* description : constructor for the ConexAgpClass
*
* @param s The class name
*/
//--------------------------------------------------------
ConexAgpClass::ConexAgpClass(string &s):Tango::DeviceClass(s)
{
cout2 << "Entering ConexAgpClass constructor" << endl;
set_default_property();
write_class_property();
/*----- PROTECTED REGION ID(ConexAgpClass::constructor) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::constructor
cout2 << "Leaving ConexAgpClass constructor" << endl;
}
//--------------------------------------------------------
/**
* method : ConexAgpClass::~ConexAgpClass()
* description : destructor for the ConexAgpClass
*/
//--------------------------------------------------------
ConexAgpClass::~ConexAgpClass()
{
/*----- PROTECTED REGION ID(ConexAgpClass::destructor) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::destructor
_instance = NULL;
}
//--------------------------------------------------------
/**
* method : ConexAgpClass::init
* description : Create the object if not already done.
* Otherwise, just return a pointer to the object
*
* @param name The class name
*/
//--------------------------------------------------------
ConexAgpClass *ConexAgpClass::init(const char *name)
{
if (_instance == NULL)
{
try
{
string s(name);
_instance = new ConexAgpClass(s);
}
catch (bad_alloc &)
{
throw;
}
}
return _instance;
}
//--------------------------------------------------------
/**
* method : ConexAgpClass::instance
* description : Check if object already created,
* and return a pointer to the object
*/
//--------------------------------------------------------
ConexAgpClass *ConexAgpClass::instance()
{
if (_instance == NULL)
{
cerr << "Class is not initialised !!" << endl;
exit(-1);
}
return _instance;
}
//===================================================================
// Command execution method calls
//===================================================================
//--------------------------------------------------------
/**
* method : HomingClass::execute()
* description : method to trigger the execution of the command.
*
* @param device The device on which the command must be executed
* @param in_any The command input data
*
* returns The command output data (packed in the Any object)
*/
//--------------------------------------------------------
CORBA::Any *HomingClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{
cout2 << "HomingClass::execute(): arrived" << endl;
((static_cast<ConexAgp *>(device))->homing());
return new CORBA::Any();
}
//--------------------------------------------------------
/**
* method : StopClass::execute()
* description : method to trigger the execution of the command.
*
* @param device The device on which the command must be executed
* @param in_any The command input data
*
* returns The command output data (packed in the Any object)
*/
//--------------------------------------------------------
CORBA::Any *StopClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{
cout2 << "StopClass::execute(): arrived" << endl;
((static_cast<ConexAgp *>(device))->stop());
return new CORBA::Any();
}
//--------------------------------------------------------
/**
* method : GetVersionClass::execute()
* description : method to trigger the execution of the command.
*
* @param device The device on which the command must be executed
* @param in_any The command input data
*
* returns The command output data (packed in the Any object)
*/
//--------------------------------------------------------
CORBA::Any *GetVersionClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{
cout2 << "GetVersionClass::execute(): arrived" << endl;
return insert((static_cast<ConexAgp *>(device))->get_version());
}
//--------------------------------------------------------
/**
* method : ResetClass::execute()
* description : method to trigger the execution of the command.
*
* @param device The device on which the command must be executed
* @param in_any The command input data
*
* returns The command output data (packed in the Any object)
*/
//--------------------------------------------------------
CORBA::Any *ResetClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{
cout2 << "ResetClass::execute(): arrived" << endl;
((static_cast<ConexAgp *>(device))->reset());
return new CORBA::Any();
}
//--------------------------------------------------------
/**
* method : BackwardClass::execute()
* description : method to trigger the execution of the command.
*
* @param device The device on which the command must be executed
* @param in_any The command input data
*
* returns The command output data (packed in the Any object)
*/
//--------------------------------------------------------
CORBA::Any *BackwardClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{
cout2 << "BackwardClass::execute(): arrived" << endl;
Tango::DevDouble argin;
extract(in_any, argin);
((static_cast<ConexAgp *>(device))->backward(argin));
return new CORBA::Any();
}
//--------------------------------------------------------
/**
* method : ForwardClass::execute()
* description : method to trigger the execution of the command.
*
* @param device The device on which the command must be executed
* @param in_any The command input data
*
* returns The command output data (packed in the Any object)
*/
//--------------------------------------------------------
CORBA::Any *ForwardClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{
cout2 << "ForwardClass::execute(): arrived" << endl;
Tango::DevDouble argin;
extract(in_any, argin);
((static_cast<ConexAgp *>(device))->forward(argin));
return new CORBA::Any();
}
//--------------------------------------------------------
/**
* method : EnableClass::execute()
* description : method to trigger the execution of the command.
*
* @param device The device on which the command must be executed
* @param in_any The command input data
*
* returns The command output data (packed in the Any object)
*/
//--------------------------------------------------------
CORBA::Any *EnableClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{
cout2 << "EnableClass::execute(): arrived" << endl;
((static_cast<ConexAgp *>(device))->enable());
return new CORBA::Any();
}
//--------------------------------------------------------
/**
* method : DisableClass::execute()
* description : method to trigger the execution of the command.
*
* @param device The device on which the command must be executed
* @param in_any The command input data
*
* returns The command output data (packed in the Any object)
*/
//--------------------------------------------------------
CORBA::Any *DisableClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{
cout2 << "DisableClass::execute(): arrived" << endl;
((static_cast<ConexAgp *>(device))->disable());
return new CORBA::Any();
}
//===================================================================
// Properties management
//===================================================================
//--------------------------------------------------------
/**
* Method : ConexAgpClass::get_class_property()
* Description : Get the class property for specified name.
*/
//--------------------------------------------------------
Tango::DbDatum ConexAgpClass::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 : ConexAgpClass::get_default_device_property()
* Description : Return the default value for device property.
*/
//--------------------------------------------------------
Tango::DbDatum ConexAgpClass::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 : ConexAgpClass::get_default_class_property()
* Description : Return the default value for class property.
*/
//--------------------------------------------------------
Tango::DbDatum ConexAgpClass::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 : ConexAgpClass::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 ConexAgpClass::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 = "DeviceName";
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 = "ControllerAddr";
prop_desc = "Controller Address";
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 = "LegacySerial";
prop_desc = "Use legacy serial-srv";
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);
}
//--------------------------------------------------------
/**
* Method : ConexAgpClass::write_class_property()
* Description : Set class description fields as property in database
*/
//--------------------------------------------------------
void ConexAgpClass::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("Newport ConexAgp Agilis-D controller");
title << str_title;
data.push_back(title);
// Put Description
Tango::DbDatum description("Description");
vector<string> str_desc;
str_desc.push_back("Newport ConexAgp Agilis-D controller");
description << str_desc;
data.push_back(description);
// Put inheritance
Tango::DbDatum inher_datum("InheritedFrom");
vector<string> inheritance;
inheritance.push_back("TANGO_BASE_CLASS");
inher_datum << inheritance;
data.push_back(inher_datum);
// Call database and and values
get_db_class()->put_property(data);
}
//===================================================================
// Factory methods
//===================================================================
//--------------------------------------------------------
/**
* Method : ConexAgpClass::device_factory()
* Description : Create the device object(s)
* and store them in the device list
*/
//--------------------------------------------------------
void ConexAgpClass::device_factory(const Tango::DevVarStringArray *devlist_ptr)
{
/*----- PROTECTED REGION ID(ConexAgpClass::device_factory_before) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::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 ConexAgp(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
ConexAgp *dev = static_cast<ConexAgp *>(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(ConexAgpClass::device_factory_after) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::device_factory_after
}
//--------------------------------------------------------
/**
* Method : ConexAgpClass::attribute_factory()
* Description : Create the attribute object(s)
* and store them in the attribute list
*/
//--------------------------------------------------------
void ConexAgpClass::attribute_factory(vector<Tango::Attr *> &att_list)
{
/*----- PROTECTED REGION ID(ConexAgpClass::attribute_factory_before) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::attribute_factory_before
// Attribute : Position
PositionAttrib *position = new PositionAttrib();
Tango::UserDefaultAttrProp position_prop;
// description not set for Position
// label not set for Position
// unit not set for Position
// standard_unit not set for Position
// display_unit not set for Position
// format not set for Position
// max_value not set for Position
// min_value not set for Position
// max_alarm not set for Position
// min_alarm not set for Position
// max_warning not set for Position
// min_warning not set for Position
// delta_t not set for Position
// delta_val not set for Position
position->set_default_properties(position_prop);
// Not Polled
position->set_disp_level(Tango::OPERATOR);
// Not Memorized
position->set_change_event(true, true);
position->set_archive_event(true, true);
att_list.push_back(position);
// Attribute : TargetPosition
TargetPositionAttrib *targetposition = new TargetPositionAttrib();
Tango::UserDefaultAttrProp targetposition_prop;
// description not set for TargetPosition
// label not set for TargetPosition
// unit not set for TargetPosition
// standard_unit not set for TargetPosition
// display_unit not set for TargetPosition
// format not set for TargetPosition
// max_value not set for TargetPosition
// min_value not set for TargetPosition
// max_alarm not set for TargetPosition
// min_alarm not set for TargetPosition
// max_warning not set for TargetPosition
// min_warning not set for TargetPosition
// delta_t not set for TargetPosition
// delta_val not set for TargetPosition
targetposition->set_default_properties(targetposition_prop);
// Not Polled
targetposition->set_disp_level(Tango::OPERATOR);
// Not Memorized
att_list.push_back(targetposition);
// Create a list of static attributes
create_static_attribute_list(get_class_attr()->get_attr_list());
/*----- PROTECTED REGION ID(ConexAgpClass::attribute_factory_after) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::attribute_factory_after
}
//--------------------------------------------------------
/**
* Method : ConexAgpClass::pipe_factory()
* Description : Create the pipe object(s)
* and store them in the pipe list
*/
//--------------------------------------------------------
void ConexAgpClass::pipe_factory()
{
/*----- PROTECTED REGION ID(ConexAgpClass::pipe_factory_before) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::pipe_factory_before
/*----- PROTECTED REGION ID(ConexAgpClass::pipe_factory_after) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::pipe_factory_after
}
//--------------------------------------------------------
/**
* Method : ConexAgpClass::command_factory()
* Description : Create the command object(s)
* and store them in the command list
*/
//--------------------------------------------------------
void ConexAgpClass::command_factory()
{
/*----- PROTECTED REGION ID(ConexAgpClass::command_factory_before) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::command_factory_before
// Command Homing
HomingClass *pHomingCmd =
new HomingClass("Homing",
Tango::DEV_VOID, Tango::DEV_VOID,
"",
"",
Tango::OPERATOR);
command_list.push_back(pHomingCmd);
// Command Stop
StopClass *pStopCmd =
new StopClass("Stop",
Tango::DEV_VOID, Tango::DEV_VOID,
"",
"",
Tango::OPERATOR);
command_list.push_back(pStopCmd);
// Command GetVersion
GetVersionClass *pGetVersionCmd =
new GetVersionClass("GetVersion",
Tango::DEV_VOID, Tango::DEV_STRING,
"",
"",
Tango::OPERATOR);
command_list.push_back(pGetVersionCmd);
// Command Reset
ResetClass *pResetCmd =
new ResetClass("Reset",
Tango::DEV_VOID, Tango::DEV_VOID,
"",
"",
Tango::OPERATOR);
command_list.push_back(pResetCmd);
// Command Backward
BackwardClass *pBackwardCmd =
new BackwardClass("Backward",
Tango::DEV_DOUBLE, Tango::DEV_VOID,
"",
"",
Tango::OPERATOR);
command_list.push_back(pBackwardCmd);
// Command Forward
ForwardClass *pForwardCmd =
new ForwardClass("Forward",
Tango::DEV_DOUBLE, Tango::DEV_VOID,
"",
"",
Tango::OPERATOR);
command_list.push_back(pForwardCmd);
// Command Enable
EnableClass *pEnableCmd =
new EnableClass("Enable",
Tango::DEV_VOID, Tango::DEV_VOID,
"",
"",
Tango::OPERATOR);
command_list.push_back(pEnableCmd);
// Command Disable
DisableClass *pDisableCmd =
new DisableClass("Disable",
Tango::DEV_VOID, Tango::DEV_VOID,
"",
"",
Tango::OPERATOR);
command_list.push_back(pDisableCmd);
/*----- PROTECTED REGION ID(ConexAgpClass::command_factory_after) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::command_factory_after
}
//===================================================================
// Dynamic attributes related methods
//===================================================================
//--------------------------------------------------------
/**
* method : ConexAgpClass::create_static_attribute_list
* description : Create the a list of static attributes
*
* @param att_list the ceated attribute list
*/
//--------------------------------------------------------
void ConexAgpClass::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(ConexAgpClass::create_static_att_list) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::create_static_att_list
}
//--------------------------------------------------------
/**
* method : ConexAgpClass::erase_dynamic_attributes
* description : delete the dynamic attributes if any.
*
* @param devlist_ptr the device list pointer
* @param list of all attributes
*/
//--------------------------------------------------------
void ConexAgpClass::erase_dynamic_attributes(const Tango::DevVarStringArray *devlist_ptr, vector<Tango::Attr *> &att_list)
{
Tango::Util *tg = Tango::Util::instance();
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());
ConexAgp *dev = static_cast<ConexAgp *> (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, false);
--ite_att;
}
}
}
/*----- PROTECTED REGION ID(ConexAgpClass::erase_dynamic_attributes) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::erase_dynamic_attributes
}
//--------------------------------------------------------
/**
* Method : ConexAgpClass::get_attr_by_name()
* Description : returns Tango::Attr * object found by name
*/
//--------------------------------------------------------
Tango::Attr *ConexAgpClass::get_attr_object_by_name(vector<Tango::Attr *> &att_list, string attname)
{
vector<Tango::Attr *>::iterator it;
for (it=att_list.begin() ; it<att_list.end() ; ++it)
if ((*it)->get_name()==attname)
return (*it);
// Attr does not exist
return NULL;
}
/*----- PROTECTED REGION ID(ConexAgpClass::Additional Methods) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // ConexAgpClass::Additional Methods
} // namespace