Skip to content
Snippets Groups Projects
Unverified Commit 8530ada4 authored by Joseph Mirabel's avatar Joseph Mirabel Committed by GitHub
Browse files

Merge pull request #45 from jmirabel/devel

Add TimeDependency::addDependencies + doc of SignalTimeDependent
parents 384b2078 8d664249
No related branches found
No related tags found
No related merge requests found
Subproject commit f34901f143d843b48dfdb8d9e904503ed96e2310 Subproject commit 429af97fe0b858bd73a1747768cc1ac735386140
...@@ -6,4 +6,6 @@ IMAGE_PATH = @CMAKE_SOURCE_DIR@/doc/pictures \ ...@@ -6,4 +6,6 @@ IMAGE_PATH = @CMAKE_SOURCE_DIR@/doc/pictures \
FILE_PATTERNS = *.cc *.cpp *.h *.hh *.hxx FILE_PATTERNS = *.cc *.cpp *.h *.hh *.hxx
TAGFILES = \ TAGFILES = \
"@CMAKE_INSTALL_PREFIX@/share/doc/dynamic-graph-python.doxytag = @CMAKE_INSTALL_PREFIX@/share/doc/dynamic-graph-python" "@CMAKE_INSTALL_PREFIX@/share/doc/dynamic-graph-python.doxytag = @CMAKE_INSTALL_PREFIX@/share/doc/dynamic-graph-python"
\ No newline at end of file
EXAMPLE_PATH = @CMAKE_SOURCE_DIR@
...@@ -13,6 +13,6 @@ WARNING, ERROR). It is described in details here: \subpage subp_logger ...@@ -13,6 +13,6 @@ WARNING, ERROR). It is described in details here: \subpage subp_logger
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 \subpage time version exists to write directly inside a memory buffer
tracerrealtimedoc \subpage tracerrealtimedoc
**/ **/
...@@ -65,5 +65,5 @@ test \endcode ...@@ -65,5 +65,5 @@ 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
*/ */
...@@ -22,8 +22,8 @@ The software graph structure is detailled in \subpage p_graph ...@@ -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 debugging your entities detailed instructions are given in \subpage debug
For citing the software in your research work please refer to \subpage For citing the software in your research work please refer to
subp_references \subpage subp_references
\namespace dynamicgraph This is the namespace where every object and class of \namespace dynamicgraph This is the namespace where every object and class of
this library is located. this library is located.
......
...@@ -85,7 +85,7 @@ public: ...@@ -85,7 +85,7 @@ public:
/** \name Logger related methods */ /** \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. /// Add string file and line to message.
void sendMsg(const std::string &msg, MsgType t = MSG_TYPE_INFO, void sendMsg(const std::string &msg, MsgType t = MSG_TYPE_INFO,
const char *file = "", int line = 0); const char *file = "", int line = 0);
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#define DYNAMIC_GRAPH_NULL_PTR_HH #define DYNAMIC_GRAPH_NULL_PTR_HH
namespace dynamicgraph { namespace dynamicgraph {
/// \cond
const class { const class {
public: public:
template <class T> operator T *() const { return 0; } template <class T> operator T *() const { return 0; }
...@@ -14,6 +15,7 @@ public: ...@@ -14,6 +15,7 @@ public:
private: private:
void operator&() const; void operator&() const;
} nullptr = {}; } nullptr = {};
/// \endcond
} // end of namespace dynamicgraph. } // end of namespace dynamicgraph.
......
...@@ -22,7 +22,7 @@ public: ...@@ -22,7 +22,7 @@ public:
ProcessList(); ProcessList();
}; };
/// \class This class gather information on a specific CPU. /// This class gather information on a specific CPU.
/// ///
class DYNAMIC_GRAPH_DLLAPI CPUData { class DYNAMIC_GRAPH_DLLAPI CPUData {
public: public:
...@@ -123,7 +123,7 @@ 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 /// This includes a list of CPU
class DYNAMIC_GRAPH_DLLAPI System { class DYNAMIC_GRAPH_DLLAPI System {
private: private:
......
...@@ -13,16 +13,49 @@ namespace dynamicgraph { ...@@ -13,16 +13,49 @@ namespace dynamicgraph {
signals, signals,
making sure its inputs are up to date on access, using a incrementing time making sure its inputs are up to date on access, using a incrementing time
tick as reference. tick as reference.
It works this way: for a given SignalTimeDependent S, the user manually
adds dependent signals through the It works this way. For a given SignalTimeDependent S,
use of the addDependency function. On access (calling the signal S - the user manually adds dependent signals through the use of the SignalTimeDependent::addDependency function.
operator () or access(Time) function), - On access (calling the signal S SignalTimeDependent::operator()(const Time&) or
if the dependent signals are not up-to-date, i.e. if their [last update] SignalTimeDependent::access(const Time&) function), if the dependent signals are not
time is less than the up-to-date, i.e. if their [last update] time is less than the current time,
current time, their value will be access ()'ed to bring them up-to-date. 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 Thus, the value of dependent signals can be accessed \b quickly and
accessCopy () function. \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> template <class T, class Time>
class SignalTimeDependent : public virtual Signal<T, Time>, class SignalTimeDependent : public virtual Signal<T, Time>,
......
...@@ -43,6 +43,7 @@ public: ...@@ -43,6 +43,7 @@ public:
const DependencyType dep = DEPENDENCY_TYPE_DEFAULT); const DependencyType dep = DEPENDENCY_TYPE_DEFAULT);
virtual ~TimeDependency() {} virtual ~TimeDependency() {}
void addDependencies(const SignalArray_const<Time> &arr);
void addDependency(const SignalBase<Time> &sig); void addDependency(const SignalBase<Time> &sig);
void removeDependency(const SignalBase<Time> &sig); void removeDependency(const SignalBase<Time> &sig);
void clearDependency(); void clearDependency();
......
...@@ -26,14 +26,19 @@ TimeDependency<Time>::TimeDependency(SignalBase<Time> *sig, ...@@ -26,14 +26,19 @@ TimeDependency<Time>::TimeDependency(SignalBase<Time> *sig,
const SignalArray_const<Time> &ar, const SignalArray_const<Time> &ar,
const DependencyType dep) const DependencyType dep)
: __TIME_DEPENDENCY_INIT(sig, dep) { : __TIME_DEPENDENCY_INIT(sig, dep) {
for (unsigned int i = 0; i < ar.getSize(); ++i) { addDependencies(ar);
addDependency(ar[i]);
}
return; 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> template <class Time>
void TimeDependency<Time>::addDependency(const SignalBase<Time> &sig) { void TimeDependency<Time>::addDependency(const SignalBase<Time> &sig) {
dependencies.push_front(&sig); dependencies.push_front(&sig);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment