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
Showing
with 275 additions and 311 deletions
/**
\page subp_concept_intro General introduction
\section intro_dynamicGraph Introduction
The dynamic-graph package is used to connect computation nodes, "entities"
together using a graph system, akin to what Simulink does. Entities are
connected through input and output signals. With the building blocks this
package provides, you can easily create a full computation graph for a given
problem. It is the basis for the stack of tasks operation.
\subsection controlgraph Exemple: Real-time control
<p>To give a more concrete example, the real-time control used by the Gepetto
group for the humanoid robot HRP-2 is detailled.</p> <p> Real-time control
system are usually driven by a cyclic computational node which needs to send a
control reference value to each motors of a robot. To compute this control
reference values, sensor values need to be provided. In the Stack-Of-Tasks
special entities called Device are used to provide an abstract interface to the
hardware.</p> A scheme of the real-time control graph used for the humanoid
robot HRP-2 is depicted in the following figure:
\image html Concept-Software-Fig.png
You can find an example of a real example of control graph at \ref
writegraphdoc.
<p>The device therefore has a specific input which should contain the control
vector. This control vector is the result of a computation solving a control
problem. The entity in charge of solving this control problem is called "Solver"
in the previous figure. In the SoT framework it is often cast as an optimization
problem. This optimization problem is build using a control "Task" (not to be
confused with the general word task). A control "Task" regulates the difference
with a "Feature" computed on the current robot state and a "Desired Feature".
For instance when walking, the regulated feature is the robot's Center-Of-Mass
(CoM) position. The "Feature" is computed using a library using the robot model
and the sensor value. The entity making this computation is "Dyn". A walking
pattern generator using foot-steps position given in advance generates the
desired value for the CoM. Note that the "Dyn" entity uses the sensor provided
by the entity "Robot". </p>
<p>
From a pure computer science viewpoint we wish to avoid recomputing data such as
articular Jacobians when this is unnecessary. Therefore the data generated by an
entity through signals may have two types of dependencies: one dependency
related to time and dependencies on other signals. Internally an entity does not
recompute the data if no new information is available, it is simply providing
the same information computed before. Please note that this package provides
only the computational framework to realize the data dependency and the
entities. Solvers, libraries to compute mechanical quantities are provided in
different packages.
</p>
<p>
Finally in order to dynamically create a graph, it is possible \b on-line to
load classes of entities and create instances of entities.</p>
\subsection Functionnalities
\li Support for extensions and modules using dynamic link libraries
\li Template-based signal definition, independent
\li Type-safe connection of input and output signals
\li On-demand signal computation as well as a caching system for signal values
allow fast computation of signal values, which is a critical point for real-time
systems\n
*/
......@@ -6,139 +6,35 @@
*
* CNRS/AIST
*
* This file is part of dynamic-graph.
* dynamic-graph is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
* dynamic-graph is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details. You should
* have received a copy of the GNU Lesser General Public License along
* with dynamic-graph. If not, see <http://www.gnu.org/licenses/>.
*/
/**
\mainpage
\section intro_dynamicGraph Introduction
The dynamic-graph package is used to connect computation nodes, "entities"
together using a graph system, akin to what Simulink does. With the building
blocks this package provides, you can easily create a full computation graph
for a given problem. It is the basis for the stack of tasks operation.
\image html entity.png
Functionality:
\li Built-in scripting language* for fast prototyping and testing
\li Support for extensions and modules using dynamic link libraries
\li Template-based signal definition, independant
\li Type-safe connection of input and output signals
\li On-demand signal computation as well as a caching system for signal values allow fast
computation of signal values, which is a critical point for real-time systems\n
See \ref scriptingabout
\section overview Code overview
This code implements the factory design pattern, making creation of entities
(as C++ classes) available to packages depending on the dynamic-graph API.
For more information on this package's code or how to develop your own entities,
see \ref usecase.
\section entities List of entities in this package
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
this package. Note that most entities are contained in a binary file that closely matches
the entities' names in the scripts; loading this file with the plugin loader will
enable creation of this entity through the factory.
\li \ref tracerdoc
\li \ref tracerrealtimedoc
\li ShellProcedure
\li \ref shellfunctions_doc
The entities will be placed in ${PREFIX}/lib/plugin (since this may change, it is advised to
check the install log or the CMakeLists.txt file to check the installation path).
\section sigintro About signals
Entities can output different types of signals. All signals are templated by a Time
tick type parameter (which is used in the caching of signals) - usually \c int. Signals
are also templated after the type of data they accept or provide. For example:
(example)
For a more detailed programmer-oriented description of signals, please see \ref signals
\section scriptingabout Notes about the scripting language
The scripting language allows entities to define their own commands, and
provides a basic framework for working with the dynamic-graph.
At the time of writing, there is talk about replacing (or complementing) this limited
language with a python interpreter.
A couple of functions are built-in in the interpreter and provides low-level features such as file sourcing or
plug-in loading.\n
These functions are:\n
\code plug <obj1.sig1> <obj2.sig2> \endcode plugs the signal sig1 of obj1 to the signal sig2 of obj2. sig1 and sig2
have to be of the same type. sig1 has to be an output signal and sig2 an input signal.
\code new <class> <object> \endcode instantiates an object object of class class. object has to be a free identifier and
class an existing entity.
\code destroy <object> \endcode deletes an instance previously created.
\code run <script.txt> \endcode sources (i.e. read and interpret) an external file.
\code loadPlugin <file.so> <directory> \endcode loads a plugin called file.so and located in the directory directory.
\code unloadPlugin <path/file.so> \endcode unloads a plugin.
\code help \endcode lists available functions.
\code set <obj.signal> <value> \endcode defines an input signal to a specific, constant, value.
\code get <obj.signal> <value> \endcode prints out a signal value.
\code compute <obj.sig> <time> \endcode computes an output signal and sets the associated time to time.
\section usecase How to use this package
1) Programmatically\n
Objects, which are derived from Entities (base class dynamicgraph::Entity), can be
declared within the code and compiled to shared libraries (.so/.dll files).
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
examples in the SOT documentation to learn how).
The Factory can then create instances of these objects and subsequently
register them in the Pool, where they can be listed, accessed, and acted upon
(see PoolStorage documentation). Basic commands defined by entities include
signal connection graph file generation, help and name print, and signals.
Finally, a shell (command-line) interface is made available thanks to the
Interpreter class (see the file test_shell.cpp for an example). Objects deriving from
Entity can expose their own commands by overriding the Entity's default
commandLine() method. It is possible to load a plugin to register custom
shell commands; see shell-functions and shell-procedure for an example.
Some basic shell functions, and support for procedures, are also included.
For a complete list of those, load the plugin shell-functions.so and type 'help'
at the command line.
The (singletons made available by including the corresponding headers in this
module are:
\li dynamicgraph::FactoryStorage
\li dynamicgraph::PoolStorage
For an example of a program creating entities in C++, see the unit test
test_pool.cpp (in your package source directory/unitTesting).
2) Through scripts\n
The program \ref dgshell_doc can be used to have scripting access to the dynamic-graph
library, where you can execute scripts and commands, load plugins, create entities and connect signals.
Here is a typical use case for programmers:
\image html figures/use-case.png
\section References
\anchor Mansard2007
<b>"Task sequencing for sensor-based control"</b>,
<em>N. Mansard, F. Chaumette,</em>
IEEE Trans. on Robotics, 23(1):60-72, February 2007
The dynamic-graph aims at building computational graphs for real-time control.
It provides the basic software functionnalities.
A more detailed introduction is available at \subpage subp_concept_intro.
The installation instruction are given at \subpage subp_installation.
The software graph structure is detailled in \subpage p_graph
For debugging your entities detailed instructions are given in \subpage debug
For citing the software in your research work please refer to
\subpage subp_references
\namespace dynamicgraph This is the namespace where every object and class of
this library is located.
\defgroup debug Debugging
\defgroup dgraph Core classes and objects
@{
Classes, entities and binaries that make up the core of the dynamic-graph library are listed here.
Classes, entities and binaries that make up the core of the dynamic-graph
library are listed here.
@}
\defgroup signals Signals
......@@ -147,24 +43,24 @@ This part provides the mechanism to transfer information
from one entity to another. There are three main types of signals,
all deriving from the common class dynamicgraph::SignalBase :
\li dynamicgraph::Signal : a "normal" signal, passing data around \b by \b value
\li dynamicgraph::SignalPtr : a signal used for efficient passing of large data, by reference (or rather, C pointers)*
\li dynamicgraph::SignalTimeDependent : a signal that enforces a time dependency between other signals,
making sure its inputs are up to date on access, using a incrementing time tick as reference.
\li dynamicgraph::SignalPtr : a signal used for efficient passing of large data,
by reference (or rather, C pointers)* \li dynamicgraph::SignalTimeDependent : a
signal that enforces a time dependency between other signals, making sure its
inputs are up to date on access, using a incrementing time tick as reference.
\n* Note: this may cause a problem if this package is used in a multithreaded program.
\n* Note: this may cause a problem if this package is used in a multithreaded
program.
Signals can be grouped together using dynamicgraph::SignalArray.
Signals implement a caching mechanism by storing the last computation time tick.
Some signals can be plugged ("plug" script command) into one another or set through shell commands.
For more information, please see the individual signal pages.
\b Samples
\li The following code ensures the jacobian output signal uses up-to-date values for its
computations, when accessed.
\li The following code ensures the jacobian output signal uses up-to-date values
for its computations, when accessed.
\code
// This signal returns the Jacobian of the current value
......@@ -180,5 +76,4 @@ computations, when accessed.
@}
\namespace dynamicgraph This is the namespace where every object and class of this library is located.
*/
/**
\page subp_pool Pool
\section pool Pool
The class \ref dynamicgraph::PoolStorage keeps track of the entities
instanciated with the factory. The entities are the graph nodes. Signals are
constructed during the class instanciation, they do not live independently from
the entities. Signals are the directed edges of the graph. The pool can write a
file representing the graph of entities.
*/
/**
\page subp_references References
\section sec_refer References
Please when referencing the Stack-Of-Tasks use the following reference:
\anchor Mansard2009
<b> <a href="https://hal-lirmm.ccsd.cnrs.fr/lirmm-00796736/document">
"A versatile Generalized Inverted Kinematics implementation for collaborative
working humanoid robots: The Stack Of Tasks"</a>
</b>,
<em>N. Mansard, O. Stasse, P. Evrard, A. Kheddar,</em>
Int. Conf. on Autonomous Robots, ICAR, 2009
\anchor Mansard2007
<b>"Task sequencing for sensor-based control"</b>,
<em>N. Mansard, F. Chaumette,</em>
IEEE Trans. on Robotics, 23(1):60-72, February 2007
*/
/**
\page shellfunctions_doc ShellFunctions
\note Note: this documentation covers specific aspects of the in-house
scripting language currently used by the dynamic-graph script. Unless
otherwise specified, it is only relevant for programmers using this
particular language. At the time of writing, there is talk of
replacing the language with python, so check if this information is still
relevant before reading.
\section description Description
The \b ShellFunctions plugin file adds common shell functions to the
dynamic-graph shell.
\section commands Commands
The supplementary \b commands provided (you can also type 'help' at the
dynamic-graph shell command line to see them and a brief description):
\code
LoadPlugins
Try
DisplayPlugins
DisplayFactory
Commentary
Unplug
ClearPlugin
SignalTime
SynchroSignal
Echo
Copy
Freeze
Squeeze
EnableTrace
SetPrompt
Sleep
Beep
FlagSet
CompletionList
\endcode
\section addi Additional information
See doxygen documentation for the class ShellFunctions
\section generates Generated plugin file
shell-functions.dll or shell-functions.so.
**/
/**
\page subp_signals Signals
\section sec_sigintro Signals
Entities can output different types of signals. To guarante real-time
perforamces, signals are implemented using C++ and mecanism which have a low
time foot-print. All signals are templated by a Time tick type parameter (which
is used in the caching of signals) - usually \c int. Signals are also templated
after the type of data they accept or provide. For example: (example) For a more
detailed programmer-oriented description of signals, please see \ref signals
*/
/**
\page tracerrealtimedoc TracerRealTime
\section description Description
The \b TracerRealTime entity monitors a set of signals with real-time constraints; its
function is very similar to the Tracer, except that all traces are recorded to a
memory buffer, which can be emptied at any time.
\section commands Commands
The \b commands that this entity exposes are (you can also type [entity name].help at the
dynamic-graph shell command line to see this list):
\section tracerrealtimedoc_description Description
The \b TracerRealTime entity monitors a set of signals with real-time
constraints; its function is very similar to the Tracer, except that all traces
are recorded to a memory buffer, which can be emptied at any time.
\section tracerrealtimedoc_commands Commands
The \b commands that this entity exposes are:
\code
empty (discards all buffers)
buffersize (sets buffer size for recording)
trace (writes traces to files)
getBufferSize (gets buffer size for recording)
setBufferSize (sets buffer size for recording)
\endcode
Plus all the commands exposed by \ref tracerdoc
\n
For more information on the signals exposed by this entity, please check the
code documentation of the dynamicgraph::Tracer class.
\section sample Sample usage
\section tracerrealtimedoc_sample Sample usage
See \ref tracerdoc for a code sample of using TracerRealTime.
\section addi Additional information
\section tracerrealtimedoc_addi Additional information
See doxygen documentation for the class dynamicgraph::TracerRealTime
\section generates Generated plugin file
\section tracerrealtimedoc_generates Generated plugin file
tracer-real-time.dll or tracer-real-time.so.
**/
*/
/**
\page tracerdoc Tracer
\section description Description
The \b Tracer entity monitors a set of signals. With an input change on the entity's [trigger] signal,
the tracked signal values are recorded and traced to a file. The behavior of the trace-to-file
function can be changed, from printing to a file immediately after recording, to printing out
only when asked explicitly.
\section commands Commands
The \b commands that this entity exposes are (you can also type [entity name].help at the
dynamic-graph shell command line to see this list):
\section tracerdoc_description Description
The \b Tracer entity monitors a set of signals. With an input change on the
entity's [trigger] signal, the tracked signal values are recorded and traced to
a file. The behavior of the trace-to-file function can be changed, from printing
to a file immediately after recording, to printing out only when asked
explicitly.
\section tracerdoc_commands Commands
The \b commands that this entity exposes are:
\code
open, close (a file);
add (a signal)
......@@ -20,29 +21,22 @@ start, stop (traces)
For more information on the signals exposed by this entity, please check the
code documentation of the dynamicgraph::Tracer class.
\n\n
\section sample Sample usage
The following code creates a TracerRealTime entity, then sets the tracing buffer
size to 10MB. It then tells the tracer to create files with names of the form:
jl_XXX.dat where XXX is the signal name, and adds a few signals after
clearing the traces;
\code
new TracerRealTime tr
tr.bufferSize 10485760
tr.open ${TRACE_REPOSITORY} jl_ .dat
OpenHRP.periodicCall addSignal tr.triger
(...)
# --- TRACE ---
tr.clear
tr.add OpenHRP.forceRARM
tr.add dyn.0
tr.add jgain.gain
\section tracerdoc_sample Sample usage
The following code creates a TracerRealTime entity and sets the tracing buffer
size to 80MB. It then tells the tracer to create files with names of the form:
/tmp/dg_XXX.dat where XXX is the signal name, and call the signal
after the device has evaluated the control law:
\code
robot.tracer = TracerRealTime("com_tracer")
robot.tracer.setBufferSize(80*(2**20))
robot.tracer.open('/tmp','dg_','.dat')
robot.device.after.addSignal('{0}.triger'.format(robot.tracer.name))
\endcode
\section addi Additional information
\section tracerdoc_addi Additional information
See doxygen documentation for the class dynamicgraph::Tracer
\section generates Generated plugin file
\section tracerdoc_generates Generated plugin file
tracer.dll or tracer.so.
**/
*/
/**
\page writegraphdoc Displaying the graph of entities
\section description Description
It is possible to view the graph of entities currently instanciated.
The format used by dynamic-graph is dot.
Using the python interpreter the following command
\code
from dynamic_graph import *
writeGraph('/tmp/my_dynamic_graph.dot')
\endcode
is writing the <b>my_dynamic_graph.dot</b> in the <b>/tmp</b> directory
\section fromdottopdf Viewing as a PDF file
To view the dot file you can simply use:
\code
dot -Tpdf /tmp/my_dynamic_graph.dot > /tmp/my_dynamic_graph.pdf
\endcode
It provides the following output:
\image html my_dynamic_graph.png
\section fromdottojs Viewing in a browser
To view the dot file you can simply use the view_sot_dg.html file.
Click on the "Choose File" to specify the filem and click on "Rendering" to
display the graph.
*/
/* Customizing Doxygen output */
/* Needed to allow line breaks in tables*/
.memberdecls {
table-layout: fixed;
width: 100%;
}
/* Needed to break long template names*/
.memTemplItemLeft {
white-space: normal !important;
word-wrap: break-word;
}
/* Needed to break long template names*/
.memItemLeft {
white-space: normal !important;
word-wrap: break-word;
}
=head1 NAME
dg-shell-plugin - Stack of tasks shell with all plug-ins loaded
=head1 SYNOPSIS
dg-shell-plugin
=head1 DESCRIPTION
Start the stack of tasks with all core plug-ins loaded.
=head1 AUTHORS
This software has been developed at CNRS/AIST and LAAS-CNRS laboratories.
See <@CMAKE_INSTALL_PREFIX@/share/doc/libdg-middleware-dev/AUTHORS> to
see the list of all contributors.
=head1 SEE ALSO
dg-shell(1)
See also <@PROJECT_URL@> for additional resources.
=head1 NAME
dg-shell - Stack of tasks shell
=head1 SYNOPSIS
dg-shell [--input <file>|-i <file>|--noninteractive|-n|--prologue|-prologue <file>|-h|--help]
=head1 DESCRIPTION
Start the stack of tasks and provides to the user an interactive shell
to control the data-flow.
By default, the shell first evaluates the prologue file
($HOME/.dg-shellrc by default). Additional input files passed as
arguments to evaluate multiple files.
=head1 OPTIONS
B<-i> I<file>, B<--input> I<file>
evaluate the file at start-up
B<-n>, B<--noninteractive>
enable the non-interactive mode
B<-p> I<file>, B<--prologue> I<file>
override the default prologue file (i.e. $HOME/.dg-shellrc)
B<-h>, B<--help>
produce help message
=head1 EXAMPLES
No options is required to launch a shell:
dg-shell
To evaluate "example.dg" only:
dg-shell -i example.dg -n
To evaluate "example1.dg", "example2.dg" and provide a shell to the user:
dg-shell -i example1.dg -i example2.dg
=head1 AUTHORS
This software has been developed at CNRS/AIST and LAAS-CNRS laboratories.
See <@CMAKE_INSTALL_PREFIX@/share/doc/libdg-middleware-dev/AUTHORS> to
see the list of all contributors.
=head1 SEE ALSO
dg-shell-plugin(1)
See also <@PROJECT_URL@> for additional resources.
<svg xmlns:x="http://ns.adobe.com/Extensibility/1.0/" xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" xmlns:graph="http://ns.adobe.com/Graphs/1.0/" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="721" height="735"><defs></defs><rect stroke="#000000" stroke-width="0" fill="#ffffff" x="0" y="0" width="720" height="734"/><g transform='translate(21.0,40.0)'><line x1='0.0' y1='0.0' x2='601.0' y2='0.0' stroke-dasharray='23, 0' stroke='#333333' stroke-width='1' /><g transform='translate(290.5,0.0)'></g></g><g transform='translate(26.5,-9.5) rotate(0 175.0 33.5)'><g transform='translate(0.0,41.5)'><text x='2' style='text-anchor: start' y='-3.0'><tspan xml:space='preserve' font-size='18' font-family='Arial' fill='#000000' >Typical plugin loading and usage process</tspan></text></g></g><g transform='translate(56.0,55.5) rotate(0 70.0 37.5)'><g transform='translate(0.0,0.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='21.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,21.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='20.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,41.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='34.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,15.5)'><text x='70.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' font-weight='bold' text-decoration='underline' >:PluginLoader</tspan></text></g><g ></g><g ></g></g><g transform='translate(91.26515179773804,214.89454904672732) rotate(0 37.734848202261965 30.10545095327268)'><rect x='0.0' y='4.493350888548161' width='67.65211829090791' height='55.41799429209398' stroke="#000000" stroke-width="1.0" fill="#ffffff"/><polygon points='0.0,4.493350888548161 7.516902032323101,0.0 75.16902032323101,0.0 67.65211829090791,4.493350888548161 ' stroke="#000000" stroke-width="1.0" fill="#ffffff"/><polygon points='75.16902032323101,0.0 75.16902032323101,55.41799429209398 67.65211829090791,59.911345180642144 67.65211829090791,4.493350888548161 ' stroke="#000000" stroke-width="1.0" fill="#ffffff"/><g transform='translate(0.0,35.10545095327268)'><text x='37.734848202261965' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' font-style='italic' >plugin.so</tspan></text></g></g><g transform='translate(361.0,245.5) rotate(0 70.0 37.5)'><g transform='translate(0.0,0.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='21.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,21.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='20.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,41.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='34.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,15.5)'><text x='70.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' font-weight='bold' text-decoration='underline' >factory:Factory</tspan></text></g><g ></g><g ></g></g><g transform='translate(361.0,395.5) rotate(0 70.0 37.5)'><g transform='translate(0.0,0.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='21.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,21.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='20.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,41.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='34.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,15.5)'><text x='70.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' font-weight='bold' text-decoration='underline' >pool:Pool</tspan></text></g><g ></g><g ></g></g><g transform='translate(361.0,542.0) rotate(0 70.0 45.0)'><g transform='translate(0.0,0.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='36.0' stroke="#000000" stroke-width="2.0" fill="#ffffff"/></g><g transform='translate(0.0,36.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='34.0' stroke="#000000" stroke-width="2.0" fill="#ffffff"/></g><g transform='translate(0.0,70.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='20.0' stroke="#000000" stroke-width="2.0" fill="#ffffff"/></g><g transform='translate(0.0,15.0)'><text x='70.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' font-weight='bold' text-decoration='underline' >myEntityInstance</tspan></text><text x='70.0' style='text-anchor: middle' y='14.2'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' font-weight='bold' text-decoration='underline' >:Entity</tspan></text></g><g transform='translate(0.0,54.0)'><text x='2' style='text-anchor: start' y='-2.0'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' >+</tspan><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' >commandLine(input</tspan></text><text x='2' style='text-anchor: start' y='14.2'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' >stream, output stream)</tspan></text></g><g ></g></g><g transform='translate(130.0,214.0)'><line x1='-0.017762440882695196' y1='-0.49968439608805953' x2='-3.0' y2='-84.39454904672732' stroke-dasharray='23, 0' stroke='#000000' stroke-width='1' /><g transform='translate(0.0,0.0) rotate(267.9641458400894)'><polygon points='2.0,0 8.0,-3.0 8.0,3.0' fill='#000000' stroke='#000000' stroke-width='1.0' /></g><g transform='translate(-1.5031560391194043,-37.19727452336366)'><rect fill='#ffffff' x='-20.5' y='-9.0' width='41.0' height='15'/><text x='0.0' style='text-anchor: middle' y='2.0'><tspan font-size='13px' font-family='Arial' fill='#000000' >loads</tspan></text></g></g><g transform='translate(360.0,128.5) rotate(0 70.0 37.5)'><g transform='translate(0.0,0.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='21.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,21.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='20.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,41.0)'><rect x='0.0' y='0.0' width='139.4422310756972' height='34.0' stroke="#000000" stroke-width="2.0" fill="#ffcc33"/></g><g transform='translate(0.0,15.5)'><text x='70.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' font-weight='bold' >Shell:Interpreter</tspan></text></g><g ></g><g ></g></g><g transform='translate(536.2421099913893,64.97396996134887) rotate(0 29.75789000861068 48.026030038651136)'><circle cx='29.56081788934836' cy='9.566938254711381' r='9.85360596311612' fill='#FFFFFF' stroke="#000000" stroke-width="1.0"/><line x1='29.56081788934836' y1='19.133876509422763' x2='29.56081788934836' y2='57.40162952826829' stroke="#000000" stroke-width="1.0" fill="#ffffff"/><line x1='29.56081788934836' y1='57.40162952826829' x2='19.70721192623224' y2='95.66938254711381' stroke="#000000" stroke-width="1.0" fill="#ffffff"/><line x1='29.56081788934836' y1='57.40162952826829' x2='39.41442385246448' y2='95.66938254711381' stroke="#000000" stroke-width="1.0" fill="#ffffff"/><line x1='29.56081788934836' y1='57.40162952826829' x2='39.41442385246448' y2='95.66938254711381' stroke="#000000" stroke-width="1.0" fill="#ffffff"/><line x1='0.0' y1='28.700814764134144' x2='59.12163577869672' y2='28.700814764134144' stroke="#000000" stroke-width="1.0" fill="#ffffff"/><g transform='translate(0.0,114.05206007730227)'><text x='29.75789000861068' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' >user</tspan></text></g></g><g transform='translate(431.0,321.0)'><line x1='0.006666074153073843' y1='0.4999555614806037' x2='1.0' y2='75.0' stroke-dasharray='23, 0' stroke='#000000' stroke-width='1' /><g transform='translate(0.0,0.0) rotate(89.23610153907002)'><polygon points='2.0,0 8.0,-3.0 8.0,3.0' fill='#000000' stroke='#000000' stroke-width='1.0' /></g><g transform='translate(0.49955561480603716,42.5)'><rect fill='#ffffff' x='-53.0' y='-9.0' width='106.0' height='15'/><text x='0.0' style='text-anchor: middle' y='2.0'><tspan font-size='13px' font-family='Arial' fill='#000000' >calls newEntity()</tspan></text></g></g><g transform='translate(501.0,580.0)'><path d='M1.0,0.0 L94.75789000861073,0.0 Q104.75789000861073,0.0 104.75789000861073,-10.0 L104.75789000861073,-457.0 Q104.75789000861073,-467.0 94.75789000861073,-467.0 L93.75789000861073,-467.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='1' /><g transform='translate(0.0,0.0) rotate(0.0)'><polygon points='2.0,0 8.0,-3.0 8.0,3.0' fill='#000000' stroke='#000000' stroke-width='1.0' /></g><g transform='translate(104.75789000861073,-166.62105499569464)'><rect fill='#ffffff' x='-98.5' y='-17.0' width='197.0' height='15'/><text x='0.0' style='text-anchor: middle' y='-6.0'><tspan font-size='13px' font-family='Arial' fill='#000000' >requests new instance creation</tspan></text><rect fill='#ffffff' x='-98.5' y='1.1999999999999993' width='197.0' height='15'/><text x='0.0' style='text-anchor: middle' y='12.2'><tspan font-size='13px' font-family='Arial' fill='#000000' >(either through code or the shell)</tspan></text></g></g><g transform='translate(196.0,93.0)'><line x1='0.49913841090379535' y1='0.029340190190827932' x2='340.24210999138927' y2='20.0' stroke-dasharray='23, 0' stroke='#000000' stroke-width='1' /><g transform='translate(0.0,0.0) rotate(3.364070655892468)'><polygon points='2.0,0 8.0,-3.0 8.0,3.0' fill='#000000' stroke='#000000' stroke-width='1.0' /></g><g transform='translate(160.13828677761873,10.0)'><rect fill='#ffffff' x='-98.5' y='-17.0' width='197.0' height='15'/><text x='0.0' style='text-anchor: middle' y='-6.0'><tspan font-size='13px' font-family='Arial' fill='#000000' >requests plugin load</tspan></text><rect fill='#ffffff' x='-98.5' y='1.1999999999999993' width='197.0' height='15'/><text x='0.0' style='text-anchor: middle' y='12.2'><tspan font-size='13px' font-family='Arial' fill='#000000' >(either through code or the shell)</tspan></text></g></g><g transform='translate(167.0,245.0)'><path d='M0.0,0.0 Q96.5,0.0 96.5,-39.5 Q96.5,-79.0 189.0,-78.98193899898531 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='1' /><g transform='translate(193.0,-79.0) rotate(539.0)'><polygon points='2.0,0 8.0,-3.0 8.0,3.0' fill='#000000' stroke='#000000' stroke-width='1.0' /></g><g transform='translate(102.0,-37.5)'><rect fill='#ffffff' x='-90.0' y='-9.0' width='180.0' height='15'/><text x='0.0' style='text-anchor: middle' y='2.0'><tspan font-size='13px' font-family='Arial' fill='#000000' >(auto-)registers functions with</tspan></text></g></g><g transform='translate(361.0,283.0)'><path d='M-4.0,-0.008528940762130819 Q-97.13257589886902,0.0 -97.13257589886902,-19.0 Q-97.13257589886902,-38.0 -194.26515179773804,-38.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='1' /><g transform='translate(0.0,0.0) rotate(180.0)'><polygon points='2.0,0 8.0,-3.0 8.0,3.0' fill='#000000' stroke='#000000' stroke-width='1.0' /></g><g transform='translate(-92.0,-16.5)'><rect fill='#ffffff' x='-85.0' y='-9.0' width='170.0' height='15'/><text x='0.0' style='text-anchor: middle' y='2.0'><tspan font-size='13px' font-family='Arial' fill='#000000' >(auto-)registers entities with</tspan></text></g></g><g transform='translate(431.0,471.0)'><line x1='0.0' y1='0.5' x2='0.0' y2='64.0' stroke-dasharray='23, 0' stroke='#000000' stroke-width='1' /><g transform='translate(0.0,0.0) rotate(90.0)'><polygon points='2.0,0 8.0,-3.0 8.0,3.0' fill='#000000' stroke='#000000' stroke-width='1.0' /></g><g transform='translate(0.0,37.0)'><rect fill='#ffffff' x='-74.0' y='-9.0' width='148.0' height='15'/><text x='0.0' style='text-anchor: middle' y='2.0'><tspan font-size='13px' font-family='Arial' fill='#000000' >(auto-)registers entity to</tspan></text></g></g><g transform='translate(361.0,587.0)'><line x1='0.0' y1='0.0' x2='-131.5' y2='-6.123233995736766E-17' stroke-dasharray='23, 0' stroke='#000000' stroke-width='1' /><g transform='translate(-132.0,0.0) rotate(360.0)'><polygon points='2.0,0 8.0,-3.0 8.0,3.0' fill='#000000' stroke='#000000' stroke-width='1.0' /></g><g transform='translate(-76.0,0.0)'></g></g><g transform='translate(81.5,555.0) rotate(0 72.5 40.0)'><polygon points='0.0,0.0 124.203187250996,0.0 144.42231075697208,18.543046357615896 144.42231075697208,79.47019867549669 0.0,79.47019867549669 ' stroke="#000000" stroke-width="1.0" fill="#ffffff"/><line x1='124.203187250996' y1='0.0' x2='124.203187250996' y2='18.543046357615896' stroke="#000000" stroke-width="1.0" fill="#ffffff"/><line x1='124.203187250996' y1='18.543046357615896' x2='144.42231075697208' y2='18.543046357615896' stroke="#000000" stroke-width="1.0" fill="#ffffff"/><g transform='translate(0.0,21.0)'><text x='72.5' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' >Can respond to</tspan></text><text x='72.5' style='text-anchor: middle' y='14.2'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' >commands e.g. (in the</tspan></text><text x='72.5' style='text-anchor: middle' y='30.4'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' >shell) myEntity.help,</tspan></text><text x='72.5' style='text-anchor: middle' y='46.599999999999994'><tspan xml:space='preserve' font-size='13' font-family='Arial' fill='#000000' >etc.</tspan></text></g></g></svg>
\ No newline at end of file
<!-- HTML header for doxygen 1.8.11-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen $doxygenversion"/>
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
<link href="$relpath^sot.ico" rel="icon" type="image/x-icon">
<script type="text/javascript" src="$relpath^jquery.js"></script>
<script type="text/javascript" src="$relpath^dynsections.js"></script>
$treeview
$search
$mathjax
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
$extrastylesheet
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<!--BEGIN TITLEAREA-->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<!--BEGIN PROJECT_LOGO-->
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
<!--END PROJECT_LOGO-->
<!--BEGIN PROJECT_NAME-->
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">$projectname
<!--BEGIN PROJECT_NUMBER-->&#160;<span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
</div>
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
</td>
<!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME-->
<!--BEGIN PROJECT_BRIEF-->
<td style="padding-left: 0.5em;">
<div id="projectbrief">$projectbrief</div>
</td>
<!--END PROJECT_BRIEF-->
<!--END !PROJECT_NAME-->
<!--BEGIN DISABLE_INDEX-->
<!--BEGIN SEARCHENGINE-->
<td>$searchbox</td>
<!--END SEARCHENGINE-->
<!--END DISABLE_INDEX-->
</tr>
</tbody>
</table>
</div>
<!--END TITLEAREA-->
<!-- end header part -->
doc/pictures/Concept-Software-Fig.png

30.9 KiB

File moved
......@@ -9,7 +9,7 @@
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
version="1.1"
inkscape:version="0.47 r22583"
......
doc/pictures/my_dynamic_graph.png

97.1 KiB

doc/pictures/sot.ico

4.98 KiB

doc/pictures/sot.png

2.78 KiB