Newer
Older

Graziano Scalamera
committed
{
//DEBUG_STREAM << "AlarmHandler::read_alarmNormal(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_alarmNormal) ENABLED START -----*/

Graziano Scalamera
committed
// Set the attribute value
attr.set_value(attr_alarmNormal_read, normalAlarms_sz);

Graziano Scalamera
committed
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_alarmNormal

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Read attribute alarmUnacknowledged related method

Graziano Scalamera
committed
* Description: List of alarms in unacknowledged state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
//--------------------------------------------------------
void AlarmHandler::read_alarmUnacknowledged(Tango::Attribute &attr)

Graziano Scalamera
committed
{
//DEBUG_STREAM << "AlarmHandler::read_alarmUnacknowledged(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_alarmUnacknowledged) ENABLED START -----*/

Graziano Scalamera
committed
// Set the attribute value
attr.set_value(attr_alarmUnacknowledged_read, unacknowledgedAlarms_sz);

Graziano Scalamera
committed
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_alarmUnacknowledged

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Read attribute alarmAcknowledged related method

Graziano Scalamera
committed
* Description: List of alarms in acknowledged state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
//--------------------------------------------------------
void AlarmHandler::read_alarmAcknowledged(Tango::Attribute &attr)

Graziano Scalamera
committed
{
//DEBUG_STREAM << "AlarmHandler::read_alarmAcknowledged(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_alarmAcknowledged) ENABLED START -----*/

Graziano Scalamera
committed
// Set the attribute value
attr.set_value(attr_alarmAcknowledged_read, acknowledgedAlarms_sz);

Graziano Scalamera
committed
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_alarmAcknowledged

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Read attribute alarmUnacknowledgedNormal related method

Graziano Scalamera
committed
* Description: List of alarms in unacknowledged normal state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
//--------------------------------------------------------
void AlarmHandler::read_alarmUnacknowledgedNormal(Tango::Attribute &attr)

Graziano Scalamera
committed
{
//DEBUG_STREAM << "AlarmHandler::read_alarmUnacknowledgedNormal(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_alarmUnacknowledgedNormal) ENABLED START -----*/

Graziano Scalamera
committed
// Set the attribute value
attr.set_value(attr_alarmUnacknowledgedNormal_read, unacknowledgedNormalAlarms_sz);

Graziano Scalamera
committed
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_alarmUnacknowledgedNormal

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Read attribute alarmShelved related method

Graziano Scalamera
committed
* Description: List of alarms in shelved state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
//--------------------------------------------------------
void AlarmHandler::read_alarmShelved(Tango::Attribute &attr)

Graziano Scalamera
committed
{
//DEBUG_STREAM << "AlarmHandler::read_alarmShelved(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_alarmShelved) ENABLED START -----*/

Graziano Scalamera
committed
// Set the attribute value
attr.set_value(attr_alarmShelved_read, shelvedAlarms_sz);

Graziano Scalamera
committed
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_alarmShelved

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Read attribute alarmOutOfService related method

Graziano Scalamera
committed
* Description: List of alarms in out of service state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
//--------------------------------------------------------
void AlarmHandler::read_alarmOutOfService(Tango::Attribute &attr)

Graziano Scalamera
committed
{
//DEBUG_STREAM << "AlarmHandler::read_alarmOutOfService(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_alarmOutOfService) ENABLED START -----*/

Graziano Scalamera
committed
// Set the attribute value
attr.set_value(attr_alarmOutOfService_read, outOfServiceAlarms_sz);

Graziano Scalamera
committed
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_alarmOutOfService

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Read attribute alarmSilenced related method

Graziano Scalamera
committed
* Description: List of alarms in silenced state
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
//--------------------------------------------------------
void AlarmHandler::read_alarmSilenced(Tango::Attribute &attr)

Graziano Scalamera
committed
{
//DEBUG_STREAM << "AlarmHandler::read_alarmSilenced(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_alarmSilenced) ENABLED START -----*/

Graziano Scalamera
committed
// Set the attribute value
attr.set_value(attr_alarmSilenced_read, silencedAlarms_sz);

Graziano Scalamera
committed
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_alarmSilenced

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**

Graziano Scalamera
committed
* Description: List of all alarms
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
//--------------------------------------------------------
void AlarmHandler::read_alarmList(Tango::Attribute &attr)

Graziano Scalamera
committed
{
//DEBUG_STREAM << "AlarmHandler::read_alarmList(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_alarmList) ENABLED START -----*/

Graziano Scalamera
committed
// Set the attribute value
attr.set_value(attr_alarmList_read, listAlarms_sz);

Graziano Scalamera
committed
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_alarmList

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Read attribute alarmFrequency related method

Graziano Scalamera
committed
* Description: List of frequency of evaluation of all alarms
*
* Data type: Tango::DevDouble
* Attr type: Spectrum max = 10000
*/
//--------------------------------------------------------
void AlarmHandler::read_alarmFrequency(Tango::Attribute &attr)

Graziano Scalamera
committed
{
//DEBUG_STREAM << "AlarmHandler::read_alarmFrequency(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_alarmFrequency) ENABLED START -----*/

Graziano Scalamera
committed
// Set the attribute value
attr.set_value(attr_alarmFrequency_read, listAlarms_sz);

Graziano Scalamera
committed
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_alarmFrequency

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Read attribute alarmSummary related method
* Description:
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
//--------------------------------------------------------
void AlarmHandler::read_alarmSummary(Tango::Attribute &attr)
{
//DEBUG_STREAM << "AlarmHandler::read_alarmSummary(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_alarmSummary) ENABLED START -----*/
// Set the attribute value
attr.set_value(attr_alarmSummary_read, alarmSummary_sz);
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_alarmSummary
}
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
//--------------------------------------------------------
/**
* Read attribute eventList related method
* Description: List of all subscribed attributes
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
//--------------------------------------------------------
void AlarmHandler::read_eventList(Tango::Attribute &attr)
{
//DEBUG_STREAM << "AlarmHandler::read_eventList(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_eventList) ENABLED START -----*/
prepare_event_list();
// Set the attribute value
attr.set_value(attr_eventList_read, eventList_sz);
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_eventList
}
//--------------------------------------------------------
/**
* Read attribute eventSummary related method
* Description:
*
* Data type: Tango::DevString
* Attr type: Spectrum max = 10000
*/
//--------------------------------------------------------
void AlarmHandler::read_eventSummary(Tango::Attribute &attr)
{
//DEBUG_STREAM << "AlarmHandler::read_eventSummary(Tango::Attribute &attr) entering... " << endl;
/*----- PROTECTED REGION ID(AlarmHandler::read_eventSummary) ENABLED START -----*/
prepare_event_summary();
// Set the attribute value
attr.set_value(attr_eventSummary_read, eventSummary_sz);
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_eventSummary
}

Graziano Scalamera
committed
//--------------------------------------------------------
/**
* Read attribute AlarmState related method
* Description:
*
* Data type: Tango::DevEnum (AlarmStateEnum)
* Attr type: Scalar
*/
//--------------------------------------------------------
void AlarmHandler::read_AlarmState(Tango::Attribute &attr)
//DEBUG_STREAM << "AlarmHandler::read_AlarmState(Tango::Attribute &attr) entering... " << endl;
Tango::DevEnum *att_value = get_AlarmState_data_ptr(attr.get_name());
/*----- PROTECTED REGION ID(AlarmHandler::read_AlarmState) ENABLED START -----*/
string reason("");
string desc("");
string origin("");
int quality = Tango::ATTR_VALID;
alarms.vlock->readerIn();
alarm_container_t::iterator it;
for(it = alarms.v_alarm.begin(); it != alarms.v_alarm.end(); it++)
{
if(it->second.attr_name == attr.get_name())
{
break;
}
}
if(it != alarms.v_alarm.end())
{
reason = it->second.ex_reason;
desc = it->second.ex_desc;
origin = it->second.ex_origin;
quality = it->second.quality;
DEBUG_STREAM << "AlarmHandler::read_AlarmState: " << attr.get_name() << " desc=" << desc << endl;
alarms.vlock->readerOut();
if(error) //TODO: if needs to be considered err_delay also in single alarm attributes, error must be used
//if(desc.length() > 0)
{
Tango::Except::throw_exception(
reason,
desc,
origin, Tango::ERR);
}
// Set the attribute value
if(quality != Tango::ATTR_VALID)
{
timeval now;
gettimeofday(&now, NULL);
attr.set_value_date_quality(att_value, now/*TODO timestamp*/, (Tango::AttrQuality)quality);
}
else
{
attr.set_value(att_value);
}
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_AlarmState

Graziano Scalamera
committed
//--------------------------------------------------------
/**
* Read attribute AlarmFormula related method
* Description:
*
* Data type: Tango::DevString
* Attr type: Scalar
*/
//--------------------------------------------------------
void AlarmHandler::read_AlarmFormula(Tango::Attribute &attr)
{
//DEBUG_STREAM << "AlarmHandler::read_AlarmFormula(Tango::Attribute &attr) entering... " << endl;
Tango::DevString *att_value = get_AlarmFormula_data_ptr(attr.get_name());
/*----- PROTECTED REGION ID(AlarmHandler::read_AlarmFormula) ENABLED START -----*/
// Set the attribute value
attr.set_value(att_value);
/*----- PROTECTED REGION END -----*/ // AlarmHandler::read_AlarmFormula
}
//--------------------------------------------------------

Graziano Scalamera
committed
/**
* Method : AlarmHandler::add_dynamic_attributes()

Graziano Scalamera
committed
* Description : Create the dynamic attributes if any
* for specified device.
*/
//--------------------------------------------------------
void AlarmHandler::add_dynamic_attributes()

Graziano Scalamera
committed
{
// Example to add dynamic attribute:
// Copy inside the following protected area to create instance(s) at startup.
// add_AlarmState_dynamic_attribute("MyAlarmStateAttribute");
// add_AlarmFormula_dynamic_attribute("MyAlarmFormulaAttribute");
/*----- PROTECTED REGION ID(AlarmHandler::add_dynamic_attributes) ENABLED START -----*/

Graziano Scalamera
committed
// Add your own code to create and add dynamic attributes if any
alarms.vlock->readerIn();
if (alarms.v_alarm.empty() == false)
{
for (alarm_container_t::iterator i = alarms.v_alarm.begin(); \
i != alarms.v_alarm.end(); i++)
{
add_AlarmState_dynamic_attribute(i->second.attr_name);
Tango::DevEnum *attr_value = get_AlarmState_data_ptr(i->second.attr_name);
i->second.attr_value = attr_value;
i->second.attr_name_formula = i->second.attr_name + string("Formula");
add_AlarmFormula_dynamic_attribute(i->second.attr_name_formula);
Tango::DevString *attr_value_formula = get_AlarmFormula_data_ptr(i->second.attr_name_formula);
*attr_value_formula = Tango::string_dup(i->second.formula.c_str());
i->second.attr_value_formula = attr_value_formula;
}
}
alarms.vlock->readerOut();

Graziano Scalamera
committed
/*----- PROTECTED REGION END -----*/ // AlarmHandler::add_dynamic_attributes

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Command Ack related method
* Description: Alarm acknowledge
*
* @param argin String array containing the alarms to be acknowledged
*/
//--------------------------------------------------------
void AlarmHandler::ack(const Tango::DevVarStringArray *argin)

Graziano Scalamera
committed
{
DEBUG_STREAM << "AlarmHandler::Ack() - " << device_name << endl;
/*----- PROTECTED REGION ID(AlarmHandler::ack) ENABLED START -----*/

Graziano Scalamera
committed
// Add your own code
vector<string> str;
str << (*argin);
vector<string>::iterator si;

Graziano Scalamera
committed
for (si = str.begin(); si != str.end(); si++) {
alarms.vlock->readerIn();
alarmedlock->readerIn();
vector<alarm_t>::iterator found = \
find(alarmed.begin(), alarmed.end(), *si);
if (found != alarmed.end())
{
alarm_container_t::iterator i = alarms.v_alarm.find(*si);

Graziano Scalamera
committed
if(i == alarms.v_alarm.end())

Graziano Scalamera
committed
{

Graziano Scalamera
committed
INFO_STREAM << __func__ << ": alarm '" << *si << "' not found";
alarmedlock->readerOut();
alarms.vlock->readerOut();
continue;
}
if(!i->second.enabled || i->second.shelved)
{
DEBUG_STREAM << __func__ << ": alarm '" << *si << "' not enabled";
alarmedlock->readerOut();
alarms.vlock->readerOut();
continue;

Graziano Scalamera
committed
}

Graziano Scalamera
committed
//update alarm ack in alarm table
i->second.ack = ACK;
//update alarm status from alarm table
found->stat = i->second.stat;
localalarmed = *found; //NOTE: copy before updating ack
localv_alarm = i->second;
found->ack = ACK;
alarmedlock->readerOut();
alarms.vlock->readerOut();
if(localalarmed.ack == NOT_ACK)

Graziano Scalamera
committed
{
Tango::DevEnum *attr_value = get_AlarmState_data_ptr(localv_alarm.attr_name);
if(!localv_alarm.enabled)

Graziano Scalamera
committed
*attr_value = _OOSRV;
else if(localv_alarm.shelved && localv_alarm.silenced > 0)

Graziano Scalamera
committed
*attr_value = _SHLVD;
else if((localv_alarm.stat == S_NORMAL) && localv_alarm.ack == ACK)
*attr_value = _NORM;
else if((localv_alarm.stat == S_ALARM) && localv_alarm.ack == NOT_ACK)
*attr_value = _UNACK;
else if((localv_alarm.stat == S_ALARM) && localv_alarm.ack == ACK)
*attr_value = _ACKED;
else if((localv_alarm.stat == S_NORMAL) && localv_alarm.ack == NOT_ACK)
*attr_value = _RTNUN;
try
{ //DevFailed for push events
{
timeval now;
gettimeofday(&now, NULL);
push_change_event(localv_alarm.attr_name,(Tango::DevEnum *)attr_value,now,(Tango::AttrQuality)localv_alarm.quality, 1/*size*/, 0, false);
push_archive_event(localv_alarm.attr_name,(Tango::DevEnum *)attr_value,now,(Tango::AttrQuality)localv_alarm.quality, 1/*size*/, 0, false);
}
else
{
Tango::DevErrorList errors(1);
errors.length(1);
errors[0].desc = CORBA::string_dup(localv_alarm.ex_desc.c_str());
errors[0].severity = Tango::ERR;
errors[0].reason = CORBA::string_dup(localv_alarm.ex_reason.c_str());
errors[0].origin = CORBA::string_dup(localv_alarm.ex_origin.c_str());
Tango::DevFailed except(errors);
push_change_event(localv_alarm.attr_name, &except);
push_archive_event(localv_alarm.attr_name, &except);
}
} catch(Tango::DevFailed & ex)
{
WARN_STREAM << "AlarmHandler::"<<__func__<<": EXCEPTION PUSHING EVENTS: " << ex.errors[0].desc << endl;
}

Graziano Scalamera
committed
}
}
else //not found in alarmed
{
alarmedlock->readerOut();
alarms.vlock->readerOut();
}

Graziano Scalamera
committed
}
/*
* remove S_NORMAL status ACKnowledged alarms
*/
alarm_t to_be_removed;
to_be_removed.name = "";
to_be_removed.formula = "";
to_be_removed.stat = S_NORMAL;
to_be_removed.ack = ACK;
bool go = true;
while (go) {
alarmedlock->writerIn();
vector<alarm_t>::iterator found = \
find(alarmed.begin(), alarmed.end(), to_be_removed);
if (found != alarmed.end()) {
DEBUG_STREAM << "AlarmHandler::ack(): " << found->name \

Graziano Scalamera
committed
<< " S_NORMAL and ACK, removing" << endl;
alarmed.erase(found);
} else {
go = false;
}
alarmedlock->writerOut();
}
prepare_alarm_attr();
try
{
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

Graziano Scalamera
committed
{

Graziano Scalamera
committed
//attr.set_value(ds, ds_num, 0, false);
push_change_event("alarm",ds, ds_num, 0, false);

Graziano Scalamera
committed
}
push_change_event("alarmNormal",&attr_alarmNormal_read[0], normalAlarms_sz);
push_change_event("alarmUnacknowledged",&attr_alarmUnacknowledged_read[0], unacknowledgedAlarms_sz);
push_change_event("alarmAcknowledged",&attr_alarmAcknowledged_read[0], acknowledgedAlarms_sz);
push_change_event("alarmUnacknowledgedNormal",&attr_alarmUnacknowledgedNormal_read[0], unacknowledgedNormalAlarms_sz);
push_change_event("alarmShelved",&attr_alarmShelved_read[0], shelvedAlarms_sz);
push_change_event("alarmOutOfService",&attr_alarmOutOfService_read[0], outOfServiceAlarms_sz);
push_change_event("alarmSilenced",&attr_alarmSilenced_read[0], silencedAlarms_sz);
push_change_event("alarmList",&attr_alarmList_read[0], listAlarms_sz);
push_change_event("alarmFrequency",&attr_alarmFrequency_read[0], listAlarms_sz);
push_change_event("alarmAudible",attr_alarmAudible_read);
push_change_event("alarmSummary",attr_alarmSummary_read);
push_archive_event("alarmNormal",&attr_alarmNormal_read[0], normalAlarms_sz);
push_archive_event("alarmUnacknowledged",&attr_alarmUnacknowledged_read[0], unacknowledgedAlarms_sz);
push_archive_event("alarmAcknowledged",&attr_alarmAcknowledged_read[0], acknowledgedAlarms_sz);
push_archive_event("alarmUnacknowledgedNormal",&attr_alarmUnacknowledgedNormal_read[0], unacknowledgedNormalAlarms_sz);
push_archive_event("alarmShelved",&attr_alarmShelved_read[0], shelvedAlarms_sz);
push_archive_event("alarmOutOfService",&attr_alarmOutOfService_read[0], outOfServiceAlarms_sz);
push_archive_event("alarmSilenced",&attr_alarmSilenced_read[0], silencedAlarms_sz);
push_archive_event("alarmList",&attr_alarmList_read[0], listAlarms_sz);
push_archive_event("alarmFrequency",&attr_alarmFrequency_read[0], listAlarms_sz);
push_archive_event("alarmAudible",attr_alarmAudible_read);
push_archive_event("alarmSummary",attr_alarmSummary_read);

Graziano Scalamera
committed

Graziano Scalamera
committed
} catch(Tango::DevFailed& e)
{
ostringstream err;
err << "error pushing alarm change event err=" << e.errors[0].desc;
INFO_STREAM << __func__<<": " << err.str() << endl;
}
/*----- PROTECTED REGION END -----*/ // AlarmHandler::ack

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Command Load related method
* Description: Load a new alarm.
*
* @param argin Alarm entry
*/
//--------------------------------------------------------
void AlarmHandler::load(Tango::DevString argin)

Graziano Scalamera
committed
{
DEBUG_STREAM << "AlarmHandler::Load() - " << device_name << endl;
/*----- PROTECTED REGION ID(AlarmHandler::load) ENABLED START -----*/

Graziano Scalamera
committed
// Add your own code
DEBUG_STREAM << "AlarmHandler::LOAD ENTERING alm=" << argin << endl;

Graziano Scalamera
committed
string s;
alarm_t alm;
vector<string> evn;
s = argin;
//std::transform(s.begin(), s.end(), s.begin(), (int(*)(int))tolower); //transform to lowercase
Tango::TimeVal ts = gettime();
try {
load_alarm(s, alm, evn);//doesn't hold locks

Graziano Scalamera
committed
} catch(Tango::DevFailed& e)
{
ostringstream err;
err << "error loading alarm=" << alm.name << " , " << e.errors[0].desc;
WARN_STREAM << "AlarmHandler::load(): " << err.str() << endl;

Graziano Scalamera
committed
Tango::Except::throw_exception( \
(const char*)"AlarmHandler::load()", \

Graziano Scalamera
committed
err.str(), \
(const char*)"AlarmHandler::load()", Tango::ERR);

Graziano Scalamera
committed
}
try {
add_alarm(alm);//holds alarm writer lock + reader lock
} catch (string& err) { //TODO: not throwing string exception
WARN_STREAM << "AlarmHandler::load(): " << err << endl;

Graziano Scalamera
committed
Tango::Except::throw_exception( \
(const char*)"AlarmHandler::load()", \

Graziano Scalamera
committed
(const char*)err.c_str(), \
(const char*)"AlarmHandler::load()", Tango::ERR);

Graziano Scalamera
committed
}
#if 0
try
{
Tango::Attribute attr = this->get_device_attr()->get_attr_by_name(alm.attr_name.c_str());
push_att_conf_event(&attr);
}
catch(Tango::DevFailed &e)
{
ostringstream o;
o << "AlarmHandler::" << __func__<<": alarm '" << alm.name << "' cannot push att_conf event, err="<<e.errors[0].desc ;
INFO_STREAM << o.str() << endl;
}
#endif

Graziano Scalamera
committed
try {
add_event(alm, evn);
} catch (string& err) {
WARN_STREAM << "AlarmHandler::load(): " << err << endl;

Graziano Scalamera
committed
alarms.vlock->writerIn();
alarm_container_t::iterator i = alarms.v_alarm.find(alm.name); //look for alarm just added
if (i != alarms.v_alarm.end())
alarms.erase(i); //and remove from alarm_table
alarms.vlock->writerOut();
Tango::Except::throw_exception( \
(const char*)"AlarmHandler::load()", \

Graziano Scalamera
committed
(const char*)err.c_str(), \
(const char*)"AlarmHandler::load()", Tango::ERR);

Graziano Scalamera
committed
}
#if 0//already saved attribute property by subscribe thread
alarms.save_alarm_conf_db(alm.attr_name, alm.name, "", "", alm.enabled, //add new alarm on log before subscribe event
alm.formula, alm.on_delay, alm.off_delay, alm.grp2str(), alm.lev, alm.msg, alm.url, alm.cmd_name_a, alm.cmd_name_n, alm.silent_time); //but if it fails remove it from table
DEBUG_STREAM << "AlarmHandler::LOAD save_alarm_conf_db-" << alm.attr_name << endl;
string conf_str;
alm.confstr(conf_str);
saved_alarms.insert(make_pair(alm.attr_name,conf_str));
savedlock->writerOut();
#endif
alarm_container_t::iterator i = alarms.v_alarm.find(alm.name);
if(i != alarms.v_alarm.end())
{
try {
add_event(i->second, evn);//moved after events->add //holds alarm reader lock
WARN_STREAM << "AlarmHandler::"<<__func__<<": string exception=" << err << endl;
//TODO: handle error
#if 0
for(vector<string>::iterator j = evn.begin(); j != evn.end(); j++)
{
DEBUG_STREAM << "AlarmHandler::"<<__func__<<": Removing alarm=" << i->second.name << " from event=" << *j << endl;
vector<event>::iterator k = \
find(events->v_event.begin(), events->v_event.end(), *j);
if (k != events->v_event.end())
{
k->m_alarm.pop(i->second.name); //remove alarm/formula just added to event
DEBUG_STREAM << "AlarmHandler::"<<__func__<<": Removed!!!! alarm=" << i->second.name << " from event=" << *j << endl;
if(k->m_alarm.empty())
{
events->v_event.erase(k); //remove event just added to event_table
DEBUG_STREAM << "AlarmHandler::"<<__func__<<": event=" << *j << " no more used, REMOVED!!!" << endl;
}
}
}
set_internal_alarm(INTERNAL_ERROR, gettime(), err);
#endif
}
catch (Tango::DevFailed &e) {
WARN_STREAM << "AlarmHandler::"<<__func__<<": Tango exception=" << e.errors[0].desc << endl;
if(i->second.cmd_name_a.length() > 0)

Graziano Scalamera
committed
{
try {
i->second.dp_a = new Tango::DeviceProxy(i->second.cmd_dp_a);
i->second.dp_a->ping();
Tango::CommandInfo info = i->second.dp_a->command_query(i->second.cmd_action_a);
if(info.in_type != Tango::DEV_STRING)
{
ostringstream err;
err << "Error: command " << i->second.cmd_name_a << " does not accept a Tango::DevString as input value";
ERROR_STREAM << "AlarmHandler::load(): " << err.str() << endl;

Graziano Scalamera
committed
set_internal_alarm(INTERNAL_ERROR, gettime(), err.str());
}
else
{
if(info.in_type == Tango::DEV_STRING)
i->second.send_arg_a = true;
else
i->second.send_arg_a = false;
DEBUG_STREAM << "AlarmHandler::load(): successfully connected to proxy=" << i->second.cmd_dp_a << " for action=" << i->second.cmd_action_a << endl;

Graziano Scalamera
committed
}
} catch(Tango::DevFailed& e)
{
ostringstream err;
err << alm.name << ": error connecting to device proxy=" << i->second.cmd_dp_a << ", err=" << e.errors[0].desc;
WARN_STREAM << "AlarmHandler::load(): " << err.str() << endl;

Graziano Scalamera
committed
set_internal_alarm(INTERNAL_ERROR, gettime(), err.str());

Graziano Scalamera
committed
}
if(i->second.cmd_name_n.length() > 0)

Graziano Scalamera
committed
{
try {
i->second.dp_n = new Tango::DeviceProxy(i->second.cmd_dp_n);
i->second.dp_n->ping();
Tango::CommandInfo info = i->second.dp_n->command_query(i->second.cmd_action_n);

Graziano Scalamera
committed
if(info.in_type != Tango::DEV_STRING)
{
ostringstream err;
err << "Error: command " << i->second.cmd_name_n << " does not accept a Tango::DevString as input value";
ERROR_STREAM << "AlarmHandler::load(): " << err.str() << endl;

Graziano Scalamera
committed
set_internal_alarm(INTERNAL_ERROR, gettime(), err.str());
}
else
{
if(info.in_type == Tango::DEV_STRING)
i->second.send_arg_n = true;
else
i->second.send_arg_n = false;
DEBUG_STREAM << "AlarmHandler::load(): successfully connected to proxy=" << i->second.cmd_dp_n << " for action=" << i->second.cmd_action_n << endl;

Graziano Scalamera
committed
}
} catch(Tango::DevFailed& e)
{
ostringstream err;
err << alm.name << ": error connecting to device proxy=" << i->second.cmd_dp_n << ", err=" << e.errors[0].desc;
WARN_STREAM << "AlarmHandler::load(): " << err.str() << endl;

Graziano Scalamera
committed
set_internal_alarm(INTERNAL_ERROR, gettime(), err.str());
}
}
DEBUG_STREAM << "AlarmHandler::"<<__func__<<": created command proxy, to_be_evaluated=" << (int)alm.to_be_evaluated << endl;
//TODO: to be moved in subscribe thread after subscription
//if at least one event was already existing, evaluate formula of just added alarm
if(i->second.to_be_evaluated) //TODO: remove this evaluation of the formula that is not necessary
{
DEBUG_STREAM << "AlarmHandler::"<<__func__<<": to_be_evaluated!!" << endl;
bei_t e;
e.ev_name = ALARM_THREAD_TO_BE_EVAL;
e.value.push_back(ALARM_THREAD_TO_BE_EVAL_VALUE);
e.value.push_back(ALARM_THREAD_TO_BE_EVAL_VALUE);
evlist.push_back(e);
}
}

Graziano Scalamera
committed
#if 0//TODO

Graziano Scalamera
committed
prepare_alarm_attr();
try
{
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);
} catch(Tango::DevFailed& e)
{
ostringstream err;
err << "error pushing alarm change event err=" << e.errors[0].desc;
INFO_STREAM << __func__<<": " << err.str() << endl;
}
#endif
DEBUG_STREAM << "AlarmHandler::LOAD EXITING alm=" << argin << endl;
/*----- PROTECTED REGION END -----*/ // AlarmHandler::load

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Command Remove related method
* Description: Remove alarm.
*
* @param argin Alarm name
*/
//--------------------------------------------------------
void AlarmHandler::remove(Tango::DevString argin)

Graziano Scalamera
committed
{
DEBUG_STREAM << "AlarmHandler::Remove() - " << device_name << endl;
/*----- PROTECTED REGION ID(AlarmHandler::remove) ENABLED START -----*/

Graziano Scalamera
committed
// Add your own code
string s, log_alm_name;
s = argin;
log_alm_name = argin;
bool ret = false;
alarmedlock->readerIn();
vector<alarm_t>::iterator found = find(alarmed.begin(), alarmed.end(), s);
if (found != alarmed.end())
{
ostringstream err;
err << s << " is in ALARM status! Acknowledge it before removing.";

Graziano Scalamera
committed
if((found->stat == S_ALARM) && (found->ack == NOT_ACK))
{
alarmedlock->readerOut();
Tango::Except::throw_exception( \
(const char*)"Error removing alarm", \
(const char*)err.str().c_str(), \
(const char*)"AlarmHandler::remove", Tango::ERR);

Graziano Scalamera
committed
}
}
alarmedlock->readerOut();
try {
ret = remove_alarm(s);
} catch (string& err) {
Tango::Except::throw_exception( \
(const char*)"Error removing alarm", \
(const char*)err.c_str(), \
(const char*)"AlarmHandler::remove", Tango::ERR);

Graziano Scalamera
committed
}
if (ret) {
DEBUG_STREAM << "AlarmHandler::remove(): removing alarm '" \

Graziano Scalamera
committed
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
<< s << "'" << endl;
while (true) {
string::size_type i = s.find_first_of("/.");
if (i == string::npos)
break;
s.replace(i, 1, "_");
}
} /* end if */
alarmedlock->writerIn();
found = find(alarmed.begin(), alarmed.end(), s); //look again because in the meanwhile lock was not acquired
if (found != alarmed.end())
{
alarmed.erase(found); //remove from alarmed table
}
alarmedlock->writerOut();
prepare_alarm_attr();
try
{
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

Graziano Scalamera
committed
{

Graziano Scalamera
committed
//attr.set_value(ds, ds_num, 0, false);
push_change_event("alarm",ds, ds_num, 0, false);

Graziano Scalamera
committed
}
push_change_event("alarmNormal",&attr_alarmNormal_read[0], normalAlarms_sz);
push_change_event("alarmUnacknowledged",&attr_alarmUnacknowledged_read[0], unacknowledgedAlarms_sz);
push_change_event("alarmAcknowledged",&attr_alarmAcknowledged_read[0], acknowledgedAlarms_sz);
push_change_event("alarmUnacknowledgedNormal",&attr_alarmUnacknowledgedNormal_read[0], unacknowledgedNormalAlarms_sz);
push_change_event("alarmShelved",&attr_alarmShelved_read[0], shelvedAlarms_sz);
push_change_event("alarmOutOfService",&attr_alarmOutOfService_read[0], outOfServiceAlarms_sz);
push_change_event("alarmSilenced",&attr_alarmSilenced_read[0], silencedAlarms_sz);
push_change_event("alarmList",&attr_alarmList_read[0], listAlarms_sz);
push_change_event("alarmFrequency",&attr_alarmFrequency_read[0], listAlarms_sz);
push_change_event("alarmAudible",attr_alarmAudible_read);
push_change_event("alarmSummary",attr_alarmSummary_read);
push_archive_event("alarmNormal",&attr_alarmNormal_read[0], normalAlarms_sz);
push_archive_event("alarmUnacknowledged",&attr_alarmUnacknowledged_read[0], unacknowledgedAlarms_sz);
push_archive_event("alarmAcknowledged",&attr_alarmAcknowledged_read[0], acknowledgedAlarms_sz);
push_archive_event("alarmUnacknowledgedNormal",&attr_alarmUnacknowledgedNormal_read[0], unacknowledgedNormalAlarms_sz);
push_archive_event("alarmShelved",&attr_alarmShelved_read[0], shelvedAlarms_sz);
push_archive_event("alarmOutOfService",&attr_alarmOutOfService_read[0], outOfServiceAlarms_sz);
push_archive_event("alarmSilenced",&attr_alarmSilenced_read[0], silencedAlarms_sz);
push_archive_event("alarmList",&attr_alarmList_read[0], listAlarms_sz);
push_archive_event("alarmFrequency",&attr_alarmFrequency_read[0], listAlarms_sz);
push_archive_event("alarmAudible",attr_alarmAudible_read);
push_archive_event("alarmSummary",attr_alarmSummary_read);

Graziano Scalamera
committed
} catch(Tango::DevFailed& e)
{
ostringstream err;
err << "error pushing alarm change event err=" << e.errors[0].desc;
INFO_STREAM << __func__<<": " << err.str() << endl;
}
/*----- PROTECTED REGION END -----*/ // AlarmHandler::remove

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**

Graziano Scalamera
committed
* Command SearchAlarm related method
* Description: Return list of configured alarms matching the filter string

Graziano Scalamera
committed
*

Graziano Scalamera
committed
* @param argin String containing a filter for output, if empty or * return all alarms
* @returns Configured alarms

Graziano Scalamera
committed
*/
//--------------------------------------------------------
Tango::DevVarStringArray *AlarmHandler::search_alarm(Tango::DevString argin)

Graziano Scalamera
committed
{
Tango::DevVarStringArray *argout;
DEBUG_STREAM << "AlarmHandler::SearchAlarm() - " << device_name << endl;
/*----- PROTECTED REGION ID(AlarmHandler::search_alarm) ENABLED START -----*/

Graziano Scalamera
committed
// Add your own code
// POGO has generated a method core with argout allocation.
// If you would like to use a static reference without copying,
// See "TANGO Device Server Programmer's Manual"
// (chapter : Writing a TANGO DS / Exchanging data)
//------------------------------------------------------------
argout = new Tango::DevVarStringArray();
//argout->length(1);
//(*argout)[0] = CORBA::string_dup("dummy");
DEBUG_STREAM << "AlarmHandler::configured(): entering... !" << endl;

Graziano Scalamera
committed
// Add your own code to control device here
string filter(argin);

Graziano Scalamera
committed
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
string filter_begin(filter);
string filter_end("");
size_t start_pos = 0;
/* string from("*");
string to("");
while((start_pos = filter.find(from, start_pos)) != std::string::npos)
{
filter.replace(start_pos, from.length(), to);
start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
}*/
start_pos = filter.find("*", start_pos);
if(start_pos != std::string::npos && start_pos == filter.size()-1) //* is the only character or at the end of the filter
{
filter.replace(start_pos, 1, "");
filter_begin = filter;
DEBUG_STREAM << __func__ << ": updated filter to: " << filter_begin;
}
/*else if(start_pos != std::string::npos) //* is in the middle of the filter
{
string filter_begin=filter.substr(0,start_pos);
string filter_end=filter.substr(start_pos+1);
DEBUG_STREAM << __func__ << ": splitted filter to: " << filter_begin << " - " << filter_end;
}*/

Graziano Scalamera
committed
size_t found;
vector<string> alarm_filtered;
ostringstream os1;
os1.clear();
/*os1 << headerConfig << "\t" << alarms.v_alarm.size() << ends;
alarm_filtered.push_back(os1.str());*/
alarm_container_t::iterator ai;
alarms.vlock->readerIn();
for (ai = alarms.v_alarm.begin(); ai != alarms.v_alarm.end(); ai++)
{
found = 0;

Graziano Scalamera
committed
if(filter_begin.length() != 0)

Graziano Scalamera
committed
{

Graziano Scalamera
committed
found = ai->first.find(filter_begin);

Graziano Scalamera
committed
}

Graziano Scalamera
committed
if((filter_begin.length() == 0) || (found != string::npos))

Graziano Scalamera
committed
{
ostringstream os;
os.clear();
os << ai->second.ts.tv_sec << SEP << KEY(NAME_KEY) << ai->second.name << SEP << KEY(FORMULA_KEY) << ai->second.formula << SEP << KEY(ONDELAY_KEY) << ai->second.on_delay << SEP << KEY(OFFDELAY_KEY) << ai->second.off_delay <<
SEP << KEY(LEVEL_KEY) << ai->second.lev << SEP << KEY(SILENT_TIME_KEY) << ai->second.silent_time << SEP << KEY(GROUP_KEY) << ai->second.grp2str() << SEP << KEY(MESSAGE_KEY) << ai->second.msg << SEP << KEY(URL_KEY) << ai->second.url <<
SEP << KEY(ON_COMMAND_KEY) << ai->second.cmd_name_a << SEP << KEY(OFF_COMMAND_KEY) << ai->second.cmd_name_n << SEP << KEY(ENABLED_KEY) << (ai->second.enabled ? "1" : "0");

Graziano Scalamera
committed
alarm_filtered.push_back(os.str());
}
} /* for */
alarms.vlock->readerOut();
argout->length(alarm_filtered.size());
int i = 0;
for (vector<string>::iterator it= alarm_filtered.begin(); it != alarm_filtered.end(); it++)
{
(*argout)[i] = CORBA::string_dup(it->c_str());
i++;
}
/*----- PROTECTED REGION END -----*/ // AlarmHandler::search_alarm

Graziano Scalamera
committed
return argout;
}
//--------------------------------------------------------
/**

Graziano Scalamera
committed
* Command StopAudible related method
* Description: Stop audible indications on the GUI

Graziano Scalamera
committed
*
*/
//--------------------------------------------------------
void AlarmHandler::stop_audible()

Graziano Scalamera
committed
{
DEBUG_STREAM << "AlarmHandler::StopAudible() - " << device_name << endl;
/*----- PROTECTED REGION ID(AlarmHandler::stop_audible) ENABLED START -----*/

Graziano Scalamera
committed
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
// Add your own code
//12-06-08: StopNew command set is_new to 0
// Add your own code to control device here
alarm_container_t::iterator ai;
alarms.vlock->readerIn();
for (ai = alarms.v_alarm.begin(); ai != alarms.v_alarm.end(); ai++) {
ai->second.is_new = 0; //set all alarm as no more new
}
alarms.vlock->readerOut();
prepare_alarm_attr();
try
{
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

Graziano Scalamera
committed
{

Graziano Scalamera
committed
//attr.set_value(ds, ds_num, 0, false);
push_change_event("alarm",ds, ds_num, 0, false);

Graziano Scalamera
committed
}
push_change_event("alarmNormal",&attr_alarmNormal_read[0], normalAlarms_sz);
push_change_event("alarmUnacknowledged",&attr_alarmUnacknowledged_read[0], unacknowledgedAlarms_sz);
push_change_event("alarmAcknowledged",&attr_alarmAcknowledged_read[0], acknowledgedAlarms_sz);
push_change_event("alarmUnacknowledgedNormal",&attr_alarmUnacknowledgedNormal_read[0], unacknowledgedNormalAlarms_sz);
push_change_event("alarmShelved",&attr_alarmShelved_read[0], shelvedAlarms_sz);
push_change_event("alarmOutOfService",&attr_alarmOutOfService_read[0], outOfServiceAlarms_sz);
push_change_event("alarmSilenced",&attr_alarmSilenced_read[0], silencedAlarms_sz);
push_change_event("alarmList",&attr_alarmList_read[0], listAlarms_sz);
push_change_event("alarmFrequency",&attr_alarmFrequency_read[0], listAlarms_sz);
push_change_event("alarmAudible",attr_alarmAudible_read);
push_change_event("alarmSummary",attr_alarmSummary_read);
push_archive_event("alarmNormal",&attr_alarmNormal_read[0], normalAlarms_sz);
push_archive_event("alarmUnacknowledged",&attr_alarmUnacknowledged_read[0], unacknowledgedAlarms_sz);
push_archive_event("alarmAcknowledged",&attr_alarmAcknowledged_read[0], acknowledgedAlarms_sz);
push_archive_event("alarmUnacknowledgedNormal",&attr_alarmUnacknowledgedNormal_read[0], unacknowledgedNormalAlarms_sz);
push_archive_event("alarmShelved",&attr_alarmShelved_read[0], shelvedAlarms_sz);
push_archive_event("alarmOutOfService",&attr_alarmOutOfService_read[0], outOfServiceAlarms_sz);
push_archive_event("alarmSilenced",&attr_alarmSilenced_read[0], silencedAlarms_sz);
push_archive_event("alarmList",&attr_alarmList_read[0], listAlarms_sz);
push_archive_event("alarmFrequency",&attr_alarmFrequency_read[0], listAlarms_sz);
push_archive_event("alarmAudible",attr_alarmAudible_read);
push_archive_event("alarmSummary",attr_alarmSummary_read);

Graziano Scalamera
committed
} catch(Tango::DevFailed& e)
{
ostringstream err;
err << "error pushing alarm change event err=" << e.errors[0].desc;
INFO_STREAM << __func__<<": " << err.str() << endl;
}
/*----- PROTECTED REGION END -----*/ // AlarmHandler::stop_audible

Graziano Scalamera
committed
}
//--------------------------------------------------------
/**
* Command Silence related method
* Description: Alarm temporarily silence
*
* @param argin String array containing the alarms to be silenced
*/
//--------------------------------------------------------
void AlarmHandler::silence(const Tango::DevVarStringArray *argin)

Graziano Scalamera
committed
{
DEBUG_STREAM << "AlarmHandler::Silence() - " << device_name << endl;
/*----- PROTECTED REGION ID(AlarmHandler::silence) ENABLED START -----*/

Graziano Scalamera
committed
// Add your own code
vector<string> str;
str << (*argin);