From 9d33e2e261e9c28b421974f74caf8e2e37a264f9 Mon Sep 17 00:00:00 2001
From: gscalamera <graziano.scalamera@elettra.eu>
Date: Tue, 14 Apr 2020 18:36:09 +0200
Subject: [PATCH] Add class properties

---
 src/AlarmHandler.xmi             |  20 +++++-
 src/AlarmHandlerClass.cpp        | 111 ++++++++++++++++++++++++++++++-
 src/AlarmHandlerClass.h          |   8 +++
 src/AlarmHandlerDynAttrUtils.cpp |   4 +-
 4 files changed, 137 insertions(+), 6 deletions(-)

diff --git a/src/AlarmHandler.xmi b/src/AlarmHandler.xmi
index 71fd54f..b4af05f 100644
--- a/src/AlarmHandler.xmi
+++ b/src/AlarmHandler.xmi
@@ -1,10 +1,24 @@
 <?xml version="1.0" encoding="ASCII"?>
 <pogoDsl:PogoSystem xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pogoDsl="http://www.esrf.fr/tango/pogo/PogoDsl">
-  <classes name="AlarmHandler" pogoRevision="9.4">
-    <description description="Elettra alarm handler device server" title="Elettra alarm handler device server" sourcePath="/home/graziano/ws/alarmhandler/src" language="Cpp" filestogenerate="XMI   file,Code files,Protected Regions" license="GPL" copyright="" hasMandatoryProperty="false" hasConcreteProperty="true" hasAbstractCommand="false" hasAbstractAttribute="false">
+  <classes name="AlarmHandler" pogoRevision="9.6">
+    <description description="Elettra alarm handler device server" title="Elettra alarm handler device server" sourcePath="/home/graziano/ws/alarm-handler/src" language="Cpp" filestogenerate="XMI   file,Code files,Protected Regions" license="GPL" copyright="" hasMandatoryProperty="false" hasConcreteProperty="true" hasAbstractCommand="false" hasAbstractAttribute="false">
       <inheritances classname="Device_4Impl" sourcePath=""/>
       <identification contact="at elettra.eu - graziano.scalamera" author="graziano.scalamera" emailDomain="elettra.eu" classFamily="SoftwareSystem" siteSpecific="" platform="Unix Like" bus="Not Applicable" manufacturer="" reference=""/>
     </description>
+    <classProperties name="GroupNames" description="Labels for Group mask, first is for mask 0x00">
+      <type xsi:type="pogoDsl:StringVectorType"/>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </classProperties>
+    <classProperties name="SubscribeRetryPeriod" description="Retry subscription period in seconds">
+      <type xsi:type="pogoDsl:IntType"/>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+      <DefaultPropValue>30</DefaultPropValue>
+    </classProperties>
+    <classProperties name="StatisticsTimeWindow" description="Time window to compute statistics in seconds">
+      <type xsi:type="pogoDsl:IntVectorType"/>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+      <DefaultPropValue>60</DefaultPropValue>
+    </classProperties>
     <deviceProperties name="GroupNames" description="Labels for Group mask, first is for mask 0x00">
       <type xsi:type="pogoDsl:StringVectorType"/>
       <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
@@ -281,6 +295,6 @@
       <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
       <properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
     </dynamicAttributes>
-    <preferences docHome="./doc_html" makefileHome="/usr/local/tango-9.2.5a/share/pogo/preferences"/>
+    <preferences docHome="./doc_html" makefileHome="/usr/local/tango-9.3.3/share/pogo/preferences"/>
   </classes>
 </pogoDsl:PogoSystem>
diff --git a/src/AlarmHandlerClass.cpp b/src/AlarmHandlerClass.cpp
index 36c770d..d53a4c6 100644
--- a/src/AlarmHandlerClass.cpp
+++ b/src/AlarmHandlerClass.cpp
@@ -80,6 +80,7 @@ AlarmHandlerClass::AlarmHandlerClass(string &s):Tango::DeviceClass(s)
 {
 	cout2 << "Entering AlarmHandlerClass constructor" << endl;
 	set_default_property();
+	get_class_property();
 	write_class_property();
 
 	/*----- PROTECTED REGION ID(AlarmHandlerClass::constructor) ENABLED START -----*/
@@ -454,6 +455,73 @@ Tango::DbDatum AlarmHandlerClass::get_default_class_property(string &prop_name)
 	return Tango::DbDatum(prop_name);
 }
 
+//--------------------------------------------------------
+/**
+ *	Method      : AlarmHandlerClass::get_class_property()
+ *	Description : Read database to initialize class property data members.
+ */
+//--------------------------------------------------------
+void AlarmHandlerClass::get_class_property()
+{
+	/*----- PROTECTED REGION ID(AlarmHandlerClass::get_class_property_before) ENABLED START -----*/
+	
+	//	Initialize class property data members
+	
+	/*----- PROTECTED REGION END -----*/	//	AlarmHandlerClass::get_class_property_before
+	//	Read class properties from database.
+	cl_prop.push_back(Tango::DbDatum("GroupNames"));
+	cl_prop.push_back(Tango::DbDatum("SubscribeRetryPeriod"));
+	cl_prop.push_back(Tango::DbDatum("StatisticsTimeWindow"));
+	
+	//	Call database and extract values
+	if (Tango::Util::instance()->_UseDb==true)
+		get_db_class()->get_property(cl_prop);
+	Tango::DbDatum	def_prop;
+	int	i = -1;
+
+	//	Try to extract GroupNames value
+	if (cl_prop[++i].is_empty()==false)	cl_prop[i]  >>  groupNames;
+	else
+	{
+		//	Check default value for GroupNames
+		def_prop = get_default_class_property(cl_prop[i].name);
+		if (def_prop.is_empty()==false)
+		{
+			def_prop    >>  groupNames;
+			cl_prop[i]  <<  groupNames;
+		}
+	}
+	//	Try to extract SubscribeRetryPeriod value
+	if (cl_prop[++i].is_empty()==false)	cl_prop[i]  >>  subscribeRetryPeriod;
+	else
+	{
+		//	Check default value for SubscribeRetryPeriod
+		def_prop = get_default_class_property(cl_prop[i].name);
+		if (def_prop.is_empty()==false)
+		{
+			def_prop    >>  subscribeRetryPeriod;
+			cl_prop[i]  <<  subscribeRetryPeriod;
+		}
+	}
+	//	Try to extract StatisticsTimeWindow value
+	if (cl_prop[++i].is_empty()==false)	cl_prop[i]  >>  statisticsTimeWindow;
+	else
+	{
+		//	Check default value for StatisticsTimeWindow
+		def_prop = get_default_class_property(cl_prop[i].name);
+		if (def_prop.is_empty()==false)
+		{
+			def_prop    >>  statisticsTimeWindow;
+			cl_prop[i]  <<  statisticsTimeWindow;
+		}
+	}
+	/*----- PROTECTED REGION ID(AlarmHandlerClass::get_class_property_after) ENABLED START -----*/
+	
+	//	Check class property data members init
+	
+	/*----- PROTECTED REGION END -----*/	//	AlarmHandlerClass::get_class_property_after
+
+}
 
 //--------------------------------------------------------
 /**
@@ -472,6 +540,47 @@ void AlarmHandlerClass::set_default_property()
 	vector<string>	vect_data;
 
 	//	Set Default Class Properties
+	prop_name = "GroupNames";
+	prop_desc = "Labels for Group mask, first is for mask 0x00";
+	prop_def  = "";
+	vect_data.clear();
+	if (prop_def.length()>0)
+	{
+		Tango::DbDatum	data(prop_name);
+		data << vect_data ;
+		cl_def_prop.push_back(data);
+		add_wiz_class_prop(prop_name, prop_desc,  prop_def);
+	}
+	else
+		add_wiz_class_prop(prop_name, prop_desc);
+	prop_name = "SubscribeRetryPeriod";
+	prop_desc = "Retry subscription period in seconds";
+	prop_def  = "30";
+	vect_data.clear();
+	vect_data.push_back("30");
+	if (prop_def.length()>0)
+	{
+		Tango::DbDatum	data(prop_name);
+		data << vect_data ;
+		cl_def_prop.push_back(data);
+		add_wiz_class_prop(prop_name, prop_desc,  prop_def);
+	}
+	else
+		add_wiz_class_prop(prop_name, prop_desc);
+	prop_name = "StatisticsTimeWindow";
+	prop_desc = "Time window to compute statistics in seconds";
+	prop_def  = "60";
+	vect_data.clear();
+	vect_data.push_back("60");
+	if (prop_def.length()>0)
+	{
+		Tango::DbDatum	data(prop_name);
+		data << vect_data ;
+		cl_def_prop.push_back(data);
+		add_wiz_class_prop(prop_name, prop_desc,  prop_def);
+	}
+	else
+		add_wiz_class_prop(prop_name, prop_desc);
 
 	//	Set Default device Properties
 	prop_name = "GroupNames";
@@ -1195,7 +1304,7 @@ void AlarmHandlerClass::erase_dynamic_attributes(const Tango::DevVarStringArray
 
 //--------------------------------------------------------
 /**
- *	Method      : AlarmHandlerClass::get_attr_by_name()
+ *	Method      : AlarmHandlerClass::get_attr_object_by_name()
  *	Description : returns Tango::Attr * object found by name
  */
 //--------------------------------------------------------
diff --git a/src/AlarmHandlerClass.h b/src/AlarmHandlerClass.h
index dab18e9..b17e2a3 100644
--- a/src/AlarmHandlerClass.h
+++ b/src/AlarmHandlerClass.h
@@ -574,6 +574,14 @@ class AlarmHandlerClass : public Tango::DeviceClass
 	
 	/*----- PROTECTED REGION END -----*/	//	AlarmHandlerClass::Additionnal DServer data members
 
+	//	Class properties data members
+	public:
+		//	GroupNames:	Labels for Group mask, first is for mask 0x00
+		vector<string>	groupNames;
+		//	SubscribeRetryPeriod:	Retry subscription period in seconds
+		Tango::DevLong	subscribeRetryPeriod;
+		//	StatisticsTimeWindow:	Time window to compute statistics in seconds
+		vector<Tango::DevLong>	statisticsTimeWindow;
 	public:
 		//	write class properties data members
 		Tango::DbData	cl_prop;
diff --git a/src/AlarmHandlerDynAttrUtils.cpp b/src/AlarmHandlerDynAttrUtils.cpp
index f400d91..591b147 100644
--- a/src/AlarmHandlerDynAttrUtils.cpp
+++ b/src/AlarmHandlerDynAttrUtils.cpp
@@ -128,7 +128,7 @@ void AlarmHandler::add_AlarmState_dynamic_attribute(string attname)
 //--------------------------------------------------------
 void AlarmHandler::remove_AlarmState_dynamic_attribute(string attname)
 {
-	remove_attribute(attname, true);
+	remove_attribute(attname, true, Tango::Util::instance()->_UseDb);
 	map<string,Tango::DevEnum>::iterator ite;
     if ((ite=AlarmState_data.find(attname))!=AlarmState_data.end())
     {
@@ -189,7 +189,7 @@ void AlarmHandler::add_AlarmFormula_dynamic_attribute(string attname)
 //--------------------------------------------------------
 void AlarmHandler::remove_AlarmFormula_dynamic_attribute(string attname)
 {
-	remove_attribute(attname, true);
+	remove_attribute(attname, true, Tango::Util::instance()->_UseDb);
 	map<string,Tango::DevString>::iterator ite;
     if ((ite=AlarmFormula_data.find(attname))!=AlarmFormula_data.end())
     {
-- 
GitLab