/* * PLANT_BASE.c * * * Author: Waylon Brunette * Date: created 8/13/01 * * Modified from AM_ROUTE.c * *================================================================= * Header from AM_ROUTE.c *================================================================= * "Copyright (c) 2000 and The Regents of the University * of California. All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice and the following * two paragraphs appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * * Authors: Jason Hill * *================================================================ * * * */ // this components takes the packets of sensor readings and transfers to the UART. // it also sends out route update packets #include "tos.h" #include "PLANT_BASE.h" #define MAX_READINGS_IN_PACKET 35 // specifies the size of the arrays that will hold the readings in the data packet extern const char TOS_LOCAL_ADDRESS; typedef struct{ unsigned char reading; unsigned char frequency; } sens_reading; typedef struct{ char original_mote_address; char send_number; char seq_num; sens_reading sens_data[MAX_READINGS_IN_PACKET]; } data_msg; typedef struct{ char acked_mote_address; char msg_type; char seq_num; } ack_msg; #define TOS_FRAME_TYPE PLANT_BASE_frame TOS_FRAME_BEGIN(PLANT_BASE_frame) { TOS_Msg data; TOS_Msg route_buf; TOS_MsgPtr msg; char route_pending; // set to 1 if a route packet is pending char data_pending; // set ot 1 if a data packet is pending } TOS_FRAME_END(PLANT_BASE_frame); char TOS_COMMAND(PLANT_BASE_INIT)(){ //initialize sub components TOS_CALL_COMMAND(PLANT_BASE_SUB_INIT)(); // initialize the RFM TOS_CALL_COMMAND(PLANT_BASE_SUB_LED_INIT)(); VAR(msg) = &VAR(route_buf); VAR(route_pending) = 0; VAR(data_pending) = 0; //set beacon rate for route updates to be sent TOS_COMMAND(PLANT_BASE_SUB_CLOCK_INIT)(255, 7); return 1; } char TOS_COMMAND(PLANT_BASE_START)(){ return 1; } TOS_MsgPtr TOS_MSG_EVENT(ACK_PACKET)(TOS_MsgPtr msg){ return msg; } // Forward the data packet recieved TOS_MsgPtr TOS_MSG_EVENT(ROBOT_PACKET)(TOS_MsgPtr msg){ TOS_MsgPtr tmp; //send the packet. if (VAR(route_pending) == 0){ if(TOS_CALL_COMMAND(PLANT_BASE_SUB_SEND_MSG)(TOS_UART_ADDR, AM_MSG(ROBOT_PACKET), msg)){ TOS_CALL_COMMAND(PLANT_BASE_GREEN_TOGGLE)(); VAR(route_pending) = 1; tmp = VAR(msg); VAR(msg) = msg; return tmp; } } return msg; } // Forward the data packet recieved TOS_MsgPtr TOS_MSG_EVENT(DISTRESS_PACKET)(TOS_MsgPtr msg){ TOS_MsgPtr tmp; //send the packet. if (VAR(route_pending) == 0){ if(TOS_CALL_COMMAND(PLANT_BASE_SUB_SEND_MSG)(TOS_UART_ADDR, AM_MSG(DISTRESS_PACKET), msg)){ TOS_CALL_COMMAND(PLANT_BASE_GREEN_TOGGLE)(); VAR(route_pending) = 1; tmp = VAR(msg); VAR(msg) = msg; return tmp; } } return msg; } TOS_MsgPtr TOS_MSG_EVENT(DATA_PACKET)(TOS_MsgPtr msg){ TOS_MsgPtr tmp; //send the packet. if (VAR(route_pending) == 0){ if(TOS_CALL_COMMAND(PLANT_BASE_SUB_SEND_MSG)(TOS_UART_ADDR, AM_MSG(DATA_PACKET), msg)){ TOS_CALL_COMMAND(PLANT_BASE_GREEN_TOGGLE)(); VAR(route_pending) = 1; tmp = VAR(msg); VAR(msg) = msg; return tmp; } } return msg; } // Forward the data packet recieved TOS_MsgPtr TOS_MSG_EVENT(PRIORITY_PACKET)(TOS_MsgPtr msg){ TOS_MsgPtr tmp; //send the packet. if (VAR(route_pending) == 0){ if(TOS_CALL_COMMAND(PLANT_BASE_SUB_SEND_MSG)(TOS_UART_ADDR, AM_MSG(PRIORITY_PACKET), msg)){ TOS_CALL_COMMAND(PLANT_BASE_GREEN_TOGGLE)(); VAR(route_pending) = 1; tmp = VAR(msg); VAR(msg) = msg; return tmp; } } return msg; } // CLOCK EVENT: just around to see if it crashed void TOS_EVENT(PLANT_BASE_SUB_CLOCK)(){ TOS_CALL_COMMAND(PLANT_BASE_YELLOW_TOGGLE)(); } // after message sent, clear locks char TOS_EVENT(PLANT_BASE_SEND_DONE)(TOS_MsgPtr data) { data_msg* packet = (data_msg *) data->data; ack_msg* ack = (ack_msg *) VAR(data).data; if(data == VAR(msg)) { VAR(route_pending) = 0; ack->acked_mote_address = packet->original_mote_address; ack->msg_type = data->type; ack->seq_num = packet->seq_num; // send out ACK. if (VAR(data_pending) == 0) { if(TOS_CALL_COMMAND(PLANT_BASE_SUB_SEND_MSG)(TOS_BCAST_ADDR, AM_MSG(ACK_PACKET), &VAR(data))) { TOS_CALL_COMMAND(PLANT_BASE_RED_TOGGLE)(); VAR(data_pending) = 1; } } } else if(data == &VAR(data)) { VAR(data_pending) = 0; } return 1; }