]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Added the SendNotifier interface to support CTP + LPL integration.
authorrincon <rincon>
Mon, 4 Feb 2008 23:10:13 +0000 (23:10 +0000)
committerrincon <rincon>
Mon, 4 Feb 2008 23:10:13 +0000 (23:10 +0000)
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
tos/chips/cc2420/CC2420ActiveMessageP.nc
tos/interfaces/SendNotifier.nc [new file with mode: 0644]

index eef5ef37af1f140c455b0be654fe89c5a96ece44..b69861cb1d09275915e4f785ff16c66e20321bee 100644 (file)
@@ -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;
index a4e4f843f3bde76c1d4eed5b774a74fc8ca26d3b..b5bc03a7226e0f7c7f0ef1305f1427c4af8dfcc6 100644 (file)
@@ -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 (file)
index 0000000..06964ac
--- /dev/null
@@ -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);
+  
+}