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; }
//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; } }
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; }
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)(); }
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; }
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; }
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; }
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)(); }
/* * 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; }
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) --; } }