From 5fa2b9fb0c9422a589f1d84cf749200fc38f2197 Mon Sep 17 00:00:00 2001 From: gscalamera <graziano.scalamera@elettra.eu> Date: Thu, 23 Dec 2021 11:39:47 +0100 Subject: [PATCH] Support receivers --- src/AlarmHandler.cpp | 18 ++++++++++++++---- src/alarm_grammar.h | 14 +++++++++++++- src/alarm_table.cpp | 15 +++++++++++++-- src/alarm_table.h | 3 ++- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/AlarmHandler.cpp b/src/AlarmHandler.cpp index 0ce37d8..ff34b28 100644 --- a/src/AlarmHandler.cpp +++ b/src/AlarmHandler.cpp @@ -1958,7 +1958,7 @@ Tango::DevVarStringArray *AlarmHandler::search_alarm(Tango::DevString argin) os.clear(); os << KEY(NAME_KEY) << ai->second.name << SEP << KEY(FORMULA_KEY) << ai->second.formula << SEP << KEY(ONDELAY_KEY) << ai->second.on_delay << SEP << KEY(OFFDELAY_KEY) << ai->second.off_delay << SEP << KEY(LEVEL_KEY) << ai->second.lev << SEP << KEY(SILENT_TIME_KEY) << ai->second.silent_time << SEP << KEY(GROUP_KEY) << ai->second.grp2str() << SEP << KEY(MESSAGE_KEY) << ai->second.msg << SEP << KEY(URL_KEY) << ai->second.url << - SEP << KEY(ON_COMMAND_KEY) << ai->second.cmd_name_a << SEP << KEY(OFF_COMMAND_KEY) << ai->second.cmd_name_n << SEP << KEY(ENABLED_KEY) << (ai->second.enabled ? "1" : "0"); + SEP << KEY(ON_COMMAND_KEY) << ai->second.cmd_name_a << SEP << KEY(OFF_COMMAND_KEY) << ai->second.cmd_name_n << SEP << KEY(RECEIVERS_KEY) << ai->second.receivers << SEP << KEY(ENABLED_KEY) << (ai->second.enabled ? "1" : "0"); alarm_filtered.push_back(os.str()); } } /* for */ @@ -2256,6 +2256,7 @@ void AlarmHandler::modify(Tango::DevString argin) i->second.cmd_dp_n = alm.cmd_dp_n; i->second.cmd_action_n = alm.cmd_action_n; //i->second.send_arg_n = alm.send_arg_n; + i->second.receivers = alm.receivers; i->second.enabled = alm.enabled; //update attribute properties @@ -3144,7 +3145,8 @@ Tango::DevVarStringArray *AlarmHandler::get_alarm_info(const Tango::DevVarString complete.push_back(KEY(ON_COMMAND_KEY)+it->second.cmd_name_a); info.insert(make_pair(OFF_COMMAND_KEY,it->second.cmd_name_n)); complete.push_back(KEY(OFF_COMMAND_KEY)+it->second.cmd_name_n); - + info.insert(make_pair(RECEIVERS_KEY,it->second.receivers)); + complete.push_back(KEY(RECEIVERS_KEY)+it->second.receivers); alarms.vlock->readerOut(); argout = new Tango::DevVarStringArray(); if(argin->length() == 1) @@ -3274,6 +3276,7 @@ void AlarmHandler::load_alarm(string alarm_string, alarm_t &alm, vector<string> alm.send_arg_n = false; alm.dp_n = NULL; alm.enabled = 1; + alm.receivers.clear(); evn.clear(); alm.formula_tree = @@ -3294,6 +3297,7 @@ void AlarmHandler::load_alarm(string alarm_string, alarm_t &alm, vector<string> std::transform(alm.lev.begin(), alm.lev.end(), alm.lev.begin(), (int(*)(int))tolower); //transform to lowercase alm.msg = std::regex_replace(alm.msg, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";" alm.url = std::regex_replace(alm.url, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";" + alm.receivers = std::regex_replace(alm.receivers, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";" if(alm.cmd_name_a.length() > 0) { const char *c = alm.cmd_name_a.c_str(); @@ -3358,6 +3362,7 @@ void AlarmHandler::load_alarm(string alarm_string, alarm_t &alm, vector<string> DEBUG_STREAM << " lev = '" << alm.lev << "'" << endl; DEBUG_STREAM << " action_a = '" << alm.cmd_name_a << "'" << endl; DEBUG_STREAM << " action_n = '" << alm.cmd_name_n << "'" << endl; + DEBUG_STREAM << " receivers = '" << alm.receivers << "'" << endl; DEBUG_STREAM << " enabled = '" << (alm.enabled ? "1" : "0") << "'" << endl; if ((alm.name.empty() == false) && \ (alm.formula.empty() == false) && \ @@ -5510,6 +5515,7 @@ void AlarmHandler::prepare_alarm_attr() aid->grp = ai->second.grp; aid->lev = ai->second.lev; aid->is_new = ai->second.is_new; //copy is_new state + aid->receivers = ai->second.receivers; //ai->second.is_new = 0; //and set state as not more new //12-06-08: StopNew command set it to 0 #ifdef _CNT_ATOMIC aid->on_counter.store(ai->second.on_counter); @@ -5560,6 +5566,7 @@ void AlarmHandler::prepare_alarm_attr() aid->grp = ai->second.grp; aid->lev = ai->second.lev; aid->is_new = ai->second.is_new; //copy is_new state + aid->receivers = ai->second.receivers; //ai->second.is_new = 0; //and set state as not more new //12-06-08: StopNew command set it to 0 #ifdef _CNT_ATOMIC aid->on_counter.store(ai->second.on_counter); @@ -5614,6 +5621,7 @@ void AlarmHandler::prepare_alarm_attr() aid->is_new = ai->second.is_new; //copy is_new state aid->silenced = ai->second.silenced; //update silenced from alarm table (maybe not necessary) aid->silent_time = ai->second.silent_time; //if already alarmed and not saved correctly in properties needed to update + aid->receivers = ai->second.receivers; //ai->second.is_new = 0; //and set state as not more new //12-06-08: StopNew command set it to 0 if (aid->ack == ACK) { //if (aid->done) //TODO: done seems useless @@ -5816,7 +5824,7 @@ void AlarmHandler::put_signal_property() DECLARE_TIME_VAR t0, t1; GET_TIME(t0); alarms.save_alarm_conf_db(it.second.attr_name,it.second.name,it.second.stat,it.second.ack,it.second.enabled, - it.second.formula,it.second.on_delay,it.second.off_delay,it.second.grp2str(),it.second.lev,it.second.msg,it.second.url,it.second.cmd_name_a,it.second.cmd_name_n,it.second.silent_time); + it.second.formula,it.second.on_delay,it.second.off_delay,it.second.grp2str(),it.second.lev,it.second.msg,it.second.url,it.second.cmd_name_a,it.second.cmd_name_n,it.second.receivers,it.second.silent_time); GET_TIME(t1); DEBUG_STREAM << __func__ << ": SAVED '" <<it.first << "' in " << ELAPSED(t0, t1) << " ms" << endl; //alarms.vlock->readerOut();//TODO: avoid keeping lock @@ -5839,7 +5847,7 @@ void AlarmHandler::put_signal_property() itmap->second = conf_string; savedlock->readerOut(); alarms.save_alarm_conf_db(it.second.attr_name,it.second.name,it.second.stat,it.second.ack,it.second.enabled, - it.second.formula,it.second.on_delay,it.second.off_delay,it.second.grp2str(),it.second.lev,it.second.msg,it.second.url,it.second.cmd_name_a,it.second.cmd_name_n,it.second.silent_time); + it.second.formula,it.second.on_delay,it.second.off_delay,it.second.grp2str(),it.second.lev,it.second.msg,it.second.url,it.second.cmd_name_a,it.second.cmd_name_n,it.second.receivers,it.second.silent_time); GET_TIME(t1); DEBUG_STREAM << __func__ << ": UPDATED '" <<it.first << "' in " << ELAPSED(t0, t1) << " ms" << endl; } @@ -5988,6 +5996,7 @@ void AlarmHandler::parse_alarm(string &alarm_string, alarm_t &alm) alm.dp_n = NULL; alm.enabled=true; alm.shelved=false; + alm.receivers.clear(); alm.formula_tree = //boost::spirit::tree_parse_info< std::string::iterator, factory_t> tmp = @@ -6011,6 +6020,7 @@ void AlarmHandler::parse_alarm(string &alarm_string, alarm_t &alm) std::transform(alm.lev.begin(), alm.lev.end(), alm.lev.begin(), (int(*)(int))tolower); //transform to lowercase alm.msg = std::regex_replace(alm.msg, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";" alm.url = std::regex_replace(alm.url, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";" + alm.receivers = std::regex_replace(alm.receivers, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";" if(alm.cmd_name_a.length() > 0) { const char *c = alm.cmd_name_a.c_str(); diff --git a/src/alarm_grammar.h b/src/alarm_grammar.h index 06c2950..9723bae 100644 --- a/src/alarm_grammar.h +++ b/src/alarm_grammar.h @@ -71,6 +71,7 @@ #define URL_KEY "url" #define ON_COMMAND_KEY "on_command" #define OFF_COMMAND_KEY "off_command" +#define RECEIVERS_KEY "receivers" #define ENABLED_KEY "enabled" #define SILENT_TIME_REMAINING_KEY "shlvd_end" @@ -221,6 +222,7 @@ struct alarm_parse : public grammar<alarm_parse> no_node_d[separator] >> no_node_d[url] | no_node_d[separator] >> no_node_d[on_command] | no_node_d[separator] >> no_node_d[off_command] | + no_node_d[separator] >> no_node_d[receivers] | no_node_d[separator] >> no_node_d[enabled] ; @@ -335,6 +337,16 @@ struct alarm_parse : public grammar<alarm_parse> ] //discard_node_d | epsilon_p) ; + //------------------------------RECEIVERS------------------------------------ + receivers + = discard_node_d[str_p(KEY(RECEIVERS_KEY))] + //>> ch_p('"') + >> (*(escChar | (anychar_p - ';'))) //zero ore more char except ';' + [ + assign_a(self.m_alarm.receivers) + ] + //>> '"' + ; //------------------------------ENABLED---------------------------------------- enabled = discard_node_d[str_p(KEY(ENABLED_KEY))] >> @@ -354,7 +366,7 @@ struct alarm_parse : public grammar<alarm_parse> rule_t expression, event, option; rule<typename lexeme_scanner<ScannerT>::type> symbol; //needed to use lexeme_d in rule name rule<typename lexeme_scanner<ScannerT>::type> symbol_attr_name; //needed to use lexeme_d in rule name - rule_t name, name_alm, val, token, oper, msg, url, group, level, on_delay, off_delay, silent_time, on_command, off_command, enabled, separator,escChar; + rule_t name, name_alm, val, token, oper, msg, url, group, level, on_delay, off_delay, silent_time, on_command, off_command, receivers, enabled, separator,escChar; formula_grammar formula; rule_t const& diff --git a/src/alarm_table.cpp b/src/alarm_table.cpp index 1d78962..47c7763 100644 --- a/src/alarm_table.cpp +++ b/src/alarm_table.cpp @@ -180,6 +180,7 @@ void alarm_t::confstr(string &s) KEY(URL_KEY)<< url << SEP << KEY(ON_COMMAND_KEY)<< cmd_name_a << SEP << KEY(OFF_COMMAND_KEY)<< cmd_name_n << SEP << + KEY(RECEIVERS_KEY)<< receivers << SEP << KEY(ENABLED_KEY)<< (enabled ? "1" : "0"); s = conf.str(); } @@ -871,7 +872,7 @@ void alarm_table::stop_cmdthread() } void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, const string &status, const string &ack, bool enabled, - const string &formula, unsigned int on_delay, unsigned int off_delay, const string &grp, const string &lev, const string &msg, const string &url, const string &cmd_a, const string &cmd_n, int silent_time) + const string &formula, unsigned int on_delay, unsigned int off_delay, const string &grp, const string &lev, const string &msg, const string &url, const string &cmd_a, const string &cmd_n, const string &receivers, int silent_time) { // We want to put properties for attribute "att_name" Tango::DbDatum dbd_att_name(att_name); @@ -887,9 +888,10 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, Tango::DbDatum dbd_oncommand(ON_COMMAND_KEY); Tango::DbDatum dbd_offcommand(OFF_COMMAND_KEY); Tango::DbDatum dbd_enabled(ENABLED_KEY); + Tango::DbDatum dbd_receivers(RECEIVERS_KEY); Tango::DbData db_data; - dbd_att_name << (short int)12; // Twelve properties for attribute "att_name" + dbd_att_name << (short int)13; // Thirteen properties for attribute "att_name" dbd_name << name.c_str(); dbd_formula << formula.c_str(); dbd_on_delay << (Tango::DevLong)on_delay; @@ -901,6 +903,7 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, dbd_url << url.c_str(); dbd_oncommand << cmd_a.c_str(); dbd_offcommand << cmd_n.c_str(); + dbd_receivers << receivers.c_str(); dbd_enabled << (enabled ? (short int)1 : (short int)0); db_data.push_back(dbd_att_name); @@ -916,6 +919,7 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, db_data.push_back(dbd_oncommand); db_data.push_back(dbd_offcommand); db_data.push_back(dbd_enabled); + db_data.push_back(dbd_receivers); string dev_name(mydev->get_name()); @@ -947,6 +951,7 @@ void alarm_table::delete_alarm_conf_db(string att_name) Tango::DbDatum dbd_oncommand(ON_COMMAND_KEY); Tango::DbDatum dbd_offcommand(OFF_COMMAND_KEY); Tango::DbDatum dbd_enabled(ENABLED_KEY); + Tango::DbDatum dbd_receivers(RECEIVERS_KEY); Tango::DbData db_data; @@ -963,6 +968,7 @@ void alarm_table::delete_alarm_conf_db(string att_name) db_data.push_back(dbd_oncommand); db_data.push_back(dbd_offcommand); db_data.push_back(dbd_enabled); + db_data.push_back(dbd_receivers); string dev_name(mydev->get_name()); @@ -1019,6 +1025,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> string alm_on_command(""); string alm_off_command(""); string alm_enabled("1"); + string alm_receivers(""); for (long k=0;k < nb_prop;k++) { string &prop_name = db_data[i].name; @@ -1047,6 +1054,8 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> db_data[i] >> alm_off_command; else if (prop_name == ENABLED_KEY) db_data[i] >> alm_enabled; + else if (prop_name == RECEIVERS_KEY) + db_data[i] >> alm_receivers; else { cout << "att_name="<<att_name<<" UNKWNOWN prop_name="<<prop_name<<endl; @@ -1057,6 +1066,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> } alm_message = std::regex_replace(alm_message, std::regex(";"), "\\;"); alm_url = std::regex_replace(alm_url, std::regex(";"), "\\;"); + alm_receivers = std::regex_replace(alm_receivers, std::regex(";"), "\\;"); stringstream alm; alm << KEY(NAME_KEY)<<alm_name << SEP << KEY(FORMULA_KEY)<<alm_formula << SEP << @@ -1069,6 +1079,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> KEY(URL_KEY)<< alm_url << SEP << KEY(ON_COMMAND_KEY)<< alm_on_command << SEP << KEY(OFF_COMMAND_KEY)<< alm_off_command << SEP << + KEY(RECEIVERS_KEY)<< alm_receivers << SEP << KEY(ENABLED_KEY)<< alm_enabled; if(alm_name.empty() || alm_formula.empty() || alm_level.empty() || alm_group.empty() || alm_message.empty()) //TODO: decide if all mandatory { diff --git a/src/alarm_table.h b/src/alarm_table.h index f4a4378..3d0bc84 100644 --- a/src/alarm_table.h +++ b/src/alarm_table.h @@ -309,6 +309,7 @@ class alarm_t { bool to_be_evaluated; string msg; string url; + string receivers; unsigned int grp{0}; string lev; set<string> s_event; @@ -392,7 +393,7 @@ class alarm_table { void del_rwlock(); void save_alarm_conf_db(const string &att_name, const string &name, const string &status, const string &ack, bool enabled, - const string &formula, unsigned int on_delay, unsigned int off_delay, const string &grp, const string &url, const string &lev, const string &msg, const string &cmd_a, const string &cmd_n, int silent_time); + const string &formula, unsigned int on_delay, unsigned int off_delay, const string &grp, const string &url, const string &lev, const string &msg, const string &cmd_a, const string &cmd_n, const string &receivers, int silent_time); void delete_alarm_conf_db(string att_name); void get_alarm_list_db(vector<string> &al_list, map<string, string> &saved_alarms, ReadersWritersLock *savedlock); void init_cmdthread(); -- GitLab