6 #include <dynamic-graph/factory.h>
8 #include <sot/core/debug.hh>
11 #include <tsid/utils/statistics.hpp>
12 #include <tsid/utils/stop-watch.hpp>
19 using namespace dynamicgraph::command;
34 : Entity(name), CONSTRUCT_SIGNAL_OUT(trigger, int, sotNOSIGNAL) {
35 Entity::signalRegistration(m_triggerSOUT);
38 addCommand(
"addOutputSignal",
42 "Add a new output signal",
43 "Name of the text file where to read the data (string)",
44 "Name of the output signal (string)")));
49 docCommandVoid0(
"Update all the output signals.")));
53 docCommandVoid0(
"Rewind all the data.")));
55 addCommand(
"clear", makeCommandVoid0(
57 docCommandVoid0(
"Clear all the output signals.")));
65 std::string astr = toString(iter);
73 const string& signalName) {
76 return SEND_MSG(
"It already exists a signal with name " + signalName,
80 std::ifstream datafile(fileName.c_str());
82 return SEND_MSG(
"Error trying to read the file " + fileName,
85 const unsigned int SIZE = 1024;
87 std::vector<double> newline;
89 bool firstIter =
true;
90 std::size_t size = -1;
91 string fileNameShort = fileName.substr(1 + fileName.find_last_of(
"/"));
92 while (datafile.good()) {
93 datafile.getline(buffer, SIZE);
94 const std::size_t gcount = datafile.gcount();
96 return SEND_MSG(
"Read error: line " + toString(nbLines) +
97 " too long in file " + fileNameShort,
100 std::istringstream iss(buffer);
106 if (iss.fail())
break;
107 newline.push_back(x);
110 if (newline.size() > 0) {
112 size = newline.size();
113 else if (size != newline.size()) {
114 SEND_MSG(
"In file " + fileNameShort +
115 " nb of elements in each line changed from " +
116 toString(size) +
" to " + toString(newline.size()) +
117 " at line " + toString(nbLines),
119 size = newline.size();
121 m_data[signalName].push_back(
122 Eigen::Map<Vector>(&newline[0], newline.size()));
126 SEND_MSG(
"Finished reading " + toString(nbLines) +
" lines of " +
127 toString(size) +
" elements from file " + fileNameShort,
134 ")::output(dynamicgraph::Vector)::" + signalName);
142 typedef std::map<std::string, OutputSignalType*>::iterator it_type;
145 const string& signalName = it->first;
150 if (dataPointer != dataSet.end()) ++dataPointer;
152 if (dataPointer == dataSet.end())
153 SEND_WARNING_STREAM_MSG(
"Reached end of dataset for signal " +
156 signal->setConstant(*dataPointer);
161 typedef std::map<std::string, DataPointerType>::iterator it_type;
163 const string& signalName = it->first;
166 dataPointer = dataSet.begin();
184 os <<
"TracePlayer " << getName();
186 getProfiler().report_all(3, os);
187 }
catch (ExceptionSignal e) {
Entity to play data saved using a Tracer.
TracePlayer(const std::string &name)
std::list< DataType > DataHistoryType
std::map< std::string, DataPointerType > m_dataPointers
virtual void display(std::ostream &os) const
dynamicgraph::Signal< dynamicgraph::Vector, int > OutputSignalType
void addOutputSignal(const std::string &fileName, const std::string &signalName)
std::map< std::string, DataHistoryType > m_data
DataHistoryType::const_iterator DataPointerType
std::map< std::string, OutputSignalType * > m_outputSignals
DEFINE_SIGNAL_OUT_FUNCTION(u, dynamicgraph::Vector)
AdmittanceController EntityClassName
DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(AdmittanceController, "AdmittanceController")