Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • cs/ds/alarm-handler
  • francesco.tripaldi/alarm-handler
2 results
Show changes
Showing
with 745 additions and 540 deletions
...@@ -173,8 +173,8 @@ void AlarmHandler::add_AlarmFormula_dynamic_attribute(string attname) ...@@ -173,8 +173,8 @@ void AlarmHandler::add_AlarmFormula_dynamic_attribute(string attname)
// Not Polled // Not Polled
alarmformula->set_disp_level(Tango::OPERATOR); alarmformula->set_disp_level(Tango::OPERATOR);
// Not Memorized // Not Memorized
alarmformula->set_change_event(true, false); alarmformula->set_change_event(true, true);
alarmformula->set_archive_event(true, false); alarmformula->set_archive_event(true, true);
char array[1]; char array[1];
array[0] = '\0'; array[0] = '\0';
AlarmFormula_data.insert(make_pair(attname, array)); AlarmFormula_data.insert(make_pair(attname, array));
......
...@@ -284,6 +284,22 @@ bool AlarmHandler::is_eventSummary_allowed(TANGO_UNUSED(Tango::AttReqType type)) ...@@ -284,6 +284,22 @@ bool AlarmHandler::is_eventSummary_allowed(TANGO_UNUSED(Tango::AttReqType type))
return true; return true;
} }
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_alarmDisabled_allowed()
* Description : Execution allowed for alarmDisabled attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_alarmDisabled_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for alarmDisabled attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmDisabledStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmDisabledStateAllowed_READ
return true;
}
//-------------------------------------------------------- //--------------------------------------------------------
/** /**
* Method : AlarmHandler::is_AlarmState_allowed() * Method : AlarmHandler::is_AlarmState_allowed()
......
cmake_minimum_required(VERSION 3.2)
# source files
set(SRC_FILES ${SRC_FILES}
${CMAKE_CURRENT_SOURCE_DIR}/AlarmHandler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AlarmHandlerClass.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AlarmHandlerDynAttrUtils.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AlarmHandlerStateMachine.cpp
${CMAKE_CURRENT_SOURCE_DIR}/alarm_table.cpp
${CMAKE_CURRENT_SOURCE_DIR}/alarm-thread.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ClassFactory.cpp
${CMAKE_CURRENT_SOURCE_DIR}/cmd_thread.cpp
${CMAKE_CURRENT_SOURCE_DIR}/event_table.cpp
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/SubscribeThread.cpp
${CMAKE_CURRENT_SOURCE_DIR}/update-thread.cpp
PARENT_SCOPE)
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
// (Program Obviously used to Generate tango Object) // (Program Obviously used to Generate tango Object)
//============================================================================= //=============================================================================
#include <tango.h> #include <tango/tango.h>
#include <AlarmHandlerClass.h> #include <AlarmHandlerClass.h>
// Add class header files if needed // Add class header files if needed
......
static const char *RcsId = "$Header: /home/cvsadm/cvsroot/fermi/servers/hdb++/hdb++es/src/SubscribeThread.cpp,v 1.6 2014-03-06 15:21:43 graziano Exp $";
//+=============================================================================
//
// file : HdbEventHandler.cpp
//
// description : C++ source for thread management
// project : TANGO Device Server
//
// $Author: graziano $
//
// $Revision: 1.6 $
//
// $Log: SubscribeThread.cpp,v $
// Revision 1.6 2014-03-06 15:21:43 graziano
// StartArchivingAtStartup,
// start_all and stop_all,
// archiving of first event received at subscribe
//
// Revision 1.5 2014-02-20 14:59:02 graziano
// name and path fixing
// removed start acquisition from add
//
// Revision 1.4 2013-09-24 08:42:21 graziano
// bug fixing
//
// Revision 1.3 2013-09-02 12:13:22 graziano
// cleaned
//
// Revision 1.2 2013-08-23 10:04:53 graziano
// development
//
// Revision 1.1 2013-07-17 13:37:43 graziano
// *** empty log message ***
//
//
//
// copyleft : European Synchrotron Radiation Facility
// BP 220, Grenoble 38043
// FRANCE
//
//-=============================================================================
#include "AlarmHandler.h" #include "AlarmHandler.h"
#include "event_table.h" #include "event_table.h"
...@@ -64,6 +21,12 @@ void SubscribeThread::updateProperty() ...@@ -64,6 +21,12 @@ void SubscribeThread::updateProperty()
} }
//============================================================================= //=============================================================================
//============================================================================= //=============================================================================
void SubscribeThread::signal()
{
shared->signal();
}
//=============================================================================
//=============================================================================
void *SubscribeThread::run_undetached(void *ptr) void *SubscribeThread::run_undetached(void *ptr)
{ {
INFO_STREAM << "SubscribeThread id="<<omni_thread::self()->id()<<endl; INFO_STREAM << "SubscribeThread id="<<omni_thread::self()->id()<<endl;
...@@ -77,12 +40,14 @@ void *SubscribeThread::run_undetached(void *ptr) ...@@ -77,12 +40,14 @@ void *SubscribeThread::run_undetached(void *ptr)
updateProperty(); updateProperty();
alarm_dev->events->subscribe_events(); alarm_dev->events->subscribe_events();
int nb_to_subscribe = shared->nb_sig_to_subscribe(); int nb_to_subscribe = shared->nb_sig_to_subscribe();
shared->check_signal_property(); //check if, while subscribing, new alarms to be saved in properties where added (update action)
// And wait a bit before next time or // And wait a bit before next time or
// wait a long time if all signals subscribed // wait a long time if all signals subscribed
{ {
omni_mutex_lock sync(*shared); omni_mutex_lock sync(*shared);
//shared->lock(); //shared->lock();
if (nb_to_subscribe==0 && shared->action == NOTHING) int act=shared->action.load();
if (nb_to_subscribe==0 && act == NOTHING)
{ {
DEBUG_STREAM << "SubscribeThread::"<<__func__<<": going to wait nb_to_subscribe=0"<<endl; DEBUG_STREAM << "SubscribeThread::"<<__func__<<": going to wait nb_to_subscribe=0"<<endl;
//shared->condition.wait(); //shared->condition.wait();
......
//=============================================================================
//
// file : HdbEventHandler.h
//
// description : Include for the HDbDevice class.
//
// project : Tango Device Server
//
// $Author: graziano $
//
// $Revision: 1.5 $
//
// $Log: SubscribeThread.h,v $
// Revision 1.5 2014-03-06 15:21:43 graziano
// StartArchivingAtStartup,
// start_all and stop_all,
// archiving of first event received at subscribe
//
// Revision 1.4 2013-09-24 08:42:21 graziano
// bug fixing
//
// Revision 1.3 2013-09-02 12:11:32 graziano
// cleaned
//
// Revision 1.2 2013-08-23 10:04:53 graziano
// development
//
// Revision 1.1 2013-07-17 13:37:43 graziano
// *** empty log message ***
//
//
//
// copyleft : European Synchrotron Radiation Facility
// BP 220, Grenoble 38043
// FRANCE
//
//=============================================================================
#ifndef _SUBSCRIBE_THREAD_H #ifndef _SUBSCRIBE_THREAD_H
#define _SUBSCRIBE_THREAD_H #define _SUBSCRIBE_THREAD_H
#include <tango.h> #include <tango/tango.h>
#include <eventconsumer.h>
#include <stdint.h> #include <stdint.h>
#include "event_table.h" #include "event_table.h"
/** // constants definitions here.
* @author $Author: graziano $ //-----------------------------------------------
* @version $Revision: 1.5 $
*/
// constants definitions here.
//-----------------------------------------------
namespace AlarmHandler_ns namespace AlarmHandler_ns
{ {
...@@ -82,6 +38,7 @@ public: ...@@ -82,6 +38,7 @@ public:
int period; int period;
SubscribeThread(AlarmHandler *dev); SubscribeThread(AlarmHandler *dev);
void updateProperty(); void updateProperty();
void signal();
/** /**
* Execute the thread loop. * Execute the thread loop.
* This thread is awaken when a command has been received * This thread is awaken when a command has been received
......
/* /*
* alarm-thread.cpp * alarm-thread.cpp
* *
* $Author: claudio $
*
* $Revision: 1.7 $
*
* $Log: alarm-thread.cpp,v $
* Revision 1.7 2015-07-21 13:40:59 claudio
* minor cleanups
*
* Revision 1.6 2013-03-06 10:41:11 claudio
* commented out debug print statements
*
* Revision 1.5 2008-07-08 12:11:39 graziano
* omni_thread_fatal exception handling
*
* Revision 1.4 2008/07/07 09:13:12 graziano
* omni_thread_fatal exception handling
*
* Revision 1.3 2008/04/24 06:51:34 graziano
* small code cleanings
*
*
*
* copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale * copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale
* Strada Statale 14 - km 163,5 in AREA Science Park * Strada Statale 14 - km 163,5 in AREA Science Park
* 34012 Basovizza, Trieste ITALY * 34012 Basovizza, Trieste ITALY
...@@ -36,7 +14,7 @@ static const char __FILE__rev[] = __FILE__ " $Revision: 1.7 $"; ...@@ -36,7 +14,7 @@ static const char __FILE__rev[] = __FILE__ " $Revision: 1.7 $";
*/ */
alarm_thread::alarm_thread(AlarmHandler_ns::AlarmHandler *p) : p_Alarm(p) alarm_thread::alarm_thread(AlarmHandler_ns::AlarmHandler *p) : p_Alarm(p)
{ {
//cout << __FILE__rev << endl; //TANGO_LOG << __FILE__rev << endl;
} }
/* /*
...@@ -142,21 +120,21 @@ void alarm_thread::run(void *) ...@@ -142,21 +120,21 @@ void alarm_thread::run(void *)
ostringstream err; ostringstream err;
err << "omni_thread_fatal exception running alarm thread, err=" << ex.error << ends; err << "omni_thread_fatal exception running alarm thread, err=" << ex.error << ends;
//WARN_STREAM << "alarm_thread::run(): " << err.str() << endl; //WARN_STREAM << "alarm_thread::run(): " << err.str() << endl;
printf("alarm_thread::run(): %s", err.str().c_str()); printf("alarm_thread::run(): %s\n", err.str().c_str());
} }
catch(Tango::DevFailed& ex) catch(Tango::DevFailed& ex)
{ {
ostringstream err; ostringstream err;
err << "exception running alarm thread: '" << ex.errors[0].desc << "'" << ends; err << "exception running alarm thread: '" << ex.errors[0].desc << "'" << ends;
//WARN_STREAM << "alarm_thread::run(): " << err.str() << endl; //WARN_STREAM << "alarm_thread::run(): " << err.str() << endl;
printf("alarm_thread::run(): %s", err.str().c_str()); printf("alarm_thread::run(): %s\n", err.str().c_str());
Tango::Except::print_exception(ex); //Tango::Except::print_exception(ex);
} }
catch(...) catch(...)
{ {
//WARN_STREAM << "alarm_thread::run(): catched unknown exception!!" << endl; //WARN_STREAM << "alarm_thread::run(): catched unknown exception!!" << endl;
printf("alarm_thread::run(): catched unknown exception!!"); printf("alarm_thread::run(): catched unknown exception!!\n");
} }
} }
//cout << "alarm_thread::run(): returning" << endl; //TANGO_LOG << "alarm_thread::run(): returning" << endl;
} /* alarm_thread::run() */ } /* alarm_thread::run() */
/* /*
* alarm-thread.h * alarm-thread.h
* *
* $Author: graziano $
*
* $Revision: 1.3 $
*
* $Log: alarm-thread.h,v $
* Revision 1.3 2008-04-23 15:00:57 graziano
* small code cleanings
*
*
*
* copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale * copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale
* Strada Statale 14 - km 163,5 in AREA Science Park * Strada Statale 14 - km 163,5 in AREA Science Park
* 34012 Basovizza, Trieste ITALY * 34012 Basovizza, Trieste ITALY
...@@ -20,7 +10,7 @@ ...@@ -20,7 +10,7 @@
#define ALARM_THREAD_H #define ALARM_THREAD_H
#include <omnithread.h> #include <omnithread.h>
#include <tango.h> #include <tango/tango.h>
#include <AlarmHandler.h> #include <AlarmHandler.h>
#define ALARM_THREAD_EXIT "alarm_thread_exit" #define ALARM_THREAD_EXIT "alarm_thread_exit"
......
/* /*
* alarm_grammar.h * alarm_grammar.h
* *
* $Author: $
*
* $Revision: $
*
* $Log: alarm_grammar.h,v $
*
*
* copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale * copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale
* Strada Statale 14 - km 163,5 in AREA Science Park * Strada Statale 14 - km 163,5 in AREA Science Park
* 34012 Basovizza, Trieste ITALY * 34012 Basovizza, Trieste ITALY
...@@ -78,6 +71,7 @@ ...@@ -78,6 +71,7 @@
#define URL_KEY "url" #define URL_KEY "url"
#define ON_COMMAND_KEY "on_command" #define ON_COMMAND_KEY "on_command"
#define OFF_COMMAND_KEY "off_command" #define OFF_COMMAND_KEY "off_command"
#define RECEIVERS_KEY "receivers"
#define ENABLED_KEY "enabled" #define ENABLED_KEY "enabled"
#define SILENT_TIME_REMAINING_KEY "shlvd_end" #define SILENT_TIME_REMAINING_KEY "shlvd_end"
...@@ -228,6 +222,7 @@ struct alarm_parse : public grammar<alarm_parse> ...@@ -228,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[url] |
no_node_d[separator] >> no_node_d[on_command] | 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[off_command] |
no_node_d[separator] >> no_node_d[receivers] |
no_node_d[separator] >> no_node_d[enabled] no_node_d[separator] >> no_node_d[enabled]
; ;
...@@ -342,6 +337,16 @@ struct alarm_parse : public grammar<alarm_parse> ...@@ -342,6 +337,16 @@ struct alarm_parse : public grammar<alarm_parse>
] //discard_node_d ] //discard_node_d
| epsilon_p) | 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----------------------------------------
enabled enabled
= discard_node_d[str_p(KEY(ENABLED_KEY))] >> = discard_node_d[str_p(KEY(ENABLED_KEY))] >>
...@@ -361,7 +366,7 @@ struct alarm_parse : public grammar<alarm_parse> ...@@ -361,7 +366,7 @@ struct alarm_parse : public grammar<alarm_parse>
rule_t expression, event, option; 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; //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<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; formula_grammar formula;
rule_t const& rule_t const&
......
/* /*
* alarm_table.cpp * alarm_table.cpp
* *
* $Author: graziano $
*
* $Revision: 1.5 $
*
* $Log: alarm_table.cpp,v $
*
*
* copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale * copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale
* Strada Statale 14 - km 163,5 in AREA Science Park * Strada Statale 14 - km 163,5 in AREA Science Park
* 34012 Basovizza, Trieste ITALY * 34012 Basovizza, Trieste ITALY
*/ */
#include <sys/time.h> #include <sys/time.h>
#include <tango.h> #include <tango/tango.h>
#include "alarm_table.h" #include "alarm_table.h"
#include "alarm_grammar.h" #include "alarm_grammar.h"
#include "cmd_thread.h" #include "cmd_thread.h"
...@@ -26,22 +19,6 @@ static const char __FILE__rev[] = __FILE__ " $Revision: 1.5 $"; ...@@ -26,22 +19,6 @@ static const char __FILE__rev[] = __FILE__ " $Revision: 1.5 $";
/* /*
* alarm_t class methods * alarm_t class methods
*/ */
alarm_t::alarm_t()
{
grp=0;
on_counter=0;
off_counter=0;
freq_counter=0;
stat = S_NORMAL;
ack = ACK;
on_delay = 0;
off_delay = 0;
silent_time = -1;
cmd_name_a=string("");
cmd_name_n=string("");
enabled=true;
shelved=false;
}
bool alarm_t::operator==(const alarm_t &that) bool alarm_t::operator==(const alarm_t &that)
{ {
...@@ -60,7 +37,13 @@ void alarm_t::str2alm(const string &s) ...@@ -60,7 +37,13 @@ void alarm_t::str2alm(const string &s)
istringstream is(s); istringstream is(s);
ostringstream temp_msg; ostringstream temp_msg;
string temp_grp; string temp_grp;
is >> ts.tv_sec >> ts.tv_usec >> name >> stat >> ack >> on_counter >> lev >> silent_time >> temp_grp >> msg; //stop at first white space in msg unsigned int on_cnt;
is >> ts.tv_sec >> ts.tv_usec >> name >> stat >> ack >> on_cnt >> lev >> silent_time >> temp_grp >> msg; //stop at first white space in msg
#ifdef _CNT_ATOMIC
on_counter.store(on_cnt);
#else
on_counter = on_cnt;
#endif
temp_msg << is.rdbuf(); //read all remaining characters as msg temp_msg << is.rdbuf(); //read all remaining characters as msg
msg += temp_msg.str(); msg += temp_msg.str();
str2grp(temp_grp); str2grp(temp_grp);
...@@ -70,8 +53,13 @@ string alarm_t::alm2str(void) ...@@ -70,8 +53,13 @@ string alarm_t::alm2str(void)
{ {
ostringstream os; ostringstream os;
os.clear(); os.clear();
#ifdef _CNT_ATOMIC
os << ts.tv_sec << "\t" << ts.tv_usec << "\t" << name << "\t" \
<< stat << "\t" << ack << "\t" << on_counter.load() << "\t" << lev << "\t" << silent_time << "\t" << grp2str() << "\t" << msg << ends;
#else
os << ts.tv_sec << "\t" << ts.tv_usec << "\t" << name << "\t" \ os << ts.tv_sec << "\t" << ts.tv_usec << "\t" << name << "\t" \
<< stat << "\t" << ack << "\t" << on_counter << "\t" << lev << "\t" << silent_time << "\t" << grp2str() << "\t" << msg << ends; << stat << "\t" << ack << "\t" << on_counter << "\t" << lev << "\t" << silent_time << "\t" << grp2str() << "\t" << msg << ends;
#endif
return(os.str()); return(os.str());
} }
...@@ -189,9 +177,10 @@ void alarm_t::confstr(string &s) ...@@ -189,9 +177,10 @@ void alarm_t::confstr(string &s)
KEY(SILENT_TIME_KEY)<<silent_time << SEP << KEY(SILENT_TIME_KEY)<<silent_time << SEP <<
KEY(GROUP_KEY)<< grp2str() << SEP << KEY(GROUP_KEY)<< grp2str() << SEP <<
KEY(MESSAGE_KEY)<< msg << SEP << KEY(MESSAGE_KEY)<< msg << SEP <<
KEY(URL_KEY)<< msg << SEP << KEY(URL_KEY)<< url << SEP <<
KEY(ON_COMMAND_KEY)<< cmd_name_a << SEP << KEY(ON_COMMAND_KEY)<< cmd_name_a << SEP <<
KEY(OFF_COMMAND_KEY)<< cmd_name_n << SEP << KEY(OFF_COMMAND_KEY)<< cmd_name_n << SEP <<
KEY(RECEIVERS_KEY)<< receivers << SEP <<
KEY(ENABLED_KEY)<< (enabled ? "1" : "0"); KEY(ENABLED_KEY)<< (enabled ? "1" : "0");
s = conf.str(); s = conf.str();
} }
...@@ -367,23 +356,32 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_ ...@@ -367,23 +356,32 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_
} }
bool status_err_delay; bool status_err_delay;
if(err_delay > 0) if(err_delay > 0)
status_err_delay = (!res.ex_reason.empty() || !res.ex_desc.empty() || !res.ex_origin.empty()) && (found->second.err_counter >= 1) && ((now.tv_sec - err_delay) > found->second.ts_err_delay.tv_sec); //error is present and err delay has passed status_err_delay = (!res.valid) && (found->second.err_counter >= 1) && ((now.tv_sec - err_delay) > found->second.ts_err_delay.tv_sec); //error is present and err delay has passed
else else
status_err_delay = (!res.ex_reason.empty() || !res.ex_desc.empty() || !res.ex_origin.empty()); status_err_delay = (!res.valid);
found->second.quality = res.quality;
found->second.ex_reason = res.ex_reason; found->second.ex_reason = res.ex_reason;
found->second.ex_desc = res.ex_desc; found->second.ex_desc = res.ex_desc;
found->second.ex_origin = res.ex_origin; found->second.ex_origin = res.ex_origin;
if(!status_err_delay && !res.valid) //formula result not valid, waiting for err_delay
{
found->second.attr_values_delay = attr_values; //save last attr_values to be used in timer_update if this alarm pass over on or off delay
found->second.err_counter++;
if(found->second.err_counter == 1)
found->second.ts_err_delay = gettime(); //first occurrance of this error, now begin to wait for err delay
vlock->readerOut();
return ret_changed;
}
found->second.quality = res.quality;
bool status_on_delay; bool status_on_delay;
if(found->second.on_delay > 0) //if enabled on delay if(found->second.on_delay > 0) //if enabled on delay
status_on_delay = ((bool)(res.value != 0)) && (found->second.on_counter >= 1) && ((ts.tv_sec - found->second.on_delay) > found->second.ts_on_delay.tv_sec); //formula gives true and on delay has passed status_on_delay = ((bool)(!res.value.empty() && res.value[0] != 0)) && (found->second.on_counter >= 1) && ((ts.tv_sec - found->second.on_delay) > found->second.ts_on_delay.tv_sec); //formula gives true and on delay has passed
else else
status_on_delay = (bool)(res.value != 0); status_on_delay = (bool)(!res.value.empty() && res.value[0] != 0);
bool status_off_delay; bool status_off_delay;
if(found->second.off_delay > 0) //if enabled off delay if(found->second.off_delay > 0) //if enabled off delay
status_off_delay = (!(bool)(res.value != 0)) && (found->second.off_counter >= 1) && ((ts.tv_sec - found->second.off_delay) > found->second.ts_off_delay.tv_sec); //formula gives false and off delay has passed status_off_delay = (!(bool)(!res.value.empty() && res.value[0] != 0)) && (found->second.off_counter >= 1) && ((ts.tv_sec - found->second.off_delay) > found->second.ts_off_delay.tv_sec); //formula gives false and off delay has passed
else else
status_off_delay = !(bool)(res.value != 0); status_off_delay = !(bool)(!res.value.empty() && res.value[0] != 0);
//if status changed: //if status changed:
// - from S_NORMAL to S_ALARM considering also on delay // - from S_NORMAL to S_ALARM considering also on delay
//or //or
...@@ -391,12 +389,12 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_ ...@@ -391,12 +389,12 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_
if((status_on_delay && (found->second.stat == S_NORMAL)) || (status_off_delay && (found->second.stat == S_ALARM))) if((status_on_delay && (found->second.stat == S_NORMAL)) || (status_off_delay && (found->second.stat == S_ALARM)))
{ {
ret_changed=true; ret_changed=true;
if((bool)(res.value != 0)) if((bool)(!res.value.empty() && res.value[0] != 0))
found->second.ack = NOT_ACK; //if changing from NORMAL to ALARM -> NACK found->second.ack = NOT_ACK; //if changing from NORMAL to ALARM -> NACK
//a.grp = found->second.grp2str(); //a.grp = found->second.grp2str();
//a.msg = (int)(res.value) ? found->second.msg : ""; //a.msg = (int)(res.value[0]) ? found->second.msg : "";
found->second.ts = ts; /* store event timestamp into alarm timestamp */ //here update ts only if status changed found->second.ts = ts; /* store event timestamp into alarm timestamp */ //here update ts only if status changed
if((bool)(res.value != 0)) if((bool)(!res.value.empty() && res.value[0] != 0))
{ {
found->second.is_new = 1; //here set this alarm as new, read attribute set it to 0 //12-06-08: StopNew command set it to 0 found->second.is_new = 1; //here set this alarm as new, read attribute set it to 0 //12-06-08: StopNew command set it to 0
if(found->second.dp_a && ((ts.tv_sec - startup_complete.tv_sec) > 10)) //action from S_NORMAL to S_ALARM if(found->second.dp_a && ((ts.tv_sec - startup_complete.tv_sec) > 10)) //action from S_NORMAL to S_ALARM
...@@ -432,7 +430,13 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_ ...@@ -432,7 +430,13 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_
replace(tmp_attr_val.begin(), tmp_attr_val.end(), ';' , ','); replace(tmp_attr_val.begin(), tmp_attr_val.end(), ';' , ',');
string tmp_msg = msg; string tmp_msg = msg;
replace(tmp_msg.begin(), tmp_msg.end(), ';' , ','); replace(tmp_msg.begin(), tmp_msg.end(), ';' , ',');
tmp << "name=" << alm_name << ";groups=" << grp << ";msg="<<tmp_msg<<";values="<<tmp_attr_val<<";formula="<<formula; tm time_tm;
time_t time_sec= found->second.ts.tv_sec;
//gmtime_r(&time_sec,&time_tm); //-> UTC
localtime_r(&time_sec,&time_tm);
char time_buf[64];
strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &time_tm);
tmp << "name=" << alm_name << ";groups=" << grp << ";msg="<<tmp_msg<<";values="<<tmp_attr_val<<";formula="<<formula<<";time="<<time_buf << "." << found->second.ts.tv_usec<<";url="<<found->second.url;
cmd_t arg; cmd_t arg;
arg.cmd_id = CMD_COMMAND; arg.cmd_id = CMD_COMMAND;
arg.dp_add = (long)found->second.dp_a; arg.dp_add = (long)found->second.dp_a;
...@@ -478,7 +482,13 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_ ...@@ -478,7 +482,13 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_
replace(tmp_attr_val.begin(), tmp_attr_val.end(), ';' , ','); replace(tmp_attr_val.begin(), tmp_attr_val.end(), ';' , ',');
string tmp_msg = msg; string tmp_msg = msg;
replace(tmp_msg.begin(), tmp_msg.end(), ';' , ','); replace(tmp_msg.begin(), tmp_msg.end(), ';' , ',');
tmp << "name=" << alm_name << ";groups=" << grp << ";msg="<<tmp_msg<<";values="<<tmp_attr_val<<";formula="<<formula; tm time_tm;
time_t time_sec= found->second.ts.tv_sec;
//gmtime_r(&time_sec,&time_tm); //-> UTC
localtime_r(&time_sec,&time_tm);
char time_buf[64];
strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &time_tm);
tmp << "name=" << alm_name << ";groups=" << grp << ";msg="<<tmp_msg<<";values="<<tmp_attr_val<<";formula="<<formula<<";time="<<time_buf << "." << found->second.ts.tv_usec;
cmd_t arg; cmd_t arg;
arg.cmd_id = CMD_COMMAND; arg.cmd_id = CMD_COMMAND;
arg.dp_add = (long)found->second.dp_n; arg.dp_add = (long)found->second.dp_n;
...@@ -508,18 +518,21 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_ ...@@ -508,18 +518,21 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_
if(status_err_delay) if(status_err_delay)
{ {
if(!found->second.error) if(!found->second.error)
{
found->second.is_new = 1; found->second.is_new = 1;
found->second.ack = NOT_ACK;
}
found->second.error = true; found->second.error = true;
} }
if((bool)(res.value != 0)) { if((bool)(!res.value.empty() && res.value[0] != 0)) {
found->second.on_counter++; found->second.on_counter++;
found->second.off_counter = 0; found->second.off_counter = 0;
} else { } else {
found->second.on_counter = 0; found->second.on_counter = 0;
found->second.off_counter++; found->second.off_counter++;
} }
if(!found->second.ex_reason.empty() || !found->second.ex_desc.empty() || !found->second.ex_origin.empty()) if(!res.valid)
{ {
found->second.err_counter++; found->second.err_counter++;
} }
...@@ -562,7 +575,7 @@ bool alarm_table::timer_update() ...@@ -562,7 +575,7 @@ bool alarm_table::timer_update()
bool status_on_delay=false; bool status_on_delay=false;
bool status_off_delay=false; bool status_off_delay=false;
bool status_err_delay=false; bool status_err_delay=false;
if(err_delay > 0) //if enabled off delay if(err_delay > 0) //if enabled err delay
status_err_delay = (i->second.err_counter >= 1) && ((ts.tv_sec - err_delay) > i->second.ts_err_delay.tv_sec); //waiting for err delay has passed status_err_delay = (i->second.err_counter >= 1) && ((ts.tv_sec - err_delay) > i->second.ts_err_delay.tv_sec); //waiting for err delay has passed
if(i->second.on_delay == 0 && i->second.off_delay == 0 && err_delay == 0 && !i->second.shelved && i->second.silenced <=0) if(i->second.on_delay == 0 && i->second.off_delay == 0 && err_delay == 0 && !i->second.shelved && i->second.silenced <=0)
...@@ -616,7 +629,10 @@ bool alarm_table::timer_update() ...@@ -616,7 +629,10 @@ bool alarm_table::timer_update()
if(status_err_delay) if(status_err_delay)
{ {
if(!i->second.error) if(!i->second.error)
{
i->second.is_new = 1; i->second.is_new = 1;
i->second.ack = NOT_ACK;
}
i->second.error = true; i->second.error = true;
} }
...@@ -659,7 +675,13 @@ bool alarm_table::timer_update() ...@@ -659,7 +675,13 @@ bool alarm_table::timer_update()
replace(tmp_attr_val.begin(), tmp_attr_val.end(), ';' , ','); replace(tmp_attr_val.begin(), tmp_attr_val.end(), ';' , ',');
string tmp_msg = i->second.msg; string tmp_msg = i->second.msg;
replace(tmp_msg.begin(), tmp_msg.end(), ';' , ','); replace(tmp_msg.begin(), tmp_msg.end(), ';' , ',');
tmp << "name=" << i->second.name << ";groups=" << i->second.grp2str() << ";msg="<<tmp_msg<<";values="<<tmp_attr_val<<";formula="<<i->second.formula; tm time_tm;
time_t time_sec= i->second.ts.tv_sec;
//gmtime_r(&time_sec,&time_tm); //-> UTC
localtime_r(&time_sec,&time_tm);
char time_buf[64];
strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &time_tm);
tmp << "name=" << i->second.name << ";groups=" << i->second.grp2str() << ";msg="<<tmp_msg<<";values="<<tmp_attr_val<<";formula="<<i->second.formula<<";time="<<time_buf << "." << i->second.ts.tv_usec<<";url="<<i->second.url;
cmd_t arg; cmd_t arg;
arg.cmd_id = CMD_COMMAND; arg.cmd_id = CMD_COMMAND;
arg.dp_add = (long)i->second.dp_a; arg.dp_add = (long)i->second.dp_a;
...@@ -705,7 +727,13 @@ bool alarm_table::timer_update() ...@@ -705,7 +727,13 @@ bool alarm_table::timer_update()
replace(tmp_attr_val.begin(), tmp_attr_val.end(), ';' , ','); replace(tmp_attr_val.begin(), tmp_attr_val.end(), ';' , ',');
string tmp_msg = i->second.msg; string tmp_msg = i->second.msg;
replace(tmp_msg.begin(), tmp_msg.end(), ';' , ','); replace(tmp_msg.begin(), tmp_msg.end(), ';' , ',');
tmp << "name=" << i->second.name << ";groups=" << i->second.grp2str() << ";msg="<<tmp_msg<<";values="<<tmp_attr_val<<";formula="<<i->second.formula; tm time_tm;
time_t time_sec= i->second.ts.tv_sec;
//gmtime_r(&time_sec,&time_tm); //-> UTC
localtime_r(&time_sec,&time_tm);
char time_buf[64];
strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &time_tm);
tmp << "name=" << i->second.name << ";groups=" << i->second.grp2str() << ";msg="<<tmp_msg<<";values="<<tmp_attr_val<<";formula="<<i->second.formula<<";time="<<time_buf << "." << i->second.ts.tv_usec<<";url="<<i->second.url;
cmd_t arg; cmd_t arg;
arg.cmd_id = CMD_COMMAND; arg.cmd_id = CMD_COMMAND;
arg.dp_add = (long)i->second.dp_n; arg.dp_add = (long)i->second.dp_n;
...@@ -737,12 +765,20 @@ bool alarm_table::timer_update() ...@@ -737,12 +765,20 @@ bool alarm_table::timer_update()
*(i->second.attr_value) = _RTNUN; *(i->second.attr_value) = _RTNUN;
try try
{ {
if(!i->second.error) if(!i->second.error || !i->second.enabled || (i->second.shelved && i->second.silenced > 0))
{ {
timeval now; timeval now;
gettimeofday(&now, NULL); gettimeofday(&now, NULL);
mydev->push_change_event(i->second.attr_name,(Tango::DevEnum *)i->second.attr_value,now,(Tango::AttrQuality)i->second.quality, 1/*size*/, 0, false); if(setAlarmQuality)
mydev->push_archive_event(i->second.attr_name,(Tango::DevEnum *)i->second.attr_value,now,(Tango::AttrQuality)i->second.quality, 1/*size*/, 0, false); {
mydev->push_change_event(i->second.attr_name,(Tango::DevEnum *)i->second.attr_value,now,(Tango::AttrQuality)i->second.quality, 1/*size*/, 0, false);
mydev->push_archive_event(i->second.attr_name,(Tango::DevEnum *)i->second.attr_value,now,(Tango::AttrQuality)i->second.quality, 1/*size*/, 0, false);
}
else
{
mydev->push_change_event(i->second.attr_name,(Tango::DevEnum *)i->second.attr_value);
mydev->push_archive_event(i->second.attr_name,(Tango::DevEnum *)i->second.attr_value);
}
} }
else else
{ {
...@@ -819,7 +855,11 @@ vector<string> alarm_table::to_be_evaluated_list() ...@@ -819,7 +855,11 @@ vector<string> alarm_table::to_be_evaluated_list()
void alarm_table::new_rwlock() void alarm_table::new_rwlock()
{ {
#ifndef _USE_BOOST_LOCK
vlock = new(ReadersWritersLock); vlock = new(ReadersWritersLock);
#else
vlock = new rwlock_t("VLOCK");
#endif
} }
void alarm_table::del_rwlock() void alarm_table::del_rwlock()
{ {
...@@ -841,7 +881,7 @@ void alarm_table::stop_cmdthread() ...@@ -841,7 +881,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, 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" // We want to put properties for attribute "att_name"
Tango::DbDatum dbd_att_name(att_name); Tango::DbDatum dbd_att_name(att_name);
...@@ -857,9 +897,10 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, ...@@ -857,9 +897,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_oncommand(ON_COMMAND_KEY);
Tango::DbDatum dbd_offcommand(OFF_COMMAND_KEY); Tango::DbDatum dbd_offcommand(OFF_COMMAND_KEY);
Tango::DbDatum dbd_enabled(ENABLED_KEY); Tango::DbDatum dbd_enabled(ENABLED_KEY);
Tango::DbDatum dbd_receivers(RECEIVERS_KEY);
Tango::DbData db_data; 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_name << name.c_str();
dbd_formula << formula.c_str(); dbd_formula << formula.c_str();
dbd_on_delay << (Tango::DevLong)on_delay; dbd_on_delay << (Tango::DevLong)on_delay;
...@@ -871,6 +912,7 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, ...@@ -871,6 +912,7 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name,
dbd_url << url.c_str(); dbd_url << url.c_str();
dbd_oncommand << cmd_a.c_str(); dbd_oncommand << cmd_a.c_str();
dbd_offcommand << cmd_n.c_str(); dbd_offcommand << cmd_n.c_str();
dbd_receivers << receivers.c_str();
dbd_enabled << (enabled ? (short int)1 : (short int)0); dbd_enabled << (enabled ? (short int)1 : (short int)0);
db_data.push_back(dbd_att_name); db_data.push_back(dbd_att_name);
...@@ -886,6 +928,7 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, ...@@ -886,6 +928,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_oncommand);
db_data.push_back(dbd_offcommand); db_data.push_back(dbd_offcommand);
db_data.push_back(dbd_enabled); db_data.push_back(dbd_enabled);
db_data.push_back(dbd_receivers);
string dev_name(mydev->get_name()); string dev_name(mydev->get_name());
...@@ -893,10 +936,11 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, ...@@ -893,10 +936,11 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name,
{ {
Tango::DbDevice *db_dev = mydev->get_db_device(); Tango::DbDevice *db_dev = mydev->get_db_device();
db_dev->get_dbase()->put_device_attribute_property(dev_name,db_data); db_dev->get_dbase()->put_device_attribute_property(dev_name,db_data);
//Tango::Util::instance()->get_database()->put_device_attribute_property(dev_name,db_data);
} }
catch(Tango::DevFailed &e) catch(Tango::DevFailed &e)
{ {
cout << __func__ << ": Exception saving configuration = " << e.errors[0].desc<<endl; TANGO_LOG << __func__ << ": Exception saving configuration = " << e.errors[0].desc<<endl;
} }
} }
...@@ -916,6 +960,7 @@ void alarm_table::delete_alarm_conf_db(string att_name) ...@@ -916,6 +960,7 @@ void alarm_table::delete_alarm_conf_db(string att_name)
Tango::DbDatum dbd_oncommand(ON_COMMAND_KEY); Tango::DbDatum dbd_oncommand(ON_COMMAND_KEY);
Tango::DbDatum dbd_offcommand(OFF_COMMAND_KEY); Tango::DbDatum dbd_offcommand(OFF_COMMAND_KEY);
Tango::DbDatum dbd_enabled(ENABLED_KEY); Tango::DbDatum dbd_enabled(ENABLED_KEY);
Tango::DbDatum dbd_receivers(RECEIVERS_KEY);
Tango::DbData db_data; Tango::DbData db_data;
...@@ -932,6 +977,7 @@ void alarm_table::delete_alarm_conf_db(string att_name) ...@@ -932,6 +977,7 @@ void alarm_table::delete_alarm_conf_db(string att_name)
db_data.push_back(dbd_oncommand); db_data.push_back(dbd_oncommand);
db_data.push_back(dbd_offcommand); db_data.push_back(dbd_offcommand);
db_data.push_back(dbd_enabled); db_data.push_back(dbd_enabled);
db_data.push_back(dbd_receivers);
string dev_name(mydev->get_name()); string dev_name(mydev->get_name());
...@@ -942,13 +988,12 @@ void alarm_table::delete_alarm_conf_db(string att_name) ...@@ -942,13 +988,12 @@ void alarm_table::delete_alarm_conf_db(string att_name)
} }
catch(Tango::DevFailed &e) catch(Tango::DevFailed &e)
{ {
cout << __func__ << ": Exception deleting " << att_name << " = " << e.errors[0].desc<<endl; TANGO_LOG << __func__ << ": Exception deleting " << att_name << " = " << e.errors[0].desc<<endl;
} }
} }
void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> &saved_alarms) void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> &saved_alarms, ReadersWritersLock *savedlock)
{ {
saved_alarms.clear();
string dev_name(mydev->get_name()); string dev_name(mydev->get_name());
vector<string> att_list; vector<string> att_list;
...@@ -967,8 +1012,10 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> ...@@ -967,8 +1012,10 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
} }
catch(Tango::DevFailed &e) catch(Tango::DevFailed &e)
{ {
cout << __func__ << ": Exception reading configuration = " << e.errors[0].desc<<endl; TANGO_LOG << __func__ << ": Exception reading configuration = " << e.errors[0].desc<<endl;
} }
savedlock->writerIn();
saved_alarms.clear();
for (size_t i=0;i < db_data.size();/*i++*/) for (size_t i=0;i < db_data.size();/*i++*/)
{ {
Tango::DevLong64 nb_prop; Tango::DevLong64 nb_prop;
...@@ -987,6 +1034,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> ...@@ -987,6 +1034,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
string alm_on_command(""); string alm_on_command("");
string alm_off_command(""); string alm_off_command("");
string alm_enabled("1"); string alm_enabled("1");
string alm_receivers("");
for (long k=0;k < nb_prop;k++) for (long k=0;k < nb_prop;k++)
{ {
string &prop_name = db_data[i].name; string &prop_name = db_data[i].name;
...@@ -1015,9 +1063,11 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> ...@@ -1015,9 +1063,11 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
db_data[i] >> alm_off_command; db_data[i] >> alm_off_command;
else if (prop_name == ENABLED_KEY) else if (prop_name == ENABLED_KEY)
db_data[i] >> alm_enabled; db_data[i] >> alm_enabled;
else if (prop_name == RECEIVERS_KEY)
db_data[i] >> alm_receivers;
else else
{ {
cout << "att_name="<<att_name<<" UNKWNOWN prop_name="<<prop_name<<endl; TANGO_LOG << "att_name="<<att_name<<" UNKWNOWN prop_name="<<prop_name<<endl;
i++; i++;
continue; continue;
} }
...@@ -1025,6 +1075,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> ...@@ -1025,6 +1075,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_message = std::regex_replace(alm_message, std::regex(";"), "\\;");
alm_url = std::regex_replace(alm_url, std::regex(";"), "\\;"); alm_url = std::regex_replace(alm_url, std::regex(";"), "\\;");
alm_receivers = std::regex_replace(alm_receivers, std::regex(";"), "\\;");
stringstream alm; stringstream alm;
alm << KEY(NAME_KEY)<<alm_name << SEP << alm << KEY(NAME_KEY)<<alm_name << SEP <<
KEY(FORMULA_KEY)<<alm_formula << SEP << KEY(FORMULA_KEY)<<alm_formula << SEP <<
...@@ -1037,15 +1088,17 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> ...@@ -1037,15 +1088,17 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
KEY(URL_KEY)<< alm_url << SEP << KEY(URL_KEY)<< alm_url << SEP <<
KEY(ON_COMMAND_KEY)<< alm_on_command << SEP << KEY(ON_COMMAND_KEY)<< alm_on_command << SEP <<
KEY(OFF_COMMAND_KEY)<< alm_off_command << SEP << KEY(OFF_COMMAND_KEY)<< alm_off_command << SEP <<
KEY(RECEIVERS_KEY)<< alm_receivers << SEP <<
KEY(ENABLED_KEY)<< alm_enabled; 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 if(alm_name.empty() || alm_formula.empty() || alm_level.empty() || alm_group.empty() || alm_message.empty()) //TODO: decide if all mandatory
{ {
cout << __func__ << ": skipped '" << alm.str() << "'" << endl; TANGO_LOG << __func__ << ": skipped '" << alm.str() << "'" << endl;
continue; continue;
} }
al_list.push_back(alm.str()); al_list.push_back(alm.str());
saved_alarms.insert(make_pair(alm_name,alm.str())); saved_alarms.insert(make_pair(alm_name,alm.str()));
} }
savedlock->writerOut();
#if 0 #if 0
......
This diff is collapsed.
This diff is collapsed.
/* /*
*cmd_thread.h * cmd_thread.h
*
* $Author: graziano $
*
* $Revision: 1.2 $
*
* $Log: cmd_thread.h,v $
* Revision 1.2 2008-11-17 13:10:36 graziano
* command action can be: without arguments or with string argument
*
* Revision 1.1 2008/11/10 10:53:31 graziano
* thread for execution of commands
*
* Revision 1.2 2008/10/07 14:03:07 graziano
* added handling of multi axis groups and spindle groups
*
* Revision 1.1 2008/09/30 09:46:32 graziano
* first version
*
* Revision 1.3 2008/04/23 15:00:57 graziano
* small code cleanings
*
*
* *
* copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale * copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale
* Strada Statale 14 - km 163,5 in AREA Science Park * Strada Statale 14 - km 163,5 in AREA Science Park
...@@ -41,7 +19,7 @@ ...@@ -41,7 +19,7 @@
#define CMD_THREAD_EXIT 3 #define CMD_THREAD_EXIT 3
#include <omnithread.h> #include <omnithread.h>
#include <tango.h> #include <tango/tango.h>
#include "AlarmHandler.h" #include "AlarmHandler.h"
struct cmd_t struct cmd_t
......
This diff is collapsed.
This diff is collapsed.
/* /*
* formula_grammar.h * formula_grammar.h
* *
* $Author: graziano $
*
* $Revision: 1.5 $
*
* $Log: formula_grammar.h,v $
*
*
* copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale * copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale
* Strada Statale 14 - km 163,5 in AREA Science Park * Strada Statale 14 - km 163,5 in AREA Science Park
* 34012 Basovizza, Trieste ITALY * 34012 Basovizza, Trieste ITALY
...@@ -132,6 +125,8 @@ struct formula_grammar : public grammar<formula_grammar> ...@@ -132,6 +125,8 @@ struct formula_grammar : public grammar<formula_grammar>
static const int val_qualityID = 23; static const int val_qualityID = 23;
static const int val_alarm_enum_stID = 24; static const int val_alarm_enum_stID = 24;
static const int propertyID = 25; static const int propertyID = 25;
static const int index_rangeID = 26;
static const int index_listID = 27;
symbols<unsigned int> tango_states; symbols<unsigned int> tango_states;
...@@ -198,7 +193,7 @@ struct formula_grammar : public grammar<formula_grammar> ...@@ -198,7 +193,7 @@ struct formula_grammar : public grammar<formula_grammar>
= (alnum_p | '.' | '_' | '-' | '+') //any alpha numeric char plus '.', '_', '-' = (alnum_p | '.' | '_' | '-' | '+') //any alpha numeric char plus '.', '_', '-'
; ;
symbol_attr symbol_attr
= (alnum_p | '_' ) //any alpha numeric char plus '_' for attribute names = (alnum_p | '_' | '.') - str_p(".normal") - str_p(".alarm") - str_p(".quality") //any alpha numeric char plus '_', '.' for attribute names
; ;
//------------------------------ALARM NAME-------------------------------------- //------------------------------ALARM NAME--------------------------------------
name name
...@@ -214,9 +209,18 @@ struct formula_grammar : public grammar<formula_grammar> ...@@ -214,9 +209,18 @@ struct formula_grammar : public grammar<formula_grammar>
] ]
] ]
// = repeat_p(3)[(+symbol) >> ch_p('/')] >> (+symbol) // = repeat_p(3)[(+symbol) >> ch_p('/')] >> (+symbol)
; ;
index_range
=
( uint_p >> !(discard_node_d[ch_p('-')] >> uint_p)) // n or n-m
;
index_list
= (index_range >> *(discard_node_d[ch_p(',')] >> index_range)) // n-m,k,s-t,..
;
index index
= inner_node_d[ch_p('[') >> uint_p >> ch_p(']')] = discard_node_d[ch_p('[')] >>
(str_p("-1") | index_list) >>
discard_node_d[ch_p(']')]
; ;
property property
= str_p(".quality") = str_p(".quality")
...@@ -270,8 +274,8 @@ struct formula_grammar : public grammar<formula_grammar> ...@@ -270,8 +274,8 @@ struct formula_grammar : public grammar<formula_grammar>
event_ event_
= name = name
>> !( (index) >> ( *(index)//0 or more indexex
| (property) >> !(property) //followed by 0 or 1 property
) )
; ;
...@@ -406,6 +410,8 @@ struct formula_grammar : public grammar<formula_grammar> ...@@ -406,6 +410,8 @@ struct formula_grammar : public grammar<formula_grammar>
rule<ScannerT, parser_context<>, parser_tag<expr_atomID> > expr_atom; rule<ScannerT, parser_context<>, parser_tag<expr_atomID> > expr_atom;
rule<ScannerT, parser_context<>, parser_tag<funcID> > function; rule<ScannerT, parser_context<>, parser_tag<funcID> > function;
rule<ScannerT, parser_context<>, parser_tag<nameID> > name; rule<ScannerT, parser_context<>, parser_tag<nameID> > name;
rule<ScannerT, parser_context<>, parser_tag<index_rangeID> > index_range;
rule<ScannerT, parser_context<>, parser_tag<index_listID> > index_list;
rule<ScannerT, parser_context<>, parser_tag<indexID> > index; rule<ScannerT, parser_context<>, parser_tag<indexID> > index;
rule<ScannerT, parser_context<>, parser_tag<val_stringID> > val_string; rule<ScannerT, parser_context<>, parser_tag<val_stringID> > val_string;
rule<ScannerT, parser_context<>, parser_tag<func_dualID> > function_dual; rule<ScannerT, parser_context<>, parser_tag<func_dualID> > function_dual;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.