Unverified Commit 8530ada4 authored by Joseph Mirabel's avatar Joseph Mirabel Committed by GitHub

Merge pull request #45 from jmirabel/devel

Add TimeDependency::addDependencies + doc of SignalTimeDependent
parents 384b2078 8d664249
Subproject commit f34901f143d843b48dfdb8d9e904503ed96e2310
Subproject commit 429af97fe0b858bd73a1747768cc1ac735386140
......@@ -6,4 +6,6 @@ IMAGE_PATH = @CMAKE_SOURCE_DIR@/doc/pictures \
FILE_PATTERNS = *.cc *.cpp *.h *.hh *.hxx
TAGFILES = \
"@CMAKE_INSTALL_PREFIX@/share/doc/dynamic-graph-python.doxytag = @CMAKE_INSTALL_PREFIX@/share/doc/dynamic-graph-python"
\ No newline at end of file
"@CMAKE_INSTALL_PREFIX@/share/doc/dynamic-graph-python.doxytag = @CMAKE_INSTALL_PREFIX@/share/doc/dynamic-graph-python"
EXAMPLE_PATH = @CMAKE_SOURCE_DIR@
......@@ -13,6 +13,6 @@ WARNING, ERROR). It is described in details here: \subpage subp_logger
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
time version exists to write directly inside a memory buffer
\subpage tracerrealtimedoc
**/
......@@ -65,5 +65,5 @@ test \endcode
\section subp_dbg_trace_wrk_exp Working example
A full working example is given here:
\include ../tests/debug-trace.cpp
\include tests/debug-trace.cpp
*/
......@@ -22,8 +22,8 @@ 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
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.
......
......@@ -85,7 +85,7 @@ public:
/** \name Logger related methods */
/** \{*/
/// \brief Send messages \param msg with level t.
/// \brief Send messages \c msg with level \c t.
/// Add string file and line to message.
void sendMsg(const std::string &msg, MsgType t = MSG_TYPE_INFO,
const char *file = "", int line = 0);
......
......@@ -5,6 +5,7 @@
#define DYNAMIC_GRAPH_NULL_PTR_HH
namespace dynamicgraph {
/// \cond
const class {
public:
template <class T> operator T *() const { return 0; }
......@@ -14,6 +15,7 @@ public:
private:
void operator&() const;
} nullptr = {};
/// \endcond
} // end of namespace dynamicgraph.
......
......@@ -22,7 +22,7 @@ public:
ProcessList();
};
/// \class This class gather information on a specific CPU.
/// This class gather information on a specific CPU.
///
class DYNAMIC_GRAPH_DLLAPI CPUData {
public:
......@@ -123,7 +123,7 @@ public:
}
};
/// \class This class gathers information on a computer.
/// This class gathers information on a computer.
/// This includes a list of CPU
class DYNAMIC_GRAPH_DLLAPI System {
private:
......
......@@ -13,16 +13,49 @@ namespace dynamicgraph {
signals,
making sure its inputs are up to date on access, using a incrementing time
tick as reference.
It works this way: for a given SignalTimeDependent S, the user manually
adds dependent signals through the
use of the addDependency function. On access (calling the signal S
operator () or access(Time) function),
if the dependent signals are not up-to-date, i.e. if their [last update]
time is less than the
current time, their value will be access ()'ed to bring them up-to-date.
Thus, the value of dependent
signals can be accessed \b quickly and \b repeatedly through the
accessCopy () function.
It works this way. For a given SignalTimeDependent S,
- the user manually adds dependent signals through the use of the SignalTimeDependent::addDependency function.
- On access (calling the signal S SignalTimeDependent::operator()(const Time&) or
SignalTimeDependent::access(const Time&) function), if the dependent signals are not
up-to-date, i.e. if their [last update] time is less than the current time,
their value will be SignalTimeDependent::access ()'ed to bring them up-to-date.
Thus, the value of dependent signals can be accessed \b quickly and
\b repeatedly through the Signal::accessCopy () function.
An example:
\code
class MyEntity : public Entity {
public:
// Some signal dependencies
SignalPtr<T,int> dep1, dep2;
SignalTimeDependent<T,int> signal;
MyEntity (const std::string& name)
: Entity (name)
, signal (
// Set the function that computes the signal value
boost::bind (&Entity::computeSignal, this, _1, _2),
// Declare the dependencies
dep1 << dep2,
"signalname")
{}
T& computeSignal (T& res, int time)
{
// The accesses below update the signal if necessary.
dep1(time);
dep1.access(time);
dep1.recompute(time);
// If dep1 and dep2 are already up-to-date, for a faster access, use
dep1.accessCopy();
dep2.accessCopy();
// Compute res
return res;
}
\endcode
*/
template <class T, class Time>
class SignalTimeDependent : public virtual Signal<T, Time>,
......
......@@ -43,6 +43,7 @@ public:
const DependencyType dep = DEPENDENCY_TYPE_DEFAULT);
virtual ~TimeDependency() {}
void addDependencies(const SignalArray_const<Time> &arr);
void addDependency(const SignalBase<Time> &sig);
void removeDependency(const SignalBase<Time> &sig);
void clearDependency();
......
......@@ -26,14 +26,19 @@ TimeDependency<Time>::TimeDependency(SignalBase<Time> *sig,
const SignalArray_const<Time> &ar,
const DependencyType dep)
: __TIME_DEPENDENCY_INIT(sig, dep) {
for (unsigned int i = 0; i < ar.getSize(); ++i) {
addDependency(ar[i]);
}
addDependencies(ar);
return;
}
/* ------------------------------------------------------------------------ */
template <class Time>
void TimeDependency<Time>::addDependencies(const SignalArray_const<Time> &ar) {
for (unsigned int i = 0; i < ar.getSize(); ++i) {
addDependency(ar[i]);
}
}
template <class Time>
void TimeDependency<Time>::addDependency(const SignalBase<Time> &sig) {
dependencies.push_front(&sig);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment