EventRouter Class Reference#include <EventRouter.h>
Inheritance diagram for EventRouter:
[legend]List of all members.
Detailed Description
This class will handle distribution of events as well as management of timers.
Classes must inherit from EventListener and/or EventTrapper in order to receive events.
Use the global erouter EventRouter to post and subscribe to events, except if you are posting from within a MotionCommand, in which case you should use MotionCommand::postEvent() so that it will automatically be sent from the Motion process to the Main process.
When multiple listeners are subscribed, the order in which an event is distributed among them looks like this:
- "Specific" listeners: any listener which specifies a particular source id. (It doesn't matter if they specify a type id or not.)
- older listeners get events before younger listeners
- "General" listeners: those that subscribe to an entire generator
- older listeners get events before younger listeners
...but if you're relying on that ordering, there should be a cleaner way to do whatever you're doing.
If one behaviors unsubscribes another one during a processEvent(), that behavior may still get the "current" event before the unsubscription takes place. This is not a prescribed behavior, and also should not be relied on one way or the other.
Timer events are only sent to the generator which requested them. So if EventListener A requests a timer with ID 0 at two second intervals, and EventListener B requests a timer with ID 0 at three second intervals, each will still only receive the timers they requested - no cross talk. The timer generator is unique in this regard, which is why it is built in as an integral component of the EventRouter. All other events are broadcast.
If an EventListener/EventTrapper subscribes to the same event source multiple times, it will receive multiple copies of the event. However, the first call to removeListener for a source will remove all subscriptions to that source.
Example: EventListener A subscribes to (buttonEGID,*,*), and twice to (buttonEGID,0,*).
- If button 0 is pressed, A will get three copies of the event.
- If button 1 is pressed, A will get one copy.
- If removeListener(&A,buttonEGID) is called, the (buttonEGID,*,*) is removed, as well as both of (buttonEGID,0,*).
- If removeListener(&A,buttonEGID,0) is called, both of (buttonEGID,0,*) are removed, but (buttonEGID,*,*) would be untouched.
The buffered event distribution has not been tested thoroughly, and should be considered deprecated.
- See also:
- EventBase::EventGeneratorID_t for a complete listing of all generators, as well as instructions on how to add new generators.
Definition at line 66 of file EventRouter.h.
|
Public Member Functions |
| EventRouter () |
| Constructs the router, buffertime defaults to 1.
|
virtual | ~EventRouter () |
| just calls reset and removeAllTimers()
|
void | reset () |
| erases all listeners, trappers and timers, resets EventRouter
|
void | setBufferTime (unsigned int t) |
| sets the time to wait between buffer clears, see EventRouter::buffertime
|
unsigned int | getBufferTime () |
| returns the time to wait between buffer clears, see EventRouter::buffertime
|
|
void | postEvent (EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid, unsigned int dur) |
| recommended to create and post an event using current buffer setting
|
void | postEvent (EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid, unsigned int dur, const std::string &n, float m) |
| recommended to create and post an event using current buffer setting
|
void | postEvent (EventBase *e) |
| recommended to create and post an event using current buffer setting
|
void | processTimers () |
| determines if timers need to be posted, and posts them if so.
|
void | processEventBuffer () |
| clears the event buffer, deletes events as it does so.
|
void | processEvent (const EventBase &e) |
| forces unbuffered - sends event *now*. Will clear the buffer first if needed to ensure proper event ordering
|
|
bool | hasListeners (EventBase::EventGeneratorID_t egid) |
| counts both listeners and trappers, so stuff can tell if it even needs to bother generating an event...
|
bool | hasListeners (EventBase::EventGeneratorID_t egid, unsigned int sid) |
| counts both listeners and trappers, so stuff can tell if it even needs to bother generating an event...
|
bool | hasListeners (EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid) |
| counts both listeners and trappers, so stuff can tell if it even needs to bother generating an event...
|
bool | hasListeners (const EventBase &e) |
| counts both listeners and trappers, so stuff can tell if it even needs to bother generating an event...
|
|
void | addTimer (EventListener *el, unsigned int sid, unsigned int delay, bool repeat=true) |
| adds a timer if it doesn't exist, or resets the timer if it already exists.
|
void | addTimer (EventListener *el, const EventBase &e, bool repeat=true) |
| calls the other addTimer() with the event's source id and duration, doesn't check to see if the generator is timerEGID
|
void | removeTimer (EventListener *el) |
| clears all pending timers for listener el
|
void | removeTimer (EventListener *el, unsigned int sid) |
| clears any pending timers with source id sid for listener el
|
void | removeAllTimers () |
| clears all timers for all listeners
|
|
Adds a listener for all events from a given event generator
|
void | addListener (EventListener *el, EventBase::EventGeneratorID_t egid) |
void | addListener (EventListener *el, EventBase::EventGeneratorID_t egid, unsigned int sid) |
| Adds a listener for all types from a specific source and generator.
|
void | addListener (EventListener *el, EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid) |
void | addListener (EventListener *el, const EventBase &e) |
| Adds a listener for a specific source id and type from a given event generator, adding a Timer event will invoke addTimer(el, e.getSourceID(), e.getDuration(), true ).
|
void | removeListener (EventListener *el) |
| stops sending ALL events to the listener, including timers
|
void | removeListener (EventListener *el, EventBase::EventGeneratorID_t egid) |
| stops sending specified events from the generator to the listener.
|
void | removeListener (EventListener *el, EventBase::EventGeneratorID_t egid, unsigned int sid) |
| stops sending specified events from the generator to the listener.
|
void | removeListener (EventListener *el, EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid) |
void | removeListener (EventListener *el, const EventBase &e) |
| stops sending specified events from the generator to the listener. If a timer is passed it will invoke removeTimer(el, e.getSourceID())
|
void | forgetListener (EventListener *el) __attribute__((deprecated)) |
|
Adds a trapper for a specific source id and type from a given event generator
|
void | addTrapper (EventTrapper *el, const EventBase &e) |
void | addTrapper (EventTrapper *el, EventBase::EventGeneratorID_t egid) |
| Adds a trapper for all events from a given event generator.
|
void | addTrapper (EventTrapper *el, EventBase::EventGeneratorID_t egid, unsigned int sid) |
| Adds a trapper for all types from a specific source and generator.
|
void | addTrapper (EventTrapper *el, EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid) |
| Adds a trapper for a specific source id and type from a given event generator.
|
void | addTrapper (EventTrapper *el) |
| adds a trapper for ALL events
|
void | removeTrapper (EventTrapper *el, const EventBase &e) |
| stops sending specified events from the generator to the trapper.
|
void | removeTrapper (EventTrapper *el, EventBase::EventGeneratorID_t egid) |
| stops sending specified events from the generator to the trapper.
|
void | removeTrapper (EventTrapper *el, EventBase::EventGeneratorID_t egid, unsigned int sid) |
| stops sending specified events from the generator to the trapper.
|
void | removeTrapper (EventTrapper *el, EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid) |
| stops sending specified events from the generator to the trapper.
|
void | removeTrapper (EventTrapper *el) |
| stops sending ALL events to the trapper
|
Protected Types |
typedef std::vector< TimerEntry
* >::iterator | timer_it_t |
| makes code more readable
|
Protected Member Functions |
void | doSendBuffer () |
| does the work of clearing the buffer (calls doSendEvent() )
|
void | doSendEvent (const EventBase &e) |
| does the work of sending an event
|
void | chkTimers () |
| just for debugging
|
void | dispTimers () |
| just for debugging
|
Protected Attributes |
std::vector< TimerEntry * > | timers |
| the list of timer entries being maintained, kept sorted by time they go active
|
std::vector< EventBase * > | events |
| used to store buffered events
|
bool | doSendBufferLock |
| in case of recursive calls to processEventBuffer()/doSendBuffer()
|
unsigned int | lastBufClear |
| time of last event buffer clear
|
unsigned int | buffertime |
| The time between clearings of the buffer.
|
EventMapper | trappers |
| A mapping of which EventTrapper's should get a chance to trap the event.
|
EventMapper | listeners |
| A mapping of which EventListener's should receive events.
|
Classes |
class | EventMapper |
| Does the actual storage of the mapping between EventBase's and the EventListeners/EventTrappers who should receive them. More...
|
struct | TimerEntry |
| Contains all the information needed to maintain a timer by the EventRouter. More...
|
class | TimerEntryPtrCmp |
| Used by STL to sort the timer list in order of activation time. More...
|
Member Typedef Documentation
Constructor & Destructor Documentation
EventRouter::EventRouter |
( |
|
) |
|
|
virtual EventRouter::~EventRouter |
( |
|
) |
[inline, virtual] |
|
Member Function Documentation
|
Adds a listener for a specific source id and type from a given event generator, adding a Timer event will invoke addTimer(el, e.getSourceID(), e.getDuration(), true ).
Definition at line 123 of file EventRouter.cc. |
|
Adds a listener for a specific source id and type from a given event generator
Definition at line 115 of file EventRouter.cc. |
|
Adds a listener for all types from a specific source and generator.
Definition at line 106 of file EventRouter.cc. |
|
Definition at line 98 of file EventRouter.cc.
Referenced by WalkCalibration::activate(), PostureEditor::activate(), BatteryCheckControl::activate(), SensorObserverControl::doSelect(), EventLogger::doSelect(), WorldStateVelDaemon::DoStart(), WorldStateSerializerBehavior::DoStart(), WMMonitorBehavior::DoStart(), WalkToTargetNode::DoStart(), WalkControllerBehavior::DoStart(), VisualTargetTrans::DoStart(), VisualTargetCloseTrans::DoStart(), TimeOutTrans::DoStart(), TailWagNode::DoStart(), StareAtPawBehavior2::DoStart(), StareAtPawBehavior::DoStart(), StareAtBallBehavior::DoStart(), SpiderMachineBehavior::DoStart(), SoundTestBehavior::DoStart(), SoundNode::DoStart(), SimpleChaseBallBehavior::DoStart(), SegCamBehavior::DoStart(), RawCamBehavior::DoStart(), PlayMotionSequenceNode< SIZE >::DoStart(), MotionStressTestBehavior::DoStart(), MicrophoneServer::DoStart(), MCRepeater::DoStart(), LostTargetTrans::DoStart(), LookForSoundBehavior::DoStart(), LedNode::DoStart(), KinematicSampleBehavior2::DoStart(), KinematicSampleBehavior::DoStart(), HeadPointerNode::DoStart(), HeadPointControllerBehavior::DoStart(), HeadLevelBehavior::DoStart(), GroundPlaneBehavior::DoStart(), FollowHeadBehavior::DoStart(), ExploreMachine::DoStart(), EventTrans::DoStart(), EventGeneratorBase::DoStart(), EStopControllerBehavior::DoStart(), DriveMeBehavior::DoStart(), Controller::DoStart(), CompletionTrans::DoStart(), CompareTrans< T >::DoStart(), ChaseBallBehavior::DoStart(), CameraBehavior::DoStart(), BatteryMonitorBehavior::DoStart(), BanditMachine::WaitNode::DoStart(), AutoGetupBehavior::DoStart(), ASCIIVisionBehavior::DoStart(), AlanBehavior::DoStart(), ValueEditControl< T >::pause(), WallTestBehavior::processEvent(), MCRepeater::processEvent(), GroundPlaneBehavior::processEvent(), FollowHeadBehavior::processEvent(), EventGeneratorBase::processEvent(), AutoGetupBehavior::processEvent(), RunSequenceControl< SequenceSize >::selectedFile(), LoadPostureControl::selectedFile(), and EventGeneratorBase::setAutoListen(). |
|
calls the other addTimer() with the event's source id and duration, doesn't check to see if the generator is timerEGID
Definition at line 101 of file EventRouter.h. |
void EventRouter::addTimer |
( |
EventListener * |
el, |
|
|
unsigned int |
sid, |
|
|
unsigned int |
delay, |
|
|
bool |
repeat = true |
|
) |
|
|
|
adds a timer if it doesn't exist, or resets the timer if it already exists.
timers are unique by EventListener and source ID - can't have two timers for the same el and sid
a delay of 0 with repeating will cause an event to be sent at every opportunity, use sparingly
a delay of -1U will call removeTimer() if it already exists, otherwise is ignored
To add a timer, you can also call addListener() with EventBase::timerEGID and the sid and delay (in the EventBase::duration field) - this method will simply cause this function to be called internally.
- Parameters:
-
| el | the EventListener to send the timer event to |
| sid | the source ID to use on that event (if you need to send more info, send a pointer to a struct of your devising, typecasted as int) |
| delay | the delay between the first (and future) calls |
| repeat | set to true if you want to keep receiving this event, otherwise it will only send once |
Definition at line 53 of file EventRouter.cc.
Referenced by addListener(), addTimer(), WallTestBehavior::DoStart(), NullTrans::DoStart(), DriveMeBehavior::DoStart(), BanditMachine::WaitNode::DoStart(), PostureEditor::processEvent(), DriveMeBehavior::processEvent(), BatteryMonitorBehavior::processEvent(), PostureEditor::refresh(), TimeOutTrans::resetTimer(), FreeMemReportControl::resetTimerFreq(), WalkControllerBehavior::runCommand(), HeadPointControllerBehavior::runCommand(), and BatteryMonitorBehavior::startWarning(). |
|
adds a trapper for ALL events
Note that since timers are not broadcast, they cannot be trapped. Only the EventListener which requested the timer will receive that timer.
Definition at line 239 of file EventRouter.cc. |
|
Adds a trapper for a specific source id and type from a given event generator.
Note that since timers are not broadcast, they cannot be trapped. Only the EventListener which requested the timer will receive that timer.
Definition at line 229 of file EventRouter.cc. |
|
Adds a trapper for all types from a specific source and generator.
Note that since timers are not broadcast, they cannot be trapped. Only the EventListener which requested the timer will receive that timer.
Definition at line 219 of file EventRouter.cc. |
|
Adds a trapper for all events from a given event generator.
Note that since timers are not broadcast, they cannot be trapped. Only the EventListener which requested the timer will receive that timer.
Definition at line 210 of file EventRouter.cc. |
void EventRouter::chkTimers |
( |
|
) |
[inline, protected] |
|
void EventRouter::dispTimers |
( |
|
) |
[inline, protected] |
|
void EventRouter::doSendBuffer |
( |
|
) |
[protected] |
|
void EventRouter::doSendEvent |
( |
const EventBase & |
e |
) |
[protected] |
|
|
does the work of sending an event
Be aware this is an O(n^2) where n is the number of listeners for a particular event. This is because after each call to processEvent, the list of listeners could have changed so each listener much be verified before it is sent an event. New listeners won't get the current event, but neither should listeners which have just be removed
Definition at line 319 of file EventRouter.cc.
Referenced by doSendBuffer(), and processEvent(). |
unsigned int EventRouter::getBufferTime |
( |
|
) |
[inline] |
|
bool EventRouter::hasListeners |
( |
const EventBase & |
e |
) |
[inline] |
|
|
counts both listeners and trappers, so stuff can tell if it even needs to bother generating an event...
Definition at line 96 of file EventRouter.h. |
|
counts both listeners and trappers, so stuff can tell if it even needs to bother generating an event...
Definition at line 95 of file EventRouter.h. |
|
counts both listeners and trappers, so stuff can tell if it even needs to bother generating an event...
Definition at line 94 of file EventRouter.h. |
void EventRouter::postEvent |
( |
EventBase * |
e |
) |
[inline] |
|
|
recommended to create and post an event using current buffer setting
Definition at line 79 of file EventRouter.h. |
|
recommended to create and post an event using current buffer setting
Definition at line 78 of file EventRouter.h. |
|
recommended to create and post an event using current buffer setting
Definition at line 77 of file EventRouter.h.
Referenced by addListener(), addTrapper(), WMitem< T >::announce(), Controller::console_callback(), BallDetectionGenerator::createEvent(), StateNode::DoStart(), StateNode::DoStop(), SoundManager::endPlay(), Transition::fire(), MMCombo::GotAudio(), MMCombo::GotImage(), SoundManager::Play(), WorldStateVelDaemon::processEvent(), TailWagNode::processEvent(), SoundNode::processEvent(), SegmentedColorGenerator::processEvent(), RLEGenerator::processEvent(), RegionGenerator::processEvent(), RawCameraGenerator::processEvent(), PlayMotionSequenceNode< SIZE >::processEvent(), LedNode::processEvent(), JPEGGenerator::processEvent(), InterleavedYUVGenerator::processEvent(), HeadPointerNode::processEvent(), CDTGenerator::processEvent(), SoundManager::ReceivedMsg(), MotionManager::receivedMsg(), removeListener(), removeTrapper(), MMCombo::RPOPENR_notify(), EventTranslator::sendEvent(), SoundManager::StopPlay(), Controller::takeLine(), WMitem_base::unwatch(), and WMitem_base::watch(). |
void EventRouter::processEvent |
( |
const EventBase & |
e |
) |
[virtual] |
|
void EventRouter::processEventBuffer |
( |
|
) |
|
|
void EventRouter::processTimers |
( |
|
) |
|
|
void EventRouter::removeAllTimers |
( |
|
) |
|
|
|
stops sending specified events from the generator to the listener. If a timer is passed it will invoke removeTimer(el, e.getSourceID())
Definition at line 183 of file EventRouter.cc. |
|
stops sending specified events from the generator to the listener.
Definition at line 169 of file EventRouter.cc. |
|
stops sending specified events from the generator to the listener.
Definition at line 153 of file EventRouter.cc. |
|
stops sending specified events from the generator to the listener.
Definition at line 140 of file EventRouter.cc. |
|
stops sending ALL events to the listener, including timers
Definition at line 136 of file EventRouter.cc.
Referenced by ValueEditControl< T >::activate(), EventLogger::clearSlots(), WalkCalibration::deactivate(), PostureEditor::deactivate(), LoadPostureControl::deactivate(), BatteryCheckControl::deactivate(), SensorObserverControl::doSelect(), EventLogger::doSelect(), WorldStateVelDaemon::DoStop(), WorldStateSerializerBehavior::DoStop(), WMMonitorBehavior::DoStop(), WallTestBehavior::DoStop(), WalkToTargetNode::DoStop(), WalkControllerBehavior::DoStop(), VisualTargetTrans::DoStop(), VisualTargetCloseTrans::DoStop(), TimeOutTrans::DoStop(), TailWagNode::DoStop(), StareAtPawBehavior2::DoStop(), StareAtPawBehavior::DoStop(), StareAtBallBehavior::DoStop(), SpiderMachineBehavior::DoStop(), SoundTestBehavior::DoStop(), SoundNode::DoStop(), SimpleChaseBallBehavior::DoStop(), SegCamBehavior::DoStop(), RawCamBehavior::DoStop(), PlayMotionSequenceNode< SIZE >::DoStop(), NullTrans::DoStop(), MotionStressTestBehavior::DoStop(), MicrophoneServer::DoStop(), MCRepeater::DoStop(), LookForSoundBehavior::DoStop(), LedNode::DoStop(), KinematicSampleBehavior2::DoStop(), KinematicSampleBehavior::DoStop(), HeadPointerNode::DoStop(), HeadPointControllerBehavior::DoStop(), HeadLevelBehavior::DoStop(), GroundPlaneBehavior::DoStop(), FreeMemReportControl::DoStop(), FollowHeadBehavior::DoStop(), ExploreMachine::DoStop(), EventTrans::DoStop(), EventGeneratorBase::DoStop(), EStopControllerBehavior::DoStop(), DriveMeBehavior::DoStop(), Controller::DoStop(), CompletionTrans::DoStop(), CompareTrans< T >::DoStop(), ChaseBallBehavior::DoStop(), CameraBehavior::DoStop(), BatteryMonitorBehavior::DoStop(), BanditMachine::WaitNode::DoStop(), AutoGetupBehavior::DoStop(), ASCIIVisionBehavior::DoStop(), AlanBehavior::DoStop(), forgetListener(), PostureEditor::pause(), BatteryCheckControl::pause(), WallTestBehavior::processEvent(), RunSequenceControl< SequenceSize >::processEvent(), PostureEditor::processEvent(), MCRepeater::processEvent(), LoadPostureControl::processEvent(), GroundPlaneBehavior::processEvent(), FollowHeadBehavior::processEvent(), EventGeneratorBase::processEvent(), BanditMachine::WaitNode::processEvent(), AutoGetupBehavior::processEvent(), AlanBehavior::processEvent(), EventGeneratorBase::setAutoListen(), and EventGeneratorBase::unsetAutoListen(). |
void EventRouter::removeTimer |
( |
EventListener * |
el, |
|
|
unsigned int |
sid |
|
) |
|
|
|
clears any pending timers with source id sid for listener el
Definition at line 83 of file EventRouter.cc. |
|
stops sending ALL events to the trapper
Definition at line 285 of file EventRouter.cc. |
|
stops sending specified events from the generator to the trapper.
Definition at line 275 of file EventRouter.cc. |
|
stops sending specified events from the generator to the trapper.
Definition at line 263 of file EventRouter.cc. |
|
stops sending specified events from the generator to the trapper.
Definition at line 254 of file EventRouter.cc. |
void EventRouter::reset |
( |
|
) |
[inline] |
|
void EventRouter::setBufferTime |
( |
unsigned int |
t |
) |
[inline] |
|
Member Data Documentation
The documentation for this class was generated from the following files:
|