All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.esrf.TangoApi.events.EventQueue Maven / Gradle / Ivy

There is a newer version: 10.0.0
Show newest version
//+======================================================================
// $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