From 7f2c910da50c4f145c927035deea6f6588fc4ac2 Mon Sep 17 00:00:00 2001 From: rincon Date: Mon, 4 Feb 2008 23:10:13 +0000 Subject: [PATCH] Added the SendNotifier interface to support CTP + LPL integration. Create and drop a module into your system that listens for the SendNotifier events for the AM types related to CTP or Dissemination, then have it call LowPowerListening.setRxSleepInterval(msg, 512);. Or capture the event for every AM type. This can also be used to control other transmit parameters on a system-wide basis, like full duplex PA control on a per-destination basis, etc. If this hook works out, we can expand this into other radio stacks. --- tos/chips/cc2420/CC2420ActiveMessageC.nc | 2 + tos/chips/cc2420/CC2420ActiveMessageP.nc | 8 +++- tos/interfaces/SendNotifier.nc | 61 ++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 tos/interfaces/SendNotifier.nc diff --git a/tos/chips/cc2420/CC2420ActiveMessageC.nc b/tos/chips/cc2420/CC2420ActiveMessageC.nc index eef5ef37..b69861cb 100644 --- a/tos/chips/cc2420/CC2420ActiveMessageC.nc +++ b/tos/chips/cc2420/CC2420ActiveMessageC.nc @@ -51,6 +51,7 @@ configuration CC2420ActiveMessageC { interface RadioBackoff[am_id_t amId]; interface LowPowerListening; interface PacketLink; + interface SendNotifier[am_id_t amId]; } } implementation { @@ -80,6 +81,7 @@ implementation { RadioBackoff = CsmaC; Packet = AM; AMSend = AM; + SendNotifier = AM; Receive = AM.Receive; Snoop = AM.Snoop; AMPacket = AM; diff --git a/tos/chips/cc2420/CC2420ActiveMessageP.nc b/tos/chips/cc2420/CC2420ActiveMessageP.nc index a4e4f843..b5bc03a7 100644 --- a/tos/chips/cc2420/CC2420ActiveMessageP.nc +++ b/tos/chips/cc2420/CC2420ActiveMessageP.nc @@ -41,7 +41,9 @@ module CC2420ActiveMessageP { interface Receive as Snoop[am_id_t id]; interface AMPacket; interface Packet; + interface SendNotifier[am_id_t id]; } + uses { interface Send as SubSend; interface Receive as SubReceive; @@ -66,6 +68,8 @@ implementation { header->dest = addr; header->destpan = call CC2420Config.getPanAddr(); + signal SendNotifier.aboutToSend[id](addr, msg); + return call SubSend.send( msg, len + CC2420_SIZE ); } @@ -196,7 +200,9 @@ implementation { } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { - return; } + default event void SendNotifier.aboutToSend[am_id_t amId](am_addr_t addr, message_t *msg) { + } + } diff --git a/tos/interfaces/SendNotifier.nc b/tos/interfaces/SendNotifier.nc new file mode 100644 index 00000000..06964ac5 --- /dev/null +++ b/tos/interfaces/SendNotifier.nc @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Rincon Research Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * The radio stack notifies the entire system that it is about to send + * a packet. Other modules in the system can call back within this event + * to modify the packet's metadata. For example, we can setup a module + * in the system to make every CTP data packet send with low power listening + * enabled: + * + * event void SendNotifier.aboutToSend[AM_COLLECTION_DATA](uint8_t dest, + * message_t *msg) { + * call LowPowerListening.setRxSleepInterval(msg, 512); + * } + * + * @author David Moss + */ + +#include "message.h" +#include "AM.h" + +interface SendNotifier { + + /** + * The system is about to send this message. Fill in any last modifications + * and the message will be sent. + * + * @param dest The destination address of the messsage + * @param msg The message about to be transmitted + */ + event void aboutToSend(am_addr_t dest, message_t *msg); + +} -- 2.39.2