示例#1
0
TOS_MsgPtr      TOS_MSG_EVENT(DATA_MSG) (TOS_MsgPtr msg) {
    char           *data = msg->data;
    TOS_MsgPtr      tmp = msg;
    char            source;
    // this handler forwards packets traveling to the base.
    TOS_CALL_COMMAND(CONNECT_LED2_OFF) ();
    // if this is the first hop on the route, then use the origin of the
    // packet< 
    // as the name of the person who sent the packet to you instead of the 
    // 
    // 
    // last hop ID (which is null)
    source = data[2];
    if (source == 0) {
	source = data[0];
    }
    update_connections(source, data[28]);
    // if a route is known, forward the packet towards the base.
    if (VAR(route) != 0 && data[1] == TOS_LOCAL_ADDRESS) {
#ifdef BASE_STATION
	if (VAR(msg_send_pending) == 0) {
	    VAR(msg_send_pending) =
		TOS_CALL_COMMAND(CONNECT_SUB_SEND_MSG) (TOS_UART_ADDR,
							AM_MSG(DATA_MSG),
							msg);
	    tmp = VAR(msg);
	    VAR(msg) = msg;
	}
#else
	// update the packet.
	data[5] = data[4];
	data[4] = data[3];
	data[3] = data[2];
	data[2] = data[1];
	data[1] = VAR(route);
	// send the packet.
	if (VAR(msg_send_pending) == 0) {
	    VAR(msg_send_pending) =
		TOS_CALL_COMMAND(CONNECT_SUB_SEND_MSG) (TOS_BCAST_ADDR,
							AM_MSG
							(CONNECT_UPDATE),
							msg);
	    tmp = VAR(msg);
	    VAR(msg) = msg;
	}
#endif
	printf("routing to home %x\n", VAR(route));
    }
    return tmp;
}
示例#2
0
//This handler responds to routing updates.
TOS_MsgPtr TOS_MSG_EVENT(CONNECT_UPDATE)(TOS_MsgPtr msg){
    TOS_MsgPtr tmp;
    char* data = msg->data;

    //clear LED2 when update is received.
    TOS_CALL_COMMAND(CONNECT_LED2_OFF)();

    update_connections(data[(int)data[0]], data[28]);
    //if route hasn't already been set this period...
    if(VAR(set) == 0){
	//record route
	VAR(route) = data[(int)data[0]];
	VAR(set) = 8;
       	data[0] ++;
	//create a update packet to be sent out.
        data[(int)data[0]] = TOS_LOCAL_ADDRESS;
	//send the update packet.
	if(VAR(msg_send_pending) == 0){
		VAR(msg_send_pending) = TOS_CALL_COMMAND(CONNECT_SUB_SEND_MSG)(TOS_BCAST_ADDR, AM_MSG(CONNECT_UPDATE),msg);
	}else{
		return msg;
	}
	printf("route set to %x\n", VAR(route));
    	tmp = VAR(msg);
    	VAR(msg) = msg;
    	return tmp;

    }else{
	    printf("route already set to %x\n", VAR(route));
	    return msg;
    }
}
示例#3
0
char TOS_COMMAND(INT_TO_RFM_OUTPUT)(int val){
	int_to_led_msg* message = (int_to_led_msg*)VAR(data).data;
	if (!VAR(pending)) {
	  message->val = val;
	  message->src = TOS_LOCAL_ADDRESS;
	  if (TOS_COMMAND(INT_TO_RFM_SUB_SEND_MSG)(TOS_BCAST_ADDR, AM_MSG(INT_READING), &VAR(data))) {
	    VAR(pending) = 1;
	    return 1;
	  }
	}
	return 0;
}
示例#4
0
void TOS_EVENT(CONNECT_SUB_CLOCK)(){
    //clear LED3 when the clock ticks.
    TOS_CALL_COMMAND(CONNECT_LED3_OFF)();
    printf("route clock\n");
#ifdef BASE_STATION
	//if is the base, then it should send out the route update.
	if(VAR(data_send_pending) == 0){
		VAR(data_send_pending) = TOS_CALL_COMMAND(CONNECT_SUB_SEND_MSG)(TOS_BCAST_ADDR, AM_MSG(CONNECT_UPDATE),&VAR(data_buf));
	}
#else
    //decrement the set var to know when a period is over.
    if(VAR(set) != 0) VAR(set) --;
    //read the value from the sensor.
    TOS_COMMAND(CONNECT_SUB_READ)();
#endif //BASE_STATION
    TOS_CALL_COMMAND(CONNECT_LED1_TOGGLE)();

}
示例#5
0
文件: MAGS.c 项目: AshKash/kit-sink
char TOS_EVENT(MAGS_DATA_EVENT)(int data){
  struct adc_packet* pack = (struct adc_packet*)(VAR(msg).data);
  printf("data_event\n");
  VAR(reading) = data;
  TOS_POST_TASK(FILTER_DATA);
  if(VAR(send_pending) == 0){
	pack->count ++; 
	pack->data[(int)VAR(state)] = data;
  	VAR(state) ++;
  } 
	
  if(VAR(pot_wait) == 0){
  		TOS_CALL_COMMAND(MAGS_LEDy_off)();
  		TOS_CALL_COMMAND(MAGS_LEDr_off)();
  	if(data > 0x200){
		decrease_r();
		//this is a counter so that we can only reset the POT once
		//every 255 samples.
  		TOS_CALL_COMMAND(MAGS_LEDy_on)();
		VAR(pot_wait) = 255;
	}
  	else if(data < 0x100){
		increase_r();
		//this is a counter so that we can only reset the POT once
		//every 255 samples.
		VAR(pot_wait) = 255;
  		TOS_CALL_COMMAND(MAGS_LEDr_on)();
		
		
	}
  }

  if(VAR(state) == sizeof(pack->data)/sizeof(int)){
  	pack->data[(int)VAR(state)] = VAR(diff);
	VAR(state) = 0;
  	if (TOS_CALL_COMMAND(MAGS_SUB_SEND_MSG)(TOS_UART_ADDR,AM_MSG(mags_msg),&VAR(msg))) {
		VAR(send_pending) = 1;
    		return 1;
	}else {
    		return 0;
  	}
  }
  return 1;
}
示例#6
0
文件: AGRO.c 项目: x3ro/tinyos-legacy
char TOS_EVENT(AGRO_SUB_DATA_READY)(short data){
	if(data > VAR(my_strength)) VAR(my_strength) = data;
	VAR(count) ++;
	if(VAR(count) == 8){
	    VAR(count) = 0;
	    if(VAR(id_gen) == 0) VAR(id_gen) = data;
	    if(VAR(my_strength) > VAR(max_strength) && VAR(my_strength) > MAG_THRESHOLD){
		uint8_t i;
    	    	TOS_CALL_COMMAND(AGRO_LED1_ON)();	
		agroDataPacket* pack = (agroDataPacket*)VAR(rel_ptr)->data;
		pack->pack_ID = VAR(id_gen);
		pack->from = TOS_LOCAL_ADDRESS;
		pack->readings[0].nodeID = TOS_LOCAL_ADDRESS;
		pack->readings[0].value = VAR(my_strength);
		for(i = 1; i < 4; i ++){
        		pack->readings[i].value = VAR(dataBlock)[i-1].value;
        		pack->readings[i].nodeID = VAR(dataBlock)[i-1].nodeID;
        		VAR(dataBlock)[i-1].value = 0;
        		VAR(dataBlock)[i-1].nodeID = 0xff;
		}
		bar_foo();
	    }else{
    	    	TOS_CALL_COMMAND(AGRO_LED1_OFF)();
	    }
	    VAR(my_strength) = 0;
	    VAR(max_strength) = 0;
	    
	}else {
	  if(data > MAG_THRESHOLD && VAR(msg_send_pending) == 0){
		CLR_YELLOW_LED_PIN();
   		agroDataPacket* pack = (agroDataPacket*)VAR(msg)->data;		
		pack->readings[0].nodeID = TOS_LOCAL_ADDRESS;
		pack->readings[0].value = data;
		//TIME to send out an data messgae.
		VAR(msg)->length = 6;
		VAR(msg_send_pending) = TOS_CALL_COMMAND(AGRO_SUB_SEND_MSG)(TOS_BCAST_ADDR, AM_MSG(AGRO_DATA_MSG), VAR(msg));
	   }else{
		SET_YELLOW_LED_PIN();
    	    	TOS_CALL_COMMAND(AGRO_LED1_OFF)();
	   }
	}
        return 1;
}
示例#7
0
char TOS_COMMAND(SEND_DV_FP_OUTPUT) (const float *x,
					const float *y,
					const char hops) {
    coordinates_msg *message = (coordinates_msg *) VAR(data).data;
    if (!VAR(pending)) {
	message->x = *x;
	message->y = *y;
	message->hops = hops;
	CLR_GREEN_LED_PIN();
	if (TOS_COMMAND(SEND_DV_FP_SUB_SEND_MSG)
	    (TOS_BCAST_ADDR, AM_MSG(INT_READING), &VAR(data))) {

	    VAR(pending) = 1;
	    return 1;
	}
	SET_GREEN_LED_PIN();
    }
    return 0;
}
示例#8
0
char TOS_EVENT(CONNECT_SUB_DATA_READY)(int data){
    //when the data comes back from the sensor, see if the counter
    // has expired or if the  value is significantly different
    // from the previous value.
    if(VAR(route) != 0 &&
	((VAR(prev) - data) > 100 ||
	 (data - VAR(prev)) > 100 ||
	 VAR(count) > 10)){
	 char* buf = VAR(data_buf).data;
        //if a new data packet needs to be sent, go for it.
	if(VAR(data_send_pending) == 0){
		buf[6] = data >> 8;
		buf[7] = data & 0xff;
		buf[0] = TOS_LOCAL_ADDRESS;
		buf[1] = VAR(route);
		VAR(data_send_pending) = TOS_CALL_COMMAND(CONNECT_SUB_SEND_MSG)(TOS_BCAST_ADDR, AM_MSG(DATA_MSG),&VAR(data_buf));
		VAR(count) = 0;
		//blink the LED
		TOS_CALL_COMMAND(CONNECT_LED3_ON)();
	}
示例#9
0
/*
 * sends the correction factor 
 */
char            TOS_COMMAND(SEND_DV_FP_CORRECTION_OUTPUT) 
     (const float *fpx,
      const float *fpy,
      const float *fpfactor)
{
    correction_msg *message = (correction_msg *) VAR(data).data;
    if (!VAR(pending)) {
	message->fpx = *fpx;
	message->fpy = *fpy;
	message->fpfactor = *fpfactor;
	CLR_GREEN_LED_PIN();
	if (TOS_COMMAND(SEND_DV_FP_SUB_SEND_MSG) (TOS_BCAST_ADDR,
						     AM_MSG
						     (CORRECTION_READING),
						     &VAR(data))) {
	    VAR(pending = 1);
	    return 1;
	}
	SET_GREEN_LED_PIN();
    }
    return 0;
}
示例#10
0
文件: AGRO.c 项目: x3ro/tinyos-legacy
void bar_foo(){
	if(VAR(rel_send_pending) == 0){
		VAR(id_gen) ++;
		VAR(rel_cnt) = 0;
		VAR(rel_ptr)->length = 16;
		((agroDataPacket*)(VAR(rel_ptr)->data))->from = VAR(my_parent)[VAR(parent_ptr)];
				
		VAR(rel_send_pending) = TOS_CALL_COMMAND(AGRO_SUB_SEND_MSG)(VAR(my_parent)[VAR(parent_ptr)], AM_MSG(AGRO_REL_MSG), VAR(rel_ptr));
		if(VAR(rel_send_pending) == 0) VAR(id_gen) --;
	}

}