YARP
Yet Another Robot Platform
An example which shows how to use C++ and DLLS to modify incoming data in an input port

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

  • Open a terminal and follow the below instruction to compile and build the dll
       $ mkdir $YARP_ROOT/example/portmonitor/simple_dll/build
       $ cd $YARP_ROOT/example/portmonitor/simple_dll/build
       $ cmake ../; make;
    

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
    
  • In another terminal connect the port as follow:
       $ yarp connect /write /read tcp+recv.portmonitor+type.dll+file.simple_monitor
    

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

class SimpleMonitorObject : public yarp::os::MonitorObject
{
public:
bool create(const yarp::os::Property& options) override;
void destroy() override;
bool setparam(const yarp::os::Property& params) override;
bool getparam(yarp::os::Property& params) override;
void trig() override;
bool accept(yarp::os::Things& thing) override;
};

SimpleMonitorObject.cpp

#include <stdio.h>
#include <yarp/os/Bottle.h>
#include "Simple.h"
using namespace yarp::os;
YARP_DEFINE_SHARED_SUBCLASS(MonitorObject_there, SimpleMonitorObject, MonitorObject);
bool SimpleMonitorObject::create(const yarp::os::Property& options)
{
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");
}
bool SimpleMonitorObject::setparam(const yarp::os::Property& params)
{
return false;
}
bool SimpleMonitorObject::getparam(yarp::os::Property& params)
{
return false;
}
bool SimpleMonitorObject::accept(yarp::os::Things& thing)
{
Bottle* bt = thing.cast_as<Bottle>();
if(bt == NULL) {
printf("SimpleMonitorObject: expected type Bottle but got wrong data type!\n");
return false;
}
if(bt->toString() == "ignore")
return false;
return true;
}
yarp::os::Things& SimpleMonitorObject::update(yarp::os::Things& thing)
{
Bottle* bt = thing.cast_as<Bottle>();
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()
{
}
yarp::os::Bottle
A simple collection of objects that can be described and transmitted in a portable way.
Definition: Bottle.h:73
yarp::os::Bottle::toString
std::string toString() const override
Gives a human-readable textual representation of the bottle.
Definition: Bottle.cpp:214
yarp::os::MonitorObject::setparam
virtual bool setparam(const yarp::os::Property &params)
This will be called when the portmonitor carrier parameters are set via Yarp admin port.
Definition: MonitorObject.cpp:25
yarp::os::MonitorObject::getparam
virtual bool getparam(yarp::os::Property &params)
This will be called when the portmonitor carrier parameters are requested via Yarp admin port.
Definition: MonitorObject.cpp:31
yarp::os::MonitorObject
Definition: MonitorObject.h:26
yarp::os::Things
Base class for generic things.
Definition: Things.h:22
yarp::os::Property::find
Value & find(const std::string &key) const override
Gets a value corresponding to a given keyword.
Definition: Property.cpp:1034
yarp::os::MonitorObject::create
virtual bool create(const yarp::os::Property &options)
This will be called when the dll is properly loaded by the portmonitor carrier.
Definition: MonitorObject.cpp:15
yarp::os::MonitorObject::accept
virtual bool accept(yarp::os::Things &thing)
This will be called when the data reach the portmonitor object.
Definition: MonitorObject.cpp:41
yarp::os::Value::asBool
virtual bool asBool() const
Get boolean value.
Definition: Value.cpp:189
YARP_DEFINE_SHARED_SUBCLASS
#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...
Definition: SharedLibraryClassApi.h:79
yarp::os::MonitorObject::trig
virtual void trig()
This will be called when one of the peer connections to the same import port receives data.
Definition: MonitorObject.cpp:37
yarp::os::Bottle::addString
void addString(const char *str)
Places a string in the bottle, at the end of the list.
Definition: Bottle.cpp:173
yarp::os::Things::cast_as
T * cast_as()
Definition: Things.h:57
MonitorObject.h
yarp::os
An interface to the operating system, including Port based communication.
Definition: AbstractCarrier.h:17
SharedLibraryClass.h
yarp::os::MonitorObject::update
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...
Definition: MonitorObject.cpp:47
Bottle.h
yarp::os::Property
A class for storing options and configuration information.
Definition: Property.h:37
yarp::os::MonitorObject::destroy
virtual void destroy()
This will be called when the portmonitor object destroyes.
Definition: MonitorObject.cpp:21