00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "taskDispatcher.h"
00027
00028 #include <Inventor/sensors/SoTimerSensor.h>
00029
00030 #ifdef ROS_DATABASE_MANAGER
00031 #include "DBPlanner/ros_database_manager.h"
00032 #endif
00033 #include "DBPlanner/sql_database_manager.h"
00034
00035 #include "graspitGUI.h"
00036 #include "graspit_db_model.h"
00037
00038 #include "graspPlanningTask.h"
00039 #include "preGraspCheckTask.h"
00040 #include "graspTransferCheckTask.h"
00041 #include "graspClusteringTask.h"
00042 #include "tableCheckTask.h"
00043 #include "compliantGraspCopyTask.h"
00044
00045 #include "debug.h"
00046
00047 TaskDispatcher::TaskDispatcher() : mDBMgr(NULL) , mCurrentTask(NULL), mStatus(READY)
00048 {
00049
00050 mSensor = new SoTimerSensor(sensorCB, this);
00051 mSensor->setInterval( SbTime( 3.0 ));
00052
00053
00054 mMaxTasks = -1;
00055 mCompletedTasks = 0;
00056 }
00057
00058 TaskDispatcher::~TaskDispatcher()
00059 {
00060 if (mCurrentTask) {
00061
00062 DBGA("Dispatcher: deleting current task on cleanup");
00063 delete mCurrentTask;
00064 }
00065 delete mDBMgr;
00066 delete mSensor;
00067 }
00068
00069 int TaskDispatcher::connect(std::string host, int port, std::string username,
00070 std::string password, std::string database)
00071 {
00072 delete mDBMgr;
00073
00074
00075 std::ostringstream port_str;
00076 port_str << port;
00077 #ifdef ROS_DATABASE_MANAGER
00078 mDBMgr = new db_planner::RosDatabaseManager(host, port_str.str(), username, password, database,
00079 NULL,NULL);
00080
00081 GeomGraspitDBModelAllocator* allocator = new GeomGraspitDBModelAllocator(mDBMgr);
00082 mDBMgr->SetModelAllocator(allocator);
00083 if (!mDBMgr->isConnected()) {
00084 DBGA("DBase operator: Connection failed");
00085 delete mDBMgr; mDBMgr = NULL;
00086 return -1;
00087 }
00088 return 0;
00089 #else
00090 DBGA("Task dispatcher only tested using the ROS database manager, which is not available");
00091 return -1;
00092 #endif
00093 }
00094
00103 void TaskDispatcher::startNewTask()
00104 {
00105
00106 assert(!mCurrentTask);
00107
00108
00109 if (mMaxTasks >= 0 && mCompletedTasks >= mMaxTasks) {
00110 mStatus = DONE;
00111 return;
00112 }
00113
00114 db_planner::TaskRecord rec;
00115 std::vector<std::string> empty;
00116 if (!mDBMgr->AcquireNextTask(&rec, empty)) {
00117 DBGA("Dispatcher: error reading next task");
00118 mStatus = ERROR;
00119 return;
00120 }
00121 DBGA("Task id: " << rec.taskId);
00122
00123 if (!rec.taskType.empty()) {
00124 DBGA("Dispatcher: no tasks to be executed");
00125 mStatus = NO_TASK;
00126 return;
00127 }
00128 mCurrentTask = mFactory.getTask(this, mDBMgr,rec);
00129 if (!mCurrentTask) {
00130 DBGA("Dispatcher: can not understand task type: " << rec.taskType);
00131 mStatus = ERROR;
00132 return;
00133 }
00134
00135
00136 mCurrentTask->start();
00137
00138 if (mCurrentTask->getStatus() == Task::RUNNING) {
00139
00140 mStatus = RUNNING;
00141 DBGA("Dispatcher: started task of type " << rec.taskType);
00142 } else if (mCurrentTask->getStatus() == Task::DONE) {
00143
00144 mStatus = READY;
00145 DBGA("Dispatcher: completed one-shot task of type " << rec.taskType);
00146 } else {
00147
00148 mStatus = READY;
00149 DBGA("Dispatcher: error starting task of type " << rec.taskType);
00150 return;
00151 }
00152 }
00153
00165 void TaskDispatcher::checkCurrentTask()
00166 {
00167 assert(mCurrentTask);
00168
00169 switch (mCurrentTask->getStatus()) {
00170 case Task::RUNNING:
00171 break;
00172 case Task::ERROR:
00173 mStatus = READY;
00174
00175 if (!mDBMgr->SetTaskStatus(mCurrentTask->getRecord().taskId, "ERROR")) {
00176 DBGA("Dispatcher: error marking completed task");
00177 mStatus = ERROR;
00178 }
00179 delete mCurrentTask; mCurrentTask = NULL;
00180 break;
00181 case Task::DONE:
00182 mStatus = READY;
00183 mCompletedTasks++;
00184
00185 if (!mDBMgr->SetTaskStatus(mCurrentTask->getRecord().taskId, "COMPLETED")) {
00186 DBGA("Dispatcher: error marking completed task");
00187 mStatus = ERROR;
00188 }
00189 delete mCurrentTask; mCurrentTask = NULL;
00190 break;
00191 }
00192 }
00193
00199 void TaskDispatcher::mainLoop()
00200 {
00201 if (mSensor->isScheduled()) {
00202 mSensor->unschedule();
00203 }
00204 while(1){
00205 if(mCurrentTask) {
00206 checkCurrentTask();
00207 }
00208 if (mStatus == READY) {
00209 startNewTask();
00210 }
00211 switch(mStatus) {
00212 case DONE:
00213 graspItGUI->exitMainLoop();
00214 return;
00215 case ERROR:
00216 graspItGUI->exitMainLoop();
00217 return;
00218 case NO_TASK:
00219 graspItGUI->exitMainLoop();
00220 return;
00221 case RUNNING:
00222 mSensor->schedule();
00223 return;
00224 case READY:
00225 break;
00226 }
00227 }
00228 }
00229
00230 void TaskDispatcher::sensorCB(void *data, SoSensor*)
00231 {
00232 TaskDispatcher *dispatch = static_cast<TaskDispatcher*>(data);
00233 dispatch->mainLoop();
00234 }
00235
00236 Task* TaskFactory::getTask(TaskDispatcher *op, db_planner::DatabaseManager *mgr,
00237 db_planner::TaskRecord rec)
00238 {
00239 if (rec.taskType == "EMPTY") return new EmptyTask(op, mgr, rec);
00240 else if (rec.taskType == "EMPTY_ONE_SHOT") return new EmptyOneShotTask(op, mgr, rec);
00241 else if (rec.taskType == "GRASP_PLANNING") return new GraspPlanningTask(op, mgr, rec);
00242 else if (rec.taskType == "PREGRASP_CHECK") return new PreGraspCheckTask(op, mgr, rec);
00243 else if (rec.taskType == "GRASP_CLUSTERING") return new GraspClusteringTask(op, mgr, rec);
00244 else if (rec.taskType == "GRASP_TRANSFER") return new GraspTransferCheckTask(op, mgr, rec);
00245 else if (rec.taskType == "TABLE_CHECK") return new TableCheckTask(op, mgr, rec);
00246 else if (rec.taskType == "COMPLIANT_COPY")return new CompliantGraspCopyTask(op, mgr, rec);
00247 else return NULL;
00248 }
00249
00250 void EmptyTask::start()
00251 {
00252 mSensor = new SoTimerSensor(sensorCB, this);
00253 mSensor->setInterval( SbTime( 4.0 ));
00254 mSensor->schedule();
00255 mStatus = RUNNING;
00256 DBGA("Empty task has started");
00257 }
00258
00259 void EmptyTask::finish()
00260 {
00261 DBGA("Empty task has finished");
00262 mStatus = DONE;
00263 }
00264
00265 EmptyTask::~EmptyTask()
00266 {
00267 DBGA("Empty task deleted");
00268 delete mSensor;
00269 }
00270
00271 void EmptyTask::sensorCB(void *data, SoSensor*)
00272 {
00273 EmptyTask *task = static_cast<EmptyTask*>(data);
00274 task->finish();
00275 }
00276
00277 EmptyOneShotTask::~EmptyOneShotTask()
00278 {
00279 DBGA("Empty one-shot task deleted");
00280 }
00281