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 1863 additions and 747 deletions
docs/images/free_properties.png

68.8 KiB

This diff is collapsed.
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
#ifndef AlarmHandler_H #ifndef AlarmHandler_H
#define AlarmHandler_H #define AlarmHandler_H
#include <tango.h> #include <tango/tango.h>
#include <boost/version.hpp> #include <boost/version.hpp>
#if BOOST_VERSION >= 103600 #if BOOST_VERSION >= 103600
...@@ -61,7 +61,15 @@ class update_thread; ...@@ -61,7 +61,15 @@ class update_thread;
# define ELAPSED(before, after) \ # define ELAPSED(before, after) \
1000.0*(after.tv_sec-before.tv_sec) + \ 1000.0*(after.tv_sec-before.tv_sec) + \
((double)after.tv_usec-before.tv_usec) / 1000 ((double)after.tv_usec-before.tv_usec) / 1000
#ifndef TANGO_LOG
#define TANGO_LOG cout
#endif
#ifndef TANGO_LOG_INFO
#define TANGO_LOG_INFO cout2
#endif
#ifndef TANGO_LOG_DEBUG
#define TANGO_LOG_DEBUG cout4
#endif
/*----- PROTECTED REGION END -----*/ // AlarmHandler.h /*----- PROTECTED REGION END -----*/ // AlarmHandler.h
...@@ -100,10 +108,6 @@ class AlarmHandler : public TANGO_BASE_CLASS ...@@ -100,10 +108,6 @@ class AlarmHandler : public TANGO_BASE_CLASS
public: public:
bool compare_without_domain(string str1, string str2); bool compare_without_domain(string str1, string str2);
string remove_domain(string str); string remove_domain(string str);
//TODO: real attributes
Tango::DevLong attr_AttributeStartedNumber_read;
Tango::DevLong attr_AttributePausedNumber_read;
Tango::DevLong attr_AttributeStoppedNumber_read;
Tango::DevLong attr_AttributeNumber_read; Tango::DevLong attr_AttributeNumber_read;
string normalAlarms_read[MAX_ALARMS]; string normalAlarms_read[MAX_ALARMS];
...@@ -117,6 +121,7 @@ public: ...@@ -117,6 +121,7 @@ public:
string alarmSummary_read[MAX_ALARMS]; string alarmSummary_read[MAX_ALARMS];
string eventList_read[MAX_ATTR_SUMMARY]; string eventList_read[MAX_ATTR_SUMMARY];
string eventSummary_read[MAX_ATTR_SUMMARY]; string eventSummary_read[MAX_ATTR_SUMMARY];
string alarmDisabled_read[MAX_ALARMS];
/* char c_normalAlarms_read[MAX_ALARMS][MAX_ATTR_NAME]; /* char c_normalAlarms_read[MAX_ALARMS][MAX_ATTR_NAME];
char c_unacknowledgedAlarms_read[MAX_ALARMS][MAX_ATTR_NAME]; char c_unacknowledgedAlarms_read[MAX_ALARMS][MAX_ATTR_NAME];
...@@ -140,6 +145,7 @@ public: ...@@ -140,6 +145,7 @@ public:
size_t alarmSummary_sz; size_t alarmSummary_sz;
size_t eventList_sz; size_t eventList_sz;
size_t eventSummary_sz; size_t eventSummary_sz;
size_t alarmDisabled_sz;
double last_statistics_reset_time; double last_statistics_reset_time;
...@@ -157,6 +163,8 @@ public: ...@@ -157,6 +163,8 @@ public:
vector<Tango::DevLong> statisticsTimeWindow; vector<Tango::DevLong> statisticsTimeWindow;
// ErrorDelay: Delay in seconds before changing to ERROR state after an exception is received. // ErrorDelay: Delay in seconds before changing to ERROR state after an exception is received.
Tango::DevULong errorDelay; Tango::DevULong errorDelay;
// SetAlarmQuality: Set alarm attribute quality as computed using quality of attributes in the formula
Tango::DevBoolean setAlarmQuality;
// Attribute data members // Attribute data members
public: public:
...@@ -175,6 +183,7 @@ public: ...@@ -175,6 +183,7 @@ public:
Tango::DevString *attr_alarmSummary_read; Tango::DevString *attr_alarmSummary_read;
Tango::DevString *attr_eventList_read; Tango::DevString *attr_eventList_read;
Tango::DevString *attr_eventSummary_read; Tango::DevString *attr_eventSummary_read;
Tango::DevString *attr_alarmDisabled_read;
// Constructors and destructors // Constructors and destructors
public: public:
...@@ -371,6 +380,15 @@ public: ...@@ -371,6 +380,15 @@ public:
*/ */
virtual void read_eventSummary(Tango::Attribute &attr); virtual void read_eventSummary(Tango::Attribute &attr);
virtual bool is_eventSummary_allowed(Tango::AttReqType type); virtual bool is_eventSummary_allowed(Tango::AttReqType type);
/**
* Attribute alarmDisabled related methods
* Description: List of alarms in out of service or shelved state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_alarmDisabled(Tango::Attribute &attr);
virtual bool is_alarmDisabled_allowed(Tango::AttReqType type);
// Dynamic attribute methods // Dynamic attribute methods
public: public:
...@@ -575,13 +593,13 @@ private: ...@@ -575,13 +593,13 @@ private:
void init_alarms(map< string,vector<string> > &alarm_events); void init_alarms(map< string,vector<string> > &alarm_events);
#endif #endif
void add_alarm(alarm_t& a, bool starting=false); void add_alarm(alarm_t& a, bool starting=false);
void add_event(alarm_t& a, vector<string> &evn) throw(string&); void add_event(alarm_t& a, vector<string> &evn);
#if 0 #if 0
void subscribe_event(alarm_t& a, EventCallBack& ecb, vector<string> &evn) throw(string&); void subscribe_event(alarm_t& a, EventCallBack& ecb, vector<string> &evn);
#endif #endif
// void do_alarm(bei_t& e); //gcc 4 problem?? // void do_alarm(bei_t& e); //gcc 4 problem??
bool remove_alarm(string& s) throw(string&); bool remove_alarm(string& s);
//void add_to_database(alarm_t& a) throw(string&); //void add_to_database(alarm_t& a);
void set_internal_alarm(string name, Tango::TimeVal t, string msg, unsigned int count=1); void set_internal_alarm(string name, Tango::TimeVal t, string msg, unsigned int count=1);
void load_alarm(string alarm_string, alarm_t &alm, vector<string> &evn); void load_alarm(string alarm_string, alarm_t &alm, vector<string> &evn);
...@@ -589,7 +607,8 @@ private: ...@@ -589,7 +607,8 @@ private:
formula_res_t eval_formula(tree_parse_info_t tree, string &attr_values); formula_res_t eval_formula(tree_parse_info_t tree, string &attr_values);
void find_event_formula(tree_parse_info_t tree, vector<string> &); void find_event_formula(tree_parse_info_t tree, vector<string> &);
formula_res_t eval_expression(iter_t const& i, string &attr_values, int ev_ind=0); //recursive tree node evaluation formula_res_t eval_expression(iter_t const& i, string &attr_values, vector< vector<double> > ev_ind={}); //recursive tree node evaluation
void eval_index_range(iter_t const& i, string &attr_values, vector<double> & ind);
void eval_node_event(iter_t const& i, vector<string> & ev); //recursive tree node evaluation void eval_node_event(iter_t const& i, vector<string> & ev); //recursive tree node evaluation
void prepare_alarm_attr(); //for read attribute alarm and push_change_event void prepare_alarm_attr(); //for read attribute alarm and push_change_event
......
...@@ -24,6 +24,11 @@ ...@@ -24,6 +24,11 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>30</DefaultPropValue> <DefaultPropValue>30</DefaultPropValue>
</classProperties> </classProperties>
<classProperties name="SetAlarmQuality" description="Set alarm attribute quality as computed using quality of attributes in the formula">
<type xsi:type="pogoDsl:BooleanType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>false</DefaultPropValue>
</classProperties>
<deviceProperties name="GroupNames" description="Labels for Group mask, first is for mask 0x00"> <deviceProperties name="GroupNames" description="Labels for Group mask, first is for mask 0x00">
<type xsi:type="pogoDsl:StringVectorType"/> <type xsi:type="pogoDsl:StringVectorType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
...@@ -43,6 +48,11 @@ ...@@ -43,6 +48,11 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>30</DefaultPropValue> <DefaultPropValue>30</DefaultPropValue>
</deviceProperties> </deviceProperties>
<deviceProperties name="SetAlarmQuality" description="Set alarm attribute quality as computed using quality of attributes in the formula">
<type xsi:type="pogoDsl:BooleanType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>false</DefaultPropValue>
</deviceProperties>
<commands name="State" description="This command gets the device state (stored in its &lt;i>device_state&lt;/i> data member) and returns it to the caller." execMethod="dev_state" displayLevel="OPERATOR" polledPeriod="0"> <commands name="State" description="This command gets the device state (stored in its &lt;i>device_state&lt;/i> data member) and returns it to the caller." execMethod="dev_state" displayLevel="OPERATOR" polledPeriod="0">
<argin description="none."> <argin description="none.">
<type xsi:type="pogoDsl:VoidType"/> <type xsi:type="pogoDsl:VoidType"/>
...@@ -189,8 +199,8 @@ ...@@ -189,8 +199,8 @@
</commands> </commands>
<attributes name="alarmAudible" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false"> <attributes name="alarmAudible" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/> <dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="true" libCheckCriteria="false"/> <changeEvent fire="true" libCheckCriteria="true"/>
<archiveEvent fire="true" libCheckCriteria="false"/> <archiveEvent fire="true" libCheckCriteria="true"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/> <dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="True if there is at least one alarm that needs audible indication on the GUI" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/> <properties description="True if there is at least one alarm that needs audible indication on the GUI" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
...@@ -306,6 +316,14 @@ ...@@ -306,6 +316,14 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/> <properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes> </attributes>
<attributes name="alarmDisabled" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:StringType"/>
<changeEvent fire="true" libCheckCriteria="true"/>
<archiveEvent fire="true" libCheckCriteria="true"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="List of alarms in out of service or shelved state" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<dynamicAttributes name="AlarmState" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="true"> <dynamicAttributes name="AlarmState" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="true">
<dataType xsi:type="pogoDsl:EnumType"/> <dataType xsi:type="pogoDsl:EnumType"/>
<changeEvent fire="true" libCheckCriteria="true"/> <changeEvent fire="true" libCheckCriteria="true"/>
...@@ -324,8 +342,8 @@ ...@@ -324,8 +342,8 @@
</dynamicAttributes> </dynamicAttributes>
<dynamicAttributes name="AlarmFormula" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="true"> <dynamicAttributes name="AlarmFormula" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="true">
<dataType xsi:type="pogoDsl:StringType"/> <dataType xsi:type="pogoDsl:StringType"/>
<changeEvent fire="true" libCheckCriteria="false"/> <changeEvent fire="true" libCheckCriteria="true"/>
<archiveEvent fire="true" libCheckCriteria="false"/> <archiveEvent fire="true" libCheckCriteria="true"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/> <dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/> <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/> <properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
......
/*----- PROTECTED REGION ID(AlarmHandlerClass.cpp) ENABLED START -----*/ /*----- PROTECTED REGION ID(AlarmHandlerClass.cpp) ENABLED START -----*/
static const char *RcsId = "$Id: $";
static const char *TagName = "$Name: $";
static const char *CvsPath = "$Source: $";
static const char *SvnPath = "$HeadURL: $";
static const char *HttpServer = "http://www.esrf.eu/computing/cs/tango/tango_doc/ds_doc/";
//============================================================================= //=============================================================================
// //
// file : AlarmHandlerClass.cpp // file : AlarmHandlerClass.cpp
...@@ -78,7 +73,7 @@ AlarmHandlerClass *AlarmHandlerClass::_instance = NULL; ...@@ -78,7 +73,7 @@ AlarmHandlerClass *AlarmHandlerClass::_instance = NULL;
//-------------------------------------------------------- //--------------------------------------------------------
AlarmHandlerClass::AlarmHandlerClass(string &s):Tango::DeviceClass(s) AlarmHandlerClass::AlarmHandlerClass(string &s):Tango::DeviceClass(s)
{ {
cout2 << "Entering AlarmHandlerClass constructor" << endl; TANGO_LOG_INFO << "Entering AlarmHandlerClass constructor" << endl;
set_default_property(); set_default_property();
get_class_property(); get_class_property();
write_class_property(); write_class_property();
...@@ -87,7 +82,7 @@ AlarmHandlerClass::AlarmHandlerClass(string &s):Tango::DeviceClass(s) ...@@ -87,7 +82,7 @@ AlarmHandlerClass::AlarmHandlerClass(string &s):Tango::DeviceClass(s)
/*----- PROTECTED REGION END -----*/ // AlarmHandlerClass::constructor /*----- PROTECTED REGION END -----*/ // AlarmHandlerClass::constructor
cout2 << "Leaving AlarmHandlerClass constructor" << endl; TANGO_LOG_INFO << "Leaving AlarmHandlerClass constructor" << endl;
} }
//-------------------------------------------------------- //--------------------------------------------------------
...@@ -167,7 +162,7 @@ AlarmHandlerClass *AlarmHandlerClass::instance() ...@@ -167,7 +162,7 @@ AlarmHandlerClass *AlarmHandlerClass::instance()
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *AckClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) CORBA::Any *AckClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{ {
cout2 << "AckClass::execute(): arrived" << endl; TANGO_LOG_INFO << "AckClass::execute(): arrived" << endl;
const Tango::DevVarStringArray *argin; const Tango::DevVarStringArray *argin;
extract(in_any, argin); extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->ack(argin)); ((static_cast<AlarmHandler *>(device))->ack(argin));
...@@ -187,7 +182,7 @@ CORBA::Any *AckClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_an ...@@ -187,7 +182,7 @@ CORBA::Any *AckClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_an
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *LoadClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) CORBA::Any *LoadClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{ {
cout2 << "LoadClass::execute(): arrived" << endl; TANGO_LOG_INFO << "LoadClass::execute(): arrived" << endl;
Tango::DevString argin; Tango::DevString argin;
extract(in_any, argin); extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->load(argin)); ((static_cast<AlarmHandler *>(device))->load(argin));
...@@ -207,7 +202,7 @@ CORBA::Any *LoadClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_a ...@@ -207,7 +202,7 @@ CORBA::Any *LoadClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_a
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *RemoveClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) CORBA::Any *RemoveClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{ {
cout2 << "RemoveClass::execute(): arrived" << endl; TANGO_LOG_INFO << "RemoveClass::execute(): arrived" << endl;
Tango::DevString argin; Tango::DevString argin;
extract(in_any, argin); extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->remove(argin)); ((static_cast<AlarmHandler *>(device))->remove(argin));
...@@ -227,7 +222,7 @@ CORBA::Any *RemoveClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in ...@@ -227,7 +222,7 @@ CORBA::Any *RemoveClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *SearchAlarmClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) CORBA::Any *SearchAlarmClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{ {
cout2 << "SearchAlarmClass::execute(): arrived" << endl; TANGO_LOG_INFO << "SearchAlarmClass::execute(): arrived" << endl;
Tango::DevString argin; Tango::DevString argin;
extract(in_any, argin); extract(in_any, argin);
return insert((static_cast<AlarmHandler *>(device))->search_alarm(argin)); return insert((static_cast<AlarmHandler *>(device))->search_alarm(argin));
...@@ -246,7 +241,7 @@ CORBA::Any *SearchAlarmClass::execute(Tango::DeviceImpl *device, const CORBA::An ...@@ -246,7 +241,7 @@ CORBA::Any *SearchAlarmClass::execute(Tango::DeviceImpl *device, const CORBA::An
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *StopAudibleClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any)) CORBA::Any *StopAudibleClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{ {
cout2 << "StopAudibleClass::execute(): arrived" << endl; TANGO_LOG_INFO << "StopAudibleClass::execute(): arrived" << endl;
((static_cast<AlarmHandler *>(device))->stop_audible()); ((static_cast<AlarmHandler *>(device))->stop_audible());
return new CORBA::Any(); return new CORBA::Any();
} }
...@@ -264,7 +259,7 @@ CORBA::Any *StopAudibleClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(co ...@@ -264,7 +259,7 @@ CORBA::Any *StopAudibleClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(co
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *SilenceClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) CORBA::Any *SilenceClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{ {
cout2 << "SilenceClass::execute(): arrived" << endl; TANGO_LOG_INFO << "SilenceClass::execute(): arrived" << endl;
const Tango::DevVarStringArray *argin; const Tango::DevVarStringArray *argin;
extract(in_any, argin); extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->silence(argin)); ((static_cast<AlarmHandler *>(device))->silence(argin));
...@@ -284,7 +279,7 @@ CORBA::Any *SilenceClass::execute(Tango::DeviceImpl *device, const CORBA::Any &i ...@@ -284,7 +279,7 @@ CORBA::Any *SilenceClass::execute(Tango::DeviceImpl *device, const CORBA::Any &i
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *ModifyClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) CORBA::Any *ModifyClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{ {
cout2 << "ModifyClass::execute(): arrived" << endl; TANGO_LOG_INFO << "ModifyClass::execute(): arrived" << endl;
Tango::DevString argin; Tango::DevString argin;
extract(in_any, argin); extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->modify(argin)); ((static_cast<AlarmHandler *>(device))->modify(argin));
...@@ -304,7 +299,7 @@ CORBA::Any *ModifyClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in ...@@ -304,7 +299,7 @@ CORBA::Any *ModifyClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *ShelveClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) CORBA::Any *ShelveClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{ {
cout2 << "ShelveClass::execute(): arrived" << endl; TANGO_LOG_INFO << "ShelveClass::execute(): arrived" << endl;
const Tango::DevVarStringArray *argin; const Tango::DevVarStringArray *argin;
extract(in_any, argin); extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->shelve(argin)); ((static_cast<AlarmHandler *>(device))->shelve(argin));
...@@ -324,7 +319,7 @@ CORBA::Any *ShelveClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in ...@@ -324,7 +319,7 @@ CORBA::Any *ShelveClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *EnableClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) CORBA::Any *EnableClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{ {
cout2 << "EnableClass::execute(): arrived" << endl; TANGO_LOG_INFO << "EnableClass::execute(): arrived" << endl;
Tango::DevString argin; Tango::DevString argin;
extract(in_any, argin); extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->enable(argin)); ((static_cast<AlarmHandler *>(device))->enable(argin));
...@@ -344,7 +339,7 @@ CORBA::Any *EnableClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in ...@@ -344,7 +339,7 @@ CORBA::Any *EnableClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *DisableClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) CORBA::Any *DisableClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{ {
cout2 << "DisableClass::execute(): arrived" << endl; TANGO_LOG_INFO << "DisableClass::execute(): arrived" << endl;
Tango::DevString argin; Tango::DevString argin;
extract(in_any, argin); extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->disable(argin)); ((static_cast<AlarmHandler *>(device))->disable(argin));
...@@ -364,7 +359,7 @@ CORBA::Any *DisableClass::execute(Tango::DeviceImpl *device, const CORBA::Any &i ...@@ -364,7 +359,7 @@ CORBA::Any *DisableClass::execute(Tango::DeviceImpl *device, const CORBA::Any &i
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *ResetStatisticsClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any)) CORBA::Any *ResetStatisticsClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{ {
cout2 << "ResetStatisticsClass::execute(): arrived" << endl; TANGO_LOG_INFO << "ResetStatisticsClass::execute(): arrived" << endl;
((static_cast<AlarmHandler *>(device))->reset_statistics()); ((static_cast<AlarmHandler *>(device))->reset_statistics());
return new CORBA::Any(); return new CORBA::Any();
} }
...@@ -382,7 +377,7 @@ CORBA::Any *ResetStatisticsClass::execute(Tango::DeviceImpl *device, TANGO_UNUSE ...@@ -382,7 +377,7 @@ CORBA::Any *ResetStatisticsClass::execute(Tango::DeviceImpl *device, TANGO_UNUSE
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *StopNewClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any)) CORBA::Any *StopNewClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{ {
cout2 << "StopNewClass::execute(): arrived" << endl; TANGO_LOG_INFO << "StopNewClass::execute(): arrived" << endl;
((static_cast<AlarmHandler *>(device))->stop_new()); ((static_cast<AlarmHandler *>(device))->stop_new());
return new CORBA::Any(); return new CORBA::Any();
} }
...@@ -400,7 +395,7 @@ CORBA::Any *StopNewClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const ...@@ -400,7 +395,7 @@ CORBA::Any *StopNewClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *GetAlarmInfoClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) CORBA::Any *GetAlarmInfoClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{ {
cout2 << "GetAlarmInfoClass::execute(): arrived" << endl; TANGO_LOG_INFO << "GetAlarmInfoClass::execute(): arrived" << endl;
const Tango::DevVarStringArray *argin; const Tango::DevVarStringArray *argin;
extract(in_any, argin); extract(in_any, argin);
return insert((static_cast<AlarmHandler *>(device))->get_alarm_info(argin)); return insert((static_cast<AlarmHandler *>(device))->get_alarm_info(argin));
...@@ -419,7 +414,7 @@ CORBA::Any *GetAlarmInfoClass::execute(Tango::DeviceImpl *device, const CORBA::A ...@@ -419,7 +414,7 @@ CORBA::Any *GetAlarmInfoClass::execute(Tango::DeviceImpl *device, const CORBA::A
//-------------------------------------------------------- //--------------------------------------------------------
CORBA::Any *ReLoadAllClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any)) CORBA::Any *ReLoadAllClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{ {
cout2 << "ReLoadAllClass::execute(): arrived" << endl; TANGO_LOG_INFO << "ReLoadAllClass::execute(): arrived" << endl;
((static_cast<AlarmHandler *>(device))->re_load_all()); ((static_cast<AlarmHandler *>(device))->re_load_all());
return new CORBA::Any(); return new CORBA::Any();
} }
...@@ -491,6 +486,7 @@ void AlarmHandlerClass::get_class_property() ...@@ -491,6 +486,7 @@ void AlarmHandlerClass::get_class_property()
cl_prop.push_back(Tango::DbDatum("SubscribeRetryPeriod")); cl_prop.push_back(Tango::DbDatum("SubscribeRetryPeriod"));
cl_prop.push_back(Tango::DbDatum("StatisticsTimeWindow")); cl_prop.push_back(Tango::DbDatum("StatisticsTimeWindow"));
cl_prop.push_back(Tango::DbDatum("ErrorDelay")); cl_prop.push_back(Tango::DbDatum("ErrorDelay"));
cl_prop.push_back(Tango::DbDatum("SetAlarmQuality"));
// Call database and extract values // Call database and extract values
if (Tango::Util::instance()->_UseDb==true) if (Tango::Util::instance()->_UseDb==true)
...@@ -546,6 +542,18 @@ void AlarmHandlerClass::get_class_property() ...@@ -546,6 +542,18 @@ void AlarmHandlerClass::get_class_property()
cl_prop[i] << errorDelay; cl_prop[i] << errorDelay;
} }
} }
// Try to extract SetAlarmQuality value
if (cl_prop[++i].is_empty()==false) cl_prop[i] >> setAlarmQuality;
else
{
// Check default value for SetAlarmQuality
def_prop = get_default_class_property(cl_prop[i].name);
if (def_prop.is_empty()==false)
{
def_prop >> setAlarmQuality;
cl_prop[i] << setAlarmQuality;
}
}
/*----- PROTECTED REGION ID(AlarmHandlerClass::get_class_property_after) ENABLED START -----*/ /*----- PROTECTED REGION ID(AlarmHandlerClass::get_class_property_after) ENABLED START -----*/
// Check class property data members init // Check class property data members init
...@@ -624,6 +632,20 @@ void AlarmHandlerClass::set_default_property() ...@@ -624,6 +632,20 @@ void AlarmHandlerClass::set_default_property()
cl_def_prop.push_back(data); cl_def_prop.push_back(data);
add_wiz_class_prop(prop_name, prop_desc, prop_def); add_wiz_class_prop(prop_name, prop_desc, prop_def);
} }
else
add_wiz_class_prop(prop_name, prop_desc);
prop_name = "SetAlarmQuality";
prop_desc = "Set alarm attribute quality as computed using quality of attributes in the formula";
prop_def = "false";
vect_data.clear();
vect_data.push_back("false");
if (prop_def.length()>0)
{
Tango::DbDatum data(prop_name);
data << vect_data ;
cl_def_prop.push_back(data);
add_wiz_class_prop(prop_name, prop_desc, prop_def);
}
else else
add_wiz_class_prop(prop_name, prop_desc); add_wiz_class_prop(prop_name, prop_desc);
...@@ -683,6 +705,20 @@ void AlarmHandlerClass::set_default_property() ...@@ -683,6 +705,20 @@ void AlarmHandlerClass::set_default_property()
} }
else else
add_wiz_dev_prop(prop_name, prop_desc); add_wiz_dev_prop(prop_name, prop_desc);
prop_name = "SetAlarmQuality";
prop_desc = "Set alarm attribute quality as computed using quality of attributes in the formula";
prop_def = "false";
vect_data.clear();
vect_data.push_back("false");
if (prop_def.length()>0)
{
Tango::DbDatum data(prop_name);
data << vect_data ;
dev_def_prop.push_back(data);
add_wiz_dev_prop(prop_name, prop_desc, prop_def);
}
else
add_wiz_dev_prop(prop_name, prop_desc);
} }
//-------------------------------------------------------- //--------------------------------------------------------
...@@ -748,7 +784,7 @@ void AlarmHandlerClass::device_factory(const Tango::DevVarStringArray *devlist_p ...@@ -748,7 +784,7 @@ void AlarmHandlerClass::device_factory(const Tango::DevVarStringArray *devlist_p
// Create devices and add it into the device list // Create devices and add it into the device list
for (unsigned long i=0 ; i<devlist_ptr->length() ; i++) for (unsigned long i=0 ; i<devlist_ptr->length() ; i++)
{ {
cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; TANGO_LOG_DEBUG << "Device name : " << (*devlist_ptr)[i].in() << endl;
device_list.push_back(new AlarmHandler(this, (*devlist_ptr)[i])); device_list.push_back(new AlarmHandler(this, (*devlist_ptr)[i]));
} }
...@@ -811,8 +847,8 @@ void AlarmHandlerClass::attribute_factory(vector<Tango::Attr *> &att_list) ...@@ -811,8 +847,8 @@ void AlarmHandlerClass::attribute_factory(vector<Tango::Attr *> &att_list)
// Not Polled // Not Polled
alarmaudible->set_disp_level(Tango::OPERATOR); alarmaudible->set_disp_level(Tango::OPERATOR);
// Not Memorized // Not Memorized
alarmaudible->set_change_event(true, false); alarmaudible->set_change_event(true, true);
alarmaudible->set_archive_event(true, false); alarmaudible->set_archive_event(true, true);
att_list.push_back(alarmaudible); att_list.push_back(alarmaudible);
// Attribute : StatisticsResetTime // Attribute : StatisticsResetTime
...@@ -1145,8 +1181,6 @@ void AlarmHandlerClass::attribute_factory(vector<Tango::Attr *> &att_list) ...@@ -1145,8 +1181,6 @@ void AlarmHandlerClass::attribute_factory(vector<Tango::Attr *> &att_list)
// Not Polled // Not Polled
eventlist->set_disp_level(Tango::OPERATOR); eventlist->set_disp_level(Tango::OPERATOR);
// Not Memorized // Not Memorized
//eventlist->set_change_event(true, true);
//eventlist->set_archive_event(true, true);
att_list.push_back(eventlist); att_list.push_back(eventlist);
// Attribute : eventSummary // Attribute : eventSummary
...@@ -1171,10 +1205,34 @@ void AlarmHandlerClass::attribute_factory(vector<Tango::Attr *> &att_list) ...@@ -1171,10 +1205,34 @@ void AlarmHandlerClass::attribute_factory(vector<Tango::Attr *> &att_list)
// Not Polled // Not Polled
eventsummary->set_disp_level(Tango::OPERATOR); eventsummary->set_disp_level(Tango::OPERATOR);
// Not Memorized // Not Memorized
//eventsummary->set_change_event(true, true);
//eventsummary->set_archive_event(true, true);
att_list.push_back(eventsummary); att_list.push_back(eventsummary);
// Attribute : alarmDisabled
alarmDisabledAttrib *alarmdisabled = new alarmDisabledAttrib();
Tango::UserDefaultAttrProp alarmdisabled_prop;
alarmdisabled_prop.set_description("List of alarms in out of service or shelved state");
// label not set for alarmDisabled
// unit not set for alarmDisabled
// standard_unit not set for alarmDisabled
// display_unit not set for alarmDisabled
// format not set for alarmDisabled
// max_value not set for alarmDisabled
// min_value not set for alarmDisabled
// max_alarm not set for alarmDisabled
// min_alarm not set for alarmDisabled
// max_warning not set for alarmDisabled
// min_warning not set for alarmDisabled
// delta_t not set for alarmDisabled
// delta_val not set for alarmDisabled
alarmdisabled->set_default_properties(alarmdisabled_prop);
// Not Polled
alarmdisabled->set_disp_level(Tango::OPERATOR);
// Not Memorized
alarmdisabled->set_change_event(true, true);
alarmdisabled->set_archive_event(true, true);
att_list.push_back(alarmdisabled);
// Create a list of static attributes // Create a list of static attributes
create_static_attribute_list(get_class_attr()->get_attr_list()); create_static_attribute_list(get_class_attr()->get_attr_list());
...@@ -1374,7 +1432,7 @@ void AlarmHandlerClass::create_static_attribute_list(vector<Tango::Attr *> &att_ ...@@ -1374,7 +1432,7 @@ void AlarmHandlerClass::create_static_attribute_list(vector<Tango::Attr *> &att_
defaultAttList.push_back(att_name); defaultAttList.push_back(att_name);
} }
cout2 << defaultAttList.size() << " attributes in default list" << endl; TANGO_LOG_INFO << defaultAttList.size() << " attributes in default list" << endl;
/*----- PROTECTED REGION ID(AlarmHandlerClass::create_static_att_list) ENABLED START -----*/ /*----- PROTECTED REGION ID(AlarmHandlerClass::create_static_att_list) ENABLED START -----*/
...@@ -1410,7 +1468,7 @@ void AlarmHandlerClass::erase_dynamic_attributes(const Tango::DevVarStringArray ...@@ -1410,7 +1468,7 @@ void AlarmHandlerClass::erase_dynamic_attributes(const Tango::DevVarStringArray
vector<string>::iterator ite_str = find(defaultAttList.begin(), defaultAttList.end(), att_name); vector<string>::iterator ite_str = find(defaultAttList.begin(), defaultAttList.end(), att_name);
if (ite_str == defaultAttList.end()) if (ite_str == defaultAttList.end())
{ {
cout2 << att_name << " is a UNWANTED dynamic attribute for device " << (*devlist_ptr)[i] << endl; TANGO_LOG_INFO << att_name << " is a UNWANTED dynamic attribute for device " << (*devlist_ptr)[i] << endl;
Tango::Attribute &att = dev->get_device_attr()->get_attr_by_name(att_name.c_str()); Tango::Attribute &att = dev->get_device_attr()->get_attr_by_name(att_name.c_str());
dev->remove_attribute(att_list[att.get_attr_idx()], true, false); dev->remove_attribute(att_list[att.get_attr_idx()], true, false);
--ite_att; --ite_att;
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
#ifndef AlarmHandlerClass_H #ifndef AlarmHandlerClass_H
#define AlarmHandlerClass_H #define AlarmHandlerClass_H
#include <tango.h> #include <tango/tango.h>
#include <AlarmHandler.h> #include <AlarmHandler.h>
...@@ -249,6 +249,19 @@ public: ...@@ -249,6 +249,19 @@ public:
{return (static_cast<AlarmHandler *>(dev))->is_eventSummary_allowed(ty);} {return (static_cast<AlarmHandler *>(dev))->is_eventSummary_allowed(ty);}
}; };
// Attribute alarmDisabled class definition
class alarmDisabledAttrib: public Tango::SpectrumAttr
{
public:
alarmDisabledAttrib():SpectrumAttr("alarmDisabled",
Tango::DEV_STRING, Tango::READ, 10000) {};
~alarmDisabledAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_alarmDisabled(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_alarmDisabled_allowed(ty);}
};
//========================================= //=========================================
// Define classes for dynamic attributes // Define classes for dynamic attributes
...@@ -633,6 +646,8 @@ class AlarmHandlerClass : public Tango::DeviceClass ...@@ -633,6 +646,8 @@ class AlarmHandlerClass : public Tango::DeviceClass
vector<Tango::DevLong> statisticsTimeWindow; vector<Tango::DevLong> statisticsTimeWindow;
// ErrorDelay: Delay in seconds before changing to ERROR state after an exception is received. // ErrorDelay: Delay in seconds before changing to ERROR state after an exception is received.
Tango::DevULong errorDelay; Tango::DevULong errorDelay;
// SetAlarmQuality: Set alarm attribute quality as computed using quality of attributes in the formula
Tango::DevBoolean setAlarmQuality;
public: public:
// write class properties data members // write class properties data members
Tango::DbData cl_prop; Tango::DbData cl_prop;
......
...@@ -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; 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; 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());
......
This diff is collapsed.
/* /*
* 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.