
fr.esrf.TangoApi.events.EventQueue Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of JTangoCommons Show documentation
Show all versions of JTangoCommons Show documentation
Common classes for tango java API
//+======================================================================
// $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