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 (237)
Showing
with 1095 additions and 187 deletions
---
ColumnLimit: 80
...
# 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 429af97fe0b858bd73a1747768cc1ac735386140 Subproject commit 47c0cbf0b29433060682377dcb28266e8dc38995
This diff is collapsed.
...@@ -3,14 +3,15 @@ ...@@ -3,14 +3,15 @@
They are several ways to perform debugging in dynamic-graph depending on your They are several ways to perform debugging in dynamic-graph depending on your
needs or situation: needs or situation:
- Programmatically inside the entity in C++ will write inside a buffer in a - Programmatically inside the entity in C++, a logger will
write inside a buffer in a
different thread and output in a stream (either std::cout or a file). It is different thread and output in a stream (either std::cout or a file). It is
detailed in \subpage subp_debug_rt_logger. detailed in \subpage subp_debug_rt_logger.
- Programmatically inside the entity in C++ using a member of the entities and It provides 4 levels of messags :(DEBUG,INFO,
the previous real-time mechanism. It provides 4 levels of messags :(DEBUG,INFO,
WARNING, ERROR). It is described in details here: \subpage subp_logger WARNING, ERROR). It is described in details here: \subpage subp_logger
- Programmatically in C++ to avoid overhead with macros and handling level as an - Programmatically in C++ to avoid overhead with macros and handling level as an
int: \subpage subp_dbg_trace int: \subpage subp_dbg_trace .
- If you just need to collect informations from signals (like rosbag). You can - 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 use an entity called Tracer inside the graph:\subpage tracerdoc . <br> A real
time version exists to write directly inside a memory buffer time version exists to write directly inside a memory buffer
......
/** /**
\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
...@@ -22,57 +22,20 @@ It is possible to set the output stream of the messages inside a file: ...@@ -22,57 +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>
\section sec_logger_tests Displaying messages Here the output file is "/tmp/dg-LOGS.txt".
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 Specifying the file with __FILE__ and the line inside the file by __LINE__ are
necessary for the STREAM messages. Indeed they are indexed using the two values. necessary for the STREAM messages. Indeed they are indexed using the two values.
As the default value are "" and 0 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.
*/
/** \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.
*/
...@@ -24,7 +24,7 @@ To add flexibility to a node, it is possible to add command with arguments to ...@@ -24,7 +24,7 @@ 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. 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 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 scheme for the signals the command is in general executed in a \b none-real-time
thread. 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 Entities are implemented as C++ classes and compiled as dynamic libraries. They
...@@ -34,9 +34,9 @@ to load the library, it is not advised to do that during a control-law ...@@ -34,9 +34,9 @@ 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 computation. Entity instanciation also implies memory allocation which is also
time consuming and thus not advised inside a real-time thread. 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 The entities will be placed in ${PREFIX}/lib/dynamic-graph-plugin
is advised to check the install log or the CMakeLists.txt file to check the (since this may change, it is advised to check the install log or the
installation path). 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
......
...@@ -8,6 +8,8 @@ In dynamic-graph a graph is build with: ...@@ -8,6 +8,8 @@ In dynamic-graph a graph is build with:
- computational nodes which are entities \subpage subpage_entities. - computational nodes which are entities \subpage subpage_entities.
- directed edges which are created by connecting input and output signals - directed edges which are created by connecting input and output signals
\subpage subp_signals. \subpage subp_signals.
- commands which are expanding the capabilities of the entity
\subpage subpage_command
- managing the nodes is done through a factory \subpage subp_factory providing - managing the nodes is done through a factory \subpage subp_factory providing
classes and a way to create instances from this list of classes. classes and a way to create instances from this list of classes.
- the instances of node are handled through a pool \subpage subp_pool - the instances of node are handled through a pool \subpage subp_pool
......
...@@ -17,7 +17,7 @@ The sources are available through github at the following URL: ...@@ -17,7 +17,7 @@ The sources are available through github at the following URL:
href="https://github.com/stack-of-tasks/dynamic-graph">https://github.com/stack-of-tasks/dynamic-graph</a> href="https://github.com/stack-of-tasks/dynamic-graph">https://github.com/stack-of-tasks/dynamic-graph</a>
To clone: To clone:
\code \code{.sh}
git clone https://github.com/stack-of-tasks/dynamic-graph.git git clone https://github.com/stack-of-tasks/dynamic-graph.git
\endcode \endcode
......