void update_rwalk_nodes (double cur_time) { int done = 0; job_list *tmp = job_vector[RWALK]; node_struct *my_node; while (tmp != NULL && done == 0) { //case1:time to next event equals to current time if (tmp->pair != NULL && ((double) tmp->pair->next_event_t >= cur_time - omg_eps) && ((double) tmp->pair->next_event_t <= cur_time + omg_eps)) { my_node = tmp->pair->b; if (my_node->mobile == 1) sleep_rwalk_node (tmp->pair, cur_time); else move_rwalk_node (tmp->pair, cur_time); } //case2: current time is greater than the time to next event else if (tmp->pair != NULL && (cur_time - omg_eps) > tmp->pair->next_event_t) { my_node = tmp->pair->b; while (cur_time >= tmp->pair->next_event_t) { if (my_node->mobile == 1) sleep_rwalk_node (tmp->pair, cur_time); else move_rwalk_node (tmp->pair, cur_time); } } //case3: current time less than the time to next event else { done = 1; //quit the loop } tmp = tmp->next; } //sorting the new entries // LOG_D (OMG, "--------DISPLAY JOB LIST--------\n"); //LOG_T //display_job_list (Job_Vector); job_vector[RWALK] = quick_sort (job_vector[RWALK]); /////////// // LOG_D (OMG, "--------DISPLAY JOB LIST AFTER SORTING--------\n"); //display_job_list (job_vector[RWALK]); }
int start_rwalk_generator(omg_global_param omg_param_list) { int n_id=0; //omg_omg_param_list.seed= time(NULL); srand(omg_param_list.seed + RWALK); double cur_time = 0.0; NodePtr node = NULL; MobilityPtr mobility = NULL; if (omg_param_list.nodes <= 0){ LOG_W(OMG, "Number of nodes has not been set\n"); return(-1); } if (omg_param_list.nodes_type == eNB) { LOG_I(OMG, "Node type has been set to eNB\n"); } else if (omg_param_list.nodes_type == UE) { LOG_I(OMG, "Node type has been set to UE\n"); } LOG_I(OMG, "Number of random walk nodes has been set to %d\n", omg_param_list.nodes); for (n_id = 0; n_id< omg_param_list.nodes; n_id++) { node = (NodePtr) create_node(); mobility = (MobilityPtr) create_mobility(); node->mobile = 0; // static for the moment node->ID = n_id; node->type = omg_param_list.nodes_type; node->generator = omg_param_list.mobility_type; node->mob = mobility; place_rwalk_node(node); //initial positions Pair pair = malloc (sizeof(Pair)); pair = (Pair) sleep_rwalk_node(node, cur_time); //sleep Job_Vector = add_job(pair, Job_Vector); Job_Vector_len ++; if (Job_Vector == NULL) LOG_E(OMG, "Job Vector is NULL\n"); } return(0); }
/*set new mobility for a node*/ void set_new_mob_type (int id, int node_t, int mob_t, double cur_time) { int prev_mob; node_list *tmp; //job_list *tmp2, *prev_job; pair_struct *pair; double pause_p; //find previous mobility type tmp = node_vector[node_t]; while (tmp != NULL) { if (tmp->node->id == id && tmp->node->type == node_t) { prev_mob = tmp->node->generator; break; } tmp = tmp->next; } //end if (tmp != NULL && prev_mob != mob_t) { //initialize node position if (mob_t == STATIC || mob_t == RWP || mob_t == RWALK || mob_t == STEADY_RWP) { tmp->node->x_pos = (double) ((int) (randomgen (omg_param_list[node_t].min_x, omg_param_list[node_t].max_x) * 100)) / 100; tmp->node->mob->x_from = tmp->node->x_pos; tmp->node->mob->x_to = tmp->node->x_pos; tmp->node->y_pos = (double) ((int) (randomgen (omg_param_list[node_t].min_y, omg_param_list[node_t].max_y) * 100)) / 100; tmp->node->mob->y_from = tmp->node->y_pos; tmp->node->mob->y_to = tmp->node->y_pos; tmp->node->mob->speed = 0.0; tmp->node->generator = mob_t; if (prev_mob != STATIC) job_vector[prev_mob] = remove_job (job_vector[prev_mob], id, node_t); } //end switch (mob_t) { case STATIC: break; case RWP: pair = (pair_struct *) malloc (sizeof (struct pair_struct)); pair->b = tmp->node; sleep_rwp_node (pair, cur_time); job_vector[RWP] = addjob (pair, job_vector[RWP]); break; case RWALK: pair = (pair_struct *) malloc (sizeof (struct pair_struct)); pair->b = tmp->node; sleep_rwalk_node (pair, cur_time); job_vector[RWALK] = addjob (pair, job_vector[RWALK]); break; case STEADY_RWP: tmp->node->event_num = 0; pair = (pair_struct *) malloc (sizeof (struct pair_struct)); pair->b = tmp->node; pause_p = pause_probability (omg_param_list[node_t]); if (randomgen (0, 1) < pause_p) sleep_steadystaterwp_node (pair, cur_time); else move_steadystaterwp_node (pair, cur_time); break; #ifdef SUMO_IF case SUMO: LOG_E (OMG, "not possible to change mobility type to sumo \n"); break; #endif case TRACE: LOG_E (OMG, "not possible to change mobility type to trace \n"); break; default: LOG_E (OMG, " Unsupported generator \n"); } } }