YARP
Yet Another Robot Platform
ServerFrameGrabber.cpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3  * SPDX-FileCopyrightText: 2006-2010 RobotCub Consortium
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include "ServerFrameGrabber.h"
8 
9 #include <yarp/os/LogComponent.h>
10 #include <yarp/os/LogStream.h>
12 
13 using namespace yarp::os;
14 using namespace yarp::dev;
15 using namespace yarp::sig;
16 
19 
20 namespace {
21 YARP_LOG_COMPONENT(SERVERFRAMEGRABBER, "yarp.device.grabber")
22 }
23 
25 {
26  if (!active) {
27  return false;
28  }
29  active = false;
30  thread.stop();
31  if (p2!=nullptr) {
32  delete p2;
33  p2 = nullptr;
34  }
35  return true;
36 }
37 
39 {
40  if (active) {
41  yCError(SERVERFRAMEGRABBER, "Did you just try to open the same ServerFrameGrabber twice?\n");
42  return false;
43  }
44 
45  // for AV, control whether output goes on a single port or multiple
46  bool separatePorts = false;
47 
48  p.setReader(*this);
49 
50  yarp::os::Value *name;
51 
52  if (config.check("subdevice",name,"name (or nested configuration) of device to wrap")) {
53  if (name->isString()) {
54  // maybe user isn't doing nested configuration
56  p.setMonitor(config.getMonitor(),
57  name->toString().c_str()); // pass on any monitoring
58  p.fromString(config.toString());
59  p.put("device",name->toString());
60  p.unput("subdevice");
61  poly.open(p);
62  } else {
63  Bottle subdevice = config.findGroup("subdevice").tail();
64  poly.open(subdevice);
65  }
66  if (!poly.isValid()) {
67  //yCError(SERVERFRAMEGRABBER, "cannot make <%s>\n", name->toString().c_str());
68  return false;
69  }
70  } else {
71  yCError(SERVERFRAMEGRABBER, "\"--subdevice <name>\" not set for server_framegrabber\n");
72  return false;
73  }
74  if (poly.isValid()) {
75  IAudioVisualStream *str;
76  poly.view(str);
77  bool a = true;
78  bool v = true;
79  bool vraw = true;
80  if (str!=nullptr) {
81  a = str->hasAudio();
82  v = str->hasVideo();
83  vraw = str->hasRawVideo();
84  }
85  if (v) {
86  poly.view(fgImage);
87  }
88  if (vraw) {
89  poly.view(fgImageRaw);
90  }
91  if (a) {
92  poly.view(fgSound);
93  }
94  if (a&&v) {
95  poly.view(fgAv);
96  }
97  poly.view(fgCtrl);
98  if (fgCtrl) {
99  ifgCtrl_Responder.configure(fgCtrl);
100  }
101  poly.view(fgTimed);
102  poly.view(rgbVis_p);
103 
104  bool conf = rgbParser.configure(rgbVis_p);
105 
106  if(!conf)
107  {
108  yCWarning(SERVERFRAMEGRABBER) << "ServerFrameGrabber: error configuring interfaces for parsers";
109  }
110  }
111 
112  canDrop = !config.check("no_drop","if present, use strict policy for sending data");
113  addStamp = config.check("stamp","if present, add timestamps to data");
114 
115  p.promiseType(Type::byName("yarp/image")); // TODO: reflect audio options
116  p.setWriteOnly();
117  p.open(config.check("name",Value("/grabber"),
118  "name of port to send data on").asString());
119 
120  /*
121  double framerate=0;
122  if (config.check("framerate", name,
123  "maximum rate in Hz to read from subdevice")) {
124  framerate=name->asFloat64();
125  }
126  */
127 
128  if (fgAv&&
129  !config.check("shared-ports",
130  "If present, send audio and images on same port")) {
131  separatePorts = true;
132  yCAssert(SERVERFRAMEGRABBER, p2==nullptr);
133  p2 = new Port;
134  yCAssert(SERVERFRAMEGRABBER, p2!=nullptr);
135  p2->open(config.check("name2",Value("/grabber2"),
136  "Name of second port to send data on, when audio and images sent separately").asString());
137  }
138 
139  if (fgAv!=nullptr) {
140  if (separatePorts) {
141  yCAssert(SERVERFRAMEGRABBER, p2!=nullptr);
142  thread.attach(new DataWriter2<yarp::sig::ImageOf<yarp::sig::PixelRgb>, yarp::sig::Sound>(p,*p2,*this,canDrop,addStamp));
143  } else {
144  thread.attach(new DataWriter<ImageRgbSound>(p,*this,canDrop,
145  addStamp));
146  }
147  } else if (fgImage!=nullptr) {
148  thread.attach(new DataWriter<yarp::sig::ImageOf<yarp::sig::PixelRgb> >(p,*this,canDrop,addStamp,fgTimed));
149  } else if (fgImageRaw!=nullptr) {
150  thread.attach(new DataWriter<yarp::sig::ImageOf<yarp::sig::PixelMono> >(p,*this,canDrop,addStamp,fgTimed));
151  } else {
152  yCError(SERVERFRAMEGRABBER, "subdevice <%s> doesn't look like a framegrabber\n",
153  name->toString().c_str());
154  return false;
155  }
156 
157  singleThreaded =
158  config.check("single_threaded",
159  "if present, operate in single threaded mode")!=0;
160  thread.open(config.check("framerate",Value("0"),
161  "maximum rate in Hz to read from subdevice").asFloat64(),
162  singleThreaded);
163  active = true;
164 
165 
166  DeviceResponder::makeUsage();
167  addUsage("[set] [bri] $fBrightness", "set brightness");
168  addUsage("[set] [expo] $fExposure", "set exposure");
169  addUsage("[set] [shar] $fSharpness", "set sharpness");
170  addUsage("[set] [whit] $fBlue $fRed", "set white balance");
171  addUsage("[set] [hue] $fHue", "set hue");
172  addUsage("[set] [satu] $fSaturation", "set saturation");
173  addUsage("[set] [gamm] $fGamma", "set gamma");
174  addUsage("[set] [shut] $fShutter", "set shutter");
175  addUsage("[set] [gain] $fGain", "set gain");
176  addUsage("[set] [iris] $fIris", "set iris");
177 
178  addUsage("[get] [bri]", "get brightness");
179  addUsage("[get] [expo]", "get exposure");
180  addUsage("[get] [shar]", "get sharpness");
181  addUsage("[get] [whit]", "get white balance");
182  addUsage("[get] [hue]", "get hue");
183  addUsage("[get] [satu]", "get saturation");
184  addUsage("[get] [gamm]", "get gamma");
185  addUsage("[get] [shut]", "get shutter");
186  addUsage("[get] [gain]", "get gain");
187  addUsage("[get] [iris]", "get iris");
188 
189  addUsage("[get] [w]", "get width of image");
190  addUsage("[get] [h]", "get height of image");
191 
192  return true;
193 }
194 
196  yarp::os::Bottle& response)
197 {
198  int code = cmd.get(0).asVocab32();
199 
200  auto* fgCtrlDC1394=dynamic_cast<IFrameGrabberControlsDC1394*>(fgCtrl);
201 
202  switch (code)
203  {
204  // first check if requests are coming from new iFrameGrabberControl2 interface and process them
206  {
207  return ifgCtrl_Responder.respond(cmd, response); // I don't like all those returns everywhere!!! :-(
208  } break;
210  {
211  return rgbParser.respond(cmd,response);
212  } break;
214  // DC1394 COMMANDS
217  {
218  if (fgCtrlDC1394)
219  {
220  int codeDC1394 = cmd.get(1).asVocab32();
221  switch(codeDC1394)
222  {
223  case VOCAB_DRGETMSK: // VOCAB_DRGETMSK 12
224  response.addInt32(int(fgCtrlDC1394->getVideoModeMaskDC1394()));
225  return true;
226  case VOCAB_DRGETVMD: // VOCAB_DRGETVMD 13
227  response.addInt32(int(fgCtrlDC1394->getVideoModeDC1394()));
228  return true;
229  case VOCAB_DRSETVMD: // VOCAB_DRSETVMD 14
230  response.addInt32(int(fgCtrlDC1394->setVideoModeDC1394(cmd.get(1).asInt32())));
231  return true;
232  case VOCAB_DRGETFPM: // VOCAB_DRGETFPM 15
233  response.addInt32(int(fgCtrlDC1394->getFPSMaskDC1394()));
234  return true;
235  case VOCAB_DRGETFPS: // VOCAB_DRGETFPS 16
236  response.addInt32(int(fgCtrlDC1394->getFPSDC1394()));
237  return true;
238  case VOCAB_DRSETFPS: // VOCAB_DRSETFPS 17
239  response.addInt32(int(fgCtrlDC1394->setFPSDC1394(cmd.get(1).asInt32())));
240  return true;
241 
242  case VOCAB_DRGETISO: // VOCAB_DRGETISO 18
243  response.addInt32(int(fgCtrlDC1394->getISOSpeedDC1394()));
244  return true;
245  case VOCAB_DRSETISO: // VOCAB_DRSETISO 19
246  response.addInt32(int(fgCtrlDC1394->setISOSpeedDC1394(cmd.get(1).asInt32())));
247  return true;
248 
249  case VOCAB_DRGETCCM: // VOCAB_DRGETCCM 20
250  response.addInt32(int(fgCtrlDC1394->getColorCodingMaskDC1394(cmd.get(1).asInt32())));
251  return true;
252  case VOCAB_DRGETCOD: // VOCAB_DRGETCOD 21
253  response.addInt32(int(fgCtrlDC1394->getColorCodingDC1394()));
254  return true;
255  case VOCAB_DRSETCOD: // VOCAB_DRSETCOD 22
256  response.addInt32(int(fgCtrlDC1394->setColorCodingDC1394(cmd.get(1).asInt32())));
257  return true;
258  case VOCAB_DRGETF7M: // VOCAB_DRGETF7M 25
259  {
260  unsigned int xstep,ystep,xdim,ydim,xoffstep,yoffstep;
261  fgCtrlDC1394->getFormat7MaxWindowDC1394(xdim,ydim,xstep,ystep,xoffstep,yoffstep);
262  response.addInt32(xdim);
263  response.addInt32(ydim);
264  response.addInt32(xstep);
265  response.addInt32(ystep);
266  response.addInt32(xoffstep);
267  response.addInt32(yoffstep);
268  }
269  return true;
270  case VOCAB_DRGETWF7: // VOCAB_DRGETWF7 26
271  {
272  unsigned int xdim,ydim;
273  int x0,y0;
274  fgCtrlDC1394->getFormat7WindowDC1394(xdim,ydim,x0,y0);
275  response.addInt32(xdim);
276  response.addInt32(ydim);
277  response.addInt32(x0);
278  response.addInt32(y0);
279  }
280  return true;
281  case VOCAB_DRSETWF7: // VOCAB_DRSETWF7 27
282  response.addInt32(int(fgCtrlDC1394->setFormat7WindowDC1394(cmd.get(1).asInt32(),cmd.get(2).asInt32(),cmd.get(3).asInt32(),cmd.get(4).asInt32())));
283  return true;
284  case VOCAB_DRSETOPM: // VOCAB_DRSETOPM 28
285  response.addInt32(int(fgCtrlDC1394->setOperationModeDC1394(cmd.get(1).asInt32()!=0)));
286  return true;
287  case VOCAB_DRGETOPM: // VOCAB_DRGETOPM 29
288  response.addInt32(fgCtrlDC1394->getOperationModeDC1394());
289  return true;
290 
291  case VOCAB_DRSETTXM: // VOCAB_DRSETTXM 30
292  response.addInt32(int(fgCtrlDC1394->setTransmissionDC1394(cmd.get(1).asInt32()!=0)));
293  return true;
294  case VOCAB_DRGETTXM: // VOCAB_DRGETTXM 31
295  response.addInt32(fgCtrlDC1394->getTransmissionDC1394());
296  return true;
297  /*
298  case VOCAB_DRSETBAY: // VOCAB_DRSETBAY 32
299  response.addInt32(int(fgCtrlDC1394->setBayerDC1394(bool(cmd.get(1).asInt32()))));
300  return true;
301  case VOCAB_DRGETBAY: // VOCAB_DRGETBAY 33
302  response.addInt32(fgCtrlDC1394->getBayerDC1394());
303  return true;
304  */
305  case VOCAB_DRSETBCS: // VOCAB_DRSETBCS 34
306  response.addInt32(int(fgCtrlDC1394->setBroadcastDC1394(cmd.get(1).asInt32()!=0)));
307  return true;
308  case VOCAB_DRSETDEF: // VOCAB_DRSETDEF 35
309  response.addInt32(int(fgCtrlDC1394->setDefaultsDC1394()));
310  return true;
311  case VOCAB_DRSETRST: // VOCAB_DRSETRST 36
312  response.addInt32(int(fgCtrlDC1394->setResetDC1394()));
313  return true;
314  case VOCAB_DRSETPWR: // VOCAB_DRSETPWR 37
315  response.addInt32(int(fgCtrlDC1394->setPowerDC1394(cmd.get(1).asInt32()!=0)));
316  return true;
317  case VOCAB_DRSETCAP: // VOCAB_DRSETCAP 38
318  response.addInt32(int(fgCtrlDC1394->setCaptureDC1394(cmd.get(1).asInt32()!=0)));
319  return true;
320  case VOCAB_DRSETBPP: // VOCAB_DRSETCAP 39
321  response.addInt32(int(fgCtrlDC1394->setBytesPerPacketDC1394(cmd.get(1).asInt32())));
322  return true;
323  case VOCAB_DRGETBPP: // VOCAB_DRGETTXM 40
324  response.addInt32(fgCtrlDC1394->getBytesPerPacketDC1394());
325  return true;
326  default:
327  return DeviceResponder::respond(cmd,response);
328  }
329  }
330  }
331  }
332  yCError(SERVERFRAMEGRABBER) << "ServerFrameGrabber: command not recognized" << cmd.toString();
333  return DeviceResponder::respond(cmd,response);
334 }
335 
336 /*
337 bool ServerFrameGrabber::read(ConnectionReader& connection)
338 {
339  yarp::os::Bottle cmd, response;
340  if (!cmd.read(connection)) { return false; }
341  yCDebug(SERVERFRAMEGRABBER, "command received: %s\n", cmd.toString().c_str());
342  int code = cmd.get(0).asVocab32();
343  switch (code) {
344  case VOCAB_SET:
345  yCDebug(SERVERFRAMEGRABBER, "set command received\n");
346  {
347  bool ok = false;
348  switch(cmd.get(1).asVocab32()) {
349  case VOCAB_BRIGHTNESS:
350  ok = setBrightness(cmd.get(2).asFloat64());
351  break;
352  case VOCAB_SHUTTER:
353  ok = setShutter(cmd.get(2).asFloat64());
354  break;
355  case VOCAB_GAIN:
356  ok = setGain(cmd.get(2).asFloat64());
357  break;
358  case VOCAB_WHITE:
359  ok = setWhiteBalance(cmd.get(2).asFloat64(),
360  cmd.get(3).asFloat64());
361  break;
362  }
363  }
364  break;
365  case VOCAB_GET:
366  yCDebug(SERVERFRAMEGRABBER, "get command received\n");
367  {
368  bool ok = false;
369  response.addVocab32(VOCAB_IS);
370  response.add(cmd.get(1));
371  switch(cmd.get(1).asVocab32()) {
372  case VOCAB_BRIGHTNESS:
373  ok = true;
374  response.addFloat64(getBrightness());
375  break;
376  case VOCAB_SHUTTER:
377  ok = true;
378  response.addFloat64(getShutter());
379  break;
380  case VOCAB_GAIN:
381  ok = true;
382  response.addFloat64(getGain());
383  break;
384  case VOCAB_WIDTH:
385  // normally, this would come from stream information
386  ok = true;
387  response.addInt32(width());
388  break;
389  case VOCAB_HEIGHT:
390  // normally, this would come from stream information
391  ok = true;
392  response.addInt32(height());
393  break;
394 
395  case VOCAB_WHITE:
396 
397  double r;
398 
399  double g;
400 
401  ok=getWhiteBalance(r, g);
402 
403  response.addFloat64(r);
404 
405  response.addFloat64(g);
406  }
407  if (!ok) {
408  // leave answer blank
409  }
410  }
411  break;
412  }
413  if (response.size()>=1) {
414  ConnectionWriter *writer = connection.getWriter();
415  if (writer!=NULL) {
416  response.write(*writer);
417  yCDebug(SERVERFRAMEGRABBER, "response sent: %s\n", response.toString().c_str());
418  }
419  }
420  return true;
421 }
422 */
423 
425 {
426  return getImage(image);
427 }
428 
430 {
431  return getImage(image);
432 }
433 
435 {
436  return getDatum(imageSound.head,imageSound.body);
437 }
438 
440  yarp::sig::Sound& sound)
441 {
442  return getAudioVisual(image,sound);
443 }
444 
446 {
447  if (fgImage==nullptr) { return false; }
448  return fgImage->getImage(image);
449 }
450 
452 {
453  if (fgImageRaw==nullptr) { return false; }
454  return fgImageRaw->getImage(image);
455 }
456 
458  yarp::sig::Sound& sound)
459 {
460  if (fgAv==nullptr) { return false; }
461  return fgAv->getAudioVisual(image,sound);
462 }
463 
465 {
466  if (fgImage) { return fgImage->height(); }
467  if (fgImageRaw) { return fgImageRaw->height(); }
468  return 0;
469 }
470 
472 {
473  if (fgImage) { return fgImage->width(); }
474  if (fgImageRaw) { return fgImageRaw->width(); }
475  return 0;
476 }
477 
479 {
480  return close();
481 }
482 
484 {
485  if (singleThreaded) {
486  return false;
487  }
488  return active;
489 }
490 
491 
493 {
494  if (singleThreaded) {
495  if (active) {
496  thread.step();
497  }
498  return active;
499  }
500  return false;
501 }
502 
constexpr yarp::conf::vocab32_t VOCAB_DRGETISO
Definition: CameraVocabs.h:73
constexpr yarp::conf::vocab32_t VOCAB_DRSETFPS
Definition: CameraVocabs.h:72
constexpr yarp::conf::vocab32_t VOCAB_DRSETDEF
Definition: CameraVocabs.h:90
constexpr yarp::conf::vocab32_t VOCAB_DRSETVMD
Definition: CameraVocabs.h:69
constexpr yarp::conf::vocab32_t VOCAB_RGB_VISUAL_PARAMS
Definition: CameraVocabs.h:18
constexpr yarp::conf::vocab32_t VOCAB_FRAMEGRABBER_CONTROL_DC1394
Definition: CameraVocabs.h:40
constexpr yarp::conf::vocab32_t VOCAB_DRSETWF7
Definition: CameraVocabs.h:82
constexpr yarp::conf::vocab32_t VOCAB_DRGETF7M
Definition: CameraVocabs.h:80
constexpr yarp::conf::vocab32_t VOCAB_DRSETBCS
Definition: CameraVocabs.h:89
constexpr yarp::conf::vocab32_t VOCAB_DRSETCAP
Definition: CameraVocabs.h:93
constexpr yarp::conf::vocab32_t VOCAB_DRSETCOD
Definition: CameraVocabs.h:77
constexpr yarp::conf::vocab32_t VOCAB_DRGETMSK
Definition: CameraVocabs.h:67
constexpr yarp::conf::vocab32_t VOCAB_DRGETFPS
Definition: CameraVocabs.h:71
constexpr yarp::conf::vocab32_t VOCAB_DRSETOPM
Definition: CameraVocabs.h:83
constexpr yarp::conf::vocab32_t VOCAB_DRGETBPP
Definition: CameraVocabs.h:95
constexpr yarp::conf::vocab32_t VOCAB_DRSETPWR
Definition: CameraVocabs.h:92
constexpr yarp::conf::vocab32_t VOCAB_DRGETCCM
Definition: CameraVocabs.h:75
constexpr yarp::conf::vocab32_t VOCAB_DRGETTXM
Definition: CameraVocabs.h:86
constexpr yarp::conf::vocab32_t VOCAB_DRSETRST
Definition: CameraVocabs.h:91
constexpr yarp::conf::vocab32_t VOCAB_DRSETBPP
Definition: CameraVocabs.h:94
constexpr yarp::conf::vocab32_t VOCAB_DRGETWF7
Definition: CameraVocabs.h:81
constexpr yarp::conf::vocab32_t VOCAB_DRGETVMD
Definition: CameraVocabs.h:68
constexpr yarp::conf::vocab32_t VOCAB_DRGETFPM
Definition: CameraVocabs.h:70
constexpr yarp::conf::vocab32_t VOCAB_DRSETTXM
Definition: CameraVocabs.h:85
constexpr yarp::conf::vocab32_t VOCAB_FRAMEGRABBER_CONTROL
Definition: CameraVocabs.h:39
constexpr yarp::conf::vocab32_t VOCAB_DRGETCOD
Definition: CameraVocabs.h:76
constexpr yarp::conf::vocab32_t VOCAB_DRSETISO
Definition: CameraVocabs.h:74
constexpr yarp::conf::vocab32_t VOCAB_DRGETOPM
Definition: CameraVocabs.h:84
bool close() override
Close the DeviceDriver.
virtual bool respond(const yarp::os::Bottle &command, yarp::os::Bottle &reply) override
Respond to a message.
int width() const override
Return the width of each frame.
bool getDatum(yarp::sig::ImageOf< yarp::sig::PixelRgb > &image) override
bool stopService() override
Shut down the service, whatever it is.
bool startService() override
Initiate the service, whatever it is.
bool getImage(yarp::sig::ImageOf< yarp::sig::PixelRgb > &image) override
bool open(yarp::os::Searchable &config) override
Configure with a set of options.
int height() const override
Return the height of each frame.
virtual bool getAudioVisual(yarp::sig::ImageOf< yarp::sig::PixelRgb > &image, yarp::sig::Sound &sound) override
Get an image and sound.
bool updateService() override
Give the service the chance to run for a while.
A simple collection of objects that can be described and transmitted in a portable way.
Definition: Bottle.h:74
Value & get(size_type index) const
Reads a Value v from a certain part of the list.
Definition: Bottle.cpp:246
Bottle tail() const
Get all but the first element of a bottle.
Definition: Bottle.cpp:388
void addInt32(std::int32_t x)
Places a 32-bit integer in the bottle, at the end of the list.
Definition: Bottle.cpp:140
std::string toString() const override
Gives a human-readable textual representation of the bottle.
Definition: Bottle.cpp:211
A mini-server for network communication.
Definition: Port.h:47
Group a pair of objects to be sent and received together.
Definition: PortablePair.h:48
BODY body
An object of the second type (BODY).
Definition: PortablePair.h:58
HEAD head
An object of the first type (HEAD).
Definition: PortablePair.h:53
A class for storing options and configuration information.
Definition: Property.h:34
void fromString(const std::string &txt, bool wipe=true)
Interprets a string as a list of properties.
Definition: Property.cpp:1063
void put(const std::string &key, const std::string &value)
Associate the given key with the given string.
Definition: Property.cpp:1015
void unput(const std::string &key)
Remove the association from the given key to a value, if present.
Definition: Property.cpp:1046
A base class for nested structures that can be searched.
Definition: Searchable.h:66
virtual bool check(const std::string &key) const =0
Check if there exists a property of the given name.
virtual std::string toString() const =0
Return a standard text representation of the content of the object.
virtual Bottle & findGroup(const std::string &key) const =0
Gets a list corresponding to a given keyword.
static Type byName(const char *name)
Definition: Type.cpp:171
A single value (typically within a Bottle).
Definition: Value.h:45
virtual bool isString() const
Checks if value is a string.
Definition: Value.cpp:156
virtual yarp::conf::vocab32_t asVocab32() const
Get vocabulary identifier as an integer.
Definition: Value.cpp:228
virtual std::int32_t asInt32() const
Get 32-bit integer value.
Definition: Value.cpp:204
std::string toString() const override
Return a standard text representation of the content of the object.
Definition: Value.cpp:356
Class for storing sounds See Audio in YARP for additional documentation on YARP audio.
Definition: Sound.h:26
#define yCError(component,...)
Definition: LogComponent.h:154
#define yCAssert(component, x)
Definition: LogComponent.h:169
#define yCWarning(component,...)
Definition: LogComponent.h:143
#define YARP_LOG_COMPONENT(name,...)
Definition: LogComponent.h:77
An interface for the device drivers.
An interface to the operating system, including Port based communication.
Signal processing.
Definition: Image.h:22
#define YARP_WARNING_POP
Ends a temporary alteration of the enabled warnings.
Definition: system.h:332
#define YARP_WARNING_PUSH
Starts a temporary alteration of the enabled warnings.
Definition: system.h:331
#define YARP_DISABLE_DEPRECATED_WARNING
Disable deprecated warnings in the following code.
Definition: system.h:333