[Tinyos-contrib-commits]
CVS: tinyos-1.x/contrib/imote2/test/RadioCommP2PTest
Makefile, NONE, 1.1 RadioCommP2PTest.nc, NONE,
1.1 RadioCommP2PTestM.nc, NONE, 1.1 WSN.h, NONE,
1.1 WSN_Settings.h, NONE, 1.1
Lama Nachman
lnachman at users.sourceforge.net
Wed Nov 29 09:59:16 PST 2006
Update of /cvsroot/tinyos/tinyos-1.x/contrib/imote2/test/RadioCommP2PTest
In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv27714
Added Files:
Makefile RadioCommP2PTest.nc RadioCommP2PTestM.nc WSN.h
WSN_Settings.h
Log Message:
Radio test app, cycles through channels and collects stats on packet success
rates.
--- NEW FILE: Makefile ---
COMPONENT=RadioCommP2PTest
TXRES_VAL=88
include ../MakeRules
--- NEW FILE: RadioCommP2PTest.nc ---
includes WSN;
configuration RadioCommP2PTest {
}
implementation {
components Main,
RadioCommP2PTestM,
RadioCRCPacket as Comm,
TimerC,
CC2420ControlM,
SettingsC,
LedsC;
Main.StdControl -> RadioCommP2PTestM.Init;
RadioCommP2PTestM.TimerControl -> TimerC;
RadioCommP2PTestM.Timer->TimerC.Timer[unique("Timer")];
RadioCommP2PTestM.RadioControl -> Comm;
RadioCommP2PTestM.RadioSend -> Comm;
RadioCommP2PTestM.RadioReceive -> Comm;
RadioCommP2PTestM.CC2420Control -> CC2420ControlM;
RadioCommP2PTestM.Leds -> LedsC;
RadioCommP2PTestM.ReadResetCause -> SettingsC;
}
--- NEW FILE: RadioCommP2PTestM.nc ---
includes WSN;
#include "Reset.h"
module RadioCommP2PTestM {
provides {
interface StdControl as Init;
}
uses {
interface StdControl as TimerControl;
interface Timer;
interface StdControl as RadioControl;
interface BareSendMsg as RadioSend;
interface ReceiveMsg as RadioReceive;
interface CC2420Control;
interface Leds;
command uint8_t ReadResetCause();
}
}
#define CLOCK_TICK 50
implementation {
TOS_Msg radio_data;
TOS_MsgPtr radio_msg;
bool radio_send_pending;
uint8_t seqnum;
uint8_t state;
uint32_t myTime;
uint32_t startedState;
uint32_t echoSent;
uint32_t echoRecv;
uint32_t dataSent;
uint32_t dataRecv;
uint32_t nextTry;
uint8_t nextChannel;
enum {
P_SNDR = 0,
P_SEQ = 1,
P_TYPE = 2,
P_RESVAL = 3,
P_BINSEP = 4,
P_COUNT_0 = 5,
P_COUNT_1 = 6,
P_COUNT_2 = 7,
P_COUNT_3 = 8,
P_NEXT_CHANNEL = 9,
P_PLD = 10
};
enum {
TXRX2TYPE = 0x12,
SEND_ECHO = 0x13,
SEND_TXRX = 0x14,
SWITCH_CHANNEL = 0x15
};
enum {
STATE_IDLE = 0,
STATE_SENT_TXRX = 1,
STATE_SENT_ECHO = 2,
STATE_RECV_TXRX = 3,
STATE_RECV_ECHO = 4,
STATE_DONE = 5,
STATE_SWITCH_CHANNEL = 6
};
void resetCounters() {
seqnum = 0;
echoSent = 0;
echoRecv = 0;
dataSent = 0;
dataRecv = 0;
nextTry = 0;
radio_send_pending = FALSE;
}
command result_t Init.init() {
result_t ok1, ok2, ok3;
/* initialize lower components */
ok2 = call RadioControl.init();
ok3 = call Leds.init();
call TimerControl.init();
atomic {
#if SINK_NODE
state = STATE_SWITCH_CHANNEL;
#else
state = STATE_IDLE;
#endif
radio_msg = &radio_data;
resetCounters();
nextChannel = 11;
}
#if SINK_NODE
trace(DBG_USR1, (" Comm Test, Sink Node\n"));
#else
trace(DBG_USR1, (" Comm Test, Sensor Node\n"));
#endif
return rcombine(ok1, ok2);
}
command result_t Init.start() {
result_t ok1, ok2, ok3, ok4;
uint8_t ResetCause;
ok2 = call RadioControl.start();
ok3 = call CC2420Control.SetRFPower(TXRES_VAL);
ok4 = call TimerControl.start();
call Timer.start(TIMER_REPEAT, CLOCK_TICK);
ResetCause = call ReadResetCause();
if (ResetCause == SLEEP_RESET) {
trace(DBG_USR1, "Sleep Reset\r\n");
}
trace(DBG_USR1, "Reset Cause %d\r\n", ResetCause);
return rcombine(ok1, rcombine3(ok2, ok3, ok4));
}
command result_t Init.stop() {
result_t ok1, ok2, ok3;
ok1 = call TimerControl.stop();
ok3 = call RadioControl.stop();
return rcombine3(ok1, ok2, ok3);
}
task void sendMessage() {
int i;
radio_msg->addr = TOS_BCAST_ADDR;
radio_msg->length = DATA_LENGTH;
radio_msg->data[P_SNDR] = TOS_LOCAL_ADDRESS;
radio_msg->data[P_SEQ] = seqnum;
radio_msg->data[P_TYPE] = TXRX2TYPE;
radio_msg->data[P_RESVAL] = call CC2420Control.GetRFPower();
radio_msg->data[P_BINSEP] = 0xff;
radio_msg->data[P_COUNT_0] = dataSent & 0xff;
radio_msg->data[P_COUNT_1] = (dataSent >> 8) & 0xff;
radio_msg->data[P_COUNT_2] = (dataSent >> 16) & 0xff;
radio_msg->data[P_COUNT_3] = (dataSent >> 24) & 0xff;
//trace(DBG_USR1, "seq %x, data %x\r\n", seqnum, dataSent);
for (i=P_PLD; i<DATA_LENGTH; i++) {
radio_msg->data[i] = (uint8_t)((i-P_PLD)+'A');
}
if (call RadioSend.send(radio_msg)) {
seqnum++;
dataSent++;
} else {
atomic {
radio_send_pending = FALSE;
}
}
}
void sendCmd(uint8_t cmd) {
uint8_t i;
radio_msg->addr = TOS_BCAST_ADDR;
radio_msg->length = DATA_LENGTH;
radio_msg->data[P_SNDR] = TOS_LOCAL_ADDRESS;
radio_msg->data[P_SEQ] = seqnum;
radio_msg->data[P_TYPE] = cmd;
radio_msg->data[P_RESVAL] = call CC2420Control.GetRFPower();
radio_msg->data[P_BINSEP] = 0xff;
radio_msg->data[P_NEXT_CHANNEL] = nextChannel;
for (i=P_PLD; i<DATA_LENGTH; i++) {
radio_msg->data[i] = (uint8_t)((i-P_PLD)+'A');
}
if (call RadioSend.send(radio_msg)) {
seqnum++;
} else {
atomic {
radio_send_pending = FALSE;
}
}
}
task void sendTxRxCmd() {
sendCmd(SEND_TXRX);
}
task void sendEchoCmd() {
sendCmd(SEND_ECHO);
}
task void sendSwitchChannel() {
sendCmd(SWITCH_CHANNEL);
}
task void SwitchChannels() {
trace(DBG_USR1, "Switching to channel %d\r\n", nextChannel);
call CC2420Control.TunePreset(nextChannel);
}
task void reportStats() {
trace(DBG_USR1, "*********Results*********\r\n");
trace(DBG_USR1, "Sender Sent %d packets, I received %d packets\r\n",
dataSent, dataRecv);
trace(DBG_USR1, "I Sent %d packets, Received %d echo\r\n", echoSent,
echoRecv);
trace(DBG_USR1, "Current Channel %d\r\n", nextChannel);
}
/*
* Sink node : wait 4 seconds,
* go to SENT_TXRX, send req for data packets
* when receive first data packet, switch to
* go to IDLE
*
*
*/
event result_t Timer.fired() {
myTime+= CLOCK_TICK;
#if SINK_NODE
switch (state) {
case STATE_DONE:
if (myTime > 3000) {
nextChannel++;
if (nextChannel == 27) {
nextChannel = 11;
}
state = STATE_SWITCH_CHANNEL;
myTime = 1000;
}
return SUCCESS;
case STATE_SWITCH_CHANNEL:
// Keep sending change channel commands for 4 seconds
if (myTime > 8000) {
// Assume channel switch occured
post SwitchChannels();
myTime = 1000;
state = STATE_IDLE; // start data cycle
resetCounters();
return SUCCESS;
}
if (myTime > 2000) {
if((radio_send_pending == FALSE) && (myTime > nextTry)) {
if (post sendSwitchChannel()) {
radio_send_pending = TRUE;
nextTry = myTime + 500;
trace(DBG_USR1, "Send Channel Switch %d\r\n", nextChannel);
}
}
}
return SUCCESS;
case STATE_IDLE:
if (myTime >= 4000) {
trace(DBG_USR1, "Switched to TXRX send\r\n");
state = STATE_SENT_TXRX;
if(radio_send_pending == FALSE) {
if (post sendTxRxCmd()) {
radio_send_pending = TRUE;
state = STATE_SENT_TXRX;
nextTry = myTime + 500;
}
}
}
return SUCCESS;
case STATE_SENT_TXRX:
if (myTime > 40000) {
// give up and send a message
trace(DBG_USR1, "Failed to communicate with sensor node \r\n");
state = STATE_DONE;
nextTry = 0;
myTime = 1000;
return SUCCESS;
}
if (myTime > nextTry) {
//trace(DBG_USR1, "Sending TxRx request\r\n");
if(radio_send_pending == FALSE) {
if (post sendTxRxCmd()) {
radio_send_pending = TRUE;
state = STATE_SENT_TXRX;
nextTry = myTime + 500;
}
}
}
return SUCCESS;
case STATE_RECV_TXRX:
case STATE_SENT_ECHO:
// Stay in this state for 30 seconds
if (echoSent > 100) {
state = STATE_DONE;
myTime = 1000;
nextTry = 0;
post reportStats();
return SUCCESS;
}
if ((myTime - startedState > 40000) && (myTime > nextTry)) {
if (post sendEchoCmd()) {
radio_send_pending = TRUE;
state = STATE_SENT_ECHO;
echoSent++;
nextTry = myTime + 100;
}
}
}
return SUCCESS;
#endif
if (state == STATE_RECV_TXRX) {
if(radio_send_pending == FALSE) {
if (post sendMessage()) {
radio_send_pending = TRUE;
}
}
}
return SUCCESS;
}
event TOS_MsgPtr RadioReceive.receive(TOS_MsgPtr data) {
TOS_MsgPtr tmp = data;
uint32_t tempCounter;
uint8_t d0, d1, d2, d3;
uint8_t channel;
if (data->crc == 0) {
trace(DBG_USR1, ("Dropping packet with bad crc...\n"));
return tmp;
}
#if SINK_NODE
switch (data->data[P_TYPE]) {
case TXRX2TYPE:
dataRecv++;
d0 = (uint8_t) data->data[P_COUNT_0];
d1 = (uint8_t) data->data[P_COUNT_1];
d2 = (uint8_t) data->data[P_COUNT_2];
d3 = (uint8_t) data->data[P_COUNT_3];
dataSent = d0 | d1 << 8 | d2 << 16 | d3 << 24;
#if 0
trace(DBG_USR1, "dataSent %x, %x, %x, %x, %x\r\n", dataSent, d0,
d1, d2, d3);
#endif
if (state == STATE_SENT_TXRX) {
trace(DBG_USR1, "Recieved 1st TXRX\r\n");
state = STATE_RECV_TXRX;
startedState = myTime;
}
break;
case SEND_ECHO:
call Leds.redToggle();
echoRecv++;
break;
default:
break;
}
return tmp;
#endif
switch (data->data[P_TYPE]) {
case SEND_TXRX:
state = STATE_RECV_TXRX;
trace(DBG_USR1, "Start sending data\r\n");
break;
case SEND_ECHO:
dataSent = 0;
call Leds.redToggle();
//trace(DBG_USR1, "Sent %d data\r\n", dataSent);
if (post sendEchoCmd()) {
radio_send_pending = TRUE;
state = STATE_RECV_ECHO;
}
break;
case SWITCH_CHANNEL:
channel = data->data[P_NEXT_CHANNEL];
trace(DBG_USR1, "Switching to channel %d\r\n", channel);
call CC2420Control.TunePreset(channel);
break;
default:
break;
}
return tmp;
}
event result_t RadioSend.sendDone(TOS_MsgPtr data, result_t success) {
if(radio_msg == data){
atomic {
radio_send_pending = FALSE;
}
} else {
trace(DBG_USR1, "Mismatch\r\n");
}
//call Leds.greenToggle();
return SUCCESS;
}
async default command result_t Leds.init() {
return SUCCESS;
}
async default command result_t Leds.yellowToggle() {
return SUCCESS;
}
async default command result_t Leds.greenToggle() {
return SUCCESS;
}
async default command result_t Leds.redToggle() {
return SUCCESS;
}
}
--- NEW FILE: WSN.h ---
/* tab:4
* IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By
* downloading, copying, installing or using the software you agree to
* this license. If you do not agree to this license, do not download,
*
*/
/* tab:4
* "Copyright (c) 2000-2003 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, the following
* two paragraphs and the author 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."
*
*/
/* tab:4
* Copyright (c) 2003 Intel Corporation
* All rights reserved Contributions to the above software program by Intel
* Corporation is program is licensed subject to the BSD License, available at
* http://www.opensource.org/licenses/bsd-license.html
*
*/
/*
* Authors: Mark Yarvis, York Liu
*
*/
#ifndef WSN_H
#define WSN_H
enum {
#ifdef CONST_TXRES_VAL
TXRES_VAL = CONST_TXRES_VAL
#else
TXRES_VAL = 70
#endif
};
enum {
#ifdef CONST_PROGVER
PROGVER = CONST_PROGVER
#else
PROGVER = 0
#endif
};
// A result that indicates what to do with a packet
typedef uint8_t PacketResult_t;
enum {
FORWARD = 0,
DROP = 1,
RTS = 2 // return to sender
};
enum {
INVALID_NODE_ID = 255,
INVALID_INDEX = 255
};
enum {
TASK_DONE = 0,
TASK_PENDING = 1,
TASK_REPOSTREQ = 2
};
typedef uint8_t wsnAddr;
#ifndef CLOCK_SCALE
#define CLOCK_SCALE 1000L
#endif
#endif
--- NEW FILE: WSN_Settings.h ---
/* tab:4
* IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By
* downloading, copying, installing or using the software you agree to
* this license. If you do not agree to this license, do not download,
*
*/
/* tab:4
* "Copyright (c) 2000-2003 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, the following
* two paragraphs and the author 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."
*
*/
/* tab:4
* Copyright (c) 2003 Intel Corporation
* All rights reserved Contributions to the above software program by Intel
* Corporation is program is licensed subject to the BSD License, available at
* http://www.opensource.org/licenses/bsd-license.html
*
*/
/*
* Authors: Mark Yarvis
* Modified: Shane B. Eisenman (8.31.2005) - Added additional setting IDs for
* the BP app and also included the
* setting lengths.
* Modified: Rahul Shah (09.15.2005) - Added support for enabling/disabling
* statistics collection dynamically
*/
#include "WSN.h"
enum {
SETTING_ID_INVALID = 0,
SETTING_ID_FEEDBACK_LIST = 1,
SETTING_ID_FEEDBACK_ID = 2,
SETTING_ID_PROGVER = 3,
SETTING_ID_SETVER = 4,
SETTING_ID_POTSET = 5,
SETTING_ID_BUILD_DATE = 6,
SETTING_ID_TRACEROUTE = 7,
SETTING_ID_DSDV_PKT_FW = 8,
SETTING_ID_DSDV_RUPDATE = 9,
SETTING_ID_NBR_HISTORY = 10,
SETTING_ID_NBR_QUALITY = 11,
SETTING_ID_TX_Control = 12, // for use by the single hop manager
SETTING_ID_ADJUVANT = 13,
SETTING_ID_DSDV_METRIC = 14,
SETTING_ID_METRIC_MEASURE = 15,
SETTING_ID_MESH_ENABLE = 16,
SETTING_ID_DSDV_METRIC_SELECT = 17, // used to choose between DSDV metrics
// temp stuff for now
SETTING_ID_AODV_PKT_FW = 18,
SETTING_ID_AODV_RUPDATE = 19,
SETTING_ID_ENERGY_MEASURE = 20, // used to start/stop energy measurement
SETTING_ID_STATIC_ROUTE = 21, // set next hop for static routing
SETTING_ID_RELIABLE_TRANSPORT = 22,
SETTING_ID_RESET = 23,
SETTING_ID_VOTE_UI = 24,
SETTING_ID_BALL = 25,
SETTING_ID_ONOFF_TRACEROUTE = 26,
// Special Settings
SETTING_ID_SETTINGS_START = 27,
SETTING_ID_UPDATE_SETTINGS_DONE = 28,
SETTING_ID_QUERY_SETTINGS_VALIDATION = 29,
SETTING_ID_NEW_CFG_AVAILABLE = 30,
// Query Params Settings
SETTING_ID_QUERY_GROUP = 31,
SETTING_ID_CHANNEL_PARAMETER_SET = 32,
SETTING_ID_STATS_COLLECTION = 33,
// Cluster Head App Settings
SETTING_ID_PERIODIC_COLLECTION = 50,
SETTING_ID_CHANNEL_CFG = 51,
SETTING_ID_NODE_DISCOVERY_CFG = 52,
SETTING_ID_FREQSET = 0xFF
};
/**
* Defines the length in bytes of the defined settings.
**/
enum {
SETTING_LENGTH_FEEDBACK_LIST = 3, // plus a list of addrs
SETTING_LENGTH_FEEDBACK_ID = 2,
SETTING_LENGTH_SETVER = 2,
SETTING_LENGTH_POT_SET = 2,
SETTING_LENGTH_TRACEROUTE = 2,
SETTING_LENGTH_DSDV_PKT_FW = 2,
SETTING_LENGTH_DSDV_RUPDATE = 3,
SETTING_LENGTH_NBR_HISTORY = 3,
SETTING_LENGTH_NBR_QUALITY = 4,
SETTING_LENGTH_TX_Control = 2,
SETTING_LENGTH_ADJUVANT = 4, // plus a list of addrs
SETTING_LENGTH_DSDV_METRIC = 5,
SETTING_LENGTH_METRIC_MEASURE = 2,
SETTING_LENGTH_MESH_ENABLE = 3, // plus a list of addrs
SETTING_LENGTH_ENERGY_MEASURE = 2,
SETTING_LENGTH_STATIC_ROUTE = 1 + 2 * sizeof(wsnAddr),
SETTING_LENGTH_RESET = 1,
// Cluster Head App Settings (including the setting ID byte)
SETTING_LENGTH_PERIODIC_COLLECTION = 8,
SETTING_LENGTH_CHANNEL_CFG = 5,
SETTING_LENGTH_NODE_DISCOVERY_CFG = 6,
// Query Params Settings (including the setting ID byte)
SETTING_LENGTH_QUERY_GROUP = 0, // variable, this val is not used
SETTING_LENGTH_CHANNEL_PARAMETER_SET = 0, // variable, this val is not used
SETTING_LENGTH_STATS_COLLECTION = 4 + sizeof(wsnAddr),
// Special Settings (including the setting ID byte)
SETTING_LENGTH_SETTINGS_START = 1, // actual length
SETTING_LENGTH_UPDATE_SETTINGS_DONE = 3, // actual length
SETTING_LENGTH_QUERY_SETTINGS_VALIDATION = 1, // actual length
SETTING_LENGTH_NEW_CFG_AVAILABLE = 1, // actual length
};
/**
* Setting Request Types - these mirror the Setting ID being requested.
**/
enum {
REQUEST_ALL = SETTING_ID_INVALID,
REQUEST_PERIODIC_COLLECTION_SETTING = SETTING_ID_PERIODIC_COLLECTION,
REQUEST_CHANNEL_CFG_SETTING = SETTING_ID_CHANNEL_CFG,
REQUEST_NODE_DISCOVERY_CFG_SETTING = SETTING_ID_NODE_DISCOVERY_CFG,
REQUEST_QUERY_GROUP_SETTING = SETTING_ID_QUERY_GROUP,
REQUEST_CHANNEL_PARAMETER_SET_SETTING = SETTING_ID_CHANNEL_PARAMETER_SET,
REQUEST_STATS_COLLECTION_SETTING = SETTING_ID_STATS_COLLECTION
};
More information about the Tinyos-contrib-commits
mailing list