bool PolyDriver::coreOpen(yarp::os::Searchable& prop) { yarp::os::Searchable *config = ∝ Property p; ConstString str = prop.toString(); Value *part; if (prop.check("device",part)) { str = part->toString().c_str(); } Bottle bot(str.c_str()); if (bot.size()>1) { // this wasn't a device name, but some codes -- rearrange p.fromString(str.c_str()); str = p.find("device").asString().c_str(); config = &p; } DeviceDriver *driver = NULL; DriverCreator *creator = Drivers::factory().find(str.c_str()); if (creator!=NULL) { Value *val; if (config->check("wrapped",val)&&(creator->getWrapper()!="")) { ConstString wrapper = creator->getWrapper(); DriverCreator *wrapCreator = Drivers::factory().find(wrapper.c_str()); if (wrapCreator!=NULL) { p.fromString(config->toString()); p.unput("wrapped"); config = &p; if (wrapCreator!=creator) { p.put("subdevice",str.c_str()); p.put("device",wrapper.c_str()); p.setMonitor(prop.getMonitor(), wrapper.c_str()); // pass on any monitoring driver = wrapCreator->create(); creator = wrapCreator; } else { // already wrapped driver = creator->create(); } } } else { driver = creator->create(); } } else { // FIXME do not use yarpdev here printf("yarpdev: ***ERROR*** could not find device <%s>\n", str.c_str()); } if (driver!=NULL) { PolyDriver *manager = creator->owner(); if (manager!=NULL) { link(*manager); return true; } //printf("yarpdev: parameters are %s\n", config->toString().c_str()); bool ok = driver->open(*config); if (!ok) { printf("yarpdev: ***ERROR*** driver <%s> was found but could not open\n", config->find("device").toString().c_str()); //YARP_DEBUG(Logger::get(),String("Discarding ") + str); delete driver; //YARP_DEBUG(Logger::get(),String("Discarded ") + str); driver = NULL; } else { yarp::dev::DeprecatedDeviceDriver *ddd = NULL; driver->view(ddd); if(ddd) { if(config->check("allow-deprecated-devices")) { yWarning("Device \"%s\" is deprecated. Opening since the \"allow-deprecated-devices\" option was passed in the configuration.", str.c_str()); } else { yError("Device \"%s\" is deprecated. Pass the \"allow-deprecated-devices\" option in the configuration if you want to open it anyway.", str.c_str()); driver->close(); delete driver; return false; } } if (creator!=NULL) { ConstString name = creator->getName(); ConstString wrapper = creator->getWrapper(); ConstString code = creator->getCode(); yInfo("created %s <%s>. See C++ class %s for documentation.", ((name==wrapper)?"wrapper":"device"), name.c_str(), code.c_str()); } } dd = driver; return true; } return false; }
int main(int argc, char *argv[]) { Property p; p.fromCommand(argc,argv); // check where to put description of device ConstString dest = ""; dest = p.check("doc",Value("")).toString(); ConstString fileName = p.check("file",Value("default.ini")).asString(); if (p.check("file")) { p.fromConfigFile(fileName); } ConstString deviceName = p.check("device",Value("")).asString(); // if no device given, we should be operating a completely // standard test harness like for libYARP_OS and libYARP_sig if (deviceName=="") { return harness_main(argc,argv); } // device name given - use special device testing procedure #ifdef CHECK_FOR_LEAKS mtrace(); #endif int result = 0; Network::init(); Network::setLocalMode(true); String seek = fileName.c_str(); ConstString exampleName = ""; int pos = seek.rfind('/'); if (pos==-1) { pos = seek.rfind('\\'); } if (pos==-1) { pos = 0; } else { pos++; } int len = seek.find('.',pos); if (len==-1) { len = seek.length(); } else { len -= pos; } exampleName = seek.substr(pos,len).c_str(); ConstString shortFileName = seek.substr(pos,seek.length()).c_str(); PolyDriver dd; YARP_DEBUG(Logger::get(), "harness opening..."); bool ok = dd.open(p); YARP_DEBUG(Logger::get(), "harness opened."); result = ok?0:1; ConstString wrapperName = ""; ConstString codeName = ""; DriverCreator *creator = Drivers::factory().find(deviceName.c_str()); if (creator!=NULL) { wrapperName = creator->getWrapper(); codeName = creator->getCode(); } if (dest!="") { String dest2 = dest.c_str(); if (result!=0) { dest2 += ".fail"; } FILE *fout = fopen(dest2.c_str(),"w"); if (fout==NULL) { printf("Problem writing to %s\n", dest2.c_str()); exit(1); } fprintf(fout,"/**\n"); fprintf(fout," * \\ingroup dev_examples\n"); fprintf(fout," *\n"); fprintf(fout," * \\defgroup %s Example for %s (%s)\n\n", exampleName.c_str(), deviceName.c_str(), exampleName.c_str()); fprintf(fout, "Instantiates \\ref cmd_device_%s \"%s\" device implemented by yarp::dev::%s.\n", deviceName.c_str(), deviceName.c_str(), codeName.c_str()); fprintf(fout, "\\verbatim\n%s\\endverbatim\n", getFile(fileName).c_str()); fprintf(fout, "If this text is saved in a file called %s then the device can be created by doing:\n", shortFileName.c_str()); fprintf(fout, "\\verbatim\nyarpdev --file %s\n\\endverbatim\n", shortFileName.c_str()); fprintf(fout, "Of course, the configuration could be passed just as command line options, or as a yarp::os::Property object in a program:\n"); fprintf(fout, "\\code\n"); fprintf(fout, "Property p;\n"); fprintf(fout, "p.fromConfigFile(\"%s\");\n", shortFileName.c_str()); fprintf(fout, "// of course you could construct the Property object on-the-fly\n"); fprintf(fout, "PolyDriver dev;\n"); fprintf(fout, "dev.open(p);\n"); fprintf(fout, "if (dev.isValid()) { /* use the device via view method */ }\n" ); fprintf(fout, "\\endcode\n"); fprintf(fout, "Here is a list of properties checked when starting up a device based on this configuration file. Note that which properties are checked can depend on whether other properties are present. In some cases properties can also vary between operating systems. So this is just an example\n\n"); toDox(dd,fout); fprintf(fout, "\n\\sa yarp::dev::%s\n\n", codeName.c_str()); fprintf(fout, " */\n"); fclose(fout); fout = NULL; } if (ok) { YARP_DEBUG(Logger::get(), "harness closing..."); dd.close(); YARP_DEBUG(Logger::get(), "harness closed."); } // just checking for crashes, not device creation return result; //result; }
int main(int argc, char *argv[]) { Property p; p.fromCommand(argc,argv); // To make sure that the dev test are able to find all the devices // compile by YARP, also the one compiled as dynamic plugins // we add the build directory to the YARP_DATA_DIRS enviromental variable // CMAKE_CURRENT_DIR is the define by the CMakeLists.txt tests file ConstString dirs = CMAKE_BINARY_DIR + yarp::os::Network::getDirectorySeparator() + "share" + yarp::os::Network::getDirectorySeparator() + "yarp"; // Add TEST_DATA_DIR to YARP_DATA_DIRS in order to find the contexts used // by the tests dirs += yarp::os::Network::getPathSeparator() + TEST_DATA_DIR; // If set, append user YARP_DATA_DIRS // FIXME check if this can be removed Network::getEnvironment("YARP_DATA_DIRS"); if (!Network::getEnvironment("YARP_DATA_DIRS").empty()) { dirs += yarp::os::Network::getPathSeparator() + Network::getEnvironment("YARP_DATA_DIRS"); } Network::setEnvironment("YARP_DATA_DIRS", dirs); printf("YARP_DATA_DIRS=\"%s\"\n", Network::getEnvironment("YARP_DATA_DIRS").c_str()); // check where to put description of device ConstString dest = ""; dest = p.check("doc",Value("")).toString(); ConstString fileName = p.check("file",Value("default.ini")).asString(); if (p.check("file")) { p.fromConfigFile(fileName); } ConstString deviceName = p.check("device",Value("")).asString(); // if no device given, we should be operating a completely // standard test harness like for libYARP_OS and libYARP_sig if (deviceName=="") { return harness_main(argc,argv); } // device name given - use special device testing procedure #ifdef CHECK_FOR_LEAKS mtrace(); #endif int result = 0; Network::init(); Network::setLocalMode(true); ConstString seek = fileName.c_str(); ConstString exampleName = ""; int pos = seek.rfind('/'); if (pos==-1) { pos = seek.rfind('\\'); } if (pos==-1) { pos = 0; } else { pos++; } int len = seek.find('.',pos); if (len==-1) { len = seek.length(); } else { len -= pos; } exampleName = seek.substr(pos,len).c_str(); ConstString shortFileName = seek.substr(pos,seek.length()).c_str(); PolyDriver dd; YARP_DEBUG(Logger::get(), "harness opening..."); bool ok = dd.open(p); YARP_DEBUG(Logger::get(), "harness opened."); result = ok?0:1; ConstString wrapperName = ""; ConstString codeName = ""; DriverCreator *creator = Drivers::factory().find(deviceName.c_str()); if (creator!=nullptr) { wrapperName = creator->getWrapper(); codeName = creator->getCode(); } if (dest!="") { ConstString dest2 = dest.c_str(); if (result!=0) { dest2 += ".fail"; } FILE *fout = fopen(dest2.c_str(),"w"); if (fout==nullptr) { printf("Problem writing to %s\n", dest2.c_str()); std::exit(1); } fprintf(fout,"/**\n"); fprintf(fout," * \\ingroup dev_examples\n"); fprintf(fout," *\n"); fprintf(fout," * \\defgroup %s Example for %s (%s)\n\n", exampleName.c_str(), deviceName.c_str(), exampleName.c_str()); fprintf(fout, "Instantiates \\ref cmd_device_%s \"%s\" device implemented by %s.\n", deviceName.c_str(), deviceName.c_str(), codeName.c_str()); fprintf(fout, "\\verbatim\n%s\\endverbatim\n", getFile(fileName.c_str()).c_str()); fprintf(fout, "If this text is saved in a file called %s then the device can be created by doing:\n", shortFileName.c_str()); fprintf(fout, "\\verbatim\nyarpdev --file %s\n\\endverbatim\n", shortFileName.c_str()); fprintf(fout, "Of course, the configuration could be passed just as command line options, or as a yarp::os::Property object in a program:\n"); fprintf(fout, "\\code\n"); fprintf(fout, "Property p;\n"); fprintf(fout, "p.fromConfigFile(\"%s\");\n", shortFileName.c_str()); fprintf(fout, "// of course you could construct the Property object on-the-fly\n"); fprintf(fout, "PolyDriver dev;\n"); fprintf(fout, "dev.open(p);\n"); fprintf(fout, "if (dev.isValid()) { /* use the device via view method */ }\n" ); fprintf(fout, "\\endcode\n"); fprintf(fout, "Here is a list of properties checked when starting up a device based on this configuration file. Note that which properties are checked can depend on whether other properties are present. In some cases properties can also vary between operating systems. So this is just an example\n\n"); toDox(dd,fout); fprintf(fout, "\n\\sa %s\n\n", codeName.c_str()); fprintf(fout, " */\n"); fclose(fout); fout = nullptr; } if (ok) { YARP_DEBUG(Logger::get(), "harness closing..."); dd.close(); YARP_DEBUG(Logger::get(), "harness closed."); } // just checking for crashes, not device creation return result; //result; }