Hi, I'm trying to connect some wireless sensors Iris Crossbow to read light and temperature. I must realize these three things: 1) I have to sample the light and the temperature with two different times and I have to send the strings everytime the signal is sampled. These things have to happen on the same node and at the same time. 2) I have to sample only the light and I have to send the packet. 3) I have to sample only the temperature and I have to send the packet.
1) and 2) are completed and the trasmission is correct, instead in 3) there is a problem to read the value. The temperature reading is correct only in the first sampling then is sampled a wrong value. This is my code: #include "appFeatures.h" includes XCommand; includes sensorboard; #include "vettore.h" module XMDA100M { provides { interface StdControl; } uses { interface Leds; interface MhopSend as Send_Temp; interface MhopSend as Send_Light; interface RouteControl; // Battery interface ADC as ADCBATT; interface StdControl as BattControl; //Temp interface StdControl as TempControl; interface ADC as Temperature; //Light interface StdControl as PhotoControl; interface ADC as Light; interface ADCControl; interface HPLUART; interface Receive as Receive_Temp; interface Receive as Receive_Light; interface Timer as Timer_Temp; interface Timer as Timer_Light; command void health_packet(bool enable, uint16_t intv); command HealthMsg* HealthMsgGet(); } } implementation { enum { START, BUSY, BATT_DONE, TEMP_DONE, LIGHT_DONE}; #define MSG_LEN 29 #define N 296 #define VAL 7 uint16_t temperature[N] = {TABLE}; int8_t stringa_tempo[VAL]; int8_t stringa_luce[VAL]; TOS_Msg msg_buf1; TOS_Msg msg_buf2; TOS_MsgPtr msg_ptr1; TOS_MsgPtr msg_ptr2; HealthMsg *h_msg; norace bool sending_packet_temp, sending_packet_light, sensinginsession; norace uint8_t state; XDataMsg_1 pack1; XDataMsg_2 pack2; XPacketSensor1 *data3; XPacketSensor2 *data4; uint16_t result_index, value, result1, result2, value_battery, result_light; uint32_t V_ref,result_l, tempo, luce; bool sleeping; // application command state static void initialize() { atomic { sleeping = FALSE; sending_packet_temp = FALSE; sending_packet_light = FALSE; sensinginsession=FALSE; } } task void stop() { call StdControl.stop(); } task void battstop() { call BattControl.stop(); } task void tempstop() { call TempControl. stop(); } task void photostop() { call PhotoControl.stop(); } /**************************************************************************** * Task to xmit radio message * ****************************************************************************/ task void send_radio_msg1(){ uint16_t len1; XDataMsg_1 *data1; uint8_t i; if(sending_packet_temp) return; atomic sending_packet_temp=TRUE; data1 = (XDataMsg_1*)call Send_Temp.getBuffer (msg_ptr1, &len1); for (i=0; i<= sizeof(XDataMsg_1)-1; i++) ((uint8_t*) data1)[i] = ((uint8_t*)&pack1)[i]; data1->xMeshHeader_1.board_id = SENSOR_BOARD_ID; data1->xMeshHeader_1.packet_id = 1; data1- >xMeshHeader_1.parent = call RouteControl.getParent(); data1- >xMeshHeader_1.packet_id = data1->xMeshHeader_1.packet_id | 0x80; //per visualizzare la stringa contenente la temperatura strncpy(data1- >xMeshHeader_1.thermistor, "Temp", MAX_TEMP); strncpy(data1->xData_1. datap1.point, ".", POINT); strncpy(data1->xData_1.datap1.unit1, "Celsius", MAX_UNIT_TEMP); // Send the RF packet! if (call Send_Temp.send (BASE_STATION_ADDRESS,MODE_UPSTREAM,msg_ptr1, sizeof(XDataMsg_1)) != SUCCESS) { atomic sending_packet_temp = FALSE; } return; } task void send_radio_msg2(){ uint16_t len2; XDataMsg_2 *data2; uint8_t j; if(sending_packet_light) return; atomic sending_packet_light=TRUE; data2 = (XDataMsg_2*)call Send_Light.getBuffer (msg_ptr2, &len2); for (j=0; j<= sizeof(XDataMsg_2)-1; j++) ((uint8_t*) data2)[j] = ((uint8_t*)&pack2)[j]; data2->xMeshHeader_2.board_id = SENSOR_BOARD_ID; data2->xMeshHeader_2.packet_id = 1; data2- >xMeshHeader_2.parent = call RouteControl.getParent(); data2- >xMeshHeader_2.packet_id = data2->xMeshHeader_2.packet_id | 0x80; //per visualizzare la stringa contenente la luce strncpy(data2->xMeshHeader_2. photo, "Light", MAX_PHOTO); strncpy(data2->xData_2.datap2.unit2, "mV", MAX_UNIT_LIGHT); // Send the RF packet! if (call Send_Light.send (BASE_STATION_ADDRESS,MODE_UPSTREAM,msg_ptr2, sizeof(XDataMsg_2)) != SUCCESS) { atomic sending_packet_light = FALSE; } return; } /**************************************************************************** * Initialize the component. Initialize ADCControl, Leds * ****************************************************************************/ command result_t StdControl.init() { atomic { msg_ptr1 = &msg_buf1; msg_ptr2 = &msg_buf2; } // usart1 is also connected to external serial flash // set usart1 lines to correct state TOSH_MAKE_FLASH_OUT_OUTPUT(); //tx output TOSH_MAKE_FLASH_CLK_OUTPUT(); //usart clk sending_packet_temp=FALSE; sending_packet_light=FALSE; call HPLUART.init(); call BattControl.init(); call Leds.init(); call TempControl.init(); call PhotoControl.init(); call ADCControl. init(); initialize(); return SUCCESS; } /**************************************************************************** * Start the component. Start the clock. * ****************************************************************************/ command result_t StdControl.start(){ call StdControl.stop(); h_msg = call HealthMsgGet(); h_msg->rsvd_app_type = SENSOR_BOARD_ID; call health_packet(TRUE,TOS_HEALTH_UPDATE); return SUCCESS; } /**************************************************************************** * Stop the component. * ****************************************************************************/ command result_t StdControl.stop() { call BattControl.stop(); call TempControl.stop(); call PhotoControl.stop(); call HPLUART.stop(); return SUCCESS; } /**************************************************************************** * Measure Temp, Light * ****************************************************************************/ event result_t Timer_Temp.fired(){ if ( !sending_packet_temp) { atomic state = START; call TempControl.start(); call Leds.greenToggle(); call Temperature.getData(); return SUCCESS; } } async event result_t Temperature.dataReady(uint16_t data) { //atomic state = START; atomic{ result_index = data - 0x0163; value = temperature[result_index]; result1 = value/100; result2 = value%100; itoa(result1,pack1.xData_1.datap1.temp1, 10); itoa(result2,pack1.xData_1.datap1.temp2,10); if(data==0) call Leds.redToggle(); } post tempstop(); TOSH_uwait(100); post send_radio_msg1(); TOSH_uwait(100); post stop(); return SUCCESS; } event result_t Timer_Light.fired(){ if ( ! sending_packet_light) { atomic state = START; call BattControl.start(); call PhotoControl.start(); call ADCBATT.getData(); return SUCCESS; } } async event result_t ADCBATT.dataReady(uint16_t data) { atomic value_battery = data; post battstop(); call Light.getData(); return SUCCESS; } async event result_t Light.dataReady(uint16_t data) { atomic state = START; atomic{ V_ref = value_battery * (0x00000006); result_l = V_ref * data; result_light = (data * V_ref)/1024; itoa(result_light,pack2.xData_2.datap2.light,10); } post photostop(); TOSH_uwait(100); post send_radio_msg2(); TOSH_uwait(100); post stop(); return SUCCESS; } /** * Handle completion of sent RF packet. */ event result_t Send_Temp.sendDone(TOS_MsgPtr msg, result_t success){ atomic { msg_ptr1 = msg; sending_packet_temp = FALSE; } return SUCCESS; } event result_t Send_Light.sendDone(TOS_MsgPtr msg, result_t success){ atomic { msg_ptr2 = msg; sending_packet_light = FALSE; } return SUCCESS; } async event result_t HPLUART.putDone(){ return SUCCESS; } async event result_t HPLUART.get(uint8_t data){ return SUCCESS; } The reception code there isn't here but I start the Timer (with call Leds.start) in the reception. Can someone resolve my problem? Thanks a lot... _______________________________________________ Tinyos-help mailing list Tinyos-help@millennium.berkeley.edu https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help