Description
This example demonstrates how to simply use the port monitor carrier to modify data going through a connection. The port '/write' from 'yarp write' module is connected to the '/read' port of 'yarp read' using a portmonitor plugged into the receiver side. The portmoniotr loads a dll ('libsimple_monitor.so'
) in which we access and modify the data going through the port.
Requirements
- Enable and compile portmonitor carrier (ENABLE_yarpcar_portmonitor_carrier=ON in YARP cmake).
Running the example
you should see the 'libsimple_monitor.so'
after the compilation (the generated dll can have different names on windows or mac os).
- Open a terminal and run yarpserver
$ yarpserver
- Open another terminal (lets call this the sender terminal) and type
$ yarp write /write
- In the directory where you you built the dll (lets call this the receiver terminal), type
$ yarp read /read
Now if you write something in the 'sender' terminal, you will see the text "Modified in DLL" will be added to the original message. For example:
[sender terminal]
Hello
[receiver terminal]
Hello "Modified in DLL"
As it is constrained in ‘SimpleMonitorObject::accept()’ method from ‘Simple.cpp’, if you type "ignore", the message will be ignored by the portmonitor and it never be delivered to the input port.
Code Samples
SimpleMonitorObject.h
{
public:
};
virtual void trig()
This will be called when one of the peer connections to the same import port receives data.
virtual bool setparam(const yarp::os::Property ¶ms)
This will be called when the portmonitor carrier parameters are set via YARP admin port.
virtual yarp::os::Things & update(yarp::os::Things &thing)
After data get accpeted in the accept() callback, an instance of that is given to the update function...
virtual bool getparam(yarp::os::Property ¶ms)
This will be called when the portmonitor carrier parameters are requested via YARP admin port.
virtual void destroy()
This will be called when the portmonitor object destroyes.
virtual bool accept(yarp::os::Things &thing)
This will be called when the data reach the portmonitor object.
virtual bool create(const yarp::os::Property &options)
This will be called when the dll is properly loaded by the portmonitor carrier.
A class for storing options and configuration information.
Base class for generic things.
SimpleMonitorObject.cpp
#include "Simple.h"
#include <stdio.h>
{
printf("created!\n");
printf("I am attached to the %s\n",
(options.
find(
"sender_side").
asBool()) ?
"sender side" :
"receiver side");
return true;
}
void SimpleMonitorObject::destroy()
{
printf("destroyed!\n");
}
{
return false;
}
{
return false;
}
{
if (bt == NULL) {
printf("SimpleMonitorObject: expected type Bottle but got wrong data type!\n");
return false;
}
if (bt->toString() == "ignore")
return false;
return true;
}
{
if (bt == NULL) {
printf("SimpleMonitorObject: expected type Bottle but got wrong data type!\n");
return thing;
}
bt->addString("Modified in DLL");
return thing;
}
void SimpleMonitorObject::trig()
{
}
#define YARP_DEFINE_SHARED_SUBCLASS(factoryname, classname, basename)
Macro to create a bunch of functions with undecorated names that can be found within a plugin library...
A simple collection of objects that can be described and transmitted in a portable way.
Value & find(const std::string &key) const override
Gets a value corresponding to a given keyword.
virtual bool asBool() const
Get boolean value.