From 6eec9c218c9bf83f4433a9553ccc0607f980cb02 Mon Sep 17 00:00:00 2001
From: gscalamera <graziano.scalamera@elettra.eu>
Date: Fri, 7 Apr 2017 10:01:32 +0200
Subject: [PATCH] Added alarm enum state labels support in formulas

---
 src/Alarm.cpp         | 25 ++++++++++++++++++++++---
 src/alarm_table.cpp   | 11 -----------
 src/formula_grammar.h | 34 ++++++++++++++++++++++++++++++++--
 3 files changed, 54 insertions(+), 16 deletions(-)

diff --git a/src/Alarm.cpp b/src/Alarm.cpp
index bf63e20..0910a21 100644
--- a/src/Alarm.cpp
+++ b/src/Alarm.cpp
@@ -331,7 +331,10 @@ void Alarm::init_device()
 {
 	DEBUG_STREAM << "Alarm::init_device() create device " << device_name << endl;
 	/*----- PROTECTED REGION ID(Alarm::init_device_before) ENABLED START -----*/
-	
+	bool starting = Tango::Util::instance()->is_svr_starting();
+	bool shutting_down = Tango::Util::instance()->is_svr_shutting_down();
+	bool restarting = Tango::Util::instance()->is_device_restarting(device_name);
+	DEBUG_STREAM << __func__ << " starting="<<(int)starting << " shutting_down="<<(int)shutting_down<<" restarting="<<(int)restarting;
 	//	Initialization before get_device_property() call
 	int dbPortint=0;	
 	abortflag = false;	
@@ -445,6 +448,7 @@ void Alarm::init_device()
 	rule_names[formula_grammar::nonempty_exprID] = "NonEmptyE";
 	rule_names[formula_grammar::exprID] = "Expression";
 	rule_names[formula_grammar::val_qualityID] = "ValQuality";
+	rule_names[formula_grammar::val_alarm_enum_stID] = "ValAlarmEnumStatus";
 
 	/*
 	 * get device attribute properties and initialize internal
@@ -737,6 +741,7 @@ void Alarm::init_device()
 	clock_gettime(CLOCK_MONOTONIC, &now);
 	double dnow = (now.tv_sec) + ((double)(now.tv_nsec))/1000000000;
 	last_statistics_reset_time = dnow;
+	INFO_STREAM << __func__ << ": exiting!";
 
 	/*----- PROTECTED REGION END -----*/	//	Alarm::init_device
 }
@@ -1909,7 +1914,7 @@ Tango::DevVarStringArray *Alarm::search_alarm(Tango::DevString argin)
 			os.clear();
 			os << ai->second.ts.tv_sec << "\t" << ai->second.name << "\t" /*TODO<< KEY(FORMULA_KEY)*/ << ai->second.formula << "\t" << KEY(ONDELAY_KEY) << ai->second.on_delay << "\t" << KEY(OFFDELAY_KEY) << ai->second.off_delay <<
 			"\t" << KEY(LEVEL_KEY) << ai->second.lev << "\t" << KEY(SILENT_TIME_KEY) << ai->second.silent_time << "\t" << KEY(GROUP_KEY) << ai->second.grp2str() << "\t" << KEY(MESSAGE_KEY) << ai->second.msg << "\t" <<
-			KEY(ON_COMMAND_KEY) << ai->second.cmd_name_a << "\t" << KEY(OFF_COMMAND_KEY) << ai->second.cmd_name_n << ends;
+			KEY(ON_COMMAND_KEY) << ai->second.cmd_name_a << "\t" << KEY(OFF_COMMAND_KEY) << ai->second.cmd_name_n << "\t" << KEY(ENABLED_KEY) << (ai->second.enabled ? "1" : "0") << ends;
 			alarm_filtered.push_back(os.str());
 		}
 	}  /* for */
@@ -3923,6 +3928,20 @@ formula_res_t Alarm::eval_expression(iter_t const& i, string &attr_values, int e
 		formula_res_t res;
 		res.value = st;
         return res;
+    }
+    else if (i->value.id() == formula_grammar::val_alarm_enum_stID)
+    {
+        if(i->children.size() != 0)
+        {
+        	err <<  "in node val_alarm_enum_stID(" << string(i->value.begin(), i->value.end()) << ") children=" << i->children.size() << ends;
+        	throw err.str();
+        }
+        string val_st(i->value.begin(), i->value.end());
+        double st =  i->value.value();			//get value directly from node saved with access_node_d
+		DEBUG_STREAM << "		node value alarm enum state : " << val_st << "=" << st << endl;
+		formula_res_t res;
+		res.value = st;
+        return res;
     }
 	else if (i->value.id() == formula_grammar::val_qualityID)
 	{
@@ -4250,7 +4269,7 @@ formula_res_t Alarm::eval_expression(iter_t const& i, string &attr_values, int e
 				{
 					if(!it->valid)
 					{
-						err <<  "in node nameID(" << string(i2_1->value.begin(), i2_1->value.end()) << ") value not valid!" << ends;
+						err <<  "in node equality_exprID -> nameID(" << string(i2_1->value.begin(), i2_1->value.end()) << ") value not valid!" << ends;
 						throw err.str();
 					}
 					else if(it->type != Tango::DEV_STRING && it->value.empty())
diff --git a/src/alarm_table.cpp b/src/alarm_table.cpp
index e60d520..0f2aad1 100644
--- a/src/alarm_table.cpp
+++ b/src/alarm_table.cpp
@@ -22,17 +22,6 @@
 
 static const char __FILE__rev[] = __FILE__ " $Revision: 1.5 $";
 
-//TODO: duplicated from alarm.h
-enum _AlarmStateEnum {
-	_NORM,
-	_UNACK,
-	_ACKED,
-	_RTNUN,
-	_SHLVD,
-	_DSUPR,
-	_OOSRV,
-} ;
-
 /*
  * alarm_t class methods
  */
diff --git a/src/formula_grammar.h b/src/formula_grammar.h
index dd52a53..89267df 100644
--- a/src/formula_grammar.h
+++ b/src/formula_grammar.h
@@ -80,6 +80,17 @@ struct Assign_Stat
 	}
 };
 
+//TODO: duplicated from alarm.h
+enum _AlarmStateEnum {
+	_NORM,
+	_UNACK,
+	_ACKED,
+	_RTNUN,
+	_SHLVD,
+	_DSUPR,
+	_OOSRV,
+} ;
+
 struct formula_grammar : public grammar<formula_grammar>
 {
 
@@ -116,10 +127,14 @@ struct formula_grammar : public grammar<formula_grammar>
     static const int exprID = 21;
     static const int nonempty_exprID = 22;
     static const int val_qualityID = 23;
+    static const int val_alarm_enum_stID = 24;
+
     
     symbols<unsigned int> tango_states;
     symbols<unsigned int> attr_quality;
     
+    symbols<unsigned int> alarm_enum_states;
+
 	formula_grammar() 
 	{
 		tango_states.add("ON", (unsigned int)Tango::ON);
@@ -142,6 +157,14 @@ struct formula_grammar : public grammar<formula_grammar>
 		attr_quality.add("ATTR_ALARM", (unsigned int)Tango::ATTR_ALARM);
 		attr_quality.add("ATTR_CHANGING", (unsigned int)Tango::ATTR_CHANGING);
 		attr_quality.add("ATTR_WARNING", (unsigned int)Tango::ATTR_WARNING);
+
+		alarm_enum_states.add("NORM", (unsigned int)_NORM);
+		alarm_enum_states.add("UNACK", (unsigned int)_UNACK);
+		alarm_enum_states.add("ACKED", (unsigned int)_ACKED);
+		alarm_enum_states.add("RTNUN", (unsigned int)_RTNUN);
+		alarm_enum_states.add("SHLVD", (unsigned int)_SHLVD);
+		alarm_enum_states.add("DSUPR", (unsigned int)_DSUPR);
+		alarm_enum_states.add("OOSRV", (unsigned int)_OOSRV);
 	}   
    
     template <typename ScannerT>
@@ -211,8 +234,13 @@ struct formula_grammar : public grammar<formula_grammar>
             	;
 			val_quality
 				=
-					//access_node_d[self.tango_states[&Save_Stat]][&Assign_Stat]	//save Tango::state value in node
+					//access_node_d[self.attr_quality[&Save_Stat]][&Assign_Stat]	//save Tango::state value in node
 					access_node_d[self.attr_quality[Save_Stat()]][Assign_Stat()]	//save Tango::state value in node
+            	;
+			val_alarm_enum_st
+				=
+					//access_node_d[self.alarm_enum_states[&Save_Stat]][&Assign_Stat]	//save Tango::state value in node
+					access_node_d[self.alarm_enum_states[Save_Stat()]][Assign_Stat()]	//save Tango::state value in node
             	;
             val_string
 #if BOOST_VERSION  < 103600
@@ -336,7 +364,7 @@ struct formula_grammar : public grammar<formula_grammar>
             expr_atom
                 =	//val_h | val_r
 					event_
-					| val_h | val_r | val_st  | val_quality | val_string
+					| val_h | val_r | val_st  | val_quality | val_alarm_enum_st | val_string
                 	//| (inner_node_d[ch_p('(') >> non_empty_expression >> ')'])
                		| (discard_node_d[ch_p('(')] >> non_empty_expression >> discard_node_d[ch_p(')')])
                 ;
@@ -373,6 +401,8 @@ struct formula_grammar : public grammar<formula_grammar>
 		rule<ScannerT, parser_context<>, parser_tag<nonempty_exprID> > non_empty_expression;
 		rule<ScannerT, parser_context<>, parser_tag<exprID> > expression;
 		rule<ScannerT, parser_context<>, parser_tag<val_qualityID> > val_quality;
+		rule<ScannerT, parser_context<>, parser_tag<val_alarm_enum_stID> > val_alarm_enum_st;
+
 
         rule<ScannerT> const&
         start() const { return top; }      
-- 
GitLab