Exemplo n.º 1
0
void
SSLGamePlanner::run ()
{
  init ();
  //  runPlan (curr_plan_index_);
  //ros::Rate r(1000/ssl::config::TIME_STEP);
  while (nh_.ok ())
  {
    //if global_state is updated and path_planner is connected
    // then make a plan
    if (update ())
    {
      evaluate ();
      std::cout << "**" << std::endl;
      std::cout << "allowed_near_ball? " << ssl_game_state.allowedNearBall () << std::endl;
      std::cout << "can move?          " << ssl_game_state.canMove () << std::endl;
      std::cout << "can kick ball?     " << ssl_game_state.canKickBall () << std::endl;
      std::cout << "--" << std::endl;
      runPlan (curr_plan_index_);
      if (isPlanChanged () || isPoseControlUpdated ())
      {
        send ();
        prev_plan_index_ = curr_plan_index_;
      }
    }

    ros::spinOnce ();
    //r.sleep();
  }
}
Exemplo n.º 2
0
/** \brief The main function for the worker threads, which determines what they run and what inputs they receive.
   \param p Pointer to the ThreadHandle struct that holds the information for the worker thread
 */
void *WorkerThread(void *p){
    long cpucoreid, numcpucores;
    int init_flag, run_flag, perf_flag;
    int one = 1;
    data sleep_pass[1];
    sleep_pass->i = &one;
    ThreadHandle *MyHandle = (ThreadHandle *)p;
    Plan *WorkerPlan, *BossPlan;
    #ifdef LINUX_PLACEMENT
    int affin_flag;
    cpucoreid = sched_getcpu();
    //syscall(__NR_getcpu(&cpucoreid, NULL, NULL));
    numcpucores = sysconf(_SC_NPROCESSORS_ONLN);
    EmitLog(MyRank, MyHandle->Num, "Starting on processor core", cpucoreid, PRINT_SOME);
    #else
    cpucoreid = -1;
    numcpucores = -1;
    EmitLog(MyRank, MyHandle->Num, "Starting...", -1, PRINT_SOME);
    #endif
    WorkerPlan = NULL;
    for(;; ){
        pthread_rwlock_rdlock( &(MyHandle->Lock) );
        BossPlan = MyHandle->Plan;
        pthread_rwlock_unlock( &(MyHandle->Lock) );
        if(BossPlan == NULL){
            if(DO_PERF){
                EmitLog(MyRank, MyHandle->Num, "Printing performance data.", -1, PRINT_SOME);
                perf_flag = perfPlan(WorkerPlan);
                if(perf_flag != ERR_CLEAN){
                    EmitLog(MyRank, MyHandle->Num, "Performance recording error flag triggered, error number:", perf_flag, PRINT_SOME);
                }
            }             //DO_PERF
            EmitLog(MyRank, MyHandle->Num, "Thread exiting", -1, PRINT_SOME);
            WorkerPlan = killPlan(WorkerPlan);                          /* clean up old plan       */
            pthread_exit((void *)0);
        } else {
            if(BossPlan != WorkerPlan){                                 /* if the plan was updated */
                if((WorkerPlan != NULL) && (WorkerPlan->name != SLEEP) ){
                    if(DO_PERF){
                        EmitLog(MyRank, MyHandle->Num, "Printing performance data.", -1, PRINT_SOME);
                        perf_flag = perfPlan(WorkerPlan);
                        if(perf_flag != ERR_CLEAN){
                            EmitLog(MyRank, MyHandle->Num, "Performance recording error flag triggered, error number:", perf_flag, PRINT_SOME);
                        }
                    }                     //DO_PERF
                }
                #ifdef LINUX_PLACEMENT
                numcpucores = sysconf(_SC_NPROCESSORS_ONLN);
                cpucoreid = sched_getcpu();
                //syscall(__NR_getcpu(&cpucoreid, NULL, NULL));

                cpu_set_t cpuset;
                affin_flag = pthread_getaffinity_np(MyHandle->ID, sizeof(cpu_set_t), &cpuset);
                if(affin_flag != 0){
                    add_error(MyHandle,SYSTEM,2);
                }

                EmitLog(MyRank, MyHandle->Num, "New plan detected. Switching plans on core", cpucoreid, PRINT_SOME);
                if(PRINT_RARELY <= verbose_flag){
                    int i;
                    EmitLog(MyRank, MyHandle->Num, "CPU set for this thread:", -1, PRINT_SOME);
                    printf("\t\t\t\t");
                    for(i = 0; i < numcpucores; i++){
                        if(CPU_ISSET(i, &cpuset)){
                            printf(" %d", i);
                        }
                    }
                    printf("\n");
                }
                #else /* ifdef LINUX_PLACEMENT */
                EmitLog(MyRank, MyHandle->Num, "New plan detected. Switching plans.", -1, PRINT_SOME);
                #endif /* ifdef LINUX_PLACEMENT */
                WorkerPlan = killPlan(WorkerPlan);                              /*     clean up old plan   */
                WorkerPlan = BossPlan;                                          /*     switch plans        */

                init_flag = InitPlan(WorkerPlan);                               /*     initialize new plan */
                if(init_flag != ERR_CLEAN){
                    add_error(MyHandle, WorkerPlan->name,init_flag);
                    EmitLog(MyRank, MyHandle->Num, "Initialization error flag triggered, error number:", init_flag, PRINT_ALWAYS);
                    MyHandle->Plan = (plan_list[SLEEP]->make)(sleep_pass);
                    continue;
                }
            }
            run_flag = runPlan(WorkerPlan);
            if(run_flag != ERR_CLEAN){
                add_error(MyHandle, WorkerPlan->name,run_flag);
                //MyHandle->Plan = (plan_list[SLEEP]->make)(sleep_pass);
                EmitLog(MyRank, MyHandle->Num, "Runtime error flag triggered, error number:", run_flag, PRINT_ALWAYS);
            }
        }
    }
    return((void *)0);     /* not reached */
} /* WorkerThread */