From f2f40f8823d6ef69895fdf91e2ce08222bd2bde6 Mon Sep 17 00:00:00 2001
From: gscalamera <graziano.scalamera@elettra.eu>
Date: Fri, 7 Apr 2017 11:58:45 +0200
Subject: [PATCH] Added support for .alarm (true if UNACK || ACKED) and .normal
 (true if NORM || RTNUN) property of attributes

---
 src/Alarm.cpp         | 36 ++++++++++++++++++++++++++----------
 src/formula_grammar.h | 23 +++++++++++++++--------
 2 files changed, 41 insertions(+), 18 deletions(-)

diff --git a/src/Alarm.cpp b/src/Alarm.cpp
index 0910a21..6a8294f 100644
--- a/src/Alarm.cpp
+++ b/src/Alarm.cpp
@@ -438,9 +438,6 @@ void Alarm::init_device()
 	rule_names[formula_grammar::expr_atomID] = "AtomicE";
 	rule_names[formula_grammar::shift_exprID] = "ShiftE";
 	rule_names[formula_grammar::unary_exprID] = "UnaryE";
-	rule_names[formula_grammar::funcID] = "FunctionE";
-	rule_names[formula_grammar::nameID] = "NameE";
-	rule_names[formula_grammar::indexID] = "IndexE";
 	rule_names[formula_grammar::val_stringID] = "ValString";
 	rule_names[formula_grammar::func_dualID] = "FuncDualE";
 	rule_names[formula_grammar::logical_expr_parenID] = "LogicalParenE";
@@ -449,6 +446,7 @@ void Alarm::init_device()
 	rule_names[formula_grammar::exprID] = "Expression";
 	rule_names[formula_grammar::val_qualityID] = "ValQuality";
 	rule_names[formula_grammar::val_alarm_enum_stID] = "ValAlarmEnumStatus";
+	rule_names[formula_grammar::propertyID] = "EventProperty";
 
 	/*
 	 * get device attribute properties and initialize internal
@@ -3102,7 +3100,7 @@ void Alarm::add_alarm(alarm_t& a) throw(string&)
 }
 void Alarm::add_event(alarm_t& a, vector<string> &evn) throw(string&)
 {
-	DEBUG_STREAM << "Alarm::add_event(): formula '" << a.formula << "'" << endl;
+	DEBUG_STREAM << "Alarm::add_event(): formula '" << a.formula << "' found " << evn.size() << " events" << endl;
 	/*
 	 * get the list of all the events in the formula
 	 */
@@ -4046,11 +4044,29 @@ formula_res_t Alarm::eval_expression(iter_t const& i, string &attr_values, int e
         }
 		if((i->children.begin()+1)->value.id() == formula_grammar::indexID)
 			ind = eval_expression(i->children.begin()+1, attr_values);		//array index
-		else if(string((i->children.begin()+1)->value.begin(), (i->children.begin()+1)->value.end()) == ".quality")
+		else if((i->children.begin()+1)->value.id() == formula_grammar::propertyID)
 		{
-			formula_res_t res = eval_expression(i->children.begin(), attr_values, (int)ind.value);
-			res.value = res.quality;
-			return res;
+			if(string((i->children.begin()+1)->value.begin(), (i->children.begin()+1)->value.end()) == ".quality")
+			{
+				formula_res_t res = eval_expression(i->children.begin(), attr_values, (int)ind.value);
+				res.value = res.quality;
+				DEBUG_STREAM << "		node event.quality -> " << res.value << endl;
+				return res;
+			}
+			else if(string((i->children.begin()+1)->value.begin(), (i->children.begin()+1)->value.end()) == ".alarm")
+			{
+				formula_res_t res = eval_expression(i->children.begin(), attr_values, (int)ind.value);
+				res.value = (res.value == _UNACK) || (res.value == _ACKED);
+				DEBUG_STREAM << "		node event.alarm -> " << res.value << endl;
+				return res;
+			}
+			else if(string((i->children.begin()+1)->value.begin(), (i->children.begin()+1)->value.end()) == ".normal")
+			{
+				formula_res_t res = eval_expression(i->children.begin(), attr_values, (int)ind.value);
+				res.value = (res.value == _NORM) || (res.value == _RTNUN);
+				DEBUG_STREAM << "		node event.normal -> " << res.value << endl;
+				return res;
+			}
 		}
 		else
 		{
@@ -4490,9 +4506,9 @@ void Alarm::find_event_formula(tree_parse_info_t tree, vector<string> & ev)
 
 void Alarm::eval_node_event(iter_t const& i, vector<string> & ev)
 {
-/*	DEBUG_STREAM << "In eval_node_event. i->value = " <<
+	DEBUG_STREAM << "In eval_node_event. i->value = " <<
         string(i->value.begin(), i->value.end()) <<
-        " i->children.size() = " << i->children.size() << " NODE=" << rule_names[i->value.id()] <<  endl;*/
+        " i->children.size() = " << i->children.size() << " NODE=" << rule_names[i->value.id()] <<  endl;
     ostringstream err;
     err << "Looking for event in formula tree: "; 
     /*if (i->value.id() == formula_grammar::event_ID)
diff --git a/src/formula_grammar.h b/src/formula_grammar.h
index 89267df..4693acf 100644
--- a/src/formula_grammar.h
+++ b/src/formula_grammar.h
@@ -128,6 +128,7 @@ struct formula_grammar : public grammar<formula_grammar>
     static const int nonempty_exprID = 22;
     static const int val_qualityID = 23;
     static const int val_alarm_enum_stID = 24;
+    static const int propertyID = 25;
 
     
     symbols<unsigned int> tango_states;
@@ -212,6 +213,11 @@ struct formula_grammar : public grammar<formula_grammar>
             index
             	= 	inner_node_d[ch_p('[') >> uint_p >> ch_p(']')]
             	;
+            property
+            	= 	str_p(".quality")
+					| str_p(".alarm")
+					| str_p(".normal")
+            	;
             //------------------------------FORMULA--------------------------------------	   
 			val_r
 #if BOOST_VERSION  < 103600              
@@ -260,7 +266,7 @@ struct formula_grammar : public grammar<formula_grammar>
 			event_
 				=	name
 					>> !( (index)
-						| (".quality")
+						| (property)
 						)
 				;				
 
@@ -337,18 +343,18 @@ struct formula_grammar : public grammar<formula_grammar>
             	;
 
             function
-            	=	( root_node_d[str_p("abs")] >> (inner_node_d[ch_p('(') >> cond_expr >> ')'])	//TODO: ? not expr_atom ?
-            		| root_node_d[str_p("cos")] >> (inner_node_d[ch_p('(') >> cond_expr >> ')'])	//TODO: ? not expr_atom ?
-            		| root_node_d[str_p("sin")] >> (inner_node_d[ch_p('(') >> cond_expr >> ')'])	//TODO: ? not expr_atom ?
-					| root_node_d[str_p("quality")] >> (inner_node_d[ch_p('(') >> cond_expr >> ')'])	//TODO: ? not expr_atom ?
+            	=	( root_node_d[str_p("abs")] >> (discard_node_d[ch_p('(')] >> cond_expr >> discard_node_d[ch_p(')')])	//TODO: ? not expr_atom ?
+            		| root_node_d[str_p("cos")] >> (discard_node_d[ch_p('(')] >> cond_expr >> discard_node_d[ch_p(')')])	//TODO: ? not expr_atom ?
+            		| root_node_d[str_p("sin")] >> (discard_node_d[ch_p('(')] >> cond_expr >> discard_node_d[ch_p(')')])	//TODO: ? not expr_atom ?
+					| root_node_d[str_p("quality")] >> (discard_node_d[ch_p('(')] >> cond_expr >> discard_node_d[ch_p(')')])	//TODO: ? not expr_atom ?
             		)
             	;
             function_dual
-        	=	(	(root_node_d[str_p("max")] >> (inner_node_d[ch_p('(') >> cond_expr >> discard_node_d[ch_p(',')] >> cond_expr >> ')']))
+        	=	(	(root_node_d[str_p("max")] >> (discard_node_d[ch_p('(')] >> cond_expr >> discard_node_d[ch_p(',')] >> cond_expr >> discard_node_d[ch_p(')')]))
         		//|	(root_node_d[str_p("max")] >> (inner_node_d[ch_p('(') >> discard_node_d[ch_p('(')] >> logical_expr >> discard_node_d[ch_p(')')] >> discard_node_d[ch_p(',')] >> discard_node_d[ch_p('(')] >> logical_expr >> discard_node_d[ch_p(')')] >> ')']))
-        		|	(root_node_d[str_p("min")] >> (inner_node_d[ch_p('(') >> cond_expr >> discard_node_d[ch_p(',')] >> cond_expr >> ')']))
+        		|	(root_node_d[str_p("min")] >> (discard_node_d[ch_p('(')] >> cond_expr >> discard_node_d[ch_p(',')] >> cond_expr >> discard_node_d[ch_p(')')]))
         		//|	(root_node_d[str_p("min")] >> (inner_node_d[ch_p('(') >> discard_node_d[ch_p('(')] >> logical_expr >> discard_node_d[ch_p(')')] >> discard_node_d[ch_p(',')] >> discard_node_d[ch_p('(')] >> logical_expr >> discard_node_d[ch_p(')')] >> ')']))
-				|	(root_node_d[str_p("pow")] >> (inner_node_d[ch_p('(') >> cond_expr >> discard_node_d[ch_p(',')] >> cond_expr >> ')']))
+				|	(root_node_d[str_p("pow")] >> (discard_node_d[ch_p('(')] >> cond_expr >> discard_node_d[ch_p(',')] >> cond_expr >> discard_node_d[ch_p(')')]))
         		)
             	//=	*(	(root_node_d[str_p("max")] >> (inner_node_d[ch_p('(') >> logical_expr_paren >> discard_node_d[ch_p(',')] >> logical_expr_paren >> ')']))
             	//	|	(root_node_d[str_p("min")] >> (inner_node_d[ch_p('(') >> logical_expr_paren >> discard_node_d[ch_p(',')] >> logical_expr_paren >> ')']))
@@ -402,6 +408,7 @@ struct formula_grammar : public grammar<formula_grammar>
 		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, parser_context<>, parser_tag<propertyID> > property;
 
 
         rule<ScannerT> const&
-- 
GitLab