00001 #include "tibi_dabo_hri_alg_node.h"
00002
00003 TibiDaboHriAlgNode::TibiDaboHriAlgNode(void) :
00004 seqs_aserver_(public_node_handle_, "hri")
00005 {
00006
00007 this->loop_rate_ = 40;
00008
00009
00010 facial_expression_publisher_ = public_node_handle_.advertise<std_msgs::String>("facial_expression", 100);
00011
00012
00013
00014
00015
00016
00017
00018
00019 seqs_aserver_.registerStartCallback(boost::bind(&TibiDaboHriAlgNode::startCallback, this, _1));
00020 seqs_aserver_.registerStopCallback(boost::bind(&TibiDaboHriAlgNode::stopCallback, this));
00021 seqs_aserver_.registerIsFinishedCallback(boost::bind(&TibiDaboHriAlgNode::isFinishedCallback, this));
00022 seqs_aserver_.registerHasSucceedCallback(boost::bind(&TibiDaboHriAlgNode::hasSucceedCallback, this));
00023 seqs_aserver_.registerGetResultCallback(boost::bind(&TibiDaboHriAlgNode::getResultCallback, this, _1));
00024 seqs_aserver_.registerGetFeedbackCallback(boost::bind(&TibiDaboHriAlgNode::getFeedbackCallback, this, _1));
00025
00026
00027 this->tts_.client=new TtsClient("tts", true),
00028 this->tts_.active=false;
00029 this->tts_.succeeded=false;
00030 this->tts_.loaded=false;
00031 this->tts_.percentage=0.0;
00032 this->leds_.client=new SeqClient("leds",true);
00033 this->leds_.active=false;
00034 this->leds_.succeeded=false;
00035 this->leds_.loaded=false;
00036 this->leds_.percentage=0.0;
00037 this->head_.client=new SeqClient("head",true);
00038 this->head_.active=false;
00039 this->head_.succeeded=false;
00040 this->head_.loaded=false;
00041 this->head_.percentage=0.0;
00042 this->left_arm_.client=new SeqClient("left_arm",true);
00043 this->left_arm_.active=false;
00044 this->left_arm_.succeeded=false;
00045 this->left_arm_.loaded=false;
00046 this->left_arm_.percentage=0.0;
00047 this->right_arm_.client=new SeqClient("right_arm",true);
00048 this->right_arm_.active=false;
00049 this->right_arm_.succeeded=false;
00050 this->right_arm_.loaded=false;
00051 this->right_arm_.percentage=0.0;
00052
00053 srand(ros::Time::now().toSec());
00054
00055 empty_leds_sequence_ = true;
00056 tts_connected_ = false;
00057 leds_connected_ = false;
00058 head_connected_ = false;
00059 left_arm_connected_ = false;
00060 right_arm_connected_ = false;
00061 }
00062
00063 TibiDaboHriAlgNode::~TibiDaboHriAlgNode(void)
00064 {
00065 alg_.lock();
00066
00067 if(this->seqs_aserver_.isActive())
00068 {
00069 this->cancelCurrentGoals();
00070 this->seqs_aserver_.setAborted();
00071 }
00072 delete this->tts_.client;
00073 delete this->leds_.client;
00074 delete this->head_.client;
00075 delete this->left_arm_.client;
00076 delete this->right_arm_.client;
00077
00078 alg_.unlock();
00079 }
00080
00081 void TibiDaboHriAlgNode::cancelCurrentGoals(void)
00082 {
00083 ROS_INFO("TibiDaboHriAlgNode::cancelCurrentGoals!");
00084 if(this->tts_.client->isServerConnected() && this->tts_.loaded && this->tts_.active )
00085 {
00086 this->tts_.active=false;
00087 this->tts_.loaded=false;
00088 this->tts_.client->cancelGoal();
00089 }
00090 if(this->leds_.client->isServerConnected() && this->leds_.loaded && this->leds_.active )
00091 {
00092 this->leds_.active=false;
00093 this->leds_.loaded=false;
00094 this->leds_.client->cancelGoal();
00095 }
00096 if(this->head_.client->isServerConnected() && this->head_.loaded && this->head_.active )
00097 {
00098 this->head_.active=false;
00099 this->head_.loaded=false;
00100 this->head_.client->cancelGoal();
00101 }
00102 if(this->left_arm_.client->isServerConnected() && this->left_arm_.loaded && this->left_arm_.active )
00103 {
00104 this->left_arm_.active=false;
00105 this->left_arm_.loaded=false;
00106 this->left_arm_.client->cancelGoal();
00107 }
00108 if(this->right_arm_.client->isServerConnected() && this->right_arm_.loaded && this->right_arm_.active )
00109 {
00110 this->right_arm_.active=false;
00111 this->right_arm_.loaded=false;
00112 this->right_arm_.client->cancelGoal();
00113 }
00114 }
00115
00116 void TibiDaboHriAlgNode::speak(void)
00117 {
00118 static int count = 0;
00119 std_msgs::String msg;
00120
00121 if(count==0)
00122 {
00123 count=rand() % 200 + 200;
00124 msg.data = "speak";
00125 facial_expression_publisher_.publish(msg);
00126 }
00127 else
00128 {
00129 count-=10;
00130 if(count<0) count=0;
00131 }
00132 }
00133
00134 void TibiDaboHriAlgNode::mainNodeThread(void)
00135 {
00136 alg_.lock();
00137
00138
00139
00140
00141 if(!this->tts_.client->isServerConnected())
00142 tts_connected_ = false;
00143 else
00144 tts_connected_ = true;
00145
00146 if(!this->leds_.client->isServerConnected())
00147 leds_connected_ = false;
00148 else
00149 leds_connected_ = true;
00150
00151 if(!this->head_.client->isServerConnected())
00152 head_connected_ = false;
00153 else
00154 head_connected_ = true;
00155
00156 if(!this->left_arm_.client->isServerConnected())
00157 left_arm_connected_ = false;
00158 else
00159 left_arm_connected_ = true;
00160
00161 if(!this->right_arm_.client->isServerConnected())
00162 right_arm_connected_ = false;
00163 else
00164 right_arm_connected_ = true;
00165
00166
00167 if( tts_connected_ || leds_connected_ || head_connected_ || left_arm_connected_ || right_arm_connected_)
00168 {
00169
00170 if( !this->seqs_aserver_.isStarted() )
00171 {
00172 this->seqs_aserver_.start();
00173 ROS_INFO("TibiDaboHriAlgNode:: Server Started!");
00174 }
00175 }
00176 else
00177 {
00178
00179 if( this->seqs_aserver_.isActive() )
00180 {
00181
00182 this->cancelCurrentGoals();
00183
00184
00185 this->seqs_aserver_.setAborted();
00186 }
00187
00188
00189 if( this->seqs_aserver_.isStarted() )
00190 {
00191
00192 this->seqs_aserver_.shutdown();
00193 ROS_INFO("TibiDaboHriAlgNode:: Server Stop!");
00194 }
00195 }
00196
00197 alg_.unlock();
00198
00199
00200
00201
00202
00203
00204
00205
00206 alg_.lock();
00207 if( this->tts_.active && empty_leds_sequence_ )
00208 {
00209
00210 this->speak();
00211 }
00212 alg_.unlock();
00213 }
00214
00215
00216
00217
00218
00219
00220
00222
00224 void TibiDaboHriAlgNode::startCallback(const tibi_dabo_msgs::sequenceGoalConstPtr& goal)
00225 {
00226 ROS_INFO("TibiDaboHriAlgNode::startCallback:");
00227
00228 alg_.lock();
00229
00230 std::string goal_str("goal : {");
00231 for(unsigned int ii=0; ii<goal->sequence_file.size(); ii++)
00232 {
00233 goal_str += goal->sequence_file[ii] + ", ";
00234 }
00235 ROS_INFO("TibiDaboHriAlgNode::%s}", goal_str.c_str());
00236
00237 if(goal->sequence_file.size() != NUM_CLIENTS)
00238 {
00239 std::stringstream ss;
00240 ss << "WRONG input Goal format. #items is " << goal->sequence_file.size() << " instead of " << NUM_CLIENTS;
00241 ROS_WARN("TibiDaboHriAlgNode::startCallback: %s", ss.str().c_str());
00242 tibi_dabo_msgs::sequenceResult res;
00243
00244
00245 seqs_aserver_.setAborted(res, ss.str());
00246 }
00247 else
00248 {
00249 iri_common_drivers_msgs::ttsGoal tts_goal;
00250 tibi_dabo_msgs::sequenceGoal leds_goal;
00251 tibi_dabo_msgs::sequenceGoal head_goal;
00252 tibi_dabo_msgs::sequenceGoal left_arm_goal;
00253 tibi_dabo_msgs::sequenceGoal right_arm_goal;
00254
00255 ROS_INFO("TibiDaboHriAlgNode::startCallback: load sequences}");
00256
00257 tts_goal.msg = goal->sequence_file[TTS_];
00258 leds_goal.sequence_file.push_back( goal->sequence_file[LEDS_] );
00259 head_goal.sequence_file.push_back( goal->sequence_file[HEAD_] );
00260 left_arm_goal.sequence_file.push_back( goal->sequence_file[LEFT_ARM_] );
00261 right_arm_goal.sequence_file.push_back( goal->sequence_file[RIGHT_ARM_] );
00262
00263 ROS_INFO("TibiDaboHriAlgNode::startCallback: make requests}");
00264
00265
00266 if(tts_goal.msg.size() != 0 && tts_connected_)
00267 {
00268 ttsMakeActionRequest(tts_goal);
00269 this->tts_.loaded=true;
00270 }
00271
00272 if(leds_goal.sequence_file[0].size() != 0 && leds_connected_)
00273 {
00274 ledsMakeActionRequest(leds_goal);
00275 empty_leds_sequence_ = false;
00276 this->leds_.loaded=true;
00277 }
00278 else
00279 {
00280 empty_leds_sequence_ = true;
00281 }
00282
00283 if(head_goal.sequence_file[0].size() != 0 && head_connected_)
00284 {
00285 this->head_.loaded=true;
00286 headMakeActionRequest(head_goal);
00287 }
00288
00289 if(left_arm_goal.sequence_file[0].size() != 0 && left_arm_connected_ )
00290 {
00291 this->left_arm_.loaded=true;
00292 leftArmMakeActionRequest(left_arm_goal);
00293 }
00294
00295 if(right_arm_goal.sequence_file[0].size() != 0 && right_arm_connected_ )
00296 {
00297 this->right_arm_.loaded=true;
00298 rightArmMakeActionRequest(right_arm_goal);
00299 }
00300 }
00301
00302 alg_.unlock();
00303 }
00304
00305 void TibiDaboHriAlgNode::stopCallback(void)
00306 {
00307 ROS_INFO("TibiDaboHriAlgNode::stopCallback");
00308 alg_.lock();
00309 this->cancelCurrentGoals();
00310 alg_.unlock();
00311 }
00312
00313 bool TibiDaboHriAlgNode::isFinishedCallback(void)
00314 {
00315 ROS_INFO("TibiDaboHriAlgNode::isFinishedCallback");
00316
00317 bool finish = true;
00318
00319 alg_.lock();
00320
00321 if(this->tts_.loaded && this->tts_.active )
00322 finish=false;
00323 if(this->leds_.loaded && this->leds_.active )
00324 finish=false;
00325 if(this->head_.loaded && this->head_.active )
00326 finish=false;
00327 if(this->left_arm_.loaded && this->left_arm_.active )
00328 finish=false;
00329 if(this->right_arm_.loaded && this->right_arm_.active )
00330 finish=false;
00331
00332 alg_.unlock();
00333
00334
00335
00336
00337
00338
00339 return finish;
00340 }
00341
00342 bool TibiDaboHriAlgNode::hasSucceedCallback(void)
00343 {
00344 ROS_INFO("TibiDaboHriAlgNode::hasSucceedCallback");
00345
00346 bool succeed = true;
00347
00348 alg_.lock();
00349
00350 if(this->tts_.loaded && !this->tts_.succeeded )
00351 {
00352 succeed=false;
00353 this->tts_.loaded=false;
00354 }
00355 if(this->leds_.loaded && !this->leds_.succeeded )
00356 {
00357 succeed=false;
00358 this->leds_.loaded=false;
00359 }
00360 if(this->head_.loaded && !this->head_.succeeded )
00361 {
00362 succeed=false;
00363 this->head_.loaded=false;
00364 }
00365 if(this->left_arm_.loaded && !this->left_arm_.succeeded )
00366 {
00367 succeed=false;
00368 this->left_arm_.loaded=false;
00369 }
00370 if(this->right_arm_.loaded && !this->right_arm_.succeeded )
00371 {
00372 succeed=false;
00373 this->right_arm_.loaded=false;
00374 }
00375
00376 alg_.unlock();
00377
00378 return succeed;
00379 }
00380
00381 void TibiDaboHriAlgNode::getResultCallback(tibi_dabo_msgs::sequenceResultPtr& result)
00382 {
00383
00384 alg_.lock();
00385
00386 result->successful.push_back(this->tts_.succeeded);
00387 result->successful.push_back(this->leds_.succeeded);
00388 result->successful.push_back(this->head_.succeeded);
00389 result->successful.push_back(this->left_arm_.succeeded);
00390 result->successful.push_back(this->right_arm_.succeeded);
00391
00392
00393 alg_.unlock();
00394 }
00395
00396 void TibiDaboHriAlgNode::getFeedbackCallback(tibi_dabo_msgs::sequenceFeedbackPtr& feedback)
00397 {
00398
00399 alg_.lock();
00400
00401 feedback->percentage.push_back(this->tts_.percentage);
00402 feedback->percentage.push_back(this->leds_.percentage);
00403 feedback->percentage.push_back(this->head_.percentage);
00404 feedback->percentage.push_back(this->left_arm_.percentage);
00405 feedback->percentage.push_back(this->right_arm_.percentage);
00406
00407
00408 alg_.unlock();
00409 }
00410
00412
00414 void TibiDaboHriAlgNode::ttsDone(const actionlib::SimpleClientGoalState& state,
00415 const iri_common_drivers_msgs::ttsResultConstPtr& result)
00416 {
00417 std_msgs::String expression;
00418
00419 alg_.lock();
00420
00421 ROS_INFO("TibiDaboHriAlgNode::ttsDone: Goal Achieved!");
00422 ROS_INFO("TibiDaboHriAlgNode::ttsDone: state=%s", state.toString().c_str());
00423
00424 if( state.state_ == actionlib::SimpleClientGoalState::SUCCEEDED )
00425 this->tts_.succeeded=true;
00426 else
00427 this->tts_.succeeded=false;
00428
00429 this->tts_.active=false;
00430 if(this->empty_leds_sequence_)
00431 {
00432 expression.data="stand_by";
00433 this->facial_expression_publisher_.publish(expression);
00434 }
00435
00436 alg_.unlock();
00437 }
00438
00439 void TibiDaboHriAlgNode::ttsActive(void)
00440 {
00441 ROS_INFO("TibiDaboHriAlgNode::ttsActive: Goal just went active!");
00442 }
00443
00444 void TibiDaboHriAlgNode::ttsFeedback(const iri_common_drivers_msgs::ttsFeedbackConstPtr& feedback)
00445 {
00446 ROS_INFO("TibiDaboHriAlgNode::ttsFeedback: Got Feedback!");
00447 alg_.lock();
00448 if(feedback->busy)
00449 this->tts_.percentage=0.0;
00450 else
00451 this->tts_.percentage=100.0;
00452 alg_.unlock();
00453 ROS_INFO("TibiDaboHriAlgNode::ttsFeedback: busy=%d", feedback->busy);
00454 }
00455
00457
00459 void TibiDaboHriAlgNode::ledsDone(const actionlib::SimpleClientGoalState& state,
00460 const tibi_dabo_msgs::sequenceResultConstPtr& result)
00461 {
00462 alg_.lock();
00463
00464 ROS_INFO("TibiDaboHriAlgNode::ledsDone: state=%s", state.toString().c_str());
00465
00466 if( state.state_ == actionlib::SimpleClientGoalState::SUCCEEDED )
00467 this->leds_.succeeded=true;
00468 else
00469 this->leds_.succeeded=false;
00470
00471 this->leds_.active=false;
00472 alg_.unlock();
00473 }
00474
00475 void TibiDaboHriAlgNode::ledsActive(void)
00476 {
00477 ROS_INFO("TibiDaboHriAlgNode::ledsActive: Goal just went active!");
00478 }
00479
00480 void TibiDaboHriAlgNode::ledsFeedback(const tibi_dabo_msgs::sequenceFeedbackConstPtr& feedback)
00481 {
00482 ROS_DEBUG("TibiDaboHriAlgNode::ledsFeedback: percentage=%f", feedback->percentage[0]);
00483 alg_.lock();
00484 this->leds_.percentage=feedback->percentage[0];
00485 alg_.unlock();
00486 }
00487
00489
00491
00492 void TibiDaboHriAlgNode::headDone(const actionlib::SimpleClientGoalState& state,
00493 const tibi_dabo_msgs::sequenceResultConstPtr& result)
00494 {
00495 alg_.lock();
00496
00497 ROS_INFO("TibiDaboHriAlgNode::headDone: state=%s", state.toString().c_str());
00498
00499 if( state.state_ == actionlib::SimpleClientGoalState::SUCCEEDED )
00500 this->head_.succeeded=true;
00501 else
00502 this->head_.succeeded=false;
00503
00504 this->head_.active=false;
00505 alg_.unlock();
00506 }
00507
00508 void TibiDaboHriAlgNode::headActive(void)
00509 {
00510 ROS_INFO("TibiDaboHriAlgNode::headActive: Goal just went active!");
00511 }
00512
00513 void TibiDaboHriAlgNode::headFeedback(const tibi_dabo_msgs::sequenceFeedbackConstPtr& feedback)
00514 {
00515 ROS_DEBUG("TibiDaboHriAlgNode::headFeedback: percentage=%f", feedback->percentage[0]);
00516 alg_.lock();
00517 this->head_.percentage=feedback->percentage[0];
00518 alg_.unlock();
00519 }
00520
00522
00524 void TibiDaboHriAlgNode::leftArmDone(const actionlib::SimpleClientGoalState& state,
00525 const tibi_dabo_msgs::sequenceResultConstPtr& result)
00526 {
00527 alg_.lock();
00528
00529 ROS_INFO("TibiDaboHriAlgNode::leftArmDone: state=%s", state.toString().c_str());
00530
00531 if( state.state_ == actionlib::SimpleClientGoalState::SUCCEEDED )
00532 this->left_arm_.succeeded=true;
00533 else
00534 this->left_arm_.succeeded=false;
00535
00536 this->left_arm_.active=false;
00537 alg_.unlock();
00538 }
00539
00540 void TibiDaboHriAlgNode::leftArmActive(void)
00541 {
00542 ROS_INFO("TibiDaboHriAlgNode::leftArmActive: Goal just went active!");
00543 }
00544
00545 void TibiDaboHriAlgNode::leftArmFeedback(const tibi_dabo_msgs::sequenceFeedbackConstPtr& feedback)
00546 {
00547 alg_.lock();
00548 ROS_DEBUG("TibiDaboHriAlgNode::leftArmFeedback: percentage=%f", feedback->percentage[0]);
00549 this->left_arm_.percentage=feedback->percentage[0];
00550 alg_.unlock();
00551 }
00552
00554
00556 void TibiDaboHriAlgNode::rightArmDone(const actionlib::SimpleClientGoalState& state,
00557 const tibi_dabo_msgs::sequenceResultConstPtr& result)
00558 {
00559 alg_.lock();
00560
00561 ROS_INFO("TibiDaboHriAlgNode::rightArmDone: state=%s", state.toString().c_str());
00562
00563 if( state.state_ == actionlib::SimpleClientGoalState::SUCCEEDED )
00564 this->right_arm_.succeeded=true;
00565 else
00566 this->right_arm_.succeeded=false;
00567
00568 this->right_arm_.active=false;
00569 alg_.unlock();
00570 }
00571
00572 void TibiDaboHriAlgNode::rightArmActive(void)
00573 {
00574 ROS_INFO("TibiDaboHriAlgNode::rightArmActive: Goal just went active!");
00575 }
00576
00577 void TibiDaboHriAlgNode::rightArmFeedback(const tibi_dabo_msgs::sequenceFeedbackConstPtr& feedback)
00578 {
00579 alg_.lock();
00580 ROS_DEBUG("TibiDaboHriAlgNode::rightArmFeedback: percentage=%f", feedback->percentage[0]);
00581 this->right_arm_.percentage=feedback->percentage[0];
00582 alg_.unlock();
00583 }
00584
00585
00586 void TibiDaboHriAlgNode::ttsMakeActionRequest(const iri_common_drivers_msgs::ttsGoal & tts_goal)
00587 {
00588 ROS_INFO("TibiDaboHriAlgNode::ttsMakeActionRequest: Starting New Request!");
00589
00590
00591
00592 this->tts_.client->waitForServer();
00593 ROS_DEBUG("TibiDaboHriAlgNode::ttsMakeActionRequest: TTS Server is Available!");
00594
00595
00596 tts_.client->sendGoal(tts_goal,
00597 boost::bind(&TibiDaboHriAlgNode::ttsDone, this, _1, _2),
00598 boost::bind(&TibiDaboHriAlgNode::ttsActive, this),
00599 boost::bind(&TibiDaboHriAlgNode::ttsFeedback, this, _1));
00600
00601 this->tts_.active=true;
00602 }
00603
00604 void TibiDaboHriAlgNode::ledsMakeActionRequest(const tibi_dabo_msgs::sequenceGoal & leds_goal)
00605 {
00606 ROS_INFO("TibiDaboHriAlgNode::ledsMakeActionRequest: Starting New Request!");
00607 this->leds_.client->waitForServer();
00608 ROS_DEBUG("TibiDaboHriAlgNode::ledsMakeActionRequest: Leds Server is Available!");
00609
00610
00611 this->leds_.client->sendGoal(leds_goal,
00612 boost::bind(&TibiDaboHriAlgNode::ledsDone, this, _1, _2),
00613 boost::bind(&TibiDaboHriAlgNode::ledsActive, this),
00614 boost::bind(&TibiDaboHriAlgNode::ledsFeedback, this, _1));
00615
00616 this->leds_.active=true;
00617 }
00618
00619 void TibiDaboHriAlgNode::headMakeActionRequest(const tibi_dabo_msgs::sequenceGoal & head_goal)
00620 {
00621 ROS_INFO("TibiDaboHriAlgNode::headMakeActionRequest: Starting New Request!");
00622 this->head_.client->waitForServer();
00623 ROS_DEBUG("TibiDaboHriAlgNode::headMakeActionRequest: Head Server is Available!");
00624
00625
00626 this->head_.client->sendGoal(head_goal,
00627 boost::bind(&TibiDaboHriAlgNode::headDone, this, _1, _2),
00628 boost::bind(&TibiDaboHriAlgNode::headActive, this),
00629 boost::bind(&TibiDaboHriAlgNode::headFeedback, this, _1));
00630
00631 this->head_.active=true;
00632 }
00633
00634 void TibiDaboHriAlgNode::leftArmMakeActionRequest(const tibi_dabo_msgs::sequenceGoal & left_arm_goal)
00635 {
00636 ROS_INFO("TibiDaboHriAlgNode::leftArmMakeActionRequest: Starting New Request!");
00637 this->left_arm_.client->waitForServer();
00638 ROS_DEBUG("TibiDaboHriAlgNode::headMakeActionRequest: Head Server is Available!");
00639
00640
00641
00642 this->left_arm_.client->sendGoal(left_arm_goal,
00643 boost::bind(&TibiDaboHriAlgNode::leftArmDone, this, _1, _2),
00644 boost::bind(&TibiDaboHriAlgNode::leftArmActive, this),
00645 boost::bind(&TibiDaboHriAlgNode::leftArmFeedback, this, _1));
00646 this->left_arm_.active=true;
00647 }
00648
00649 void TibiDaboHriAlgNode::rightArmMakeActionRequest(const tibi_dabo_msgs::sequenceGoal & right_arm_goal)
00650 {
00651 ROS_INFO("TibiDaboHriAlgNode::leftArmMakeActionRequest: Starting New Request!");
00652 this->right_arm_.client->waitForServer();
00653 ROS_DEBUG("TibiDaboHriAlgNode::headMakeActionRequest: Head Server is Available!");
00654
00655
00656 this->right_arm_.client->sendGoal(right_arm_goal,
00657 boost::bind(&TibiDaboHriAlgNode::rightArmDone, this, _1, _2),
00658 boost::bind(&TibiDaboHriAlgNode::rightArmActive, this),
00659 boost::bind(&TibiDaboHriAlgNode::rightArmFeedback, this, _1));
00660 this->right_arm_.active=true;
00661 }
00662
00663 void TibiDaboHriAlgNode::node_config_update(Config &config, uint32_t level)
00664 {
00665 }
00666
00667 void TibiDaboHriAlgNode::addNodeDiagnostics(void)
00668 {
00669 }
00670
00671
00672 int main(int argc,char *argv[])
00673 {
00674 return algorithm_base::main<TibiDaboHriAlgNode>(argc, argv, "tibi_dabo_hri_alg_node");
00675 }