Skip to content
Snippets Groups Projects
alarm-thread.cpp 4.12 KiB
Newer Older
/*
 * 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
 */

#include "alarm-thread.h"
static const char __FILE__rev[] = __FILE__ " $Revision: 1.7 $";

/*
 * alarm_thread::alarm_thread()
 */
alarm_thread::alarm_thread(AlarmHandler_ns::AlarmHandler *p) : p_Alarm(p)
{
	//cout << __FILE__rev << endl;
}

/*
 * alarm_thread::~alarm_thread()
 */
alarm_thread::~alarm_thread()
{
	p_Alarm = NULL;
}

/*
 * alarm_thread::run()
 */
void alarm_thread::run(void *)
{
	size_t to_be_evaluated = 0;
	//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
		 */
		try
		{
				clock_gettime(CLOCK_MONOTONIC, &now);
				double dnow = (now.tv_sec) + ((double)(now.tv_nsec))/1000000000;
				if(dnow - last_eval > 10)	//TODO: configurable
					last_eval = dnow;
					bool changed = true;
					int num_changed = 0;
					if(alm_to_be_eval.size() > 0)
						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++;
						}
						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);
					}
#if 1
					alm_to_be_eval = p_Alarm->alarms.to_be_evaluated_list();
					to_be_evaluated = alm_to_be_eval.size();
					to_be_evaluated = 0;
					//usleep(200000);	//TODO
				}
			}
			bei_t e;
			{
				e = p_Alarm->evlist.pop_front();
				//DEBUG_STREAM << "alarm_thread::run(): woken up!!!! " << e.name << endl;
				if ((e.ev_name == ALARM_THREAD_EXIT) && \
					(e.value[0] == ALARM_THREAD_EXIT_VALUE))
				{
					break;
				}
				else if ((e.ev_name == ALARM_THREAD_TO_BE_EVAL) && \
					(e.value[0] == ALARM_THREAD_TO_BE_EVAL_VALUE))
				{
					alm_to_be_eval = p_Alarm->alarms.to_be_evaluated_list();
					to_be_evaluated = alm_to_be_eval.size();
					continue;
				}
				p_Alarm->do_alarm(e);
			}
		}
		catch(omni_thread_fatal& ex)
		{
			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());
		}			
		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);
		}		
		catch(...)
		{
			//WARN_STREAM << "alarm_thread::run(): catched unknown exception!!" << endl;
			printf("alarm_thread::run(): catched unknown exception!!");
		}		
	}
	//cout << "alarm_thread::run(): returning" << endl;
}  /* alarm_thread::run() */