]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/cc2420/CC2420ActiveMessageP.nc
Implement clear() properly.
[tinyos-2.x.git] / tos / chips / cc2420 / CC2420ActiveMessageP.nc
index 0f93440446d7611663f45547d5c9500d215fee88..7a111f53603fe9e54d70a37c8750f82ad030d8db 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 );
   }
 
@@ -77,28 +81,10 @@ implementation {
     return call Packet.maxPayloadLength();
   }
 
-  command void* AMSend.getPayload[am_id_t id](message_t* m) {
-    return call Packet.getPayload(m, NULL);
-  }
-
-  /***************** Receive Commands ****************/
-  command void* Receive.getPayload[am_id_t id](message_t* m, uint8_t* len) {
-    return call Packet.getPayload(m, len);
-  }
-
-  command uint8_t Receive.payloadLength[am_id_t id](message_t* m) {
-    return call Packet.payloadLength(m);
-  }
-  
-  /***************** Snoop Commands ****************/
-  command void* Snoop.getPayload[am_id_t id](message_t* m, uint8_t* len) {
+  command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) {
     return call Packet.getPayload(m, len);
   }
 
-  command uint8_t Snoop.payloadLength[am_id_t id](message_t* m) {
-    return call Packet.payloadLength(m);
-  }
-
   /***************** AMPacket Commands ****************/
   command am_addr_t AMPacket.address() {
     return call ActiveMessageAddress.amAddress();
@@ -155,6 +141,8 @@ implementation {
 
   /***************** Packet Commands ****************/
   command void Packet.clear(message_t* msg) {
+    memset(call CC2420PacketBody.getHeader(msg), sizeof(cc2420_header_t), 0);
+    memset(call CC2420PacketBody.getMetadata(msg), sizeof(cc2420_metadata_t), 0);
   }
   
   command uint8_t Packet.payloadLength(message_t* msg) {
@@ -169,11 +157,8 @@ implementation {
     return TOSH_DATA_LENGTH;
   }
   
-  command void* Packet.getPayload(message_t* msg, uint8_t* len) {
-    if (len != NULL) {
-      *len = call Packet.payloadLength(msg);
-    }
-    return msg->data;
+  command void* Packet.getPayload(message_t* msg, uint8_t len) {
+    return call SubSend.getPayload(msg, len);
   }
 
   
@@ -185,6 +170,11 @@ implementation {
   
   /***************** SubReceive Events ****************/
   event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) {
+    
+    if(!(call CC2420PacketBody.getMetadata(msg))->crc) {
+      return msg;
+    }
+    
     if (call AMPacket.isForMe(msg)) {
       return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len - CC2420_SIZE);
     }
@@ -212,7 +202,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) {
+  }
+  
 }