1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
9 #ifndef anna_timex_Engine_hpp
10 #define anna_timex_Engine_hpp
17 #include <anna/app/Component.hpp>
19 #include <anna/timex/TimeEvent.hpp>
39 Controlador general de tiempos.
41 El siguiente ejemplo muestra como obtener la instancia del gestor de tiempo asociado a nuestra aplicacion:
45 #include <anna.timex.Engine.h>
47 void cualquierFuncion (Timer* timer)
48 throw (RuntimeException)
50 Engine* timeController = anna::component <Engine> (FILE_LOCATION);
51 timerController->activate (timer);
54 Si el componente Engine no hubiera sido registrado (instanciado) en nuestra aplicacion el metodo
55 template anna::component lanzara una excepcion.
62 class Engine : public app::Component {
65 Resolucion minima (en milisegundos) soportada por el controlador de tiempos.
67 static const Millisecond minResolution;
72 Asocia automatica el objeto controlador de tiempo a la instancia de nuestra aplicacin.
74 @param maxTimeout maxima duracion de los eventos de tiempo que vamos a establecer.
75 @param resolution Resolucion ofrecida para este controlador de tiempos. La duracion minima
76 de un evento de tiempo de ser igual o mayor a este parametro.
78 Engine(const Millisecond & maxTimeout, const Millisecond & resolution);
86 Devuelve la resolucion del controlador de tiempo indicada en el contructor.
87 \return la resolucion del controlador de tiempo indicada en el contructor.
89 const Millisecond & getResolution() const throw() { return a_resolution; }
92 Devuelve el periodo máximo de temporización indicado en el constructor.
93 \return el periodo máximo de temporización indicado en el constructor.
95 const Millisecond & getMaxTimeout() const throw() { return a_maxTimeout; }
98 Deja en suspenso la creacion de pulsos de reloj. Los temporizadores que estuvieran activos
99 en este momento tendran una duracion indeterminada.
100 Para activar el sistema de control de tiempo debe invocarse al metodo play.
101 \warning Si el gestor de tiempo esta en modo pausa no se pueden activar eventos temporales.
103 void pause() throw(RuntimeException);
106 Reactiva la creacion de pulsos de reloj despues de la invocacion al metodo pause
108 void play() throw(RuntimeException);
111 Activa el evento de tiempo recibido como parametro. Si transcurre el tiempo indicado por
112 TimeEvent::getTimeout y no hemos invocado a #cancel o a cualquier otro metodo que origine
113 el fin del evento de tiempo (#stop o #kill) se invocaria al metodo TimeEvent::expire.
115 @param timeEvent Evento de tiempo que vamos a activar.
117 void activate(TimeEvent* timeEvent) throw(RuntimeException);
120 Activa el evento de tiempo recibido como parametro. Si transcurre el tiempo indicado por
121 TimeEvent::getTimeout y no hemos invocado a #cancel o a cualquier otro metodo que origine
122 el fin del evento de tiempo (#stop o #kill) se invocar�al metodo TimeEvent::expire.
124 @param timeEvent Evento de tiempo que vamos a activar.
125 \warning Si el gestor de tiempo esta en modo pausa no se pueden activar eventos temporales.
127 void activate(TimeEvent& timeEvent) throw(RuntimeException) { activate(&timeEvent); }
130 Cancela la ejecucion del evento de tiempo recibido como parametro. Si el evento no esta
131 activado simplemente se ignora.
133 @param timeEvent Evento de tiempo que vamos a desactivar.
134 \warning Si el gestor de tiempo esta en modo pausa no se pueden activar eventos temporales.
136 void cancel(TimeEvent* timeEvent) throw(RuntimeException);
139 Cancela la ejecucion del evento de tiempo recibido como parametro. Si el evento no esta
140 activado simplemente se ignora.
142 @param timeEvent Evento de tiempo que vamos a desactivar.
144 void cancel(TimeEvent& timeEvent) throw(RuntimeException) { cancel(&timeEvent); }
147 Obtiene el evento de tiempo asociado al identificador recibido.
149 @param eventTimeId Identificador de tiempo del que queremos obtener la referencia al evento de tiempo.
151 \return La referencia al evento de tiempo asociado al identificador recibido o NULL en caso de
152 que exista ningn evento que coincida con el identificador.
154 TimeEvent* getTimeEvent(const TimeEvent::Id eventTimeId) throw();
157 metodo que podemos reescribir para manejar el evento que nos informa de que el controlador de
158 tiempo va a empezar a comprobar eventos de tiempo caducados. Por defecto no hace nada.
160 virtual void eventBeginQuantum() throw(RuntimeException) {;}
163 metodo que podemos reescribir para manejar el evento que nos informa de que el controlador de
164 tiempo a terminado de comprobar eventos de tiempo caducados. Por defecto no hace nada.
166 @param quantumSize Nmero de eventos procesados en este quantum de tiempo.
168 virtual void eventEndQuantum(const int quantumSize) throw(RuntimeException) {;}
171 Devuelve una cadena con la informacion mas relevante de esta instancia.
172 \return Una cadena con la informacion mas relevante de esta instancia.
174 virtual std::string asString() const throw();
177 Devuelve un documento XML con la informacion mas relevante de esta instancia.
178 \param parent Nodo XML del que colgar la informacion referente a esta instancia.
179 \return Un documento XML con la informacion mas relevante de esta instancia.
181 virtual xml::Node* asXML(xml::Node* parent) const throw();
184 Devuelve la cadena por la que podemos buscar el componente.
185 \return La cadena por la que podemos buscar el componente.
186 \see Application::find
188 static const char* getClassName() { return "anna::timex::Engine"; }
191 typedef std::vector <TimeEvent*> Quantum;
192 typedef Quantum::iterator quantum_iterator;
193 typedef std::map <TimeEvent::Id, Quantum*> Directory;
195 Quantum* a_timeTable;
196 Engine::Directory a_directory;
197 int a_currentQuantum;
199 Millisecond a_resolution;
200 Millisecond a_maxTimeout;
202 TickProducer* a_tickProducer;
203 TickConsumer* a_tickConsumer;
205 Quantum* a_expiredQuantum;
206 Quantum a_delayedQuantum;
207 pthread_t a_threadProducer;
209 void do_initialize() throw(RuntimeException);
210 void do_stop() throw();
213 void tick() throw(RuntimeException);
214 int getQuantum(const int timeout) const throw() { return (a_currentQuantum + (timeout / a_resolution)) % a_maxQuantum; }
215 void calibrate() throw();
217 // Reimplementado de app::Component
218 void do_cloneParent() throw();
219 void do_cloneChild() throw(RuntimeException);
221 static void notifyRelease(TimeEvent* timeEvent) throw();
222 static TimeEvent* timeEvent(quantum_iterator& ii) throw() { return *ii; }
224 friend class TickProducer;
225 friend class TickConsumer;
226 friend class st::TickProducer;
227 friend class mt::TickProducer;