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