00001
00002
00003 #include <typelib/pluginmanager.hh>
00004
00005 #include "Registration.hpp"
00006 #include "TransportPlugin.hpp"
00007 #include <rtt/typelib/TypelibMarshallerBase.hpp>
00008
00009 #include <rtt/types/TypekitPlugin.hpp>
00010 #include <rtt/Logger.hpp>
00011 using namespace RTT;
00012 #ifdef HAS_ROSLIB
00013 #include <ros/package.h>
00014 #endif
00015
00016 #define TYPEKIT_PACKAGE_NAME_aux0(target) #target
00017 #define TYPEKIT_PACKAGE_NAME_aux(target) "<%= typekit.name %>-typekit-" TYPEKIT_PACKAGE_NAME_aux0(target)
00018 #define TYPEKIT_PACKAGE_NAME TYPEKIT_PACKAGE_NAME_aux(OROCOS_TARGET)
00019
00020 std::string orogen_typekits::<%= typekit.name %>TypelibTransportPlugin::getTlbPath()
00021 {
00022 #ifdef HAS_ROSLIB
00023 using namespace ros::package;
00024 try {
00025 bool all_good = true, found = false;
00026 std::string ppath = getPath( "<%= typekit.name %>" );
00027 if ( !ppath.empty() ) {
00028 return ppath + "/typekit" + "/<%= typekit.name %>.tlb";
00029 } else
00030 log(Error) << "Not a ros package: " << "<%= typekit.name %>" << endlog();
00031 } catch(...) {
00032 log(Error) << "Not a ros package: " << "<%= typekit.name %>" << endlog();
00033 }
00034 #endif
00035 return TYPEKIT_REGISTRY;
00036 }
00037
00038 orogen_typekits::<%= typekit.name %>TypelibTransportPlugin::<%= typekit.name %>TypelibTransportPlugin()
00039 : m_registry(0)
00040 {
00041 std::string path = getTlbPath();
00042 try
00043 {
00044 m_registry = Typelib::PluginManager::load("tlb", path);
00045 }
00046 catch(std::exception const& e) {
00047 log(Error) << "cannot load the typekit's Typelib registry from" << endlog();
00048 log(Error) << " " << path << endlog();
00049 #ifndef HAS_ROSLIB
00050 log(Error) << "remember to do 'make install' before you use the oroGen-generated libraries ?" << endlog();
00051 #endif
00052 log(Error) << endlog();
00053 log(Error) << "the Typelib transport will not be available for types defined in this typekit" << endlog();
00054 }
00055 }
00056
00057 orogen_typekits::<%= typekit.name %>TypelibTransportPlugin::~<%= typekit.name %>TypelibTransportPlugin()
00058 {
00059 delete m_registry;
00060 }
00061
00062 bool orogen_typekits::<%= typekit.name %>TypelibTransportPlugin::registerTransport(std::string type_name, RTT::types::TypeInfo* ti)
00063 {
00064 if (!m_registry)
00065 return false;
00066
00067 <% first_type = true;
00068 typesets.interface_types.each do |type|
00069 names = [type.name]
00070 if aliases = typesets.aliases[type]
00071 names.concat(aliases)
00072 end
00073 if_cond = names.map { |n| "\"#{n}\" == type_name" }.join(" || ")
00074 %>
00075 <%= 'else ' unless first_type %>if (<%= if_cond %>)
00076 {
00077 try {
00078 ti->addProtocol(orogen_transports::TYPELIB_MARSHALLER_ID,
00079 <%= type.method_name %>_TypelibMarshaller(*m_registry));
00080 }
00081 catch(std::runtime_error const& e)
00082 {
00083 log(Error) << "cannot register a typelib transport for " << type_name << endlog();
00084 log(Error) << " the following error occured:" << endlog();
00085 log(Error) << " " << e.what() << endlog();
00086 log(Error) << " the registry can be found at " << TYPEKIT_REGISTRY << endlog();
00087 return false;
00088 }
00089 return true;
00090 }
00091 <% first_type = false
00092 end %>
00093 return false;
00094 }
00095 std::string orogen_typekits::<%= typekit.name %>TypelibTransportPlugin::getTransportName() const
00096 { return "Typelib"; }
00097 std::string orogen_typekits::<%= typekit.name %>TypelibTransportPlugin::getTypekitName() const
00098 { return "/orogen/<%= typekit.name %>"; }
00099 std::string orogen_typekits::<%= typekit.name %>TypelibTransportPlugin::getName() const
00100 { return "/orogen/<%= typekit.name %>/TYPELIB"; }
00101
00102 ORO_TYPEKIT_PLUGIN(orogen_typekits::<%= typekit.name %>TypelibTransportPlugin);
00103