This example demonstrates how to use port monitor to coordinate different modules by arbitrating their connections in the input port. Each port monitor can be set with a selection rule (constraint). The rule is simply written in first order logic (boolean expression) based on some symbolic name. We call these symbols as events. Port monitors from peer connections (the connections to the same input port) can set (add) or unset (remove) events in a shared event record. If an event is set, it has a true value in the corresponding boolean expression; otherwise it is false. When data arrives to the port from a connection, the corresponding port monitor evaluate the boolean expression and if it is true (the constraint is satisfied), the data can be delivered to the port; otherwise it is discarded.
A port monitor can set the selection rule (for its own connection) using ‘PortMonitor.setConstraint()’. For example:
PortMonitor.setConstraint("not e_ball")
Normally events have infinite life time. This means that they remain valid in the container until they are explicitly removed by the monitor object. An event can also have a specific life time. A time event will be automatically removed from the container when its life time is over. For example, the following time event will be expired after 500ms:
PortMonitor.setEvent("e_ball", 0.5)
\Note The following keywords are reserved and cannot be used for event's name:
{ true, false, not, and, or }
This simple example shows the arbitration of two different connections to the same port of "yarpview" using Port Monitor objects and time events.
In this example we want to prioritize the connection "/Ball/grabber" over '/Line/grabber' so when it is activated, it can inhibits the connection '/Line/grabber'. A port monitor is attached to the "/Ball/grabber" which alternatively activates and deactivates it every 5 seconds. When "/Ball/grabber" is active, its data can be delivered to the "yarpview". To resolve conflicting with the image data coming from '/Line/grabber', it also continuously sets a time events (i.e., 'e_ball') which is used as the constraint for not selecting '/Line/grabber'. When "/Ball/grabber" is not active, the time events will be expired and '/Line/grabber' gets the chance to deliver its data to the "yarpview". As the result, "yarpview" switches between different images coming from "/Ball/grabber" and "/Line/grabber" periodically.
$ yarpserver
$ cd $YARP_ROOT/example/portmonitor/arbitration_tevent $ yarpmanager-console --application TestArbitratorImage.xml
>> run >> connect
>> stop >> exit