Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • cberge/dynamic-graph
  • ostasse/dynamic-graph
  • gsaurel/dynamic-graph
  • stack-of-tasks/dynamic-graph
4 results
Show changes
Commits on Source (251)
Showing
with 1194 additions and 269 deletions
# pre-commit run -a (Guilhem Saurel, 2022-07-27)
e9a222fb0a1f236e534e21c66cb623fd8d25b8d6
# pre-commit: details (Guilhem Saurel, 2022-04-14)
1c0f3cc1048a8b2a8206510a51a237b2f1e68a34
# pre-commit run -a (Guilhem Saurel, 2022-03-30)
0c1e6fb50735d4d6cc93e15d3bef202392d47c5b
# clang format defaults + pre-commit (Guilhem Saurel, 2022-03-30)
b6fc5d81e645a84fa8f4d656371adfb27c2b2b23
# [value] Clang format. (Olivier Stasse, 2022-01-09)
b852eef0d56de04ae91a43b1ddbd837ec69ddbe6
# linters: fix clang-check-12 (Guilhem Saurel, 2021-09-14)
ca1b2fc51540b4fcb2cd0b4fccaa33b02738af41
# reformat for clang-format-12 (Guilhem Saurel, 2021-09-07)
ed5899076b7b11c16d9517295e3826dd9b9d80d2
# format (Guilhem Saurel, 2020-11-13)
c54add29f80f6bcd1d05ca741d472491cf74c180
# format (Guilhem Saurel, 2020-07-22)
f4def3bfeaf0f9c9a6d5c5eb01c3a3b2fbb04b2f
# clang format. (Olivier Stasse, 2020-02-03)
70864112c87365af645f0404f881edf36c1ec734
# [clang] Update format. (Olivier Stasse, 2019-08-26)
384b2078e4962d762db4293bf3396be17df4e5c7
# [clang-format] Comply to Google style. (Olivier Stasse, 2019-08-20)
df48199dd436ba8341ae93c7b1f87eb30d0f457a
_build* _build*
*~ .~
\ No newline at end of file compile_commands.json
[submodule "jrl-cmakemodules"]
path = jrl-cmakemodules
url = git://github.com/jrl-umi3218/jrl-cmakemodules.git
[submodule "cmake"] [submodule "cmake"]
path = cmake path = cmake
url = git://github.com/jrl-umi3218/jrl-cmakemodules.git url = https://github.com/jrl-umi3218/jrl-cmakemodules.git
[submodule ".travis"]
path = .travis
url = git://github.com/jrl-umi3218/jrl-travis.git
ci:
autoupdate_branch: 'devel'
repos:
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: v14.0.6
hooks:
- id: clang-format
args: [--style=Google]
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.3.0
hooks:
- id: check-added-large-files
- id: check-ast
- id: check-executables-have-shebangs
- id: check-json
- id: check-merge-conflict
- id: check-symlinks
- id: check-toml
- id: check-yaml
- id: debug-statements
- id: destroyed-symlinks
- id: detect-private-key
- id: end-of-file-fixer
- id: fix-byte-order-marker
- id: mixed-line-ending
- id: trailing-whitespace
- repo: https://github.com/cheshirekow/cmake-format-precommit
rev: v0.6.13
hooks:
- id: cmake-format
Subproject commit 083fa2cb0fa4ad594926d9bb3d246075e62ce9ee
language: cpp
sudo: required
compiler:
- gcc
- clang
env:
global:
- DEBSIGN_KEYID=5AE5CD75
- secure: "lEJYxth3fNsmvNS7Ern9+kEpHk4X3Tjo51GBUQBNL6g+YyZJKm4xwBEfwK+sewlmhY3oLUds+5H/2zE27q517kIcpP2Tlp4sRfooJfnBS7YYyF+1boxbvOXrZ2aqev3rzkyvKKMBg0UJTvAiSf7JgVCkMv33GeAX3/I+djEh23U="
- secure: "QTw5QQDaeQWBz6APcUCyl9P9UPI/T3j1++9o9fPxygS9R/7bQYNCrSH++owcAVCJgUI5oY3RmnYk/PjVygOLM0vbFqB2mMySibAhO/U3pSLtZ/HyPjqI9fX0TV/Cf7ji7soeXKk8p6kI2InMILpODLBaLdfm/jgCdAfecr5sGQI="
- secure: "JEcGQsUgEND64cAGVEHSxg8j7SlwofuYtLamANszs/h8FGYZ82rEjmG7r2zqSfBj/i1WsnSbTSsh8WJuXzvV8fw8enkcLEuJG9scQJzuzY8hnLe81o1fhEkclML0SLkLQ2Fu6rIqlKKeYwmJFFhSIj69ESRIkDhkjA1OrV7szzc="
- APT_DEPENDENCIES="doxygen libboost-dev libboost-test-dev libboost-filesystem-dev libboost-system-dev libboost-thread-dev libboost-program-options-dev liblapack-dev gfortran libeigen3-dev"
- GIT_DEPENDENCIES="jrl-umi3218/jrl-mathtools jrl-umi3218/jrl-mal"
- PPA_URI="stack-of-tasks/snapshot"
- NSIQCPPSTYLE_FILEFILTERPATH=cmake/filefilter.txt
notifications:
hipchat:
rooms:
- secure: "SP8KX6gPzBT0BCpcL3ybK4Cgx7a7rmK3Hv/fD2lIf/RUdTwtzLh/J/l9xSYuMZisLe1tM+12vfP7r6t1RNdXrB7pSpYvFRNIWmyfBC7KnUFVn5rwxUnDPhKY3D/XaJ1cycbBJqJdUjYjFKCGEm4x6cpRRN61Ii66RAUvm1h9aHQ="
email:
- hpp-source@laas.fr
branches:
only:
- master
- debian
script: ./.travis/run build
after_success: ./.travis/run after_success
after_failure: ./.travis/run after_failure
before_install: ./.travis/run before_install
matrix:
allow_failures:
- compiler: clang
# Copyright 2010, Olivier Stasse, JRL, CNRS/AIST cmake_minimum_required(VERSION 3.1)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) # Project properties
set(PROJECT_ORG stack-of-tasks)
set(PROJECT_NAME dynamic-graph)
set(PROJECT_DESCRIPTION "Dynamic graph library")
set(PROJECT_URL "https://github.com/${PROJECT_ORG}/${PROJECT_NAME}")
INCLUDE(cmake/base.cmake) # Project options
INCLUDE(cmake/boost.cmake) option(SUFFIX_SO_VERSION "Suffix library name with its version" ON)
INCLUDE(cmake/eigen.cmake)
INCLUDE(cmake/pthread.cmake)
SET(PROJECT_ORG stack-of-tasks) # Project configuration
SET(PROJECT_NAME dynamic-graph) set(PROJECT_USE_CMAKE_EXPORT TRUE)
SET(PROJECT_DESCRIPTION "Dynamic graph library") set(CUSTOM_HEADER_DIR ${PROJECT_NAME})
SET(PROJECT_URL "http://github.com/${PROJECT_ORG}/${PROJECT_NAME}") set(CXX_DISABLE_WERROR TRUE)
SET(PROJECT_SUFFIX "-v3")
SET(CUSTOM_HEADER_DIR "${PROJECT_NAME}") # Doxygen setup
set(DOXYGEN_USE_MATHJAX YES)
set(DOXYGEN_USE_TEMPLATE_CSS YES)
SET(DOXYGEN_USE_MATHJAX YES) # JRL-cmakemodule setup
include(cmake/base.cmake)
include(cmake/boost.cmake)
# Defines paths. # Project definition
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) compute_project_args(PROJECT_ARGS LANGUAGES CXX)
project(${PROJECT_NAME} ${PROJECT_ARGS})
check_minimal_cxx_standard(14 ENFORCE)
SETUP_PROJECT() include(cmake/pthread.cmake) # needs to be included after the CXX definition
# Project dependencies
if(BUILD_TESTING)
find_package(Boost REQUIRED COMPONENTS unit_test_framework)
endif()
add_project_dependency(Boost REQUIRED COMPONENTS serialization system thread)
add_project_dependency(Eigen3 REQUIRED)
search_for_pthread()
if(Boost_VERSION GREATER 107299 OR Boost_VERSION_MACRO GREATER 107299)
# Silence a warning about a deprecated use of boost bind by boost >= 1.73
# without dropping support for boost < 1.73
add_definitions(-DBOOST_BIND_GLOBAL_PLACEHOLDERS)
endif()
# Add configuration headers for plug-ins. # Add configuration headers for plug-ins.
GENERATE_CONFIGURATION_HEADER( generate_configuration_header(${HEADER_DIR} config-tracer.hh DG_TRACER
${HEADER_DIR} config-tracer.hh DG_TRACER tracer_EXPORTS) tracer_EXPORTS)
GENERATE_CONFIGURATION_HEADER( generate_configuration_header(${HEADER_DIR} config-tracer-real-time.hh
${HEADER_DIR} DG_TRACERREALTIME tracer_real_time_EXPORTS)
config-tracer-real-time.hh DG_TRACERREALTIME tracer_real_time_EXPORTS)
# Verbosity level
if(NOT (\"${CMAKE_VERBOSITY_LEVEL}\" STREQUAL \"\"))
add_definitions(-DVP_DEBUG_MODE=${CMAKE_VERBOSITY_LEVEL} -DVP_DEBUG)
endif(NOT (\"${CMAKE_VERBOSITY_LEVEL}\" STREQUAL \"\"))
# Main Library
set(${PROJECT_NAME}_HEADERS
include/${CUSTOM_HEADER_DIR}/fwd.hh
include/${CUSTOM_HEADER_DIR}/debug.h
include/${CUSTOM_HEADER_DIR}/real-time-logger.h
include/${CUSTOM_HEADER_DIR}/real-time-logger-def.h
include/${CUSTOM_HEADER_DIR}/dynamic-graph-api.h
include/${CUSTOM_HEADER_DIR}/entity.h
include/${CUSTOM_HEADER_DIR}/factory.h
include/${CUSTOM_HEADER_DIR}/pool.h
include/${CUSTOM_HEADER_DIR}/exception-abstract.h
include/${CUSTOM_HEADER_DIR}/exception-factory.h
include/${CUSTOM_HEADER_DIR}/exception-signal.h
include/${CUSTOM_HEADER_DIR}/exception-traces.h
include/${CUSTOM_HEADER_DIR}/signal.h
include/${CUSTOM_HEADER_DIR}/signal-array.h
include/${CUSTOM_HEADER_DIR}/signal-base.h
include/${CUSTOM_HEADER_DIR}/signal-ptr.h
include/${CUSTOM_HEADER_DIR}/signal-time-dependent.h
include/${CUSTOM_HEADER_DIR}/signal-ptr.t.cpp
include/${CUSTOM_HEADER_DIR}/signal.t.cpp
include/${CUSTOM_HEADER_DIR}/time-dependency.h
include/${CUSTOM_HEADER_DIR}/time-dependency.t.cpp
# Kept for a brittle backward compatiblity.
include/${CUSTOM_HEADER_DIR}/signal-caster.h
include/${CUSTOM_HEADER_DIR}/signal-cast-helper.h
include/${CUSTOM_HEADER_DIR}/all-signals.h
include/${CUSTOM_HEADER_DIR}/signal-helper.h
include/${CUSTOM_HEADER_DIR}/entity-helper.h
include/${CUSTOM_HEADER_DIR}/tracer.h
include/${CUSTOM_HEADER_DIR}/tracer-real-time.h
include/${CUSTOM_HEADER_DIR}/command.h
include/${CUSTOM_HEADER_DIR}/eigen-io.h
include/${CUSTOM_HEADER_DIR}/linear-algebra.h
include/${CUSTOM_HEADER_DIR}/value.h
include/${CUSTOM_HEADER_DIR}/command-setter.h
include/${CUSTOM_HEADER_DIR}/command-setter.t.cpp
include/${CUSTOM_HEADER_DIR}/command-getter.h
include/${CUSTOM_HEADER_DIR}/command-getter.t.cpp
include/${CUSTOM_HEADER_DIR}/command-direct-getter.h
include/${CUSTOM_HEADER_DIR}/command-direct-setter.h
include/${CUSTOM_HEADER_DIR}/command-bind.h
include/${CUSTOM_HEADER_DIR}/all-commands.h
include/${CUSTOM_HEADER_DIR}/logger.h)
set(${PROJECT_NAME}_SOURCES
src/debug/debug.cpp
src/debug/real-time-logger.cpp
src/debug/logger.cpp
src/dgraph/entity.cpp
src/dgraph/factory.cpp
src/dgraph/pool.cpp
src/exception/exception-abstract.cpp
src/exception/exception-factory.cpp
src/exception/exception-signal.cpp
src/exception/exception-traces.cpp
src/mt/process-list.cpp
src/signal/signal-array.cpp
src/command/value.cpp
src/command/command.cpp)
# FIXME: to be changed into lib/dynamic-graph add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES}
# to avoid name collision when installing dynamic-graph in /usr. ${${PROJECT_NAME}_HEADERS})
SET(PLUGINDIR "${CMAKE_INSTALL_FULL_LIBDIR}/plugin") modernize_target_link_libraries(
${PROJECT_NAME}
SCOPE
PUBLIC
TARGETS
Eigen3::Eigen
INCLUDE_DIRS
${EIGEN3_INCLUDE_DIR})
target_include_directories(${PROJECT_NAME} PUBLIC $<INSTALL_INTERFACE:include>)
target_link_libraries(${PROJECT_NAME} PUBLIC Boost::serialization Boost::system
Boost::thread)
# Add extra keys to pkg-config file to export the location of the if(UNIX)
# plug-in directory in a robust manner. target_link_libraries(${PROJECT_NAME} PUBLIC ${CMAKE_DL_LIBS} pthread)
SET(PKG_CONFIG_EXTRA "plugindir=${PLUGINDIR}") endif(UNIX)
# Add dependency toward dynamic graph library in pkg-config file. if(SUFFIX_SO_VERSION)
PKG_CONFIG_APPEND_LIBS(${PROJECT_NAME}) set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION})
endif(SUFFIX_SO_VERSION)
# Search for Boost. install(
SET(BOOST_COMPONENTS serialization system unit_test_framework thread) TARGETS ${PROJECT_NAME}
SEARCH_FOR_BOOST() EXPORT ${TARGETS_EXPORT_NAME}
SEARCH_FOR_PTHREAD() DESTINATION lib)
# Search for Boost. set(DYNAMIC_GRAPH_PLUGINDIR "lib/${PROJECT_NAME}-plugins")
SEARCH_FOR_EIGEN() set(PACKAGE_EXTRA_MACROS
"set(DYNAMIC_GRAPH_PLUGINDIR ${DYNAMIC_GRAPH_PLUGINDIR})")
set(PKG_CONFIG_EXTRA "plugindir=${DYNAMIC_GRAPH_PLUGINDIR}")
ADD_SUBDIRECTORY(src) add_subdirectory(src)
ADD_SUBDIRECTORY(include/${PROJECT_NAME}) if(BUILD_TESTING)
ADD_SUBDIRECTORY(tests) add_subdirectory(tests)
endif(BUILD_TESTING)
SETUP_PROJECT_FINALIZE() pkg_config_append_libs(${PROJECT_NAME})
install(FILES package.xml DESTINATION share/${PROJECT_NAME})
...@@ -129,4 +129,3 @@ stasse (3): ...@@ -129,4 +129,3 @@ stasse (3):
Reinforce the dependant->dependent policy. Merge the florent branch. Makes the test_depend.cpp test works. Reinforce the dependant->dependent policy. Merge the florent branch. Makes the test_depend.cpp test works.
Reinforce the dependant->dependent policy. Reinforce the dependant->dependent policy.
Adding documentation to cmdPlug. Adding documentation to cmdPlug.
dynamic-graph dynamic-graph
============= =============
[![Building Status](https://travis-ci.org/stack-of-tasks/dynamic-graph.svg?branch=master)](https://travis-ci.org/stack-of-tasks/dynamic-graph) [![Building status](https://gitlab.laas.fr/stack-of-tasks/dynamic-graph/badges/master/pipeline.svg)](https://gitlab.laas.fr/stack-of-tasks/dynamic-graph/commits/master)
[![Pipeline status](https://gepgitlab.laas.fr/stack-of-tasks/dynamic-graph/badges/master/pipeline.svg)](https://gepgitlab.laas.fr/stack-of-tasks/dynamic-graph/commits/master) [![Coverage report](https://gitlab.laas.fr/stack-of-tasks/dynamic-graph/badges/master/coverage.svg?job=doc-coverage)](http://projects.laas.fr/stack-of-tasks/doc/stack-of-tasks/dynamic-graph/master/coverage/)
[![Coverage report](https://gepgitlab.laas.fr/stack-of-tasks/dynamic-graph/badges/master/coverage.svg?job=doc-coverage)](http://projects.laas.fr/stack-of-tasks/doc/stack-of-tasks/dynamic-graph/master/coverage/) [![License](https://img.shields.io/badge/License-BSD%202--Clause-green.svg)](https://opensource.org/licenses/BSD-2-Clause)
[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/stack-of-tasks/dynamic-graph/master.svg)](https://results.pre-commit.ci/latest/github/stack-of-tasks/dynamic-graph)
This software provides an efficient way to modelize a C++ data-flow. This software provides an efficient way to modelize a C++ data-flow.
...@@ -42,10 +43,7 @@ located in the `$prefix/share/doc/dynamic-graph` directoy where ...@@ -42,10 +43,7 @@ located in the `$prefix/share/doc/dynamic-graph` directoy where
Getting Help Getting Help
------------ ------------
Support is provided through: Support is provided through issues on the github interface.
* the HPP mailing-list: hpp@laas.fr
* the following HipChat room: http://www.hipchat.com/gh4wQrZeV
How can I install dynamic-graph? How can I install dynamic-graph?
-------------------------------- --------------------------------
...@@ -57,13 +55,9 @@ have to be available on your machine. ...@@ -57,13 +55,9 @@ have to be available on your machine.
- Libraries: - Libraries:
- [Boost][] (>= 1.40) - [Boost][] (>= 1.40)
Its detection is controlled by the `BOOST_ROOT` variable, see next section - Doxygen
for more information. - Eigen3
- [Lapack][] library - pthread
Use the generic purpose `CMAKE_CXX_FLAGS` and `CMAKE_EXE_LINKER_FLAGS`
to insert the flags required for the compiler to find your Lapack library
if it is installed in a non-standard directory.
- [jrl-mal][] library
- System tools: - System tools:
- [CMake][] (>=2.6) - [CMake][] (>=2.6)
- [pkg-config][] - [pkg-config][]
...@@ -143,15 +137,12 @@ This package authors are credited in the [AUTHORS](AUTHORS) file. ...@@ -143,15 +137,12 @@ This package authors are credited in the [AUTHORS](AUTHORS) file.
Available Packages Available Packages
------------------ ------------------
* RobotPkg (Release 2.5.3r1): * RobotPkg :
http://robotpkg.openrobots.org/robotpkg/motion/dynamic-graph/index.html http://robotpkg.openrobots.org/robotpkg/motion/dynamic-graph/index.html
[doxygen-documentation]: http://stack-of-tasks.github.io/dynamic-graph/doxygen/HEAD/ [doxygen-documentation]: http://stack-of-tasks.github.io/dynamic-graph/doxygen/HEAD/
[jrl-mathtools]: https://github.com/jrl-umi3218/jrl-mathtools
[jrl-mal]: https://github.com/jrl-umi3218/jrl-mal
[git-submodules]: http://git-scm.com/book/en/Git-Tools-Submodules [git-submodules]: http://git-scm.com/book/en/Git-Tools-Submodules
[Boost]: http://www.boost.org/ [Boost]: http://www.boost.org/
...@@ -159,7 +150,6 @@ Available Packages ...@@ -159,7 +150,6 @@ Available Packages
[Doxygen]: http://www.stack.nl/~dimitri/doxygen/ [Doxygen]: http://www.stack.nl/~dimitri/doxygen/
[Eigen]: http://eigen.tuxfamily.org/ [Eigen]: http://eigen.tuxfamily.org/
[Git]: http://git-scm.com/ [Git]: http://git-scm.com/
[Lapack]: http://www.netlib.org/lapack/
[Libtool]: https://www.gnu.org/software/libtool/ [Libtool]: https://www.gnu.org/software/libtool/
[RobotPkg]: http://robotpkg.openrobots.org/ [RobotPkg]: http://robotpkg.openrobots.org/
[log4cxx]: https://logging.apache.org/log4cxx/ [log4cxx]: https://logging.apache.org/log4cxx/
......
Subproject commit f34901f143d843b48dfdb8d9e904503ed96e2310 Subproject commit 47c0cbf0b29433060682377dcb28266e8dc38995
This diff is collapsed.
/** /**
\page debug Debugging \page debug Debugging
They are several ways to perform debugging in dynamic-graph depending on your needs or situation: They are several ways to perform debugging in dynamic-graph depending on your
- Programmatically inside the entity in C++ will write inside a buffer in a different thread and output in a stream needs or situation:
(either std::cout or a file). It is detailed in \subpage subp_debug_rt_logger. - Programmatically inside the entity in C++, a logger will
- Programmatically inside the entity in C++ using a member of the entities and the previous real-time mechanism. write inside a buffer in a
It provides 4 levels of messags :(DEBUG,INFO, WARNING, ERROR). It is described in details here: different thread and output in a stream (either std::cout or a file). It is
\subpage subp_logger detailed in \subpage subp_debug_rt_logger.
- Programmatically in C++ to avoid overhead with macros and handling level as an int: \subpage subp_dbg_trace It provides 4 levels of messags :(DEBUG,INFO,
- If you just need to collect informations from signals (like rosbag). You can use WARNING, ERROR). It is described in details here: \subpage subp_logger
an entity called Tracer inside the graph:\subpage tracerdoc . <br>
A real time version exists - Programmatically in C++ to avoid overhead with macros and handling level as an
to write directly inside a memory buffer \subpage tracerrealtimedoc int: \subpage subp_dbg_trace .
- If you just need to collect informations from signals (like rosbag). You can
use an entity called Tracer inside the graph:\subpage tracerdoc . <br> A real
time version exists to write directly inside a memory buffer
\subpage tracerrealtimedoc
**/ **/
/** /**
\page subp_logger Loggers \page subp_logger Loggers
\section sec_logger Initialization of the logger \section sec_init_rt_logger Initialization of the logger
\subsection subsec_logger_hcpp Header and preprocessor variable \subsection subsec_init_rt_logger_hcpp Header and preprocessor variable
In order to activate the logger you need to add the following lines: In order to activate the logger you need to add the following lines:
\code \code
#define ENABLE_RT_LOG #define ENABLE_RT_LOG
#include <dynamic-graph/real-time-logger.h>
#include <dynamic-graph/logger.h> #include <dynamic-graph/logger.h>
#include <dynamic-graph/real-time-logger.h>
\endcode \endcode
\subsection subsec_logger_ Initialize the output stream \subsection subsec_logger_ Initialize the output stream
...@@ -22,51 +22,20 @@ It is possible to set the output stream of the messages inside a file: ...@@ -22,51 +22,20 @@ It is possible to set the output stream of the messages inside a file:
dynamicgraph::RealTimeLogger::destroy(); dynamicgraph::RealTimeLogger::destroy();
\endcode \endcode
Here the file is "/tmp/dg-LOGS.txt".
\subsection subsec_logger_init Initialization of the logger \section sec_use_rt_logger Using the rt_logger
Inside the constructor of the entity:
\code \code
logger_.setTimeSample(0.001); // Somewhere in your library
logger_.setStreamPrintPeriod(0.005); dgRTLOG() << "your message. Prefer to use \n than std::endl."
logger_.setVerbosity(VERBOSITY_ALL);
LoggerVerbosity alv = logger_.getVerbosity();
\endcode \endcode
The first line sets the frequency at which the logger will be updated.<br>
The second line specifies at which frequency the STREAM messages should be
printed.<br>
The third line specifies the level of message to accept.<br>
The fourth line returns the level of verbosity.
In this case, all messages are accepted and the STREAM message are displayed on the output streams once on five. <br>
The full list of options are:
<ul>
<li>VERBOSITY_ALL: Accept all messages</li>
<li>VERBOSITY_INFO_WARNING_ERROR: Accept messages at minimum level : INFO, WARNING, ERROR</li>
<li>VERBOSITY_WARNING_ERROR: Accept messages at minimum level : WARNING, ERROR</li>
<li>VERBOSITY_ERROR: Accept messages at minimum level : ERROR</li>
</ul>
Here the output file is "/tmp/dg-LOGS.txt".
\section sec_logger_tests Displaying messages
Here is some example on how to display or record some information.
\code
sendMsg("This is a message of level MSG_TYPE_DEBUG",MSG_TYPE_DEBUG, __FILE__,__LINE__);
sendMsg("This is a message of level MSG_TYPE_INFO",MSG_TYPE_INFO, __FILE__,__LINE__);
sendMsg("This is a message of level MSG_TYPE_WARNING",MSG_TYPE_WARNING, __FILE__,__LINE__);
sendMsg("This is a message of level MSG_TYPE_ERROR",MSG_TYPE_ERROR, __FILE__,__LINE__);
sendMsg("This is a message of level MSG_TYPE_DEBUG_STREAM",MSG_TYPE_DEBUG_STREAM, __FILE__,__LINE__);
sendMsg("This is a message of level MSG_TYPE_INFO_STREAM",MSG_TYPE_INFO_STREAM, __FILE__,__LINE__);
sendMsg("This is a message of level MSG_TYPE_WARNING_STREAM",MSG_TYPE_WARNING_STREAM, __FILE__,__LINE__);
sendMsg("This is a message of level MSG_TYPE_ERROR_STREAM",MSG_TYPE_ERROR_STREAM, __FILE__,__LINE__);
logger_.countdown();
\endcode
Specifying the file with __FILE__ and the line inside the file by __LINE__ are necessary for the Specifying the file with __FILE__ and the line inside the file by __LINE__ are
STREAM messages. Indeed they are indexed using the two values. As the default value are "" and 0 necessary for the STREAM messages. Indeed they are indexed using the two values.
the counting will be confused. The default values "" and 0 for the counting are not well understood.
*/ */
/**
\page subp_debug_rt_logger Real-time Logger
It is intended to be used like this:
\code
#define ENABLE_RT_LOG
#include <dynamic-graph/real-time-logger.h>
// Somewhere in the main function of your executable
int main (int argc, char** argv) {
dgADD_OSTREAM_TO_RTLOG (std::cout);
}
// Somewhere in your library
dgRTLOG() << "your message. Prefer to use \n than std::endl."
\endcode
\note Thread safety. This class expects to have:
- only one reader: the one who take the log entries and write them somewhere.
- one writer at a time. Writing to the logs is **never** a blocking
operation. If the resource is busy, the log entry is discarded.
*/
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
\section subp_dbg_trace_intro Introduction \section subp_dbg_trace_intro Introduction
The idea of this class and collection of MACROS is to specify The idea of this class and collection of MACROS is to specify
a level for a message, and record the message in a stream according to this level. a level for a message, and record the message in a stream according to this
In addition there are mechanisms allowing that no time level. In addition there are mechanisms allowing that no time is wasted in
is wasted in condition test. You can therefore let the debugging messages condition test. You can therefore let the debugging messages inside the code
inside the code without impact on performances. without impact on performances.
\section subp_dbg_trace_set_on_macros Setting up dgDEBUG macros \section subp_dbg_trace_set_on_macros Setting up dgDEBUG macros
...@@ -31,12 +31,9 @@ are written is specified by: ...@@ -31,12 +31,9 @@ are written is specified by:
\section subp_dbg_trace_using_macros Using dgDEBUG macros \section subp_dbg_trace_using_macros Using dgDEBUG macros
To print that the beginning of a method is being executed use the following macros: To print that the beginning of a method is being executed use the following
\code macros: \code dgDEBUGIN(5); \endcode 5 here specifies the minimum level that you
dgDEBUGIN(5); be specified by VP_DEBUG_MODE for this message to be displayed.
\endcode
5 here specifies the minimum level that you be specified by VP_DEBUG_MODE for this message
to be displayed.
It will generate the following output: It will generate the following output:
\code \code
...@@ -62,11 +59,11 @@ A message inside the code is written through: ...@@ -62,11 +59,11 @@ A message inside the code is written through:
This generates the following output: This generates the following output:
\code \code
/path_to/dynamic-graph/tests/debug-trace.cpp: testDebugTrace(#52) :Here is a test /path_to/dynamic-graph/tests/debug-trace.cpp: testDebugTrace(#52) :Here is a
\endcode test \endcode
\section subp_dbg_trace_wrk_exp Working example \section subp_dbg_trace_wrk_exp Working example
A full working example is given here: A full working example is given here:
\include ../tests/debug-trace.cpp \include tests/debug-trace.cpp
*/ */
/** \page subpage_command Commands
\section subpage_command_intro Quick introduction
Commands are allowing to expand the entities.
It has no real interest in C++, and is mostly targeted to scripting languages
used to manipulate the control graph.
dynamic-graph-python provides a mecanism which is automatically binding command
to python. The main interest for a programmer is that there is no additional
lines to add. It is realized through CMake rules provided by the submodule
jrl-cmakemodules.
\section subpage_command_using Extending entities
\subsection subpage_command_setters_and_getters Setters and getters
To modify a quantity with a special method of your class, it is recommanded to
use Setter.
For instance to specify the size of the state in one entity and calls the
method setStateSize it is possible to write:
\code
docstring = "\n"
" Set size of state vector\n"
"\n";
addCommand("resize", new command::Setter<Device, unsigned int>(
*this, &Device::setStateSize, docstring));
\endcode
Getting the information of the member of the class can be realized with
the following snippet:
\code
addCommand("getTimeStep",
command::makeDirectGetter(
*this, &this->timestep_,
command::docDirectGetter("Time step", "double")));
\endcode
\subsubsection subsubpage_command_void_multiple_args Implementing a command
Templates are provided to create commands returning no value, but with up to
4 arguments.
In order to call the following method:
\code
void four_args(const int &, const int &, const int &, const int &) {
test_four_args_ = true;
}
\endcode
It is sufficient to add in the constructor:
\code
addCommand("4_args",
makeCommandVoid4(
*this, &CustomEntity::four_args,
docCommandVoid4("four args", "int", "int", "int", "int")));
\endcode
The arguments are limited to the types provided by the class Value.
\subsection subpage_command_void_multiple_args Commands returning a value
The templates with the prefix makeCommandReturnType are allowing to return
a type.
For instance to add a command returning a type with two arguments:
\code
std::string two_args_ret(const int &, const int &)
{ test_two_args_ = true; return std::string("return");}
\endcode
In the constructor, the following snippet shows to create the command:
\code
addCommand("2_args_r",
makeCommandReturnType2(
*this, &CustomEntity::two_args_ret,
docCommandVoid2("two args", "int","int")));
\endcode
\section section_calling_a_generic_command Calling a generic command
Of course calling in C++ a command amounts to call directly the method.
However in the context of writing a wrapper for another language,
one may wants to find a command and build the call.
All the commands of an entity are store in a map. The strings storing the
commands name are the map keys.
Therefore calling the previous command can be done with the following snippet:
\code
std::map<const std::string, Command *> aCommandMap =
this->getNewStyleCommandMap();
std::string cmd_name = "4_args";
std::map<const std::string, Command *>::iterator it_map;
it_map = aCommandMap.find(cmd_name);
if (it_map == aCommandMap.end())
int first_arg = 1;
Value aValue(first_arg);
std::vector<Value> values;
for (unsigned int i = 0; i < 4; i++)
values.push_back(aValue);
it_map->second->setParameterValues(values);
it_map->second->execute();
it_map->second->owner();
it_map->second->getDocstring();
\endcode
when returning a value the line with the call to execute is :
\code
Value aValue =it_map->second->execute();
\endcode
*/
/**
\page subp_debug_rt_logger Real-time Logger
\section real_time_logger_quick_intro Quick introduction
Each entity has a protected logger_ object.
The simplest way to have information while running your graph is to initialize
it in the constructor, and then display information in the methods.
You can then change the level of information you want to display using
either the entity method setLoggerVerbosityLevel()
or the corresponding python bindings.
\section real_time_logger_modifying_entities Putting information in your
entity.
It is possible to define the periodicity of the logger:
\code
logger_.setTimeSample(0.001);
\endcode
To define the periodicity at which one wants to print information:
\code
logger_.setStreamPrintPeriod(0.005);
\endcode
Several level of verbosity are possible:
\code
logger_.setVerbosity(VERBOSITY_ALL);
\endcode
The full list of options are:
<ul>
<li>VERBOSITY_ALL: Accept all messages</li>
<li>VERBOSITY_INFO_WARNING_ERROR: Accept messages at minimum level : INFO,
WARNING, ERROR</li> <li>VERBOSITY_WARNING_ERROR: Accept messages at minimum
level : WARNING, ERROR</li> <li>VERBOSITY_ERROR: Accept messages at minimum
level : ERROR</li>
</ul>
It is specified by the enum LoggerVerbosity
It is possible to display information according to various level of debug:
\code
sendMsg("This is a message of level MSG_TYPE_DEBUG", MSG_TYPE_DEBUG);
\endcode
or
\code
DYNAMIC_GRAPH_ENTITY_DEBUG (*this) << "This is a message of level
MSG_TYPE_DEBUG\n"; DYNAMIC_GRAPH_ENTITY_INFO (*this) << "This is a message of
level MSG_TYPE_INFO\n"; DYNAMIC_GRAPH_ENTITY_WARNING (*this) << "This is a
message of level MSG_TYPE_WARNING\n"; DYNAMIC_GRAPH_ENTITY_ERROR (*this) <<
"This is a message of level MSG_TYPE_ERROR\n"; DYNAMIC_GRAPH_ENTITY_DEBUG_STREAM
(*this) << "This is a message of level MSG_TYPE_DEBUG_STREAM\n";
DYNAMIC_GRAPH_ENTITY_INFO_STREAM (*this) << "This is a message of level
MSG_TYPE_INFO_STREAM\n"; DYNAMIC_GRAPH_ENTITY_WARNING_STREAM (*this) << "This is
a message of level MSG_TYPE_WARNING_STREAM\n"; DYNAMIC_GRAPH_ENTITY_ERROR_STREAM
(*this) << "This is a message of level MSG_TYPE_ERROR_STREAM\n"; \endcode
\note Thread safety. This class expects to have:
- only one reader: the one who take the log entries and write them somewhere.
- one writer at a time. Writing to the logs is **never** a blocking
operation. If the resource is busy, the log entry is discarded.
*/
...@@ -5,45 +5,57 @@ ...@@ -5,45 +5,57 @@
\subsection entity_definition General definition \subsection entity_definition General definition
\image html entity.png \image html entity.png
Despite the fact that it looks very similar to a ROS node or a CORBA/OpenRTM server, an entity is simply a C++ object. Despite the fact that it looks very similar to a ROS node or a CORBA/OpenRTM
The main idea is that this entity is providing mostly a data-driven functionnality working at very high rate (\f$ 200 server, an entity is simply a C++ object. The main idea is that this entity is
providing mostly a data-driven functionnality working at very high rate (\f$ 200
Hz\f$ or \f$ 1 kHz \f$) and should have a minimal computational time foot-print. Hz\f$ or \f$ 1 kHz \f$) and should have a minimal computational time foot-print.
For this \subpage subp_signals (or ports to use a more classical terminology) are providing a time dependency between For this \subpage subp_signals (or ports to use a more classical terminology)
data. To implement this, an output signal is linked with a method of the entity. The method calls input signals or use are providing a time dependency between data. To implement this, an output
other means to get the needed data. It might be provided by the connection with remote computers through a middleware, signal is linked with a method of the entity. The method calls input signals or
or specific protocols, but in general the external data is based upon the sensor values provided by a "Device" entity. use other means to get the needed data. It might be provided by the connection
For this reason the signal evaluations are realized through the cascade of dependencies and start from the evaluation with remote computers through a middleware, or specific protocols, but in
of an input signal of a periodic node (in general the device). This is realized inside a \b real-time thread. general the external data is based upon the sensor values provided by a "Device"
entity. For this reason the signal evaluations are realized through the cascade
To add flexibility to a node, it is possible to add command with arguments to modify the internal behavior of the of dependencies and start from the evaluation of an input signal of a periodic
entity or get information from the entity. As a command is in general asynchronous and rare with respect to the node (in general the device). This is realized inside a \b real-time thread.
data-flow scheme for the signals the command is in general executed in a \b none-real-time thread.
To add flexibility to a node, it is possible to add command with arguments to
modify the internal behavior of the entity or get information from the entity.
As a command is in general asynchronous and rare with respect to the data-flow
scheme for the signals the command is in general executed in a \b none-real-time
thread. For more details on command see \subpage subpage_command .
\subsection entity_classes Entity class \subsection entity_classes Entity class
Entities are implemented as C++ classes and compiled as dynamic libraries. They can be loaded and instancied Entities are implemented as C++ classes and compiled as dynamic libraries. They
dynamically. It is therefore necessary to specify the location of their dynamical libraries. However given the time it can be loaded and instancied dynamically. It is therefore necessary to specify
might take to load the library, it is not advised to do that during a control-law computation. Entity instanciation the location of their dynamical libraries. However given the time it might take
also implies memory allocation which is also time consuming and thus not advised inside a real-time thread. to load the library, it is not advised to do that during a control-law
computation. Entity instanciation also implies memory allocation which is also
time consuming and thus not advised inside a real-time thread.
The entities will be placed in ${PREFIX}/lib/plugin (since this may change, it is advised to The entities will be placed in ${PREFIX}/lib/dynamic-graph-plugin
check the install log or the CMakeLists.txt file to check the installation path). (since this may change, it is advised to check the install log or the
CMakeLists.txt file to check the installation path).
\subsection entities List of entities in this package \subsection entities List of entities in this package
Since most of the functionality in projects using the dynamic-graph framework Since most of the functionality in projects using the dynamic-graph framework
is exposed from entities, here is a short description of all the entities contained in is exposed from entities, here is a short description of all the entities
this package. Note that most entities are contained in a binary file that closely matches contained in this package. Note that most entities are contained in a binary
the entities' names in the scripts; loading this file with the plugin loader will file that closely matches the entities' names in the scripts; loading this file
enable creation of this entity through the factory. with the plugin loader will enable creation of this entity through the factory.
\li \ref tracerdoc \li \ref tracerdoc
\li \ref tracerrealtimedoc \li \ref tracerrealtimedoc
\subsection specific_semantics Specific semantics with entities \subsection specific_semantics Specific semantics with entities
It is possible to derive classes and apply specific semantic for the entities. In our case we are interested in It is possible to derive classes and apply specific semantic for the entities.
specific control semantics: \li Tasks (more information <a In our case we are interested in specific control semantics: \li Tasks (more
href="http://stack-of-tasks.github.io/sot-core/doxygen/HEAD/a00089.html">here</a>) \li Features (more information <a information <a
href="http://stack-of-tasks.github.io/sot-core/doxygen/HEAD/a00030.html">here</a>) \li Solver (more information <a href="http://stack-of-tasks.github.io/sot-core/doxygen/HEAD/a00089.html">here</a>)
\li Features (more information <a
href="http://stack-of-tasks.github.io/sot-core/doxygen/HEAD/a00030.html">here</a>)
\li Solver (more information <a
href="http://stack-of-tasks.github.io/sot-core/doxygen/HEAD/a00078.html">here</a>) href="http://stack-of-tasks.github.io/sot-core/doxygen/HEAD/a00078.html">here</a>)
*/ */
...@@ -5,21 +5,24 @@ ...@@ -5,21 +5,24 @@
\subsection use_programmatically General introduction \subsection use_programmatically General introduction
For control purposes the main use of this package is to create new entities and connect them through signals. For control purposes the main use of this package is to create new entities and
connect them through signals.
Objects, which are derived from Entities (base class dynamicgraph::Entity), can be Objects, which are derived from Entities (base class dynamicgraph::Entity), can
declared within the code and compiled as shared libraries (.so/.dll files). be declared within the code and compiled as shared libraries (.so/.dll files).
These libraries can be loaded at run-time using the PluginLoader methods, These libraries can be loaded at run-time using the PluginLoader methods,
and at the same time register their class names to the Factory (see the and at the same time register their class names to the Factory (see the
examples in the <a href="http://projects.laas.fr/gepetto/doc/stack-of-tasks/sot-core/master/doxygen-html">sot-core examples in the <a
href="http://projects.laas.fr/gepetto/doc/stack-of-tasks/sot-core/master/doxygen-html">sot-core
documentation</a> for advanced control examples). documentation</a> for advanced control examples).
The Factory can then create instances of these objects and subsequently The Factory can then create instances of these objects and subsequently
register them in the Pool. From the pool they can be listed, accessed, and acted upon register them in the Pool. From the pool they can be listed, accessed, and acted
(see PoolStorage documentation). Basic commands defined by entities include upon (see PoolStorage documentation). Basic commands defined by entities include
signal connection graph file generation, help and name print, and signals. signal connection graph file generation, help and name print, and signals.
This is usually done through a scripting language such as python (see This is usually done through a scripting language such as python (see
<a hef="https://github.com/stack-of-tasks/dynamic-graph-python">dynamic-graph-python</a>) <a
hef="https://github.com/stack-of-tasks/dynamic-graph-python">dynamic-graph-python</a>)
The singletons made available by including the corresponding headers in this The singletons made available by including the corresponding headers in this
module are: module are:
...@@ -30,13 +33,15 @@ For an example of a program creating entities in C++, see the unit test ...@@ -30,13 +33,15 @@ For an example of a program creating entities in C++, see the unit test
test_pool.cpp (in your package source directory/tests). test_pool.cpp (in your package source directory/tests).
\subsection Tutorial \subsection Tutorial
A tutorial is available <a href="http://stack-of-tasks.github.io/dynamic-graph-tutorial/">here</a>. A tutorial is available <a
It is providing a step-by-step way of building an entity href="http://stack-of-tasks.github.io/dynamic-graph-tutorial/">here</a>. It is
providing a step-by-step way of building an entity
\section sec_htw_helpers Helpers \section sec_htw_helpers Helpers
When writing entities you might use some macros which are very useful to write your class. When writing entities you might use some macros which are very useful to write
your class.
\subsection subsec_howto_typedef Entity helpers \subsection subsec_howto_typedef Entity helpers
...@@ -48,13 +53,13 @@ The header <b>entity-helper.h</b> is defining a type called EntityClassName ...@@ -48,13 +53,13 @@ The header <b>entity-helper.h</b> is defining a type called EntityClassName
<ul> <ul>
<li> <b>DYNAMIC_GRAPH_ENTITY_DECL()</b>: <li> <b>DYNAMIC_GRAPH_ENTITY_DECL()</b>:
This macro creates a method <b>getClassName()</b> which returns the class name.</li> This macro creates a method <b>getClassName()</b> which returns the class
This macro <b>should</b> be used in the declaration of the class. name.</li> This macro <b>should</b> be used in the declaration of the class.
</li> </li>
<li> <b>DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(classtype,classname)</b> <li> <b>DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(classtype,classname)</b>
This macros creates the methods necessary to have a factory building the C++ class This macros creates the methods necessary to have a factory building the C++
<b>classtype</b> from the string <b>classname</b>. class <b>classtype</b> from the string <b>classname</b>. This macro
This macro <b>should</b> be used in the implementation of the class. <b>should</b> be used in the implementation of the class.
</li> </li>
</ul> </ul>
...@@ -64,15 +69,12 @@ The header <b>entity-helper.h</b> is defining a type called EntityClassName ...@@ -64,15 +69,12 @@ The header <b>entity-helper.h</b> is defining a type called EntityClassName
<li> Macro for input signals <li> Macro for input signals
<ul> <ul>
<li> <b>DECLARE_SIGNAL_IN(signal_name,type)</b>: <li> <b>DECLARE_SIGNAL_IN(signal_name,type)</b>:
Declare an input time dependent signal as a field of the class with the following name: Declare an input time dependent signal as a field of the class with the
\code following name: \code m_signal_nameSIN \endcode
m_signal_nameSIN
\endcode
</li> </li>
<li> <b>CONSTRUCT_SIGNAL_IN(signal_name,type)</b>: <li> <b>CONSTRUCT_SIGNAL_IN(signal_name,type)</b>:
This macro is used in the constructor of the entity class handling this signal. This macro is used in the constructor of the entity class handling this
It is calling the signal constructor and set the signal name to: signal. It is calling the signal constructor and set the signal name to: \code
\code
EntityClassName(entity-name)::input(type)::signal_name EntityClassName(entity-name)::input(type)::signal_name
\endcode \endcode
</ul> </ul>
...@@ -80,32 +82,24 @@ The header <b>entity-helper.h</b> is defining a type called EntityClassName ...@@ -80,32 +82,24 @@ The header <b>entity-helper.h</b> is defining a type called EntityClassName
<li> Macro for output signals <li> Macro for output signals
<ul> <ul>
<li> <b>DECLARE_SIGNAL_OUT(signal_name,type)</b>: <li> <b>DECLARE_SIGNAL_OUT(signal_name,type)</b>:
Declare an output time dependent signal as a field of the class with the following name: Declare an output time dependent signal as a field of the class with the
\code following name: \code m_signal_nameSOUT \endcode It also declares a method with
m_signal_nameSOUT the following pattern: \code type signal_nameSOUT_function(type &,int) \endcode
\endcode
It also declares a method with the following pattern:
\code
type signal_nameSOUT_function(type &,int)
\endcode
The second pattern is the time when calling the output. The second pattern is the time when calling the output.
</li> </li>
<li> <b>CONSTRUCT_SIGNAL_OUT(signal_name,type)</b> <li> <b>CONSTRUCT_SIGNAL_OUT(signal_name,type)</b>
This macro is used in the constructor of the entity class handling this signal. This macro is used in the constructor of the entity class handling this
It creates the binding to the method described previously, and set the signal name to: signal. It creates the binding to the method described previously, and set the
\code signal name to: \code EntityClassName(entity_name)::output(type)::signal_name
EntityClassName(entity_name)::output(type)::signal_name
\endcode \endcode
where entity_name is the name of the entity currently instanciated. where entity_name is the name of the entity currently instanciated.
</li> </li>
<li> <b>DEFINE_SIGNAL_OUT_FUNCTION(signal_name, type)</b>: <li> <b>DEFINE_SIGNAL_OUT_FUNCTION(signal_name, type)</b>:
This macro is used when implementing the method specific to the output signal. This macro is used when implementing the method specific to the output
It is used in the main body of the entity class to declare the header of the method signal. It is used in the main body of the entity class to declare the header of
with the following pattern: the method with the following pattern: \code type
\code EntityClassName::signal_nameSOUT_function(type &, int iter) \endcode
type EntityClassName::signal_nameSOUT_function(type &, int iter)
\endcode
</li> </li>
</ul> </ul>
...@@ -113,8 +107,8 @@ The header <b>entity-helper.h</b> is defining a type called EntityClassName ...@@ -113,8 +107,8 @@ The header <b>entity-helper.h</b> is defining a type called EntityClassName
</li> Inner signals </li> Inner signals
<ul> <ul>
<li> <b> DECLARE_SIGNAL_INNER(signal_name,type)</b> <li> <b> DECLARE_SIGNAL_INNER(signal_name,type)</b>
Inner signal are signal that depend on a state of the entity and not on input signals. Inner signal are signal that depend on a state of the entity and not on
This macro declares an inner signal with the following pattern: input signals. This macro declares an inner signal with the following pattern:
\code \code
m_signal_nameSINNER m_signal_nameSINNER
\endcode \endcode
...@@ -124,11 +118,13 @@ The header <b>entity-helper.h</b> is defining a type called EntityClassName ...@@ -124,11 +118,13 @@ The header <b>entity-helper.h</b> is defining a type called EntityClassName
\endcode \endcode
</li> </li>
<li> <b>DEFINE_SIGNAL_INNER_FUNCTION(signal_name,type)</b> <li> <b>DEFINE_SIGNAL_INNER_FUNCTION(signal_name,type)</b>
This macro is used to implement the method related to signal_name. More precisely This macro is used to implement the method related to signal_name. More
it provides the header of the member function(i.e. method) declaration. precisely it provides the header of the member function(i.e. method)
declaration.
</li> </li>
<li><b>DECLARE_SIGNAL_INNER_FUNCTION(signal_name,type)</b> <li><b>DECLARE_SIGNAL_INNER_FUNCTION(signal_name,type)</b>
This macros declares the member function used to handle the access to this signal. This macros declares the member function used to handle the access to this
signal.
</li> </li>
</ul> </ul>
</ul> </ul>
......
...@@ -2,6 +2,6 @@ ...@@ -2,6 +2,6 @@
\page subp_factory Factory \page subp_factory Factory
\section sec_factory Factory \section sec_factory Factory
The class \ref dynamicgraph::FactoryStorage is a singleton which register the entity classes and which is allowing the The class \ref dynamicgraph::FactoryStorage is a singleton which register the
instancation of such classes. entity classes and which is allowing the instancation of such classes.
*/ */