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 585 additions and 461 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;
......
//=============================================================================
//
// 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"
...@@ -187,6 +180,7 @@ void alarm_t::confstr(string &s) ...@@ -187,6 +180,7 @@ void alarm_t::confstr(string &s)
KEY(URL_KEY)<< url << 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();
} }
...@@ -362,23 +356,32 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_ ...@@ -362,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
...@@ -386,12 +389,12 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_ ...@@ -386,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
...@@ -427,7 +430,13 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_ ...@@ -427,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;
...@@ -473,7 +482,13 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_ ...@@ -473,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;
...@@ -503,18 +518,21 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_ ...@@ -503,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++;
} }
...@@ -557,7 +575,7 @@ bool alarm_table::timer_update() ...@@ -557,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)
...@@ -611,7 +629,10 @@ bool alarm_table::timer_update() ...@@ -611,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;
} }
...@@ -654,7 +675,13 @@ bool alarm_table::timer_update() ...@@ -654,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<<";url="<<i->second.url; 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;
...@@ -700,7 +727,13 @@ bool alarm_table::timer_update() ...@@ -700,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<<";url="<<i->second.url; 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;
...@@ -732,12 +765,20 @@ bool alarm_table::timer_update() ...@@ -732,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
{ {
...@@ -840,7 +881,7 @@ void alarm_table::stop_cmdthread() ...@@ -840,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);
...@@ -856,9 +897,10 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, ...@@ -856,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;
...@@ -870,6 +912,7 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, ...@@ -870,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);
...@@ -885,6 +928,7 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, ...@@ -885,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());
...@@ -896,7 +940,7 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, ...@@ -896,7 +940,7 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name,
} }
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,7 +988,7 @@ void alarm_table::delete_alarm_conf_db(string att_name) ...@@ -942,7 +988,7 @@ 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;
} }
} }
...@@ -966,7 +1012,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> ...@@ -966,7 +1012,7 @@ 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(); savedlock->writerIn();
saved_alarms.clear(); saved_alarms.clear();
...@@ -988,6 +1034,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> ...@@ -988,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;
...@@ -1016,9 +1063,11 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> ...@@ -1016,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;
} }
...@@ -1026,6 +1075,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> ...@@ -1026,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 <<
...@@ -1038,10 +1088,11 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> ...@@ -1038,10 +1088,11 @@ 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());
......
/* /*
* alarm_table.h * alarm_table.h
* *
* $Author: graziano $
*
* $Revision: 1.5 $
*
* $Log: alarm_table.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
...@@ -21,8 +14,9 @@ ...@@ -21,8 +14,9 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <map> #include <map>
#include <numeric> //for std::accumulate
#include <tango.h> #include <tango/tango.h>
//spirit defines have to be put befor first inclusion of spirit headers //spirit defines have to be put befor first inclusion of spirit headers
#ifndef BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT #ifndef BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT
...@@ -51,11 +45,12 @@ ...@@ -51,11 +45,12 @@
#endif #endif
//#include "log_thread.h" //#include "log_thread.h"
#define MAX_ARRAY_PRINTED_CHARS 1000
#define LOG_STREAM cout #define LOG_STREAM TANGO_LOG
using namespace std; using namespace std;
typedef vector<Tango::DevDouble> value_t;
#if BOOST_VERSION < 103600 #if BOOST_VERSION < 103600
typedef std::string::iterator iterator_t; typedef std::string::iterator iterator_t;
...@@ -109,23 +104,161 @@ struct rwlock_t ...@@ -109,23 +104,161 @@ struct rwlock_t
rwlock_t(string n){name=n;}; rwlock_t(string n){name=n;};
rwlock_t(){name=string("RWLOCK");}; rwlock_t(){name=string("RWLOCK");};
boost::shared_mutex mut; boost::shared_mutex mut;
void readerIn(){cout<<name<<": " << __func__<<endl;mut.lock_shared();} void readerIn(){TANGO_LOG<<name<<": " << __func__<<endl;mut.lock_shared();}
void readerOut(){cout<<name<<": " << __func__<<endl;mut.unlock_shared();} void readerOut(){TANGO_LOG<<name<<": " << __func__<<endl;mut.unlock_shared();}
void writerIn(){cout<<name<<": " << __func__<<endl;mut.lock();} void writerIn(){TANGO_LOG<<name<<": " << __func__<<endl;mut.lock();}
void writerOut(){cout<<name<<": " << __func__<<endl;mut.unlock();} void writerOut(){TANGO_LOG<<name<<": " << __func__<<endl;mut.unlock();}
}; };
#endif #endif
template <typename T>
string print_vector(const std::vector<T>& v, const char * const separator = ",")
{
ostringstream out;
if(!v.empty())
{
std::copy(v.begin(),
--v.end(),
std::ostream_iterator<T>(out, separator));
out << v.back();
}
return out.str();
}
template <typename T>
string print_array(const std::vector<T>& v, long dim_x, long dim_y, const char * const separator = ",")
{
ostringstream out;
if(dim_y <1)
{
out <<"["<< print_vector(v);
out.seekp(0, ios::end);
stringstream::pos_type offset = out.tellp();
if(offset > MAX_ARRAY_PRINTED_CHARS)
{
out.seekp(MAX_ARRAY_PRINTED_CHARS, ios::beg);//limit size
out << "...]" << ends;
}
else
out << "]";
return out.str();
}
out << "[";
for(long i=0; i<dim_y; i++)
{
auto vstart = v.begin();//start iterator of a row in a vector containing a 2D array
auto vend = v.begin();//end iterator of a row in a vector containing a 2D array
advance(vstart,(int)(i * (dim_x)));
advance(vend,(int)((i+1) * dim_x));
value_t row = value_t(vstart,vend);
out <<"["<< print_vector(row);
out.seekp(0, ios::end);
stringstream::pos_type offset = out.tellp();
if(offset > MAX_ARRAY_PRINTED_CHARS)
{
out.seekp(MAX_ARRAY_PRINTED_CHARS, ios::beg);//limit size
out << "...]]" << ends;
break;
}
else
out << "]";
if(i < dim_y-1)
{
out << ",";
}
}
out << "]";
return out.str();
}
struct vectorUtils
{
static double fBitAnd(long a, long b){ return (double)(a & b);}
static double fBitOr(long a, long b){ return (double)(a | b);}
static double fBitXor(long a, long b){ return (double)(a ^ b);}
static double fBitShiftL(long a, long b){ return (double)(a << b);}
static double fBitShiftR(long a, long b){ return (double)(a >> b);}
static double fMin(double a, double b){ return (double)min(a, b);}
static double fMax(double a, double b){ return (double)max(a, b);}
static double fPow(double a, double b){ return (double)pow(a, b);}
static double fEqual(double a, double b){ return (double)(a == b);}
static double fDifferent(double a, double b){ return (double)(a != b);}
static double fGreaterEqual(double a, double b){ return (double)(a >= b);}
static double fGreater(double a, double b){ return (double)(a > b);}
static double fLessEqual(double a, double b){ return (double)(a <= b);}
static double fLess(double a, double b){ return (double)(a < b);}
static double fPlus(double a, double b){ return (double)(a + b);}
static double fMinus(double a, double b){ return (double)(a - b);}
static double fMult(double a, double b){ return (double)(a * b);}
static double fDiv(double a, double b){ return (double)(a / b);}
static double fAnd(double a, double b){ return (double)((bool)a && (bool)b);}
static double fOr(double a, double b){ return (double)((bool)a || (bool)b);}
template<class T >
static void applyVectorFunc(const vector<T> & v1, long v1_x, long v1_y, const vector<T> & v2, long v2_x, long v2_y, value_t &res, long &res_x, long &res_y, const string& origin, double (*func)(T, T))
{
if(v1.size() > 0 && v2.size() > 0 && (v1.size() == v2.size()))
{
res_x = v1_x;
res_y = v1_y;
if(v1_x != v2_x || (v1_y != v2_y && (v1_y > 1 || v2_y > 1)))//dim_y 0 and 1 are the same
{
ostringstream o;
o << "Array sizes do not match: " << (v1_y ? v1_y : 1) << "x" << v1_x << " != " << (v2_y ? v2_y : 1) << "x" << v2_x;
Tango::Except::throw_exception( //throw exception to have error not delayed
"FORMULA_ERROR",
o.str(),
origin);
}
res.resize(v1.size());
std::transform(v1.begin(), v1.end(), v2.begin(),res.begin(),
[func](T a, T b) { return func(a, b); });
}
else if(v2.size() == 1)
{
res_x = v1_x;
res_y = v1_y;
T b = v2[0];
res.resize(v1.size());
std::transform(v1.begin(), v1.end(), res.begin(),
[b,func](T a) { return func(a, b); });
}
else if(v1.size() == 1)
{
res_x = v2_x;
res_y = v2_y;
T a = v1[0];
res.resize(v2.size());
std::transform(v2.begin(), v2.end(), res.begin(),
[a,func](T b) { return func(a, b); });
}
else if(v1.size() > 0 && v2.size() > 0)
{
ostringstream o;
o << "Array sizes do not match: " << (v1_y ? v1_y : 1) << "x" << v1_x << " != " << (v2_y ? v2_y : 1) << "x" << v2_x;
Tango::Except::throw_exception( //throw exception to have error not delayed
"FORMULA_ERROR",
o.str(),
origin);
}
}
};
struct formula_res_t struct formula_res_t
{ {
formula_res_t(){value=0;quality=Tango::ATTR_VALID;ex_reason=string("");ex_desc=string("");ex_origin=string("");} formula_res_t(){valid=false;quality=Tango::ATTR_VALID;ex_reason=string("");ex_desc=string("");ex_origin=string("");dim_x=0;dim_y=0;}
double value; value_t value;
long dim_x;
long dim_y;
int quality; int quality;
bool valid;
string error;
Tango::DevErrorList errors; //TODO: error stack Tango::DevErrorList errors; //TODO: error stack
string ex_reason; string ex_reason;
string ex_desc; string ex_desc;
string ex_origin; string ex_origin;
string attr_name; //last evaluated attr name
int combine_quality(int quality1, int quality2) int combine_quality(int quality1, int quality2)
{ {
int res; int res;
...@@ -148,124 +281,218 @@ struct formula_res_t ...@@ -148,124 +281,218 @@ struct formula_res_t
else else
return ex_2; return ex_2;
} }
void extract_result()
{
if(!value.empty())
{
value = {(double)std::accumulate(value.begin(), value.end(), (bool)false, [](bool a, double b) { return (bool)(a || (bool)b); })};
dim_x=1;
dim_y=0;
}
}
formula_res_t operator==(const formula_res_t& e) formula_res_t operator==(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value == e.value; res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fEqual);
return res; return res;
} }
formula_res_t operator!=(const formula_res_t& e) formula_res_t operator!=(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value != e.value; res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fDifferent);
return res; return res;
} }
formula_res_t operator<=(const formula_res_t& e) formula_res_t operator<=(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value <= e.value; res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fLessEqual);
return res; return res;
} }
formula_res_t operator>=(const formula_res_t& e) formula_res_t operator>=(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value >= e.value; res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fGreaterEqual);
return res; return res;
} }
formula_res_t operator<(const formula_res_t& e) formula_res_t operator<(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value < e.value; res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fLess);
return res; return res;
} }
formula_res_t operator>(const formula_res_t& e) formula_res_t operator>(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value > e.value; res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fGreater);
return res; return res;
} }
formula_res_t operator||(const formula_res_t& e) formula_res_t operator||(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value || e.value; if(value.size() <= 1 && e.value.size() <= 1) //apply special logic ov validity only if comparing scalars. Being careful that if valid=false, then size could be 0
{
res.value = {(double)((valid && value[0]) || (e.valid && e.value[0]))}; //in OR one operand TRUE and valid is enough
res.valid = (valid && value[0]) || (e.valid && e.value[0]) || (valid && e.valid); //in OR one operand TRUE and valid is enough, otherwise both valid as usual
}
else
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
if(!(value.size() <= 1 && e.value.size() <= 1))
{
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fOr);
}
return res; return res;
} }
formula_res_t operator&&(const formula_res_t& e) formula_res_t operator&&(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value && e.value; if(value.size() <= 1 && e.value.size() <= 1) //apply special logic ov validity only if comparing scalars
{
res.value = {(double)(!((valid && !value[0]) || (e.valid && !e.value[0])) || (valid && value[0] && e.valid && e.value[0]))}; //if at least one operand is FALSE and valid, result is FALSE for sure (and valid)
res.valid = (valid && !value[0]) || (e.valid && !e.value[0]) || (valid && e.valid);
}
else
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
if(!(value.size() <= 1 && e.value.size() <= 1))
{
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fAnd);
}
return res; return res;
} }
formula_res_t operator+(const formula_res_t& e) formula_res_t operator+(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value + e.value; res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fPlus);
return res; return res;
} }
formula_res_t operator-(const formula_res_t& e) formula_res_t operator-(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value - e.value; res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fMinus);
return res; return res;
} }
formula_res_t operator*(const formula_res_t& e) formula_res_t operator*(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value * e.value; res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fMult);
return res; return res;
} }
formula_res_t operator/(const formula_res_t& e) formula_res_t operator/(const formula_res_t& e)
{ {
formula_res_t res; formula_res_t res;
res.value = value / e.value; res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality); res.quality = combine_quality(quality, e.quality);
res.ex_reason = combine_exception(ex_reason, e.ex_reason); if(!res.valid)
res.ex_desc = combine_exception(ex_desc, e.ex_desc); {
res.ex_origin = combine_exception(ex_origin, e.ex_origin); res.ex_reason = combine_exception(ex_reason, e.ex_reason);
res.ex_desc = combine_exception(ex_desc, e.ex_desc);
res.ex_origin = combine_exception(ex_origin, e.ex_origin);
}
vectorUtils::applyVectorFunc(value,dim_x,dim_y,e.value,e.dim_x,e.dim_y,res.value,res.dim_x,res.dim_y,__func__,vectorUtils::fDiv);
return res;
}
formula_res_t operator!()
{
formula_res_t res;
for(size_t ii=0; ii < value.size(); ii++)
{
res.value.push_back(!value[ii]);
}
return res;
}
formula_res_t operator-()
{
formula_res_t res;
for(size_t ii=0; ii < value.size(); ii++)
{
res.value.push_back(-value[ii]);
}
return res; return res;
} }
/*string operator<<(const formula_res_t& e) /*string operator<<(const formula_res_t& e)
...@@ -316,6 +543,7 @@ class alarm_t { ...@@ -316,6 +543,7 @@ class alarm_t {
bool to_be_evaluated; bool to_be_evaluated;
string msg; string msg;
string url; string url;
string receivers;
unsigned int grp{0}; unsigned int grp{0};
string lev; string lev;
set<string> s_event; set<string> s_event;
...@@ -371,7 +599,9 @@ class alarm_table { ...@@ -371,7 +599,9 @@ class alarm_table {
public: public:
alarm_table() {} alarm_table() {}
~alarm_table() {del_rwlock();} ~alarm_table() {del_rwlock();}
bool setAlarmQuality {false};
void set_dev(Tango::DeviceImpl* devImpl) {mydev=devImpl;} void set_dev(Tango::DeviceImpl* devImpl) {mydev=devImpl;}
void set_al_qual(bool set_al_qual) {setAlarmQuality=set_al_qual;}
//void init(vector<string>& avs); //void init(vector<string>& avs);
//void init(vector<string>& avs, vector<string> &evn, map< string,vector<string> > &alarm_event); //void init(vector<string>& avs, vector<string> &evn, map< string,vector<string> > &alarm_event);
...@@ -397,7 +627,7 @@ class alarm_table { ...@@ -397,7 +627,7 @@ class alarm_table {
void del_rwlock(); void del_rwlock();
void save_alarm_conf_db(const string &att_name, const string &name, const string &status, const string &ack, bool enabled, 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 delete_alarm_conf_db(string att_name);
void get_alarm_list_db(vector<string> &al_list, map<string, string> &saved_alarms, ReadersWritersLock *savedlock); void get_alarm_list_db(vector<string> &al_list, map<string, string> &saved_alarms, ReadersWritersLock *savedlock);
void init_cmdthread(); void init_cmdthread();
......
/* /*
* cmd_thread.cpp * cmd_thread.cpp
* *
* $Author: claudio $
*
* $Revision: 1.3 $
*
* $Log: cmd_thread.cpp,v $
* Revision 1.3 2015-07-21 13:40:59 claudio
* minor cleanups
*
* Revision 1.2 2008-11-17 13:13:21 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
*
*
*
*
*
* 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
...@@ -32,8 +14,8 @@ static const char __FILE__rev[] = __FILE__ " $Revision: 1.3 $"; ...@@ -32,8 +14,8 @@ static const char __FILE__rev[] = __FILE__ " $Revision: 1.3 $";
*/ */
cmd_thread::cmd_thread() cmd_thread::cmd_thread()
{ {
cout << __FILE__rev << endl; TANGO_LOG << __FILE__rev << endl;
cout << gettime().tv_sec << " cmd_thread::cmd_thread(): constructor... !" << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::cmd_thread(): constructor... !" << endl;
//mutex_dp = new omni_mutex::omni_mutex(); //mutex_dp = new omni_mutex::omni_mutex();
} }
...@@ -42,7 +24,7 @@ cmd_thread::cmd_thread() ...@@ -42,7 +24,7 @@ cmd_thread::cmd_thread()
*/ */
cmd_thread::~cmd_thread() cmd_thread::~cmd_thread()
{ {
cout << gettime().tv_sec << " cmd_thread::~cmd_thread(): delete device entering..." << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::~cmd_thread(): delete device entering..." << endl;
//delete mutex_dp; //delete mutex_dp;
} }
...@@ -62,13 +44,13 @@ void cmd_thread::run(void *) ...@@ -62,13 +44,13 @@ void cmd_thread::run(void *)
switch(cmd.cmd_id) switch(cmd.cmd_id)
{ {
case CMD_THREAD_EXIT: case CMD_THREAD_EXIT:
cout << gettime().tv_sec << " cmd_thread::run(): received command THREAD_EXIT -> exiting..." << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::run(): received command THREAD_EXIT -> exiting..." << endl;
return; return;
case CMD_COMMAND: case CMD_COMMAND:
{ {
try { try {
cout << gettime().tv_sec << " cmd_thread::run(): COMMAND ... action=" << cmd.arg_s3 << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::run(): COMMAND ... action=" << cmd.arg_s3 << endl;
dp = (Tango::DeviceProxy *)cmd.dp_add; dp = (Tango::DeviceProxy *)cmd.dp_add;
if(cmd.arg_b) if(cmd.arg_b)
{ {
...@@ -82,7 +64,7 @@ void cmd_thread::run(void *) ...@@ -82,7 +64,7 @@ void cmd_thread::run(void *)
} }
else else
call_id = dp->command_inout_asynch(cmd.arg_s2); call_id = dp->command_inout_asynch(cmd.arg_s2);
cout << gettime().tv_sec << " cmd_thread::run() executed action: " << cmd.arg_s3 << " !!! call_id=" << call_id << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::run() executed action: " << cmd.arg_s3 << " !!! call_id=" << call_id << endl;
/*cmd_t arg; /*cmd_t arg;
arg.cmd_id = CMD_RESPONSE; arg.cmd_id = CMD_RESPONSE;
arg.call_id = call_id; arg.call_id = call_id;
...@@ -101,11 +83,11 @@ void cmd_thread::run(void *) ...@@ -101,11 +83,11 @@ void cmd_thread::run(void *)
if(err.find("is not yet arrived") == string::npos) //TODO: change this!! if(err.find("is not yet arrived") == string::npos) //TODO: change this!!
{ {
out_stream << "Failed to execute action " << cmd.arg_s3 << ", err=" << e.errors[0].desc << ends; out_stream << "Failed to execute action " << cmd.arg_s3 << ", err=" << e.errors[0].desc << ends;
cout << gettime().tv_sec << " cmd_thread::run() ERROR: " << out_stream.str() << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::run() ERROR: " << out_stream.str() << endl;
} }
else else
{ {
cout << gettime().tv_sec << " cmd_thread::run() exception 'is not yet arrived': pushing request of response, call_id=" << call_id << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::run() exception 'is not yet arrived': pushing request of response, call_id=" << call_id << endl;
cmd.cmd_id = CMD_RESPONSE; //if no exception till now push in list request of response cmd.cmd_id = CMD_RESPONSE; //if no exception till now push in list request of response
cmd.call_id = call_id; //if no exception till now push in list request of response cmd.call_id = call_id; //if no exception till now push in list request of response
list.push_back(cmd); //if no exception till now push in list request of response list.push_back(cmd); //if no exception till now push in list request of response
...@@ -117,12 +99,12 @@ void cmd_thread::run(void *) ...@@ -117,12 +99,12 @@ void cmd_thread::run(void *)
case CMD_RESPONSE: case CMD_RESPONSE:
{ {
//cout << gettime().tv_sec << " cmd_thread::run(): RESPONSE WAKE UP... action=" << cmd.arg_s3 << " call_id=" << cmd.call_id << endl; //TANGO_LOG << gettime().tv_sec << " cmd_thread::run(): RESPONSE WAKE UP... action=" << cmd.arg_s3 << " call_id=" << cmd.call_id << endl;
Tango::DeviceData resp; Tango::DeviceData resp;
dp = (Tango::DeviceProxy *)cmd.dp_add; dp = (Tango::DeviceProxy *)cmd.dp_add;
try { try {
resp = dp->command_inout_reply(cmd.call_id); resp = dp->command_inout_reply(cmd.call_id);
cout << gettime().tv_sec << " cmd_thread::run() RECEIVED response to action " << cmd.arg_s3 << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::run() RECEIVED response to action " << cmd.arg_s3 << endl;
} catch(Tango::DevFailed &e) } catch(Tango::DevFailed &e)
{ {
TangoSys_MemStream out_stream; TangoSys_MemStream out_stream;
...@@ -136,7 +118,7 @@ void cmd_thread::run(void *) ...@@ -136,7 +118,7 @@ void cmd_thread::run(void *)
} }
else else
{ {
cout << gettime().tv_sec << " cmd_thread::run() " << out_stream.str() << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::run() " << out_stream.str() << endl;
Tango::Except::print_exception(e); Tango::Except::print_exception(e);
} }
} }
...@@ -145,19 +127,19 @@ void cmd_thread::run(void *) ...@@ -145,19 +127,19 @@ void cmd_thread::run(void *)
} }
/* if(cmd.arg_s == CMD_THREAD_EXIT) /* if(cmd.arg_s == CMD_THREAD_EXIT)
{ {
cout << gettime().tv_sec << " cmd_thread::run(): received command THREAD_EXIT -> exiting..." << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::run(): received command THREAD_EXIT -> exiting..." << endl;
return; return;
} }
else else
{ {
cout << gettime().tv_sec << " cmd_thread::run(): WAKE UP... action=" << cmd.arg_s << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::run(): WAKE UP... action=" << cmd.arg_s << endl;
Tango::DeviceData resp; Tango::DeviceData resp;
dp = (Tango::DeviceProxy *)cmd.dp_add; dp = (Tango::DeviceProxy *)cmd.dp_add;
try { try {
mutex_dp->lock(); mutex_dp->lock();
resp = dp->command_inout_reply(cmd.cmd_id); resp = dp->command_inout_reply(cmd.cmd_id);
mutex_dp->unlock(); mutex_dp->unlock();
cout << gettime().tv_sec << " cmd_thread::run() received response to action " << cmd.arg_s << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::run() received response to action " << cmd.arg_s << endl;
} catch(Tango::DevFailed &e) } catch(Tango::DevFailed &e)
{ {
TangoSys_MemStream out_stream; TangoSys_MemStream out_stream;
...@@ -170,7 +152,7 @@ void cmd_thread::run(void *) ...@@ -170,7 +152,7 @@ void cmd_thread::run(void *)
omni_thread::sleep(0,300000000); //0.2 s omni_thread::sleep(0,300000000); //0.2 s
} }
else else
cout << gettime().tv_sec << " cmd_thread::run() " << out_stream.str() << endl; TANGO_LOG << gettime().tv_sec << " cmd_thread::run() " << out_stream.str() << endl;
} }
}*/ }*/
...@@ -196,7 +178,7 @@ void cmd_thread::run(void *) ...@@ -196,7 +178,7 @@ void cmd_thread::run(void *)
printf("cmd_thread::run(): catched unknown exception!!"); printf("cmd_thread::run(): catched unknown exception!!");
} }
} }
//cout << "alarm_thread::run(): returning" << endl; //TANGO_LOG << "alarm_thread::run(): returning" << endl;
} /* cmd_thread::run() */ } /* cmd_thread::run() */
/* /*
...@@ -206,7 +188,7 @@ void cmd_list::push_back(cmd_t& cmd) ...@@ -206,7 +188,7 @@ void cmd_list::push_back(cmd_t& cmd)
{ {
this->lock(); this->lock();
//cout << "cmd_list::push_back: cmd_id=" << cmd.cmd_id << " call_id=" << cmd.call_id << endl; //TANGO_LOG << "cmd_list::push_back: cmd_id=" << cmd.cmd_id << " call_id=" << cmd.call_id << endl;
try{ try{
l_cmd.push_back(cmd); l_cmd.push_back(cmd);
empty.signal(); empty.signal();
...@@ -273,7 +255,7 @@ const cmd_t cmd_list::pop_front(void) ...@@ -273,7 +255,7 @@ const cmd_t cmd_list::pop_front(void)
/*const*/ cmd_t cmd; /*const*/ cmd_t cmd;
cmd = *(l_cmd.begin()); cmd = *(l_cmd.begin());
//cout << "cmd_list::pop_front: " << e.name << " value=" << e.value[0] << endl; //TANGO_LOG << "cmd_list::pop_front: " << e.name << " value=" << e.value[0] << endl;
l_cmd.pop_front(); l_cmd.pop_front();
this->unlock(); this->unlock();
......
/* /*
*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.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.