UNPKG

webgme-rosmod

Version:

This repository contains ROSMOD developed for WebGME. ROSMOD is a web-based, collaborative, modeling and execution environment for distributed embedded applications built using ROS http://rosmod.rcps.isis.vanderbilt.edu

7 lines 143 kB
/* Generated file based on ejs templates */ define([], function() { return { "CMakeLists.txt.ejs": "cmake_minimum_required(VERSION 2.8.3)\nproject(<%- pkgInfo.name %>)\n\n## Start Global Marker\n## End Global Marker\n\n## Check C++11 / C++0x\ninclude(CheckCXXCompilerFlag)\nCHECK_CXX_COMPILER_FLAG(\"-std=c++11\" COMPILER_SUPPORTS_CXX11)\nCHECK_CXX_COMPILER_FLAG(\"-std=c++0x\" COMPILER_SUPPORTS_CXX0X)\nif(COMPILER_SUPPORTS_CXX11)\n set(CMAKE_CXX_FLAGS \"-std=c++11\")\nelseif(COMPILER_SUPPORTS_CXX0X)\n set(CMAKE_CXX_FLAGS \"-std=c++0x\")\nelse()\n message(FATAL_ERROR \"The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.\")\nendif()\n\nfind_package(catkin REQUIRED COMPONENTS\n<%\nif (pkgInfo.Message_list || pkgInfo.Service_list || pkgInfo.Action_list) {\n-%>\n message_generation\n<%\n}\n-%>\n roscpp\n rosmod_actor\n # external packages that we depend on\n <%- pkgInfo.PackageDependencies.join(' ') %>\n)\n\n<% \nif (pkgInfo.Service_list) { \n-%>\n# Generate services in the 'srv' folder\nadd_service_files(\n FILES\n<% \n pkgInfo.Service_list.map(function(srv) { \n-%>\n <%- srv.name %>.srv\n<%\n }); \n-%>\n)\n<%\n} \n-%>\n\n<%\nif (pkgInfo.Message_list) { \n-%>\n# Generate messages in the 'msg' folder\nadd_message_files(\n FILES\n<%\n pkgInfo.Message_list.map(function(msg) { \n-%>\n <%- msg.name %>.msg\n<%\n }); \n-%>\n)\n<%\n} \n-%>\n\n<%\nif (pkgInfo.Action_list) { \n-%>\n# Generate actions in the 'action' folder\nadd_action_files(\n FILES\n<%\n pkgInfo.Action_list.map(function(act) { \n-%>\n <%- act.name %>.action\n<%\n }); \n-%>\n)\n<%\n} \n-%>\n\n<%\nif (pkgInfo.Message_list || pkgInfo.Service_list || pkgInfo.Action_list) {\n-%>\n# Generate added messages and services with any dependencies listed here\ngenerate_messages(\n DEPENDENCIES\n <%- pkgInfo.GenerateMessageDependencies.join(' ') %>\n)\n<%\n}\n-%>\n\n#\n## catkin specific configuration \n#\n## The catkin_package macro generates cmake config files for your package\n## Declare things to be passed to dependent projects\n## INCLUDE_DIRS: uncomment this if you package contains header files\n## LIBRARIES: libraries you create in this project that dependent projects also need\n## CATKIN_DEPENDS: catkin_packages dependent projects also need\n## DEPENDS: system dependencies of this project that dependent projects also need\ncatkin_package(\n<%\nif (pkgInfo.Component_list) {\n-%>\n INCLUDE_DIRS include\n<%\n}\n-%>\n# LIBRARIES client_server_package\n# CATKIN_DEPENDS roscpp std_msgs\n<%\nif (pkgInfo.Message_list || pkgInfo.Service_list || pkgInfo.Action_list) {\n-%>\n CATKIN_DEPENDS <%- pkgInfo.PackageDependencies.join(' ') %>\n<%\n}\n-%>\n<%\nif (pkgInfo.Message_list || pkgInfo.Service_list || pkgInfo.Action_list) {\n-%>\n CATKIN_DEPENDS message_runtime\n<%\n}\n-%>\n# DEPENDS system_lib\n)\n\n#\n## Build \n#\n\n## Specify additional locations of header files\n## Your package locations should be listed before other locations\n# include_directories(include)\ninclude_directories(\n<%\nif (pkgInfo.Component_list) {\n-%>\n\tinclude\n <%- pkgInfo.CMAKE_INCLUDES.join('\\n') %>\n<%\n}\n-%>\n\t${catkin_INCLUDE_DIRS})\n\n<%- pkgInfo.CMAKE_COMMANDS.join('\\n') %>\n\n<%\nif (pkgInfo.Component_list) {\n pkgInfo.Component_list.map(function(cmp) {\n-%>\nadd_library(<%- cmp.name %>\n src/<%- pkgInfo.name %>/<%- cmp.name %>.cpp\n<%\nif (cmp['State Machine_list']) {\n cmp['State Machine_list'].map(function(hfsm) {\n-%>\n include/<%- pkgInfo.name %>/<%- cmp.name %>_HFSM/<%- hfsm.sanitizedName %>_GeneratedStates.cpp\n<%\n});\n}\n-%>\n )\ntarget_link_libraries(<%- cmp.name %>\n ${catkin_LIBRARIES}\n <%- cmp.LinkLibraries.join(' ') %>\n )\n<%\n if (cmp.Dependencies.length) {\n-%>\nadd_dependencies(<%- cmp.name %>\n <%- cmp.Dependencies.join(' ') %>\n\t\t )\n<%\n }\n-%>\n<%\n });\n} \n-%>\n", "component.cpp.ejs": "/** @file <%- compInfo.name %>.cpp \n * @author <%- compInfo.Authors %>\n * @date <%= (new Date()).toISOString() %>\n * @brief This file contains definitions for the <%- compInfo.name %> class; <%- compInfo['Brief Description'] %>\n */\n\n#include \"<%- compInfo.Package %>/<%- compInfo.name %>.hpp\"\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n// HFSM Includes\n#include \"<%- compInfo.Package %>/<%- compInfo.name %>_HFSM/<%- hfsm.sanitizedName %>_Events.hpp\"\n#include \"<%- compInfo.Package %>/<%- compInfo.name %>_HFSM/<%- hfsm.sanitizedName %>_GeneratedStates.hpp\"\n<%\n });\n}\n-%>\n\n\n// User Definitions\n//::::<%- compInfo.path %>::::Definitions::::\n<%- compInfo.Definitions %>\n\n// Component Constructor\n<%- compInfo.name %>::<%- compInfo.name %>(Json::Value& _config):\n Component::Component(_config)\n{\n}\n\n// Component Initialization \nvoid <%- compInfo.name %>::init_timer_operation(const ros::TimerEvent& event)\n{\n ros::Time __dequeue__ = ros::Time::now();\n // User Initialization Code\n try {\n {\n // print out the config that was passed in\n std::string configStr = config.toStyledString();\n std::cout << \"Config: \" << config << std::endl;\n }\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n {\n // now initialize the HFSM\n // update the \"this_component\" var for the HFSM\n <%- hfsm.sanitizedName %>_root->setComponentPtr( this );\n <%- hfsm.sanitizedName %>_root->initialize();\n // update the HFSM timer period and start the timer\n ros::Duration newPeriod = ros::Duration( <%- hfsm.sanitizedName %>_root->getActiveLeaf()->getTimerPeriod() );\n if (!<%- hfsm.sanitizedName %>_root->hasStopped()) {\n <%- hfsm.sanitizedName %>_HFSM_timer.setPeriod( newPeriod, false );\n } else {\n <%- hfsm.sanitizedName %>_HFSM_timer.stop();\n }\n }\n<%\n });\n}\n-%>\n // now run the initialization code\n //::::<%- compInfo.path %>::::Initialization::::\n <%- compInfo.Initialization %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::initialization: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::initialization\");\n }\n init_timer.stop();\n ros::Time __completion__ = ros::Time::now();\n ros::Duration __execution__ = __completion__ - __dequeue__;\n trace->raw_log(\"init_timer_operation, %d.%09d, %d.%09d, %d.%09d, %d.%09d, %d.%09d\",\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __completion__.sec,\n\t\t __completion__.nsec,\n\t\t __execution__.sec,\n\t\t __execution__.nsec,\n\t\t 0,\n\t\t 0);\n}\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n// <%- hfsm.name %> Timer function\nvoid <%- compInfo.name %>::<%- hfsm.sanitizedName %>_HFSM_timer_operation(const ros::TimerEvent& event)\n{\n ros::Time __dequeue__ = ros::Time::now();\n try {\n StateMachine::Event* e = nullptr;\n // process all pending events\n while ( (e = eventFactory->getNextEvent()) != nullptr ) {\n <%- hfsm.sanitizedName %>_root->handleEvent( e );\n eventFactory->consumeEvent( e );\n }\n // run the HFSM tick event\n <%- hfsm.sanitizedName %>_root->tick();\n // process all events that may have been generated by the tick event\n while ( (e = eventFactory->getNextEvent()) != nullptr ) {\n <%- hfsm.sanitizedName %>_root->handleEvent( e );\n eventFactory->consumeEvent( e );\n }\n // update the timer period according to new active state\n ros::Duration newPeriod = ros::Duration( <%- hfsm.sanitizedName %>_root->getActiveLeaf()->getTimerPeriod() );\n if (!<%- hfsm.sanitizedName %>_root->hasStopped()) {\n <%- hfsm.sanitizedName %>_HFSM_timer.setPeriod( newPeriod, false );\n } else {\n <%- hfsm.sanitizedName %>_HFSM_timer.stop();\n }\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- hfsm.sanitizedName %>_HFSM_timer_operation: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- hfsm.sanitizedName %>_HFSM_timer_operation\");\n }\n ros::Time __completion__ = ros::Time::now();\n ros::Duration __execution__ = __completion__ - __dequeue__;\n trace->raw_log(\"<%- hfsm.sanitizedName %>, %d.%09d, %d.%09d, %d.%09d, %d.%09d, %d.%09d\",\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __completion__.sec,\n\t\t __completion__.nsec,\n\t\t __execution__.sec,\n\t\t __execution__.nsec,\n\t\t 0,\n\t\t 0);\n}\n<%\n });\n}\n-%>\n\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n// Timer Operation - <%- tmr.name %>\nvoid <%- compInfo.name %>::<%- tmr.name %>_operation(const ros::TimerEvent& event)\n{\n ros::Time __dequeue__ = ros::Time::now();\n try {\n //::::<%- tmr.path %>::::Operation::::\n <%- tmr.Operation %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- tmr.name %>_operation: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- tmr.name %>_operation\");\n }\n ros::Time __completion__ = ros::Time::now();\n ros::Duration __execution__ = __completion__ - __dequeue__;\n trace->raw_log(\"<%- tmr.name %>, %d.%09d, %d.%09d, %d.%09d, %d.%09d, %d.%09d\",\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __completion__.sec,\n\t\t __completion__.nsec,\n\t\t __execution__.sec,\n\t\t __execution__.nsec,\n\t\t 0,\n\t\t 0);\n}\n<%\n });\n }\n-%>\n\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n-%>\n// Subscriber Operation - <%- sub.name %>\nvoid <%- compInfo.name %>::<%- sub.name %>_operation(const ros::MessageEvent<<%- sub.Message.Package %>::<%- sub.Message.TypeName %> const>& event)\n{\n ros::Time __dequeue__ = ros::Time::now();\n try {\n // get the publisher name, header, receipt time, and received_data from the event\n const std::string& publisher_node_name = event.getPublisherName();\n const boost::shared_ptr<ros::M_string>& headerPtr = event.getConnectionHeaderPtr();\n ros::Time receipt_time = event.getReceiptTime();\n const <%- sub.Message.Package %>::<%- sub.Message.TypeName %>::ConstPtr& received_data = event.getMessage();\n const <%- sub.Message.Package %>::<%- sub.Message.TypeName %>::ConstPtr& message = received_data;\n // now run the user's subscriber operation code\n //::::<%- sub.path %>::::Operation::::\n <%- sub.Operation %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- sub.name %>_operation: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- sub.name %>_operation\");\n }\n ros::Time __completion__ = ros::Time::now();\n ros::Duration __execution__ = __completion__ - __dequeue__;\n trace->raw_log(\"<%- sub.name %>, %d.%09d, %d.%09d, %d.%09d, %d.%09d, %d.%09d\",\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __completion__.sec,\n\t\t __completion__.nsec,\n\t\t __execution__.sec,\n\t\t __execution__.nsec,\n\t\t 0,\n\t\t 0);\n}\n<%\n });\n }\n-%>\n\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n// Server Operation - <%- srv.name %>\nbool <%- compInfo.name %>::<%- srv.name %>_operation(const <%- srv.Service.Package %>::<%- srv.Service.TypeName %>::Request &req, <%- srv.Service.Package %>::<%- srv.Service.TypeName %>::Response &res )\n{\n ros::Time __dequeue__ = ros::Time::now();\n try {\n // now run the user's server operation code\n //::::<%- srv.path %>::::Operation::::\n <%- srv.Operation %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- srv.name %>_operation: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- srv.name %>_operation\");\n }\n ros::Time __completion__ = ros::Time::now();\n ros::Duration __execution__ = __completion__ - __dequeue__;\n trace->raw_log(\"<%- srv.name %>, %d.%09d, %d.%09d, %d.%09d, %d.%09d, %d.%09d\",\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __completion__.sec,\n\t\t __completion__.nsec,\n\t\t __execution__.sec,\n\t\t __execution__.nsec,\n\t\t 0,\n\t\t 0);\n return true;\n}\n<%\n });\n }\n-%>\n\n<%\nif (compInfo['Action Server_list']) {\n compInfo['Action Server_list'].map(function(srv) {\n-%>\n// Action Server Execute Callback - <%- srv.name %>\nvoid <%- compInfo.name %>::<%- srv.name %>_execute_cb(const <%- srv.Action.Package %>::<%- srv.Action.TypeName %>GoalConstPtr &goal )\n{\n ros::Time __dequeue__ = ros::Time::now();\n try {\n // now run the user's action server execute code\n //::::<%- srv.path %>::::Execute Callback::::\n <%- srv['Execute Callback'] %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- srv.name %>_execute_cb: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- srv.name %>_execute_cb\");\n }\n ros::Time __completion__ = ros::Time::now();\n ros::Duration __execution__ = __completion__ - __dequeue__;\n trace->raw_log(\"<%- srv.name %>_execute, %d.%09d, %d.%09d, %d.%09d, %d.%09d, %d.%09d\",\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __completion__.sec,\n\t\t __completion__.nsec,\n\t\t __execution__.sec,\n\t\t __execution__.nsec,\n\t\t 0,\n\t\t 0);\n}\n// Action Server Goal Callback - <%- srv.name %>\nvoid <%- compInfo.name %>::<%- srv.name %>_goal_cb( )\n{\n ros::Time __dequeue__ = ros::Time::now();\n try {\n // now run the user's action server goal recv code\n //::::<%- srv.path %>::::Goal Callback::::\n <%- srv['Goal Callback'] %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- srv.name %>_goal_cb: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- srv.name %>_goal_cb\");\n }\n ros::Time __completion__ = ros::Time::now();\n ros::Duration __execution__ = __completion__ - __dequeue__;\n trace->raw_log(\"<%- srv.name %>_goal, %d.%09d, %d.%09d, %d.%09d, %d.%09d, %d.%09d\",\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __completion__.sec,\n\t\t __completion__.nsec,\n\t\t __execution__.sec,\n\t\t __execution__.nsec,\n\t\t 0,\n\t\t 0);\n}\n// Action Server Preempt Callback - <%- srv.name %>\nvoid <%- compInfo.name %>::<%- srv.name %>_preempt_cb( )\n{\n ros::Time __dequeue__ = ros::Time::now();\n try {\n // now run the user's action server preempt code\n //::::<%- srv.path %>::::Preempt Callback::::\n <%- srv['Preempt Callback'] %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- srv.name %>_preempt_cb: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- srv.name %>_preempt_cb\");\n }\n ros::Time __completion__ = ros::Time::now();\n ros::Duration __execution__ = __completion__ - __dequeue__;\n trace->raw_log(\"<%- srv.name %>_preempt, %d.%09d, %d.%09d, %d.%09d, %d.%09d, %d.%09d\",\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __completion__.sec,\n\t\t __completion__.nsec,\n\t\t __execution__.sec,\n\t\t __execution__.nsec,\n\t\t 0,\n\t\t 0);\n}\n<%\n });\n }\n-%>\n\n<%\nif (compInfo['Action Client_list']) {\n compInfo['Action Client_list'].map(function(clt) {\n-%>\n// Action Client Feedback Callback - <%- clt.name %>\nvoid <%- compInfo.name %>::<%- clt.name %>_feedback_cb(const <%- clt.Action.Package %>::<%- clt.Action.TypeName %>FeedbackConstPtr &feedback)\n{\n ros::Time __dequeue__ = ros::Time::now();\n try {\n // now run the user's action client feedback code\n //::::<%- clt.path %>::::Feedback Callback::::\n <%- clt['Feedback Callback'] %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- clt.name %>_feedback_cb: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- clt.name %>_feedback_cb\");\n }\n ros::Time __completion__ = ros::Time::now();\n ros::Duration __execution__ = __completion__ - __dequeue__;\n trace->raw_log(\"<%- clt.name %>_feedback, %d.%09d, %d.%09d, %d.%09d, %d.%09d, %d.%09d\",\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __completion__.sec,\n\t\t __completion__.nsec,\n\t\t __execution__.sec,\n\t\t __execution__.nsec,\n\t\t 0,\n\t\t 0);\n}\n// Action Client Active Callback - <%- clt.name %>\nvoid <%- compInfo.name %>::<%- clt.name %>_active_cb( )\n{\n ros::Time __dequeue__ = ros::Time::now();\n try {\n // now run the user's action client active code\n //::::<%- clt.path %>::::Active Callback::::\n <%- clt['Active Callback'] %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- clt.name %>_active_cb: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- clt.name %>_active_cb\");\n }\n ros::Time __completion__ = ros::Time::now();\n ros::Duration __execution__ = __completion__ - __dequeue__;\n trace->raw_log(\"<%- clt.name %>_active, %d.%09d, %d.%09d, %d.%09d, %d.%09d, %d.%09d\",\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __completion__.sec,\n\t\t __completion__.nsec,\n\t\t __execution__.sec,\n\t\t __execution__.nsec,\n\t\t 0,\n\t\t 0);\n}\n// Action Client Done Callback - <%- clt.name %>\nvoid <%- compInfo.name %>::<%- clt.name %>_done_cb(const actionlib::SimpleClientGoalState& state, const <%- clt.Action.Package %>::<%- clt.Action.TypeName %>ResultConstPtr &result)\n{\n ros::Time __dequeue__ = ros::Time::now();\n try {\n // now run the user's action client done code\n //::::<%- clt.path %>::::Done Callback::::\n <%- clt['Done Callback'] %>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::<%- clt.name %>_done_cb: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::<%- clt.name %>_done_cb\");\n }\n ros::Time __completion__ = ros::Time::now();\n ros::Duration __execution__ = __completion__ - __dequeue__;\n trace->raw_log(\"<%- clt.name %>_done, %d.%09d, %d.%09d, %d.%09d, %d.%09d, %d.%09d\",\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __dequeue__.sec,\n\t\t __dequeue__.nsec,\n\t\t __completion__.sec,\n\t\t __completion__.nsec,\n\t\t __execution__.sec,\n\t\t __execution__.nsec,\n\t\t 0,\n\t\t 0);\n}\n<%\n });\n }\n-%>\n\n// Destructor - Cleanup Ports & Timers\n<%- compInfo.name %>::~<%- compInfo.name %>()\n{\n try {\n logger->log(\"DEBUG\", \"<%- compInfo.name %> calling user defined destruction\");\n // User Destruction\n //::::<%- compInfo.path %>::::Destruction::::\n <%- compInfo.Destruction %>\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n <%- hfsm.sanitizedName %>_HFSM_timer.stop();\n<%\n });\n}\n-%>\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n <%- tmr.name %>.stop();\n<%\n\t});\n }\n-%>\n<%\nif (compInfo.Publisher_list) {\n compInfo.Publisher_list.map(function(pub) {\n-%>\n <%- pub.name %>.shutdown();\n<%\n\t});\n }\n-%>\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n-%>\n <%- sub.name %>.shutdown();\n<%\n\t});\n }\n-%>\n<%\nif (compInfo.Client_list) {\n compInfo.Client_list.map(function(clt) {\n-%>\n <%- clt.name %>.shutdown();\n<%\n\t});\n }\n-%>\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n <%- srv.name %>.shutdown();\n<%\n\t});\n }\n-%>\n<%\nif (compInfo['Action Server_list']) {\n compInfo['Action Server_list'].map(function(srv) {\n-%>\n <%- srv.name %>.shutdown();\n<%\n\t});\n }\n-%>\n } catch (std::exception& e) {\n // catch exceptions\n logger->log(\"ERROR\", \"std::exception caught in <%- compInfo.name %>::~<%- compInfo.name %>: %s\", e.what());\n } catch ( ... ) {\n // catch everything else\n logger->log(\"ERROR\", \"unknown exception caught in <%- compInfo.name %>::~<%- compInfo.name %>\");\n }\n}\n\n// Startup - Setup Component Ports & Timers\nvoid <%- compInfo.name %>::startUp()\n{\n std::string advertiseName;\n bool isOneShot;\n ros::TimerOptions timer_options;\n\n // extra data we add to the header for service connections\n std::map<std::string, std::string> service_header;\n service_header[\"component instance\"] = config[\"Name\"].asString();\n\n if ( config[\"Logging\"][\"Component Logger\"][\"Enabled\"].asBool() ) {\n logger->enable_logging();\n logger->create_file(workingDir+\"/\"+config[\"Logging\"][\"Component Logger\"][\"FileName\"].asString());\n logger->set_is_periodic(config[\"Logging\"][\"Component Logger\"][\"Enabled\"].asBool());\n logger->set_max_log_unit(config[\"Logging\"][\"Component Logger\"][\"Unit\"].asInt());\n\n ROS_INFO_STREAM(\"Saving user log to \" <<\n\t\t workingDir << \"/\" <<\n\t\t config[\"Logging\"][\"Component Logger\"][\"FileName\"].asString());\n }\n \n if ( config[\"Logging\"][\"ROSMOD Logger\"][\"Enabled\"].asBool() ) {\n trace->enable_logging();\n trace->create_file(workingDir+\"/\"+config[\"Logging\"][\"ROSMOD Logger\"][\"FileName\"].asString());\n trace->set_is_periodic(config[\"Logging\"][\"ROSMOD Logger\"][\"Enabled\"].asBool());\n trace->set_max_log_unit(config[\"Logging\"][\"ROSMOD Logger\"][\"Unit\"].asInt());\n\n ROS_INFO_STREAM(\"Saving trace log to \" <<\n\t\t workingDir + \"/\" +\n\t\t config[\"Logging\"][\"ROSMOD Logger\"][\"FileName\"].asString());\n }\n\n // Action Servers\n<%\nif (compInfo['Action Server_list']) {\n compInfo['Action Server_list'].map(function(srv) {\n-%>\n // Action Server - <%- srv.name %>\n // TODO: Add support for callback options (Priority / Deadline) to Action Servers\n this-><%- srv.name %>.registerGoalCallback(\n boost::bind(&<%- compInfo.name %>::<%- srv.name %>_goal_cb, this)\n );\n this-><%- srv.name %>.registerPreemptCallback(\n boost::bind(&<%- compInfo.name %>::<%- srv.name %>_preempt_cb, this)\n );\n this-><%- srv.name %>.initialize(\n nh_,\n \"<%- srv.Action.AdvertisedName %>\",\n boost::bind(&<%- compInfo.name %>::<%- srv.name %>_execute_cb, this, _1),\n false, // don't auto-start the action server\n &comp_queue\n );\n this-><%- srv.name %>.start();\n<%\n });\n}\n-%>\n // Action Clients\n<%\nif (compInfo['Action Client_list']) {\n compInfo['Action Client_list'].map(function(clt) {\n-%>\n // Action Client - <%- clt.name %>\n // TODO: Add support for callback options (Priority / Deadline) to Action Client Callbacks\n this-><%- clt.name %>.registerDoneCallback(\n boost::bind(&<%- compInfo.name %>::<%- clt.name %>_done_cb, this, _1, _2)\n );\n this-><%- clt.name %>.registerActiveCallback(\n boost::bind(&<%- compInfo.name %>::<%- clt.name %>_active_cb, this)\n );\n this-><%- clt.name %>.registerFeedbackCallback(\n boost::bind(&<%- compInfo.name %>::<%- clt.name %>_feedback_cb, this, _1)\n );\n this-><%- clt.name %>.initialize(nh_, \"<%- clt.Action.AdvertisedName %>\", &comp_queue);\n logger->log(\"DEBUG\", \"<Action Client><%- clt.name %> connected!\");\n<%\n });\n }\n-%>\n // Servers\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n // Server - <%- srv.name %>\n advertiseName = \"<%- srv.Service.AdvertisedName %>\";\n ros::AdvertiseServiceOptions <%- srv.name %>_server_options;\n <%- srv.name %>_server_options = ros::AdvertiseServiceOptions::create<<%- srv.Service.Package %>::<%- srv.Service.TypeName %>>\n (advertiseName.c_str(),\n boost::bind(&<%- compInfo.name %>::<%- srv.name %>_operation, this, _1, _2),\n ros::VoidPtr(),\n &comp_queue);\n this-><%- srv.name %> = nh_.advertiseService(<%- srv.name %>_server_options);\n<%\n });\n}\n-%>\n // Clients\n<%\nif (compInfo.Client_list) {\n compInfo.Client_list.map(function(clt) {\n-%>\n // Client - <%- clt.name %>\n advertiseName = \"<%- clt.Service.AdvertisedName %>\";\n this-><%- clt.name %> = nh_.serviceClient<<%- clt.Service.Package %>::<%- clt.Service.TypeName %>>(\n advertiseName.c_str(),\n false, // not persistent\n service_header\n );//, true); \n this-><%- clt.name %>.waitForExistence();\n logger->log(\"DEBUG\", \"<Client><%- clt.name %> connected!\");\n<%\n });\n }\n-%>\n // Publishers\n bool latching = true;\n<%\nif (compInfo.Publisher_list) {\n compInfo.Publisher_list.map(function(pub) {\n-%>\n // Publisher - <%- pub.name %>\n advertiseName = \"<%- pub.Message.AdvertisedName %>\";\n latching = <%- pub.Latching ? \"true\" : \"false\" %>;\n this-><%- pub.name %> = nh_.advertise<<%- pub.Message.Package %>::<%- pub.Message.TypeName %>>(\n advertiseName.c_str(),\n 1000,\n latching\n ); \n<%\n });\n }\n-%>\n // Subscribers\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n-%>\n // Subscriber - <%- sub.name %>\n advertiseName = \"<%- sub.Message.AdvertisedName %>\";\n ros::SubscribeOptions <%- sub.name %>_options;\n <%- sub.name %>_options = ros::SubscribeOptions::create<<%- sub.Message.Package %>::<%- sub.Message.TypeName %>>\n (advertiseName.c_str(),\n 1000,\n boost::bind(&<%- compInfo.name %>::<%- sub.name %>_operation, this, _1),\n ros::VoidPtr(),\n &comp_queue);\n this-><%- sub.name %> = nh_.subscribe(<%- sub.name %>_options);\n<%\n });\n}\n-%>\n\n // Init Timer\n timer_options = \n ros::TimerOptions\n (ros::Duration(-1),\n boost::bind(&<%- compInfo.name %>::init_timer_operation, this, _1),\n &comp_queue,\n true,\n false); \n this->init_timer = nh_.createTimer(timer_options);\n this->init_timer.start();\n\n // Timers\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n // Component Timer - <%- tmr.name %>\n isOneShot = (config[\"Timers\"][\"<%- tmr.name %>\"][\"Period\"].asFloat() <= 0) ? true : false;\n timer_options = \n ros::TimerOptions\n (ros::Duration(config[\"Timers\"][\"<%- tmr.name %>\"][\"Period\"].asFloat()),\n boost::bind(&<%- compInfo.name %>::<%- tmr.name %>_operation, this, _1),\n &comp_queue,\n isOneShot,\n false);\n\n this-><%- tmr.name %> = nh_.createTimer(timer_options);\n<%\n });\n }\n-%>\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n // HFSM Timer\n // NEED TO FIGURE OUT HOW TO SPECIFY PRIORITY FOR THE HFSM TIMER IN THE MODEL\n ros::Duration hfsmPeriod = ros::Duration( 0 );\n isOneShot = false;\n timer_options = \n ros::TimerOptions\n (hfsmPeriod,\n boost::bind(&<%- compInfo.name %>::<%- hfsm.sanitizedName %>_HFSM_timer_operation, this, _1),\n &comp_queue,\n isOneShot,\n false);\n <%- hfsm.sanitizedName %>_HFSM_timer = nh_.createTimer(timer_options);\n <%- hfsm.sanitizedName %>_HFSM_timer.start();\n<%\n });\n}\n-%>\n // Start the timers\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n this-><%- tmr.name %>.start();\n<%\n });\n }\n-%>\n}\n\nextern \"C\" {\n Component *maker(Json::Value &config) {\n return new <%- compInfo.name %>(config);\n }\n}\n\n", "component.hpp.ejs": "/** @file <%- compInfo.name %>.hpp \n * @author <%- compInfo.Authors %>\n * @date <%= (new Date()).toISOString() %>\n * @brief This file declares the <%- compInfo.name %> class; <%- compInfo['Brief Description'] %>\n */\n\n#ifndef <%- compInfo.name.toUpperCase() %>_INCLUDE_GUARD\n#define <%- compInfo.name.toUpperCase() %>_INCLUDE_GUARD\n#include \"rosmod_actor/component.hpp\"\n\n#include <actionlib/client/simple_action_client.h>\n#include <actionlib/server/simple_action_server.h>\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\nnamespace StateMachine {\n class <%- hfsm.sanitizedName %>;\n};\n<%\n });\n}\n-%>\n\n/**\n * Component Message and Service Headers\n */\n<%\nif (compInfo.Types.length) {\n compInfo.Types.map(function(type) {\n-%>\n#include \"<%- type.Package %>/<%- type.IncludeName || type.TypeName %>.h\"\n<%\n });\n }\n-%>\n\n#include \"ros/ros.h\"\n\n/**\n * Forward declarations\n */\n//::::<%- compInfo.path %>::::Forwards::::\n<%- compInfo.Forwards %>\n\n/**\n * @brief <%- compInfo.name %> class\n */\nclass <%- compInfo.name %> : public Component\n{\npublic:\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n // give HFSM access to this class.\n friend class StateMachine::<%- hfsm.sanitizedName %>;\n<%\n });\n}\n-%>\n \n /**\n * @brief <%- compInfo.name %> Constructor.\n * @param _config Component configuration parsed from deployment JSON\n */\n <%- compInfo.name %>(Json::Value& _config);\n\n /**\n * @brief <%- compInfo.name %> Destructor\n */ \n ~<%- compInfo.name %>() override;\n\n /**\n * @brief Component startup function\n *\n * This function configures all the component ports and timers\n */ \n void startUp() override;\n\n /**\n * @brief <%- compInfo.name %> Initializer\n * This operation is executed immediately after startup.\n * @param[in] event a oneshot timer event\n * @see startUp()\n */\n void init_timer_operation(const ros::TimerEvent& event) override;\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n /**\n * @brief <%- hfsm.name %> Timer function\n * This timer has a dynamic period and executes the HFSM's tick()\n * function. It automatically handles consuming the HFSM's event\n * queue and updating its period based on the period of the\n * currently active leaf state.\n *\n * @param[in] event a timer event\n * @see startUp()\n */\n void <%- hfsm.sanitizedName %>_HFSM_timer_operation(const ros::TimerEvent& event);\n<%\n });\n}\n-%> \n\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n /**\n * @brief <%- tmr.name %>_operation; <%- tmr['Brief Description'] %>\n *\n * This operation is executed every time the \n * <%- tmr.name %> operation request is serviced \n * @param[in] event a timer event\n *\n * <%- tmr['Detailed Description'] %>\n */\n void <%- tmr.name %>_operation(const ros::TimerEvent& event);\n<%\n });\n }\n-%>\n\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n-%>\n /**\n * @brief <%- sub.name %>_operation; <%- sub['Brief Description'] %>\n *\n * This operation is executed every time the \n * <%- sub.name %> operation request is serviced \n * @param[in] ros::MessageEvent - event - Event information containing the message and headers received.\n *\n * <%- sub['Detailed Description'] %>\n */\n void <%- sub.name %>_operation(const ros::MessageEvent<<%- sub.Message.Package %>::<%- sub.Message.TypeName %> const>& event);\n<%\n });\n }\n-%>\n\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n /**\n * @brief <%- srv.name %>_operation; <%- srv['Brief Description'] %>\n *\n * This operation is executed every time the \n * <%- srv.name %> operation request is serviced \n * @param[in] req request received from the client\n * @param[out] res response sent back to the client\n *\n * <%- srv['Detailed Description'] %>\n */\n bool <%- srv.name %>_operation(const <%- srv.Service.Package %>::<%- srv.Service.TypeName %>::Request &req, <%- srv.Service.Package %>::<%- srv.Service.TypeName %>::Response &res);\n<%\n });\n }\n-%>\n\n<%\nif (compInfo['Action Server_list']) {\n compInfo['Action Server_list'].map(function(srv) {\n-%>\n /**\n * @brief <%- srv.name %>_execute_cb; <%- srv['Brief Description'] %>\n *\n * This operation is executed every time the \n * <%- srv.name %> operation request is serviced \n * @param[in] goal goal received from the action client\n *\n * <%- srv['Detailed Description'] %>\n */\n void <%- srv.name %>_execute_cb(const <%- srv.Action.Package %>::<%- srv.Action.TypeName %>GoalConstPtr &goal);\n /**\n * @brief <%- srv.name %>_goal_cb;\n *\n * This operation is executed every time the \n * <%- srv.name %> receives a new goal\n */\n void <%- srv.name %>_goal_cb();\n /**\n * @brief <%- srv.name %>_preempt_cb;\n *\n * This operation is executed every time the \n * <%- srv.name %> is preempted\n */\n void <%- srv.name %>_preempt_cb();\n<%\n });\n }\n-%>\n\n<%\nif (compInfo['Action Client_list']) {\n compInfo['Action Client_list'].map(function(clt) {\n-%>\n /**\n * @brief <%- clt.name %>_feedback_cb; <%- clt['Brief Description'] %>\n *\n * This operation is executed every time the \n * <%- clt.name %> receives feedback from the action server\n * @param[in] feedback feedback received from the action server\n *\n * <%- clt['Detailed Description'] %>\n */\n void <%- clt.name %>_feedback_cb(const <%- clt.Action.Package %>::<%- clt.Action.TypeName %>FeedbackConstPtr &feedback);\n /**\n * @brief <%- clt.name %>_active_cb\n *\n * This operation is executed when the goal becomes active\n */\n void <%- clt.name %>_active_cb();\n /**\n * @brief <%- clt.name %>_done_cb\n *\n * This operation is executed when the goal completes.\n * @param[in] state state received from the action server\n * @param[in] result the result message received from the action server\n */\n void <%- clt.name %>_done_cb(const actionlib::SimpleClientGoalState& state, const <%- clt.Action.Package %>::<%- clt.Action.TypeName %>ResultConstPtr &result);\n<%\n });\n }\n-%>\n\nprivate:\n\n<%\nif (compInfo['State Machine_list']) {\n compInfo['State Machine_list'].map(function(hfsm) {\n-%>\n ros::Timer <%- hfsm.sanitizedName %>_HFSM_timer; /*!< <%- hfsm.name %> HFSM Timer */\n<%\n });\n}\n-%> \n\n<%\nif (compInfo.Timer_list) {\n compInfo.Timer_list.map(function(tmr) {\n-%>\n ros::Timer <%- tmr.name %>; /*!< <%- tmr.name %> Component Timer */\n<%\n });\n }\n-%>\n<%\nif (compInfo['Action Server_list']) {\n compInfo['Action Server_list'].map(function(srv) {\n-%>\n actionlib::SimpleActionServer<<%- srv.Action.Package %>::<%- srv.Action.TypeName %>Action> <%- srv.name %>; /*!< <%- srv.name %> Component Action Server */\n<%\n });\n }\n-%>\n<%\nif (compInfo['Action Client_list']) {\n compInfo['Action Client_list'].map(function(clt) {\n-%>\n actionlib::SimpleActionClient<<%- clt.Action.Package %>::<%- clt.Action.TypeName %>Action> <%- clt.name %>; /*!< <%- clt.name %> Component Action Client */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Server_list) {\n compInfo.Server_list.map(function(srv) {\n-%>\n ros::ServiceServer <%- srv.name %>; /*!< <%- srv.name %> Component Server */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Client_list) {\n compInfo.Client_list.map(function(clt) {\n -%>\n ros::ServiceClient <%- clt.name %>; /*!< <%- clt.name %> Component Client */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Publisher_list) {\n compInfo.Publisher_list.map(function(pub) {\n -%>\n ros::Publisher <%- pub.name %>; /*!< <%- pub.name %> Component Publisher */\n<%\n });\n }\n-%>\n<%\nif (compInfo.Subscriber_list) {\n compInfo.Subscriber_list.map(function(sub) {\n -%>\n ros::Subscriber <%- sub.name %>; /*!< <%- sub.name %> Component Subscriber */\n<%\n });\n }\n-%>\n\n /** \n * User-defined private variables\n */\n //::::<%- compInfo.path %>::::Members::::\n <%- compInfo.Members %>\n};\n\n#endif // <%- compInfo.name.toUpperCase() %>_INCLUDE_GUARD\n\n", "doxygen_config.ejs": "# Doxyfile 1.8.6\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a double hash (##) is considered a comment and is placed in\n# front of the TAG it is preceding.\n#\n# All text after a single hash (#) is considered a comment and will be ignored.\n# The format is:\n# TAG = value [value, ...]\n# For lists, items can also be appended using:\n# TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\\\" \\\").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all text\n# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv\n# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv\n# for the list of possible encodings.\n# The default value is: UTF-8.\n\nDOXYFILE_ENCODING = UTF-8\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by\n# double-quotes, unless you are using Doxywizard) that should identify the\n# project for which the documentation is generated. This name is used in the\n# title of most generated pages and in a few other places.\n# The default value is: My Project.\n\nPROJECT_NAME = \"<%= projectName %>\"\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number. This\n# could be handy for archiving the generated documentation or if some version\n# control system is used.\n\nPROJECT_NUMBER =\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer a\n# quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF =\n\n# With the PROJECT_LOGO tag one can specify an logo or icon that is included in\n# the documentation. The maximum height of the logo should not exceed 55 pixels\n# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo\n# to the output directory.\n\nPROJECT_LOGO =\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path\n# into which the generated documentation will be written. If a relative path is\n# entered, it will be relative to the location where doxygen was started. If\n# left blank the current directory will be used.\n\nOUTPUT_DIRECTORY = ./doc/\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-\n# directories (in 2 levels) under the output directory of each output format and\n# will distribute the generated files over these directories. Enabling this\n# option can be useful when feeding doxygen a huge amount of source files, where\n# putting all generated files in the same directory would otherwise causes\n# performance problems for the file system.\n# The default value is: NO.\n\nCREATE_SUBDIRS = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,\n# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),\n# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,\n# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),\n# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,\n# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,\n# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,\n# Ukrainian and Vietnamese.\n# The default value is: English.\n\nOUTPUT_LANGUAGE = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member\n# descriptions after the members that are listed in the file and class\n# documentation (similar to Javadoc). Set to NO to disable this.\n# The default value is: YES.\n\nBRIEF_MEMBER_DESC = YES\n\n# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief\n# description of a member or function before the detailed description\n#\n# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n# The default value is: YES.\n\nREPEAT_BRIEF = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator that is\n# used to form the text in various listings. Each string in this list, if found\n# as the leading text of the brief description, will be stripped from the text\n# and the result, after processing the whole list, is used as the annotated\n# text. Otherwise, the brief description is used as-is. If left blank, the\n# following values are used ($name is automatically replaced with the name of\n# the entity):The $name class, The $name widget, The $name file, is, provides,\n# specifies, contains, represents, a, an and the.\n\nABBREVIATE_BRIEF =\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# doxygen will generate a detailed section even if there is only a brief\n# description.\n# The default value is: NO.\n\nALWAYS_DETAILED_SEC = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n# The default value is: NO.\n\nINLINE_INHERITED_MEMB = YES\n\n# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path\n# before files name in the file list and in the header files. If set to NO the\n# shortest path that makes the file name unique will be used\n# The default value is: YES.\n\nFULL_PATH_NAMES = YES\n\n# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.\n# Stripping is only done if one of the specified strings matches the left-hand\n# part of the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the path to\n# strip.\n#\n# Note that you can specify absolute paths here, but also relative paths, which\n# will be relative from the directory where doxygen is started.\n# This tag requires that the tag FULL_PATH_NAMES is set to YES.\n\nSTRIP_FROM_PATH =\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the\n# path mentioned in the documentation of a class, which tells the reader which\n# header file to include in order to use a class. If left blank only the name of\n# the header file containing the class definition is used. Otherwise one should\n# specify the list of include paths that are normally passed to the compiler\n# using the -I flag.\n\nSTRIP_FROM_INC_PATH =\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but\n# less readable) file names. This can be useful is your file systems doesn't\n# support long names like on DOS, Mac, or CD-ROM.\n# The default value is: NO.\n\nSHORT_NAMES = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the\n# first line (until the first dot) of a Javadoc-style comment as the brief\n# description. If set to NO, the Javadoc-style will behave just like regular Qt-\n# style comments (thus requiring an explicit @brief command for a brief\n# description.)\n# The default value is: NO.\n\nJAVADOC_AUTOBRIEF = YES\n\n# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first\n# line (until the first dot) of a Qt-style comment as the brief description. If\n# set to NO, the Qt-style will behave just like regular Qt-style comments (thus\n# requiring an explicit \\brief command for a brief description.)\n# The default value is: NO.\n\nQT_AUTOBRIEF = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a\n# multi-line C++ special comment block (i.e. a block of //! or /// comments) as\n# a brief description. This used to be the default behavior. The new default is\n# to treat a multi-line C++ comment block as a detailed description. Set this\n# tag to YES if you prefer the old behavior instead.\n#\n# Note that setting this tag to YES also means that rational rose comments are\n# not recognized any more.\n# The default value is: NO.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the\n# documentation from any documented member that it re-implements.\n# The default value is: YES.\n\nINHERIT_DOCS = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a\n# new page for each member. If set to NO, the documentation of a member will be\n# part of the file/class/namespace that contains it.\n# The default value is: NO.\n\nSEPARATE_MEMBER_PAGES = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen\n# uses this value to replace tabs by spaces in code fragments.\n# Minimum value: 1, maximum value: 16, default value: 4.\n\nTAB_SIZE = 4\n\n# This tag can be used to specify a number of aliases that act as commands in\n# the documentation. An alias has the form:\n# name=value\n# For example adding\n# \"sideeffect=@par Side Effects:\\n\"\n# will allow you to put the command \\sideeffect (or @sideeffect) in the\n# documentation, which will result in a user-defined paragraph with heading\n# \"Side Effects:\". You can put \\n's in the value part of an alias to insert\n# newlines.\n\nALIASES =\n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding \"class=itcl::class\"\n# will allow you to use the command class in the itcl::class meaning.\n\nTCL_SUBST =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources\n# only. Doxygen will then generate output that is more tailored for C. For\n# instance, some of the names that are used will be different. The list of all\n# members will be omitted, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_FOR_C = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or\n# Python sources only. Doxygen will then generate output that is more tailored\n# for that language. For instance, namespaces will be presented as packages,\n# qualified scopes will look different, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_JAVA = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources. Doxygen will then generate output that is tailored for Fortran.\n# The default value is: NO.\n\nOPTIMIZE_FOR_FORTRAN = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for VHDL.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_VHDL = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given\n# extension. Doxygen has a built-in mapping, but you can override or extend it\n# using this tag. The format is ext=language, where ext is a file extension, and\n# language is one of the parsers supported by doxygen: IDL, Java, Javascript,\n# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make\n# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C\n# (default is Fortran), use: inc=Fort