
fr.esrf.TangoApi.events.EventQueue Maven / Gradle / Ivy
//+======================================================================
// $Source$
//
// Project: Tango
//
// Description: java source code for the TANGO client/server API.
//
// $Author: pascal_verdier $
//
// Copyright (C) : 2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,
// European Synchrotron Radiation Facility
// BP 220, Grenoble 38043
// FRANCE
//
// This file is part of Tango.
//
// Tango is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Tango is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Tango. If not, see .
//
// $Revision: 25296 $
//
//-======================================================================
package fr.esrf.TangoApi.events;
import fr.esrf.Tango.DevFailed;
import fr.esrf.TangoDs.Except;
import fr.esrf.TangoDs.TangoConst;
import java.util.ArrayList;
//-============================================================================
/**
* This class manage a vector of EventData to implement
* an event queue mechanism..
*
*
*
* Usage example:
*
*
*
*
*
* /**
* * This class check the event queue mechanism.
* * @author verdier
* * /
*
*
* import fr.esrf.Tango.DevFailed;
* import fr.esrf.TangoDs.TangoConst;
* import fr.esrf.TangoDs.Except;
* import fr.esrf.TangoApi.DeviceProxy;
* import fr.esrf.TangoApi.CallBack;
* import fr.esrf.TangoApi.DeviceAttribute;
* import fr.esrf.TangoApi.events.EventData;
* import java.util.Date;
*
* public class QueueTest extends DeviceProxy
* {
*
* //===============================================================
* /**
* * Constructor
* * @param devname The device name.
* * @param attname The attribute name.
* * /
* //===============================================================
*
* public QueueTest(String devname, String attname) throws DevFailed
* {
* super(devname);
* subscribe_event(attname, TangoConst.CHANGE_EVENT, 0, new String[] {}, true);
*
* }
*
*
* //===============================================================
* /**
* * Event management.
* * Wait a bit to have enough events, get them and push them to callback
* * /
* //===============================================================
*
* public void manageEvents()
* {
*
* // nb events to wait.
*
* int nb = 10;
* while(get_event_queue_size() < nb)
* {
* try { Thread.sleep(1000); }
* catch(Exception e) {}
* }
*
*
* // Get all change events and display them
* EventData[] events = get_events(TangoConst.CHANGE_EVENT);
* for (EventData event : events)
* {
* System.out.print("Event at " + new Date(event.date) + ": ");
* if (event.err)
* Except.print_exception(event.errors);
* else
* {
* DeviceAttribute value = event.attr_value;
* if (value.hasFailed())
* Except.print_exception(value.getErrStack());
* else
* try
* {
* if (value.getType()==TangoConst.Tango_DEV_DOUBLE)
* System.out.println(value.extractDouble());
* }
* catch(DevFailed e)
* {
* Except.print_exception(e);
* }
* }
* }
* }
*
*
* //===============================================================
* /**
* * main method.
* * /
* //===============================================================
*
* public static void main (String[] args)
* {
* String devname = "my/device/test";
* String attribute = "value";
* try
* {
* QueueTest client = new QueueTest(devname, attribute);
*
* client.manageEvents();
* }
* catch(DevFailed e)
* {
* Except.print_exception(e);
* }
* }
*
*
* //===============================================================
*
* }
*
* @author pascal_verdier
*/
//-============================================================================
public class EventQueue {
/**
* Maximum size (not infinite but very big)
*/
private int max_size = 1000000;
/**
* The queue itself
*/
private ArrayList events = new ArrayList();
//==================================================================
/**
* Creates a new instance of EventQueue for infinite EventData number
*/
//==================================================================
public EventQueue() {
}
//==================================================================
/**
* Creates a new instance of EventQueue for several EventData
*
* @param max_size maximum size of the event queue.
*/
//==================================================================
public EventQueue(int max_size) {
this.max_size = max_size;
}
//==================================================================
/**
* @return true if no EventData in queue.
*/
//==================================================================
public synchronized boolean is_empty() {
return (events.size() == 0);
}
//==================================================================
/**
*
* @param event_type Specified event type.
* @return the number of EventData in queue.
*/
//==================================================================
public synchronized int size(int event_type) {
int cnt = 0;
for (EventData event : events)
if (event.event_type == event_type)
cnt++;
return cnt;
}
//==================================================================
/**
* @return the number of EventData in queue for specified type.
*/
//==================================================================
public synchronized int size() {
return events.size();
}
//==================================================================
/**
* Insert an event in queue.
*
* @param event Event to be inserted.
*/
//==================================================================
public synchronized void insert_event(EventData event) {
events.add(event);
while (events.size() > max_size)
events.remove(0);
}
//==================================================================
/**
* @return the first event in queue.
* @throws DevFailed if queue is empty
*/
//==================================================================
public synchronized EventData getNextEvent() throws DevFailed {
if (events.size() == 0)
Except.throw_exception("BUFFER_EMPTY",
"Event queue is empty.",
"EventQueue.getNextEvent()");
EventData ev_data = events.get(0);
events.remove(0);
return ev_data;
}
//==================================================================
/**
*
* @param event_type Specified event type.
* @return the first event in queue for specified type.
* @throws DevFailed if queue has no specified event
*/
//==================================================================
public synchronized EventData getNextEvent(int event_type) throws DevFailed {
EventData ev_data = null;
for (EventData event : events)
if (event.event_type == event_type)
ev_data = event;
if (ev_data == null)
Except.throw_exception("BUFFER_EMPTY",
"No " + TangoConst.eventNames[event_type] + " in event queue.",
"EventQueue.getNextEvent()");
events.remove(ev_data);
return ev_data;
}
// ==========================================================================
/**
* @return all EventData in queue.
*/
// ==========================================================================
public synchronized EventData[] getEvents() {
EventData[] ev_data = new EventData[events.size()];
for (int i = 0; i < events.size(); i++)
ev_data[i] = events.get(i);
events.clear();
return ev_data;
}
// ==========================================================================
/**
*
* @param event_type Specified event type.
* @return all events in queue for specified type.
*/
// ==========================================================================
public synchronized EventData[] getEvents(int event_type) {
ArrayList v = new ArrayList();
for (EventData event : events)
if (event.event_type == event_type)
v.add(event);
EventData[] periodic = new EventData[v.size()];
for (int i = 0; i < v.size(); i++) {
periodic[i] = v.get(i);
events.remove(v.get(i));
}
return periodic;
}
//==================================================================
/**
* @return the date of the last inserted and not yet extracted event.
* @throws DevFailed if queue is empty
*/
//==================================================================
public synchronized long getLastEventDate() throws DevFailed {
if (events.size() == 0)
Except.throw_exception("BUFFER_EMPTY",
"Event queue is empty.",
"EventQueu.getNextEvent()");
EventData event = events.get(events.size()-1);
return event.date;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy