Exemplo n.º 1
0
//mobility change 14-4-10
void updateNeighborInfo(int node, int infra, int rssi)
{
	//if(node == 25)  // mobility hack
	//{
	int i,j,k;
	//int fragment_hearing;
	struct event * anEvent;
	
	if(nodeID[node].infra_list[infra].is_neighbor == TRUE)
	{
	nodeID[node].infra_list[infra].timeLastHeard = simTime;
	performAveraging(node, infra, rssi);
	//fprintf(stderr,"Node %d is now a neighbor of %d \n", infra, node);
	}
	else
	{
		if(nodeID[node].infra_list[infra].times_observed == INFRA_HEARD_THRESHOLD)
		{
		//perform averaging, send reactive update, set is_neighbor to true, and start timer
		nodeID[node].infra_list[infra].infra_node = infra;
		nodeID[node].infra_list[infra].is_neighbor = TRUE;
		nodeID[node].infra_list[infra].timeLastHeard = simTime;

		performAveraging(node, infra, rssi);
		//fragment_hearing = FRAGMENT_HEARING(node,infra); 
		anEvent = getNextExpectedFragmentEvent(simTime + FRAGMENT_TIMEOUT, node, infra);
		insertEvent(anEvent);
		//mobility hack 16-4-10, this is reactive, should not result in another topology update event being set. 
		if(simTime > 1200000)
		{
			anEvent = getTopologyUpdateEvent(simTime, node, node, nodeID[node].parent,TX, REACTIVE);	
			insertEvent(anEvent);
		}

			//fprintf(stderr,"RSSI values with which neighbor %d is heard are \n", infra);
			for(i=0; i < INFRA_HEARD_THRESHOLD; i++)
			{
			//fprintf(stderr," RSSI at position %d is %d \n", i, nodeID[node].infra_list[infra].rssi[i]);
			}
			
		}
		else
		{
			for(i=0; i < INFRA_HEARD_THRESHOLD; i++)
			{
				if(nodeID[node].infra_list[infra].rssi[i] == 0) // mobility hack
				{
				nodeID[node].infra_list[infra].rssi[i] = rssi;
				break;
				}
			}
		nodeID[node].infra_list[infra].times_observed++;
		//fprintf(stderr,"Infra %d heard for %d times \n", infra, nodeID[node].infra_list[infra].times_observed);
		}
	}
	//}

}
Exemplo n.º 2
0
EventModel::EventModel( QString _name, QString _description, int _nIDUser, QDate _date )
{
    name = _name;
    description = _description;
    nIDUser = _nIDUser;
    date = _date;
    insertEvent();
}
Exemplo n.º 3
0
void MidiTrack::closeTrack() {
	long lastTick = 0;
	if (mEvents.size() > 0) {
		MidiEvent * last = *(--mEvents.end());
		lastTick = last->getTick() + 1;
	}

	insertEvent(new EndOfTrack(lastTick, 0));
}
Exemplo n.º 4
0
/* deletes Event object pointer from year, month, day sets and inserts
 * new object 
 * returns false if object already exists 
 * */
bool Event_set::editEvent(Event * current_e, Event * new_e)
{                                                                               
    /* if same start time / title already exists */                             
    if (findDuplicate(new_e))                                                   
        return true;
    deleteEvent(current_e);                                                     
    insertEvent(new_e);                                                         
    return false;
}                                                                               
void AudioParamTimeline::linearRampToValueAtTime(float value, double time, ExceptionState& exceptionState)
{
    ASSERT(isMainThread());

    if (!isNonNegativeAudioParamTime(time, exceptionState))
        return;

    insertEvent(ParamEvent(ParamEvent::LinearRampToValue, value, time, 0, 0, nullptr), exceptionState);
}
Exemplo n.º 6
0
void predict(Ball** balls,Ball* currball){
    if(currball== NULL) return;
    int i;
    for(i = 0;i<nballs;i++){
        double dt = timeToHit(currball,balls[i]);
        if( time+dt<=tlimit && time+dt>0){
            insertEvent(events,newEvent(time+dt,currball,balls[i]));
        }
    }

    // particle-wall collisions
    double dtX = timeToHitVerticalWall(currball);
    //printball(currball);
    double dtY = timeToHitHorizontalWall(currball);
    if (time + dtX <= tlimit && time + dtX >0) insertEvent(events,newEvent(time + dtX, currball, NULL));
    if (time + dtY <= tlimit&& time + dtY >0) insertEvent(events,newEvent(time + dtY, NULL, currball));

}
Exemplo n.º 7
0
void AudioParamTimeline::setValueAtTime(float value, double time, ExceptionState& exceptionState)
{
    ASSERT(isMainThread());

    if (!isValidAudioParamValue(value, exceptionState)
        || !isValidAudioParamTime(time, exceptionState))
        return;

    insertEvent(ParamEvent(ParamEvent::SetValue, value, time, 0, 0, nullptr));
}
void AudioParamTimeline::setTargetAtTime(float target, double time, double timeConstant, ExceptionState& exceptionState)
{
    ASSERT(isMainThread());

    if (!isNonNegativeAudioParamTime(time, exceptionState)
        || !isNonNegativeAudioParamTime(timeConstant, exceptionState, "Time constant"))
        return;

    insertEvent(ParamEvent(ParamEvent::SetTarget, target, time, timeConstant, 0, nullptr), exceptionState);
}
void AudioParamTimeline::exponentialRampToValueAtTime(float value, double time, ExceptionState& exceptionState)
{
    ASSERT(isMainThread());

    if (!isPositiveAudioParamValue(value, exceptionState)
        || !isNonNegativeAudioParamTime(time, exceptionState))
        return;

    insertEvent(ParamEvent(ParamEvent::ExponentialRampToValue, value, time, 0, 0, nullptr));
}
void AudioParamTimeline::setValueCurveAtTime(DOMFloat32Array* curve, double time, double duration, ExceptionState& exceptionState)
{
    ASSERT(isMainThread());

    if (!isNonNegativeAudioParamTime(time, exceptionState)
        || !isPositiveAudioParamTime(duration, exceptionState, "Duration"))
        return;

    insertEvent(ParamEvent(ParamEvent::SetValueCurve, 0, time, 0, duration, curve), exceptionState);
}
Exemplo n.º 11
0
//mobility change 15-4-10
void handleExpectedFragmentReception(int node, struct packetFormat * aPacket)
{
	int mobile, infra; 
	struct event * anEvent;
	int i,j;

	mobile = node;
	infra = ((struct expected_fragment *)aPacket->payloadPacket)->infra_node;

	//fprintf(stderr,"The mobile is %d and the event is for infra %d \n", mobile, infra);
	
	if(nodeID[mobile].infra_list[infra].timeLastHeard < (simTime - FRAGMENT_TIMEOUT))
	{
		//fprintf(stderr,"Node %d has not heard from infra %d in the last 5 seconds, sending reactive update \n", mobile, infra);

		//reset the information about this node 
		nodeID[mobile].infra_list[infra].infra_node = MAX_NO_INFRA_NODES + 1;
		nodeID[mobile].infra_list[infra].times_observed = 0;
		nodeID[mobile].infra_list[infra].missed = 0;
		for(j=0; j<INFRA_HEARD_THRESHOLD; j++) // portability hack
			{
			nodeID[mobile].infra_list[infra].rssi[j] = 0;
			}
		nodeID[mobile].infra_list[infra].is_neighbor = FALSE;
	
	//now send a reactive update
	//mobility hack 17-4-10
		if(simTime > 1200000)
		{
		anEvent = getTopologyUpdateEvent(simTime, mobile, mobile, nodeID[mobile].parent,TX, REACTIVE);	
		insertEvent(anEvent);
		}	
		
	//exit(0);
	}
	else
	{
	anEvent = getNextExpectedFragmentEvent(simTime + FRAGMENT_TIMEOUT, node, infra);
	insertEvent(anEvent);
	}

}
Exemplo n.º 12
0
/***********************************************************************
 *  cl_ctx_set_timer - set timer
 *
 *  input:
 *    ctx  - context
 *    tv   - timeout after which the timer expires
 *    fun  - function to be invoked when the timer expires
 *    data - application data passed back to the application when the
 *           callback is invoked
 *
 ************************************************************************/
cl_timer *cl_ctx_set_timer(cl_context *ctx, struct timeval *tv, 
			   void (*fun)(), void *data)
{
  uint64_t when;
  Event *ev;

  if (ctx == NULL)
    return NULL;

  when = wall_time();
  when = when + UMILLION*tv->tv_sec + tv->tv_usec;
  ev = newEvent(fun, data, when);

  insertEvent(&ctx->timer_heap, ev);

  return (cl_timer *)ev;
}
Exemplo n.º 13
0
int handleExpectedScheduleReception(int node)
{
	int numOfFragments;
	double nextExpectedScheduleTime;
	struct event * anEvent;
	
	if(nodeID[node].timeLastScheduleReception == UNDEFINED)
	{
		fprintf(stderr,"\n Sanity check failed inside handleExpectedScheduleReceptionTimeout: timeLastScheduleReception UNDEFINED");
		exit(0);
	}
	
	numOfFragments = getNumOfFragments(nodeID[node].numSchedElem);
		
	if(getNextExpectedScheduleTime(nodeID[node].timeLastScheduleReception, nodeID[node].scheduleNumOfFragments, 0) < simTime)
	{	
		nodeID[node].numScheduleMissed++;

		if(nodeID[node].numScheduleMissed == SCHEDULE_MISS_THRESHOLD)
		{	
			
			//fprintf(stderr,"\n\n **** %d Schedules Missed at %d lastSchedReceptionTime %lf simTime %lf\n",SCHEDULE_MISS_THRESHOLD,node,nodeID[node].timeLastScheduleReception,simTime);
			//exit(0);
			nodeID[node].lastScheduleMissed = TRUE;		
			nodeID[node].numScheduleMissed = 0;
		}	
	}
	else
	{
		nodeID[node].lastScheduleMissed = FALSE;
		nodeID[node].numScheduleMissed = 0;
	}
	
	//*************************				
	nextExpectedScheduleTime = getNextExpectedScheduleTime(simTime, nodeID[node].scheduleNumOfFragments, 0);
	anEvent = getNextExpectedScheduleEvent(nextExpectedScheduleTime, node);
	insertEvent(anEvent);	
	
}
Exemplo n.º 14
0
 void simulate(Ball** balls){
     events = (Event**)malloc(capacity*sizeof(Event*));
     nevent = 0;
     int i;
     for(i = 0;i<nballs;i++){
        predict(balls,balls[i]);
     }
     insertEvent(events,newEvent(0,NULL,NULL));

     while(nevent!=0){
        Event* e = delminEvent(events);
        //printf("nevent:%d",nevent);
        if(isValid(e)==1){
        printf("Event:%f \n",e->t);
        // physical collision, so update positions, and then simulation clock
        for (i = 0; i < nballs; i++){
            if(e->t - time>0)
                 move(balls[i],e->t - time,i);
            else
               move(balls[i],0.1,i);

        }
            if(time < e->t)
                  time = e->t;
            else time+=0.1;

            // process event
            if      (e->a != NULL && e->b != NULL) bounceOff(e->a,e->b);              // particle-particle collision
            else if (e->a != NULL && e->b == NULL) bounceOffVerticalWall(e->a);   // particle-wall collision
            else if (e->a == NULL && e->b != NULL) bounceOffHorizontalWall(e->b); // particle-wall collision

            // update the priority queue with new collisions involving a or b

            predict(balls,e->a);
            predict(balls,e->b);
        }

     }
}
Exemplo n.º 15
0
static int
installEvent(Event ev)
{ int rc;

  ev->thread_id = pthread_self();
  ev->pl_thread_id = PL_thread_self();

  LOCK();
  if ( !scheduler_running )
  { pthread_attr_t attr;

    TheSchedule()->stop = FALSE;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    pthread_attr_setstacksize(&attr, 8192);
    rc = pthread_create(&scheduler, &attr, alarm_loop, NULL);
    pthread_attr_destroy(&attr);

    if ( rc != 0 )
    { UNLOCK();
      return pl_error("alarm", 4, "Failed to start schedule thread",
		      ERR_ERRNO, rc);
    }

    DEBUG(1, Sdprintf("Started scheduler thread\n"));
    scheduler_running = TRUE;
  }

  rc = insertEvent(ev);
  UNLOCK();

  if ( rc )
    pthread_cond_signal(&cond);

  return rc;
}
Exemplo n.º 16
0
int Trace::updateLoopLCS(Event* merge_head, Event* merge_tail, int merge_length, Event* target_head, Event* target_tail, vector<matching_pair_t *>* pairs){

  int i = 0, j = 0, mend_pos = 0, tend_pos = 0, tbegin_pos = 0, expand, mdepth, tdepth;
  int n = pairs->size();
  Event *mbegin, *mend, *tbegin, *tend, *iter, *dummy, *temp;
  mbegin = mend = merge_head;
  tbegin = tend = target_head;
  bool changeMade = false;
  /* prerequisite: merge_head matches target_head, merge_tail matches target_tail */
  assert(pairs->size() > 0 && pairs->at(0)->index1 == 0 && pairs->at(0)->index2 == 0 );

  loop_t *outer;
  loophead_t* head;
  vector<loophead_t *> mloopheads;
  vector<loophead_t *> tloopheads;

  if(merge_head->getLoopDepth() > 1){ /* all events have one level of loop for themselves (mem:1 iter:1) */
    head = new loophead_t;
    head->event = merge_head;
    head->pos = mend_pos;
    mloopheads.push_back(head);
  }
  if(target_head->getLoopDepth() > 1){
    head = new loophead_t;
    head->event = target_head;
    head->pos = tend_pos;
    tloopheads.push_back(head);
  }

  for(int pair_iter = 0; pair_iter < n; pair_iter++){
    while(i < pairs->at(pair_iter)->index1){
      mend = mend->next;
      i++;
      mend_pos++;
      if(mend->getLoopDepth() > 1){
        head = new loophead_t;
        head->event = mend;
        head->pos = mend_pos;
        mloopheads.push_back(head);
      }
    }
    while(j < pairs->at(pair_iter)->index2){
      tend = tend->next;
      j++;
      tend_pos++;
      if(tend->getLoopDepth() > 1){
        head = new loophead_t;
        head->event = tend;
        head->pos = tend_pos;
        tloopheads.push_back(head);
      }
    }

    temp = mend->prev;
    if(tbegin != tend){
      /* mend->prev should always exist */
      assert(mend->prev);
      expand = mend->getLoopStack()->getLoopAt(0)->mem->getNumValues(true);
      for(iter = tbegin; iter != tend; iter = iter->next){
        dummy = iter->getDummyEvent();
        /* expand the loop information by referring to the immediate following event:
         * assume the following event is E and the number of times E was called is n,
         * n equals to the (uncompressed) length of the mem/iter vector of the outer
         * most loop of E. If E starts loop structures, n equals to the times E was
         * called if there is no loop structures on E. Therefore, in either case, n
         * will be the times the dummy event will be evaluated if inserted to the merge
         * iteration */
        dummy->expandLoop(expand);
        insertEvent(dummy, mend->prev);
        mend_pos++;
        /* increase mem by one for loops that contain the inserted event */
        for(vector<loophead_t *>::iterator it = mloopheads.begin(); it != mloopheads.end(); ){
          changeMade = (*it)->event->getLoopStack()->incLoopMem(mend_pos - 1 - (*it)->pos);
          if(!changeMade)
            mloopheads.erase(it);
          else
            it++;
        }
      }
    }
    if(mbegin != mend){
      /* tend->prev should always exist */
      assert(tbegin->prev);
      expand = tbegin->getLoopStack()->getLoopAt(0)->mem->getNumValues(true);
      for(iter = mbegin; iter != temp->next; iter = iter->next){
        dummy = iter->getDummyEvent();
        dummy->expandLoop(expand);
        insertEvent(dummy, tbegin->prev);
        tend_pos++;
        tbegin_pos++;
        /* increase mem by one for loops that contain the inserted event */
        for(vector<loophead_t *>::iterator it = tloopheads.begin(); it != tloopheads.end(); ){
          changeMade = (*it)->event->getLoopStack()->incLoopMem(tbegin_pos - (*it)->pos);
          if(!changeMade)
            tloopheads.erase(it);
          else
            it++;
        }
      }
    }

    if(mend != merge_head && tend != target_head){
      mdepth = mend->getLoopDepth();
      tdepth = tend->getLoopDepth();
      if(mdepth > tdepth)
        tend->alignLoop(mdepth);
      else
        mend->alignLoop(tdepth);
    } else if(mend == merge_head && tend == target_head){
      /* heads are handled differently */
      /* check the outer most loop of merge_head, if it's a loop of the entire
       * iteration (mem == merge_length), align the rest of the loop nest with
       * the loops on target_head, otherwise align all loops on merge_head with
       * the loops on target_head */
      if(mend->getLoopStack()->getLoopAt(0)->mem->getNumValues(true) == 1
          && mend->getLoopStack()->getLoopAt(0)->mem->getScalarValueForRank() == merge_length ){
        outer = mend->getLoopStack()->popOuterLoop();
      } else {
        outer = NULL;
      }
      mdepth = mend->getLoopDepth();
      tdepth = tend->getLoopDepth();
      if(mdepth > tdepth)
        tend->alignLoop(mdepth);
      else
        mend->alignLoop(tdepth);
      if(outer)
        mend->getLoopStack()->insertLoop(outer);
    } else {
      assert(0); /* should never reach here!! */
    }

    mbegin = mend->next;
    tbegin = tend->next;
    tbegin_pos = tend_pos;
  }

  mloopheads.clear();
  tloopheads.clear();

  return mend_pos + 1;
}
Exemplo n.º 17
0
//mobility change 14-4-10
void performAveraging(int node, int infra, int rssi)
{
//performing weighted moving average
//First shift all values up and put current rssi in the last place
int i,j;
float average;
struct event * anEvent;

	for(i=0; i < INFRA_HEARD_THRESHOLD -1 ; i++)
	{
		nodeID[node].infra_list[infra].rssi[i] = nodeID[node].infra_list[infra].rssi[i+1];
	}
	nodeID[node].infra_list[infra].rssi[INFRA_HEARD_THRESHOLD-1] = rssi;

//now perform averaging, the 5th observation will be given weight 5, 4th one 4 and so on
//store values in an array rather than print the long lines over and over again
int temp[INFRA_HEARD_THRESHOLD];
	for(i=0; i < INFRA_HEARD_THRESHOLD; i++)
	{
	temp[i] = nodeID[node].infra_list[infra].rssi[i];
	}
	
	average = (float)((temp[0]*1)+(temp[1]*2)+(temp[2]*3)+(temp[3]*4)+(temp[4]*5))/(float)15 ;
	if(node == 25)
	{
	//fprintf(stderr,"The average RSSI value for node %d is %f \n", infra, average);
	}

	//store this information
	nodeID[node].infra_list[infra].average = average;
	// 18-4-10, if parent RSSI goes below X threshold, set expecting parent change to true
	if(nodeID[node].infra_list[infra].infra_node == nodeID[node].parent)
	{
		if((int)(nodeID[node].infra_list[infra].average) < PARENT_RSSI)
		{
		//get its current position and time to verify
		int node_x, node_y;
		getPosition(node, &node_x, &node_y, simTime);
		//exit(0);
		//in order to send the reactive update only once
			if(nodeID[node].state >= JOINED)
			{

			if(nodeID[node].expectingParentChange == TRUE)
			{
			//update already sent
			}
			else
			{
			anEvent = getTopologyUpdateEvent(simTime, node, node, nodeID[node].parent,TX, REACTIVE);	
			insertEvent(anEvent);	
			nodeID[node].expectingParentChange = TRUE;
	
			//fprintf(stderr,"Average for node %d with respect to its parent %d is %f at time %lf, its X and Y coordinates are %d and %d respectively , sending reactive update\n", node, nodeID[node].infra_list[infra].infra_node, average, simTime, node_x, node_y);

			logMobilityStats(EXPECTING_PARENT_CHANGE, node, infra, simTime); // this should always be the format 
			}

			}
		}
	}
	
}
Exemplo n.º 18
0
void MidiTrack::insertNote(int channel, int pitch, int velocity, long tick, long duration) {

	insertEvent(new NoteOn(tick, channel, pitch, velocity));
	insertEvent(new NoteOff(tick + duration, channel, pitch, 0));
}
Exemplo n.º 19
0
int handleScheduleReceptionTimeout(int node)
{
	int m;
	struct event * anEvent;

	if(nodeID[node].state == DEAD)
	{
		//fprintf(stderr,"\n %d node is already dead",node);
		return SUCCESS;
	}
	
	if(node == ROOT)
	{
		fprintf(stderr,"\n Sanity check failed inside handleschedulereception: node ROOT \n");
		exit(0);
	}
	
	if(nodeID[node].state == NOT_JOINED)
		return SUCCESS;
	
	if(nodeID[node].timeLastScheduleReception == UNDEFINED)
	{
		fprintf(stderr,"\n Sanity check failed inside handleScheduleReceptionTimeout: timeLastScheduleReception UNDEFINED");
		exit(0);
	}
	
	
	if(nodeID[node].timeLastScheduleReception + (SCHEDULE_TIMEOUT) < (simTime + FRAME_DURATION) ) // node disable hack
	{
		nodeID[node].state = NOT_JOINED;
		
		nodeID[node].wasOrphan = TRUE;
		
		nodeID[node].expectingJoinRequestAck = FALSE;
		logNodeStats(node,TIME_NODE_ORPHAN,simTime);
				
		/*for(m=node;m!=ROOT;)
		{
			fprintf(stderr,"\n %d <- %d", m, nodeID[m].parent);
			m = nodeID[m].parent;
		}*/
		
		//printf("\n %d node (parent %d) became orphan: node depth %d lastSchedReception %lf timeout %lf simTime %lf\n",node, nodeID[node].parent, nodeID[node].depth, nodeID[node].timeLastScheduleReception, (double)SCHEDULE_TIMEOUT, simTime);
		//fprintf(stderr,"\n\n **** %d node (parent %d) became orphan: node depth %d lastSchedReception %lf timeout %lf simTime %lf\n",node, nodeID[node].parent, nodeID[node].depth, nodeID[node].timeLastScheduleReception, (double)SCHEDULE_TIMEOUT, simTime);
		//exit(0);
		//sleep(5);

		//node disable change , I think I need to purge the contention and the data queues here
		purgeNodeInfo(node);
		//nodeID[node].numOfPacketsInQueue = nodeID[node].numOfPacketsInDataQueue = 0;
		//nodeID[node].controlFront = nodeID[node].controlRear = nodeID[node].dataFront = nodeID[node].dataRear = 0;

	}
	else
	{
		//anEvent = getScheduleReceptionTimeout(simTime + (double)SCHEDULE_TIMEOUT, node);
		anEvent = getScheduleReceptionTimeout(nodeID[node].timeLastScheduleReception + (double)SCHEDULE_TIMEOUT, node);
		insertEvent(anEvent);	
		//node disable hack
		if(node == 6 || (node >= 33 && node <= 44 ) )
		{
		//fprintf(stderr,"Schedule reception timeout for %d set at %lf minutes \n", node, ((nodeID[node].timeLastScheduleReception + (double)SCHEDULE_TIMEOUT)/(double)(60000)));
		}
	}	
}
Exemplo n.º 20
0
void AudioParamTimeline::setValueCurveAtTime(Float32Array* curve, float time, float duration)
{
    insertEvent(ParamEvent(ParamEvent::SetValueCurve, 0, time, 0, duration, curve));
}
Exemplo n.º 21
0
void AudioParamTimeline::setTargetAtTime(float target, float time, float timeConstant)
{
    insertEvent(ParamEvent(ParamEvent::SetTarget, target, time, timeConstant, 0, 0));
}
Exemplo n.º 22
0
void AudioParamTimeline::exponentialRampToValueAtTime(float value, float time)
{
    insertEvent(ParamEvent(ParamEvent::ExponentialRampToValue, value, time, 0, 0, 0));
}
Exemplo n.º 23
0
void AudioParamTimeline::linearRampToValueAtTime(float value, float time)
{
    insertEvent(ParamEvent(ParamEvent::LinearRampToValue, value, time, 0, 0, 0));
}
Exemplo n.º 24
0
void AudioParamTimeline::setValueAtTime(float value, float time)
{
    insertEvent(ParamEvent(ParamEvent::SetValue, value, time, 0, 0, 0));
}
Exemplo n.º 25
0
int handleScheduleBroadcast(int node, struct packetFormat * aPacket)
{
	
	int index, i; //iterators
	//used for intermediate timing calculations
	double tempTime;
	double nextScheduleTime, nextScheduleTimeNonRoot;
	double currentScheduleTime,nextExpectedScheduleTime;
	
	struct event * anEvent;

	int sizeofPacket;
	int numOfFragments;

	//extracting schedule info
	int rTree;	
	int treeToSchedElem;	
	int maxElemInPacket;
	int j;
	int TreeDepth = 1;
	
	maxElemInPacket = getSplitSchedulingElements(); // this just returns the number of scheduling elements that can fit into one packet
		
	currentScheduleTime = simTime;
	currentScheduleTime -= fmod(fmod(currentScheduleTime, FRAME_DURATION), CONTROL_SLOT_DURATION);
	//as far as i think, it gives the beginning of the control slot that would have just started before the current schedule time

	//node disable change
	if(nodeID[node].state == DEAD) //not joined condition checked downstairs
	{
	//fprintf(stderr,"Node returning from here is %d \n", node);  // node does not receive schedule once it is dead. So this line is printed only once. On each schedule broadcast, the next broadcast time is calculated. So once you return, the next chance does not come
		return SUCCESS;
	}
	
	if(node == ROOT)
	{
		
		//VJ Start
		nodeID[ROOT].numSchedElem = globalNumSchedElem;
		//VJ End
		
		for(i=0; i < nodeID[ROOT].numSchedElem; i++)
		{
			nodeID[ROOT].localScheduleElements[i] = globalScheduleElements[i];
		}
		
		
		//fprintf(stderr,"\n SchedElemRoot %d %lf\n", nodeID[ROOT].numSchedElem, simTime);
		if(schedulePacketChange == TRUE)
		{
		schedulePacketChange = FALSE;
		//fprintf(stderr,"\nSchedElemRoot %d\n", nodeID[ROOT].numSchedElem);
		}
		
		
		numOfPresentNodesInTree = numOfNodesInTree;
		numOfPresentInfraNodesInTree = numOfInfraNodesInTree;
		numOfPresentSchedElem = nodeID[ROOT].numSchedElem;
						
		rTree = nodeID[ROOT].treeUpdate;		
		treeToSchedElem = convertTreeToSchedElem(rTree);		
		numOfFragments = getNumOfFragments(nodeID[ROOT].numSchedElem + treeToSchedElem); 
		
		//node disable hack
		//max_no_fragments = numOfFragments;
		if(numOfFragments > max_no_fragments)
		{
			max_no_fragments = numOfFragments;
		}
		//fprintf(stderr,"\nnumOfPresentNodesInTree %d numOfPresentInfraNodesInTree %d numOfPresentSchedElem %d rTree %d treeToSchedElem %d\n",numOfPresentNodesInTree,numOfPresentInfraNodesInTree,numOfPresentSchedElem,rTree,treeToSchedElem);		
		#ifdef DEBUG_FRAC
	
			//fprintf(stderr,"\n Inside fmod_of_broadcast currentScheduleTime %lf", currentScheduleTime);
			//sleep(2);
	
		#endif	
		
		TreeDepth = maxTreeHops();
		
		//fprintf(stderr,"\n depth %d", TreeDepth);
				
		for(i=1;i<=(numOfPresentInfraNodesInTree + 1)*(numOfFragments)*TreeDepth;i++) //changed on 28-4-10
		{	
			currentScheduleTime = currentScheduleTime + CONTROL_SLOT_DURATION;			
			if(fmod(currentScheduleTime, FRAME_DURATION) == NO_OF_CONTROL_SLOTS * CONTROL_SLOT_DURATION)
			{
				currentScheduleTime = currentScheduleTime + (NO_OF_CONTENTION_SLOTS * CONTENTION_SLOT_DURATION) + (NO_OF_DATA_SLOTS * DATA_SLOT_DURATION);	
				
				#ifdef DEBUG_FRAC
	
				//fprintf(stderr,"\n Inside fmod_of_broadcast currentScheduleTime %lf i %d simTime %lf node %d", currentScheduleTime, i, simTime, node);
				//sleep(2);
	
				#endif	
				
			}					
		}
		
		#ifdef DEBUG_FRAC
	
		//fprintf(stderr,"\n Outside broadcast scheduleValidFrom %lf i %d simTime %lf node %d", currentScheduleTime, i, simTime, node);
		//sleep(2);
	
		#endif
			
		nodeID[node].scheduleValidFrom = currentScheduleTime;
		
		//fprintf(stderr," root svf %lf\n", nodeID[node].scheduleValidFrom);
		
		nodeID[node].lastScheduleTime = currentScheduleTime; // added on 24-4-10

		setFlowActiveAtOfNewFlows();


		setUpNewSchedule(ROOT); //extract scheduling elements for root
		
		//MANAN_CHANGE
		//VJ start: commenting following
		/*
		for(i=1; i < numOfNodesInNetwork; i++)
		{
		//anEvent = getSetUpNewScheduleEvent(currentScheduleTime,i);
		//insertEvent(anEvent);
			for(j=0; j < nodeID[ROOT].numSchedElem; j++)
			{
				nodeID[i].newScheduleElements[j] = globalScheduleElements[j];
			}

			nodeID[i].tempNumSchedElem = nodeID[ROOT].numSchedElem;
		}
		*/
		//VJ end: commenting end
		
		//setUpNewSchedule(ROOT); //extract scheduling elements for root
		
		//fprintf(stderr,"sim_time %lf current_schedule_time %lf \n", simTime, currentScheduleTime);
		//*****************************************************************		
		logNodeStats(ROOT,SIZE_SCHEDULE,(double)(sizeof(struct schedule) + sizeof(struct packetFormat) + sizeof(struct scheduleElement) * nodeID[ROOT].numSchedElem));	
		logNodeStats(ROOT,NUM_SCHEDULE_FRAGMENTS,(double)numOfFragments);
		
	}

	/*if(node == ROOT)
	{
	setUpNewSchedule(ROOT); //extract scheduling elements for root
	}*/
	
	rTree = nodeID[node].treeUpdate; 
	treeToSchedElem = convertTreeToSchedElem(rTree);	
	numOfFragments = getNumOfFragments(nodeID[node].numSchedElem + treeToSchedElem);
	
	if(numOfFragments > 1)
	{
		nodeID[node].moreFragment = TRUE;
	}
	else
	{
		nodeID[node].moreFragment = FALSE;
	}

	nextScheduleTime = simTime;	
	nextScheduleTime -= fmod(fmod(nextScheduleTime, FRAME_DURATION), CONTROL_SLOT_DURATION);
	
	//**********************************************
	nodeID[node].remSchedElem = nodeID[node].numSchedElem;
	nodeID[node].remTreeNodes = numOfPresentNodesInTree;	

	//fprintf(stderr,"\n Node %d remSchedElem %d remTreeNodes %d currSchedElem %d currTreeNodes %d \n",node,nodeID[node].remSchedElem,nodeID[node].remTreeNodes,nodeID[node].currSchedElem,nodeID[node].currTreeNodes);
	for(index = 0; index < nodeID[node].numNeighbors; index++)
	{
		nodeID[nodeID[node].neighborList[index]].scheduleMissed = FALSE;
	}

	for(i=0; i<numOfFragments; i++)
	{
		//********************************************
		nodeID[node].broadcastSchedFragmentNo = i+1;
		if(nodeID[node].remSchedElem > 0 || nodeID[node].remTreeNodes > 0)
		{
			if(nodeID[node].remSchedElem - maxElemInPacket >= 0)
			{
				nodeID[node].currSchedElem = maxElemInPacket;			
				nodeID[node].remSchedElem -= maxElemInPacket;
				nodeID[node].currTreeNodes = 0;
			}
			else
			{
				nodeID[node].currSchedElem = nodeID[node].remSchedElem;	
				
				if(nodeID[node].treeUpdate == TRUE)
				{
					if((maxElemInPacket - nodeID[node].currSchedElem) * sizeof(struct scheduleElement) > (nodeID[node].remTreeNodes * 2))
						nodeID[node].currTreeNodes = nodeID[node].remTreeNodes;
					else
						nodeID[node].currTreeNodes = ((maxElemInPacket - nodeID[node].currSchedElem) * sizeof(struct scheduleElement))/2;
				}
				else
				{
					nodeID[node].currTreeNodes = 0;
				}		
				nodeID[node].remTreeNodes -= nodeID[node].currTreeNodes;		
				nodeID[node].remSchedElem = 0;
			}
		}
		//********************************************
		
		if(i == (numOfFragments-1))
		{
			nodeID[node].moreFragment = FALSE; // since this is the last fragment
			sizeofPacket = sizeof(struct packetFormat) + sizeof(struct schedule) + nodeID[node].currSchedElem * sizeof(struct scheduleElement) + nodeID[node].currTreeNodes * 2;
			
			if((nodeID[node].currSchedElem * sizeof(struct scheduleElement) + nodeID[node].currTreeNodes * 2) > (maxElemInPacket * sizeof(struct scheduleElement)))
			{
				fprintf(stderr,"\n Size of packet %lu exceeds max size %lu curr schedelem %d curr tree nodes %d total schedelem %d total tree nodes %d treeToSchedElem %d numOfFragments %d fragment no %d",(nodeID[node].currSchedElem * sizeof(struct scheduleElement) + nodeID[node].currTreeNodes * 2), (maxElemInPacket * sizeof(struct scheduleElement)), nodeID[node].currSchedElem, nodeID[node].currTreeNodes, nodeID[node].numSchedElem, numOfPresentNodesInTree, treeToSchedElem, numOfFragments, i+1);
				exit(0);
			}
			
			if(node != ROOT)
			{							
				
				if(nodeID[node].lastScheduleMissed == FALSE)
				{
					//*************************
					nextScheduleTimeNonRoot = getNextScheduleBroadcastTime(node, numOfFragments);
					anEvent = getScheduleEvent(nextScheduleTimeNonRoot, node, node, TX);
					insertEvent(anEvent);

					//fprintf(stderr,"Infra %d is going to broadcast next schedule at time %lf numOfFragments is %d \n", node, nextScheduleTimeNonRoot, numOfFragments);
				}	

			}	

		}	
		else
		{			
			sizeofPacket = sizeof(struct packetFormat) + sizeof(struct schedule) + getSplitSchedulingElements() * sizeof(struct scheduleElement);
		}
		
		//set schedule reception events of all neighbors of this node
		//mobility abstraction to be put here 
		//getCurrentTopology(node);
		purgeNeighborInfo(node);
		rebuildNeighborInfo(node);	

		for(index = 0; index < nodeID[node].numNeighbors; index++)
		{
			//schedule reception events of ALIVE neighbors who are children			
			if(nodeID[nodeID[node].neighborList[index]].state != DEAD)
			{	
						
				if(!IsPacketToBeDropped(errorRate))
				{
					/*
					nodeID[nodeID[node].neighborList[index]].controlReceptionCount++;
					if(nodeID[nodeID[node].neighborList[index]].controlReceptionCount > 1)
					{
						nodeID[nodeID[node].neighborList[index]].controlReceptionCollision = TRUE;
					}										
					*/					
					anEvent = getScheduleEvent(nextScheduleTime + ((double)sizeofPacket*8/(double)DATA_RATE), node, nodeID[node].neighborList[index], RX);
					insertEvent(anEvent);
				}
				else
				{
					//MANAN_CHANGE
					nodeID[nodeID[node].neighborList[index]].scheduleMissed = TRUE;

					logNodeStats(nodeID[node].neighborList[index],TIME_SCHEDULE_DROP,simTime);
				}
			}
		}

		nextScheduleTime = rootNextScheduleFragmentBroadcast(nextScheduleTime);	
		//nextScheduleTime was equalled to simTime earlier
		//printf("\n simTime %lf nextScheduleTime %lf",simTime, nextScheduleTime);
	}	
	
	//*************************************
	
	if(nodeID[node].treeUpdate == TRUE)
	{
		nodeID[node].treeUpdateBroadcast++;
	}
	
	if(nodeID[node].treeUpdateBroadcast == TREE_UPDATE_REPEAT)
	{
		nodeID[node].treeUpdateBroadcast = 0;
		nodeID[node].treeUpdate = FALSE;
	}
	
	//*************************************
		
	//nodeID[node].treeUpdate = FALSE;					
	
		
	if(node == ROOT)
	{		
		anEvent = getScheduleEvent(nextScheduleTime, ROOT, ROOT, TX);
		insertEvent(anEvent);	
		
		//fprintf(stderr,"Root is going to broadcast next schedule at time %lf simTime is %lf \n", nextScheduleTime, simTime);
	}
		
	return SUCCESS;
}
Exemplo n.º 26
0
//get synchronized, update routing tree, for infrastructure nodes: broadcast schedule packet further
int handleScheduleReception(int node, struct packetFormat * aPacket)
{
	struct schedule * aSchedule;
	struct event * anEvent;

	double nextScheduleTime, nextExpectedScheduleTime;
	double joinScheduleTime;
	
	int rTree, moreFrag, schedElements, treeToSchedElem, numOfFragments;
	int schedElem_frag_rTree_repeat;
	int ver_type_piggyback;
	int RSSI;
	int index;
	
	//order in breadth wise transmission
	int numPrevInfraNodes;

	int i;
	int scheduleChangeReceived;
	int stillPartOfTree;
	
	//VJ start
	int tempParent;
	//VJ end	

	numPrevInfraNodes = 0;
	numOfFragments = 0;
	scheduleChangeReceived = FALSE;
	
	//mobility hack 13-4-10
	/*if(node == 25)
	{
	fprintf(stderr,"Schedule received from %d with RSSI %d \n", aPacket->source, aPacket->rssi);
	}*/

	/*if(aPacket->rssi < INFRA_RSSI)
	{
	fprintf(stderr,"Received packet with rssi %d less than INFRA_RSSI from %d \n", aPacket->rssi, aPacket->source);
	exit(0);
	//return SUCCESS;
	}*/

	updateNeighborInfo(node, aPacket->source, aPacket->rssi);	// mobility change 14-4-10

	//schedule received from non parent node
	if(nodeID[node].state != NOT_JOINED && aPacket->source != nodeID[node].parent)
	{	
		return SUCCESS;		
	} // this is for just receiving a schedule from one of its neighbors and sort of ignoring it if i am right
		
	if(nodeID[node].expectingJoinRequestAck == TRUE && nodeID[node].state == NOT_JOINED && aPacket->source != nodeID[node].parent)
	{
		return SUCCESS;
	}//this also i think represents a case when received a schedule from one of its neighbors
	
	if(nodeID[node].expectingJoinRequestAck == TRUE && nodeID[node].state == NOT_JOINED)
	{
		tempParent = aPacket->source;
	}	
				
	aSchedule = (struct schedule *)aPacket->payloadPacket;		
		
	nodeID[node].globalTime = aSchedule->timestamp;
	nodeID[node].offset = nodeID[node].globalTime - nodeID[node].localTime;
	nodeID[node].synchronized = TRUE;
	
	logNodeStats(node,TIME_SYNC,simTime);
		
	if(nodeID[node].state != NOT_JOINED && aSchedule->fragmentNo != nodeID[node].expectedSchedFragmentNo)
	{	
		nodeID[node].expectedSchedFragmentNo = 1;
		if(aSchedule->fragmentNo != 1)
			return SUCCESS;		
	}
	
	//VJ: commented, moved to the part where full schedule is received
	//nodeID[node].scheduleValidFrom = aSchedule->validFrom;
	
	
	//extract schedule info
	schedElem_frag_rTree_repeat = aSchedule->schedElem_frag_rTree_repeat;		
	schedElements = EXTRACT_SCHEDELEM(schedElem_frag_rTree_repeat);
	moreFrag = EXTRACT_FRAG_BIT(schedElem_frag_rTree_repeat);

	nodeID[node].treeUpdate = rTree = EXTRACT_RTREE_BIT(schedElem_frag_rTree_repeat);
	
	if(nodeID[node].lastScheduleTime == UNDEFINED) //executed only once, when node receives the schedule for the first time
	{
		nodeID[node].lastScheduleTime = nodeID[nodeID[node].parent].lastScheduleTime; //aSchedule->validFrom;		
	}
	else
	{
		//set up new schedule by extracting scheduling elements	
									
		if(nodeID[node].state > NOT_JOINED && nodeID[node].lastScheduleTime < nodeID[nodeID[node].parent].lastScheduleTime) //aSchedule->validFrom)
		{
		//scheduleValidFrom gets updated only when schedulePacketChange is set to true, at other times it is set to the old value itself. i guess there is one more place
						
			if(moreFrag == 1)
			{
				nodeID[node].expectedSchedFragmentNo++;
				return SUCCESS;
			}
			
			nodeID[node].scheduleValidFrom = nodeID[nodeID[node].parent].lastScheduleTime; //aSchedule->validFrom;
			
			//if(node < numOfInfraNodesInNetwork)
			//fprintf(stderr,"\n update received by %d",node);
			
			if(node == 76)
			{
				//fprintf(stderr,"\n schedule changed %lf %lf", aSchedule->validFrom, simTime);
			}
			
			if(node == 2 || node == 1)
			{
				//fprintf(stderr,"\n LastScheduleTime at node %d : %lf svf %lf simTime %lf p %d schedParent %lf",node,nodeID[node].lastScheduleTime, nodeID[node].scheduleValidFrom, simTime, nodeID[node].parent, nodeID[nodeID[node].parent].scheduleValidFrom);
				//sleep(5);
			}
			
			//if(aSchedule->validFrom > simTime)
			if(nodeID[nodeID[node].parent].lastScheduleTime > simTime)
				nodeID[node].lastScheduleTime = nodeID[nodeID[node].parent].lastScheduleTime; //aSchedule->validFrom;
			else
				nodeID[node].lastScheduleTime = simTime + (CONTROL_SLOT_DURATION - fmod(fmod(simTime, FRAME_DURATION), CONTROL_SLOT_DURATION));	
				//taking to the start of the next control slot
						
			nodeID[node].numOfInfraNodesInTree = numOfPresentInfraNodesInTree;
			nodeID[node].numSchedElem = numOfPresentSchedElem;
			
			//this event is necessary when schedule interval dynamically changes
			//anEvent = getNewScheduleParamEvent(nodeID[node].lastScheduleTime, node);
			//insertEvent(anEvent);
			
			//nodeID[node].lastScheduleMissed = FALSE;
			
			scheduleChangeReceived = TRUE;
			
			setUpNewSchedule(node); // very important call
		}
	}

	if(moreFrag == 1)  
	{
		nodeID[node].expectedSchedFragmentNo++;
		return SUCCESS;
	}	

	nodeID[node].numOfInfraNodesInTree = numOfPresentInfraNodesInTree;
	nodeID[node].numSchedElem = numOfPresentSchedElem;
		
	nodeID[node].timeLastScheduleReception = simTime;
	
	//nodeID[node].scheduleNumOfFragments = nodeID[node].expectedSchedFragmentNo;
		
	nodeID[node].lastFragmentNo = nodeID[node].expectedSchedFragmentNo;
			
	treeToSchedElem = convertTreeToSchedElem(rTree);	
	nodeID[node].scheduleNumOfFragments = numOfFragments = getNumOfFragments(nodeID[node].numSchedElem + treeToSchedElem);

	//*********************************************
	//VJ: 1/08/10 not sure whether this is required or not
	if(nodeID[node].lastScheduleMissed == TRUE && nodeID[node].state != NOT_JOINED)
	{
		if(nodeID[node].type == INFRA)
		{
			//nextScheduleTime = getFirstScheduleBroadcastTime(node, numOfFragments);	
			nextScheduleTime = getFirstScheduleBroadcastTime(node, numOfFragments, nodeID[node].parent);	
			anEvent = getScheduleEvent(nextScheduleTime, node, node, TX);
			insertEvent(anEvent);
		}	
	}
		
	nodeID[node].lastScheduleMissed = FALSE;
	//********************************************	

	if(nodeID[node].state == NOT_JOINED)
	{
		if(nodeID[node].expectingJoinRequestAck == TRUE)
		{				
			if(rTree == PRESENT) //routing tree update present
			{
				for(index = 0; index < numOfPresentNodesInTree; index++)
				{
					if(nodeID[routingTree[2 * index]].type == INFRA)
						numPrevInfraNodes++;
					if(routingTree[2 * index] == node)
					{
						nodeID[node].broadcastTurn = numPrevInfraNodes; 
						nodeID[node].expectingJoinRequestAck = FALSE;
						nodeID[node].state = JOINED;
						nodeID[node].expectingJoinRequestAck = FALSE; // not needed
						//fprintf(stderr,"\n **** Debug %d node joined at %lf ****",node,simTime);
						
						if(nodeID[node].wasOrphan == TRUE)
						{
							//fprintf(stderr,"\n Orphan node re joined %d",node);
						}
						nodeID[node].wasOrphan = FALSE;
						
						nodeStat[node].timeJoinGrantReceived = simTime;
						logNodeStats(node,TIME_JOIN_GRANT,(double)simTime);
						
						//fprintf(stderr,"\n node %d n(infra nodes) %d simTime %lf START_FLOW_AT %lf", node, numOfInfraNodesInNetwork, simTime, (double) START_FLOW_AT);
						
						#if GENERATE_REQUESTS_FROM_FILE
						#else
						
						if(node >= numOfInfraNodesInNetwork && simTime < (double) START_FLOW_AT)
						{	
							//node disable hack for not allowing rejoined nodes to have new canStartFlow request events
							if(simTime > 1200000)
							{
							//do nothing
							}
							else
							{
							
							countNodesFlow++;
							
							anEvent = getCanStartFlowRequestEvent((double) START_FLOW_AT,node);
							insertEvent(anEvent);
							}
						}// this is where it all starts
						#endif					
						
						nodeID[node].parent = routingTree[2 * index + 1];
						
						nodeID[node].depth = nodeID[nodeID[node].parent].depth + 1;
						
						anEvent = getScheduleReceptionTimeout(simTime + (double)SCHEDULE_TIMEOUT, node);	
						insertEvent(anEvent);
						
						if(nodeID[node].type == INFRA)
						{
							nextScheduleTime = getFirstScheduleBroadcastTime(node, numOfFragments, tempParent);	
							anEvent = getScheduleEvent(nextScheduleTime, node, node, TX);
							insertEvent(anEvent);
						}
						
						//*************************				
						nextExpectedScheduleTime = getNextExpectedScheduleTime(simTime, nodeID[node].scheduleNumOfFragments, 1);
						anEvent = getNextExpectedScheduleEvent(nextExpectedScheduleTime, node);
						insertEvent(anEvent);

						//portability changes start
						double temp;
						temp = generateTopologyUpdateTime(simTime);
						//temp = (double)((rand() % (int) ((TOPOLOGY_UPDATE_PERIOD * SECOND)/FRAME_DURATION)) * FRAME_DURATION);
						//fprintf(stderr,"number of infra nodes in network is %d \n", numOfInfraNodesInNetwork);
						anEvent = getTopologyUpdateEvent(temp, node,node,nodeID[node].parent,TX, REGULAR);	
						insertEvent(anEvent);
						
						//fprintf(stderr,"\n Node: %d  Schedule heard: %lf Topology Update time: %lf \n",node, simTime, temp);
						
						//portability changes end
						
					}					
				}				
			}
			
		}

		//if join request not sent already and thus not joined as yet, send join request
		if(nodeID[node].expectingJoinRequestAck == FALSE && nodeID[node].state == NOT_JOINED)
		{
			//node disable hack
			//if((node == 6 || node == 33 || node == 34 || node == 35 || node == 36 || node == 40 || node == 44) && simTime > 1440000)
			//if(simTime > 1200000)
			//{
			//fprintf(stderr,"Node %d received schedule, source/sponsor is %d \n", node, aPacket->source);
			//exit(0);
			//}
		
			//temporary parent			
			nodeID[node].parent = aPacket->source;
			nodeID[node].sponsor = aPacket->source;
			nodeID[node].sponsorDepth = nodeID[nodeID[node].parent].depth;
			
			//to do:incorporate depth to calculate join_wait_time which is static for now	
			
			joinScheduleTime = JOIN_WAIT_TIME + simTime;
			
			nodeStat[node].timeJoinRequestSent = joinScheduleTime;
			
			logNodeStats(node,TIME_JOIN_REQUEST,(double)simTime);			
			
			anEvent = getJoinRequestEvent(joinScheduleTime, node, node, nodeID[node].parent, TX);
			insertEvent(anEvent);
			anEvent = getJoinRequestTimeoutEvent(joinScheduleTime + JOIN_TIMEOUT, node);
			insertEvent(anEvent);									
			nodeID[node].expectingJoinRequestAck = TRUE;
			
			//fprintf(stderr,"\n Join request sent %d",node);
		}
	}

	//mobility change 19-4-10
	if(nodeID[node].expectingParentChange == TRUE && rTree == PRESENT)
	{
		
		//exit(0);
		for(index = 0; index < numOfPresentNodesInTree; index++)
		{
			if(routingTree[2 * index] == node)
			{
			nodeID[node].parent = routingTree[2 * index + 1];	
			//fprintf(stderr,"reached here to accept parent change due to mobility; for %d, now the parent is %d at time %lf \n", routingTree[2 * index], routingTree[2 * index + 1], simTime);	

			nodeID[node].expectingParentChange = FALSE;
			logMobilityStats(NEW_PARENT_RECEIVED, node, nodeID[node].parent, simTime);
			//exit(0);
			}
		}
	}

	nodeID[node].expectedSchedFragmentNo = 1;
	
	//portability changes start
	stillPartOfTree = FALSE;
	for(index = 0; index < numOfPresentNodesInTree; index++)
	{
		if(routingTree[2 * index] == node)
		{
			stillPartOfTree = TRUE;
		}
	}
	
	if(nodeID[node].state > NOT_JOINED && stillPartOfTree == FALSE)
	{
		//fprintf(stderr,"\n Accident removal by root for node %d \n", node);
		//exit(0);
	}
	//portability changes end

	return SUCCESS;
}