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 4856 additions and 1909 deletions
docs/images/alarm_ng.png

206 KiB

docs/images/alarm_ng_history.png

78.6 KiB

docs/images/alarm_notify_properties.png

11.7 KiB

docs/images/free_properties.png

68.8 KiB

source diff could not be displayed: it is too large. Options to address this: view the blob.
......@@ -33,8 +33,7 @@
#ifndef AlarmHandler_H
#define AlarmHandler_H
#include <tango.h>
#include <mysql.h>
#include <tango/tango.h>
#include <boost/version.hpp>
#if BOOST_VERSION >= 103600
......@@ -45,7 +44,9 @@
#include "event_table.h"
#include "SubscribeThread.h"
#define MAX_ALARMS 10000
#define MAX_ALARMS 2000
#define MAX_ATTR_NAME 1000
#define MAX_ATTR_SUMMARY 10000
//#define _USE_ELETTRA_DB_RW
......@@ -60,7 +61,15 @@ class update_thread;
# define ELAPSED(before, after) \
1000.0*(after.tv_sec-before.tv_sec) + \
((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
......@@ -80,6 +89,7 @@ enum _AlarmStateEnum {
_SHLVD,
_DSUPR,
_OOSRV,
_ERROR,
} ;
typedef _AlarmStateEnum AlarmStateEnum;
......@@ -98,20 +108,31 @@ class AlarmHandler : public TANGO_BASE_CLASS
public:
bool compare_without_domain(string str1, string str2);
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;
vector<string> normalAlarms_read;
vector<string> unacknowledgedAlarms_read;
vector<string> acknowledgedAlarms_read;
vector<string> unacknowledgedNormalAlarms_read;
vector<string> shelvedAlarms_read;
vector<string> outOfServiceAlarms_read;
vector<string> silencedAlarms_read;
vector<string> listAlarms_read;
string normalAlarms_read[MAX_ALARMS];
string unacknowledgedAlarms_read[MAX_ALARMS];
string acknowledgedAlarms_read[MAX_ALARMS];
string unacknowledgedNormalAlarms_read[MAX_ALARMS];
string shelvedAlarms_read[MAX_ALARMS];
string outOfServiceAlarms_read[MAX_ALARMS];
string silencedAlarms_read[MAX_ALARMS];
string listAlarms_read[MAX_ALARMS];
string alarmSummary_read[MAX_ALARMS];
string eventList_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_unacknowledgedAlarms_read[MAX_ALARMS][MAX_ATTR_NAME];
char c_acknowledgedAlarms_read[MAX_ALARMS][MAX_ATTR_NAME];
char c_unacknowledgedNormalAlarms_read[MAX_ALARMS][MAX_ATTR_NAME];
char c_shelvedAlarms_read[MAX_ALARMS][MAX_ATTR_NAME];
char c_outOfServiceAlarms_read[MAX_ALARMS][MAX_ATTR_NAME];
char c_silencedAlarms_read[MAX_ALARMS][MAX_ATTR_NAME];
char c_listAlarms_read[MAX_ALARMS][MAX_ATTR_NAME];
#define MAX_SUMMARY 2*MAX_ATTR_NAME //TODO: max summary length!!!
char c_alarmSummary_read[MAX_ALARMS][MAX_SUMMARY];*/
size_t normalAlarms_sz;
size_t unacknowledgedAlarms_sz;
......@@ -121,9 +142,15 @@ public:
size_t outOfServiceAlarms_sz;
size_t silencedAlarms_sz;
size_t listAlarms_sz;
size_t alarmSummary_sz;
size_t eventList_sz;
size_t eventSummary_sz;
size_t alarmDisabled_sz;
double last_statistics_reset_time;
omni_mutex *prepare_alm_mtx;
/*----- PROTECTED REGION END -----*/ // AlarmHandler::Data Members
// Device property data members
......@@ -134,21 +161,29 @@ public:
Tango::DevLong subscribeRetryPeriod;
// StatisticsTimeWindow: Time window to compute statistics in seconds
vector<Tango::DevLong> statisticsTimeWindow;
// ErrorDelay: Delay in seconds before changing to ERROR state after an exception is received.
Tango::DevULong errorDelay;
// SetAlarmQuality: Set alarm attribute quality as computed using quality of attributes in the formula
Tango::DevBoolean setAlarmQuality;
// Attribute data members
public:
Tango::DevBoolean *attr_audibleAlarm_read;
Tango::DevBoolean *attr_alarmAudible_read;
Tango::DevDouble *attr_StatisticsResetTime_read;
Tango::DevString *attr_alarm_read;
Tango::DevString *attr_normalAlarms_read;
Tango::DevString *attr_unacknowledgedAlarms_read;
Tango::DevString *attr_acknowledgedAlarms_read;
Tango::DevString *attr_unacknowledgedNormalAlarms_read;
Tango::DevString *attr_shelvedAlarms_read;
Tango::DevString *attr_outOfServiceAlarms_read;
Tango::DevString *attr_silencedAlarms_read;
Tango::DevString *attr_listAlarms_read;
Tango::DevDouble *attr_frequencyAlarms_read;
Tango::DevString *attr_alarmNormal_read;
Tango::DevString *attr_alarmUnacknowledged_read;
Tango::DevString *attr_alarmAcknowledged_read;
Tango::DevString *attr_alarmUnacknowledgedNormal_read;
Tango::DevString *attr_alarmShelved_read;
Tango::DevString *attr_alarmOutOfService_read;
Tango::DevString *attr_alarmSilenced_read;
Tango::DevString *attr_alarmList_read;
Tango::DevDouble *attr_alarmFrequency_read;
Tango::DevString *attr_alarmSummary_read;
Tango::DevString *attr_eventList_read;
Tango::DevString *attr_eventSummary_read;
Tango::DevString *attr_alarmDisabled_read;
// Constructors and destructors
public:
......@@ -211,14 +246,14 @@ public:
virtual void read_attr_hardware(vector<long> &attr_list);
/**
* Attribute audibleAlarm related methods
* Attribute alarmAudible related methods
* Description: True if there is at least one alarm that needs audible indication on the GUI
*
* Data type: Tango::DevBoolean
* Attr type: Scalar
*/
virtual void read_audibleAlarm(Tango::Attribute &attr);
virtual bool is_audibleAlarm_allowed(Tango::AttReqType type);
virtual void read_alarmAudible(Tango::Attribute &attr);
virtual bool is_alarmAudible_allowed(Tango::AttReqType type);
/**
* Attribute StatisticsResetTime related methods
* Description: Time elapsed in seconds since last Resetstatistics
......@@ -238,86 +273,122 @@ public:
virtual void read_alarm(Tango::Attribute &attr);
virtual bool is_alarm_allowed(Tango::AttReqType type);
/**
* Attribute normalAlarms related methods
* Attribute alarmNormal related methods
* Description: List of alarms in normal state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_normalAlarms(Tango::Attribute &attr);
virtual bool is_normalAlarms_allowed(Tango::AttReqType type);
virtual void read_alarmNormal(Tango::Attribute &attr);
virtual bool is_alarmNormal_allowed(Tango::AttReqType type);
/**
* Attribute unacknowledgedAlarms related methods
* Attribute alarmUnacknowledged related methods
* Description: List of alarms in unacknowledged state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_unacknowledgedAlarms(Tango::Attribute &attr);
virtual bool is_unacknowledgedAlarms_allowed(Tango::AttReqType type);
virtual void read_alarmUnacknowledged(Tango::Attribute &attr);
virtual bool is_alarmUnacknowledged_allowed(Tango::AttReqType type);
/**
* Attribute acknowledgedAlarms related methods
* Attribute alarmAcknowledged related methods
* Description: List of alarms in acknowledged state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_acknowledgedAlarms(Tango::Attribute &attr);
virtual bool is_acknowledgedAlarms_allowed(Tango::AttReqType type);
virtual void read_alarmAcknowledged(Tango::Attribute &attr);
virtual bool is_alarmAcknowledged_allowed(Tango::AttReqType type);
/**
* Attribute unacknowledgedNormalAlarms related methods
* Attribute alarmUnacknowledgedNormal related methods
* Description: List of alarms in unacknowledged normal state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_unacknowledgedNormalAlarms(Tango::Attribute &attr);
virtual bool is_unacknowledgedNormalAlarms_allowed(Tango::AttReqType type);
virtual void read_alarmUnacknowledgedNormal(Tango::Attribute &attr);
virtual bool is_alarmUnacknowledgedNormal_allowed(Tango::AttReqType type);
/**
* Attribute shelvedAlarms related methods
* Attribute alarmShelved related methods
* Description: List of alarms in shelved state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_shelvedAlarms(Tango::Attribute &attr);
virtual bool is_shelvedAlarms_allowed(Tango::AttReqType type);
virtual void read_alarmShelved(Tango::Attribute &attr);
virtual bool is_alarmShelved_allowed(Tango::AttReqType type);
/**
* Attribute outOfServiceAlarms related methods
* Attribute alarmOutOfService related methods
* Description: List of alarms in out of service state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_outOfServiceAlarms(Tango::Attribute &attr);
virtual bool is_outOfServiceAlarms_allowed(Tango::AttReqType type);
virtual void read_alarmOutOfService(Tango::Attribute &attr);
virtual bool is_alarmOutOfService_allowed(Tango::AttReqType type);
/**
* Attribute silencedAlarms related methods
* Attribute alarmSilenced related methods
* Description: List of alarms in silenced state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_silencedAlarms(Tango::Attribute &attr);
virtual bool is_silencedAlarms_allowed(Tango::AttReqType type);
virtual void read_alarmSilenced(Tango::Attribute &attr);
virtual bool is_alarmSilenced_allowed(Tango::AttReqType type);
/**
* Attribute listAlarms related methods
* Attribute alarmList related methods
* Description: List of all alarms
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_listAlarms(Tango::Attribute &attr);
virtual bool is_listAlarms_allowed(Tango::AttReqType type);
virtual void read_alarmList(Tango::Attribute &attr);
virtual bool is_alarmList_allowed(Tango::AttReqType type);
/**
* Attribute frequencyAlarms related methods
* Attribute alarmFrequency related methods
* Description: List of frequency of evaluation of all alarms
*
* Data type: Tango::DevDouble
* Attr type: Spectrum max = 10000
*/
virtual void read_frequencyAlarms(Tango::Attribute &attr);
virtual bool is_frequencyAlarms_allowed(Tango::AttReqType type);
virtual void read_alarmFrequency(Tango::Attribute &attr);
virtual bool is_alarmFrequency_allowed(Tango::AttReqType type);
/**
* Attribute alarmSummary related methods
* Description:
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_alarmSummary(Tango::Attribute &attr);
virtual bool is_alarmSummary_allowed(Tango::AttReqType type);
/**
* Attribute eventList related methods
* Description: List of all subscribed attributes
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_eventList(Tango::Attribute &attr);
virtual bool is_eventList_allowed(Tango::AttReqType type);
/**
* Attribute eventSummary related methods
* Description:
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
virtual void read_eventSummary(Tango::Attribute &attr);
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
public:
......@@ -450,6 +521,29 @@ public:
*/
virtual void reset_statistics();
virtual bool is_ResetStatistics_allowed(const CORBA::Any &any);
/**
* Command StopNew related method
* Description: Stop audible indications on the GUI
*
*/
virtual void stop_new();
virtual bool is_StopNew_allowed(const CORBA::Any &any);
/**
* Command GetAlarmInfo related method
* Description: Returns the complete attribute info as an array of key=value
*
* @param argin Alarm name followed optionally by wanted key names
* @returns Complete attribute info as an array of key=value
*/
virtual Tango::DevVarStringArray *get_alarm_info(const Tango::DevVarStringArray *argin);
virtual bool is_GetAlarmInfo_allowed(const CORBA::Any &any);
/**
* Command ReLoadAll related method
* Description: Re Load all alarms.
*
*/
virtual void re_load_all();
virtual bool is_ReLoadAll_allowed(const CORBA::Any &any);
//--------------------------------------------------------
......@@ -485,6 +579,7 @@ private:
ReadersWritersLock *dslock;
int period; //subscribe thread period
map<string, string> saved_alarms;
ReadersWritersLock *savedlock;
static int instanceCounter;
......@@ -497,14 +592,14 @@ private:
#if 0
void init_alarms(map< string,vector<string> > &alarm_events);
#endif
void add_alarm(alarm_t& a) throw(string&);
void add_event(alarm_t& a, vector<string> &evn) throw(string&);
void add_alarm(alarm_t& a, bool starting=false);
void add_event(alarm_t& a, vector<string> &evn);
#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
// void do_alarm(bei_t& e); //gcc 4 problem??
bool remove_alarm(string& s) throw(string&);
//void add_to_database(alarm_t& a) throw(string&);
bool remove_alarm(string& s);
//void add_to_database(alarm_t& a);
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);
......@@ -512,17 +607,24 @@ private:
formula_res_t eval_formula(tree_parse_info_t tree, string &attr_values);
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 prepare_alarm_attr(); //for read attribute alarm and push_change_event
void prepare_event_list();
void prepare_event_summary();
void remove_AlarmState_dynamic_attribute_no_clean_db(string attname);
void parse_alarm(string &alarm_string, alarm_t &alm);
SubscribeThread *thread;
public:
void put_signal_property();
bool check_signal_property();
void do_alarm(bei_t& e); //public instead of protected for gcc 4 problem??
bool do_alarm_eval(string alm_name, string ev_name, Tango::TimeVal ts);
void timer_update(); //public instead of protected for gcc 4 problem??
......
<?xml version="1.0" encoding="ASCII"?>
<pogoDsl:PogoSystem xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pogoDsl="http://www.esrf.fr/tango/pogo/PogoDsl">
<classes name="AlarmHandler" pogoRevision="9.4">
<description description="Elettra alarm handler device server" title="Elettra alarm handler device server" sourcePath="/home/graziano/ws/alarmhandler/src" language="Cpp" filestogenerate="XMI file,Code files,Protected Regions" license="GPL" copyright="" hasMandatoryProperty="false" hasConcreteProperty="true" hasAbstractCommand="false" hasAbstractAttribute="false">
<classes name="AlarmHandler" pogoRevision="9.6">
<description description="Elettra alarm handler device server" title="Elettra alarm handler device server" sourcePath="/home/graziano/ws/alarm-handler/src" language="Cpp" filestogenerate="XMI file,Code files,Protected Regions" license="GPL" copyright="" hasMandatoryProperty="false" hasConcreteProperty="true" hasAbstractCommand="false" hasAbstractAttribute="false">
<inheritances classname="Device_4Impl" sourcePath=""/>
<identification contact="at elettra.eu - graziano.scalamera" author="graziano.scalamera" emailDomain="elettra.eu" classFamily="SoftwareSystem" siteSpecific="" platform="Unix Like" bus="Not Applicable" manufacturer="" reference=""/>
</description>
<classProperties name="GroupNames" description="Labels for Group mask, first is for mask 0x00">
<type xsi:type="pogoDsl:StringVectorType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</classProperties>
<classProperties name="SubscribeRetryPeriod" description="Retry subscription period in seconds">
<type xsi:type="pogoDsl:IntType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>30</DefaultPropValue>
</classProperties>
<classProperties name="StatisticsTimeWindow" description="Time window to compute statistics in seconds">
<type xsi:type="pogoDsl:IntVectorType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>60</DefaultPropValue>
</classProperties>
<classProperties name="ErrorDelay" description="Delay in seconds before changing to ERROR state after an exception is received.">
<type xsi:type="pogoDsl:UIntType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>30</DefaultPropValue>
</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">
<type xsi:type="pogoDsl:StringVectorType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
......@@ -19,6 +43,16 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>60</DefaultPropValue>
</deviceProperties>
<deviceProperties name="ErrorDelay" description="Delay in seconds before changing to ERROR state after an exception is received.">
<type xsi:type="pogoDsl:UIntType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<DefaultPropValue>30</DefaultPropValue>
</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">
<argin description="none.">
<type xsi:type="pogoDsl:VoidType"/>
......@@ -136,10 +170,37 @@
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<attributes name="audibleAlarm" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<commands name="StopNew" description="Stop audible indications on the GUI" execMethod="stop_new" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="GetAlarmInfo" description="Returns the complete attribute info as an array of key=value" execMethod="get_alarm_info" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="Alarm name followed optionally by wanted key names">
<type xsi:type="pogoDsl:StringArrayType"/>
</argin>
<argout description="Complete attribute info as an array of key=value">
<type xsi:type="pogoDsl:StringArrayType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="ReLoadAll" description="Re Load all alarms." execMethod="re_load_all" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<attributes name="alarmAudible" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="true" libCheckCriteria="false"/>
<archiveEvent fire="true" libCheckCriteria="false"/>
<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="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=""/>
......@@ -159,7 +220,7 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="normalAlarms" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="alarmNormal" 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"/>
......@@ -167,7 +228,7 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="List of alarms in normal state" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="unacknowledgedAlarms" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="alarmUnacknowledged" 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"/>
......@@ -175,7 +236,7 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="List of alarms in unacknowledged state" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="acknowledgedAlarms" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="alarmAcknowledged" 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"/>
......@@ -183,7 +244,7 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="List of alarms in acknowledged state" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="unacknowledgedNormalAlarms" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="alarmUnacknowledgedNormal" 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"/>
......@@ -191,7 +252,7 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="List of alarms in unacknowledged normal state" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="shelvedAlarms" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="alarmShelved" 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"/>
......@@ -199,7 +260,7 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="List of alarms in shelved state" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="outOfServiceAlarms" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="alarmOutOfService" 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"/>
......@@ -207,7 +268,7 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="List of alarms in out of service state" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="silencedAlarms" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="alarmSilenced" 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"/>
......@@ -215,7 +276,7 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="List of alarms in silenced state" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="listAlarms" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="alarmList" 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"/>
......@@ -223,7 +284,7 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="List of all alarms" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="frequencyAlarms" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="alarmFrequency" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="true" libCheckCriteria="true"/>
<archiveEvent fire="true" libCheckCriteria="true"/>
......@@ -231,6 +292,38 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="List of frequency of evaluation of all alarms" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="alarmSummary" 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="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="eventList" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:StringType"/>
<changeEvent fire="false" libCheckCriteria="true"/>
<archiveEvent fire="false" libCheckCriteria="true"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="List of all subscribed attributes" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="eventSummary" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="10000" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:StringType"/>
<changeEvent fire="false" libCheckCriteria="true"/>
<archiveEvent fire="false" libCheckCriteria="true"/>
<dataReadyEvent fire="false" libCheckCriteria="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=""/>
</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">
<dataType xsi:type="pogoDsl:EnumType"/>
<changeEvent fire="true" libCheckCriteria="true"/>
......@@ -245,15 +338,16 @@
<enumLabels>SHLVD</enumLabels>
<enumLabels>DSUPR</enumLabels>
<enumLabels>OOSRV</enumLabels>
<enumLabels>ERROR</enumLabels>
</dynamicAttributes>
<dynamicAttributes name="AlarmFormula" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="true">
<dataType xsi:type="pogoDsl:StringType"/>
<changeEvent fire="true" libCheckCriteria="false"/>
<archiveEvent fire="true" libCheckCriteria="false"/>
<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="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</dynamicAttributes>
<preferences docHome="./doc_html" makefileHome="/usr/local/tango-9.2.5a/share/pogo/preferences"/>
<preferences docHome="./doc_html" makefileHome="/usr/local/tango-9.3.3/share/pogo/preferences"/>
</classes>
</pogoDsl:PogoSystem>
/*----- 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
......@@ -78,15 +73,16 @@ AlarmHandlerClass *AlarmHandlerClass::_instance = NULL;
//--------------------------------------------------------
AlarmHandlerClass::AlarmHandlerClass(string &s):Tango::DeviceClass(s)
{
cout2 << "Entering AlarmHandlerClass constructor" << endl;
TANGO_LOG_INFO << "Entering AlarmHandlerClass constructor" << endl;
set_default_property();
get_class_property();
write_class_property();
/*----- PROTECTED REGION ID(AlarmHandlerClass::constructor) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandlerClass::constructor
cout2 << "Leaving AlarmHandlerClass constructor" << endl;
TANGO_LOG_INFO << "Leaving AlarmHandlerClass constructor" << endl;
}
//--------------------------------------------------------
......@@ -166,7 +162,7 @@ AlarmHandlerClass *AlarmHandlerClass::instance()
//--------------------------------------------------------
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;
extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->ack(argin));
......@@ -186,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)
{
cout2 << "LoadClass::execute(): arrived" << endl;
TANGO_LOG_INFO << "LoadClass::execute(): arrived" << endl;
Tango::DevString argin;
extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->load(argin));
......@@ -206,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)
{
cout2 << "RemoveClass::execute(): arrived" << endl;
TANGO_LOG_INFO << "RemoveClass::execute(): arrived" << endl;
Tango::DevString argin;
extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->remove(argin));
......@@ -226,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)
{
cout2 << "SearchAlarmClass::execute(): arrived" << endl;
TANGO_LOG_INFO << "SearchAlarmClass::execute(): arrived" << endl;
Tango::DevString argin;
extract(in_any, argin);
return insert((static_cast<AlarmHandler *>(device))->search_alarm(argin));
......@@ -245,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))
{
cout2 << "StopAudibleClass::execute(): arrived" << endl;
TANGO_LOG_INFO << "StopAudibleClass::execute(): arrived" << endl;
((static_cast<AlarmHandler *>(device))->stop_audible());
return new CORBA::Any();
}
......@@ -263,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)
{
cout2 << "SilenceClass::execute(): arrived" << endl;
TANGO_LOG_INFO << "SilenceClass::execute(): arrived" << endl;
const Tango::DevVarStringArray *argin;
extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->silence(argin));
......@@ -283,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)
{
cout2 << "ModifyClass::execute(): arrived" << endl;
TANGO_LOG_INFO << "ModifyClass::execute(): arrived" << endl;
Tango::DevString argin;
extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->modify(argin));
......@@ -303,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)
{
cout2 << "ShelveClass::execute(): arrived" << endl;
TANGO_LOG_INFO << "ShelveClass::execute(): arrived" << endl;
const Tango::DevVarStringArray *argin;
extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->shelve(argin));
......@@ -323,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)
{
cout2 << "EnableClass::execute(): arrived" << endl;
TANGO_LOG_INFO << "EnableClass::execute(): arrived" << endl;
Tango::DevString argin;
extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->enable(argin));
......@@ -343,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)
{
cout2 << "DisableClass::execute(): arrived" << endl;
TANGO_LOG_INFO << "DisableClass::execute(): arrived" << endl;
Tango::DevString argin;
extract(in_any, argin);
((static_cast<AlarmHandler *>(device))->disable(argin));
......@@ -363,11 +359,66 @@ 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))
{
cout2 << "ResetStatisticsClass::execute(): arrived" << endl;
TANGO_LOG_INFO << "ResetStatisticsClass::execute(): arrived" << endl;
((static_cast<AlarmHandler *>(device))->reset_statistics());
return new CORBA::Any();
}
//--------------------------------------------------------
/**
* method : StopNewClass::execute()
* description : method to trigger the execution of the command.
*
* @param device The device on which the command must be executed
* @param in_any The command input data
*
* returns The command output data (packed in the Any object)
*/
//--------------------------------------------------------
CORBA::Any *StopNewClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{
TANGO_LOG_INFO << "StopNewClass::execute(): arrived" << endl;
((static_cast<AlarmHandler *>(device))->stop_new());
return new CORBA::Any();
}
//--------------------------------------------------------
/**
* method : GetAlarmInfoClass::execute()
* description : method to trigger the execution of the command.
*
* @param device The device on which the command must be executed
* @param in_any The command input data
*
* returns The command output data (packed in the Any object)
*/
//--------------------------------------------------------
CORBA::Any *GetAlarmInfoClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any)
{
TANGO_LOG_INFO << "GetAlarmInfoClass::execute(): arrived" << endl;
const Tango::DevVarStringArray *argin;
extract(in_any, argin);
return insert((static_cast<AlarmHandler *>(device))->get_alarm_info(argin));
}
//--------------------------------------------------------
/**
* method : ReLoadAllClass::execute()
* description : method to trigger the execution of the command.
*
* @param device The device on which the command must be executed
* @param in_any The command input data
*
* returns The command output data (packed in the Any object)
*/
//--------------------------------------------------------
CORBA::Any *ReLoadAllClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any))
{
TANGO_LOG_INFO << "ReLoadAllClass::execute(): arrived" << endl;
((static_cast<AlarmHandler *>(device))->re_load_all());
return new CORBA::Any();
}
//===================================================================
// Properties management
......@@ -417,6 +468,99 @@ Tango::DbDatum AlarmHandlerClass::get_default_class_property(string &prop_name)
return Tango::DbDatum(prop_name);
}
//--------------------------------------------------------
/**
* Method : AlarmHandlerClass::get_class_property()
* Description : Read database to initialize class property data members.
*/
//--------------------------------------------------------
void AlarmHandlerClass::get_class_property()
{
/*----- PROTECTED REGION ID(AlarmHandlerClass::get_class_property_before) ENABLED START -----*/
// Initialize class property data members
/*----- PROTECTED REGION END -----*/ // AlarmHandlerClass::get_class_property_before
// Read class properties from database.
cl_prop.push_back(Tango::DbDatum("GroupNames"));
cl_prop.push_back(Tango::DbDatum("SubscribeRetryPeriod"));
cl_prop.push_back(Tango::DbDatum("StatisticsTimeWindow"));
cl_prop.push_back(Tango::DbDatum("ErrorDelay"));
cl_prop.push_back(Tango::DbDatum("SetAlarmQuality"));
// Call database and extract values
if (Tango::Util::instance()->_UseDb==true)
get_db_class()->get_property(cl_prop);
Tango::DbDatum def_prop;
int i = -1;
// Try to extract GroupNames value
if (cl_prop[++i].is_empty()==false) cl_prop[i] >> groupNames;
else
{
// Check default value for GroupNames
def_prop = get_default_class_property(cl_prop[i].name);
if (def_prop.is_empty()==false)
{
def_prop >> groupNames;
cl_prop[i] << groupNames;
}
}
// Try to extract SubscribeRetryPeriod value
if (cl_prop[++i].is_empty()==false) cl_prop[i] >> subscribeRetryPeriod;
else
{
// Check default value for SubscribeRetryPeriod
def_prop = get_default_class_property(cl_prop[i].name);
if (def_prop.is_empty()==false)
{
def_prop >> subscribeRetryPeriod;
cl_prop[i] << subscribeRetryPeriod;
}
}
// Try to extract StatisticsTimeWindow value
if (cl_prop[++i].is_empty()==false) cl_prop[i] >> statisticsTimeWindow;
else
{
// Check default value for StatisticsTimeWindow
def_prop = get_default_class_property(cl_prop[i].name);
if (def_prop.is_empty()==false)
{
def_prop >> statisticsTimeWindow;
cl_prop[i] << statisticsTimeWindow;
}
}
// Try to extract ErrorDelay value
if (cl_prop[++i].is_empty()==false) cl_prop[i] >> errorDelay;
else
{
// Check default value for ErrorDelay
def_prop = get_default_class_property(cl_prop[i].name);
if (def_prop.is_empty()==false)
{
def_prop >> 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 -----*/
// Check class property data members init
/*----- PROTECTED REGION END -----*/ // AlarmHandlerClass::get_class_property_after
}
//--------------------------------------------------------
/**
......@@ -435,6 +579,75 @@ void AlarmHandlerClass::set_default_property()
vector<string> vect_data;
// Set Default Class Properties
prop_name = "GroupNames";
prop_desc = "Labels for Group mask, first is for mask 0x00";
prop_def = "";
vect_data.clear();
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
add_wiz_class_prop(prop_name, prop_desc);
prop_name = "SubscribeRetryPeriod";
prop_desc = "Retry subscription period in seconds";
prop_def = "30";
vect_data.clear();
vect_data.push_back("30");
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
add_wiz_class_prop(prop_name, prop_desc);
prop_name = "StatisticsTimeWindow";
prop_desc = "Time window to compute statistics in seconds";
prop_def = "60";
vect_data.clear();
vect_data.push_back("60");
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
add_wiz_class_prop(prop_name, prop_desc);
prop_name = "ErrorDelay";
prop_desc = "Delay in seconds before changing to ERROR state after an exception is received.";
prop_def = "30";
vect_data.clear();
vect_data.push_back("30");
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
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
add_wiz_class_prop(prop_name, prop_desc);
// Set Default device Properties
prop_name = "GroupNames";
......@@ -478,6 +691,34 @@ void AlarmHandlerClass::set_default_property()
}
else
add_wiz_dev_prop(prop_name, prop_desc);
prop_name = "ErrorDelay";
prop_desc = "Delay in seconds before changing to ERROR state after an exception is received.";
prop_def = "30";
vect_data.clear();
vect_data.push_back("30");
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);
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);
}
//--------------------------------------------------------
......@@ -543,7 +784,7 @@ void AlarmHandlerClass::device_factory(const Tango::DevVarStringArray *devlist_p
// Create devices and add it into the device list
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]));
}
......@@ -584,31 +825,31 @@ void AlarmHandlerClass::attribute_factory(vector<Tango::Attr *> &att_list)
// Add your own code
/*----- PROTECTED REGION END -----*/ // AlarmHandlerClass::attribute_factory_before
// Attribute : audibleAlarm
audibleAlarmAttrib *audiblealarm = new audibleAlarmAttrib();
Tango::UserDefaultAttrProp audiblealarm_prop;
audiblealarm_prop.set_description("True if there is at least one alarm that needs audible indication on the GUI");
// label not set for audibleAlarm
// unit not set for audibleAlarm
// standard_unit not set for audibleAlarm
// display_unit not set for audibleAlarm
// format not set for audibleAlarm
// max_value not set for audibleAlarm
// min_value not set for audibleAlarm
// max_alarm not set for audibleAlarm
// min_alarm not set for audibleAlarm
// max_warning not set for audibleAlarm
// min_warning not set for audibleAlarm
// delta_t not set for audibleAlarm
// delta_val not set for audibleAlarm
// Attribute : alarmAudible
alarmAudibleAttrib *alarmaudible = new alarmAudibleAttrib();
Tango::UserDefaultAttrProp alarmaudible_prop;
alarmaudible_prop.set_description("True if there is at least one alarm that needs audible indication on the GUI");
// label not set for alarmAudible
// unit not set for alarmAudible
// standard_unit not set for alarmAudible
// display_unit not set for alarmAudible
// format not set for alarmAudible
// max_value not set for alarmAudible
// min_value not set for alarmAudible
// max_alarm not set for alarmAudible
// min_alarm not set for alarmAudible
// max_warning not set for alarmAudible
// min_warning not set for alarmAudible
// delta_t not set for alarmAudible
// delta_val not set for alarmAudible
audiblealarm->set_default_properties(audiblealarm_prop);
alarmaudible->set_default_properties(alarmaudible_prop);
// Not Polled
audiblealarm->set_disp_level(Tango::OPERATOR);
alarmaudible->set_disp_level(Tango::OPERATOR);
// Not Memorized
audiblealarm->set_change_event(true, false);
audiblealarm->set_archive_event(true, false);
att_list.push_back(audiblealarm);
alarmaudible->set_change_event(true, true);
alarmaudible->set_archive_event(true, true);
att_list.push_back(alarmaudible);
// Attribute : StatisticsResetTime
StatisticsResetTimeAttrib *statisticsresettime = new StatisticsResetTimeAttrib();
......@@ -658,239 +899,339 @@ void AlarmHandlerClass::attribute_factory(vector<Tango::Attr *> &att_list)
// Not Memorized
att_list.push_back(alarm);
// Attribute : normalAlarms
normalAlarmsAttrib *normalalarms = new normalAlarmsAttrib();
Tango::UserDefaultAttrProp normalalarms_prop;
normalalarms_prop.set_description("List of alarms in normal state");
// label not set for normalAlarms
// unit not set for normalAlarms
// standard_unit not set for normalAlarms
// display_unit not set for normalAlarms
// format not set for normalAlarms
// max_value not set for normalAlarms
// min_value not set for normalAlarms
// max_alarm not set for normalAlarms
// min_alarm not set for normalAlarms
// max_warning not set for normalAlarms
// min_warning not set for normalAlarms
// delta_t not set for normalAlarms
// delta_val not set for normalAlarms
// Attribute : alarmNormal
alarmNormalAttrib *alarmnormal = new alarmNormalAttrib();
Tango::UserDefaultAttrProp alarmnormal_prop;
alarmnormal_prop.set_description("List of alarms in normal state");
// label not set for alarmNormal
// unit not set for alarmNormal
// standard_unit not set for alarmNormal
// display_unit not set for alarmNormal
// format not set for alarmNormal
// max_value not set for alarmNormal
// min_value not set for alarmNormal
// max_alarm not set for alarmNormal
// min_alarm not set for alarmNormal
// max_warning not set for alarmNormal
// min_warning not set for alarmNormal
// delta_t not set for alarmNormal
// delta_val not set for alarmNormal
normalalarms->set_default_properties(normalalarms_prop);
alarmnormal->set_default_properties(alarmnormal_prop);
// Not Polled
normalalarms->set_disp_level(Tango::OPERATOR);
alarmnormal->set_disp_level(Tango::OPERATOR);
// Not Memorized
normalalarms->set_change_event(true, true);
normalalarms->set_archive_event(true, true);
att_list.push_back(normalalarms);
// Attribute : unacknowledgedAlarms
unacknowledgedAlarmsAttrib *unacknowledgedalarms = new unacknowledgedAlarmsAttrib();
Tango::UserDefaultAttrProp unacknowledgedalarms_prop;
unacknowledgedalarms_prop.set_description("List of alarms in unacknowledged state");
// label not set for unacknowledgedAlarms
// unit not set for unacknowledgedAlarms
// standard_unit not set for unacknowledgedAlarms
// display_unit not set for unacknowledgedAlarms
// format not set for unacknowledgedAlarms
// max_value not set for unacknowledgedAlarms
// min_value not set for unacknowledgedAlarms
// max_alarm not set for unacknowledgedAlarms
// min_alarm not set for unacknowledgedAlarms
// max_warning not set for unacknowledgedAlarms
// min_warning not set for unacknowledgedAlarms
// delta_t not set for unacknowledgedAlarms
// delta_val not set for unacknowledgedAlarms
alarmnormal->set_change_event(true, true);
alarmnormal->set_archive_event(true, true);
att_list.push_back(alarmnormal);
// Attribute : alarmUnacknowledged
alarmUnacknowledgedAttrib *alarmunacknowledged = new alarmUnacknowledgedAttrib();
Tango::UserDefaultAttrProp alarmunacknowledged_prop;
alarmunacknowledged_prop.set_description("List of alarms in unacknowledged state");
// label not set for alarmUnacknowledged
// unit not set for alarmUnacknowledged
// standard_unit not set for alarmUnacknowledged
// display_unit not set for alarmUnacknowledged
// format not set for alarmUnacknowledged
// max_value not set for alarmUnacknowledged
// min_value not set for alarmUnacknowledged
// max_alarm not set for alarmUnacknowledged
// min_alarm not set for alarmUnacknowledged
// max_warning not set for alarmUnacknowledged
// min_warning not set for alarmUnacknowledged
// delta_t not set for alarmUnacknowledged
// delta_val not set for alarmUnacknowledged
unacknowledgedalarms->set_default_properties(unacknowledgedalarms_prop);
alarmunacknowledged->set_default_properties(alarmunacknowledged_prop);
// Not Polled
unacknowledgedalarms->set_disp_level(Tango::OPERATOR);
alarmunacknowledged->set_disp_level(Tango::OPERATOR);
// Not Memorized
unacknowledgedalarms->set_change_event(true, true);
unacknowledgedalarms->set_archive_event(true, true);
att_list.push_back(unacknowledgedalarms);
// Attribute : acknowledgedAlarms
acknowledgedAlarmsAttrib *acknowledgedalarms = new acknowledgedAlarmsAttrib();
Tango::UserDefaultAttrProp acknowledgedalarms_prop;
acknowledgedalarms_prop.set_description("List of alarms in acknowledged state");
// label not set for acknowledgedAlarms
// unit not set for acknowledgedAlarms
// standard_unit not set for acknowledgedAlarms
// display_unit not set for acknowledgedAlarms
// format not set for acknowledgedAlarms
// max_value not set for acknowledgedAlarms
// min_value not set for acknowledgedAlarms
// max_alarm not set for acknowledgedAlarms
// min_alarm not set for acknowledgedAlarms
// max_warning not set for acknowledgedAlarms
// min_warning not set for acknowledgedAlarms
// delta_t not set for acknowledgedAlarms
// delta_val not set for acknowledgedAlarms
alarmunacknowledged->set_change_event(true, true);
alarmunacknowledged->set_archive_event(true, true);
att_list.push_back(alarmunacknowledged);
// Attribute : alarmAcknowledged
alarmAcknowledgedAttrib *alarmacknowledged = new alarmAcknowledgedAttrib();
Tango::UserDefaultAttrProp alarmacknowledged_prop;
alarmacknowledged_prop.set_description("List of alarms in acknowledged state");
// label not set for alarmAcknowledged
// unit not set for alarmAcknowledged
// standard_unit not set for alarmAcknowledged
// display_unit not set for alarmAcknowledged
// format not set for alarmAcknowledged
// max_value not set for alarmAcknowledged
// min_value not set for alarmAcknowledged
// max_alarm not set for alarmAcknowledged
// min_alarm not set for alarmAcknowledged
// max_warning not set for alarmAcknowledged
// min_warning not set for alarmAcknowledged
// delta_t not set for alarmAcknowledged
// delta_val not set for alarmAcknowledged
acknowledgedalarms->set_default_properties(acknowledgedalarms_prop);
alarmacknowledged->set_default_properties(alarmacknowledged_prop);
// Not Polled
acknowledgedalarms->set_disp_level(Tango::OPERATOR);
alarmacknowledged->set_disp_level(Tango::OPERATOR);
// Not Memorized
acknowledgedalarms->set_change_event(true, true);
acknowledgedalarms->set_archive_event(true, true);
att_list.push_back(acknowledgedalarms);
// Attribute : unacknowledgedNormalAlarms
unacknowledgedNormalAlarmsAttrib *unacknowledgednormalalarms = new unacknowledgedNormalAlarmsAttrib();
Tango::UserDefaultAttrProp unacknowledgednormalalarms_prop;
unacknowledgednormalalarms_prop.set_description("List of alarms in unacknowledged normal state");
// label not set for unacknowledgedNormalAlarms
// unit not set for unacknowledgedNormalAlarms
// standard_unit not set for unacknowledgedNormalAlarms
// display_unit not set for unacknowledgedNormalAlarms
// format not set for unacknowledgedNormalAlarms
// max_value not set for unacknowledgedNormalAlarms
// min_value not set for unacknowledgedNormalAlarms
// max_alarm not set for unacknowledgedNormalAlarms
// min_alarm not set for unacknowledgedNormalAlarms
// max_warning not set for unacknowledgedNormalAlarms
// min_warning not set for unacknowledgedNormalAlarms
// delta_t not set for unacknowledgedNormalAlarms
// delta_val not set for unacknowledgedNormalAlarms
alarmacknowledged->set_change_event(true, true);
alarmacknowledged->set_archive_event(true, true);
att_list.push_back(alarmacknowledged);
// Attribute : alarmUnacknowledgedNormal
alarmUnacknowledgedNormalAttrib *alarmunacknowledgednormal = new alarmUnacknowledgedNormalAttrib();
Tango::UserDefaultAttrProp alarmunacknowledgednormal_prop;
alarmunacknowledgednormal_prop.set_description("List of alarms in unacknowledged normal state");
// label not set for alarmUnacknowledgedNormal
// unit not set for alarmUnacknowledgedNormal
// standard_unit not set for alarmUnacknowledgedNormal
// display_unit not set for alarmUnacknowledgedNormal
// format not set for alarmUnacknowledgedNormal
// max_value not set for alarmUnacknowledgedNormal
// min_value not set for alarmUnacknowledgedNormal
// max_alarm not set for alarmUnacknowledgedNormal
// min_alarm not set for alarmUnacknowledgedNormal
// max_warning not set for alarmUnacknowledgedNormal
// min_warning not set for alarmUnacknowledgedNormal
// delta_t not set for alarmUnacknowledgedNormal
// delta_val not set for alarmUnacknowledgedNormal
unacknowledgednormalalarms->set_default_properties(unacknowledgednormalalarms_prop);
alarmunacknowledgednormal->set_default_properties(alarmunacknowledgednormal_prop);
// Not Polled
unacknowledgednormalalarms->set_disp_level(Tango::OPERATOR);
alarmunacknowledgednormal->set_disp_level(Tango::OPERATOR);
// Not Memorized
unacknowledgednormalalarms->set_change_event(true, true);
unacknowledgednormalalarms->set_archive_event(true, true);
att_list.push_back(unacknowledgednormalalarms);
// Attribute : shelvedAlarms
shelvedAlarmsAttrib *shelvedalarms = new shelvedAlarmsAttrib();
Tango::UserDefaultAttrProp shelvedalarms_prop;
shelvedalarms_prop.set_description("List of alarms in shelved state");
// label not set for shelvedAlarms
// unit not set for shelvedAlarms
// standard_unit not set for shelvedAlarms
// display_unit not set for shelvedAlarms
// format not set for shelvedAlarms
// max_value not set for shelvedAlarms
// min_value not set for shelvedAlarms
// max_alarm not set for shelvedAlarms
// min_alarm not set for shelvedAlarms
// max_warning not set for shelvedAlarms
// min_warning not set for shelvedAlarms
// delta_t not set for shelvedAlarms
// delta_val not set for shelvedAlarms
alarmunacknowledgednormal->set_change_event(true, true);
alarmunacknowledgednormal->set_archive_event(true, true);
att_list.push_back(alarmunacknowledgednormal);
// Attribute : alarmShelved
alarmShelvedAttrib *alarmshelved = new alarmShelvedAttrib();
Tango::UserDefaultAttrProp alarmshelved_prop;
alarmshelved_prop.set_description("List of alarms in shelved state");
// label not set for alarmShelved
// unit not set for alarmShelved
// standard_unit not set for alarmShelved
// display_unit not set for alarmShelved
// format not set for alarmShelved
// max_value not set for alarmShelved
// min_value not set for alarmShelved
// max_alarm not set for alarmShelved
// min_alarm not set for alarmShelved
// max_warning not set for alarmShelved
// min_warning not set for alarmShelved
// delta_t not set for alarmShelved
// delta_val not set for alarmShelved
shelvedalarms->set_default_properties(shelvedalarms_prop);
alarmshelved->set_default_properties(alarmshelved_prop);
// Not Polled
shelvedalarms->set_disp_level(Tango::OPERATOR);
alarmshelved->set_disp_level(Tango::OPERATOR);
// Not Memorized
shelvedalarms->set_change_event(true, true);
shelvedalarms->set_archive_event(true, true);
att_list.push_back(shelvedalarms);
// Attribute : outOfServiceAlarms
outOfServiceAlarmsAttrib *outofservicealarms = new outOfServiceAlarmsAttrib();
Tango::UserDefaultAttrProp outofservicealarms_prop;
outofservicealarms_prop.set_description("List of alarms in out of service state");
// label not set for outOfServiceAlarms
// unit not set for outOfServiceAlarms
// standard_unit not set for outOfServiceAlarms
// display_unit not set for outOfServiceAlarms
// format not set for outOfServiceAlarms
// max_value not set for outOfServiceAlarms
// min_value not set for outOfServiceAlarms
// max_alarm not set for outOfServiceAlarms
// min_alarm not set for outOfServiceAlarms
// max_warning not set for outOfServiceAlarms
// min_warning not set for outOfServiceAlarms
// delta_t not set for outOfServiceAlarms
// delta_val not set for outOfServiceAlarms
alarmshelved->set_change_event(true, true);
alarmshelved->set_archive_event(true, true);
att_list.push_back(alarmshelved);
// Attribute : alarmOutOfService
alarmOutOfServiceAttrib *alarmoutofservice = new alarmOutOfServiceAttrib();
Tango::UserDefaultAttrProp alarmoutofservice_prop;
alarmoutofservice_prop.set_description("List of alarms in out of service state");
// label not set for alarmOutOfService
// unit not set for alarmOutOfService
// standard_unit not set for alarmOutOfService
// display_unit not set for alarmOutOfService
// format not set for alarmOutOfService
// max_value not set for alarmOutOfService
// min_value not set for alarmOutOfService
// max_alarm not set for alarmOutOfService
// min_alarm not set for alarmOutOfService
// max_warning not set for alarmOutOfService
// min_warning not set for alarmOutOfService
// delta_t not set for alarmOutOfService
// delta_val not set for alarmOutOfService
outofservicealarms->set_default_properties(outofservicealarms_prop);
alarmoutofservice->set_default_properties(alarmoutofservice_prop);
// Not Polled
outofservicealarms->set_disp_level(Tango::OPERATOR);
alarmoutofservice->set_disp_level(Tango::OPERATOR);
// Not Memorized
outofservicealarms->set_change_event(true, true);
outofservicealarms->set_archive_event(true, true);
att_list.push_back(outofservicealarms);
// Attribute : silencedAlarms
silencedAlarmsAttrib *silencedalarms = new silencedAlarmsAttrib();
Tango::UserDefaultAttrProp silencedalarms_prop;
silencedalarms_prop.set_description("List of alarms in silenced state");
// label not set for silencedAlarms
// unit not set for silencedAlarms
// standard_unit not set for silencedAlarms
// display_unit not set for silencedAlarms
// format not set for silencedAlarms
// max_value not set for silencedAlarms
// min_value not set for silencedAlarms
// max_alarm not set for silencedAlarms
// min_alarm not set for silencedAlarms
// max_warning not set for silencedAlarms
// min_warning not set for silencedAlarms
// delta_t not set for silencedAlarms
// delta_val not set for silencedAlarms
alarmoutofservice->set_change_event(true, true);
alarmoutofservice->set_archive_event(true, true);
att_list.push_back(alarmoutofservice);
// Attribute : alarmSilenced
alarmSilencedAttrib *alarmsilenced = new alarmSilencedAttrib();
Tango::UserDefaultAttrProp alarmsilenced_prop;
alarmsilenced_prop.set_description("List of alarms in silenced state");
// label not set for alarmSilenced
// unit not set for alarmSilenced
// standard_unit not set for alarmSilenced
// display_unit not set for alarmSilenced
// format not set for alarmSilenced
// max_value not set for alarmSilenced
// min_value not set for alarmSilenced
// max_alarm not set for alarmSilenced
// min_alarm not set for alarmSilenced
// max_warning not set for alarmSilenced
// min_warning not set for alarmSilenced
// delta_t not set for alarmSilenced
// delta_val not set for alarmSilenced
silencedalarms->set_default_properties(silencedalarms_prop);
alarmsilenced->set_default_properties(alarmsilenced_prop);
// Not Polled
silencedalarms->set_disp_level(Tango::OPERATOR);
alarmsilenced->set_disp_level(Tango::OPERATOR);
// Not Memorized
silencedalarms->set_change_event(true, true);
silencedalarms->set_archive_event(true, true);
att_list.push_back(silencedalarms);
// Attribute : listAlarms
listAlarmsAttrib *listalarms = new listAlarmsAttrib();
Tango::UserDefaultAttrProp listalarms_prop;
listalarms_prop.set_description("List of all alarms");
// label not set for listAlarms
// unit not set for listAlarms
// standard_unit not set for listAlarms
// display_unit not set for listAlarms
// format not set for listAlarms
// max_value not set for listAlarms
// min_value not set for listAlarms
// max_alarm not set for listAlarms
// min_alarm not set for listAlarms
// max_warning not set for listAlarms
// min_warning not set for listAlarms
// delta_t not set for listAlarms
// delta_val not set for listAlarms
alarmsilenced->set_change_event(true, true);
alarmsilenced->set_archive_event(true, true);
att_list.push_back(alarmsilenced);
// Attribute : alarmList
alarmListAttrib *alarmlist = new alarmListAttrib();
Tango::UserDefaultAttrProp alarmlist_prop;
alarmlist_prop.set_description("List of all alarms");
// label not set for alarmList
// unit not set for alarmList
// standard_unit not set for alarmList
// display_unit not set for alarmList
// format not set for alarmList
// max_value not set for alarmList
// min_value not set for alarmList
// max_alarm not set for alarmList
// min_alarm not set for alarmList
// max_warning not set for alarmList
// min_warning not set for alarmList
// delta_t not set for alarmList
// delta_val not set for alarmList
listalarms->set_default_properties(listalarms_prop);
alarmlist->set_default_properties(alarmlist_prop);
// Not Polled
listalarms->set_disp_level(Tango::OPERATOR);
alarmlist->set_disp_level(Tango::OPERATOR);
// Not Memorized
listalarms->set_change_event(true, true);
listalarms->set_archive_event(true, true);
att_list.push_back(listalarms);
// Attribute : frequencyAlarms
frequencyAlarmsAttrib *frequencyalarms = new frequencyAlarmsAttrib();
Tango::UserDefaultAttrProp frequencyalarms_prop;
frequencyalarms_prop.set_description("List of frequency of evaluation of all alarms");
// label not set for frequencyAlarms
// unit not set for frequencyAlarms
// standard_unit not set for frequencyAlarms
// display_unit not set for frequencyAlarms
// format not set for frequencyAlarms
// max_value not set for frequencyAlarms
// min_value not set for frequencyAlarms
// max_alarm not set for frequencyAlarms
// min_alarm not set for frequencyAlarms
// max_warning not set for frequencyAlarms
// min_warning not set for frequencyAlarms
// delta_t not set for frequencyAlarms
// delta_val not set for frequencyAlarms
alarmlist->set_change_event(true, true);
alarmlist->set_archive_event(true, true);
att_list.push_back(alarmlist);
// Attribute : alarmFrequency
alarmFrequencyAttrib *alarmfrequency = new alarmFrequencyAttrib();
Tango::UserDefaultAttrProp alarmfrequency_prop;
alarmfrequency_prop.set_description("List of frequency of evaluation of all alarms");
// label not set for alarmFrequency
// unit not set for alarmFrequency
// standard_unit not set for alarmFrequency
// display_unit not set for alarmFrequency
// format not set for alarmFrequency
// max_value not set for alarmFrequency
// min_value not set for alarmFrequency
// max_alarm not set for alarmFrequency
// min_alarm not set for alarmFrequency
// max_warning not set for alarmFrequency
// min_warning not set for alarmFrequency
// delta_t not set for alarmFrequency
// delta_val not set for alarmFrequency
frequencyalarms->set_default_properties(frequencyalarms_prop);
alarmfrequency->set_default_properties(alarmfrequency_prop);
// Not Polled
frequencyalarms->set_disp_level(Tango::OPERATOR);
alarmfrequency->set_disp_level(Tango::OPERATOR);
// Not Memorized
frequencyalarms->set_change_event(true, true);
frequencyalarms->set_archive_event(true, true);
att_list.push_back(frequencyalarms);
alarmfrequency->set_change_event(true, true);
alarmfrequency->set_archive_event(true, true);
att_list.push_back(alarmfrequency);
// Attribute : alarmSummary
alarmSummaryAttrib *alarmsummary = new alarmSummaryAttrib();
Tango::UserDefaultAttrProp alarmsummary_prop;
// description not set for alarmSummary
// label not set for alarmSummary
// unit not set for alarmSummary
// standard_unit not set for alarmSummary
// display_unit not set for alarmSummary
// format not set for alarmSummary
// max_value not set for alarmSummary
// min_value not set for alarmSummary
// max_alarm not set for alarmSummary
// min_alarm not set for alarmSummary
// max_warning not set for alarmSummary
// min_warning not set for alarmSummary
// delta_t not set for alarmSummary
// delta_val not set for alarmSummary
alarmsummary->set_default_properties(alarmsummary_prop);
// Not Polled
alarmsummary->set_disp_level(Tango::OPERATOR);
// Not Memorized
alarmsummary->set_change_event(true, true);
alarmsummary->set_archive_event(true, true);
att_list.push_back(alarmsummary);
// Attribute : eventList
eventListAttrib *eventlist = new eventListAttrib();
Tango::UserDefaultAttrProp eventlist_prop;
eventlist_prop.set_description("List of all subscribed attributes");
// label not set for eventList
// unit not set for eventList
// standard_unit not set for eventList
// display_unit not set for eventList
// format not set for eventList
// max_value not set for eventList
// min_value not set for eventList
// max_alarm not set for eventList
// min_alarm not set for eventList
// max_warning not set for eventList
// min_warning not set for eventList
// delta_t not set for eventList
// delta_val not set for eventList
eventlist->set_default_properties(eventlist_prop);
// Not Polled
eventlist->set_disp_level(Tango::OPERATOR);
// Not Memorized
att_list.push_back(eventlist);
// Attribute : eventSummary
eventSummaryAttrib *eventsummary = new eventSummaryAttrib();
Tango::UserDefaultAttrProp eventsummary_prop;
// description not set for eventSummary
// label not set for eventSummary
// unit not set for eventSummary
// standard_unit not set for eventSummary
// display_unit not set for eventSummary
// format not set for eventSummary
// max_value not set for eventSummary
// min_value not set for eventSummary
// max_alarm not set for eventSummary
// min_alarm not set for eventSummary
// max_warning not set for eventSummary
// min_warning not set for eventSummary
// delta_t not set for eventSummary
// delta_val not set for eventSummary
eventsummary->set_default_properties(eventsummary_prop);
// Not Polled
eventsummary->set_disp_level(Tango::OPERATOR);
// Not Memorized
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
......@@ -1036,6 +1377,33 @@ void AlarmHandlerClass::command_factory()
Tango::OPERATOR);
command_list.push_back(pResetStatisticsCmd);
// Command StopNew
StopNewClass *pStopNewCmd =
new StopNewClass("StopNew",
Tango::DEV_VOID, Tango::DEV_VOID,
"",
"",
Tango::OPERATOR);
command_list.push_back(pStopNewCmd);
// Command GetAlarmInfo
GetAlarmInfoClass *pGetAlarmInfoCmd =
new GetAlarmInfoClass("GetAlarmInfo",
Tango::DEVVAR_STRINGARRAY, Tango::DEVVAR_STRINGARRAY,
"Alarm name followed optionally by wanted key names",
"Complete attribute info as an array of key=value",
Tango::OPERATOR);
command_list.push_back(pGetAlarmInfoCmd);
// Command ReLoadAll
ReLoadAllClass *pReLoadAllCmd =
new ReLoadAllClass("ReLoadAll",
Tango::DEV_VOID, Tango::DEV_VOID,
"",
"",
Tango::OPERATOR);
command_list.push_back(pReLoadAllCmd);
/*----- PROTECTED REGION ID(AlarmHandlerClass::command_factory_after) ENABLED START -----*/
// Add your own code
......@@ -1064,7 +1432,7 @@ void AlarmHandlerClass::create_static_attribute_list(vector<Tango::Attr *> &att_
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 -----*/
......@@ -1100,7 +1468,7 @@ void AlarmHandlerClass::erase_dynamic_attributes(const Tango::DevVarStringArray
vector<string>::iterator ite_str = find(defaultAttList.begin(), defaultAttList.end(), att_name);
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());
dev->remove_attribute(att_list[att.get_attr_idx()], true, false);
--ite_att;
......@@ -1114,7 +1482,7 @@ void AlarmHandlerClass::erase_dynamic_attributes(const Tango::DevVarStringArray
//--------------------------------------------------------
/**
* Method : AlarmHandlerClass::get_attr_by_name()
* Method : AlarmHandlerClass::get_attr_object_by_name()
* Description : returns Tango::Attr * object found by name
*/
//--------------------------------------------------------
......
......@@ -37,7 +37,7 @@
#ifndef AlarmHandlerClass_H
#define AlarmHandlerClass_H
#include <tango.h>
#include <tango/tango.h>
#include <AlarmHandler.h>
......@@ -54,17 +54,17 @@ namespace AlarmHandler_ns
//=========================================
// Define classes for attributes
//=========================================
// Attribute audibleAlarm class definition
class audibleAlarmAttrib: public Tango::Attr
// Attribute alarmAudible class definition
class alarmAudibleAttrib: public Tango::Attr
{
public:
audibleAlarmAttrib():Attr("audibleAlarm",
alarmAudibleAttrib():Attr("alarmAudible",
Tango::DEV_BOOLEAN, Tango::READ) {};
~audibleAlarmAttrib() {};
~alarmAudibleAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_audibleAlarm(att);}
{(static_cast<AlarmHandler *>(dev))->read_alarmAudible(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_audibleAlarm_allowed(ty);}
{return (static_cast<AlarmHandler *>(dev))->is_alarmAudible_allowed(ty);}
};
// Attribute StatisticsResetTime class definition
......@@ -93,121 +93,173 @@ public:
{return (static_cast<AlarmHandler *>(dev))->is_alarm_allowed(ty);}
};
// Attribute normalAlarms class definition
class normalAlarmsAttrib: public Tango::SpectrumAttr
// Attribute alarmNormal class definition
class alarmNormalAttrib: public Tango::SpectrumAttr
{
public:
normalAlarmsAttrib():SpectrumAttr("normalAlarms",
alarmNormalAttrib():SpectrumAttr("alarmNormal",
Tango::DEV_STRING, Tango::READ, 10000) {};
~normalAlarmsAttrib() {};
~alarmNormalAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_normalAlarms(att);}
{(static_cast<AlarmHandler *>(dev))->read_alarmNormal(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_normalAlarms_allowed(ty);}
{return (static_cast<AlarmHandler *>(dev))->is_alarmNormal_allowed(ty);}
};
// Attribute unacknowledgedAlarms class definition
class unacknowledgedAlarmsAttrib: public Tango::SpectrumAttr
// Attribute alarmUnacknowledged class definition
class alarmUnacknowledgedAttrib: public Tango::SpectrumAttr
{
public:
unacknowledgedAlarmsAttrib():SpectrumAttr("unacknowledgedAlarms",
alarmUnacknowledgedAttrib():SpectrumAttr("alarmUnacknowledged",
Tango::DEV_STRING, Tango::READ, 10000) {};
~unacknowledgedAlarmsAttrib() {};
~alarmUnacknowledgedAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_unacknowledgedAlarms(att);}
{(static_cast<AlarmHandler *>(dev))->read_alarmUnacknowledged(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_unacknowledgedAlarms_allowed(ty);}
{return (static_cast<AlarmHandler *>(dev))->is_alarmUnacknowledged_allowed(ty);}
};
// Attribute acknowledgedAlarms class definition
class acknowledgedAlarmsAttrib: public Tango::SpectrumAttr
// Attribute alarmAcknowledged class definition
class alarmAcknowledgedAttrib: public Tango::SpectrumAttr
{
public:
acknowledgedAlarmsAttrib():SpectrumAttr("acknowledgedAlarms",
alarmAcknowledgedAttrib():SpectrumAttr("alarmAcknowledged",
Tango::DEV_STRING, Tango::READ, 10000) {};
~acknowledgedAlarmsAttrib() {};
~alarmAcknowledgedAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_acknowledgedAlarms(att);}
{(static_cast<AlarmHandler *>(dev))->read_alarmAcknowledged(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_acknowledgedAlarms_allowed(ty);}
{return (static_cast<AlarmHandler *>(dev))->is_alarmAcknowledged_allowed(ty);}
};
// Attribute unacknowledgedNormalAlarms class definition
class unacknowledgedNormalAlarmsAttrib: public Tango::SpectrumAttr
// Attribute alarmUnacknowledgedNormal class definition
class alarmUnacknowledgedNormalAttrib: public Tango::SpectrumAttr
{
public:
unacknowledgedNormalAlarmsAttrib():SpectrumAttr("unacknowledgedNormalAlarms",
alarmUnacknowledgedNormalAttrib():SpectrumAttr("alarmUnacknowledgedNormal",
Tango::DEV_STRING, Tango::READ, 10000) {};
~unacknowledgedNormalAlarmsAttrib() {};
~alarmUnacknowledgedNormalAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_unacknowledgedNormalAlarms(att);}
{(static_cast<AlarmHandler *>(dev))->read_alarmUnacknowledgedNormal(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_unacknowledgedNormalAlarms_allowed(ty);}
{return (static_cast<AlarmHandler *>(dev))->is_alarmUnacknowledgedNormal_allowed(ty);}
};
// Attribute shelvedAlarms class definition
class shelvedAlarmsAttrib: public Tango::SpectrumAttr
// Attribute alarmShelved class definition
class alarmShelvedAttrib: public Tango::SpectrumAttr
{
public:
shelvedAlarmsAttrib():SpectrumAttr("shelvedAlarms",
alarmShelvedAttrib():SpectrumAttr("alarmShelved",
Tango::DEV_STRING, Tango::READ, 10000) {};
~shelvedAlarmsAttrib() {};
~alarmShelvedAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_shelvedAlarms(att);}
{(static_cast<AlarmHandler *>(dev))->read_alarmShelved(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_shelvedAlarms_allowed(ty);}
{return (static_cast<AlarmHandler *>(dev))->is_alarmShelved_allowed(ty);}
};
// Attribute outOfServiceAlarms class definition
class outOfServiceAlarmsAttrib: public Tango::SpectrumAttr
// Attribute alarmOutOfService class definition
class alarmOutOfServiceAttrib: public Tango::SpectrumAttr
{
public:
outOfServiceAlarmsAttrib():SpectrumAttr("outOfServiceAlarms",
alarmOutOfServiceAttrib():SpectrumAttr("alarmOutOfService",
Tango::DEV_STRING, Tango::READ, 10000) {};
~outOfServiceAlarmsAttrib() {};
~alarmOutOfServiceAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_outOfServiceAlarms(att);}
{(static_cast<AlarmHandler *>(dev))->read_alarmOutOfService(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_outOfServiceAlarms_allowed(ty);}
{return (static_cast<AlarmHandler *>(dev))->is_alarmOutOfService_allowed(ty);}
};
// Attribute silencedAlarms class definition
class silencedAlarmsAttrib: public Tango::SpectrumAttr
// Attribute alarmSilenced class definition
class alarmSilencedAttrib: public Tango::SpectrumAttr
{
public:
silencedAlarmsAttrib():SpectrumAttr("silencedAlarms",
alarmSilencedAttrib():SpectrumAttr("alarmSilenced",
Tango::DEV_STRING, Tango::READ, 10000) {};
~silencedAlarmsAttrib() {};
~alarmSilencedAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_silencedAlarms(att);}
{(static_cast<AlarmHandler *>(dev))->read_alarmSilenced(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_silencedAlarms_allowed(ty);}
{return (static_cast<AlarmHandler *>(dev))->is_alarmSilenced_allowed(ty);}
};
// Attribute listAlarms class definition
class listAlarmsAttrib: public Tango::SpectrumAttr
// Attribute alarmList class definition
class alarmListAttrib: public Tango::SpectrumAttr
{
public:
listAlarmsAttrib():SpectrumAttr("listAlarms",
alarmListAttrib():SpectrumAttr("alarmList",
Tango::DEV_STRING, Tango::READ, 10000) {};
~listAlarmsAttrib() {};
~alarmListAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_listAlarms(att);}
{(static_cast<AlarmHandler *>(dev))->read_alarmList(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_listAlarms_allowed(ty);}
{return (static_cast<AlarmHandler *>(dev))->is_alarmList_allowed(ty);}
};
// Attribute frequencyAlarms class definition
class frequencyAlarmsAttrib: public Tango::SpectrumAttr
// Attribute alarmFrequency class definition
class alarmFrequencyAttrib: public Tango::SpectrumAttr
{
public:
frequencyAlarmsAttrib():SpectrumAttr("frequencyAlarms",
alarmFrequencyAttrib():SpectrumAttr("alarmFrequency",
Tango::DEV_DOUBLE, Tango::READ, 10000) {};
~frequencyAlarmsAttrib() {};
~alarmFrequencyAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_frequencyAlarms(att);}
{(static_cast<AlarmHandler *>(dev))->read_alarmFrequency(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_frequencyAlarms_allowed(ty);}
{return (static_cast<AlarmHandler *>(dev))->is_alarmFrequency_allowed(ty);}
};
// Attribute alarmSummary class definition
class alarmSummaryAttrib: public Tango::SpectrumAttr
{
public:
alarmSummaryAttrib():SpectrumAttr("alarmSummary",
Tango::DEV_STRING, Tango::READ, 10000) {};
~alarmSummaryAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_alarmSummary(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_alarmSummary_allowed(ty);}
};
// Attribute eventList class definition
class eventListAttrib: public Tango::SpectrumAttr
{
public:
eventListAttrib():SpectrumAttr("eventList",
Tango::DEV_STRING, Tango::READ, 10000) {};
~eventListAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_eventList(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty)
{return (static_cast<AlarmHandler *>(dev))->is_eventList_allowed(ty);}
};
// Attribute eventSummary class definition
class eventSummaryAttrib: public Tango::SpectrumAttr
{
public:
eventSummaryAttrib():SpectrumAttr("eventSummary",
Tango::DEV_STRING, Tango::READ, 10000) {};
~eventSummaryAttrib() {};
virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att)
{(static_cast<AlarmHandler *>(dev))->read_eventSummary(att);}
virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType 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);}
};
......@@ -499,6 +551,75 @@ public:
{return (static_cast<AlarmHandler *>(dev))->is_ResetStatistics_allowed(any);}
};
// Command StopNew class definition
class StopNewClass : public Tango::Command
{
public:
StopNewClass(const char *name,
Tango::CmdArgType in,
Tango::CmdArgType out,
const char *in_desc,
const char *out_desc,
Tango::DispLevel level)
:Command(name,in,out,in_desc,out_desc, level) {};
StopNewClass(const char *name,
Tango::CmdArgType in,
Tango::CmdArgType out)
:Command(name,in,out) {};
~StopNewClass() {};
virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any);
virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any)
{return (static_cast<AlarmHandler *>(dev))->is_StopNew_allowed(any);}
};
// Command GetAlarmInfo class definition
class GetAlarmInfoClass : public Tango::Command
{
public:
GetAlarmInfoClass(const char *name,
Tango::CmdArgType in,
Tango::CmdArgType out,
const char *in_desc,
const char *out_desc,
Tango::DispLevel level)
:Command(name,in,out,in_desc,out_desc, level) {};
GetAlarmInfoClass(const char *name,
Tango::CmdArgType in,
Tango::CmdArgType out)
:Command(name,in,out) {};
~GetAlarmInfoClass() {};
virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any);
virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any)
{return (static_cast<AlarmHandler *>(dev))->is_GetAlarmInfo_allowed(any);}
};
// Command ReLoadAll class definition
class ReLoadAllClass : public Tango::Command
{
public:
ReLoadAllClass(const char *name,
Tango::CmdArgType in,
Tango::CmdArgType out,
const char *in_desc,
const char *out_desc,
Tango::DispLevel level)
:Command(name,in,out,in_desc,out_desc, level) {};
ReLoadAllClass(const char *name,
Tango::CmdArgType in,
Tango::CmdArgType out)
:Command(name,in,out) {};
~ReLoadAllClass() {};
virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any);
virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any)
{return (static_cast<AlarmHandler *>(dev))->is_ReLoadAll_allowed(any);}
};
/**
* The AlarmHandlerClass singleton definition
......@@ -515,6 +636,18 @@ class AlarmHandlerClass : public Tango::DeviceClass
/*----- PROTECTED REGION END -----*/ // AlarmHandlerClass::Additionnal DServer data members
// Class properties data members
public:
// GroupNames: Labels for Group mask, first is for mask 0x00
vector<string> groupNames;
// SubscribeRetryPeriod: Retry subscription period in seconds
Tango::DevLong subscribeRetryPeriod;
// StatisticsTimeWindow: Time window to compute statistics in seconds
vector<Tango::DevLong> statisticsTimeWindow;
// ErrorDelay: Delay in seconds before changing to ERROR state after an exception is received.
Tango::DevULong errorDelay;
// SetAlarmQuality: Set alarm attribute quality as computed using quality of attributes in the formula
Tango::DevBoolean setAlarmQuality;
public:
// write class properties data members
Tango::DbData cl_prop;
......
......@@ -107,6 +107,7 @@ void AlarmHandler::add_AlarmState_dynamic_attribute(string attname)
labels.push_back("SHLVD");
labels.push_back("DSUPR");
labels.push_back("OOSRV");
labels.push_back("ERROR");
alarmstate_prop.set_enum_labels(labels);
}
alarmstate->set_default_properties(alarmstate_prop);
......@@ -127,7 +128,7 @@ void AlarmHandler::add_AlarmState_dynamic_attribute(string attname)
//--------------------------------------------------------
void AlarmHandler::remove_AlarmState_dynamic_attribute(string attname)
{
remove_attribute(attname, true);
remove_attribute(attname, true, Tango::Util::instance()->_UseDb);
map<string,Tango::DevEnum>::iterator ite;
if ((ite=AlarmState_data.find(attname))!=AlarmState_data.end())
{
......@@ -172,8 +173,8 @@ void AlarmHandler::add_AlarmFormula_dynamic_attribute(string attname)
// Not Polled
alarmformula->set_disp_level(Tango::OPERATOR);
// Not Memorized
alarmformula->set_change_event(true, false);
alarmformula->set_archive_event(true, false);
alarmformula->set_change_event(true, true);
alarmformula->set_archive_event(true, true);
char array[1];
array[0] = '\0';
AlarmFormula_data.insert(make_pair(attname, array));
......@@ -188,7 +189,7 @@ void AlarmHandler::add_AlarmFormula_dynamic_attribute(string attname)
//--------------------------------------------------------
void AlarmHandler::remove_AlarmFormula_dynamic_attribute(string attname)
{
remove_attribute(attname, true);
remove_attribute(attname, true, Tango::Util::instance()->_UseDb);
map<string,Tango::DevString>::iterator ite;
if ((ite=AlarmFormula_data.find(attname))!=AlarmFormula_data.end())
{
......
......@@ -46,17 +46,17 @@ namespace AlarmHandler_ns
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_audibleAlarm_allowed()
* Description : Execution allowed for audibleAlarm attribute
* Method : AlarmHandler::is_alarmAudible_allowed()
* Description : Execution allowed for alarmAudible attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_audibleAlarm_allowed(TANGO_UNUSED(Tango::AttReqType type))
bool AlarmHandler::is_alarmAudible_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for audibleAlarm attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::audibleAlarmStateAllowed_READ) ENABLED START -----*/
// Not any excluded states for alarmAudible attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmAudibleStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::audibleAlarmStateAllowed_READ
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmAudibleStateAllowed_READ
return true;
}
......@@ -94,145 +94,209 @@ bool AlarmHandler::is_alarm_allowed(TANGO_UNUSED(Tango::AttReqType type))
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_normalAlarms_allowed()
* Description : Execution allowed for normalAlarms attribute
* Method : AlarmHandler::is_alarmNormal_allowed()
* Description : Execution allowed for alarmNormal attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_normalAlarms_allowed(TANGO_UNUSED(Tango::AttReqType type))
bool AlarmHandler::is_alarmNormal_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for normalAlarms attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::normalAlarmsStateAllowed_READ) ENABLED START -----*/
// Not any excluded states for alarmNormal attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmNormalStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::normalAlarmsStateAllowed_READ
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmNormalStateAllowed_READ
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_unacknowledgedAlarms_allowed()
* Description : Execution allowed for unacknowledgedAlarms attribute
* Method : AlarmHandler::is_alarmUnacknowledged_allowed()
* Description : Execution allowed for alarmUnacknowledged attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_unacknowledgedAlarms_allowed(TANGO_UNUSED(Tango::AttReqType type))
bool AlarmHandler::is_alarmUnacknowledged_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for unacknowledgedAlarms attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::unacknowledgedAlarmsStateAllowed_READ) ENABLED START -----*/
// Not any excluded states for alarmUnacknowledged attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmUnacknowledgedStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::unacknowledgedAlarmsStateAllowed_READ
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmUnacknowledgedStateAllowed_READ
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_acknowledgedAlarms_allowed()
* Description : Execution allowed for acknowledgedAlarms attribute
* Method : AlarmHandler::is_alarmAcknowledged_allowed()
* Description : Execution allowed for alarmAcknowledged attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_acknowledgedAlarms_allowed(TANGO_UNUSED(Tango::AttReqType type))
bool AlarmHandler::is_alarmAcknowledged_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for acknowledgedAlarms attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::acknowledgedAlarmsStateAllowed_READ) ENABLED START -----*/
// Not any excluded states for alarmAcknowledged attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmAcknowledgedStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::acknowledgedAlarmsStateAllowed_READ
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmAcknowledgedStateAllowed_READ
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_unacknowledgedNormalAlarms_allowed()
* Description : Execution allowed for unacknowledgedNormalAlarms attribute
* Method : AlarmHandler::is_alarmUnacknowledgedNormal_allowed()
* Description : Execution allowed for alarmUnacknowledgedNormal attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_unacknowledgedNormalAlarms_allowed(TANGO_UNUSED(Tango::AttReqType type))
bool AlarmHandler::is_alarmUnacknowledgedNormal_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for unacknowledgedNormalAlarms attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::unacknowledgedNormalAlarmsStateAllowed_READ) ENABLED START -----*/
// Not any excluded states for alarmUnacknowledgedNormal attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmUnacknowledgedNormalStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::unacknowledgedNormalAlarmsStateAllowed_READ
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmUnacknowledgedNormalStateAllowed_READ
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_shelvedAlarms_allowed()
* Description : Execution allowed for shelvedAlarms attribute
* Method : AlarmHandler::is_alarmShelved_allowed()
* Description : Execution allowed for alarmShelved attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_shelvedAlarms_allowed(TANGO_UNUSED(Tango::AttReqType type))
bool AlarmHandler::is_alarmShelved_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for shelvedAlarms attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::shelvedAlarmsStateAllowed_READ) ENABLED START -----*/
// Not any excluded states for alarmShelved attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmShelvedStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::shelvedAlarmsStateAllowed_READ
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmShelvedStateAllowed_READ
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_outOfServiceAlarms_allowed()
* Description : Execution allowed for outOfServiceAlarms attribute
* Method : AlarmHandler::is_alarmOutOfService_allowed()
* Description : Execution allowed for alarmOutOfService attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_outOfServiceAlarms_allowed(TANGO_UNUSED(Tango::AttReqType type))
bool AlarmHandler::is_alarmOutOfService_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for outOfServiceAlarms attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::outOfServiceAlarmsStateAllowed_READ) ENABLED START -----*/
// Not any excluded states for alarmOutOfService attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmOutOfServiceStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::outOfServiceAlarmsStateAllowed_READ
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmOutOfServiceStateAllowed_READ
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_silencedAlarms_allowed()
* Description : Execution allowed for silencedAlarms attribute
* Method : AlarmHandler::is_alarmSilenced_allowed()
* Description : Execution allowed for alarmSilenced attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_silencedAlarms_allowed(TANGO_UNUSED(Tango::AttReqType type))
bool AlarmHandler::is_alarmSilenced_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for silencedAlarms attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::silencedAlarmsStateAllowed_READ) ENABLED START -----*/
// Not any excluded states for alarmSilenced attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmSilencedStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::silencedAlarmsStateAllowed_READ
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmSilencedStateAllowed_READ
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_listAlarms_allowed()
* Description : Execution allowed for listAlarms attribute
* Method : AlarmHandler::is_alarmList_allowed()
* Description : Execution allowed for alarmList attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_listAlarms_allowed(TANGO_UNUSED(Tango::AttReqType type))
bool AlarmHandler::is_alarmList_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for listAlarms attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::listAlarmsStateAllowed_READ) ENABLED START -----*/
// Not any excluded states for alarmList attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmListStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::listAlarmsStateAllowed_READ
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmListStateAllowed_READ
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_frequencyAlarms_allowed()
* Description : Execution allowed for frequencyAlarms attribute
* Method : AlarmHandler::is_alarmFrequency_allowed()
* Description : Execution allowed for alarmFrequency attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_frequencyAlarms_allowed(TANGO_UNUSED(Tango::AttReqType type))
bool AlarmHandler::is_alarmFrequency_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for frequencyAlarms attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::frequencyAlarmsStateAllowed_READ) ENABLED START -----*/
// Not any excluded states for alarmFrequency attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmFrequencyStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::frequencyAlarmsStateAllowed_READ
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmFrequencyStateAllowed_READ
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_alarmSummary_allowed()
* Description : Execution allowed for alarmSummary attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_alarmSummary_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for alarmSummary attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::alarmSummaryStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::alarmSummaryStateAllowed_READ
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_eventList_allowed()
* Description : Execution allowed for eventList attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_eventList_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for eventList attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::eventListStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::eventListStateAllowed_READ
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_eventSummary_allowed()
* Description : Execution allowed for eventSummary attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_eventSummary_allowed(TANGO_UNUSED(Tango::AttReqType type))
{
// Not any excluded states for eventSummary attribute in read access.
/*----- PROTECTED REGION ID(AlarmHandler::eventSummaryStateAllowed_READ) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::eventSummaryStateAllowed_READ
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;
}
......@@ -438,6 +502,51 @@ bool AlarmHandler::is_ResetStatistics_allowed(TANGO_UNUSED(const CORBA::Any &any
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_StopNew_allowed()
* Description : Execution allowed for StopNew attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_StopNew_allowed(TANGO_UNUSED(const CORBA::Any &any))
{
// Not any excluded states for StopNew command.
/*----- PROTECTED REGION ID(AlarmHandler::StopNewStateAllowed) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::StopNewStateAllowed
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_GetAlarmInfo_allowed()
* Description : Execution allowed for GetAlarmInfo attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_GetAlarmInfo_allowed(TANGO_UNUSED(const CORBA::Any &any))
{
// Not any excluded states for GetAlarmInfo command.
/*----- PROTECTED REGION ID(AlarmHandler::GetAlarmInfoStateAllowed) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::GetAlarmInfoStateAllowed
return true;
}
//--------------------------------------------------------
/**
* Method : AlarmHandler::is_ReLoadAll_allowed()
* Description : Execution allowed for ReLoadAll attribute
*/
//--------------------------------------------------------
bool AlarmHandler::is_ReLoadAll_allowed(TANGO_UNUSED(const CORBA::Any &any))
{
// Not any excluded states for ReLoadAll command.
/*----- PROTECTED REGION ID(AlarmHandler::ReLoadAllStateAllowed) ENABLED START -----*/
/*----- PROTECTED REGION END -----*/ // AlarmHandler::ReLoadAllStateAllowed
return true;
}
/*----- PROTECTED REGION ID(AlarmHandler::AlarmHandlerStateAllowed.AdditionalMethods) ENABLED START -----*/
......
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 @@
// (Program Obviously used to Generate tango Object)
//=============================================================================
#include <tango.h>
#include <tango/tango.h>
#include <AlarmHandlerClass.h>
// 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 "event_table.h"
......@@ -53,7 +10,7 @@ namespace AlarmHandler_ns
SubscribeThread::SubscribeThread(AlarmHandler *dev):Tango::LogAdapter(dev)
{
alarm_dev = dev;
period = 1;
period = 10; //TODO: configurable
shared = dev->events;
}
//=============================================================================
......@@ -64,22 +21,33 @@ void SubscribeThread::updateProperty()
}
//=============================================================================
//=============================================================================
void SubscribeThread::signal()
{
shared->signal();
}
//=============================================================================
//=============================================================================
void *SubscribeThread::run_undetached(void *ptr)
{
INFO_STREAM << "SubscribeThread id="<<omni_thread::self()->id()<<endl;
while(shared->get_if_stop()==false)
{
// Try to subscribe
usleep(500000); //TODO: try to delay a bit subscribe_events
if(shared->get_if_stop())
break;
DEBUG_STREAM << "SubscribeThread::"<<__func__<<": AWAKE"<<endl;
updateProperty();
alarm_dev->events->subscribe_events();
int nb_to_subscribe = shared->nb_sig_to_subscribe();
shared->check_signal_property(); //check if, while subscribing, new alarms to be saved in properties where added (update action)
// And wait a bit before next time or
// wait a long time if all signals subscribed
{
omni_mutex_lock sync(*shared);
//shared->lock();
if (nb_to_subscribe==0 && shared->action == NOTHING)
int act=shared->action.load();
if (nb_to_subscribe==0 && act == NOTHING)
{
DEBUG_STREAM << "SubscribeThread::"<<__func__<<": going to wait nb_to_subscribe=0"<<endl;
//shared->condition.wait();
......@@ -97,7 +65,7 @@ void *SubscribeThread::run_undetached(void *ptr)
//shared->unlock();
}
}
shared->unsubscribe_events();
//shared->unsubscribe_events();
INFO_STREAM <<"SubscribeThread::"<< __func__<<": exiting..."<<endl;
return NULL;
}
......
//=============================================================================
//
// 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
#define _SUBSCRIBE_THREAD_H
#include <tango.h>
#include <eventconsumer.h>
#include <tango/tango.h>
#include <stdint.h>
#include "event_table.h"
/**
* @author $Author: graziano $
* @version $Revision: 1.5 $
*/
// constants definitions here.
//-----------------------------------------------
// constants definitions here.
//-----------------------------------------------
namespace AlarmHandler_ns
{
......@@ -82,6 +38,7 @@ public:
int period;
SubscribeThread(AlarmHandler *dev);
void updateProperty();
void signal();
/**
* Execute the thread loop.
* This thread is awaken when a command has been received
......
/*
* 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
* Strada Statale 14 - km 163,5 in AREA Science Park
* 34012 Basovizza, Trieste ITALY
......@@ -36,7 +14,7 @@ static const char __FILE__rev[] = __FILE__ " $Revision: 1.7 $";
*/
alarm_thread::alarm_thread(AlarmHandler_ns::AlarmHandler *p) : p_Alarm(p)
{
//cout << __FILE__rev << endl;
//TANGO_LOG << __FILE__rev << endl;
}
/*
......@@ -56,6 +34,20 @@ void alarm_thread::run(void *)
//int period = 5; //seconds
int awaken = 0;
vector<string> alm_to_be_eval;
bool starting = true;
timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
double last_eval = (now.tv_sec) + ((double)(now.tv_nsec))/1000000000;
while(starting)
{
starting = Tango::Util::instance()->is_svr_starting();
usleep(200000);
}
alm_to_be_eval = p_Alarm->alarms.to_be_evaluated_list();
to_be_evaluated = alm_to_be_eval.size();
while (true) {
/*
* pop_front() will wait() on condition variable
......@@ -64,39 +56,45 @@ void alarm_thread::run(void *)
{
if(to_be_evaluated > 0)
{
bool changed = true;
int num_changed = 0;
if(alm_to_be_eval.size() > 0)
clock_gettime(CLOCK_MONOTONIC, &now);
double dnow = (now.tv_sec) + ((double)(now.tv_nsec))/1000000000;
if(dnow - last_eval > 10) //TODO: configurable
{
for(vector<string>::iterator i = alm_to_be_eval.begin(); i != alm_to_be_eval.end(); i++)
last_eval = dnow;
bool changed = true;
int num_changed = 0;
if(alm_to_be_eval.size() > 0)
{
changed = p_Alarm->do_alarm_eval(*i, "FORCED_EVAL", gettime());
if(changed)
num_changed++;
}
for(vector<string>::iterator i = alm_to_be_eval.begin(); i != alm_to_be_eval.end(); i++)
{
changed = p_Alarm->do_alarm_eval(*i, "FORCED_EVAL", gettime());
if(changed)
num_changed++;
}
#if 0 //TODO
prepare_alarm_attr();
if(num_changed==0)
return;
if(ds_num == 0)
{
//attr.set_value_date_quality(ds,0/*gettime()*/,Tango::ATTR_WARNING, ds_num, 0, false);
struct timeval now;
gettimeofday(&now,NULL);
push_change_event("alarm",(char**)ds,now,Tango::ATTR_WARNING, ds_num, 0, false);
}
else
//attr.set_value(ds, ds_num, 0, false);
push_change_event("alarm",ds, ds_num, 0, false);
prepare_alarm_attr();
if(num_changed==0)
return;
if(ds_num == 0)
{
//attr.set_value_date_quality(ds,0/*gettime()*/,Tango::ATTR_WARNING, ds_num, 0, false);
struct timeval now;
gettimeofday(&now,NULL);
push_change_event("alarm",(char**)ds,now,Tango::ATTR_WARNING, ds_num, 0, false);
}
else
//attr.set_value(ds, ds_num, 0, false);
push_change_event("alarm",ds, ds_num, 0, false);
#endif
}
#if 0
alm_to_be_eval = p_Alarm->alarms.to_be_evaluated_list();
to_be_evaluated = alm_to_be_eval.size();
}
#if 1
alm_to_be_eval = p_Alarm->alarms.to_be_evaluated_list();
to_be_evaluated = alm_to_be_eval.size();
#else
to_be_evaluated = 0;
to_be_evaluated = 0;
#endif
usleep(200000); //TODO
//usleep(200000); //TODO
}
}
bei_t e;
{
......@@ -122,21 +120,21 @@ void alarm_thread::run(void *)
ostringstream err;
err << "omni_thread_fatal exception running alarm thread, err=" << ex.error << ends;
//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)
{
ostringstream err;
err << "exception running alarm thread: '" << ex.errors[0].desc << "'" << ends;
//WARN_STREAM << "alarm_thread::run(): " << err.str() << endl;
printf("alarm_thread::run(): %s", err.str().c_str());
Tango::Except::print_exception(ex);
printf("alarm_thread::run(): %s\n", err.str().c_str());
//Tango::Except::print_exception(ex);
}
catch(...)
{
//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.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
* Strada Statale 14 - km 163,5 in AREA Science Park
* 34012 Basovizza, Trieste ITALY
......@@ -20,7 +10,7 @@
#define ALARM_THREAD_H
#include <omnithread.h>
#include <tango.h>
#include <tango/tango.h>
#include <AlarmHandler.h>
#define ALARM_THREAD_EXIT "alarm_thread_exit"
......
/*
* alarm_grammar.h
*
* $Author: $
*
* $Revision: $
*
* $Log: alarm_grammar.h,v $
*
*
* copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale
* Strada Statale 14 - km 163,5 in AREA Science Park
* 34012 Basovizza, Trieste ITALY
......@@ -67,17 +60,35 @@
#include "event_table.h"
#include "formula_grammar.h"
#define NAME_KEY "name"
#define NAME_KEY "tag"
#define FORMULA_KEY "formula"
#define ONDELAY_KEY "on_delay"
#define OFFDELAY_KEY "off_delay"
#define LEVEL_KEY "level"
#define SILENT_TIME_KEY "silent_time"
#define LEVEL_KEY "priority"
#define SILENT_TIME_KEY "shlvd_time"
#define GROUP_KEY "group"
#define MESSAGE_KEY "message"
#define URL_KEY "url"
#define ON_COMMAND_KEY "on_command"
#define OFF_COMMAND_KEY "off_command"
#define RECEIVERS_KEY "receivers"
#define ENABLED_KEY "enabled"
#define SILENT_TIME_REMAINING_KEY "shlvd_end"
#define SHELVED_KEY "shelved"
#define ACKNOWLEDGED_KEY "ack"
#define ATTR_VALUES_KEY "values"
#define VALUE_KEY "state"
#define ON_COUNTER_KEY "on_counter"
#define OFF_COUNTER_KEY "off_counter"
#define COUNTER_KEY "counter"
#define QUALITY_KEY "quality"
#define EXCEPTION_KEY "exception"
#define AUDIBLE_KEY "audible"
#define FREQ_COUNTER_KEY "freq_counter"
#define ALARM_TIME_KEY "time"
#define EVENT_KEY "event"
#define EVENT_TIME_KEY ALARM_TIME_KEY
#define KEY(S_VAL) S_VAL "="
#define SEP ";"
......@@ -208,8 +219,10 @@ struct alarm_parse : public grammar<alarm_parse>
no_node_d[separator] >> no_node_d[silent_time] |
no_node_d[separator] >> no_node_d[group] |
no_node_d[separator] >> no_node_d[msg] |
no_node_d[separator] >> no_node_d[url] |
no_node_d[separator] >> no_node_d[on_command] |
no_node_d[separator] >> no_node_d[off_command] |
no_node_d[separator] >> no_node_d[receivers] |
no_node_d[separator] >> no_node_d[enabled]
;
......@@ -218,7 +231,7 @@ struct alarm_parse : public grammar<alarm_parse>
= alnum_p | '.' | '_' | '-' | '+' //any alpha numeric char plus '.', '_', '-', '+'
;
symbol_attr_name
= alnum_p | '_' //any alpha numeric char plus '_'
= alnum_p | '.' | '_' | '-' //any alpha numeric char plus '_'
;
name
= (+symbol) >> '/' >> (+symbol)
......@@ -232,7 +245,7 @@ struct alarm_parse : public grammar<alarm_parse>
= discard_node_d[str_p(KEY(LEVEL_KEY))] >>
//lexeme_d[(+alnum_p)] //match only possible levels?? (fault, log, ...)
//(+(alnum_p-'\t'))
(str_p("fault") | str_p("warning") | str_p("log"))
(str_p("highest") | str_p("high") | str_p("medium") | str_p("lowest") | str_p("low") | str_p("fault") | str_p("warning") | str_p("log"))//TODO
[
assign_a(self.m_alarm.lev) //save level in alarm_t
]
......@@ -253,15 +266,26 @@ struct alarm_parse : public grammar<alarm_parse>
)
;
//------------------------------MESSAGE--------------------------------------
escChar = (ch_p('\\') | ch_p(';')) >> ch_p(';'); //escaped semicolon: "\;" or ";;"
msg
= discard_node_d[str_p(KEY(MESSAGE_KEY))]
//>> ch_p('"')
>> (+(anychar_p - ';')) //one ore more char except ';'
>> (+(escChar | (anychar_p - ';'))) //one ore more char except ';'
[
assign_a(self.m_alarm.msg)
]
//>> '"'
;
//------------------------------URL--------------------------------------
url
= discard_node_d[str_p(KEY(URL_KEY))]
//>> ch_p('"')
>> (*(escChar | (anychar_p - ';'))) //zero ore more char except ';'
[
assign_a(self.m_alarm.url)
]
//>> '"'
;
//---------------------------ON DELAY----------------------------------------
on_delay
= discard_node_d[str_p(KEY(ONDELAY_KEY))] >>
......@@ -313,6 +337,16 @@ struct alarm_parse : public grammar<alarm_parse>
] //discard_node_d
| epsilon_p)
;
//------------------------------RECEIVERS------------------------------------
receivers
= discard_node_d[str_p(KEY(RECEIVERS_KEY))]
//>> ch_p('"')
>> (*(escChar | (anychar_p - ';'))) //zero ore more char except ';'
[
assign_a(self.m_alarm.receivers)
]
//>> '"'
;
//------------------------------ENABLED----------------------------------------
enabled
= discard_node_d[str_p(KEY(ENABLED_KEY))] >>
......@@ -332,7 +366,7 @@ struct alarm_parse : public grammar<alarm_parse>
rule_t expression, event, option;
rule<typename lexeme_scanner<ScannerT>::type> symbol; //needed to use lexeme_d in rule name
rule<typename lexeme_scanner<ScannerT>::type> symbol_attr_name; //needed to use lexeme_d in rule name
rule_t name, name_alm, val, token, oper, msg, group, level, on_delay, off_delay, silent_time, on_command, off_command, enabled, separator;
rule_t name, name_alm, val, token, oper, msg, url, group, level, on_delay, off_delay, silent_time, on_command, off_command, receivers, enabled, separator,escChar;
formula_grammar formula;
rule_t const&
......
/*
* alarm_table.cpp
*
* $Author: graziano $
*
* $Revision: 1.5 $
*
* $Log: alarm_table.cpp,v $
*
*
* copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale
* Strada Statale 14 - km 163,5 in AREA Science Park
* 34012 Basovizza, Trieste ITALY
*/
#include <sys/time.h>
#include <tango.h>
#include <tango/tango.h>
#include "alarm_table.h"
#include "alarm_grammar.h"
#include "cmd_thread.h"
#include <regex>
static const char __FILE__rev[] = __FILE__ " $Revision: 1.5 $";
......@@ -25,22 +19,6 @@ static const char __FILE__rev[] = __FILE__ " $Revision: 1.5 $";
/*
* alarm_t class methods
*/
alarm_t::alarm_t()
{
grp=0;
on_counter=0;
off_counter=0;
freq_counter=0;
stat = S_NORMAL;
ack = ACK;
on_delay = 0;
off_delay = 0;
silent_time = -1;
cmd_name_a=string("");
cmd_name_n=string("");
enabled=true;
shelved=false;
}
bool alarm_t::operator==(const alarm_t &that)
{
......@@ -59,7 +37,13 @@ void alarm_t::str2alm(const string &s)
istringstream is(s);
ostringstream temp_msg;
string temp_grp;
is >> ts.tv_sec >> ts.tv_usec >> name >> stat >> ack >> on_counter >> lev >> silent_time >> temp_grp >> msg; //stop at first white space in msg
unsigned int on_cnt;
is >> ts.tv_sec >> ts.tv_usec >> name >> stat >> ack >> on_cnt >> lev >> silent_time >> temp_grp >> msg; //stop at first white space in msg
#ifdef _CNT_ATOMIC
on_counter.store(on_cnt);
#else
on_counter = on_cnt;
#endif
temp_msg << is.rdbuf(); //read all remaining characters as msg
msg += temp_msg.str();
str2grp(temp_grp);
......@@ -69,8 +53,13 @@ string alarm_t::alm2str(void)
{
ostringstream os;
os.clear();
#ifdef _CNT_ATOMIC
os << ts.tv_sec << "\t" << ts.tv_usec << "\t" << name << "\t" \
<< stat << "\t" << ack << "\t" << on_counter.load() << "\t" << lev << "\t" << silent_time << "\t" << grp2str() << "\t" << msg << ends;
#else
os << ts.tv_sec << "\t" << ts.tv_usec << "\t" << name << "\t" \
<< stat << "\t" << ack << "\t" << on_counter << "\t" << lev << "\t" << silent_time << "\t" << grp2str() << "\t" << msg << ends;
#endif
return(os.str());
}
......@@ -188,8 +177,10 @@ void alarm_t::confstr(string &s)
KEY(SILENT_TIME_KEY)<<silent_time << SEP <<
KEY(GROUP_KEY)<< grp2str() << SEP <<
KEY(MESSAGE_KEY)<< msg << SEP <<
KEY(URL_KEY)<< url << SEP <<
KEY(ON_COMMAND_KEY)<< cmd_name_a << SEP <<
KEY(OFF_COMMAND_KEY)<< cmd_name_n << SEP <<
KEY(RECEIVERS_KEY)<< receivers << SEP <<
KEY(ENABLED_KEY)<< (enabled ? "1" : "0");
s = conf.str();
}
......@@ -339,7 +330,7 @@ void alarm_table::stored(vector<alarm_t>& a)
bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_t res, string &attr_values, string grp, string msg, string formula)
{
bool ret_changed=false;
//Tango::TimeVal now = gettime();
Tango::TimeVal now = gettime();
TangoSys_MemStream out_stream;
vlock->readerIn();
alarm_container_t::iterator found = v_alarm.find(alm_name);
......@@ -363,21 +354,34 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_
found->second.ack = ACK;
}
}
found->second.quality = res.quality;
bool status_err_delay;
if(err_delay > 0)
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
status_err_delay = (!res.valid);
found->second.ex_reason = res.ex_reason;
found->second.ex_desc = res.ex_desc;
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;
if(found->second.on_delay > 0) //if enabled on delay
status_on_delay = ((int)(res.value)) && (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
status_on_delay = (int)(res.value);
status_on_delay = (bool)(!res.value.empty() && res.value[0] != 0);
bool status_off_delay;
if(found->second.off_delay > 0) //if enabled off delay
status_off_delay = (!(int)(res.value)) && (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
status_off_delay = !(int)(res.value);
status_off_delay = !(bool)(!res.value.empty() && res.value[0] != 0);
//if status changed:
// - from S_NORMAL to S_ALARM considering also on delay
//or
......@@ -385,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)))
{
ret_changed=true;
if((int)(res.value))
if((bool)(!res.value.empty() && res.value[0] != 0))
found->second.ack = NOT_ACK; //if changing from NORMAL to ALARM -> NACK
//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
if((int)(res.value))
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
if(found->second.dp_a && ((ts.tv_sec - startup_complete.tv_sec) > 10)) //action from S_NORMAL to S_ALARM
......@@ -426,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(), ';' , ',');
string tmp_msg = msg;
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;
arg.cmd_id = CMD_COMMAND;
arg.dp_add = (long)found->second.dp_a;
......@@ -472,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(), ';' , ',');
string tmp_msg = msg;
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;
arg.cmd_id = CMD_COMMAND;
arg.dp_add = (long)found->second.dp_n;
......@@ -491,14 +507,40 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_
else if (status_off_delay) {
found->second.stat = S_NORMAL;
}
//if error changed:
// - from false to true considering also err delay
//or
// - from true to false
if((status_err_delay && !found->second.error) || (!status_err_delay))
{
ret_changed=true;
}
if(status_err_delay)
{
if(!found->second.error)
{
found->second.is_new = 1;
found->second.ack = NOT_ACK;
}
found->second.error = true;
}
if((int)(res.value)) {
if((bool)(!res.value.empty() && res.value[0] != 0)) {
found->second.on_counter++;
found->second.off_counter = 0;
} else {
found->second.on_counter = 0;
found->second.off_counter++;
}
if(!res.valid)
{
found->second.err_counter++;
}
else
{
found->second.err_counter = 0;
found->second.error = false;
}
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
......@@ -506,7 +548,8 @@ bool alarm_table::update(const string& alm_name, Tango::TimeVal ts, formula_res_
found->second.ts_on_delay = gettime(); //first occurrance of this alarm, now begin to wait for on delay
if(found->second.off_counter == 1)
found->second.ts_off_delay = gettime(); //first occurrance of back to normal, now begin to wait for off delay
if(found->second.err_counter == 1)
found->second.ts_err_delay = gettime(); //first occurrance of this error, now begin to wait for err delay
//found->second.ts = ts; /* store event timestamp into alarm timestamp */ //here update ts everytime
} else {
/*
......@@ -531,8 +574,12 @@ bool alarm_table::timer_update()
{
bool status_on_delay=false;
bool status_off_delay=false;
if(i->second.on_delay == 0 && i->second.off_delay == 0 && !i->second.shelved && i->second.silenced <=0)
continue; //if not enabled on or off delay, nothing to do in timer
bool status_err_delay=false;
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
if(i->second.on_delay == 0 && i->second.off_delay == 0 && err_delay == 0 && !i->second.shelved && i->second.silenced <=0)
continue; //if not enabled on or off delay or not shelved, nothing to do in timer
if(i->second.on_delay > 0) //if enabled on delay
status_on_delay = (i->second.on_counter >= 1) && ((ts.tv_sec - i->second.on_delay) > i->second.ts_on_delay.tv_sec); //waiting for on delay has passed
if(i->second.off_delay > 0) //if enabled off delay
......@@ -562,16 +609,32 @@ bool alarm_table::timer_update()
//if just ended silence time, set ret_changed to true so to push events
//TODO: not interested in executing commands?
if(old_silenced>0 && i->second.silenced == 0)
{
ret_changed = true;
}
//if status changed:
// - from S_NORMAL to S_ALARM considering also on delay
//or
// - from S_ALARM to S_NORMAL considering also off delay
//or
// - from shelved to not shelved
if(status_on_delay && (i->second.stat == S_NORMAL) || (status_off_delay && (i->second.stat == S_ALARM)) || (old_shelved && !i->second.shelved))
if((status_on_delay && (i->second.stat == S_NORMAL)) || (status_off_delay && (i->second.stat == S_ALARM)) || (old_shelved && !i->second.shelved) || (status_err_delay && !i->second.error))
{
if(old_shelved && !i->second.shelved) //TODO: ok to execute on command and off command after shelving ends?
{
status_on_delay = i->second.stat == S_ALARM;
status_off_delay = i->second.stat == S_NORMAL;
}
ret_changed = true;
if(status_err_delay)
{
if(!i->second.error)
{
i->second.is_new = 1;
i->second.ack = NOT_ACK;
}
i->second.error = true;
}
if(status_on_delay)
i->second.ack = NOT_ACK; //if changing from NORMAL to ALARM but not ended shelved time -> NACK
......@@ -612,7 +675,13 @@ bool alarm_table::timer_update()
replace(tmp_attr_val.begin(), tmp_attr_val.end(), ';' , ',');
string tmp_msg = i->second.msg;
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;
arg.cmd_id = CMD_COMMAND;
arg.dp_add = (long)i->second.dp_a;
......@@ -658,7 +727,13 @@ bool alarm_table::timer_update()
replace(tmp_attr_val.begin(), tmp_attr_val.end(), ';' , ',');
string tmp_msg = i->second.msg;
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;
arg.cmd_id = CMD_COMMAND;
arg.dp_add = (long)i->second.dp_n;
......@@ -690,12 +765,20 @@ bool alarm_table::timer_update()
*(i->second.attr_value) = _RTNUN;
try
{
if(i->second.ex_reason.length() == 0)
if(!i->second.error || !i->second.enabled || (i->second.shelved && i->second.silenced > 0))
{
timeval now;
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);
mydev->push_archive_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_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
{
......@@ -772,7 +855,11 @@ vector<string> alarm_table::to_be_evaluated_list()
void alarm_table::new_rwlock()
{
#ifndef _USE_BOOST_LOCK
vlock = new(ReadersWritersLock);
#else
vlock = new rwlock_t("VLOCK");
#endif
}
void alarm_table::del_rwlock()
{
......@@ -793,8 +880,8 @@ void alarm_table::stop_cmdthread()
cmdloop->list.push_back(arg);
}
void alarm_table::save_alarm_conf_db(string att_name, string name, string status, string ack, bool enabled,
string formula, unsigned int on_delay, unsigned int off_delay, string grp, string lev, string msg, string cmd_a, string cmd_n, int silent_time, vector<string> alm_list)
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, const string &receivers, int silent_time)
{
// We want to put properties for attribute "att_name"
Tango::DbDatum dbd_att_name(att_name);
......@@ -806,23 +893,27 @@ void alarm_table::save_alarm_conf_db(string att_name, string name, string status
Tango::DbDatum dbd_silence_time(SILENT_TIME_KEY); //TODO: silent_time
Tango::DbDatum dbd_group(GROUP_KEY);
Tango::DbDatum dbd_message(MESSAGE_KEY);
Tango::DbDatum dbd_url(URL_KEY);
Tango::DbDatum dbd_oncommand(ON_COMMAND_KEY);
Tango::DbDatum dbd_offcommand(OFF_COMMAND_KEY);
Tango::DbDatum dbd_enabled(ENABLED_KEY);
Tango::DbDatum dbd_receivers(RECEIVERS_KEY);
Tango::DbData db_data;
dbd_att_name << 11; // Eleven properties for attribute "att_name"
dbd_name << name;
dbd_formula << formula;
dbd_on_delay << on_delay;
dbd_off_delay << off_delay;
dbd_level << lev;
dbd_silence_time << silent_time;
dbd_group << grp;
dbd_message << msg;
dbd_oncommand << cmd_a;
dbd_offcommand << cmd_n;
dbd_enabled << (enabled ? 1 : 0);
dbd_att_name << (short int)13; // Thirteen properties for attribute "att_name"
dbd_name << name.c_str();
dbd_formula << formula.c_str();
dbd_on_delay << (Tango::DevLong)on_delay;
dbd_off_delay << (Tango::DevLong)off_delay;
dbd_level << lev.c_str();
dbd_silence_time << (Tango::DevLong)silent_time;
dbd_group << grp.c_str();
dbd_message << msg.c_str();
dbd_url << url.c_str();
dbd_oncommand << cmd_a.c_str();
dbd_offcommand << cmd_n.c_str();
dbd_receivers << receivers.c_str();
dbd_enabled << (enabled ? (short int)1 : (short int)0);
db_data.push_back(dbd_att_name);
db_data.push_back(dbd_name);
......@@ -833,9 +924,11 @@ void alarm_table::save_alarm_conf_db(string att_name, string name, string status
db_data.push_back(dbd_silence_time);
db_data.push_back(dbd_group);
db_data.push_back(dbd_message);
db_data.push_back(dbd_url);
db_data.push_back(dbd_oncommand);
db_data.push_back(dbd_offcommand);
db_data.push_back(dbd_enabled);
db_data.push_back(dbd_receivers);
string dev_name(mydev->get_name());
......@@ -843,10 +936,11 @@ void alarm_table::save_alarm_conf_db(string att_name, string name, string status
{
Tango::DbDevice *db_dev = mydev->get_db_device();
db_dev->get_dbase()->put_device_attribute_property(dev_name,db_data);
//Tango::Util::instance()->get_database()->put_device_attribute_property(dev_name,db_data);
}
catch(Tango::DevFailed &e)
{
cout << __func__ << ": Exception saving configuration = " << e.errors[0].desc<<endl;
TANGO_LOG << __func__ << ": Exception saving configuration = " << e.errors[0].desc<<endl;
}
}
......@@ -862,9 +956,11 @@ void alarm_table::delete_alarm_conf_db(string att_name)
Tango::DbDatum dbd_silence_time(SILENT_TIME_KEY); //TODO: silent_time
Tango::DbDatum dbd_group(GROUP_KEY);
Tango::DbDatum dbd_message(MESSAGE_KEY);
Tango::DbDatum dbd_url(URL_KEY);
Tango::DbDatum dbd_oncommand(ON_COMMAND_KEY);
Tango::DbDatum dbd_offcommand(OFF_COMMAND_KEY);
Tango::DbDatum dbd_enabled(ENABLED_KEY);
Tango::DbDatum dbd_receivers(RECEIVERS_KEY);
Tango::DbData db_data;
......@@ -877,9 +973,11 @@ void alarm_table::delete_alarm_conf_db(string att_name)
db_data.push_back(dbd_silence_time);
db_data.push_back(dbd_group);
db_data.push_back(dbd_message);
db_data.push_back(dbd_url);
db_data.push_back(dbd_oncommand);
db_data.push_back(dbd_offcommand);
db_data.push_back(dbd_enabled);
db_data.push_back(dbd_receivers);
string dev_name(mydev->get_name());
......@@ -890,13 +988,12 @@ void alarm_table::delete_alarm_conf_db(string att_name)
}
catch(Tango::DevFailed &e)
{
cout << __func__ << ": Exception deleting " << att_name << " = " << e.errors[0].desc<<endl;
TANGO_LOG << __func__ << ": Exception deleting " << att_name << " = " << e.errors[0].desc<<endl;
}
}
void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> &saved_alarms)
void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> &saved_alarms, ReadersWritersLock *savedlock)
{
saved_alarms.clear();
string dev_name(mydev->get_name());
vector<string> att_list;
......@@ -915,8 +1012,10 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
}
catch(Tango::DevFailed &e)
{
cout << __func__ << ": Exception reading configuration = " << e.errors[0].desc<<endl;
TANGO_LOG << __func__ << ": Exception reading configuration = " << e.errors[0].desc<<endl;
}
savedlock->writerIn();
saved_alarms.clear();
for (size_t i=0;i < db_data.size();/*i++*/)
{
Tango::DevLong64 nb_prop;
......@@ -931,9 +1030,11 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
string alm_silence_time("-1");
string alm_group;
string alm_message;
string alm_url;
string alm_on_command("");
string alm_off_command("");
string alm_enabled("1");
string alm_receivers("");
for (long k=0;k < nb_prop;k++)
{
string &prop_name = db_data[i].name;
......@@ -954,20 +1055,27 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
db_data[i] >> alm_group;
else if (prop_name == MESSAGE_KEY)
db_data[i] >> alm_message;
else if (prop_name == URL_KEY)
db_data[i] >> alm_url;
else if (prop_name == ON_COMMAND_KEY)
db_data[i] >> alm_on_command;
else if (prop_name == OFF_COMMAND_KEY)
db_data[i] >> alm_off_command;
else if (prop_name == ENABLED_KEY)
db_data[i] >> alm_enabled;
else if (prop_name == RECEIVERS_KEY)
db_data[i] >> alm_receivers;
else
{
cout << "att_name="<<att_name<<" UNKWNOWN prop_name="<<prop_name<<endl;
TANGO_LOG << "att_name="<<att_name<<" UNKWNOWN prop_name="<<prop_name<<endl;
i++;
continue;
}
i++;
}
alm_message = std::regex_replace(alm_message, std::regex(";"), "\\;");
alm_url = std::regex_replace(alm_url, std::regex(";"), "\\;");
alm_receivers = std::regex_replace(alm_receivers, std::regex(";"), "\\;");
stringstream alm;
alm << KEY(NAME_KEY)<<alm_name << SEP <<
KEY(FORMULA_KEY)<<alm_formula << SEP <<
......@@ -977,17 +1085,20 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
KEY(SILENT_TIME_KEY)<<alm_silence_time << SEP <<
KEY(GROUP_KEY)<< alm_group << SEP <<
KEY(MESSAGE_KEY)<< alm_message << SEP <<
KEY(URL_KEY)<< alm_url << SEP <<
KEY(ON_COMMAND_KEY)<< alm_on_command << SEP <<
KEY(OFF_COMMAND_KEY)<< alm_off_command << SEP <<
KEY(RECEIVERS_KEY)<< alm_receivers << SEP <<
KEY(ENABLED_KEY)<< alm_enabled;
if(alm_name.empty() || alm_formula.empty() || alm_level.empty() || alm_group.empty() || alm_message.empty()) //TODO: decide if all mandatory
{
cout << __func__ << ": skipped '" << alm.str() << "'" << endl;
TANGO_LOG << __func__ << ": skipped '" << alm.str() << "'" << endl;
continue;
}
al_list.push_back(alm.str());
saved_alarms.insert(make_pair(alm_name,alm.str()));
}
savedlock->writerOut();
#if 0
......
/*
* alarm_table.h
*
* $Author: graziano $
*
* $Revision: 1.5 $
*
* $Log: alarm_table.h,v $
*
*
* copyleft: Sincrotrone Trieste S.C.p.A. di interesse nazionale
* Strada Statale 14 - km 163,5 in AREA Science Park
* 34012 Basovizza, Trieste ITALY
......@@ -21,8 +14,9 @@
#include <iostream>
#include <string>
#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
#ifndef BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT
......@@ -45,13 +39,18 @@
#else
#include <boost/spirit/include/classic_ast.hpp> //for ast parse trees (in tree_formula)
#endif
//#define _USE_BOOST_LOCK
#ifdef _USE_BOOST_LOCK
#include <boost/thread/shared_mutex.hpp>
#endif
//#include "log_thread.h"
#define LOG_STREAM cout
#define MAX_ARRAY_PRINTED_CHARS 1000
#define LOG_STREAM TANGO_LOG
using namespace std;
typedef vector<Tango::DevDouble> value_t;
#if BOOST_VERSION < 103600
typedef std::string::iterator iterator_t;
......@@ -69,6 +68,7 @@ typedef parse_tree_match_t::tree_iterator iter_t;
#define S_NORMAL "NORMAL"
#define S_ALARM "ALARM"
#define S_ERROR "ERROR"
#define NOT_ACK "NACK"
#define ACK "ACK"
......@@ -83,23 +83,182 @@ typedef parse_tree_match_t::tree_iterator iter_t;
#define LEV_LOG "log"
#define LEV_WARNING "warning"
#define LEV_FAULT "fault"
#define LEV_DEFAULT LEV_FAULT
//#define LEV_DEFAULT LEV_FAULT
#define LEV_LOWEST "lowest"
#define LEV_LOW "low"
#define LEV_MEDIUM "medium"
#define LEV_HIGH "high"
#define LEV_HIGHEST "highest"
#define LEV_DEFAULT LEV_HIGH
class alarm_t;
class alarm_table;
class log_thread;
class cmd_thread;
#ifdef _USE_BOOST_LOCK
struct rwlock_t
{
string name;
rwlock_t(string n){name=n;};
rwlock_t(){name=string("RWLOCK");};
boost::shared_mutex mut;
void readerIn(){TANGO_LOG<<name<<": " << __func__<<endl;mut.lock_shared();}
void readerOut(){TANGO_LOG<<name<<": " << __func__<<endl;mut.unlock_shared();}
void writerIn(){TANGO_LOG<<name<<": " << __func__<<endl;mut.lock();}
void writerOut(){TANGO_LOG<<name<<": " << __func__<<endl;mut.unlock();}
};
#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
{
formula_res_t(){value=0;quality=Tango::ATTR_VALID;ex_reason=string("");ex_desc=string("");ex_origin=string("");}
double value;
formula_res_t(){valid=false;quality=Tango::ATTR_VALID;ex_reason=string("");ex_desc=string("");ex_origin=string("");dim_x=0;dim_y=0;}
value_t value;
long dim_x;
long dim_y;
int quality;
bool valid;
string error;
Tango::DevErrorList errors; //TODO: error stack
string ex_reason;
string ex_desc;
string ex_origin;
string attr_name; //last evaluated attr name
int combine_quality(int quality1, int quality2)
{
int res;
......@@ -122,124 +281,218 @@ struct formula_res_t
else
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 res;
res.value = value == e.value;
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality);
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(!res.valid)
{
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;
}
formula_res_t operator!=(const formula_res_t& e)
{
formula_res_t res;
res.value = value != e.value;
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality);
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(!res.valid)
{
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;
}
formula_res_t operator<=(const formula_res_t& e)
{
formula_res_t res;
res.value = value <= e.value;
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality);
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(!res.valid)
{
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;
}
formula_res_t operator>=(const formula_res_t& e)
{
formula_res_t res;
res.value = value >= e.value;
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality);
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(!res.valid)
{
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;
}
formula_res_t operator<(const formula_res_t& e)
{
formula_res_t res;
res.value = value < e.value;
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality);
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(!res.valid)
{
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;
}
formula_res_t operator>(const formula_res_t& e)
{
formula_res_t res;
res.value = value > e.value;
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality);
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(!res.valid)
{
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;
}
formula_res_t operator||(const formula_res_t& e)
{
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.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(!res.valid)
{
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;
}
formula_res_t operator&&(const formula_res_t& e)
{
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.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(!res.valid)
{
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;
}
formula_res_t operator+(const formula_res_t& e)
{
formula_res_t res;
res.value = value + e.value;
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality);
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(!res.valid)
{
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;
}
formula_res_t operator-(const formula_res_t& e)
{
formula_res_t res;
res.value = value - e.value;
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality);
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(!res.valid)
{
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;
}
formula_res_t operator*(const formula_res_t& e)
{
formula_res_t res;
res.value = value * e.value;
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality);
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(!res.valid)
{
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;
}
formula_res_t operator/(const formula_res_t& e)
{
formula_res_t res;
res.value = value / e.value;
res.valid = valid && e.valid;
res.quality = combine_quality(quality, e.quality);
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(!res.valid)
{
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;
}
/*string operator<<(const formula_res_t& e)
......@@ -266,13 +519,21 @@ class alarm_t {
string ex_desc;
string ex_origin;
Tango::TimeVal ts;
string stat,
ack;
bool enabled;
bool shelved;
unsigned int on_counter;
unsigned int off_counter;
unsigned int freq_counter;
string stat{S_NORMAL},
ack{ACK};
bool error;
bool enabled{true};
bool shelved{false};
#ifdef _CNT_ATOMIC
atomic_uint on_counter= {0};
atomic_uint off_counter= {0};
atomic_uint err_counter= {0};
#else
unsigned int on_counter= {0};
unsigned int off_counter= {0};
unsigned int err_counter= {0};
#endif
unsigned int freq_counter{0};
tree_parse_info_t formula_tree;
......@@ -281,25 +542,29 @@ class alarm_t {
bool done;
bool to_be_evaluated;
string msg;
unsigned int grp;
string url;
string receivers;
unsigned int grp{0};
string lev;
set<string> s_event;
int is_new;
Tango::TimeVal ts_on_delay; //says when it has gone in alarm status for the first time
unsigned int on_delay; //TODO: seconds, is it enough precision?
unsigned int on_delay{0}; //TODO: seconds, is it enough precision?
Tango::TimeVal ts_off_delay; //says when it returned normal status
unsigned int off_delay; //TODO: seconds, is it enough precision?
unsigned int off_delay{0}; //TODO: seconds, is it enough precision?
Tango::TimeVal ts_err_delay; //says when it has gone in error status for the first time
Tango::TimeVal ts_time_silenced; //says when it has been silenced
int silent_time; //minutes max to be silent
int silent_time{-1}; //minutes max to be silent
int silenced; //minutes still to be silent
string attr_values; //attr_values
string attr_values_delay; //attr_values of first occurrence of alarm waiting for on or off delay
string cmd_name_a; //action to execute: when NORMAL -> ALARM, cmd_name = cmd_dp_a/cmd_action_a
string cmd_name_a{""}; //action to execute: when NORMAL -> ALARM, cmd_name = cmd_dp_a/cmd_action_a
string cmd_dp_a; //device proxy part of cmd_name_a
string cmd_action_a; //action part of cmd_name_a
bool send_arg_a; //send as string argument alarm name and attr values
Tango::DeviceProxy *dp_a;
string cmd_name_n; //action to execute: when ALARM -> NORMAL, cmd_name_n = cmd_dp_n/cmd_action_n
string cmd_name_n{""}; //action to execute: when ALARM -> NORMAL, cmd_name_n = cmd_dp_n/cmd_action_n
string cmd_dp_n; //device proxy part of cmd_name_n
string cmd_action_n; //action part of cmd_name_n
bool send_arg_n; //send as string argument alarm name and attr values
......@@ -307,7 +572,11 @@ class alarm_t {
/*
* methods
*/
alarm_t(); //constructor
alarm_t() noexcept {}; //constructor
#ifdef _CNT_ATOMIC
alarm_t& operator=(const alarm_t& rhs) { on_counter = rhs.on_counter.load(); off_counter = rhs.off_counter.load(); err_counter = rhs.err_counter.load(); return *this; }
alarm_t(const alarm_t& rhs) { on_counter = rhs.on_counter.load(); off_counter = rhs.off_counter.load(); err_counter = rhs.err_counter.load();}
#endif
void init_static_map(vector<string> &group_names);
bool operator==(const alarm_t& that);
bool operator==(const string& n);
......@@ -330,7 +599,9 @@ class alarm_table {
public:
alarm_table() {}
~alarm_table() {del_rwlock();}
bool setAlarmQuality {false};
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, vector<string> &evn, map< string,vector<string> > &alarm_event);
......@@ -347,23 +618,30 @@ class alarm_table {
vector<string> to_be_evaluated_list();
//vector<alarm_t> v_alarm;
alarm_container_t v_alarm;
#ifndef _USE_BOOST_LOCK
ReadersWritersLock *vlock;
#else
rwlock_t *vlock;
#endif
void new_rwlock();
void del_rwlock();
void save_alarm_conf_db(string att_name, string name, string status, string ack, bool enabled,
string formula, unsigned int on_delay, unsigned int off_delay, string grp, string lev, string msg, string cmd_a, string cmd_n, int silent_time, vector<string> alm_list=vector<string>());
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, const string &receivers, int silent_time);
void delete_alarm_conf_db(string att_name);
void get_alarm_list_db(vector<string> &al_list, map<string, string> &saved_alarms);
void get_alarm_list_db(vector<string> &al_list, map<string, string> &saved_alarms, ReadersWritersLock *savedlock);
void init_cmdthread();
void stop_cmdthread();
Tango::TimeVal startup_complete; //to disable action execution at startup
Tango::TimeVal startup_complete; //to disable action execution at startup
void set_err_delay(unsigned int delay){err_delay=delay;};
protected:
private:
Tango::DeviceImpl* mydev;
log_thread *logloop;
cmd_thread *cmdloop;
cmd_thread *cmdloop;
unsigned int err_delay;
};
......