33 DataplayerUtilities* utilities =
nullptr;
34 std::vector<yarp::yarpDataplayer::RowInfo> rowInfoVec;
46 std::string moduleName = rf.
check(
"module_name",
Value(
"yarpdataplayer")).asString();
47 bool add_prefix = rf.
check(
"add_prefix",
Value(
false)).asBool();
48 verbose = rf.
check(
"verbose",
Value(
false)).asBool();
49 dataset = rf.
check(
"dataset",
Value(
"")).asString();
51 utilities =
new DataplayerUtilities(moduleName, add_prefix, verbose);
52 if (rf.
check(
"withExtraTimeCol"))
54 utilities->withExtraColumn =
true;
55 utilities->column = rf.
find(
"withExtraTimeCol").
asInt32();
58 utilities->dataplayerEngine->stepfromCmd =
false;
61 rpcPort.
open(
"/yarpdataplayer/rpc:i");
67 std::cout<<std::endl<<std::endl<<
LOGO_MESSAGE<<std::endl<<std::endl;
72 std::cout << std::endl << std::endl;
78 bool attach(
Port& source)
override
90 bool interruptModule()
override
112 double getPeriod()
override
118 bool updateModule()
override
124 bool load(
const std::string &filename)
override
126 utilities->resetMaxTimeStamp();
127 subDirCnt = utilities->getRecSubDirList(filename, rowInfoVec, 1);
130 yInfo() <<
"the size of subDirs is: " << subDirCnt;
133 utilities->totalSent = 0;
134 utilities->totalThreads = subDirCnt;
137 utilities->partDetails =
new yarp::yarpDataplayer::PartsData [subDirCnt];
141 for (
int x=0; x < subDirCnt; x++)
143 utilities->partDetails[x].name = rowInfoVec[x].name;
144 utilities->partDetails[x].infoFile = rowInfoVec[x].info;
145 utilities->partDetails[x].logFile = rowInfoVec[x].log;
146 utilities->partDetails[x].path = rowInfoVec[x].path;
148 utilities->setupDataFromParts(utilities->partDetails[x]);
150 utilities->partDetails[x].worker =
new yarp::yarpDataplayer::DataplayerWorker(x, subDirCnt);
151 utilities->partDetails[x].worker->setManager(utilities);
157 utilities->getMaxTimeStamp();
161 utilities->getMinTimeStamp();
166 for (
int x=0; x < subDirCnt; x++)
168 utilities->initialFrame.push_back(utilities->partDetails[x].currFrame);
170 double totalTime = 0.0;
171 double final = utilities->partDetails[x].timestamp[utilities->partDetails[x].timestamp.length()-1];
172 double initial = utilities->partDetails[x].timestamp[utilities->partDetails[x].currFrame];
177 yInfo() <<
"The part " << utilities->partDetails[x].name <<
" should last for: " << totalTime
178 <<
" with " << utilities->partDetails[x].maxFrame <<
" frames";
180 utilities->configurePorts(utilities->partDetails[x]);
183 utilities->dataplayerEngine->setNumPart(subDirCnt);
201 bool allPartsStatus = utilities->dataplayerEngine->getAllPartsStatus();
206 yInfo() <<
"asking the threads to stop...";
208 if (utilities->dataplayerEngine->isSuspended())
210 utilities->dataplayerEngine->
resume();
213 utilities->dataplayerEngine->stop();
216 yInfo() <<
"done stopping!";
218 for (
int i = 0; i < subDirCnt; i++) {
219 utilities->partDetails[i].currFrame = 1;
224 yInfo() <<
"done stopping the thread...";
226 utilities->dataplayerEngine->setAllPartsStatus(
false);
229 if ( utilities->dataplayerEngine->isSuspended() )
233 yInfo() <<
"asking the thread to resume";
236 for (
int i = 0; i < subDirCnt; i++) {
237 utilities->partDetails[i].worker->resetTime();
240 utilities->dataplayerEngine->
resume();
242 else if (!utilities->dataplayerEngine->isRunning())
246 yInfo() <<
"asking the thread to start";
247 yInfo() <<
"initializing the workers...";
250 for (
int i = 0; i < subDirCnt; i++) {
251 utilities->partDetails[i].worker->init();
256 yInfo() <<
"starting the master thread...";
258 utilities->dataplayerEngine->start();
267 yError() <<
"No dataset loaded";
274 bool pause()
override
280 yInfo() <<
"asking the threads to pause...";
282 utilities->dataplayerEngine->pause();
290 yError() <<
"No dataset loaded";
297 bool resume()
override
303 yInfo() <<
"asking the threads to resume...";
305 utilities->dataplayerEngine->
resume();
312 yError() <<
"No dataset loaded";
325 yInfo() <<
"asking the threads to stop...";
327 if (utilities->dataplayerEngine->isSuspended()){
328 utilities->dataplayerEngine->
resume();
331 utilities->dataplayerEngine->stop();
334 yInfo() <<
"done stopping!";
336 for (
int i = 0; i < subDirCnt; i++) {
337 utilities->partDetails[i].currFrame = 1;
342 yInfo() <<
"done stopping the thread...";
351 yError() <<
"No dataset loaded";
358 bool enable(
const std::string &part)
override
360 for (
int i=0; i < subDirCnt; i++)
362 std::string
partname = utilities->partDetails[i].name;
369 utilities->dataplayerEngine->setPart(i,
true);
379 bool disable(
const std::string &part)
override
381 for (
int i=0; i < subDirCnt; i++)
383 std::string
partname = utilities->partDetails[i].name;
390 utilities->dataplayerEngine->setPart(i,
false);
399 std::vector<std::string> getAllParts()
override
401 std::vector<std::string>
parts(subDirCnt,
"");
404 for (
int i=0; i < subDirCnt; i++)
406 std::string
partname = utilities->partDetails[i].name;
414 std::string getPortName(
const std::string &part)
override
416 std::string portname =
"";
419 for (
int i=0; i < subDirCnt; i++)
421 if (utilities->partDetails[i].name == part)
423 portname = utilities->partDetails[i].portName;
431 bool setPortName(
const std::string &part,
const std::string &new_name)
override
435 for (
int i=0; i < subDirCnt; i++)
437 std::string
partname = utilities->partDetails[i].name;
440 utilities->partDetails[i].portName = new_name;
441 utilities->configurePorts(utilities->partDetails[i]);
450 int getFrame(
const std::string &
partname)
override
454 for (
int i=0; i < subDirCnt; i++)
456 if (
strcmp (
partname.c_str(), utilities->partDetails[i].name.c_str()) == 0)
458 return utilities->partDetails[i].currFrame;
466 bool setFrame(
const int frameNum)
override
472 yInfo() <<
"setting initial frame to " << frameNum;
474 for (
int i=0; i < subDirCnt; i++)
476 utilities->dataplayerEngine->virtualTime = utilities->partDetails[i].timestamp[utilities->partDetails[i].currFrame];
477 utilities->partDetails[i].currFrame = frameNum;
479 utilities->dataplayerEngine->virtualTime = utilities->partDetails[0].timestamp[utilities->partDetails[0].currFrame];
487 bool setSpeed(
const double speed)
override
491 yInfo() <<
"Setting speed to" << speed;
493 utilities->speed = speed;
498 double getSpeed()
override
500 return utilities->speed;
508 utilities->stepThread();
515 bool repeat(
const bool val=
false)
override
519 yInfo() <<
"Setting repeat mode to" << val;
521 utilities->repeat = val;
526 bool setStrict(
const bool val=
false)
override
530 yInfo() <<
"Setting strict mode to" << val;
532 utilities->sendStrict = val;
537 bool forward(
const int steps=5)
override
543 yInfo() <<
"Going forward of" << steps <<
"steps";
545 utilities->dataplayerEngine->forward(steps);
552 bool backward(
const int steps=5)
override
558 yInfo() <<
"Going backward of" << steps <<
"steps";
560 utilities->dataplayerEngine->backward(steps);
567 double getProgress()
override
573 for (
int x=0; x < subDirCnt; x++)
575 if (utilities->dataplayerEngine->isPartActive[x])
577 prog += ((utilities->partDetails[x].currFrame * 100) / utilities->partDetails[x].maxFrame);
588 yError() <<
"Dataset not loaded";
594 std::string getStatus()
override
606 yInfo() <<
"asking the threads to stop...";
608 if (utilities->dataplayerEngine->isSuspended()){
609 utilities->dataplayerEngine->
resume();
612 utilities->dataplayerEngine->stop();
615 yInfo() <<
"done stopping!";
617 for (
int i = 0; i < subDirCnt; i++) {
618 utilities->partDetails[i].currFrame = 1;
623 yInfo() <<
"Module closing...";
624 yInfo() <<
"Cleaning up...";
626 for (
int x=0; x < subDirCnt; x++)
628 utilities->partDetails[x].worker->
release();
632 yInfo() <<
"Attempt to interrupt ports";
634 for (
int x=0; x < subDirCnt; x++)
636 utilities->interruptPorts(utilities->partDetails[x]);
640 yInfo() <<
"Attempt to close ports";
642 for (
int x=0; x < subDirCnt; x++)
644 utilities->closePorts(utilities->partDetails[x]);
654 yInfo() <<
"Done!...";
int main(int argc, char *argv[])